@rushstack/typings-generator 0.4.5 → 0.5.2

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 CHANGED
@@ -1,6 +1,68 @@
1
1
  {
2
2
  "name": "@rushstack/typings-generator",
3
3
  "entries": [
4
+ {
5
+ "version": "0.5.2",
6
+ "tag": "@rushstack/typings-generator_v0.5.2",
7
+ "date": "Fri, 03 Dec 2021 03:05:23 GMT",
8
+ "comments": {
9
+ "dependency": [
10
+ {
11
+ "comment": "Updating dependency \"@rushstack/node-core-library\" to `3.44.0`"
12
+ },
13
+ {
14
+ "comment": "Updating dependency \"@rushstack/heft\" to `0.42.4`"
15
+ },
16
+ {
17
+ "comment": "Updating dependency \"@rushstack/heft-node-rig\" to `1.2.33`"
18
+ }
19
+ ]
20
+ }
21
+ },
22
+ {
23
+ "version": "0.5.1",
24
+ "tag": "@rushstack/typings-generator_v0.5.1",
25
+ "date": "Tue, 30 Nov 2021 20:18:41 GMT",
26
+ "comments": {
27
+ "dependency": [
28
+ {
29
+ "comment": "Updating dependency \"@rushstack/heft-node-rig\" to `1.2.32`"
30
+ }
31
+ ]
32
+ }
33
+ },
34
+ {
35
+ "version": "0.5.0",
36
+ "tag": "@rushstack/typings-generator_v0.5.0",
37
+ "date": "Mon, 29 Nov 2021 07:26:16 GMT",
38
+ "comments": {
39
+ "minor": [
40
+ {
41
+ "comment": "(BREAKING CHANGE) Remove \"filesToIgnore\" option in favor of \"globsToIgnore.\""
42
+ }
43
+ ],
44
+ "dependency": [
45
+ {
46
+ "comment": "Updating dependency \"@rushstack/heft\" to `0.42.3`"
47
+ },
48
+ {
49
+ "comment": "Updating dependency \"@rushstack/heft-node-rig\" to `1.2.31`"
50
+ }
51
+ ]
52
+ }
53
+ },
54
+ {
55
+ "version": "0.4.6",
56
+ "tag": "@rushstack/typings-generator_v0.4.6",
57
+ "date": "Sat, 06 Nov 2021 00:09:13 GMT",
58
+ "comments": {
59
+ "dependency": [
60
+ {
61
+ "comment": "Updating dependency \"@rushstack/node-core-library\" to `3.43.2`"
62
+ }
63
+ ]
64
+ }
65
+ },
4
66
  {
5
67
  "version": "0.4.5",
6
68
  "tag": "@rushstack/typings-generator_v0.4.5",
package/CHANGELOG.md CHANGED
@@ -1,6 +1,28 @@
1
1
  # Change Log - @rushstack/typings-generator
2
2
 
3
- This log was last generated on Fri, 05 Nov 2021 15:09:18 GMT and should not be manually modified.
3
+ This log was last generated on Fri, 03 Dec 2021 03:05:23 GMT and should not be manually modified.
4
+
5
+ ## 0.5.2
6
+ Fri, 03 Dec 2021 03:05:23 GMT
7
+
8
+ _Version update only_
9
+
10
+ ## 0.5.1
11
+ Tue, 30 Nov 2021 20:18:41 GMT
12
+
13
+ _Version update only_
14
+
15
+ ## 0.5.0
16
+ Mon, 29 Nov 2021 07:26:16 GMT
17
+
18
+ ### Minor changes
19
+
20
+ - (BREAKING CHANGE) Remove "filesToIgnore" option in favor of "globsToIgnore."
21
+
22
+ ## 0.4.6
23
+ Sat, 06 Nov 2021 00:09:13 GMT
24
+
25
+ _Version update only_
4
26
 
5
27
  ## 0.4.5
6
28
  Fri, 05 Nov 2021 15:09:18 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
- ### `filesToIgnore`
64
+ ### `globsToIgnore`
65
65
 
66
- Optionally, provide an array of paths to files that should be ignored. These paths can either be absolute
67
- paths, or paths relative to the [`srcFolder`](#srcFolder--)
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
 
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.18.15"
8
+ "packageVersion": "7.18.19"
9
9
  }
10
10
  ]
11
11
  }
@@ -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,EAKV,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;CAC1B;AAED;;;;GAIG;AACH,qBAAa,gBAAgB;IAE3B,OAAO,CAAC,UAAU,CAA2B;IAG7C,OAAO,CAAC,cAAc,CAA2B;IAEjD,SAAS,CAAC,QAAQ,EAAE,wBAAwB,CAAC;IAE7C,OAAO,CAAC,iBAAiB,CAA0B;gBAEhC,OAAO,EAAE,wBAAwB;IAwCvC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB7C;;;;;OAKG;IACI,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;YAgBrD,iCAAiC;IA0C/C,OAAO,KAAK,cAAc,GASzB;IAED,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,wBAAwB;CAYjC"}
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"}
@@ -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 glob = __importStar(require("glob"));
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.filesToIgnore) {
54
- this._options.filesToIgnore = [];
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 = glob.sync(path.join('**', `*+(${this._options.fileExtensions.join('|')})`), {
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
- for (let filePath of filePaths) {
72
- filePath = path.resolve(this._options.srcFolder, 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 = path.resolve(this._options.srcFolder, '**');
85
+ const globBase = `${this._options.srcFolder}/**`;
79
86
  await new Promise((resolve, reject) => {
80
- const watcher = chokidar.watch(this._options.fileExtensions.map((fileExtension) => path.join(globBase, `*${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(locFilePath) {
112
- if (this._filesToIgnore.has(locFilePath)) {
113
- return;
114
- }
120
+ async _parseFileAndGenerateTypingsAsync(filePath) {
115
121
  // Clear registered dependencies prior to reprocessing.
116
- this._clearDependencies(locFilePath);
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(locFilePath)) {
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(locFilePath);
123
- const typingsData = await this._options.parseAndGenerateTypings(fileContents, locFilePath);
124
- const generatedTsFilePath = this._getTypingsFilePath(locFilePath);
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;
@@ -133,20 +139,12 @@ class TypingsGenerator {
133
139
  ].join(os_1.EOL);
134
140
  await node_core_library_1.FileSystem.writeFileAsync(generatedTsFilePath, prefixedTypingsData, {
135
141
  ensureFolderExists: true,
136
- convertLineEndings: "os" /* OsDefault */
142
+ convertLineEndings: node_core_library_1.NewlineKind.OsDefault
137
143
  });
138
144
  }
139
145
  catch (e) {
140
- this._options.terminal.writeError(`Error occurred parsing and generating typings for file "${locFilePath}": ${e}`);
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(locFilePath) {
165
- return path.resolve(this._options.generatedTsFolder, path.relative(this._options.srcFolder, `${locFilePath}.d.ts`));
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.4.5",
3
+ "version": "0.5.2",
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.43.1",
19
+ "@rushstack/node-core-library": "3.44.0",
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.4.5",
26
- "@rushstack/heft": "0.41.6",
27
- "@rushstack/heft-node-rig": "1.2.25",
26
+ "@rushstack/heft": "0.42.4",
27
+ "@rushstack/heft-node-rig": "1.2.33",
28
28
  "@types/glob": "7.1.1"
29
29
  },
30
30
  "scripts": {