@rushstack/typings-generator 0.4.6 → 0.5.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 +20 -0
- package/CHANGELOG.md +8 -1
- package/README.md +4 -5
- package/dist/tsdoc-metadata.json +1 -1
- package/dist/typings-generator.d.ts +6 -2
- package/lib/TypingsGenerator.d.ts +6 -2
- package/lib/TypingsGenerator.d.ts.map +1 -1
- package/lib/TypingsGenerator.js +29 -30
- package/lib/TypingsGenerator.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.json
CHANGED
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rushstack/typings-generator",
|
|
3
3
|
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"version": "0.5.0",
|
|
6
|
+
"tag": "@rushstack/typings-generator_v0.5.0",
|
|
7
|
+
"date": "Mon, 29 Nov 2021 07:26:16 GMT",
|
|
8
|
+
"comments": {
|
|
9
|
+
"minor": [
|
|
10
|
+
{
|
|
11
|
+
"comment": "(BREAKING CHANGE) Remove \"filesToIgnore\" option in favor of \"globsToIgnore.\""
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"dependency": [
|
|
15
|
+
{
|
|
16
|
+
"comment": "Updating dependency \"@rushstack/heft\" to `0.42.3`"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"comment": "Updating dependency \"@rushstack/heft-node-rig\" to `1.2.31`"
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
},
|
|
4
24
|
{
|
|
5
25
|
"version": "0.4.6",
|
|
6
26
|
"tag": "@rushstack/typings-generator_v0.4.6",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
# Change Log - @rushstack/typings-generator
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Mon, 29 Nov 2021 07:26:16 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 0.5.0
|
|
6
|
+
Mon, 29 Nov 2021 07:26:16 GMT
|
|
7
|
+
|
|
8
|
+
### Minor changes
|
|
9
|
+
|
|
10
|
+
- (BREAKING CHANGE) Remove "filesToIgnore" option in favor of "globsToIgnore."
|
|
4
11
|
|
|
5
12
|
## 0.4.6
|
|
6
13
|
Sat, 06 Nov 2021 00:09:13 GMT
|
package/README.md
CHANGED
|
@@ -61,10 +61,10 @@ return TypeScript declarations for the file it is called with.
|
|
|
61
61
|
Optionally provide a [Terminal](https://github.com/microsoft/rushstack/blob/master/libraries/node-core-library/src/Terminal/Terminal.ts)
|
|
62
62
|
object for logging. If one isn't provided, logs will go to the console.
|
|
63
63
|
|
|
64
|
-
### `
|
|
64
|
+
### `globsToIgnore`
|
|
65
65
|
|
|
66
|
-
Optionally, provide an array of
|
|
67
|
-
|
|
66
|
+
Optionally, provide an array of globs matching files that should be ignored. These globs are evaluated
|
|
67
|
+
under [`srcFolder`](#srcFolder--)
|
|
68
68
|
|
|
69
69
|
## `StringValuesTypingsGenerator`
|
|
70
70
|
|
|
@@ -125,8 +125,7 @@ is set to `IExportStyles`. If not specified, the interface name will be `IExport
|
|
|
125
125
|
|
|
126
126
|
## Links
|
|
127
127
|
|
|
128
|
-
- [CHANGELOG.md](
|
|
129
|
-
https://github.com/microsoft/rushstack/blob/master/libraries/typings-generator/CHANGELOG.md) - Find
|
|
128
|
+
- [CHANGELOG.md](https://github.com/microsoft/rushstack/blob/master/libraries/typings-generator/CHANGELOG.md) - Find
|
|
130
129
|
out what's new in the latest version
|
|
131
130
|
- [API Reference](https://rushstack.io/pages/api/typings-generator/)
|
|
132
131
|
|
package/dist/tsdoc-metadata.json
CHANGED
|
@@ -39,6 +39,12 @@ export declare interface ITypingsGeneratorOptions<TTypingsResult = string | unde
|
|
|
39
39
|
fileExtensions: string[];
|
|
40
40
|
parseAndGenerateTypings: (fileContents: string, filePath: string) => TTypingsResult | Promise<TTypingsResult>;
|
|
41
41
|
terminal?: ITerminal;
|
|
42
|
+
globsToIgnore?: string[];
|
|
43
|
+
/**
|
|
44
|
+
* @deprecated
|
|
45
|
+
*
|
|
46
|
+
* TODO: Remove when version 1.0.0 is released.
|
|
47
|
+
*/
|
|
42
48
|
filesToIgnore?: string[];
|
|
43
49
|
}
|
|
44
50
|
|
|
@@ -61,7 +67,6 @@ export declare class TypingsGenerator {
|
|
|
61
67
|
private _targetMap;
|
|
62
68
|
private _dependencyMap;
|
|
63
69
|
protected _options: ITypingsGeneratorOptions;
|
|
64
|
-
private _filesToIgnoreVal;
|
|
65
70
|
constructor(options: ITypingsGeneratorOptions);
|
|
66
71
|
generateTypingsAsync(): Promise<void>;
|
|
67
72
|
runWatcherAsync(): Promise<void>;
|
|
@@ -73,7 +78,6 @@ export declare class TypingsGenerator {
|
|
|
73
78
|
*/
|
|
74
79
|
registerDependency(target: string, dependency: string): void;
|
|
75
80
|
private _parseFileAndGenerateTypingsAsync;
|
|
76
|
-
private get _filesToIgnore();
|
|
77
81
|
private _clearDependencies;
|
|
78
82
|
private _getDependencyTargets;
|
|
79
83
|
private _getTypingsFilePath;
|
|
@@ -8,6 +8,12 @@ export interface ITypingsGeneratorOptions<TTypingsResult = string | undefined> {
|
|
|
8
8
|
fileExtensions: string[];
|
|
9
9
|
parseAndGenerateTypings: (fileContents: string, filePath: string) => TTypingsResult | Promise<TTypingsResult>;
|
|
10
10
|
terminal?: ITerminal;
|
|
11
|
+
globsToIgnore?: string[];
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated
|
|
14
|
+
*
|
|
15
|
+
* TODO: Remove when version 1.0.0 is released.
|
|
16
|
+
*/
|
|
11
17
|
filesToIgnore?: string[];
|
|
12
18
|
}
|
|
13
19
|
/**
|
|
@@ -19,7 +25,6 @@ export declare class TypingsGenerator {
|
|
|
19
25
|
private _targetMap;
|
|
20
26
|
private _dependencyMap;
|
|
21
27
|
protected _options: ITypingsGeneratorOptions;
|
|
22
|
-
private _filesToIgnoreVal;
|
|
23
28
|
constructor(options: ITypingsGeneratorOptions);
|
|
24
29
|
generateTypingsAsync(): Promise<void>;
|
|
25
30
|
runWatcherAsync(): Promise<void>;
|
|
@@ -31,7 +36,6 @@ export declare class TypingsGenerator {
|
|
|
31
36
|
*/
|
|
32
37
|
registerDependency(target: string, dependency: string): void;
|
|
33
38
|
private _parseFileAndGenerateTypingsAsync;
|
|
34
|
-
private get _filesToIgnore();
|
|
35
39
|
private _clearDependencies;
|
|
36
40
|
private _getDependencyTargets;
|
|
37
41
|
private _getTypingsFilePath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TypingsGenerator.d.ts","sourceRoot":"","sources":["../src/TypingsGenerator.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,SAAS,
|
|
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,KACb,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC9C,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,UAAU,CAA2B;IAG7C,OAAO,CAAC,cAAc,CAA2B;IAEjD,SAAS,CAAC,QAAQ,EAAE,wBAAwB,CAAC;gBAE1B,OAAO,EAAE,wBAAwB;IA4CvC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBrC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB7C;;;;;OAKG;IACI,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;YAgBrD,iCAAiC;IAuC/C,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,wBAAwB;CAYjC"}
|
package/lib/TypingsGenerator.js
CHANGED
|
@@ -20,10 +20,13 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
20
20
|
__setModuleDefault(result, mod);
|
|
21
21
|
return result;
|
|
22
22
|
};
|
|
23
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
24
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
25
|
+
};
|
|
23
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
27
|
exports.TypingsGenerator = void 0;
|
|
25
28
|
const node_core_library_1 = require("@rushstack/node-core-library");
|
|
26
|
-
const
|
|
29
|
+
const glob_1 = __importDefault(require("glob"));
|
|
27
30
|
const path = __importStar(require("path"));
|
|
28
31
|
const os_1 = require("os");
|
|
29
32
|
const chokidar = __importStar(require("chokidar"));
|
|
@@ -35,6 +38,9 @@ const chokidar = __importStar(require("chokidar"));
|
|
|
35
38
|
class TypingsGenerator {
|
|
36
39
|
constructor(options) {
|
|
37
40
|
this._options = Object.assign({}, options);
|
|
41
|
+
if (options.filesToIgnore) {
|
|
42
|
+
throw new Error('The filesToIgnore option is no longer supported. Please use globsToIgnore instead.');
|
|
43
|
+
}
|
|
38
44
|
if (!this._options.generatedTsFolder) {
|
|
39
45
|
throw new Error('generatedTsFolder must be provided');
|
|
40
46
|
}
|
|
@@ -50,8 +56,8 @@ class TypingsGenerator {
|
|
|
50
56
|
if (!this._options.fileExtensions || this._options.fileExtensions.length === 0) {
|
|
51
57
|
throw new Error('At least one file extension must be provided.');
|
|
52
58
|
}
|
|
53
|
-
if (!this._options.
|
|
54
|
-
this._options.
|
|
59
|
+
if (!this._options.globsToIgnore) {
|
|
60
|
+
this._options.globsToIgnore = [];
|
|
55
61
|
}
|
|
56
62
|
if (!this._options.terminal) {
|
|
57
63
|
this._options.terminal = new node_core_library_1.Terminal(new node_core_library_1.ConsoleTerminalProvider({ verboseEnabled: true }));
|
|
@@ -62,22 +68,25 @@ class TypingsGenerator {
|
|
|
62
68
|
}
|
|
63
69
|
async generateTypingsAsync() {
|
|
64
70
|
await node_core_library_1.FileSystem.ensureEmptyFolderAsync(this._options.generatedTsFolder);
|
|
65
|
-
const filePaths =
|
|
71
|
+
const filePaths = await node_core_library_1.LegacyAdapters.convertCallbackToPromise(glob_1.default, `**/*+(${this._options.fileExtensions.join('|')})`, {
|
|
66
72
|
cwd: this._options.srcFolder,
|
|
67
73
|
absolute: true,
|
|
68
74
|
nosort: true,
|
|
69
|
-
nodir: true
|
|
75
|
+
nodir: true,
|
|
76
|
+
ignore: this._options.globsToIgnore
|
|
70
77
|
});
|
|
71
|
-
|
|
72
|
-
filePath =
|
|
78
|
+
await node_core_library_1.Async.forEachAsync(filePaths, async (filePath) => {
|
|
79
|
+
filePath = `${this._options.srcFolder}/${filePath}`;
|
|
73
80
|
await this._parseFileAndGenerateTypingsAsync(filePath);
|
|
74
|
-
}
|
|
81
|
+
}, { concurrency: 50 });
|
|
75
82
|
}
|
|
76
83
|
async runWatcherAsync() {
|
|
77
84
|
await node_core_library_1.FileSystem.ensureFolderAsync(this._options.generatedTsFolder);
|
|
78
|
-
const globBase =
|
|
85
|
+
const globBase = `${this._options.srcFolder}/**`;
|
|
79
86
|
await new Promise((resolve, reject) => {
|
|
80
|
-
const watcher = chokidar.watch(this._options.fileExtensions.map((fileExtension) =>
|
|
87
|
+
const watcher = chokidar.watch(this._options.fileExtensions.map((fileExtension) => `${globBase}/*${fileExtension}`), {
|
|
88
|
+
ignored: this._options.globsToIgnore
|
|
89
|
+
});
|
|
81
90
|
const boundGenerateTypingsFunction = this._parseFileAndGenerateTypingsAsync.bind(this);
|
|
82
91
|
watcher.on('add', boundGenerateTypingsFunction);
|
|
83
92
|
watcher.on('change', boundGenerateTypingsFunction);
|
|
@@ -108,20 +117,17 @@ class TypingsGenerator {
|
|
|
108
117
|
}
|
|
109
118
|
dependencyTargetSet.add(target);
|
|
110
119
|
}
|
|
111
|
-
async _parseFileAndGenerateTypingsAsync(
|
|
112
|
-
if (this._filesToIgnore.has(locFilePath)) {
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
120
|
+
async _parseFileAndGenerateTypingsAsync(filePath) {
|
|
115
121
|
// Clear registered dependencies prior to reprocessing.
|
|
116
|
-
this._clearDependencies(
|
|
122
|
+
this._clearDependencies(filePath);
|
|
117
123
|
// Check for targets that register this file as a dependency, and reprocess them too.
|
|
118
|
-
for (const target of this._getDependencyTargets(
|
|
124
|
+
for (const target of this._getDependencyTargets(filePath)) {
|
|
119
125
|
await this._parseFileAndGenerateTypingsAsync(target);
|
|
120
126
|
}
|
|
121
127
|
try {
|
|
122
|
-
const fileContents = await node_core_library_1.FileSystem.readFileAsync(
|
|
123
|
-
const typingsData = await this._options.parseAndGenerateTypings(fileContents,
|
|
124
|
-
const generatedTsFilePath = this._getTypingsFilePath(
|
|
128
|
+
const fileContents = await node_core_library_1.FileSystem.readFileAsync(filePath);
|
|
129
|
+
const typingsData = await this._options.parseAndGenerateTypings(fileContents, filePath);
|
|
130
|
+
const generatedTsFilePath = this._getTypingsFilePath(filePath);
|
|
125
131
|
// Typings data will be undefined when no types should be generated for the parsed file.
|
|
126
132
|
if (typingsData === undefined) {
|
|
127
133
|
return;
|
|
@@ -137,16 +143,8 @@ class TypingsGenerator {
|
|
|
137
143
|
});
|
|
138
144
|
}
|
|
139
145
|
catch (e) {
|
|
140
|
-
this._options.terminal.writeError(`Error occurred parsing and generating typings for file "${
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
get _filesToIgnore() {
|
|
144
|
-
if (!this._filesToIgnoreVal) {
|
|
145
|
-
this._filesToIgnoreVal = new Set(this._options.filesToIgnore.map((fileToIgnore) => {
|
|
146
|
-
return path.resolve(this._options.srcFolder, fileToIgnore);
|
|
147
|
-
}));
|
|
146
|
+
this._options.terminal.writeError(`Error occurred parsing and generating typings for file "${filePath}": ${e}`);
|
|
148
147
|
}
|
|
149
|
-
return this._filesToIgnoreVal;
|
|
150
148
|
}
|
|
151
149
|
_clearDependencies(target) {
|
|
152
150
|
const targetDependencySet = this._targetMap.get(target);
|
|
@@ -161,8 +159,9 @@ class TypingsGenerator {
|
|
|
161
159
|
var _a;
|
|
162
160
|
return [...(((_a = this._dependencyMap.get(dependency)) === null || _a === void 0 ? void 0 : _a.keys()) || [])];
|
|
163
161
|
}
|
|
164
|
-
_getTypingsFilePath(
|
|
165
|
-
|
|
162
|
+
_getTypingsFilePath(filePath) {
|
|
163
|
+
const relativeSourceFilePath = path.relative(this._options.srcFolder, `${filePath}.d.ts`);
|
|
164
|
+
return `${this._options.generatedTsFolder}/${relativeSourceFilePath}`;
|
|
166
165
|
}
|
|
167
166
|
_normalizeFileExtensions(fileExtensions) {
|
|
168
167
|
const result = [];
|
|
@@ -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} from '@rushstack/node-core-library';\r\nimport * as 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 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 private _filesToIgnoreVal: Set<string> | undefined;\r\n\r\n public constructor(options: ITypingsGeneratorOptions) {\r\n this._options = {\r\n ...options\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.filesToIgnore) {\r\n this._options.filesToIgnore = [];\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[] = glob.sync(path.join('**', `*+(${this._options.fileExtensions.join('|')})`), {\r\n cwd: this._options.srcFolder,\r\n absolute: true,\r\n nosort: true,\r\n nodir: true\r\n });\r\n\r\n for (let filePath of filePaths) {\r\n filePath = path.resolve(this._options.srcFolder, filePath);\r\n await this._parseFileAndGenerateTypingsAsync(filePath);\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 = path.resolve(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) => path.join(globBase, `*${fileExtension}`))\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(locFilePath: string): Promise<void> {\r\n if (this._filesToIgnore.has(locFilePath)) {\r\n return;\r\n }\r\n // Clear registered dependencies prior to reprocessing.\r\n this._clearDependencies(locFilePath);\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(locFilePath)) {\r\n await this._parseFileAndGenerateTypingsAsync(target);\r\n }\r\n\r\n try {\r\n const fileContents: string = await FileSystem.readFileAsync(locFilePath);\r\n const typingsData: string | undefined = await this._options.parseAndGenerateTypings(\r\n fileContents,\r\n locFilePath\r\n );\r\n const generatedTsFilePath: string = this._getTypingsFilePath(locFilePath);\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 \"${locFilePath}\": ${e}`\r\n );\r\n }\r\n }\r\n\r\n private get _filesToIgnore(): Set<string> {\r\n if (!this._filesToIgnoreVal) {\r\n this._filesToIgnoreVal = new Set<string>(\r\n this._options.filesToIgnore!.map((fileToIgnore) => {\r\n return path.resolve(this._options.srcFolder, fileToIgnore);\r\n })\r\n );\r\n }\r\n return this._filesToIgnoreVal;\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(locFilePath: string): string {\r\n return path.resolve(\r\n this._options.generatedTsFolder,\r\n path.relative(this._options.srcFolder, `${locFilePath}.d.ts`)\r\n );\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 ) => 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rushstack/typings-generator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "This library provides functionality for automatically generating typings for non-TS files.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dts",
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@rushstack/eslint-config": "2.4.5",
|
|
26
|
-
"@rushstack/heft": "0.
|
|
27
|
-
"@rushstack/heft-node-rig": "1.2.
|
|
26
|
+
"@rushstack/heft": "0.42.3",
|
|
27
|
+
"@rushstack/heft-node-rig": "1.2.31",
|
|
28
28
|
"@types/glob": "7.1.1"
|
|
29
29
|
},
|
|
30
30
|
"scripts": {
|