@open-mercato/cli 0.10.1-develop.7990.1.82d0a183c5 → 0.10.1-develop.8004.1.a8a79ee43f
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/.turbo/turbo-build.log +1 -1
- package/build.mjs +1 -0
- package/dist/agentic/guides/module-facts.json +162 -162
- package/dist/agentic/guides/module-facts.v2.json +162 -162
- package/dist/agentic/guides/module-tool.md +21 -0
- package/dist/agentic/guides/modules/agent_orchestrator/index.md +1 -1
- package/dist/agentic/guides/modules/ai_assistant/index.md +1 -1
- package/dist/agentic/guides/modules/api_docs/index.md +1 -1
- package/dist/agentic/guides/modules/api_keys/index.md +1 -1
- package/dist/agentic/guides/modules/attachments/index.md +1 -1
- package/dist/agentic/guides/modules/audit_logs/index.md +1 -1
- package/dist/agentic/guides/modules/auth/index.md +1 -1
- package/dist/agentic/guides/modules/availability/index.md +1 -1
- package/dist/agentic/guides/modules/business_rules/index.md +1 -1
- package/dist/agentic/guides/modules/carrier_inpost/index.md +1 -1
- package/dist/agentic/guides/modules/cart/index.md +1 -1
- package/dist/agentic/guides/modules/catalog/index.md +1 -1
- package/dist/agentic/guides/modules/channel_apns/index.md +1 -1
- package/dist/agentic/guides/modules/channel_discord/index.md +1 -1
- package/dist/agentic/guides/modules/channel_expo/index.md +1 -1
- package/dist/agentic/guides/modules/channel_fcm/index.md +1 -1
- package/dist/agentic/guides/modules/channel_gmail/index.md +1 -1
- package/dist/agentic/guides/modules/channel_imap/index.md +1 -1
- package/dist/agentic/guides/modules/channel_resend/index.md +1 -1
- package/dist/agentic/guides/modules/channel_ses/index.md +1 -1
- package/dist/agentic/guides/modules/channel_smtp/index.md +1 -1
- package/dist/agentic/guides/modules/checkout/index.md +1 -1
- package/dist/agentic/guides/modules/communication_channels/index.md +1 -1
- package/dist/agentic/guides/modules/configs/index.md +1 -1
- package/dist/agentic/guides/modules/content/index.md +1 -1
- package/dist/agentic/guides/modules/currencies/index.md +1 -1
- package/dist/agentic/guides/modules/customer_accounts/index.md +1 -1
- package/dist/agentic/guides/modules/customer_groups/index.md +1 -1
- package/dist/agentic/guides/modules/customers/index.md +1 -1
- package/dist/agentic/guides/modules/dashboards/index.md +1 -1
- package/dist/agentic/guides/modules/data_sync/index.md +1 -1
- package/dist/agentic/guides/modules/design_system/index.md +1 -1
- package/dist/agentic/guides/modules/devices/index.md +1 -1
- package/dist/agentic/guides/modules/dictionaries/index.md +1 -1
- package/dist/agentic/guides/modules/directory/index.md +1 -1
- package/dist/agentic/guides/modules/documents/index.md +1 -1
- package/dist/agentic/guides/modules/ecommerce/index.md +1 -1
- package/dist/agentic/guides/modules/entities/index.md +1 -1
- package/dist/agentic/guides/modules/eudr/index.md +1 -1
- package/dist/agentic/guides/modules/events/index.md +1 -1
- package/dist/agentic/guides/modules/feature_toggles/index.md +1 -1
- package/dist/agentic/guides/modules/forms/index.md +1 -1
- package/dist/agentic/guides/modules/gateway_autopay/index.md +1 -1
- package/dist/agentic/guides/modules/gateway_stripe/index.md +1 -1
- package/dist/agentic/guides/modules/gateway_tpay/index.md +1 -1
- package/dist/agentic/guides/modules/generators/index.md +1 -1
- package/dist/agentic/guides/modules/inbox_ops/index.md +1 -1
- package/dist/agentic/guides/modules/integrations/index.md +1 -1
- package/dist/agentic/guides/modules/messages/index.md +1 -1
- package/dist/agentic/guides/modules/notifications/index.md +1 -1
- package/dist/agentic/guides/modules/onboarding/index.md +1 -1
- package/dist/agentic/guides/modules/payment_gateways/index.md +1 -1
- package/dist/agentic/guides/modules/perspectives/index.md +1 -1
- package/dist/agentic/guides/modules/phone_calls/index.md +1 -1
- package/dist/agentic/guides/modules/planner/index.md +1 -1
- package/dist/agentic/guides/modules/portal/index.md +1 -1
- package/dist/agentic/guides/modules/progress/index.md +1 -1
- package/dist/agentic/guides/modules/promotions/index.md +1 -1
- package/dist/agentic/guides/modules/push_notifications/index.md +1 -1
- package/dist/agentic/guides/modules/query_index/index.md +1 -1
- package/dist/agentic/guides/modules/record_locks/index.md +1 -1
- package/dist/agentic/guides/modules/resources/index.md +1 -1
- package/dist/agentic/guides/modules/sales/index.md +1 -1
- package/dist/agentic/guides/modules/scheduler/index.md +1 -1
- package/dist/agentic/guides/modules/search/index.md +1 -1
- package/dist/agentic/guides/modules/security/index.md +1 -1
- package/dist/agentic/guides/modules/seeds/index.md +1 -1
- package/dist/agentic/guides/modules/shipping_carriers/index.md +1 -1
- package/dist/agentic/guides/modules/sso/index.md +1 -1
- package/dist/agentic/guides/modules/staff/index.md +1 -1
- package/dist/agentic/guides/modules/storage_s3/index.md +1 -1
- package/dist/agentic/guides/modules/sync_akeneo/index.md +1 -1
- package/dist/agentic/guides/modules/sync_excel/index.md +1 -1
- package/dist/agentic/guides/modules/system_status_overlays/index.md +1 -1
- package/dist/agentic/guides/modules/telemetry/index.md +1 -1
- package/dist/agentic/guides/modules/tillio/index.md +1 -1
- package/dist/agentic/guides/modules/translations/index.md +1 -1
- package/dist/agentic/guides/modules/warranty_claims/index.md +1 -1
- package/dist/agentic/guides/modules/webhooks/index.md +1 -1
- package/dist/agentic/guides/modules/wms/index.md +1 -1
- package/dist/agentic/guides/modules/workflows/index.md +1 -1
- package/dist/agentic/guides/reference-module-facts.json +1 -1
- package/dist/agentic/guides/upstream/BACKWARD_COMPATIBILITY.md +4 -0
- package/dist/agentic/guides/upstream/manifest.json +2 -2
- package/dist/agentic/shared/ai/harness/cases.json +23 -9
- package/dist/agentic/shared/ai/harness/source-link-inventory.json +90 -4
- package/dist/i18n/de.json +4 -0
- package/dist/i18n/en.json +4 -0
- package/dist/i18n/es.json +4 -0
- package/dist/i18n/ko.json +4 -0
- package/dist/i18n/pl.json +4 -0
- package/dist/lib/__fixtures__/module-search/built-in.json +235 -0
- package/dist/lib/__fixtures__/module-search/catalog-parity.json +4076 -0
- package/dist/lib/__fixtures__/module-search/modules-index.json +1980 -0
- package/dist/lib/__fixtures__/official-module-package/package.json +33 -0
- package/dist/lib/__integration__/TC-INT-007.spec.js +207 -19
- package/dist/lib/__integration__/TC-INT-007.spec.js.map +2 -2
- package/dist/lib/__integration__/TC-INT-009.spec.js +267 -0
- package/dist/lib/__integration__/TC-INT-009.spec.js.map +7 -0
- package/dist/lib/eject.js +25 -9
- package/dist/lib/eject.js.map +2 -2
- package/dist/lib/generators/entity-ids.js +2 -0
- package/dist/lib/generators/entity-ids.js.map +2 -2
- package/dist/lib/generators/module-di.js +2 -0
- package/dist/lib/generators/module-di.js.map +2 -2
- package/dist/lib/generators/module-entities.js +2 -0
- package/dist/lib/generators/module-entities.js.map +2 -2
- package/dist/lib/generators/module-package-sources.js +6 -4
- package/dist/lib/generators/module-package-sources.js.map +2 -2
- package/dist/lib/generators/module-registry.js +32 -86
- package/dist/lib/generators/module-registry.js.map +2 -2
- package/dist/lib/generators/openapi.js +2 -0
- package/dist/lib/generators/openapi.js.map +2 -2
- package/dist/lib/generators/source-exports.js +73 -0
- package/dist/lib/generators/source-exports.js.map +7 -0
- package/dist/lib/init-secrets.js +33 -1
- package/dist/lib/init-secrets.js.map +2 -2
- package/dist/lib/init-summary.js +44 -0
- package/dist/lib/init-summary.js.map +7 -0
- package/dist/lib/module-github.js +98 -0
- package/dist/lib/module-github.js.map +7 -0
- package/dist/lib/module-identity.js +131 -0
- package/dist/lib/module-identity.js.map +7 -0
- package/dist/lib/module-inspection.js +124 -0
- package/dist/lib/module-inspection.js.map +7 -0
- package/dist/lib/module-install.js +150 -21
- package/dist/lib/module-install.js.map +3 -3
- package/dist/lib/module-package.js +205 -15
- package/dist/lib/module-package.js.map +2 -2
- package/dist/lib/modules-config.js +69 -30
- package/dist/lib/modules-config.js.map +2 -2
- package/dist/lib/resolver.js +33 -34
- package/dist/lib/resolver.js.map +2 -2
- package/dist/mercato.js +17 -37
- package/dist/mercato.js.map +2 -2
- package/package.json +7 -7
- package/src/__tests__/mercato.test.ts +71 -4
- package/src/i18n/de.json +4 -0
- package/src/i18n/en.json +4 -0
- package/src/i18n/es.json +4 -0
- package/src/i18n/ko.json +4 -0
- package/src/i18n/pl.json +4 -0
- package/src/lib/__fixtures__/official-module-package/dist/modules/test_package/widgets/injection/test/widget.js +1 -0
- package/src/lib/__integration__/TC-INT-007.spec.ts +219 -19
- package/src/lib/__integration__/TC-INT-009.spec.ts +279 -0
- package/src/lib/__tests__/eject.test.ts +98 -4
- package/src/lib/__tests__/init-secrets.test.ts +85 -1
- package/src/lib/__tests__/init-summary.test.ts +50 -0
- package/src/lib/__tests__/module-github.test.ts +108 -0
- package/src/lib/__tests__/module-identity.test.ts +144 -0
- package/src/lib/__tests__/module-inspection.test.ts +195 -0
- package/src/lib/__tests__/module-install.test.ts +399 -10
- package/src/lib/__tests__/module-package.test.ts +154 -0
- package/src/lib/__tests__/modules-config.test.ts +55 -0
- package/src/lib/__tests__/resolver.packages.test.ts +29 -0
- package/src/lib/eject.ts +28 -10
- package/src/lib/generators/__tests__/module-id-collisions.test.ts +146 -0
- package/src/lib/generators/__tests__/module-package-sources.test.ts +19 -2
- package/src/lib/generators/__tests__/module-requirements.test.ts +56 -0
- package/src/lib/generators/entity-ids.ts +2 -0
- package/src/lib/generators/module-di.ts +2 -0
- package/src/lib/generators/module-entities.ts +2 -0
- package/src/lib/generators/module-package-sources.ts +7 -5
- package/src/lib/generators/module-registry.ts +33 -115
- package/src/lib/generators/openapi.ts +3 -0
- package/src/lib/generators/source-exports.ts +93 -0
- package/src/lib/init-secrets.ts +37 -0
- package/src/lib/init-summary.ts +54 -0
- package/src/lib/module-github.ts +109 -0
- package/src/lib/module-identity.ts +145 -0
- package/src/lib/module-inspection.ts +133 -0
- package/src/lib/module-install.ts +170 -22
- package/src/lib/module-package.ts +243 -16
- package/src/lib/modules-config.ts +80 -32
- package/src/lib/resolver.ts +35 -39
- package/src/mercato.ts +18 -44
- package/src/types/cross-spawn.d.ts +2 -2
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@open-mercato/test-package",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"exports": {
|
|
7
|
+
"./package.json": "./package.json",
|
|
8
|
+
".": "./dist/index.js",
|
|
9
|
+
"./*": {
|
|
10
|
+
"types": "./src/*.ts",
|
|
11
|
+
"default": "./dist/*.js"
|
|
12
|
+
},
|
|
13
|
+
"./*/*": {
|
|
14
|
+
"types": "./src/*/*.ts",
|
|
15
|
+
"default": "./dist/*/*.js"
|
|
16
|
+
},
|
|
17
|
+
"./*/*/*": {
|
|
18
|
+
"types": "./src/*/*/*.ts",
|
|
19
|
+
"default": "./dist/*/*/*.js"
|
|
20
|
+
},
|
|
21
|
+
"./*/*/*/*": {
|
|
22
|
+
"types": "./src/*/*/*/*.ts",
|
|
23
|
+
"default": "./dist/*/*/*/*.js"
|
|
24
|
+
},
|
|
25
|
+
"./*/*/*/*/*": {
|
|
26
|
+
"types": "./src/*/*/*/*/*.ts",
|
|
27
|
+
"default": "./dist/*/*/*/*/*.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"@open-mercato/core": ">=0.4.7 <0.5.0"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -19,21 +19,34 @@ const fixtureModulePackage = path.join(
|
|
|
19
19
|
function yarnBinary() {
|
|
20
20
|
return process.platform === "win32" ? "yarn.cmd" : "yarn";
|
|
21
21
|
}
|
|
22
|
-
function runCommand(command, args, cwd) {
|
|
22
|
+
function runCommand(command, args, cwd, environment = {}) {
|
|
23
23
|
const yarnCacheFolder = path.join(cwd, ".yarn", "cache");
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
24
|
+
try {
|
|
25
|
+
return execFileSync(command, args, {
|
|
26
|
+
cwd,
|
|
27
|
+
encoding: "utf8",
|
|
28
|
+
env: {
|
|
29
|
+
...process.env,
|
|
30
|
+
FORCE_COLOR: "0",
|
|
31
|
+
NODE_NO_WARNINGS: "1",
|
|
32
|
+
YARN_CACHE_FOLDER: yarnCacheFolder,
|
|
33
|
+
YARN_ENABLE_GLOBAL_CACHE: "0",
|
|
34
|
+
YARN_ENABLE_IMMUTABLE_INSTALLS: "0",
|
|
35
|
+
YARN_NODE_LINKER: "node-modules",
|
|
36
|
+
...environment
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (!error || typeof error !== "object") throw error;
|
|
41
|
+
const errorRecord = error;
|
|
42
|
+
const outputs = ["stdout", "stderr"].flatMap((streamName) => {
|
|
43
|
+
const output = errorRecord[streamName];
|
|
44
|
+
return typeof output === "string" || Buffer.isBuffer(output) ? [output.toString().trim()] : [];
|
|
45
|
+
}).filter(Boolean);
|
|
46
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
47
|
+
throw new Error(outputs.length > 0 ? `${message}
|
|
48
|
+
${outputs.join("\n")}` : message);
|
|
49
|
+
}
|
|
37
50
|
}
|
|
38
51
|
function runMercato(args, cwd) {
|
|
39
52
|
return runCommand(process.execPath, [cliBin, ...args], cwd);
|
|
@@ -69,6 +82,7 @@ const commentedModulesSource = [
|
|
|
69
82
|
""
|
|
70
83
|
].join("\n");
|
|
71
84
|
function createMonorepoFixture(rootDir) {
|
|
85
|
+
writeFile(path.join(rootDir, "yarn.lock"), "");
|
|
72
86
|
writeFile(
|
|
73
87
|
path.join(rootDir, "package.json"),
|
|
74
88
|
JSON.stringify(
|
|
@@ -103,6 +117,7 @@ function createMonorepoFixture(rootDir) {
|
|
|
103
117
|
return appDir;
|
|
104
118
|
}
|
|
105
119
|
function createStandaloneFixture(rootDir) {
|
|
120
|
+
writeFile(path.join(rootDir, "yarn.lock"), "");
|
|
106
121
|
writeFile(
|
|
107
122
|
path.join(rootDir, ".yarnrc.yml"),
|
|
108
123
|
["nodeLinker: node-modules", "enableGlobalCache: false", "cacheFolder: ./.yarn/cache", ""].join("\n")
|
|
@@ -173,13 +188,182 @@ test.describe("TC-INT-007: CLI official module install and eject flows", () => {
|
|
|
173
188
|
);
|
|
174
189
|
const modulesSource = readFile(path.join(appDir, "src", "modules.ts"));
|
|
175
190
|
const cssSource = readFile(path.join(appDir, ".mercato", "generated", "module-package-sources.css"));
|
|
176
|
-
expect(modulesSource).
|
|
191
|
+
expect(modulesSource).toMatch(/id: 'test_package', from: '@app'/);
|
|
192
|
+
expect(modulesSource).not.toContain("locator:");
|
|
193
|
+
expect(modulesSource).toContain("packageName: '@open-mercato/test-package'");
|
|
177
194
|
expect(fs.existsSync(path.join(appDir, "src", "modules", "test_package", "index.ts"))).toBe(true);
|
|
195
|
+
expect(readFile(path.join(appDir, "src", "modules", "test_package", "index.ts"))).toBe(readFile(path.join(fixtureModulePackage, "src", "modules", "test_package", "index.ts")));
|
|
178
196
|
expect(cssSource).toBe("");
|
|
179
197
|
} finally {
|
|
180
198
|
fs.rmSync(appDir, { recursive: true, force: true });
|
|
181
199
|
}
|
|
182
200
|
});
|
|
201
|
+
test("module add reports dependencies that must be enabled before registration", () => {
|
|
202
|
+
const appDir = fs.mkdtempSync(path.join(os.tmpdir(), "mercato-cli-standalone-dependencies-"));
|
|
203
|
+
try {
|
|
204
|
+
createStandaloneFixture(appDir);
|
|
205
|
+
const packageDir = path.join(appDir, "fixture-module-package");
|
|
206
|
+
fs.cpSync(fixtureModulePackage, packageDir, { recursive: true });
|
|
207
|
+
writeFile(
|
|
208
|
+
path.join(packageDir, "src", "modules", "test_package", "index.ts"),
|
|
209
|
+
"export const metadata = { id: 'test_package', requires: ['customers'], ejectable: true }\n"
|
|
210
|
+
);
|
|
211
|
+
runCommand(yarnBinary(), ["install"], appDir);
|
|
212
|
+
expect(() => runMercato(
|
|
213
|
+
["module", "add", "@open-mercato/test-package@file:./fixture-module-package"],
|
|
214
|
+
appDir
|
|
215
|
+
)).toThrow(/requires module\(s\) that are not enabled: customers/);
|
|
216
|
+
expect(readFile(path.join(appDir, "src", "modules.ts"))).toBe("export const enabledModules = []\n");
|
|
217
|
+
} finally {
|
|
218
|
+
fs.rmSync(appDir, { recursive: true, force: true });
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
test("module add resolves canonical requirements from retained ejected origins", () => {
|
|
222
|
+
const appDir = fs.mkdtempSync(path.join(os.tmpdir(), "mercato-cli-canonical-requires-"));
|
|
223
|
+
try {
|
|
224
|
+
createStandaloneFixture(appDir);
|
|
225
|
+
const packageDir = path.join(appDir, "fixture-module-package");
|
|
226
|
+
fs.cpSync(fixtureModulePackage, packageDir, { recursive: true });
|
|
227
|
+
const requirements = [
|
|
228
|
+
"@pkarw/marketing_consents@preview",
|
|
229
|
+
"npm:@pkarw/marketing_consents@1.0.0",
|
|
230
|
+
"github:pkarw/marketing-consents",
|
|
231
|
+
"npm:consent-helper@next",
|
|
232
|
+
"github:pkarw/consent-tools#main",
|
|
233
|
+
"pkarw/consent-tools",
|
|
234
|
+
"https://github.com/pkarw/consent-tools.git#release",
|
|
235
|
+
"ssh://git@github.com/pkarw/consent-tools.git#main",
|
|
236
|
+
"git@github.com:pkarw/consent-tools.git",
|
|
237
|
+
"github:pkarw/installed-tools",
|
|
238
|
+
"npm:@open-mercato/core@preview"
|
|
239
|
+
];
|
|
240
|
+
writeFile(
|
|
241
|
+
path.join(packageDir, "src", "modules", "test_package", "index.ts"),
|
|
242
|
+
`export const metadata = { id: 'test_package', requires: ${JSON.stringify(requirements)}, ejectable: true }
|
|
243
|
+
`
|
|
244
|
+
);
|
|
245
|
+
const entries = [
|
|
246
|
+
{ id: "marketing_consents", from: "@app", locator: "github:pkarw/marketing-consents", packageName: "@pkarw/marketing_consents" },
|
|
247
|
+
{ id: "npm_consents", from: "@app", locator: "npm:@pkarw/marketing_consents", packageName: "@pkarw/marketing_consents" },
|
|
248
|
+
{ id: "npm_core", from: "@app", locator: "npm:@open-mercato/core", packageName: "@open-mercato/core" },
|
|
249
|
+
{ id: "consent_helper", from: "@app", locator: "npm:consent-helper" },
|
|
250
|
+
{ id: "consent_tools", from: "@app", locator: "github:pkarw/consent-tools" }
|
|
251
|
+
];
|
|
252
|
+
for (const entry of entries) {
|
|
253
|
+
writeFile(
|
|
254
|
+
path.join(appDir, "src", "modules", entry.id, "index.ts"),
|
|
255
|
+
`export const metadata = { id: '${entry.id}' }
|
|
256
|
+
`
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
const corePackageDir = path.join(appDir, "vendor", "core");
|
|
260
|
+
writeFile(
|
|
261
|
+
path.join(corePackageDir, "package.json"),
|
|
262
|
+
JSON.stringify({ name: "@open-mercato/core", version: "0.4.7", type: "module", repository: { type: "git", url: "https://github.com/pkarw/installed-tools.git" } })
|
|
263
|
+
);
|
|
264
|
+
writeFile(
|
|
265
|
+
path.join(corePackageDir, "src", "modules", "repository_tools", "index.ts"),
|
|
266
|
+
"export const metadata = { id: 'repository_tools' }\n"
|
|
267
|
+
);
|
|
268
|
+
writeFile(
|
|
269
|
+
path.join(corePackageDir, "dist", "modules", "repository_tools", "index.js"),
|
|
270
|
+
"export const metadata = { id: 'repository_tools' }\n"
|
|
271
|
+
);
|
|
272
|
+
const enabledEntries = [...entries, { id: "repository_tools", from: "@open-mercato/core", locator: "github:pkarw/installed-tools" }];
|
|
273
|
+
writeFile(path.join(appDir, "src", "modules.ts"), `export const enabledModules = ${JSON.stringify(enabledEntries)}
|
|
274
|
+
`);
|
|
275
|
+
runCommand(yarnBinary(), ["install"], appDir);
|
|
276
|
+
runMercato(["module", "add", "npm:@open-mercato/test-package@file:./fixture-module-package"], appDir);
|
|
277
|
+
expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("id: 'test_package'");
|
|
278
|
+
} finally {
|
|
279
|
+
fs.rmSync(appDir, { recursive: true, force: true });
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
test("same-name modules from different origins do not satisfy canonical requirements", () => {
|
|
283
|
+
const appDir = fs.mkdtempSync(path.join(os.tmpdir(), "mercato-cli-wrong-origin-"));
|
|
284
|
+
try {
|
|
285
|
+
createStandaloneFixture(appDir);
|
|
286
|
+
const packageDir = path.join(appDir, "fixture-module-package");
|
|
287
|
+
fs.cpSync(fixtureModulePackage, packageDir, { recursive: true });
|
|
288
|
+
writeFile(
|
|
289
|
+
path.join(packageDir, "src", "modules", "test_package", "index.ts"),
|
|
290
|
+
"export const metadata = { id: 'test_package', requires: ['@pkarw/marketing_consents', 'github:pkarw/consent-tools'], ejectable: true }\n"
|
|
291
|
+
);
|
|
292
|
+
const modulesSource = `export const enabledModules = [
|
|
293
|
+
{ id: 'marketing_consents', from: '@app', locator: 'npm:@open-mercato/marketing_consents' },
|
|
294
|
+
{ id: 'consent_tools', from: '@app', locator: 'github:another-owner/consent-tools' },
|
|
295
|
+
]
|
|
296
|
+
`;
|
|
297
|
+
writeFile(path.join(appDir, "src", "modules.ts"), modulesSource);
|
|
298
|
+
runCommand(yarnBinary(), ["install"], appDir);
|
|
299
|
+
expect(() => runMercato(
|
|
300
|
+
["module", "add", "@open-mercato/test-package@file:./fixture-module-package", "--eject"],
|
|
301
|
+
appDir
|
|
302
|
+
)).toThrow(/@pkarw\/marketing_consents[\s\S]*github:pkarw\/consent-tools[\s\S]*npx create-mercato-module install/);
|
|
303
|
+
expect(readFile(path.join(appDir, "src", "modules.ts"))).toBe(modulesSource);
|
|
304
|
+
expect(fs.existsSync(path.join(appDir, "src", "modules", "test_package"))).toBe(false);
|
|
305
|
+
} finally {
|
|
306
|
+
fs.rmSync(appDir, { recursive: true, force: true });
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
test("module add rejects a same-ID source collision before ejecting", () => {
|
|
310
|
+
const appDir = fs.mkdtempSync(path.join(os.tmpdir(), "mercato-cli-module-collision-"));
|
|
311
|
+
try {
|
|
312
|
+
createStandaloneFixture(appDir);
|
|
313
|
+
const modulesSource = "export const enabledModules = [{ id: 'test_package', from: '@app', locator: 'github:another-owner/test-package' }]\n";
|
|
314
|
+
const localSource = "export const metadata = { id: 'test_package', locator: 'github:another-owner/test-package' }\n";
|
|
315
|
+
writeFile(path.join(appDir, "src", "modules.ts"), modulesSource);
|
|
316
|
+
writeFile(path.join(appDir, "src", "modules", "test_package", "index.ts"), localSource);
|
|
317
|
+
runCommand(yarnBinary(), ["install"], appDir);
|
|
318
|
+
expect(() => runMercato(
|
|
319
|
+
["module", "add", `@open-mercato/test-package@file:${fixtureModulePackage}`, "--eject"],
|
|
320
|
+
appDir
|
|
321
|
+
)).toThrow(/(?=[\s\S]*test_package)(?=[\s\S]*(?:collision|already|conflict))(?=[\s\S]*another-owner)(?=[\s\S]*@open-mercato\/test-package)/i);
|
|
322
|
+
expect(readFile(path.join(appDir, "src", "modules.ts"))).toBe(modulesSource);
|
|
323
|
+
expect(readFile(path.join(appDir, "src", "modules", "test_package", "index.ts"))).toBe(localSource);
|
|
324
|
+
} finally {
|
|
325
|
+
fs.rmSync(appDir, { recursive: true, force: true });
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
test("GitHub locators detect a runtime ID collision before invoking Yarn", () => {
|
|
329
|
+
const appDir = fs.mkdtempSync(path.join(os.tmpdir(), "mercato-cli-github-collision-"));
|
|
330
|
+
try {
|
|
331
|
+
createStandaloneFixture(appDir);
|
|
332
|
+
const modulesSource = "export const enabledModules = [{ id: 'test_package', from: '@app', locator: 'github:other/test-package' }]\n";
|
|
333
|
+
writeFile(path.join(appDir, "src", "modules.ts"), modulesSource);
|
|
334
|
+
const originalManifest = readFile(path.join(appDir, "package.json"));
|
|
335
|
+
const executableDir = path.join(appDir, "bin");
|
|
336
|
+
const packageManifest = Buffer.from(JSON.stringify({ name: "@pkarw/test-package" })).toString("base64");
|
|
337
|
+
const ghPath = path.join(executableDir, "gh");
|
|
338
|
+
writeFile(ghPath, `#!/usr/bin/env node
|
|
339
|
+
const endpoint = process.argv[3]
|
|
340
|
+
const sha = 'a'.repeat(40)
|
|
341
|
+
const value = endpoint === 'user' ? { login: 'pkarw' }
|
|
342
|
+
: endpoint.includes('/commits/') ? { sha }
|
|
343
|
+
: endpoint.includes('/contents/') ? { encoding: 'base64', content: ${JSON.stringify(packageManifest)} }
|
|
344
|
+
: endpoint.includes('/git/trees/') ? { tree: [{ path: 'src/modules/test_package/index.ts' }] }
|
|
345
|
+
: { default_branch: 'main' }
|
|
346
|
+
process.stdout.write(JSON.stringify(value))
|
|
347
|
+
`);
|
|
348
|
+
const yarnPath = path.join(executableDir, "yarn");
|
|
349
|
+
const marker = path.join(appDir, "yarn-invoked");
|
|
350
|
+
writeFile(yarnPath, "#!/usr/bin/env node\nrequire('node:fs').writeFileSync(process.env.COLLISION_YARN_MARKER, 'invoked')\nprocess.exit(1)\n");
|
|
351
|
+
fs.chmodSync(ghPath, 493);
|
|
352
|
+
fs.chmodSync(yarnPath, 493);
|
|
353
|
+
for (const locator of ["github:pkarw/test-package", "https://github.com/pkarw/test-package.git", "git@github.com:pkarw/test-package.git", "github:test-package"]) {
|
|
354
|
+
expect(() => runCommand(process.execPath, [cliBin, "module", "add", locator, "--allow-third-party"], appDir, {
|
|
355
|
+
PATH: executableDir + path.delimiter + process.env.PATH,
|
|
356
|
+
COLLISION_YARN_MARKER: marker
|
|
357
|
+
})).toThrow(/Module name collision[\s\S]*test_package[\s\S]*github:other\/test-package[\s\S]*github:pkarw\/test-package/);
|
|
358
|
+
}
|
|
359
|
+
expect(fs.existsSync(marker)).toBe(false);
|
|
360
|
+
expect(readFile(path.join(appDir, "package.json"))).toBe(originalManifest);
|
|
361
|
+
expect(readFile(path.join(appDir, "src", "modules.ts"))).toBe(modulesSource);
|
|
362
|
+
expect(fs.existsSync(path.join(appDir, "src", "modules", "test_package"))).toBe(false);
|
|
363
|
+
} finally {
|
|
364
|
+
fs.rmSync(appDir, { recursive: true, force: true });
|
|
365
|
+
}
|
|
366
|
+
});
|
|
183
367
|
test("module enable supports package-backed and ejected flows plus both eject entrypoints", () => {
|
|
184
368
|
const appDir = fs.mkdtempSync(path.join(os.tmpdir(), "mercato-cli-standalone-eject-"));
|
|
185
369
|
try {
|
|
@@ -192,22 +376,26 @@ test.describe("TC-INT-007: CLI official module install and eject flows", () => {
|
|
|
192
376
|
);
|
|
193
377
|
runMercato(["module", "enable", "@open-mercato/test-package"], appDir);
|
|
194
378
|
expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain(
|
|
195
|
-
"
|
|
379
|
+
"id: 'test_package', from: '@open-mercato/test-package'"
|
|
196
380
|
);
|
|
197
381
|
writeFile(path.join(appDir, "src", "modules.ts"), "export const enabledModules = []\n");
|
|
198
382
|
fs.rmSync(path.join(appDir, "src", "modules", "test_package"), { recursive: true, force: true });
|
|
199
383
|
runMercato(["module", "enable", "@open-mercato/test-package", "--eject"], appDir);
|
|
200
|
-
expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("
|
|
384
|
+
expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("id: 'test_package', from: '@app'");
|
|
201
385
|
expect(fs.existsSync(path.join(appDir, "src", "modules", "test_package", "index.ts"))).toBe(true);
|
|
202
386
|
expect(readFile(path.join(appDir, ".mercato", "generated", "module-package-sources.css"))).toBe("");
|
|
203
387
|
writeFile(path.join(appDir, "src", "modules.ts"), "export const enabledModules = [{ id: 'test_package', from: '@open-mercato/test-package' }]\n");
|
|
204
388
|
fs.rmSync(path.join(appDir, "src", "modules", "test_package"), { recursive: true, force: true });
|
|
205
389
|
runMercato(["module", "eject", "test_package"], appDir);
|
|
206
|
-
expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("
|
|
390
|
+
expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("packageName: '@open-mercato/test-package'");
|
|
391
|
+
expect(readFile(path.join(appDir, "src", "modules.ts"))).not.toContain("locator: 'npm:@open-mercato/test-package'");
|
|
392
|
+
expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("id: 'test_package', from: '@app'");
|
|
207
393
|
writeFile(path.join(appDir, "src", "modules.ts"), "export const enabledModules = [{ id: 'test_package', from: '@open-mercato/test-package' }]\n");
|
|
208
394
|
fs.rmSync(path.join(appDir, "src", "modules", "test_package"), { recursive: true, force: true });
|
|
209
395
|
runMercato(["eject", "test_package"], appDir);
|
|
210
|
-
expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("
|
|
396
|
+
expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("packageName: '@open-mercato/test-package'");
|
|
397
|
+
expect(readFile(path.join(appDir, "src", "modules.ts"))).not.toContain("locator: 'npm:@open-mercato/test-package'");
|
|
398
|
+
expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("id: 'test_package', from: '@app'");
|
|
211
399
|
} finally {
|
|
212
400
|
fs.rmSync(appDir, { recursive: true, force: true });
|
|
213
401
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/__integration__/TC-INT-007.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { expect, test } from '@playwright/test'\nimport { execFileSync } from 'node:child_process'\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\nconst repoRoot = path.resolve(__dirname, '..', '..', '..', '..', '..')\nconst cliBin = path.join(repoRoot, 'packages', 'cli', 'dist', 'bin.js')\nconst fixtureModulePackage = path.join(\n repoRoot,\n 'packages',\n 'cli',\n 'src',\n 'lib',\n '__fixtures__',\n 'official-module-package',\n)\n\nfunction yarnBinary(): string {\n return process.platform === 'win32' ? 'yarn.cmd' : 'yarn'\n}\n\nfunction runCommand(command: string, args: string[], cwd: string): string {\n const yarnCacheFolder = path.join(cwd, '.yarn', 'cache')\n return execFileSync(command, args, {\n cwd,\n encoding: 'utf8',\n env: {\n ...process.env,\n FORCE_COLOR: '0',\n NODE_NO_WARNINGS: '1',\n YARN_CACHE_FOLDER: yarnCacheFolder,\n YARN_ENABLE_GLOBAL_CACHE: '0',\n YARN_ENABLE_IMMUTABLE_INSTALLS: '0',\n YARN_NODE_LINKER: 'node-modules',\n },\n })\n}\n\nfunction runMercato(args: string[], cwd: string): string {\n return runCommand(process.execPath, [cliBin, ...args], cwd)\n}\n\nfunction writeFile(filePath: string, content: string): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n fs.writeFileSync(filePath, content)\n}\n\nfunction createCoreWorkspacePackage(rootDir: string, relativeDir: string): string {\n const coreDir = path.join(rootDir, relativeDir)\n writeFile(\n path.join(coreDir, 'package.json'),\n JSON.stringify(\n {\n name: '@open-mercato/core',\n version: '0.4.7',\n type: 'module',\n },\n null,\n 2,\n ),\n )\n return coreDir\n}\n\nconst commentedModulesSource = [\n '// Central place to enable modules.',\n 'export const enabledModules = [',\n ' // customer_groups stays disabled by default.',\n \" // { id: 'customer_groups', from: '@open-mercato/core' },\",\n '',\n ' /* Block comment kept by module add. */',\n ']',\n '',\n].join('\\n')\n\nfunction createMonorepoFixture(rootDir: string): string {\n writeFile(\n path.join(rootDir, 'package.json'),\n JSON.stringify(\n {\n name: 'cli-module-monorepo-fixture',\n private: true,\n workspaces: ['apps/*', 'packages/*'],\n },\n null,\n 2,\n ),\n )\n writeFile(\n path.join(rootDir, '.yarnrc.yml'),\n ['nodeLinker: node-modules', 'enableGlobalCache: false', 'cacheFolder: ./.yarn/cache', ''].join('\\n'),\n )\n createCoreWorkspacePackage(rootDir, path.join('packages', 'core'))\n\n const appDir = path.join(rootDir, 'apps', 'mercato')\n writeFile(\n path.join(appDir, 'package.json'),\n JSON.stringify(\n {\n name: '@open-mercato/app',\n version: '0.0.0',\n private: true,\n },\n null,\n 2,\n ),\n )\n writeFile(path.join(appDir, 'src', 'modules.ts'), commentedModulesSource)\n return appDir\n}\n\nfunction createStandaloneFixture(rootDir: string): string {\n writeFile(\n path.join(rootDir, '.yarnrc.yml'),\n ['nodeLinker: node-modules', 'enableGlobalCache: false', 'cacheFolder: ./.yarn/cache', ''].join('\\n'),\n )\n createCoreWorkspacePackage(rootDir, path.join('vendor', 'core'))\n writeFile(\n path.join(rootDir, 'package.json'),\n JSON.stringify(\n {\n name: 'cli-module-standalone-fixture',\n private: true,\n dependencies: {\n '@open-mercato/core': 'file:./vendor/core',\n },\n },\n null,\n 2,\n ),\n )\n writeFile(path.join(rootDir, 'src', 'modules.ts'), 'export const enabledModules = []\\n')\n return rootDir\n}\n\nfunction readFile(filePath: string): string {\n return fs.readFileSync(filePath, 'utf8')\n}\n\ntest.describe('TC-INT-007: CLI official module install and eject flows', () => {\n test('module add installs and registers a package-backed module in a monorepo app', () => {\n const rootDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mercato-cli-monorepo-'))\n\n try {\n const appDir = createMonorepoFixture(rootDir)\n runCommand(yarnBinary(), ['install'], rootDir)\n\n runMercato(\n [\n 'module',\n 'add',\n `@open-mercato/test-package@file:${fixtureModulePackage}`,\n ],\n rootDir,\n )\n\n const modulesSource = readFile(path.join(appDir, 'src', 'modules.ts'))\n const cssSource = readFile(path.join(appDir, '.mercato', 'generated', 'module-package-sources.css'))\n const appPackageJson = JSON.parse(readFile(path.join(appDir, 'package.json'))) as {\n dependencies?: Record<string, string>\n }\n\n expect(modulesSource).toBe(\n commentedModulesSource.replace(\n ' /* Block comment kept by module add. */\\n',\n \" /* Block comment kept by module add. */\\n { id: 'test_package', from: '@open-mercato/test-package' },\\n\",\n ),\n )\n expect(cssSource).toContain('node_modules/@open-mercato/test-package/src/**/*.{ts,tsx}')\n expect(appPackageJson.dependencies?.['@open-mercato/test-package']).toBeTruthy()\n } finally {\n fs.rmSync(rootDir, { recursive: true, force: true })\n }\n })\n\n test('module add --eject copies module source and omits package CSS entries', () => {\n const appDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mercato-cli-standalone-source-'))\n\n try {\n createStandaloneFixture(appDir)\n runCommand(yarnBinary(), ['install'], appDir)\n\n runMercato(\n [\n 'module',\n 'add',\n `@open-mercato/test-package@file:${fixtureModulePackage}`,\n '--eject',\n ],\n appDir,\n )\n\n const modulesSource = readFile(path.join(appDir, 'src', 'modules.ts'))\n const cssSource = readFile(path.join(appDir, '.mercato', 'generated', 'module-package-sources.css'))\n\n expect(modulesSource).toContain(\"{ id: 'test_package', from: '@app' }\")\n expect(fs.existsSync(path.join(appDir, 'src', 'modules', 'test_package', 'index.ts'))).toBe(true)\n expect(cssSource).toBe('')\n } finally {\n fs.rmSync(appDir, { recursive: true, force: true })\n }\n })\n\n test('module enable supports package-backed and ejected flows plus both eject entrypoints', () => {\n const appDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mercato-cli-standalone-eject-'))\n\n try {\n createStandaloneFixture(appDir)\n runCommand(yarnBinary(), ['install'], appDir)\n runCommand(\n yarnBinary(),\n ['add', `@open-mercato/test-package@file:${fixtureModulePackage}`],\n appDir,\n )\n\n runMercato(['module', 'enable', '@open-mercato/test-package'], appDir)\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toContain(\n \"{ id: 'test_package', from: '@open-mercato/test-package' }\",\n )\n\n writeFile(path.join(appDir, 'src', 'modules.ts'), 'export const enabledModules = []\\n')\n fs.rmSync(path.join(appDir, 'src', 'modules', 'test_package'), { recursive: true, force: true })\n runMercato(['module', 'enable', '@open-mercato/test-package', '--eject'], appDir)\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toContain(\"{ id: 'test_package', from: '@app' }\")\n expect(fs.existsSync(path.join(appDir, 'src', 'modules', 'test_package', 'index.ts'))).toBe(true)\n expect(readFile(path.join(appDir, '.mercato', 'generated', 'module-package-sources.css'))).toBe('')\n\n writeFile(path.join(appDir, 'src', 'modules.ts'), \"export const enabledModules = [{ id: 'test_package', from: '@open-mercato/test-package' }]\\n\")\n fs.rmSync(path.join(appDir, 'src', 'modules', 'test_package'), { recursive: true, force: true })\n runMercato(['module', 'eject', 'test_package'], appDir)\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toContain(\"{ id: 'test_package', from: '@app' }\")\n\n writeFile(path.join(appDir, 'src', 'modules.ts'), \"export const enabledModules = [{ id: 'test_package', from: '@open-mercato/test-package' }]\\n\")\n fs.rmSync(path.join(appDir, 'src', 'modules', 'test_package'), { recursive: true, force: true })\n runMercato(['eject', 'test_package'], appDir)\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toContain(\"{ id: 'test_package', from: '@app' }\")\n } finally {\n fs.rmSync(appDir, { recursive: true, force: true })\n }\n })\n\n test('module add and module enable exit 0 without changes when the module is already enabled', () => {\n const appDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mercato-cli-standalone-rerun-'))\n\n try {\n createStandaloneFixture(appDir)\n runCommand(yarnBinary(), ['install'], appDir)\n const packageSpec = `@open-mercato/test-package@file:${fixtureModulePackage}`\n\n runMercato(['module', 'add', packageSpec], appDir)\n const modulesSource = readFile(path.join(appDir, 'src', 'modules.ts'))\n\n const addOutput = runMercato(['module', 'add', packageSpec], appDir)\n const enableOutput = runMercato(['module', 'enable', '@open-mercato/test-package'], appDir)\n\n expect(addOutput).toContain('is already enabled in modules.ts. Nothing to change.')\n expect(enableOutput).toContain('is already enabled in modules.ts. Nothing to change.')\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toBe(modulesSource)\n } finally {\n fs.rmSync(appDir, { recursive: true, force: true })\n }\n })\n})\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,QAAQ,YAAY;AAC7B,SAAS,oBAAoB;AAC7B,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAE9B,MAAM,YAAY,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAC7D,MAAM,WAAW,KAAK,QAAQ,WAAW,MAAM,MAAM,MAAM,MAAM,IAAI;AACrE,MAAM,SAAS,KAAK,KAAK,UAAU,YAAY,OAAO,QAAQ,QAAQ;AACtE,MAAM,uBAAuB,KAAK;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,aAAqB;AAC5B,SAAO,QAAQ,aAAa,UAAU,aAAa;AACrD;AAEA,SAAS,WAAW,SAAiB,MAAgB,KAAqB;AACxE,QAAM,kBAAkB,KAAK,KAAK,KAAK,SAAS,OAAO;AACvD,SAAO,aAAa,SAAS,MAAM;AAAA,IACjC;AAAA,IACA,UAAU;AAAA,IACV,KAAK;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,MACnB,0BAA0B;AAAA,MAC1B,gCAAgC;AAAA,MAChC,kBAAkB;AAAA,IACpB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,WAAW,MAAgB,KAAqB;AACvD,SAAO,WAAW,QAAQ,UAAU,CAAC,QAAQ,GAAG,IAAI,GAAG,GAAG;AAC5D;AAEA,SAAS,UAAU,UAAkB,SAAuB;AAC1D,KAAG,UAAU,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,KAAG,cAAc,UAAU,OAAO;AACpC;AAEA,SAAS,2BAA2B,SAAiB,aAA6B;AAChF,QAAM,UAAU,KAAK,KAAK,SAAS,WAAW;AAC9C;AAAA,IACE,KAAK,KAAK,SAAS,cAAc;AAAA,IACjC,KAAK;AAAA,MACH;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,MAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEX,SAAS,sBAAsB,SAAyB;AACtD;AAAA,IACE,KAAK,KAAK,SAAS,cAAc;AAAA,IACjC,KAAK;AAAA,MACH;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY,CAAC,UAAU,YAAY;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA;AAAA,IACE,KAAK,KAAK,SAAS,aAAa;AAAA,IAChC,CAAC,4BAA4B,4BAA4B,8BAA8B,EAAE,EAAE,KAAK,IAAI;AAAA,EACtG;AACA,6BAA2B,SAAS,KAAK,KAAK,YAAY,MAAM,CAAC;AAEjE,QAAM,SAAS,KAAK,KAAK,SAAS,QAAQ,SAAS;AACnD;AAAA,IACE,KAAK,KAAK,QAAQ,cAAc;AAAA,IAChC,KAAK;AAAA,MACH;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,YAAU,KAAK,KAAK,QAAQ,OAAO,YAAY,GAAG,sBAAsB;AACxE,SAAO;AACT;AAEA,SAAS,wBAAwB,SAAyB;AACxD;AAAA,IACE,KAAK,KAAK,SAAS,aAAa;AAAA,IAChC,CAAC,4BAA4B,4BAA4B,8BAA8B,EAAE,EAAE,KAAK,IAAI;AAAA,EACtG;AACA,6BAA2B,SAAS,KAAK,KAAK,UAAU,MAAM,CAAC;AAC/D;AAAA,IACE,KAAK,KAAK,SAAS,cAAc;AAAA,IACjC,KAAK;AAAA,MACH;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,QACT,cAAc;AAAA,UACZ,sBAAsB;AAAA,QACxB;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,YAAU,KAAK,KAAK,SAAS,OAAO,YAAY,GAAG,oCAAoC;AACvF,SAAO;AACT;AAEA,SAAS,SAAS,UAA0B;AAC1C,SAAO,GAAG,aAAa,UAAU,MAAM;AACzC;AAEA,KAAK,SAAS,2DAA2D,MAAM;AAC7E,OAAK,+EAA+E,MAAM;AACxF,UAAM,UAAU,GAAG,YAAY,KAAK,KAAK,GAAG,OAAO,GAAG,uBAAuB,CAAC;AAE9E,QAAI;AACF,YAAM,SAAS,sBAAsB,OAAO;AAC5C,iBAAW,WAAW,GAAG,CAAC,SAAS,GAAG,OAAO;AAE7C;AAAA,QACE;AAAA,UACE;AAAA,UACA;AAAA,UACA,mCAAmC,oBAAoB;AAAA,QACzD;AAAA,QACA;AAAA,MACF;AAEA,YAAM,gBAAgB,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC;AACrE,YAAM,YAAY,SAAS,KAAK,KAAK,QAAQ,YAAY,aAAa,4BAA4B,CAAC;AACnG,YAAM,iBAAiB,KAAK,MAAM,SAAS,KAAK,KAAK,QAAQ,cAAc,CAAC,CAAC;AAI7E,aAAO,aAAa,EAAE;AAAA,QACpB,uBAAuB;AAAA,UACrB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO,SAAS,EAAE,UAAU,2DAA2D;AACvF,aAAO,eAAe,eAAe,4BAA4B,CAAC,EAAE,WAAW;AAAA,IACjF,UAAE;AACA,SAAG,OAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACrD;AAAA,EACF,CAAC;AAED,OAAK,yEAAyE,MAAM;AAClF,UAAM,SAAS,GAAG,YAAY,KAAK,KAAK,GAAG,OAAO,GAAG,gCAAgC,CAAC;AAEtF,QAAI;AACF,8BAAwB,MAAM;AAC9B,iBAAW,WAAW,GAAG,CAAC,SAAS,GAAG,MAAM;AAE5C;AAAA,QACE;AAAA,UACE;AAAA,UACA;AAAA,UACA,mCAAmC,oBAAoB;AAAA,UACvD;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAEA,YAAM,gBAAgB,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC;AACrE,YAAM,YAAY,SAAS,KAAK,KAAK,QAAQ,YAAY,aAAa,4BAA4B,CAAC;AAEnG,aAAO,aAAa,EAAE,UAAU,sCAAsC;AACtE,aAAO,GAAG,WAAW,KAAK,KAAK,QAAQ,OAAO,WAAW,gBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI;AAChG,aAAO,SAAS,EAAE,KAAK,EAAE;AAAA,IAC3B,UAAE;AACA,SAAG,OAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACpD;AAAA,EACF,CAAC;AAED,OAAK,uFAAuF,MAAM;AAChG,UAAM,SAAS,GAAG,YAAY,KAAK,KAAK,GAAG,OAAO,GAAG,+BAA+B,CAAC;AAErF,QAAI;AACF,8BAAwB,MAAM;AAC9B,iBAAW,WAAW,GAAG,CAAC,SAAS,GAAG,MAAM;AAC5C;AAAA,QACE,WAAW;AAAA,QACX,CAAC,OAAO,mCAAmC,oBAAoB,EAAE;AAAA,QACjE;AAAA,MACF;AAEA,iBAAW,CAAC,UAAU,UAAU,4BAA4B,GAAG,MAAM;AACrE,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE;AAAA,QACvD;AAAA,MACF;AAEA,gBAAU,KAAK,KAAK,QAAQ,OAAO,YAAY,GAAG,oCAAoC;AACtF,SAAG,OAAO,KAAK,KAAK,QAAQ,OAAO,WAAW,cAAc,GAAG,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC/F,iBAAW,CAAC,UAAU,UAAU,8BAA8B,SAAS,GAAG,MAAM;AAChF,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,UAAU,sCAAsC;AACzG,aAAO,GAAG,WAAW,KAAK,KAAK,QAAQ,OAAO,WAAW,gBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI;AAChG,aAAO,SAAS,KAAK,KAAK,QAAQ,YAAY,aAAa,4BAA4B,CAAC,CAAC,EAAE,KAAK,EAAE;AAElG,gBAAU,KAAK,KAAK,QAAQ,OAAO,YAAY,GAAG,8FAA8F;AAChJ,SAAG,OAAO,KAAK,KAAK,QAAQ,OAAO,WAAW,cAAc,GAAG,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC/F,iBAAW,CAAC,UAAU,SAAS,cAAc,GAAG,MAAM;AACtD,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,UAAU,sCAAsC;AAEzG,gBAAU,KAAK,KAAK,QAAQ,OAAO,YAAY,GAAG,8FAA8F;AAChJ,SAAG,OAAO,KAAK,KAAK,QAAQ,OAAO,WAAW,cAAc,GAAG,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC/F,iBAAW,CAAC,SAAS,cAAc,GAAG,MAAM;AAC5C,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,UAAU,sCAAsC;AAAA,IAC3G,UAAE;AACA,SAAG,OAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACpD;AAAA,EACF,CAAC;AAED,OAAK,0FAA0F,MAAM;AACnG,UAAM,SAAS,GAAG,YAAY,KAAK,KAAK,GAAG,OAAO,GAAG,+BAA+B,CAAC;AAErF,QAAI;AACF,8BAAwB,MAAM;AAC9B,iBAAW,WAAW,GAAG,CAAC,SAAS,GAAG,MAAM;AAC5C,YAAM,cAAc,mCAAmC,oBAAoB;AAE3E,iBAAW,CAAC,UAAU,OAAO,WAAW,GAAG,MAAM;AACjD,YAAM,gBAAgB,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC;AAErE,YAAM,YAAY,WAAW,CAAC,UAAU,OAAO,WAAW,GAAG,MAAM;AACnE,YAAM,eAAe,WAAW,CAAC,UAAU,UAAU,4BAA4B,GAAG,MAAM;AAE1F,aAAO,SAAS,EAAE,UAAU,sDAAsD;AAClF,aAAO,YAAY,EAAE,UAAU,sDAAsD;AACrF,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,KAAK,aAAa;AAAA,IAC7E,UAAE;AACA,SAAG,OAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACpD;AAAA,EACF,CAAC;AACH,CAAC;",
|
|
4
|
+
"sourcesContent": ["import { expect, test } from '@playwright/test'\nimport { execFileSync } from 'node:child_process'\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\nconst repoRoot = path.resolve(__dirname, '..', '..', '..', '..', '..')\nconst cliBin = path.join(repoRoot, 'packages', 'cli', 'dist', 'bin.js')\nconst fixtureModulePackage = path.join(\n repoRoot,\n 'packages',\n 'cli',\n 'src',\n 'lib',\n '__fixtures__',\n 'official-module-package',\n)\n\nfunction yarnBinary(): string {\n return process.platform === 'win32' ? 'yarn.cmd' : 'yarn'\n}\n\nfunction runCommand(command: string, args: string[], cwd: string, environment: NodeJS.ProcessEnv = {}): string {\n const yarnCacheFolder = path.join(cwd, '.yarn', 'cache')\n try {\n return execFileSync(command, args, {\n cwd,\n encoding: 'utf8',\n env: {\n ...process.env,\n FORCE_COLOR: '0',\n NODE_NO_WARNINGS: '1',\n YARN_CACHE_FOLDER: yarnCacheFolder,\n YARN_ENABLE_GLOBAL_CACHE: '0',\n YARN_ENABLE_IMMUTABLE_INSTALLS: '0',\n YARN_NODE_LINKER: 'node-modules',\n ...environment,\n },\n })\n } catch (error) {\n if (!error || typeof error !== 'object') throw error\n const errorRecord = error as Record<string, unknown>\n const outputs = ['stdout', 'stderr'].flatMap((streamName) => {\n const output = errorRecord[streamName]\n return typeof output === 'string' || Buffer.isBuffer(output) ? [output.toString().trim()] : []\n }).filter(Boolean)\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(outputs.length > 0 ? `${message}\\n${outputs.join('\\n')}` : message)\n }\n}\n\nfunction runMercato(args: string[], cwd: string): string {\n return runCommand(process.execPath, [cliBin, ...args], cwd)\n}\n\nfunction writeFile(filePath: string, content: string): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n fs.writeFileSync(filePath, content)\n}\n\nfunction createCoreWorkspacePackage(rootDir: string, relativeDir: string): string {\n const coreDir = path.join(rootDir, relativeDir)\n writeFile(\n path.join(coreDir, 'package.json'),\n JSON.stringify(\n {\n name: '@open-mercato/core',\n version: '0.4.7',\n type: 'module',\n },\n null,\n 2,\n ),\n )\n return coreDir\n}\n\nconst commentedModulesSource = [\n '// Central place to enable modules.',\n 'export const enabledModules = [',\n ' // customer_groups stays disabled by default.',\n \" // { id: 'customer_groups', from: '@open-mercato/core' },\",\n '',\n ' /* Block comment kept by module add. */',\n ']',\n '',\n].join('\\n')\n\nfunction createMonorepoFixture(rootDir: string): string {\n writeFile(path.join(rootDir, 'yarn.lock'), '')\n writeFile(\n path.join(rootDir, 'package.json'),\n JSON.stringify(\n {\n name: 'cli-module-monorepo-fixture',\n private: true,\n workspaces: ['apps/*', 'packages/*'],\n },\n null,\n 2,\n ),\n )\n writeFile(\n path.join(rootDir, '.yarnrc.yml'),\n ['nodeLinker: node-modules', 'enableGlobalCache: false', 'cacheFolder: ./.yarn/cache', ''].join('\\n'),\n )\n createCoreWorkspacePackage(rootDir, path.join('packages', 'core'))\n\n const appDir = path.join(rootDir, 'apps', 'mercato')\n writeFile(\n path.join(appDir, 'package.json'),\n JSON.stringify(\n {\n name: '@open-mercato/app',\n version: '0.0.0',\n private: true,\n },\n null,\n 2,\n ),\n )\n writeFile(path.join(appDir, 'src', 'modules.ts'), commentedModulesSource)\n return appDir\n}\n\nfunction createStandaloneFixture(rootDir: string): string {\n writeFile(path.join(rootDir, 'yarn.lock'), '')\n writeFile(\n path.join(rootDir, '.yarnrc.yml'),\n ['nodeLinker: node-modules', 'enableGlobalCache: false', 'cacheFolder: ./.yarn/cache', ''].join('\\n'),\n )\n createCoreWorkspacePackage(rootDir, path.join('vendor', 'core'))\n writeFile(\n path.join(rootDir, 'package.json'),\n JSON.stringify(\n {\n name: 'cli-module-standalone-fixture',\n private: true,\n dependencies: {\n '@open-mercato/core': 'file:./vendor/core',\n },\n },\n null,\n 2,\n ),\n )\n writeFile(path.join(rootDir, 'src', 'modules.ts'), 'export const enabledModules = []\\n')\n return rootDir\n}\n\nfunction readFile(filePath: string): string {\n return fs.readFileSync(filePath, 'utf8')\n}\n\ntest.describe('TC-INT-007: CLI official module install and eject flows', () => {\n test('module add installs and registers a package-backed module in a monorepo app', () => {\n const rootDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mercato-cli-monorepo-'))\n\n try {\n const appDir = createMonorepoFixture(rootDir)\n runCommand(yarnBinary(), ['install'], rootDir)\n\n runMercato(\n [\n 'module',\n 'add',\n `@open-mercato/test-package@file:${fixtureModulePackage}`,\n ],\n rootDir,\n )\n\n const modulesSource = readFile(path.join(appDir, 'src', 'modules.ts'))\n const cssSource = readFile(path.join(appDir, '.mercato', 'generated', 'module-package-sources.css'))\n const appPackageJson = JSON.parse(readFile(path.join(appDir, 'package.json'))) as {\n dependencies?: Record<string, string>\n }\n\n expect(modulesSource).toBe(\n commentedModulesSource.replace(\n ' /* Block comment kept by module add. */\\n',\n \" /* Block comment kept by module add. */\\n { id: 'test_package', from: '@open-mercato/test-package' },\\n\",\n ),\n )\n expect(cssSource).toContain('node_modules/@open-mercato/test-package/src/**/*.{ts,tsx}')\n expect(appPackageJson.dependencies?.['@open-mercato/test-package']).toBeTruthy()\n } finally {\n fs.rmSync(rootDir, { recursive: true, force: true })\n }\n })\n\n test('module add --eject copies module source and omits package CSS entries', () => {\n const appDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mercato-cli-standalone-source-'))\n\n try {\n createStandaloneFixture(appDir)\n runCommand(yarnBinary(), ['install'], appDir)\n\n runMercato(\n [\n 'module',\n 'add',\n `@open-mercato/test-package@file:${fixtureModulePackage}`,\n '--eject',\n ],\n appDir,\n )\n\n const modulesSource = readFile(path.join(appDir, 'src', 'modules.ts'))\n const cssSource = readFile(path.join(appDir, '.mercato', 'generated', 'module-package-sources.css'))\n\n expect(modulesSource).toMatch(/id: 'test_package', from: '@app'/)\n expect(modulesSource).not.toContain('locator:')\n expect(modulesSource).toContain(\"packageName: '@open-mercato/test-package'\")\n expect(fs.existsSync(path.join(appDir, 'src', 'modules', 'test_package', 'index.ts'))).toBe(true)\n expect(readFile(path.join(appDir, 'src', 'modules', 'test_package', 'index.ts'))).toBe(readFile(path.join(fixtureModulePackage, 'src', 'modules', 'test_package', 'index.ts')))\n expect(cssSource).toBe('')\n } finally {\n fs.rmSync(appDir, { recursive: true, force: true })\n }\n })\n\n test('module add reports dependencies that must be enabled before registration', () => {\n const appDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mercato-cli-standalone-dependencies-'))\n\n try {\n createStandaloneFixture(appDir)\n const packageDir = path.join(appDir, 'fixture-module-package')\n fs.cpSync(fixtureModulePackage, packageDir, { recursive: true })\n writeFile(\n path.join(packageDir, 'src', 'modules', 'test_package', 'index.ts'),\n \"export const metadata = { id: 'test_package', requires: ['customers'], ejectable: true }\\n\",\n )\n runCommand(yarnBinary(), ['install'], appDir)\n\n expect(() => runMercato(\n ['module', 'add', '@open-mercato/test-package@file:./fixture-module-package'],\n appDir,\n )).toThrow(/requires module\\(s\\) that are not enabled: customers/)\n\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toBe('export const enabledModules = []\\n')\n } finally {\n fs.rmSync(appDir, { recursive: true, force: true })\n }\n })\n\n test('module add resolves canonical requirements from retained ejected origins', () => {\n const appDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mercato-cli-canonical-requires-'))\n\n try {\n createStandaloneFixture(appDir)\n const packageDir = path.join(appDir, 'fixture-module-package')\n fs.cpSync(fixtureModulePackage, packageDir, { recursive: true })\n const requirements = [\n '@pkarw/marketing_consents@preview',\n 'npm:@pkarw/marketing_consents@1.0.0',\n 'github:pkarw/marketing-consents',\n 'npm:consent-helper@next',\n 'github:pkarw/consent-tools#main',\n 'pkarw/consent-tools',\n 'https://github.com/pkarw/consent-tools.git#release',\n 'ssh://git@github.com/pkarw/consent-tools.git#main',\n 'git@github.com:pkarw/consent-tools.git',\n 'github:pkarw/installed-tools',\n 'npm:@open-mercato/core@preview',\n ]\n writeFile(\n path.join(packageDir, 'src', 'modules', 'test_package', 'index.ts'),\n `export const metadata = { id: 'test_package', requires: ${JSON.stringify(requirements)}, ejectable: true }\\n`,\n )\n const entries = [\n { id: 'marketing_consents', from: '@app', locator: 'github:pkarw/marketing-consents', packageName: '@pkarw/marketing_consents' },\n { id: 'npm_consents', from: '@app', locator: 'npm:@pkarw/marketing_consents', packageName: '@pkarw/marketing_consents' },\n { id: 'npm_core', from: '@app', locator: 'npm:@open-mercato/core', packageName: '@open-mercato/core' },\n { id: 'consent_helper', from: '@app', locator: 'npm:consent-helper' },\n { id: 'consent_tools', from: '@app', locator: 'github:pkarw/consent-tools' },\n ]\n for (const entry of entries) {\n writeFile(\n path.join(appDir, 'src', 'modules', entry.id, 'index.ts'),\n `export const metadata = { id: '${entry.id}' }\\n`,\n )\n }\n const corePackageDir = path.join(appDir, 'vendor', 'core')\n writeFile(\n path.join(corePackageDir, 'package.json'),\n JSON.stringify({ name: '@open-mercato/core', version: '0.4.7', type: 'module', repository: { type: 'git', url: 'https://github.com/pkarw/installed-tools.git' } }),\n )\n writeFile(\n path.join(corePackageDir, 'src', 'modules', 'repository_tools', 'index.ts'),\n \"export const metadata = { id: 'repository_tools' }\\n\",\n )\n writeFile(\n path.join(corePackageDir, 'dist', 'modules', 'repository_tools', 'index.js'),\n \"export const metadata = { id: 'repository_tools' }\\n\",\n )\n const enabledEntries = [...entries, { id: 'repository_tools', from: '@open-mercato/core', locator: 'github:pkarw/installed-tools' }]\n writeFile(path.join(appDir, 'src', 'modules.ts'), `export const enabledModules = ${JSON.stringify(enabledEntries)}\\n`)\n runCommand(yarnBinary(), ['install'], appDir)\n\n runMercato(['module', 'add', 'npm:@open-mercato/test-package@file:./fixture-module-package'], appDir)\n\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toContain(\"id: 'test_package'\")\n } finally {\n fs.rmSync(appDir, { recursive: true, force: true })\n }\n })\n\n test('same-name modules from different origins do not satisfy canonical requirements', () => {\n const appDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mercato-cli-wrong-origin-'))\n\n try {\n createStandaloneFixture(appDir)\n const packageDir = path.join(appDir, 'fixture-module-package')\n fs.cpSync(fixtureModulePackage, packageDir, { recursive: true })\n writeFile(\n path.join(packageDir, 'src', 'modules', 'test_package', 'index.ts'),\n \"export const metadata = { id: 'test_package', requires: ['@pkarw/marketing_consents', 'github:pkarw/consent-tools'], ejectable: true }\\n\",\n )\n const modulesSource = `export const enabledModules = [\n { id: 'marketing_consents', from: '@app', locator: 'npm:@open-mercato/marketing_consents' },\n { id: 'consent_tools', from: '@app', locator: 'github:another-owner/consent-tools' },\n ]\\n`\n writeFile(path.join(appDir, 'src', 'modules.ts'), modulesSource)\n runCommand(yarnBinary(), ['install'], appDir)\n\n expect(() => runMercato(\n ['module', 'add', '@open-mercato/test-package@file:./fixture-module-package', '--eject'],\n appDir,\n )).toThrow(/@pkarw\\/marketing_consents[\\s\\S]*github:pkarw\\/consent-tools[\\s\\S]*npx create-mercato-module install/)\n\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toBe(modulesSource)\n expect(fs.existsSync(path.join(appDir, 'src', 'modules', 'test_package'))).toBe(false)\n } finally {\n fs.rmSync(appDir, { recursive: true, force: true })\n }\n })\n\n test('module add rejects a same-ID source collision before ejecting', () => {\n const appDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mercato-cli-module-collision-'))\n\n try {\n createStandaloneFixture(appDir)\n const modulesSource = \"export const enabledModules = [{ id: 'test_package', from: '@app', locator: 'github:another-owner/test-package' }]\\n\"\n const localSource = \"export const metadata = { id: 'test_package', locator: 'github:another-owner/test-package' }\\n\"\n writeFile(path.join(appDir, 'src', 'modules.ts'), modulesSource)\n writeFile(path.join(appDir, 'src', 'modules', 'test_package', 'index.ts'), localSource)\n runCommand(yarnBinary(), ['install'], appDir)\n\n expect(() => runMercato(\n ['module', 'add', `@open-mercato/test-package@file:${fixtureModulePackage}`, '--eject'],\n appDir,\n )).toThrow(/(?=[\\s\\S]*test_package)(?=[\\s\\S]*(?:collision|already|conflict))(?=[\\s\\S]*another-owner)(?=[\\s\\S]*@open-mercato\\/test-package)/i)\n\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toBe(modulesSource)\n expect(readFile(path.join(appDir, 'src', 'modules', 'test_package', 'index.ts'))).toBe(localSource)\n } finally {\n fs.rmSync(appDir, { recursive: true, force: true })\n }\n })\n\n test('GitHub locators detect a runtime ID collision before invoking Yarn', () => {\n const appDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mercato-cli-github-collision-'))\n try {\n createStandaloneFixture(appDir)\n const modulesSource = \"export const enabledModules = [{ id: 'test_package', from: '@app', locator: 'github:other/test-package' }]\\n\"\n writeFile(path.join(appDir, 'src', 'modules.ts'), modulesSource)\n const originalManifest = readFile(path.join(appDir, 'package.json'))\n const executableDir = path.join(appDir, 'bin')\n const packageManifest = Buffer.from(JSON.stringify({ name: '@pkarw/test-package' })).toString('base64')\n const ghPath = path.join(executableDir, 'gh')\n writeFile(ghPath, `#!/usr/bin/env node\nconst endpoint = process.argv[3]\nconst sha = 'a'.repeat(40)\nconst value = endpoint === 'user' ? { login: 'pkarw' }\n : endpoint.includes('/commits/') ? { sha }\n : endpoint.includes('/contents/') ? { encoding: 'base64', content: ${JSON.stringify(packageManifest)} }\n : endpoint.includes('/git/trees/') ? { tree: [{ path: 'src/modules/test_package/index.ts' }] }\n : { default_branch: 'main' }\nprocess.stdout.write(JSON.stringify(value))\n`)\n const yarnPath = path.join(executableDir, 'yarn')\n const marker = path.join(appDir, 'yarn-invoked')\n writeFile(yarnPath, \"#!/usr/bin/env node\\nrequire('node:fs').writeFileSync(process.env.COLLISION_YARN_MARKER, 'invoked')\\nprocess.exit(1)\\n\")\n fs.chmodSync(ghPath, 0o755)\n fs.chmodSync(yarnPath, 0o755)\n for (const locator of ['github:pkarw/test-package', 'https://github.com/pkarw/test-package.git', 'git@github.com:pkarw/test-package.git', 'github:test-package']) {\n expect(() => runCommand(process.execPath, [cliBin, 'module', 'add', locator, '--allow-third-party'], appDir, {\n PATH: executableDir + path.delimiter + process.env.PATH,\n COLLISION_YARN_MARKER: marker,\n })).toThrow(/Module name collision[\\s\\S]*test_package[\\s\\S]*github:other\\/test-package[\\s\\S]*github:pkarw\\/test-package/)\n }\n expect(fs.existsSync(marker)).toBe(false)\n expect(readFile(path.join(appDir, 'package.json'))).toBe(originalManifest)\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toBe(modulesSource)\n expect(fs.existsSync(path.join(appDir, 'src', 'modules', 'test_package'))).toBe(false)\n } finally {\n fs.rmSync(appDir, { recursive: true, force: true })\n }\n })\n\n test('module enable supports package-backed and ejected flows plus both eject entrypoints', () => {\n const appDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mercato-cli-standalone-eject-'))\n\n try {\n createStandaloneFixture(appDir)\n runCommand(yarnBinary(), ['install'], appDir)\n runCommand(\n yarnBinary(),\n ['add', `@open-mercato/test-package@file:${fixtureModulePackage}`],\n appDir,\n )\n\n runMercato(['module', 'enable', '@open-mercato/test-package'], appDir)\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toContain(\n \"id: 'test_package', from: '@open-mercato/test-package'\",\n )\n\n writeFile(path.join(appDir, 'src', 'modules.ts'), 'export const enabledModules = []\\n')\n fs.rmSync(path.join(appDir, 'src', 'modules', 'test_package'), { recursive: true, force: true })\n runMercato(['module', 'enable', '@open-mercato/test-package', '--eject'], appDir)\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toContain(\"id: 'test_package', from: '@app'\")\n expect(fs.existsSync(path.join(appDir, 'src', 'modules', 'test_package', 'index.ts'))).toBe(true)\n expect(readFile(path.join(appDir, '.mercato', 'generated', 'module-package-sources.css'))).toBe('')\n\n writeFile(path.join(appDir, 'src', 'modules.ts'), \"export const enabledModules = [{ id: 'test_package', from: '@open-mercato/test-package' }]\\n\")\n fs.rmSync(path.join(appDir, 'src', 'modules', 'test_package'), { recursive: true, force: true })\n runMercato(['module', 'eject', 'test_package'], appDir)\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toContain(\"packageName: '@open-mercato/test-package'\")\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).not.toContain(\"locator: 'npm:@open-mercato/test-package'\")\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toContain(\"id: 'test_package', from: '@app'\")\n\n writeFile(path.join(appDir, 'src', 'modules.ts'), \"export const enabledModules = [{ id: 'test_package', from: '@open-mercato/test-package' }]\\n\")\n fs.rmSync(path.join(appDir, 'src', 'modules', 'test_package'), { recursive: true, force: true })\n runMercato(['eject', 'test_package'], appDir)\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toContain(\"packageName: '@open-mercato/test-package'\")\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).not.toContain(\"locator: 'npm:@open-mercato/test-package'\")\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toContain(\"id: 'test_package', from: '@app'\")\n } finally {\n fs.rmSync(appDir, { recursive: true, force: true })\n }\n })\n\n test('module add and module enable exit 0 without changes when the module is already enabled', () => {\n const appDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mercato-cli-standalone-rerun-'))\n\n try {\n createStandaloneFixture(appDir)\n runCommand(yarnBinary(), ['install'], appDir)\n const packageSpec = `@open-mercato/test-package@file:${fixtureModulePackage}`\n\n runMercato(['module', 'add', packageSpec], appDir)\n const modulesSource = readFile(path.join(appDir, 'src', 'modules.ts'))\n\n const addOutput = runMercato(['module', 'add', packageSpec], appDir)\n const enableOutput = runMercato(['module', 'enable', '@open-mercato/test-package'], appDir)\n\n expect(addOutput).toContain('is already enabled in modules.ts. Nothing to change.')\n expect(enableOutput).toContain('is already enabled in modules.ts. Nothing to change.')\n expect(readFile(path.join(appDir, 'src', 'modules.ts'))).toBe(modulesSource)\n } finally {\n fs.rmSync(appDir, { recursive: true, force: true })\n }\n })\n})\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|