@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
|
|
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
|
|
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
|
-
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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: '
|
|
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: '-
|
|
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: '
|
|
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"]}
|
package/lib/traceImport.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/lib/traceImport.js
CHANGED
|
@@ -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\-_\.]
|
|
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 {
|
|
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 +
|
|
60
|
-
// First try to resolve the .js
|
|
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
|
|
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(
|
|
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(
|
|
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 (!
|
|
92
|
-
// Try importing the "types"/"typings"
|
|
91
|
+
if (!packageSubpath) {
|
|
92
|
+
// Try importing the "types"/"typings" main index:
|
|
93
93
|
if (packageJson.types) {
|
|
94
|
-
logOutputField(
|
|
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(
|
|
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
|
|
147
|
-
const
|
|
148
|
-
?
|
|
146
|
+
const packageSubpath = match[2];
|
|
147
|
+
const packageSubpathWithoutSlash = packageSubpath
|
|
148
|
+
? packageSubpath.substring(1)
|
|
149
149
|
: undefined;
|
|
150
150
|
logInputField('Package name:', importPackageName);
|
|
151
|
-
logInputField('
|
|
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 (!
|
|
211
|
+
if (!packageSubpath) {
|
|
212
212
|
if (packageJson.main) {
|
|
213
|
-
logOutputField('
|
|
213
|
+
logOutputField('Main index:', `"main": ${JSON.stringify(packageJson.main)}`);
|
|
214
214
|
}
|
|
215
215
|
else {
|
|
216
|
-
logOutputField('
|
|
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
|
|
229
|
-
if (
|
|
230
|
-
throw new Error(`Unable to resolve
|
|
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
|
|
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({
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
271
|
-
|
|
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) {
|
package/lib/traceImport.js.map
CHANGED
|
@@ -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"]}
|