napi-postinstall
Advanced tools
| declare function fallback<T = unknown>(packageJsonPath: string, checkVersion?: boolean): T; | ||
| export = fallback; |
| "use strict"; | ||
| const node_child_process_1 = require("node:child_process"); | ||
| const fs = require("node:fs"); | ||
| const os = require("node:os"); | ||
| const path = require("node:path"); | ||
| const constants_js_1 = require("./constants.js"); | ||
| const helpers_js_1 = require("./helpers.js"); | ||
| const EXECUTORS = { | ||
| npm: 'npx', | ||
| pnpm: 'pnpm', | ||
| yarn: 'yarn', | ||
| bun: 'bun', | ||
| deno: (args) => ['deno', 'run', `npm:${args[0]}`, ...args.slice(1)], | ||
| }; | ||
| function constructCommand(value, args) { | ||
| const list = typeof value === 'function' | ||
| ? value(args) | ||
| : | ||
| [].concat(value, args); | ||
| return { | ||
| command: list[0], | ||
| args: list.slice(1), | ||
| }; | ||
| } | ||
| function fallback(packageJsonPath, checkVersion) { | ||
| const packageJson = require(packageJsonPath); | ||
| const { name, version: pkgVersion, optionalDependencies } = packageJson; | ||
| const { napi, version = pkgVersion } = (0, helpers_js_1.getNapiInfoFromPackageJson)(packageJson, checkVersion); | ||
| if (checkVersion && pkgVersion !== version) { | ||
| throw new Error((0, helpers_js_1.errorMessage)(`Inconsistent package versions found for \`${name}\` v${pkgVersion} vs \`${napi.packageName}\` v${version}.`)); | ||
| } | ||
| if (process.versions.webcontainer) { | ||
| const bindingPkgName = `${napi.packageName}-${constants_js_1.WASM32_WASI}`; | ||
| if (!optionalDependencies?.[bindingPkgName]) { | ||
| throw new Error((0, helpers_js_1.errorMessage)(`\`${constants_js_1.WASM32_WASI}\` target is unavailable for \`${name}\` v${version}`)); | ||
| } | ||
| const baseDir = path.resolve(os.tmpdir(), `${name}-${version}`); | ||
| const bindingEntry = path.resolve(baseDir, `node_modules/${bindingPkgName}/${napi.binaryName}.wasi.cjs`); | ||
| if (!fs.existsSync(bindingEntry)) { | ||
| fs.rmSync(baseDir, { recursive: true, force: true }); | ||
| fs.mkdirSync(baseDir, { recursive: true }); | ||
| const bindingPkg = `${bindingPkgName}@${version}`; | ||
| console.log((0, helpers_js_1.errorMessage)(`Downloading \`${bindingPkg}\` on WebContainer...`)); | ||
| (0, node_child_process_1.execFileSync)('pnpm', ['i', bindingPkg], { | ||
| cwd: baseDir, | ||
| stdio: 'inherit', | ||
| }); | ||
| } | ||
| return require(bindingEntry); | ||
| } | ||
| const userAgent = ((process.env.npm_config_user_agent || '').split('/')[0] || | ||
| 'npm'); | ||
| const executor = EXECUTORS[userAgent]; | ||
| if (!executor) { | ||
| throw new Error((0, helpers_js_1.errorMessage)(`Unsupported package manager: ${userAgent}. Supported managers are: ${Object.keys(EXECUTORS).join(', ')}.`)); | ||
| } | ||
| const { command, args } = constructCommand(executor, [ | ||
| 'napi-postinstall', | ||
| name, | ||
| version, | ||
| checkVersion ? '1' : '0', | ||
| ]); | ||
| const pkgDir = path.dirname(packageJsonPath); | ||
| (0, node_child_process_1.execFileSync)(command, args, { | ||
| cwd: pkgDir, | ||
| stdio: 'inherit', | ||
| }); | ||
| process.env[`SKIP_${name.replace(/-/g, '_').toUpperCase()}_FALLBACK`] = '1'; | ||
| const PKG_RESOLVED_PATH = require.resolve(pkgDir); | ||
| delete require.cache[PKG_RESOLVED_PATH]; | ||
| return require(pkgDir); | ||
| } | ||
| module.exports = fallback; | ||
| //# sourceMappingURL=fallback.js.map |
| {"version":3,"file":"fallback.js","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":";AAAA,2DAAiD;AACjD,8BAA6B;AAC7B,8BAA6B;AAC7B,kCAAiC;AAEjC,iDAA4C;AAC5C,6CAAuE;AAGvE,MAAM,SAAS,GAAG;IAChB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,CAAC,IAAc,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;CAC9E,CAAA;AAED,SAAS,gBAAgB,CACvB,KAAyD,EACzD,IAAc;IAEd,MAAM,IAAI,GACR,OAAO,KAAK,KAAK,UAAU;QACzB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACb,CAAC;YACE,EAAe,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAC1C,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAChB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;KACpB,CAAA;AACH,CAAC;AASD,SAAS,QAAQ,CACf,eAAuB,EACvB,YAAsB;IAEtB,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,CAAgB,CAAA;IAE3D,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,GAAG,WAAW,CAAA;IAEvE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,UAAU,EAAE,GAAG,IAAA,uCAA0B,EAC/D,WAAW,EACX,YAAY,CACb,CAAA;IAED,IAAI,YAAY,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,IAAA,yBAAY,EACV,6CAA6C,IAAI,OAAO,UAAU,SAAS,IAAI,CAAC,WAAW,OAAO,OAAO,GAAG,CAC7G,CACF,CAAA;IACH,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,cAAc,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,0BAAW,EAAE,CAAA;QAE3D,IAAI,CAAC,oBAAoB,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,IAAA,yBAAY,EACV,KAAK,0BAAW,kCAAkC,IAAI,OAAO,OAAO,EAAE,CACvE,CACF,CAAA;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,CAAA;QAE/D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAC/B,OAAO,EACP,gBAAgB,cAAc,IAAI,IAAI,CAAC,UAAU,WAAW,CAC7D,CAAA;QAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YACpD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAE1C,MAAM,UAAU,GAAG,GAAG,cAAc,IAAI,OAAO,EAAE,CAAA;YAEjD,OAAO,CAAC,GAAG,CACT,IAAA,yBAAY,EAAC,iBAAiB,UAAU,uBAAuB,CAAC,CACjE,CAAA;YAED,IAAA,iCAAY,EAAC,MAAM,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE;gBACtC,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,SAAS;aACjB,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,OAAO,CAAC,YAAY,CAAM,CAAA;IACnC,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxE,KAAK,CAA2B,CAAA;IAElC,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,CAAA;IAErC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,IAAA,yBAAY,EACV,gCAAgC,SAAS,6BAA6B,MAAM,CAAC,IAAI,CAC/E,SAAS,CACV,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAChB,CACF,CAAA;IACH,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,QAAQ,EAAE;QACnD,kBAAkB;QAClB,IAAI;QACJ,OAAO;QACP,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;KACzB,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAE5C,IAAA,iCAAY,EAAC,OAAO,EAAE,IAAI,EAAE;QAC1B,GAAG,EAAE,MAAM;QACX,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;IAGF,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,GAAG,CAAA;IAE3E,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAEjD,OAAO,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;IAEvC,OAAO,OAAO,CAAC,MAAM,CAAM,CAAA;AAC7B,CAAC;AAED,iBAAS,QAAQ,CAAA"} |
@@ -1,2 +0,2 @@ | ||
| import { PackageJson } from './types.js'; | ||
| import type { PackageJson } from './types.js'; | ||
| export declare const DEFAULT_NPM_REGISTRY = "https://registry.npmjs.org/"; | ||
@@ -3,0 +3,0 @@ export declare const meta: PackageJson; |
+1
-1
@@ -1,2 +0,2 @@ | ||
| import { NapiInfo, PackageJson } from './types.js'; | ||
| import type { NapiInfo, PackageJson } from './types.js'; | ||
| export declare function getGlobalNpmRegistry(): string; | ||
@@ -3,0 +3,0 @@ export declare function removeRecursive(dir: string): void; |
+1
-1
@@ -1,2 +0,2 @@ | ||
| import { Target } from './types.js'; | ||
| import type { Target } from './types.js'; | ||
| export declare function parseTriple(rawTriple: string): Target; |
+5
-1
| { | ||
| "name": "napi-postinstall", | ||
| "version": "0.2.5", | ||
| "version": "0.3.0", | ||
| "type": "commonjs", | ||
@@ -21,2 +21,6 @@ "description": "The `postinstall` script helper for handling native bindings in legacy `npm` versions", | ||
| }, | ||
| "./fallback": { | ||
| "types": "./lib/fallback.d.ts", | ||
| "default": "./lib/fallback.js" | ||
| }, | ||
| "./package.json": "./package.json" | ||
@@ -23,0 +27,0 @@ }, |
+17
-2
@@ -79,2 +79,3 @@ # napi-postinstall | ||
| ```ts | ||
| // napi-postinstall | ||
| export interface PackageJson { | ||
@@ -89,2 +90,9 @@ name: string | ||
| ): Promise<void> | ||
| // napi-postinstall/fallback | ||
| declare function fallback<T = unknown>( | ||
| packageJsonPath: string, | ||
| checkVersion?: boolean, | ||
| ): T | ||
| export = fallback | ||
| ``` | ||
@@ -95,7 +103,14 @@ | ||
| ```js | ||
| import { checkAndPreparePackage, isNpm } from 'napi-postinstall' | ||
| // index.js | ||
| const { checkAndPreparePackage, isNpm } = require('napi-postinstall') | ||
| if (isNpm()) { | ||
| checkAndPreparePackage('unrs-resolver' /* <napi-package-name> */) | ||
| void checkAndPreparePackage('unrs-resolver' /* <napi-package-name> */) | ||
| } | ||
| // fallback.js | ||
| module.exports = require('napi-postinstall/fallback')( | ||
| require.resolve('../package.json') /* <napi-package-json-path> */, | ||
| true /* <check-version> */, | ||
| ) | ||
| ``` | ||
@@ -102,0 +117,0 @@ |
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
56455
13.85%24
14.29%690
12.2%148
11.28%12
71.43%