@open-mercato/cli 0.6.7-develop.6756.1.5300c41145 → 0.6.7-develop.6766.1.40c9011995
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/build.mjs +2 -1
- package/dist/agentic/guides/extensions.md +20 -3
- package/dist/agentic/guides/framework-extension-points.md +36 -0
- package/dist/agentic/guides/module-facts.json +39708 -230
- package/dist/agentic/guides/modules/ai_assistant.md +49 -9
- package/dist/agentic/guides/modules/api_docs.md +11 -1
- package/dist/agentic/guides/modules/api_keys.md +24 -1
- package/dist/agentic/guides/modules/attachments.md +22 -6
- package/dist/agentic/guides/modules/audit_logs.md +35 -1
- package/dist/agentic/guides/modules/auth.md +79 -15
- package/dist/agentic/guides/modules/business_rules.md +36 -3
- package/dist/agentic/guides/modules/catalog.md +160 -22
- package/dist/agentic/guides/modules/channel_gmail.md +14 -1
- package/dist/agentic/guides/modules/channel_imap.md +14 -1
- package/dist/agentic/guides/modules/checkout.md +134 -19
- package/dist/agentic/guides/modules/communication_channels.md +110 -20
- package/dist/agentic/guides/modules/configs.md +15 -1
- package/dist/agentic/guides/modules/content.md +11 -1
- package/dist/agentic/guides/modules/currencies.md +50 -9
- package/dist/agentic/guides/modules/customer_accounts.md +151 -28
- package/dist/agentic/guides/modules/customers.md +299 -52
- package/dist/agentic/guides/modules/dashboards.md +30 -1
- package/dist/agentic/guides/modules/data_sync.md +40 -7
- package/dist/agentic/guides/modules/dictionaries.md +24 -6
- package/dist/agentic/guides/modules/directory.md +52 -9
- package/dist/agentic/guides/modules/entities.md +41 -1
- package/dist/agentic/guides/modules/events.md +11 -1
- package/dist/agentic/guides/modules/feature_toggles.md +15 -1
- package/dist/agentic/guides/modules/gateway_stripe.md +14 -1
- package/dist/agentic/guides/modules/generators.md +11 -1
- package/dist/agentic/guides/modules/inbox_ops.md +58 -16
- package/dist/agentic/guides/modules/integrations.md +30 -7
- package/dist/agentic/guides/modules/messages.md +68 -13
- package/dist/agentic/guides/modules/notifications.md +13 -1
- package/dist/agentic/guides/modules/onboarding.md +13 -1
- package/dist/agentic/guides/modules/payment_gateways.md +51 -12
- package/dist/agentic/guides/modules/perspectives.md +16 -1
- package/dist/agentic/guides/modules/planner.md +33 -9
- package/dist/agentic/guides/modules/portal.md +24 -1
- package/dist/agentic/guides/modules/progress.md +34 -9
- package/dist/agentic/guides/modules/query_index.md +56 -3
- package/dist/agentic/guides/modules/record_locks.md +60 -13
- package/dist/agentic/guides/modules/resources.md +79 -18
- package/dist/agentic/guides/modules/sales.md +238 -48
- package/dist/agentic/guides/modules/scheduler.md +23 -7
- package/dist/agentic/guides/modules/search.md +28 -3
- package/dist/agentic/guides/modules/security.md +106 -23
- package/dist/agentic/guides/modules/shipping_carriers.md +38 -10
- package/dist/agentic/guides/modules/sso.md +47 -15
- package/dist/agentic/guides/modules/staff.md +117 -38
- package/dist/agentic/guides/modules/storage_s3.md +13 -1
- package/dist/agentic/guides/modules/sync_akeneo.md +13 -1
- package/dist/agentic/guides/modules/sync_excel.md +15 -1
- package/dist/agentic/guides/modules/system_status_overlays.md +14 -1
- package/dist/agentic/guides/modules/translations.md +25 -5
- package/dist/agentic/guides/modules/webhooks.md +85 -15
- package/dist/agentic/guides/modules/wms.md +234 -31
- package/dist/agentic/guides/modules/workflows.md +114 -30
- package/dist/agentic/guides/upstream/BACKWARD_COMPATIBILITY.md +7 -0
- package/dist/agentic/guides/upstream/manifest.json +2 -2
- package/dist/agentic/shared/AGENTS.md.template +2 -2
- package/dist/agentic/shared/ai/harness/README.md +2 -0
- package/dist/agentic/shared/ai/harness/cases.json +80 -39
- package/dist/agentic/shared/ai/skills/om-system-extension/references/mechanism-selector.md +3 -1
- package/dist/agentic/shared/ai/skills/om-system-extension/references/unified-overrides.md +2 -1
- package/dist/agentic/shared/scripts/framework-context.mjs +3 -9
- package/dist/lib/generators/module-extension-facts.js +1185 -0
- package/dist/lib/generators/module-extension-facts.js.map +7 -0
- package/dist/lib/generators/module-facts.js +134 -7
- package/dist/lib/generators/module-facts.js.map +2 -2
- package/dist/lib/generators/module-registry.js +1 -0
- package/dist/lib/generators/module-registry.js.map +2 -2
- package/package.json +5 -5
- package/src/lib/generators/__tests__/module-extension-facts.test.ts +402 -0
- package/src/lib/generators/__tests__/module-facts.bc-guard.test.ts +39 -2
- package/src/lib/generators/module-extension-facts.ts +1428 -0
- package/src/lib/generators/module-facts.ts +143 -6
- package/src/lib/generators/module-registry.ts +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/lib/generators/module-extension-facts.ts"],
|
|
4
|
+
"sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport ts from 'typescript-js'\nimport {\n CRUD_FORM_EXTENSION_SURFACES,\n CRUD_FORM_LIFECYCLE_PHASES,\n DATA_TABLE_EXTENSION_SURFACES,\n} from '@open-mercato/shared/modules/widgets/extension-points'\nimport type {\n ExtensionHostCapability,\n ExtensionHostFamily,\n ModuleExtensionContributionFact,\n ModuleExtensionContributionBase,\n ModuleExtensionHostFact,\n ModuleExtensionSurfaceFacts,\n ModuleExtensionTargetFact,\n ModuleExtensionUnresolvedFact,\n} from '@open-mercato/shared/modules/widgets/extension-points'\nimport { extractCommandIdsFromSource } from './module-registry'\nimport { scanModuleDir, SCAN_CONFIGS } from './scanner'\n\ntype StaticScalar = string | number | boolean | null\ntype StaticValue = StaticScalar | StaticValue[] | { [key: string]: StaticValue }\ntype StaticObject = { [key: string]: StaticValue }\ntype SpecializedRegistry = Extract<ModuleExtensionContributionFact, {\n kind: 'specialized-registry'\n}>['details']['registry']\n\nexport interface ExtensionFactEntityRef {\n id: string\n}\n\nexport interface ExtensionFactEventRef {\n id: string\n clientBroadcast?: boolean\n portalBroadcast?: boolean\n}\n\nexport interface ExtensionFactApiRouteRef {\n path: string\n methods: string[]\n}\n\nexport interface ExtractModuleExtensionFactsOptions {\n moduleId: string\n moduleRoot: string\n sourceRoot: string\n entities: readonly ExtensionFactEntityRef[]\n events: readonly ExtensionFactEventRef[]\n apiRoutes: readonly ExtensionFactApiRouteRef[]\n searchEntities: readonly string[]\n notifications?: readonly string[]\n aiTools?: ReadonlyArray<{ name: string; sourcePath: string }>\n aiAgents?: ReadonlyArray<{ id: string; sourcePath: string }>\n}\n\nexport interface CorrelateExtensionFactsOptions {\n surfacesByModule: Readonly<Record<string, ModuleExtensionSurfaceFacts>>\n entityIds: ReadonlySet<string>\n eventIds: ReadonlySet<string>\n apiRoutes: ReadonlySet<string>\n commandIds?: ReadonlySet<string>\n contributingModuleId?: string\n}\n\ntype StaticContext = {\n initializers: Map<string, ts.Expression | ts.FunctionDeclaration>\n sourceFile: ts.SourceFile\n resolving: Set<string>\n}\n\nconst FRAMEWORK_PREFIXES = [\n 'dashboard:',\n 'menu:',\n 'notification:',\n 'integration:',\n 'integrations.detail:',\n 'system-status:',\n 'topbar:',\n]\n\nconst FRAMEWORK_HOSTS: ModuleExtensionHostFact[] = [\n frameworkHost('framework.backend.sidebar', 'menu:backend.sidebar', 'menu', ['menu-item']),\n frameworkHost('framework.settings.sidebar', 'menu:settings.sidebar', 'menu', ['menu-item']),\n frameworkHost('framework.profile.sidebar', 'menu:profile.sidebar', 'menu', ['menu-item']),\n frameworkHost('framework.portal.sidebar', 'menu:portal.sidebar', 'menu', ['menu-item']),\n frameworkHost('framework.dashboard', 'dashboard:*', 'dashboard', ['registry-contribution']),\n frameworkHost('framework.notifications', 'notification:*', 'notification', ['registry-contribution']),\n frameworkHost('framework.integration-detail', 'integrations.detail:{integrationId}', 'integration', ['render-widget']),\n frameworkHost('framework.integration-detail-fallback', 'integrations.detail:tabs', 'integration', ['render-widget']),\n frameworkHost('framework.backend-mutation', 'backend-mutation:global', 'generic', ['headless-widget']),\n frameworkHost('framework.crud-form-wildcard', 'crud-form:*', 'crud-form', ['field-widget', 'lifecycle-handler']),\n]\n\nfunction frameworkHost(\n key: string,\n id: string,\n family: ExtensionHostFamily,\n capabilities: ExtensionHostCapability[],\n): ModuleExtensionHostFact {\n return {\n key,\n id,\n resolution: id.includes('*') || id.includes('{') ? 'pattern' : 'framework',\n family,\n ownerModule: 'framework',\n capabilities,\n bound: true,\n stability: 'frozen',\n source: { kind: 'framework', path: 'packages/ui/src', symbol: key },\n }\n}\n\nfunction frameworkOverrideHost(\n key: string,\n mode: 'disable-replace' | 'replace' | 'additive',\n): ModuleExtensionHostFact {\n return {\n key: `framework.module-override.${key}`,\n id: `module-override:${key}`,\n resolution: 'framework',\n family: 'module-override',\n ownerModule: 'framework',\n capabilities: ['module-override'],\n operations: [mode],\n bound: true,\n stability: 'stable',\n source: {\n kind: 'framework',\n path: 'packages/shared/src/modules/overrides.ts',\n symbol: `ModuleOverrides.${key}`,\n },\n }\n}\n\nconst FRAMEWORK_OVERRIDE_HOSTS = [\n frameworkOverrideHost('ai.agents', 'disable-replace'),\n frameworkOverrideHost('ai.tools', 'disable-replace'),\n frameworkOverrideHost('ai.extensions', 'additive'),\n frameworkOverrideHost('routes.api', 'disable-replace'),\n frameworkOverrideHost('routes.pages', 'disable-replace'),\n frameworkOverrideHost('events.subscribers', 'disable-replace'),\n frameworkOverrideHost('workers', 'disable-replace'),\n frameworkOverrideHost('widgets.injection', 'disable-replace'),\n frameworkOverrideHost('widgets.components', 'disable-replace'),\n frameworkOverrideHost('widgets.dashboard', 'disable-replace'),\n frameworkOverrideHost('notifications.types', 'disable-replace'),\n frameworkOverrideHost('notifications.handlers', 'disable-replace'),\n frameworkOverrideHost('interceptors', 'disable-replace'),\n frameworkOverrideHost('commandInterceptors', 'disable-replace'),\n frameworkOverrideHost('enrichers', 'disable-replace'),\n frameworkOverrideHost('guards', 'disable-replace'),\n frameworkOverrideHost('cli', 'disable-replace'),\n frameworkOverrideHost('setup', 'replace'),\n frameworkOverrideHost('acl.features', 'disable-replace'),\n frameworkOverrideHost('di', 'disable-replace'),\n frameworkOverrideHost('encryption.maps', 'disable-replace'),\n frameworkOverrideHost('nav.groupOrder', 'additive'),\n] as const\n\nfunction allFrameworkHosts(): ModuleExtensionHostFact[] {\n return [...FRAMEWORK_HOSTS, ...FRAMEWORK_OVERRIDE_HOSTS]\n}\n\nfunction sourceFile(filePath: string): ts.SourceFile | null {\n if (!fs.existsSync(filePath)) return null\n const scriptKind = filePath.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n return ts.createSourceFile(filePath, fs.readFileSync(filePath, 'utf8'), ts.ScriptTarget.ES2020, true, scriptKind)\n}\n\nfunction unwrap(expression: ts.Expression): ts.Expression {\n let current = expression\n while (\n ts.isAsExpression(current)\n || ts.isTypeAssertionExpression(current)\n || ts.isParenthesizedExpression(current)\n || ts.isSatisfiesExpression(current)\n ) {\n current = current.expression\n }\n return current\n}\n\nfunction propertyName(node: ts.PropertyName): string | null {\n if (ts.isIdentifier(node) || ts.isStringLiteralLike(node) || ts.isNumericLiteral(node)) return node.text\n return null\n}\n\nfunction buildStaticContext(file: ts.SourceFile): StaticContext {\n const initializers = new Map<string, ts.Expression | ts.FunctionDeclaration>()\n const visit = (node: ts.Node): void => {\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.initializer) {\n initializers.set(node.name.text, node.initializer)\n }\n if (ts.isFunctionDeclaration(node) && node.name && node.body) {\n initializers.set(node.name.text, node)\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n return { initializers, sourceFile: file, resolving: new Set() }\n}\n\nfunction entityRegistryValue(expression: ts.PropertyAccessExpression): string | null {\n const parts: string[] = []\n let current: ts.Expression = expression\n while (ts.isPropertyAccessExpression(current)) {\n parts.unshift(current.name.text)\n current = current.expression\n }\n return ts.isIdentifier(current) && current.text === 'E' && parts.length === 2\n ? `${parts[0]}:${parts[1]}`\n : null\n}\n\nfunction staticTemplate(expression: ts.TemplateExpression, context: StaticContext): string | null {\n let value = expression.head.text\n for (const span of expression.templateSpans) {\n const substitution = staticValue(span.expression, context)\n if (typeof substitution !== 'string' && typeof substitution !== 'number') return null\n value += `${substitution}${span.literal.text}`\n }\n return value\n}\n\nfunction staticObject(expression: ts.ObjectLiteralExpression, context: StaticContext): StaticObject {\n const result: StaticObject = {}\n for (const property of expression.properties) {\n if (ts.isPropertyAssignment(property)) {\n const name = propertyName(property.name)\n if (!name) continue\n const value = staticValue(property.initializer, context)\n if (value !== undefined) result[name] = value\n continue\n }\n if (ts.isShorthandPropertyAssignment(property)) {\n const value = staticValue(property.name, context)\n if (value !== undefined) result[property.name.text] = value\n continue\n }\n if (ts.isMethodDeclaration(property)) {\n const name = propertyName(property.name)\n if (name) result[name] = true\n continue\n }\n if (ts.isSpreadAssignment(property)) {\n const value = staticValue(property.expression, context)\n if (isStaticObject(value)) Object.assign(result, value)\n }\n }\n return result\n}\n\nfunction staticValue(expression: ts.Expression, context: StaticContext): StaticValue | undefined {\n const current = unwrap(expression)\n if (ts.isStringLiteralLike(current) || ts.isNumericLiteral(current)) return current.text\n if (current.kind === ts.SyntaxKind.TrueKeyword) return true\n if (current.kind === ts.SyntaxKind.FalseKeyword) return false\n if (current.kind === ts.SyntaxKind.NullKeyword) return null\n if (ts.isNoSubstitutionTemplateLiteral(current)) return current.text\n if (ts.isTemplateExpression(current)) return staticTemplate(current, context) ?? undefined\n if (ts.isArrayLiteralExpression(current)) {\n return current.elements.flatMap((element) => {\n if (ts.isSpreadElement(element)) {\n const spread = staticValue(element.expression, context)\n return Array.isArray(spread) ? spread : []\n }\n const value = staticValue(element, context)\n return value === undefined ? [] : [value]\n })\n }\n if (ts.isObjectLiteralExpression(current)) return staticObject(current, context)\n if (ts.isPropertyAccessExpression(current)) {\n return entityRegistryValue(current) ?? undefined\n }\n if (ts.isIdentifier(current)) {\n if (context.resolving.has(current.text)) return undefined\n const initializer = context.initializers.get(current.text)\n if (!initializer) return undefined\n context.resolving.add(current.text)\n const value = ts.isFunctionDeclaration(initializer) ? undefined : staticValue(initializer, context)\n context.resolving.delete(current.text)\n return value\n }\n if (ts.isCallExpression(current)) {\n if (ts.isIdentifier(current.expression)) {\n const callable = context.initializers.get(current.expression.text)\n if (callable && (ts.isArrowFunction(callable) || ts.isFunctionExpression(callable) || ts.isFunctionDeclaration(callable))) {\n const initializers = new Map(context.initializers)\n callable.parameters.forEach((parameter, index) => {\n if (ts.isIdentifier(parameter.name) && current.arguments[index]) {\n initializers.set(parameter.name.text, current.arguments[index])\n }\n })\n const childContext: StaticContext = {\n initializers,\n sourceFile: context.sourceFile,\n resolving: new Set(context.resolving),\n }\n if (callable.body && ts.isExpression(callable.body)) return staticValue(callable.body, childContext)\n const returnStatement = callable.body?.statements.find(ts.isReturnStatement)\n if (returnStatement?.expression) return staticValue(returnStatement.expression, childContext)\n }\n }\n const firstArgument = current.arguments[0]\n if (firstArgument) {\n const value = staticValue(firstArgument, context)\n if (!isStaticObject(value) || !ts.isIdentifier(current.expression)) return value\n if (current.expression.text === 'dataTableExtensionHost') return { family: 'data-table', ...value }\n if (current.expression.text === 'crudFormExtensionHost') return { family: 'crud-form', ...value }\n if (current.expression.text === 'componentExtensionHost') return { family: 'component-handle', ...value }\n return value\n }\n }\n if (ts.isConditionalExpression(current)) {\n const left = staticValue(current.whenTrue, context)\n const right = staticValue(current.whenFalse, context)\n return left !== undefined && JSON.stringify(left) === JSON.stringify(right) ? left : undefined\n }\n return undefined\n}\n\nfunction isStaticObject(value: StaticValue | undefined): value is StaticObject {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction strings(value: StaticValue | undefined): string[] {\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : []\n}\n\nfunction stringValue(value: StaticValue | undefined): string | undefined {\n return typeof value === 'string' ? value : undefined\n}\n\nfunction numberValue(value: StaticValue | undefined): number | undefined {\n if (typeof value === 'number') return value\n if (typeof value === 'string' && /^\\d+$/.test(value)) return Number(value)\n return undefined\n}\n\nfunction booleanValue(value: StaticValue | undefined): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined\n}\n\nfunction portablePath(moduleRoot: string, sourceRoot: string, filePath: string): string {\n return path.posix.join(sourceRoot, path.relative(moduleRoot, filePath).split(path.sep).join('/'))\n}\n\nfunction conventionPath(moduleRoot: string, relativePath: string): string | null {\n const direct = path.join(moduleRoot, relativePath)\n if (fs.existsSync(direct)) return direct\n if (relativePath.endsWith('.ts')) {\n const tsx = `${direct.slice(0, -3)}.tsx`\n if (fs.existsSync(tsx)) return tsx\n }\n return null\n}\n\nexport function readConventionObjectArray(filePath: string, exportName: string): StaticObject[] {\n const file = sourceFile(filePath)\n if (!file) return []\n const context = buildStaticContext(file)\n const initializer = context.initializers.get(exportName)\n if (!initializer || ts.isFunctionDeclaration(initializer)) return []\n const value = staticValue(initializer, context)\n return Array.isArray(value) ? value.filter(isStaticObject) : []\n}\n\nfunction readRootObject(filePath: string, variableName: string): StaticObject | null {\n const file = sourceFile(filePath)\n if (!file) return null\n const context = buildStaticContext(file)\n const initializer = context.initializers.get(variableName)\n if (!initializer || ts.isFunctionDeclaration(initializer)) return null\n const value = staticValue(initializer, context)\n return isStaticObject(value) ? value : null\n}\n\nfunction readCallObjectArguments(filePath: string, calleeNames: ReadonlySet<string>): Array<{\n callee: string\n value: StaticObject\n}> {\n const file = sourceFile(filePath)\n if (!file) return []\n const context = buildStaticContext(file)\n const result: Array<{ callee: string; value: StaticObject }> = []\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && calleeNames.has(node.expression.text)) {\n const firstArgument = node.arguments[0]\n const value = firstArgument ? staticValue(firstArgument, context) : undefined\n if (isStaticObject(value)) result.push({ callee: node.expression.text, value })\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n return result\n}\n\nfunction sortHosts(hosts: ModuleExtensionHostFact[]): ModuleExtensionHostFact[] {\n const sourceKey = (host: ModuleExtensionHostFact): string => host.source.kind === 'fact-ref'\n ? `${host.source.factSection}:${host.source.factKey}`\n : `${host.source.path}:${host.source.symbol}`\n return hosts.sort((left, right) =>\n left.family.localeCompare(right.family)\n || left.id.localeCompare(right.id)\n || sourceKey(left).localeCompare(sourceKey(right))\n || left.key.localeCompare(right.key))\n}\n\nfunction sortContributions(contributions: ModuleExtensionContributionFact[]): ModuleExtensionContributionFact[] {\n const targetKey = (contribution: ModuleExtensionContributionFact): string => contribution.targets\n .map((entry) => entry.id)\n .join('\\u0000')\n const sourceKey = (contribution: ModuleExtensionContributionFact): string =>\n `${contribution.source.path}:${contribution.source.symbol ?? ''}`\n return contributions.sort((left, right) =>\n left.kind.localeCompare(right.kind)\n || left.id.localeCompare(right.id)\n || targetKey(left).localeCompare(targetKey(right))\n || sourceKey(left).localeCompare(sourceKey(right)))\n}\n\nfunction target(id: string, resolution: ModuleExtensionTargetFact['resolution'] = 'unresolved'): ModuleExtensionTargetFact {\n return { id, resolution }\n}\n\nfunction factTarget(id: string, factSection: string, factKey = id): ModuleExtensionTargetFact {\n return { id, resolution: 'fact-ref', factRef: { factSection, factKey } }\n}\n\nfunction openTarget(id: string): ModuleExtensionTargetFact {\n return target(id)\n}\n\nfunction declarationSource(sourceRoot: string, symbol: string): ModuleExtensionHostFact['source'] {\n return { kind: 'declaration', path: path.posix.join(sourceRoot, 'extension-points.ts'), symbol }\n}\n\nfunction hasDeclarationBinding(\n moduleRoot: string,\n hostKey: string,\n declaration: StaticObject,\n): boolean {\n const relativeSource = stringValue(declaration.source)\n if (!relativeSource) return false\n const bindingFile = sourceFile(path.join(moduleRoot, relativeSource))\n if (!bindingFile) return false\n const escapedHostKey = hostKey.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const bindingPattern = new RegExp(\n `extensionPoints\\\\s*\\\\.\\\\s*hosts(?:\\\\s*\\\\.\\\\s*${escapedHostKey}|\\\\s*\\\\[\\\\s*['\\\"]${escapedHostKey}['\\\"]\\\\s*\\\\])`,\n )\n if (bindingPattern.test(bindingFile.text)) return true\n return declaration.family === 'integration'\n && typeof declaration.pattern === 'string'\n && /resolveIntegrationDetailWidgetSpotId\\s*\\(/.test(bindingFile.text)\n}\n\nfunction baseHost(options: {\n key: string\n id: string\n moduleId: string\n family: ExtensionHostFamily\n capabilities: ExtensionHostCapability[]\n sourceRoot: string\n declaration: StaticObject\n bound?: boolean\n resolution?: ModuleExtensionHostFact['resolution']\n}): ModuleExtensionHostFact {\n const { declaration } = options\n const aliases = strings(declaration.aliases)\n const fallbacks = strings(declaration.fallbacks)\n const fact: ModuleExtensionHostFact = {\n key: options.key,\n id: options.id,\n resolution: options.resolution ?? (options.id.includes('{') || options.id.includes('*') ? 'pattern' : 'exact'),\n family: options.family,\n ownerModule: options.moduleId,\n capabilities: options.capabilities,\n bound: options.bound ?? true,\n stability: 'frozen',\n source: declarationSource(options.sourceRoot, `extensionPoints.hosts.${options.key.split('.')[0]}`),\n }\n const contextContract = stringValue(declaration.contextContract)\n const dataContract = stringValue(declaration.dataContract)\n const scopeContract = stringValue(declaration.scopeContract)\n const runtimeContract = stringValue(declaration.runtimeContract)\n const activation = stringValue(declaration.activation) as ModuleExtensionHostFact['activation']\n if (contextContract) fact.contextContract = contextContract\n if (dataContract) fact.dataContract = dataContract\n if (scopeContract) fact.scopeContract = scopeContract\n if (runtimeContract) fact.runtimeContract = runtimeContract\n if (activation) fact.activation = activation\n if (aliases.length > 0) fact.aliases = aliases\n if (fallbacks.length > 0) fact.fallbacks = fallbacks\n return fact\n}\n\nfunction extractDeclaredHosts(options: ExtractModuleExtensionFactsOptions): {\n hosts: ModuleExtensionHostFact[]\n unresolved: ModuleExtensionUnresolvedFact[]\n} {\n const filePath = conventionPath(options.moduleRoot, 'extension-points.ts')\n if (!filePath) return { hosts: [], unresolved: [] }\n const declaration = readRootObject(filePath, 'extensionPoints')\n const hostsObject = declaration && isStaticObject(declaration.hosts) ? declaration.hosts : null\n if (!hostsObject) {\n return {\n hosts: [],\n unresolved: [{\n key: `${options.moduleId}.extension-points`,\n source: { path: portablePath(options.moduleRoot, options.sourceRoot, filePath), symbol: 'extensionPoints' },\n reason: 'unclassified-binding',\n }],\n }\n }\n\n const hosts: ModuleExtensionHostFact[] = []\n const unresolved: ModuleExtensionUnresolvedFact[] = []\n for (const hostKey of Object.keys(hostsObject).sort((left, right) => left.localeCompare(right))) {\n const host = hostsObject[hostKey]\n if (!isStaticObject(host)) continue\n const family = stringValue(host.family) as ExtensionHostFamily | undefined\n if (!family) continue\n const declarationBound = hasDeclarationBinding(options.moduleRoot, hostKey, host)\n if (!declarationBound) {\n unresolved.push({\n key: `${options.moduleId}.${hostKey}`,\n source: {\n path: stringValue(host.source) ?? portablePath(options.moduleRoot, options.sourceRoot, filePath),\n symbol: `extensionPoints.hosts.${hostKey}`,\n },\n reason: 'unbound-declaration',\n })\n }\n if (family === 'data-table') {\n const tableId = stringValue(host.tableId)\n if (!tableId) continue\n const baseSpotId = stringValue(host.baseSpotId) ?? `data-table:${tableId}`\n for (const surface of DATA_TABLE_EXTENSION_SURFACES) {\n const usesBase = ['header', 'footer', 'toolbar', 'searchTrailing', 'emptyState'].includes(surface.key)\n const id = surface.key === 'replacement'\n ? `data-table:${tableId}`\n : `${usesBase ? baseSpotId : `data-table:${tableId}`}:${surface.suffix}`\n hosts.push(baseHost({\n key: `${hostKey}.${surface.key}`,\n id,\n moduleId: options.moduleId,\n family,\n capabilities: [...surface.capabilities],\n sourceRoot: options.sourceRoot,\n declaration: host,\n bound: surface.bound && declarationBound,\n }))\n }\n continue\n }\n if (family === 'crud-form') {\n const entityId = stringValue(host.entityId)\n if (!entityId) continue\n const spotId = stringValue(host.spotId) ?? `crud-form:${entityId}`\n for (const surface of CRUD_FORM_EXTENSION_SURFACES) {\n const id = surface.suffix ? `${spotId}:${surface.suffix}` : spotId\n const fact = baseHost({\n key: `${hostKey}.${surface.key}`,\n id,\n moduleId: options.moduleId,\n family,\n capabilities: [...surface.capabilities],\n sourceRoot: options.sourceRoot,\n declaration: host,\n bound: surface.bound && declarationBound,\n })\n if (surface.key === 'base') fact.phases = [...CRUD_FORM_LIFECYCLE_PHASES]\n hosts.push(fact)\n }\n continue\n }\n const id = stringValue(host.spotId) ?? stringValue(host.pattern) ?? stringValue(host.componentId)\n if (!id) {\n unresolved.push({\n key: `${options.moduleId}.${hostKey}`,\n source: { path: portablePath(options.moduleRoot, options.sourceRoot, filePath), symbol: hostKey },\n reason: 'dynamic-without-pattern',\n })\n continue\n }\n const capabilities = family === 'component-handle'\n ? ['component-replacement'] as ExtensionHostCapability[]\n : strings(host.supported) as ExtensionHostCapability[]\n const fact = baseHost({\n key: hostKey,\n id,\n moduleId: options.moduleId,\n family,\n capabilities,\n sourceRoot: options.sourceRoot,\n declaration: host,\n bound: declarationBound,\n })\n if (isStaticObject(host.parameters)) {\n fact.patternParameters = Object.fromEntries(Object.entries(host.parameters).flatMap(([key, value]) => {\n if (!isStaticObject(value) || typeof value.source !== 'string') return []\n return [[key, {\n source: value.source,\n ...(typeof value.pattern === 'string' ? { pattern: value.pattern } : {}),\n }]]\n }))\n }\n hosts.push(fact)\n }\n return { hosts: sortHosts(hosts), unresolved }\n}\n\nfunction factRefHost(options: {\n key: string\n id: string\n moduleId: string\n family: ExtensionHostFamily\n capabilities: ExtensionHostCapability[]\n factSection: string\n phases?: string[]\n activation?: ModuleExtensionHostFact['activation']\n scopeContract?: string\n}): ModuleExtensionHostFact {\n return {\n key: options.key,\n id: options.id,\n resolution: 'fact-ref',\n family: options.family,\n ownerModule: options.moduleId,\n capabilities: options.capabilities,\n ...(options.phases ? { phases: options.phases } : {}),\n ...(options.activation ? { activation: options.activation } : {}),\n ...(options.scopeContract ? { scopeContract: options.scopeContract } : {}),\n bound: true,\n stability: 'stable',\n source: { kind: 'fact-ref', factSection: options.factSection, factKey: options.id },\n }\n}\n\nfunction sourceFilesBelow(directory: string): string[] {\n if (!fs.existsSync(directory)) return []\n const files: string[] = []\n const visit = (current: string): void => {\n for (const entry of fs.readdirSync(current, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name))) {\n const entryPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n if (entry.name !== '__tests__' && entry.name !== '__integration__') visit(entryPath)\n continue\n }\n if (entry.isFile() && /\\.(?:ts|tsx)$/.test(entry.name) && !/\\.(?:test|spec)\\./.test(entry.name)) files.push(entryPath)\n }\n }\n visit(directory)\n return files\n}\n\nfunction apiRouteId(moduleId: string, moduleRoot: string, filePath: string): string | null {\n const relative = path.relative(path.join(moduleRoot, 'api'), filePath).split(path.sep).join('/')\n if (relative === 'interceptors.ts' || relative === 'openapi.ts') return null\n const withoutExtension = relative.replace(/\\.tsx?$/, '')\n const suffix = withoutExtension.endsWith('/route') ? withoutExtension.slice(0, -6) : withoutExtension\n return suffix && !suffix.includes('__tests__') ? `${moduleId.replace(/_/g, '-')}/${suffix}` : null\n}\n\nfunction apiExtensionHostIds(moduleId: string, moduleRoot: string): { entityIds: string[]; commandIds: string[]; routeIds: string[] } {\n const entityIds = new Set<string>()\n const commandIds = new Set<string>()\n const routeIds = new Set<string>()\n for (const filePath of sourceFilesBelow(path.join(moduleRoot, 'api'))) {\n const routeId = apiRouteId(moduleId, moduleRoot, filePath)\n if (routeId) routeIds.add(routeId)\n const file = sourceFile(filePath)\n if (!file) continue\n const context = buildStaticContext(file)\n const visit = (node: ts.Node): void => {\n if (ts.isPropertyAssignment(node)) {\n const name = propertyName(node.name)\n if (name === 'commandId') {\n const id = stringValue(staticValue(node.initializer, context))\n if (id) commandIds.add(id)\n }\n if (name === 'enrichers') {\n const config = staticValue(node.initializer, context)\n const entityId = isStaticObject(config) ? stringValue(config.entityId) : undefined\n if (entityId) entityIds.add(entityId)\n }\n }\n if (\n ts.isCallExpression(node)\n && ts.isIdentifier(node.expression)\n && node.expression.text === 'validateCrudMutationGuard'\n ) {\n const input = node.arguments[1] ? staticValue(node.arguments[1], context) : undefined\n const entityId = isStaticObject(input) ? stringValue(input.resourceKind) : undefined\n if (entityId) entityIds.add(entityId)\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n }\n return {\n entityIds: [...entityIds].sort((left, right) => left.localeCompare(right)),\n commandIds: [...commandIds].sort((left, right) => left.localeCompare(right)),\n routeIds: [...routeIds].sort((left, right) => left.localeCompare(right)),\n }\n}\n\nfunction moduleCommandIds(moduleRoot: string, apiCommandIds: readonly string[]): string[] {\n const commandIds = new Set(apiCommandIds)\n for (const filePath of sourceFilesBelow(path.join(moduleRoot, 'commands'))) {\n if (path.basename(filePath).replace(/\\.(?:ts|tsx)$/, '') === 'interceptors') continue\n for (const id of extractCommandIdsFromSource(filePath)) commandIds.add(id)\n }\n return [...commandIds].sort((left, right) => left.localeCompare(right))\n}\n\nexport function extractKnownApiRouteIds(moduleId: string, moduleRoot: string): string[] {\n return apiExtensionHostIds(moduleId, moduleRoot).routeIds\n}\n\nexport function extractKnownCommandIds(moduleId: string, moduleRoot: string): string[] {\n const apiHosts = apiExtensionHostIds(moduleId, moduleRoot)\n return moduleCommandIds(moduleRoot, apiHosts.commandIds)\n}\n\nfunction extractFactRefHosts(options: ExtractModuleExtensionFactsOptions): ModuleExtensionHostFact[] {\n const hosts: ModuleExtensionHostFact[] = []\n for (const entity of options.entities) {\n hosts.push(factRefHost({\n key: `entity.${entity.id}`,\n id: entity.id,\n moduleId: options.moduleId,\n family: 'entity',\n capabilities: ['response-enricher', 'query-enricher', 'mutation-guard', 'entity-extension'],\n factSection: 'entities',\n activation: 'host-opt-in',\n scopeContract: 'tenant-and-organization',\n }))\n }\n for (const route of options.apiRoutes) {\n hosts.push(factRefHost({\n key: `api-route.${route.path}`,\n id: route.path,\n moduleId: options.moduleId,\n family: 'api-route',\n capabilities: ['api-interceptor', 'mutation-guard'],\n factSection: 'apiRoutes',\n phases: ['before', 'after'],\n activation: 'host-opt-in',\n scopeContract: 'request-auth-scope',\n }))\n }\n for (const event of options.events) {\n const capabilities: ExtensionHostCapability[] = ['async-subscriber', 'sync-subscriber']\n if (event.clientBroadcast) capabilities.push('browser-client')\n if (event.portalBroadcast) capabilities.push('browser-portal')\n hosts.push(factRefHost({\n key: `event.${event.id}`,\n id: event.id,\n moduleId: options.moduleId,\n family: 'event',\n capabilities,\n factSection: 'events',\n scopeContract: 'tenant-organization-and-audience',\n }))\n }\n for (const entityId of options.searchEntities) {\n const eventStem = entityId.replace(':', '.')\n for (const phase of ['querying', 'queried'] as const) {\n hosts.push(factRefHost({\n key: `query-lifecycle.${eventStem}.${phase}`,\n id: `${eventStem}.${phase}`,\n moduleId: options.moduleId,\n family: 'query-lifecycle',\n capabilities: ['sync-subscriber'],\n factSection: 'searchEntities',\n phases: phase === 'querying' ? ['block', 'query-transform'] : ['result-transform', 'scope-reapply'],\n activation: 'caller-opt-in',\n scopeContract: 'tenant-and-organization-reapplied-after-result',\n }))\n }\n }\n const apiHosts = apiExtensionHostIds(options.moduleId, options.moduleRoot)\n for (const entityId of apiHosts.entityIds) {\n hosts.push(factRefHost({\n key: `api-entity.${entityId}`,\n id: entityId,\n moduleId: options.moduleId,\n family: 'entity',\n capabilities: ['response-enricher', 'query-enricher', 'mutation-guard'],\n factSection: 'apiRoutes',\n activation: 'host-opt-in',\n scopeContract: 'tenant-and-organization',\n }))\n }\n return sortHosts([...new Map(hosts.map((host) => [`${host.family}:${host.id}`, host])).values()])\n}\n\nfunction contributionBase(\n id: string,\n sourcePath: string,\n sourceSymbol?: string,\n): ModuleExtensionContributionBase {\n return {\n id,\n targets: [],\n scopeContract: 'tenant-and-organization',\n source: { path: sourcePath, ...(sourceSymbol ? { symbol: sourceSymbol } : {}) },\n }\n}\n\nfunction extractInjectionTable(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n const filePath = conventionPath(options.moduleRoot, 'widgets/injection-table.ts')\n if (!filePath) return []\n const table = readRootObject(filePath, 'injectionTable')\n if (!table) return []\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, filePath)\n const facts: ModuleExtensionContributionFact[] = []\n for (const targetId of Object.keys(table).sort((left, right) => left.localeCompare(right))) {\n const entries = table[targetId]\n if (!Array.isArray(entries)) continue\n for (const entry of entries) {\n if (!isStaticObject(entry)) continue\n const widgetId = stringValue(entry.widgetId)\n if (!widgetId) continue\n const payload = targetId.endsWith(':columns') ? 'column'\n : targetId.endsWith(':row-actions') ? 'row-action'\n : targetId.endsWith(':bulk-actions') ? 'bulk-action'\n : targetId.endsWith(':filters') ? 'filter'\n : targetId.endsWith(':fields') ? 'field'\n : 'render'\n const base = contributionBase(`${widgetId}@${targetId}`, sourcePath, 'injectionTable')\n const shared = {\n ...base,\n targets: [target(targetId)],\n features: strings(entry.features),\n placement: numberValue(entry.priority) !== undefined ? { priority: numberValue(entry.priority) } : undefined,\n }\n if (targetId.startsWith('data-table:')) {\n facts.push({\n ...shared,\n kind: 'data-table',\n details: {\n payload: payload === 'field' ? 'render' : payload,\n tableId: targetId.replace(/^data-table:/, '').replace(/:(?:columns|row-actions|bulk-actions|filters|toolbar|header|footer|search-trailing)$/, ''),\n executionGuard: strings(entry.features).length > 0 ? 'both' : 'host',\n },\n })\n } else if (targetId.startsWith('crud-form:')) {\n facts.push({\n ...shared,\n kind: 'crud-form',\n details: {\n payload: payload === 'field' ? 'field' : 'render',\n entityId: targetId.replace(/^crud-form:/, '').replace(/:(?:fields|header)$/, ''),\n requestHeaderCapability: payload === 'field',\n },\n })\n } else {\n facts.push({\n ...shared,\n kind: 'widget',\n details: {\n payload: 'render',\n registryKey: widgetId,\n executionGuard: strings(entry.features).length > 0 ? 'both' : 'host',\n },\n })\n }\n }\n }\n return facts\n}\n\nfunction extractObjectConvention(options: {\n module: ExtractModuleExtensionFactsOptions\n relativePath: string\n exportName: string\n exportAliases?: string[]\n build: (entry: StaticObject, sourcePath: string, index: number) => ModuleExtensionContributionFact | null\n}): ModuleExtensionContributionFact[] {\n const filePath = conventionPath(options.module.moduleRoot, options.relativePath)\n if (!filePath) return []\n const exportNames = [options.exportName, ...(options.exportAliases ?? [])]\n const entries = exportNames.reduce<StaticObject[]>((found, exportName) =>\n found.length > 0 ? found : readConventionObjectArray(filePath, exportName), [])\n const sourcePath = portablePath(options.module.moduleRoot, options.module.sourceRoot, filePath)\n return entries.flatMap((entry, index) => options.build(entry, sourcePath, index) ?? [])\n}\n\nfunction methodPhases(entry: StaticObject, map: ReadonlyArray<[string, string]>): string[] {\n return map.flatMap(([property, phase]) => entry[property] === true ? [phase] : [])\n}\n\nfunction extractEnrichers(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'data/enrichers.ts',\n exportName: 'enrichers',\n build(entry, sourcePath, index) {\n const id = stringValue(entry.id) ?? `${options.moduleId}.enricher.${index}`\n const targetEntity = stringValue(entry.targetEntity)\n if (!targetEntity) return null\n const timeoutMs = numberValue(entry.timeout) ?? 2000\n const queryEngine = isStaticObject(entry.queryEngine) ? entry.queryEngine : null\n const surfaces = [entry.enrichMany === true ? 'list' : null, entry.enrichOne === true ? 'detail' : null]\n .filter((value): value is 'list' | 'detail' => value !== null)\n const base = contributionBase(id, sourcePath, id)\n return {\n ...base,\n kind: 'response-enricher',\n targets: [openTarget(targetEntity)],\n features: strings(entry.features),\n phases: surfaces,\n activation: queryEngine ? 'caller-opt-in' : 'host-opt-in',\n roundTripId: `${targetEntity}:read`,\n details: {\n targetEntity,\n surfaces,\n timeoutMs,\n fallback: entry.fallback === undefined ? 'none' : 'configured',\n critical: booleanValue(entry.critical) ?? false,\n cachePosture: 'rerun-on-list-cache-hit',\n ...(queryEngine ? { queryEngine: {\n engines: strings(queryEngine.engines),\n applyOn: (strings(queryEngine.applyOn).length > 0 ? strings(queryEngine.applyOn) : ['list', 'detail'])\n .filter((value): value is 'list' | 'detail' => value === 'list' || value === 'detail'),\n activation: 'caller-opt-in' as const,\n } } : {}),\n },\n }\n },\n })\n}\n\nfunction extractApiInterceptors(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'api/interceptors.ts',\n exportName: 'interceptors',\n build(entry, sourcePath, index) {\n const id = stringValue(entry.id) ?? `${options.moduleId}.api-interceptor.${index}`\n const targetRoute = stringValue(entry.targetRoute)\n if (!targetRoute) return null\n const phases = methodPhases(entry, [['before', 'before'], ['after', 'after']])\n .filter((phase): phase is 'before' | 'after' => phase === 'before' || phase === 'after')\n const methods = strings(entry.methods)\n const base = contributionBase(id, sourcePath, id)\n return {\n ...base,\n kind: 'api-interceptor',\n targets: [openTarget(targetRoute)],\n phases,\n features: strings(entry.features),\n details: {\n route: targetRoute,\n methods,\n phases,\n activation: targetRoute.startsWith('/') ? 'custom-route-bridge' : 'crud-pipeline',\n timeoutMs: numberValue(entry.timeout) ?? 2000,\n failurePosture: booleanValue(entry.critical) ? 'fail-closed' : 'fallback',\n },\n }\n },\n })\n}\n\nfunction extractCommandInterceptors(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'commands/interceptors.ts',\n exportName: 'interceptors',\n build(entry, sourcePath, index) {\n const id = stringValue(entry.id) ?? `${options.moduleId}.command-interceptor.${index}`\n const targetCommand = stringValue(entry.targetCommand)\n if (!targetCommand) return null\n const phases = methodPhases(entry, [\n ['beforeExecute', 'before-execute'],\n ['afterExecute', 'after-execute'],\n ['beforeUndo', 'before-undo'],\n ['afterUndo', 'after-undo'],\n ]).filter((phase): phase is 'before-execute' | 'after-execute' | 'before-undo' | 'after-undo' =>\n phase === 'before-execute' || phase === 'after-execute' || phase === 'before-undo' || phase === 'after-undo')\n const base = contributionBase(id, sourcePath, id)\n return {\n ...base,\n kind: 'command-interceptor',\n targets: [openTarget(targetCommand)],\n phases,\n features: strings(entry.features),\n details: { targetCommand, phases },\n }\n },\n })\n}\n\nfunction extractGuards(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'data/guards.ts',\n exportName: 'guards',\n build(entry, sourcePath, index) {\n const id = stringValue(entry.id) ?? `${options.moduleId}.guard.${index}`\n const targetEntity = stringValue(entry.targetEntity)\n if (!targetEntity) return null\n const operations = strings(entry.operations)\n .filter((operation): operation is 'create' | 'update' | 'delete' =>\n operation === 'create' || operation === 'update' || operation === 'delete')\n const capabilities = [entry.validate === true ? 'block' : null, entry.validate === true ? 'rewrite' : null, entry.afterSuccess === true ? 'after-success' : null]\n .filter((value): value is 'block' | 'rewrite' | 'after-success' => value !== null)\n const base = contributionBase(id, sourcePath, id)\n return {\n ...base,\n kind: 'mutation-guard',\n targets: [openTarget(targetEntity)],\n operations,\n features: strings(entry.features),\n roundTripId: `${targetEntity}:write`,\n details: { entityId: targetEntity, operations, capabilities, optimisticLock: 'preserved' },\n }\n },\n })\n}\n\nfunction extractEntityExtensions(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'data/extensions.ts',\n exportName: 'entityExtensions',\n exportAliases: ['extensions'],\n build(entry, sourcePath, index) {\n const baseEntity = stringValue(entry.base)\n const extensionEntity = stringValue(entry.extension)\n const join = isStaticObject(entry.join) ? entry.join : null\n if (!baseEntity || !extensionEntity || !join) return null\n const id = `${options.moduleId}.entity-extension.${index}:${baseEntity}->${extensionEntity}`\n const contribution = contributionBase(id, sourcePath, 'extensions')\n return {\n ...contribution,\n kind: 'entity-extension',\n targets: [openTarget(baseEntity)],\n details: {\n hostEntityId: baseEntity,\n extensionEntityId: extensionEntity,\n linkId: `${stringValue(join.baseKey) ?? 'id'}:${stringValue(join.extensionKey) ?? 'id'}`,\n scopeContract: 'tenant-and-organization',\n orphanContract: booleanValue(entry.required) ? 'required' : 'optional',\n },\n }\n },\n })\n}\n\nfunction extractSubscribers(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n const directory = path.join(options.moduleRoot, 'subscribers')\n if (!fs.existsSync(directory)) return []\n const facts: ModuleExtensionContributionFact[] = []\n for (const entry of fs.readdirSync(directory, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name))) {\n if (!entry.isFile() || !/\\.(?:ts|tsx)$/.test(entry.name) || /\\.(?:test|spec)\\./.test(entry.name)) continue\n const filePath = path.join(directory, entry.name)\n const metadata = readRootObject(filePath, 'metadata')\n if (!metadata) continue\n const event = stringValue(metadata.event)\n if (!event) continue\n const subscriberId = stringValue(metadata.id) ?? `${options.moduleId}:${entry.name.replace(/\\.tsx?$/, '')}`\n const persistent = booleanValue(metadata.persistent) ?? false\n const sync = booleanValue(metadata.sync) ?? !persistent\n const contribution = contributionBase(subscriberId, portablePath(options.moduleRoot, options.sourceRoot, filePath), 'metadata')\n facts.push({\n ...contribution,\n kind: 'subscriber',\n targets: [openTarget(event)],\n phases: sync ? ['before-or-after'] : ['async-delivery'],\n details: {\n event,\n subscriberId,\n persistent,\n sync,\n ...(numberValue(metadata.priority) !== undefined ? { priority: numberValue(metadata.priority) as number } : {}),\n },\n })\n }\n return facts\n}\n\nfunction extractBrowserReactions(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return options.events.flatMap((event) => {\n const transports = [event.clientBroadcast ? 'client' : null, event.portalBroadcast ? 'portal' : null]\n .filter((value): value is 'client' | 'portal' => value !== null)\n if (transports.length === 0) return []\n const contribution = contributionBase(`${event.id}.browser`, path.posix.join(options.sourceRoot, 'events.ts'), 'events')\n return [{\n ...contribution,\n kind: 'browser-reaction' as const,\n targets: [factTarget(event.id, 'events')],\n details: {\n transports,\n hooks: transports.flatMap((transport) => transport === 'client' ? ['useAppEvent', 'useOperationProgress'] : ['usePortalAppEvent']),\n audienceScopeContract: 'tenant-organization-user-role-and-customer',\n },\n }]\n })\n}\n\nfunction extractNotificationReactions(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'notifications.handlers.ts',\n exportName: 'notificationHandlers',\n build(entry, sourcePath, index) {\n const notificationType = stringValue(entry.notificationType)\n if (!notificationType) return null\n const id = stringValue(entry.id) ?? `${options.moduleId}.notification-handler.${index}`\n const contribution = contributionBase(id, sourcePath, 'notificationHandlers')\n return {\n ...contribution,\n kind: 'browser-reaction',\n targets: [factTarget(notificationType, 'notifications')],\n features: strings(entry.features),\n placement: numberValue(entry.priority) !== undefined ? { priority: numberValue(entry.priority) } : undefined,\n details: {\n transports: ['notification-effect'],\n hooks: ['useNotificationEffect'],\n audienceScopeContract: 'tenant-organization-user-role-and-customer',\n },\n }\n },\n })\n}\n\nfunction extractComponentOverrides(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'widgets/components.ts',\n exportName: 'componentOverrides',\n build(entry, sourcePath, index) {\n const targetDefinition = isStaticObject(entry.target) ? entry.target : null\n const handle = targetDefinition ? stringValue(targetDefinition.componentId) : undefined\n if (!handle) return null\n const mode = entry.wrapper !== undefined ? 'wrapper' : entry.props !== undefined ? 'props' : 'replace'\n const id = `${options.moduleId}.component-override.${index}:${handle}`\n const contribution = contributionBase(id, sourcePath, 'componentOverrides')\n return {\n ...contribution,\n kind: 'component-override',\n targets: [target(handle)],\n details: {\n handle,\n mode,\n propsContract: stringValue(entry.propsContract) ?? 'component-props-schema',\n },\n }\n },\n })\n}\n\nfunction extractSpecializedRegistries(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n const facts: ModuleExtensionContributionFact[] = []\n const add = (\n id: string,\n registry: SpecializedRegistry,\n sourcePath: string,\n specialistRoute: string,\n symbol = id,\n ): void => {\n const contributionId = `${registry}:${id}`\n const contribution = contributionBase(contributionId, sourcePath, id)\n const fact: ModuleExtensionContributionFact = {\n ...contribution,\n kind: 'specialized-registry',\n targets: [factTarget(id, specialistRoute)],\n source: { path: sourcePath, symbol },\n details: { registry, registryId: id, specialistRoute },\n }\n const existingIndex = facts.findIndex((entry) => entry.id === contributionId)\n if (existingIndex >= 0) facts[existingIndex] = fact\n else facts.push(fact)\n }\n for (const id of options.notifications ?? []) add(id, 'notification', path.posix.join(options.sourceRoot, 'notifications.ts'), 'notifications')\n for (const id of options.searchEntities) add(id, 'search', path.posix.join(options.sourceRoot, 'search.ts'), 'search')\n for (const tool of options.aiTools ?? []) add(tool.name, 'ai', tool.sourcePath, 'aiTools')\n for (const agent of options.aiAgents ?? []) add(agent.id, 'ai', agent.sourcePath, 'aiAgents')\n\n const vectorPath = conventionPath(options.moduleRoot, 'vector.ts')\n if (vectorPath) {\n const vectorConfig = readRootObject(vectorPath, 'vectorConfig') ?? readRootObject(vectorPath, 'config')\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, vectorPath)\n if (vectorConfig && Array.isArray(vectorConfig.entities)) {\n for (const entity of vectorConfig.entities) {\n if (!isStaticObject(entity)) continue\n const entityId = stringValue(entity.entityId)\n if (entityId) add(entityId, 'vector', sourcePath, 'vector', 'vectorConfig')\n }\n }\n }\n\n const integrationPath = conventionPath(options.moduleRoot, 'integration.ts')\n if (integrationPath) {\n const integration = readRootObject(integrationPath, 'integration')\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, integrationPath)\n const integrationId = integration ? stringValue(integration.id) : undefined\n if (integrationId) add(integrationId, 'integration', sourcePath, 'integrations', 'integration')\n const providerKey = integration ? stringValue(integration.providerKey) : undefined\n const category = integration ? stringValue(integration.category) : undefined\n const categoryRegistry = category === 'payment' ? 'payment'\n : category === 'shipping' ? 'shipping'\n : category === 'currency' ? 'currency'\n : null\n if (providerKey && categoryRegistry) {\n const specialistRoute = categoryRegistry === 'payment' ? 'paymentGateways'\n : categoryRegistry === 'shipping' ? 'shippingCarriers'\n : 'currencies'\n add(providerKey, categoryRegistry, sourcePath, specialistRoute, 'integration.providerKey')\n }\n }\n\n const workflowsPath = conventionPath(options.moduleRoot, 'workflows.ts')\n if (workflowsPath) {\n const config = readRootObject(workflowsPath, 'workflowsConfig')\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, workflowsPath)\n if (config && Array.isArray(config.workflows)) {\n for (const workflow of config.workflows) {\n if (!isStaticObject(workflow)) continue\n const workflowId = stringValue(workflow.workflowId)\n if (workflowId) add(workflowId, 'workflow', sourcePath, 'workflows', 'workflowsConfig')\n }\n }\n }\n\n const diPath = conventionPath(options.moduleRoot, 'di.ts')\n if (diPath) {\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, diPath)\n const registrations = readCallObjectArguments(diPath, new Set([\n 'registerPaymentGatewayDescriptor',\n 'registerShippingAdapter',\n 'registerCurrencyProvider',\n ]))\n for (const registration of registrations) {\n const registry = registration.callee === 'registerPaymentGatewayDescriptor' ? 'payment'\n : registration.callee === 'registerShippingAdapter' ? 'shipping'\n : 'currency'\n const registryId = stringValue(registration.value.providerKey)\n ?? stringValue(registration.value.key)\n ?? stringValue(registration.value.id)\n if (!registryId) continue\n const specialistRoute = registry === 'payment' ? 'paymentGateways'\n : registry === 'shipping' ? 'shippingCarriers'\n : 'currencies'\n add(registryId, registry, sourcePath, specialistRoute, registration.callee)\n }\n }\n\n const dashboardRoots = { appBase: path.join(options.moduleRoot, '__app__'), pkgBase: options.moduleRoot }\n for (const widgetFile of scanModuleDir(dashboardRoots, SCAN_CONFIGS.dashboardWidgets)) {\n const filePath = path.join(options.moduleRoot, 'widgets', 'dashboard', widgetFile.relPath)\n const widget = readRootObject(filePath, 'widget')\n const metadata = widget && isStaticObject(widget.metadata) ? widget.metadata : null\n if (!metadata) continue\n const widgetId = stringValue(metadata.id)\n if (!widgetId) continue\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, filePath)\n const contribution = contributionBase(`dashboard:${widgetId}`, sourcePath, 'widget.metadata')\n facts.push({\n ...contribution,\n kind: 'widget',\n targets: [target(`dashboard:${widgetId}`)],\n features: strings(metadata.features),\n details: {\n payload: 'dashboard',\n registryKey: widgetId,\n executionGuard: strings(metadata.features).length > 0 ? 'both' : 'host',\n },\n })\n }\n return facts\n}\n\nexport function extractModuleExtensionFacts(options: ExtractModuleExtensionFactsOptions): ModuleExtensionSurfaceFacts {\n const declared = extractDeclaredHosts(options)\n const hosts = sortHosts([...declared.hosts, ...extractFactRefHosts(options)])\n const contributions = sortContributions([\n ...extractInjectionTable(options),\n ...extractEnrichers(options),\n ...extractApiInterceptors(options),\n ...extractCommandInterceptors(options),\n ...extractGuards(options),\n ...extractEntityExtensions(options),\n ...extractSubscribers(options),\n ...extractBrowserReactions(options),\n ...extractNotificationReactions(options),\n ...extractComponentOverrides(options),\n ...extractSpecializedRegistries(options),\n ])\n return { hosts, contributions, unresolved: declared.unresolved }\n}\n\nfunction patternMatches(pattern: string, targetId: string): boolean {\n const escaped = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\\\\\{[^}]+\\\\\\}/g, '[^:]+')\n .replace(/\\*/g, '.*')\n return new RegExp(`^${escaped}$`).test(targetId)\n}\n\nfunction targetModuleId(targetId: string): string | null {\n const withoutPrefix = targetId.replace(/^(?:data-table|crud-form|detail|portal-page):/, '')\n const match = /^([a-z][a-z0-9_]*)[.:]/.exec(withoutPrefix)\n return match?.[1] ?? null\n}\n\nexport function correlateExtensionTarget(\n targetFact: ModuleExtensionTargetFact,\n options: CorrelateExtensionFactsOptions,\n): ModuleExtensionTargetFact {\n if (targetFact.resolution !== 'unresolved') return targetFact\n const allHosts = Object.values(options.surfacesByModule).flatMap((surface) => surface.hosts)\n if (targetFact.id.includes('*') || targetFact.id.includes('{')) {\n const knownIds = [\n ...allHosts.filter((host) => host.bound).map((host) => host.id),\n ...options.entityIds,\n ...options.eventIds,\n ...options.apiRoutes,\n ...(options.commandIds ?? []),\n ]\n if (targetFact.id === '*' || knownIds.some((knownId) => patternMatches(targetFact.id, knownId))) {\n return { id: targetFact.id, resolution: 'pattern' }\n }\n }\n const exact = allHosts.find((host) => host.bound && (\n host.id === targetFact.id\n || host.aliases?.includes(targetFact.id)\n || (host.family === 'api-route' && host.id.endsWith(`/${targetFact.id}`))\n ))\n if (exact) {\n return exact.source.kind === 'fact-ref'\n ? factTarget(targetFact.id, exact.source.factSection, exact.source.factKey)\n : { id: targetFact.id, resolution: 'exact' }\n }\n const patterned = allHosts.find((host) => host.bound && host.resolution === 'pattern' && patternMatches(host.id, targetFact.id))\n if (patterned) return { id: targetFact.id, resolution: 'pattern' }\n const framework = allFrameworkHosts().find((host) => patternMatches(host.id, targetFact.id))\n ?? (FRAMEWORK_PREFIXES.some((prefix) => targetFact.id.startsWith(prefix)) ? FRAMEWORK_HOSTS[0] : undefined)\n if (framework) return { id: targetFact.id, resolution: 'framework' }\n if (options.entityIds.has(targetFact.id)) {\n return { id: targetFact.id, resolution: 'fact-ref', factRef: { factSection: 'entities', factKey: targetFact.id } }\n }\n if (options.eventIds.has(targetFact.id)) {\n return { id: targetFact.id, resolution: 'fact-ref', factRef: { factSection: 'events', factKey: targetFact.id } }\n }\n if (options.commandIds?.has(targetFact.id)) {\n return factTarget(targetFact.id, 'commands')\n }\n const route = [...options.apiRoutes].find((apiRoute) => apiRoute === targetFact.id || apiRoute.endsWith(`/${targetFact.id}`))\n if (route) return { id: targetFact.id, resolution: 'fact-ref', factRef: { factSection: 'apiRoutes', factKey: route } }\n const ownerModule = targetModuleId(targetFact.id)\n if (ownerModule && !options.surfacesByModule[ownerModule]) {\n return { id: targetFact.id, resolution: 'optional-external', optionalOwnerPackage: `module:${ownerModule}` }\n }\n if (ownerModule && options.contributingModuleId && ownerModule !== options.contributingModuleId) {\n return { id: targetFact.id, resolution: 'optional-external', optionalOwnerPackage: `module:${ownerModule}` }\n }\n return targetFact\n}\n\nexport function correlateModuleExtensionFacts(options: CorrelateExtensionFactsOptions): Record<string, ModuleExtensionSurfaceFacts> {\n const result: Record<string, ModuleExtensionSurfaceFacts> = {}\n for (const moduleId of Object.keys(options.surfacesByModule).sort((left, right) => left.localeCompare(right))) {\n const surface = options.surfacesByModule[moduleId]\n const unresolved: ModuleExtensionUnresolvedFact[] = [...surface.unresolved]\n const contributions = surface.contributions.map((contribution) => {\n const targets = contribution.targets.map((entry) => correlateExtensionTarget(entry, {\n ...options,\n contributingModuleId: moduleId,\n }))\n for (const entry of targets) {\n if (entry.resolution !== 'unresolved') continue\n unresolved.push({\n key: `${contribution.id}:${entry.id}`,\n source: contribution.source,\n reason: 'unresolved-first-party-target',\n })\n }\n return { ...contribution, targets }\n })\n result[moduleId] = {\n hosts: sortHosts([...surface.hosts]),\n contributions: sortContributions(contributions),\n unresolved: unresolved.sort((left, right) => left.key.localeCompare(right.key)),\n }\n }\n return result\n}\n\nexport function assertNoUnresolvedExtensionTargets(\n surfacesByModule: Readonly<Record<string, ModuleExtensionSurfaceFacts>>,\n): void {\n const unresolved = Object.entries(surfacesByModule).flatMap(([moduleId, surface]) =>\n surface.unresolved\n .filter((entry) => entry.reason === 'unresolved-first-party-target')\n .map((entry) => `${moduleId}:${entry.key}`),\n ).sort((left, right) => left.localeCompare(right))\n if (unresolved.length > 0) {\n throw new Error(`[module-facts] unresolved first-party extension targets: ${unresolved.join(', ')}`)\n }\n}\n\nexport function getFrameworkExtensionHosts(): ModuleExtensionHostFact[] {\n return sortHosts(allFrameworkHosts().map((host) => ({\n ...host,\n capabilities: [...host.capabilities],\n ...(host.operations ? { operations: [...host.operations] } : {}),\n })))\n}\n\nexport function renderFrameworkExtensionPointsMarkdown(): string {\n const rows = getFrameworkExtensionHosts().map((host) =>\n `| ${host.id} | ${host.family} | ${[...host.capabilities, ...(host.operations ?? [])].join(', ')} | ${host.stability.toUpperCase()} |`,\n )\n return [\n '# Framework extension points (generated, do not edit)',\n '',\n '| ID / pattern | Family | Supports | Stability |',\n '|---|---|---|---|',\n ...rows,\n '',\n ].join('\\n')\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["id", "fact"]
|
|
7
|
+
}
|
|
@@ -2,6 +2,14 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import ts from "typescript-js";
|
|
4
4
|
import { toSnake } from "../utils.js";
|
|
5
|
+
import {
|
|
6
|
+
assertNoUnresolvedExtensionTargets,
|
|
7
|
+
correlateModuleExtensionFacts,
|
|
8
|
+
extractKnownApiRouteIds,
|
|
9
|
+
extractKnownCommandIds,
|
|
10
|
+
extractModuleExtensionFacts,
|
|
11
|
+
renderFrameworkExtensionPointsMarkdown
|
|
12
|
+
} from "./module-extension-facts.js";
|
|
5
13
|
function readSourceFile(filePath) {
|
|
6
14
|
if (!fs.existsSync(filePath)) return null;
|
|
7
15
|
const source = fs.readFileSync(filePath, "utf8");
|
|
@@ -240,7 +248,11 @@ function extractEvents(eventsFilePath) {
|
|
|
240
248
|
category: category ?? null,
|
|
241
249
|
entity: entity ?? null
|
|
242
250
|
};
|
|
251
|
+
const clientBroadcast = readBooleanPropertyInitializer(element, "clientBroadcast");
|
|
252
|
+
const portalBroadcast = readBooleanPropertyInitializer(element, "portalBroadcast");
|
|
243
253
|
if (label !== void 0) fact.label = label;
|
|
254
|
+
if (clientBroadcast !== void 0) fact.clientBroadcast = clientBroadcast;
|
|
255
|
+
if (portalBroadcast !== void 0) fact.portalBroadcast = portalBroadcast;
|
|
244
256
|
facts.push(fact);
|
|
245
257
|
}
|
|
246
258
|
return facts;
|
|
@@ -753,6 +765,18 @@ function extractModuleFacts(options) {
|
|
|
753
765
|
entityIds: extractHostEntityIds(entities),
|
|
754
766
|
tableIds: extractTableIds(moduleRoot)
|
|
755
767
|
};
|
|
768
|
+
const extensionSurfaces = extractModuleExtensionFacts({
|
|
769
|
+
moduleId,
|
|
770
|
+
moduleRoot,
|
|
771
|
+
sourceRoot,
|
|
772
|
+
entities,
|
|
773
|
+
events,
|
|
774
|
+
apiRoutes,
|
|
775
|
+
searchEntities,
|
|
776
|
+
notifications,
|
|
777
|
+
aiTools,
|
|
778
|
+
aiAgents
|
|
779
|
+
});
|
|
756
780
|
return {
|
|
757
781
|
module: moduleId,
|
|
758
782
|
title,
|
|
@@ -775,6 +799,7 @@ function extractModuleFacts(options) {
|
|
|
775
799
|
cliCommands,
|
|
776
800
|
aiTools,
|
|
777
801
|
aiAgents,
|
|
802
|
+
extensionSurfaces,
|
|
778
803
|
warnings
|
|
779
804
|
};
|
|
780
805
|
}
|
|
@@ -802,9 +827,12 @@ function renderEventsSection(events) {
|
|
|
802
827
|
if (events.length === 0) return `${heading}
|
|
803
828
|
|
|
804
829
|
${EMPTY_SECTION_MARKER}`;
|
|
805
|
-
const header = "| ID | Category | Entity |";
|
|
806
|
-
const divider = "
|
|
807
|
-
const rows = events.map((event) =>
|
|
830
|
+
const header = "| ID | Category | Entity | Browser transport |";
|
|
831
|
+
const divider = "|---|---|---|---|";
|
|
832
|
+
const rows = events.map((event) => {
|
|
833
|
+
const transports = [event.clientBroadcast ? "client" : null, event.portalBroadcast ? "portal" : null].filter((value) => value !== null);
|
|
834
|
+
return `| ${event.id} | ${event.category ?? "\u2014"} | ${event.entity ?? "\u2014"} | ${transports.join(", ") || "\u2014"} |`;
|
|
835
|
+
});
|
|
808
836
|
return [heading, "", header, divider, ...rows].join("\n");
|
|
809
837
|
}
|
|
810
838
|
function renderInlineListSection(heading, values) {
|
|
@@ -859,7 +887,70 @@ function renderHostTokensSection(hostTokens) {
|
|
|
859
887
|
const tableIdsLine = hostTokens.tableIds.length > 0 ? hostTokens.tableIds.join(" \xB7 ") : EMPTY_SECTION_MARKER;
|
|
860
888
|
return ["## Host extension points", "", `- Entity IDs: ${entityIdsLine}`, `- Table IDs: ${tableIdsLine}`].join("\n");
|
|
861
889
|
}
|
|
890
|
+
function renderExtensionHostContext(host) {
|
|
891
|
+
return host.contextContract ?? host.runtimeContract ?? host.scopeContract ?? "\u2014";
|
|
892
|
+
}
|
|
893
|
+
function renderExtensionHostsSection(extensionSurfaces) {
|
|
894
|
+
const boundHosts = extensionSurfaces.hosts.filter((host) => host.bound);
|
|
895
|
+
if (boundHosts.length === 0) return `## UMES hosts
|
|
896
|
+
|
|
897
|
+
${EMPTY_SECTION_MARKER}`;
|
|
898
|
+
const rows = boundHosts.map(
|
|
899
|
+
(host) => `| ${host.id} | ${host.family} | ${host.capabilities.join(", ") || "\u2014"} | ${renderExtensionHostContext(host)} | ${host.stability.toUpperCase()} |`
|
|
900
|
+
);
|
|
901
|
+
return [
|
|
902
|
+
"## UMES hosts",
|
|
903
|
+
"",
|
|
904
|
+
"| ID / pattern | Family | Supports | Context | Stability |",
|
|
905
|
+
"|---|---|---|---|---|",
|
|
906
|
+
...rows
|
|
907
|
+
].join("\n");
|
|
908
|
+
}
|
|
909
|
+
function compactContributionDetails(contribution) {
|
|
910
|
+
const details = contribution.details;
|
|
911
|
+
return Object.keys(details).sort((left, right) => left.localeCompare(right)).flatMap((key) => {
|
|
912
|
+
const value = details[key];
|
|
913
|
+
if (value === void 0) return [];
|
|
914
|
+
if (Array.isArray(value)) return [`${key}=${value.join(",") || "none"}`];
|
|
915
|
+
if (value && typeof value === "object") {
|
|
916
|
+
const nested = Object.keys(value).sort((left, right) => left.localeCompare(right)).map((nestedKey) => {
|
|
917
|
+
const nestedValue = value[nestedKey];
|
|
918
|
+
return `${nestedKey}:${Array.isArray(nestedValue) ? nestedValue.join(",") : String(nestedValue)}`;
|
|
919
|
+
});
|
|
920
|
+
return [`${key}={${nested.join(";")}}`];
|
|
921
|
+
}
|
|
922
|
+
return [`${key}=${String(value)}`];
|
|
923
|
+
}).join("; ");
|
|
924
|
+
}
|
|
925
|
+
function renderExtensionContributionsSection(extensionSurfaces) {
|
|
926
|
+
if (extensionSurfaces.contributions.length === 0) return `## UMES contributions
|
|
927
|
+
|
|
928
|
+
${EMPTY_SECTION_MARKER}`;
|
|
929
|
+
const rows = extensionSurfaces.contributions.map((contribution) => {
|
|
930
|
+
const targets = contribution.targets.map((entry) => entry.id).join(", ");
|
|
931
|
+
const resolution = contribution.targets.map((entry) => entry.resolution).join(", ");
|
|
932
|
+
const phases = [...contribution.phases ?? [], ...contribution.operations ?? []].join(", ") || "\u2014";
|
|
933
|
+
return `| ${contribution.id} | ${contribution.kind} | ${targets || "\u2014"} | ${phases} | ${compactContributionDetails(contribution)} | ${resolution || "\u2014"} |`;
|
|
934
|
+
});
|
|
935
|
+
return [
|
|
936
|
+
"## UMES contributions",
|
|
937
|
+
"",
|
|
938
|
+
"| ID | Kind | Target | Phase / operations | Contract | Resolution |",
|
|
939
|
+
"|---|---|---|---|---|---|",
|
|
940
|
+
...rows
|
|
941
|
+
].join("\n");
|
|
942
|
+
}
|
|
943
|
+
function renderExtensionDiagnosticsSection(extensionSurfaces) {
|
|
944
|
+
const unbound = extensionSurfaces.hosts.filter((host) => !host.bound);
|
|
945
|
+
if (unbound.length === 0 && extensionSurfaces.unresolved.length === 0) return "";
|
|
946
|
+
const diagnostics = [
|
|
947
|
+
...unbound.map((host) => `- unbound-helper: ${host.id}`),
|
|
948
|
+
...extensionSurfaces.unresolved.map((entry) => `- ${entry.reason}: ${entry.key} (${entry.source.path})`)
|
|
949
|
+
];
|
|
950
|
+
return ["## UMES diagnostics", "", ...diagnostics].join("\n");
|
|
951
|
+
}
|
|
862
952
|
function renderModuleFactsMarkdown(facts) {
|
|
953
|
+
const extensionSurfaces = facts.extensionSurfaces ?? { hosts: [], contributions: [], unresolved: [] };
|
|
863
954
|
const sections = [
|
|
864
955
|
`# ${facts.module} \u2014 module facts (generated, do not edit)`,
|
|
865
956
|
renderVersionStamp(facts.coreVersion, facts.sourcePackage, facts.sourceVersion),
|
|
@@ -883,6 +974,12 @@ function renderModuleFactsMarkdown(facts) {
|
|
|
883
974
|
"",
|
|
884
975
|
renderHostTokensSection(facts.hostTokens),
|
|
885
976
|
"",
|
|
977
|
+
renderExtensionHostsSection(extensionSurfaces),
|
|
978
|
+
"",
|
|
979
|
+
renderExtensionContributionsSection(extensionSurfaces),
|
|
980
|
+
"",
|
|
981
|
+
renderExtensionDiagnosticsSection(extensionSurfaces),
|
|
982
|
+
"",
|
|
886
983
|
renderInlineListSection("## Notifications", facts.notifications),
|
|
887
984
|
"",
|
|
888
985
|
renderLinkedFactsSection("## CLI commands", facts.cliCommands.map((command) => ({ label: command.command, sourcePath: command.sourcePath }))),
|
|
@@ -903,7 +1000,13 @@ function toModuleFactsJsonEntry(facts) {
|
|
|
903
1000
|
sourceVersion: facts.sourceVersion,
|
|
904
1001
|
sourceRoot: facts.sourceRoot,
|
|
905
1002
|
entities: facts.entities,
|
|
906
|
-
events: facts.events.map((event) => ({
|
|
1003
|
+
events: facts.events.map((event) => ({
|
|
1004
|
+
id: event.id,
|
|
1005
|
+
category: event.category,
|
|
1006
|
+
entity: event.entity,
|
|
1007
|
+
...event.clientBroadcast !== void 0 ? { clientBroadcast: event.clientBroadcast } : {},
|
|
1008
|
+
...event.portalBroadcast !== void 0 ? { portalBroadcast: event.portalBroadcast } : {}
|
|
1009
|
+
})),
|
|
907
1010
|
aclFeatures: facts.aclFeatures,
|
|
908
1011
|
apiRoutes: facts.apiRoutes,
|
|
909
1012
|
diTokens: facts.diTokens,
|
|
@@ -915,7 +1018,8 @@ function toModuleFactsJsonEntry(facts) {
|
|
|
915
1018
|
frontendPages: facts.frontendPages,
|
|
916
1019
|
cliCommands: facts.cliCommands,
|
|
917
1020
|
aiTools: facts.aiTools,
|
|
918
|
-
aiAgents: facts.aiAgents
|
|
1021
|
+
aiAgents: facts.aiAgents,
|
|
1022
|
+
...facts.extensionSurfaces ? { extensionSurfaces: facts.extensionSurfaces } : {}
|
|
919
1023
|
};
|
|
920
1024
|
}
|
|
921
1025
|
function buildModuleFactsJsonObject(factsByModule) {
|
|
@@ -948,10 +1052,33 @@ function extractAllModuleFacts(options) {
|
|
|
948
1052
|
registrySource: options.registrySource ?? null
|
|
949
1053
|
});
|
|
950
1054
|
factsByModule[source.moduleId] = facts;
|
|
951
|
-
markdownByModule[source.moduleId] = renderModuleFactsMarkdown(facts);
|
|
952
1055
|
warnings.push(...facts.warnings);
|
|
953
1056
|
}
|
|
954
|
-
|
|
1057
|
+
const surfacesByModule = Object.fromEntries(
|
|
1058
|
+
Object.entries(factsByModule).map(([moduleId, facts]) => [
|
|
1059
|
+
moduleId,
|
|
1060
|
+
facts.extensionSurfaces ?? { hosts: [], contributions: [], unresolved: [] }
|
|
1061
|
+
])
|
|
1062
|
+
);
|
|
1063
|
+
const correlated = correlateModuleExtensionFacts({
|
|
1064
|
+
surfacesByModule,
|
|
1065
|
+
entityIds: new Set(Object.values(factsByModule).flatMap((facts) => facts.entities.map((entity) => entity.id))),
|
|
1066
|
+
eventIds: new Set(Object.values(factsByModule).flatMap((facts) => facts.events.map((event) => event.id))),
|
|
1067
|
+
apiRoutes: /* @__PURE__ */ new Set([
|
|
1068
|
+
...Object.values(factsByModule).flatMap((facts) => facts.apiRoutes.map((route) => route.path)),
|
|
1069
|
+
...sources.flatMap((source) => extractKnownApiRouteIds(source.moduleId, source.moduleRoot))
|
|
1070
|
+
]),
|
|
1071
|
+
commandIds: new Set(sources.flatMap((source) => extractKnownCommandIds(source.moduleId, source.moduleRoot)))
|
|
1072
|
+
});
|
|
1073
|
+
assertNoUnresolvedExtensionTargets(correlated);
|
|
1074
|
+
for (const moduleId of Object.keys(factsByModule).sort((left, right) => left.localeCompare(right))) {
|
|
1075
|
+
factsByModule[moduleId].extensionSurfaces = correlated[moduleId];
|
|
1076
|
+
markdownByModule[moduleId] = renderModuleFactsMarkdown(factsByModule[moduleId]);
|
|
1077
|
+
warnings.push(...correlated[moduleId].unresolved.map(
|
|
1078
|
+
(entry) => `[module-facts] ${moduleId} ${entry.reason}: ${entry.key} (${entry.source.path})`
|
|
1079
|
+
));
|
|
1080
|
+
}
|
|
1081
|
+
return { factsByModule, markdownByModule, warnings, frameworkMarkdown: renderFrameworkExtensionPointsMarkdown() };
|
|
955
1082
|
}
|
|
956
1083
|
export {
|
|
957
1084
|
buildModuleFactsJsonObject,
|