@mondaydotcomorg/z2h-cli 0.1.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 +16 -0
- package/bin/z2h-cli.js +2 -0
- package/dist/commands/build.d.ts +5 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +37 -0
- package/dist/commands/clean.d.ts +5 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +24 -0
- package/dist/commands/deploy.d.ts +6 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +92 -0
- package/dist/commands/dev.d.ts +5 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +58 -0
- package/dist/constants.d.ts +25 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +67 -0
- package/dist/esm/commands/build.d.ts +5 -0
- package/dist/esm/commands/build.d.ts.map +1 -0
- package/dist/esm/commands/build.mjs +35 -0
- package/dist/esm/commands/clean.d.ts +5 -0
- package/dist/esm/commands/clean.d.ts.map +1 -0
- package/dist/esm/commands/clean.mjs +22 -0
- package/dist/esm/commands/deploy.d.ts +6 -0
- package/dist/esm/commands/deploy.d.ts.map +1 -0
- package/dist/esm/commands/deploy.mjs +86 -0
- package/dist/esm/commands/dev.d.ts +5 -0
- package/dist/esm/commands/dev.d.ts.map +1 -0
- package/dist/esm/commands/dev.mjs +56 -0
- package/dist/esm/constants.d.ts +25 -0
- package/dist/esm/constants.d.ts.map +1 -0
- package/dist/esm/constants.mjs +57 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.mjs +86 -0
- package/dist/esm/shadow/consumer-pkg.d.ts +24 -0
- package/dist/esm/shadow/consumer-pkg.d.ts.map +1 -0
- package/dist/esm/shadow/consumer-pkg.mjs +81 -0
- package/dist/esm/shadow/gitignore.d.ts +7 -0
- package/dist/esm/shadow/gitignore.d.ts.map +1 -0
- package/dist/esm/shadow/gitignore.mjs +29 -0
- package/dist/esm/shadow/merge-package-json.d.ts +16 -0
- package/dist/esm/shadow/merge-package-json.d.ts.map +1 -0
- package/dist/esm/shadow/merge-package-json.mjs +58 -0
- package/dist/esm/shadow/metadata.d.ts +4 -0
- package/dist/esm/shadow/metadata.d.ts.map +1 -0
- package/dist/esm/shadow/metadata.mjs +18 -0
- package/dist/esm/shadow/paths.d.ts +3 -0
- package/dist/esm/shadow/paths.d.ts.map +1 -0
- package/dist/esm/shadow/paths.mjs +25 -0
- package/dist/esm/shadow/port.d.ts +7 -0
- package/dist/esm/shadow/port.d.ts.map +1 -0
- package/dist/esm/shadow/port.mjs +34 -0
- package/dist/esm/shadow/prepare.d.ts +3 -0
- package/dist/esm/shadow/prepare.d.ts.map +1 -0
- package/dist/esm/shadow/prepare.mjs +60 -0
- package/dist/esm/shadow/scaffold.d.ts +7 -0
- package/dist/esm/shadow/scaffold.d.ts.map +1 -0
- package/dist/esm/shadow/scaffold.mjs +112 -0
- package/dist/esm/shadow/sync.d.ts +9 -0
- package/dist/esm/shadow/sync.d.ts.map +1 -0
- package/dist/esm/shadow/sync.mjs +29 -0
- package/dist/esm/shadow/yarnrc.d.ts +10 -0
- package/dist/esm/shadow/yarnrc.d.ts.map +1 -0
- package/dist/esm/shadow/yarnrc.mjs +27 -0
- package/dist/esm/types.d.ts +53 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.mjs +1 -0
- package/dist/esm/util/app-name.d.ts +12 -0
- package/dist/esm/util/app-name.d.ts.map +1 -0
- package/dist/esm/util/app-name.mjs +17 -0
- package/dist/esm/util/logger.d.ts +22 -0
- package/dist/esm/util/logger.d.ts.map +1 -0
- package/dist/esm/util/logger.mjs +59 -0
- package/dist/esm/util/manifest.d.ts +31 -0
- package/dist/esm/util/manifest.d.ts.map +1 -0
- package/dist/esm/util/manifest.mjs +31 -0
- package/dist/esm/util/s3/client.d.ts +11 -0
- package/dist/esm/util/s3/client.d.ts.map +1 -0
- package/dist/esm/util/s3/client.mjs +38 -0
- package/dist/esm/util/s3/upload.d.ts +2 -0
- package/dist/esm/util/s3/upload.d.ts.map +1 -0
- package/dist/esm/util/s3/upload.mjs +32 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -0
- package/dist/shadow/consumer-pkg.d.ts +24 -0
- package/dist/shadow/consumer-pkg.d.ts.map +1 -0
- package/dist/shadow/consumer-pkg.js +84 -0
- package/dist/shadow/gitignore.d.ts +7 -0
- package/dist/shadow/gitignore.d.ts.map +1 -0
- package/dist/shadow/gitignore.js +35 -0
- package/dist/shadow/merge-package-json.d.ts +16 -0
- package/dist/shadow/merge-package-json.d.ts.map +1 -0
- package/dist/shadow/merge-package-json.js +66 -0
- package/dist/shadow/metadata.d.ts +4 -0
- package/dist/shadow/metadata.d.ts.map +1 -0
- package/dist/shadow/metadata.js +21 -0
- package/dist/shadow/paths.d.ts +3 -0
- package/dist/shadow/paths.d.ts.map +1 -0
- package/dist/shadow/paths.js +31 -0
- package/dist/shadow/port.d.ts +7 -0
- package/dist/shadow/port.d.ts.map +1 -0
- package/dist/shadow/port.js +41 -0
- package/dist/shadow/prepare.d.ts +3 -0
- package/dist/shadow/prepare.d.ts.map +1 -0
- package/dist/shadow/prepare.js +62 -0
- package/dist/shadow/scaffold.d.ts +7 -0
- package/dist/shadow/scaffold.d.ts.map +1 -0
- package/dist/shadow/scaffold.js +118 -0
- package/dist/shadow/sync.d.ts +9 -0
- package/dist/shadow/sync.d.ts.map +1 -0
- package/dist/shadow/sync.js +31 -0
- package/dist/shadow/yarnrc.d.ts +10 -0
- package/dist/shadow/yarnrc.d.ts.map +1 -0
- package/dist/shadow/yarnrc.js +33 -0
- package/dist/types.d.ts +53 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/util/app-name.d.ts +12 -0
- package/dist/util/app-name.d.ts.map +1 -0
- package/dist/util/app-name.js +20 -0
- package/dist/util/logger.d.ts +22 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +71 -0
- package/dist/util/manifest.d.ts +31 -0
- package/dist/util/manifest.d.ts.map +1 -0
- package/dist/util/manifest.js +36 -0
- package/dist/util/s3/client.d.ts +11 -0
- package/dist/util/s3/client.d.ts.map +1 -0
- package/dist/util/s3/client.js +48 -0
- package/dist/util/s3/upload.d.ts +2 -0
- package/dist/util/s3/upload.d.ts.map +1 -0
- package/dist/util/s3/upload.js +39 -0
- package/package.json +56 -0
- package/src/commands/build.ts +42 -0
- package/src/commands/clean.ts +26 -0
- package/src/commands/deploy.ts +114 -0
- package/src/commands/dev.ts +64 -0
- package/src/constants.ts +63 -0
- package/src/index.ts +90 -0
- package/src/shadow/consumer-pkg.ts +100 -0
- package/src/shadow/gitignore.ts +30 -0
- package/src/shadow/merge-package-json.ts +62 -0
- package/src/shadow/metadata.ts +17 -0
- package/src/shadow/paths.ts +24 -0
- package/src/shadow/port.ts +34 -0
- package/src/shadow/prepare.ts +68 -0
- package/src/shadow/scaffold.ts +120 -0
- package/src/shadow/sync.ts +30 -0
- package/src/shadow/yarnrc.ts +29 -0
- package/src/types.ts +60 -0
- package/src/util/app-name.ts +16 -0
- package/src/util/logger.ts +64 -0
- package/src/util/manifest.ts +65 -0
- package/src/util/s3/client.ts +40 -0
- package/src/util/s3/upload.ts +41 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ConsumerPkg } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Return the consumer's `workspaces` field extended with `.zth`. Handles
|
|
4
|
+
* all three shapes: missing, array form, or object form (`{ packages }`).
|
|
5
|
+
* Always extends — never replaces the user's existing entries.
|
|
6
|
+
*/
|
|
7
|
+
export declare function ensureConsumerWorkspaces(pkg: ConsumerPkg): {
|
|
8
|
+
changed: boolean;
|
|
9
|
+
workspaces: ConsumerPkg['workspaces'];
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Idempotently reshape the consumer's package.json so that:
|
|
13
|
+
* - it is marked `"private": true`
|
|
14
|
+
* - `.zth` is declared as a yarn workspace member (yarn will hoist)
|
|
15
|
+
* - the protected runtime deps are present at compatible versions
|
|
16
|
+
* - the protected dev deps are present at compatible versions
|
|
17
|
+
*
|
|
18
|
+
* Always extends — never overrides existing fields.
|
|
19
|
+
*/
|
|
20
|
+
export declare function ensureConsumerPkg(pkgPath: string, pkg: ConsumerPkg): Promise<{
|
|
21
|
+
changed: boolean;
|
|
22
|
+
pkg: ConsumerPkg;
|
|
23
|
+
}>;
|
|
24
|
+
//# sourceMappingURL=consumer-pkg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consumer-pkg.d.ts","sourceRoot":"","sources":["../../src/shadow/consumer-pkg.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,WAAW,GAAG;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC;CACvC,CAsBA;AAqBD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,WAAW,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,WAAW,CAAA;CAAE,CAAC,CAgCjD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const fsExtra = require('fs-extra');
|
|
4
|
+
const constants = require('../constants.js');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Return the consumer's `workspaces` field extended with `.zth`. Handles
|
|
8
|
+
* all three shapes: missing, array form, or object form (`{ packages }`).
|
|
9
|
+
* Always extends — never replaces the user's existing entries.
|
|
10
|
+
*/
|
|
11
|
+
function ensureConsumerWorkspaces(pkg) {
|
|
12
|
+
const { workspaces } = pkg;
|
|
13
|
+
if (Array.isArray(workspaces)) {
|
|
14
|
+
if (workspaces.includes(constants.SHADOW_DIR_NAME)) {
|
|
15
|
+
return { changed: false, workspaces };
|
|
16
|
+
}
|
|
17
|
+
return { changed: true, workspaces: [...workspaces, constants.SHADOW_DIR_NAME] };
|
|
18
|
+
}
|
|
19
|
+
if (workspaces && typeof workspaces === 'object') {
|
|
20
|
+
const pkgs = workspaces.packages ?? [];
|
|
21
|
+
if (pkgs.includes(constants.SHADOW_DIR_NAME)) {
|
|
22
|
+
return { changed: false, workspaces };
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
changed: true,
|
|
26
|
+
workspaces: { ...workspaces, packages: [...pkgs, constants.SHADOW_DIR_NAME] },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return { changed: true, workspaces: [constants.SHADOW_DIR_NAME] };
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Extend a deps map with the protected entries; only fills in missing ones,
|
|
33
|
+
* never overrides versions the consumer already pinned.
|
|
34
|
+
*/
|
|
35
|
+
function applyProtected(current, protectedMap) {
|
|
36
|
+
const next = { ...(current ?? {}) };
|
|
37
|
+
let changed = false;
|
|
38
|
+
for (const [name, version] of Object.entries(protectedMap)) {
|
|
39
|
+
if (!next[name]) {
|
|
40
|
+
next[name] = version;
|
|
41
|
+
changed = true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { changed, next };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Idempotently reshape the consumer's package.json so that:
|
|
48
|
+
* - it is marked `"private": true`
|
|
49
|
+
* - `.zth` is declared as a yarn workspace member (yarn will hoist)
|
|
50
|
+
* - the protected runtime deps are present at compatible versions
|
|
51
|
+
* - the protected dev deps are present at compatible versions
|
|
52
|
+
*
|
|
53
|
+
* Always extends — never overrides existing fields.
|
|
54
|
+
*/
|
|
55
|
+
async function ensureConsumerPkg(pkgPath, pkg) {
|
|
56
|
+
let changed = false;
|
|
57
|
+
const next = { ...pkg };
|
|
58
|
+
if (next.private !== true) {
|
|
59
|
+
next.private = true;
|
|
60
|
+
changed = true;
|
|
61
|
+
}
|
|
62
|
+
const ws = ensureConsumerWorkspaces(next);
|
|
63
|
+
if (ws.changed) {
|
|
64
|
+
next.workspaces = ws.workspaces;
|
|
65
|
+
changed = true;
|
|
66
|
+
}
|
|
67
|
+
const deps = applyProtected(next.dependencies, constants.PROTECTED_DEPS);
|
|
68
|
+
if (deps.changed) {
|
|
69
|
+
next.dependencies = deps.next;
|
|
70
|
+
changed = true;
|
|
71
|
+
}
|
|
72
|
+
const devDeps = applyProtected(next.devDependencies, constants.PROTECTED_DEV_DEPS);
|
|
73
|
+
if (devDeps.changed) {
|
|
74
|
+
next.devDependencies = devDeps.next;
|
|
75
|
+
changed = true;
|
|
76
|
+
}
|
|
77
|
+
if (changed) {
|
|
78
|
+
await fsExtra.writeJson(pkgPath, next, { spaces: 2 });
|
|
79
|
+
}
|
|
80
|
+
return { changed, pkg: next };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
exports.ensureConsumerPkg = ensureConsumerPkg;
|
|
84
|
+
exports.ensureConsumerWorkspaces = ensureConsumerWorkspaces;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idempotently append our shadow-dir entries to the consumer's .gitignore.
|
|
3
|
+
* Never modifies existing entries; only appends missing ones. Creates the
|
|
4
|
+
* file if absent.
|
|
5
|
+
*/
|
|
6
|
+
export declare function ensureGitignore(consumerDir: string): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=gitignore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/shadow/gitignore.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBxE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const fsExtra = require('fs-extra');
|
|
5
|
+
const constants = require('../constants.js');
|
|
6
|
+
|
|
7
|
+
const _interopDefault = e => e && e.__esModule ? e : { default: e };
|
|
8
|
+
|
|
9
|
+
const path__default = /*#__PURE__*/_interopDefault(path);
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Idempotently append our shadow-dir entries to the consumer's .gitignore.
|
|
13
|
+
* Never modifies existing entries; only appends missing ones. Creates the
|
|
14
|
+
* file if absent.
|
|
15
|
+
*/
|
|
16
|
+
async function ensureGitignore(consumerDir) {
|
|
17
|
+
const gitignorePath = path__default.default.join(consumerDir, '.gitignore');
|
|
18
|
+
let body = '';
|
|
19
|
+
if (await fsExtra.pathExists(gitignorePath)) {
|
|
20
|
+
body = await fsExtra.readFile(gitignorePath, 'utf8');
|
|
21
|
+
}
|
|
22
|
+
const existing = new Set(body
|
|
23
|
+
.split('\n')
|
|
24
|
+
.map(l => l.trim())
|
|
25
|
+
.filter(Boolean));
|
|
26
|
+
const missing = constants.GITIGNORE_ENTRIES.filter(e => !existing.has(e));
|
|
27
|
+
if (missing.length === 0) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const prefix = body.length && !body.endsWith('\n') ? '\n' : '';
|
|
31
|
+
const block = `${prefix}\n# z2h-cli\n${missing.join('\n')}\n`;
|
|
32
|
+
await fsExtra.writeFile(gitignorePath, body + block);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
exports.ensureGitignore = ensureGitignore;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ConsumerPkg, ShadowPkg } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Build the shadow package.json. Declares the shared runtime deps as
|
|
4
|
+
* peerDependencies — yarn resolves them from the workspace root (the
|
|
5
|
+
* consumer's package.json), guaranteeing a single React instance across
|
|
6
|
+
* the wrapper and consumer src.
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildShadowPkg(consumerPkg: ConsumerPkg): ShadowPkg;
|
|
9
|
+
/**
|
|
10
|
+
* Hash the consumer's declared deps. This is the sole input that decides
|
|
11
|
+
* whether `yarn install` needs to run — the shadow package.json is
|
|
12
|
+
* regenerated from a CLI-owned template every run and doesn't participate.
|
|
13
|
+
*/
|
|
14
|
+
export declare function hashConsumerDeps(consumer: ConsumerPkg): string;
|
|
15
|
+
export declare function writeShadowPkg(shadowPkgPath: string, shadow: ShadowPkg): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=merge-package-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-package-json.d.ts","sourceRoot":"","sources":["../../src/shadow/merge-package-json.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEvD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,CAalE;AAgBD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,CAW9D;AAED,wBAAsB,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5F"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const crypto = require('node:crypto');
|
|
4
|
+
const fsExtra = require('fs-extra');
|
|
5
|
+
const constants = require('../constants.js');
|
|
6
|
+
const util_appName = require('../util/app-name.js');
|
|
7
|
+
|
|
8
|
+
const _interopDefault = e => e && e.__esModule ? e : { default: e };
|
|
9
|
+
|
|
10
|
+
const crypto__default = /*#__PURE__*/_interopDefault(crypto);
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Build the shadow package.json. Declares the shared runtime deps as
|
|
14
|
+
* peerDependencies — yarn resolves them from the workspace root (the
|
|
15
|
+
* consumer's package.json), guaranteeing a single React instance across
|
|
16
|
+
* the wrapper and consumer src.
|
|
17
|
+
*/
|
|
18
|
+
function buildShadowPkg(consumerPkg) {
|
|
19
|
+
// Use the `@trident/` scope so trident-toolkit strips it and the emitted
|
|
20
|
+
// bundle becomes `MF-mf-<appName>`, matching the URL the host MF routes to.
|
|
21
|
+
// The scope also keeps the shadow's name distinct from the consumer's
|
|
22
|
+
// package.json name (same workspace, different identifiers).
|
|
23
|
+
return {
|
|
24
|
+
name: `@trident/${util_appName.mfAppName(consumerPkg.name)}`,
|
|
25
|
+
version: '0.0.1',
|
|
26
|
+
private: true,
|
|
27
|
+
scripts: constants.SHADOW_SCRIPTS,
|
|
28
|
+
peerDependencies: { ...constants.PROTECTED_DEPS },
|
|
29
|
+
devDependencies: constants.WORKSPACE_DEV_DEPS,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Stable, key-sorted serialization. Two objects with the same keys/values
|
|
34
|
+
* hash identically regardless of insertion order — so re-orderings from
|
|
35
|
+
* yarn's install or ensureConsumerPkg don't trigger spurious reinstalls.
|
|
36
|
+
*/
|
|
37
|
+
function stableStringify(value) {
|
|
38
|
+
return JSON.stringify(value, (_key, v) => {
|
|
39
|
+
if (v && typeof v === 'object' && !Array.isArray(v)) {
|
|
40
|
+
return Object.fromEntries(Object.entries(v).sort(([a], [b]) => a.localeCompare(b)));
|
|
41
|
+
}
|
|
42
|
+
return v;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Hash the consumer's declared deps. This is the sole input that decides
|
|
47
|
+
* whether `yarn install` needs to run — the shadow package.json is
|
|
48
|
+
* regenerated from a CLI-owned template every run and doesn't participate.
|
|
49
|
+
*/
|
|
50
|
+
function hashConsumerDeps(consumer) {
|
|
51
|
+
return crypto__default.default
|
|
52
|
+
.createHash('sha256')
|
|
53
|
+
.update(stableStringify({
|
|
54
|
+
deps: consumer.dependencies ?? {},
|
|
55
|
+
devDeps: consumer.devDependencies ?? {},
|
|
56
|
+
peerDeps: consumer.peerDependencies ?? {},
|
|
57
|
+
}))
|
|
58
|
+
.digest('hex');
|
|
59
|
+
}
|
|
60
|
+
async function writeShadowPkg(shadowPkgPath, shadow) {
|
|
61
|
+
await fsExtra.writeJson(shadowPkgPath, shadow, { spaces: 2 });
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
exports.buildShadowPkg = buildShadowPkg;
|
|
65
|
+
exports.hashConsumerDeps = hashConsumerDeps;
|
|
66
|
+
exports.writeShadowPkg = writeShadowPkg;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ConsumerPaths, ShadowMetadata } from '../types';
|
|
2
|
+
export declare function readMetadata(paths: ConsumerPaths): Promise<ShadowMetadata | null>;
|
|
3
|
+
export declare function writeMetadata(paths: ConsumerPaths, meta: ShadowMetadata): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/shadow/metadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE9D,wBAAsB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CASvF;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7F"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const fsExtra = require('fs-extra');
|
|
4
|
+
|
|
5
|
+
async function readMetadata(paths) {
|
|
6
|
+
if (!(await fsExtra.pathExists(paths.shadowMetadata))) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
return (await fsExtra.readJson(paths.shadowMetadata));
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async function writeMetadata(paths, meta) {
|
|
17
|
+
await fsExtra.writeJson(paths.shadowMetadata, meta, { spaces: 2 });
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
exports.readMetadata = readMetadata;
|
|
21
|
+
exports.writeMetadata = writeMetadata;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/shadow/paths.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAmBvE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const constants = require('../constants.js');
|
|
5
|
+
|
|
6
|
+
const _interopDefault = e => e && e.__esModule ? e : { default: e };
|
|
7
|
+
|
|
8
|
+
const path__default = /*#__PURE__*/_interopDefault(path);
|
|
9
|
+
|
|
10
|
+
function resolveConsumerPaths(consumerDir) {
|
|
11
|
+
const shadowDir = path__default.default.join(consumerDir, constants.SHADOW_DIR_NAME);
|
|
12
|
+
return {
|
|
13
|
+
consumerDir,
|
|
14
|
+
consumerPkg: path__default.default.join(consumerDir, 'package.json'),
|
|
15
|
+
consumerSrc: path__default.default.join(consumerDir, 'src'),
|
|
16
|
+
consumerSrcEntry: path__default.default.join(consumerDir, 'src', 'index.tsx'),
|
|
17
|
+
shadowDir,
|
|
18
|
+
shadowPkg: path__default.default.join(shadowDir, 'package.json'),
|
|
19
|
+
shadowSrc: path__default.default.join(shadowDir, 'src'),
|
|
20
|
+
shadowWrapper: path__default.default.join(shadowDir, 'src', 'index.tsx'),
|
|
21
|
+
shadowTridentrc: path__default.default.join(shadowDir, '.tridentrc.js'),
|
|
22
|
+
shadowNvmrc: path__default.default.join(shadowDir, '.nvmrc'),
|
|
23
|
+
shadowDts: path__default.default.join(shadowDir, 'src', 'declaration.d.ts'),
|
|
24
|
+
shadowTsconfig: path__default.default.join(shadowDir, 'tsconfig.json'),
|
|
25
|
+
shadowBuild: path__default.default.join(shadowDir, 'build'),
|
|
26
|
+
shadowDepsHash: path__default.default.join(shadowDir, '.deps-hash'),
|
|
27
|
+
shadowMetadata: path__default.default.join(shadowDir, 'metadata.json'),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
exports.resolveConsumerPaths = resolveConsumerPaths;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tries to bind to `port` on localhost; resolves true if the bind succeeds
|
|
3
|
+
* (port is free) and the listener was cleanly closed.
|
|
4
|
+
*/
|
|
5
|
+
export declare function isPortFree(port: number): Promise<boolean>;
|
|
6
|
+
export declare function pickPort(): Promise<number>;
|
|
7
|
+
//# sourceMappingURL=port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../src/shadow/port.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOzD;AAOD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAQhD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const net = require('node:net');
|
|
4
|
+
const constants = require('../constants.js');
|
|
5
|
+
|
|
6
|
+
const _interopDefault = e => e && e.__esModule ? e : { default: e };
|
|
7
|
+
|
|
8
|
+
const net__default = /*#__PURE__*/_interopDefault(net);
|
|
9
|
+
|
|
10
|
+
function randomPort() {
|
|
11
|
+
return constants.MIN_PORT + Math.floor(Math.random() * (constants.MAX_PORT - constants.MIN_PORT + 1));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Tries to bind to `port` on localhost; resolves true if the bind succeeds
|
|
15
|
+
* (port is free) and the listener was cleanly closed.
|
|
16
|
+
*/
|
|
17
|
+
function isPortFree(port) {
|
|
18
|
+
return new Promise(resolve => {
|
|
19
|
+
const server = net__default.default.createServer();
|
|
20
|
+
server.once('error', () => resolve(false));
|
|
21
|
+
server.once('listening', () => server.close(() => resolve(true)));
|
|
22
|
+
server.listen(port, '127.0.0.1');
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Picks a random port from the configured range and verifies it's actually
|
|
27
|
+
* free before returning. Tries up to `MAX_PORT_TRIES` candidates.
|
|
28
|
+
*/
|
|
29
|
+
const MAX_PORT_TRIES = 50;
|
|
30
|
+
async function pickPort() {
|
|
31
|
+
for (let i = 0; i < MAX_PORT_TRIES; i++) {
|
|
32
|
+
const p = randomPort();
|
|
33
|
+
if (await isPortFree(p)) {
|
|
34
|
+
return p;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
throw new Error(`Could not find a free port in range ${constants.MIN_PORT}-${constants.MAX_PORT} after ${MAX_PORT_TRIES} tries`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
exports.isPortFree = isPortFree;
|
|
41
|
+
exports.pickPort = pickPort;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepare.d.ts","sourceRoot":"","sources":["../../src/shadow/prepare.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAA8B,cAAc,EAAkB,MAAM,UAAU,CAAC;AAE3F,wBAAsB,aAAa,IAAI,OAAO,CAAC,cAAc,CAAC,CAiC7D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const fsExtra = require('fs-extra');
|
|
4
|
+
const util_logger = require('../util/logger.js');
|
|
5
|
+
const util_appName = require('../util/app-name.js');
|
|
6
|
+
const shadow_paths = require('./paths.js');
|
|
7
|
+
const shadow_gitignore = require('./gitignore.js');
|
|
8
|
+
const shadow_yarnrc = require('./yarnrc.js');
|
|
9
|
+
const shadow_consumerPkg = require('./consumer-pkg.js');
|
|
10
|
+
const shadow_scaffold = require('./scaffold.js');
|
|
11
|
+
const shadow_metadata = require('./metadata.js');
|
|
12
|
+
const shadow_port = require('./port.js');
|
|
13
|
+
const shadow_sync = require('./sync.js');
|
|
14
|
+
|
|
15
|
+
async function prepareShadow() {
|
|
16
|
+
const paths = shadow_paths.resolveConsumerPaths(process.cwd());
|
|
17
|
+
if (!(await fsExtra.pathExists(paths.consumerPkg))) {
|
|
18
|
+
throw new Error(`No package.json found in ${paths.consumerDir}`);
|
|
19
|
+
}
|
|
20
|
+
if (!(await fsExtra.pathExists(paths.consumerSrcEntry))) {
|
|
21
|
+
throw new Error(`Consumer must have src/index.tsx (in ${paths.consumerDir})`);
|
|
22
|
+
}
|
|
23
|
+
const rawConsumerPkg = (await fsExtra.readJson(paths.consumerPkg));
|
|
24
|
+
if (!rawConsumerPkg.name) {
|
|
25
|
+
throw new Error('Consumer package.json must have a "name" field');
|
|
26
|
+
}
|
|
27
|
+
const appName = util_appName.cleanAppName(rawConsumerPkg.name);
|
|
28
|
+
const { pkg: consumerPkg, changed: consumerChanged } = await shadow_consumerPkg.ensureConsumerPkg(paths.consumerPkg, rawConsumerPkg);
|
|
29
|
+
if (consumerChanged) {
|
|
30
|
+
util_logger.info(`ensured consumer pkg shape at ${paths.consumerPkg}`);
|
|
31
|
+
}
|
|
32
|
+
await shadow_gitignore.ensureGitignore(paths.consumerDir);
|
|
33
|
+
await shadow_yarnrc.ensureYarnRc(paths.consumerDir);
|
|
34
|
+
await fsExtra.ensureDir(paths.shadowDir);
|
|
35
|
+
const metadata = await resolvePortAndMetadata(paths, appName);
|
|
36
|
+
const port = metadata.port;
|
|
37
|
+
util_logger.info(`preparing shadow at ${paths.shadowDir} (port ${port})`);
|
|
38
|
+
await shadow_scaffold.scaffoldShadow(paths, appName, port);
|
|
39
|
+
await shadow_sync.syncShadow(paths, consumerPkg);
|
|
40
|
+
return { appName, port, paths };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Resolve the dev server port. Prefer the persisted port if it's still free
|
|
44
|
+
* (URL stays stable across restarts). Otherwise pick a fresh one. The
|
|
45
|
+
* orphaned process — if there is one — keeps running on its old port,
|
|
46
|
+
* harmless. No process killing, no PID files.
|
|
47
|
+
*/
|
|
48
|
+
async function resolvePortAndMetadata(paths, appName) {
|
|
49
|
+
const existing = await shadow_metadata.readMetadata(paths);
|
|
50
|
+
if (existing?.port && (await shadow_port.isPortFree(existing.port))) {
|
|
51
|
+
return existing;
|
|
52
|
+
}
|
|
53
|
+
const next = {
|
|
54
|
+
createdAt: existing?.createdAt ?? new Date().toISOString(),
|
|
55
|
+
appName,
|
|
56
|
+
port: await shadow_port.pickPort(),
|
|
57
|
+
};
|
|
58
|
+
await shadow_metadata.writeMetadata(paths, next);
|
|
59
|
+
return next;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
exports.prepareShadow = prepareShadow;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ConsumerPaths } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Write every generated file under .zth/. Overwrites on every run so the
|
|
4
|
+
* shadow dir is a deterministic function of the CLI version — no drift.
|
|
5
|
+
*/
|
|
6
|
+
export declare function scaffoldShadow(paths: ConsumerPaths, appName: string, port: number): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/shadow/scaffold.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAqG9C;;;GAGG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYvG"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const fsExtra = require('fs-extra');
|
|
5
|
+
|
|
6
|
+
const _interopDefault = e => e && e.__esModule ? e : { default: e };
|
|
7
|
+
|
|
8
|
+
const path__default = /*#__PURE__*/_interopDefault(path);
|
|
9
|
+
|
|
10
|
+
const WRAPPER_TEMPLATE = `import '@vibe/core/tokens';
|
|
11
|
+
import ConsumerApp from '../../src/index';
|
|
12
|
+
import React from 'react';
|
|
13
|
+
import * as ReactDOM from 'react-dom/client';
|
|
14
|
+
import { ErrorBoundary } from 'react-error-boundary';
|
|
15
|
+
|
|
16
|
+
const roots = new Map<HTMLElement, ReactDOM.Root>();
|
|
17
|
+
|
|
18
|
+
export function init() {}
|
|
19
|
+
|
|
20
|
+
export function render(element: HTMLElement) {
|
|
21
|
+
const root = ReactDOM.createRoot(element);
|
|
22
|
+
root.render(
|
|
23
|
+
<ErrorBoundary fallback={<div style={{ padding: 16 }}>This app crashed.</div>}>
|
|
24
|
+
<ConsumerApp />
|
|
25
|
+
</ErrorBoundary>,
|
|
26
|
+
);
|
|
27
|
+
roots.set(element, root);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function unmount({ element }: { element: HTMLElement }) {
|
|
31
|
+
const root = roots.get(element);
|
|
32
|
+
if (root) {
|
|
33
|
+
root.unmount();
|
|
34
|
+
roots.delete(element);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
const tridentrcTemplate = (appName, port) => `/** @type {import("@mondaydotcomorg/trident-user-config").MicroFrontendConfig} */
|
|
39
|
+
const config = {
|
|
40
|
+
appName: '${appName}',
|
|
41
|
+
port: ${port},
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
module.exports = config;
|
|
45
|
+
`;
|
|
46
|
+
const dtsFileTemplate = () => `
|
|
47
|
+
declare module '*.module.css' {
|
|
48
|
+
const classNames: {
|
|
49
|
+
[className: string]: string;
|
|
50
|
+
};
|
|
51
|
+
export = classNames;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
declare module '*.module.scss' {
|
|
55
|
+
const classNames: {
|
|
56
|
+
[className: string]: string;
|
|
57
|
+
};
|
|
58
|
+
export = classNames;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
declare module '*.jpg' {
|
|
62
|
+
const e: string;
|
|
63
|
+
export default e;
|
|
64
|
+
}
|
|
65
|
+
declare module '*.jpeg' {
|
|
66
|
+
const e: string;
|
|
67
|
+
export default e;
|
|
68
|
+
}
|
|
69
|
+
declare module '*.png' {
|
|
70
|
+
const e: string;
|
|
71
|
+
export default e;
|
|
72
|
+
}
|
|
73
|
+
declare module '*.riv' {
|
|
74
|
+
const e: string;
|
|
75
|
+
export default e;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
declare module '*.wasm' {
|
|
79
|
+
const e: string;
|
|
80
|
+
export default e;
|
|
81
|
+
}
|
|
82
|
+
`;
|
|
83
|
+
const TSCONFIG_TEMPLATE = {
|
|
84
|
+
compilerOptions: {
|
|
85
|
+
target: 'es5',
|
|
86
|
+
lib: ['dom', 'dom.iterable', 'esnext'],
|
|
87
|
+
allowJs: false,
|
|
88
|
+
skipLibCheck: true,
|
|
89
|
+
esModuleInterop: true,
|
|
90
|
+
allowSyntheticDefaultImports: true,
|
|
91
|
+
strict: false,
|
|
92
|
+
module: 'esnext',
|
|
93
|
+
moduleResolution: 'bundler',
|
|
94
|
+
resolveJsonModule: true,
|
|
95
|
+
noImplicitAny: false,
|
|
96
|
+
isolatedModules: true,
|
|
97
|
+
baseUrl: 'src',
|
|
98
|
+
noEmit: true,
|
|
99
|
+
jsx: 'react-jsx',
|
|
100
|
+
},
|
|
101
|
+
include: ['src', '../src'],
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Write every generated file under .zth/. Overwrites on every run so the
|
|
105
|
+
* shadow dir is a deterministic function of the CLI version — no drift.
|
|
106
|
+
*/
|
|
107
|
+
async function scaffoldShadow(paths, appName, port) {
|
|
108
|
+
await fsExtra.ensureDir(paths.shadowSrc);
|
|
109
|
+
await fsExtra.writeFile(paths.shadowWrapper, WRAPPER_TEMPLATE);
|
|
110
|
+
await fsExtra.writeFile(paths.shadowTridentrc, tridentrcTemplate(appName, port));
|
|
111
|
+
await fsExtra.writeFile(paths.shadowNvmrc, `${process.version}\n`);
|
|
112
|
+
await fsExtra.writeFile(paths.shadowDts, dtsFileTemplate());
|
|
113
|
+
await fsExtra.writeJson(paths.shadowTsconfig, TSCONFIG_TEMPLATE, { spaces: 2 });
|
|
114
|
+
// Drop a stub README so contributors who open .zth/ know what they're looking at.
|
|
115
|
+
await fsExtra.writeFile(path__default.default.join(paths.shadowDir, 'README.md'), '# .zth/\nGenerated by z2h-cli. Do not edit — run `z2h-cli build` or `z2h-cli dev` to refresh.\n');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
exports.scaffoldShadow = scaffoldShadow;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ConsumerPaths, ConsumerPkg } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Regenerate the shadow package.json from the current CLI template and
|
|
4
|
+
* run `yarn install` at the consumer dir iff the consumer's declared deps
|
|
5
|
+
* have changed since the last install. Idempotent — safe to call on every
|
|
6
|
+
* build, dev start, or consumer package.json edit.
|
|
7
|
+
*/
|
|
8
|
+
export declare function syncShadow(paths: ConsumerPaths, consumerPkg: ConsumerPkg): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/shadow/sync.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE3D;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB9F"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const fsExtra = require('fs-extra');
|
|
4
|
+
const execa = require('execa');
|
|
5
|
+
const util_logger = require('../util/logger.js');
|
|
6
|
+
const shadow_mergePackageJson = require('./merge-package-json.js');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Regenerate the shadow package.json from the current CLI template and
|
|
10
|
+
* run `yarn install` at the consumer dir iff the consumer's declared deps
|
|
11
|
+
* have changed since the last install. Idempotent — safe to call on every
|
|
12
|
+
* build, dev start, or consumer package.json edit.
|
|
13
|
+
*/
|
|
14
|
+
async function syncShadow(paths, consumerPkg) {
|
|
15
|
+
const shadow = shadow_mergePackageJson.buildShadowPkg(consumerPkg);
|
|
16
|
+
await shadow_mergePackageJson.writeShadowPkg(paths.shadowPkg, shadow);
|
|
17
|
+
const newHash = shadow_mergePackageJson.hashConsumerDeps(consumerPkg);
|
|
18
|
+
const oldHash = (await fsExtra.pathExists(paths.shadowDepsHash)) ? await fsExtra.readFile(paths.shadowDepsHash, 'utf8') : null;
|
|
19
|
+
if (oldHash !== newHash) {
|
|
20
|
+
util_logger.info(oldHash ? 'consumer deps changed — yarn install' : 'first run — yarn install');
|
|
21
|
+
// Yarn 4 is cache-first and non-interactive by default
|
|
22
|
+
// in non-TTY contexts, so no flags are needed
|
|
23
|
+
await execa.execa('yarn', ['install'], {
|
|
24
|
+
cwd: paths.consumerDir,
|
|
25
|
+
stdio: 'inherit',
|
|
26
|
+
});
|
|
27
|
+
await fsExtra.writeFile(paths.shadowDepsHash, newHash);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
exports.syncShadow = syncShadow;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure the consumer has a `.yarnrc.yml` that pins `nodeLinker: node-modules`.
|
|
3
|
+
*
|
|
4
|
+
* Yarn 4 defaults to PnP, which trident-toolkit's webpack pipeline doesn't
|
|
5
|
+
* support cleanly (webpack expects a flat node_modules). We force the
|
|
6
|
+
* classic linker so installs produce a real `node_modules/`. Idempotent —
|
|
7
|
+
* leaves any other settings the user added alone.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ensureYarnRc(consumerDir: string): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=yarnrc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yarnrc.d.ts","sourceRoot":"","sources":["../../src/shadow/yarnrc.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAerE"}
|