@rushstack/typings-generator 0.5.4 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +60 -0
- package/CHANGELOG.md +23 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/dist/typings-generator.d.ts +13 -6
- package/lib/StringValuesTypingsGenerator.d.ts.map +1 -1
- package/lib/StringValuesTypingsGenerator.js +2 -2
- package/lib/StringValuesTypingsGenerator.js.map +1 -1
- package/lib/TypingsGenerator.d.ts +13 -6
- package/lib/TypingsGenerator.d.ts.map +1 -1
- package/lib/TypingsGenerator.js +120 -56
- package/lib/TypingsGenerator.js.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.json
CHANGED
|
@@ -1,6 +1,66 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rushstack/typings-generator",
|
|
3
3
|
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"version": "0.6.0",
|
|
6
|
+
"tag": "@rushstack/typings-generator_v0.6.0",
|
|
7
|
+
"date": "Fri, 10 Dec 2021 01:09:33 GMT",
|
|
8
|
+
"comments": {
|
|
9
|
+
"minor": [
|
|
10
|
+
{
|
|
11
|
+
"comment": "Support additional output files beyond the typings files."
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"version": "0.5.7",
|
|
18
|
+
"tag": "@rushstack/typings-generator_v0.5.7",
|
|
19
|
+
"date": "Thu, 09 Dec 2021 20:34:41 GMT",
|
|
20
|
+
"comments": {
|
|
21
|
+
"dependency": [
|
|
22
|
+
{
|
|
23
|
+
"comment": "Updating dependency \"@rushstack/node-core-library\" to `3.44.2`"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"comment": "Updating dependency \"@rushstack/heft\" to `0.43.2`"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"comment": "Updating dependency \"@rushstack/heft-node-rig\" to `1.4.3`"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"version": "0.5.6",
|
|
36
|
+
"tag": "@rushstack/typings-generator_v0.5.6",
|
|
37
|
+
"date": "Thu, 09 Dec 2021 00:21:54 GMT",
|
|
38
|
+
"comments": {
|
|
39
|
+
"dependency": [
|
|
40
|
+
{
|
|
41
|
+
"comment": "Updating dependency \"@rushstack/heft\" to `0.43.1`"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"comment": "Updating dependency \"@rushstack/heft-node-rig\" to `1.4.2`"
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"version": "0.5.5",
|
|
51
|
+
"tag": "@rushstack/typings-generator_v0.5.5",
|
|
52
|
+
"date": "Wed, 08 Dec 2021 19:05:08 GMT",
|
|
53
|
+
"comments": {
|
|
54
|
+
"dependency": [
|
|
55
|
+
{
|
|
56
|
+
"comment": "Updating dependency \"@rushstack/heft\" to `0.43.0`"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"comment": "Updating dependency \"@rushstack/heft-node-rig\" to `1.4.1`"
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
},
|
|
4
64
|
{
|
|
5
65
|
"version": "0.5.4",
|
|
6
66
|
"tag": "@rushstack/typings-generator_v0.5.4",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
# Change Log - @rushstack/typings-generator
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Fri, 10 Dec 2021 01:09:33 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 0.6.0
|
|
6
|
+
Fri, 10 Dec 2021 01:09:33 GMT
|
|
7
|
+
|
|
8
|
+
### Minor changes
|
|
9
|
+
|
|
10
|
+
- Support additional output files beyond the typings files.
|
|
11
|
+
|
|
12
|
+
## 0.5.7
|
|
13
|
+
Thu, 09 Dec 2021 20:34:41 GMT
|
|
14
|
+
|
|
15
|
+
_Version update only_
|
|
16
|
+
|
|
17
|
+
## 0.5.6
|
|
18
|
+
Thu, 09 Dec 2021 00:21:54 GMT
|
|
19
|
+
|
|
20
|
+
_Version update only_
|
|
21
|
+
|
|
22
|
+
## 0.5.5
|
|
23
|
+
Wed, 08 Dec 2021 19:05:08 GMT
|
|
24
|
+
|
|
25
|
+
_Version update only_
|
|
4
26
|
|
|
5
27
|
## 0.5.4
|
|
6
28
|
Wed, 08 Dec 2021 16:14:05 GMT
|
package/dist/tsdoc-metadata.json
CHANGED
|
@@ -37,7 +37,8 @@ export declare interface ITypingsGeneratorOptions<TTypingsResult = string | unde
|
|
|
37
37
|
srcFolder: string;
|
|
38
38
|
generatedTsFolder: string;
|
|
39
39
|
fileExtensions: string[];
|
|
40
|
-
parseAndGenerateTypings: (fileContents: string, filePath: string) => TTypingsResult | Promise<TTypingsResult>;
|
|
40
|
+
parseAndGenerateTypings: (fileContents: string, filePath: string, relativePath: string) => TTypingsResult | Promise<TTypingsResult>;
|
|
41
|
+
getAdditionalOutputFiles?: (relativePath: string) => string[];
|
|
41
42
|
terminal?: ITerminal;
|
|
42
43
|
globsToIgnore?: string[];
|
|
43
44
|
/**
|
|
@@ -64,22 +65,28 @@ export declare class StringValuesTypingsGenerator extends TypingsGenerator {
|
|
|
64
65
|
* @public
|
|
65
66
|
*/
|
|
66
67
|
export declare class TypingsGenerator {
|
|
67
|
-
private
|
|
68
|
-
private
|
|
68
|
+
private readonly _dependenciesOfFile;
|
|
69
|
+
private readonly _consumersOfFile;
|
|
70
|
+
private readonly _relativePaths;
|
|
69
71
|
protected _options: ITypingsGeneratorOptions;
|
|
72
|
+
private readonly _fileGlob;
|
|
70
73
|
constructor(options: ITypingsGeneratorOptions);
|
|
71
74
|
generateTypingsAsync(): Promise<void>;
|
|
72
75
|
runWatcherAsync(): Promise<void>;
|
|
73
76
|
/**
|
|
74
|
-
* Register file dependencies that may effect the typings of a
|
|
77
|
+
* Register file dependencies that may effect the typings of a consumer file.
|
|
75
78
|
* Note: This feature is only useful in watch mode.
|
|
76
79
|
* The registerDependency method must be called in the body of parseAndGenerateTypings every
|
|
77
80
|
* time because the registry for a file is cleared at the beginning of processing.
|
|
78
81
|
*/
|
|
79
|
-
registerDependency(
|
|
82
|
+
registerDependency(consumer: string, rawDependency: string): void;
|
|
83
|
+
getOutputFilePaths(relativePath: string): string[];
|
|
84
|
+
private _reprocessFiles;
|
|
80
85
|
private _parseFileAndGenerateTypingsAsync;
|
|
86
|
+
/**
|
|
87
|
+
* Removes the consumer from all extant dependencies
|
|
88
|
+
*/
|
|
81
89
|
private _clearDependencies;
|
|
82
|
-
private _getDependencyTargets;
|
|
83
90
|
private _getTypingsFilePath;
|
|
84
91
|
private _normalizeFileExtensions;
|
|
85
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StringValuesTypingsGenerator.d.ts","sourceRoot":"","sources":["../src/StringValuesTypingsGenerator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,oCACf,SAAQ,wBAAwB,CAAC,mBAAmB,GAAG,SAAS,CAAC;IACjE;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,4BAA4B,CAAC,EAAE,MAAM,CAAC;CACvC;AAID;;;;;GAKG;AACH,qBAAa,4BAA6B,SAAQ,gBAAgB;gBAC7C,OAAO,EAAE,oCAAoC;
|
|
1
|
+
{"version":3,"file":"StringValuesTypingsGenerator.d.ts","sourceRoot":"","sources":["../src/StringValuesTypingsGenerator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,oCACf,SAAQ,wBAAwB,CAAC,mBAAmB,GAAG,SAAS,CAAC;IACjE;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,4BAA4B,CAAC,EAAE,MAAM,CAAC;CACvC;AAID;;;;;GAKG;AACH,qBAAa,4BAA6B,SAAQ,gBAAgB;gBAC7C,OAAO,EAAE,oCAAoC;CAwDjE"}
|
|
@@ -14,8 +14,8 @@ const EXPORT_AS_DEFAULT_INTERFACE_NAME = 'IExport';
|
|
|
14
14
|
*/
|
|
15
15
|
class StringValuesTypingsGenerator extends TypingsGenerator_1.TypingsGenerator {
|
|
16
16
|
constructor(options) {
|
|
17
|
-
super(Object.assign(Object.assign({}, options), { parseAndGenerateTypings: async (fileContents, filePath) => {
|
|
18
|
-
const stringValueTypings = await options.parseAndGenerateTypings(fileContents, filePath);
|
|
17
|
+
super(Object.assign(Object.assign({}, options), { parseAndGenerateTypings: async (fileContents, filePath, relativePath) => {
|
|
18
|
+
const stringValueTypings = await options.parseAndGenerateTypings(fileContents, filePath, relativePath);
|
|
19
19
|
if (stringValueTypings === undefined) {
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StringValuesTypingsGenerator.js","sourceRoot":"","sources":["../src/StringValuesTypingsGenerator.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,2BAAyB;AAEzB,yDAAgF;AAkChF,MAAM,gCAAgC,GAAW,SAAS,CAAC;AAE3D;;;;;GAKG;AACH,MAAa,4BAA6B,SAAQ,mCAAgB;IAChE,YAAmB,OAA6C;QAC9D,KAAK,iCACA,OAAO,KACV,uBAAuB,EAAE,KAAK,EAAE,YAAoB,EAAE,QAAgB,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"StringValuesTypingsGenerator.js","sourceRoot":"","sources":["../src/StringValuesTypingsGenerator.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,2BAAyB;AAEzB,yDAAgF;AAkChF,MAAM,gCAAgC,GAAW,SAAS,CAAC;AAE3D;;;;;GAKG;AACH,MAAa,4BAA6B,SAAQ,mCAAgB;IAChE,YAAmB,OAA6C;QAC9D,KAAK,iCACA,OAAO,KACV,uBAAuB,EAAE,KAAK,EAAE,YAAoB,EAAE,QAAgB,EAAE,YAAoB,EAAE,EAAE;gBAC9F,MAAM,kBAAkB,GAAoC,MAAM,OAAO,CAAC,uBAAuB,CAC/F,YAAY,EACZ,QAAQ,EACR,YAAY,CACb,CAAC;gBAEF,IAAI,kBAAkB,KAAK,SAAS,EAAE;oBACpC,OAAO;iBACR;gBAED,MAAM,WAAW,GAAa,EAAE,CAAC;gBACjC,MAAM,aAAa,GAAW,OAAO,CAAC,4BAA4B;oBAChE,CAAC,CAAC,OAAO,CAAC,4BAA4B;oBACtC,CAAC,CAAC,gCAAgC,CAAC;gBACrC,IAAI,MAAM,GAAW,EAAE,CAAC;gBACxB,IAAI,OAAO,CAAC,eAAe,EAAE;oBAC3B,WAAW,CAAC,IAAI,CAAC,oBAAoB,aAAa,IAAI,CAAC,CAAC;oBACxD,MAAM,GAAG,IAAI,CAAC;iBACf;gBAED,KAAK,MAAM,iBAAiB,IAAI,kBAAkB,CAAC,OAAO,EAAE;oBAC1D,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC;oBAElD,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;wBACpC,WAAW,CAAC,IAAI,CACd,GAAG,MAAM,KAAK,EACd,GAAG,MAAM,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EACjD,GAAG,MAAM,KAAK,CACf,CAAC;qBACH;oBAED,IAAI,OAAO,CAAC,eAAe,EAAE;wBAC3B,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,UAAU,YAAY,EAAE,EAAE,CAAC,CAAC;qBAC3D;yBAAM;wBACL,WAAW,CAAC,IAAI,CAAC,wBAAwB,UAAU,WAAW,EAAE,EAAE,CAAC,CAAC;qBACrE;iBACF;gBAED,IAAI,OAAO,CAAC,eAAe,EAAE;oBAC3B,WAAW,CAAC,IAAI,CACd,GAAG,EACH,EAAE,EACF,0BAA0B,aAAa,GAAG,EAC1C,EAAE,EACF,yBAAyB,CAC1B,CAAC;iBACH;gBAED,OAAO,WAAW,CAAC,IAAI,CAAC,QAAG,CAAC,CAAC;YAC/B,CAAC,IACD,CAAC;IACL,CAAC;CACF;AAzDD,oEAyDC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { EOL } from 'os';\r\n\r\nimport { ITypingsGeneratorOptions, TypingsGenerator } from './TypingsGenerator';\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface IStringValueTyping {\r\n exportName: string;\r\n comment?: string;\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface IStringValueTypings {\r\n typings: IStringValueTyping[];\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface IStringValuesTypingsGeneratorOptions\r\n extends ITypingsGeneratorOptions<IStringValueTypings | undefined> {\r\n /**\r\n * Setting this option wraps the typings export in a default property.\r\n */\r\n exportAsDefault?: boolean;\r\n\r\n /**\r\n * When `exportAsDefault` is true, this optional setting determines the interface name\r\n * for the default wrapped export. Ignored when `exportAsDefault` is false.\r\n */\r\n exportAsDefaultInterfaceName?: string;\r\n}\r\n\r\nconst EXPORT_AS_DEFAULT_INTERFACE_NAME: string = 'IExport';\r\n\r\n/**\r\n * This is a simple tool that generates .d.ts files for non-TS files that can be represented as\r\n * a simple set of named string exports.\r\n *\r\n * @public\r\n */\r\nexport class StringValuesTypingsGenerator extends TypingsGenerator {\r\n public constructor(options: IStringValuesTypingsGeneratorOptions) {\r\n super({\r\n ...options,\r\n parseAndGenerateTypings: async (fileContents: string, filePath: string, relativePath: string) => {\r\n const stringValueTypings: IStringValueTypings | undefined = await options.parseAndGenerateTypings(\r\n fileContents,\r\n filePath,\r\n relativePath\r\n );\r\n\r\n if (stringValueTypings === undefined) {\r\n return;\r\n }\r\n\r\n const outputLines: string[] = [];\r\n const interfaceName: string = options.exportAsDefaultInterfaceName\r\n ? options.exportAsDefaultInterfaceName\r\n : EXPORT_AS_DEFAULT_INTERFACE_NAME;\r\n let indent: string = '';\r\n if (options.exportAsDefault) {\r\n outputLines.push(`export interface ${interfaceName} {`);\r\n indent = ' ';\r\n }\r\n\r\n for (const stringValueTyping of stringValueTypings.typings) {\r\n const { exportName, comment } = stringValueTyping;\r\n\r\n if (comment && comment.trim() !== '') {\r\n outputLines.push(\r\n `${indent}/**`,\r\n `${indent} * ${comment.replace(/\\*\\//g, '*\\\\/')}`,\r\n `${indent} */`\r\n );\r\n }\r\n\r\n if (options.exportAsDefault) {\r\n outputLines.push(`${indent}'${exportName}': string;`, '');\r\n } else {\r\n outputLines.push(`export declare const ${exportName}: string;`, '');\r\n }\r\n }\r\n\r\n if (options.exportAsDefault) {\r\n outputLines.push(\r\n '}',\r\n '',\r\n `declare const strings: ${interfaceName};`,\r\n '',\r\n 'export default strings;'\r\n );\r\n }\r\n\r\n return outputLines.join(EOL);\r\n }\r\n });\r\n }\r\n}\r\n"]}
|
|
@@ -6,7 +6,8 @@ export interface ITypingsGeneratorOptions<TTypingsResult = string | undefined> {
|
|
|
6
6
|
srcFolder: string;
|
|
7
7
|
generatedTsFolder: string;
|
|
8
8
|
fileExtensions: string[];
|
|
9
|
-
parseAndGenerateTypings: (fileContents: string, filePath: string) => TTypingsResult | Promise<TTypingsResult>;
|
|
9
|
+
parseAndGenerateTypings: (fileContents: string, filePath: string, relativePath: string) => TTypingsResult | Promise<TTypingsResult>;
|
|
10
|
+
getAdditionalOutputFiles?: (relativePath: string) => string[];
|
|
10
11
|
terminal?: ITerminal;
|
|
11
12
|
globsToIgnore?: string[];
|
|
12
13
|
/**
|
|
@@ -22,22 +23,28 @@ export interface ITypingsGeneratorOptions<TTypingsResult = string | undefined> {
|
|
|
22
23
|
* @public
|
|
23
24
|
*/
|
|
24
25
|
export declare class TypingsGenerator {
|
|
25
|
-
private
|
|
26
|
-
private
|
|
26
|
+
private readonly _dependenciesOfFile;
|
|
27
|
+
private readonly _consumersOfFile;
|
|
28
|
+
private readonly _relativePaths;
|
|
27
29
|
protected _options: ITypingsGeneratorOptions;
|
|
30
|
+
private readonly _fileGlob;
|
|
28
31
|
constructor(options: ITypingsGeneratorOptions);
|
|
29
32
|
generateTypingsAsync(): Promise<void>;
|
|
30
33
|
runWatcherAsync(): Promise<void>;
|
|
31
34
|
/**
|
|
32
|
-
* Register file dependencies that may effect the typings of a
|
|
35
|
+
* Register file dependencies that may effect the typings of a consumer file.
|
|
33
36
|
* Note: This feature is only useful in watch mode.
|
|
34
37
|
* The registerDependency method must be called in the body of parseAndGenerateTypings every
|
|
35
38
|
* time because the registry for a file is cleared at the beginning of processing.
|
|
36
39
|
*/
|
|
37
|
-
registerDependency(
|
|
40
|
+
registerDependency(consumer: string, rawDependency: string): void;
|
|
41
|
+
getOutputFilePaths(relativePath: string): string[];
|
|
42
|
+
private _reprocessFiles;
|
|
38
43
|
private _parseFileAndGenerateTypingsAsync;
|
|
44
|
+
/**
|
|
45
|
+
* Removes the consumer from all extant dependencies
|
|
46
|
+
*/
|
|
39
47
|
private _clearDependencies;
|
|
40
|
-
private _getDependencyTargets;
|
|
41
48
|
private _getTypingsFilePath;
|
|
42
49
|
private _normalizeFileExtensions;
|
|
43
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TypingsGenerator.d.ts","sourceRoot":"","sources":["../src/TypingsGenerator.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,SAAS,EAOV,MAAM,8BAA8B,CAAC;AAMtC;;GAEG;AACH,MAAM,WAAW,wBAAwB,CAAC,cAAc,GAAG,MAAM,GAAG,SAAS;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uBAAuB,EAAE,CACvB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"TypingsGenerator.d.ts","sourceRoot":"","sources":["../src/TypingsGenerator.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,SAAS,EAOV,MAAM,8BAA8B,CAAC;AAMtC;;GAEG;AACH,MAAM,WAAW,wBAAwB,CAAC,cAAc,GAAG,MAAM,GAAG,SAAS;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uBAAuB,EAAE,CACvB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,KACjB,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC9C,wBAAwB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IAC9D,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;;GAIG;AACH,qBAAa,gBAAgB;IAE3B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA2B;IAG/D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2B;IAG5D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsB;IAErD,SAAS,CAAC,QAAQ,EAAE,wBAAwB,CAAC;IAE7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEhB,OAAO,EAAE,wBAAwB;IA8CvC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBrC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAoE7C;;;;;OAKG;IACI,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAmBjE,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE;YAM3C,eAAe;YAkCf,iCAAiC;IAoC/C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,wBAAwB;CAYjC"}
|
package/lib/TypingsGenerator.js
CHANGED
|
@@ -63,71 +63,136 @@ class TypingsGenerator {
|
|
|
63
63
|
this._options.terminal = new node_core_library_1.Terminal(new node_core_library_1.ConsoleTerminalProvider({ verboseEnabled: true }));
|
|
64
64
|
}
|
|
65
65
|
this._options.fileExtensions = this._normalizeFileExtensions(this._options.fileExtensions);
|
|
66
|
-
this.
|
|
67
|
-
this.
|
|
66
|
+
this._dependenciesOfFile = new Map();
|
|
67
|
+
this._consumersOfFile = new Map();
|
|
68
|
+
this._relativePaths = new Map();
|
|
69
|
+
this._fileGlob = `**/*+(${this._options.fileExtensions.join('|')})`;
|
|
68
70
|
}
|
|
69
71
|
async generateTypingsAsync() {
|
|
70
72
|
await node_core_library_1.FileSystem.ensureEmptyFolderAsync(this._options.generatedTsFolder);
|
|
71
|
-
const filePaths = await node_core_library_1.LegacyAdapters.convertCallbackToPromise(glob_1.default,
|
|
73
|
+
const filePaths = await node_core_library_1.LegacyAdapters.convertCallbackToPromise(glob_1.default, this._fileGlob, {
|
|
72
74
|
cwd: this._options.srcFolder,
|
|
73
75
|
absolute: true,
|
|
74
76
|
nosort: true,
|
|
75
77
|
nodir: true,
|
|
76
78
|
ignore: this._options.globsToIgnore
|
|
77
79
|
});
|
|
78
|
-
await
|
|
79
|
-
filePath = `${this._options.srcFolder}/${filePath}`;
|
|
80
|
-
await this._parseFileAndGenerateTypingsAsync(filePath);
|
|
81
|
-
}, { concurrency: 50 });
|
|
80
|
+
await this._reprocessFiles(filePaths);
|
|
82
81
|
}
|
|
83
82
|
async runWatcherAsync() {
|
|
84
83
|
await node_core_library_1.FileSystem.ensureFolderAsync(this._options.generatedTsFolder);
|
|
85
|
-
const globBase = `${this._options.srcFolder}/**`;
|
|
86
84
|
await new Promise((resolve, reject) => {
|
|
87
|
-
const watcher = chokidar.watch(this.
|
|
85
|
+
const watcher = chokidar.watch(this._fileGlob, {
|
|
86
|
+
cwd: this._options.srcFolder,
|
|
88
87
|
ignored: this._options.globsToIgnore
|
|
89
88
|
});
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
89
|
+
const queue = new Set();
|
|
90
|
+
let timeout;
|
|
91
|
+
let processing = false;
|
|
92
|
+
let flushAfterCompletion = false;
|
|
93
|
+
const flushInternal = () => {
|
|
94
|
+
processing = true;
|
|
95
|
+
const toProcess = Array.from(queue);
|
|
96
|
+
queue.clear();
|
|
97
|
+
this._reprocessFiles(toProcess)
|
|
98
|
+
.then(() => {
|
|
99
|
+
processing = false;
|
|
100
|
+
// If the timeout was invoked again, immediately reexecute with the changed files.
|
|
101
|
+
if (flushAfterCompletion) {
|
|
102
|
+
flushAfterCompletion = false;
|
|
103
|
+
flushInternal();
|
|
104
|
+
}
|
|
105
|
+
})
|
|
106
|
+
.catch(reject);
|
|
107
|
+
};
|
|
108
|
+
const debouncedFlush = () => {
|
|
109
|
+
timeout = undefined;
|
|
110
|
+
if (processing) {
|
|
111
|
+
// If the callback was invoked while processing is ongoing, indicate that we should flush immediately
|
|
112
|
+
// upon completion of the current change batch.
|
|
113
|
+
flushAfterCompletion = true;
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
flushInternal();
|
|
117
|
+
};
|
|
118
|
+
const onChange = (relativePath) => {
|
|
119
|
+
queue.add(relativePath);
|
|
120
|
+
if (timeout) {
|
|
121
|
+
clearTimeout(timeout);
|
|
122
|
+
}
|
|
123
|
+
setTimeout(debouncedFlush, 100);
|
|
124
|
+
};
|
|
125
|
+
watcher.on('add', onChange);
|
|
126
|
+
watcher.on('change', onChange);
|
|
127
|
+
watcher.on('unlink', async (relativePath) => {
|
|
128
|
+
await Promise.all(this.getOutputFilePaths(relativePath).map(async (outputFile) => {
|
|
129
|
+
await node_core_library_1.FileSystem.deleteFileAsync(outputFile);
|
|
130
|
+
}));
|
|
96
131
|
});
|
|
97
132
|
watcher.on('error', reject);
|
|
98
133
|
});
|
|
99
134
|
}
|
|
100
135
|
/**
|
|
101
|
-
* Register file dependencies that may effect the typings of a
|
|
136
|
+
* Register file dependencies that may effect the typings of a consumer file.
|
|
102
137
|
* Note: This feature is only useful in watch mode.
|
|
103
138
|
* The registerDependency method must be called in the body of parseAndGenerateTypings every
|
|
104
139
|
* time because the registry for a file is cleared at the beginning of processing.
|
|
105
140
|
*/
|
|
106
|
-
registerDependency(
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
141
|
+
registerDependency(consumer, rawDependency) {
|
|
142
|
+
// Need to normalize slashes in the dependency path
|
|
143
|
+
const dependency = path.resolve(this._options.srcFolder, rawDependency);
|
|
144
|
+
let dependencies = this._dependenciesOfFile.get(consumer);
|
|
145
|
+
if (!dependencies) {
|
|
146
|
+
dependencies = new Set();
|
|
147
|
+
this._dependenciesOfFile.set(consumer, dependencies);
|
|
148
|
+
}
|
|
149
|
+
dependencies.add(dependency);
|
|
150
|
+
let consumers = this._consumersOfFile.get(dependency);
|
|
151
|
+
if (!consumers) {
|
|
152
|
+
consumers = new Set();
|
|
153
|
+
this._consumersOfFile.set(dependency, consumers);
|
|
154
|
+
}
|
|
155
|
+
consumers.add(consumer);
|
|
119
156
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
this.
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
157
|
+
getOutputFilePaths(relativePath) {
|
|
158
|
+
var _a, _b;
|
|
159
|
+
const typingsFile = this._getTypingsFilePath(relativePath);
|
|
160
|
+
const additionalPaths = (_b = (_a = this._options).getAdditionalOutputFiles) === null || _b === void 0 ? void 0 : _b.call(_a, relativePath);
|
|
161
|
+
return additionalPaths ? [typingsFile, ...additionalPaths] : [typingsFile];
|
|
162
|
+
}
|
|
163
|
+
async _reprocessFiles(relativePaths) {
|
|
164
|
+
// Build a queue of resolved paths
|
|
165
|
+
const toProcess = new Set();
|
|
166
|
+
for (const rawPath of relativePaths) {
|
|
167
|
+
const relativePath = node_core_library_1.Path.convertToSlashes(rawPath);
|
|
168
|
+
const resolvedPath = path.resolve(this._options.srcFolder, rawPath);
|
|
169
|
+
this._relativePaths.set(resolvedPath, relativePath);
|
|
170
|
+
toProcess.add(resolvedPath);
|
|
171
|
+
}
|
|
172
|
+
// Expand out all registered consumers, according to the current dependency graph
|
|
173
|
+
for (const file of toProcess) {
|
|
174
|
+
const consumers = this._consumersOfFile.get(file);
|
|
175
|
+
if (consumers) {
|
|
176
|
+
for (const consumer of consumers) {
|
|
177
|
+
toProcess.add(consumer);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
126
180
|
}
|
|
181
|
+
// Map back to the relative paths so that the information is available
|
|
182
|
+
await node_core_library_1.Async.forEachAsync(toProcess, async (resolvedPath) => {
|
|
183
|
+
const relativePath = this._relativePaths.get(resolvedPath);
|
|
184
|
+
if (!relativePath) {
|
|
185
|
+
throw new Error(`Missing relative path for file ${resolvedPath}`);
|
|
186
|
+
}
|
|
187
|
+
await this._parseFileAndGenerateTypingsAsync(relativePath, resolvedPath);
|
|
188
|
+
}, { concurrency: 20 });
|
|
189
|
+
}
|
|
190
|
+
async _parseFileAndGenerateTypingsAsync(relativePath, resolvedPath) {
|
|
191
|
+
// Clear registered dependencies prior to reprocessing.
|
|
192
|
+
this._clearDependencies(resolvedPath);
|
|
127
193
|
try {
|
|
128
|
-
const fileContents = await node_core_library_1.FileSystem.readFileAsync(
|
|
129
|
-
const typingsData = await this._options.parseAndGenerateTypings(fileContents,
|
|
130
|
-
const generatedTsFilePath = this._getTypingsFilePath(filePath);
|
|
194
|
+
const fileContents = await node_core_library_1.FileSystem.readFileAsync(resolvedPath);
|
|
195
|
+
const typingsData = await this._options.parseAndGenerateTypings(fileContents, resolvedPath, relativePath);
|
|
131
196
|
// Typings data will be undefined when no types should be generated for the parsed file.
|
|
132
197
|
if (typingsData === undefined) {
|
|
133
198
|
return;
|
|
@@ -137,43 +202,42 @@ class TypingsGenerator {
|
|
|
137
202
|
'',
|
|
138
203
|
typingsData
|
|
139
204
|
].join(os_1.EOL);
|
|
205
|
+
const generatedTsFilePath = this._getTypingsFilePath(relativePath);
|
|
140
206
|
await node_core_library_1.FileSystem.writeFileAsync(generatedTsFilePath, prefixedTypingsData, {
|
|
141
207
|
ensureFolderExists: true,
|
|
142
208
|
convertLineEndings: node_core_library_1.NewlineKind.OsDefault
|
|
143
209
|
});
|
|
144
210
|
}
|
|
145
211
|
catch (e) {
|
|
146
|
-
this._options.terminal.writeError(`Error occurred parsing and generating typings for file "${
|
|
212
|
+
this._options.terminal.writeError(`Error occurred parsing and generating typings for file "${resolvedPath}": ${e}`);
|
|
147
213
|
}
|
|
148
214
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
215
|
+
/**
|
|
216
|
+
* Removes the consumer from all extant dependencies
|
|
217
|
+
*/
|
|
218
|
+
_clearDependencies(consumer) {
|
|
219
|
+
const dependencies = this._dependenciesOfFile.get(consumer);
|
|
220
|
+
if (dependencies) {
|
|
221
|
+
for (const dependency of dependencies) {
|
|
222
|
+
this._consumersOfFile.get(dependency).delete(consumer);
|
|
154
223
|
}
|
|
155
|
-
|
|
224
|
+
dependencies.clear();
|
|
156
225
|
}
|
|
157
226
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
return [...(((_a = this._dependencyMap.get(dependency)) === null || _a === void 0 ? void 0 : _a.keys()) || [])];
|
|
161
|
-
}
|
|
162
|
-
_getTypingsFilePath(filePath) {
|
|
163
|
-
const relativeSourceFilePath = path.relative(this._options.srcFolder, `${filePath}.d.ts`);
|
|
164
|
-
return `${this._options.generatedTsFolder}/${relativeSourceFilePath}`;
|
|
227
|
+
_getTypingsFilePath(relativePath) {
|
|
228
|
+
return path.resolve(this._options.generatedTsFolder, `${relativePath}.d.ts`);
|
|
165
229
|
}
|
|
166
230
|
_normalizeFileExtensions(fileExtensions) {
|
|
167
|
-
const result =
|
|
231
|
+
const result = new Set();
|
|
168
232
|
for (const fileExtension of fileExtensions) {
|
|
169
233
|
if (!fileExtension.startsWith('.')) {
|
|
170
|
-
result.
|
|
234
|
+
result.add(`.${fileExtension}`);
|
|
171
235
|
}
|
|
172
236
|
else {
|
|
173
|
-
result.
|
|
237
|
+
result.add(fileExtension);
|
|
174
238
|
}
|
|
175
239
|
}
|
|
176
|
-
return result;
|
|
240
|
+
return Array.from(result);
|
|
177
241
|
}
|
|
178
242
|
}
|
|
179
243
|
exports.TypingsGenerator = TypingsGenerator;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TypingsGenerator.js","sourceRoot":"","sources":["../src/TypingsGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport {\r\n FileSystem,\r\n ITerminal,\r\n Terminal,\r\n ConsoleTerminalProvider,\r\n Path,\r\n NewlineKind,\r\n LegacyAdapters,\r\n Async\r\n} from '@rushstack/node-core-library';\r\nimport glob from 'glob';\r\nimport * as path from 'path';\r\nimport { EOL } from 'os';\r\nimport * as chokidar from 'chokidar';\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface ITypingsGeneratorOptions<TTypingsResult = string | undefined> {\r\n srcFolder: string;\r\n generatedTsFolder: string;\r\n fileExtensions: string[];\r\n parseAndGenerateTypings: (\r\n fileContents: string,\r\n filePath: string\r\n ) => TTypingsResult | Promise<TTypingsResult>;\r\n terminal?: ITerminal;\r\n globsToIgnore?: string[];\r\n /**\r\n * @deprecated\r\n *\r\n * TODO: Remove when version 1.0.0 is released.\r\n */\r\n filesToIgnore?: string[];\r\n}\r\n\r\n/**\r\n * This is a simple tool that generates .d.ts files for non-TS files.\r\n *\r\n * @public\r\n */\r\nexport class TypingsGenerator {\r\n // Map of target file path -> Set<dependency file path>\r\n private _targetMap: Map<string, Set<string>>;\r\n\r\n // Map of dependency file path -> Set<target file path>\r\n private _dependencyMap: Map<string, Set<string>>;\r\n\r\n protected _options: ITypingsGeneratorOptions;\r\n\r\n public constructor(options: ITypingsGeneratorOptions) {\r\n this._options = {\r\n ...options\r\n };\r\n\r\n if (options.filesToIgnore) {\r\n throw new Error('The filesToIgnore option is no longer supported. Please use globsToIgnore instead.');\r\n }\r\n\r\n if (!this._options.generatedTsFolder) {\r\n throw new Error('generatedTsFolder must be provided');\r\n }\r\n\r\n if (!this._options.srcFolder) {\r\n throw new Error('srcFolder must be provided');\r\n }\r\n\r\n if (Path.isUnder(this._options.srcFolder, this._options.generatedTsFolder)) {\r\n throw new Error('srcFolder must not be under generatedTsFolder');\r\n }\r\n\r\n if (Path.isUnder(this._options.generatedTsFolder, this._options.srcFolder)) {\r\n throw new Error('generatedTsFolder must not be under srcFolder');\r\n }\r\n\r\n if (!this._options.fileExtensions || this._options.fileExtensions.length === 0) {\r\n throw new Error('At least one file extension must be provided.');\r\n }\r\n\r\n if (!this._options.globsToIgnore) {\r\n this._options.globsToIgnore = [];\r\n }\r\n\r\n if (!this._options.terminal) {\r\n this._options.terminal = new Terminal(new ConsoleTerminalProvider({ verboseEnabled: true }));\r\n }\r\n\r\n this._options.fileExtensions = this._normalizeFileExtensions(this._options.fileExtensions);\r\n\r\n this._targetMap = new Map();\r\n\r\n this._dependencyMap = new Map();\r\n }\r\n\r\n public async generateTypingsAsync(): Promise<void> {\r\n await FileSystem.ensureEmptyFolderAsync(this._options.generatedTsFolder);\r\n\r\n const filePaths: string[] = await LegacyAdapters.convertCallbackToPromise(\r\n glob,\r\n `**/*+(${this._options.fileExtensions.join('|')})`,\r\n {\r\n cwd: this._options.srcFolder,\r\n absolute: true,\r\n nosort: true,\r\n nodir: true,\r\n ignore: this._options.globsToIgnore\r\n }\r\n );\r\n\r\n await Async.forEachAsync(\r\n filePaths,\r\n async (filePath: string) => {\r\n filePath = `${this._options.srcFolder}/${filePath}`;\r\n await this._parseFileAndGenerateTypingsAsync(filePath);\r\n },\r\n { concurrency: 50 }\r\n );\r\n }\r\n\r\n public async runWatcherAsync(): Promise<void> {\r\n await FileSystem.ensureFolderAsync(this._options.generatedTsFolder);\r\n\r\n const globBase: string = `${this._options.srcFolder}/**`;\r\n\r\n await new Promise((resolve, reject): void => {\r\n const watcher: chokidar.FSWatcher = chokidar.watch(\r\n this._options.fileExtensions.map((fileExtension) => `${globBase}/*${fileExtension}`),\r\n {\r\n ignored: this._options.globsToIgnore\r\n }\r\n );\r\n const boundGenerateTypingsFunction: (filePath: string) => Promise<void> =\r\n this._parseFileAndGenerateTypingsAsync.bind(this);\r\n watcher.on('add', boundGenerateTypingsFunction);\r\n watcher.on('change', boundGenerateTypingsFunction);\r\n watcher.on('unlink', async (filePath) => {\r\n const generatedTsFilePath: string = this._getTypingsFilePath(filePath);\r\n await FileSystem.deleteFileAsync(generatedTsFilePath);\r\n });\r\n watcher.on('error', reject);\r\n });\r\n }\r\n\r\n /**\r\n * Register file dependencies that may effect the typings of a target file.\r\n * Note: This feature is only useful in watch mode.\r\n * The registerDependency method must be called in the body of parseAndGenerateTypings every\r\n * time because the registry for a file is cleared at the beginning of processing.\r\n */\r\n public registerDependency(target: string, dependency: string): void {\r\n let targetDependencySet: Set<string> | undefined = this._targetMap.get(target);\r\n if (!targetDependencySet) {\r\n targetDependencySet = new Set();\r\n this._targetMap.set(target, targetDependencySet);\r\n }\r\n targetDependencySet.add(dependency);\r\n\r\n let dependencyTargetSet: Set<string> | undefined = this._dependencyMap.get(dependency);\r\n if (!dependencyTargetSet) {\r\n dependencyTargetSet = new Set();\r\n this._dependencyMap.set(dependency, dependencyTargetSet);\r\n }\r\n dependencyTargetSet.add(target);\r\n }\r\n\r\n private async _parseFileAndGenerateTypingsAsync(filePath: string): Promise<void> {\r\n // Clear registered dependencies prior to reprocessing.\r\n this._clearDependencies(filePath);\r\n\r\n // Check for targets that register this file as a dependency, and reprocess them too.\r\n for (const target of this._getDependencyTargets(filePath)) {\r\n await this._parseFileAndGenerateTypingsAsync(target);\r\n }\r\n\r\n try {\r\n const fileContents: string = await FileSystem.readFileAsync(filePath);\r\n const typingsData: string | undefined = await this._options.parseAndGenerateTypings(\r\n fileContents,\r\n filePath\r\n );\r\n const generatedTsFilePath: string = this._getTypingsFilePath(filePath);\r\n\r\n // Typings data will be undefined when no types should be generated for the parsed file.\r\n if (typingsData === undefined) {\r\n return;\r\n }\r\n\r\n const prefixedTypingsData: string = [\r\n '// This file was generated by a tool. Modifying it will produce unexpected behavior',\r\n '',\r\n typingsData\r\n ].join(EOL);\r\n\r\n await FileSystem.writeFileAsync(generatedTsFilePath, prefixedTypingsData, {\r\n ensureFolderExists: true,\r\n convertLineEndings: NewlineKind.OsDefault\r\n });\r\n } catch (e) {\r\n this._options.terminal!.writeError(\r\n `Error occurred parsing and generating typings for file \"${filePath}\": ${e}`\r\n );\r\n }\r\n }\r\n\r\n private _clearDependencies(target: string): void {\r\n const targetDependencySet: Set<string> | undefined = this._targetMap.get(target);\r\n if (targetDependencySet) {\r\n for (const dependency of targetDependencySet) {\r\n this._dependencyMap.get(dependency)!.delete(target);\r\n }\r\n targetDependencySet.clear();\r\n }\r\n }\r\n\r\n private _getDependencyTargets(dependency: string): string[] {\r\n return [...(this._dependencyMap.get(dependency)?.keys() || [])];\r\n }\r\n\r\n private _getTypingsFilePath(filePath: string): string {\r\n const relativeSourceFilePath: string = path.relative(this._options.srcFolder, `${filePath}.d.ts`);\r\n return `${this._options.generatedTsFolder}/${relativeSourceFilePath}`;\r\n }\r\n\r\n private _normalizeFileExtensions(fileExtensions: string[]): string[] {\r\n const result: string[] = [];\r\n for (const fileExtension of fileExtensions) {\r\n if (!fileExtension.startsWith('.')) {\r\n result.push(`.${fileExtension}`);\r\n } else {\r\n result.push(fileExtension);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"TypingsGenerator.js","sourceRoot":"","sources":["../src/TypingsGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport {\r\n FileSystem,\r\n ITerminal,\r\n Terminal,\r\n ConsoleTerminalProvider,\r\n Path,\r\n NewlineKind,\r\n LegacyAdapters,\r\n Async\r\n} from '@rushstack/node-core-library';\r\nimport glob from 'glob';\r\nimport * as path from 'path';\r\nimport { EOL } from 'os';\r\nimport * as chokidar from 'chokidar';\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface ITypingsGeneratorOptions<TTypingsResult = string | undefined> {\r\n srcFolder: string;\r\n generatedTsFolder: string;\r\n fileExtensions: string[];\r\n parseAndGenerateTypings: (\r\n fileContents: string,\r\n filePath: string,\r\n relativePath: string\r\n ) => TTypingsResult | Promise<TTypingsResult>;\r\n getAdditionalOutputFiles?: (relativePath: string) => string[];\r\n terminal?: ITerminal;\r\n globsToIgnore?: string[];\r\n /**\r\n * @deprecated\r\n *\r\n * TODO: Remove when version 1.0.0 is released.\r\n */\r\n filesToIgnore?: string[];\r\n}\r\n\r\n/**\r\n * This is a simple tool that generates .d.ts files for non-TS files.\r\n *\r\n * @public\r\n */\r\nexport class TypingsGenerator {\r\n // Map of resolved consumer file path -> Set<resolved dependency file path>\r\n private readonly _dependenciesOfFile: Map<string, Set<string>>;\r\n\r\n // Map of resolved dependency file path -> Set<resolved consumer file path>\r\n private readonly _consumersOfFile: Map<string, Set<string>>;\r\n\r\n // Map of resolved file path -> relative file path\r\n private readonly _relativePaths: Map<string, string>;\r\n\r\n protected _options: ITypingsGeneratorOptions;\r\n\r\n private readonly _fileGlob: string;\r\n\r\n public constructor(options: ITypingsGeneratorOptions) {\r\n this._options = {\r\n ...options\r\n };\r\n\r\n if (options.filesToIgnore) {\r\n throw new Error('The filesToIgnore option is no longer supported. Please use globsToIgnore instead.');\r\n }\r\n\r\n if (!this._options.generatedTsFolder) {\r\n throw new Error('generatedTsFolder must be provided');\r\n }\r\n\r\n if (!this._options.srcFolder) {\r\n throw new Error('srcFolder must be provided');\r\n }\r\n\r\n if (Path.isUnder(this._options.srcFolder, this._options.generatedTsFolder)) {\r\n throw new Error('srcFolder must not be under generatedTsFolder');\r\n }\r\n\r\n if (Path.isUnder(this._options.generatedTsFolder, this._options.srcFolder)) {\r\n throw new Error('generatedTsFolder must not be under srcFolder');\r\n }\r\n\r\n if (!this._options.fileExtensions || this._options.fileExtensions.length === 0) {\r\n throw new Error('At least one file extension must be provided.');\r\n }\r\n\r\n if (!this._options.globsToIgnore) {\r\n this._options.globsToIgnore = [];\r\n }\r\n\r\n if (!this._options.terminal) {\r\n this._options.terminal = new Terminal(new ConsoleTerminalProvider({ verboseEnabled: true }));\r\n }\r\n\r\n this._options.fileExtensions = this._normalizeFileExtensions(this._options.fileExtensions);\r\n\r\n this._dependenciesOfFile = new Map();\r\n this._consumersOfFile = new Map();\r\n this._relativePaths = new Map();\r\n\r\n this._fileGlob = `**/*+(${this._options.fileExtensions.join('|')})`;\r\n }\r\n\r\n public async generateTypingsAsync(): Promise<void> {\r\n await FileSystem.ensureEmptyFolderAsync(this._options.generatedTsFolder);\r\n\r\n const filePaths: string[] = await LegacyAdapters.convertCallbackToPromise(\r\n glob,\r\n this._fileGlob,\r\n {\r\n cwd: this._options.srcFolder,\r\n absolute: true,\r\n nosort: true,\r\n nodir: true,\r\n ignore: this._options.globsToIgnore\r\n }\r\n );\r\n\r\n await this._reprocessFiles(filePaths);\r\n }\r\n\r\n public async runWatcherAsync(): Promise<void> {\r\n await FileSystem.ensureFolderAsync(this._options.generatedTsFolder);\r\n\r\n await new Promise((resolve, reject): void => {\r\n const watcher: chokidar.FSWatcher = chokidar.watch(\r\n this._fileGlob,\r\n {\r\n cwd: this._options.srcFolder,\r\n ignored: this._options.globsToIgnore\r\n }\r\n );\r\n\r\n const queue: Set<string> = new Set();\r\n let timeout: NodeJS.Timeout | undefined;\r\n let processing: boolean = false;\r\n let flushAfterCompletion: boolean = false;\r\n\r\n const flushInternal: () => void = () => {\r\n processing = true;\r\n\r\n const toProcess: string[] = Array.from(queue);\r\n queue.clear();\r\n this._reprocessFiles(toProcess)\r\n .then(() => {\r\n processing = false;\r\n // If the timeout was invoked again, immediately reexecute with the changed files.\r\n if (flushAfterCompletion) {\r\n flushAfterCompletion = false;\r\n flushInternal();\r\n }\r\n })\r\n .catch(reject);\r\n };\r\n\r\n const debouncedFlush: () => void = () => {\r\n timeout = undefined;\r\n if (processing) {\r\n // If the callback was invoked while processing is ongoing, indicate that we should flush immediately\r\n // upon completion of the current change batch.\r\n flushAfterCompletion = true;\r\n return;\r\n }\r\n\r\n flushInternal();\r\n };\r\n\r\n const onChange: (relativePath: string) => void = (relativePath: string) => {\r\n queue.add(relativePath);\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n }\r\n\r\n setTimeout(debouncedFlush, 100);\r\n };\r\n\r\n watcher.on('add', onChange);\r\n watcher.on('change', onChange);\r\n watcher.on('unlink', async (relativePath) => {\r\n await Promise.all(\r\n this.getOutputFilePaths(relativePath).map(async (outputFile: string) => {\r\n await FileSystem.deleteFileAsync(outputFile);\r\n })\r\n );\r\n });\r\n watcher.on('error', reject);\r\n });\r\n }\r\n\r\n /**\r\n * Register file dependencies that may effect the typings of a consumer file.\r\n * Note: This feature is only useful in watch mode.\r\n * The registerDependency method must be called in the body of parseAndGenerateTypings every\r\n * time because the registry for a file is cleared at the beginning of processing.\r\n */\r\n public registerDependency(consumer: string, rawDependency: string): void {\r\n // Need to normalize slashes in the dependency path\r\n const dependency: string = path.resolve(this._options.srcFolder, rawDependency);\r\n\r\n let dependencies: Set<string> | undefined = this._dependenciesOfFile.get(consumer);\r\n if (!dependencies) {\r\n dependencies = new Set();\r\n this._dependenciesOfFile.set(consumer, dependencies);\r\n }\r\n dependencies.add(dependency);\r\n\r\n let consumers: Set<string> | undefined = this._consumersOfFile.get(dependency);\r\n if (!consumers) {\r\n consumers = new Set();\r\n this._consumersOfFile.set(dependency, consumers);\r\n }\r\n consumers.add(consumer);\r\n }\r\n\r\n public getOutputFilePaths(relativePath: string): string[] {\r\n const typingsFile: string = this._getTypingsFilePath(relativePath);\r\n const additionalPaths: string[] | undefined = this._options.getAdditionalOutputFiles?.(relativePath);\r\n return additionalPaths ? [typingsFile, ...additionalPaths] : [typingsFile];\r\n }\r\n\r\n private async _reprocessFiles(relativePaths: Iterable<string>): Promise<void> {\r\n // Build a queue of resolved paths\r\n const toProcess: Set<string> = new Set();\r\n for (const rawPath of relativePaths) {\r\n const relativePath: string = Path.convertToSlashes(rawPath);\r\n const resolvedPath: string = path.resolve(this._options.srcFolder, rawPath);\r\n this._relativePaths.set(resolvedPath, relativePath);\r\n toProcess.add(resolvedPath);\r\n }\r\n\r\n // Expand out all registered consumers, according to the current dependency graph\r\n for (const file of toProcess) {\r\n const consumers: Set<string> | undefined = this._consumersOfFile.get(file);\r\n if (consumers) {\r\n for (const consumer of consumers) {\r\n toProcess.add(consumer);\r\n }\r\n }\r\n }\r\n\r\n // Map back to the relative paths so that the information is available\r\n await Async.forEachAsync(\r\n toProcess,\r\n async (resolvedPath: string) => {\r\n const relativePath: string | undefined = this._relativePaths.get(resolvedPath);\r\n if (!relativePath) {\r\n throw new Error(`Missing relative path for file ${resolvedPath}`);\r\n }\r\n await this._parseFileAndGenerateTypingsAsync(relativePath, resolvedPath);\r\n },\r\n { concurrency: 20 }\r\n );\r\n }\r\n\r\n private async _parseFileAndGenerateTypingsAsync(relativePath: string, resolvedPath: string): Promise<void> {\r\n // Clear registered dependencies prior to reprocessing.\r\n this._clearDependencies(resolvedPath);\r\n\r\n try {\r\n const fileContents: string = await FileSystem.readFileAsync(resolvedPath);\r\n const typingsData: string | undefined = await this._options.parseAndGenerateTypings(\r\n fileContents,\r\n resolvedPath,\r\n relativePath\r\n );\r\n\r\n // Typings data will be undefined when no types should be generated for the parsed file.\r\n if (typingsData === undefined) {\r\n return;\r\n }\r\n\r\n const prefixedTypingsData: string = [\r\n '// This file was generated by a tool. Modifying it will produce unexpected behavior',\r\n '',\r\n typingsData\r\n ].join(EOL);\r\n\r\n const generatedTsFilePath: string = this._getTypingsFilePath(relativePath);\r\n\r\n await FileSystem.writeFileAsync(generatedTsFilePath, prefixedTypingsData, {\r\n ensureFolderExists: true,\r\n convertLineEndings: NewlineKind.OsDefault\r\n });\r\n } catch (e) {\r\n this._options.terminal!.writeError(\r\n `Error occurred parsing and generating typings for file \"${resolvedPath}\": ${e}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Removes the consumer from all extant dependencies\r\n */\r\n private _clearDependencies(consumer: string): void {\r\n const dependencies: Set<string> | undefined = this._dependenciesOfFile.get(consumer);\r\n if (dependencies) {\r\n for (const dependency of dependencies) {\r\n this._consumersOfFile.get(dependency)!.delete(consumer);\r\n }\r\n dependencies.clear();\r\n }\r\n }\r\n\r\n private _getTypingsFilePath(relativePath: string): string {\r\n return path.resolve(this._options.generatedTsFolder, `${relativePath}.d.ts`);\r\n }\r\n\r\n private _normalizeFileExtensions(fileExtensions: string[]): string[] {\r\n const result: Set<string> = new Set();\r\n for (const fileExtension of fileExtensions) {\r\n if (!fileExtension.startsWith('.')) {\r\n result.add(`.${fileExtension}`);\r\n } else {\r\n result.add(fileExtension);\r\n }\r\n }\r\n\r\n return Array.from(result);\r\n }\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rushstack/typings-generator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "This library provides functionality for automatically generating typings for non-TS files.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dts",
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
"directory": "libraries/typings-generator"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@rushstack/node-core-library": "3.44.
|
|
19
|
+
"@rushstack/node-core-library": "3.44.2",
|
|
20
20
|
"@types/node": "12.20.24",
|
|
21
21
|
"chokidar": "~3.4.0",
|
|
22
22
|
"glob": "~7.0.5"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@rushstack/eslint-config": "2.5.0",
|
|
26
|
-
"@rushstack/heft": "0.
|
|
27
|
-
"@rushstack/heft-node-rig": "1.4.
|
|
26
|
+
"@rushstack/heft": "0.43.2",
|
|
27
|
+
"@rushstack/heft-node-rig": "1.4.3",
|
|
28
28
|
"@types/glob": "7.1.1"
|
|
29
29
|
},
|
|
30
30
|
"scripts": {
|