prismicio / prismic-ts-codegen

A Prismic model-to-TypeScript-type generator.
Apache License 2.0
18 stars 6 forks source link

refactor: optimize type generation #51

Closed angeloashmore closed 1 year ago

angeloashmore commented 1 year ago

Types of changes

Description

This PR reimplements type generation using string concatenation. It replaces the current TypeScript Compiler API + ts-morph solution.

Initial benchmarking shows ~1000x improvement in projects with 10 custom type and 10 Slices. With caching enabled, which is only persisted in memory and used in subsequent generations, we see a ~4600x improvement. Additional testing will be performed on larger projects.

Run the benchmark using:

$ npm run bench
> prismic-ts-codegen@0.1.11 bench
> vitest bench --watch=false

Benchmarking is an experimental feature.
Breaking changes might not follow semver, please pin Vitest's version when using it.

 RUN  v0.31.1 /Users/angeloashmore/projects/prismic/prismic-ts-codegen

 ✓ test/generateTypes.bench.ts (4) 37082ms
   ✓ cached (2) 25218ms
     name                            hz       min       max      mean       p75       p99      p995
  p999     rme  samples
   · generate types (src)      3,907.07    0.2010    0.7658    0.2559    0.2480    0.5039    0.5783
0.6669  ±1.15%     1954   fastest
   · generate types (v0.1.11)    0.8405  1,182.37  1,204.27  1,189.74  1,190.79  1,204.27  1,204.27  1,
204.27  ±0.77%       10
   ✓ uncached (2) 37080ms
     name                          hz       min       max      mean       p75       p99      p995
p999     rme  samples
   · generate types (src)      850.76    1.0382    2.8518    1.1754    1.2435    1.5750    1.7920    2.
8518  ±1.39%      426   fastest
   · generate types (v0.1.11)  0.8431  1,179.69  1,193.36  1,186.13  1,187.37  1,193.36  1,193.36  1,19
3.36  ±0.72%       10

 BENCH  Summary

  generate types (src) - test/generateTypes.bench.ts > cached
    4648.39x faster than generate types (v0.1.11)

  generate types (src) - test/generateTypes.bench.ts > uncached
    1009.10x faster than generate types (v0.1.11)

Related issues

Checklist:

🐆

codecov-commenter commented 1 year ago

Codecov Report

Merging #51 (6c0eda4) into main (e237257) will decrease coverage by 1.67%. The diff coverage is 97.01%.

:exclamation: Your organization is not using the GitHub App Integration. As a result you may experience degraded service beginning May 15th. Please install the Github App Integration for your organization. Read more.

@@            Coverage Diff             @@
##             main      #51      +/-   ##
==========================================
- Coverage   98.73%   97.07%   -1.67%     
==========================================
  Files          23       20       -3     
  Lines        1655     1468     -187     
  Branches      142      160      +18     
==========================================
- Hits         1634     1425     -209     
- Misses         21       42      +21     
- Partials        0        1       +1     
Impacted Files Coverage Δ
src/lib/getHumanReadableModelName.ts 82.22% <78.26%> (-5.88%) :arrow_down:
src/lib/getHumanReadablePath.ts 87.50% <87.50%> (ø)
src/lib/buildSharedSliceType.ts 93.42% <93.42%> (ø)
src/lib/buildFieldProperties.ts 97.07% <97.07%> (ø)
src/lib/buildFieldDocs.ts 98.51% <98.43%> (-1.49%) :arrow_down:
src/constants.ts 100.00% <100.00%> (ø)
src/generateTypes.ts 100.00% <100.00%> (ø)
src/lib/addBlankLine.ts 100.00% <100.00%> (ø)
src/lib/addLine.ts 100.00% <100.00%> (ø)
src/lib/addSection.ts 100.00% <100.00%> (ø)
... and 8 more