@rushstack/trace-import 0.1.0 → 0.1.1

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/README.md CHANGED
@@ -28,7 +28,7 @@ trace-import --help
28
28
  ## Command line
29
29
 
30
30
  ```
31
- usage: trace-import [-h] [-d] -p MODULE_PATH [-b FOLDER_PATH] [-r {cjs,es,ts}]
31
+ usage: trace-import [-h] [-d] -p IMPORT_PATH [-b FOLDER_PATH] [-t {cjs,es,ts}]
32
32
 
33
33
  This tool analyzes import module paths, to determine the resolved target
34
34
  folder. For example, if the "semver" NPM package is installed, "trace-import
@@ -41,7 +41,7 @@ Optional arguments:
41
41
  -h, --help Show this help message and exit.
42
42
  -d, --debug Show the full call stack if an error occurs while
43
43
  executing the tool
44
- -p MODULE_PATH, --path MODULE_PATH
44
+ -p IMPORT_PATH, --path IMPORT_PATH
45
45
  The import module path to be analyzed. For example,
46
46
  "example" in expressions such as: require("example");
47
47
  require.resolve("example"); import { Thing } from
@@ -50,7 +50,7 @@ Optional arguments:
50
50
  The "--path" string will be resolved as if the import
51
51
  statement appeared in a script located in this folder.
52
52
  If omitted, the current working directory is used.
53
- -r {cjs,es,ts}, --resolution-type {cjs,es,ts}
53
+ -t {cjs,es,ts}, --resolution-type {cjs,es,ts}
54
54
  The type of module resolution to perform: "cjs" for
55
55
  CommonJS, "es" for ES modules, or "ts" for TypeScript
56
56
  typings. The default value is "cjs".
@@ -61,7 +61,7 @@ Optional arguments:
61
61
  These commands were invoked in the `C:\Git\rushstack\apps\trace-import` folder
62
62
  where trace-import is developed.
63
63
 
64
- ### Resolving a CommonJS default index
64
+ ### Resolving a CommonJS main index
65
65
  ```
66
66
  trace-import --path semver
67
67
  ```
@@ -70,18 +70,18 @@ Sample output:
70
70
  ```
71
71
  Base folder: C:\Git\rushstack\apps\trace-import
72
72
  Package name: semver
73
- Module path: (not specified)
73
+ Package subpath: (not specified)
74
74
 
75
75
  Resolving...
76
76
 
77
77
  Package folder: C:\Git\rushstack\common\temp\node_modules\.pnpm\semver@7.3.8\node_modules\semver
78
78
  package.json: semver (7.3.8)
79
- Default entry point: "main": "index.js"
79
+ Main index: "main": "index.js"
80
80
 
81
81
  Target path: C:\Git\rushstack\common\temp\node_modules\.pnpm\semver@7.3.8\node_modules\semver\index.js
82
82
  ```
83
83
 
84
- ### Resolving a CommonJS arbitrary path
84
+ ### Resolving a CommonJS package subpath
85
85
  ```
86
86
  trace-import --path typescript/bin/tsc
87
87
  ```
@@ -90,7 +90,7 @@ Sample output:
90
90
  ```
91
91
  Base folder: C:\Git\rushstack\apps\trace-import
92
92
  Package name: typescript
93
- Module path: bin/tsc
93
+ Package subpath: bin/tsc
94
94
 
95
95
  Resolving...
96
96
 
@@ -109,7 +109,7 @@ Sample output:
109
109
  ```
110
110
  Base folder: C:\Git\rushstack\apps\trace-import
111
111
  Package name: semver
112
- Module path: (not specified)
112
+ Package subpath: (not specified)
113
113
 
114
114
  Resolving...
115
115
 
@@ -117,11 +117,27 @@ Package folder: C:\Git\rushstack\common\temp\node_modules\.pnpm\semver@
117
117
  package.json: semver (7.3.8)
118
118
  @types folder: C:\Git\rushstack\common\temp\node_modules\.pnpm\@types+semver@7.3.5\node_modules\@types\semver
119
119
  @types package.json: @types/semver (7.3.5)
120
- @types default index: "types": "index.d.ts"
120
+ @types main index: "types": "index.d.ts"
121
121
 
122
122
  Target path: C:\Git\rushstack\common\temp\node_modules\.pnpm\@types+semver@7.3.5\node_modules\@types\semver\index.d.ts
123
123
  ```
124
124
 
125
+ ### Resolving a relative path
126
+ ```
127
+ trace-import --path ./config/rig.json
128
+ ```
129
+
130
+ Sample output:
131
+ ```
132
+ Base folder: C:\Git\rushstack\apps\trace-import
133
+ Import path: ./config/rig.json
134
+
135
+ The import path does not appear to reference an NPM package.
136
+ Resolving...
137
+
138
+ Target path: C:\Git\rushstack\apps\trace-import\config\rig.json
139
+ ```
140
+
125
141
  ## Links
126
142
 
127
143
  - [CHANGELOG.md](
@@ -30,7 +30,7 @@ class TraceImportCommandLineParser extends ts_command_line_1.CommandLineParser {
30
30
  parameterShortName: '-p',
31
31
  description: 'The import module path to be analyzed. For example, ' +
32
32
  '"example" in expressions such as: require("example"); require.resolve("example"); import { Thing } from "example";',
33
- argumentName: 'MODULE_PATH',
33
+ argumentName: 'IMPORT_PATH',
34
34
  required: true
35
35
  });
36
36
  this._baseFolderParameter = this.defineStringParameter({
@@ -42,7 +42,7 @@ class TraceImportCommandLineParser extends ts_command_line_1.CommandLineParser {
42
42
  });
43
43
  this._resolutionTypeParameter = this.defineChoiceParameter({
44
44
  parameterLongName: '--resolution-type',
45
- parameterShortName: '-r',
45
+ parameterShortName: '-t',
46
46
  description: 'The type of module resolution to perform: ' +
47
47
  '"cjs" for CommonJS, "es" for ES modules, or "ts" for TypeScript typings',
48
48
  alternatives: ['cjs', 'es', 'ts'],
@@ -1 +1 @@
1
- {"version":3,"file":"TraceImportCommandLineParser.js","sourceRoot":"","sources":["../src/TraceImportCommandLineParser.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;AAE3D,uDAAiC;AACjC,gEAKoC;AACpC,oEAA6D;AAE7D,+CAA4D;AAE5D,MAAa,4BAA6B,SAAQ,mCAAiB;IAMjE;QACE,KAAK,CAAC;YACJ,YAAY,EAAE,cAAc;YAC5B,eAAe,EACb,oFAAoF;gBACpF,iGAAiG;gBACjG,iEAAiE;gBACjE,qGAAqG;gBACrG,oFAAoF;SACvF,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC;YAC9C,iBAAiB,EAAE,SAAS;YAC5B,kBAAkB,EAAE,IAAI;YACxB,WAAW,EAAE,sEAAsE;SACpF,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC;YAC/C,iBAAiB,EAAE,QAAQ;YAC3B,kBAAkB,EAAE,IAAI;YACxB,WAAW,EACT,sDAAsD;gBACtD,oHAAoH;YACtH,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,CAAC;YACrD,iBAAiB,EAAE,eAAe;YAClC,kBAAkB,EAAE,IAAI;YACxB,WAAW,EACT,gHAAgH;gBAChH,oDAAoD;YACtD,YAAY,EAAE,aAAa;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,qBAAqB,CAAC;YACzD,iBAAiB,EAAE,mBAAmB;YACtC,kBAAkB,EAAE,IAAI;YACxB,WAAW,EACT,6CAA6C;gBAC7C,yEAAyE;YAC3E,YAAY,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;YACjC,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IAES,KAAK,CAAC,SAAS;;QACvB,WAAW;QACX,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;YAC9B,iCAAa,CAAC,eAAe,GAAG,IAAI,CAAC;SACtC;QACD,IAAI;YACF,IAAA,yBAAW,EAAC;gBACV,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,KAAM;gBACtC,UAAU,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK;gBAC3C,cAAc,EAAE,CAAC,MAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,mCAAI,KAAK,CAAmB;aACjF,CAAC,CAAC;SACJ;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;gBAC9B,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;aACnC;iBAAM;gBACL,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,cAAM,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;aACpE;SACF;IACH,CAAC;CACF;AAxED,oEAwEC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport colors from 'colors/safe';\nimport {\n CommandLineParser,\n CommandLineFlagParameter,\n CommandLineStringParameter,\n CommandLineChoiceParameter\n} from '@rushstack/ts-command-line';\nimport { InternalError } from '@rushstack/node-core-library';\n\nimport { ResolutionType, traceImport } from './traceImport';\n\nexport class TraceImportCommandLineParser extends CommandLineParser {\n private readonly _debugParameter: CommandLineFlagParameter;\n private readonly _pathParameter: CommandLineStringParameter;\n private readonly _baseFolderParameter: CommandLineStringParameter;\n private readonly _resolutionTypeParameter: CommandLineChoiceParameter;\n\n public constructor() {\n super({\n toolFilename: 'trace-import',\n toolDescription:\n 'This tool analyzes import module paths, to determine the resolved target folder. ' +\n 'For example, if the \"semver\" NPM package is installed, \"trace-import --path semver/index\" will ' +\n 'print output equivalent to the Node.js require.resolve() API. ' +\n 'If \"@types/semver\" is installed, then \"trace-import --resolution-type ts --path semver/index\" will ' +\n 'print the .d.ts file path that would be resolved by a TypeScript import statement.'\n });\n\n this._debugParameter = this.defineFlagParameter({\n parameterLongName: '--debug',\n parameterShortName: '-d',\n description: 'Show the full call stack if an error occurs while executing the tool'\n });\n\n this._pathParameter = this.defineStringParameter({\n parameterLongName: '--path',\n parameterShortName: '-p',\n description:\n 'The import module path to be analyzed. For example, ' +\n '\"example\" in expressions such as: require(\"example\"); require.resolve(\"example\"); import { Thing } from \"example\";',\n argumentName: 'MODULE_PATH',\n required: true\n });\n\n this._baseFolderParameter = this.defineStringParameter({\n parameterLongName: '--base-folder',\n parameterShortName: '-b',\n description:\n 'The \"--path\" string will be resolved as if the import statement appeared in a script located in this folder. ' +\n 'If omitted, the current working directory is used.',\n argumentName: 'FOLDER_PATH'\n });\n\n this._resolutionTypeParameter = this.defineChoiceParameter({\n parameterLongName: '--resolution-type',\n parameterShortName: '-r',\n description:\n 'The type of module resolution to perform: ' +\n '\"cjs\" for CommonJS, \"es\" for ES modules, or \"ts\" for TypeScript typings',\n alternatives: ['cjs', 'es', 'ts'],\n defaultValue: 'cjs'\n });\n }\n\n protected async onExecute(): Promise<void> {\n // override\n if (this._debugParameter.value) {\n InternalError.breakInDebugger = true;\n }\n try {\n traceImport({\n importPath: this._pathParameter.value!,\n baseFolder: this._baseFolderParameter.value,\n resolutionType: (this._resolutionTypeParameter.value ?? 'cjs') as ResolutionType\n });\n } catch (error) {\n if (this._debugParameter.value) {\n console.error('\\n' + error.stack);\n } else {\n console.error('\\n' + colors.red('ERROR: ' + error.message.trim()));\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"TraceImportCommandLineParser.js","sourceRoot":"","sources":["../src/TraceImportCommandLineParser.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;AAE3D,uDAAiC;AACjC,gEAKoC;AACpC,oEAA6D;AAE7D,+CAA4D;AAE5D,MAAa,4BAA6B,SAAQ,mCAAiB;IAMjE;QACE,KAAK,CAAC;YACJ,YAAY,EAAE,cAAc;YAC5B,eAAe,EACb,oFAAoF;gBACpF,iGAAiG;gBACjG,iEAAiE;gBACjE,qGAAqG;gBACrG,oFAAoF;SACvF,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC;YAC9C,iBAAiB,EAAE,SAAS;YAC5B,kBAAkB,EAAE,IAAI;YACxB,WAAW,EAAE,sEAAsE;SACpF,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC;YAC/C,iBAAiB,EAAE,QAAQ;YAC3B,kBAAkB,EAAE,IAAI;YACxB,WAAW,EACT,sDAAsD;gBACtD,oHAAoH;YACtH,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,CAAC;YACrD,iBAAiB,EAAE,eAAe;YAClC,kBAAkB,EAAE,IAAI;YACxB,WAAW,EACT,gHAAgH;gBAChH,oDAAoD;YACtD,YAAY,EAAE,aAAa;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,qBAAqB,CAAC;YACzD,iBAAiB,EAAE,mBAAmB;YACtC,kBAAkB,EAAE,IAAI;YACxB,WAAW,EACT,6CAA6C;gBAC7C,yEAAyE;YAC3E,YAAY,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;YACjC,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IAES,KAAK,CAAC,SAAS;;QACvB,WAAW;QACX,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;YAC9B,iCAAa,CAAC,eAAe,GAAG,IAAI,CAAC;SACtC;QACD,IAAI;YACF,IAAA,yBAAW,EAAC;gBACV,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,KAAM;gBACtC,UAAU,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK;gBAC3C,cAAc,EAAE,CAAC,MAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,mCAAI,KAAK,CAAmB;aACjF,CAAC,CAAC;SACJ;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;gBAC9B,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;aACnC;iBAAM;gBACL,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,cAAM,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;aACpE;SACF;IACH,CAAC;CACF;AAxED,oEAwEC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport colors from 'colors/safe';\nimport {\n CommandLineParser,\n CommandLineFlagParameter,\n CommandLineStringParameter,\n CommandLineChoiceParameter\n} from '@rushstack/ts-command-line';\nimport { InternalError } from '@rushstack/node-core-library';\n\nimport { ResolutionType, traceImport } from './traceImport';\n\nexport class TraceImportCommandLineParser extends CommandLineParser {\n private readonly _debugParameter: CommandLineFlagParameter;\n private readonly _pathParameter: CommandLineStringParameter;\n private readonly _baseFolderParameter: CommandLineStringParameter;\n private readonly _resolutionTypeParameter: CommandLineChoiceParameter;\n\n public constructor() {\n super({\n toolFilename: 'trace-import',\n toolDescription:\n 'This tool analyzes import module paths, to determine the resolved target folder. ' +\n 'For example, if the \"semver\" NPM package is installed, \"trace-import --path semver/index\" will ' +\n 'print output equivalent to the Node.js require.resolve() API. ' +\n 'If \"@types/semver\" is installed, then \"trace-import --resolution-type ts --path semver/index\" will ' +\n 'print the .d.ts file path that would be resolved by a TypeScript import statement.'\n });\n\n this._debugParameter = this.defineFlagParameter({\n parameterLongName: '--debug',\n parameterShortName: '-d',\n description: 'Show the full call stack if an error occurs while executing the tool'\n });\n\n this._pathParameter = this.defineStringParameter({\n parameterLongName: '--path',\n parameterShortName: '-p',\n description:\n 'The import module path to be analyzed. For example, ' +\n '\"example\" in expressions such as: require(\"example\"); require.resolve(\"example\"); import { Thing } from \"example\";',\n argumentName: 'IMPORT_PATH',\n required: true\n });\n\n this._baseFolderParameter = this.defineStringParameter({\n parameterLongName: '--base-folder',\n parameterShortName: '-b',\n description:\n 'The \"--path\" string will be resolved as if the import statement appeared in a script located in this folder. ' +\n 'If omitted, the current working directory is used.',\n argumentName: 'FOLDER_PATH'\n });\n\n this._resolutionTypeParameter = this.defineChoiceParameter({\n parameterLongName: '--resolution-type',\n parameterShortName: '-t',\n description:\n 'The type of module resolution to perform: ' +\n '\"cjs\" for CommonJS, \"es\" for ES modules, or \"ts\" for TypeScript typings',\n alternatives: ['cjs', 'es', 'ts'],\n defaultValue: 'cjs'\n });\n }\n\n protected async onExecute(): Promise<void> {\n // override\n if (this._debugParameter.value) {\n InternalError.breakInDebugger = true;\n }\n try {\n traceImport({\n importPath: this._pathParameter.value!,\n baseFolder: this._baseFolderParameter.value,\n resolutionType: (this._resolutionTypeParameter.value ?? 'cjs') as ResolutionType\n });\n } catch (error) {\n if (this._debugParameter.value) {\n console.error('\\n' + error.stack);\n } else {\n console.error('\\n' + colors.red('ERROR: ' + error.message.trim()));\n }\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"traceImport.d.ts","sourceRoot":"","sources":["../src/traceImport.ts"],"names":[],"mappings":"AAkBA,oBAAY,cAAc,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjD,UAAU,eAAe;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;CAChC;AAuRD,wBAAgB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAY1D"}
1
+ {"version":3,"file":"traceImport.d.ts","sourceRoot":"","sources":["../src/traceImport.ts"],"names":[],"mappings":"AAkBA,oBAAY,cAAc,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjD,UAAU,eAAe;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;CAChC;AAqSD,wBAAgB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAY1D"}
@@ -45,7 +45,7 @@ const tsExtensions = ['.d.ts', '.ts', '.tsx', '.json'];
45
45
  //
46
46
  // @scope/my-package
47
47
  // [group 1 ]
48
- const packageImportPathRegExp = /^((?:@[a-z0-9\-_\.]+\/)?[a-z0-9\-_\.]+)(\/.*)?$/i;
48
+ const packageImportPathRegExp = /^((?:@[a-z0-9_][a-z0-9\-_\.]*\/)?[a-z0-9_][a-z0-9\-_\.]*)(\/.*)?$/i;
49
49
  function logInputField(title, value) {
50
50
  console.log(safe_1.default.cyan(title.padEnd(25)) + value);
51
51
  }
@@ -53,11 +53,11 @@ function logOutputField(title, value) {
53
53
  console.log(safe_1.default.green(title.padEnd(25)) + value);
54
54
  }
55
55
  function traceTypeScriptPackage(options) {
56
- const { importRemainder, packageFolder, packageJson, atTypes, warnings } = options;
56
+ const { packageSubpath, packageFolder, packageJson, atTypes, warnings } = options;
57
57
  // For example, if we started with importFullPath="semver/index",
58
58
  // here we may get normalizedImportFullPath="@types/semver/index"
59
- const normalizedImportFullPath = packageJson.name + importRemainder;
60
- // First try to resolve the .js default entry point
59
+ const normalizedImportFullPath = packageJson.name + packageSubpath;
60
+ // First try to resolve the .js main index
61
61
  let cjsTargetPath = undefined;
62
62
  try {
63
63
  cjsTargetPath = Resolve.sync(normalizedImportFullPath, {
@@ -69,12 +69,12 @@ function traceTypeScriptPackage(options) {
69
69
  catch (error) {
70
70
  // not found
71
71
  }
72
- const defaultIndexTitle = atTypes ? '@types default index:' : 'Default index:';
72
+ const mainIndexTitle = atTypes ? '@types main index:' : 'Main index:';
73
73
  if (cjsTargetPath) {
74
74
  const parsedPath = path.parse(cjsTargetPath);
75
75
  // Is the resolved .js extension okay?
76
76
  if (tsExtensions.indexOf(parsedPath.ext.toLocaleLowerCase()) >= 0) {
77
- logOutputField(defaultIndexTitle, '(inferred from .js entry point)');
77
+ logOutputField(mainIndexTitle, '(inferred from .js main index)');
78
78
  console.log();
79
79
  logOutputField('Target path:', cjsTargetPath);
80
80
  return true;
@@ -82,22 +82,22 @@ function traceTypeScriptPackage(options) {
82
82
  // Try to replace the file extension
83
83
  const dtsTargetPath = path.join(parsedPath.dir, parsedPath.name + '.d.ts');
84
84
  if (node_core_library_1.FileSystem.exists(dtsTargetPath)) {
85
- logOutputField(defaultIndexTitle, '(inferred from .js entry point)');
85
+ logOutputField(mainIndexTitle, '(inferred from .js entry point)');
86
86
  console.log();
87
87
  logOutputField('Target path:', dtsTargetPath);
88
88
  return true;
89
89
  }
90
90
  }
91
- if (!importRemainder) {
92
- // Try importing the "types"/"typings" default:
91
+ if (!packageSubpath) {
92
+ // Try importing the "types"/"typings" main index:
93
93
  if (packageJson.types) {
94
- logOutputField(defaultIndexTitle, `"types": ${JSON.stringify(packageJson.types)}`);
94
+ logOutputField(mainIndexTitle, `"types": ${JSON.stringify(packageJson.types)}`);
95
95
  console.log();
96
96
  logOutputField('Target path:', path.join(packageFolder, packageJson.types));
97
97
  return true;
98
98
  }
99
99
  if (packageJson.typings) {
100
- logOutputField(defaultIndexTitle, `"typings": ${JSON.stringify(packageJson.typings)}`);
100
+ logOutputField(mainIndexTitle, `"typings": ${JSON.stringify(packageJson.typings)}`);
101
101
  console.log();
102
102
  logOutputField('Target path:', path.join(packageFolder, packageJson.typings));
103
103
  return true;
@@ -143,12 +143,12 @@ function traceImportInner(options, warnings) {
143
143
  logInputField('Base folder:', baseFolder);
144
144
  if (match) {
145
145
  const importPackageName = match[1];
146
- const importRemainder = match[2];
147
- const importRemainderWithoutSlash = importRemainder
148
- ? importRemainder.substring(1)
146
+ const packageSubpath = match[2];
147
+ const packageSubpathWithoutSlash = packageSubpath
148
+ ? packageSubpath.substring(1)
149
149
  : undefined;
150
150
  logInputField('Package name:', importPackageName);
151
- logInputField('Module path:', importRemainderWithoutSlash || '(not specified)');
151
+ logInputField('Package subpath:', packageSubpathWithoutSlash || '(not specified)');
152
152
  console.log('\nResolving...\n');
153
153
  // Resolve the NPM package first
154
154
  let packageFolder;
@@ -208,12 +208,12 @@ function traceImportInner(options, warnings) {
208
208
  if (!packageFolder || !packageJson) {
209
209
  throw new Error(`Cannot find package "${importPackageName}" from "${baseFolder}".`);
210
210
  }
211
- if (!importRemainder) {
211
+ if (!packageSubpath) {
212
212
  if (packageJson.main) {
213
- logOutputField('Default entry point:', `"main": ${JSON.stringify(packageJson.main)}`);
213
+ logOutputField('Main index:', `"main": ${JSON.stringify(packageJson.main)}`);
214
214
  }
215
215
  else {
216
- logOutputField('Default entry point:', '(none)');
216
+ logOutputField('Main index:', '(none)');
217
217
  }
218
218
  }
219
219
  let targetPath;
@@ -225,12 +225,12 @@ function traceImportInner(options, warnings) {
225
225
  });
226
226
  }
227
227
  catch (error) {
228
- // Are we importing the default entry point?
229
- if (importRemainder) {
230
- throw new Error(`Unable to resolve remainder of import path: ...${importRemainder}`);
228
+ // Are we importing the main index?
229
+ if (packageSubpath) {
230
+ throw new Error(`Unable to resolve the module subpath: ...${packageSubpath}`);
231
231
  }
232
232
  else {
233
- console.log('\nThis package does not define a default entry point.');
233
+ console.log('\nThis package does not define a main index.');
234
234
  return;
235
235
  }
236
236
  }
@@ -243,7 +243,7 @@ function traceImportInner(options, warnings) {
243
243
  throw new Error(`Cannot find package "${importPackageName}" from "${baseFolder}".`);
244
244
  }
245
245
  if (packageFolder && packageJson) {
246
- if (traceTypeScriptPackage({ importRemainder, packageFolder, packageJson, warnings })) {
246
+ if (traceTypeScriptPackage({ packageSubpath, packageFolder, packageJson, warnings })) {
247
247
  if (atTypesPackageFolder) {
248
248
  warnings.push('An @types package was found but not used.');
249
249
  }
@@ -252,7 +252,7 @@ function traceImportInner(options, warnings) {
252
252
  }
253
253
  if (atTypesPackageFolder && atTypesPackageJson) {
254
254
  if (traceTypeScriptPackage({
255
- importRemainder,
255
+ packageSubpath,
256
256
  packageFolder: atTypesPackageFolder,
257
257
  packageJson: atTypesPackageJson,
258
258
  warnings,
@@ -261,14 +261,27 @@ function traceImportInner(options, warnings) {
261
261
  return;
262
262
  }
263
263
  }
264
- throw new Error(`Unable to resolve remainder of import path: ...${importRemainder}`);
264
+ throw new Error(`Unable to resolve the module subpath: ...${packageSubpath}`);
265
265
  default:
266
266
  throw new Error(`The "${options.resolutionType}" resolution type is not implemented yet`);
267
267
  }
268
268
  }
269
269
  else {
270
- console.log(`The import path does not appear to reference an NPM package.\n`);
271
- logOutputField('Module path:', importFullPath);
270
+ logInputField('Import path:', importFullPath);
271
+ console.log(`\nThe import path does not appear to reference an NPM package.`);
272
+ console.log('Resolving...\n');
273
+ let targetPath;
274
+ try {
275
+ targetPath = Resolve.sync(importFullPath, {
276
+ basedir: baseFolder,
277
+ preserveSymlinks: false,
278
+ extensions: options.resolutionType === 'ts' ? tsExtensions : jsExtensions
279
+ });
280
+ }
281
+ catch (error) {
282
+ throw new Error(`Unable to resolve the import path: ${importFullPath}`);
283
+ }
284
+ logOutputField('Target path:', targetPath);
272
285
  }
273
286
  }
274
287
  function traceImport(options) {
@@ -1 +1 @@
1
- {"version":3,"file":"traceImport.js","sourceRoot":"","sources":["../src/traceImport.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport {\n FileSystem,\n IPackageJson,\n IParsedPackageName,\n JsonFile,\n PackageName\n} from '@rushstack/node-core-library';\nimport colors from 'colors/safe';\nimport * as path from 'path';\nimport * as process from 'process';\nimport * as Resolve from 'resolve';\n\nconst jsExtensions: string[] = ['.js', '.cjs', '.jsx', '.json'];\nconst tsExtensions: string[] = ['.d.ts', '.ts', '.tsx', '.json'];\n\nexport type ResolutionType = 'cjs' | 'es' | 'ts';\n\ninterface IExecuteOptions {\n importPath: string;\n baseFolder: string | undefined;\n resolutionType: ResolutionType;\n}\n\n// Somewhat loosely matches inputs such as:\n// my-package/path/to/file.js\n// [group 1 ][group 2 ]\n//\n// @scope/my-package/path/to/file.js\n// [group 1 ][group 2 ]\n//\n// @scope/my-package\n// [group 1 ]\nconst packageImportPathRegExp: RegExp = /^((?:@[a-z0-9\\-_\\.]+\\/)?[a-z0-9\\-_\\.]+)(\\/.*)?$/i;\n\nfunction logInputField(title: string, value: string): void {\n console.log(colors.cyan(title.padEnd(25)) + value);\n}\n\nfunction logOutputField(title: string, value: string): void {\n console.log(colors.green(title.padEnd(25)) + value);\n}\n\nfunction traceTypeScriptPackage(options: {\n importRemainder: string;\n packageFolder: string;\n packageJson: IPackageJson;\n warnings: string[];\n atTypes?: boolean;\n}): boolean {\n const { importRemainder, packageFolder, packageJson, atTypes, warnings } = options;\n\n // For example, if we started with importFullPath=\"semver/index\",\n // here we may get normalizedImportFullPath=\"@types/semver/index\"\n const normalizedImportFullPath: string = packageJson.name + importRemainder;\n\n // First try to resolve the .js default entry point\n let cjsTargetPath: string | undefined = undefined;\n try {\n cjsTargetPath = Resolve.sync(normalizedImportFullPath, {\n basedir: packageFolder,\n preserveSymlinks: false,\n extensions: jsExtensions\n });\n } catch (error) {\n // not found\n }\n\n const defaultIndexTitle: string = atTypes ? '@types default index:' : 'Default index:';\n\n if (cjsTargetPath) {\n const parsedPath: path.ParsedPath = path.parse(cjsTargetPath);\n\n // Is the resolved .js extension okay?\n if (tsExtensions.indexOf(parsedPath.ext.toLocaleLowerCase()) >= 0) {\n logOutputField(defaultIndexTitle, '(inferred from .js entry point)');\n console.log();\n logOutputField('Target path:', cjsTargetPath);\n return true;\n }\n\n // Try to replace the file extension\n const dtsTargetPath: string = path.join(parsedPath.dir, parsedPath.name + '.d.ts');\n if (FileSystem.exists(dtsTargetPath)) {\n logOutputField(defaultIndexTitle, '(inferred from .js entry point)');\n console.log();\n logOutputField('Target path:', dtsTargetPath);\n return true;\n }\n }\n\n if (!importRemainder) {\n // Try importing the \"types\"/\"typings\" default:\n\n if (packageJson.types) {\n logOutputField(defaultIndexTitle, `\"types\": ${JSON.stringify(packageJson.types)}`);\n console.log();\n logOutputField('Target path:', path.join(packageFolder, packageJson.types));\n return true;\n }\n\n if (packageJson.typings) {\n logOutputField(defaultIndexTitle, `\"typings\": ${JSON.stringify(packageJson.typings)}`);\n console.log();\n logOutputField('Target path:', path.join(packageFolder, packageJson.typings));\n return true;\n }\n\n if (atTypes) {\n warnings.push('The @types package does not define \"types\" or \"typings\" field.');\n }\n } else {\n // Try importing the .d.ts file directly\n let dtsTargetPath: string | undefined = undefined;\n try {\n dtsTargetPath = Resolve.sync(normalizedImportFullPath, {\n basedir: packageFolder,\n preserveSymlinks: false,\n extensions: tsExtensions\n });\n } catch (error) {\n // not found\n }\n\n if (dtsTargetPath) {\n console.log();\n logOutputField('Target path:', dtsTargetPath);\n return true;\n }\n }\n\n return false;\n}\n\nfunction traceImportInner(options: IExecuteOptions, warnings: string[]): void {\n let baseFolder: string;\n if (options.baseFolder) {\n baseFolder = path.resolve(options.baseFolder);\n } else {\n baseFolder = process.cwd();\n }\n\n const importFullPath: string = options.importPath.trim();\n if (!importFullPath) {\n throw new Error(`Invalid import path syntax: ${JSON.stringify(importFullPath)}`);\n }\n const match: RegExpExecArray | null = packageImportPathRegExp.exec(importFullPath);\n\n logInputField('Base folder:', baseFolder);\n\n if (match) {\n const importPackageName: string = match[1];\n const importRemainder: string | undefined = match[2];\n const importRemainderWithoutSlash: string | undefined = importRemainder\n ? importRemainder.substring(1)\n : undefined;\n\n logInputField('Package name:', importPackageName);\n logInputField('Module path:', importRemainderWithoutSlash || '(not specified)');\n\n console.log('\\nResolving...\\n');\n\n // Resolve the NPM package first\n let packageFolder: string | undefined;\n let packageJson: IPackageJson | undefined = undefined;\n {\n let resolvedPackageJsonPath: string | undefined;\n try {\n resolvedPackageJsonPath = Resolve.sync(`${importPackageName}/package.json`, {\n basedir: baseFolder,\n preserveSymlinks: false\n });\n } catch (e) {\n // Could not find NPM package\n }\n\n if (resolvedPackageJsonPath) {\n packageFolder = path.dirname(resolvedPackageJsonPath);\n logOutputField('Package folder:', packageFolder);\n\n packageJson = JsonFile.load(resolvedPackageJsonPath) as IPackageJson;\n logOutputField(\n 'package.json:',\n `${packageJson.name || '(missing name)'} (${packageJson.version || 'missing version'})`\n );\n }\n }\n\n // Also try to resolve the @types package\n let atTypesPackageFolder: string | undefined = undefined;\n let atTypesPackageJson: IPackageJson | undefined = undefined;\n\n if (options.resolutionType === 'ts') {\n if (!importPackageName.startsWith('@types/')) {\n const parsedPackageName: IParsedPackageName = PackageName.parse(importPackageName);\n let atTypesPackageName: string;\n if (parsedPackageName.scope) {\n atTypesPackageName = `@types/${parsedPackageName.scope}__${parsedPackageName.unscopedName}`;\n } else {\n atTypesPackageName = `@types/${parsedPackageName.unscopedName}`;\n }\n\n let atTypesPackageJsonPath: string | undefined;\n try {\n atTypesPackageJsonPath = Resolve.sync(`${atTypesPackageName}/package.json`, {\n basedir: baseFolder,\n preserveSymlinks: false\n });\n } catch (e) {\n // Unable to resolve @types package\n }\n\n if (atTypesPackageJsonPath) {\n atTypesPackageFolder = path.dirname(atTypesPackageJsonPath);\n logOutputField('@types folder:', atTypesPackageFolder);\n\n atTypesPackageJson = JsonFile.load(atTypesPackageJsonPath) as IPackageJson;\n logOutputField(\n '@types package.json:',\n `${atTypesPackageJson.name || '(missing name)'} (${\n atTypesPackageJson.version || 'missing version'\n })`\n );\n }\n }\n }\n\n switch (options.resolutionType) {\n case 'cjs':\n {\n if (!packageFolder || !packageJson) {\n throw new Error(`Cannot find package \"${importPackageName}\" from \"${baseFolder}\".`);\n }\n\n if (!importRemainder) {\n if (packageJson.main) {\n logOutputField('Default entry point:', `\"main\": ${JSON.stringify(packageJson.main)}`);\n } else {\n logOutputField('Default entry point:', '(none)');\n }\n }\n\n let targetPath: string;\n try {\n targetPath = Resolve.sync(importFullPath, {\n basedir: packageFolder,\n preserveSymlinks: false,\n extensions: jsExtensions\n });\n } catch (error) {\n // Are we importing the default entry point?\n if (importRemainder) {\n throw new Error(`Unable to resolve remainder of import path: ...${importRemainder}`);\n } else {\n console.log('\\nThis package does not define a default entry point.');\n return;\n }\n }\n console.log();\n logOutputField('Target path:', targetPath);\n }\n break;\n case 'ts':\n if (!packageFolder || (!packageJson && !atTypesPackageFolder && !atTypesPackageJson)) {\n throw new Error(`Cannot find package \"${importPackageName}\" from \"${baseFolder}\".`);\n }\n\n if (packageFolder && packageJson) {\n if (traceTypeScriptPackage({ importRemainder, packageFolder, packageJson, warnings })) {\n if (atTypesPackageFolder) {\n warnings.push('An @types package was found but not used.');\n }\n\n return;\n }\n }\n\n if (atTypesPackageFolder && atTypesPackageJson) {\n if (\n traceTypeScriptPackage({\n importRemainder,\n packageFolder: atTypesPackageFolder,\n packageJson: atTypesPackageJson,\n warnings,\n atTypes: true\n })\n ) {\n return;\n }\n }\n\n throw new Error(`Unable to resolve remainder of import path: ...${importRemainder}`);\n default:\n throw new Error(`The \"${options.resolutionType}\" resolution type is not implemented yet`);\n }\n } else {\n console.log(`The import path does not appear to reference an NPM package.\\n`);\n logOutputField('Module path:', importFullPath);\n }\n}\n\nexport function traceImport(options: IExecuteOptions): void {\n const warnings: string[] = [];\n try {\n traceImportInner(options, warnings);\n } finally {\n if (warnings.length) {\n console.log();\n for (const warning of warnings) {\n console.log(colors.yellow('Warning: ' + warning));\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"traceImport.js","sourceRoot":"","sources":["../src/traceImport.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport {\n FileSystem,\n IPackageJson,\n IParsedPackageName,\n JsonFile,\n PackageName\n} from '@rushstack/node-core-library';\nimport colors from 'colors/safe';\nimport * as path from 'path';\nimport * as process from 'process';\nimport * as Resolve from 'resolve';\n\nconst jsExtensions: string[] = ['.js', '.cjs', '.jsx', '.json'];\nconst tsExtensions: string[] = ['.d.ts', '.ts', '.tsx', '.json'];\n\nexport type ResolutionType = 'cjs' | 'es' | 'ts';\n\ninterface IExecuteOptions {\n importPath: string;\n baseFolder: string | undefined;\n resolutionType: ResolutionType;\n}\n\n// Somewhat loosely matches inputs such as:\n// my-package/path/to/file.js\n// [group 1 ][group 2 ]\n//\n// @scope/my-package/path/to/file.js\n// [group 1 ][group 2 ]\n//\n// @scope/my-package\n// [group 1 ]\nconst packageImportPathRegExp: RegExp = /^((?:@[a-z0-9_][a-z0-9\\-_\\.]*\\/)?[a-z0-9_][a-z0-9\\-_\\.]*)(\\/.*)?$/i;\n\nfunction logInputField(title: string, value: string): void {\n console.log(colors.cyan(title.padEnd(25)) + value);\n}\n\nfunction logOutputField(title: string, value: string): void {\n console.log(colors.green(title.padEnd(25)) + value);\n}\n\nfunction traceTypeScriptPackage(options: {\n packageSubpath: string;\n packageFolder: string;\n packageJson: IPackageJson;\n warnings: string[];\n atTypes?: boolean;\n}): boolean {\n const { packageSubpath, packageFolder, packageJson, atTypes, warnings } = options;\n\n // For example, if we started with importFullPath=\"semver/index\",\n // here we may get normalizedImportFullPath=\"@types/semver/index\"\n const normalizedImportFullPath: string = packageJson.name + packageSubpath;\n\n // First try to resolve the .js main index\n let cjsTargetPath: string | undefined = undefined;\n try {\n cjsTargetPath = Resolve.sync(normalizedImportFullPath, {\n basedir: packageFolder,\n preserveSymlinks: false,\n extensions: jsExtensions\n });\n } catch (error) {\n // not found\n }\n\n const mainIndexTitle: string = atTypes ? '@types main index:' : 'Main index:';\n\n if (cjsTargetPath) {\n const parsedPath: path.ParsedPath = path.parse(cjsTargetPath);\n\n // Is the resolved .js extension okay?\n if (tsExtensions.indexOf(parsedPath.ext.toLocaleLowerCase()) >= 0) {\n logOutputField(mainIndexTitle, '(inferred from .js main index)');\n console.log();\n logOutputField('Target path:', cjsTargetPath);\n return true;\n }\n\n // Try to replace the file extension\n const dtsTargetPath: string = path.join(parsedPath.dir, parsedPath.name + '.d.ts');\n if (FileSystem.exists(dtsTargetPath)) {\n logOutputField(mainIndexTitle, '(inferred from .js entry point)');\n console.log();\n logOutputField('Target path:', dtsTargetPath);\n return true;\n }\n }\n\n if (!packageSubpath) {\n // Try importing the \"types\"/\"typings\" main index:\n\n if (packageJson.types) {\n logOutputField(mainIndexTitle, `\"types\": ${JSON.stringify(packageJson.types)}`);\n console.log();\n logOutputField('Target path:', path.join(packageFolder, packageJson.types));\n return true;\n }\n\n if (packageJson.typings) {\n logOutputField(mainIndexTitle, `\"typings\": ${JSON.stringify(packageJson.typings)}`);\n console.log();\n logOutputField('Target path:', path.join(packageFolder, packageJson.typings));\n return true;\n }\n\n if (atTypes) {\n warnings.push('The @types package does not define \"types\" or \"typings\" field.');\n }\n } else {\n // Try importing the .d.ts file directly\n let dtsTargetPath: string | undefined = undefined;\n try {\n dtsTargetPath = Resolve.sync(normalizedImportFullPath, {\n basedir: packageFolder,\n preserveSymlinks: false,\n extensions: tsExtensions\n });\n } catch (error) {\n // not found\n }\n\n if (dtsTargetPath) {\n console.log();\n logOutputField('Target path:', dtsTargetPath);\n return true;\n }\n }\n\n return false;\n}\n\nfunction traceImportInner(options: IExecuteOptions, warnings: string[]): void {\n let baseFolder: string;\n if (options.baseFolder) {\n baseFolder = path.resolve(options.baseFolder);\n } else {\n baseFolder = process.cwd();\n }\n\n const importFullPath: string = options.importPath.trim();\n if (!importFullPath) {\n throw new Error(`Invalid import path syntax: ${JSON.stringify(importFullPath)}`);\n }\n const match: RegExpExecArray | null = packageImportPathRegExp.exec(importFullPath);\n\n logInputField('Base folder:', baseFolder);\n\n if (match) {\n const importPackageName: string = match[1];\n const packageSubpath: string | undefined = match[2];\n const packageSubpathWithoutSlash: string | undefined = packageSubpath\n ? packageSubpath.substring(1)\n : undefined;\n\n logInputField('Package name:', importPackageName);\n logInputField('Package subpath:', packageSubpathWithoutSlash || '(not specified)');\n\n console.log('\\nResolving...\\n');\n\n // Resolve the NPM package first\n let packageFolder: string | undefined;\n let packageJson: IPackageJson | undefined = undefined;\n {\n let resolvedPackageJsonPath: string | undefined;\n try {\n resolvedPackageJsonPath = Resolve.sync(`${importPackageName}/package.json`, {\n basedir: baseFolder,\n preserveSymlinks: false\n });\n } catch (e) {\n // Could not find NPM package\n }\n\n if (resolvedPackageJsonPath) {\n packageFolder = path.dirname(resolvedPackageJsonPath);\n logOutputField('Package folder:', packageFolder);\n\n packageJson = JsonFile.load(resolvedPackageJsonPath) as IPackageJson;\n logOutputField(\n 'package.json:',\n `${packageJson.name || '(missing name)'} (${packageJson.version || 'missing version'})`\n );\n }\n }\n\n // Also try to resolve the @types package\n let atTypesPackageFolder: string | undefined = undefined;\n let atTypesPackageJson: IPackageJson | undefined = undefined;\n\n if (options.resolutionType === 'ts') {\n if (!importPackageName.startsWith('@types/')) {\n const parsedPackageName: IParsedPackageName = PackageName.parse(importPackageName);\n let atTypesPackageName: string;\n if (parsedPackageName.scope) {\n atTypesPackageName = `@types/${parsedPackageName.scope}__${parsedPackageName.unscopedName}`;\n } else {\n atTypesPackageName = `@types/${parsedPackageName.unscopedName}`;\n }\n\n let atTypesPackageJsonPath: string | undefined;\n try {\n atTypesPackageJsonPath = Resolve.sync(`${atTypesPackageName}/package.json`, {\n basedir: baseFolder,\n preserveSymlinks: false\n });\n } catch (e) {\n // Unable to resolve @types package\n }\n\n if (atTypesPackageJsonPath) {\n atTypesPackageFolder = path.dirname(atTypesPackageJsonPath);\n logOutputField('@types folder:', atTypesPackageFolder);\n\n atTypesPackageJson = JsonFile.load(atTypesPackageJsonPath) as IPackageJson;\n logOutputField(\n '@types package.json:',\n `${atTypesPackageJson.name || '(missing name)'} (${\n atTypesPackageJson.version || 'missing version'\n })`\n );\n }\n }\n }\n\n switch (options.resolutionType) {\n case 'cjs':\n {\n if (!packageFolder || !packageJson) {\n throw new Error(`Cannot find package \"${importPackageName}\" from \"${baseFolder}\".`);\n }\n\n if (!packageSubpath) {\n if (packageJson.main) {\n logOutputField('Main index:', `\"main\": ${JSON.stringify(packageJson.main)}`);\n } else {\n logOutputField('Main index:', '(none)');\n }\n }\n\n let targetPath: string;\n try {\n targetPath = Resolve.sync(importFullPath, {\n basedir: packageFolder,\n preserveSymlinks: false,\n extensions: jsExtensions\n });\n } catch (error) {\n // Are we importing the main index?\n if (packageSubpath) {\n throw new Error(`Unable to resolve the module subpath: ...${packageSubpath}`);\n } else {\n console.log('\\nThis package does not define a main index.');\n return;\n }\n }\n console.log();\n logOutputField('Target path:', targetPath);\n }\n break;\n case 'ts':\n if (!packageFolder || (!packageJson && !atTypesPackageFolder && !atTypesPackageJson)) {\n throw new Error(`Cannot find package \"${importPackageName}\" from \"${baseFolder}\".`);\n }\n\n if (packageFolder && packageJson) {\n if (traceTypeScriptPackage({ packageSubpath, packageFolder, packageJson, warnings })) {\n if (atTypesPackageFolder) {\n warnings.push('An @types package was found but not used.');\n }\n\n return;\n }\n }\n\n if (atTypesPackageFolder && atTypesPackageJson) {\n if (\n traceTypeScriptPackage({\n packageSubpath,\n packageFolder: atTypesPackageFolder,\n packageJson: atTypesPackageJson,\n warnings,\n atTypes: true\n })\n ) {\n return;\n }\n }\n\n throw new Error(`Unable to resolve the module subpath: ...${packageSubpath}`);\n default:\n throw new Error(`The \"${options.resolutionType}\" resolution type is not implemented yet`);\n }\n } else {\n logInputField('Import path:', importFullPath);\n console.log(`\\nThe import path does not appear to reference an NPM package.`);\n console.log('Resolving...\\n');\n\n let targetPath: string;\n try {\n targetPath = Resolve.sync(importFullPath, {\n basedir: baseFolder,\n preserveSymlinks: false,\n extensions: options.resolutionType === 'ts' ? tsExtensions : jsExtensions\n });\n } catch (error) {\n throw new Error(`Unable to resolve the import path: ${importFullPath}`);\n }\n\n logOutputField('Target path:', targetPath);\n }\n}\n\nexport function traceImport(options: IExecuteOptions): void {\n const warnings: string[] = [];\n try {\n traceImportInner(options, warnings);\n } finally {\n if (warnings.length) {\n console.log();\n for (const warning of warnings) {\n console.log(colors.yellow('Warning: ' + warning));\n }\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rushstack/trace-import",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "CLI tool for understanding how require() and \"import\" statements get resolved",
5
5
  "repository": {
6
6
  "type": "git",