| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,142 @@ | |||
| 1 | + 'use strict'; | ||
| 2 | + | ||
| 3 | + const { | ||
| 4 | + JSONParse, | ||
| 5 | + SafeMap, | ||
| 6 | + StringPrototypeEndsWith, | ||
| 7 | + } = primordials; | ||
| 8 | + const { URL, fileURLToPath } = require('internal/url'); | ||
| 9 | + const { | ||
| 10 | + ERR_INVALID_PACKAGE_CONFIG, | ||
| 11 | + } = require('internal/errors').codes; | ||
| 12 | + | ||
| 13 | + const packageJsonReader = require('internal/modules/package_json_reader'); | ||
| 14 | + | ||
| 15 | + | ||
| 16 | + /** | ||
| 17 | + * @typedef {string | string[] | Record<string, unknown>} Exports | ||
| 18 | + * @typedef {'module' | 'commonjs'} PackageType | ||
| 19 | + * @typedef {{ | ||
| 20 | + * pjsonPath: string, | ||
| 21 | + * exports?: ExportConfig, | ||
| 22 | + * name?: string, | ||
| 23 | + * main?: string, | ||
| 24 | + * type?: PackageType, | ||
| 25 | + * }} PackageConfig | ||
| 26 | + */ | ||
| 27 | + | ||
| 28 | + /** @type {Map<string, PackageConfig>} */ | ||
| 29 | + const packageJSONCache = new SafeMap(); | ||
| 30 | + | ||
| 31 | + | ||
| 32 | + /** | ||
| 33 | + * @param {string} path | ||
| 34 | + * @param {string} specifier | ||
| 35 | + * @param {string | URL | undefined} base | ||
| 36 | + * @returns {PackageConfig} | ||
| 37 | + */ | ||
| 38 | + function getPackageConfig(path, specifier, base) { | ||
| 39 | + const existing = packageJSONCache.get(path); | ||
| 40 | + if (existing !== undefined) { | ||
| 41 | + return existing; | ||
| 42 | + } | ||
| 43 | + const source = packageJsonReader.read(path).string; | ||
| 44 | + if (source === undefined) { | ||
| 45 | + const packageConfig = { | ||
| 46 | + pjsonPath: path, | ||
| 47 | + exists: false, | ||
| 48 | + main: undefined, | ||
| 49 | + name: undefined, | ||
| 50 | + type: 'none', | ||
| 51 | + exports: undefined, | ||
| 52 | + imports: undefined, | ||
| 53 | + }; | ||
| 54 | + packageJSONCache.set(path, packageConfig); | ||
| 55 | + return packageConfig; | ||
| 56 | + } | ||
| 57 | + | ||
| 58 | + let packageJSON; | ||
| 59 | + try { | ||
| 60 | + packageJSON = JSONParse(source); | ||
| 61 | + } catch (error) { | ||
| 62 | + throw new ERR_INVALID_PACKAGE_CONFIG( | ||
| 63 | + path, | ||
| 64 | + (base ? `"${specifier}" from ` : '') + fileURLToPath(base || specifier), | ||
| 65 | + error.message | ||
| 66 | + ); | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + let { imports, main, name, type } = packageJSON; | ||
| 70 | + const { exports } = packageJSON; | ||
| 71 | + if (typeof imports !== 'object' || imports === null) { | ||
| 72 | + imports = undefined; | ||
| 73 | + } | ||
| 74 | + if (typeof main !== 'string') { | ||
| 75 | + main = undefined; | ||
| 76 | + } | ||
| 77 | + if (typeof name !== 'string') { | ||
| 78 | + name = undefined; | ||
| 79 | + } | ||
| 80 | + // Ignore unknown types for forwards compatibility | ||
| 81 | + if (type !== 'module' && type !== 'commonjs') { | ||
| 82 | + type = 'none'; | ||
| 83 | + } | ||
| 84 | + | ||
| 85 | + const packageConfig = { | ||
| 86 | + pjsonPath: path, | ||
| 87 | + exists: true, | ||
| 88 | + main, | ||
| 89 | + name, | ||
| 90 | + type, | ||
| 91 | + exports, | ||
| 92 | + imports, | ||
| 93 | + }; | ||
| 94 | + packageJSONCache.set(path, packageConfig); | ||
| 95 | + return packageConfig; | ||
| 96 | + } | ||
| 97 | + | ||
| 98 | + | ||
| 99 | + /** | ||
| 100 | + * @param {URL | string} resolved | ||
| 101 | + * @returns {PackageConfig} | ||
| 102 | + */ | ||
| 103 | + function getPackageScopeConfig(resolved) { | ||
| 104 | + let packageJSONUrl = new URL('./package.json', resolved); | ||
| 105 | + while (true) { | ||
| 106 | + const packageJSONPath = packageJSONUrl.pathname; | ||
| 107 | + if (StringPrototypeEndsWith(packageJSONPath, 'node_modules/package.json')) { | ||
| 108 | + break; | ||
| 109 | + } | ||
| 110 | + const packageConfig = getPackageConfig(fileURLToPath(packageJSONUrl), resolved); | ||
| 111 | + if (packageConfig.exists) { | ||
| 112 | + return packageConfig; | ||
| 113 | + } | ||
| 114 | + | ||
| 115 | + const lastPackageJSONUrl = packageJSONUrl; | ||
| 116 | + packageJSONUrl = new URL('../package.json', packageJSONUrl); | ||
| 117 | + | ||
| 118 | + // Terminates at root where ../package.json equals ../../package.json | ||
| 119 | + // (can't just check "/package.json" for Windows support). | ||
| 120 | + if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) { | ||
| 121 | + break; | ||
| 122 | + } | ||
| 123 | + } | ||
| 124 | + const packageJSONPath = fileURLToPath(packageJSONUrl); | ||
| 125 | + const packageConfig = { | ||
| 126 | + pjsonPath: packageJSONPath, | ||
| 127 | + exists: false, | ||
| 128 | + main: undefined, | ||
| 129 | + name: undefined, | ||
| 130 | + type: 'none', | ||
| 131 | + exports: undefined, | ||
| 132 | + imports: undefined, | ||
| 133 | + }; | ||
| 134 | + packageJSONCache.set(packageJSONPath, packageConfig); | ||
| 135 | + return packageConfig; | ||
| 136 | + } | ||
| 137 | + | ||
| 138 | + | ||
| 139 | + module.exports = { | ||
| 140 | + getPackageConfig, | ||
| 141 | + getPackageScopeConfig, | ||
| 142 | + }; | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -59,9 +59,16 @@ const { | |||
| 59 | 59 | ERR_NETWORK_IMPORT_DISALLOWED, | |
| 60 | 60 | ERR_UNSUPPORTED_ESM_URL_SCHEME, | |
| 61 | 61 | } = require('internal/errors').codes; | |
| 62 | - const { Module: CJSModule } = require('internal/modules/cjs/loader'); | ||
| 63 | 62 | ||
| 63 | + const { Module: CJSModule } = require('internal/modules/cjs/loader'); | ||
| 64 | 64 | const packageJsonReader = require('internal/modules/package_json_reader'); | |
| 65 | + const { getPackageConfig, getPackageScopeConfig } = require('internal/modules/esm/package_config'); | ||
| 66 | + | ||
| 67 | + /** | ||
| 68 | + * @typedef {import('internal/modules/esm/package_config.js').PackageConfig} PackageConfig | ||
| 69 | + */ | ||
| 70 | + | ||
| 71 | + | ||
| 65 | 72 | const userConditions = getOptionValue('--conditions'); | |
| 66 | 73 | const noAddons = getOptionValue('--no-addons'); | |
| 67 | 74 | const addonConditions = noAddons ? [] : ['node-addons']; | |
@@ -75,18 +82,6 @@ const DEFAULT_CONDITIONS = ObjectFreeze([ | |||
| 75 | 82 | ||
| 76 | 83 | const DEFAULT_CONDITIONS_SET = new SafeSet(DEFAULT_CONDITIONS); | |
| 77 | 84 | ||
| 78 | - /** | ||
| 79 | - * @typedef {string | string[] | Record<string, unknown>} Exports | ||
| 80 | - * @typedef {'module' | 'commonjs'} PackageType | ||
| 81 | - * @typedef {{ | ||
| 82 | - * pjsonPath: string, | ||
| 83 | - * exports?: ExportConfig, | ||
| 84 | - * name?: string, | ||
| 85 | - * main?: string, | ||
| 86 | - * type?: PackageType, | ||
| 87 | - * }} PackageConfig | ||
| 88 | - */ | ||
| 89 | - | ||
| 90 | 85 | const emittedPackageWarnings = new SafeSet(); | |
| 91 | 86 | ||
| 92 | 87 | /** | |
@@ -179,7 +174,6 @@ function getConditionsSet(conditions) { | |||
| 179 | 174 | } | |
| 180 | 175 | ||
| 181 | 176 | const realpathCache = new SafeMap(); | |
| 182 | - const packageJSONCache = new SafeMap(); /* string -> PackageConfig */ | ||
| 183 | 177 | ||
| 184 | 178 | /** | |
| 185 | 179 | * @param {string | URL} path | |
@@ -188,99 +182,6 @@ const packageJSONCache = new SafeMap(); /* string -> PackageConfig */ | |||
| 188 | 182 | const tryStatSync = | |
| 189 | 183 | (path) => statSync(path, { throwIfNoEntry: false }) ?? new Stats(); | |
| 190 | 184 | ||
| 191 | - /** | ||
| 192 | - * @param {string} path | ||
| 193 | - * @param {string} specifier | ||
| 194 | - * @param {string | URL | undefined} base | ||
| 195 | - * @returns {PackageConfig} | ||
| 196 | - */ | ||
| 197 | - function getPackageConfig(path, specifier, base) { | ||
| 198 | - const existing = packageJSONCache.get(path); | ||
| 199 | - if (existing !== undefined) { | ||
| 200 | - return existing; | ||
| 201 | - } | ||
| 202 | - const source = packageJsonReader.read(path).string; | ||
| 203 | - if (source === undefined) { | ||
| 204 | - const packageConfig = { | ||
| 205 | - pjsonPath: path, | ||
| 206 | - exists: false, | ||
| 207 | - main: undefined, | ||
| 208 | - name: undefined, | ||
| 209 | - type: 'none', | ||
| 210 | - exports: undefined, | ||
| 211 | - imports: undefined, | ||
| 212 | - }; | ||
| 213 | - packageJSONCache.set(path, packageConfig); | ||
| 214 | - return packageConfig; | ||
| 215 | - } | ||
| 216 | - | ||
| 217 | - let packageJSON; | ||
| 218 | - try { | ||
| 219 | - packageJSON = JSONParse(source); | ||
| 220 | - } catch (error) { | ||
| 221 | - throw new ERR_INVALID_PACKAGE_CONFIG( | ||
| 222 | - path, | ||
| 223 | - (base ? `"${specifier}" from ` : '') + fileURLToPath(base || specifier), | ||
| 224 | - error.message | ||
| 225 | - ); | ||
| 226 | - } | ||
| 227 | - | ||
| 228 | - let { imports, main, name, type } = packageJSON; | ||
| 229 | - const { exports } = packageJSON; | ||
| 230 | - if (typeof imports !== 'object' || imports === null) imports = undefined; | ||
| 231 | - if (typeof main !== 'string') main = undefined; | ||
| 232 | - if (typeof name !== 'string') name = undefined; | ||
| 233 | - // Ignore unknown types for forwards compatibility | ||
| 234 | - if (type !== 'module' && type !== 'commonjs') type = 'none'; | ||
| 235 | - | ||
| 236 | - const packageConfig = { | ||
| 237 | - pjsonPath: path, | ||
| 238 | - exists: true, | ||
| 239 | - main, | ||
| 240 | - name, | ||
| 241 | - type, | ||
| 242 | - exports, | ||
| 243 | - imports, | ||
| 244 | - }; | ||
| 245 | - packageJSONCache.set(path, packageConfig); | ||
| 246 | - return packageConfig; | ||
| 247 | - } | ||
| 248 | - | ||
| 249 | - /** | ||
| 250 | - * @param {URL | string} resolved | ||
| 251 | - * @returns {PackageConfig} | ||
| 252 | - */ | ||
| 253 | - function getPackageScopeConfig(resolved) { | ||
| 254 | - let packageJSONUrl = new URL('./package.json', resolved); | ||
| 255 | - while (true) { | ||
| 256 | - const packageJSONPath = packageJSONUrl.pathname; | ||
| 257 | - if (StringPrototypeEndsWith(packageJSONPath, 'node_modules/package.json')) | ||
| 258 | - break; | ||
| 259 | - const packageConfig = getPackageConfig(fileURLToPath(packageJSONUrl), | ||
| 260 | - resolved); | ||
| 261 | - if (packageConfig.exists) return packageConfig; | ||
| 262 | - | ||
| 263 | - const lastPackageJSONUrl = packageJSONUrl; | ||
| 264 | - packageJSONUrl = new URL('../package.json', packageJSONUrl); | ||
| 265 | - | ||
| 266 | - // Terminates at root where ../package.json equals ../../package.json | ||
| 267 | - // (can't just check "/package.json" for Windows support). | ||
| 268 | - if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) break; | ||
| 269 | - } | ||
| 270 | - const packageJSONPath = fileURLToPath(packageJSONUrl); | ||
| 271 | - const packageConfig = { | ||
| 272 | - pjsonPath: packageJSONPath, | ||
| 273 | - exists: false, | ||
| 274 | - main: undefined, | ||
| 275 | - name: undefined, | ||
| 276 | - type: 'none', | ||
| 277 | - exports: undefined, | ||
| 278 | - imports: undefined, | ||
| 279 | - }; | ||
| 280 | - packageJSONCache.set(packageJSONPath, packageConfig); | ||
| 281 | - return packageConfig; | ||
| 282 | - } | ||
| 283 | - | ||
| 284 | 185 | /** | |
| 285 | 186 | * @param {string | URL} url | |
| 286 | 187 | * @returns {boolean} | |
@@ -634,7 +535,7 @@ function resolvePackageTarget(packageJSONUrl, target, subpath, packageSubpath, | |||
| 634 | 535 | ||
| 635 | 536 | /** | |
| 636 | 537 | * | |
| 637 | - * @param {Exports} exports | ||
| 538 | + * @param {import('internal/modules/esm/package_config.js').Exports} exports | ||
| 638 | 539 | * @param {URL} packageJSONUrl | |
| 639 | 540 | * @param {string | URL | undefined} base | |
| 640 | 541 | * @returns {boolean} | |
@@ -838,7 +739,7 @@ function packageImportsResolve(name, base, conditions) { | |||
| 838 | 739 | ||
| 839 | 740 | /** | |
| 840 | 741 | * @param {URL} url | |
| 841 | - * @returns {PackageType} | ||
| 742 | + * @returns {import('internal/modules/esm/package_config.js').PackageType} | ||
| 842 | 743 | */ | |
| 843 | 744 | function getPackageType(url) { | |
| 844 | 745 | const packageConfig = getPackageScopeConfig(url); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -84,6 +84,7 @@ const expectedModules = new Set([ | |||
| 84 | 84 | 'NativeModule internal/modules/esm/loader', | |
| 85 | 85 | 'NativeModule internal/modules/esm/module_job', | |
| 86 | 86 | 'NativeModule internal/modules/esm/module_map', | |
| 87 | + 'NativeModule internal/modules/esm/package_config', | ||
| 87 | 88 | 'NativeModule internal/modules/esm/resolve', | |
| 88 | 89 | 'NativeModule internal/modules/esm/translators', | |
| 89 | 90 | 'NativeModule internal/modules/package_json_reader', | |
| Back | FazBrowse Home | New Git URL |
0 commit comments