Skip to content

Commit 85ecdb8

Browse files
cache docgen results in between builds for faster startup times
1 parent f8dd5fb commit 85ecdb8

3 files changed

Lines changed: 72 additions & 8 deletions

File tree

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,16 @@
2626
"dependencies": {
2727
"debug": "^4.1.1",
2828
"endent": "^2.0.1",
29+
"find-cache-dir": "^3.3.1",
30+
"flat-cache": "^3.0.4",
2931
"micromatch": "^4.0.2",
3032
"react-docgen-typescript": "^1.20.5",
3133
"tslib": "^2.0.0"
3234
},
3335
"devDependencies": {
3436
"@types/debug": "^4.1.5",
37+
"@types/find-cache-dir": "^3.2.0",
38+
"@types/flat-cache": "^2.0.0",
3539
"@types/jest": "^26.0.16",
3640
"@types/micromatch": "^4.0.1",
3741
"@types/node": "^14.0.12",

src/plugin.ts

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,25 @@
1+
/* eslint-disable no-param-reassign, no-underscore-dangle */
2+
13
import path from "path";
24
import createDebug from "debug";
35
import * as webpack from "webpack";
46
import ts from "typescript";
57
import * as docGen from "react-docgen-typescript";
68
import { matcher } from "micromatch";
9+
import findCacheDir from "find-cache-dir";
10+
import flatCache from "flat-cache";
11+
import crypto from "crypto";
712

813
import { generateDocgenCodeBlock } from "./generateDocgenCodeBlock";
914

1015
const debugExclude = createDebug("docgen:exclude");
1116
const debugInclude = createDebug("docgen:include");
1217
const debugDocs = createDebug("docgen:docs");
1318

19+
const cacheId = "ts-docgen";
20+
const cacheDir = findCacheDir({ name: cacheId });
21+
const cache = flatCache.load(cacheId, cacheDir);
22+
1423
interface TypescriptOptions {
1524
/**
1625
* Specify the location of the tsconfig.json to use. Can not be used with
@@ -87,6 +96,18 @@ function processModule(
8796
return;
8897
}
8998

99+
const hash = crypto
100+
.createHash("sha1")
101+
.update(webpackModule._source._value)
102+
.digest("hex");
103+
const cached = cache.getKey(hash);
104+
105+
if (cached) {
106+
debugInclude(`Got cached docgen for "${webpackModule.request}"`);
107+
webpackModule._source._value = cached;
108+
return;
109+
}
110+
90111
const componentDocs = parser.parseWithProgramProvider(
91112
webpackModule.userRequest,
92113
() => tsProgram
@@ -105,11 +126,11 @@ function processModule(
105126

106127
debugDocs(docs);
107128

108-
// eslint-disable-next-line no-underscore-dangle
109-
let source = webpackModule._source._value;
110-
source += `\n${docs}\n`;
111-
// eslint-disable-next-line no-underscore-dangle, no-param-reassign
112-
webpackModule._source._value = source;
129+
let sourceWithDocs = webpackModule._source._value;
130+
sourceWithDocs += `\n${docs}\n`;
131+
webpackModule._source._value = sourceWithDocs;
132+
133+
cache.setKey(hash, sourceWithDocs);
113134
}
114135

115136
/** Get the contents of the tsconfig in the system */
@@ -231,6 +252,8 @@ export default class DocgenPlugin {
231252
typePropName,
232253
})
233254
);
255+
256+
cache.save();
234257
});
235258
});
236259
}

yarn.lock

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -862,6 +862,16 @@
862862
resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd"
863863
integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==
864864

865+
"@types/find-cache-dir@^3.2.0":
866+
version "3.2.0"
867+
resolved "https://registry.yarnpkg.com/@types/find-cache-dir/-/find-cache-dir-3.2.0.tgz#eaaf331699dccf52c47926e4d4f8f3ed8db33f3c"
868+
integrity sha512-+JeT9qb2Jwzw72WdjU+TSvD5O1QRPWCeRpDJV+guiIq+2hwR0DFGw+nZNbTFjMIVe6Bf4GgAKeB/6Ytx6+MbeQ==
869+
870+
"@types/flat-cache@^2.0.0":
871+
version "2.0.0"
872+
resolved "https://registry.yarnpkg.com/@types/flat-cache/-/flat-cache-2.0.0.tgz#64e5d3b426c392b603a208a55bdcc7d920ce6e57"
873+
integrity sha512-fHeEsm9hvmZ+QHpw6Fkvf19KIhuqnYLU6vtWLjd5BsMd/qVi7iTkMioDZl0mQmfNRA1A6NwvhrSRNr9hGYZGww==
874+
865875
"@types/graceful-fs@^4.1.2":
866876
version "4.1.4"
867877
resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.4.tgz#4ff9f641a7c6d1a3508ff88bc3141b152772e753"
@@ -1753,6 +1763,11 @@ comment-parser@^0.7.4:
17531763
resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-0.7.5.tgz#06db157a3b34addf8502393743e41897e2c73059"
17541764
integrity sha512-iH9YA35ccw94nx5244GVkpyC9eVTsL71jZz6iz5w6RIf79JLF2AsXHXq9p6Oaohyl3sx5qSMnGsWUDFIAfWL4w==
17551765

1766+
commondir@^1.0.1:
1767+
version "1.0.1"
1768+
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
1769+
integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
1770+
17561771
component-emitter@^1.2.1:
17571772
version "1.3.0"
17581773
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
@@ -2619,6 +2634,15 @@ fill-range@^7.0.1:
26192634
dependencies:
26202635
to-regex-range "^5.0.1"
26212636

2637+
find-cache-dir@^3.3.1:
2638+
version "3.3.1"
2639+
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880"
2640+
integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==
2641+
dependencies:
2642+
commondir "^1.0.1"
2643+
make-dir "^3.0.2"
2644+
pkg-dir "^4.1.0"
2645+
26222646
find-replace@^3.0.0:
26232647
version "3.0.0"
26242648
resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38"
@@ -2650,11 +2674,24 @@ flat-cache@^2.0.1:
26502674
rimraf "2.6.3"
26512675
write "1.0.3"
26522676

2677+
flat-cache@^3.0.4:
2678+
version "3.0.4"
2679+
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
2680+
integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
2681+
dependencies:
2682+
flatted "^3.1.0"
2683+
rimraf "^3.0.2"
2684+
26532685
flatted@^2.0.0:
26542686
version "2.0.2"
26552687
resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
26562688
integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
26572689

2690+
flatted@^3.1.0:
2691+
version "3.1.0"
2692+
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067"
2693+
integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==
2694+
26582695
for-in@^1.0.2:
26592696
version "1.0.2"
26602697
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
@@ -4017,7 +4054,7 @@ macos-release@^2.2.0:
40174054
resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f"
40184055
integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==
40194056

4020-
make-dir@^3.0.0:
4057+
make-dir@^3.0.0, make-dir@^3.0.2:
40214058
version "3.1.0"
40224059
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
40234060
integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
@@ -4616,7 +4653,7 @@ pkg-dir@^2.0.0:
46164653
dependencies:
46174654
find-up "^2.1.0"
46184655

4619-
pkg-dir@^4.2.0:
4656+
pkg-dir@^4.1.0, pkg-dir@^4.2.0:
46204657
version "4.2.0"
46214658
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
46224659
integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
@@ -4936,7 +4973,7 @@ rimraf@2.6.3:
49364973
dependencies:
49374974
glob "^7.1.3"
49384975

4939-
rimraf@^3.0.0:
4976+
rimraf@^3.0.0, rimraf@^3.0.2:
49404977
version "3.0.2"
49414978
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
49424979
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==

0 commit comments

Comments
 (0)