@open-mercato/cli 0.10.1-develop.7983.1.fd91207efe → 0.10.1-develop.7994.1.c9f31972aa

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 (162) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/agentic/guides/module-facts.json +162 -162
  3. package/dist/agentic/guides/module-facts.v2.json +162 -162
  4. package/dist/agentic/guides/module-tool.md +21 -0
  5. package/dist/agentic/guides/modules/agent_orchestrator/index.md +1 -1
  6. package/dist/agentic/guides/modules/ai_assistant/index.md +1 -1
  7. package/dist/agentic/guides/modules/api_docs/index.md +1 -1
  8. package/dist/agentic/guides/modules/api_keys/index.md +1 -1
  9. package/dist/agentic/guides/modules/attachments/index.md +1 -1
  10. package/dist/agentic/guides/modules/audit_logs/index.md +1 -1
  11. package/dist/agentic/guides/modules/auth/index.md +1 -1
  12. package/dist/agentic/guides/modules/availability/index.md +1 -1
  13. package/dist/agentic/guides/modules/business_rules/index.md +1 -1
  14. package/dist/agentic/guides/modules/carrier_inpost/index.md +1 -1
  15. package/dist/agentic/guides/modules/cart/index.md +1 -1
  16. package/dist/agentic/guides/modules/catalog/index.md +1 -1
  17. package/dist/agentic/guides/modules/channel_apns/index.md +1 -1
  18. package/dist/agentic/guides/modules/channel_discord/index.md +1 -1
  19. package/dist/agentic/guides/modules/channel_expo/index.md +1 -1
  20. package/dist/agentic/guides/modules/channel_fcm/index.md +1 -1
  21. package/dist/agentic/guides/modules/channel_gmail/index.md +1 -1
  22. package/dist/agentic/guides/modules/channel_imap/index.md +1 -1
  23. package/dist/agentic/guides/modules/channel_resend/index.md +1 -1
  24. package/dist/agentic/guides/modules/channel_ses/index.md +1 -1
  25. package/dist/agentic/guides/modules/channel_smtp/index.md +1 -1
  26. package/dist/agentic/guides/modules/checkout/index.md +1 -1
  27. package/dist/agentic/guides/modules/communication_channels/index.md +1 -1
  28. package/dist/agentic/guides/modules/configs/index.md +1 -1
  29. package/dist/agentic/guides/modules/content/index.md +1 -1
  30. package/dist/agentic/guides/modules/currencies/index.md +1 -1
  31. package/dist/agentic/guides/modules/customer_accounts/index.md +1 -1
  32. package/dist/agentic/guides/modules/customer_groups/index.md +1 -1
  33. package/dist/agentic/guides/modules/customers/index.md +1 -1
  34. package/dist/agentic/guides/modules/dashboards/index.md +1 -1
  35. package/dist/agentic/guides/modules/data_sync/index.md +1 -1
  36. package/dist/agentic/guides/modules/design_system/index.md +1 -1
  37. package/dist/agentic/guides/modules/devices/index.md +1 -1
  38. package/dist/agentic/guides/modules/dictionaries/index.md +1 -1
  39. package/dist/agentic/guides/modules/directory/index.md +1 -1
  40. package/dist/agentic/guides/modules/documents/index.md +1 -1
  41. package/dist/agentic/guides/modules/ecommerce/index.md +1 -1
  42. package/dist/agentic/guides/modules/entities/index.md +1 -1
  43. package/dist/agentic/guides/modules/eudr/index.md +1 -1
  44. package/dist/agentic/guides/modules/events/index.md +1 -1
  45. package/dist/agentic/guides/modules/feature_toggles/index.md +1 -1
  46. package/dist/agentic/guides/modules/forms/index.md +1 -1
  47. package/dist/agentic/guides/modules/gateway_autopay/index.md +1 -1
  48. package/dist/agentic/guides/modules/gateway_stripe/index.md +1 -1
  49. package/dist/agentic/guides/modules/gateway_tpay/index.md +1 -1
  50. package/dist/agentic/guides/modules/generators/index.md +1 -1
  51. package/dist/agentic/guides/modules/inbox_ops/index.md +1 -1
  52. package/dist/agentic/guides/modules/integrations/index.md +1 -1
  53. package/dist/agentic/guides/modules/messages/index.md +1 -1
  54. package/dist/agentic/guides/modules/notifications/index.md +1 -1
  55. package/dist/agentic/guides/modules/onboarding/index.md +1 -1
  56. package/dist/agentic/guides/modules/payment_gateways/index.md +1 -1
  57. package/dist/agentic/guides/modules/perspectives/index.md +1 -1
  58. package/dist/agentic/guides/modules/phone_calls/index.md +1 -1
  59. package/dist/agentic/guides/modules/planner/index.md +1 -1
  60. package/dist/agentic/guides/modules/portal/index.md +1 -1
  61. package/dist/agentic/guides/modules/progress/index.md +1 -1
  62. package/dist/agentic/guides/modules/promotions/index.md +1 -1
  63. package/dist/agentic/guides/modules/push_notifications/index.md +1 -1
  64. package/dist/agentic/guides/modules/query_index/index.md +1 -1
  65. package/dist/agentic/guides/modules/record_locks/index.md +1 -1
  66. package/dist/agentic/guides/modules/resources/index.md +1 -1
  67. package/dist/agentic/guides/modules/sales/index.md +1 -1
  68. package/dist/agentic/guides/modules/scheduler/index.md +1 -1
  69. package/dist/agentic/guides/modules/search/index.md +1 -1
  70. package/dist/agentic/guides/modules/security/index.md +1 -1
  71. package/dist/agentic/guides/modules/seeds/index.md +1 -1
  72. package/dist/agentic/guides/modules/shipping_carriers/index.md +1 -1
  73. package/dist/agentic/guides/modules/sso/index.md +1 -1
  74. package/dist/agentic/guides/modules/staff/index.md +1 -1
  75. package/dist/agentic/guides/modules/storage_s3/index.md +1 -1
  76. package/dist/agentic/guides/modules/sync_akeneo/index.md +1 -1
  77. package/dist/agentic/guides/modules/sync_excel/index.md +1 -1
  78. package/dist/agentic/guides/modules/system_status_overlays/index.md +1 -1
  79. package/dist/agentic/guides/modules/telemetry/index.md +1 -1
  80. package/dist/agentic/guides/modules/tillio/index.md +1 -1
  81. package/dist/agentic/guides/modules/translations/index.md +1 -1
  82. package/dist/agentic/guides/modules/warranty_claims/index.md +1 -1
  83. package/dist/agentic/guides/modules/webhooks/index.md +1 -1
  84. package/dist/agentic/guides/modules/wms/index.md +1 -1
  85. package/dist/agentic/guides/modules/workflows/index.md +1 -1
  86. package/dist/agentic/guides/reference-module-facts.json +1 -1
  87. package/dist/agentic/guides/upstream/manifest.json +1 -1
  88. package/dist/agentic/shared/ai/harness/cases.json +23 -9
  89. package/dist/agentic/shared/ai/harness/source-link-inventory.json +90 -4
  90. package/dist/lib/__integration__/TC-INT-007.spec.js +207 -19
  91. package/dist/lib/__integration__/TC-INT-007.spec.js.map +2 -2
  92. package/dist/lib/__integration__/TC-INT-009.spec.js +267 -0
  93. package/dist/lib/__integration__/TC-INT-009.spec.js.map +7 -0
  94. package/dist/lib/eject.js +25 -9
  95. package/dist/lib/eject.js.map +2 -2
  96. package/dist/lib/generators/entity-ids.js +2 -0
  97. package/dist/lib/generators/entity-ids.js.map +2 -2
  98. package/dist/lib/generators/module-di.js +2 -0
  99. package/dist/lib/generators/module-di.js.map +2 -2
  100. package/dist/lib/generators/module-entities.js +2 -0
  101. package/dist/lib/generators/module-entities.js.map +2 -2
  102. package/dist/lib/generators/module-package-sources.js +6 -4
  103. package/dist/lib/generators/module-package-sources.js.map +2 -2
  104. package/dist/lib/generators/module-registry.js +32 -86
  105. package/dist/lib/generators/module-registry.js.map +2 -2
  106. package/dist/lib/generators/openapi.js +2 -0
  107. package/dist/lib/generators/openapi.js.map +2 -2
  108. package/dist/lib/generators/source-exports.js +73 -0
  109. package/dist/lib/generators/source-exports.js.map +7 -0
  110. package/dist/lib/init-summary.js +44 -0
  111. package/dist/lib/init-summary.js.map +7 -0
  112. package/dist/lib/module-github.js +98 -0
  113. package/dist/lib/module-github.js.map +7 -0
  114. package/dist/lib/module-identity.js +131 -0
  115. package/dist/lib/module-identity.js.map +7 -0
  116. package/dist/lib/module-inspection.js +124 -0
  117. package/dist/lib/module-inspection.js.map +7 -0
  118. package/dist/lib/module-install.js +150 -21
  119. package/dist/lib/module-install.js.map +3 -3
  120. package/dist/lib/module-package.js +205 -15
  121. package/dist/lib/module-package.js.map +2 -2
  122. package/dist/lib/modules-config.js +69 -30
  123. package/dist/lib/modules-config.js.map +2 -2
  124. package/dist/lib/resolver.js +33 -34
  125. package/dist/lib/resolver.js.map +2 -2
  126. package/dist/mercato.js +14 -23
  127. package/dist/mercato.js.map +2 -2
  128. package/package.json +7 -7
  129. package/src/__tests__/mercato.test.ts +14 -4
  130. package/src/lib/__fixtures__/official-module-package/dist/modules/test_package/widgets/injection/test/widget.js +1 -0
  131. package/src/lib/__integration__/TC-INT-007.spec.ts +219 -19
  132. package/src/lib/__integration__/TC-INT-009.spec.ts +279 -0
  133. package/src/lib/__tests__/eject.test.ts +98 -4
  134. package/src/lib/__tests__/init-summary.test.ts +50 -0
  135. package/src/lib/__tests__/module-github.test.ts +108 -0
  136. package/src/lib/__tests__/module-identity.test.ts +144 -0
  137. package/src/lib/__tests__/module-inspection.test.ts +195 -0
  138. package/src/lib/__tests__/module-install.test.ts +399 -10
  139. package/src/lib/__tests__/module-package.test.ts +154 -0
  140. package/src/lib/__tests__/modules-config.test.ts +55 -0
  141. package/src/lib/__tests__/resolver.packages.test.ts +29 -0
  142. package/src/lib/eject.ts +28 -10
  143. package/src/lib/generators/__tests__/module-id-collisions.test.ts +146 -0
  144. package/src/lib/generators/__tests__/module-package-sources.test.ts +19 -2
  145. package/src/lib/generators/__tests__/module-requirements.test.ts +56 -0
  146. package/src/lib/generators/entity-ids.ts +2 -0
  147. package/src/lib/generators/module-di.ts +2 -0
  148. package/src/lib/generators/module-entities.ts +2 -0
  149. package/src/lib/generators/module-package-sources.ts +7 -5
  150. package/src/lib/generators/module-registry.ts +33 -115
  151. package/src/lib/generators/openapi.ts +3 -0
  152. package/src/lib/generators/source-exports.ts +93 -0
  153. package/src/lib/init-summary.ts +54 -0
  154. package/src/lib/module-github.ts +109 -0
  155. package/src/lib/module-identity.ts +145 -0
  156. package/src/lib/module-inspection.ts +133 -0
  157. package/src/lib/module-install.ts +170 -22
  158. package/src/lib/module-package.ts +243 -16
  159. package/src/lib/modules-config.ts +80 -32
  160. package/src/lib/resolver.ts +35 -39
  161. package/src/mercato.ts +14 -24
  162. package/src/types/cross-spawn.d.ts +2 -2
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib/eject.ts"],
4
- "sourcesContent": ["import path from 'node:path'\nimport fs from 'node:fs'\nimport { setModuleRegistrationSource } from './modules-config'\nimport type { PackageResolver, ModuleEntry } from './resolver'\nimport { resolveInstalledOfficialModulePackage } from './module-package'\n\ntype ModuleMetadata = {\n ejectable?: boolean\n title?: string\n description?: string\n}\n\nconst SKIP_DIRS = new Set(['__tests__', '__mocks__', 'node_modules'])\nconst SOURCE_FILE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs']\n\nfunction shouldSkipEntryName(name: string): boolean {\n return SKIP_DIRS.has(name) || name === '.DS_Store' || name.startsWith('._')\n}\n\nfunction collectSourceFiles(dir: string): string[] {\n const files: string[] = []\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n for (const entry of entries) {\n if (shouldSkipEntryName(entry.name)) continue\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n files.push(...collectSourceFiles(fullPath))\n continue\n }\n const ext = path.extname(entry.name)\n if (!SOURCE_FILE_EXTENSIONS.includes(ext)) continue\n files.push(fullPath)\n }\n return files\n}\n\nfunction resolveRelativeImportTarget(sourceFile: string, importPath: string): string | null {\n if (!importPath.startsWith('.')) return null\n\n const basePath = path.resolve(path.dirname(sourceFile), importPath)\n const candidates = [basePath]\n\n for (const ext of SOURCE_FILE_EXTENSIONS) {\n candidates.push(`${basePath}${ext}`)\n candidates.push(path.join(basePath, `index${ext}`))\n }\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate\n }\n }\n\n return null\n}\n\nfunction rewriteRelativeSpecifier(\n sourceFile: string,\n specifier: string,\n modulesRoot: string,\n moduleId: string,\n packageName: string,\n): string {\n const resolvedTarget = resolveRelativeImportTarget(sourceFile, specifier)\n if (!resolvedTarget) return specifier\n\n const modulesRootPrefix = `${modulesRoot}${path.sep}`\n if (!resolvedTarget.startsWith(modulesRootPrefix)) return specifier\n\n const relativeFromModules = path.relative(modulesRoot, resolvedTarget)\n let normalizedRelative = relativeFromModules.split(path.sep).join('/')\n const matchedExt = SOURCE_FILE_EXTENSIONS.find((ext) => normalizedRelative.endsWith(ext))\n if (matchedExt) {\n normalizedRelative = normalizedRelative.slice(0, -matchedExt.length)\n }\n if (normalizedRelative.endsWith('/index')) {\n normalizedRelative = normalizedRelative.slice(0, -'/index'.length)\n }\n const segments = normalizedRelative.split('/')\n const targetModuleId = segments[0]\n\n if (!targetModuleId || targetModuleId === moduleId) return specifier\n\n return `${packageName}/modules/${normalizedRelative}`\n}\n\nexport function rewriteCrossModuleImports(\n pkgBase: string,\n appBase: string,\n moduleId: string,\n packageName: string,\n): void {\n const modulesRoot = path.resolve(pkgBase, '..')\n const appFiles = collectSourceFiles(appBase)\n\n for (const appFile of appFiles) {\n const relativePath = path.relative(appBase, appFile)\n const sourceFile = path.join(pkgBase, relativePath)\n\n if (!fs.existsSync(sourceFile)) continue\n\n const content = fs.readFileSync(appFile, 'utf8')\n let updated = content\n\n updated = updated.replace(\n /(\\bfrom\\s*['\"])([^'\"]+)(['\"])/g,\n (_match, prefix: string, specifier: string, suffix: string) => {\n const rewritten = rewriteRelativeSpecifier(\n sourceFile,\n specifier,\n modulesRoot,\n moduleId,\n packageName,\n )\n return `${prefix}${rewritten}${suffix}`\n },\n )\n\n updated = updated.replace(\n /(\\bimport\\s*\\(\\s*['\"])([^'\"]+)(['\"]\\s*\\))/g,\n (_match, prefix: string, specifier: string, suffix: string) => {\n const rewritten = rewriteRelativeSpecifier(\n sourceFile,\n specifier,\n modulesRoot,\n moduleId,\n packageName,\n )\n return `${prefix}${rewritten}${suffix}`\n },\n )\n\n if (updated !== content) {\n fs.writeFileSync(appFile, updated)\n }\n }\n}\n\nexport function parseModuleMetadata(indexPath: string): ModuleMetadata {\n if (!fs.existsSync(indexPath)) return {}\n\n const source = fs.readFileSync(indexPath, 'utf8')\n const result: ModuleMetadata = {}\n\n const ejectableMatch = source.match(/ejectable\\s*:\\s*(true|false)/)\n if (ejectableMatch) {\n result.ejectable = ejectableMatch[1] === 'true'\n }\n\n const titleMatch = source.match(/title\\s*:\\s*['\"]([^'\"]+)['\"]/)\n if (titleMatch) {\n result.title = titleMatch[1]\n }\n\n const descMatch = source.match(/description\\s*:\\s*['\"]([^'\"]+)['\"]/)\n if (descMatch) {\n result.description = descMatch[1]\n }\n\n return result\n}\n\nexport function copyDirRecursive(src: string, dest: string): void {\n fs.mkdirSync(dest, { recursive: true })\n\n const entries = fs.readdirSync(src, { withFileTypes: true })\n for (const entry of entries) {\n if (shouldSkipEntryName(entry.name)) continue\n\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n\n if (entry.isDirectory()) {\n copyDirRecursive(srcPath, destPath)\n } else {\n fs.copyFileSync(srcPath, destPath)\n }\n }\n}\n\nexport function updateModulesTs(modulesPath: string, moduleId: string): void {\n setModuleRegistrationSource(modulesPath, moduleId, '@app')\n}\n\nexport type EjectableModule = {\n id: string\n title?: string\n description?: string\n from: string\n}\n\ntype ResolvedModuleSource = {\n pkgBase: string\n metadata: ModuleMetadata\n}\n\n// Standalone installs resolve getModulePaths' pkgBase to the package's\n// dist/modules tree when it exists (compiled JS, no index.ts), which made every\n// ejectable module read as \"not ejectable\" and eject copies of compiled output\n// (#4272). Prefer the shipped TypeScript sources under src/modules; fall back\n// to the resolved base for packages that ship dist only.\nfunction resolveModuleSourceBase(resolver: PackageResolver, entry: ModuleEntry): string {\n const { pkgBase } = resolver.getModulePaths(entry)\n const from = entry.from || '@open-mercato/core'\n if (from === '@app') return pkgBase\n const sourceBase = path.join(resolver.getPackageRoot(from), 'src', 'modules', entry.id)\n if (path.resolve(sourceBase) !== path.resolve(pkgBase) && fs.existsSync(sourceBase)) {\n return sourceBase\n }\n return pkgBase\n}\n\nfunction readModuleMetadata(moduleDir: string): ModuleMetadata {\n const tsIndex = path.join(moduleDir, 'index.ts')\n if (fs.existsSync(tsIndex)) return parseModuleMetadata(tsIndex)\n return parseModuleMetadata(path.join(moduleDir, 'index.js'))\n}\n\nfunction resolveModuleSource(\n resolver: PackageResolver,\n entry: ModuleEntry,\n): ResolvedModuleSource {\n const pkgBase = resolveModuleSourceBase(resolver, entry)\n const fallbackMetadata = readModuleMetadata(pkgBase)\n const from = entry.from || '@open-mercato/core'\n\n if (from === '@app' || from === '@open-mercato/core') {\n return { pkgBase, metadata: fallbackMetadata }\n }\n\n try {\n const modulePackage = resolveInstalledOfficialModulePackage(resolver, from, entry.id)\n\n return {\n pkgBase: modulePackage.sourceModuleDir,\n metadata: {\n ejectable: modulePackage.metadata.ejectable,\n title: modulePackage.moduleInfo.title ?? modulePackage.metadata.moduleId,\n description: modulePackage.moduleInfo.description,\n },\n }\n } catch {\n return { pkgBase, metadata: fallbackMetadata }\n }\n}\n\nexport function listEjectableModules(resolver: PackageResolver): EjectableModule[] {\n const modules = resolver.loadEnabledModules()\n const ejectable: EjectableModule[] = []\n\n for (const entry of modules) {\n if (entry.from === '@app') continue\n\n const { metadata } = resolveModuleSource(resolver, entry)\n\n if (metadata.ejectable) {\n ejectable.push({\n id: entry.id,\n title: metadata.title,\n description: metadata.description,\n from: entry.from || '@open-mercato/core',\n })\n }\n }\n\n return ejectable\n}\n\nexport function ejectModule(resolver: PackageResolver, moduleId: string): void {\n const modules = resolver.loadEnabledModules()\n const entry = modules.find((m: ModuleEntry) => m.id === moduleId)\n\n if (!entry) {\n throw new Error(\n `Module \"${moduleId}\" is not listed in src/modules.ts. ` +\n `Available modules: ${modules.map((m: ModuleEntry) => m.id).join(', ')}`,\n )\n }\n\n if (entry.from === '@app') {\n throw new Error(\n `Module \"${moduleId}\" is already local (from: '@app'). Nothing to eject.`,\n )\n }\n\n const { appBase } = resolver.getModulePaths(entry)\n const { pkgBase, metadata } = resolveModuleSource(resolver, entry)\n\n if (!fs.existsSync(pkgBase)) {\n throw new Error(\n `Package source directory not found: ${pkgBase}. ` +\n `Make sure the package is installed.`,\n )\n }\n\n if (!metadata.ejectable) {\n throw new Error(\n `Module \"${moduleId}\" is not marked as ejectable. Only modules with \\`ejectable: true\\` in their metadata can be ejected.`,\n )\n }\n\n if (fs.existsSync(appBase)) {\n throw new Error(\n `Destination directory already exists: ${appBase}. ` +\n `Remove it first or resolve the conflict manually.`,\n )\n }\n\n copyDirRecursive(pkgBase, appBase)\n rewriteCrossModuleImports(pkgBase, appBase, moduleId, entry.from || '@open-mercato/core')\n\n const modulesPath = resolver.getModulesConfigPath()\n updateModulesTs(modulesPath, moduleId)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import path from 'node:path'\nimport fs from 'node:fs'\nimport { prepareModuleRegistrationSource, setModuleRegistrationSource } from './modules-config'\nimport type { PackageResolver, ModuleEntry } from './resolver'\nimport { isModulePackageExportError, resolveInstalledOfficialModulePackage, resolveInstalledPackageRoot } from './module-package'\nimport { normalizeModuleLocator } from '@open-mercato/shared/modules/module-locators'\nimport { getEnabledModuleIdentities } from './module-identity'\n\ntype ModuleMetadata = {\n ejectable?: boolean\n title?: string\n description?: string\n}\n\nconst SKIP_DIRS = new Set(['__tests__', '__mocks__', 'node_modules'])\nconst SOURCE_FILE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs']\n\nfunction shouldSkipEntryName(name: string): boolean {\n return SKIP_DIRS.has(name) || name === '.DS_Store' || name.startsWith('._')\n}\n\nfunction collectSourceFiles(dir: string): string[] {\n const files: string[] = []\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n for (const entry of entries) {\n if (shouldSkipEntryName(entry.name)) continue\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n files.push(...collectSourceFiles(fullPath))\n continue\n }\n const ext = path.extname(entry.name)\n if (!SOURCE_FILE_EXTENSIONS.includes(ext)) continue\n files.push(fullPath)\n }\n return files\n}\n\nfunction resolveRelativeImportTarget(sourceFile: string, importPath: string): string | null {\n if (!importPath.startsWith('.')) return null\n\n const basePath = path.resolve(path.dirname(sourceFile), importPath)\n const candidates = [basePath]\n\n for (const ext of SOURCE_FILE_EXTENSIONS) {\n candidates.push(`${basePath}${ext}`)\n candidates.push(path.join(basePath, `index${ext}`))\n }\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate\n }\n }\n\n return null\n}\n\nfunction rewriteRelativeSpecifier(\n sourceFile: string,\n specifier: string,\n modulesRoot: string,\n moduleId: string,\n packageName: string,\n): string {\n const resolvedTarget = resolveRelativeImportTarget(sourceFile, specifier)\n if (!resolvedTarget) return specifier\n\n const modulesRootPrefix = `${modulesRoot}${path.sep}`\n if (!resolvedTarget.startsWith(modulesRootPrefix)) return specifier\n\n const relativeFromModules = path.relative(modulesRoot, resolvedTarget)\n let normalizedRelative = relativeFromModules.split(path.sep).join('/')\n const matchedExt = SOURCE_FILE_EXTENSIONS.find((ext) => normalizedRelative.endsWith(ext))\n if (matchedExt) {\n normalizedRelative = normalizedRelative.slice(0, -matchedExt.length)\n }\n if (normalizedRelative.endsWith('/index')) {\n normalizedRelative = normalizedRelative.slice(0, -'/index'.length)\n }\n const segments = normalizedRelative.split('/')\n const targetModuleId = segments[0]\n\n if (!targetModuleId || targetModuleId === moduleId) return specifier\n\n return `${packageName}/modules/${normalizedRelative}`\n}\n\nexport function rewriteCrossModuleImports(\n pkgBase: string,\n appBase: string,\n moduleId: string,\n packageName: string,\n): void {\n const modulesRoot = path.resolve(pkgBase, '..')\n const appFiles = collectSourceFiles(appBase)\n\n for (const appFile of appFiles) {\n const relativePath = path.relative(appBase, appFile)\n const sourceFile = path.join(pkgBase, relativePath)\n\n if (!fs.existsSync(sourceFile)) continue\n\n const content = fs.readFileSync(appFile, 'utf8')\n let updated = content\n\n updated = updated.replace(\n /(\\bfrom\\s*['\"])([^'\"]+)(['\"])/g,\n (_match, prefix: string, specifier: string, suffix: string) => {\n const rewritten = rewriteRelativeSpecifier(\n sourceFile,\n specifier,\n modulesRoot,\n moduleId,\n packageName,\n )\n return `${prefix}${rewritten}${suffix}`\n },\n )\n\n updated = updated.replace(\n /(\\bimport\\s*\\(\\s*['\"])([^'\"]+)(['\"]\\s*\\))/g,\n (_match, prefix: string, specifier: string, suffix: string) => {\n const rewritten = rewriteRelativeSpecifier(\n sourceFile,\n specifier,\n modulesRoot,\n moduleId,\n packageName,\n )\n return `${prefix}${rewritten}${suffix}`\n },\n )\n\n if (updated !== content) {\n fs.writeFileSync(appFile, updated)\n }\n }\n}\n\nexport function parseModuleMetadata(indexPath: string): ModuleMetadata {\n if (!fs.existsSync(indexPath)) return {}\n\n const source = fs.readFileSync(indexPath, 'utf8')\n const result: ModuleMetadata = {}\n\n const ejectableMatch = source.match(/ejectable\\s*:\\s*(true|false)/)\n if (ejectableMatch) {\n result.ejectable = ejectableMatch[1] === 'true'\n }\n\n const titleMatch = source.match(/title\\s*:\\s*['\"]([^'\"]+)['\"]/)\n if (titleMatch) {\n result.title = titleMatch[1]\n }\n\n const descMatch = source.match(/description\\s*:\\s*['\"]([^'\"]+)['\"]/)\n if (descMatch) {\n result.description = descMatch[1]\n }\n\n return result\n}\n\nexport function copyDirRecursive(src: string, dest: string): void {\n fs.mkdirSync(dest, { recursive: true })\n\n const entries = fs.readdirSync(src, { withFileTypes: true })\n for (const entry of entries) {\n if (shouldSkipEntryName(entry.name)) continue\n\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n\n if (entry.isDirectory()) {\n copyDirRecursive(srcPath, destPath)\n } else {\n fs.copyFileSync(srcPath, destPath)\n }\n }\n}\n\nexport function updateModulesTs(modulesPath: string, moduleId: string, provenance?: Pick<ModuleEntry, 'locator' | 'packageName'>): void {\n setModuleRegistrationSource(modulesPath, moduleId, '@app', provenance)\n}\n\nexport type EjectableModule = {\n id: string\n title?: string\n description?: string\n from: string\n}\n\ntype ResolvedModuleSource = {\n pkgBase: string\n metadata: ModuleMetadata\n}\n\n// Standalone installs resolve getModulePaths' pkgBase to the package's\n// dist/modules tree when it exists (compiled JS, no index.ts), which made every\n// ejectable module read as \"not ejectable\" and eject copies of compiled output\n// (#4272). Prefer the shipped TypeScript sources under src/modules; fall back\n// to the resolved base for packages that ship dist only.\nfunction resolveModuleSourceBase(resolver: PackageResolver, entry: ModuleEntry): string {\n const { pkgBase } = resolver.getModulePaths(entry)\n const from = entry.from || '@open-mercato/core'\n if (from === '@app') return pkgBase\n const sourceBase = path.join(resolver.getPackageRoot(from), 'src', 'modules', entry.id)\n if (path.resolve(sourceBase) !== path.resolve(pkgBase) && fs.existsSync(sourceBase)) {\n return sourceBase\n }\n return pkgBase\n}\n\nfunction readModuleMetadata(moduleDir: string): ModuleMetadata {\n const tsIndex = path.join(moduleDir, 'index.ts')\n if (fs.existsSync(tsIndex)) return parseModuleMetadata(tsIndex)\n return parseModuleMetadata(path.join(moduleDir, 'index.js'))\n}\n\nfunction resolveModuleSource(\n resolver: PackageResolver,\n entry: ModuleEntry,\n): ResolvedModuleSource {\n const pkgBase = resolveModuleSourceBase(resolver, entry)\n const fallbackMetadata = readModuleMetadata(pkgBase)\n const from = entry.from || '@open-mercato/core'\n\n if (from === '@app' || from === '@open-mercato/core') {\n return { pkgBase, metadata: fallbackMetadata }\n }\n\n try {\n const modulePackage = resolveInstalledOfficialModulePackage(resolver, from, entry.id)\n\n return {\n pkgBase: modulePackage.sourceModuleDir,\n metadata: {\n ejectable: modulePackage.metadata.ejectable,\n title: modulePackage.moduleInfo.title ?? modulePackage.metadata.moduleId,\n description: modulePackage.moduleInfo.description,\n },\n }\n } catch (error) {\n if (isModulePackageExportError(error)) throw error\n return { pkgBase, metadata: fallbackMetadata }\n }\n}\n\nexport function listEjectableModules(resolver: PackageResolver): EjectableModule[] {\n const modules = resolver.loadEnabledModules()\n const ejectable: EjectableModule[] = []\n\n for (const entry of modules) {\n if (entry.from === '@app') continue\n\n const { metadata } = resolveModuleSource(resolver, entry)\n\n if (metadata.ejectable) {\n ejectable.push({\n id: entry.id,\n title: metadata.title,\n description: metadata.description,\n from: entry.from || '@open-mercato/core',\n })\n }\n }\n\n return ejectable\n}\n\nexport function ejectModule(resolver: PackageResolver, moduleId: string): void {\n const modules = resolver.loadEnabledModules()\n const identities = getEnabledModuleIdentities(resolver, modules)\n const matches = modules.filter((module: ModuleEntry) => module.id === moduleId)\n const entry = matches[0]\n\n if (!entry) {\n throw new Error(\n `Module \"${moduleId}\" is not listed in src/modules.ts. ` +\n `Available modules: ${modules.map((m: ModuleEntry) => m.id).join(', ')}`,\n )\n }\n\n if (entry.from === '@app') {\n throw new Error(\n `Module \"${moduleId}\" is already local (from: '@app'). Nothing to eject.`,\n )\n }\n\n const { appBase } = resolver.getModulePaths(entry)\n const { pkgBase, metadata } = resolveModuleSource(resolver, entry)\n\n if (!fs.existsSync(pkgBase)) {\n throw new Error(\n `Package source directory not found: ${pkgBase}. ` +\n `Make sure the package is installed.`,\n )\n }\n\n if (!metadata.ejectable) {\n throw new Error(\n `Module \"${moduleId}\" is not marked as ejectable. Only modules with \\`ejectable: true\\` in their metadata can be ejected.`,\n )\n }\n\n if (fs.existsSync(appBase)) {\n throw new Error(\n `Destination directory already exists: ${appBase}. ` +\n `Keep the existing local source and review the destination conflict before ejecting.`,\n )\n }\n\n const locators = identities.find((identity) => identity.id === moduleId)?.locators ?? []\n const packageRoot = resolveInstalledPackageRoot(resolver, entry.from || '@open-mercato/core')\n const manifest: unknown = JSON.parse(fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8'))\n const packageName = manifest && typeof manifest === 'object' && 'name' in manifest && typeof manifest.name === 'string'\n ? manifest.name\n : undefined\n if (!packageName || normalizeModuleLocator(`npm:${packageName}`) !== `npm:${packageName}`) {\n throw new Error(`Cannot retain source provenance for module \"${moduleId}\": the installed package manifest has no valid name.`)\n }\n const locator = locators.find((identity) => identity.startsWith('github:')) ?? locators.find((identity) => identity.startsWith('npm:'))\n const provenance = { ...(packageName ? { packageName } : {}), ...(locator ? { locator } : {}) }\n const modulesPath = resolver.getModulesConfigPath()\n const originalConfig = fs.readFileSync(modulesPath, 'utf8')\n const updatedConfig = prepareModuleRegistrationSource(originalConfig, moduleId, '@app', provenance)\n\n copyDirRecursive(pkgBase, appBase)\n rewriteCrossModuleImports(pkgBase, appBase, moduleId, entry.from || '@open-mercato/core')\n fs.writeFileSync(modulesPath, updatedConfig)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,3 +1,4 @@
1
+ import { getEnabledModuleIdentities } from "../module-identity.js";
1
2
  import fs from "node:fs";
2
3
  import path from "node:path";
3
4
  import ts from "typescript-js";
@@ -242,6 +243,7 @@ async function generateEntityIds(options) {
242
243
  const outFile = path.join(outputDir, "entities.ids.generated.ts");
243
244
  const checksumFile = path.join(outputDir, "entities.ids.generated.checksum");
244
245
  const entries = resolver.loadEnabledModules();
246
+ getEnabledModuleIdentities(resolver, entries);
245
247
  const consolidated = {};
246
248
  const grouped = {};
247
249
  const modulesDict = {};
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/generators/entity-ids.ts"],
4
- "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport ts from 'typescript-js'\nimport { VariableDeclarationKind } from 'ts-morph'\nimport type { PackageResolver, ModuleEntry } from '../resolver'\nimport { MODULE_CODE_EXTENSIONS } from './scanner'\nimport {\n toVar,\n toSnake,\n rimrafDir,\n type GeneratorResult,\n createGeneratorResult,\n writeGeneratedFile,\n writeIfChanged,\n} from '../utils'\nimport { addAutoGeneratedComment, createGeneratedSourceFile, elementAccess, getSourceText, identifier, returnStatement } from './ast'\n\ntype GroupKey = '@app' | '@open-mercato/core' | string\ntype EntityFieldMap = Record<string, string[]>\n\nexport interface EntityIdsOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\n/**\n * Extract exported class names from a TypeScript source file without dynamic import.\n * This is used for @app modules since Node.js can't import TypeScript files directly.\n */\nfunction parseExportedClassNamesFromFile(filePath: string): string[] {\n const src = fs.readFileSync(filePath, 'utf8')\n const sf = ts.createSourceFile(filePath, src, ts.ScriptTarget.ES2020, true, ts.ScriptKind.TS)\n const classNames: string[] = []\n\n sf.forEachChild((node) => {\n // Check for exported class declarations\n if (ts.isClassDeclaration(node) && node.name) {\n const hasExport = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n if (hasExport) {\n classNames.push(node.name.text)\n }\n }\n })\n\n return classNames\n}\n\nfunction unwrapObjectLiteralExpression(\n expression: ts.Expression | undefined,\n): ts.ObjectLiteralExpression | undefined {\n if (!expression) return undefined\n if (ts.isObjectLiteralExpression(expression)) return expression\n if (ts.isAsExpression(expression) || ts.isTypeAssertionExpression(expression)) {\n return unwrapObjectLiteralExpression(expression.expression)\n }\n if (ts.isParenthesizedExpression(expression)) {\n return unwrapObjectLiteralExpression(expression.expression)\n }\n return undefined\n}\n\nfunction readPropertyInitializer(\n objectLiteral: ts.ObjectLiteralExpression,\n propertyName: string,\n): ts.Expression | undefined {\n for (const property of objectLiteral.properties) {\n if (!ts.isPropertyAssignment(property)) continue\n const name = ts.isIdentifier(property.name)\n ? property.name.text\n : ts.isStringLiteralLike(property.name)\n ? property.name.text\n : undefined\n if (name === propertyName) {\n return property.initializer\n }\n }\n return undefined\n}\n\nfunction parseGeneratedModuleEntityNames(filePath: string, moduleId: string): string[] {\n if (!fs.existsSync(filePath)) return []\n\n const source = fs.readFileSync(filePath, 'utf8')\n const scriptKind = filePath.endsWith('.js') ? ts.ScriptKind.JS : ts.ScriptKind.TS\n const sf = ts.createSourceFile(filePath, source, ts.ScriptTarget.ES2020, true, scriptKind)\n\n for (const statement of sf.statements) {\n if (!ts.isVariableStatement(statement)) continue\n const declaration = statement.declarationList.declarations.find((candidate) =>\n ts.isIdentifier(candidate.name) && candidate.name.text === 'E')\n if (!declaration) continue\n\n const eObject = unwrapObjectLiteralExpression(declaration.initializer)\n if (!eObject) continue\n\n const moduleObject = unwrapObjectLiteralExpression(readPropertyInitializer(eObject, moduleId))\n if (!moduleObject) return []\n\n const names: string[] = []\n for (const property of moduleObject.properties) {\n if (!ts.isPropertyAssignment(property)) continue\n const name = ts.isIdentifier(property.name)\n ? property.name.text\n : ts.isStringLiteralLike(property.name)\n ? property.name.text\n : undefined\n if (name) names.push(name)\n }\n return names\n }\n\n return []\n}\n\nfunction parseGeneratedEntityFieldsFile(filePath: string): string[] {\n if (!fs.existsSync(filePath)) return []\n\n const source = fs.readFileSync(filePath, 'utf8')\n const scriptKind = filePath.endsWith('.js') ? ts.ScriptKind.JS : ts.ScriptKind.TS\n const sf = ts.createSourceFile(filePath, source, ts.ScriptTarget.ES2020, true, scriptKind)\n const fields: string[] = []\n\n for (const statement of sf.statements) {\n if (!ts.isVariableStatement(statement)) continue\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name) || !declaration.initializer) continue\n if (!ts.isStringLiteralLike(declaration.initializer)) continue\n fields.push(declaration.initializer.text)\n }\n }\n\n return Array.from(new Set(fields))\n}\n\nfunction resolveExistingFile(candidates: string[]): string | null {\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n\nfunction loadStandaloneGeneratedPackageEntities(\n resolver: PackageResolver,\n entry: ModuleEntry,\n): { entityNames: string[]; entityFieldMap: EntityFieldMap } | null {\n if (resolver.isMonorepo() || !entry.from || entry.from === '@app') return null\n\n const packageRoot = resolver.getPackageRoot(entry.from)\n const generatedRoot = fs.existsSync(path.join(packageRoot, 'generated'))\n ? path.join(packageRoot, 'generated')\n : path.join(packageRoot, 'dist', 'generated')\n const idsFile = resolveExistingFile([\n path.join(generatedRoot, 'entities.ids.generated.ts'),\n path.join(generatedRoot, 'entities.ids.generated.js'),\n ])\n if (!idsFile) return null\n const entityNames = parseGeneratedModuleEntityNames(idsFile, entry.id)\n\n if (entityNames.length === 0) return null\n\n const entityFieldMap: EntityFieldMap = {}\n for (const entityName of entityNames) {\n const fieldsFile = resolveExistingFile([\n path.join(generatedRoot, 'entities', entityName, 'index.ts'),\n path.join(generatedRoot, 'entities', entityName, 'index.js'),\n ])\n if (!fieldsFile) continue\n const fields = parseGeneratedEntityFieldsFile(fieldsFile)\n entityFieldMap[entityName] = fields\n }\n\n return { entityNames, entityFieldMap }\n}\n\nfunction parseEntityFieldsFromFile(filePath: string, exportedClassNames: string[]): EntityFieldMap {\n const src = fs.readFileSync(filePath, 'utf8')\n const sf = ts.createSourceFile(filePath, src, ts.ScriptTarget.ES2020, true, ts.ScriptKind.TS)\n\n const exported = new Set(exportedClassNames)\n const result: EntityFieldMap = {}\n\n function getDecoratorArgNameLiteral(dec: ts.Decorator | undefined): string | undefined {\n if (!dec) return undefined\n const expr = dec.expression\n if (!ts.isCallExpression(expr)) return undefined\n if (!expr.arguments.length) return undefined\n const first = expr.arguments[0]\n if (!ts.isObjectLiteralExpression(first)) return undefined\n for (const prop of first.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === 'name') {\n if (ts.isStringLiteral(prop.initializer)) return prop.initializer.text\n }\n }\n return undefined\n }\n\n function normalizeDbName(propertyName: string, _decoratorName?: string, nameOverride?: string): string {\n if (nameOverride) return nameOverride\n return toSnake(propertyName)\n }\n\n sf.forEachChild((node) => {\n if (!ts.isClassDeclaration(node) || !node.name) return\n const clsName = node.name.text\n if (!exported.has(clsName)) return\n const entityKey = toSnake(clsName)\n const fields: string[] = []\n\n for (const member of node.members) {\n if (!ts.isPropertyDeclaration(member) || !member.name) continue\n const name = ts.isIdentifier(member.name)\n ? member.name.text\n : ts.isStringLiteral(member.name)\n ? member.name.text\n : undefined\n if (!name) continue\n if (member.modifiers?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword)) continue\n const decorators = ts.canHaveDecorators(member)\n ? ts.getDecorators(member) ?? []\n : []\n let dbName: string | undefined\n if (decorators && decorators.length) {\n for (const d of decorators) {\n const nameOverride = getDecoratorArgNameLiteral(d)\n dbName = normalizeDbName(name, undefined, nameOverride)\n if (dbName) break\n }\n }\n if (!dbName) dbName = normalizeDbName(name)\n fields.push(dbName)\n }\n result[entityKey] = Array.from(new Set(fields))\n })\n\n return result\n}\n\nfunction writeTrackedFile(\n filePath: string,\n content: string,\n result: GeneratorResult,\n): void {\n if (writeIfChanged(filePath, content)) {\n result.filesWritten.push(filePath)\n } else {\n result.filesUnchanged.push(filePath)\n }\n}\n\nfunction writePerEntityFieldFiles(\n outRoot: string,\n fieldsByEntity: EntityFieldMap,\n result: GeneratorResult,\n): void {\n fs.mkdirSync(outRoot, { recursive: true })\n const desiredEntities = new Set(Object.keys(fieldsByEntity))\n for (const [entity, fields] of Object.entries(fieldsByEntity)) {\n const entDir = path.join(outRoot, entity)\n fs.mkdirSync(entDir, { recursive: true })\n const sourceFile = createGeneratedSourceFile(`${entity}/index.ts`)\n sourceFile.addVariableStatements(fields.map((field) => ({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: toVar(field),\n initializer: JSON.stringify(field),\n },\n ],\n })))\n writeTrackedFile(path.join(entDir, 'index.ts'), getSourceText(sourceFile), result)\n }\n\n const existingEntries = fs.existsSync(outRoot) ? fs.readdirSync(outRoot, { withFileTypes: true }) : []\n for (const entry of existingEntries) {\n if (!entry.isDirectory()) continue\n if (desiredEntities.has(entry.name)) continue\n const staleDirectory = path.join(outRoot, entry.name)\n rimrafDir(staleDirectory)\n result.filesWritten.push(staleDirectory)\n }\n}\n\nfunction writeEntityFieldsRegistry(\n generatedRoot: string,\n fieldsByEntity: EntityFieldMap,\n result: GeneratorResult,\n): void {\n const entities = Object.keys(fieldsByEntity).sort((a, b) => a.localeCompare(b))\n const registry: Record<string, Record<string, string>> = {}\n for (const entity of entities) {\n registry[toVar(entity)] = {}\n for (const field of fieldsByEntity[entity] ?? []) {\n registry[toVar(entity)][toVar(field)] = field\n }\n }\n\n const sourceFile = createGeneratedSourceFile('entity-fields-registry.ts')\n addAutoGeneratedComment(sourceFile, 'entity-ids')\n sourceFile.insertText(sourceFile.getFullText().length, '// Static registry for entity fields - eliminates dynamic imports for Turbopack compatibility\\n')\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: 'entityFieldsRegistry',\n type: 'Record<string, Record<string, string>>',\n initializer: JSON.stringify(registry, null, 2),\n },\n ],\n })\n sourceFile.addFunction({\n name: 'getEntityFields',\n isExported: true,\n parameters: [{ name: 'slug', type: 'string' }],\n returnType: 'Record<string, string> | undefined',\n statements: [returnStatement(elementAccess(identifier('entityFieldsRegistry'), identifier('slug')))],\n })\n const outPath = path.join(generatedRoot, 'entity-fields-registry.ts')\n writeTrackedFile(outPath, getSourceText(sourceFile), result)\n}\n\nexport async function generateEntityIds(options: EntityIdsOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'entities.ids.generated.ts')\n const checksumFile = path.join(outputDir, 'entities.ids.generated.checksum')\n\n const entries = resolver.loadEnabledModules()\n\n const consolidated: Record<string, Record<string, string>> = {}\n const grouped: Record<GroupKey, Record<string, Record<string, string>>> = {}\n const modulesDict: Record<string, string> = {}\n const groupedModulesDict: Record<GroupKey, Record<string, string>> = {}\n\n const fieldsByGroup: Record<GroupKey, Record<string, EntityFieldMap>> = {}\n\n for (const entry of entries) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n const group: GroupKey = (entry.from as GroupKey) || '@open-mercato/core'\n\n const standaloneGeneratedPackageEntities = loadStandaloneGeneratedPackageEntities(resolver, entry)\n\n // Locate entities definition file (prefer app override)\n const appData = path.join(roots.appBase, 'data')\n const pkgData = path.join(roots.pkgBase, 'data')\n const appDb = path.join(roots.appBase, 'db')\n const pkgDb = path.join(roots.pkgBase, 'db')\n const bases = [appData, pkgData, appDb, pkgDb]\n const candidates = ['entities.override', 'entities', 'schema']\n let importPath: string | null = null\n let filePath: string | null = null\n\n for (const base of bases) {\n for (const f of candidates) {\n const p = resolveConventionFile(base, f)\n if (p) {\n const fromApp = base.startsWith(roots.appBase)\n const sub = path.basename(base) // 'data' | 'db'\n importPath = `${fromApp ? imps.appBase : imps.pkgBase}/${sub}/${f}`\n filePath = p\n break\n }\n }\n if (importPath) break\n }\n\n // No entities file found -> still register module id\n if (!filePath && !standaloneGeneratedPackageEntities) {\n modulesDict[modId] = modId\n groupedModulesDict[group] = groupedModulesDict[group] || {}\n groupedModulesDict[group][modId] = modId\n continue\n }\n\n const exportNames = filePath ? parseExportedClassNamesFromFile(filePath) : []\n\n const entityNames = standaloneGeneratedPackageEntities\n ? standaloneGeneratedPackageEntities.entityNames\n : exportNames\n .map((k) => toSnake(k))\n .filter((k, idx, arr) => arr.indexOf(k) === idx)\n\n // Build dictionaries\n modulesDict[modId] = modId\n groupedModulesDict[group] = groupedModulesDict[group] || {}\n groupedModulesDict[group][modId] = modId\n\n consolidated[modId] = consolidated[modId] || {}\n grouped[group] = grouped[group] || {}\n grouped[group][modId] = grouped[group][modId] || {}\n\n for (const en of entityNames) {\n consolidated[modId][en] = `${modId}:${en}`\n grouped[group][modId][en] = `${modId}:${en}`\n }\n\n // Parse entity fields from TypeScript source\n const entityFieldMap = standaloneGeneratedPackageEntities\n ? standaloneGeneratedPackageEntities.entityFieldMap\n : parseEntityFieldsFromFile(filePath!, exportNames)\n fieldsByGroup[group] = fieldsByGroup[group] || {}\n fieldsByGroup[group][modId] = entityFieldMap\n }\n\n // Write consolidated output\n const consolidatedSourceFile = createGeneratedSourceFile('entities.ids.generated.ts')\n addAutoGeneratedComment(consolidatedSourceFile, 'entity-ids')\n consolidatedSourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n { name: 'M', initializer: `${JSON.stringify(modulesDict, null, 2)} as const` },\n { name: 'E', initializer: `${JSON.stringify(consolidated, null, 2)} as const` },\n ],\n })\n consolidatedSourceFile.addTypeAlias({\n name: 'KnownModuleId',\n isExported: true,\n type: 'keyof typeof M',\n })\n consolidatedSourceFile.addTypeAlias({\n name: 'KnownEntities',\n isExported: true,\n type: 'typeof E',\n })\n const consolidatedSrc = getSourceText(consolidatedSourceFile)\n\n writeGeneratedFile({\n outFile,\n checksumFile,\n content: consolidatedSrc,\n structureChecksum: '',\n result,\n quiet,\n })\n\n // Write per-group outputs\n const groups = Object.keys(grouped) as GroupKey[]\n for (const g of groups) {\n if (!resolver.isMonorepo() && g !== '@app') {\n continue\n }\n\n const pkgOutputDir = resolver.getPackageOutputDir(g)\n // Skip @app group since it writes to the same location as the consolidated output\n if (g === '@app' && pkgOutputDir === outputDir) {\n continue\n }\n const out = path.join(pkgOutputDir, 'entities.ids.generated.ts')\n\n const groupSourceFile = createGeneratedSourceFile(`${String(g)}/entities.ids.generated.ts`)\n addAutoGeneratedComment(groupSourceFile, 'entity-ids')\n groupSourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n { name: 'M', initializer: `${JSON.stringify(groupedModulesDict[g] || {}, null, 2)} as const` },\n { name: 'E', initializer: `${JSON.stringify(grouped[g] || {}, null, 2)} as const` },\n ],\n })\n groupSourceFile.addTypeAlias({\n name: 'KnownModuleId',\n isExported: true,\n type: 'keyof typeof M',\n })\n groupSourceFile.addTypeAlias({\n name: 'KnownEntities',\n isExported: true,\n type: 'typeof E',\n })\n const src = getSourceText(groupSourceFile)\n writeTrackedFile(out, src, result)\n\n const fieldsRoot = path.join(pkgOutputDir, 'entities')\n const fieldsByModule = fieldsByGroup[g] || {}\n const combined: EntityFieldMap = {}\n for (const mId of Object.keys(fieldsByModule)) {\n const mMap = fieldsByModule[mId]\n for (const [entity, fields] of Object.entries(mMap)) {\n combined[entity] = Array.from(new Set([...(combined[entity] || []), ...fields]))\n }\n }\n writePerEntityFieldFiles(fieldsRoot, combined, result)\n\n // Generate static entity fields registry for Turbopack compatibility\n writeEntityFieldsRegistry(pkgOutputDir, combined, result)\n }\n\n // Write combined entity fields to root generated/ folder\n const combinedAll: EntityFieldMap = {}\n for (const groupFields of Object.values(fieldsByGroup)) {\n for (const mMap of Object.values(groupFields)) {\n for (const [entity, fields] of Object.entries(mMap)) {\n combinedAll[entity] = Array.from(new Set([...(combinedAll[entity] || []), ...fields]))\n }\n }\n }\n writePerEntityFieldFiles(path.join(outputDir, 'entities'), combinedAll, result)\n writeEntityFieldsRegistry(outputDir, combinedAll, result)\n\n return result\n}\n\nfunction resolveConventionFile(baseDir: string, basename: string): string | null {\n for (const extension of MODULE_CODE_EXTENSIONS) {\n const candidate = path.join(baseDir, `${basename}${extension}`)\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { getEnabledModuleIdentities } from '../module-identity'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport ts from 'typescript-js'\nimport { VariableDeclarationKind } from 'ts-morph'\nimport type { PackageResolver, ModuleEntry } from '../resolver'\nimport { MODULE_CODE_EXTENSIONS } from './scanner'\nimport {\n toVar,\n toSnake,\n rimrafDir,\n type GeneratorResult,\n createGeneratorResult,\n writeGeneratedFile,\n writeIfChanged,\n} from '../utils'\nimport { addAutoGeneratedComment, createGeneratedSourceFile, elementAccess, getSourceText, identifier, returnStatement } from './ast'\n\ntype GroupKey = '@app' | '@open-mercato/core' | string\ntype EntityFieldMap = Record<string, string[]>\n\nexport interface EntityIdsOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\n/**\n * Extract exported class names from a TypeScript source file without dynamic import.\n * This is used for @app modules since Node.js can't import TypeScript files directly.\n */\nfunction parseExportedClassNamesFromFile(filePath: string): string[] {\n const src = fs.readFileSync(filePath, 'utf8')\n const sf = ts.createSourceFile(filePath, src, ts.ScriptTarget.ES2020, true, ts.ScriptKind.TS)\n const classNames: string[] = []\n\n sf.forEachChild((node) => {\n // Check for exported class declarations\n if (ts.isClassDeclaration(node) && node.name) {\n const hasExport = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n if (hasExport) {\n classNames.push(node.name.text)\n }\n }\n })\n\n return classNames\n}\n\nfunction unwrapObjectLiteralExpression(\n expression: ts.Expression | undefined,\n): ts.ObjectLiteralExpression | undefined {\n if (!expression) return undefined\n if (ts.isObjectLiteralExpression(expression)) return expression\n if (ts.isAsExpression(expression) || ts.isTypeAssertionExpression(expression)) {\n return unwrapObjectLiteralExpression(expression.expression)\n }\n if (ts.isParenthesizedExpression(expression)) {\n return unwrapObjectLiteralExpression(expression.expression)\n }\n return undefined\n}\n\nfunction readPropertyInitializer(\n objectLiteral: ts.ObjectLiteralExpression,\n propertyName: string,\n): ts.Expression | undefined {\n for (const property of objectLiteral.properties) {\n if (!ts.isPropertyAssignment(property)) continue\n const name = ts.isIdentifier(property.name)\n ? property.name.text\n : ts.isStringLiteralLike(property.name)\n ? property.name.text\n : undefined\n if (name === propertyName) {\n return property.initializer\n }\n }\n return undefined\n}\n\nfunction parseGeneratedModuleEntityNames(filePath: string, moduleId: string): string[] {\n if (!fs.existsSync(filePath)) return []\n\n const source = fs.readFileSync(filePath, 'utf8')\n const scriptKind = filePath.endsWith('.js') ? ts.ScriptKind.JS : ts.ScriptKind.TS\n const sf = ts.createSourceFile(filePath, source, ts.ScriptTarget.ES2020, true, scriptKind)\n\n for (const statement of sf.statements) {\n if (!ts.isVariableStatement(statement)) continue\n const declaration = statement.declarationList.declarations.find((candidate) =>\n ts.isIdentifier(candidate.name) && candidate.name.text === 'E')\n if (!declaration) continue\n\n const eObject = unwrapObjectLiteralExpression(declaration.initializer)\n if (!eObject) continue\n\n const moduleObject = unwrapObjectLiteralExpression(readPropertyInitializer(eObject, moduleId))\n if (!moduleObject) return []\n\n const names: string[] = []\n for (const property of moduleObject.properties) {\n if (!ts.isPropertyAssignment(property)) continue\n const name = ts.isIdentifier(property.name)\n ? property.name.text\n : ts.isStringLiteralLike(property.name)\n ? property.name.text\n : undefined\n if (name) names.push(name)\n }\n return names\n }\n\n return []\n}\n\nfunction parseGeneratedEntityFieldsFile(filePath: string): string[] {\n if (!fs.existsSync(filePath)) return []\n\n const source = fs.readFileSync(filePath, 'utf8')\n const scriptKind = filePath.endsWith('.js') ? ts.ScriptKind.JS : ts.ScriptKind.TS\n const sf = ts.createSourceFile(filePath, source, ts.ScriptTarget.ES2020, true, scriptKind)\n const fields: string[] = []\n\n for (const statement of sf.statements) {\n if (!ts.isVariableStatement(statement)) continue\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name) || !declaration.initializer) continue\n if (!ts.isStringLiteralLike(declaration.initializer)) continue\n fields.push(declaration.initializer.text)\n }\n }\n\n return Array.from(new Set(fields))\n}\n\nfunction resolveExistingFile(candidates: string[]): string | null {\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n\nfunction loadStandaloneGeneratedPackageEntities(\n resolver: PackageResolver,\n entry: ModuleEntry,\n): { entityNames: string[]; entityFieldMap: EntityFieldMap } | null {\n if (resolver.isMonorepo() || !entry.from || entry.from === '@app') return null\n\n const packageRoot = resolver.getPackageRoot(entry.from)\n const generatedRoot = fs.existsSync(path.join(packageRoot, 'generated'))\n ? path.join(packageRoot, 'generated')\n : path.join(packageRoot, 'dist', 'generated')\n const idsFile = resolveExistingFile([\n path.join(generatedRoot, 'entities.ids.generated.ts'),\n path.join(generatedRoot, 'entities.ids.generated.js'),\n ])\n if (!idsFile) return null\n const entityNames = parseGeneratedModuleEntityNames(idsFile, entry.id)\n\n if (entityNames.length === 0) return null\n\n const entityFieldMap: EntityFieldMap = {}\n for (const entityName of entityNames) {\n const fieldsFile = resolveExistingFile([\n path.join(generatedRoot, 'entities', entityName, 'index.ts'),\n path.join(generatedRoot, 'entities', entityName, 'index.js'),\n ])\n if (!fieldsFile) continue\n const fields = parseGeneratedEntityFieldsFile(fieldsFile)\n entityFieldMap[entityName] = fields\n }\n\n return { entityNames, entityFieldMap }\n}\n\nfunction parseEntityFieldsFromFile(filePath: string, exportedClassNames: string[]): EntityFieldMap {\n const src = fs.readFileSync(filePath, 'utf8')\n const sf = ts.createSourceFile(filePath, src, ts.ScriptTarget.ES2020, true, ts.ScriptKind.TS)\n\n const exported = new Set(exportedClassNames)\n const result: EntityFieldMap = {}\n\n function getDecoratorArgNameLiteral(dec: ts.Decorator | undefined): string | undefined {\n if (!dec) return undefined\n const expr = dec.expression\n if (!ts.isCallExpression(expr)) return undefined\n if (!expr.arguments.length) return undefined\n const first = expr.arguments[0]\n if (!ts.isObjectLiteralExpression(first)) return undefined\n for (const prop of first.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === 'name') {\n if (ts.isStringLiteral(prop.initializer)) return prop.initializer.text\n }\n }\n return undefined\n }\n\n function normalizeDbName(propertyName: string, _decoratorName?: string, nameOverride?: string): string {\n if (nameOverride) return nameOverride\n return toSnake(propertyName)\n }\n\n sf.forEachChild((node) => {\n if (!ts.isClassDeclaration(node) || !node.name) return\n const clsName = node.name.text\n if (!exported.has(clsName)) return\n const entityKey = toSnake(clsName)\n const fields: string[] = []\n\n for (const member of node.members) {\n if (!ts.isPropertyDeclaration(member) || !member.name) continue\n const name = ts.isIdentifier(member.name)\n ? member.name.text\n : ts.isStringLiteral(member.name)\n ? member.name.text\n : undefined\n if (!name) continue\n if (member.modifiers?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword)) continue\n const decorators = ts.canHaveDecorators(member)\n ? ts.getDecorators(member) ?? []\n : []\n let dbName: string | undefined\n if (decorators && decorators.length) {\n for (const d of decorators) {\n const nameOverride = getDecoratorArgNameLiteral(d)\n dbName = normalizeDbName(name, undefined, nameOverride)\n if (dbName) break\n }\n }\n if (!dbName) dbName = normalizeDbName(name)\n fields.push(dbName)\n }\n result[entityKey] = Array.from(new Set(fields))\n })\n\n return result\n}\n\nfunction writeTrackedFile(\n filePath: string,\n content: string,\n result: GeneratorResult,\n): void {\n if (writeIfChanged(filePath, content)) {\n result.filesWritten.push(filePath)\n } else {\n result.filesUnchanged.push(filePath)\n }\n}\n\nfunction writePerEntityFieldFiles(\n outRoot: string,\n fieldsByEntity: EntityFieldMap,\n result: GeneratorResult,\n): void {\n fs.mkdirSync(outRoot, { recursive: true })\n const desiredEntities = new Set(Object.keys(fieldsByEntity))\n for (const [entity, fields] of Object.entries(fieldsByEntity)) {\n const entDir = path.join(outRoot, entity)\n fs.mkdirSync(entDir, { recursive: true })\n const sourceFile = createGeneratedSourceFile(`${entity}/index.ts`)\n sourceFile.addVariableStatements(fields.map((field) => ({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: toVar(field),\n initializer: JSON.stringify(field),\n },\n ],\n })))\n writeTrackedFile(path.join(entDir, 'index.ts'), getSourceText(sourceFile), result)\n }\n\n const existingEntries = fs.existsSync(outRoot) ? fs.readdirSync(outRoot, { withFileTypes: true }) : []\n for (const entry of existingEntries) {\n if (!entry.isDirectory()) continue\n if (desiredEntities.has(entry.name)) continue\n const staleDirectory = path.join(outRoot, entry.name)\n rimrafDir(staleDirectory)\n result.filesWritten.push(staleDirectory)\n }\n}\n\nfunction writeEntityFieldsRegistry(\n generatedRoot: string,\n fieldsByEntity: EntityFieldMap,\n result: GeneratorResult,\n): void {\n const entities = Object.keys(fieldsByEntity).sort((a, b) => a.localeCompare(b))\n const registry: Record<string, Record<string, string>> = {}\n for (const entity of entities) {\n registry[toVar(entity)] = {}\n for (const field of fieldsByEntity[entity] ?? []) {\n registry[toVar(entity)][toVar(field)] = field\n }\n }\n\n const sourceFile = createGeneratedSourceFile('entity-fields-registry.ts')\n addAutoGeneratedComment(sourceFile, 'entity-ids')\n sourceFile.insertText(sourceFile.getFullText().length, '// Static registry for entity fields - eliminates dynamic imports for Turbopack compatibility\\n')\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: 'entityFieldsRegistry',\n type: 'Record<string, Record<string, string>>',\n initializer: JSON.stringify(registry, null, 2),\n },\n ],\n })\n sourceFile.addFunction({\n name: 'getEntityFields',\n isExported: true,\n parameters: [{ name: 'slug', type: 'string' }],\n returnType: 'Record<string, string> | undefined',\n statements: [returnStatement(elementAccess(identifier('entityFieldsRegistry'), identifier('slug')))],\n })\n const outPath = path.join(generatedRoot, 'entity-fields-registry.ts')\n writeTrackedFile(outPath, getSourceText(sourceFile), result)\n}\n\nexport async function generateEntityIds(options: EntityIdsOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'entities.ids.generated.ts')\n const checksumFile = path.join(outputDir, 'entities.ids.generated.checksum')\n\n const entries = resolver.loadEnabledModules()\n getEnabledModuleIdentities(resolver, entries)\n\n const consolidated: Record<string, Record<string, string>> = {}\n const grouped: Record<GroupKey, Record<string, Record<string, string>>> = {}\n const modulesDict: Record<string, string> = {}\n const groupedModulesDict: Record<GroupKey, Record<string, string>> = {}\n\n const fieldsByGroup: Record<GroupKey, Record<string, EntityFieldMap>> = {}\n\n for (const entry of entries) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n const group: GroupKey = (entry.from as GroupKey) || '@open-mercato/core'\n\n const standaloneGeneratedPackageEntities = loadStandaloneGeneratedPackageEntities(resolver, entry)\n\n // Locate entities definition file (prefer app override)\n const appData = path.join(roots.appBase, 'data')\n const pkgData = path.join(roots.pkgBase, 'data')\n const appDb = path.join(roots.appBase, 'db')\n const pkgDb = path.join(roots.pkgBase, 'db')\n const bases = [appData, pkgData, appDb, pkgDb]\n const candidates = ['entities.override', 'entities', 'schema']\n let importPath: string | null = null\n let filePath: string | null = null\n\n for (const base of bases) {\n for (const f of candidates) {\n const p = resolveConventionFile(base, f)\n if (p) {\n const fromApp = base.startsWith(roots.appBase)\n const sub = path.basename(base) // 'data' | 'db'\n importPath = `${fromApp ? imps.appBase : imps.pkgBase}/${sub}/${f}`\n filePath = p\n break\n }\n }\n if (importPath) break\n }\n\n // No entities file found -> still register module id\n if (!filePath && !standaloneGeneratedPackageEntities) {\n modulesDict[modId] = modId\n groupedModulesDict[group] = groupedModulesDict[group] || {}\n groupedModulesDict[group][modId] = modId\n continue\n }\n\n const exportNames = filePath ? parseExportedClassNamesFromFile(filePath) : []\n\n const entityNames = standaloneGeneratedPackageEntities\n ? standaloneGeneratedPackageEntities.entityNames\n : exportNames\n .map((k) => toSnake(k))\n .filter((k, idx, arr) => arr.indexOf(k) === idx)\n\n // Build dictionaries\n modulesDict[modId] = modId\n groupedModulesDict[group] = groupedModulesDict[group] || {}\n groupedModulesDict[group][modId] = modId\n\n consolidated[modId] = consolidated[modId] || {}\n grouped[group] = grouped[group] || {}\n grouped[group][modId] = grouped[group][modId] || {}\n\n for (const en of entityNames) {\n consolidated[modId][en] = `${modId}:${en}`\n grouped[group][modId][en] = `${modId}:${en}`\n }\n\n // Parse entity fields from TypeScript source\n const entityFieldMap = standaloneGeneratedPackageEntities\n ? standaloneGeneratedPackageEntities.entityFieldMap\n : parseEntityFieldsFromFile(filePath!, exportNames)\n fieldsByGroup[group] = fieldsByGroup[group] || {}\n fieldsByGroup[group][modId] = entityFieldMap\n }\n\n // Write consolidated output\n const consolidatedSourceFile = createGeneratedSourceFile('entities.ids.generated.ts')\n addAutoGeneratedComment(consolidatedSourceFile, 'entity-ids')\n consolidatedSourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n { name: 'M', initializer: `${JSON.stringify(modulesDict, null, 2)} as const` },\n { name: 'E', initializer: `${JSON.stringify(consolidated, null, 2)} as const` },\n ],\n })\n consolidatedSourceFile.addTypeAlias({\n name: 'KnownModuleId',\n isExported: true,\n type: 'keyof typeof M',\n })\n consolidatedSourceFile.addTypeAlias({\n name: 'KnownEntities',\n isExported: true,\n type: 'typeof E',\n })\n const consolidatedSrc = getSourceText(consolidatedSourceFile)\n\n writeGeneratedFile({\n outFile,\n checksumFile,\n content: consolidatedSrc,\n structureChecksum: '',\n result,\n quiet,\n })\n\n // Write per-group outputs\n const groups = Object.keys(grouped) as GroupKey[]\n for (const g of groups) {\n if (!resolver.isMonorepo() && g !== '@app') {\n continue\n }\n\n const pkgOutputDir = resolver.getPackageOutputDir(g)\n // Skip @app group since it writes to the same location as the consolidated output\n if (g === '@app' && pkgOutputDir === outputDir) {\n continue\n }\n const out = path.join(pkgOutputDir, 'entities.ids.generated.ts')\n\n const groupSourceFile = createGeneratedSourceFile(`${String(g)}/entities.ids.generated.ts`)\n addAutoGeneratedComment(groupSourceFile, 'entity-ids')\n groupSourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n { name: 'M', initializer: `${JSON.stringify(groupedModulesDict[g] || {}, null, 2)} as const` },\n { name: 'E', initializer: `${JSON.stringify(grouped[g] || {}, null, 2)} as const` },\n ],\n })\n groupSourceFile.addTypeAlias({\n name: 'KnownModuleId',\n isExported: true,\n type: 'keyof typeof M',\n })\n groupSourceFile.addTypeAlias({\n name: 'KnownEntities',\n isExported: true,\n type: 'typeof E',\n })\n const src = getSourceText(groupSourceFile)\n writeTrackedFile(out, src, result)\n\n const fieldsRoot = path.join(pkgOutputDir, 'entities')\n const fieldsByModule = fieldsByGroup[g] || {}\n const combined: EntityFieldMap = {}\n for (const mId of Object.keys(fieldsByModule)) {\n const mMap = fieldsByModule[mId]\n for (const [entity, fields] of Object.entries(mMap)) {\n combined[entity] = Array.from(new Set([...(combined[entity] || []), ...fields]))\n }\n }\n writePerEntityFieldFiles(fieldsRoot, combined, result)\n\n // Generate static entity fields registry for Turbopack compatibility\n writeEntityFieldsRegistry(pkgOutputDir, combined, result)\n }\n\n // Write combined entity fields to root generated/ folder\n const combinedAll: EntityFieldMap = {}\n for (const groupFields of Object.values(fieldsByGroup)) {\n for (const mMap of Object.values(groupFields)) {\n for (const [entity, fields] of Object.entries(mMap)) {\n combinedAll[entity] = Array.from(new Set([...(combinedAll[entity] || []), ...fields]))\n }\n }\n }\n writePerEntityFieldFiles(path.join(outputDir, 'entities'), combinedAll, result)\n writeEntityFieldsRegistry(outputDir, combinedAll, result)\n\n return result\n}\n\nfunction resolveConventionFile(baseDir: string, basename: string): string | null {\n for (const extension of MODULE_CODE_EXTENSIONS) {\n const candidate = path.join(baseDir, `${basename}${extension}`)\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n"],
5
+ "mappings": "AAAA,SAAS,kCAAkC;AAC3C,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,+BAA+B;AAExC,SAAS,8BAA8B;AACvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,yBAAyB,2BAA2B,eAAe,eAAe,YAAY,uBAAuB;AAc9H,SAAS,gCAAgC,UAA4B;AACnE,QAAM,MAAM,GAAG,aAAa,UAAU,MAAM;AAC5C,QAAM,KAAK,GAAG,iBAAiB,UAAU,KAAK,GAAG,aAAa,QAAQ,MAAM,GAAG,WAAW,EAAE;AAC5F,QAAM,aAAuB,CAAC;AAE9B,KAAG,aAAa,CAAC,SAAS;AAExB,QAAI,GAAG,mBAAmB,IAAI,KAAK,KAAK,MAAM;AAC5C,YAAM,YAAY,KAAK,WAAW;AAAA,QAChC,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW;AAAA,MAClC;AACA,UAAI,WAAW;AACb,mBAAW,KAAK,KAAK,KAAK,IAAI;AAAA,MAChC;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,8BACP,YACwC;AACxC,MAAI,CAAC,WAAY,QAAO;AACxB,MAAI,GAAG,0BAA0B,UAAU,EAAG,QAAO;AACrD,MAAI,GAAG,eAAe,UAAU,KAAK,GAAG,0BAA0B,UAAU,GAAG;AAC7E,WAAO,8BAA8B,WAAW,UAAU;AAAA,EAC5D;AACA,MAAI,GAAG,0BAA0B,UAAU,GAAG;AAC5C,WAAO,8BAA8B,WAAW,UAAU;AAAA,EAC5D;AACA,SAAO;AACT;AAEA,SAAS,wBACP,eACA,cAC2B;AAC3B,aAAW,YAAY,cAAc,YAAY;AAC/C,QAAI,CAAC,GAAG,qBAAqB,QAAQ,EAAG;AACxC,UAAM,OAAO,GAAG,aAAa,SAAS,IAAI,IACtC,SAAS,KAAK,OACd,GAAG,oBAAoB,SAAS,IAAI,IAClC,SAAS,KAAK,OACd;AACN,QAAI,SAAS,cAAc;AACzB,aAAO,SAAS;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gCAAgC,UAAkB,UAA4B;AACrF,MAAI,CAAC,GAAG,WAAW,QAAQ,EAAG,QAAO,CAAC;AAEtC,QAAM,SAAS,GAAG,aAAa,UAAU,MAAM;AAC/C,QAAM,aAAa,SAAS,SAAS,KAAK,IAAI,GAAG,WAAW,KAAK,GAAG,WAAW;AAC/E,QAAM,KAAK,GAAG,iBAAiB,UAAU,QAAQ,GAAG,aAAa,QAAQ,MAAM,UAAU;AAEzF,aAAW,aAAa,GAAG,YAAY;AACrC,QAAI,CAAC,GAAG,oBAAoB,SAAS,EAAG;AACxC,UAAM,cAAc,UAAU,gBAAgB,aAAa,KAAK,CAAC,cAC/D,GAAG,aAAa,UAAU,IAAI,KAAK,UAAU,KAAK,SAAS,GAAG;AAChE,QAAI,CAAC,YAAa;AAElB,UAAM,UAAU,8BAA8B,YAAY,WAAW;AACrE,QAAI,CAAC,QAAS;AAEd,UAAM,eAAe,8BAA8B,wBAAwB,SAAS,QAAQ,CAAC;AAC7F,QAAI,CAAC,aAAc,QAAO,CAAC;AAE3B,UAAM,QAAkB,CAAC;AACzB,eAAW,YAAY,aAAa,YAAY;AAC9C,UAAI,CAAC,GAAG,qBAAqB,QAAQ,EAAG;AACxC,YAAM,OAAO,GAAG,aAAa,SAAS,IAAI,IACtC,SAAS,KAAK,OACd,GAAG,oBAAoB,SAAS,IAAI,IAClC,SAAS,KAAK,OACd;AACN,UAAI,KAAM,OAAM,KAAK,IAAI;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,+BAA+B,UAA4B;AAClE,MAAI,CAAC,GAAG,WAAW,QAAQ,EAAG,QAAO,CAAC;AAEtC,QAAM,SAAS,GAAG,aAAa,UAAU,MAAM;AAC/C,QAAM,aAAa,SAAS,SAAS,KAAK,IAAI,GAAG,WAAW,KAAK,GAAG,WAAW;AAC/E,QAAM,KAAK,GAAG,iBAAiB,UAAU,QAAQ,GAAG,aAAa,QAAQ,MAAM,UAAU;AACzF,QAAM,SAAmB,CAAC;AAE1B,aAAW,aAAa,GAAG,YAAY;AACrC,QAAI,CAAC,GAAG,oBAAoB,SAAS,EAAG;AACxC,eAAW,eAAe,UAAU,gBAAgB,cAAc;AAChE,UAAI,CAAC,GAAG,aAAa,YAAY,IAAI,KAAK,CAAC,YAAY,YAAa;AACpE,UAAI,CAAC,GAAG,oBAAoB,YAAY,WAAW,EAAG;AACtD,aAAO,KAAK,YAAY,YAAY,IAAI;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AACnC;AAEA,SAAS,oBAAoB,YAAqC;AAChE,aAAW,aAAa,YAAY;AAClC,QAAI,GAAG,WAAW,SAAS,EAAG,QAAO;AAAA,EACvC;AACA,SAAO;AACT;AAEA,SAAS,uCACP,UACA,OACkE;AAClE,MAAI,SAAS,WAAW,KAAK,CAAC,MAAM,QAAQ,MAAM,SAAS,OAAQ,QAAO;AAE1E,QAAM,cAAc,SAAS,eAAe,MAAM,IAAI;AACtD,QAAM,gBAAgB,GAAG,WAAW,KAAK,KAAK,aAAa,WAAW,CAAC,IACnE,KAAK,KAAK,aAAa,WAAW,IAClC,KAAK,KAAK,aAAa,QAAQ,WAAW;AAC9C,QAAM,UAAU,oBAAoB;AAAA,IAClC,KAAK,KAAK,eAAe,2BAA2B;AAAA,IACpD,KAAK,KAAK,eAAe,2BAA2B;AAAA,EACtD,CAAC;AACD,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,cAAc,gCAAgC,SAAS,MAAM,EAAE;AAErE,MAAI,YAAY,WAAW,EAAG,QAAO;AAErC,QAAM,iBAAiC,CAAC;AACxC,aAAW,cAAc,aAAa;AACpC,UAAM,aAAa,oBAAoB;AAAA,MACrC,KAAK,KAAK,eAAe,YAAY,YAAY,UAAU;AAAA,MAC3D,KAAK,KAAK,eAAe,YAAY,YAAY,UAAU;AAAA,IAC7D,CAAC;AACD,QAAI,CAAC,WAAY;AACjB,UAAM,SAAS,+BAA+B,UAAU;AACxD,mBAAe,UAAU,IAAI;AAAA,EAC/B;AAEA,SAAO,EAAE,aAAa,eAAe;AACvC;AAEA,SAAS,0BAA0B,UAAkB,oBAA8C;AACjG,QAAM,MAAM,GAAG,aAAa,UAAU,MAAM;AAC5C,QAAM,KAAK,GAAG,iBAAiB,UAAU,KAAK,GAAG,aAAa,QAAQ,MAAM,GAAG,WAAW,EAAE;AAE5F,QAAM,WAAW,IAAI,IAAI,kBAAkB;AAC3C,QAAM,SAAyB,CAAC;AAEhC,WAAS,2BAA2B,KAAmD;AACrF,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,OAAO,IAAI;AACjB,QAAI,CAAC,GAAG,iBAAiB,IAAI,EAAG,QAAO;AACvC,QAAI,CAAC,KAAK,UAAU,OAAQ,QAAO;AACnC,UAAM,QAAQ,KAAK,UAAU,CAAC;AAC9B,QAAI,CAAC,GAAG,0BAA0B,KAAK,EAAG,QAAO;AACjD,eAAW,QAAQ,MAAM,YAAY;AACnC,UAAI,GAAG,qBAAqB,IAAI,KAAK,GAAG,aAAa,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,QAAQ;AAC5F,YAAI,GAAG,gBAAgB,KAAK,WAAW,EAAG,QAAO,KAAK,YAAY;AAAA,MACpE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB,cAAsB,gBAAyB,cAA+B;AACrG,QAAI,aAAc,QAAO;AACzB,WAAO,QAAQ,YAAY;AAAA,EAC7B;AAEA,KAAG,aAAa,CAAC,SAAS;AACxB,QAAI,CAAC,GAAG,mBAAmB,IAAI,KAAK,CAAC,KAAK,KAAM;AAChD,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,SAAS,IAAI,OAAO,EAAG;AAC5B,UAAM,YAAY,QAAQ,OAAO;AACjC,UAAM,SAAmB,CAAC;AAE1B,eAAW,UAAU,KAAK,SAAS;AACjC,UAAI,CAAC,GAAG,sBAAsB,MAAM,KAAK,CAAC,OAAO,KAAM;AACvD,YAAM,OAAO,GAAG,aAAa,OAAO,IAAI,IACpC,OAAO,KAAK,OACZ,GAAG,gBAAgB,OAAO,IAAI,IAC5B,OAAO,KAAK,OACZ;AACN,UAAI,CAAC,KAAM;AACX,UAAI,OAAO,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,aAAa,EAAG;AAC3E,YAAM,aAAa,GAAG,kBAAkB,MAAM,IAC1C,GAAG,cAAc,MAAM,KAAK,CAAC,IAC7B,CAAC;AACL,UAAI;AACJ,UAAI,cAAc,WAAW,QAAQ;AACnC,mBAAW,KAAK,YAAY;AAC1B,gBAAM,eAAe,2BAA2B,CAAC;AACjD,mBAAS,gBAAgB,MAAM,QAAW,YAAY;AACtD,cAAI,OAAQ;AAAA,QACd;AAAA,MACF;AACA,UAAI,CAAC,OAAQ,UAAS,gBAAgB,IAAI;AAC1C,aAAO,KAAK,MAAM;AAAA,IACpB;AACA,WAAO,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AAAA,EAChD,CAAC;AAED,SAAO;AACT;AAEA,SAAS,iBACP,UACA,SACA,QACM;AACN,MAAI,eAAe,UAAU,OAAO,GAAG;AACrC,WAAO,aAAa,KAAK,QAAQ;AAAA,EACnC,OAAO;AACL,WAAO,eAAe,KAAK,QAAQ;AAAA,EACrC;AACF;AAEA,SAAS,yBACP,SACA,gBACA,QACM;AACN,KAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACzC,QAAM,kBAAkB,IAAI,IAAI,OAAO,KAAK,cAAc,CAAC;AAC3D,aAAW,CAAC,QAAQ,MAAM,KAAK,OAAO,QAAQ,cAAc,GAAG;AAC7D,UAAM,SAAS,KAAK,KAAK,SAAS,MAAM;AACxC,OAAG,UAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AACxC,UAAM,aAAa,0BAA0B,GAAG,MAAM,WAAW;AACjE,eAAW,sBAAsB,OAAO,IAAI,CAAC,WAAW;AAAA,MACtD,iBAAiB,wBAAwB;AAAA,MACzC,YAAY;AAAA,MACZ,cAAc;AAAA,QACZ;AAAA,UACE,MAAM,MAAM,KAAK;AAAA,UACjB,aAAa,KAAK,UAAU,KAAK;AAAA,QACnC;AAAA,MACF;AAAA,IACF,EAAE,CAAC;AACH,qBAAiB,KAAK,KAAK,QAAQ,UAAU,GAAG,cAAc,UAAU,GAAG,MAAM;AAAA,EACnF;AAEA,QAAM,kBAAkB,GAAG,WAAW,OAAO,IAAI,GAAG,YAAY,SAAS,EAAE,eAAe,KAAK,CAAC,IAAI,CAAC;AACrG,aAAW,SAAS,iBAAiB;AACnC,QAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,QAAI,gBAAgB,IAAI,MAAM,IAAI,EAAG;AACrC,UAAM,iBAAiB,KAAK,KAAK,SAAS,MAAM,IAAI;AACpD,cAAU,cAAc;AACxB,WAAO,aAAa,KAAK,cAAc;AAAA,EACzC;AACF;AAEA,SAAS,0BACP,eACA,gBACA,QACM;AACN,QAAM,WAAW,OAAO,KAAK,cAAc,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAC9E,QAAM,WAAmD,CAAC;AAC1D,aAAW,UAAU,UAAU;AAC7B,aAAS,MAAM,MAAM,CAAC,IAAI,CAAC;AAC3B,eAAW,SAAS,eAAe,MAAM,KAAK,CAAC,GAAG;AAChD,eAAS,MAAM,MAAM,CAAC,EAAE,MAAM,KAAK,CAAC,IAAI;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,aAAa,0BAA0B,2BAA2B;AACxE,0BAAwB,YAAY,YAAY;AAChD,aAAW,WAAW,WAAW,YAAY,EAAE,QAAQ,iGAAiG;AACxJ,aAAW,qBAAqB;AAAA,IAC9B,iBAAiB,wBAAwB;AAAA,IACzC,YAAY;AAAA,IACZ,cAAc;AAAA,MACZ;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF,CAAC;AACD,aAAW,YAAY;AAAA,IACrB,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,YAAY,CAAC,EAAE,MAAM,QAAQ,MAAM,SAAS,CAAC;AAAA,IAC7C,YAAY;AAAA,IACZ,YAAY,CAAC,gBAAgB,cAAc,WAAW,sBAAsB,GAAG,WAAW,MAAM,CAAC,CAAC,CAAC;AAAA,EACrG,CAAC;AACD,QAAM,UAAU,KAAK,KAAK,eAAe,2BAA2B;AACpE,mBAAiB,SAAS,cAAc,UAAU,GAAG,MAAM;AAC7D;AAEA,eAAsB,kBAAkB,SAAqD;AAC3F,QAAM,EAAE,UAAU,QAAQ,MAAM,IAAI;AACpC,QAAM,SAAS,sBAAsB;AAErC,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,UAAU,KAAK,KAAK,WAAW,2BAA2B;AAChE,QAAM,eAAe,KAAK,KAAK,WAAW,iCAAiC;AAE3E,QAAM,UAAU,SAAS,mBAAmB;AAC5C,6BAA2B,UAAU,OAAO;AAE5C,QAAM,eAAuD,CAAC;AAC9D,QAAM,UAAoE,CAAC;AAC3E,QAAM,cAAsC,CAAC;AAC7C,QAAM,qBAA+D,CAAC;AAEtE,QAAM,gBAAkE,CAAC;AAEzE,aAAW,SAAS,SAAS;AAC3B,UAAM,QAAQ,MAAM;AACpB,UAAM,QAAQ,SAAS,eAAe,KAAK;AAC3C,UAAM,OAAO,SAAS,oBAAoB,KAAK;AAC/C,UAAM,QAAmB,MAAM,QAAqB;AAEpD,UAAM,qCAAqC,uCAAuC,UAAU,KAAK;AAGjG,UAAM,UAAU,KAAK,KAAK,MAAM,SAAS,MAAM;AAC/C,UAAM,UAAU,KAAK,KAAK,MAAM,SAAS,MAAM;AAC/C,UAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,IAAI;AAC3C,UAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,IAAI;AAC3C,UAAM,QAAQ,CAAC,SAAS,SAAS,OAAO,KAAK;AAC7C,UAAM,aAAa,CAAC,qBAAqB,YAAY,QAAQ;AAC7D,QAAI,aAA4B;AAChC,QAAI,WAA0B;AAE9B,eAAW,QAAQ,OAAO;AACxB,iBAAW,KAAK,YAAY;AAC1B,cAAM,IAAI,sBAAsB,MAAM,CAAC;AACvC,YAAI,GAAG;AACL,gBAAM,UAAU,KAAK,WAAW,MAAM,OAAO;AAC7C,gBAAM,MAAM,KAAK,SAAS,IAAI;AAC9B,uBAAa,GAAG,UAAU,KAAK,UAAU,KAAK,OAAO,IAAI,GAAG,IAAI,CAAC;AACjE,qBAAW;AACX;AAAA,QACF;AAAA,MACF;AACA,UAAI,WAAY;AAAA,IAClB;AAGA,QAAI,CAAC,YAAY,CAAC,oCAAoC;AACpD,kBAAY,KAAK,IAAI;AACrB,yBAAmB,KAAK,IAAI,mBAAmB,KAAK,KAAK,CAAC;AAC1D,yBAAmB,KAAK,EAAE,KAAK,IAAI;AACnC;AAAA,IACF;AAEA,UAAM,cAAc,WAAW,gCAAgC,QAAQ,IAAI,CAAC;AAE5E,UAAM,cAAc,qCAChB,mCAAmC,cACnC,YACC,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,EACrB,OAAO,CAAC,GAAG,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG;AAGnD,gBAAY,KAAK,IAAI;AACrB,uBAAmB,KAAK,IAAI,mBAAmB,KAAK,KAAK,CAAC;AAC1D,uBAAmB,KAAK,EAAE,KAAK,IAAI;AAEnC,iBAAa,KAAK,IAAI,aAAa,KAAK,KAAK,CAAC;AAC9C,YAAQ,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AACpC,YAAQ,KAAK,EAAE,KAAK,IAAI,QAAQ,KAAK,EAAE,KAAK,KAAK,CAAC;AAElD,eAAW,MAAM,aAAa;AAC5B,mBAAa,KAAK,EAAE,EAAE,IAAI,GAAG,KAAK,IAAI,EAAE;AACxC,cAAQ,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,GAAG,KAAK,IAAI,EAAE;AAAA,IAC5C;AAGA,UAAM,iBAAiB,qCACnB,mCAAmC,iBACnC,0BAA0B,UAAW,WAAW;AACpD,kBAAc,KAAK,IAAI,cAAc,KAAK,KAAK,CAAC;AAChD,kBAAc,KAAK,EAAE,KAAK,IAAI;AAAA,EAChC;AAGA,QAAM,yBAAyB,0BAA0B,2BAA2B;AACpF,0BAAwB,wBAAwB,YAAY;AAC5D,yBAAuB,qBAAqB;AAAA,IAC1C,iBAAiB,wBAAwB;AAAA,IACzC,YAAY;AAAA,IACZ,cAAc;AAAA,MACZ,EAAE,MAAM,KAAK,aAAa,GAAG,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC,YAAY;AAAA,MAC7E,EAAE,MAAM,KAAK,aAAa,GAAG,KAAK,UAAU,cAAc,MAAM,CAAC,CAAC,YAAY;AAAA,IAChF;AAAA,EACF,CAAC;AACD,yBAAuB,aAAa;AAAA,IAClC,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,MAAM;AAAA,EACR,CAAC;AACD,yBAAuB,aAAa;AAAA,IAClC,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,MAAM;AAAA,EACR,CAAC;AACD,QAAM,kBAAkB,cAAc,sBAAsB;AAE5D,qBAAmB;AAAA,IACjB;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,OAAO,KAAK,OAAO;AAClC,aAAW,KAAK,QAAQ;AACtB,QAAI,CAAC,SAAS,WAAW,KAAK,MAAM,QAAQ;AAC1C;AAAA,IACF;AAEA,UAAM,eAAe,SAAS,oBAAoB,CAAC;AAEnD,QAAI,MAAM,UAAU,iBAAiB,WAAW;AAC9C;AAAA,IACF;AACA,UAAM,MAAM,KAAK,KAAK,cAAc,2BAA2B;AAE/D,UAAM,kBAAkB,0BAA0B,GAAG,OAAO,CAAC,CAAC,4BAA4B;AAC1F,4BAAwB,iBAAiB,YAAY;AACrD,oBAAgB,qBAAqB;AAAA,MACnC,iBAAiB,wBAAwB;AAAA,MACzC,YAAY;AAAA,MACZ,cAAc;AAAA,QACZ,EAAE,MAAM,KAAK,aAAa,GAAG,KAAK,UAAU,mBAAmB,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,YAAY;AAAA,QAC7F,EAAE,MAAM,KAAK,aAAa,GAAG,KAAK,UAAU,QAAQ,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,YAAY;AAAA,MACpF;AAAA,IACF,CAAC;AACD,oBAAgB,aAAa;AAAA,MAC3B,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AACD,oBAAgB,aAAa;AAAA,MAC3B,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AACD,UAAM,MAAM,cAAc,eAAe;AACzC,qBAAiB,KAAK,KAAK,MAAM;AAEjC,UAAM,aAAa,KAAK,KAAK,cAAc,UAAU;AACrD,UAAM,iBAAiB,cAAc,CAAC,KAAK,CAAC;AAC5C,UAAM,WAA2B,CAAC;AAClC,eAAW,OAAO,OAAO,KAAK,cAAc,GAAG;AAC7C,YAAM,OAAO,eAAe,GAAG;AAC/B,iBAAW,CAAC,QAAQ,MAAM,KAAK,OAAO,QAAQ,IAAI,GAAG;AACnD,iBAAS,MAAM,IAAI,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAI,SAAS,MAAM,KAAK,CAAC,GAAI,GAAG,MAAM,CAAC,CAAC;AAAA,MACjF;AAAA,IACF;AACA,6BAAyB,YAAY,UAAU,MAAM;AAGrD,8BAA0B,cAAc,UAAU,MAAM;AAAA,EAC1D;AAGA,QAAM,cAA8B,CAAC;AACrC,aAAW,eAAe,OAAO,OAAO,aAAa,GAAG;AACtD,eAAW,QAAQ,OAAO,OAAO,WAAW,GAAG;AAC7C,iBAAW,CAAC,QAAQ,MAAM,KAAK,OAAO,QAAQ,IAAI,GAAG;AACnD,oBAAY,MAAM,IAAI,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAI,YAAY,MAAM,KAAK,CAAC,GAAI,GAAG,MAAM,CAAC,CAAC;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AACA,2BAAyB,KAAK,KAAK,WAAW,UAAU,GAAG,aAAa,MAAM;AAC9E,4BAA0B,WAAW,aAAa,MAAM;AAExD,SAAO;AACT;AAEA,SAAS,sBAAsB,SAAiB,UAAiC;AAC/E,aAAW,aAAa,wBAAwB;AAC9C,UAAM,YAAY,KAAK,KAAK,SAAS,GAAG,QAAQ,GAAG,SAAS,EAAE;AAC9D,QAAI,GAAG,WAAW,SAAS,EAAG,QAAO;AAAA,EACvC;AACA,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -1,3 +1,4 @@
1
+ import { getEnabledModuleIdentities } from "../module-identity.js";
1
2
  import fs from "node:fs";
2
3
  import path from "node:path";
3
4
  import { VariableDeclarationKind } from "ts-morph";
@@ -24,6 +25,7 @@ async function generateModuleDi(options) {
24
25
  const outFile = path.join(outputDir, "di.generated.ts");
25
26
  const checksumFile = path.join(outputDir, "di.generated.checksum");
26
27
  const mods = resolver.loadEnabledModules();
28
+ getEnabledModuleIdentities(resolver, mods);
27
29
  const imports = [];
28
30
  const registrars = [];
29
31
  let i = 0;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/generators/module-di.ts"],
4
- "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport { VariableDeclarationKind } from 'ts-morph'\nimport type { PackageResolver } from '../resolver'\nimport { MODULE_CODE_EXTENSIONS } from './scanner'\nimport {\n toVar,\n type GeneratorResult,\n createGeneratorResult,\n writeGeneratedFile,\n} from '../utils'\nimport {\n addAutoGeneratedComment,\n addImportSpecs,\n arrayLiteral,\n createGeneratedSourceFile,\n getSourceText,\n identifier,\n methodCall,\n parenthesized,\n} from './ast'\n\nexport interface ModuleDiOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\nexport async function generateModuleDi(options: ModuleDiOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'di.generated.ts')\n const checksumFile = path.join(outputDir, 'di.generated.checksum')\n\n const mods = resolver.loadEnabledModules()\n const imports: Array<{ name: string; moduleSpecifier: string }> = []\n const registrars: string[] = []\n let i = 0\n\n for (const entry of mods) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imp = resolver.getModuleImportBase(entry)\n const isAppModule = entry.from === '@app'\n\n const useApp = resolveModuleConventionFile(roots.appBase, 'di')\n const usePkg = resolveModuleConventionFile(roots.pkgBase, 'di')\n const importName = `D_${toVar(modId)}_${i++}`\n\n if (useApp) {\n warnIfDiMissingRegisterExport(findModuleConventionFilePath(roots.appBase, 'di'), quiet)\n // For @app modules, use relative path to work in both Next.js and Node.js CLI context\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n const importPath = isAppModule ? `../../src/modules/${modId}/di` : `${imp.appBase}/di`\n imports.push({ name: importName, moduleSpecifier: importPath })\n registrars.push(`${importName}.register`)\n } else if (usePkg) {\n warnIfDiMissingRegisterExport(findModuleConventionFilePath(roots.pkgBase, 'di'), quiet)\n imports.push({ name: importName, moduleSpecifier: `${imp.pkgBase}/di` })\n registrars.push(`${importName}.register`)\n }\n }\n\n const sourceFile = createGeneratedSourceFile('di.generated.ts')\n addAutoGeneratedComment(sourceFile, 'di')\n addImportSpecs(sourceFile, imports.map((entry) => ({\n namespaceImport: entry.name,\n moduleSpecifier: entry.moduleSpecifier,\n })))\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n declarations: [\n {\n name: 'diRegistrars',\n type: '(((c: any) => void) | undefined)[]',\n initializer: methodCall(\n parenthesized(arrayLiteral(registrars, (currentWriter, registrar) => identifier(registrar)(currentWriter))),\n 'filter',\n [identifier('Boolean')],\n ),\n },\n ],\n })\n sourceFile.addExportDeclaration({\n namedExports: ['diRegistrars'],\n })\n sourceFile.addExportAssignment({\n isExportEquals: false,\n expression: 'diRegistrars',\n })\n const output = getSourceText(sourceFile)\n\n writeGeneratedFile({\n outFile,\n checksumFile,\n content: output,\n structureChecksum: '',\n result,\n quiet,\n })\n\n return result\n}\n\nfunction resolveModuleConventionFile(baseDir: string, basename: string): boolean {\n return MODULE_CODE_EXTENSIONS.some((extension) => fs.existsSync(path.join(baseDir, `${basename}${extension}`)))\n}\n\nfunction findModuleConventionFilePath(baseDir: string, basename: string): string | null {\n for (const extension of MODULE_CODE_EXTENSIONS) {\n const candidate = path.join(baseDir, `${basename}${extension}`)\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n\n/**\n * Warns when a discovered `di.ts` exports no `register`.\n *\n * The generated registrar list is built from `<import>.register` for every module that has a\n * `di` file. A differently named export makes that entry `undefined`, so the module's DI\n * registrations silently never run and its services surface as missing at request time\n * instead of at generation time.\n */\nexport function warnIfDiMissingRegisterExport(diPath: string | null, quiet = false): void {\n if (!diPath || quiet) return\n let source = ''\n try {\n source = fs.readFileSync(diPath, 'utf8')\n } catch {\n return\n }\n const exportsRegister = /export\\s+(async\\s+)?function\\s+register\\b/.test(source)\n || /export\\s+(const|let|var)\\s+register\\b/.test(source)\n || /export\\s*\\{[^}]*\\bregister\\b[^}]*\\}/.test(source)\n if (exportsRegister) return\n console.warn(\n `[generate] \u26A0 di.ts exports no 'register' \u2014 this module's DI registrations will never run: ${diPath}`,\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { getEnabledModuleIdentities } from '../module-identity'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { VariableDeclarationKind } from 'ts-morph'\nimport type { PackageResolver } from '../resolver'\nimport { MODULE_CODE_EXTENSIONS } from './scanner'\nimport {\n toVar,\n type GeneratorResult,\n createGeneratorResult,\n writeGeneratedFile,\n} from '../utils'\nimport {\n addAutoGeneratedComment,\n addImportSpecs,\n arrayLiteral,\n createGeneratedSourceFile,\n getSourceText,\n identifier,\n methodCall,\n parenthesized,\n} from './ast'\n\nexport interface ModuleDiOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\nexport async function generateModuleDi(options: ModuleDiOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'di.generated.ts')\n const checksumFile = path.join(outputDir, 'di.generated.checksum')\n\n const mods = resolver.loadEnabledModules()\n getEnabledModuleIdentities(resolver, mods)\n const imports: Array<{ name: string; moduleSpecifier: string }> = []\n const registrars: string[] = []\n let i = 0\n\n for (const entry of mods) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imp = resolver.getModuleImportBase(entry)\n const isAppModule = entry.from === '@app'\n\n const useApp = resolveModuleConventionFile(roots.appBase, 'di')\n const usePkg = resolveModuleConventionFile(roots.pkgBase, 'di')\n const importName = `D_${toVar(modId)}_${i++}`\n\n if (useApp) {\n warnIfDiMissingRegisterExport(findModuleConventionFilePath(roots.appBase, 'di'), quiet)\n // For @app modules, use relative path to work in both Next.js and Node.js CLI context\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n const importPath = isAppModule ? `../../src/modules/${modId}/di` : `${imp.appBase}/di`\n imports.push({ name: importName, moduleSpecifier: importPath })\n registrars.push(`${importName}.register`)\n } else if (usePkg) {\n warnIfDiMissingRegisterExport(findModuleConventionFilePath(roots.pkgBase, 'di'), quiet)\n imports.push({ name: importName, moduleSpecifier: `${imp.pkgBase}/di` })\n registrars.push(`${importName}.register`)\n }\n }\n\n const sourceFile = createGeneratedSourceFile('di.generated.ts')\n addAutoGeneratedComment(sourceFile, 'di')\n addImportSpecs(sourceFile, imports.map((entry) => ({\n namespaceImport: entry.name,\n moduleSpecifier: entry.moduleSpecifier,\n })))\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n declarations: [\n {\n name: 'diRegistrars',\n type: '(((c: any) => void) | undefined)[]',\n initializer: methodCall(\n parenthesized(arrayLiteral(registrars, (currentWriter, registrar) => identifier(registrar)(currentWriter))),\n 'filter',\n [identifier('Boolean')],\n ),\n },\n ],\n })\n sourceFile.addExportDeclaration({\n namedExports: ['diRegistrars'],\n })\n sourceFile.addExportAssignment({\n isExportEquals: false,\n expression: 'diRegistrars',\n })\n const output = getSourceText(sourceFile)\n\n writeGeneratedFile({\n outFile,\n checksumFile,\n content: output,\n structureChecksum: '',\n result,\n quiet,\n })\n\n return result\n}\n\nfunction resolveModuleConventionFile(baseDir: string, basename: string): boolean {\n return MODULE_CODE_EXTENSIONS.some((extension) => fs.existsSync(path.join(baseDir, `${basename}${extension}`)))\n}\n\nfunction findModuleConventionFilePath(baseDir: string, basename: string): string | null {\n for (const extension of MODULE_CODE_EXTENSIONS) {\n const candidate = path.join(baseDir, `${basename}${extension}`)\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n\n/**\n * Warns when a discovered `di.ts` exports no `register`.\n *\n * The generated registrar list is built from `<import>.register` for every module that has a\n * `di` file. A differently named export makes that entry `undefined`, so the module's DI\n * registrations silently never run and its services surface as missing at request time\n * instead of at generation time.\n */\nexport function warnIfDiMissingRegisterExport(diPath: string | null, quiet = false): void {\n if (!diPath || quiet) return\n let source = ''\n try {\n source = fs.readFileSync(diPath, 'utf8')\n } catch {\n return\n }\n const exportsRegister = /export\\s+(async\\s+)?function\\s+register\\b/.test(source)\n || /export\\s+(const|let|var)\\s+register\\b/.test(source)\n || /export\\s*\\{[^}]*\\bregister\\b[^}]*\\}/.test(source)\n if (exportsRegister) return\n console.warn(\n `[generate] \u26A0 di.ts exports no 'register' \u2014 this module's DI registrations will never run: ${diPath}`,\n )\n}\n"],
5
+ "mappings": "AAAA,SAAS,kCAAkC;AAC3C,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,+BAA+B;AAExC,SAAS,8BAA8B;AACvC;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAOP,eAAsB,iBAAiB,SAAoD;AACzF,QAAM,EAAE,UAAU,QAAQ,MAAM,IAAI;AACpC,QAAM,SAAS,sBAAsB;AAErC,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,UAAU,KAAK,KAAK,WAAW,iBAAiB;AACtD,QAAM,eAAe,KAAK,KAAK,WAAW,uBAAuB;AAEjE,QAAM,OAAO,SAAS,mBAAmB;AACzC,6BAA2B,UAAU,IAAI;AACzC,QAAM,UAA4D,CAAC;AACnE,QAAM,aAAuB,CAAC;AAC9B,MAAI,IAAI;AAER,aAAW,SAAS,MAAM;AACxB,UAAM,QAAQ,MAAM;AACpB,UAAM,QAAQ,SAAS,eAAe,KAAK;AAC3C,UAAM,MAAM,SAAS,oBAAoB,KAAK;AAC9C,UAAM,cAAc,MAAM,SAAS;AAEnC,UAAM,SAAS,4BAA4B,MAAM,SAAS,IAAI;AAC9D,UAAM,SAAS,4BAA4B,MAAM,SAAS,IAAI;AAC9D,UAAM,aAAa,KAAK,MAAM,KAAK,CAAC,IAAI,GAAG;AAE3C,QAAI,QAAQ;AACV,oCAA8B,6BAA6B,MAAM,SAAS,IAAI,GAAG,KAAK;AAGtF,YAAM,aAAa,cAAc,qBAAqB,KAAK,QAAQ,GAAG,IAAI,OAAO;AACjF,cAAQ,KAAK,EAAE,MAAM,YAAY,iBAAiB,WAAW,CAAC;AAC9D,iBAAW,KAAK,GAAG,UAAU,WAAW;AAAA,IAC1C,WAAW,QAAQ;AACjB,oCAA8B,6BAA6B,MAAM,SAAS,IAAI,GAAG,KAAK;AACtF,cAAQ,KAAK,EAAE,MAAM,YAAY,iBAAiB,GAAG,IAAI,OAAO,MAAM,CAAC;AACvE,iBAAW,KAAK,GAAG,UAAU,WAAW;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,aAAa,0BAA0B,iBAAiB;AAC9D,0BAAwB,YAAY,IAAI;AACxC,iBAAe,YAAY,QAAQ,IAAI,CAAC,WAAW;AAAA,IACjD,iBAAiB,MAAM;AAAA,IACvB,iBAAiB,MAAM;AAAA,EACzB,EAAE,CAAC;AACH,aAAW,qBAAqB;AAAA,IAC9B,iBAAiB,wBAAwB;AAAA,IACzC,cAAc;AAAA,MACZ;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,UACX,cAAc,aAAa,YAAY,CAAC,eAAe,cAAc,WAAW,SAAS,EAAE,aAAa,CAAC,CAAC;AAAA,UAC1G;AAAA,UACA,CAAC,WAAW,SAAS,CAAC;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACD,aAAW,qBAAqB;AAAA,IAC9B,cAAc,CAAC,cAAc;AAAA,EAC/B,CAAC;AACD,aAAW,oBAAoB;AAAA,IAC7B,gBAAgB;AAAA,IAChB,YAAY;AAAA,EACd,CAAC;AACD,QAAM,SAAS,cAAc,UAAU;AAEvC,qBAAmB;AAAA,IACjB;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,4BAA4B,SAAiB,UAA2B;AAC/E,SAAO,uBAAuB,KAAK,CAAC,cAAc,GAAG,WAAW,KAAK,KAAK,SAAS,GAAG,QAAQ,GAAG,SAAS,EAAE,CAAC,CAAC;AAChH;AAEA,SAAS,6BAA6B,SAAiB,UAAiC;AACtF,aAAW,aAAa,wBAAwB;AAC9C,UAAM,YAAY,KAAK,KAAK,SAAS,GAAG,QAAQ,GAAG,SAAS,EAAE;AAC9D,QAAI,GAAG,WAAW,SAAS,EAAG,QAAO;AAAA,EACvC;AACA,SAAO;AACT;AAUO,SAAS,8BAA8B,QAAuB,QAAQ,OAAa;AACxF,MAAI,CAAC,UAAU,MAAO;AACtB,MAAI,SAAS;AACb,MAAI;AACF,aAAS,GAAG,aAAa,QAAQ,MAAM;AAAA,EACzC,QAAQ;AACN;AAAA,EACF;AACA,QAAM,kBAAkB,4CAA4C,KAAK,MAAM,KAC1E,wCAAwC,KAAK,MAAM,KACnD,sCAAsC,KAAK,MAAM;AACtD,MAAI,gBAAiB;AACrB,UAAQ;AAAA,IACN,uGAA6F,MAAM;AAAA,EACrG;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,3 +1,4 @@
1
+ import { getEnabledModuleIdentities } from "../module-identity.js";
1
2
  import fs from "node:fs";
2
3
  import path from "node:path";
3
4
  import { VariableDeclarationKind } from "ts-morph";
@@ -43,6 +44,7 @@ async function generateModuleEntities(options) {
43
44
  const outFile = path.join(outputDir, "entities.generated.ts");
44
45
  const checksumFile = path.join(outputDir, "entities.generated.checksum");
45
46
  const mods = resolver.loadEnabledModules();
47
+ getEnabledModuleIdentities(resolver, mods);
46
48
  const imports = [];
47
49
  const entitySources = [];
48
50
  const classNameEntries = [];
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/generators/module-entities.ts"],
4
- "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport { VariableDeclarationKind } from 'ts-morph'\nimport {\n findDuplicateEntityClassNames,\n formatDuplicateEntityClassNamesWarning,\n type EntityClassNameEntry,\n} from '@open-mercato/shared/lib/db/duplicateEntityClassNames'\nimport type { ModuleEntry, PackageResolver } from '../resolver'\nimport { parseEntityClassNames } from './entity-class-declarations'\nimport { MODULE_CODE_EXTENSIONS, stripModuleCodeExtension } from './scanner'\nimport {\n toVar,\n type GeneratorResult,\n createGeneratorResult,\n writeGeneratedFile,\n} from '../utils'\nimport {\n addAutoGeneratedComment,\n addImportSpecs,\n asExpression,\n arrayLiteral,\n arrowFunction,\n binaryExpression,\n callExpression,\n createGeneratedSourceFile,\n expressionStatement,\n getSourceText,\n identifier,\n ifStatement,\n logicalAnd,\n methodCall,\n objectEntries,\n objectLiteral,\n prefixExpression,\n propertyAccess,\n returnStatement,\n spreadExpression,\n templateLiteral,\n variableStatement,\n} from './ast'\n\nexport interface ModuleEntitiesOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\nexport async function generateModuleEntities(options: ModuleEntitiesOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'entities.generated.ts')\n const checksumFile = path.join(outputDir, 'entities.generated.checksum')\n\n const mods = resolver.loadEnabledModules()\n const imports: Array<{ name: string; moduleSpecifier: string }> = []\n const entitySources: Array<{ importName: string; moduleId: string }> = []\n const classNameEntries: EntityClassNameEntry[] = []\n let n = 0\n\n for (const entry of mods) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imp = resolver.getModuleImportBase(entry)\n const isAppModule = entry.from === '@app'\n\n // prefer app override data/, fallback to core data/, then legacy db/\n const appData = path.join(roots.appBase, 'data')\n const pkgData = path.join(roots.pkgBase, 'data')\n const appDb = path.join(roots.appBase, 'db')\n const pkgDb = path.join(roots.pkgBase, 'db')\n const bases = [appData, pkgData, appDb, pkgDb]\n const candidates = ['entities.override', 'entities', 'schema']\n\n let found: { base: string; file: string } | null = null\n for (const base of bases) {\n for (const f of candidates) {\n const p = resolveConventionFile(base, f)\n if (p) {\n found = { base, file: path.basename(p) }\n break\n }\n }\n if (found) break\n }\n if (!found) continue\n\n const importName = `E_${toVar(modId)}_${n++}`\n const sub = path.basename(found.base) // 'data' or 'db'\n const fromApp = found.base.startsWith(roots.appBase)\n // For @app modules, use relative path to ensure it works both in Next.js and Node.js CLI context\n // From .mercato/generated/, the relative path to src/modules/ is ../src/modules/\n let relImport: string\n if (isAppModule && fromApp) {\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n relImport = `../../src/modules/${modId}/${sub}/${stripModuleCodeExtension(found.file)}`\n } else {\n const baseImport = fromApp ? imp.appBase : imp.pkgBase\n relImport = `${baseImport}/${sub}/${stripModuleCodeExtension(found.file)}`\n }\n imports.push({ name: importName, moduleSpecifier: relImport })\n entitySources.push({ importName, moduleId: modId })\n\n const entityFilePath = resolveEntitySourceFile(resolver, entry, found, fromApp)\n for (const className of parseEntityClassNames(entityFilePath)) {\n classNameEntries.push({ className, moduleId: modId, sourcePath: entityFilePath })\n }\n }\n\n const sourceFile = createGeneratedSourceFile('entities.generated.ts')\n addAutoGeneratedComment(sourceFile, 'entities')\n addImportSpecs(sourceFile, imports.map((entry) => ({\n namespaceImport: entry.name,\n moduleSpecifier: entry.moduleSpecifier,\n })))\n sourceFile.addFunction({\n name: 'enhanceEntities',\n parameters: [\n { name: 'namespace', type: 'Record<string, unknown>' },\n { name: 'moduleId', type: 'string' },\n ],\n returnType: 'any[]',\n statements: [\n returnStatement(\n methodCall(\n methodCall(objectEntries(identifier('namespace')), 'filter', [\n arrowFunction({\n parameters: ['[, value]'],\n body: binaryExpression(\n prefixExpression('typeof ', identifier('value')),\n '===',\n 'function',\n ),\n }),\n ]),\n 'map',\n [\n arrowFunction({\n parameters: ['[exportName, value]'],\n body: (writer) => {\n writer.block(() => {\n variableStatement({\n name: 'entity',\n initializer: asExpression(identifier('value'), '{ entityName?: string }'),\n })(writer)\n writer.newLine()\n ifStatement({\n condition: logicalAnd([\n identifier('entity'),\n binaryExpression(\n prefixExpression('typeof ', identifier('entity')),\n '===',\n 'function',\n ),\n binaryExpression(\n methodCall(\n propertyAccess(\n propertyAccess(identifier('Object'), 'prototype'),\n 'hasOwnProperty',\n ),\n 'call',\n [identifier('entity'), 'entityName'],\n ),\n '===',\n false,\n ),\n ]),\n thenStatements: [\n expressionStatement(\n callExpression(propertyAccess(identifier('Object'), 'defineProperty'), [\n identifier('entity'),\n 'entityName',\n objectLiteral([\n {\n name: 'value',\n value: templateLiteral([\n identifier('moduleId'),\n '.',\n identifier('exportName'),\n ]),\n },\n { name: 'configurable', value: true },\n { name: 'enumerable', value: false },\n { name: 'writable', value: false },\n ]),\n ]),\n ),\n ],\n })(writer)\n writer.newLine()\n returnStatement(identifier('entity'))(writer)\n })\n },\n }),\n ],\n ),\n ),\n ],\n })\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: 'entities',\n initializer: arrayLiteral(entitySources, (writer, entry) =>\n spreadExpression(callExpression(identifier('enhanceEntities'), [identifier(entry.importName), entry.moduleId]))(writer)),\n },\n ],\n })\n const output = getSourceText(sourceFile)\n\n writeGeneratedFile({\n outFile,\n checksumFile,\n content: output,\n structureChecksum: '',\n result,\n quiet,\n })\n\n warnOnDuplicateEntityClassNames(classNameEntries)\n\n return result\n}\n\n/**\n * A duplicate entity class name across modules silently corrupts entity resolution at\n * runtime and no build step otherwise catches it, so surface it here \u2014 where the\n * colliding registry is produced. Reported as a warning; generation still succeeds.\n */\nfunction warnOnDuplicateEntityClassNames(entries: readonly EntityClassNameEntry[]): void {\n try {\n const duplicates = findDuplicateEntityClassNames(entries)\n if (duplicates.length === 0) return\n console.warn(`\\x1b[33m[Entities Warning]\\x1b[0m ${formatDuplicateEntityClassNamesWarning(duplicates)}`)\n } catch {\n // This check is a diagnostic. It must never be the reason generation fails.\n }\n}\n\n/**\n * The file to read class names out of, which is not always the file the runtime imports.\n * A standalone install resolves a package module to its compiled `dist/modules` tree, and\n * published packages ship `src/modules` alongside it \u2014 so prefer the shipped source, the\n * way `eject` already does, and leave the runtime import pointing at `dist`. A package\n * that ships compiled output only falls back to the resolved base, which the parser also\n * understands. An app override wins over the package tree entirely: the registry imports\n * the app file, so that is the file whose class names are registered.\n */\nfunction resolveEntitySourceFile(\n resolver: PackageResolver,\n entry: ModuleEntry,\n found: { base: string; file: string },\n fromApp: boolean,\n): string {\n const resolved = path.join(found.base, found.file)\n const from = entry.from\n if (fromApp || !from || from === '@app') return resolved\n const sourceBase = path.join(resolver.getPackageRoot(from), 'src', 'modules', entry.id, path.basename(found.base))\n if (path.resolve(sourceBase) === path.resolve(found.base)) return resolved\n const sourceFile = resolveConventionFile(sourceBase, stripModuleCodeExtension(found.file))\n return sourceFile ?? resolved\n}\n\nfunction resolveConventionFile(baseDir: string, basename: string): string | null {\n for (const extension of MODULE_CODE_EXTENSIONS) {\n const candidate = path.join(baseDir, `${basename}${extension}`)\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { getEnabledModuleIdentities } from '../module-identity'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { VariableDeclarationKind } from 'ts-morph'\nimport {\n findDuplicateEntityClassNames,\n formatDuplicateEntityClassNamesWarning,\n type EntityClassNameEntry,\n} from '@open-mercato/shared/lib/db/duplicateEntityClassNames'\nimport type { ModuleEntry, PackageResolver } from '../resolver'\nimport { parseEntityClassNames } from './entity-class-declarations'\nimport { MODULE_CODE_EXTENSIONS, stripModuleCodeExtension } from './scanner'\nimport {\n toVar,\n type GeneratorResult,\n createGeneratorResult,\n writeGeneratedFile,\n} from '../utils'\nimport {\n addAutoGeneratedComment,\n addImportSpecs,\n asExpression,\n arrayLiteral,\n arrowFunction,\n binaryExpression,\n callExpression,\n createGeneratedSourceFile,\n expressionStatement,\n getSourceText,\n identifier,\n ifStatement,\n logicalAnd,\n methodCall,\n objectEntries,\n objectLiteral,\n prefixExpression,\n propertyAccess,\n returnStatement,\n spreadExpression,\n templateLiteral,\n variableStatement,\n} from './ast'\n\nexport interface ModuleEntitiesOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\nexport async function generateModuleEntities(options: ModuleEntitiesOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'entities.generated.ts')\n const checksumFile = path.join(outputDir, 'entities.generated.checksum')\n\n const mods = resolver.loadEnabledModules()\n getEnabledModuleIdentities(resolver, mods)\n const imports: Array<{ name: string; moduleSpecifier: string }> = []\n const entitySources: Array<{ importName: string; moduleId: string }> = []\n const classNameEntries: EntityClassNameEntry[] = []\n let n = 0\n\n for (const entry of mods) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imp = resolver.getModuleImportBase(entry)\n const isAppModule = entry.from === '@app'\n\n // prefer app override data/, fallback to core data/, then legacy db/\n const appData = path.join(roots.appBase, 'data')\n const pkgData = path.join(roots.pkgBase, 'data')\n const appDb = path.join(roots.appBase, 'db')\n const pkgDb = path.join(roots.pkgBase, 'db')\n const bases = [appData, pkgData, appDb, pkgDb]\n const candidates = ['entities.override', 'entities', 'schema']\n\n let found: { base: string; file: string } | null = null\n for (const base of bases) {\n for (const f of candidates) {\n const p = resolveConventionFile(base, f)\n if (p) {\n found = { base, file: path.basename(p) }\n break\n }\n }\n if (found) break\n }\n if (!found) continue\n\n const importName = `E_${toVar(modId)}_${n++}`\n const sub = path.basename(found.base) // 'data' or 'db'\n const fromApp = found.base.startsWith(roots.appBase)\n // For @app modules, use relative path to ensure it works both in Next.js and Node.js CLI context\n // From .mercato/generated/, the relative path to src/modules/ is ../src/modules/\n let relImport: string\n if (isAppModule && fromApp) {\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n relImport = `../../src/modules/${modId}/${sub}/${stripModuleCodeExtension(found.file)}`\n } else {\n const baseImport = fromApp ? imp.appBase : imp.pkgBase\n relImport = `${baseImport}/${sub}/${stripModuleCodeExtension(found.file)}`\n }\n imports.push({ name: importName, moduleSpecifier: relImport })\n entitySources.push({ importName, moduleId: modId })\n\n const entityFilePath = resolveEntitySourceFile(resolver, entry, found, fromApp)\n for (const className of parseEntityClassNames(entityFilePath)) {\n classNameEntries.push({ className, moduleId: modId, sourcePath: entityFilePath })\n }\n }\n\n const sourceFile = createGeneratedSourceFile('entities.generated.ts')\n addAutoGeneratedComment(sourceFile, 'entities')\n addImportSpecs(sourceFile, imports.map((entry) => ({\n namespaceImport: entry.name,\n moduleSpecifier: entry.moduleSpecifier,\n })))\n sourceFile.addFunction({\n name: 'enhanceEntities',\n parameters: [\n { name: 'namespace', type: 'Record<string, unknown>' },\n { name: 'moduleId', type: 'string' },\n ],\n returnType: 'any[]',\n statements: [\n returnStatement(\n methodCall(\n methodCall(objectEntries(identifier('namespace')), 'filter', [\n arrowFunction({\n parameters: ['[, value]'],\n body: binaryExpression(\n prefixExpression('typeof ', identifier('value')),\n '===',\n 'function',\n ),\n }),\n ]),\n 'map',\n [\n arrowFunction({\n parameters: ['[exportName, value]'],\n body: (writer) => {\n writer.block(() => {\n variableStatement({\n name: 'entity',\n initializer: asExpression(identifier('value'), '{ entityName?: string }'),\n })(writer)\n writer.newLine()\n ifStatement({\n condition: logicalAnd([\n identifier('entity'),\n binaryExpression(\n prefixExpression('typeof ', identifier('entity')),\n '===',\n 'function',\n ),\n binaryExpression(\n methodCall(\n propertyAccess(\n propertyAccess(identifier('Object'), 'prototype'),\n 'hasOwnProperty',\n ),\n 'call',\n [identifier('entity'), 'entityName'],\n ),\n '===',\n false,\n ),\n ]),\n thenStatements: [\n expressionStatement(\n callExpression(propertyAccess(identifier('Object'), 'defineProperty'), [\n identifier('entity'),\n 'entityName',\n objectLiteral([\n {\n name: 'value',\n value: templateLiteral([\n identifier('moduleId'),\n '.',\n identifier('exportName'),\n ]),\n },\n { name: 'configurable', value: true },\n { name: 'enumerable', value: false },\n { name: 'writable', value: false },\n ]),\n ]),\n ),\n ],\n })(writer)\n writer.newLine()\n returnStatement(identifier('entity'))(writer)\n })\n },\n }),\n ],\n ),\n ),\n ],\n })\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: 'entities',\n initializer: arrayLiteral(entitySources, (writer, entry) =>\n spreadExpression(callExpression(identifier('enhanceEntities'), [identifier(entry.importName), entry.moduleId]))(writer)),\n },\n ],\n })\n const output = getSourceText(sourceFile)\n\n writeGeneratedFile({\n outFile,\n checksumFile,\n content: output,\n structureChecksum: '',\n result,\n quiet,\n })\n\n warnOnDuplicateEntityClassNames(classNameEntries)\n\n return result\n}\n\n/**\n * A duplicate entity class name across modules silently corrupts entity resolution at\n * runtime and no build step otherwise catches it, so surface it here \u2014 where the\n * colliding registry is produced. Reported as a warning; generation still succeeds.\n */\nfunction warnOnDuplicateEntityClassNames(entries: readonly EntityClassNameEntry[]): void {\n try {\n const duplicates = findDuplicateEntityClassNames(entries)\n if (duplicates.length === 0) return\n console.warn(`\\x1b[33m[Entities Warning]\\x1b[0m ${formatDuplicateEntityClassNamesWarning(duplicates)}`)\n } catch {\n // This check is a diagnostic. It must never be the reason generation fails.\n }\n}\n\n/**\n * The file to read class names out of, which is not always the file the runtime imports.\n * A standalone install resolves a package module to its compiled `dist/modules` tree, and\n * published packages ship `src/modules` alongside it \u2014 so prefer the shipped source, the\n * way `eject` already does, and leave the runtime import pointing at `dist`. A package\n * that ships compiled output only falls back to the resolved base, which the parser also\n * understands. An app override wins over the package tree entirely: the registry imports\n * the app file, so that is the file whose class names are registered.\n */\nfunction resolveEntitySourceFile(\n resolver: PackageResolver,\n entry: ModuleEntry,\n found: { base: string; file: string },\n fromApp: boolean,\n): string {\n const resolved = path.join(found.base, found.file)\n const from = entry.from\n if (fromApp || !from || from === '@app') return resolved\n const sourceBase = path.join(resolver.getPackageRoot(from), 'src', 'modules', entry.id, path.basename(found.base))\n if (path.resolve(sourceBase) === path.resolve(found.base)) return resolved\n const sourceFile = resolveConventionFile(sourceBase, stripModuleCodeExtension(found.file))\n return sourceFile ?? resolved\n}\n\nfunction resolveConventionFile(baseDir: string, basename: string): string | null {\n for (const extension of MODULE_CODE_EXTENSIONS) {\n const candidate = path.join(baseDir, `${basename}${extension}`)\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,6 @@
1
+ import { getEnabledModuleIdentities } from "../module-identity.js";
1
2
  import path from "node:path";
2
- import { readOfficialModulePackageFromRoot, resolveInstalledPackageRoot } from "../module-package.js";
3
+ import { resolveInstalledOfficialModulePackage } from "../module-package.js";
3
4
  import { calculateChecksum, createGeneratorResult, writeGeneratedFile } from "../utils.js";
4
5
  function normalizeCssSourcePath(value) {
5
6
  const normalized = value.split(path.sep).join("/");
@@ -13,12 +14,13 @@ async function generateModulePackageSources(options) {
13
14
  const checksumFile = path.join(outputDir, "module-package-sources.checksum");
14
15
  const sourcePaths = /* @__PURE__ */ new Set();
15
16
  const checksumInputs = /* @__PURE__ */ new Set();
16
- for (const entry of resolver.loadEnabledModules()) {
17
+ const enabled = resolver.loadEnabledModules();
18
+ getEnabledModuleIdentities(resolver, enabled);
19
+ for (const entry of enabled) {
17
20
  if (!entry.from || entry.from === "@app" || entry.from === "@open-mercato/core") continue;
18
- const packageRoot = resolveInstalledPackageRoot(resolver, entry.from);
19
21
  let modulePackage;
20
22
  try {
21
- modulePackage = readOfficialModulePackageFromRoot(packageRoot, entry.from, entry.id);
23
+ modulePackage = resolveInstalledOfficialModulePackage(resolver, entry.from, entry.id);
22
24
  } catch {
23
25
  continue;
24
26
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/generators/module-package-sources.ts"],
4
- "sourcesContent": ["import path from 'node:path'\nimport { readOfficialModulePackageFromRoot, resolveInstalledPackageRoot } from '../module-package'\nimport type { PackageResolver } from '../resolver'\nimport { calculateChecksum, createGeneratorResult, type GeneratorResult, writeGeneratedFile } from '../utils'\n\nexport interface ModulePackageSourcesOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\nfunction normalizeCssSourcePath(value: string): string {\n const normalized = value.split(path.sep).join('/')\n return normalized.startsWith('.') ? normalized : `./${normalized}`\n}\n\nexport async function generateModulePackageSources(\n options: ModulePackageSourcesOptions,\n): Promise<GeneratorResult> {\n const { resolver, quiet } = options\n const result = createGeneratorResult()\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'module-package-sources.css')\n const checksumFile = path.join(outputDir, 'module-package-sources.checksum')\n const sourcePaths = new Set<string>()\n const checksumInputs = new Set<string>()\n\n for (const entry of resolver.loadEnabledModules()) {\n if (!entry.from || entry.from === '@app' || entry.from === '@open-mercato/core') continue\n\n const packageRoot = resolveInstalledPackageRoot(resolver, entry.from)\n\n let modulePackage\n try {\n modulePackage = readOfficialModulePackageFromRoot(packageRoot, entry.from, entry.id)\n } catch {\n continue\n }\n\n const packageSourceRoot = path.join(modulePackage.packageRoot, 'src')\n checksumInputs.add(JSON.stringify({\n entry: {\n from: entry.from,\n id: entry.id,\n },\n packageName: modulePackage.packageName,\n packageRoot: path.resolve(modulePackage.packageRoot),\n packageJson: modulePackage.packageJson,\n packageSourceRoot,\n sourceModuleDir: path.resolve(modulePackage.sourceModuleDir),\n distModuleDir: path.resolve(modulePackage.distModuleDir),\n }))\n const relativeSourcePath = normalizeCssSourcePath(path.relative(path.dirname(outFile), packageSourceRoot))\n sourcePaths.add(`@source \"${relativeSourcePath}/**/*.{ts,tsx}\";`)\n }\n\n const content = `${Array.from(sourcePaths).sort((left, right) => left.localeCompare(right)).join('\\n')}${sourcePaths.size > 0 ? '\\n' : ''}`\n const structureChecksum = calculateChecksum(\n Array.from(checksumInputs).sort((left, right) => left.localeCompare(right)).join('\\n'),\n )\n\n writeGeneratedFile({\n outFile,\n checksumFile,\n content,\n structureChecksum,\n result,\n quiet,\n })\n\n return result\n}\n"],
5
- "mappings": "AAAA,OAAO,UAAU;AACjB,SAAS,mCAAmC,mCAAmC;AAE/E,SAAS,mBAAmB,uBAA6C,0BAA0B;AAOnG,SAAS,uBAAuB,OAAuB;AACrD,QAAM,aAAa,MAAM,MAAM,KAAK,GAAG,EAAE,KAAK,GAAG;AACjD,SAAO,WAAW,WAAW,GAAG,IAAI,aAAa,KAAK,UAAU;AAClE;AAEA,eAAsB,6BACpB,SAC0B;AAC1B,QAAM,EAAE,UAAU,MAAM,IAAI;AAC5B,QAAM,SAAS,sBAAsB;AACrC,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,UAAU,KAAK,KAAK,WAAW,4BAA4B;AACjE,QAAM,eAAe,KAAK,KAAK,WAAW,iCAAiC;AAC3E,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,iBAAiB,oBAAI,IAAY;AAEvC,aAAW,SAAS,SAAS,mBAAmB,GAAG;AACjD,QAAI,CAAC,MAAM,QAAQ,MAAM,SAAS,UAAU,MAAM,SAAS,qBAAsB;AAEjF,UAAM,cAAc,4BAA4B,UAAU,MAAM,IAAI;AAEpE,QAAI;AACJ,QAAI;AACF,sBAAgB,kCAAkC,aAAa,MAAM,MAAM,MAAM,EAAE;AAAA,IACrF,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,oBAAoB,KAAK,KAAK,cAAc,aAAa,KAAK;AACpE,mBAAe,IAAI,KAAK,UAAU;AAAA,MAChC,OAAO;AAAA,QACL,MAAM,MAAM;AAAA,QACZ,IAAI,MAAM;AAAA,MACZ;AAAA,MACA,aAAa,cAAc;AAAA,MAC3B,aAAa,KAAK,QAAQ,cAAc,WAAW;AAAA,MACnD,aAAa,cAAc;AAAA,MAC3B;AAAA,MACA,iBAAiB,KAAK,QAAQ,cAAc,eAAe;AAAA,MAC3D,eAAe,KAAK,QAAQ,cAAc,aAAa;AAAA,IACzD,CAAC,CAAC;AACF,UAAM,qBAAqB,uBAAuB,KAAK,SAAS,KAAK,QAAQ,OAAO,GAAG,iBAAiB,CAAC;AACzG,gBAAY,IAAI,YAAY,kBAAkB,kBAAkB;AAAA,EAClE;AAEA,QAAM,UAAU,GAAG,MAAM,KAAK,WAAW,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,YAAY,OAAO,IAAI,OAAO,EAAE;AACzI,QAAM,oBAAoB;AAAA,IACxB,MAAM,KAAK,cAAc,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAAE,KAAK,IAAI;AAAA,EACvF;AAEA,qBAAmB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AACT;",
4
+ "sourcesContent": ["import { getEnabledModuleIdentities } from '../module-identity'\nimport path from 'node:path'\nimport { resolveInstalledOfficialModulePackage } from '../module-package'\nimport type { PackageResolver } from '../resolver'\nimport { calculateChecksum, createGeneratorResult, type GeneratorResult, writeGeneratedFile } from '../utils'\n\nexport interface ModulePackageSourcesOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\nfunction normalizeCssSourcePath(value: string): string {\n const normalized = value.split(path.sep).join('/')\n return normalized.startsWith('.') ? normalized : `./${normalized}`\n}\n\nexport async function generateModulePackageSources(\n options: ModulePackageSourcesOptions,\n): Promise<GeneratorResult> {\n const { resolver, quiet } = options\n const result = createGeneratorResult()\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'module-package-sources.css')\n const checksumFile = path.join(outputDir, 'module-package-sources.checksum')\n const sourcePaths = new Set<string>()\n const checksumInputs = new Set<string>()\n\n const enabled = resolver.loadEnabledModules()\n getEnabledModuleIdentities(resolver, enabled)\n\n for (const entry of enabled) {\n if (!entry.from || entry.from === '@app' || entry.from === '@open-mercato/core') continue\n\n let modulePackage\n try {\n modulePackage = resolveInstalledOfficialModulePackage(resolver, entry.from, entry.id)\n } catch {\n continue\n }\n\n const packageSourceRoot = path.join(modulePackage.packageRoot, 'src')\n checksumInputs.add(JSON.stringify({\n entry: {\n from: entry.from,\n id: entry.id,\n },\n packageName: modulePackage.packageName,\n packageRoot: path.resolve(modulePackage.packageRoot),\n packageJson: modulePackage.packageJson,\n packageSourceRoot,\n sourceModuleDir: path.resolve(modulePackage.sourceModuleDir),\n distModuleDir: path.resolve(modulePackage.distModuleDir),\n }))\n const relativeSourcePath = normalizeCssSourcePath(path.relative(path.dirname(outFile), packageSourceRoot))\n sourcePaths.add(`@source \"${relativeSourcePath}/**/*.{ts,tsx}\";`)\n }\n\n const content = `${Array.from(sourcePaths).sort((left, right) => left.localeCompare(right)).join('\\n')}${sourcePaths.size > 0 ? '\\n' : ''}`\n const structureChecksum = calculateChecksum(\n Array.from(checksumInputs).sort((left, right) => left.localeCompare(right)).join('\\n'),\n )\n\n writeGeneratedFile({\n outFile,\n checksumFile,\n content,\n structureChecksum,\n result,\n quiet,\n })\n\n return result\n}\n"],
5
+ "mappings": "AAAA,SAAS,kCAAkC;AAC3C,OAAO,UAAU;AACjB,SAAS,6CAA6C;AAEtD,SAAS,mBAAmB,uBAA6C,0BAA0B;AAOnG,SAAS,uBAAuB,OAAuB;AACrD,QAAM,aAAa,MAAM,MAAM,KAAK,GAAG,EAAE,KAAK,GAAG;AACjD,SAAO,WAAW,WAAW,GAAG,IAAI,aAAa,KAAK,UAAU;AAClE;AAEA,eAAsB,6BACpB,SAC0B;AAC1B,QAAM,EAAE,UAAU,MAAM,IAAI;AAC5B,QAAM,SAAS,sBAAsB;AACrC,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,UAAU,KAAK,KAAK,WAAW,4BAA4B;AACjE,QAAM,eAAe,KAAK,KAAK,WAAW,iCAAiC;AAC3E,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,iBAAiB,oBAAI,IAAY;AAEvC,QAAM,UAAU,SAAS,mBAAmB;AAC5C,6BAA2B,UAAU,OAAO;AAE5C,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,QAAQ,MAAM,SAAS,UAAU,MAAM,SAAS,qBAAsB;AAEjF,QAAI;AACJ,QAAI;AACF,sBAAgB,sCAAsC,UAAU,MAAM,MAAM,MAAM,EAAE;AAAA,IACtF,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,oBAAoB,KAAK,KAAK,cAAc,aAAa,KAAK;AACpE,mBAAe,IAAI,KAAK,UAAU;AAAA,MAChC,OAAO;AAAA,QACL,MAAM,MAAM;AAAA,QACZ,IAAI,MAAM;AAAA,MACZ;AAAA,MACA,aAAa,cAAc;AAAA,MAC3B,aAAa,KAAK,QAAQ,cAAc,WAAW;AAAA,MACnD,aAAa,cAAc;AAAA,MAC3B;AAAA,MACA,iBAAiB,KAAK,QAAQ,cAAc,eAAe;AAAA,MAC3D,eAAe,KAAK,QAAQ,cAAc,aAAa;AAAA,IACzD,CAAC,CAAC;AACF,UAAM,qBAAqB,uBAAuB,KAAK,SAAS,KAAK,QAAQ,OAAO,GAAG,iBAAiB,CAAC;AACzG,gBAAY,IAAI,YAAY,kBAAkB,kBAAkB;AAAA,EAClE;AAEA,QAAM,UAAU,GAAG,MAAM,KAAK,WAAW,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,YAAY,OAAO,IAAI,OAAO,EAAE;AACzI,QAAM,oBAAoB;AAAA,IACxB,MAAM,KAAK,cAAc,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAAE,KAAK,IAAI;AAAA,EACvF;AAEA,qBAAmB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AACT;",
6
6
  "names": []
7
7
  }