@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.
Files changed (182) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/build.mjs +1 -0
  3. package/dist/agentic/guides/module-facts.json +162 -162
  4. package/dist/agentic/guides/module-facts.v2.json +162 -162
  5. package/dist/agentic/guides/module-tool.md +21 -0
  6. package/dist/agentic/guides/modules/agent_orchestrator/index.md +1 -1
  7. package/dist/agentic/guides/modules/ai_assistant/index.md +1 -1
  8. package/dist/agentic/guides/modules/api_docs/index.md +1 -1
  9. package/dist/agentic/guides/modules/api_keys/index.md +1 -1
  10. package/dist/agentic/guides/modules/attachments/index.md +1 -1
  11. package/dist/agentic/guides/modules/audit_logs/index.md +1 -1
  12. package/dist/agentic/guides/modules/auth/index.md +1 -1
  13. package/dist/agentic/guides/modules/availability/index.md +1 -1
  14. package/dist/agentic/guides/modules/business_rules/index.md +1 -1
  15. package/dist/agentic/guides/modules/carrier_inpost/index.md +1 -1
  16. package/dist/agentic/guides/modules/cart/index.md +1 -1
  17. package/dist/agentic/guides/modules/catalog/index.md +1 -1
  18. package/dist/agentic/guides/modules/channel_apns/index.md +1 -1
  19. package/dist/agentic/guides/modules/channel_discord/index.md +1 -1
  20. package/dist/agentic/guides/modules/channel_expo/index.md +1 -1
  21. package/dist/agentic/guides/modules/channel_fcm/index.md +1 -1
  22. package/dist/agentic/guides/modules/channel_gmail/index.md +1 -1
  23. package/dist/agentic/guides/modules/channel_imap/index.md +1 -1
  24. package/dist/agentic/guides/modules/channel_resend/index.md +1 -1
  25. package/dist/agentic/guides/modules/channel_ses/index.md +1 -1
  26. package/dist/agentic/guides/modules/channel_smtp/index.md +1 -1
  27. package/dist/agentic/guides/modules/checkout/index.md +1 -1
  28. package/dist/agentic/guides/modules/communication_channels/index.md +1 -1
  29. package/dist/agentic/guides/modules/configs/index.md +1 -1
  30. package/dist/agentic/guides/modules/content/index.md +1 -1
  31. package/dist/agentic/guides/modules/currencies/index.md +1 -1
  32. package/dist/agentic/guides/modules/customer_accounts/index.md +1 -1
  33. package/dist/agentic/guides/modules/customer_groups/index.md +1 -1
  34. package/dist/agentic/guides/modules/customers/index.md +1 -1
  35. package/dist/agentic/guides/modules/dashboards/index.md +1 -1
  36. package/dist/agentic/guides/modules/data_sync/index.md +1 -1
  37. package/dist/agentic/guides/modules/design_system/index.md +1 -1
  38. package/dist/agentic/guides/modules/devices/index.md +1 -1
  39. package/dist/agentic/guides/modules/dictionaries/index.md +1 -1
  40. package/dist/agentic/guides/modules/directory/index.md +1 -1
  41. package/dist/agentic/guides/modules/documents/index.md +1 -1
  42. package/dist/agentic/guides/modules/ecommerce/index.md +1 -1
  43. package/dist/agentic/guides/modules/entities/index.md +1 -1
  44. package/dist/agentic/guides/modules/eudr/index.md +1 -1
  45. package/dist/agentic/guides/modules/events/index.md +1 -1
  46. package/dist/agentic/guides/modules/feature_toggles/index.md +1 -1
  47. package/dist/agentic/guides/modules/forms/index.md +1 -1
  48. package/dist/agentic/guides/modules/gateway_autopay/index.md +1 -1
  49. package/dist/agentic/guides/modules/gateway_stripe/index.md +1 -1
  50. package/dist/agentic/guides/modules/gateway_tpay/index.md +1 -1
  51. package/dist/agentic/guides/modules/generators/index.md +1 -1
  52. package/dist/agentic/guides/modules/inbox_ops/index.md +1 -1
  53. package/dist/agentic/guides/modules/integrations/index.md +1 -1
  54. package/dist/agentic/guides/modules/messages/index.md +1 -1
  55. package/dist/agentic/guides/modules/notifications/index.md +1 -1
  56. package/dist/agentic/guides/modules/onboarding/index.md +1 -1
  57. package/dist/agentic/guides/modules/payment_gateways/index.md +1 -1
  58. package/dist/agentic/guides/modules/perspectives/index.md +1 -1
  59. package/dist/agentic/guides/modules/phone_calls/index.md +1 -1
  60. package/dist/agentic/guides/modules/planner/index.md +1 -1
  61. package/dist/agentic/guides/modules/portal/index.md +1 -1
  62. package/dist/agentic/guides/modules/progress/index.md +1 -1
  63. package/dist/agentic/guides/modules/promotions/index.md +1 -1
  64. package/dist/agentic/guides/modules/push_notifications/index.md +1 -1
  65. package/dist/agentic/guides/modules/query_index/index.md +1 -1
  66. package/dist/agentic/guides/modules/record_locks/index.md +1 -1
  67. package/dist/agentic/guides/modules/resources/index.md +1 -1
  68. package/dist/agentic/guides/modules/sales/index.md +1 -1
  69. package/dist/agentic/guides/modules/scheduler/index.md +1 -1
  70. package/dist/agentic/guides/modules/search/index.md +1 -1
  71. package/dist/agentic/guides/modules/security/index.md +1 -1
  72. package/dist/agentic/guides/modules/seeds/index.md +1 -1
  73. package/dist/agentic/guides/modules/shipping_carriers/index.md +1 -1
  74. package/dist/agentic/guides/modules/sso/index.md +1 -1
  75. package/dist/agentic/guides/modules/staff/index.md +1 -1
  76. package/dist/agentic/guides/modules/storage_s3/index.md +1 -1
  77. package/dist/agentic/guides/modules/sync_akeneo/index.md +1 -1
  78. package/dist/agentic/guides/modules/sync_excel/index.md +1 -1
  79. package/dist/agentic/guides/modules/system_status_overlays/index.md +1 -1
  80. package/dist/agentic/guides/modules/telemetry/index.md +1 -1
  81. package/dist/agentic/guides/modules/tillio/index.md +1 -1
  82. package/dist/agentic/guides/modules/translations/index.md +1 -1
  83. package/dist/agentic/guides/modules/warranty_claims/index.md +1 -1
  84. package/dist/agentic/guides/modules/webhooks/index.md +1 -1
  85. package/dist/agentic/guides/modules/wms/index.md +1 -1
  86. package/dist/agentic/guides/modules/workflows/index.md +1 -1
  87. package/dist/agentic/guides/reference-module-facts.json +1 -1
  88. package/dist/agentic/guides/upstream/BACKWARD_COMPATIBILITY.md +4 -0
  89. package/dist/agentic/guides/upstream/manifest.json +2 -2
  90. package/dist/agentic/shared/ai/harness/cases.json +23 -9
  91. package/dist/agentic/shared/ai/harness/source-link-inventory.json +90 -4
  92. package/dist/i18n/de.json +4 -0
  93. package/dist/i18n/en.json +4 -0
  94. package/dist/i18n/es.json +4 -0
  95. package/dist/i18n/ko.json +4 -0
  96. package/dist/i18n/pl.json +4 -0
  97. package/dist/lib/__fixtures__/module-search/built-in.json +235 -0
  98. package/dist/lib/__fixtures__/module-search/catalog-parity.json +4076 -0
  99. package/dist/lib/__fixtures__/module-search/modules-index.json +1980 -0
  100. package/dist/lib/__fixtures__/official-module-package/package.json +33 -0
  101. package/dist/lib/__integration__/TC-INT-007.spec.js +207 -19
  102. package/dist/lib/__integration__/TC-INT-007.spec.js.map +2 -2
  103. package/dist/lib/__integration__/TC-INT-009.spec.js +267 -0
  104. package/dist/lib/__integration__/TC-INT-009.spec.js.map +7 -0
  105. package/dist/lib/eject.js +25 -9
  106. package/dist/lib/eject.js.map +2 -2
  107. package/dist/lib/generators/entity-ids.js +2 -0
  108. package/dist/lib/generators/entity-ids.js.map +2 -2
  109. package/dist/lib/generators/module-di.js +2 -0
  110. package/dist/lib/generators/module-di.js.map +2 -2
  111. package/dist/lib/generators/module-entities.js +2 -0
  112. package/dist/lib/generators/module-entities.js.map +2 -2
  113. package/dist/lib/generators/module-package-sources.js +6 -4
  114. package/dist/lib/generators/module-package-sources.js.map +2 -2
  115. package/dist/lib/generators/module-registry.js +32 -86
  116. package/dist/lib/generators/module-registry.js.map +2 -2
  117. package/dist/lib/generators/openapi.js +2 -0
  118. package/dist/lib/generators/openapi.js.map +2 -2
  119. package/dist/lib/generators/source-exports.js +73 -0
  120. package/dist/lib/generators/source-exports.js.map +7 -0
  121. package/dist/lib/init-secrets.js +33 -1
  122. package/dist/lib/init-secrets.js.map +2 -2
  123. package/dist/lib/init-summary.js +44 -0
  124. package/dist/lib/init-summary.js.map +7 -0
  125. package/dist/lib/module-github.js +98 -0
  126. package/dist/lib/module-github.js.map +7 -0
  127. package/dist/lib/module-identity.js +131 -0
  128. package/dist/lib/module-identity.js.map +7 -0
  129. package/dist/lib/module-inspection.js +124 -0
  130. package/dist/lib/module-inspection.js.map +7 -0
  131. package/dist/lib/module-install.js +150 -21
  132. package/dist/lib/module-install.js.map +3 -3
  133. package/dist/lib/module-package.js +205 -15
  134. package/dist/lib/module-package.js.map +2 -2
  135. package/dist/lib/modules-config.js +69 -30
  136. package/dist/lib/modules-config.js.map +2 -2
  137. package/dist/lib/resolver.js +33 -34
  138. package/dist/lib/resolver.js.map +2 -2
  139. package/dist/mercato.js +17 -37
  140. package/dist/mercato.js.map +2 -2
  141. package/package.json +7 -7
  142. package/src/__tests__/mercato.test.ts +71 -4
  143. package/src/i18n/de.json +4 -0
  144. package/src/i18n/en.json +4 -0
  145. package/src/i18n/es.json +4 -0
  146. package/src/i18n/ko.json +4 -0
  147. package/src/i18n/pl.json +4 -0
  148. package/src/lib/__fixtures__/official-module-package/dist/modules/test_package/widgets/injection/test/widget.js +1 -0
  149. package/src/lib/__integration__/TC-INT-007.spec.ts +219 -19
  150. package/src/lib/__integration__/TC-INT-009.spec.ts +279 -0
  151. package/src/lib/__tests__/eject.test.ts +98 -4
  152. package/src/lib/__tests__/init-secrets.test.ts +85 -1
  153. package/src/lib/__tests__/init-summary.test.ts +50 -0
  154. package/src/lib/__tests__/module-github.test.ts +108 -0
  155. package/src/lib/__tests__/module-identity.test.ts +144 -0
  156. package/src/lib/__tests__/module-inspection.test.ts +195 -0
  157. package/src/lib/__tests__/module-install.test.ts +399 -10
  158. package/src/lib/__tests__/module-package.test.ts +154 -0
  159. package/src/lib/__tests__/modules-config.test.ts +55 -0
  160. package/src/lib/__tests__/resolver.packages.test.ts +29 -0
  161. package/src/lib/eject.ts +28 -10
  162. package/src/lib/generators/__tests__/module-id-collisions.test.ts +146 -0
  163. package/src/lib/generators/__tests__/module-package-sources.test.ts +19 -2
  164. package/src/lib/generators/__tests__/module-requirements.test.ts +56 -0
  165. package/src/lib/generators/entity-ids.ts +2 -0
  166. package/src/lib/generators/module-di.ts +2 -0
  167. package/src/lib/generators/module-entities.ts +2 -0
  168. package/src/lib/generators/module-package-sources.ts +7 -5
  169. package/src/lib/generators/module-registry.ts +33 -115
  170. package/src/lib/generators/openapi.ts +3 -0
  171. package/src/lib/generators/source-exports.ts +93 -0
  172. package/src/lib/init-secrets.ts +37 -0
  173. package/src/lib/init-summary.ts +54 -0
  174. package/src/lib/module-github.ts +109 -0
  175. package/src/lib/module-identity.ts +145 -0
  176. package/src/lib/module-inspection.ts +133 -0
  177. package/src/lib/module-install.ts +170 -22
  178. package/src/lib/module-package.ts +243 -16
  179. package/src/lib/modules-config.ts +80 -32
  180. package/src/lib/resolver.ts +35 -39
  181. package/src/mercato.ts +18 -44
  182. 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
- return execFileSync(command, args, {
25
- cwd,
26
- encoding: "utf8",
27
- env: {
28
- ...process.env,
29
- FORCE_COLOR: "0",
30
- NODE_NO_WARNINGS: "1",
31
- YARN_CACHE_FOLDER: yarnCacheFolder,
32
- YARN_ENABLE_GLOBAL_CACHE: "0",
33
- YARN_ENABLE_IMMUTABLE_INSTALLS: "0",
34
- YARN_NODE_LINKER: "node-modules"
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).toContain("{ id: 'test_package', from: '@app' }");
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
- "{ id: 'test_package', from: '@open-mercato/test-package' }"
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("{ id: 'test_package', from: '@app' }");
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("{ id: 'test_package', from: '@app' }");
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("{ id: 'test_package', from: '@app' }");
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": "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",
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": "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,KAAa,cAAiC,CAAC,GAAW;AAC7G,QAAM,kBAAkB,KAAK,KAAK,KAAK,SAAS,OAAO;AACvD,MAAI;AACF,WAAO,aAAa,SAAS,MAAM;AAAA,MACjC;AAAA,MACA,UAAU;AAAA,MACV,KAAK;AAAA,QACH,GAAG,QAAQ;AAAA,QACX,aAAa;AAAA,QACb,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,0BAA0B;AAAA,QAC1B,gCAAgC;AAAA,QAChC,kBAAkB;AAAA,QAClB,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU,OAAM;AAC/C,UAAM,cAAc;AACpB,UAAM,UAAU,CAAC,UAAU,QAAQ,EAAE,QAAQ,CAAC,eAAe;AAC3D,YAAM,SAAS,YAAY,UAAU;AACrC,aAAO,OAAO,WAAW,YAAY,OAAO,SAAS,MAAM,IAAI,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC;AAAA,IAC/F,CAAC,EAAE,OAAO,OAAO;AACjB,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,IAAI,MAAM,QAAQ,SAAS,IAAI,GAAG,OAAO;AAAA,EAAK,QAAQ,KAAK,IAAI,CAAC,KAAK,OAAO;AAAA,EACpF;AACF;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,YAAU,KAAK,KAAK,SAAS,WAAW,GAAG,EAAE;AAC7C;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,YAAU,KAAK,KAAK,SAAS,WAAW,GAAG,EAAE;AAC7C;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,QAAQ,kCAAkC;AAChE,aAAO,aAAa,EAAE,IAAI,UAAU,UAAU;AAC9C,aAAO,aAAa,EAAE,UAAU,2CAA2C;AAC3E,aAAO,GAAG,WAAW,KAAK,KAAK,QAAQ,OAAO,WAAW,gBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI;AAChG,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,WAAW,gBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,SAAS,KAAK,KAAK,sBAAsB,OAAO,WAAW,gBAAgB,UAAU,CAAC,CAAC;AAC9K,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,4EAA4E,MAAM;AACrF,UAAM,SAAS,GAAG,YAAY,KAAK,KAAK,GAAG,OAAO,GAAG,sCAAsC,CAAC;AAE5F,QAAI;AACF,8BAAwB,MAAM;AAC9B,YAAM,aAAa,KAAK,KAAK,QAAQ,wBAAwB;AAC7D,SAAG,OAAO,sBAAsB,YAAY,EAAE,WAAW,KAAK,CAAC;AAC/D;AAAA,QACE,KAAK,KAAK,YAAY,OAAO,WAAW,gBAAgB,UAAU;AAAA,QAClE;AAAA,MACF;AACA,iBAAW,WAAW,GAAG,CAAC,SAAS,GAAG,MAAM;AAE5C,aAAO,MAAM;AAAA,QACX,CAAC,UAAU,OAAO,0DAA0D;AAAA,QAC5E;AAAA,MACF,CAAC,EAAE,QAAQ,sDAAsD;AAEjE,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,KAAK,oCAAoC;AAAA,IACpG,UAAE;AACA,SAAG,OAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACpD;AAAA,EACF,CAAC;AAED,OAAK,4EAA4E,MAAM;AACrF,UAAM,SAAS,GAAG,YAAY,KAAK,KAAK,GAAG,OAAO,GAAG,iCAAiC,CAAC;AAEvF,QAAI;AACF,8BAAwB,MAAM;AAC9B,YAAM,aAAa,KAAK,KAAK,QAAQ,wBAAwB;AAC7D,SAAG,OAAO,sBAAsB,YAAY,EAAE,WAAW,KAAK,CAAC;AAC/D,YAAM,eAAe;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA;AAAA,QACE,KAAK,KAAK,YAAY,OAAO,WAAW,gBAAgB,UAAU;AAAA,QAClE,2DAA2D,KAAK,UAAU,YAAY,CAAC;AAAA;AAAA,MACzF;AACA,YAAM,UAAU;AAAA,QACd,EAAE,IAAI,sBAAsB,MAAM,QAAQ,SAAS,mCAAmC,aAAa,4BAA4B;AAAA,QAC/H,EAAE,IAAI,gBAAgB,MAAM,QAAQ,SAAS,iCAAiC,aAAa,4BAA4B;AAAA,QACvH,EAAE,IAAI,YAAY,MAAM,QAAQ,SAAS,0BAA0B,aAAa,qBAAqB;AAAA,QACrG,EAAE,IAAI,kBAAkB,MAAM,QAAQ,SAAS,qBAAqB;AAAA,QACpE,EAAE,IAAI,iBAAiB,MAAM,QAAQ,SAAS,6BAA6B;AAAA,MAC7E;AACA,iBAAW,SAAS,SAAS;AAC3B;AAAA,UACE,KAAK,KAAK,QAAQ,OAAO,WAAW,MAAM,IAAI,UAAU;AAAA,UACxD,kCAAkC,MAAM,EAAE;AAAA;AAAA,QAC5C;AAAA,MACF;AACA,YAAM,iBAAiB,KAAK,KAAK,QAAQ,UAAU,MAAM;AACzD;AAAA,QACE,KAAK,KAAK,gBAAgB,cAAc;AAAA,QACxC,KAAK,UAAU,EAAE,MAAM,sBAAsB,SAAS,SAAS,MAAM,UAAU,YAAY,EAAE,MAAM,OAAO,KAAK,+CAA+C,EAAE,CAAC;AAAA,MACnK;AACA;AAAA,QACE,KAAK,KAAK,gBAAgB,OAAO,WAAW,oBAAoB,UAAU;AAAA,QAC1E;AAAA,MACF;AACA;AAAA,QACE,KAAK,KAAK,gBAAgB,QAAQ,WAAW,oBAAoB,UAAU;AAAA,QAC3E;AAAA,MACF;AACA,YAAM,iBAAiB,CAAC,GAAG,SAAS,EAAE,IAAI,oBAAoB,MAAM,sBAAsB,SAAS,+BAA+B,CAAC;AACnI,gBAAU,KAAK,KAAK,QAAQ,OAAO,YAAY,GAAG,iCAAiC,KAAK,UAAU,cAAc,CAAC;AAAA,CAAI;AACrH,iBAAW,WAAW,GAAG,CAAC,SAAS,GAAG,MAAM;AAE5C,iBAAW,CAAC,UAAU,OAAO,8DAA8D,GAAG,MAAM;AAEpG,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,UAAU,oBAAoB;AAAA,IACzF,UAAE;AACA,SAAG,OAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACpD;AAAA,EACF,CAAC;AAED,OAAK,kFAAkF,MAAM;AAC3F,UAAM,SAAS,GAAG,YAAY,KAAK,KAAK,GAAG,OAAO,GAAG,2BAA2B,CAAC;AAEjF,QAAI;AACF,8BAAwB,MAAM;AAC9B,YAAM,aAAa,KAAK,KAAK,QAAQ,wBAAwB;AAC7D,SAAG,OAAO,sBAAsB,YAAY,EAAE,WAAW,KAAK,CAAC;AAC/D;AAAA,QACE,KAAK,KAAK,YAAY,OAAO,WAAW,gBAAgB,UAAU;AAAA,QAClE;AAAA,MACF;AACA,YAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAItB,gBAAU,KAAK,KAAK,QAAQ,OAAO,YAAY,GAAG,aAAa;AAC/D,iBAAW,WAAW,GAAG,CAAC,SAAS,GAAG,MAAM;AAE5C,aAAO,MAAM;AAAA,QACX,CAAC,UAAU,OAAO,4DAA4D,SAAS;AAAA,QACvF;AAAA,MACF,CAAC,EAAE,QAAQ,sGAAsG;AAEjH,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,KAAK,aAAa;AAC3E,aAAO,GAAG,WAAW,KAAK,KAAK,QAAQ,OAAO,WAAW,cAAc,CAAC,CAAC,EAAE,KAAK,KAAK;AAAA,IACvF,UAAE;AACA,SAAG,OAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACpD;AAAA,EACF,CAAC;AAED,OAAK,iEAAiE,MAAM;AAC1E,UAAM,SAAS,GAAG,YAAY,KAAK,KAAK,GAAG,OAAO,GAAG,+BAA+B,CAAC;AAErF,QAAI;AACF,8BAAwB,MAAM;AAC9B,YAAM,gBAAgB;AACtB,YAAM,cAAc;AACpB,gBAAU,KAAK,KAAK,QAAQ,OAAO,YAAY,GAAG,aAAa;AAC/D,gBAAU,KAAK,KAAK,QAAQ,OAAO,WAAW,gBAAgB,UAAU,GAAG,WAAW;AACtF,iBAAW,WAAW,GAAG,CAAC,SAAS,GAAG,MAAM;AAE5C,aAAO,MAAM;AAAA,QACX,CAAC,UAAU,OAAO,mCAAmC,oBAAoB,IAAI,SAAS;AAAA,QACtF;AAAA,MACF,CAAC,EAAE,QAAQ,iIAAiI;AAE5I,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,KAAK,aAAa;AAC3E,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,WAAW,gBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,WAAW;AAAA,IACpG,UAAE;AACA,SAAG,OAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACpD;AAAA,EACF,CAAC;AAED,OAAK,sEAAsE,MAAM;AAC/E,UAAM,SAAS,GAAG,YAAY,KAAK,KAAK,GAAG,OAAO,GAAG,+BAA+B,CAAC;AACrF,QAAI;AACF,8BAAwB,MAAM;AAC9B,YAAM,gBAAgB;AACtB,gBAAU,KAAK,KAAK,QAAQ,OAAO,YAAY,GAAG,aAAa;AAC/D,YAAM,mBAAmB,SAAS,KAAK,KAAK,QAAQ,cAAc,CAAC;AACnE,YAAM,gBAAgB,KAAK,KAAK,QAAQ,KAAK;AAC7C,YAAM,kBAAkB,OAAO,KAAK,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC,CAAC,EAAE,SAAS,QAAQ;AACtG,YAAM,SAAS,KAAK,KAAK,eAAe,IAAI;AAC5C,gBAAU,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,uEAK+C,KAAK,UAAU,eAAe,CAAC;AAAA;AAAA;AAAA;AAAA,CAIrG;AACK,YAAM,WAAW,KAAK,KAAK,eAAe,MAAM;AAChD,YAAM,SAAS,KAAK,KAAK,QAAQ,cAAc;AAC/C,gBAAU,UAAU,wHAAwH;AAC5I,SAAG,UAAU,QAAQ,GAAK;AAC1B,SAAG,UAAU,UAAU,GAAK;AAC5B,iBAAW,WAAW,CAAC,6BAA6B,6CAA6C,yCAAyC,qBAAqB,GAAG;AAChK,eAAO,MAAM,WAAW,QAAQ,UAAU,CAAC,QAAQ,UAAU,OAAO,SAAS,qBAAqB,GAAG,QAAQ;AAAA,UAC3G,MAAM,gBAAgB,KAAK,YAAY,QAAQ,IAAI;AAAA,UACnD,uBAAuB;AAAA,QACzB,CAAC,CAAC,EAAE,QAAQ,4GAA4G;AAAA,MAC1H;AACA,aAAO,GAAG,WAAW,MAAM,CAAC,EAAE,KAAK,KAAK;AACxC,aAAO,SAAS,KAAK,KAAK,QAAQ,cAAc,CAAC,CAAC,EAAE,KAAK,gBAAgB;AACzE,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,KAAK,aAAa;AAC3E,aAAO,GAAG,WAAW,KAAK,KAAK,QAAQ,OAAO,WAAW,cAAc,CAAC,CAAC,EAAE,KAAK,KAAK;AAAA,IACvF,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,kCAAkC;AACrG,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,2CAA2C;AAC9G,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,IAAI,UAAU,2CAA2C;AAClH,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,UAAU,kCAAkC;AAErG,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,2CAA2C;AAC9G,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,IAAI,UAAU,2CAA2C;AAClH,aAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,UAAU,kCAAkC;AAAA,IACvG,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;",
6
6
  "names": []
7
7
  }