isolate-package 1.9.0-2 → 1.9.0
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 +23 -24
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +21 -17
- package/dist/index.mjs.map +1 -1
- package/dist/isolate-bin.mjs +21 -17
- package/dist/isolate-bin.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
<!-- TOC -->
|
|
4
4
|
|
|
5
5
|
- [TLDR](#tldr)
|
|
6
|
-
- [Introduction](#introduction)
|
|
7
6
|
- [Features](#features)
|
|
8
7
|
- [Motivation](#motivation)
|
|
9
8
|
- [Installation](#installation)
|
|
@@ -40,26 +39,25 @@
|
|
|
40
39
|
Run `npx isolate-package isolate` from the monorepo package you would like to
|
|
41
40
|
isolate.
|
|
42
41
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
Isolate a monorepo workspace package to form a self-contained deployable package
|
|
46
|
-
that includes internal dependencies and a compatible lockfile. The internal
|
|
47
|
-
packages structure is preserved. Code is not bundled.
|
|
42
|
+
If you would like to see an example of a modern monorepo with this tool
|
|
43
|
+
integrated, check out [mono-ts](https://github.com/0x80/mono-ts)
|
|
48
44
|
|
|
49
45
|
## Features
|
|
50
46
|
|
|
51
|
-
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
-
|
|
56
|
-
|
|
57
|
-
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
- Optionally
|
|
47
|
+
- Isolate a monorepo workspace package to form a self-contained package that
|
|
48
|
+
includes internal dependencies and an adapted lockfile for deterministic
|
|
49
|
+
deployments.
|
|
50
|
+
- Preserve packages file structure, without code bundling
|
|
51
|
+
- Should work with any package manager, and tested with NPM, PNPM, and Yarn
|
|
52
|
+
(both classic and modern)
|
|
53
|
+
- Zero-config for the vast majority of use-cases
|
|
54
|
+
- Isolates dependencies recursively. If package A depends on internal package B
|
|
55
|
+
which depends on internal package C, all of them will be included
|
|
56
|
+
- Optionally force output to use NPM with matching versions
|
|
57
|
+
- Optionally include devDependencies in the isolated output
|
|
58
|
+
- Optionally pick or omit scripts from the manifest
|
|
59
|
+
- Compatible with the Firebase tools CLI, including 1st and 2nd generation
|
|
60
|
+
Firebase Functions
|
|
63
61
|
|
|
64
62
|
## Motivation
|
|
65
63
|
|
|
@@ -85,7 +83,8 @@ Run `pnpm install isolate-package --dev` or the equivalent for `npm` or `yarn`.
|
|
|
85
83
|
|
|
86
84
|
I recommend using `pnpm` for
|
|
87
85
|
[a number of reasons](https://pnpm.io/feature-comparison). In my experience it
|
|
88
|
-
is the best package manager, especially for monorepo setups
|
|
86
|
+
is the best package manager, especially for monorepo setups, but any other
|
|
87
|
+
package manager should work.
|
|
89
88
|
|
|
90
89
|
## Usage
|
|
91
90
|
|
|
@@ -219,7 +218,7 @@ Because the configuration loader depends on this setting, its output is not
|
|
|
219
218
|
affected by this setting. If you want to debug the configuration set
|
|
220
219
|
`DEBUG_ISOLATE_CONFIG=true` before you run `isolate`
|
|
221
220
|
|
|
222
|
-
###
|
|
221
|
+
### forceNpm
|
|
223
222
|
|
|
224
223
|
Type: `boolean`, default: `false`
|
|
225
224
|
|
|
@@ -232,11 +231,11 @@ Also, it should not really matter what package manager is used in de deployment
|
|
|
232
231
|
as long as the versions match your original lockfile.
|
|
233
232
|
|
|
234
233
|
By setting this option to `true` you are forcing the isolate output to use NPM.
|
|
235
|
-
A package-lock file will be generated based on the
|
|
234
|
+
A package-lock file will be generated based on the contents of node_modules and
|
|
236
235
|
therefore should match the versions in your original lockfile.
|
|
237
236
|
|
|
238
|
-
This way you can enjoy using PNPM for your monorepo, while your
|
|
239
|
-
NPM locked to the same versions.
|
|
237
|
+
This way you can enjoy using PNPM or Yarn for your monorepo, while your
|
|
238
|
+
deployment uses NPM with modules locked to the same versions.
|
|
240
239
|
|
|
241
240
|
### buildDirName
|
|
242
241
|
|
|
@@ -464,7 +463,7 @@ isolated output is to instruct package manager to install their dependencies.
|
|
|
464
463
|
|
|
465
464
|
### A Quick Start
|
|
466
465
|
|
|
467
|
-
If you are not confident that your monorepo setup is solid,
|
|
466
|
+
If you are not confident that your monorepo setup is solid, you can check out my
|
|
468
467
|
in-dept example at [mono-ts](https://github.com/0x80/mono-ts) where many
|
|
469
468
|
different aspects are discussed and `isolate-package` is used to demonstrate
|
|
470
469
|
Firebase deployments.
|
package/dist/index.d.ts
CHANGED
package/dist/index.mjs
CHANGED
|
@@ -95,7 +95,7 @@ function getIsolateRelativePath(path17, isolatePath) {
|
|
|
95
95
|
// src/lib/utils/inspect-value.ts
|
|
96
96
|
import { inspect } from "node:util";
|
|
97
97
|
function inspectValue(value) {
|
|
98
|
-
return inspect(value, false,
|
|
98
|
+
return inspect(value, false, 16, true);
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
// src/lib/utils/json.ts
|
|
@@ -137,7 +137,7 @@ async function pack(srcDir, dstDir, usePnpmPack = false) {
|
|
|
137
137
|
process.chdir(srcDir);
|
|
138
138
|
const stdout = usePnpmPack ? await new Promise((resolve, reject) => {
|
|
139
139
|
exec(
|
|
140
|
-
`pnpm pack --pack-destination ${dstDir}`,
|
|
140
|
+
`pnpm pack --pack-destination "${dstDir}"`,
|
|
141
141
|
execOptions,
|
|
142
142
|
(err, stdout2, stderr) => {
|
|
143
143
|
if (err) {
|
|
@@ -149,7 +149,7 @@ async function pack(srcDir, dstDir, usePnpmPack = false) {
|
|
|
149
149
|
);
|
|
150
150
|
}) : await new Promise((resolve, reject) => {
|
|
151
151
|
exec(
|
|
152
|
-
`npm pack --pack-destination ${dstDir}`,
|
|
152
|
+
`npm pack --pack-destination "${dstDir}"`,
|
|
153
153
|
execOptions,
|
|
154
154
|
(err, stdout2) => {
|
|
155
155
|
if (err) {
|
|
@@ -207,7 +207,7 @@ var configDefaults = {
|
|
|
207
207
|
tsconfigPath: "./tsconfig.json",
|
|
208
208
|
workspacePackages: void 0,
|
|
209
209
|
workspaceRoot: "../..",
|
|
210
|
-
|
|
210
|
+
forceNpm: false,
|
|
211
211
|
pickFromScripts: void 0,
|
|
212
212
|
omitFromScripts: void 0
|
|
213
213
|
};
|
|
@@ -368,7 +368,7 @@ async function generateNpmLockfile({
|
|
|
368
368
|
await fs8.writeFile(lockfilePath, String(meta));
|
|
369
369
|
log.debug("Created lockfile at", lockfilePath);
|
|
370
370
|
} catch (err) {
|
|
371
|
-
|
|
371
|
+
console.error(inspectValue(err));
|
|
372
372
|
log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);
|
|
373
373
|
} finally {
|
|
374
374
|
if (hasMovedNodeModules) {
|
|
@@ -504,9 +504,9 @@ async function processLockfile({
|
|
|
504
504
|
targetPackageDir
|
|
505
505
|
}) {
|
|
506
506
|
const log = useLogger();
|
|
507
|
-
const {
|
|
508
|
-
if (
|
|
509
|
-
log.info("
|
|
507
|
+
const { forceNpm } = useConfig();
|
|
508
|
+
if (forceNpm) {
|
|
509
|
+
log.info("Forcing to use NPM for isolate output");
|
|
510
510
|
await generateNpmLockfile({
|
|
511
511
|
workspaceRootDir,
|
|
512
512
|
isolateDir
|
|
@@ -553,7 +553,12 @@ async function processLockfile({
|
|
|
553
553
|
break;
|
|
554
554
|
}
|
|
555
555
|
default:
|
|
556
|
-
log.warn(`Unexpected package manager ${name}`);
|
|
556
|
+
log.warn(`Unexpected package manager ${name}. Using NPM for output`);
|
|
557
|
+
await generateNpmLockfile({
|
|
558
|
+
workspaceRootDir,
|
|
559
|
+
isolateDir
|
|
560
|
+
});
|
|
561
|
+
usedFallbackToNpm = true;
|
|
557
562
|
}
|
|
558
563
|
return usedFallbackToNpm;
|
|
559
564
|
}
|
|
@@ -623,12 +628,12 @@ function adaptManifestInternalDeps({
|
|
|
623
628
|
// src/lib/manifest/helpers/adapt-internal-package-manifests.ts
|
|
624
629
|
async function adaptInternalPackageManifests(internalPackageNames, packagesRegistry, isolateDir) {
|
|
625
630
|
const packageManager2 = usePackageManager();
|
|
626
|
-
const { includeDevDependencies } = useConfig();
|
|
631
|
+
const { includeDevDependencies, forceNpm } = useConfig();
|
|
627
632
|
await Promise.all(
|
|
628
633
|
internalPackageNames.map(async (packageName) => {
|
|
629
634
|
const { manifest, rootRelativeDir } = packagesRegistry[packageName];
|
|
630
|
-
const inputManifest = includeDevDependencies ? omit(["
|
|
631
|
-
const outputManifest = packageManager2.name === "pnpm" ? (
|
|
635
|
+
const inputManifest = includeDevDependencies ? omit(["peerDependencies"], manifest) : omit(["devDependencies", "peerDependencies"], manifest);
|
|
636
|
+
const outputManifest = packageManager2.name === "pnpm" && !forceNpm ? (
|
|
632
637
|
/**
|
|
633
638
|
* For PNPM the output itself is a workspace so we can preserve the specifiers
|
|
634
639
|
* with "workspace:*" in the output manifest.
|
|
@@ -650,9 +655,9 @@ async function adaptInternalPackageManifests(internalPackageNames, packagesRegis
|
|
|
650
655
|
// src/lib/manifest/adapt-target-package-manifest.ts
|
|
651
656
|
async function adaptTargetPackageManifest(manifest, packagesRegistry, isolateDir) {
|
|
652
657
|
const packageManager2 = usePackageManager();
|
|
653
|
-
const { includeDevDependencies,
|
|
658
|
+
const { includeDevDependencies, forceNpm, pickFromScripts, omitFromScripts } = useConfig();
|
|
654
659
|
const inputManifest = includeDevDependencies ? manifest : omit2(["devDependencies"], manifest);
|
|
655
|
-
const adaptedManifest = packageManager2.name === "pnpm" && !
|
|
660
|
+
const adaptedManifest = packageManager2.name === "pnpm" && !forceNpm ? (
|
|
656
661
|
/**
|
|
657
662
|
* For PNPM the output itself is a workspace so we can preserve the specifiers
|
|
658
663
|
* with "workspace:*" in the output manifest.
|
|
@@ -722,12 +727,11 @@ async function packDependencies({
|
|
|
722
727
|
*/
|
|
723
728
|
packDestinationDir
|
|
724
729
|
}) {
|
|
725
|
-
const config = useConfig();
|
|
726
730
|
const log = useLogger();
|
|
727
731
|
const packedFileByName = {};
|
|
728
732
|
const { name, version } = usePackageManager();
|
|
729
733
|
const versionMajor = parseInt(version.split(".")[0], 10);
|
|
730
|
-
const usePnpmPack =
|
|
734
|
+
const usePnpmPack = name === "pnpm" && versionMajor >= 8;
|
|
731
735
|
if (usePnpmPack) {
|
|
732
736
|
log.debug("Using PNPM pack instead of NPM pack");
|
|
733
737
|
}
|
|
@@ -1005,7 +1009,7 @@ async function isolate(options = {}) {
|
|
|
1005
1009
|
const outputManifest = omit3(["packageManager"], inputManifest);
|
|
1006
1010
|
await writeManifest(isolateDir, outputManifest);
|
|
1007
1011
|
}
|
|
1008
|
-
if (packageManager2.name === "pnpm" && !config.
|
|
1012
|
+
if (packageManager2.name === "pnpm" && !config.forceNpm) {
|
|
1009
1013
|
fs15.copyFileSync(
|
|
1010
1014
|
path16.join(workspaceRootDir, "pnpm-workspace.yaml"),
|
|
1011
1015
|
path16.join(isolateDir, "pnpm-workspace.yaml")
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/isolate.ts","../src/lib/config.ts","../src/lib/logger.ts","../src/lib/utils/get-dirname.ts","../src/lib/utils/get-error-message.ts","../src/lib/utils/get-relative-path.ts","../src/lib/utils/inspect-value.ts","../src/lib/utils/json.ts","../src/lib/utils/pack.ts","../src/lib/utils/unpack.ts","../src/lib/utils/yaml.ts","../src/lib/lockfile/process-lockfile.ts","../src/lib/package-manager/helpers/infer-from-files.ts","../src/lib/package-manager/names.ts","../src/lib/package-manager/helpers/infer-from-manifest.ts","../src/lib/package-manager/index.ts","../src/lib/lockfile/helpers/generate-npm-lockfile.ts","../src/lib/lockfile/helpers/generate-pnpm-lockfile.ts","../src/lib/lockfile/helpers/generate-yarn-lockfile.ts","../src/lib/manifest/adapt-target-package-manifest.ts","../src/lib/manifest/helpers/adapt-internal-package-manifests.ts","../src/lib/manifest/io.ts","../src/lib/manifest/helpers/patch-internal-entries.ts","../src/lib/manifest/helpers/adapt-manifest-internal-deps.ts","../src/lib/output/get-build-output-dir.ts","../src/lib/output/pack-dependencies.ts","../src/lib/output/process-build-output-files.ts","../src/lib/output/unpack-dependencies.ts","../src/lib/registry/create-packages-registry.ts","../src/lib/registry/helpers/find-packages-globs.ts","../src/lib/registry/list-internal-packages.ts"],"sourcesContent":["import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { omit } from \"ramda\";\nimport type { IsolateConfig } from \"./lib/config\";\nimport { resolveConfig, setUserConfig } from \"./lib/config\";\nimport { processLockfile } from \"./lib/lockfile\";\nimport type { Logger } from \"./lib/logger\";\nimport { setLogLevel, setLogger, useLogger } from \"./lib/logger\";\nimport {\n adaptInternalPackageManifests,\n adaptTargetPackageManifest,\n readManifest,\n writeManifest,\n} from \"./lib/manifest\";\nimport {\n getBuildOutputDir,\n packDependencies,\n processBuildOutputFiles,\n unpackDependencies,\n} from \"./lib/output\";\nimport { detectPackageManager } from \"./lib/package-manager\";\nimport { createPackagesRegistry, listInternalPackages } from \"./lib/registry\";\nimport type { PackageManifest } from \"./lib/types\";\nimport { getDirname, getRootRelativePath, readTypedJson } from \"./lib/utils\";\n\nconst __dirname = getDirname(import.meta.url);\n\nexport async function isolate(\n options: { config?: IsolateConfig; logger?: Logger } = {}\n) {\n if (options.logger) {\n setLogger(options.logger);\n }\n\n if (options.config) {\n setUserConfig(options.config);\n }\n\n const config = resolveConfig();\n\n setLogLevel(config.logLevel);\n\n const log = useLogger();\n\n const thisPackageManifest = await readTypedJson<PackageManifest>(\n path.join(path.join(__dirname, \"..\", \"package.json\"))\n );\n\n log.debug(\"Using isolate-package version\", thisPackageManifest.version);\n\n /**\n * If a targetPackagePath is set, we assume the configuration lives in the\n * root of the workspace. If targetPackagePath is undefined (the default), we\n * assume that the configuration lives in the target package directory.\n */\n const targetPackageDir = config.targetPackagePath\n ? path.join(process.cwd(), config.targetPackagePath)\n : process.cwd();\n\n /**\n * We want a trailing slash here. Functionally it doesn't matter, but it makes\n * the relative paths more correct in the debug output.\n */\n const workspaceRootDir = config.targetPackagePath\n ? process.cwd()\n : path.join(targetPackageDir, config.workspaceRoot);\n\n const buildOutputDir = await getBuildOutputDir(targetPackageDir);\n\n assert(\n fs.existsSync(buildOutputDir),\n `Failed to find build output path at ${buildOutputDir}. Please make sure you build the source before isolating it.`\n );\n\n log.debug(\"Workspace root resolved to\", workspaceRootDir);\n log.debug(\n \"Isolate target package\",\n getRootRelativePath(targetPackageDir, workspaceRootDir)\n );\n\n const isolateDir = path.join(targetPackageDir, config.isolateDirName);\n\n log.debug(\n \"Isolate output directory\",\n getRootRelativePath(isolateDir, workspaceRootDir)\n );\n\n if (fs.existsSync(isolateDir)) {\n await fs.remove(isolateDir);\n log.debug(\"Cleaned the existing isolate output directory\");\n }\n\n await fs.ensureDir(isolateDir);\n\n const tmpDir = path.join(isolateDir, \"__tmp\");\n await fs.ensureDir(tmpDir);\n\n const targetPackageManifest = await readTypedJson<PackageManifest>(\n path.join(targetPackageDir, \"package.json\")\n );\n\n const packageManager = detectPackageManager(workspaceRootDir);\n\n log.debug(\n \"Detected package manager\",\n packageManager.name,\n packageManager.version\n );\n\n /**\n * Build a packages registry so we can find the workspace packages by name and\n * have access to their manifest files and relative paths.\n */\n const packagesRegistry = await createPackagesRegistry(\n workspaceRootDir,\n config.workspacePackages\n );\n\n const internalPackageNames = listInternalPackages(\n targetPackageManifest,\n packagesRegistry,\n {\n includeDevDependencies: config.includeDevDependencies,\n }\n );\n\n const packedFilesByName = await packDependencies({\n internalPackageNames,\n packagesRegistry,\n packDestinationDir: tmpDir,\n });\n\n await unpackDependencies(\n packedFilesByName,\n packagesRegistry,\n tmpDir,\n isolateDir\n );\n\n /** Adapt the manifest files for all the unpacked local dependencies */\n await adaptInternalPackageManifests(\n internalPackageNames,\n packagesRegistry,\n isolateDir\n );\n\n /** Pack the target package directory, and unpack it in the isolate location */\n await processBuildOutputFiles({\n targetPackageDir,\n tmpDir,\n isolateDir,\n });\n\n /**\n * Copy the target manifest file to the isolate location and adapt its\n * workspace dependencies to point to the isolated packages.\n */\n await adaptTargetPackageManifest(\n targetPackageManifest,\n packagesRegistry,\n isolateDir\n );\n\n /** Generate an isolated lockfile based on the original one */\n const usedFallbackToNpm = await processLockfile({\n workspaceRootDir,\n isolateDir,\n packagesRegistry,\n internalDepPackageNames: internalPackageNames,\n targetPackageDir,\n targetPackageName: targetPackageManifest.name,\n });\n\n if (usedFallbackToNpm) {\n const inputManifest = await readManifest(isolateDir);\n\n const outputManifest = omit([\"packageManager\"], inputManifest);\n\n await writeManifest(isolateDir, outputManifest);\n }\n\n if (packageManager.name === \"pnpm\" && !config.useNpm) {\n /**\n * PNPM doesn't install dependencies of packages that are linked via link:\n * or file: specifiers. It requires the directory to be configured as a\n * workspace, so we copy the workspace config file to the isolate output.\n */\n fs.copyFileSync(\n path.join(workspaceRootDir, \"pnpm-workspace.yaml\"),\n path.join(isolateDir, \"pnpm-workspace.yaml\")\n );\n }\n /**\n * If there is an .npmrc file in the workspace root, copy it to the isolate\n * because the settings there could affect how the lockfile is resolved. Note\n * that .npmrc is used by both NPM and PNPM for configuration.\n *\n * See also: https://pnpm.io/npmrc\n */\n const npmrcPath = path.join(workspaceRootDir, \".npmrc\");\n\n if (fs.existsSync(npmrcPath)) {\n fs.copyFileSync(npmrcPath, path.join(isolateDir, \".npmrc\"));\n log.debug(\"Copied .npmrc file to the isolate output\");\n }\n\n /**\n * Clean up. Only so this in the happy path, so we can look at the temp folder\n * when thing go wrong.\n */\n log.debug(\n \"Deleting temp directory\",\n getRootRelativePath(tmpDir, workspaceRootDir)\n );\n await fs.remove(tmpDir);\n\n log.info(\"Isolate completed at\", isolateDir);\n\n return isolateDir;\n}\n","import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { isEmpty } from \"ramda\";\nimport { setLogLevel, useLogger } from \"./logger\";\nimport { inspectValue, readTypedJsonSync } from \"./utils\";\n\nexport type IsolateConfigResolved = {\n buildDirName?: string;\n includeDevDependencies: boolean;\n isolateDirName: string;\n logLevel: \"info\" | \"debug\" | \"warn\" | \"error\";\n targetPackagePath?: string;\n tsconfigPath: string;\n workspacePackages?: string[];\n workspaceRoot: string;\n useNpm: boolean;\n pickFromScripts?: string[];\n omitFromScripts?: string[];\n};\n\nexport type IsolateConfig = Partial<IsolateConfigResolved>;\n\nconst configDefaults: IsolateConfigResolved = {\n buildDirName: undefined,\n includeDevDependencies: false,\n isolateDirName: \"isolate\",\n logLevel: \"info\",\n targetPackagePath: undefined,\n tsconfigPath: \"./tsconfig.json\",\n workspacePackages: undefined,\n workspaceRoot: \"../..\",\n useNpm: false,\n pickFromScripts: undefined,\n omitFromScripts: undefined,\n};\n\n/**\n * Only initialize the configuration once, and keeping it here for subsequent\n * calls to getConfig.\n */\nlet _resolvedConfig: IsolateConfigResolved | undefined;\n\nlet _user_defined_config: IsolateConfig | undefined;\n\nconst validConfigKeys = Object.keys(configDefaults);\n\nconst CONFIG_FILE_NAME = \"isolate.config.json\";\n\nexport type LogLevel = IsolateConfigResolved[\"logLevel\"];\n\nexport function setUserConfig(config: IsolateConfig) {\n _user_defined_config = config;\n\n if (config.logLevel) {\n setLogLevel(config.logLevel);\n }\n}\n\nexport function useConfig() {\n if (_resolvedConfig) {\n return _resolvedConfig;\n } else {\n throw new Error(\"Called useConfig before config was made available\");\n }\n}\n\n/**\n * Resolve configuration based on user config and defaults. If setConfig was\n * called before this, it does not attempt to read a config file from disk.\n */\nexport function resolveConfig(): IsolateConfigResolved {\n if (_resolvedConfig) {\n return _resolvedConfig;\n }\n\n setLogLevel(process.env.DEBUG_ISOLATE_CONFIG ? \"debug\" : \"info\");\n\n const log = useLogger();\n\n const configFilePath = path.join(process.cwd(), CONFIG_FILE_NAME);\n\n if (_user_defined_config) {\n log.debug(`Using user defined config:`, inspectValue(_user_defined_config));\n } else {\n log.debug(`Attempting to load config from ${configFilePath}`);\n\n _user_defined_config = fs.existsSync(configFilePath)\n ? readTypedJsonSync<IsolateConfig>(configFilePath)\n : {};\n }\n\n const foreignKeys = Object.keys(_user_defined_config).filter(\n (key) => !validConfigKeys.includes(key)\n );\n\n if (!isEmpty(foreignKeys)) {\n log.warn(`Found invalid config settings:`, foreignKeys.join(\", \"));\n }\n\n const config = Object.assign(\n {},\n configDefaults,\n _user_defined_config\n ) satisfies IsolateConfigResolved;\n\n log.debug(\"Using configuration:\", inspectValue(config));\n\n _resolvedConfig = config;\n return config;\n}\n\n/**\n * Get only the configuration that the user set explicitly in the config file or\n * passed via arguments to isolate().\n */\nexport function getUserDefinedConfig(): IsolateConfig {\n assert(\n _user_defined_config,\n \"Called getUserDefinedConfig before user config was made available\"\n );\n\n return _user_defined_config;\n}\n","import chalk from \"chalk\";\nimport type { IsolateConfigResolved, LogLevel } from \"./config\";\n/**\n * The Logger defines an interface that can be used to pass in a different\n * logger object in order to intercept all the logging output. We keep the\n * handlers separate from the logger object itself, so that we can change the\n * handlers but do not bother the user with having to handle logLevel.\n */\nexport type Logger = {\n debug(...args: unknown[]): void;\n info(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n};\n\nlet _loggerHandlers: Logger = {\n debug(...args: unknown[]) {\n console.log(chalk.blue(\"debug\"), ...args);\n },\n info(...args: unknown[]) {\n console.log(chalk.green(\"info\"), ...args);\n },\n warn(...args: unknown[]) {\n console.log(chalk.yellow(\"warning\"), ...args);\n },\n error(...args: unknown[]) {\n console.log(chalk.red(\"error\"), ...args);\n },\n};\n\nconst _logger: Logger = {\n debug(...args: unknown[]) {\n if (_logLevel === \"debug\") {\n _loggerHandlers.debug(...args);\n }\n },\n info(...args: unknown[]) {\n if (_logLevel === \"debug\" || _logLevel === \"info\") {\n _loggerHandlers.info(...args);\n }\n },\n warn(...args: unknown[]) {\n if (_logLevel === \"debug\" || _logLevel === \"info\" || _logLevel === \"warn\") {\n _loggerHandlers.warn(...args);\n }\n },\n error(...args: unknown[]) {\n _loggerHandlers.error(...args);\n },\n};\n\nlet _logLevel: LogLevel = \"info\";\n\nexport function setLogger(logger: Logger) {\n _loggerHandlers = logger;\n return _logger;\n}\n\nexport function setLogLevel(\n logLevel: IsolateConfigResolved[\"logLevel\"]\n): Logger {\n _logLevel = logLevel;\n return _logger;\n}\n\nexport function useLogger() {\n return _logger;\n}\n","import { fileURLToPath } from \"url\";\n\n/**\n * Calling context should pass in import.meta.url and the function will return\n * the equivalent of __dirname in Node/CommonJs.\n */\nexport function getDirname(importMetaUrl: string) {\n return fileURLToPath(new URL(\".\", importMetaUrl));\n}\n","type ErrorWithMessage = {\n message: string;\n};\n\nexport function getErrorMessage(error: unknown) {\n return toErrorWithMessage(error).message;\n}\n\nfunction isErrorWithMessage(error: unknown): error is ErrorWithMessage {\n return typeof error === \"object\" && error !== null && \"message\" in error;\n}\n\nfunction toErrorWithMessage(maybeError: unknown): ErrorWithMessage {\n if (isErrorWithMessage(maybeError)) return maybeError;\n\n try {\n return new Error(JSON.stringify(maybeError));\n } catch {\n /**\n * Fallback in case there’s an error stringifying the maybeError like with\n * circular references.\n */\n return new Error(String(maybeError));\n }\n}\n","export function getRootRelativePath(path: string, rootPath: string) {\n const strippedPath = path.replace(rootPath, \"\");\n\n return strippedPath.startsWith(\"/\")\n ? `(root)${strippedPath}`\n : `(root)/${strippedPath}`;\n}\n\nexport function getIsolateRelativePath(path: string, isolatePath: string) {\n const strippedPath = path.replace(isolatePath, \"\");\n\n return strippedPath.startsWith(\"/\")\n ? `(isolate)${strippedPath}`\n : `(isolate)/${strippedPath}`;\n}\n","import { inspect } from \"node:util\";\nimport type { JsonValue } from \"type-fest\";\n\nexport function inspectValue(value: JsonValue) {\n return inspect(value, false, 4, true);\n}\n","import fs from \"fs-extra\";\nimport stripJsonComments from \"strip-json-comments\";\nimport { getErrorMessage } from \"./get-error-message\";\n\n/** @todo Pass in zod schema and validate */\nexport function readTypedJsonSync<T>(filePath: string) {\n try {\n const rawContent = fs.readFileSync(filePath, \"utf-8\");\n const data = JSON.parse(stripJsonComments(rawContent)) as T;\n return data;\n } catch (err) {\n throw new Error(\n `Failed to read JSON from ${filePath}: ${getErrorMessage(err)}`\n );\n }\n}\n\nexport async function readTypedJson<T>(filePath: string) {\n try {\n const rawContent = await fs.readFile(filePath, \"utf-8\");\n const data = JSON.parse(rawContent) as T;\n return data;\n } catch (err) {\n throw new Error(\n `Failed to read JSON from ${filePath}: ${getErrorMessage(err)}`\n );\n }\n}\n","import fs from \"fs-extra\";\nimport { exec } from \"node:child_process\";\nimport path from \"node:path\";\nimport { useLogger } from \"../logger\";\n\nexport async function pack(\n srcDir: string,\n dstDir: string,\n usePnpmPack = false\n) {\n const execOptions = {\n maxBuffer: 10 * 1024 * 1024,\n };\n\n const log = useLogger();\n\n const previousCwd = process.cwd();\n process.chdir(srcDir);\n\n /**\n * PNPM pack seems to be a lot faster than NPM pack, so when PNPM is detected\n * we use that instead.\n */\n const stdout = usePnpmPack\n ? await new Promise<string>((resolve, reject) => {\n exec(\n `pnpm pack --pack-destination ${dstDir}`,\n execOptions,\n (err, stdout, stderr) => {\n if (err) {\n log.error(stderr);\n return reject(err);\n }\n\n resolve(stdout);\n }\n );\n })\n : await new Promise<string>((resolve, reject) => {\n exec(\n `npm pack --pack-destination ${dstDir}`,\n execOptions,\n (err, stdout) => {\n if (err) {\n return reject(err);\n }\n\n resolve(stdout);\n }\n );\n });\n\n const fileName = path.basename(stdout.trim());\n\n const filePath = path.join(dstDir, fileName);\n\n if (!fs.existsSync(filePath)) {\n log.error(\n `The response from pack could not be resolved to an existing file: ${filePath}`\n );\n } else {\n log.debug(`Packed (temp)/${fileName}`);\n }\n\n process.chdir(previousCwd);\n\n /**\n * Return the path anyway even if it doesn't validate. A later stage will wait\n * for the file to occur still. Not sure if this makes sense. Maybe we should\n * stop at the validation error...\n */\n return filePath;\n}\n","import fs from \"fs-extra\";\nimport tar from \"tar-fs\";\nimport { createGunzip } from \"zlib\";\n\nexport async function unpack(filePath: string, unpackDir: string) {\n await new Promise<void>((resolve, reject) => {\n fs.createReadStream(filePath)\n .pipe(createGunzip())\n .pipe(tar.extract(unpackDir))\n .on(\"finish\", () => resolve())\n .on(\"error\", (err) => reject(err));\n });\n}\n","import fs from \"fs-extra\";\nimport yaml from \"yaml\";\nimport { getErrorMessage } from \"./get-error-message\";\n\nexport function readTypedYamlSync<T>(filePath: string) {\n try {\n const rawContent = fs.readFileSync(filePath, \"utf-8\");\n const data = yaml.parse(rawContent);\n /** @todo Add some zod validation maybe */\n return data as T;\n } catch (err) {\n throw new Error(\n `Failed to read YAML from ${filePath}: ${getErrorMessage(err)}`\n );\n }\n}\n\nexport function writeTypedYamlSync<T>(filePath: string, content: T) {\n /** @todo Add some zod validation maybe */\n fs.writeFileSync(filePath, yaml.stringify(content), \"utf-8\");\n}\n","import type {\n ProjectSnapshot,\n ResolvedDependencies,\n} from \"@pnpm/lockfile-file\";\nimport { mapObjIndexed } from \"ramda\";\nimport { useConfig } from \"../config\";\nimport { useLogger } from \"../logger\";\nimport { usePackageManager } from \"../package-manager\";\nimport type { PackagesRegistry } from \"../types\";\nimport { generateNpmLockfile } from \"./helpers/generate-npm-lockfile\";\nimport { generatePnpmLockfile } from \"./helpers/generate-pnpm-lockfile\";\nimport { generateYarnLockfile } from \"./helpers/generate-yarn-lockfile\";\n\n/** Convert dependency links */\nexport function pnpmMapImporter(\n { dependencies, devDependencies, ...rest }: ProjectSnapshot,\n {\n includeDevDependencies,\n directoryByPackageName,\n }: {\n includeDevDependencies: boolean;\n directoryByPackageName: { [packageName: string]: string };\n }\n): ProjectSnapshot {\n return {\n dependencies: dependencies\n ? pnpmMapDependenciesLinks(dependencies, directoryByPackageName)\n : undefined,\n devDependencies:\n includeDevDependencies && devDependencies\n ? pnpmMapDependenciesLinks(devDependencies, directoryByPackageName)\n : undefined,\n ...rest,\n };\n}\n\nfunction pnpmMapDependenciesLinks(\n def: ResolvedDependencies,\n directoryByPackageName: { [packageName: string]: string }\n): ResolvedDependencies {\n return mapObjIndexed(\n (version, name) =>\n version.startsWith(\"link:\")\n ? `link:./${directoryByPackageName[name]}`\n : version,\n def\n );\n}\n\n/**\n * Adapt the lockfile and write it to the isolate directory. Because we keep the\n * structure of packages in the isolate directory the same as they were in the\n * monorepo, the lockfile is largely still correct. The only things that need to\n * be done is to remove the root dependencies and devDependencies, and rename\n * the path to the target package to act as the new root.\n */\nexport async function processLockfile({\n workspaceRootDir,\n packagesRegistry,\n isolateDir,\n internalDepPackageNames,\n targetPackageDir,\n}: {\n workspaceRootDir: string;\n packagesRegistry: PackagesRegistry;\n isolateDir: string;\n internalDepPackageNames: string[];\n targetPackageDir: string;\n targetPackageName: string;\n}) {\n const log = useLogger();\n\n const { useNpm } = useConfig();\n\n if (useNpm) {\n log.info(\"Using NPM for isolate output\");\n\n await generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n });\n\n return true;\n }\n\n const { name, version } = usePackageManager();\n let usedFallbackToNpm = false;\n\n switch (name) {\n case \"npm\": {\n await generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n });\n\n break;\n }\n case \"yarn\": {\n const versionMajor = parseInt(version.split(\".\")[0], 10);\n\n if (versionMajor === 1) {\n await generateYarnLockfile({\n workspaceRootDir,\n isolateDir,\n });\n } else {\n log.info(\n \"Detected modern version of Yarn. Using NPM lockfile fallback.\"\n );\n\n await generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n });\n\n usedFallbackToNpm = true;\n }\n\n break;\n }\n case \"pnpm\": {\n await generatePnpmLockfile({\n workspaceRootDir,\n targetPackageDir,\n isolateDir,\n internalDepPackageNames,\n packagesRegistry,\n });\n break;\n }\n default:\n log.warn(`Unexpected package manager ${name}`);\n }\n\n return usedFallbackToNpm;\n}\n","import fs from \"fs-extra\";\nimport { execSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport type { PackageManager, PackageManagerName } from \"../names\";\nimport { getLockfileFileName, supportedPackageManagerNames } from \"../names\";\n\nexport function inferFromFiles(workspaceRoot: string): PackageManager {\n for (const name of supportedPackageManagerNames) {\n const lockfileName = getLockfileFileName(name);\n\n if (fs.existsSync(path.join(workspaceRoot, lockfileName))) {\n return { name, version: getVersion(name) };\n }\n }\n\n /** If no lockfile was found, it could be that there is an npm shrinkwrap file. */\n if (fs.existsSync(path.join(workspaceRoot, \"npm-shrinkwrap.json\"))) {\n return { name: \"npm\", version: getVersion(\"npm\") };\n }\n\n throw new Error(`Failed to detect package manager`);\n}\nfunction getVersion(packageManagerName: PackageManagerName): string {\n const buffer = execSync(`${packageManagerName} --version`);\n return buffer.toString().trim();\n}\n","export const supportedPackageManagerNames = [\"pnpm\", \"yarn\", \"npm\"] as const;\n\nexport type PackageManagerName = (typeof supportedPackageManagerNames)[number];\n\nexport type PackageManager = {\n name: PackageManagerName;\n version: string;\n};\n\nexport function getLockfileFileName(name: PackageManagerName) {\n switch (name) {\n case \"pnpm\":\n return \"pnpm-lock.yaml\";\n case \"yarn\":\n return \"yarn.lock\";\n case \"npm\":\n return \"package-lock.json\";\n }\n}\n","import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { useLogger } from \"~/lib/logger\";\nimport type { PackageManifest } from \"../../types\";\nimport { readTypedJsonSync } from \"../../utils\";\nimport type { PackageManagerName } from \"../names\";\nimport { getLockfileFileName, supportedPackageManagerNames } from \"../names\";\n\nexport function inferFromManifest(workspaceRoot: string) {\n const log = useLogger();\n\n const rootManifest = readTypedJsonSync<PackageManifest>(\n path.join(workspaceRoot, \"package.json\")\n );\n\n if (!rootManifest.packageManager) {\n log.debug(\"No packageManager field found in root manifest\");\n return;\n }\n\n const [name, version = \"*\"] = rootManifest.packageManager.split(\"@\") as [\n PackageManagerName,\n string,\n ];\n\n assert(\n supportedPackageManagerNames.includes(name),\n `Package manager \"${name}\" is not currently supported`\n );\n\n const lockfileName = getLockfileFileName(name);\n\n assert(\n fs.existsSync(path.join(workspaceRoot, lockfileName)),\n `Manifest declares ${name} to be the packageManager, but failed to find ${lockfileName} in workspace root`\n );\n\n return { name, version };\n}\n","import { inferFromFiles } from \"./helpers/infer-from-files\";\nimport { inferFromManifest } from \"./helpers/infer-from-manifest\";\nimport type { PackageManager } from \"./names\";\n\nexport * from \"./names\";\n\nexport let packageManager: PackageManager | undefined;\n\nexport function usePackageManager() {\n if (!packageManager) {\n throw Error(\n \"No package manager detected. Make sure to call detectPackageManager() before usePackageManager()\"\n );\n }\n\n return packageManager;\n}\n\n/**\n * First we check if the package manager is declared in the manifest. If it is,\n * we get the name and version from there. Otherwise we'll search for the\n * different lockfiles and ask the OS to report the installed version.\n */\nexport function detectPackageManager(workspaceRoot: string): PackageManager {\n /**\n * Disable infer from manifest for now. I doubt it is useful after all but\n * I'll keep the code as a reminder.\n */\n packageManager =\n inferFromManifest(workspaceRoot) ?? inferFromFiles(workspaceRoot);\n\n return packageManager;\n}\n","import Arborist from \"@npmcli/arborist\";\nimport fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { useLogger } from \"~/lib/logger\";\nimport { getErrorMessage } from \"~/lib/utils\";\n\n/**\n * Generate an isolated / pruned lockfile, based on the contents of installed\n * node_modules from the monorepo root plus the adapted package manifest in the\n * isolate directory.\n */\nexport async function generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n}: {\n workspaceRootDir: string;\n isolateDir: string;\n}) {\n const log = useLogger();\n\n log.info(\"Generating NPM lockfile...\");\n\n const origRootNodeModulesPath = path.join(workspaceRootDir, \"node_modules\");\n const tempRootNodeModulesPath = path.join(isolateDir, \"node_modules\");\n\n let hasMovedNodeModules = false;\n\n try {\n if (!fs.existsSync(origRootNodeModulesPath)) {\n throw new Error(\n `Failed to find node_modules at ${origRootNodeModulesPath}`\n );\n }\n\n log.debug(`Temporarily moving node_modules to the isolate output`);\n\n await fs.move(origRootNodeModulesPath, tempRootNodeModulesPath);\n hasMovedNodeModules = true;\n\n const arborist = new Arborist({ path: isolateDir });\n\n log.debug(`Build tree`);\n const { meta } = await arborist.buildIdealTree();\n\n log.debug(`Commit tree`);\n meta?.commit();\n\n const lockfilePath = path.join(isolateDir, \"package-lock.json\");\n\n await fs.writeFile(lockfilePath, String(meta));\n\n log.debug(\"Created lockfile at\", lockfilePath);\n } catch (err: any) {\n log.error(err.stack);\n log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);\n /**\n * If lockfile creation fails we can technically still continue with the\n * rest. Not sure if that is desirable.\n */\n } finally {\n if (hasMovedNodeModules) {\n log.debug(`Restoring node_modules to the workspace root`);\n await fs.move(tempRootNodeModulesPath, origRootNodeModulesPath);\n }\n }\n}\n","import {\n getLockfileImporterId,\n readWantedLockfile,\n writeWantedLockfile,\n} from \"@pnpm/lockfile-file\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { pick } from \"ramda\";\nimport { useConfig } from \"~/lib/config\";\nimport { useLogger } from \"~/lib/logger\";\nimport type { PackagesRegistry } from \"~/lib/types\";\nimport { getErrorMessage } from \"~/lib/utils\";\nimport { pnpmMapImporter } from \"../process-lockfile\";\n\nexport async function generatePnpmLockfile({\n workspaceRootDir,\n targetPackageDir,\n isolateDir,\n internalDepPackageNames,\n packagesRegistry,\n}: {\n workspaceRootDir: string;\n targetPackageDir: string;\n isolateDir: string;\n internalDepPackageNames: string[];\n packagesRegistry: PackagesRegistry;\n}) {\n const { includeDevDependencies } = useConfig();\n const log = useLogger();\n\n log.info(\"Generating PNPM lockfile...\");\n\n try {\n const lockfile = await readWantedLockfile(workspaceRootDir, {\n ignoreIncompatible: false,\n });\n\n assert(lockfile, `No input lockfile found at ${workspaceRootDir}`);\n\n const targetImporterId = getLockfileImporterId(\n workspaceRootDir,\n targetPackageDir\n );\n\n const directoryByPackageName = Object.fromEntries(\n internalDepPackageNames.map((name) => {\n const pkg = packagesRegistry[name];\n assert(pkg, `Package ${name} not found in packages registry`);\n return [name, pkg.rootRelativeDir];\n })\n );\n\n const relevantImporterIds = [\n targetImporterId,\n /**\n * The directory paths happen to correspond with what PNPM calls the\n * importer ids in the context of a lockfile.\n */\n ...Object.values(directoryByPackageName),\n ];\n\n log.debug(\"Relevant importer ids:\", relevantImporterIds);\n\n lockfile.importers = Object.fromEntries(\n Object.entries(pick(relevantImporterIds, lockfile.importers)).map(\n ([importerId, importer]) => {\n if (importerId === targetImporterId) {\n log.debug(\"Setting target package importer on root\");\n\n return [\n \".\",\n pnpmMapImporter(importer, {\n includeDevDependencies,\n directoryByPackageName,\n }),\n ];\n }\n\n log.debug(\"Setting internal package importer:\", importerId);\n\n return [\n importerId,\n pnpmMapImporter(importer, {\n includeDevDependencies,\n directoryByPackageName,\n }),\n ];\n }\n )\n );\n\n await writeWantedLockfile(isolateDir, lockfile);\n\n log.debug(\"Created lockfile at\", path.join(isolateDir, \"pnpm-lock.yaml\"));\n } catch (err) {\n log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);\n }\n}\n","import fs from \"fs-extra\";\nimport { execSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport { useLogger } from \"~/lib/logger\";\nimport { getErrorMessage } from \"~/lib/utils\";\n\n/**\n * Generate an isolated / pruned lockfile, based on the existing lockfile from\n * the monorepo root plus the adapted package manifest in the isolate\n * directory.\n */\nexport async function generateYarnLockfile({\n workspaceRootDir,\n isolateDir,\n}: {\n workspaceRootDir: string;\n isolateDir: string;\n}) {\n const log = useLogger();\n\n log.info(\"Generating Yarn lockfile...\");\n\n const origLockfilePath = path.join(workspaceRootDir, \"yarn.lock\");\n const newLockfilePath = path.join(isolateDir, \"yarn.lock\");\n\n if (!fs.existsSync(origLockfilePath)) {\n throw new Error(`Failed to find lockfile at ${origLockfilePath}`);\n }\n\n log.debug(`Copy original yarn.lock to the isolate output`);\n\n try {\n await fs.copyFile(origLockfilePath, newLockfilePath);\n\n // const origWorkingDirectory = process.cwd();\n\n // process.chdir(isolateDir);\n\n /**\n * Running install with the original lockfile in the same directory will\n * generate a pruned version of the lockfile.\n */\n log.debug(`Running local install`);\n execSync(`yarn install --cwd ${isolateDir}`);\n\n // process.chdir(origWorkingDirectory);\n\n log.debug(\"Generated lockfile at\", newLockfilePath);\n } catch (err) {\n log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);\n /**\n * If lockfile creation fails we can technically still continue with the\n * rest. Not sure if that is desirable.\n */\n }\n}\n","import { omit, pick } from \"ramda\";\nimport { useConfig } from \"../config\";\nimport { usePackageManager } from \"../package-manager\";\nimport type { PackageManifest, PackagesRegistry } from \"../types\";\nimport { adaptManifestInternalDeps } from \"./helpers\";\nimport { writeManifest } from \"./io\";\n\n/**\n * Adapt the output package manifest, so that:\n *\n * - Its internal dependencies point to the isolated ./packages/* directory.\n * - The devDependencies are possibly removed\n * - Scripts are picked or omitted and otherwise removed\n */\nexport async function adaptTargetPackageManifest(\n manifest: PackageManifest,\n packagesRegistry: PackagesRegistry,\n isolateDir: string\n) {\n const packageManager = usePackageManager();\n const { includeDevDependencies, useNpm, pickFromScripts, omitFromScripts } =\n useConfig();\n\n /** Dev dependencies are omitted by default */\n const inputManifest = includeDevDependencies\n ? manifest\n : omit([\"devDependencies\"], manifest);\n\n const adaptedManifest =\n packageManager.name === \"pnpm\" && !useNpm\n ? /**\n * For PNPM the output itself is a workspace so we can preserve the specifiers\n * with \"workspace:*\" in the output manifest.\n */\n inputManifest\n : /** For other package managers we replace the links to internal dependencies */\n adaptManifestInternalDeps({\n manifest: inputManifest,\n packagesRegistry,\n });\n\n const outputManifest = {\n ...adaptedManifest,\n /**\n * Scripts are removed by default if not explicitly picked or omitted via\n * config.\n */\n scripts: pickFromScripts\n ? pick(pickFromScripts as never[], manifest.scripts)\n : omitFromScripts\n ? omit(omitFromScripts as never[], manifest.scripts)\n : undefined,\n };\n\n await writeManifest(isolateDir, outputManifest);\n}\n","import path from \"node:path\";\nimport { omit } from \"ramda\";\nimport { useConfig } from \"~/lib/config\";\nimport { usePackageManager } from \"~/lib/package-manager\";\nimport type { PackagesRegistry } from \"~/lib/types\";\nimport { writeManifest } from \"../io\";\nimport { adaptManifestInternalDeps } from \"./adapt-manifest-internal-deps\";\n\n/**\n * Adapt the manifest files of all the isolated internal packages (excluding the\n * target package), so that their dependencies point to the other isolated\n * packages in the same folder.\n */\nexport async function adaptInternalPackageManifests(\n internalPackageNames: string[],\n packagesRegistry: PackagesRegistry,\n isolateDir: string\n) {\n const packageManager = usePackageManager();\n const { includeDevDependencies } = useConfig();\n\n await Promise.all(\n internalPackageNames.map(async (packageName) => {\n const { manifest, rootRelativeDir } = packagesRegistry[packageName];\n\n /**\n * Dev dependencies are omitted by default. And also, for internal\n * dependencies we want to omit the peerDependencies, because installing\n * these is the responsibility of the consuming app / service, and\n * otherwise the frozen lockfile install will error since the package file\n * contains something that is not referenced in the lockfile.\n */\n const inputManifest = includeDevDependencies\n ? omit([\"xxpeerDependencies\"], manifest)\n : omit([\"devDependencies\", \"xxpeerDependencies\"], manifest);\n\n const outputManifest =\n packageManager.name === \"pnpm\"\n ? /**\n * For PNPM the output itself is a workspace so we can preserve the specifiers\n * with \"workspace:*\" in the output manifest.\n */\n inputManifest\n : adaptManifestInternalDeps({\n manifest,\n packagesRegistry,\n parentRootRelativeDir: rootRelativeDir,\n });\n\n await writeManifest(\n path.join(isolateDir, rootRelativeDir),\n outputManifest\n );\n })\n );\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport type { PackageManifest } from \"../types\";\nimport { readTypedJson } from \"../utils\";\n\nexport async function readManifest(packageDir: string) {\n return readTypedJson<PackageManifest>(path.join(packageDir, \"package.json\"));\n}\n\nexport async function writeManifest(\n outputDir: string,\n manifest: PackageManifest\n) {\n await fs.writeFile(\n path.join(outputDir, \"package.json\"),\n JSON.stringify(manifest, null, 2)\n );\n}\n","import path from \"node:path\";\nimport { useLogger } from \"../../logger\";\nimport type { PackagesRegistry } from \"../../types\";\n\nexport function patchInternalEntries(\n dependencies: Record<string, string>,\n packagesRegistry: PackagesRegistry,\n parentRootRelativeDir?: string\n) {\n const log = useLogger();\n const allWorkspacePackageNames = Object.keys(packagesRegistry);\n\n return Object.fromEntries(\n Object.entries(dependencies).map(([key, value]) => {\n if (allWorkspacePackageNames.includes(key)) {\n const def = packagesRegistry[key];\n\n /**\n * When nested internal dependencies are used (internal packages linking\n * to other internal packages), the parentRootRelativeDir will be passed\n * in, and we store the relative path to the isolate/packages\n * directory.\n *\n * For consistency we also write the other file paths starting with ./,\n * but it doesn't seem to be necessary for any package manager.\n */\n const relativePath = parentRootRelativeDir\n ? path.relative(parentRootRelativeDir, `./${def.rootRelativeDir}`)\n : `./${def.rootRelativeDir}`;\n\n const linkPath = `file:${relativePath}`;\n\n log.debug(`Linking dependency ${key} to ${linkPath}`);\n\n return [key, linkPath];\n } else {\n return [key, value];\n }\n })\n );\n}\n","import type { PackageManifest, PackagesRegistry } from \"~/lib/types\";\nimport { patchInternalEntries } from \"./patch-internal-entries\";\n\n/**\n * Replace the workspace version specifiers for internal dependency with file:\n * paths. Not needed for PNPM (because we configure the isolated output as a\n * workspace), but maybe still for NPM and Yarn.\n */\nexport function adaptManifestInternalDeps({\n manifest,\n packagesRegistry,\n parentRootRelativeDir,\n}: {\n manifest: PackageManifest;\n packagesRegistry: PackagesRegistry;\n parentRootRelativeDir?: string;\n}): PackageManifest {\n const { dependencies, devDependencies } = manifest;\n\n return {\n ...manifest,\n dependencies: dependencies\n ? patchInternalEntries(\n dependencies,\n packagesRegistry,\n parentRootRelativeDir\n )\n : undefined,\n devDependencies: devDependencies\n ? patchInternalEntries(\n devDependencies,\n packagesRegistry,\n parentRootRelativeDir\n )\n : undefined,\n };\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport outdent from \"outdent\";\nimport { useConfig } from \"../config\";\nimport { useLogger } from \"../logger\";\nimport { readTypedJson } from \"../utils\";\n\nexport async function getBuildOutputDir(targetPackageDir: string) {\n const config = useConfig();\n const log = useLogger();\n\n if (config.buildDirName) {\n log.debug(\"Using buildDirName from config:\", config.buildDirName);\n return path.join(targetPackageDir, config.buildDirName);\n }\n\n const tsconfigPath = path.join(targetPackageDir, config.tsconfigPath);\n\n if (fs.existsSync(tsconfigPath)) {\n log.debug(\"Found tsconfig at:\", config.tsconfigPath);\n\n const tsconfig = await readTypedJson<{\n compilerOptions?: { outDir?: string };\n }>(tsconfigPath);\n\n const outDir = tsconfig.compilerOptions?.outDir;\n\n if (outDir) {\n return path.join(targetPackageDir, outDir);\n } else {\n throw new Error(outdent`\n Failed to find outDir in tsconfig. If you are executing isolate from the root of a monorepo you should specify the buildDirName in isolate.config.json.\n `);\n }\n } else {\n log.warn(\"Failed to find tsconfig at:\", tsconfigPath);\n\n throw new Error(outdent`\n Failed to infer the build output directory from either the isolate config buildDirName or a Typescript config file. See the documentation on how to configure one of these options.\n `);\n }\n}\n","import assert from \"node:assert\";\nimport { useConfig } from \"../config\";\nimport { useLogger } from \"../logger\";\nimport { usePackageManager } from \"../package-manager\";\nimport type { PackagesRegistry } from \"../types\";\nimport { pack } from \"../utils\";\n\n/**\n * Pack dependencies so that we extract only the files that are supposed to be\n * published by the packages.\n *\n * @returns A map of package names to the path of the packed file\n */\nexport async function packDependencies({\n /** All packages found in the monorepo by workspaces declaration */\n packagesRegistry,\n /** The dependencies that appear to be internal packages */\n internalPackageNames,\n /**\n * The directory where the isolated package and all its dependencies will end\n * up. This is also the directory from where the package will be deployed. By\n * default it is a subfolder in targetPackageDir called \"isolate\" but you can\n * configure it.\n */\n packDestinationDir,\n}: {\n packagesRegistry: PackagesRegistry;\n internalPackageNames: string[];\n packDestinationDir: string;\n}) {\n const config = useConfig();\n const log = useLogger();\n\n const packedFileByName: Record<string, string> = {};\n\n const { name, version } = usePackageManager();\n\n const versionMajor = parseInt(version.split(\".\")[0], 10);\n\n const usePnpmPack =\n !config.avoidPnpmPack && name === \"pnpm\" && versionMajor >= 8;\n\n if (usePnpmPack) {\n log.debug(\"Using PNPM pack instead of NPM pack\");\n }\n\n for (const dependency of internalPackageNames) {\n const def = packagesRegistry[dependency];\n\n assert(dependency, `Failed to find package definition for ${dependency}`);\n\n const { name } = def.manifest;\n\n /**\n * If this dependency has already been packed, we skip it. It could happen\n * because we are packing workspace dependencies recursively.\n */\n if (packedFileByName[name]) {\n log.debug(`Skipping ${name} because it has already been packed`);\n continue;\n }\n\n packedFileByName[name] = await pack(\n def.absoluteDir,\n packDestinationDir,\n usePnpmPack\n );\n }\n\n return packedFileByName;\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { useLogger } from \"../logger\";\nimport { pack, unpack } from \"../utils\";\n\nconst TIMEOUT_MS = 5000;\n\nexport async function processBuildOutputFiles({\n targetPackageDir,\n tmpDir,\n isolateDir,\n}: {\n targetPackageDir: string;\n tmpDir: string;\n isolateDir: string;\n}) {\n const log = useLogger();\n const packedFilePath = await pack(targetPackageDir, tmpDir);\n const unpackDir = path.join(tmpDir, \"target\");\n\n const now = Date.now();\n let isWaitingYet = false;\n\n while (!fs.existsSync(packedFilePath) && Date.now() - now < TIMEOUT_MS) {\n if (!isWaitingYet) {\n log.debug(`Waiting for ${packedFilePath} to become available...`);\n }\n isWaitingYet = true;\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n await unpack(packedFilePath, unpackDir);\n await fs.copy(path.join(unpackDir, \"package\"), isolateDir);\n}\n","import fs from \"fs-extra\";\nimport path, { join } from \"node:path\";\nimport { useLogger } from \"../logger\";\nimport type { PackagesRegistry } from \"../types\";\nimport { getIsolateRelativePath, unpack } from \"../utils\";\n\nexport async function unpackDependencies(\n packedFilesByName: Record<string, string>,\n packagesRegistry: PackagesRegistry,\n tmpDir: string,\n isolateDir: string\n) {\n const log = useLogger();\n\n await Promise.all(\n Object.entries(packedFilesByName).map(async ([packageName, filePath]) => {\n const dir = packagesRegistry[packageName].rootRelativeDir;\n const unpackDir = join(tmpDir, dir);\n\n log.debug(\"Unpacking\", `(temp)/${path.basename(filePath)}`);\n\n await unpack(filePath, unpackDir);\n\n const destinationDir = join(isolateDir, dir);\n\n await fs.ensureDir(destinationDir);\n\n await fs.move(join(unpackDir, \"package\"), destinationDir, {\n overwrite: true,\n });\n\n log.debug(\n `Moved package files to ${getIsolateRelativePath(\n destinationDir,\n isolateDir\n )}`\n );\n })\n );\n}\n","import fs from \"fs-extra\";\nimport { globSync } from \"glob\";\nimport path from \"node:path\";\nimport { useLogger } from \"../logger\";\nimport type { PackageManifest, PackagesRegistry } from \"../types\";\nimport { readTypedJson } from \"../utils\";\nimport { findPackagesGlobs } from \"./helpers/find-packages-globs\";\n\n/**\n * Build a list of all packages in the workspace, depending on the package\n * manager used, with a possible override from the config file. The list\n * contains the manifest with some directory info mapped by module name.\n */\nexport async function createPackagesRegistry(\n workspaceRootDir: string,\n workspacePackagesOverride: string[] | undefined\n): Promise<PackagesRegistry> {\n const log = useLogger();\n\n if (workspacePackagesOverride) {\n log.debug(\n `Override workspace packages via config: ${workspacePackagesOverride}`\n );\n }\n\n const packagesGlobs =\n workspacePackagesOverride ?? findPackagesGlobs(workspaceRootDir);\n\n const cwd = process.cwd();\n process.chdir(workspaceRootDir);\n\n const allPackages = packagesGlobs\n .flatMap((glob) => globSync(glob))\n /** Make sure to filter any loose files that might hang around. */\n .filter((dir) => fs.lstatSync(dir).isDirectory());\n\n const registry: PackagesRegistry = (\n await Promise.all(\n allPackages.map(async (rootRelativeDir) => {\n const manifestPath = path.join(rootRelativeDir, \"package.json\");\n\n if (!fs.existsSync(manifestPath)) {\n log.warn(\n `Ignoring directory ./${rootRelativeDir} because it does not contain a package.json file`\n );\n return;\n } else {\n log.debug(`Registering package ./${rootRelativeDir}`);\n\n const manifest = await readTypedJson<PackageManifest>(\n path.join(rootRelativeDir, \"package.json\")\n );\n\n return {\n manifest,\n rootRelativeDir,\n absoluteDir: path.join(workspaceRootDir, rootRelativeDir),\n };\n }\n })\n )\n ).reduce<PackagesRegistry>((acc, info) => {\n if (info) {\n acc[info.manifest.name] = info;\n }\n return acc;\n }, {});\n\n process.chdir(cwd);\n\n return registry;\n}\n","import assert from \"node:assert\";\nimport path from \"node:path\";\nimport { useLogger } from \"../../logger\";\nimport { usePackageManager } from \"../../package-manager\";\nimport {\n inspectValue,\n readTypedJsonSync,\n readTypedYamlSync,\n} from \"../../utils\";\n\n/**\n * Find the globs that define where the packages are located within the\n * monorepo. This configuration is dependent on the package manager used, and I\n * don't know if we're covering all cases yet...\n */\nexport function findPackagesGlobs(workspaceRootDir: string) {\n const log = useLogger();\n\n const packageManager = usePackageManager();\n\n switch (packageManager.name) {\n case \"pnpm\": {\n const { packages: globs } = readTypedYamlSync<{ packages: string[] }>(\n path.join(workspaceRootDir, \"pnpm-workspace.yaml\")\n );\n\n log.debug(\"Detected pnpm packages globs:\", inspectValue(globs));\n return globs;\n }\n case \"yarn\":\n case \"npm\": {\n const workspaceRootManifestPath = path.join(\n workspaceRootDir,\n \"package.json\"\n );\n\n const { workspaces } = readTypedJsonSync<{ workspaces: string[] }>(\n workspaceRootManifestPath\n );\n\n if (!workspaces) {\n throw new Error(\n `No workspaces field found in ${workspaceRootManifestPath}`\n );\n }\n\n if (Array.isArray(workspaces)) {\n return workspaces;\n } else {\n /**\n * For Yarn, workspaces could be defined as an object with { packages:\n * [], nohoist: [] }. See\n * https://classic.yarnpkg.com/blog/2018/02/15/nohoist/\n */\n const workspacesObject = workspaces as { packages?: string[] };\n\n assert(\n workspacesObject.packages,\n \"workspaces.packages must be an array\"\n );\n\n return workspacesObject.packages;\n }\n }\n }\n}\n","import { uniq } from \"ramda\";\nimport type { PackageManifest, PackagesRegistry } from \"../types\";\n\n/**\n * Recursively list all the packages from dependencies (and optionally\n * devDependencies) that are found in the monorepo.\n *\n * Here we do not need to rely on packages being declared with \"workspace:\" in\n * the package manifest. We can simply compare the package names with the list\n * of packages that were found via the workspace glob patterns and add them to\n * the registry.\n */\nexport function listInternalPackages(\n manifest: PackageManifest,\n packagesRegistry: PackagesRegistry,\n { includeDevDependencies = false } = {}\n): string[] {\n const allWorkspacePackageNames = Object.keys(packagesRegistry);\n\n const internalPackageNames = (\n includeDevDependencies\n ? [\n ...Object.keys(manifest.dependencies ?? {}),\n ...Object.keys(manifest.devDependencies ?? {}),\n ]\n : Object.keys(manifest.dependencies ?? {})\n ).filter((name) => allWorkspacePackageNames.includes(name));\n\n const nestedInternalPackageNames = internalPackageNames.flatMap(\n (packageName) =>\n listInternalPackages(\n packagesRegistry[packageName].manifest,\n packagesRegistry,\n { includeDevDependencies }\n )\n );\n\n return uniq(internalPackageNames.concat(nestedInternalPackageNames));\n}\n"],"mappings":"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","names":["fs","assert","path","omit","fs","path","path","fs","stdout","fs","fs","fs","fs","path","fs","fs","path","fs","path","fs","assert","path","path","assert","fs","fs","path","path","fs","assert","path","assert","path","fs","execSync","path","path","fs","execSync","omit","pick","path","fs","path","path","fs","path","path","packageManager","path","packageManager","omit","pick","fs","path","path","fs","assert","assert","name","fs","path","path","fs","fs","path","path","fs","fs","path","assert","path","packageManager","path","assert","fs","path","path","assert","fs","packageManager","omit"]}
|
|
1
|
+
{"version":3,"sources":["../src/isolate.ts","../src/lib/config.ts","../src/lib/logger.ts","../src/lib/utils/get-dirname.ts","../src/lib/utils/get-error-message.ts","../src/lib/utils/get-relative-path.ts","../src/lib/utils/inspect-value.ts","../src/lib/utils/json.ts","../src/lib/utils/pack.ts","../src/lib/utils/unpack.ts","../src/lib/utils/yaml.ts","../src/lib/lockfile/process-lockfile.ts","../src/lib/package-manager/helpers/infer-from-files.ts","../src/lib/package-manager/names.ts","../src/lib/package-manager/helpers/infer-from-manifest.ts","../src/lib/package-manager/index.ts","../src/lib/lockfile/helpers/generate-npm-lockfile.ts","../src/lib/lockfile/helpers/generate-pnpm-lockfile.ts","../src/lib/lockfile/helpers/generate-yarn-lockfile.ts","../src/lib/manifest/adapt-target-package-manifest.ts","../src/lib/manifest/helpers/adapt-internal-package-manifests.ts","../src/lib/manifest/io.ts","../src/lib/manifest/helpers/patch-internal-entries.ts","../src/lib/manifest/helpers/adapt-manifest-internal-deps.ts","../src/lib/output/get-build-output-dir.ts","../src/lib/output/pack-dependencies.ts","../src/lib/output/process-build-output-files.ts","../src/lib/output/unpack-dependencies.ts","../src/lib/registry/create-packages-registry.ts","../src/lib/registry/helpers/find-packages-globs.ts","../src/lib/registry/list-internal-packages.ts"],"sourcesContent":["import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { omit } from \"ramda\";\nimport type { IsolateConfig } from \"./lib/config\";\nimport { resolveConfig, setUserConfig } from \"./lib/config\";\nimport { processLockfile } from \"./lib/lockfile\";\nimport type { Logger } from \"./lib/logger\";\nimport { setLogLevel, setLogger, useLogger } from \"./lib/logger\";\nimport {\n adaptInternalPackageManifests,\n adaptTargetPackageManifest,\n readManifest,\n writeManifest,\n} from \"./lib/manifest\";\nimport {\n getBuildOutputDir,\n packDependencies,\n processBuildOutputFiles,\n unpackDependencies,\n} from \"./lib/output\";\nimport { detectPackageManager } from \"./lib/package-manager\";\nimport { createPackagesRegistry, listInternalPackages } from \"./lib/registry\";\nimport type { PackageManifest } from \"./lib/types\";\nimport { getDirname, getRootRelativePath, readTypedJson } from \"./lib/utils\";\n\nconst __dirname = getDirname(import.meta.url);\n\nexport async function isolate(\n options: { config?: IsolateConfig; logger?: Logger } = {}\n) {\n if (options.logger) {\n setLogger(options.logger);\n }\n\n if (options.config) {\n setUserConfig(options.config);\n }\n\n const config = resolveConfig();\n\n setLogLevel(config.logLevel);\n\n const log = useLogger();\n\n const thisPackageManifest = await readTypedJson<PackageManifest>(\n path.join(path.join(__dirname, \"..\", \"package.json\"))\n );\n\n log.debug(\"Using isolate-package version\", thisPackageManifest.version);\n\n /**\n * If a targetPackagePath is set, we assume the configuration lives in the\n * root of the workspace. If targetPackagePath is undefined (the default), we\n * assume that the configuration lives in the target package directory.\n */\n const targetPackageDir = config.targetPackagePath\n ? path.join(process.cwd(), config.targetPackagePath)\n : process.cwd();\n\n /**\n * We want a trailing slash here. Functionally it doesn't matter, but it makes\n * the relative paths more correct in the debug output.\n */\n const workspaceRootDir = config.targetPackagePath\n ? process.cwd()\n : path.join(targetPackageDir, config.workspaceRoot);\n\n const buildOutputDir = await getBuildOutputDir(targetPackageDir);\n\n assert(\n fs.existsSync(buildOutputDir),\n `Failed to find build output path at ${buildOutputDir}. Please make sure you build the source before isolating it.`\n );\n\n log.debug(\"Workspace root resolved to\", workspaceRootDir);\n log.debug(\n \"Isolate target package\",\n getRootRelativePath(targetPackageDir, workspaceRootDir)\n );\n\n const isolateDir = path.join(targetPackageDir, config.isolateDirName);\n\n log.debug(\n \"Isolate output directory\",\n getRootRelativePath(isolateDir, workspaceRootDir)\n );\n\n if (fs.existsSync(isolateDir)) {\n await fs.remove(isolateDir);\n log.debug(\"Cleaned the existing isolate output directory\");\n }\n\n await fs.ensureDir(isolateDir);\n\n const tmpDir = path.join(isolateDir, \"__tmp\");\n await fs.ensureDir(tmpDir);\n\n const targetPackageManifest = await readTypedJson<PackageManifest>(\n path.join(targetPackageDir, \"package.json\")\n );\n\n const packageManager = detectPackageManager(workspaceRootDir);\n\n log.debug(\n \"Detected package manager\",\n packageManager.name,\n packageManager.version\n );\n\n /**\n * Build a packages registry so we can find the workspace packages by name and\n * have access to their manifest files and relative paths.\n */\n const packagesRegistry = await createPackagesRegistry(\n workspaceRootDir,\n config.workspacePackages\n );\n\n const internalPackageNames = listInternalPackages(\n targetPackageManifest,\n packagesRegistry,\n {\n includeDevDependencies: config.includeDevDependencies,\n }\n );\n\n const packedFilesByName = await packDependencies({\n internalPackageNames,\n packagesRegistry,\n packDestinationDir: tmpDir,\n });\n\n await unpackDependencies(\n packedFilesByName,\n packagesRegistry,\n tmpDir,\n isolateDir\n );\n\n /** Adapt the manifest files for all the unpacked local dependencies */\n await adaptInternalPackageManifests(\n internalPackageNames,\n packagesRegistry,\n isolateDir\n );\n\n /** Pack the target package directory, and unpack it in the isolate location */\n await processBuildOutputFiles({\n targetPackageDir,\n tmpDir,\n isolateDir,\n });\n\n /**\n * Copy the target manifest file to the isolate location and adapt its\n * workspace dependencies to point to the isolated packages.\n */\n await adaptTargetPackageManifest(\n targetPackageManifest,\n packagesRegistry,\n isolateDir\n );\n\n /** Generate an isolated lockfile based on the original one */\n const usedFallbackToNpm = await processLockfile({\n workspaceRootDir,\n isolateDir,\n packagesRegistry,\n internalDepPackageNames: internalPackageNames,\n targetPackageDir,\n targetPackageName: targetPackageManifest.name,\n });\n\n if (usedFallbackToNpm) {\n /**\n * When we fall back to NPM, we strip the package manager declaration from\n * the manifest, so the default NPM version from the host environment can be\n * used.\n */\n const inputManifest = await readManifest(isolateDir);\n\n const outputManifest = omit([\"packageManager\"], inputManifest);\n\n await writeManifest(isolateDir, outputManifest);\n }\n\n if (packageManager.name === \"pnpm\" && !config.forceNpm) {\n /**\n * PNPM doesn't install dependencies of packages that are linked via link:\n * or file: specifiers. It requires the directory to be configured as a\n * workspace, so we copy the workspace config file to the isolate output.\n */\n fs.copyFileSync(\n path.join(workspaceRootDir, \"pnpm-workspace.yaml\"),\n path.join(isolateDir, \"pnpm-workspace.yaml\")\n );\n }\n /**\n * If there is an .npmrc file in the workspace root, copy it to the isolate\n * because the settings there could affect how the lockfile is resolved. Note\n * that .npmrc is used by both NPM and PNPM for configuration.\n *\n * See also: https://pnpm.io/npmrc\n */\n const npmrcPath = path.join(workspaceRootDir, \".npmrc\");\n\n if (fs.existsSync(npmrcPath)) {\n fs.copyFileSync(npmrcPath, path.join(isolateDir, \".npmrc\"));\n log.debug(\"Copied .npmrc file to the isolate output\");\n }\n\n /**\n * Clean up. Only so this in the happy path, so we can look at the temp folder\n * when thing go wrong.\n */\n log.debug(\n \"Deleting temp directory\",\n getRootRelativePath(tmpDir, workspaceRootDir)\n );\n await fs.remove(tmpDir);\n\n log.info(\"Isolate completed at\", isolateDir);\n\n return isolateDir;\n}\n","import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { isEmpty } from \"ramda\";\nimport { setLogLevel, useLogger } from \"./logger\";\nimport { inspectValue, readTypedJsonSync } from \"./utils\";\n\nexport type IsolateConfigResolved = {\n buildDirName?: string;\n includeDevDependencies: boolean;\n isolateDirName: string;\n logLevel: \"info\" | \"debug\" | \"warn\" | \"error\";\n targetPackagePath?: string;\n tsconfigPath: string;\n workspacePackages?: string[];\n workspaceRoot: string;\n forceNpm: boolean;\n pickFromScripts?: string[];\n omitFromScripts?: string[];\n};\n\nexport type IsolateConfig = Partial<IsolateConfigResolved>;\n\nconst configDefaults: IsolateConfigResolved = {\n buildDirName: undefined,\n includeDevDependencies: false,\n isolateDirName: \"isolate\",\n logLevel: \"info\",\n targetPackagePath: undefined,\n tsconfigPath: \"./tsconfig.json\",\n workspacePackages: undefined,\n workspaceRoot: \"../..\",\n forceNpm: false,\n pickFromScripts: undefined,\n omitFromScripts: undefined,\n};\n\n/**\n * Only initialize the configuration once, and keeping it here for subsequent\n * calls to getConfig.\n */\nlet _resolvedConfig: IsolateConfigResolved | undefined;\n\nlet _user_defined_config: IsolateConfig | undefined;\n\nconst validConfigKeys = Object.keys(configDefaults);\n\nconst CONFIG_FILE_NAME = \"isolate.config.json\";\n\nexport type LogLevel = IsolateConfigResolved[\"logLevel\"];\n\nexport function setUserConfig(config: IsolateConfig) {\n _user_defined_config = config;\n\n if (config.logLevel) {\n setLogLevel(config.logLevel);\n }\n}\n\nexport function useConfig() {\n if (_resolvedConfig) {\n return _resolvedConfig;\n } else {\n throw new Error(\"Called useConfig before config was made available\");\n }\n}\n\n/**\n * Resolve configuration based on user config and defaults. If setConfig was\n * called before this, it does not attempt to read a config file from disk.\n */\nexport function resolveConfig(): IsolateConfigResolved {\n if (_resolvedConfig) {\n return _resolvedConfig;\n }\n\n setLogLevel(process.env.DEBUG_ISOLATE_CONFIG ? \"debug\" : \"info\");\n\n const log = useLogger();\n\n const configFilePath = path.join(process.cwd(), CONFIG_FILE_NAME);\n\n if (_user_defined_config) {\n log.debug(`Using user defined config:`, inspectValue(_user_defined_config));\n } else {\n log.debug(`Attempting to load config from ${configFilePath}`);\n\n _user_defined_config = fs.existsSync(configFilePath)\n ? readTypedJsonSync<IsolateConfig>(configFilePath)\n : {};\n }\n\n const foreignKeys = Object.keys(_user_defined_config).filter(\n (key) => !validConfigKeys.includes(key)\n );\n\n if (!isEmpty(foreignKeys)) {\n log.warn(`Found invalid config settings:`, foreignKeys.join(\", \"));\n }\n\n const config = Object.assign(\n {},\n configDefaults,\n _user_defined_config\n ) satisfies IsolateConfigResolved;\n\n log.debug(\"Using configuration:\", inspectValue(config));\n\n _resolvedConfig = config;\n return config;\n}\n\n/**\n * Get only the configuration that the user set explicitly in the config file or\n * passed via arguments to isolate().\n */\nexport function getUserDefinedConfig(): IsolateConfig {\n assert(\n _user_defined_config,\n \"Called getUserDefinedConfig before user config was made available\"\n );\n\n return _user_defined_config;\n}\n","import chalk from \"chalk\";\nimport type { IsolateConfigResolved, LogLevel } from \"./config\";\n/**\n * The Logger defines an interface that can be used to pass in a different\n * logger object in order to intercept all the logging output. We keep the\n * handlers separate from the logger object itself, so that we can change the\n * handlers but do not bother the user with having to handle logLevel.\n */\nexport type Logger = {\n debug(...args: unknown[]): void;\n info(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n};\n\nlet _loggerHandlers: Logger = {\n debug(...args: unknown[]) {\n console.log(chalk.blue(\"debug\"), ...args);\n },\n info(...args: unknown[]) {\n console.log(chalk.green(\"info\"), ...args);\n },\n warn(...args: unknown[]) {\n console.log(chalk.yellow(\"warning\"), ...args);\n },\n error(...args: unknown[]) {\n console.log(chalk.red(\"error\"), ...args);\n },\n};\n\nconst _logger: Logger = {\n debug(...args: unknown[]) {\n if (_logLevel === \"debug\") {\n _loggerHandlers.debug(...args);\n }\n },\n info(...args: unknown[]) {\n if (_logLevel === \"debug\" || _logLevel === \"info\") {\n _loggerHandlers.info(...args);\n }\n },\n warn(...args: unknown[]) {\n if (_logLevel === \"debug\" || _logLevel === \"info\" || _logLevel === \"warn\") {\n _loggerHandlers.warn(...args);\n }\n },\n error(...args: unknown[]) {\n _loggerHandlers.error(...args);\n },\n};\n\nlet _logLevel: LogLevel = \"info\";\n\nexport function setLogger(logger: Logger) {\n _loggerHandlers = logger;\n return _logger;\n}\n\nexport function setLogLevel(\n logLevel: IsolateConfigResolved[\"logLevel\"]\n): Logger {\n _logLevel = logLevel;\n return _logger;\n}\n\nexport function useLogger() {\n return _logger;\n}\n","import { fileURLToPath } from \"url\";\n\n/**\n * Calling context should pass in import.meta.url and the function will return\n * the equivalent of __dirname in Node/CommonJs.\n */\nexport function getDirname(importMetaUrl: string) {\n return fileURLToPath(new URL(\".\", importMetaUrl));\n}\n","type ErrorWithMessage = {\n message: string;\n};\n\nexport function getErrorMessage(error: unknown) {\n return toErrorWithMessage(error).message;\n}\n\nfunction isErrorWithMessage(error: unknown): error is ErrorWithMessage {\n return typeof error === \"object\" && error !== null && \"message\" in error;\n}\n\nfunction toErrorWithMessage(maybeError: unknown): ErrorWithMessage {\n if (isErrorWithMessage(maybeError)) return maybeError;\n\n try {\n return new Error(JSON.stringify(maybeError));\n } catch {\n /**\n * Fallback in case there’s an error stringifying the maybeError like with\n * circular references.\n */\n return new Error(String(maybeError));\n }\n}\n","export function getRootRelativePath(path: string, rootPath: string) {\n const strippedPath = path.replace(rootPath, \"\");\n\n return strippedPath.startsWith(\"/\")\n ? `(root)${strippedPath}`\n : `(root)/${strippedPath}`;\n}\n\nexport function getIsolateRelativePath(path: string, isolatePath: string) {\n const strippedPath = path.replace(isolatePath, \"\");\n\n return strippedPath.startsWith(\"/\")\n ? `(isolate)${strippedPath}`\n : `(isolate)/${strippedPath}`;\n}\n","import { inspect } from \"node:util\";\nimport type { JsonValue } from \"type-fest\";\n\nexport function inspectValue(value: JsonValue) {\n return inspect(value, false, 16, true);\n}\n","import fs from \"fs-extra\";\nimport stripJsonComments from \"strip-json-comments\";\nimport { getErrorMessage } from \"./get-error-message\";\n\n/** @todo Pass in zod schema and validate */\nexport function readTypedJsonSync<T>(filePath: string) {\n try {\n const rawContent = fs.readFileSync(filePath, \"utf-8\");\n const data = JSON.parse(stripJsonComments(rawContent)) as T;\n return data;\n } catch (err) {\n throw new Error(\n `Failed to read JSON from ${filePath}: ${getErrorMessage(err)}`\n );\n }\n}\n\nexport async function readTypedJson<T>(filePath: string) {\n try {\n const rawContent = await fs.readFile(filePath, \"utf-8\");\n const data = JSON.parse(rawContent) as T;\n return data;\n } catch (err) {\n throw new Error(\n `Failed to read JSON from ${filePath}: ${getErrorMessage(err)}`\n );\n }\n}\n","import fs from \"fs-extra\";\nimport { exec } from \"node:child_process\";\nimport path from \"node:path\";\nimport { useLogger } from \"../logger\";\n\nexport async function pack(\n srcDir: string,\n dstDir: string,\n usePnpmPack = false\n) {\n const execOptions = {\n maxBuffer: 10 * 1024 * 1024,\n };\n\n const log = useLogger();\n\n const previousCwd = process.cwd();\n process.chdir(srcDir);\n\n /**\n * PNPM pack seems to be a lot faster than NPM pack, so when PNPM is detected\n * we use that instead.\n */\n const stdout = usePnpmPack\n ? await new Promise<string>((resolve, reject) => {\n exec(\n `pnpm pack --pack-destination \"${dstDir}\"`,\n execOptions,\n (err, stdout, stderr) => {\n if (err) {\n log.error(stderr);\n return reject(err);\n }\n\n resolve(stdout);\n }\n );\n })\n : await new Promise<string>((resolve, reject) => {\n exec(\n `npm pack --pack-destination \"${dstDir}\"`,\n execOptions,\n (err, stdout) => {\n if (err) {\n return reject(err);\n }\n\n resolve(stdout);\n }\n );\n });\n\n const fileName = path.basename(stdout.trim());\n\n const filePath = path.join(dstDir, fileName);\n\n if (!fs.existsSync(filePath)) {\n log.error(\n `The response from pack could not be resolved to an existing file: ${filePath}`\n );\n } else {\n log.debug(`Packed (temp)/${fileName}`);\n }\n\n process.chdir(previousCwd);\n\n /**\n * Return the path anyway even if it doesn't validate. A later stage will wait\n * for the file to occur still. Not sure if this makes sense. Maybe we should\n * stop at the validation error...\n */\n return filePath;\n}\n","import fs from \"fs-extra\";\nimport tar from \"tar-fs\";\nimport { createGunzip } from \"zlib\";\n\nexport async function unpack(filePath: string, unpackDir: string) {\n await new Promise<void>((resolve, reject) => {\n fs.createReadStream(filePath)\n .pipe(createGunzip())\n .pipe(tar.extract(unpackDir))\n .on(\"finish\", () => resolve())\n .on(\"error\", (err) => reject(err));\n });\n}\n","import fs from \"fs-extra\";\nimport yaml from \"yaml\";\nimport { getErrorMessage } from \"./get-error-message\";\n\nexport function readTypedYamlSync<T>(filePath: string) {\n try {\n const rawContent = fs.readFileSync(filePath, \"utf-8\");\n const data = yaml.parse(rawContent);\n /** @todo Add some zod validation maybe */\n return data as T;\n } catch (err) {\n throw new Error(\n `Failed to read YAML from ${filePath}: ${getErrorMessage(err)}`\n );\n }\n}\n\nexport function writeTypedYamlSync<T>(filePath: string, content: T) {\n /** @todo Add some zod validation maybe */\n fs.writeFileSync(filePath, yaml.stringify(content), \"utf-8\");\n}\n","import type {\n ProjectSnapshot,\n ResolvedDependencies,\n} from \"@pnpm/lockfile-file\";\nimport { mapObjIndexed } from \"ramda\";\nimport { useConfig } from \"../config\";\nimport { useLogger } from \"../logger\";\nimport { usePackageManager } from \"../package-manager\";\nimport type { PackagesRegistry } from \"../types\";\nimport { generateNpmLockfile } from \"./helpers/generate-npm-lockfile\";\nimport { generatePnpmLockfile } from \"./helpers/generate-pnpm-lockfile\";\nimport { generateYarnLockfile } from \"./helpers/generate-yarn-lockfile\";\n\n/** Convert dependency links */\nexport function pnpmMapImporter(\n { dependencies, devDependencies, ...rest }: ProjectSnapshot,\n {\n includeDevDependencies,\n directoryByPackageName,\n }: {\n includeDevDependencies: boolean;\n directoryByPackageName: { [packageName: string]: string };\n }\n): ProjectSnapshot {\n return {\n dependencies: dependencies\n ? pnpmMapDependenciesLinks(dependencies, directoryByPackageName)\n : undefined,\n devDependencies:\n includeDevDependencies && devDependencies\n ? pnpmMapDependenciesLinks(devDependencies, directoryByPackageName)\n : undefined,\n ...rest,\n };\n}\n\nfunction pnpmMapDependenciesLinks(\n def: ResolvedDependencies,\n directoryByPackageName: { [packageName: string]: string }\n): ResolvedDependencies {\n return mapObjIndexed(\n (version, name) =>\n version.startsWith(\"link:\")\n ? `link:./${directoryByPackageName[name]}`\n : version,\n def\n );\n}\n\n/**\n * Adapt the lockfile and write it to the isolate directory. Because we keep the\n * structure of packages in the isolate directory the same as they were in the\n * monorepo, the lockfile is largely still correct. The only things that need to\n * be done is to remove the root dependencies and devDependencies, and rename\n * the path to the target package to act as the new root.\n */\nexport async function processLockfile({\n workspaceRootDir,\n packagesRegistry,\n isolateDir,\n internalDepPackageNames,\n targetPackageDir,\n}: {\n workspaceRootDir: string;\n packagesRegistry: PackagesRegistry;\n isolateDir: string;\n internalDepPackageNames: string[];\n targetPackageDir: string;\n targetPackageName: string;\n}) {\n const log = useLogger();\n\n const { forceNpm } = useConfig();\n\n if (forceNpm) {\n log.info(\"Forcing to use NPM for isolate output\");\n\n await generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n });\n\n return true;\n }\n\n const { name, version } = usePackageManager();\n let usedFallbackToNpm = false;\n\n switch (name) {\n case \"npm\": {\n await generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n });\n\n break;\n }\n case \"yarn\": {\n const versionMajor = parseInt(version.split(\".\")[0], 10);\n\n if (versionMajor === 1) {\n await generateYarnLockfile({\n workspaceRootDir,\n isolateDir,\n });\n } else {\n log.info(\n \"Detected modern version of Yarn. Using NPM lockfile fallback.\"\n );\n\n await generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n });\n\n usedFallbackToNpm = true;\n }\n\n break;\n }\n case \"pnpm\": {\n await generatePnpmLockfile({\n workspaceRootDir,\n targetPackageDir,\n isolateDir,\n internalDepPackageNames,\n packagesRegistry,\n });\n break;\n }\n default:\n log.warn(`Unexpected package manager ${name}. Using NPM for output`);\n await generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n });\n\n usedFallbackToNpm = true;\n }\n\n return usedFallbackToNpm;\n}\n","import fs from \"fs-extra\";\nimport { execSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport type { PackageManager, PackageManagerName } from \"../names\";\nimport { getLockfileFileName, supportedPackageManagerNames } from \"../names\";\n\nexport function inferFromFiles(workspaceRoot: string): PackageManager {\n for (const name of supportedPackageManagerNames) {\n const lockfileName = getLockfileFileName(name);\n\n if (fs.existsSync(path.join(workspaceRoot, lockfileName))) {\n return { name, version: getVersion(name) };\n }\n }\n\n /** If no lockfile was found, it could be that there is an npm shrinkwrap file. */\n if (fs.existsSync(path.join(workspaceRoot, \"npm-shrinkwrap.json\"))) {\n return { name: \"npm\", version: getVersion(\"npm\") };\n }\n\n throw new Error(`Failed to detect package manager`);\n}\nfunction getVersion(packageManagerName: PackageManagerName): string {\n const buffer = execSync(`${packageManagerName} --version`);\n return buffer.toString().trim();\n}\n","export const supportedPackageManagerNames = [\"pnpm\", \"yarn\", \"npm\"] as const;\n\nexport type PackageManagerName = (typeof supportedPackageManagerNames)[number];\n\nexport type PackageManager = {\n name: PackageManagerName;\n version: string;\n};\n\nexport function getLockfileFileName(name: PackageManagerName) {\n switch (name) {\n case \"pnpm\":\n return \"pnpm-lock.yaml\";\n case \"yarn\":\n return \"yarn.lock\";\n case \"npm\":\n return \"package-lock.json\";\n }\n}\n","import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { useLogger } from \"~/lib/logger\";\nimport type { PackageManifest } from \"../../types\";\nimport { readTypedJsonSync } from \"../../utils\";\nimport type { PackageManagerName } from \"../names\";\nimport { getLockfileFileName, supportedPackageManagerNames } from \"../names\";\n\nexport function inferFromManifest(workspaceRoot: string) {\n const log = useLogger();\n\n const rootManifest = readTypedJsonSync<PackageManifest>(\n path.join(workspaceRoot, \"package.json\")\n );\n\n if (!rootManifest.packageManager) {\n log.debug(\"No packageManager field found in root manifest\");\n return;\n }\n\n const [name, version = \"*\"] = rootManifest.packageManager.split(\"@\") as [\n PackageManagerName,\n string,\n ];\n\n assert(\n supportedPackageManagerNames.includes(name),\n `Package manager \"${name}\" is not currently supported`\n );\n\n const lockfileName = getLockfileFileName(name);\n\n assert(\n fs.existsSync(path.join(workspaceRoot, lockfileName)),\n `Manifest declares ${name} to be the packageManager, but failed to find ${lockfileName} in workspace root`\n );\n\n return { name, version };\n}\n","import { inferFromFiles } from \"./helpers/infer-from-files\";\nimport { inferFromManifest } from \"./helpers/infer-from-manifest\";\nimport type { PackageManager } from \"./names\";\n\nexport * from \"./names\";\n\nexport let packageManager: PackageManager | undefined;\n\nexport function usePackageManager() {\n if (!packageManager) {\n throw Error(\n \"No package manager detected. Make sure to call detectPackageManager() before usePackageManager()\"\n );\n }\n\n return packageManager;\n}\n\n/**\n * First we check if the package manager is declared in the manifest. If it is,\n * we get the name and version from there. Otherwise we'll search for the\n * different lockfiles and ask the OS to report the installed version.\n */\nexport function detectPackageManager(workspaceRoot: string): PackageManager {\n /**\n * Disable infer from manifest for now. I doubt it is useful after all but\n * I'll keep the code as a reminder.\n */\n packageManager =\n inferFromManifest(workspaceRoot) ?? inferFromFiles(workspaceRoot);\n\n return packageManager;\n}\n","import Arborist from \"@npmcli/arborist\";\nimport fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { useLogger } from \"~/lib/logger\";\nimport { getErrorMessage, inspectValue } from \"~/lib/utils\";\n\n/**\n * Generate an isolated / pruned lockfile, based on the contents of installed\n * node_modules from the monorepo root plus the adapted package manifest in the\n * isolate directory.\n */\nexport async function generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n}: {\n workspaceRootDir: string;\n isolateDir: string;\n}) {\n const log = useLogger();\n\n log.info(\"Generating NPM lockfile...\");\n\n const origRootNodeModulesPath = path.join(workspaceRootDir, \"node_modules\");\n const tempRootNodeModulesPath = path.join(isolateDir, \"node_modules\");\n\n let hasMovedNodeModules = false;\n\n try {\n if (!fs.existsSync(origRootNodeModulesPath)) {\n throw new Error(\n `Failed to find node_modules at ${origRootNodeModulesPath}`\n );\n }\n\n log.debug(`Temporarily moving node_modules to the isolate output`);\n\n await fs.move(origRootNodeModulesPath, tempRootNodeModulesPath);\n hasMovedNodeModules = true;\n\n const arborist = new Arborist({ path: isolateDir });\n\n log.debug(`Build tree`);\n const { meta } = await arborist.buildIdealTree();\n\n log.debug(`Commit tree`);\n meta?.commit();\n\n const lockfilePath = path.join(isolateDir, \"package-lock.json\");\n\n await fs.writeFile(lockfilePath, String(meta));\n\n log.debug(\"Created lockfile at\", lockfilePath);\n } catch (err: any) {\n console.error(inspectValue(err));\n log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);\n /**\n * If lockfile creation fails we can technically still continue with the\n * rest. Not sure if that is desirable.\n */\n } finally {\n if (hasMovedNodeModules) {\n log.debug(`Restoring node_modules to the workspace root`);\n await fs.move(tempRootNodeModulesPath, origRootNodeModulesPath);\n }\n }\n}\n","import {\n getLockfileImporterId,\n readWantedLockfile,\n writeWantedLockfile,\n} from \"@pnpm/lockfile-file\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { pick } from \"ramda\";\nimport { useConfig } from \"~/lib/config\";\nimport { useLogger } from \"~/lib/logger\";\nimport type { PackagesRegistry } from \"~/lib/types\";\nimport { getErrorMessage } from \"~/lib/utils\";\nimport { pnpmMapImporter } from \"../process-lockfile\";\n\nexport async function generatePnpmLockfile({\n workspaceRootDir,\n targetPackageDir,\n isolateDir,\n internalDepPackageNames,\n packagesRegistry,\n}: {\n workspaceRootDir: string;\n targetPackageDir: string;\n isolateDir: string;\n internalDepPackageNames: string[];\n packagesRegistry: PackagesRegistry;\n}) {\n const { includeDevDependencies } = useConfig();\n const log = useLogger();\n\n log.info(\"Generating PNPM lockfile...\");\n\n try {\n const lockfile = await readWantedLockfile(workspaceRootDir, {\n ignoreIncompatible: false,\n });\n\n assert(lockfile, `No input lockfile found at ${workspaceRootDir}`);\n\n const targetImporterId = getLockfileImporterId(\n workspaceRootDir,\n targetPackageDir\n );\n\n const directoryByPackageName = Object.fromEntries(\n internalDepPackageNames.map((name) => {\n const pkg = packagesRegistry[name];\n assert(pkg, `Package ${name} not found in packages registry`);\n return [name, pkg.rootRelativeDir];\n })\n );\n\n const relevantImporterIds = [\n targetImporterId,\n /**\n * The directory paths happen to correspond with what PNPM calls the\n * importer ids in the context of a lockfile.\n */\n ...Object.values(directoryByPackageName),\n ];\n\n log.debug(\"Relevant importer ids:\", relevantImporterIds);\n\n lockfile.importers = Object.fromEntries(\n Object.entries(pick(relevantImporterIds, lockfile.importers)).map(\n ([importerId, importer]) => {\n if (importerId === targetImporterId) {\n log.debug(\"Setting target package importer on root\");\n\n return [\n \".\",\n pnpmMapImporter(importer, {\n includeDevDependencies,\n directoryByPackageName,\n }),\n ];\n }\n\n log.debug(\"Setting internal package importer:\", importerId);\n\n return [\n importerId,\n pnpmMapImporter(importer, {\n includeDevDependencies,\n directoryByPackageName,\n }),\n ];\n }\n )\n );\n\n await writeWantedLockfile(isolateDir, lockfile);\n\n log.debug(\"Created lockfile at\", path.join(isolateDir, \"pnpm-lock.yaml\"));\n } catch (err) {\n log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);\n }\n}\n","import fs from \"fs-extra\";\nimport { execSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport { useLogger } from \"~/lib/logger\";\nimport { getErrorMessage } from \"~/lib/utils\";\n\n/**\n * Generate an isolated / pruned lockfile, based on the existing lockfile from\n * the monorepo root plus the adapted package manifest in the isolate\n * directory.\n */\nexport async function generateYarnLockfile({\n workspaceRootDir,\n isolateDir,\n}: {\n workspaceRootDir: string;\n isolateDir: string;\n}) {\n const log = useLogger();\n\n log.info(\"Generating Yarn lockfile...\");\n\n const origLockfilePath = path.join(workspaceRootDir, \"yarn.lock\");\n const newLockfilePath = path.join(isolateDir, \"yarn.lock\");\n\n if (!fs.existsSync(origLockfilePath)) {\n throw new Error(`Failed to find lockfile at ${origLockfilePath}`);\n }\n\n log.debug(`Copy original yarn.lock to the isolate output`);\n\n try {\n await fs.copyFile(origLockfilePath, newLockfilePath);\n\n // const origWorkingDirectory = process.cwd();\n\n // process.chdir(isolateDir);\n\n /**\n * Running install with the original lockfile in the same directory will\n * generate a pruned version of the lockfile.\n */\n log.debug(`Running local install`);\n execSync(`yarn install --cwd ${isolateDir}`);\n\n // process.chdir(origWorkingDirectory);\n\n log.debug(\"Generated lockfile at\", newLockfilePath);\n } catch (err) {\n log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);\n /**\n * If lockfile creation fails we can technically still continue with the\n * rest. Not sure if that is desirable.\n */\n }\n}\n","import { omit, pick } from \"ramda\";\nimport { useConfig } from \"../config\";\nimport { usePackageManager } from \"../package-manager\";\nimport type { PackageManifest, PackagesRegistry } from \"../types\";\nimport { adaptManifestInternalDeps } from \"./helpers\";\nimport { writeManifest } from \"./io\";\n\n/**\n * Adapt the output package manifest, so that:\n *\n * - Its internal dependencies point to the isolated ./packages/* directory.\n * - The devDependencies are possibly removed\n * - Scripts are picked or omitted and otherwise removed\n */\nexport async function adaptTargetPackageManifest(\n manifest: PackageManifest,\n packagesRegistry: PackagesRegistry,\n isolateDir: string\n) {\n const packageManager = usePackageManager();\n const { includeDevDependencies, forceNpm, pickFromScripts, omitFromScripts } =\n useConfig();\n\n /** Dev dependencies are omitted by default */\n const inputManifest = includeDevDependencies\n ? manifest\n : omit([\"devDependencies\"], manifest);\n\n const adaptedManifest =\n packageManager.name === \"pnpm\" && !forceNpm\n ? /**\n * For PNPM the output itself is a workspace so we can preserve the specifiers\n * with \"workspace:*\" in the output manifest.\n */\n inputManifest\n : /** For other package managers we replace the links to internal dependencies */\n adaptManifestInternalDeps({\n manifest: inputManifest,\n packagesRegistry,\n });\n\n const outputManifest = {\n ...adaptedManifest,\n /**\n * Scripts are removed by default if not explicitly picked or omitted via\n * config.\n */\n scripts: pickFromScripts\n ? pick(pickFromScripts as never[], manifest.scripts)\n : omitFromScripts\n ? omit(omitFromScripts as never[], manifest.scripts)\n : undefined,\n };\n\n await writeManifest(isolateDir, outputManifest);\n}\n","import path from \"node:path\";\nimport { omit } from \"ramda\";\nimport { useConfig } from \"~/lib/config\";\nimport { usePackageManager } from \"~/lib/package-manager\";\nimport type { PackagesRegistry } from \"~/lib/types\";\nimport { writeManifest } from \"../io\";\nimport { adaptManifestInternalDeps } from \"./adapt-manifest-internal-deps\";\n\n/**\n * Adapt the manifest files of all the isolated internal packages (excluding the\n * target package), so that their dependencies point to the other isolated\n * packages in the same folder.\n */\nexport async function adaptInternalPackageManifests(\n internalPackageNames: string[],\n packagesRegistry: PackagesRegistry,\n isolateDir: string\n) {\n const packageManager = usePackageManager();\n const { includeDevDependencies, forceNpm } = useConfig();\n\n await Promise.all(\n internalPackageNames.map(async (packageName) => {\n const { manifest, rootRelativeDir } = packagesRegistry[packageName];\n\n /**\n * Dev dependencies are omitted by default. And also, for internal\n * dependencies we want to omit the peerDependencies, because installing\n * these is the responsibility of the consuming app / service, and\n * otherwise the frozen lockfile install will error since the package file\n * contains something that is not referenced in the lockfile.\n */\n const inputManifest = includeDevDependencies\n ? omit([\"peerDependencies\"], manifest)\n : omit([\"devDependencies\", \"peerDependencies\"], manifest);\n\n const outputManifest =\n packageManager.name === \"pnpm\" && !forceNpm\n ? /**\n * For PNPM the output itself is a workspace so we can preserve the specifiers\n * with \"workspace:*\" in the output manifest.\n */\n inputManifest\n : adaptManifestInternalDeps({\n manifest,\n packagesRegistry,\n parentRootRelativeDir: rootRelativeDir,\n });\n\n await writeManifest(\n path.join(isolateDir, rootRelativeDir),\n outputManifest\n );\n })\n );\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport type { PackageManifest } from \"../types\";\nimport { readTypedJson } from \"../utils\";\n\nexport async function readManifest(packageDir: string) {\n return readTypedJson<PackageManifest>(path.join(packageDir, \"package.json\"));\n}\n\nexport async function writeManifest(\n outputDir: string,\n manifest: PackageManifest\n) {\n await fs.writeFile(\n path.join(outputDir, \"package.json\"),\n JSON.stringify(manifest, null, 2)\n );\n}\n","import path from \"node:path\";\nimport { useLogger } from \"../../logger\";\nimport type { PackagesRegistry } from \"../../types\";\n\nexport function patchInternalEntries(\n dependencies: Record<string, string>,\n packagesRegistry: PackagesRegistry,\n parentRootRelativeDir?: string\n) {\n const log = useLogger();\n const allWorkspacePackageNames = Object.keys(packagesRegistry);\n\n return Object.fromEntries(\n Object.entries(dependencies).map(([key, value]) => {\n if (allWorkspacePackageNames.includes(key)) {\n const def = packagesRegistry[key];\n\n /**\n * When nested internal dependencies are used (internal packages linking\n * to other internal packages), the parentRootRelativeDir will be passed\n * in, and we store the relative path to the isolate/packages\n * directory.\n *\n * For consistency we also write the other file paths starting with ./,\n * but it doesn't seem to be necessary for any package manager.\n */\n const relativePath = parentRootRelativeDir\n ? path.relative(parentRootRelativeDir, `./${def.rootRelativeDir}`)\n : `./${def.rootRelativeDir}`;\n\n const linkPath = `file:${relativePath}`;\n\n log.debug(`Linking dependency ${key} to ${linkPath}`);\n\n return [key, linkPath];\n } else {\n return [key, value];\n }\n })\n );\n}\n","import type { PackageManifest, PackagesRegistry } from \"~/lib/types\";\nimport { patchInternalEntries } from \"./patch-internal-entries\";\n\n/**\n * Replace the workspace version specifiers for internal dependency with file:\n * paths. Not needed for PNPM (because we configure the isolated output as a\n * workspace), but maybe still for NPM and Yarn.\n */\nexport function adaptManifestInternalDeps({\n manifest,\n packagesRegistry,\n parentRootRelativeDir,\n}: {\n manifest: PackageManifest;\n packagesRegistry: PackagesRegistry;\n parentRootRelativeDir?: string;\n}): PackageManifest {\n const { dependencies, devDependencies } = manifest;\n\n return {\n ...manifest,\n dependencies: dependencies\n ? patchInternalEntries(\n dependencies,\n packagesRegistry,\n parentRootRelativeDir\n )\n : undefined,\n devDependencies: devDependencies\n ? patchInternalEntries(\n devDependencies,\n packagesRegistry,\n parentRootRelativeDir\n )\n : undefined,\n };\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport outdent from \"outdent\";\nimport { useConfig } from \"../config\";\nimport { useLogger } from \"../logger\";\nimport { readTypedJson } from \"../utils\";\n\nexport async function getBuildOutputDir(targetPackageDir: string) {\n const config = useConfig();\n const log = useLogger();\n\n if (config.buildDirName) {\n log.debug(\"Using buildDirName from config:\", config.buildDirName);\n return path.join(targetPackageDir, config.buildDirName);\n }\n\n const tsconfigPath = path.join(targetPackageDir, config.tsconfigPath);\n\n if (fs.existsSync(tsconfigPath)) {\n log.debug(\"Found tsconfig at:\", config.tsconfigPath);\n\n const tsconfig = await readTypedJson<{\n compilerOptions?: { outDir?: string };\n }>(tsconfigPath);\n\n const outDir = tsconfig.compilerOptions?.outDir;\n\n if (outDir) {\n return path.join(targetPackageDir, outDir);\n } else {\n throw new Error(outdent`\n Failed to find outDir in tsconfig. If you are executing isolate from the root of a monorepo you should specify the buildDirName in isolate.config.json.\n `);\n }\n } else {\n log.warn(\"Failed to find tsconfig at:\", tsconfigPath);\n\n throw new Error(outdent`\n Failed to infer the build output directory from either the isolate config buildDirName or a Typescript config file. See the documentation on how to configure one of these options.\n `);\n }\n}\n","import assert from \"node:assert\";\nimport { useLogger } from \"../logger\";\nimport { usePackageManager } from \"../package-manager\";\nimport type { PackagesRegistry } from \"../types\";\nimport { pack } from \"../utils\";\n\n/**\n * Pack dependencies so that we extract only the files that are supposed to be\n * published by the packages.\n *\n * @returns A map of package names to the path of the packed file\n */\nexport async function packDependencies({\n /** All packages found in the monorepo by workspaces declaration */\n packagesRegistry,\n /** The dependencies that appear to be internal packages */\n internalPackageNames,\n /**\n * The directory where the isolated package and all its dependencies will end\n * up. This is also the directory from where the package will be deployed. By\n * default it is a subfolder in targetPackageDir called \"isolate\" but you can\n * configure it.\n */\n packDestinationDir,\n}: {\n packagesRegistry: PackagesRegistry;\n internalPackageNames: string[];\n packDestinationDir: string;\n}) {\n const log = useLogger();\n\n const packedFileByName: Record<string, string> = {};\n\n const { name, version } = usePackageManager();\n\n const versionMajor = parseInt(version.split(\".\")[0], 10);\n\n const usePnpmPack = name === \"pnpm\" && versionMajor >= 8;\n\n if (usePnpmPack) {\n log.debug(\"Using PNPM pack instead of NPM pack\");\n }\n\n for (const dependency of internalPackageNames) {\n const def = packagesRegistry[dependency];\n\n assert(dependency, `Failed to find package definition for ${dependency}`);\n\n const { name } = def.manifest;\n\n /**\n * If this dependency has already been packed, we skip it. It could happen\n * because we are packing workspace dependencies recursively.\n */\n if (packedFileByName[name]) {\n log.debug(`Skipping ${name} because it has already been packed`);\n continue;\n }\n\n packedFileByName[name] = await pack(\n def.absoluteDir,\n packDestinationDir,\n usePnpmPack\n );\n }\n\n return packedFileByName;\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { useLogger } from \"../logger\";\nimport { pack, unpack } from \"../utils\";\n\nconst TIMEOUT_MS = 5000;\n\nexport async function processBuildOutputFiles({\n targetPackageDir,\n tmpDir,\n isolateDir,\n}: {\n targetPackageDir: string;\n tmpDir: string;\n isolateDir: string;\n}) {\n const log = useLogger();\n const packedFilePath = await pack(targetPackageDir, tmpDir);\n const unpackDir = path.join(tmpDir, \"target\");\n\n const now = Date.now();\n let isWaitingYet = false;\n\n while (!fs.existsSync(packedFilePath) && Date.now() - now < TIMEOUT_MS) {\n if (!isWaitingYet) {\n log.debug(`Waiting for ${packedFilePath} to become available...`);\n }\n isWaitingYet = true;\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n await unpack(packedFilePath, unpackDir);\n await fs.copy(path.join(unpackDir, \"package\"), isolateDir);\n}\n","import fs from \"fs-extra\";\nimport path, { join } from \"node:path\";\nimport { useLogger } from \"../logger\";\nimport type { PackagesRegistry } from \"../types\";\nimport { getIsolateRelativePath, unpack } from \"../utils\";\n\nexport async function unpackDependencies(\n packedFilesByName: Record<string, string>,\n packagesRegistry: PackagesRegistry,\n tmpDir: string,\n isolateDir: string\n) {\n const log = useLogger();\n\n await Promise.all(\n Object.entries(packedFilesByName).map(async ([packageName, filePath]) => {\n const dir = packagesRegistry[packageName].rootRelativeDir;\n const unpackDir = join(tmpDir, dir);\n\n log.debug(\"Unpacking\", `(temp)/${path.basename(filePath)}`);\n\n await unpack(filePath, unpackDir);\n\n const destinationDir = join(isolateDir, dir);\n\n await fs.ensureDir(destinationDir);\n\n await fs.move(join(unpackDir, \"package\"), destinationDir, {\n overwrite: true,\n });\n\n log.debug(\n `Moved package files to ${getIsolateRelativePath(\n destinationDir,\n isolateDir\n )}`\n );\n })\n );\n}\n","import fs from \"fs-extra\";\nimport { globSync } from \"glob\";\nimport path from \"node:path\";\nimport { useLogger } from \"../logger\";\nimport type { PackageManifest, PackagesRegistry } from \"../types\";\nimport { readTypedJson } from \"../utils\";\nimport { findPackagesGlobs } from \"./helpers/find-packages-globs\";\n\n/**\n * Build a list of all packages in the workspace, depending on the package\n * manager used, with a possible override from the config file. The list\n * contains the manifest with some directory info mapped by module name.\n */\nexport async function createPackagesRegistry(\n workspaceRootDir: string,\n workspacePackagesOverride: string[] | undefined\n): Promise<PackagesRegistry> {\n const log = useLogger();\n\n if (workspacePackagesOverride) {\n log.debug(\n `Override workspace packages via config: ${workspacePackagesOverride}`\n );\n }\n\n const packagesGlobs =\n workspacePackagesOverride ?? findPackagesGlobs(workspaceRootDir);\n\n const cwd = process.cwd();\n process.chdir(workspaceRootDir);\n\n const allPackages = packagesGlobs\n .flatMap((glob) => globSync(glob))\n /** Make sure to filter any loose files that might hang around. */\n .filter((dir) => fs.lstatSync(dir).isDirectory());\n\n const registry: PackagesRegistry = (\n await Promise.all(\n allPackages.map(async (rootRelativeDir) => {\n const manifestPath = path.join(rootRelativeDir, \"package.json\");\n\n if (!fs.existsSync(manifestPath)) {\n log.warn(\n `Ignoring directory ./${rootRelativeDir} because it does not contain a package.json file`\n );\n return;\n } else {\n log.debug(`Registering package ./${rootRelativeDir}`);\n\n const manifest = await readTypedJson<PackageManifest>(\n path.join(rootRelativeDir, \"package.json\")\n );\n\n return {\n manifest,\n rootRelativeDir,\n absoluteDir: path.join(workspaceRootDir, rootRelativeDir),\n };\n }\n })\n )\n ).reduce<PackagesRegistry>((acc, info) => {\n if (info) {\n acc[info.manifest.name] = info;\n }\n return acc;\n }, {});\n\n process.chdir(cwd);\n\n return registry;\n}\n","import assert from \"node:assert\";\nimport path from \"node:path\";\nimport { useLogger } from \"../../logger\";\nimport { usePackageManager } from \"../../package-manager\";\nimport {\n inspectValue,\n readTypedJsonSync,\n readTypedYamlSync,\n} from \"../../utils\";\n\n/**\n * Find the globs that define where the packages are located within the\n * monorepo. This configuration is dependent on the package manager used, and I\n * don't know if we're covering all cases yet...\n */\nexport function findPackagesGlobs(workspaceRootDir: string) {\n const log = useLogger();\n\n const packageManager = usePackageManager();\n\n switch (packageManager.name) {\n case \"pnpm\": {\n const { packages: globs } = readTypedYamlSync<{ packages: string[] }>(\n path.join(workspaceRootDir, \"pnpm-workspace.yaml\")\n );\n\n log.debug(\"Detected pnpm packages globs:\", inspectValue(globs));\n return globs;\n }\n case \"yarn\":\n case \"npm\": {\n const workspaceRootManifestPath = path.join(\n workspaceRootDir,\n \"package.json\"\n );\n\n const { workspaces } = readTypedJsonSync<{ workspaces: string[] }>(\n workspaceRootManifestPath\n );\n\n if (!workspaces) {\n throw new Error(\n `No workspaces field found in ${workspaceRootManifestPath}`\n );\n }\n\n if (Array.isArray(workspaces)) {\n return workspaces;\n } else {\n /**\n * For Yarn, workspaces could be defined as an object with { packages:\n * [], nohoist: [] }. See\n * https://classic.yarnpkg.com/blog/2018/02/15/nohoist/\n */\n const workspacesObject = workspaces as { packages?: string[] };\n\n assert(\n workspacesObject.packages,\n \"workspaces.packages must be an array\"\n );\n\n return workspacesObject.packages;\n }\n }\n }\n}\n","import { uniq } from \"ramda\";\nimport type { PackageManifest, PackagesRegistry } from \"../types\";\n\n/**\n * Recursively list all the packages from dependencies (and optionally\n * devDependencies) that are found in the monorepo.\n *\n * Here we do not need to rely on packages being declared with \"workspace:\" in\n * the package manifest. We can simply compare the package names with the list\n * of packages that were found via the workspace glob patterns and add them to\n * the registry.\n */\nexport function listInternalPackages(\n manifest: PackageManifest,\n packagesRegistry: PackagesRegistry,\n { includeDevDependencies = false } = {}\n): string[] {\n const allWorkspacePackageNames = Object.keys(packagesRegistry);\n\n const internalPackageNames = (\n includeDevDependencies\n ? [\n ...Object.keys(manifest.dependencies ?? {}),\n ...Object.keys(manifest.devDependencies ?? {}),\n ]\n : Object.keys(manifest.dependencies ?? {})\n ).filter((name) => allWorkspacePackageNames.includes(name));\n\n const nestedInternalPackageNames = internalPackageNames.flatMap(\n (packageName) =>\n listInternalPackages(\n packagesRegistry[packageName].manifest,\n packagesRegistry,\n { includeDevDependencies }\n )\n );\n\n return uniq(internalPackageNames.concat(nestedInternalPackageNames));\n}\n"],"mappings":"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","names":["fs","assert","path","omit","fs","path","path","fs","stdout","fs","fs","fs","fs","path","fs","fs","path","fs","path","fs","assert","path","path","assert","fs","fs","path","path","fs","assert","path","assert","path","fs","execSync","path","path","fs","execSync","omit","pick","path","fs","path","path","fs","path","path","packageManager","path","packageManager","omit","pick","fs","path","path","fs","assert","assert","name","fs","path","path","fs","fs","path","path","fs","fs","path","assert","path","packageManager","path","assert","fs","path","path","assert","fs","packageManager","omit"]}
|
package/dist/isolate-bin.mjs
CHANGED
|
@@ -101,7 +101,7 @@ function getIsolateRelativePath(path17, isolatePath) {
|
|
|
101
101
|
// src/lib/utils/inspect-value.ts
|
|
102
102
|
import { inspect } from "node:util";
|
|
103
103
|
function inspectValue(value) {
|
|
104
|
-
return inspect(value, false,
|
|
104
|
+
return inspect(value, false, 16, true);
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
// src/lib/utils/json.ts
|
|
@@ -143,7 +143,7 @@ async function pack(srcDir, dstDir, usePnpmPack = false) {
|
|
|
143
143
|
process.chdir(srcDir);
|
|
144
144
|
const stdout = usePnpmPack ? await new Promise((resolve, reject) => {
|
|
145
145
|
exec(
|
|
146
|
-
`pnpm pack --pack-destination ${dstDir}`,
|
|
146
|
+
`pnpm pack --pack-destination "${dstDir}"`,
|
|
147
147
|
execOptions,
|
|
148
148
|
(err, stdout2, stderr) => {
|
|
149
149
|
if (err) {
|
|
@@ -155,7 +155,7 @@ async function pack(srcDir, dstDir, usePnpmPack = false) {
|
|
|
155
155
|
);
|
|
156
156
|
}) : await new Promise((resolve, reject) => {
|
|
157
157
|
exec(
|
|
158
|
-
`npm pack --pack-destination ${dstDir}`,
|
|
158
|
+
`npm pack --pack-destination "${dstDir}"`,
|
|
159
159
|
execOptions,
|
|
160
160
|
(err, stdout2) => {
|
|
161
161
|
if (err) {
|
|
@@ -213,7 +213,7 @@ var configDefaults = {
|
|
|
213
213
|
tsconfigPath: "./tsconfig.json",
|
|
214
214
|
workspacePackages: void 0,
|
|
215
215
|
workspaceRoot: "../..",
|
|
216
|
-
|
|
216
|
+
forceNpm: false,
|
|
217
217
|
pickFromScripts: void 0,
|
|
218
218
|
omitFromScripts: void 0
|
|
219
219
|
};
|
|
@@ -374,7 +374,7 @@ async function generateNpmLockfile({
|
|
|
374
374
|
await fs8.writeFile(lockfilePath, String(meta));
|
|
375
375
|
log.debug("Created lockfile at", lockfilePath);
|
|
376
376
|
} catch (err) {
|
|
377
|
-
|
|
377
|
+
console.error(inspectValue(err));
|
|
378
378
|
log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);
|
|
379
379
|
} finally {
|
|
380
380
|
if (hasMovedNodeModules) {
|
|
@@ -510,9 +510,9 @@ async function processLockfile({
|
|
|
510
510
|
targetPackageDir
|
|
511
511
|
}) {
|
|
512
512
|
const log = useLogger();
|
|
513
|
-
const {
|
|
514
|
-
if (
|
|
515
|
-
log.info("
|
|
513
|
+
const { forceNpm } = useConfig();
|
|
514
|
+
if (forceNpm) {
|
|
515
|
+
log.info("Forcing to use NPM for isolate output");
|
|
516
516
|
await generateNpmLockfile({
|
|
517
517
|
workspaceRootDir,
|
|
518
518
|
isolateDir
|
|
@@ -559,7 +559,12 @@ async function processLockfile({
|
|
|
559
559
|
break;
|
|
560
560
|
}
|
|
561
561
|
default:
|
|
562
|
-
log.warn(`Unexpected package manager ${name}`);
|
|
562
|
+
log.warn(`Unexpected package manager ${name}. Using NPM for output`);
|
|
563
|
+
await generateNpmLockfile({
|
|
564
|
+
workspaceRootDir,
|
|
565
|
+
isolateDir
|
|
566
|
+
});
|
|
567
|
+
usedFallbackToNpm = true;
|
|
563
568
|
}
|
|
564
569
|
return usedFallbackToNpm;
|
|
565
570
|
}
|
|
@@ -629,12 +634,12 @@ function adaptManifestInternalDeps({
|
|
|
629
634
|
// src/lib/manifest/helpers/adapt-internal-package-manifests.ts
|
|
630
635
|
async function adaptInternalPackageManifests(internalPackageNames, packagesRegistry, isolateDir) {
|
|
631
636
|
const packageManager2 = usePackageManager();
|
|
632
|
-
const { includeDevDependencies } = useConfig();
|
|
637
|
+
const { includeDevDependencies, forceNpm } = useConfig();
|
|
633
638
|
await Promise.all(
|
|
634
639
|
internalPackageNames.map(async (packageName) => {
|
|
635
640
|
const { manifest, rootRelativeDir } = packagesRegistry[packageName];
|
|
636
|
-
const inputManifest = includeDevDependencies ? omit(["
|
|
637
|
-
const outputManifest = packageManager2.name === "pnpm" ? (
|
|
641
|
+
const inputManifest = includeDevDependencies ? omit(["peerDependencies"], manifest) : omit(["devDependencies", "peerDependencies"], manifest);
|
|
642
|
+
const outputManifest = packageManager2.name === "pnpm" && !forceNpm ? (
|
|
638
643
|
/**
|
|
639
644
|
* For PNPM the output itself is a workspace so we can preserve the specifiers
|
|
640
645
|
* with "workspace:*" in the output manifest.
|
|
@@ -656,9 +661,9 @@ async function adaptInternalPackageManifests(internalPackageNames, packagesRegis
|
|
|
656
661
|
// src/lib/manifest/adapt-target-package-manifest.ts
|
|
657
662
|
async function adaptTargetPackageManifest(manifest, packagesRegistry, isolateDir) {
|
|
658
663
|
const packageManager2 = usePackageManager();
|
|
659
|
-
const { includeDevDependencies,
|
|
664
|
+
const { includeDevDependencies, forceNpm, pickFromScripts, omitFromScripts } = useConfig();
|
|
660
665
|
const inputManifest = includeDevDependencies ? manifest : omit2(["devDependencies"], manifest);
|
|
661
|
-
const adaptedManifest = packageManager2.name === "pnpm" && !
|
|
666
|
+
const adaptedManifest = packageManager2.name === "pnpm" && !forceNpm ? (
|
|
662
667
|
/**
|
|
663
668
|
* For PNPM the output itself is a workspace so we can preserve the specifiers
|
|
664
669
|
* with "workspace:*" in the output manifest.
|
|
@@ -728,12 +733,11 @@ async function packDependencies({
|
|
|
728
733
|
*/
|
|
729
734
|
packDestinationDir
|
|
730
735
|
}) {
|
|
731
|
-
const config = useConfig();
|
|
732
736
|
const log = useLogger();
|
|
733
737
|
const packedFileByName = {};
|
|
734
738
|
const { name, version } = usePackageManager();
|
|
735
739
|
const versionMajor = parseInt(version.split(".")[0], 10);
|
|
736
|
-
const usePnpmPack =
|
|
740
|
+
const usePnpmPack = name === "pnpm" && versionMajor >= 8;
|
|
737
741
|
if (usePnpmPack) {
|
|
738
742
|
log.debug("Using PNPM pack instead of NPM pack");
|
|
739
743
|
}
|
|
@@ -1011,7 +1015,7 @@ async function isolate(options = {}) {
|
|
|
1011
1015
|
const outputManifest = omit3(["packageManager"], inputManifest);
|
|
1012
1016
|
await writeManifest(isolateDir, outputManifest);
|
|
1013
1017
|
}
|
|
1014
|
-
if (packageManager2.name === "pnpm" && !config.
|
|
1018
|
+
if (packageManager2.name === "pnpm" && !config.forceNpm) {
|
|
1015
1019
|
fs15.copyFileSync(
|
|
1016
1020
|
path16.join(workspaceRootDir, "pnpm-workspace.yaml"),
|
|
1017
1021
|
path16.join(isolateDir, "pnpm-workspace.yaml")
|
package/dist/isolate-bin.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/isolate-bin.ts","../src/isolate.ts","../src/lib/config.ts","../src/lib/logger.ts","../src/lib/utils/get-dirname.ts","../src/lib/utils/get-error-message.ts","../src/lib/utils/get-relative-path.ts","../src/lib/utils/inspect-value.ts","../src/lib/utils/json.ts","../src/lib/utils/pack.ts","../src/lib/utils/unpack.ts","../src/lib/utils/yaml.ts","../src/lib/lockfile/process-lockfile.ts","../src/lib/package-manager/helpers/infer-from-files.ts","../src/lib/package-manager/names.ts","../src/lib/package-manager/helpers/infer-from-manifest.ts","../src/lib/package-manager/index.ts","../src/lib/lockfile/helpers/generate-npm-lockfile.ts","../src/lib/lockfile/helpers/generate-pnpm-lockfile.ts","../src/lib/lockfile/helpers/generate-yarn-lockfile.ts","../src/lib/manifest/adapt-target-package-manifest.ts","../src/lib/manifest/helpers/adapt-internal-package-manifests.ts","../src/lib/manifest/io.ts","../src/lib/manifest/helpers/patch-internal-entries.ts","../src/lib/manifest/helpers/adapt-manifest-internal-deps.ts","../src/lib/output/get-build-output-dir.ts","../src/lib/output/pack-dependencies.ts","../src/lib/output/process-build-output-files.ts","../src/lib/output/unpack-dependencies.ts","../src/lib/registry/create-packages-registry.ts","../src/lib/registry/helpers/find-packages-globs.ts","../src/lib/registry/list-internal-packages.ts"],"sourcesContent":["#!/usr/bin/env node\nimport console from \"node:console\";\nimport sourceMaps from \"source-map-support\";\nimport { isolate } from \"./isolate\";\n\nsourceMaps.install();\n\nasync function run() {\n await isolate();\n}\n\nrun().catch((err) => {\n if (err instanceof Error) {\n console.error(err.stack);\n process.exit(1);\n } else {\n console.error(err);\n }\n});\n","import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { omit } from \"ramda\";\nimport type { IsolateConfig } from \"./lib/config\";\nimport { resolveConfig, setUserConfig } from \"./lib/config\";\nimport { processLockfile } from \"./lib/lockfile\";\nimport type { Logger } from \"./lib/logger\";\nimport { setLogLevel, setLogger, useLogger } from \"./lib/logger\";\nimport {\n adaptInternalPackageManifests,\n adaptTargetPackageManifest,\n readManifest,\n writeManifest,\n} from \"./lib/manifest\";\nimport {\n getBuildOutputDir,\n packDependencies,\n processBuildOutputFiles,\n unpackDependencies,\n} from \"./lib/output\";\nimport { detectPackageManager } from \"./lib/package-manager\";\nimport { createPackagesRegistry, listInternalPackages } from \"./lib/registry\";\nimport type { PackageManifest } from \"./lib/types\";\nimport { getDirname, getRootRelativePath, readTypedJson } from \"./lib/utils\";\n\nconst __dirname = getDirname(import.meta.url);\n\nexport async function isolate(\n options: { config?: IsolateConfig; logger?: Logger } = {}\n) {\n if (options.logger) {\n setLogger(options.logger);\n }\n\n if (options.config) {\n setUserConfig(options.config);\n }\n\n const config = resolveConfig();\n\n setLogLevel(config.logLevel);\n\n const log = useLogger();\n\n const thisPackageManifest = await readTypedJson<PackageManifest>(\n path.join(path.join(__dirname, \"..\", \"package.json\"))\n );\n\n log.debug(\"Using isolate-package version\", thisPackageManifest.version);\n\n /**\n * If a targetPackagePath is set, we assume the configuration lives in the\n * root of the workspace. If targetPackagePath is undefined (the default), we\n * assume that the configuration lives in the target package directory.\n */\n const targetPackageDir = config.targetPackagePath\n ? path.join(process.cwd(), config.targetPackagePath)\n : process.cwd();\n\n /**\n * We want a trailing slash here. Functionally it doesn't matter, but it makes\n * the relative paths more correct in the debug output.\n */\n const workspaceRootDir = config.targetPackagePath\n ? process.cwd()\n : path.join(targetPackageDir, config.workspaceRoot);\n\n const buildOutputDir = await getBuildOutputDir(targetPackageDir);\n\n assert(\n fs.existsSync(buildOutputDir),\n `Failed to find build output path at ${buildOutputDir}. Please make sure you build the source before isolating it.`\n );\n\n log.debug(\"Workspace root resolved to\", workspaceRootDir);\n log.debug(\n \"Isolate target package\",\n getRootRelativePath(targetPackageDir, workspaceRootDir)\n );\n\n const isolateDir = path.join(targetPackageDir, config.isolateDirName);\n\n log.debug(\n \"Isolate output directory\",\n getRootRelativePath(isolateDir, workspaceRootDir)\n );\n\n if (fs.existsSync(isolateDir)) {\n await fs.remove(isolateDir);\n log.debug(\"Cleaned the existing isolate output directory\");\n }\n\n await fs.ensureDir(isolateDir);\n\n const tmpDir = path.join(isolateDir, \"__tmp\");\n await fs.ensureDir(tmpDir);\n\n const targetPackageManifest = await readTypedJson<PackageManifest>(\n path.join(targetPackageDir, \"package.json\")\n );\n\n const packageManager = detectPackageManager(workspaceRootDir);\n\n log.debug(\n \"Detected package manager\",\n packageManager.name,\n packageManager.version\n );\n\n /**\n * Build a packages registry so we can find the workspace packages by name and\n * have access to their manifest files and relative paths.\n */\n const packagesRegistry = await createPackagesRegistry(\n workspaceRootDir,\n config.workspacePackages\n );\n\n const internalPackageNames = listInternalPackages(\n targetPackageManifest,\n packagesRegistry,\n {\n includeDevDependencies: config.includeDevDependencies,\n }\n );\n\n const packedFilesByName = await packDependencies({\n internalPackageNames,\n packagesRegistry,\n packDestinationDir: tmpDir,\n });\n\n await unpackDependencies(\n packedFilesByName,\n packagesRegistry,\n tmpDir,\n isolateDir\n );\n\n /** Adapt the manifest files for all the unpacked local dependencies */\n await adaptInternalPackageManifests(\n internalPackageNames,\n packagesRegistry,\n isolateDir\n );\n\n /** Pack the target package directory, and unpack it in the isolate location */\n await processBuildOutputFiles({\n targetPackageDir,\n tmpDir,\n isolateDir,\n });\n\n /**\n * Copy the target manifest file to the isolate location and adapt its\n * workspace dependencies to point to the isolated packages.\n */\n await adaptTargetPackageManifest(\n targetPackageManifest,\n packagesRegistry,\n isolateDir\n );\n\n /** Generate an isolated lockfile based on the original one */\n const usedFallbackToNpm = await processLockfile({\n workspaceRootDir,\n isolateDir,\n packagesRegistry,\n internalDepPackageNames: internalPackageNames,\n targetPackageDir,\n targetPackageName: targetPackageManifest.name,\n });\n\n if (usedFallbackToNpm) {\n const inputManifest = await readManifest(isolateDir);\n\n const outputManifest = omit([\"packageManager\"], inputManifest);\n\n await writeManifest(isolateDir, outputManifest);\n }\n\n if (packageManager.name === \"pnpm\" && !config.useNpm) {\n /**\n * PNPM doesn't install dependencies of packages that are linked via link:\n * or file: specifiers. It requires the directory to be configured as a\n * workspace, so we copy the workspace config file to the isolate output.\n */\n fs.copyFileSync(\n path.join(workspaceRootDir, \"pnpm-workspace.yaml\"),\n path.join(isolateDir, \"pnpm-workspace.yaml\")\n );\n }\n /**\n * If there is an .npmrc file in the workspace root, copy it to the isolate\n * because the settings there could affect how the lockfile is resolved. Note\n * that .npmrc is used by both NPM and PNPM for configuration.\n *\n * See also: https://pnpm.io/npmrc\n */\n const npmrcPath = path.join(workspaceRootDir, \".npmrc\");\n\n if (fs.existsSync(npmrcPath)) {\n fs.copyFileSync(npmrcPath, path.join(isolateDir, \".npmrc\"));\n log.debug(\"Copied .npmrc file to the isolate output\");\n }\n\n /**\n * Clean up. Only so this in the happy path, so we can look at the temp folder\n * when thing go wrong.\n */\n log.debug(\n \"Deleting temp directory\",\n getRootRelativePath(tmpDir, workspaceRootDir)\n );\n await fs.remove(tmpDir);\n\n log.info(\"Isolate completed at\", isolateDir);\n\n return isolateDir;\n}\n","import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { isEmpty } from \"ramda\";\nimport { setLogLevel, useLogger } from \"./logger\";\nimport { inspectValue, readTypedJsonSync } from \"./utils\";\n\nexport type IsolateConfigResolved = {\n buildDirName?: string;\n includeDevDependencies: boolean;\n isolateDirName: string;\n logLevel: \"info\" | \"debug\" | \"warn\" | \"error\";\n targetPackagePath?: string;\n tsconfigPath: string;\n workspacePackages?: string[];\n workspaceRoot: string;\n useNpm: boolean;\n pickFromScripts?: string[];\n omitFromScripts?: string[];\n};\n\nexport type IsolateConfig = Partial<IsolateConfigResolved>;\n\nconst configDefaults: IsolateConfigResolved = {\n buildDirName: undefined,\n includeDevDependencies: false,\n isolateDirName: \"isolate\",\n logLevel: \"info\",\n targetPackagePath: undefined,\n tsconfigPath: \"./tsconfig.json\",\n workspacePackages: undefined,\n workspaceRoot: \"../..\",\n useNpm: false,\n pickFromScripts: undefined,\n omitFromScripts: undefined,\n};\n\n/**\n * Only initialize the configuration once, and keeping it here for subsequent\n * calls to getConfig.\n */\nlet _resolvedConfig: IsolateConfigResolved | undefined;\n\nlet _user_defined_config: IsolateConfig | undefined;\n\nconst validConfigKeys = Object.keys(configDefaults);\n\nconst CONFIG_FILE_NAME = \"isolate.config.json\";\n\nexport type LogLevel = IsolateConfigResolved[\"logLevel\"];\n\nexport function setUserConfig(config: IsolateConfig) {\n _user_defined_config = config;\n\n if (config.logLevel) {\n setLogLevel(config.logLevel);\n }\n}\n\nexport function useConfig() {\n if (_resolvedConfig) {\n return _resolvedConfig;\n } else {\n throw new Error(\"Called useConfig before config was made available\");\n }\n}\n\n/**\n * Resolve configuration based on user config and defaults. If setConfig was\n * called before this, it does not attempt to read a config file from disk.\n */\nexport function resolveConfig(): IsolateConfigResolved {\n if (_resolvedConfig) {\n return _resolvedConfig;\n }\n\n setLogLevel(process.env.DEBUG_ISOLATE_CONFIG ? \"debug\" : \"info\");\n\n const log = useLogger();\n\n const configFilePath = path.join(process.cwd(), CONFIG_FILE_NAME);\n\n if (_user_defined_config) {\n log.debug(`Using user defined config:`, inspectValue(_user_defined_config));\n } else {\n log.debug(`Attempting to load config from ${configFilePath}`);\n\n _user_defined_config = fs.existsSync(configFilePath)\n ? readTypedJsonSync<IsolateConfig>(configFilePath)\n : {};\n }\n\n const foreignKeys = Object.keys(_user_defined_config).filter(\n (key) => !validConfigKeys.includes(key)\n );\n\n if (!isEmpty(foreignKeys)) {\n log.warn(`Found invalid config settings:`, foreignKeys.join(\", \"));\n }\n\n const config = Object.assign(\n {},\n configDefaults,\n _user_defined_config\n ) satisfies IsolateConfigResolved;\n\n log.debug(\"Using configuration:\", inspectValue(config));\n\n _resolvedConfig = config;\n return config;\n}\n\n/**\n * Get only the configuration that the user set explicitly in the config file or\n * passed via arguments to isolate().\n */\nexport function getUserDefinedConfig(): IsolateConfig {\n assert(\n _user_defined_config,\n \"Called getUserDefinedConfig before user config was made available\"\n );\n\n return _user_defined_config;\n}\n","import chalk from \"chalk\";\nimport type { IsolateConfigResolved, LogLevel } from \"./config\";\n/**\n * The Logger defines an interface that can be used to pass in a different\n * logger object in order to intercept all the logging output. We keep the\n * handlers separate from the logger object itself, so that we can change the\n * handlers but do not bother the user with having to handle logLevel.\n */\nexport type Logger = {\n debug(...args: unknown[]): void;\n info(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n};\n\nlet _loggerHandlers: Logger = {\n debug(...args: unknown[]) {\n console.log(chalk.blue(\"debug\"), ...args);\n },\n info(...args: unknown[]) {\n console.log(chalk.green(\"info\"), ...args);\n },\n warn(...args: unknown[]) {\n console.log(chalk.yellow(\"warning\"), ...args);\n },\n error(...args: unknown[]) {\n console.log(chalk.red(\"error\"), ...args);\n },\n};\n\nconst _logger: Logger = {\n debug(...args: unknown[]) {\n if (_logLevel === \"debug\") {\n _loggerHandlers.debug(...args);\n }\n },\n info(...args: unknown[]) {\n if (_logLevel === \"debug\" || _logLevel === \"info\") {\n _loggerHandlers.info(...args);\n }\n },\n warn(...args: unknown[]) {\n if (_logLevel === \"debug\" || _logLevel === \"info\" || _logLevel === \"warn\") {\n _loggerHandlers.warn(...args);\n }\n },\n error(...args: unknown[]) {\n _loggerHandlers.error(...args);\n },\n};\n\nlet _logLevel: LogLevel = \"info\";\n\nexport function setLogger(logger: Logger) {\n _loggerHandlers = logger;\n return _logger;\n}\n\nexport function setLogLevel(\n logLevel: IsolateConfigResolved[\"logLevel\"]\n): Logger {\n _logLevel = logLevel;\n return _logger;\n}\n\nexport function useLogger() {\n return _logger;\n}\n","import { fileURLToPath } from \"url\";\n\n/**\n * Calling context should pass in import.meta.url and the function will return\n * the equivalent of __dirname in Node/CommonJs.\n */\nexport function getDirname(importMetaUrl: string) {\n return fileURLToPath(new URL(\".\", importMetaUrl));\n}\n","type ErrorWithMessage = {\n message: string;\n};\n\nexport function getErrorMessage(error: unknown) {\n return toErrorWithMessage(error).message;\n}\n\nfunction isErrorWithMessage(error: unknown): error is ErrorWithMessage {\n return typeof error === \"object\" && error !== null && \"message\" in error;\n}\n\nfunction toErrorWithMessage(maybeError: unknown): ErrorWithMessage {\n if (isErrorWithMessage(maybeError)) return maybeError;\n\n try {\n return new Error(JSON.stringify(maybeError));\n } catch {\n /**\n * Fallback in case there’s an error stringifying the maybeError like with\n * circular references.\n */\n return new Error(String(maybeError));\n }\n}\n","export function getRootRelativePath(path: string, rootPath: string) {\n const strippedPath = path.replace(rootPath, \"\");\n\n return strippedPath.startsWith(\"/\")\n ? `(root)${strippedPath}`\n : `(root)/${strippedPath}`;\n}\n\nexport function getIsolateRelativePath(path: string, isolatePath: string) {\n const strippedPath = path.replace(isolatePath, \"\");\n\n return strippedPath.startsWith(\"/\")\n ? `(isolate)${strippedPath}`\n : `(isolate)/${strippedPath}`;\n}\n","import { inspect } from \"node:util\";\nimport type { JsonValue } from \"type-fest\";\n\nexport function inspectValue(value: JsonValue) {\n return inspect(value, false, 4, true);\n}\n","import fs from \"fs-extra\";\nimport stripJsonComments from \"strip-json-comments\";\nimport { getErrorMessage } from \"./get-error-message\";\n\n/** @todo Pass in zod schema and validate */\nexport function readTypedJsonSync<T>(filePath: string) {\n try {\n const rawContent = fs.readFileSync(filePath, \"utf-8\");\n const data = JSON.parse(stripJsonComments(rawContent)) as T;\n return data;\n } catch (err) {\n throw new Error(\n `Failed to read JSON from ${filePath}: ${getErrorMessage(err)}`\n );\n }\n}\n\nexport async function readTypedJson<T>(filePath: string) {\n try {\n const rawContent = await fs.readFile(filePath, \"utf-8\");\n const data = JSON.parse(rawContent) as T;\n return data;\n } catch (err) {\n throw new Error(\n `Failed to read JSON from ${filePath}: ${getErrorMessage(err)}`\n );\n }\n}\n","import fs from \"fs-extra\";\nimport { exec } from \"node:child_process\";\nimport path from \"node:path\";\nimport { useLogger } from \"../logger\";\n\nexport async function pack(\n srcDir: string,\n dstDir: string,\n usePnpmPack = false\n) {\n const execOptions = {\n maxBuffer: 10 * 1024 * 1024,\n };\n\n const log = useLogger();\n\n const previousCwd = process.cwd();\n process.chdir(srcDir);\n\n /**\n * PNPM pack seems to be a lot faster than NPM pack, so when PNPM is detected\n * we use that instead.\n */\n const stdout = usePnpmPack\n ? await new Promise<string>((resolve, reject) => {\n exec(\n `pnpm pack --pack-destination ${dstDir}`,\n execOptions,\n (err, stdout, stderr) => {\n if (err) {\n log.error(stderr);\n return reject(err);\n }\n\n resolve(stdout);\n }\n );\n })\n : await new Promise<string>((resolve, reject) => {\n exec(\n `npm pack --pack-destination ${dstDir}`,\n execOptions,\n (err, stdout) => {\n if (err) {\n return reject(err);\n }\n\n resolve(stdout);\n }\n );\n });\n\n const fileName = path.basename(stdout.trim());\n\n const filePath = path.join(dstDir, fileName);\n\n if (!fs.existsSync(filePath)) {\n log.error(\n `The response from pack could not be resolved to an existing file: ${filePath}`\n );\n } else {\n log.debug(`Packed (temp)/${fileName}`);\n }\n\n process.chdir(previousCwd);\n\n /**\n * Return the path anyway even if it doesn't validate. A later stage will wait\n * for the file to occur still. Not sure if this makes sense. Maybe we should\n * stop at the validation error...\n */\n return filePath;\n}\n","import fs from \"fs-extra\";\nimport tar from \"tar-fs\";\nimport { createGunzip } from \"zlib\";\n\nexport async function unpack(filePath: string, unpackDir: string) {\n await new Promise<void>((resolve, reject) => {\n fs.createReadStream(filePath)\n .pipe(createGunzip())\n .pipe(tar.extract(unpackDir))\n .on(\"finish\", () => resolve())\n .on(\"error\", (err) => reject(err));\n });\n}\n","import fs from \"fs-extra\";\nimport yaml from \"yaml\";\nimport { getErrorMessage } from \"./get-error-message\";\n\nexport function readTypedYamlSync<T>(filePath: string) {\n try {\n const rawContent = fs.readFileSync(filePath, \"utf-8\");\n const data = yaml.parse(rawContent);\n /** @todo Add some zod validation maybe */\n return data as T;\n } catch (err) {\n throw new Error(\n `Failed to read YAML from ${filePath}: ${getErrorMessage(err)}`\n );\n }\n}\n\nexport function writeTypedYamlSync<T>(filePath: string, content: T) {\n /** @todo Add some zod validation maybe */\n fs.writeFileSync(filePath, yaml.stringify(content), \"utf-8\");\n}\n","import type {\n ProjectSnapshot,\n ResolvedDependencies,\n} from \"@pnpm/lockfile-file\";\nimport { mapObjIndexed } from \"ramda\";\nimport { useConfig } from \"../config\";\nimport { useLogger } from \"../logger\";\nimport { usePackageManager } from \"../package-manager\";\nimport type { PackagesRegistry } from \"../types\";\nimport { generateNpmLockfile } from \"./helpers/generate-npm-lockfile\";\nimport { generatePnpmLockfile } from \"./helpers/generate-pnpm-lockfile\";\nimport { generateYarnLockfile } from \"./helpers/generate-yarn-lockfile\";\n\n/** Convert dependency links */\nexport function pnpmMapImporter(\n { dependencies, devDependencies, ...rest }: ProjectSnapshot,\n {\n includeDevDependencies,\n directoryByPackageName,\n }: {\n includeDevDependencies: boolean;\n directoryByPackageName: { [packageName: string]: string };\n }\n): ProjectSnapshot {\n return {\n dependencies: dependencies\n ? pnpmMapDependenciesLinks(dependencies, directoryByPackageName)\n : undefined,\n devDependencies:\n includeDevDependencies && devDependencies\n ? pnpmMapDependenciesLinks(devDependencies, directoryByPackageName)\n : undefined,\n ...rest,\n };\n}\n\nfunction pnpmMapDependenciesLinks(\n def: ResolvedDependencies,\n directoryByPackageName: { [packageName: string]: string }\n): ResolvedDependencies {\n return mapObjIndexed(\n (version, name) =>\n version.startsWith(\"link:\")\n ? `link:./${directoryByPackageName[name]}`\n : version,\n def\n );\n}\n\n/**\n * Adapt the lockfile and write it to the isolate directory. Because we keep the\n * structure of packages in the isolate directory the same as they were in the\n * monorepo, the lockfile is largely still correct. The only things that need to\n * be done is to remove the root dependencies and devDependencies, and rename\n * the path to the target package to act as the new root.\n */\nexport async function processLockfile({\n workspaceRootDir,\n packagesRegistry,\n isolateDir,\n internalDepPackageNames,\n targetPackageDir,\n}: {\n workspaceRootDir: string;\n packagesRegistry: PackagesRegistry;\n isolateDir: string;\n internalDepPackageNames: string[];\n targetPackageDir: string;\n targetPackageName: string;\n}) {\n const log = useLogger();\n\n const { useNpm } = useConfig();\n\n if (useNpm) {\n log.info(\"Using NPM for isolate output\");\n\n await generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n });\n\n return true;\n }\n\n const { name, version } = usePackageManager();\n let usedFallbackToNpm = false;\n\n switch (name) {\n case \"npm\": {\n await generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n });\n\n break;\n }\n case \"yarn\": {\n const versionMajor = parseInt(version.split(\".\")[0], 10);\n\n if (versionMajor === 1) {\n await generateYarnLockfile({\n workspaceRootDir,\n isolateDir,\n });\n } else {\n log.info(\n \"Detected modern version of Yarn. Using NPM lockfile fallback.\"\n );\n\n await generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n });\n\n usedFallbackToNpm = true;\n }\n\n break;\n }\n case \"pnpm\": {\n await generatePnpmLockfile({\n workspaceRootDir,\n targetPackageDir,\n isolateDir,\n internalDepPackageNames,\n packagesRegistry,\n });\n break;\n }\n default:\n log.warn(`Unexpected package manager ${name}`);\n }\n\n return usedFallbackToNpm;\n}\n","import fs from \"fs-extra\";\nimport { execSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport type { PackageManager, PackageManagerName } from \"../names\";\nimport { getLockfileFileName, supportedPackageManagerNames } from \"../names\";\n\nexport function inferFromFiles(workspaceRoot: string): PackageManager {\n for (const name of supportedPackageManagerNames) {\n const lockfileName = getLockfileFileName(name);\n\n if (fs.existsSync(path.join(workspaceRoot, lockfileName))) {\n return { name, version: getVersion(name) };\n }\n }\n\n /** If no lockfile was found, it could be that there is an npm shrinkwrap file. */\n if (fs.existsSync(path.join(workspaceRoot, \"npm-shrinkwrap.json\"))) {\n return { name: \"npm\", version: getVersion(\"npm\") };\n }\n\n throw new Error(`Failed to detect package manager`);\n}\nfunction getVersion(packageManagerName: PackageManagerName): string {\n const buffer = execSync(`${packageManagerName} --version`);\n return buffer.toString().trim();\n}\n","export const supportedPackageManagerNames = [\"pnpm\", \"yarn\", \"npm\"] as const;\n\nexport type PackageManagerName = (typeof supportedPackageManagerNames)[number];\n\nexport type PackageManager = {\n name: PackageManagerName;\n version: string;\n};\n\nexport function getLockfileFileName(name: PackageManagerName) {\n switch (name) {\n case \"pnpm\":\n return \"pnpm-lock.yaml\";\n case \"yarn\":\n return \"yarn.lock\";\n case \"npm\":\n return \"package-lock.json\";\n }\n}\n","import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { useLogger } from \"~/lib/logger\";\nimport type { PackageManifest } from \"../../types\";\nimport { readTypedJsonSync } from \"../../utils\";\nimport type { PackageManagerName } from \"../names\";\nimport { getLockfileFileName, supportedPackageManagerNames } from \"../names\";\n\nexport function inferFromManifest(workspaceRoot: string) {\n const log = useLogger();\n\n const rootManifest = readTypedJsonSync<PackageManifest>(\n path.join(workspaceRoot, \"package.json\")\n );\n\n if (!rootManifest.packageManager) {\n log.debug(\"No packageManager field found in root manifest\");\n return;\n }\n\n const [name, version = \"*\"] = rootManifest.packageManager.split(\"@\") as [\n PackageManagerName,\n string,\n ];\n\n assert(\n supportedPackageManagerNames.includes(name),\n `Package manager \"${name}\" is not currently supported`\n );\n\n const lockfileName = getLockfileFileName(name);\n\n assert(\n fs.existsSync(path.join(workspaceRoot, lockfileName)),\n `Manifest declares ${name} to be the packageManager, but failed to find ${lockfileName} in workspace root`\n );\n\n return { name, version };\n}\n","import { inferFromFiles } from \"./helpers/infer-from-files\";\nimport { inferFromManifest } from \"./helpers/infer-from-manifest\";\nimport type { PackageManager } from \"./names\";\n\nexport * from \"./names\";\n\nexport let packageManager: PackageManager | undefined;\n\nexport function usePackageManager() {\n if (!packageManager) {\n throw Error(\n \"No package manager detected. Make sure to call detectPackageManager() before usePackageManager()\"\n );\n }\n\n return packageManager;\n}\n\n/**\n * First we check if the package manager is declared in the manifest. If it is,\n * we get the name and version from there. Otherwise we'll search for the\n * different lockfiles and ask the OS to report the installed version.\n */\nexport function detectPackageManager(workspaceRoot: string): PackageManager {\n /**\n * Disable infer from manifest for now. I doubt it is useful after all but\n * I'll keep the code as a reminder.\n */\n packageManager =\n inferFromManifest(workspaceRoot) ?? inferFromFiles(workspaceRoot);\n\n return packageManager;\n}\n","import Arborist from \"@npmcli/arborist\";\nimport fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { useLogger } from \"~/lib/logger\";\nimport { getErrorMessage } from \"~/lib/utils\";\n\n/**\n * Generate an isolated / pruned lockfile, based on the contents of installed\n * node_modules from the monorepo root plus the adapted package manifest in the\n * isolate directory.\n */\nexport async function generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n}: {\n workspaceRootDir: string;\n isolateDir: string;\n}) {\n const log = useLogger();\n\n log.info(\"Generating NPM lockfile...\");\n\n const origRootNodeModulesPath = path.join(workspaceRootDir, \"node_modules\");\n const tempRootNodeModulesPath = path.join(isolateDir, \"node_modules\");\n\n let hasMovedNodeModules = false;\n\n try {\n if (!fs.existsSync(origRootNodeModulesPath)) {\n throw new Error(\n `Failed to find node_modules at ${origRootNodeModulesPath}`\n );\n }\n\n log.debug(`Temporarily moving node_modules to the isolate output`);\n\n await fs.move(origRootNodeModulesPath, tempRootNodeModulesPath);\n hasMovedNodeModules = true;\n\n const arborist = new Arborist({ path: isolateDir });\n\n log.debug(`Build tree`);\n const { meta } = await arborist.buildIdealTree();\n\n log.debug(`Commit tree`);\n meta?.commit();\n\n const lockfilePath = path.join(isolateDir, \"package-lock.json\");\n\n await fs.writeFile(lockfilePath, String(meta));\n\n log.debug(\"Created lockfile at\", lockfilePath);\n } catch (err: any) {\n log.error(err.stack);\n log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);\n /**\n * If lockfile creation fails we can technically still continue with the\n * rest. Not sure if that is desirable.\n */\n } finally {\n if (hasMovedNodeModules) {\n log.debug(`Restoring node_modules to the workspace root`);\n await fs.move(tempRootNodeModulesPath, origRootNodeModulesPath);\n }\n }\n}\n","import {\n getLockfileImporterId,\n readWantedLockfile,\n writeWantedLockfile,\n} from \"@pnpm/lockfile-file\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { pick } from \"ramda\";\nimport { useConfig } from \"~/lib/config\";\nimport { useLogger } from \"~/lib/logger\";\nimport type { PackagesRegistry } from \"~/lib/types\";\nimport { getErrorMessage } from \"~/lib/utils\";\nimport { pnpmMapImporter } from \"../process-lockfile\";\n\nexport async function generatePnpmLockfile({\n workspaceRootDir,\n targetPackageDir,\n isolateDir,\n internalDepPackageNames,\n packagesRegistry,\n}: {\n workspaceRootDir: string;\n targetPackageDir: string;\n isolateDir: string;\n internalDepPackageNames: string[];\n packagesRegistry: PackagesRegistry;\n}) {\n const { includeDevDependencies } = useConfig();\n const log = useLogger();\n\n log.info(\"Generating PNPM lockfile...\");\n\n try {\n const lockfile = await readWantedLockfile(workspaceRootDir, {\n ignoreIncompatible: false,\n });\n\n assert(lockfile, `No input lockfile found at ${workspaceRootDir}`);\n\n const targetImporterId = getLockfileImporterId(\n workspaceRootDir,\n targetPackageDir\n );\n\n const directoryByPackageName = Object.fromEntries(\n internalDepPackageNames.map((name) => {\n const pkg = packagesRegistry[name];\n assert(pkg, `Package ${name} not found in packages registry`);\n return [name, pkg.rootRelativeDir];\n })\n );\n\n const relevantImporterIds = [\n targetImporterId,\n /**\n * The directory paths happen to correspond with what PNPM calls the\n * importer ids in the context of a lockfile.\n */\n ...Object.values(directoryByPackageName),\n ];\n\n log.debug(\"Relevant importer ids:\", relevantImporterIds);\n\n lockfile.importers = Object.fromEntries(\n Object.entries(pick(relevantImporterIds, lockfile.importers)).map(\n ([importerId, importer]) => {\n if (importerId === targetImporterId) {\n log.debug(\"Setting target package importer on root\");\n\n return [\n \".\",\n pnpmMapImporter(importer, {\n includeDevDependencies,\n directoryByPackageName,\n }),\n ];\n }\n\n log.debug(\"Setting internal package importer:\", importerId);\n\n return [\n importerId,\n pnpmMapImporter(importer, {\n includeDevDependencies,\n directoryByPackageName,\n }),\n ];\n }\n )\n );\n\n await writeWantedLockfile(isolateDir, lockfile);\n\n log.debug(\"Created lockfile at\", path.join(isolateDir, \"pnpm-lock.yaml\"));\n } catch (err) {\n log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);\n }\n}\n","import fs from \"fs-extra\";\nimport { execSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport { useLogger } from \"~/lib/logger\";\nimport { getErrorMessage } from \"~/lib/utils\";\n\n/**\n * Generate an isolated / pruned lockfile, based on the existing lockfile from\n * the monorepo root plus the adapted package manifest in the isolate\n * directory.\n */\nexport async function generateYarnLockfile({\n workspaceRootDir,\n isolateDir,\n}: {\n workspaceRootDir: string;\n isolateDir: string;\n}) {\n const log = useLogger();\n\n log.info(\"Generating Yarn lockfile...\");\n\n const origLockfilePath = path.join(workspaceRootDir, \"yarn.lock\");\n const newLockfilePath = path.join(isolateDir, \"yarn.lock\");\n\n if (!fs.existsSync(origLockfilePath)) {\n throw new Error(`Failed to find lockfile at ${origLockfilePath}`);\n }\n\n log.debug(`Copy original yarn.lock to the isolate output`);\n\n try {\n await fs.copyFile(origLockfilePath, newLockfilePath);\n\n // const origWorkingDirectory = process.cwd();\n\n // process.chdir(isolateDir);\n\n /**\n * Running install with the original lockfile in the same directory will\n * generate a pruned version of the lockfile.\n */\n log.debug(`Running local install`);\n execSync(`yarn install --cwd ${isolateDir}`);\n\n // process.chdir(origWorkingDirectory);\n\n log.debug(\"Generated lockfile at\", newLockfilePath);\n } catch (err) {\n log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);\n /**\n * If lockfile creation fails we can technically still continue with the\n * rest. Not sure if that is desirable.\n */\n }\n}\n","import { omit, pick } from \"ramda\";\nimport { useConfig } from \"../config\";\nimport { usePackageManager } from \"../package-manager\";\nimport type { PackageManifest, PackagesRegistry } from \"../types\";\nimport { adaptManifestInternalDeps } from \"./helpers\";\nimport { writeManifest } from \"./io\";\n\n/**\n * Adapt the output package manifest, so that:\n *\n * - Its internal dependencies point to the isolated ./packages/* directory.\n * - The devDependencies are possibly removed\n * - Scripts are picked or omitted and otherwise removed\n */\nexport async function adaptTargetPackageManifest(\n manifest: PackageManifest,\n packagesRegistry: PackagesRegistry,\n isolateDir: string\n) {\n const packageManager = usePackageManager();\n const { includeDevDependencies, useNpm, pickFromScripts, omitFromScripts } =\n useConfig();\n\n /** Dev dependencies are omitted by default */\n const inputManifest = includeDevDependencies\n ? manifest\n : omit([\"devDependencies\"], manifest);\n\n const adaptedManifest =\n packageManager.name === \"pnpm\" && !useNpm\n ? /**\n * For PNPM the output itself is a workspace so we can preserve the specifiers\n * with \"workspace:*\" in the output manifest.\n */\n inputManifest\n : /** For other package managers we replace the links to internal dependencies */\n adaptManifestInternalDeps({\n manifest: inputManifest,\n packagesRegistry,\n });\n\n const outputManifest = {\n ...adaptedManifest,\n /**\n * Scripts are removed by default if not explicitly picked or omitted via\n * config.\n */\n scripts: pickFromScripts\n ? pick(pickFromScripts as never[], manifest.scripts)\n : omitFromScripts\n ? omit(omitFromScripts as never[], manifest.scripts)\n : undefined,\n };\n\n await writeManifest(isolateDir, outputManifest);\n}\n","import path from \"node:path\";\nimport { omit } from \"ramda\";\nimport { useConfig } from \"~/lib/config\";\nimport { usePackageManager } from \"~/lib/package-manager\";\nimport type { PackagesRegistry } from \"~/lib/types\";\nimport { writeManifest } from \"../io\";\nimport { adaptManifestInternalDeps } from \"./adapt-manifest-internal-deps\";\n\n/**\n * Adapt the manifest files of all the isolated internal packages (excluding the\n * target package), so that their dependencies point to the other isolated\n * packages in the same folder.\n */\nexport async function adaptInternalPackageManifests(\n internalPackageNames: string[],\n packagesRegistry: PackagesRegistry,\n isolateDir: string\n) {\n const packageManager = usePackageManager();\n const { includeDevDependencies } = useConfig();\n\n await Promise.all(\n internalPackageNames.map(async (packageName) => {\n const { manifest, rootRelativeDir } = packagesRegistry[packageName];\n\n /**\n * Dev dependencies are omitted by default. And also, for internal\n * dependencies we want to omit the peerDependencies, because installing\n * these is the responsibility of the consuming app / service, and\n * otherwise the frozen lockfile install will error since the package file\n * contains something that is not referenced in the lockfile.\n */\n const inputManifest = includeDevDependencies\n ? omit([\"xxpeerDependencies\"], manifest)\n : omit([\"devDependencies\", \"xxpeerDependencies\"], manifest);\n\n const outputManifest =\n packageManager.name === \"pnpm\"\n ? /**\n * For PNPM the output itself is a workspace so we can preserve the specifiers\n * with \"workspace:*\" in the output manifest.\n */\n inputManifest\n : adaptManifestInternalDeps({\n manifest,\n packagesRegistry,\n parentRootRelativeDir: rootRelativeDir,\n });\n\n await writeManifest(\n path.join(isolateDir, rootRelativeDir),\n outputManifest\n );\n })\n );\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport type { PackageManifest } from \"../types\";\nimport { readTypedJson } from \"../utils\";\n\nexport async function readManifest(packageDir: string) {\n return readTypedJson<PackageManifest>(path.join(packageDir, \"package.json\"));\n}\n\nexport async function writeManifest(\n outputDir: string,\n manifest: PackageManifest\n) {\n await fs.writeFile(\n path.join(outputDir, \"package.json\"),\n JSON.stringify(manifest, null, 2)\n );\n}\n","import path from \"node:path\";\nimport { useLogger } from \"../../logger\";\nimport type { PackagesRegistry } from \"../../types\";\n\nexport function patchInternalEntries(\n dependencies: Record<string, string>,\n packagesRegistry: PackagesRegistry,\n parentRootRelativeDir?: string\n) {\n const log = useLogger();\n const allWorkspacePackageNames = Object.keys(packagesRegistry);\n\n return Object.fromEntries(\n Object.entries(dependencies).map(([key, value]) => {\n if (allWorkspacePackageNames.includes(key)) {\n const def = packagesRegistry[key];\n\n /**\n * When nested internal dependencies are used (internal packages linking\n * to other internal packages), the parentRootRelativeDir will be passed\n * in, and we store the relative path to the isolate/packages\n * directory.\n *\n * For consistency we also write the other file paths starting with ./,\n * but it doesn't seem to be necessary for any package manager.\n */\n const relativePath = parentRootRelativeDir\n ? path.relative(parentRootRelativeDir, `./${def.rootRelativeDir}`)\n : `./${def.rootRelativeDir}`;\n\n const linkPath = `file:${relativePath}`;\n\n log.debug(`Linking dependency ${key} to ${linkPath}`);\n\n return [key, linkPath];\n } else {\n return [key, value];\n }\n })\n );\n}\n","import type { PackageManifest, PackagesRegistry } from \"~/lib/types\";\nimport { patchInternalEntries } from \"./patch-internal-entries\";\n\n/**\n * Replace the workspace version specifiers for internal dependency with file:\n * paths. Not needed for PNPM (because we configure the isolated output as a\n * workspace), but maybe still for NPM and Yarn.\n */\nexport function adaptManifestInternalDeps({\n manifest,\n packagesRegistry,\n parentRootRelativeDir,\n}: {\n manifest: PackageManifest;\n packagesRegistry: PackagesRegistry;\n parentRootRelativeDir?: string;\n}): PackageManifest {\n const { dependencies, devDependencies } = manifest;\n\n return {\n ...manifest,\n dependencies: dependencies\n ? patchInternalEntries(\n dependencies,\n packagesRegistry,\n parentRootRelativeDir\n )\n : undefined,\n devDependencies: devDependencies\n ? patchInternalEntries(\n devDependencies,\n packagesRegistry,\n parentRootRelativeDir\n )\n : undefined,\n };\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport outdent from \"outdent\";\nimport { useConfig } from \"../config\";\nimport { useLogger } from \"../logger\";\nimport { readTypedJson } from \"../utils\";\n\nexport async function getBuildOutputDir(targetPackageDir: string) {\n const config = useConfig();\n const log = useLogger();\n\n if (config.buildDirName) {\n log.debug(\"Using buildDirName from config:\", config.buildDirName);\n return path.join(targetPackageDir, config.buildDirName);\n }\n\n const tsconfigPath = path.join(targetPackageDir, config.tsconfigPath);\n\n if (fs.existsSync(tsconfigPath)) {\n log.debug(\"Found tsconfig at:\", config.tsconfigPath);\n\n const tsconfig = await readTypedJson<{\n compilerOptions?: { outDir?: string };\n }>(tsconfigPath);\n\n const outDir = tsconfig.compilerOptions?.outDir;\n\n if (outDir) {\n return path.join(targetPackageDir, outDir);\n } else {\n throw new Error(outdent`\n Failed to find outDir in tsconfig. If you are executing isolate from the root of a monorepo you should specify the buildDirName in isolate.config.json.\n `);\n }\n } else {\n log.warn(\"Failed to find tsconfig at:\", tsconfigPath);\n\n throw new Error(outdent`\n Failed to infer the build output directory from either the isolate config buildDirName or a Typescript config file. See the documentation on how to configure one of these options.\n `);\n }\n}\n","import assert from \"node:assert\";\nimport { useConfig } from \"../config\";\nimport { useLogger } from \"../logger\";\nimport { usePackageManager } from \"../package-manager\";\nimport type { PackagesRegistry } from \"../types\";\nimport { pack } from \"../utils\";\n\n/**\n * Pack dependencies so that we extract only the files that are supposed to be\n * published by the packages.\n *\n * @returns A map of package names to the path of the packed file\n */\nexport async function packDependencies({\n /** All packages found in the monorepo by workspaces declaration */\n packagesRegistry,\n /** The dependencies that appear to be internal packages */\n internalPackageNames,\n /**\n * The directory where the isolated package and all its dependencies will end\n * up. This is also the directory from where the package will be deployed. By\n * default it is a subfolder in targetPackageDir called \"isolate\" but you can\n * configure it.\n */\n packDestinationDir,\n}: {\n packagesRegistry: PackagesRegistry;\n internalPackageNames: string[];\n packDestinationDir: string;\n}) {\n const config = useConfig();\n const log = useLogger();\n\n const packedFileByName: Record<string, string> = {};\n\n const { name, version } = usePackageManager();\n\n const versionMajor = parseInt(version.split(\".\")[0], 10);\n\n const usePnpmPack =\n !config.avoidPnpmPack && name === \"pnpm\" && versionMajor >= 8;\n\n if (usePnpmPack) {\n log.debug(\"Using PNPM pack instead of NPM pack\");\n }\n\n for (const dependency of internalPackageNames) {\n const def = packagesRegistry[dependency];\n\n assert(dependency, `Failed to find package definition for ${dependency}`);\n\n const { name } = def.manifest;\n\n /**\n * If this dependency has already been packed, we skip it. It could happen\n * because we are packing workspace dependencies recursively.\n */\n if (packedFileByName[name]) {\n log.debug(`Skipping ${name} because it has already been packed`);\n continue;\n }\n\n packedFileByName[name] = await pack(\n def.absoluteDir,\n packDestinationDir,\n usePnpmPack\n );\n }\n\n return packedFileByName;\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { useLogger } from \"../logger\";\nimport { pack, unpack } from \"../utils\";\n\nconst TIMEOUT_MS = 5000;\n\nexport async function processBuildOutputFiles({\n targetPackageDir,\n tmpDir,\n isolateDir,\n}: {\n targetPackageDir: string;\n tmpDir: string;\n isolateDir: string;\n}) {\n const log = useLogger();\n const packedFilePath = await pack(targetPackageDir, tmpDir);\n const unpackDir = path.join(tmpDir, \"target\");\n\n const now = Date.now();\n let isWaitingYet = false;\n\n while (!fs.existsSync(packedFilePath) && Date.now() - now < TIMEOUT_MS) {\n if (!isWaitingYet) {\n log.debug(`Waiting for ${packedFilePath} to become available...`);\n }\n isWaitingYet = true;\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n await unpack(packedFilePath, unpackDir);\n await fs.copy(path.join(unpackDir, \"package\"), isolateDir);\n}\n","import fs from \"fs-extra\";\nimport path, { join } from \"node:path\";\nimport { useLogger } from \"../logger\";\nimport type { PackagesRegistry } from \"../types\";\nimport { getIsolateRelativePath, unpack } from \"../utils\";\n\nexport async function unpackDependencies(\n packedFilesByName: Record<string, string>,\n packagesRegistry: PackagesRegistry,\n tmpDir: string,\n isolateDir: string\n) {\n const log = useLogger();\n\n await Promise.all(\n Object.entries(packedFilesByName).map(async ([packageName, filePath]) => {\n const dir = packagesRegistry[packageName].rootRelativeDir;\n const unpackDir = join(tmpDir, dir);\n\n log.debug(\"Unpacking\", `(temp)/${path.basename(filePath)}`);\n\n await unpack(filePath, unpackDir);\n\n const destinationDir = join(isolateDir, dir);\n\n await fs.ensureDir(destinationDir);\n\n await fs.move(join(unpackDir, \"package\"), destinationDir, {\n overwrite: true,\n });\n\n log.debug(\n `Moved package files to ${getIsolateRelativePath(\n destinationDir,\n isolateDir\n )}`\n );\n })\n );\n}\n","import fs from \"fs-extra\";\nimport { globSync } from \"glob\";\nimport path from \"node:path\";\nimport { useLogger } from \"../logger\";\nimport type { PackageManifest, PackagesRegistry } from \"../types\";\nimport { readTypedJson } from \"../utils\";\nimport { findPackagesGlobs } from \"./helpers/find-packages-globs\";\n\n/**\n * Build a list of all packages in the workspace, depending on the package\n * manager used, with a possible override from the config file. The list\n * contains the manifest with some directory info mapped by module name.\n */\nexport async function createPackagesRegistry(\n workspaceRootDir: string,\n workspacePackagesOverride: string[] | undefined\n): Promise<PackagesRegistry> {\n const log = useLogger();\n\n if (workspacePackagesOverride) {\n log.debug(\n `Override workspace packages via config: ${workspacePackagesOverride}`\n );\n }\n\n const packagesGlobs =\n workspacePackagesOverride ?? findPackagesGlobs(workspaceRootDir);\n\n const cwd = process.cwd();\n process.chdir(workspaceRootDir);\n\n const allPackages = packagesGlobs\n .flatMap((glob) => globSync(glob))\n /** Make sure to filter any loose files that might hang around. */\n .filter((dir) => fs.lstatSync(dir).isDirectory());\n\n const registry: PackagesRegistry = (\n await Promise.all(\n allPackages.map(async (rootRelativeDir) => {\n const manifestPath = path.join(rootRelativeDir, \"package.json\");\n\n if (!fs.existsSync(manifestPath)) {\n log.warn(\n `Ignoring directory ./${rootRelativeDir} because it does not contain a package.json file`\n );\n return;\n } else {\n log.debug(`Registering package ./${rootRelativeDir}`);\n\n const manifest = await readTypedJson<PackageManifest>(\n path.join(rootRelativeDir, \"package.json\")\n );\n\n return {\n manifest,\n rootRelativeDir,\n absoluteDir: path.join(workspaceRootDir, rootRelativeDir),\n };\n }\n })\n )\n ).reduce<PackagesRegistry>((acc, info) => {\n if (info) {\n acc[info.manifest.name] = info;\n }\n return acc;\n }, {});\n\n process.chdir(cwd);\n\n return registry;\n}\n","import assert from \"node:assert\";\nimport path from \"node:path\";\nimport { useLogger } from \"../../logger\";\nimport { usePackageManager } from \"../../package-manager\";\nimport {\n inspectValue,\n readTypedJsonSync,\n readTypedYamlSync,\n} from \"../../utils\";\n\n/**\n * Find the globs that define where the packages are located within the\n * monorepo. This configuration is dependent on the package manager used, and I\n * don't know if we're covering all cases yet...\n */\nexport function findPackagesGlobs(workspaceRootDir: string) {\n const log = useLogger();\n\n const packageManager = usePackageManager();\n\n switch (packageManager.name) {\n case \"pnpm\": {\n const { packages: globs } = readTypedYamlSync<{ packages: string[] }>(\n path.join(workspaceRootDir, \"pnpm-workspace.yaml\")\n );\n\n log.debug(\"Detected pnpm packages globs:\", inspectValue(globs));\n return globs;\n }\n case \"yarn\":\n case \"npm\": {\n const workspaceRootManifestPath = path.join(\n workspaceRootDir,\n \"package.json\"\n );\n\n const { workspaces } = readTypedJsonSync<{ workspaces: string[] }>(\n workspaceRootManifestPath\n );\n\n if (!workspaces) {\n throw new Error(\n `No workspaces field found in ${workspaceRootManifestPath}`\n );\n }\n\n if (Array.isArray(workspaces)) {\n return workspaces;\n } else {\n /**\n * For Yarn, workspaces could be defined as an object with { packages:\n * [], nohoist: [] }. See\n * https://classic.yarnpkg.com/blog/2018/02/15/nohoist/\n */\n const workspacesObject = workspaces as { packages?: string[] };\n\n assert(\n workspacesObject.packages,\n \"workspaces.packages must be an array\"\n );\n\n return workspacesObject.packages;\n }\n }\n }\n}\n","import { uniq } from \"ramda\";\nimport type { PackageManifest, PackagesRegistry } from \"../types\";\n\n/**\n * Recursively list all the packages from dependencies (and optionally\n * devDependencies) that are found in the monorepo.\n *\n * Here we do not need to rely on packages being declared with \"workspace:\" in\n * the package manifest. We can simply compare the package names with the list\n * of packages that were found via the workspace glob patterns and add them to\n * the registry.\n */\nexport function listInternalPackages(\n manifest: PackageManifest,\n packagesRegistry: PackagesRegistry,\n { includeDevDependencies = false } = {}\n): string[] {\n const allWorkspacePackageNames = Object.keys(packagesRegistry);\n\n const internalPackageNames = (\n includeDevDependencies\n ? [\n ...Object.keys(manifest.dependencies ?? {}),\n ...Object.keys(manifest.devDependencies ?? {}),\n ]\n : Object.keys(manifest.dependencies ?? {})\n ).filter((name) => allWorkspacePackageNames.includes(name));\n\n const nestedInternalPackageNames = internalPackageNames.flatMap(\n (packageName) =>\n listInternalPackages(\n packagesRegistry[packageName].manifest,\n packagesRegistry,\n { includeDevDependencies }\n )\n );\n\n return uniq(internalPackageNames.concat(nestedInternalPackageNames));\n}\n"],"mappings":"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","names":["console","fs","assert","path","omit","fs","path","path","fs","stdout","fs","fs","fs","fs","path","fs","fs","path","fs","path","fs","assert","path","path","assert","fs","fs","path","path","fs","assert","path","assert","path","fs","execSync","path","path","fs","execSync","omit","pick","path","fs","path","path","fs","path","path","packageManager","path","packageManager","omit","pick","fs","path","path","fs","assert","assert","name","fs","path","path","fs","fs","path","path","fs","fs","path","assert","path","packageManager","path","assert","fs","path","path","assert","fs","packageManager","omit","console"]}
|
|
1
|
+
{"version":3,"sources":["../src/isolate-bin.ts","../src/isolate.ts","../src/lib/config.ts","../src/lib/logger.ts","../src/lib/utils/get-dirname.ts","../src/lib/utils/get-error-message.ts","../src/lib/utils/get-relative-path.ts","../src/lib/utils/inspect-value.ts","../src/lib/utils/json.ts","../src/lib/utils/pack.ts","../src/lib/utils/unpack.ts","../src/lib/utils/yaml.ts","../src/lib/lockfile/process-lockfile.ts","../src/lib/package-manager/helpers/infer-from-files.ts","../src/lib/package-manager/names.ts","../src/lib/package-manager/helpers/infer-from-manifest.ts","../src/lib/package-manager/index.ts","../src/lib/lockfile/helpers/generate-npm-lockfile.ts","../src/lib/lockfile/helpers/generate-pnpm-lockfile.ts","../src/lib/lockfile/helpers/generate-yarn-lockfile.ts","../src/lib/manifest/adapt-target-package-manifest.ts","../src/lib/manifest/helpers/adapt-internal-package-manifests.ts","../src/lib/manifest/io.ts","../src/lib/manifest/helpers/patch-internal-entries.ts","../src/lib/manifest/helpers/adapt-manifest-internal-deps.ts","../src/lib/output/get-build-output-dir.ts","../src/lib/output/pack-dependencies.ts","../src/lib/output/process-build-output-files.ts","../src/lib/output/unpack-dependencies.ts","../src/lib/registry/create-packages-registry.ts","../src/lib/registry/helpers/find-packages-globs.ts","../src/lib/registry/list-internal-packages.ts"],"sourcesContent":["#!/usr/bin/env node\nimport console from \"node:console\";\nimport sourceMaps from \"source-map-support\";\nimport { isolate } from \"./isolate\";\n\nsourceMaps.install();\n\nasync function run() {\n await isolate();\n}\n\nrun().catch((err) => {\n if (err instanceof Error) {\n console.error(err.stack);\n process.exit(1);\n } else {\n console.error(err);\n }\n});\n","import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { omit } from \"ramda\";\nimport type { IsolateConfig } from \"./lib/config\";\nimport { resolveConfig, setUserConfig } from \"./lib/config\";\nimport { processLockfile } from \"./lib/lockfile\";\nimport type { Logger } from \"./lib/logger\";\nimport { setLogLevel, setLogger, useLogger } from \"./lib/logger\";\nimport {\n adaptInternalPackageManifests,\n adaptTargetPackageManifest,\n readManifest,\n writeManifest,\n} from \"./lib/manifest\";\nimport {\n getBuildOutputDir,\n packDependencies,\n processBuildOutputFiles,\n unpackDependencies,\n} from \"./lib/output\";\nimport { detectPackageManager } from \"./lib/package-manager\";\nimport { createPackagesRegistry, listInternalPackages } from \"./lib/registry\";\nimport type { PackageManifest } from \"./lib/types\";\nimport { getDirname, getRootRelativePath, readTypedJson } from \"./lib/utils\";\n\nconst __dirname = getDirname(import.meta.url);\n\nexport async function isolate(\n options: { config?: IsolateConfig; logger?: Logger } = {}\n) {\n if (options.logger) {\n setLogger(options.logger);\n }\n\n if (options.config) {\n setUserConfig(options.config);\n }\n\n const config = resolveConfig();\n\n setLogLevel(config.logLevel);\n\n const log = useLogger();\n\n const thisPackageManifest = await readTypedJson<PackageManifest>(\n path.join(path.join(__dirname, \"..\", \"package.json\"))\n );\n\n log.debug(\"Using isolate-package version\", thisPackageManifest.version);\n\n /**\n * If a targetPackagePath is set, we assume the configuration lives in the\n * root of the workspace. If targetPackagePath is undefined (the default), we\n * assume that the configuration lives in the target package directory.\n */\n const targetPackageDir = config.targetPackagePath\n ? path.join(process.cwd(), config.targetPackagePath)\n : process.cwd();\n\n /**\n * We want a trailing slash here. Functionally it doesn't matter, but it makes\n * the relative paths more correct in the debug output.\n */\n const workspaceRootDir = config.targetPackagePath\n ? process.cwd()\n : path.join(targetPackageDir, config.workspaceRoot);\n\n const buildOutputDir = await getBuildOutputDir(targetPackageDir);\n\n assert(\n fs.existsSync(buildOutputDir),\n `Failed to find build output path at ${buildOutputDir}. Please make sure you build the source before isolating it.`\n );\n\n log.debug(\"Workspace root resolved to\", workspaceRootDir);\n log.debug(\n \"Isolate target package\",\n getRootRelativePath(targetPackageDir, workspaceRootDir)\n );\n\n const isolateDir = path.join(targetPackageDir, config.isolateDirName);\n\n log.debug(\n \"Isolate output directory\",\n getRootRelativePath(isolateDir, workspaceRootDir)\n );\n\n if (fs.existsSync(isolateDir)) {\n await fs.remove(isolateDir);\n log.debug(\"Cleaned the existing isolate output directory\");\n }\n\n await fs.ensureDir(isolateDir);\n\n const tmpDir = path.join(isolateDir, \"__tmp\");\n await fs.ensureDir(tmpDir);\n\n const targetPackageManifest = await readTypedJson<PackageManifest>(\n path.join(targetPackageDir, \"package.json\")\n );\n\n const packageManager = detectPackageManager(workspaceRootDir);\n\n log.debug(\n \"Detected package manager\",\n packageManager.name,\n packageManager.version\n );\n\n /**\n * Build a packages registry so we can find the workspace packages by name and\n * have access to their manifest files and relative paths.\n */\n const packagesRegistry = await createPackagesRegistry(\n workspaceRootDir,\n config.workspacePackages\n );\n\n const internalPackageNames = listInternalPackages(\n targetPackageManifest,\n packagesRegistry,\n {\n includeDevDependencies: config.includeDevDependencies,\n }\n );\n\n const packedFilesByName = await packDependencies({\n internalPackageNames,\n packagesRegistry,\n packDestinationDir: tmpDir,\n });\n\n await unpackDependencies(\n packedFilesByName,\n packagesRegistry,\n tmpDir,\n isolateDir\n );\n\n /** Adapt the manifest files for all the unpacked local dependencies */\n await adaptInternalPackageManifests(\n internalPackageNames,\n packagesRegistry,\n isolateDir\n );\n\n /** Pack the target package directory, and unpack it in the isolate location */\n await processBuildOutputFiles({\n targetPackageDir,\n tmpDir,\n isolateDir,\n });\n\n /**\n * Copy the target manifest file to the isolate location and adapt its\n * workspace dependencies to point to the isolated packages.\n */\n await adaptTargetPackageManifest(\n targetPackageManifest,\n packagesRegistry,\n isolateDir\n );\n\n /** Generate an isolated lockfile based on the original one */\n const usedFallbackToNpm = await processLockfile({\n workspaceRootDir,\n isolateDir,\n packagesRegistry,\n internalDepPackageNames: internalPackageNames,\n targetPackageDir,\n targetPackageName: targetPackageManifest.name,\n });\n\n if (usedFallbackToNpm) {\n /**\n * When we fall back to NPM, we strip the package manager declaration from\n * the manifest, so the default NPM version from the host environment can be\n * used.\n */\n const inputManifest = await readManifest(isolateDir);\n\n const outputManifest = omit([\"packageManager\"], inputManifest);\n\n await writeManifest(isolateDir, outputManifest);\n }\n\n if (packageManager.name === \"pnpm\" && !config.forceNpm) {\n /**\n * PNPM doesn't install dependencies of packages that are linked via link:\n * or file: specifiers. It requires the directory to be configured as a\n * workspace, so we copy the workspace config file to the isolate output.\n */\n fs.copyFileSync(\n path.join(workspaceRootDir, \"pnpm-workspace.yaml\"),\n path.join(isolateDir, \"pnpm-workspace.yaml\")\n );\n }\n /**\n * If there is an .npmrc file in the workspace root, copy it to the isolate\n * because the settings there could affect how the lockfile is resolved. Note\n * that .npmrc is used by both NPM and PNPM for configuration.\n *\n * See also: https://pnpm.io/npmrc\n */\n const npmrcPath = path.join(workspaceRootDir, \".npmrc\");\n\n if (fs.existsSync(npmrcPath)) {\n fs.copyFileSync(npmrcPath, path.join(isolateDir, \".npmrc\"));\n log.debug(\"Copied .npmrc file to the isolate output\");\n }\n\n /**\n * Clean up. Only so this in the happy path, so we can look at the temp folder\n * when thing go wrong.\n */\n log.debug(\n \"Deleting temp directory\",\n getRootRelativePath(tmpDir, workspaceRootDir)\n );\n await fs.remove(tmpDir);\n\n log.info(\"Isolate completed at\", isolateDir);\n\n return isolateDir;\n}\n","import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { isEmpty } from \"ramda\";\nimport { setLogLevel, useLogger } from \"./logger\";\nimport { inspectValue, readTypedJsonSync } from \"./utils\";\n\nexport type IsolateConfigResolved = {\n buildDirName?: string;\n includeDevDependencies: boolean;\n isolateDirName: string;\n logLevel: \"info\" | \"debug\" | \"warn\" | \"error\";\n targetPackagePath?: string;\n tsconfigPath: string;\n workspacePackages?: string[];\n workspaceRoot: string;\n forceNpm: boolean;\n pickFromScripts?: string[];\n omitFromScripts?: string[];\n};\n\nexport type IsolateConfig = Partial<IsolateConfigResolved>;\n\nconst configDefaults: IsolateConfigResolved = {\n buildDirName: undefined,\n includeDevDependencies: false,\n isolateDirName: \"isolate\",\n logLevel: \"info\",\n targetPackagePath: undefined,\n tsconfigPath: \"./tsconfig.json\",\n workspacePackages: undefined,\n workspaceRoot: \"../..\",\n forceNpm: false,\n pickFromScripts: undefined,\n omitFromScripts: undefined,\n};\n\n/**\n * Only initialize the configuration once, and keeping it here for subsequent\n * calls to getConfig.\n */\nlet _resolvedConfig: IsolateConfigResolved | undefined;\n\nlet _user_defined_config: IsolateConfig | undefined;\n\nconst validConfigKeys = Object.keys(configDefaults);\n\nconst CONFIG_FILE_NAME = \"isolate.config.json\";\n\nexport type LogLevel = IsolateConfigResolved[\"logLevel\"];\n\nexport function setUserConfig(config: IsolateConfig) {\n _user_defined_config = config;\n\n if (config.logLevel) {\n setLogLevel(config.logLevel);\n }\n}\n\nexport function useConfig() {\n if (_resolvedConfig) {\n return _resolvedConfig;\n } else {\n throw new Error(\"Called useConfig before config was made available\");\n }\n}\n\n/**\n * Resolve configuration based on user config and defaults. If setConfig was\n * called before this, it does not attempt to read a config file from disk.\n */\nexport function resolveConfig(): IsolateConfigResolved {\n if (_resolvedConfig) {\n return _resolvedConfig;\n }\n\n setLogLevel(process.env.DEBUG_ISOLATE_CONFIG ? \"debug\" : \"info\");\n\n const log = useLogger();\n\n const configFilePath = path.join(process.cwd(), CONFIG_FILE_NAME);\n\n if (_user_defined_config) {\n log.debug(`Using user defined config:`, inspectValue(_user_defined_config));\n } else {\n log.debug(`Attempting to load config from ${configFilePath}`);\n\n _user_defined_config = fs.existsSync(configFilePath)\n ? readTypedJsonSync<IsolateConfig>(configFilePath)\n : {};\n }\n\n const foreignKeys = Object.keys(_user_defined_config).filter(\n (key) => !validConfigKeys.includes(key)\n );\n\n if (!isEmpty(foreignKeys)) {\n log.warn(`Found invalid config settings:`, foreignKeys.join(\", \"));\n }\n\n const config = Object.assign(\n {},\n configDefaults,\n _user_defined_config\n ) satisfies IsolateConfigResolved;\n\n log.debug(\"Using configuration:\", inspectValue(config));\n\n _resolvedConfig = config;\n return config;\n}\n\n/**\n * Get only the configuration that the user set explicitly in the config file or\n * passed via arguments to isolate().\n */\nexport function getUserDefinedConfig(): IsolateConfig {\n assert(\n _user_defined_config,\n \"Called getUserDefinedConfig before user config was made available\"\n );\n\n return _user_defined_config;\n}\n","import chalk from \"chalk\";\nimport type { IsolateConfigResolved, LogLevel } from \"./config\";\n/**\n * The Logger defines an interface that can be used to pass in a different\n * logger object in order to intercept all the logging output. We keep the\n * handlers separate from the logger object itself, so that we can change the\n * handlers but do not bother the user with having to handle logLevel.\n */\nexport type Logger = {\n debug(...args: unknown[]): void;\n info(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n};\n\nlet _loggerHandlers: Logger = {\n debug(...args: unknown[]) {\n console.log(chalk.blue(\"debug\"), ...args);\n },\n info(...args: unknown[]) {\n console.log(chalk.green(\"info\"), ...args);\n },\n warn(...args: unknown[]) {\n console.log(chalk.yellow(\"warning\"), ...args);\n },\n error(...args: unknown[]) {\n console.log(chalk.red(\"error\"), ...args);\n },\n};\n\nconst _logger: Logger = {\n debug(...args: unknown[]) {\n if (_logLevel === \"debug\") {\n _loggerHandlers.debug(...args);\n }\n },\n info(...args: unknown[]) {\n if (_logLevel === \"debug\" || _logLevel === \"info\") {\n _loggerHandlers.info(...args);\n }\n },\n warn(...args: unknown[]) {\n if (_logLevel === \"debug\" || _logLevel === \"info\" || _logLevel === \"warn\") {\n _loggerHandlers.warn(...args);\n }\n },\n error(...args: unknown[]) {\n _loggerHandlers.error(...args);\n },\n};\n\nlet _logLevel: LogLevel = \"info\";\n\nexport function setLogger(logger: Logger) {\n _loggerHandlers = logger;\n return _logger;\n}\n\nexport function setLogLevel(\n logLevel: IsolateConfigResolved[\"logLevel\"]\n): Logger {\n _logLevel = logLevel;\n return _logger;\n}\n\nexport function useLogger() {\n return _logger;\n}\n","import { fileURLToPath } from \"url\";\n\n/**\n * Calling context should pass in import.meta.url and the function will return\n * the equivalent of __dirname in Node/CommonJs.\n */\nexport function getDirname(importMetaUrl: string) {\n return fileURLToPath(new URL(\".\", importMetaUrl));\n}\n","type ErrorWithMessage = {\n message: string;\n};\n\nexport function getErrorMessage(error: unknown) {\n return toErrorWithMessage(error).message;\n}\n\nfunction isErrorWithMessage(error: unknown): error is ErrorWithMessage {\n return typeof error === \"object\" && error !== null && \"message\" in error;\n}\n\nfunction toErrorWithMessage(maybeError: unknown): ErrorWithMessage {\n if (isErrorWithMessage(maybeError)) return maybeError;\n\n try {\n return new Error(JSON.stringify(maybeError));\n } catch {\n /**\n * Fallback in case there’s an error stringifying the maybeError like with\n * circular references.\n */\n return new Error(String(maybeError));\n }\n}\n","export function getRootRelativePath(path: string, rootPath: string) {\n const strippedPath = path.replace(rootPath, \"\");\n\n return strippedPath.startsWith(\"/\")\n ? `(root)${strippedPath}`\n : `(root)/${strippedPath}`;\n}\n\nexport function getIsolateRelativePath(path: string, isolatePath: string) {\n const strippedPath = path.replace(isolatePath, \"\");\n\n return strippedPath.startsWith(\"/\")\n ? `(isolate)${strippedPath}`\n : `(isolate)/${strippedPath}`;\n}\n","import { inspect } from \"node:util\";\nimport type { JsonValue } from \"type-fest\";\n\nexport function inspectValue(value: JsonValue) {\n return inspect(value, false, 16, true);\n}\n","import fs from \"fs-extra\";\nimport stripJsonComments from \"strip-json-comments\";\nimport { getErrorMessage } from \"./get-error-message\";\n\n/** @todo Pass in zod schema and validate */\nexport function readTypedJsonSync<T>(filePath: string) {\n try {\n const rawContent = fs.readFileSync(filePath, \"utf-8\");\n const data = JSON.parse(stripJsonComments(rawContent)) as T;\n return data;\n } catch (err) {\n throw new Error(\n `Failed to read JSON from ${filePath}: ${getErrorMessage(err)}`\n );\n }\n}\n\nexport async function readTypedJson<T>(filePath: string) {\n try {\n const rawContent = await fs.readFile(filePath, \"utf-8\");\n const data = JSON.parse(rawContent) as T;\n return data;\n } catch (err) {\n throw new Error(\n `Failed to read JSON from ${filePath}: ${getErrorMessage(err)}`\n );\n }\n}\n","import fs from \"fs-extra\";\nimport { exec } from \"node:child_process\";\nimport path from \"node:path\";\nimport { useLogger } from \"../logger\";\n\nexport async function pack(\n srcDir: string,\n dstDir: string,\n usePnpmPack = false\n) {\n const execOptions = {\n maxBuffer: 10 * 1024 * 1024,\n };\n\n const log = useLogger();\n\n const previousCwd = process.cwd();\n process.chdir(srcDir);\n\n /**\n * PNPM pack seems to be a lot faster than NPM pack, so when PNPM is detected\n * we use that instead.\n */\n const stdout = usePnpmPack\n ? await new Promise<string>((resolve, reject) => {\n exec(\n `pnpm pack --pack-destination \"${dstDir}\"`,\n execOptions,\n (err, stdout, stderr) => {\n if (err) {\n log.error(stderr);\n return reject(err);\n }\n\n resolve(stdout);\n }\n );\n })\n : await new Promise<string>((resolve, reject) => {\n exec(\n `npm pack --pack-destination \"${dstDir}\"`,\n execOptions,\n (err, stdout) => {\n if (err) {\n return reject(err);\n }\n\n resolve(stdout);\n }\n );\n });\n\n const fileName = path.basename(stdout.trim());\n\n const filePath = path.join(dstDir, fileName);\n\n if (!fs.existsSync(filePath)) {\n log.error(\n `The response from pack could not be resolved to an existing file: ${filePath}`\n );\n } else {\n log.debug(`Packed (temp)/${fileName}`);\n }\n\n process.chdir(previousCwd);\n\n /**\n * Return the path anyway even if it doesn't validate. A later stage will wait\n * for the file to occur still. Not sure if this makes sense. Maybe we should\n * stop at the validation error...\n */\n return filePath;\n}\n","import fs from \"fs-extra\";\nimport tar from \"tar-fs\";\nimport { createGunzip } from \"zlib\";\n\nexport async function unpack(filePath: string, unpackDir: string) {\n await new Promise<void>((resolve, reject) => {\n fs.createReadStream(filePath)\n .pipe(createGunzip())\n .pipe(tar.extract(unpackDir))\n .on(\"finish\", () => resolve())\n .on(\"error\", (err) => reject(err));\n });\n}\n","import fs from \"fs-extra\";\nimport yaml from \"yaml\";\nimport { getErrorMessage } from \"./get-error-message\";\n\nexport function readTypedYamlSync<T>(filePath: string) {\n try {\n const rawContent = fs.readFileSync(filePath, \"utf-8\");\n const data = yaml.parse(rawContent);\n /** @todo Add some zod validation maybe */\n return data as T;\n } catch (err) {\n throw new Error(\n `Failed to read YAML from ${filePath}: ${getErrorMessage(err)}`\n );\n }\n}\n\nexport function writeTypedYamlSync<T>(filePath: string, content: T) {\n /** @todo Add some zod validation maybe */\n fs.writeFileSync(filePath, yaml.stringify(content), \"utf-8\");\n}\n","import type {\n ProjectSnapshot,\n ResolvedDependencies,\n} from \"@pnpm/lockfile-file\";\nimport { mapObjIndexed } from \"ramda\";\nimport { useConfig } from \"../config\";\nimport { useLogger } from \"../logger\";\nimport { usePackageManager } from \"../package-manager\";\nimport type { PackagesRegistry } from \"../types\";\nimport { generateNpmLockfile } from \"./helpers/generate-npm-lockfile\";\nimport { generatePnpmLockfile } from \"./helpers/generate-pnpm-lockfile\";\nimport { generateYarnLockfile } from \"./helpers/generate-yarn-lockfile\";\n\n/** Convert dependency links */\nexport function pnpmMapImporter(\n { dependencies, devDependencies, ...rest }: ProjectSnapshot,\n {\n includeDevDependencies,\n directoryByPackageName,\n }: {\n includeDevDependencies: boolean;\n directoryByPackageName: { [packageName: string]: string };\n }\n): ProjectSnapshot {\n return {\n dependencies: dependencies\n ? pnpmMapDependenciesLinks(dependencies, directoryByPackageName)\n : undefined,\n devDependencies:\n includeDevDependencies && devDependencies\n ? pnpmMapDependenciesLinks(devDependencies, directoryByPackageName)\n : undefined,\n ...rest,\n };\n}\n\nfunction pnpmMapDependenciesLinks(\n def: ResolvedDependencies,\n directoryByPackageName: { [packageName: string]: string }\n): ResolvedDependencies {\n return mapObjIndexed(\n (version, name) =>\n version.startsWith(\"link:\")\n ? `link:./${directoryByPackageName[name]}`\n : version,\n def\n );\n}\n\n/**\n * Adapt the lockfile and write it to the isolate directory. Because we keep the\n * structure of packages in the isolate directory the same as they were in the\n * monorepo, the lockfile is largely still correct. The only things that need to\n * be done is to remove the root dependencies and devDependencies, and rename\n * the path to the target package to act as the new root.\n */\nexport async function processLockfile({\n workspaceRootDir,\n packagesRegistry,\n isolateDir,\n internalDepPackageNames,\n targetPackageDir,\n}: {\n workspaceRootDir: string;\n packagesRegistry: PackagesRegistry;\n isolateDir: string;\n internalDepPackageNames: string[];\n targetPackageDir: string;\n targetPackageName: string;\n}) {\n const log = useLogger();\n\n const { forceNpm } = useConfig();\n\n if (forceNpm) {\n log.info(\"Forcing to use NPM for isolate output\");\n\n await generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n });\n\n return true;\n }\n\n const { name, version } = usePackageManager();\n let usedFallbackToNpm = false;\n\n switch (name) {\n case \"npm\": {\n await generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n });\n\n break;\n }\n case \"yarn\": {\n const versionMajor = parseInt(version.split(\".\")[0], 10);\n\n if (versionMajor === 1) {\n await generateYarnLockfile({\n workspaceRootDir,\n isolateDir,\n });\n } else {\n log.info(\n \"Detected modern version of Yarn. Using NPM lockfile fallback.\"\n );\n\n await generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n });\n\n usedFallbackToNpm = true;\n }\n\n break;\n }\n case \"pnpm\": {\n await generatePnpmLockfile({\n workspaceRootDir,\n targetPackageDir,\n isolateDir,\n internalDepPackageNames,\n packagesRegistry,\n });\n break;\n }\n default:\n log.warn(`Unexpected package manager ${name}. Using NPM for output`);\n await generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n });\n\n usedFallbackToNpm = true;\n }\n\n return usedFallbackToNpm;\n}\n","import fs from \"fs-extra\";\nimport { execSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport type { PackageManager, PackageManagerName } from \"../names\";\nimport { getLockfileFileName, supportedPackageManagerNames } from \"../names\";\n\nexport function inferFromFiles(workspaceRoot: string): PackageManager {\n for (const name of supportedPackageManagerNames) {\n const lockfileName = getLockfileFileName(name);\n\n if (fs.existsSync(path.join(workspaceRoot, lockfileName))) {\n return { name, version: getVersion(name) };\n }\n }\n\n /** If no lockfile was found, it could be that there is an npm shrinkwrap file. */\n if (fs.existsSync(path.join(workspaceRoot, \"npm-shrinkwrap.json\"))) {\n return { name: \"npm\", version: getVersion(\"npm\") };\n }\n\n throw new Error(`Failed to detect package manager`);\n}\nfunction getVersion(packageManagerName: PackageManagerName): string {\n const buffer = execSync(`${packageManagerName} --version`);\n return buffer.toString().trim();\n}\n","export const supportedPackageManagerNames = [\"pnpm\", \"yarn\", \"npm\"] as const;\n\nexport type PackageManagerName = (typeof supportedPackageManagerNames)[number];\n\nexport type PackageManager = {\n name: PackageManagerName;\n version: string;\n};\n\nexport function getLockfileFileName(name: PackageManagerName) {\n switch (name) {\n case \"pnpm\":\n return \"pnpm-lock.yaml\";\n case \"yarn\":\n return \"yarn.lock\";\n case \"npm\":\n return \"package-lock.json\";\n }\n}\n","import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { useLogger } from \"~/lib/logger\";\nimport type { PackageManifest } from \"../../types\";\nimport { readTypedJsonSync } from \"../../utils\";\nimport type { PackageManagerName } from \"../names\";\nimport { getLockfileFileName, supportedPackageManagerNames } from \"../names\";\n\nexport function inferFromManifest(workspaceRoot: string) {\n const log = useLogger();\n\n const rootManifest = readTypedJsonSync<PackageManifest>(\n path.join(workspaceRoot, \"package.json\")\n );\n\n if (!rootManifest.packageManager) {\n log.debug(\"No packageManager field found in root manifest\");\n return;\n }\n\n const [name, version = \"*\"] = rootManifest.packageManager.split(\"@\") as [\n PackageManagerName,\n string,\n ];\n\n assert(\n supportedPackageManagerNames.includes(name),\n `Package manager \"${name}\" is not currently supported`\n );\n\n const lockfileName = getLockfileFileName(name);\n\n assert(\n fs.existsSync(path.join(workspaceRoot, lockfileName)),\n `Manifest declares ${name} to be the packageManager, but failed to find ${lockfileName} in workspace root`\n );\n\n return { name, version };\n}\n","import { inferFromFiles } from \"./helpers/infer-from-files\";\nimport { inferFromManifest } from \"./helpers/infer-from-manifest\";\nimport type { PackageManager } from \"./names\";\n\nexport * from \"./names\";\n\nexport let packageManager: PackageManager | undefined;\n\nexport function usePackageManager() {\n if (!packageManager) {\n throw Error(\n \"No package manager detected. Make sure to call detectPackageManager() before usePackageManager()\"\n );\n }\n\n return packageManager;\n}\n\n/**\n * First we check if the package manager is declared in the manifest. If it is,\n * we get the name and version from there. Otherwise we'll search for the\n * different lockfiles and ask the OS to report the installed version.\n */\nexport function detectPackageManager(workspaceRoot: string): PackageManager {\n /**\n * Disable infer from manifest for now. I doubt it is useful after all but\n * I'll keep the code as a reminder.\n */\n packageManager =\n inferFromManifest(workspaceRoot) ?? inferFromFiles(workspaceRoot);\n\n return packageManager;\n}\n","import Arborist from \"@npmcli/arborist\";\nimport fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { useLogger } from \"~/lib/logger\";\nimport { getErrorMessage, inspectValue } from \"~/lib/utils\";\n\n/**\n * Generate an isolated / pruned lockfile, based on the contents of installed\n * node_modules from the monorepo root plus the adapted package manifest in the\n * isolate directory.\n */\nexport async function generateNpmLockfile({\n workspaceRootDir,\n isolateDir,\n}: {\n workspaceRootDir: string;\n isolateDir: string;\n}) {\n const log = useLogger();\n\n log.info(\"Generating NPM lockfile...\");\n\n const origRootNodeModulesPath = path.join(workspaceRootDir, \"node_modules\");\n const tempRootNodeModulesPath = path.join(isolateDir, \"node_modules\");\n\n let hasMovedNodeModules = false;\n\n try {\n if (!fs.existsSync(origRootNodeModulesPath)) {\n throw new Error(\n `Failed to find node_modules at ${origRootNodeModulesPath}`\n );\n }\n\n log.debug(`Temporarily moving node_modules to the isolate output`);\n\n await fs.move(origRootNodeModulesPath, tempRootNodeModulesPath);\n hasMovedNodeModules = true;\n\n const arborist = new Arborist({ path: isolateDir });\n\n log.debug(`Build tree`);\n const { meta } = await arborist.buildIdealTree();\n\n log.debug(`Commit tree`);\n meta?.commit();\n\n const lockfilePath = path.join(isolateDir, \"package-lock.json\");\n\n await fs.writeFile(lockfilePath, String(meta));\n\n log.debug(\"Created lockfile at\", lockfilePath);\n } catch (err: any) {\n console.error(inspectValue(err));\n log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);\n /**\n * If lockfile creation fails we can technically still continue with the\n * rest. Not sure if that is desirable.\n */\n } finally {\n if (hasMovedNodeModules) {\n log.debug(`Restoring node_modules to the workspace root`);\n await fs.move(tempRootNodeModulesPath, origRootNodeModulesPath);\n }\n }\n}\n","import {\n getLockfileImporterId,\n readWantedLockfile,\n writeWantedLockfile,\n} from \"@pnpm/lockfile-file\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { pick } from \"ramda\";\nimport { useConfig } from \"~/lib/config\";\nimport { useLogger } from \"~/lib/logger\";\nimport type { PackagesRegistry } from \"~/lib/types\";\nimport { getErrorMessage } from \"~/lib/utils\";\nimport { pnpmMapImporter } from \"../process-lockfile\";\n\nexport async function generatePnpmLockfile({\n workspaceRootDir,\n targetPackageDir,\n isolateDir,\n internalDepPackageNames,\n packagesRegistry,\n}: {\n workspaceRootDir: string;\n targetPackageDir: string;\n isolateDir: string;\n internalDepPackageNames: string[];\n packagesRegistry: PackagesRegistry;\n}) {\n const { includeDevDependencies } = useConfig();\n const log = useLogger();\n\n log.info(\"Generating PNPM lockfile...\");\n\n try {\n const lockfile = await readWantedLockfile(workspaceRootDir, {\n ignoreIncompatible: false,\n });\n\n assert(lockfile, `No input lockfile found at ${workspaceRootDir}`);\n\n const targetImporterId = getLockfileImporterId(\n workspaceRootDir,\n targetPackageDir\n );\n\n const directoryByPackageName = Object.fromEntries(\n internalDepPackageNames.map((name) => {\n const pkg = packagesRegistry[name];\n assert(pkg, `Package ${name} not found in packages registry`);\n return [name, pkg.rootRelativeDir];\n })\n );\n\n const relevantImporterIds = [\n targetImporterId,\n /**\n * The directory paths happen to correspond with what PNPM calls the\n * importer ids in the context of a lockfile.\n */\n ...Object.values(directoryByPackageName),\n ];\n\n log.debug(\"Relevant importer ids:\", relevantImporterIds);\n\n lockfile.importers = Object.fromEntries(\n Object.entries(pick(relevantImporterIds, lockfile.importers)).map(\n ([importerId, importer]) => {\n if (importerId === targetImporterId) {\n log.debug(\"Setting target package importer on root\");\n\n return [\n \".\",\n pnpmMapImporter(importer, {\n includeDevDependencies,\n directoryByPackageName,\n }),\n ];\n }\n\n log.debug(\"Setting internal package importer:\", importerId);\n\n return [\n importerId,\n pnpmMapImporter(importer, {\n includeDevDependencies,\n directoryByPackageName,\n }),\n ];\n }\n )\n );\n\n await writeWantedLockfile(isolateDir, lockfile);\n\n log.debug(\"Created lockfile at\", path.join(isolateDir, \"pnpm-lock.yaml\"));\n } catch (err) {\n log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);\n }\n}\n","import fs from \"fs-extra\";\nimport { execSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport { useLogger } from \"~/lib/logger\";\nimport { getErrorMessage } from \"~/lib/utils\";\n\n/**\n * Generate an isolated / pruned lockfile, based on the existing lockfile from\n * the monorepo root plus the adapted package manifest in the isolate\n * directory.\n */\nexport async function generateYarnLockfile({\n workspaceRootDir,\n isolateDir,\n}: {\n workspaceRootDir: string;\n isolateDir: string;\n}) {\n const log = useLogger();\n\n log.info(\"Generating Yarn lockfile...\");\n\n const origLockfilePath = path.join(workspaceRootDir, \"yarn.lock\");\n const newLockfilePath = path.join(isolateDir, \"yarn.lock\");\n\n if (!fs.existsSync(origLockfilePath)) {\n throw new Error(`Failed to find lockfile at ${origLockfilePath}`);\n }\n\n log.debug(`Copy original yarn.lock to the isolate output`);\n\n try {\n await fs.copyFile(origLockfilePath, newLockfilePath);\n\n // const origWorkingDirectory = process.cwd();\n\n // process.chdir(isolateDir);\n\n /**\n * Running install with the original lockfile in the same directory will\n * generate a pruned version of the lockfile.\n */\n log.debug(`Running local install`);\n execSync(`yarn install --cwd ${isolateDir}`);\n\n // process.chdir(origWorkingDirectory);\n\n log.debug(\"Generated lockfile at\", newLockfilePath);\n } catch (err) {\n log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);\n /**\n * If lockfile creation fails we can technically still continue with the\n * rest. Not sure if that is desirable.\n */\n }\n}\n","import { omit, pick } from \"ramda\";\nimport { useConfig } from \"../config\";\nimport { usePackageManager } from \"../package-manager\";\nimport type { PackageManifest, PackagesRegistry } from \"../types\";\nimport { adaptManifestInternalDeps } from \"./helpers\";\nimport { writeManifest } from \"./io\";\n\n/**\n * Adapt the output package manifest, so that:\n *\n * - Its internal dependencies point to the isolated ./packages/* directory.\n * - The devDependencies are possibly removed\n * - Scripts are picked or omitted and otherwise removed\n */\nexport async function adaptTargetPackageManifest(\n manifest: PackageManifest,\n packagesRegistry: PackagesRegistry,\n isolateDir: string\n) {\n const packageManager = usePackageManager();\n const { includeDevDependencies, forceNpm, pickFromScripts, omitFromScripts } =\n useConfig();\n\n /** Dev dependencies are omitted by default */\n const inputManifest = includeDevDependencies\n ? manifest\n : omit([\"devDependencies\"], manifest);\n\n const adaptedManifest =\n packageManager.name === \"pnpm\" && !forceNpm\n ? /**\n * For PNPM the output itself is a workspace so we can preserve the specifiers\n * with \"workspace:*\" in the output manifest.\n */\n inputManifest\n : /** For other package managers we replace the links to internal dependencies */\n adaptManifestInternalDeps({\n manifest: inputManifest,\n packagesRegistry,\n });\n\n const outputManifest = {\n ...adaptedManifest,\n /**\n * Scripts are removed by default if not explicitly picked or omitted via\n * config.\n */\n scripts: pickFromScripts\n ? pick(pickFromScripts as never[], manifest.scripts)\n : omitFromScripts\n ? omit(omitFromScripts as never[], manifest.scripts)\n : undefined,\n };\n\n await writeManifest(isolateDir, outputManifest);\n}\n","import path from \"node:path\";\nimport { omit } from \"ramda\";\nimport { useConfig } from \"~/lib/config\";\nimport { usePackageManager } from \"~/lib/package-manager\";\nimport type { PackagesRegistry } from \"~/lib/types\";\nimport { writeManifest } from \"../io\";\nimport { adaptManifestInternalDeps } from \"./adapt-manifest-internal-deps\";\n\n/**\n * Adapt the manifest files of all the isolated internal packages (excluding the\n * target package), so that their dependencies point to the other isolated\n * packages in the same folder.\n */\nexport async function adaptInternalPackageManifests(\n internalPackageNames: string[],\n packagesRegistry: PackagesRegistry,\n isolateDir: string\n) {\n const packageManager = usePackageManager();\n const { includeDevDependencies, forceNpm } = useConfig();\n\n await Promise.all(\n internalPackageNames.map(async (packageName) => {\n const { manifest, rootRelativeDir } = packagesRegistry[packageName];\n\n /**\n * Dev dependencies are omitted by default. And also, for internal\n * dependencies we want to omit the peerDependencies, because installing\n * these is the responsibility of the consuming app / service, and\n * otherwise the frozen lockfile install will error since the package file\n * contains something that is not referenced in the lockfile.\n */\n const inputManifest = includeDevDependencies\n ? omit([\"peerDependencies\"], manifest)\n : omit([\"devDependencies\", \"peerDependencies\"], manifest);\n\n const outputManifest =\n packageManager.name === \"pnpm\" && !forceNpm\n ? /**\n * For PNPM the output itself is a workspace so we can preserve the specifiers\n * with \"workspace:*\" in the output manifest.\n */\n inputManifest\n : adaptManifestInternalDeps({\n manifest,\n packagesRegistry,\n parentRootRelativeDir: rootRelativeDir,\n });\n\n await writeManifest(\n path.join(isolateDir, rootRelativeDir),\n outputManifest\n );\n })\n );\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport type { PackageManifest } from \"../types\";\nimport { readTypedJson } from \"../utils\";\n\nexport async function readManifest(packageDir: string) {\n return readTypedJson<PackageManifest>(path.join(packageDir, \"package.json\"));\n}\n\nexport async function writeManifest(\n outputDir: string,\n manifest: PackageManifest\n) {\n await fs.writeFile(\n path.join(outputDir, \"package.json\"),\n JSON.stringify(manifest, null, 2)\n );\n}\n","import path from \"node:path\";\nimport { useLogger } from \"../../logger\";\nimport type { PackagesRegistry } from \"../../types\";\n\nexport function patchInternalEntries(\n dependencies: Record<string, string>,\n packagesRegistry: PackagesRegistry,\n parentRootRelativeDir?: string\n) {\n const log = useLogger();\n const allWorkspacePackageNames = Object.keys(packagesRegistry);\n\n return Object.fromEntries(\n Object.entries(dependencies).map(([key, value]) => {\n if (allWorkspacePackageNames.includes(key)) {\n const def = packagesRegistry[key];\n\n /**\n * When nested internal dependencies are used (internal packages linking\n * to other internal packages), the parentRootRelativeDir will be passed\n * in, and we store the relative path to the isolate/packages\n * directory.\n *\n * For consistency we also write the other file paths starting with ./,\n * but it doesn't seem to be necessary for any package manager.\n */\n const relativePath = parentRootRelativeDir\n ? path.relative(parentRootRelativeDir, `./${def.rootRelativeDir}`)\n : `./${def.rootRelativeDir}`;\n\n const linkPath = `file:${relativePath}`;\n\n log.debug(`Linking dependency ${key} to ${linkPath}`);\n\n return [key, linkPath];\n } else {\n return [key, value];\n }\n })\n );\n}\n","import type { PackageManifest, PackagesRegistry } from \"~/lib/types\";\nimport { patchInternalEntries } from \"./patch-internal-entries\";\n\n/**\n * Replace the workspace version specifiers for internal dependency with file:\n * paths. Not needed for PNPM (because we configure the isolated output as a\n * workspace), but maybe still for NPM and Yarn.\n */\nexport function adaptManifestInternalDeps({\n manifest,\n packagesRegistry,\n parentRootRelativeDir,\n}: {\n manifest: PackageManifest;\n packagesRegistry: PackagesRegistry;\n parentRootRelativeDir?: string;\n}): PackageManifest {\n const { dependencies, devDependencies } = manifest;\n\n return {\n ...manifest,\n dependencies: dependencies\n ? patchInternalEntries(\n dependencies,\n packagesRegistry,\n parentRootRelativeDir\n )\n : undefined,\n devDependencies: devDependencies\n ? patchInternalEntries(\n devDependencies,\n packagesRegistry,\n parentRootRelativeDir\n )\n : undefined,\n };\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport outdent from \"outdent\";\nimport { useConfig } from \"../config\";\nimport { useLogger } from \"../logger\";\nimport { readTypedJson } from \"../utils\";\n\nexport async function getBuildOutputDir(targetPackageDir: string) {\n const config = useConfig();\n const log = useLogger();\n\n if (config.buildDirName) {\n log.debug(\"Using buildDirName from config:\", config.buildDirName);\n return path.join(targetPackageDir, config.buildDirName);\n }\n\n const tsconfigPath = path.join(targetPackageDir, config.tsconfigPath);\n\n if (fs.existsSync(tsconfigPath)) {\n log.debug(\"Found tsconfig at:\", config.tsconfigPath);\n\n const tsconfig = await readTypedJson<{\n compilerOptions?: { outDir?: string };\n }>(tsconfigPath);\n\n const outDir = tsconfig.compilerOptions?.outDir;\n\n if (outDir) {\n return path.join(targetPackageDir, outDir);\n } else {\n throw new Error(outdent`\n Failed to find outDir in tsconfig. If you are executing isolate from the root of a monorepo you should specify the buildDirName in isolate.config.json.\n `);\n }\n } else {\n log.warn(\"Failed to find tsconfig at:\", tsconfigPath);\n\n throw new Error(outdent`\n Failed to infer the build output directory from either the isolate config buildDirName or a Typescript config file. See the documentation on how to configure one of these options.\n `);\n }\n}\n","import assert from \"node:assert\";\nimport { useLogger } from \"../logger\";\nimport { usePackageManager } from \"../package-manager\";\nimport type { PackagesRegistry } from \"../types\";\nimport { pack } from \"../utils\";\n\n/**\n * Pack dependencies so that we extract only the files that are supposed to be\n * published by the packages.\n *\n * @returns A map of package names to the path of the packed file\n */\nexport async function packDependencies({\n /** All packages found in the monorepo by workspaces declaration */\n packagesRegistry,\n /** The dependencies that appear to be internal packages */\n internalPackageNames,\n /**\n * The directory where the isolated package and all its dependencies will end\n * up. This is also the directory from where the package will be deployed. By\n * default it is a subfolder in targetPackageDir called \"isolate\" but you can\n * configure it.\n */\n packDestinationDir,\n}: {\n packagesRegistry: PackagesRegistry;\n internalPackageNames: string[];\n packDestinationDir: string;\n}) {\n const log = useLogger();\n\n const packedFileByName: Record<string, string> = {};\n\n const { name, version } = usePackageManager();\n\n const versionMajor = parseInt(version.split(\".\")[0], 10);\n\n const usePnpmPack = name === \"pnpm\" && versionMajor >= 8;\n\n if (usePnpmPack) {\n log.debug(\"Using PNPM pack instead of NPM pack\");\n }\n\n for (const dependency of internalPackageNames) {\n const def = packagesRegistry[dependency];\n\n assert(dependency, `Failed to find package definition for ${dependency}`);\n\n const { name } = def.manifest;\n\n /**\n * If this dependency has already been packed, we skip it. It could happen\n * because we are packing workspace dependencies recursively.\n */\n if (packedFileByName[name]) {\n log.debug(`Skipping ${name} because it has already been packed`);\n continue;\n }\n\n packedFileByName[name] = await pack(\n def.absoluteDir,\n packDestinationDir,\n usePnpmPack\n );\n }\n\n return packedFileByName;\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { useLogger } from \"../logger\";\nimport { pack, unpack } from \"../utils\";\n\nconst TIMEOUT_MS = 5000;\n\nexport async function processBuildOutputFiles({\n targetPackageDir,\n tmpDir,\n isolateDir,\n}: {\n targetPackageDir: string;\n tmpDir: string;\n isolateDir: string;\n}) {\n const log = useLogger();\n const packedFilePath = await pack(targetPackageDir, tmpDir);\n const unpackDir = path.join(tmpDir, \"target\");\n\n const now = Date.now();\n let isWaitingYet = false;\n\n while (!fs.existsSync(packedFilePath) && Date.now() - now < TIMEOUT_MS) {\n if (!isWaitingYet) {\n log.debug(`Waiting for ${packedFilePath} to become available...`);\n }\n isWaitingYet = true;\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n await unpack(packedFilePath, unpackDir);\n await fs.copy(path.join(unpackDir, \"package\"), isolateDir);\n}\n","import fs from \"fs-extra\";\nimport path, { join } from \"node:path\";\nimport { useLogger } from \"../logger\";\nimport type { PackagesRegistry } from \"../types\";\nimport { getIsolateRelativePath, unpack } from \"../utils\";\n\nexport async function unpackDependencies(\n packedFilesByName: Record<string, string>,\n packagesRegistry: PackagesRegistry,\n tmpDir: string,\n isolateDir: string\n) {\n const log = useLogger();\n\n await Promise.all(\n Object.entries(packedFilesByName).map(async ([packageName, filePath]) => {\n const dir = packagesRegistry[packageName].rootRelativeDir;\n const unpackDir = join(tmpDir, dir);\n\n log.debug(\"Unpacking\", `(temp)/${path.basename(filePath)}`);\n\n await unpack(filePath, unpackDir);\n\n const destinationDir = join(isolateDir, dir);\n\n await fs.ensureDir(destinationDir);\n\n await fs.move(join(unpackDir, \"package\"), destinationDir, {\n overwrite: true,\n });\n\n log.debug(\n `Moved package files to ${getIsolateRelativePath(\n destinationDir,\n isolateDir\n )}`\n );\n })\n );\n}\n","import fs from \"fs-extra\";\nimport { globSync } from \"glob\";\nimport path from \"node:path\";\nimport { useLogger } from \"../logger\";\nimport type { PackageManifest, PackagesRegistry } from \"../types\";\nimport { readTypedJson } from \"../utils\";\nimport { findPackagesGlobs } from \"./helpers/find-packages-globs\";\n\n/**\n * Build a list of all packages in the workspace, depending on the package\n * manager used, with a possible override from the config file. The list\n * contains the manifest with some directory info mapped by module name.\n */\nexport async function createPackagesRegistry(\n workspaceRootDir: string,\n workspacePackagesOverride: string[] | undefined\n): Promise<PackagesRegistry> {\n const log = useLogger();\n\n if (workspacePackagesOverride) {\n log.debug(\n `Override workspace packages via config: ${workspacePackagesOverride}`\n );\n }\n\n const packagesGlobs =\n workspacePackagesOverride ?? findPackagesGlobs(workspaceRootDir);\n\n const cwd = process.cwd();\n process.chdir(workspaceRootDir);\n\n const allPackages = packagesGlobs\n .flatMap((glob) => globSync(glob))\n /** Make sure to filter any loose files that might hang around. */\n .filter((dir) => fs.lstatSync(dir).isDirectory());\n\n const registry: PackagesRegistry = (\n await Promise.all(\n allPackages.map(async (rootRelativeDir) => {\n const manifestPath = path.join(rootRelativeDir, \"package.json\");\n\n if (!fs.existsSync(manifestPath)) {\n log.warn(\n `Ignoring directory ./${rootRelativeDir} because it does not contain a package.json file`\n );\n return;\n } else {\n log.debug(`Registering package ./${rootRelativeDir}`);\n\n const manifest = await readTypedJson<PackageManifest>(\n path.join(rootRelativeDir, \"package.json\")\n );\n\n return {\n manifest,\n rootRelativeDir,\n absoluteDir: path.join(workspaceRootDir, rootRelativeDir),\n };\n }\n })\n )\n ).reduce<PackagesRegistry>((acc, info) => {\n if (info) {\n acc[info.manifest.name] = info;\n }\n return acc;\n }, {});\n\n process.chdir(cwd);\n\n return registry;\n}\n","import assert from \"node:assert\";\nimport path from \"node:path\";\nimport { useLogger } from \"../../logger\";\nimport { usePackageManager } from \"../../package-manager\";\nimport {\n inspectValue,\n readTypedJsonSync,\n readTypedYamlSync,\n} from \"../../utils\";\n\n/**\n * Find the globs that define where the packages are located within the\n * monorepo. This configuration is dependent on the package manager used, and I\n * don't know if we're covering all cases yet...\n */\nexport function findPackagesGlobs(workspaceRootDir: string) {\n const log = useLogger();\n\n const packageManager = usePackageManager();\n\n switch (packageManager.name) {\n case \"pnpm\": {\n const { packages: globs } = readTypedYamlSync<{ packages: string[] }>(\n path.join(workspaceRootDir, \"pnpm-workspace.yaml\")\n );\n\n log.debug(\"Detected pnpm packages globs:\", inspectValue(globs));\n return globs;\n }\n case \"yarn\":\n case \"npm\": {\n const workspaceRootManifestPath = path.join(\n workspaceRootDir,\n \"package.json\"\n );\n\n const { workspaces } = readTypedJsonSync<{ workspaces: string[] }>(\n workspaceRootManifestPath\n );\n\n if (!workspaces) {\n throw new Error(\n `No workspaces field found in ${workspaceRootManifestPath}`\n );\n }\n\n if (Array.isArray(workspaces)) {\n return workspaces;\n } else {\n /**\n * For Yarn, workspaces could be defined as an object with { packages:\n * [], nohoist: [] }. See\n * https://classic.yarnpkg.com/blog/2018/02/15/nohoist/\n */\n const workspacesObject = workspaces as { packages?: string[] };\n\n assert(\n workspacesObject.packages,\n \"workspaces.packages must be an array\"\n );\n\n return workspacesObject.packages;\n }\n }\n }\n}\n","import { uniq } from \"ramda\";\nimport type { PackageManifest, PackagesRegistry } from \"../types\";\n\n/**\n * Recursively list all the packages from dependencies (and optionally\n * devDependencies) that are found in the monorepo.\n *\n * Here we do not need to rely on packages being declared with \"workspace:\" in\n * the package manifest. We can simply compare the package names with the list\n * of packages that were found via the workspace glob patterns and add them to\n * the registry.\n */\nexport function listInternalPackages(\n manifest: PackageManifest,\n packagesRegistry: PackagesRegistry,\n { includeDevDependencies = false } = {}\n): string[] {\n const allWorkspacePackageNames = Object.keys(packagesRegistry);\n\n const internalPackageNames = (\n includeDevDependencies\n ? [\n ...Object.keys(manifest.dependencies ?? {}),\n ...Object.keys(manifest.devDependencies ?? {}),\n ]\n : Object.keys(manifest.dependencies ?? {})\n ).filter((name) => allWorkspacePackageNames.includes(name));\n\n const nestedInternalPackageNames = internalPackageNames.flatMap(\n (packageName) =>\n listInternalPackages(\n packagesRegistry[packageName].manifest,\n packagesRegistry,\n { includeDevDependencies }\n )\n );\n\n return uniq(internalPackageNames.concat(nestedInternalPackageNames));\n}\n"],"mappings":"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","names":["console","fs","assert","path","omit","fs","path","path","fs","stdout","fs","fs","fs","fs","path","fs","fs","path","fs","path","fs","assert","path","path","assert","fs","fs","path","path","fs","assert","path","assert","path","fs","execSync","path","path","fs","execSync","omit","pick","path","fs","path","path","fs","path","path","packageManager","path","packageManager","omit","pick","fs","path","path","fs","assert","assert","name","fs","path","path","fs","fs","path","path","fs","fs","path","assert","path","packageManager","path","assert","fs","path","path","assert","fs","packageManager","omit","console"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "isolate-package",
|
|
3
|
-
"version": "1.9.0
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"description": "Isolate a monorepo package with its shared dependencies to form a self-contained directory, compatible with Firebase deploy",
|
|
5
5
|
"author": "Thijs Koerselman",
|
|
6
6
|
"license": "MIT",
|