isolate-package 1.2.0-rc2 → 1.2.0-rc3
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 +64 -49
- package/dist/index.mjs +59 -40
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -15,43 +15,51 @@ There is nothing Firebase specific to this solution but I am currently not aware
|
|
|
15
15
|
of other reasons to isolate a workspace package. If you find a different
|
|
16
16
|
use-case, I would love to hear about it.
|
|
17
17
|
|
|
18
|
-
In the
|
|
19
|
-
contents of a `package.json` file.
|
|
18
|
+
In the documentation and code you will see the word "manifest" a lot, and it
|
|
19
|
+
simply means to the contents of a `package.json` file.
|
|
20
20
|
|
|
21
21
|
## Features
|
|
22
22
|
|
|
23
23
|
- Zero-config for the vast majority of use-cases, with no manual steps involved.
|
|
24
24
|
- Support NPM, Yarn classic (v1) and current (v3) and PNPM.
|
|
25
|
-
-
|
|
25
|
+
- Fully compatible with the Firebase tools CLI, supporting 1st gen and 2nd gen
|
|
26
|
+
Firebase functions.
|
|
26
27
|
- Uses a pack/unpack approach to isolate only the files that would have been
|
|
27
28
|
part of a published package, so the output contains a minimal set of files.
|
|
28
29
|
- Isolates shared dependencies recursively. If package A depends on local
|
|
29
30
|
package B which depends on local package C, all of them will be isolated.
|
|
30
|
-
-
|
|
31
|
-
|
|
31
|
+
- Includes the lockfile so the isolated deployment should be deterministic. PNPM
|
|
32
|
+
lockfiles are not supported yet. See [lockfiles](#lockfiles) for more info.
|
|
32
33
|
- Optionally include devDependencies in the isolated output.
|
|
33
34
|
|
|
34
|
-
## Quickstart
|
|
35
|
+
## Firebase Deployment Quickstart
|
|
35
36
|
|
|
36
|
-
This describes the steps required for Firebase deployment
|
|
37
|
-
use-cases, assuming your are using a fairly typical monorepo setup, and your
|
|
38
|
-
`firebase.json` config lives in the package where you deploy from. If this
|
|
39
|
-
doesn't work for you, continue reading the [Prerequisites](#prerequisites)
|
|
40
|
-
section, as you might have to tweak your package.json files a bit.
|
|
37
|
+
This describes the steps required for Firebase deployment, assuming:
|
|
41
38
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
2. In the `firebase.json` config (assuming it lives in the package you deploy
|
|
46
|
-
from) set `"source"` to `"./isolate"` and `"predeploy"` to `["turbo build",
|
|
47
|
-
"isolate"]` or whatever fits your build tool.
|
|
48
|
-
3. That's it! You should now be able to deploy with `npx firebase deploy` or
|
|
49
|
-
`npx firebase deploy --only functions` if your package only contains code for
|
|
50
|
-
functions.
|
|
39
|
+
- You use a fairly typical monorepo setup
|
|
40
|
+
- Your `firebase.json` config lives in the root of the package that you like to
|
|
41
|
+
deploy to Firebase, hereafter referred to as the "target package".
|
|
51
42
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
43
|
+
If you use a different setup, just continue reading the
|
|
44
|
+
[Prerequisites](#prerequisites) section.
|
|
45
|
+
|
|
46
|
+
1. In the target package, install isolate-package and firebase-tools by running
|
|
47
|
+
`pnpm add isolate-package firebase-tools -D` or the Yarn / NPM equivalent. I
|
|
48
|
+
like to install firebase-tools as a devDependency in every firebase package,
|
|
49
|
+
but you could of course also use a global install if you prefer.
|
|
50
|
+
2. In the `firebase.json` config set `"source"` to `"./isolate"` and
|
|
51
|
+
`"predeploy"` to `["turbo build", "isolate"]` or whatever suits your build
|
|
52
|
+
tool.
|
|
53
|
+
3. From the target package root, you should now be able to deploy with `npx
|
|
54
|
+
firebase deploy` or `npx firebase deploy --only functions` in case your package
|
|
55
|
+
only contains code for Firebase functions.
|
|
56
|
+
|
|
57
|
+
I recommend keeping a `firebase.json` file inside each Firebase package (as
|
|
58
|
+
opposed to the monorepo root), because it allows you to deploy from multiple
|
|
59
|
+
independent packages. This give you more flexibility to organize your code. It
|
|
60
|
+
also makes it easy to deploy 1st gen functions next to 2nd gen functions, or mix
|
|
61
|
+
different node versions should you want to. Your bundle sizes and dependency
|
|
62
|
+
lists for each function might also decrease, which improves cold-start times.
|
|
55
63
|
|
|
56
64
|
## Prerequisites
|
|
57
65
|
|
|
@@ -335,30 +343,47 @@ The PNPM lockfile clearly has a structure describing the different packages by
|
|
|
335
343
|
their relative paths, and so to correct the lockfile it is adapted before being
|
|
336
344
|
stored to the isolate directory.
|
|
337
345
|
|
|
338
|
-
|
|
346
|
+
### Node 16 vs Node 18
|
|
347
|
+
|
|
348
|
+
It seems that when deploying to Node 16 Firebase the `npm ci` command fails with
|
|
349
|
+
a message like:
|
|
350
|
+
|
|
351
|
+
> `npm ci` can only install packages when your package.json and
|
|
352
|
+
> package-lock.json or npm-shrinkwrap.json are in sync. Please update your lock
|
|
353
|
+
> file with `npm install` before continuing.
|
|
354
|
+
|
|
355
|
+
I haven't been able to figure out what causes this, as the message is misleading
|
|
356
|
+
(the lockfile is clearly there).
|
|
357
|
+
|
|
358
|
+
With Node 18 this seems to have been resolved. If you experience this issue
|
|
359
|
+
there are two options:
|
|
360
|
+
|
|
361
|
+
- Upgrade to Node 18, by setting the `"runtime": "nodejs18"` in your
|
|
362
|
+
firebase.json config.
|
|
363
|
+
- Exclude the lockfile from deployment by setting `"excludeLockfile": false` in
|
|
364
|
+
your isolate.config.json file.
|
|
365
|
+
|
|
366
|
+
### PNPM Lockfiles disabled for now
|
|
367
|
+
|
|
368
|
+
There is still [an issue with the PNPM lockfile
|
|
339
369
|
conversion](https://github.com/0x80/isolate-package/issues/5) and it is unusable
|
|
340
370
|
at the moment. Until that is resolved, the lockfile is automatically excluded
|
|
341
371
|
for PNPM.
|
|
342
372
|
|
|
343
|
-
Personally, I don't see this as a big problem. I am
|
|
344
|
-
in my manifest, which means that a missing lockfile
|
|
345
|
-
unexpected patch versions, and I am not using
|
|
346
|
-
break on patch version changes.
|
|
373
|
+
Personally, I also use PNPM and I don't see this as a big problem. I am
|
|
374
|
+
declaring versions with `^` in my manifest, which means that a missing lockfile
|
|
375
|
+
can only ever result in unexpected patch versions, and I am not using
|
|
376
|
+
dependencies that are likely to break on patch version changes.
|
|
347
377
|
|
|
348
378
|
## Different Package Managers
|
|
349
379
|
|
|
350
|
-
Isolate package has been designed to work with all package managers.
|
|
351
|
-
|
|
352
|
-
complex real-life project.
|
|
380
|
+
Isolate package has been designed to work with all package managers. It has been
|
|
381
|
+
testing it with NPM 8, 9, Yarn 1.22, Yarn 3.6 and PNPM 8.
|
|
353
382
|
|
|
354
383
|
The isolate process will infer the package manager name and version from the
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
make some distinction in the code where needed, but until now it is hardly
|
|
359
|
-
necessary.
|
|
360
|
-
|
|
361
|
-
For example, the PNPM `pack` process is preferred over the default NPM `pack` if
|
|
384
|
+
type of lockfile found and the version that the OS reports for the installed
|
|
385
|
+
executable. This information is then used to change some of its behavior. For
|
|
386
|
+
example, the PNPM `pack` process is preferred over the default NPM `pack` if
|
|
362
387
|
PNPM in used, simply because it seems to be much faster.
|
|
363
388
|
|
|
364
389
|
The Firebase cloud deploy pipeline will use the package manager that matches
|
|
@@ -369,15 +394,5 @@ lockfile that was found in the deployed package.
|
|
|
369
394
|
If you are using Yarn 3 with zero-installs, the deployed package is not aware of
|
|
370
395
|
that, because the `.yarnrc` file and `.yarn` folder are located in the root of
|
|
371
396
|
your monorepo, and the version is not recorded as part of the lockfile. Therefor
|
|
372
|
-
the Firebase deploy
|
|
397
|
+
the Firebase deploy cloud pipeline will use Yarn 1 to install your
|
|
373
398
|
dependencies. I don't think that is an issue but it might be good to know.
|
|
374
|
-
|
|
375
|
-
## Binary as ESM module
|
|
376
|
-
|
|
377
|
-
The `isolate` binary is an ES module. It is required to have the `.mjs` file
|
|
378
|
-
extension, otherwise a non-ESM workspace will try to load it as commonJS. For
|
|
379
|
-
details on this read [this article from Alex
|
|
380
|
-
Rauschmayer](https://exploringjs.com/nodejs-shell-scripting/ch_creating-shell-scripts.html#node.js-esm-modules-as-standalone-shell-scripts-on-unix)
|
|
381
|
-
|
|
382
|
-
For PNPM the hashbang at the top of the script was not required, but Yarn 3 did
|
|
383
|
-
not seem to execute without it.
|
package/dist/index.mjs
CHANGED
|
@@ -2,13 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
4
|
import fs13 from "fs-extra";
|
|
5
|
-
import
|
|
5
|
+
import assert5 from "node:assert";
|
|
6
6
|
import path13 from "node:path";
|
|
7
7
|
import sourceMaps from "source-map-support";
|
|
8
8
|
|
|
9
9
|
// src/helpers/adapt-manifest-files.ts
|
|
10
|
-
import
|
|
11
|
-
import
|
|
10
|
+
import fs from "fs-extra";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
async function adaptManifestFiles(localDependencies, packagesRegistry, isolateDir) {
|
|
13
|
+
await Promise.all(
|
|
14
|
+
localDependencies.map(async (packageName) => {
|
|
15
|
+
const { manifest, rootRelativeDir } = packagesRegistry[packageName];
|
|
16
|
+
const outputManifest = adaptManifestWorkspaceDeps(
|
|
17
|
+
{ manifest, packagesRegistry, parentRootRelativeDir: rootRelativeDir },
|
|
18
|
+
{ includeDevDependencies: getConfig().includeDevDependencies }
|
|
19
|
+
);
|
|
20
|
+
await fs.writeFile(
|
|
21
|
+
path.join(isolateDir, rootRelativeDir, "package.json"),
|
|
22
|
+
JSON.stringify(outputManifest, null, 2)
|
|
23
|
+
);
|
|
24
|
+
})
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// src/helpers/adapt-manifest-workspace-deps.ts
|
|
29
|
+
import { omit } from "lodash-es";
|
|
12
30
|
|
|
13
31
|
// src/utils/filter-object-undefined.ts
|
|
14
32
|
function filterObjectUndefined(object) {
|
|
@@ -51,11 +69,11 @@ function inspectValue(value) {
|
|
|
51
69
|
}
|
|
52
70
|
|
|
53
71
|
// src/utils/json.ts
|
|
54
|
-
import
|
|
72
|
+
import fs2 from "fs-extra";
|
|
55
73
|
import stripJsonComments from "strip-json-comments";
|
|
56
74
|
function readTypedJsonSync(filePath) {
|
|
57
75
|
try {
|
|
58
|
-
const rawContent =
|
|
76
|
+
const rawContent = fs2.readFileSync(filePath, "utf-8");
|
|
59
77
|
const data = JSON.parse(stripJsonComments(rawContent));
|
|
60
78
|
return data;
|
|
61
79
|
} catch (err) {
|
|
@@ -66,7 +84,7 @@ function readTypedJsonSync(filePath) {
|
|
|
66
84
|
}
|
|
67
85
|
async function readTypedJson(filePath) {
|
|
68
86
|
try {
|
|
69
|
-
const rawContent = await
|
|
87
|
+
const rawContent = await fs2.readFile(filePath, "utf-8");
|
|
70
88
|
const data = JSON.parse(rawContent);
|
|
71
89
|
return data;
|
|
72
90
|
} catch (err) {
|
|
@@ -103,7 +121,7 @@ function createLogger(logLevel) {
|
|
|
103
121
|
|
|
104
122
|
// src/utils/pack.ts
|
|
105
123
|
import { exec } from "node:child_process";
|
|
106
|
-
import
|
|
124
|
+
import path2 from "node:path";
|
|
107
125
|
async function pack(srcDir, destDir) {
|
|
108
126
|
const log2 = createLogger(getConfig().logLevel);
|
|
109
127
|
const cwd = process.cwd();
|
|
@@ -141,27 +159,27 @@ async function pack(srcDir, destDir) {
|
|
|
141
159
|
const packedFileName = stdout.trim();
|
|
142
160
|
log2.debug("Packed", packedFileName);
|
|
143
161
|
process.chdir(cwd);
|
|
144
|
-
return
|
|
162
|
+
return path2.join(destDir, packedFileName);
|
|
145
163
|
}
|
|
146
164
|
}
|
|
147
165
|
}
|
|
148
166
|
|
|
149
167
|
// src/utils/unpack.ts
|
|
150
|
-
import
|
|
168
|
+
import fs3 from "fs-extra";
|
|
151
169
|
import tar from "tar-fs";
|
|
152
170
|
import { createGunzip } from "zlib";
|
|
153
171
|
async function unpack(filePath, unpackDir) {
|
|
154
172
|
await new Promise((resolve, reject) => {
|
|
155
|
-
|
|
173
|
+
fs3.createReadStream(filePath).pipe(createGunzip()).pipe(tar.extract(unpackDir)).on("finish", () => resolve()).on("error", (err) => reject(err));
|
|
156
174
|
});
|
|
157
175
|
}
|
|
158
176
|
|
|
159
177
|
// src/utils/yaml.ts
|
|
160
|
-
import
|
|
178
|
+
import fs4 from "fs-extra";
|
|
161
179
|
import yaml from "yaml";
|
|
162
180
|
function readTypedYamlSync(filePath) {
|
|
163
181
|
try {
|
|
164
|
-
const rawContent =
|
|
182
|
+
const rawContent = fs4.readFileSync(filePath, "utf-8");
|
|
165
183
|
const data = yaml.parse(rawContent);
|
|
166
184
|
return data;
|
|
167
185
|
} catch (err) {
|
|
@@ -171,30 +189,10 @@ function readTypedYamlSync(filePath) {
|
|
|
171
189
|
}
|
|
172
190
|
}
|
|
173
191
|
function writeTypedYamlSync(filePath, content) {
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// src/helpers/adapt-manifest-files.ts
|
|
178
|
-
async function adaptManifestFiles(localDependencies, packagesRegistry, isolateDir) {
|
|
179
|
-
const log2 = createLogger(getConfig().logLevel);
|
|
180
|
-
await Promise.all(
|
|
181
|
-
localDependencies.map(async (packageName) => {
|
|
182
|
-
const { manifest, rootRelativeDir } = packagesRegistry[packageName];
|
|
183
|
-
log2.debug("Adapting manifest file:", packageName);
|
|
184
|
-
const outputManifest = adaptManifestWorkspaceDeps(
|
|
185
|
-
{ manifest, packagesRegistry, parentRootRelativeDir: rootRelativeDir },
|
|
186
|
-
{ includeDevDependencies: getConfig().includeDevDependencies }
|
|
187
|
-
);
|
|
188
|
-
await fs4.writeFile(
|
|
189
|
-
path2.join(isolateDir, rootRelativeDir, "package.json"),
|
|
190
|
-
JSON.stringify(outputManifest, null, 2)
|
|
191
|
-
);
|
|
192
|
-
})
|
|
193
|
-
);
|
|
192
|
+
fs4.writeFileSync(filePath, yaml.stringify(content), "utf-8");
|
|
194
193
|
}
|
|
195
194
|
|
|
196
195
|
// src/helpers/adapt-manifest-workspace-deps.ts
|
|
197
|
-
import { omit } from "lodash-es";
|
|
198
196
|
function adaptManifestWorkspaceDeps({
|
|
199
197
|
manifest,
|
|
200
198
|
packagesRegistry,
|
|
@@ -285,6 +283,7 @@ import { set } from "lodash-es";
|
|
|
285
283
|
import path8 from "node:path";
|
|
286
284
|
|
|
287
285
|
// src/helpers/find-packages-globs.ts
|
|
286
|
+
import assert3 from "node:assert";
|
|
288
287
|
import path7 from "node:path";
|
|
289
288
|
|
|
290
289
|
// src/helpers/detect-package-manager.ts
|
|
@@ -399,7 +398,16 @@ function findPackagesGlobs(workspaceRootDir) {
|
|
|
399
398
|
`No workspaces field found in ${workspaceRootManifestPath}`
|
|
400
399
|
);
|
|
401
400
|
}
|
|
402
|
-
|
|
401
|
+
if (Array.isArray(workspaces)) {
|
|
402
|
+
return workspaces;
|
|
403
|
+
} else {
|
|
404
|
+
const workspacesObject = workspaces;
|
|
405
|
+
assert3(
|
|
406
|
+
workspacesObject.packages,
|
|
407
|
+
"workspaces.packages must be an array"
|
|
408
|
+
);
|
|
409
|
+
return workspacesObject.packages;
|
|
410
|
+
}
|
|
403
411
|
}
|
|
404
412
|
}
|
|
405
413
|
}
|
|
@@ -495,7 +503,7 @@ function listLocalDependencies(manifest, packagesRegistry, { includeDevDependenc
|
|
|
495
503
|
import path10 from "node:path";
|
|
496
504
|
|
|
497
505
|
// src/helpers/pack-dependencies.ts
|
|
498
|
-
import
|
|
506
|
+
import assert4 from "node:assert";
|
|
499
507
|
async function packDependencies({
|
|
500
508
|
/**
|
|
501
509
|
* All packages found in the monorepo by workspaces declaration
|
|
@@ -518,7 +526,7 @@ async function packDependencies({
|
|
|
518
526
|
const packedFileByName = {};
|
|
519
527
|
for (const dependency of localDependencies) {
|
|
520
528
|
const def = packagesRegistry[dependency];
|
|
521
|
-
|
|
529
|
+
assert4(dependency, `Failed to find package definition for ${dependency}`);
|
|
522
530
|
const { name } = def.manifest;
|
|
523
531
|
if (packedFileByName[name]) {
|
|
524
532
|
log2.debug(`Skipping ${name} because it has already been packed`);
|
|
@@ -597,7 +605,7 @@ async function start() {
|
|
|
597
605
|
const targetPackageDir = config.targetPackagePath ? path13.join(process.cwd(), config.targetPackagePath) : process.cwd();
|
|
598
606
|
const workspaceRootDir = config.targetPackagePath ? process.cwd() : path13.join(targetPackageDir, config.workspaceRoot);
|
|
599
607
|
const buildOutputDir = await getBuildOutputDir(targetPackageDir);
|
|
600
|
-
|
|
608
|
+
assert5(
|
|
601
609
|
fs13.existsSync(buildOutputDir),
|
|
602
610
|
`Failed to find build output path at ${buildOutputDir}. Please make sure you build the source before isolating it.`
|
|
603
611
|
);
|
|
@@ -621,9 +629,13 @@ async function start() {
|
|
|
621
629
|
const targetPackageManifest = await readTypedJson(
|
|
622
630
|
path13.join(targetPackageDir, "package.json")
|
|
623
631
|
);
|
|
624
|
-
const
|
|
625
|
-
log.debug(
|
|
626
|
-
|
|
632
|
+
const packageManager2 = detectPackageManager(workspaceRootDir);
|
|
633
|
+
log.debug(
|
|
634
|
+
"Detected package manager",
|
|
635
|
+
packageManager2.name,
|
|
636
|
+
packageManager2.version
|
|
637
|
+
);
|
|
638
|
+
if (packageManager2.name === "pnpm") {
|
|
627
639
|
config.excludeLockfile = true;
|
|
628
640
|
}
|
|
629
641
|
const packagesRegistry = await createPackagesRegistry(
|
|
@@ -668,6 +680,13 @@ async function start() {
|
|
|
668
680
|
isolateDir,
|
|
669
681
|
packagesRegistry
|
|
670
682
|
});
|
|
683
|
+
if (packageManager2.name === "npm") {
|
|
684
|
+
const npmrcPath = path13.join(workspaceRootDir, ".npmrc");
|
|
685
|
+
if (fs13.existsSync(npmrcPath)) {
|
|
686
|
+
await fs13.copyFileSync(npmrcPath, path13.join(isolateDir, ".npmrc"));
|
|
687
|
+
log.debug("Copied .npmrc file to the isolate output");
|
|
688
|
+
}
|
|
689
|
+
}
|
|
671
690
|
}
|
|
672
691
|
log.debug(
|
|
673
692
|
"Deleting temporary directory",
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/helpers/adapt-manifest-files.ts","../src/utils/filter-object-undefined.ts","../src/utils/get-error-message.ts","../src/utils/get-relative-path.ts","../src/utils/inspect-value.ts","../src/utils/json.ts","../src/utils/logger.ts","../src/utils/pack.ts","../src/utils/unpack.ts","../src/utils/yaml.ts","../src/helpers/adapt-manifest-workspace-deps.ts","../src/helpers/adapt-target-package-manifest.ts","../src/helpers/config.ts","../src/helpers/create-packages-registry.ts","../src/helpers/find-packages-globs.ts","../src/helpers/detect-package-manager.ts","../src/helpers/process-lockfile.ts","../src/helpers/get-build-output-dir.ts","../src/helpers/list-local-dependencies.ts","../src/helpers/manifest.ts","../src/helpers/pack-dependencies.ts","../src/helpers/patch-workspace-entries.ts","../src/helpers/process-build-output-files.ts","../src/helpers/unpack-dependencies.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * A word about used terminology:\n *\n * The various package managers, while being very similar, seem to use a\n * different definition for the term \"workspace\". If you want to read the code it\n * might be good to know that I consider the workspace to be the monorepo itself,\n * in other words, the overall structure that holds all the packages.\n */\n\nimport fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport sourceMaps from \"source-map-support\";\nimport {\n PackageManifest,\n adaptManifestFiles,\n adaptTargetPackageManifest,\n createPackagesRegistry,\n detectPackageManager,\n getBuildOutputDir,\n getConfig,\n listLocalDependencies,\n packDependencies,\n processBuildOutputFiles,\n processLockfile,\n unpackDependencies,\n} from \"~/helpers\";\nimport { createLogger, getRootRelativePath, readTypedJson } from \"~/utils\";\n\nconst config = getConfig();\nconst log = createLogger(config.logLevel);\n\nsourceMaps.install();\n\nasync function start() {\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\", 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 { name, version } = detectPackageManager(workspaceRootDir);\n\n log.debug(\"Detected package manager\", name, version);\n\n /**\n * Disable lock files for PNPM because they are not yet supported.\n */\n if (name === \"pnpm\") {\n config.excludeLockfile = true;\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 localDependencies = listLocalDependencies(\n targetPackageManifest,\n packagesRegistry,\n {\n includeDevDependencies: config.includeDevDependencies,\n }\n );\n\n const packedFilesByName = await packDependencies({\n localDependencies,\n packagesRegistry,\n packDestinationDir: tmpDir,\n });\n\n await unpackDependencies(\n packedFilesByName,\n packagesRegistry,\n tmpDir,\n isolateDir\n );\n\n /**\n * Adapt the manifest files for all the unpacked local dependencies\n */\n await adaptManifestFiles(localDependencies, packagesRegistry, isolateDir);\n\n /**\n * Pack the target package directory, and unpack it in the isolate location\n */\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 if (config.excludeLockfile) {\n log.warn(\"Excluding the lockfile from the isolate output\");\n } else {\n /**\n * Copy and adapt the lockfile\n */\n await processLockfile({\n workspaceRootDir,\n targetPackageName: targetPackageManifest.name,\n isolateDir,\n packagesRegistry,\n });\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 temporary directory\",\n getRootRelativePath(tmpDir, workspaceRootDir)\n );\n await fs.remove(tmpDir);\n\n log.debug(\"Stored isolate output at\", isolateDir);\n\n log.info(\"Isolate completed\");\n}\n\nstart().catch((err) => {\n if (err instanceof Error) {\n log.error(err.stack);\n process.exit(1);\n } else {\n console.error(err);\n }\n});\n\nprocess.on(\"unhandledRejection\", log.error);\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport {\n PackagesRegistry,\n adaptManifestWorkspaceDeps,\n getConfig,\n} from \"~/helpers\";\nimport { createLogger } from \"~/utils\";\n\nexport async function adaptManifestFiles(\n localDependencies: string[],\n packagesRegistry: PackagesRegistry,\n isolateDir: string\n) {\n const log = createLogger(getConfig().logLevel);\n\n await Promise.all(\n localDependencies.map(async (packageName) => {\n const { manifest, rootRelativeDir } = packagesRegistry[packageName];\n\n log.debug(\"Adapting manifest file:\", packageName);\n\n const outputManifest = adaptManifestWorkspaceDeps(\n { manifest, packagesRegistry, parentRootRelativeDir: rootRelativeDir },\n { includeDevDependencies: getConfig().includeDevDependencies }\n );\n\n await fs.writeFile(\n path.join(isolateDir, rootRelativeDir, \"package.json\"),\n JSON.stringify(outputManifest, null, 2)\n );\n })\n );\n}\n","export function filterObjectUndefined(object: Record<string, unknown>) {\n return Object.fromEntries(\n Object.entries(object).filter(([_, value]) => value !== undefined)\n );\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\n * like with 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 { 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/**\n * @TODO pass in zod schema and validate\n */\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 chalk from \"chalk\";\nimport { IsolateConfigResolved } from \"~/helpers\";\n\nexport type Logger = {\n debug(...args: any[]): void;\n info(...args: any[]): void;\n warn(...args: any[]): void;\n error(...args: any[]): void;\n};\n\nexport function createLogger(\n logLevel: IsolateConfigResolved[\"logLevel\"]\n): Logger {\n return {\n debug(...args: any[]) {\n if (logLevel === \"debug\") {\n console.log(chalk.blue(\"debug\"), ...args);\n }\n },\n info(...args: any[]) {\n if (logLevel === \"debug\" || logLevel === \"info\") {\n console.log(chalk.green(\"info\"), ...args);\n }\n },\n warn(...args: any[]) {\n if (logLevel === \"debug\" || logLevel === \"info\" || logLevel === \"warn\") {\n console.log(chalk.yellow(\"warning\"), ...args);\n }\n },\n error(...args: any[]) {\n console.log(chalk.red(\"error\"), ...args);\n },\n };\n}\n","import { exec } from \"node:child_process\";\nimport path from \"node:path\";\nimport { getConfig, usePackageManager } from \"~/helpers\";\nimport { createLogger } from \"./logger\";\n\nexport async function pack(srcDir: string, destDir: string) {\n const log = createLogger(getConfig().logLevel);\n const cwd = process.cwd();\n process.chdir(srcDir);\n\n const { name } = usePackageManager();\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 switch (name) {\n case \"pnpm\": {\n const stdout = await new Promise<string>((resolve, reject) => {\n exec(\n `pnpm pack --pack-destination ${destDir}`,\n (err, stdout, stderr) => {\n if (err) {\n log.error(stderr);\n return reject(err);\n }\n\n resolve(stdout);\n }\n );\n });\n\n /**\n * @TODO use a regex to see if the result from stdout is a valid file\n * path. It could be that other output like warnings are printed. In that\n * case we can to log the stdout.\n */\n\n /**\n * Trim newlines and whitespace\n */\n const packedFilePath = stdout.trim();\n\n // log.debug(\"Packed\", path.basename(packedFilePath));\n log.debug(\"Packed\", packedFilePath);\n\n process.chdir(cwd);\n return packedFilePath;\n }\n\n case \"yarn\":\n case \"npm\": {\n const stdout = await new Promise<string>((resolve, reject) => {\n exec(`npm pack --pack-destination ${destDir}`, (err, stdout) => {\n if (err) {\n return reject(err);\n }\n\n resolve(stdout);\n });\n });\n\n /**\n * Trim newlines and whitespace\n */\n const packedFileName = stdout.trim();\n\n log.debug(\"Packed\", packedFileName);\n\n process.chdir(cwd);\n return path.join(destDir, packedFileName);\n }\n }\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 /**\n * @TODO add some zod validation maybe\n */\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 /**\n * @TODO add some zod validation maybe\n */\n fs.writeFileSync(filePath, yaml.stringify(content), \"utf-8\");\n}\n","import { omit } from \"lodash-es\";\nimport { filterObjectUndefined } from \"~/utils\";\nimport { PackageManifest, PackagesRegistry, patchWorkspaceEntries } from \".\";\n\nexport function adaptManifestWorkspaceDeps(\n {\n manifest,\n packagesRegistry,\n parentRootRelativeDir,\n }: {\n manifest: PackageManifest;\n packagesRegistry: PackagesRegistry;\n parentRootRelativeDir?: string;\n },\n opts: { includeDevDependencies?: boolean } = {}\n): PackageManifest {\n return Object.assign(\n omit(manifest, [\"scripts\", \"devDependencies\"]),\n filterObjectUndefined({\n dependencies: manifest.dependencies\n ? patchWorkspaceEntries(\n manifest.dependencies,\n packagesRegistry,\n parentRootRelativeDir\n )\n : undefined,\n devDependencies:\n opts.includeDevDependencies && manifest.devDependencies\n ? patchWorkspaceEntries(\n manifest.devDependencies,\n packagesRegistry,\n parentRootRelativeDir\n )\n : undefined,\n })\n );\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport {\n PackageManifest,\n PackagesRegistry,\n adaptManifestWorkspaceDeps,\n getConfig,\n} from \"~/helpers\";\n\nexport async function adaptTargetPackageManifest(\n manifest: PackageManifest,\n packagesRegistry: PackagesRegistry,\n isolateDir: string\n) {\n const outputManifest = adaptManifestWorkspaceDeps(\n {\n manifest,\n packagesRegistry,\n },\n { includeDevDependencies: getConfig().includeDevDependencies }\n );\n\n await fs.writeFile(\n path.join(isolateDir, \"package.json\"),\n JSON.stringify(outputManifest, null, 2)\n );\n}\n","import fs from \"fs-extra\";\nimport { isEmpty } from \"lodash-es\";\nimport path from \"node:path\";\nimport { createLogger, 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 excludeLockfile: boolean;\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 excludeLockfile: false,\n};\n\n/**\n * Only initialize the configuration once, and keeping it here for subsequent\n * calls to getConfig.\n */\nlet __config: IsolateConfigResolved | undefined;\n\nconst validConfigKeys = Object.keys(configDefaults);\n\nconst CONFIG_FILE_NAME = \"isolate.config.json\";\n\ntype LogLevel = IsolateConfigResolved[\"logLevel\"];\n\nexport function getConfig(): IsolateConfigResolved {\n if (__config) {\n return __config;\n }\n\n /**\n * Since the logLevel is set via config we can't use it to determine if we\n * should output verbose logging as part of the config loading process. Using\n * the env var ISOLATE_CONFIG_LOG_LEVEL you have the option to log debug\n * output.\n */\n const log = createLogger(\n (process.env.ISOLATE_CONFIG_LOG_LEVEL as LogLevel) ?? \"warn\"\n );\n\n const configFilePath = path.join(process.cwd(), CONFIG_FILE_NAME);\n\n log.debug(`Attempting to load config from ${configFilePath}`);\n\n const configFromFile = fs.existsSync(configFilePath)\n ? readTypedJsonSync<IsolateConfig>(configFilePath)\n : {};\n\n const foreignKeys = Object.keys(configFromFile).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 configFromFile\n ) satisfies IsolateConfigResolved;\n\n log.debug(\"Using configuration:\", inspectValue(config));\n\n __config = config;\n return config;\n}\n","import fs from \"fs-extra\";\nimport { globSync } from \"glob\";\nimport { set } from \"lodash-es\";\nimport path from \"node:path\";\nimport { createLogger, readTypedJson } from \"~/utils\";\nimport { getConfig } from \"./config\";\nimport { findPackagesGlobs } from \"./find-packages-globs\";\n\nexport type PackageManifest = {\n name: string;\n packageManager?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n main: string;\n module?: string;\n exports?: Record<string, { require: string; import: string }>;\n files: string[];\n version?: string;\n typings?: string;\n scripts?: Record<string, string>;\n};\n\nexport type WorkspacePackageInfo = {\n absoluteDir: string;\n /**\n * The path of the package relative to the workspace root. This is the path\n * referenced in the lock file.\n */\n rootRelativeDir: string;\n /**\n * The package.json file contents\n */\n manifest: PackageManifest;\n};\n\nexport type PackagesRegistry = Record<string, WorkspacePackageInfo>;\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 contains\n * 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 = createLogger(getConfig().logLevel);\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 /**\n * Make sure to filter any loose files that might hang around.\n */\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>(\n (acc, info) => (info ? set(acc, info.manifest.name, info) : acc),\n {}\n );\n\n process.chdir(cwd);\n\n return registry;\n}\n","import path from \"node:path\";\nimport {\n createLogger,\n inspectValue,\n readTypedJsonSync,\n readTypedYamlSync,\n} from \"~/utils\";\nimport { getConfig } from \"./config\";\nimport { usePackageManager } from \"./detect-package-manager\";\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 = createLogger(getConfig().logLevel);\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 return workspaces;\n }\n }\n}\n","import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport { execSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport { createLogger, readTypedJsonSync } from \"~/utils\";\nimport { getConfig } from \"./config\";\nimport { PackageManifest } from \"./create-packages-registry\";\nimport { getLockfileFileName } from \"./process-lockfile\";\n\nconst 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\nlet packageManager: PackageManager | undefined;\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. I doubt it is useful after all\n */\n // packageManager =\n // inferFromManifest(workspaceRoot) ?? inferFromFiles(workspaceRoot);\n\n packageManager = inferFromFiles(workspaceRoot);\n return packageManager;\n}\n\nfunction inferFromManifest(workspaceRoot: string) {\n const log = createLogger(getConfig().logLevel);\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\nfunction 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 throw new Error(`Failed to detect package manager`);\n}\n\nfunction getVersion(packageManagerName: PackageManagerName): string {\n const buffer = execSync(`${packageManagerName} --version`);\n return buffer.toString().trim();\n}\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","import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { createLogger, readTypedYamlSync, writeTypedYamlSync } from \"~/utils\";\nimport { getConfig } from \"./config\";\nimport { PackagesRegistry } from \"./create-packages-registry\";\nimport {\n PackageManagerName,\n usePackageManager,\n} from \"./detect-package-manager\";\n\ntype PackagePath = string;\n\ntype PnpmLockfile = {\n lockfileVersion: string;\n importers: Record<\n PackagePath,\n {\n dependencies?: Record<string, unknown>;\n devDependencies?: Record<string, unknown>;\n }\n >;\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\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 function processLockfile({\n workspaceRootDir,\n targetPackageName,\n packagesRegistry,\n isolateDir,\n}: {\n workspaceRootDir: string;\n targetPackageName: string;\n packagesRegistry: PackagesRegistry;\n isolateDir: string;\n}) {\n const log = createLogger(getConfig().logLevel);\n\n const targetPackageRelativeDir =\n packagesRegistry[targetPackageName].rootRelativeDir;\n\n const { name } = usePackageManager();\n\n const fileName = getLockfileFileName(name);\n\n const lockfileSrcPath = path.join(workspaceRootDir, fileName);\n const lockfileDstPath = path.join(isolateDir, fileName);\n\n switch (name) {\n /**\n * It seems that at least for Yarn v1 and NPM v3 lockfile the content is not\n * dependent on the workspace packages structure, so I am assuming we can\n * just copy it over.\n */\n case \"npm\":\n case \"yarn\": {\n fs.copyFileSync(lockfileSrcPath, lockfileDstPath);\n log.debug(\"Copied lockfile to\", lockfileDstPath);\n return;\n }\n case \"pnpm\": {\n const origLockfile = readTypedYamlSync<PnpmLockfile>(lockfileSrcPath);\n\n log.debug(\"Read PNPM lockfile, version:\", origLockfile.lockfileVersion);\n\n const adaptedLockfile = structuredClone(origLockfile);\n\n const targetPackageDef =\n adaptedLockfile.importers[targetPackageRelativeDir];\n\n assert(\n targetPackageDef,\n `Failed to find target package in lockfile at importers[${targetPackageRelativeDir}]`\n );\n /**\n * Overwrite the root importer with the target package importer contents\n */\n adaptedLockfile.importers[\".\"] = targetPackageDef;\n\n /**\n * Delete the target package original importer. Not really necessary.\n */\n delete adaptedLockfile.importers[targetPackageRelativeDir];\n\n writeTypedYamlSync(lockfileDstPath, adaptedLockfile);\n\n log.debug(\"Stored adapted lockfile at\", lockfileDstPath);\n\n return;\n }\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport outdent from \"outdent\";\nimport { getConfig } from \"~/helpers\";\nimport { createLogger, readTypedJson } from \"~/utils\";\n\nexport async function getBuildOutputDir(targetPackageDir: string) {\n const config = getConfig();\n const log = createLogger(getConfig().logLevel);\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 log.debug(\"Looking for tsconfig at:\", tsconfigPath);\n\n if (fs.existsSync(tsconfigPath)) {\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 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 { PackageManifest, PackagesRegistry } from \"./create-packages-registry\";\n\n/**\n * Recursively list the packages from dependencies (and optionally\n * devDependencies) that are found in the workspace.\n *\n * Here we do not need to rely on packages being declared as \"workspace:\" in the\n * manifest. We can simply compare the package names with the list of packages\n * that were found via the workspace glob patterns and added to the registry.\n */\nexport function listLocalDependencies(\n manifest: PackageManifest,\n packagesRegistry: PackagesRegistry,\n { includeDevDependencies = false } = {}\n): string[] {\n const allWorkspacePackageNames = Object.keys(packagesRegistry);\n\n const localDependencyPackageNames = (\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 nestedLocalDependencies = localDependencyPackageNames.flatMap(\n (packageName) =>\n listLocalDependencies(\n packagesRegistry[packageName].manifest,\n packagesRegistry,\n { includeDevDependencies }\n )\n );\n\n return localDependencyPackageNames.concat(nestedLocalDependencies);\n}\n","import path from \"node:path\";\nimport { readTypedJson } from \"~/utils\";\nimport { PackageManifest } from \"./create-packages-registry\";\n\nexport async function importManifest(packageDir: string) {\n return readTypedJson<PackageManifest>(path.join(packageDir, \"package.json\"));\n}\n","import assert from \"node:assert\";\nimport { createLogger, pack } from \"~/utils\";\nimport { getConfig } from \"./config\";\nimport { PackagesRegistry } from \"./create-packages-registry\";\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 /**\n * All packages found in the monorepo by workspaces declaration\n */\n packagesRegistry,\n /**\n * The package names that appear to be local dependencies\n */\n localDependencies,\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 localDependencies: string[];\n packDestinationDir: string;\n}) {\n const config = getConfig();\n const log = createLogger(config.logLevel);\n\n const packedFileByName: Record<string, string> = {};\n\n for (const dependency of localDependencies) {\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(def.absoluteDir, packDestinationDir);\n\n /**\n * @TODO call recursively\n */\n }\n\n return packedFileByName;\n}\n","import path from \"node:path\";\nimport { createLogger } from \"~/utils\";\nimport { getConfig } from \"./config\";\nimport { PackagesRegistry } from \"./create-packages-registry\";\n\nexport function patchWorkspaceEntries(\n dependencies: Record<string, string>,\n packagesRegistry: PackagesRegistry,\n parentRootRelativeDir?: string\n) {\n const log = createLogger(getConfig().logLevel);\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 shared dependencies are used (local deps linking to other\n * local deps), the parentRootRelativeDir will be passed in, and we\n * store the relative path to the isolate/packages directory, as is\n * required by some package managers.\n */\n const relativePath = parentRootRelativeDir\n ? path.relative(parentRootRelativeDir, `./${def.rootRelativeDir}`)\n : `./${def.rootRelativeDir}`;\n\n const linkPath = `file:${relativePath}`;\n // const linkPath = `file:${def.rootRelativeDir}`;\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 fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { pack, unpack } from \"~/utils\";\n\nexport async function processBuildOutputFiles({\n targetPackageDir,\n tmpDir,\n isolateDir,\n}: {\n targetPackageDir: string;\n tmpDir: string;\n isolateDir: string;\n}) {\n const packedFilePath = await pack(targetPackageDir, tmpDir);\n const unpackDir = path.join(tmpDir, \"target\");\n await unpack(packedFilePath, unpackDir);\n await fs.copy(path.join(unpackDir, \"package\"), isolateDir);\n}\n","import fs from \"fs-extra\";\nimport { join } from \"node:path\";\nimport { getIsolateRelativePath } from \"~/utils\";\nimport { createLogger } from \"~/utils/logger\";\nimport { PackagesRegistry, getConfig } from \".\";\nimport { unpack } from \"../utils/unpack\";\n\nexport async function unpackDependencies(\n packedFilesByName: Record<string, string>,\n packagesRegistry: PackagesRegistry,\n tmpDir: string,\n isolateDir: string\n) {\n const log = createLogger(getConfig().logLevel);\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\", 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"],"mappings":"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","names":["fs","assert","path","fs","path","path","log","stdout","fs","fs","fs","log","fs","path","fs","path","fs","path","fs","path","log","path","fs","config","fs","path","path","fs","assert","path","fs","path","log","path","fs","fs","path","log","packageManager","path","log","fs","path","fs","path","config","log","path","fs","path","assert","config","log","assert","path","log","path","fs","path","path","fs","fs","log","fs","path","assert","fs"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/helpers/adapt-manifest-files.ts","../src/helpers/adapt-manifest-workspace-deps.ts","../src/utils/filter-object-undefined.ts","../src/utils/get-error-message.ts","../src/utils/get-relative-path.ts","../src/utils/inspect-value.ts","../src/utils/json.ts","../src/utils/logger.ts","../src/utils/pack.ts","../src/utils/unpack.ts","../src/utils/yaml.ts","../src/helpers/adapt-target-package-manifest.ts","../src/helpers/config.ts","../src/helpers/create-packages-registry.ts","../src/helpers/find-packages-globs.ts","../src/helpers/detect-package-manager.ts","../src/helpers/process-lockfile.ts","../src/helpers/get-build-output-dir.ts","../src/helpers/list-local-dependencies.ts","../src/helpers/manifest.ts","../src/helpers/pack-dependencies.ts","../src/helpers/patch-workspace-entries.ts","../src/helpers/process-build-output-files.ts","../src/helpers/unpack-dependencies.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * For PNPM the hashbang at the top of the script was not required, but Yarn 3\n * did not seem to execute without it.\n */\n\n/**\n * A word about used terminology:\n *\n * The various package managers, while being very similar, seem to use a\n * different definition for the term \"workspace\". If you want to read the code\n * it might be good to know that I consider the workspace to be the monorepo\n * itself, in other words, the overall structure that holds all the packages.\n */\nimport fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport { exec } from \"node:child_process\";\nimport path from \"node:path\";\nimport sourceMaps from \"source-map-support\";\nimport {\n PackageManifest,\n adaptManifestFiles,\n adaptTargetPackageManifest,\n createPackagesRegistry,\n detectPackageManager,\n getBuildOutputDir,\n getConfig,\n listLocalDependencies,\n packDependencies,\n processBuildOutputFiles,\n processLockfile,\n unpackDependencies,\n} from \"~/helpers\";\nimport { createLogger, getRootRelativePath, readTypedJson } from \"~/utils\";\n\nconst config = getConfig();\nconst log = createLogger(config.logLevel);\n\nsourceMaps.install();\n\nasync function start() {\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\", 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 * Disable lock files for PNPM because they are not yet supported.\n */\n if (packageManager.name === \"pnpm\") {\n config.excludeLockfile = true;\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 localDependencies = listLocalDependencies(\n targetPackageManifest,\n packagesRegistry,\n {\n includeDevDependencies: config.includeDevDependencies,\n }\n );\n\n const packedFilesByName = await packDependencies({\n localDependencies,\n packagesRegistry,\n packDestinationDir: tmpDir,\n });\n\n await unpackDependencies(\n packedFilesByName,\n packagesRegistry,\n tmpDir,\n isolateDir\n );\n\n /**\n * Adapt the manifest files for all the unpacked local dependencies\n */\n await adaptManifestFiles(localDependencies, packagesRegistry, isolateDir);\n\n /**\n * Pack the target package directory, and unpack it in the isolate location\n */\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 if (config.excludeLockfile) {\n log.warn(\"Excluding the lockfile from the isolate output\");\n } else {\n /**\n * Copy and adapt the lockfile\n */\n await processLockfile({\n workspaceRootDir,\n targetPackageName: targetPackageManifest.name,\n isolateDir,\n packagesRegistry,\n });\n\n if (packageManager.name === \"npm\") {\n /**\n * If there is an .npmrc file in the workspace root, copy it to the\n * isolate because the settings there could affect how the lockfile is\n * resolved.\n *\n * Also see https://github.com/npm/cli/issues/5113\n */\n const npmrcPath = path.join(workspaceRootDir, \".npmrc\");\n\n if (fs.existsSync(npmrcPath)) {\n await fs.copyFileSync(npmrcPath, path.join(isolateDir, \".npmrc\"));\n log.debug(\"Copied .npmrc file to the isolate output\");\n }\n }\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 temporary directory\",\n getRootRelativePath(tmpDir, workspaceRootDir)\n );\n await fs.remove(tmpDir);\n\n log.debug(\"Stored isolate output at\", isolateDir);\n\n log.info(\"Isolate completed\");\n}\n\nstart().catch((err) => {\n if (err instanceof Error) {\n log.error(err.stack);\n process.exit(1);\n } else {\n console.error(err);\n }\n});\n\nprocess.on(\"unhandledRejection\", log.error);\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport {\n PackagesRegistry,\n adaptManifestWorkspaceDeps,\n getConfig,\n} from \"~/helpers\";\nimport { createLogger } from \"~/utils\";\n\nexport async function adaptManifestFiles(\n localDependencies: string[],\n packagesRegistry: PackagesRegistry,\n isolateDir: string\n) {\n await Promise.all(\n localDependencies.map(async (packageName) => {\n const { manifest, rootRelativeDir } = packagesRegistry[packageName];\n\n const outputManifest = adaptManifestWorkspaceDeps(\n { manifest, packagesRegistry, parentRootRelativeDir: rootRelativeDir },\n { includeDevDependencies: getConfig().includeDevDependencies }\n );\n\n await fs.writeFile(\n path.join(isolateDir, rootRelativeDir, \"package.json\"),\n JSON.stringify(outputManifest, null, 2)\n );\n })\n );\n}\n","import { omit } from \"lodash-es\";\nimport { filterObjectUndefined } from \"~/utils\";\nimport { PackageManifest, PackagesRegistry, patchWorkspaceEntries } from \".\";\n\nexport function adaptManifestWorkspaceDeps(\n {\n manifest,\n packagesRegistry,\n parentRootRelativeDir,\n }: {\n manifest: PackageManifest;\n packagesRegistry: PackagesRegistry;\n parentRootRelativeDir?: string;\n },\n opts: { includeDevDependencies?: boolean } = {}\n): PackageManifest {\n return Object.assign(\n omit(manifest, [\"scripts\", \"devDependencies\"]),\n filterObjectUndefined({\n dependencies: manifest.dependencies\n ? patchWorkspaceEntries(\n manifest.dependencies,\n packagesRegistry,\n parentRootRelativeDir\n )\n : undefined,\n devDependencies:\n opts.includeDevDependencies && manifest.devDependencies\n ? patchWorkspaceEntries(\n manifest.devDependencies,\n packagesRegistry,\n parentRootRelativeDir\n )\n : undefined,\n })\n );\n}\n","export function filterObjectUndefined(object: Record<string, unknown>) {\n return Object.fromEntries(\n Object.entries(object).filter(([_, value]) => value !== undefined)\n );\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\n * like with 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 { 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/**\n * @TODO pass in zod schema and validate\n */\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 chalk from \"chalk\";\nimport { IsolateConfigResolved } from \"~/helpers\";\n\nexport type Logger = {\n debug(...args: any[]): void;\n info(...args: any[]): void;\n warn(...args: any[]): void;\n error(...args: any[]): void;\n};\n\nexport function createLogger(\n logLevel: IsolateConfigResolved[\"logLevel\"]\n): Logger {\n return {\n debug(...args: any[]) {\n if (logLevel === \"debug\") {\n console.log(chalk.blue(\"debug\"), ...args);\n }\n },\n info(...args: any[]) {\n if (logLevel === \"debug\" || logLevel === \"info\") {\n console.log(chalk.green(\"info\"), ...args);\n }\n },\n warn(...args: any[]) {\n if (logLevel === \"debug\" || logLevel === \"info\" || logLevel === \"warn\") {\n console.log(chalk.yellow(\"warning\"), ...args);\n }\n },\n error(...args: any[]) {\n console.log(chalk.red(\"error\"), ...args);\n },\n };\n}\n","import { exec } from \"node:child_process\";\nimport path from \"node:path\";\nimport { getConfig, usePackageManager } from \"~/helpers\";\nimport { createLogger } from \"./logger\";\n\nexport async function pack(srcDir: string, destDir: string) {\n const log = createLogger(getConfig().logLevel);\n const cwd = process.cwd();\n process.chdir(srcDir);\n\n const { name } = usePackageManager();\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 switch (name) {\n case \"pnpm\": {\n const stdout = await new Promise<string>((resolve, reject) => {\n exec(\n `pnpm pack --pack-destination ${destDir}`,\n (err, stdout, stderr) => {\n if (err) {\n log.error(stderr);\n return reject(err);\n }\n\n resolve(stdout);\n }\n );\n });\n\n /**\n * @TODO use a regex to see if the result from stdout is a valid file\n * path. It could be that other output like warnings are printed. In that\n * case we can to log the stdout.\n */\n\n /**\n * Trim newlines and whitespace\n */\n const packedFilePath = stdout.trim();\n\n // log.debug(\"Packed\", path.basename(packedFilePath));\n log.debug(\"Packed\", packedFilePath);\n\n process.chdir(cwd);\n return packedFilePath;\n }\n\n case \"yarn\":\n case \"npm\": {\n const stdout = await new Promise<string>((resolve, reject) => {\n exec(`npm pack --pack-destination ${destDir}`, (err, stdout) => {\n if (err) {\n return reject(err);\n }\n\n resolve(stdout);\n });\n });\n\n /**\n * Trim newlines and whitespace\n */\n const packedFileName = stdout.trim();\n\n log.debug(\"Packed\", packedFileName);\n\n process.chdir(cwd);\n return path.join(destDir, packedFileName);\n }\n }\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 /**\n * @TODO add some zod validation maybe\n */\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 /**\n * @TODO add some zod validation maybe\n */\n fs.writeFileSync(filePath, yaml.stringify(content), \"utf-8\");\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport {\n PackageManifest,\n PackagesRegistry,\n adaptManifestWorkspaceDeps,\n getConfig,\n} from \"~/helpers\";\n\nexport async function adaptTargetPackageManifest(\n manifest: PackageManifest,\n packagesRegistry: PackagesRegistry,\n isolateDir: string\n) {\n const outputManifest = adaptManifestWorkspaceDeps(\n {\n manifest,\n packagesRegistry,\n },\n { includeDevDependencies: getConfig().includeDevDependencies }\n );\n\n await fs.writeFile(\n path.join(isolateDir, \"package.json\"),\n JSON.stringify(outputManifest, null, 2)\n );\n}\n","import fs from \"fs-extra\";\nimport { isEmpty } from \"lodash-es\";\nimport path from \"node:path\";\nimport { createLogger, 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 excludeLockfile: boolean;\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 excludeLockfile: false,\n};\n\n/**\n * Only initialize the configuration once, and keeping it here for subsequent\n * calls to getConfig.\n */\nlet __config: IsolateConfigResolved | undefined;\n\nconst validConfigKeys = Object.keys(configDefaults);\n\nconst CONFIG_FILE_NAME = \"isolate.config.json\";\n\ntype LogLevel = IsolateConfigResolved[\"logLevel\"];\n\nexport function getConfig(): IsolateConfigResolved {\n if (__config) {\n return __config;\n }\n\n /**\n * Since the logLevel is set via config we can't use it to determine if we\n * should output verbose logging as part of the config loading process. Using\n * the env var ISOLATE_CONFIG_LOG_LEVEL you have the option to log debug\n * output.\n */\n const log = createLogger(\n (process.env.ISOLATE_CONFIG_LOG_LEVEL as LogLevel) ?? \"warn\"\n );\n\n const configFilePath = path.join(process.cwd(), CONFIG_FILE_NAME);\n\n log.debug(`Attempting to load config from ${configFilePath}`);\n\n const configFromFile = fs.existsSync(configFilePath)\n ? readTypedJsonSync<IsolateConfig>(configFilePath)\n : {};\n\n const foreignKeys = Object.keys(configFromFile).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 configFromFile\n ) satisfies IsolateConfigResolved;\n\n log.debug(\"Using configuration:\", inspectValue(config));\n\n __config = config;\n return config;\n}\n","import fs from \"fs-extra\";\nimport { globSync } from \"glob\";\nimport { set } from \"lodash-es\";\nimport path from \"node:path\";\nimport { createLogger, readTypedJson } from \"~/utils\";\nimport { getConfig } from \"./config\";\nimport { findPackagesGlobs } from \"./find-packages-globs\";\n\nexport type PackageManifest = {\n name: string;\n packageManager?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n main: string;\n module?: string;\n exports?: Record<string, { require: string; import: string }>;\n files: string[];\n version?: string;\n typings?: string;\n scripts?: Record<string, string>;\n};\n\nexport type WorkspacePackageInfo = {\n absoluteDir: string;\n /**\n * The path of the package relative to the workspace root. This is the path\n * referenced in the lock file.\n */\n rootRelativeDir: string;\n /**\n * The package.json file contents\n */\n manifest: PackageManifest;\n};\n\nexport type PackagesRegistry = Record<string, WorkspacePackageInfo>;\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 contains\n * 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 = createLogger(getConfig().logLevel);\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 /**\n * Make sure to filter any loose files that might hang around.\n */\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>(\n (acc, info) => (info ? set(acc, info.manifest.name, info) : acc),\n {}\n );\n\n process.chdir(cwd);\n\n return registry;\n}\n","import assert from \"node:assert\";\nimport path from \"node:path\";\nimport {\n createLogger,\n inspectValue,\n readTypedJsonSync,\n readTypedYamlSync,\n} from \"~/utils\";\nimport { getConfig } from \"./config\";\nimport { usePackageManager } from \"./detect-package-manager\";\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 = createLogger(getConfig().logLevel);\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 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 fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport { execSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport { createLogger, readTypedJsonSync } from \"~/utils\";\nimport { getConfig } from \"./config\";\nimport { PackageManifest } from \"./create-packages-registry\";\nimport { getLockfileFileName } from \"./process-lockfile\";\n\nconst 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\nlet packageManager: PackageManager | undefined;\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 packageManager = inferFromFiles(workspaceRoot);\n return packageManager;\n}\n\nfunction inferFromManifest(workspaceRoot: string) {\n const log = createLogger(getConfig().logLevel);\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\nfunction 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 throw new Error(`Failed to detect package manager`);\n}\n\nfunction getVersion(packageManagerName: PackageManagerName): string {\n const buffer = execSync(`${packageManagerName} --version`);\n return buffer.toString().trim();\n}\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","import fs from \"fs-extra\";\nimport assert from \"node:assert\";\nimport path from \"node:path\";\nimport { createLogger, readTypedYamlSync, writeTypedYamlSync } from \"~/utils\";\nimport { getConfig } from \"./config\";\nimport { PackagesRegistry } from \"./create-packages-registry\";\nimport {\n PackageManagerName,\n usePackageManager,\n} from \"./detect-package-manager\";\n\ntype PackagePath = string;\n\ntype PnpmLockfile = {\n lockfileVersion: string;\n importers: Record<\n PackagePath,\n {\n dependencies?: Record<string, unknown>;\n devDependencies?: Record<string, unknown>;\n }\n >;\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\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 function processLockfile({\n workspaceRootDir,\n targetPackageName,\n packagesRegistry,\n isolateDir,\n}: {\n workspaceRootDir: string;\n targetPackageName: string;\n packagesRegistry: PackagesRegistry;\n isolateDir: string;\n}) {\n const log = createLogger(getConfig().logLevel);\n\n const targetPackageRelativeDir =\n packagesRegistry[targetPackageName].rootRelativeDir;\n\n const { name } = usePackageManager();\n\n const fileName = getLockfileFileName(name);\n\n const lockfileSrcPath = path.join(workspaceRootDir, fileName);\n const lockfileDstPath = path.join(isolateDir, fileName);\n\n switch (name) {\n /**\n * It seems that at least for Yarn v1 and NPM v3 lockfile the content is not\n * dependent on the workspace packages structure, so I am assuming we can\n * just copy it over.\n */\n case \"npm\":\n case \"yarn\": {\n fs.copyFileSync(lockfileSrcPath, lockfileDstPath);\n log.debug(\"Copied lockfile to\", lockfileDstPath);\n return;\n }\n case \"pnpm\": {\n const origLockfile = readTypedYamlSync<PnpmLockfile>(lockfileSrcPath);\n\n log.debug(\"Read PNPM lockfile, version:\", origLockfile.lockfileVersion);\n\n const adaptedLockfile = structuredClone(origLockfile);\n\n const targetPackageDef =\n adaptedLockfile.importers[targetPackageRelativeDir];\n\n assert(\n targetPackageDef,\n `Failed to find target package in lockfile at importers[${targetPackageRelativeDir}]`\n );\n /**\n * Overwrite the root importer with the target package importer contents\n */\n adaptedLockfile.importers[\".\"] = targetPackageDef;\n\n /**\n * Delete the target package original importer. Not really necessary.\n */\n delete adaptedLockfile.importers[targetPackageRelativeDir];\n\n writeTypedYamlSync(lockfileDstPath, adaptedLockfile);\n\n log.debug(\"Stored adapted lockfile at\", lockfileDstPath);\n\n return;\n }\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport outdent from \"outdent\";\nimport { getConfig } from \"~/helpers\";\nimport { createLogger, readTypedJson } from \"~/utils\";\n\nexport async function getBuildOutputDir(targetPackageDir: string) {\n const config = getConfig();\n const log = createLogger(getConfig().logLevel);\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 log.debug(\"Looking for tsconfig at:\", tsconfigPath);\n\n if (fs.existsSync(tsconfigPath)) {\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 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 { PackageManifest, PackagesRegistry } from \"./create-packages-registry\";\n\n/**\n * Recursively list the packages from dependencies (and optionally\n * devDependencies) that are found in the workspace.\n *\n * Here we do not need to rely on packages being declared as \"workspace:\" in the\n * manifest. We can simply compare the package names with the list of packages\n * that were found via the workspace glob patterns and added to the registry.\n */\nexport function listLocalDependencies(\n manifest: PackageManifest,\n packagesRegistry: PackagesRegistry,\n { includeDevDependencies = false } = {}\n): string[] {\n const allWorkspacePackageNames = Object.keys(packagesRegistry);\n\n const localDependencyPackageNames = (\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 nestedLocalDependencies = localDependencyPackageNames.flatMap(\n (packageName) =>\n listLocalDependencies(\n packagesRegistry[packageName].manifest,\n packagesRegistry,\n { includeDevDependencies }\n )\n );\n\n return localDependencyPackageNames.concat(nestedLocalDependencies);\n}\n","import path from \"node:path\";\nimport { readTypedJson } from \"~/utils\";\nimport { PackageManifest } from \"./create-packages-registry\";\n\nexport async function importManifest(packageDir: string) {\n return readTypedJson<PackageManifest>(path.join(packageDir, \"package.json\"));\n}\n","import assert from \"node:assert\";\nimport { createLogger, pack } from \"~/utils\";\nimport { getConfig } from \"./config\";\nimport { PackagesRegistry } from \"./create-packages-registry\";\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 /**\n * All packages found in the monorepo by workspaces declaration\n */\n packagesRegistry,\n /**\n * The package names that appear to be local dependencies\n */\n localDependencies,\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 localDependencies: string[];\n packDestinationDir: string;\n}) {\n const config = getConfig();\n const log = createLogger(config.logLevel);\n\n const packedFileByName: Record<string, string> = {};\n\n for (const dependency of localDependencies) {\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(def.absoluteDir, packDestinationDir);\n\n /**\n * @TODO call recursively\n */\n }\n\n return packedFileByName;\n}\n","import path from \"node:path\";\nimport { createLogger } from \"~/utils\";\nimport { getConfig } from \"./config\";\nimport { PackagesRegistry } from \"./create-packages-registry\";\n\nexport function patchWorkspaceEntries(\n dependencies: Record<string, string>,\n packagesRegistry: PackagesRegistry,\n parentRootRelativeDir?: string\n) {\n const log = createLogger(getConfig().logLevel);\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 shared dependencies are used (local deps linking to other\n * local deps), the parentRootRelativeDir will be passed in, and we\n * store the relative path to the isolate/packages directory, as is\n * required by some package managers.\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 fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { pack, unpack } from \"~/utils\";\n\nexport async function processBuildOutputFiles({\n targetPackageDir,\n tmpDir,\n isolateDir,\n}: {\n targetPackageDir: string;\n tmpDir: string;\n isolateDir: string;\n}) {\n const packedFilePath = await pack(targetPackageDir, tmpDir);\n const unpackDir = path.join(tmpDir, \"target\");\n await unpack(packedFilePath, unpackDir);\n await fs.copy(path.join(unpackDir, \"package\"), isolateDir);\n}\n","import fs from \"fs-extra\";\nimport { join } from \"node:path\";\nimport { getIsolateRelativePath } from \"~/utils\";\nimport { createLogger } from \"~/utils/logger\";\nimport { PackagesRegistry, getConfig } from \".\";\nimport { unpack } from \"../utils/unpack\";\n\nexport async function unpackDependencies(\n packedFilesByName: Record<string, string>,\n packagesRegistry: PackagesRegistry,\n tmpDir: string,\n isolateDir: string\n) {\n const log = createLogger(getConfig().logLevel);\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\", 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"],"mappings":"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","names":["fs","assert","path","path","fs","fs","path","log","stdout","path","fs","fs","fs","fs","path","fs","path","fs","path","log","path","fs","config","fs","path","assert","path","fs","assert","path","fs","path","log","path","fs","fs","path","log","packageManager","path","assert","log","fs","path","fs","path","config","log","path","fs","path","assert","config","log","assert","path","log","path","fs","path","path","fs","fs","log","fs","path","assert","fs","packageManager"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "isolate-package",
|
|
3
|
-
"version": "1.2.0-
|
|
3
|
+
"version": "1.2.0-rc3",
|
|
4
4
|
"description": "Isolate a monorepo package by bundling the build output with its shared workspace packages and lock file to form a self-contained directory.",
|
|
5
5
|
"author": "Thijs Koerselman",
|
|
6
6
|
"license": "MIT",
|