@celerity-sdk/cli 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extract/cli.cjs +1 -1
- package/dist/extract/cli.cjs.map +1 -1
- package/dist/extract/cli.js +2 -2
- package/dist/extract/cli.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/extract/cli.cjs
CHANGED
|
@@ -120,7 +120,7 @@ function validateScannedDependencies(scanned) {
|
|
|
120
120
|
}
|
|
121
121
|
} else if (typeof dep === "function") {
|
|
122
122
|
walk(dep, (0, import_core.getClassDependencyTokens)(dep));
|
|
123
|
-
} else if (!(0, import_common.
|
|
123
|
+
} else if (!(0, import_common.isRuntimeProvidedToken)(dep)) {
|
|
124
124
|
diagnostics.push({
|
|
125
125
|
consumer: serializeToken(token),
|
|
126
126
|
dependency: serializeToken(dep)
|
package/dist/extract/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/extract/cli.ts","../../src/extract/metadata-app.ts","../../src/extract/serializer.ts","../../src/extract/path-utils.ts","../../src/extract/identity.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { resolve } from \"node:path\";\nimport createDebug from \"debug\";\nimport { buildScannedModule, validateScannedDependencies } from \"./metadata-app\";\nimport { serializeManifest } from \"./serializer\";\nimport type { Type } from \"@celerity-sdk/types\";\n\nconst debug = createDebug(\"celerity:cli\");\n\ninterface CliArgs {\n module: string;\n projectRoot: string;\n}\n\nfunction parseArgs(argv: string[]): CliArgs {\n let modulePath: string | undefined;\n let projectRoot: string | undefined;\n\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--module\" && i + 1 < argv.length) {\n modulePath = argv[++i];\n } else if (arg === \"--project-root\" && i + 1 < argv.length) {\n projectRoot = argv[++i];\n }\n }\n\n if (!modulePath) {\n throw new Error(\"Missing required argument: --module <path>\");\n }\n\n return {\n module: resolve(modulePath),\n projectRoot: projectRoot ? resolve(projectRoot) : process.cwd(),\n };\n}\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv);\n debug(\"extract: module=%s projectRoot=%s\", args.module, args.projectRoot);\n\n // Dynamically import the user's compiled module\n const imported = (await import(args.module)) as Record<string, unknown>;\n\n // Look for the root module class — prefer default export, fall back to first Type export\n const rootModule = (imported.default ?? findModuleExport(imported)) as Type | undefined;\n if (!rootModule || typeof rootModule !== \"function\") {\n throw new Error(\n `Could not find a module class in \"${args.module}\". Ensure the module is exported as the default export or as a named export.`,\n );\n }\n debug(\"extract: root module found: %s\", rootModule.name);\n\n // Scan metadata without instantiating anything\n const scanned = buildScannedModule(rootModule);\n debug(\n \"extract: scanned %d controllers, %d function handlers, %d providers\",\n scanned.controllerClasses.length,\n scanned.functionHandlers.length,\n scanned.providers.length,\n );\n\n // Validate dependency graph before proceeding\n const diagnostics = validateScannedDependencies(scanned);\n debug(\"extract: %d dependency diagnostics\", diagnostics.length);\n if (diagnostics.length > 0) {\n const details = diagnostics\n .map(\n ({ consumer, dependency }) =>\n ` ${consumer} requires ${dependency} — no provider registered`,\n )\n .join(\"\\n\");\n const message =\n `Unresolvable dependencies detected:\\n\\n${details}\\n\\n` +\n \"For each unresolved dependency, check that the module providing it is included\\n\" +\n 'in your root module\\'s \"imports\" array, or register a provider for it directly.';\n throw new Error(message);\n }\n\n if (scanned.controllerClasses.length === 0 && scanned.functionHandlers.length === 0) {\n process.stderr.write(`Warning: No handlers found in module \"${args.module}\"\\n`);\n }\n\n // Serialize to manifest JSON\n const manifest = serializeManifest(scanned, args.module, {\n projectRoot: args.projectRoot,\n });\n\n // Output JSON to stdout\n process.stdout.write(JSON.stringify(manifest, null, 2) + \"\\n\");\n}\n\nfunction findModuleExport(imported: Record<string, unknown>): unknown {\n for (const key of Object.keys(imported)) {\n if (key === \"default\") continue;\n const value = imported[key];\n if (typeof value === \"function\") {\n return value;\n }\n }\n return undefined;\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(JSON.stringify({ error: message }) + \"\\n\");\n process.exitCode = 1;\n});\n","import \"reflect-metadata\";\nimport createDebug from \"debug\";\nimport type {\n Type,\n InjectionToken,\n Provider,\n FunctionHandlerDefinition,\n GuardDefinition,\n} from \"@celerity-sdk/types\";\nimport { isResourceLayerToken } from \"@celerity-sdk/common\";\nimport {\n buildModuleGraph,\n getClassDependencyTokens,\n getProviderDependencyTokens,\n} from \"@celerity-sdk/core\";\nimport type { ModuleGraph } from \"@celerity-sdk/core\";\n\nconst debug = createDebug(\"celerity:cli\");\n\nexport type ScannedProvider = {\n token: InjectionToken;\n providerType: \"class\" | \"factory\" | \"value\";\n dependencies: InjectionToken[];\n};\n\nexport type ScannedModule = {\n controllerClasses: Type[];\n functionHandlers: FunctionHandlerDefinition[];\n guardClasses: Type[];\n functionGuards: GuardDefinition[];\n providers: ScannedProvider[];\n};\n\nfunction scanProvider(\n provider: Type | (Provider & { provide: InjectionToken }),\n seenTokens: Set<InjectionToken>,\n): ScannedProvider | null {\n if (typeof provider === \"function\") {\n if (seenTokens.has(provider)) return null;\n seenTokens.add(provider);\n return {\n token: provider,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(provider),\n };\n }\n\n const typed = provider as Provider & { provide: InjectionToken };\n if (seenTokens.has(typed.provide)) return null;\n seenTokens.add(typed.provide);\n\n return {\n token: typed.provide,\n providerType: \"useFactory\" in typed ? \"factory\" : \"useClass\" in typed ? \"class\" : \"value\",\n dependencies: getProviderDependencyTokens(typed),\n };\n}\n\n/**\n * Builds a scanned module from the root module class using the shared\n * `buildModuleGraph` from core. Collects all handler classes, function\n * handler definitions, and provider dependency information without\n * instantiating anything.\n *\n * Inherits circular import detection from the shared graph builder.\n */\nexport function buildScannedModule(rootModule: Type): ScannedModule {\n const graph: ModuleGraph = buildModuleGraph(rootModule);\n const controllerClasses: Type[] = [];\n const functionHandlers: FunctionHandlerDefinition[] = [];\n const guardClasses: Type[] = [];\n const functionGuards: GuardDefinition[] = [];\n const providers: ScannedProvider[] = [];\n const seenTokens = new Set<InjectionToken>();\n\n for (const [moduleClass, node] of graph) {\n debug(\n \"scan: module %s — %d providers, %d controllers, %d guards\",\n moduleClass.name,\n node.providers.length,\n node.controllers.length,\n node.guards.length,\n );\n for (const provider of node.providers) {\n const scanned = scanProvider(provider, seenTokens);\n if (scanned) providers.push(scanned);\n }\n\n for (const controller of node.controllers) {\n controllerClasses.push(controller);\n if (!seenTokens.has(controller)) {\n seenTokens.add(controller);\n providers.push({\n token: controller,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(controller),\n });\n }\n }\n\n for (const guard of node.guards) {\n if (typeof guard === \"function\") {\n guardClasses.push(guard);\n if (!seenTokens.has(guard)) {\n seenTokens.add(guard);\n providers.push({\n token: guard,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(guard),\n });\n }\n } else {\n functionGuards.push(guard);\n }\n }\n\n functionHandlers.push(...node.functionHandlers);\n }\n\n return { controllerClasses, functionHandlers, guardClasses, functionGuards, providers };\n}\n\nexport type DependencyDiagnostic = {\n consumer: string;\n dependency: string;\n};\n\n/**\n * Validates that all scanned providers have resolvable dependencies.\n * Returns an array of diagnostics for each unresolvable dependency.\n * A token is resolvable if it's registered or is a class (implicitly constructable).\n */\nexport function validateScannedDependencies(scanned: ScannedModule): DependencyDiagnostic[] {\n const registeredTokens = new Set<InjectionToken>(scanned.providers.map((p) => p.token));\n const diagnostics: DependencyDiagnostic[] = [];\n const visited = new Set<InjectionToken>();\n\n function walk(token: InjectionToken, deps: InjectionToken[]): void {\n if (visited.has(token)) return;\n visited.add(token);\n\n for (const dep of deps) {\n if (registeredTokens.has(dep)) {\n const provider = scanned.providers.find((p) => p.token === dep);\n if (provider) {\n walk(dep, provider.dependencies);\n }\n } else if (typeof dep === \"function\") {\n walk(dep, getClassDependencyTokens(dep as Type));\n } else if (!isResourceLayerToken(dep)) {\n diagnostics.push({\n consumer: serializeToken(token),\n dependency: serializeToken(dep),\n });\n }\n }\n }\n\n for (const provider of scanned.providers) {\n walk(provider.token, provider.dependencies);\n }\n\n return diagnostics;\n}\n\nfunction serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return String(token);\n}\n","import \"reflect-metadata\";\nimport type {\n Type,\n HttpMethod,\n InjectionToken,\n GuardDefinition,\n FunctionHandlerDefinition,\n} from \"@celerity-sdk/types\";\nimport {\n CONTROLLER_METADATA,\n HTTP_METHOD_METADATA,\n ROUTE_PATH_METADATA,\n WEBSOCKET_CONTROLLER_METADATA,\n WEBSOCKET_EVENT_METADATA,\n CONSUMER_METADATA,\n CONSUMER_HANDLER_METADATA,\n SCHEDULE_HANDLER_METADATA,\n INVOKE_METADATA,\n GUARD_PROTECTEDBY_METADATA,\n GUARD_CUSTOM_METADATA,\n PUBLIC_METADATA,\n CUSTOM_METADATA,\n USE_RESOURCE_METADATA,\n} from \"@celerity-sdk/core\";\nimport type {\n ControllerMetadata,\n WebSocketEventMetadata,\n ConsumerHandlerMetadata,\n ScheduleHandlerMetadata,\n InvokeMetadata,\n ConsumerMetadata,\n} from \"@celerity-sdk/core\";\nimport type { ScannedModule } from \"./metadata-app\";\nimport type {\n HandlerManifest,\n ClassHandlerEntry,\n FunctionHandlerEntry,\n GuardHandlerEntry,\n DependencyGraph,\n DependencyNode,\n} from \"./types\";\nimport { joinHandlerPath } from \"./path-utils\";\nimport {\n deriveClassResourceName,\n deriveClassHandlerName,\n deriveClassHandlerFunction,\n deriveCodeLocation,\n deriveFunctionResourceName,\n deriveFunctionHandlerFunction,\n} from \"./identity\";\n\nexport type SerializeOptions = {\n projectRoot: string;\n};\n\nexport function serializeManifest(\n scanned: ScannedModule,\n sourceFile: string,\n options: SerializeOptions,\n): HandlerManifest {\n const handlers: ClassHandlerEntry[] = [];\n const functionHandlers: FunctionHandlerEntry[] = [];\n const guardHandlers: GuardHandlerEntry[] = [];\n\n for (const controllerClass of scanned.controllerClasses) {\n const entries = serializeClassHandlers(controllerClass, sourceFile, options);\n handlers.push(...entries);\n }\n\n for (const fnHandler of scanned.functionHandlers) {\n const entry = serializeFunctionHandler(fnHandler, sourceFile, options);\n if (entry) {\n functionHandlers.push(entry);\n }\n }\n\n for (const guardClass of scanned.guardClasses) {\n const entry = serializeClassGuard(guardClass, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n for (const fnGuard of scanned.functionGuards) {\n const entry = serializeFunctionGuard(fnGuard, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n return {\n version: \"1.0.0\",\n handlers,\n functionHandlers,\n guardHandlers,\n dependencyGraph: serializeDependencyGraph(scanned),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Controller meta extraction\n// ---------------------------------------------------------------------------\n\ntype ControllerType = \"http\" | \"websocket\" | \"consumer\";\n\ntype ControllerMeta = {\n controllerType: ControllerType;\n prefix: string;\n source?: string;\n protectedBy: string[];\n customGuardName: string | undefined;\n customMetadata: Record<string, unknown>;\n resourceRefs: string[];\n};\n\nfunction extractControllerMeta(controllerClass: Type): ControllerMeta | null {\n const httpMeta: ControllerMetadata | undefined = Reflect.getOwnMetadata(\n CONTROLLER_METADATA,\n controllerClass,\n );\n if (httpMeta) {\n return {\n controllerType: \"http\",\n prefix: httpMeta.prefix ?? \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const isWebSocket: boolean | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_CONTROLLER_METADATA,\n controllerClass,\n );\n if (isWebSocket) {\n return {\n controllerType: \"websocket\",\n prefix: \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const consumerMeta: ConsumerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_METADATA,\n controllerClass,\n );\n if (consumerMeta) {\n return {\n controllerType: \"consumer\",\n prefix: \"\",\n source: consumerMeta.source,\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n return null;\n}\n\nfunction extractSharedClassMeta(controllerClass: Type) {\n return {\n protectedBy:\n (Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, controllerClass) as string[]) ?? [],\n customGuardName: Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, controllerClass) as\n | string\n | undefined,\n customMetadata:\n (Reflect.getOwnMetadata(CUSTOM_METADATA, controllerClass) as Record<string, unknown>) ?? {},\n resourceRefs:\n (Reflect.getOwnMetadata(USE_RESOURCE_METADATA, controllerClass) as string[]) ?? [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared annotation helpers\n// ---------------------------------------------------------------------------\n\nfunction appendSharedAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n): void {\n const methodProtectedBy: string[] =\n Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, prototype, methodName) ?? [];\n const allProtectedBy = [...meta.protectedBy, ...methodProtectedBy];\n if (allProtectedBy.length > 0) {\n annotations[\"celerity.handler.guard.protectedBy\"] = allProtectedBy;\n }\n if (meta.customGuardName) {\n annotations[\"celerity.handler.guard.custom\"] = meta.customGuardName;\n }\n\n const isPublic: boolean = Reflect.getOwnMetadata(PUBLIC_METADATA, prototype, methodName) === true;\n if (isPublic) {\n annotations[\"celerity.handler.public\"] = true;\n }\n\n const methodCustomMetadata: Record<string, unknown> =\n Reflect.getOwnMetadata(CUSTOM_METADATA, prototype, methodName) ?? {};\n const customMetadata = { ...meta.customMetadata, ...methodCustomMetadata };\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const methodResourceRefs: string[] =\n Reflect.getOwnMetadata(USE_RESOURCE_METADATA, prototype, methodName) ?? [];\n const allResourceRefs = [...new Set([...meta.resourceRefs, ...methodResourceRefs])];\n if (allResourceRefs.length > 0) {\n annotations[\"celerity.handler.resource.ref\"] = allResourceRefs;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type-specific annotation builders (class handlers)\n// ---------------------------------------------------------------------------\n\nfunction buildHttpAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n httpMethod: HttpMethod,\n fullPath: string,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = httpMethod;\n annotations[\"celerity.handler.http.path\"] = fullPath;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildWebSocketAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n wsEvent: WebSocketEventMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.websocket\"] = true;\n annotations[\"celerity.handler.websocket.route\"] = wsEvent.route;\n annotations[\"celerity.handler.websocket.eventType\"] = wsEvent.eventType;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildConsumerAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n consumerHandler: ConsumerHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.consumer\"] = true;\n if (meta.source) {\n annotations[\"celerity.handler.consumer.source\"] = meta.source;\n }\n if (consumerHandler.route) {\n annotations[\"celerity.handler.consumer.route\"] = consumerHandler.route;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildScheduleAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n scheduleMeta: ScheduleHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.schedule\"] = true;\n if (scheduleMeta.source) {\n annotations[\"celerity.handler.schedule.source\"] = scheduleMeta.source;\n }\n if (scheduleMeta.schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = scheduleMeta.schedule;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildCustomAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n invokeMeta: InvokeMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.custom\"] = true;\n annotations[\"celerity.handler.custom.name\"] = invokeMeta.name;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\n// ---------------------------------------------------------------------------\n// Class handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeClassHandlers(\n controllerClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry[] {\n const meta = extractControllerMeta(controllerClass);\n if (!meta) return [];\n\n const className = controllerClass.name;\n const prototype = controllerClass.prototype as object;\n const methods = Object.getOwnPropertyNames(prototype).filter((n) => n !== \"constructor\");\n const entries: ClassHandlerEntry[] = [];\n\n for (const methodName of methods) {\n // Type-specific handler decorator for the controller type.\n const typeEntry = serializeControllerTypeMethod(\n meta,\n className,\n prototype,\n methodName,\n sourceFile,\n options,\n );\n if (typeEntry) entries.push(typeEntry);\n\n // Cross-cutting: @ScheduleHandler on any controller type.\n const scheduleMeta: ScheduleHandlerMetadata | undefined = Reflect.getOwnMetadata(\n SCHEDULE_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (scheduleMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"schedule\",\n annotations: buildScheduleAnnotations(meta, prototype, methodName, scheduleMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n\n // Cross-cutting: @Invoke on any controller type.\n const invokeMeta: InvokeMetadata | undefined = Reflect.getOwnMetadata(\n INVOKE_METADATA,\n prototype,\n methodName,\n );\n if (invokeMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"custom\",\n annotations: buildCustomAnnotations(meta, prototype, methodName, invokeMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n }\n\n return entries;\n}\n\nfunction serializeControllerTypeMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n switch (meta.controllerType) {\n case \"http\":\n return serializeHttpMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"websocket\":\n return serializeWebSocketMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"consumer\":\n return serializeConsumerMethod(meta, className, prototype, methodName, sourceFile, options);\n default:\n return null;\n }\n}\n\nfunction serializeHttpMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const httpMethod: HttpMethod | undefined = Reflect.getOwnMetadata(\n HTTP_METHOD_METADATA,\n prototype,\n methodName,\n );\n if (!httpMethod) return null;\n\n const routePath: string =\n Reflect.getOwnMetadata(ROUTE_PATH_METADATA, prototype, methodName) ?? \"/\";\n const fullPath = joinHandlerPath(meta.prefix, routePath);\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"http\",\n annotations: buildHttpAnnotations(meta, prototype, methodName, httpMethod, fullPath),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeWebSocketMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const wsEvent: WebSocketEventMetadata | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_EVENT_METADATA,\n prototype,\n methodName,\n );\n if (!wsEvent) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"websocket\",\n annotations: buildWebSocketAnnotations(meta, prototype, methodName, wsEvent),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeConsumerMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const consumerHandler: ConsumerHandlerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (!consumerHandler) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"consumer\",\n annotations: buildConsumerAnnotations(meta, prototype, methodName, consumerHandler),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Function handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeFunctionHandler(\n definition: FunctionHandlerDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): FunctionHandlerEntry | null {\n // \"workflow\" is not part of v0 — skip unsupported handler types.\n const supported = [\"http\", \"websocket\", \"consumer\", \"schedule\", \"custom\"] as const;\n type SupportedType = (typeof supported)[number];\n if (!supported.includes(definition.type as SupportedType)) return null;\n\n const exportName = (definition.metadata.handlerName as string) ?? \"handler\";\n const customMetadata = (definition.metadata.customMetadata as Record<string, unknown>) ?? {};\n const handlerType = definition.type as SupportedType;\n\n const annotations: Record<string, string | string[] | boolean> = {};\n\n buildFunctionTypeAnnotations(annotations, definition);\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n exportName,\n sourceFile,\n handlerType,\n ...(Object.keys(annotations).length > 0 ? { annotations } : {}),\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\nfunction buildFunctionTypeAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n definition: FunctionHandlerDefinition,\n): void {\n const meta = definition.metadata;\n\n switch (definition.type) {\n case \"http\": {\n const path = meta.path as string | undefined;\n const method = meta.method as string | undefined;\n if (path !== undefined && method !== undefined) {\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = method;\n annotations[\"celerity.handler.http.path\"] = path;\n }\n break;\n }\n case \"websocket\": {\n annotations[\"celerity.handler.websocket\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.websocket.route\"] = route;\n }\n break;\n }\n case \"consumer\": {\n annotations[\"celerity.handler.consumer\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.consumer.route\"] = route;\n }\n break;\n }\n case \"schedule\": {\n annotations[\"celerity.handler.schedule\"] = true;\n const source = meta.source as string | undefined;\n if (source) {\n annotations[\"celerity.handler.schedule.source\"] = source;\n }\n const schedule = meta.schedule as string | undefined;\n if (schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = schedule;\n }\n break;\n }\n case \"custom\": {\n annotations[\"celerity.handler.custom\"] = true;\n const name = meta.name as string | undefined;\n if (name) {\n annotations[\"celerity.handler.custom.name\"] = name;\n }\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Guard serialization (unchanged)\n// ---------------------------------------------------------------------------\n\ntype GuardMeta = {\n guardName: string;\n customMetadata: Record<string, unknown>;\n};\n\nfunction extractGuardMeta(guardClass: Type): GuardMeta | null {\n const guardName: string | undefined = Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, guardClass);\n if (!guardName) return null;\n\n return {\n guardName,\n customMetadata: Reflect.getOwnMetadata(CUSTOM_METADATA, guardClass) ?? {},\n };\n}\n\nfunction serializeClassGuard(\n guardClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const meta = extractGuardMeta(guardClass);\n if (!meta) return null;\n\n const className = guardClass.name;\n const methodName = \"check\";\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": meta.guardName,\n };\n\n for (const [key, value] of Object.entries(meta.customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n guardName: meta.guardName,\n sourceFile,\n guardType: \"class\",\n className,\n annotations,\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeFunctionGuard(\n definition: GuardDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const guardName = definition.name;\n if (!guardName) return null;\n\n const meta = (definition.metadata ?? {}) as {\n customMetadata?: Record<string, unknown>;\n };\n const customMetadata = meta.customMetadata ?? {};\n\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": guardName,\n };\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const exportName = guardName;\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n guardName,\n sourceFile,\n guardType: \"function\",\n exportName,\n annotations,\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction serializeAnnotationValue(value: unknown): string | string[] | boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value;\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n return JSON.stringify(value);\n}\n\nexport function serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return token;\n}\n\nexport function tokenType(token: InjectionToken): \"class\" | \"string\" | \"symbol\" {\n if (typeof token === \"function\") return \"class\";\n if (typeof token === \"symbol\") return \"symbol\";\n return \"string\";\n}\n\nfunction serializeDependencyGraph(scanned: ScannedModule): DependencyGraph {\n const nodes: DependencyNode[] = scanned.providers.map((provider) => ({\n token: serializeToken(provider.token),\n tokenType: tokenType(provider.token),\n providerType: provider.providerType,\n dependencies: provider.dependencies.map(serializeToken),\n }));\n\n return { nodes };\n}\n","export { joinHandlerPath } from \"@celerity-sdk/common\";\n","import { basename, dirname, relative } from \"node:path\";\n\n/**\n * Derives a resource name for a class-based handler method.\n * Format: camelCase(className) + \"_\" + methodName\n *\n * @example deriveClassResourceName(\"OrdersHandler\", \"getOrder\") => \"ordersHandler_getOrder\"\n */\nexport function deriveClassResourceName(className: string, methodName: string): string {\n const camelClass = className.charAt(0).toLowerCase() + className.slice(1);\n return `${camelClass}_${methodName}`;\n}\n\n/**\n * Derives a handler name for a class-based handler method.\n * Format: className + \"-\" + methodName\n *\n * @example deriveClassHandlerName(\"OrdersHandler\", \"getOrder\") => \"OrdersHandler-getOrder\"\n */\nexport function deriveClassHandlerName(className: string, methodName: string): string {\n return `${className}-${methodName}`;\n}\n\n/**\n * Derives the handler function reference for a class-based handler.\n * Format: moduleBaseName + \".\" + className + \".\" + methodName\n *\n * @example deriveClassHandlerFunction(\"src/handlers/orders.ts\", \"OrdersHandler\", \"getOrder\")\n * => \"orders.OrdersHandler.getOrder\"\n */\nexport function deriveClassHandlerFunction(\n sourceFile: string,\n className: string,\n methodName: string,\n): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${className}.${methodName}`;\n}\n\n/**\n * Derives a resource name for a function-based handler.\n * Uses the export name directly.\n *\n * @example deriveFunctionResourceName(\"getOrder\") => \"getOrder\"\n */\nexport function deriveFunctionResourceName(exportName: string): string {\n return exportName;\n}\n\n/**\n * Derives the handler function reference for a function-based handler.\n * Format: moduleBaseName + \".\" + exportName\n *\n * @example deriveFunctionHandlerFunction(\"src/handlers/orders.ts\", \"getOrder\")\n * => \"orders.getOrder\"\n */\nexport function deriveFunctionHandlerFunction(sourceFile: string, exportName: string): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${exportName}`;\n}\n\n/**\n * Derives the code location from a source file path relative to the project root.\n * Returns the directory prefixed with \"./\"\n *\n * @example deriveCodeLocation(\"src/handlers/orders.ts\", \"/project\") => \"./src/handlers\"\n */\nexport function deriveCodeLocation(sourceFile: string, projectRoot: string): string {\n const rel = relative(projectRoot, sourceFile);\n const dir = dirname(rel);\n return dir === \".\" ? \"./\" : `./${dir}`;\n}\n"],"mappings":"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","names":["import_node_path","import_debug","debug","createDebug","scanProvider","provider","seenTokens","has","add","token","providerType","dependencies","getClassDependencyTokens","typed","provide","getProviderDependencyTokens","buildScannedModule","rootModule","graph","buildModuleGraph","controllerClasses","functionHandlers","guardClasses","functionGuards","providers","Set","moduleClass","node","name","length","controllers","guards","scanned","push","controller","guard","validateScannedDependencies","registeredTokens","map","p","diagnostics","visited","walk","deps","dep","find","isResourceLayerToken","consumer","serializeToken","dependency","description","String","import_reflect_metadata","import_core","import_common","deriveClassResourceName","className","methodName","camelClass","charAt","toLowerCase","slice","deriveClassHandlerName","deriveClassHandlerFunction","sourceFile","base","basename","replace","deriveFunctionResourceName","exportName","deriveFunctionHandlerFunction","deriveCodeLocation","projectRoot","rel","relative","dir","dirname","serializeManifest","scanned","sourceFile","options","handlers","functionHandlers","guardHandlers","controllerClass","controllerClasses","entries","serializeClassHandlers","push","fnHandler","entry","serializeFunctionHandler","guardClass","guardClasses","serializeClassGuard","fnGuard","functionGuards","serializeFunctionGuard","version","dependencyGraph","serializeDependencyGraph","extractControllerMeta","httpMeta","Reflect","getOwnMetadata","CONTROLLER_METADATA","controllerType","prefix","extractSharedClassMeta","isWebSocket","WEBSOCKET_CONTROLLER_METADATA","consumerMeta","CONSUMER_METADATA","source","protectedBy","GUARD_PROTECTEDBY_METADATA","customGuardName","GUARD_CUSTOM_METADATA","customMetadata","CUSTOM_METADATA","resourceRefs","USE_RESOURCE_METADATA","appendSharedAnnotations","annotations","meta","prototype","methodName","methodProtectedBy","allProtectedBy","length","isPublic","PUBLIC_METADATA","methodCustomMetadata","key","value","Object","undefined","serializeAnnotationValue","methodResourceRefs","allResourceRefs","Set","buildHttpAnnotations","httpMethod","fullPath","buildWebSocketAnnotations","wsEvent","route","eventType","buildConsumerAnnotations","consumerHandler","buildScheduleAnnotations","scheduleMeta","schedule","buildCustomAnnotations","invokeMeta","name","className","methods","getOwnPropertyNames","filter","n","typeEntry","serializeControllerTypeMethod","SCHEDULE_HANDLER_METADATA","resourceName","deriveClassResourceName","handlerType","spec","handlerName","deriveClassHandlerName","codeLocation","deriveCodeLocation","projectRoot","handler","deriveClassHandlerFunction","INVOKE_METADATA","serializeHttpMethod","serializeWebSocketMethod","serializeConsumerMethod","HTTP_METHOD_METADATA","routePath","ROUTE_PATH_METADATA","joinHandlerPath","WEBSOCKET_EVENT_METADATA","CONSUMER_HANDLER_METADATA","definition","supported","includes","type","exportName","metadata","buildFunctionTypeAnnotations","deriveFunctionResourceName","keys","deriveFunctionHandlerFunction","path","method","extractGuardMeta","guardName","guardType","Array","isArray","every","v","JSON","stringify","serializeToken","token","description","tokenType","nodes","providers","map","provider","providerType","dependencies","debug","createDebug","parseArgs","argv","modulePath","projectRoot","i","length","arg","Error","module","resolve","process","cwd","main","args","imported","rootModule","default","findModuleExport","name","scanned","buildScannedModule","controllerClasses","functionHandlers","providers","diagnostics","validateScannedDependencies","details","map","consumer","dependency","join","message","stderr","write","manifest","serializeManifest","stdout","JSON","stringify","key","Object","keys","value","undefined","catch","error","String","exitCode"]}
|
|
1
|
+
{"version":3,"sources":["../../src/extract/cli.ts","../../src/extract/metadata-app.ts","../../src/extract/serializer.ts","../../src/extract/path-utils.ts","../../src/extract/identity.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { resolve } from \"node:path\";\nimport createDebug from \"debug\";\nimport { buildScannedModule, validateScannedDependencies } from \"./metadata-app\";\nimport { serializeManifest } from \"./serializer\";\nimport type { Type } from \"@celerity-sdk/types\";\n\nconst debug = createDebug(\"celerity:cli\");\n\ninterface CliArgs {\n module: string;\n projectRoot: string;\n}\n\nfunction parseArgs(argv: string[]): CliArgs {\n let modulePath: string | undefined;\n let projectRoot: string | undefined;\n\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--module\" && i + 1 < argv.length) {\n modulePath = argv[++i];\n } else if (arg === \"--project-root\" && i + 1 < argv.length) {\n projectRoot = argv[++i];\n }\n }\n\n if (!modulePath) {\n throw new Error(\"Missing required argument: --module <path>\");\n }\n\n return {\n module: resolve(modulePath),\n projectRoot: projectRoot ? resolve(projectRoot) : process.cwd(),\n };\n}\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv);\n debug(\"extract: module=%s projectRoot=%s\", args.module, args.projectRoot);\n\n // Dynamically import the user's compiled module\n const imported = (await import(args.module)) as Record<string, unknown>;\n\n // Look for the root module class — prefer default export, fall back to first Type export\n const rootModule = (imported.default ?? findModuleExport(imported)) as Type | undefined;\n if (!rootModule || typeof rootModule !== \"function\") {\n throw new Error(\n `Could not find a module class in \"${args.module}\". Ensure the module is exported as the default export or as a named export.`,\n );\n }\n debug(\"extract: root module found: %s\", rootModule.name);\n\n // Scan metadata without instantiating anything\n const scanned = buildScannedModule(rootModule);\n debug(\n \"extract: scanned %d controllers, %d function handlers, %d providers\",\n scanned.controllerClasses.length,\n scanned.functionHandlers.length,\n scanned.providers.length,\n );\n\n // Validate dependency graph before proceeding\n const diagnostics = validateScannedDependencies(scanned);\n debug(\"extract: %d dependency diagnostics\", diagnostics.length);\n if (diagnostics.length > 0) {\n const details = diagnostics\n .map(\n ({ consumer, dependency }) =>\n ` ${consumer} requires ${dependency} — no provider registered`,\n )\n .join(\"\\n\");\n const message =\n `Unresolvable dependencies detected:\\n\\n${details}\\n\\n` +\n \"For each unresolved dependency, check that the module providing it is included\\n\" +\n 'in your root module\\'s \"imports\" array, or register a provider for it directly.';\n throw new Error(message);\n }\n\n if (scanned.controllerClasses.length === 0 && scanned.functionHandlers.length === 0) {\n process.stderr.write(`Warning: No handlers found in module \"${args.module}\"\\n`);\n }\n\n // Serialize to manifest JSON\n const manifest = serializeManifest(scanned, args.module, {\n projectRoot: args.projectRoot,\n });\n\n // Output JSON to stdout\n process.stdout.write(JSON.stringify(manifest, null, 2) + \"\\n\");\n}\n\nfunction findModuleExport(imported: Record<string, unknown>): unknown {\n for (const key of Object.keys(imported)) {\n if (key === \"default\") continue;\n const value = imported[key];\n if (typeof value === \"function\") {\n return value;\n }\n }\n return undefined;\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(JSON.stringify({ error: message }) + \"\\n\");\n process.exitCode = 1;\n});\n","import \"reflect-metadata\";\nimport createDebug from \"debug\";\nimport type {\n Type,\n InjectionToken,\n Provider,\n FunctionHandlerDefinition,\n GuardDefinition,\n} from \"@celerity-sdk/types\";\nimport { isRuntimeProvidedToken } from \"@celerity-sdk/common\";\nimport {\n buildModuleGraph,\n getClassDependencyTokens,\n getProviderDependencyTokens,\n} from \"@celerity-sdk/core\";\nimport type { ModuleGraph } from \"@celerity-sdk/core\";\n\nconst debug = createDebug(\"celerity:cli\");\n\nexport type ScannedProvider = {\n token: InjectionToken;\n providerType: \"class\" | \"factory\" | \"value\";\n dependencies: InjectionToken[];\n};\n\nexport type ScannedModule = {\n controllerClasses: Type[];\n functionHandlers: FunctionHandlerDefinition[];\n guardClasses: Type[];\n functionGuards: GuardDefinition[];\n providers: ScannedProvider[];\n};\n\nfunction scanProvider(\n provider: Type | (Provider & { provide: InjectionToken }),\n seenTokens: Set<InjectionToken>,\n): ScannedProvider | null {\n if (typeof provider === \"function\") {\n if (seenTokens.has(provider)) return null;\n seenTokens.add(provider);\n return {\n token: provider,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(provider),\n };\n }\n\n const typed = provider as Provider & { provide: InjectionToken };\n if (seenTokens.has(typed.provide)) return null;\n seenTokens.add(typed.provide);\n\n return {\n token: typed.provide,\n providerType: \"useFactory\" in typed ? \"factory\" : \"useClass\" in typed ? \"class\" : \"value\",\n dependencies: getProviderDependencyTokens(typed),\n };\n}\n\n/**\n * Builds a scanned module from the root module class using the shared\n * `buildModuleGraph` from core. Collects all handler classes, function\n * handler definitions, and provider dependency information without\n * instantiating anything.\n *\n * Inherits circular import detection from the shared graph builder.\n */\nexport function buildScannedModule(rootModule: Type): ScannedModule {\n const graph: ModuleGraph = buildModuleGraph(rootModule);\n const controllerClasses: Type[] = [];\n const functionHandlers: FunctionHandlerDefinition[] = [];\n const guardClasses: Type[] = [];\n const functionGuards: GuardDefinition[] = [];\n const providers: ScannedProvider[] = [];\n const seenTokens = new Set<InjectionToken>();\n\n for (const [moduleClass, node] of graph) {\n debug(\n \"scan: module %s — %d providers, %d controllers, %d guards\",\n moduleClass.name,\n node.providers.length,\n node.controllers.length,\n node.guards.length,\n );\n for (const provider of node.providers) {\n const scanned = scanProvider(provider, seenTokens);\n if (scanned) providers.push(scanned);\n }\n\n for (const controller of node.controllers) {\n controllerClasses.push(controller);\n if (!seenTokens.has(controller)) {\n seenTokens.add(controller);\n providers.push({\n token: controller,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(controller),\n });\n }\n }\n\n for (const guard of node.guards) {\n if (typeof guard === \"function\") {\n guardClasses.push(guard);\n if (!seenTokens.has(guard)) {\n seenTokens.add(guard);\n providers.push({\n token: guard,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(guard),\n });\n }\n } else {\n functionGuards.push(guard);\n }\n }\n\n functionHandlers.push(...node.functionHandlers);\n }\n\n return { controllerClasses, functionHandlers, guardClasses, functionGuards, providers };\n}\n\nexport type DependencyDiagnostic = {\n consumer: string;\n dependency: string;\n};\n\n/**\n * Validates that all scanned providers have resolvable dependencies.\n * Returns an array of diagnostics for each unresolvable dependency.\n * A token is resolvable if it's registered or is a class (implicitly constructable).\n */\nexport function validateScannedDependencies(scanned: ScannedModule): DependencyDiagnostic[] {\n const registeredTokens = new Set<InjectionToken>(scanned.providers.map((p) => p.token));\n const diagnostics: DependencyDiagnostic[] = [];\n const visited = new Set<InjectionToken>();\n\n function walk(token: InjectionToken, deps: InjectionToken[]): void {\n if (visited.has(token)) return;\n visited.add(token);\n\n for (const dep of deps) {\n if (registeredTokens.has(dep)) {\n const provider = scanned.providers.find((p) => p.token === dep);\n if (provider) {\n walk(dep, provider.dependencies);\n }\n } else if (typeof dep === \"function\") {\n walk(dep, getClassDependencyTokens(dep as Type));\n } else if (!isRuntimeProvidedToken(dep)) {\n diagnostics.push({\n consumer: serializeToken(token),\n dependency: serializeToken(dep),\n });\n }\n }\n }\n\n for (const provider of scanned.providers) {\n walk(provider.token, provider.dependencies);\n }\n\n return diagnostics;\n}\n\nfunction serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return String(token);\n}\n","import \"reflect-metadata\";\nimport type {\n Type,\n HttpMethod,\n InjectionToken,\n GuardDefinition,\n FunctionHandlerDefinition,\n} from \"@celerity-sdk/types\";\nimport {\n CONTROLLER_METADATA,\n HTTP_METHOD_METADATA,\n ROUTE_PATH_METADATA,\n WEBSOCKET_CONTROLLER_METADATA,\n WEBSOCKET_EVENT_METADATA,\n CONSUMER_METADATA,\n CONSUMER_HANDLER_METADATA,\n SCHEDULE_HANDLER_METADATA,\n INVOKE_METADATA,\n GUARD_PROTECTEDBY_METADATA,\n GUARD_CUSTOM_METADATA,\n PUBLIC_METADATA,\n CUSTOM_METADATA,\n USE_RESOURCE_METADATA,\n} from \"@celerity-sdk/core\";\nimport type {\n ControllerMetadata,\n WebSocketEventMetadata,\n ConsumerHandlerMetadata,\n ScheduleHandlerMetadata,\n InvokeMetadata,\n ConsumerMetadata,\n} from \"@celerity-sdk/core\";\nimport type { ScannedModule } from \"./metadata-app\";\nimport type {\n HandlerManifest,\n ClassHandlerEntry,\n FunctionHandlerEntry,\n GuardHandlerEntry,\n DependencyGraph,\n DependencyNode,\n} from \"./types\";\nimport { joinHandlerPath } from \"./path-utils\";\nimport {\n deriveClassResourceName,\n deriveClassHandlerName,\n deriveClassHandlerFunction,\n deriveCodeLocation,\n deriveFunctionResourceName,\n deriveFunctionHandlerFunction,\n} from \"./identity\";\n\nexport type SerializeOptions = {\n projectRoot: string;\n};\n\nexport function serializeManifest(\n scanned: ScannedModule,\n sourceFile: string,\n options: SerializeOptions,\n): HandlerManifest {\n const handlers: ClassHandlerEntry[] = [];\n const functionHandlers: FunctionHandlerEntry[] = [];\n const guardHandlers: GuardHandlerEntry[] = [];\n\n for (const controllerClass of scanned.controllerClasses) {\n const entries = serializeClassHandlers(controllerClass, sourceFile, options);\n handlers.push(...entries);\n }\n\n for (const fnHandler of scanned.functionHandlers) {\n const entry = serializeFunctionHandler(fnHandler, sourceFile, options);\n if (entry) {\n functionHandlers.push(entry);\n }\n }\n\n for (const guardClass of scanned.guardClasses) {\n const entry = serializeClassGuard(guardClass, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n for (const fnGuard of scanned.functionGuards) {\n const entry = serializeFunctionGuard(fnGuard, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n return {\n version: \"1.0.0\",\n handlers,\n functionHandlers,\n guardHandlers,\n dependencyGraph: serializeDependencyGraph(scanned),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Controller meta extraction\n// ---------------------------------------------------------------------------\n\ntype ControllerType = \"http\" | \"websocket\" | \"consumer\";\n\ntype ControllerMeta = {\n controllerType: ControllerType;\n prefix: string;\n source?: string;\n protectedBy: string[];\n customGuardName: string | undefined;\n customMetadata: Record<string, unknown>;\n resourceRefs: string[];\n};\n\nfunction extractControllerMeta(controllerClass: Type): ControllerMeta | null {\n const httpMeta: ControllerMetadata | undefined = Reflect.getOwnMetadata(\n CONTROLLER_METADATA,\n controllerClass,\n );\n if (httpMeta) {\n return {\n controllerType: \"http\",\n prefix: httpMeta.prefix ?? \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const isWebSocket: boolean | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_CONTROLLER_METADATA,\n controllerClass,\n );\n if (isWebSocket) {\n return {\n controllerType: \"websocket\",\n prefix: \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const consumerMeta: ConsumerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_METADATA,\n controllerClass,\n );\n if (consumerMeta) {\n return {\n controllerType: \"consumer\",\n prefix: \"\",\n source: consumerMeta.source,\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n return null;\n}\n\nfunction extractSharedClassMeta(controllerClass: Type) {\n return {\n protectedBy:\n (Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, controllerClass) as string[]) ?? [],\n customGuardName: Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, controllerClass) as\n | string\n | undefined,\n customMetadata:\n (Reflect.getOwnMetadata(CUSTOM_METADATA, controllerClass) as Record<string, unknown>) ?? {},\n resourceRefs:\n (Reflect.getOwnMetadata(USE_RESOURCE_METADATA, controllerClass) as string[]) ?? [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared annotation helpers\n// ---------------------------------------------------------------------------\n\nfunction appendSharedAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n): void {\n const methodProtectedBy: string[] =\n Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, prototype, methodName) ?? [];\n const allProtectedBy = [...meta.protectedBy, ...methodProtectedBy];\n if (allProtectedBy.length > 0) {\n annotations[\"celerity.handler.guard.protectedBy\"] = allProtectedBy;\n }\n if (meta.customGuardName) {\n annotations[\"celerity.handler.guard.custom\"] = meta.customGuardName;\n }\n\n const isPublic: boolean = Reflect.getOwnMetadata(PUBLIC_METADATA, prototype, methodName) === true;\n if (isPublic) {\n annotations[\"celerity.handler.public\"] = true;\n }\n\n const methodCustomMetadata: Record<string, unknown> =\n Reflect.getOwnMetadata(CUSTOM_METADATA, prototype, methodName) ?? {};\n const customMetadata = { ...meta.customMetadata, ...methodCustomMetadata };\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const methodResourceRefs: string[] =\n Reflect.getOwnMetadata(USE_RESOURCE_METADATA, prototype, methodName) ?? [];\n const allResourceRefs = [...new Set([...meta.resourceRefs, ...methodResourceRefs])];\n if (allResourceRefs.length > 0) {\n annotations[\"celerity.handler.resource.ref\"] = allResourceRefs;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type-specific annotation builders (class handlers)\n// ---------------------------------------------------------------------------\n\nfunction buildHttpAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n httpMethod: HttpMethod,\n fullPath: string,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = httpMethod;\n annotations[\"celerity.handler.http.path\"] = fullPath;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildWebSocketAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n wsEvent: WebSocketEventMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.websocket\"] = true;\n annotations[\"celerity.handler.websocket.route\"] = wsEvent.route;\n annotations[\"celerity.handler.websocket.eventType\"] = wsEvent.eventType;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildConsumerAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n consumerHandler: ConsumerHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.consumer\"] = true;\n if (meta.source) {\n annotations[\"celerity.handler.consumer.source\"] = meta.source;\n }\n if (consumerHandler.route) {\n annotations[\"celerity.handler.consumer.route\"] = consumerHandler.route;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildScheduleAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n scheduleMeta: ScheduleHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.schedule\"] = true;\n if (scheduleMeta.source) {\n annotations[\"celerity.handler.schedule.source\"] = scheduleMeta.source;\n }\n if (scheduleMeta.schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = scheduleMeta.schedule;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildCustomAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n invokeMeta: InvokeMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.custom\"] = true;\n annotations[\"celerity.handler.custom.name\"] = invokeMeta.name;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\n// ---------------------------------------------------------------------------\n// Class handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeClassHandlers(\n controllerClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry[] {\n const meta = extractControllerMeta(controllerClass);\n if (!meta) return [];\n\n const className = controllerClass.name;\n const prototype = controllerClass.prototype as object;\n const methods = Object.getOwnPropertyNames(prototype).filter((n) => n !== \"constructor\");\n const entries: ClassHandlerEntry[] = [];\n\n for (const methodName of methods) {\n // Type-specific handler decorator for the controller type.\n const typeEntry = serializeControllerTypeMethod(\n meta,\n className,\n prototype,\n methodName,\n sourceFile,\n options,\n );\n if (typeEntry) entries.push(typeEntry);\n\n // Cross-cutting: @ScheduleHandler on any controller type.\n const scheduleMeta: ScheduleHandlerMetadata | undefined = Reflect.getOwnMetadata(\n SCHEDULE_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (scheduleMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"schedule\",\n annotations: buildScheduleAnnotations(meta, prototype, methodName, scheduleMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n\n // Cross-cutting: @Invoke on any controller type.\n const invokeMeta: InvokeMetadata | undefined = Reflect.getOwnMetadata(\n INVOKE_METADATA,\n prototype,\n methodName,\n );\n if (invokeMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"custom\",\n annotations: buildCustomAnnotations(meta, prototype, methodName, invokeMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n }\n\n return entries;\n}\n\nfunction serializeControllerTypeMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n switch (meta.controllerType) {\n case \"http\":\n return serializeHttpMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"websocket\":\n return serializeWebSocketMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"consumer\":\n return serializeConsumerMethod(meta, className, prototype, methodName, sourceFile, options);\n default:\n return null;\n }\n}\n\nfunction serializeHttpMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const httpMethod: HttpMethod | undefined = Reflect.getOwnMetadata(\n HTTP_METHOD_METADATA,\n prototype,\n methodName,\n );\n if (!httpMethod) return null;\n\n const routePath: string =\n Reflect.getOwnMetadata(ROUTE_PATH_METADATA, prototype, methodName) ?? \"/\";\n const fullPath = joinHandlerPath(meta.prefix, routePath);\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"http\",\n annotations: buildHttpAnnotations(meta, prototype, methodName, httpMethod, fullPath),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeWebSocketMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const wsEvent: WebSocketEventMetadata | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_EVENT_METADATA,\n prototype,\n methodName,\n );\n if (!wsEvent) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"websocket\",\n annotations: buildWebSocketAnnotations(meta, prototype, methodName, wsEvent),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeConsumerMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const consumerHandler: ConsumerHandlerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (!consumerHandler) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"consumer\",\n annotations: buildConsumerAnnotations(meta, prototype, methodName, consumerHandler),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Function handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeFunctionHandler(\n definition: FunctionHandlerDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): FunctionHandlerEntry | null {\n // \"workflow\" is not part of v0 — skip unsupported handler types.\n const supported = [\"http\", \"websocket\", \"consumer\", \"schedule\", \"custom\"] as const;\n type SupportedType = (typeof supported)[number];\n if (!supported.includes(definition.type as SupportedType)) return null;\n\n const exportName = (definition.metadata.handlerName as string) ?? \"handler\";\n const customMetadata = (definition.metadata.customMetadata as Record<string, unknown>) ?? {};\n const handlerType = definition.type as SupportedType;\n\n const annotations: Record<string, string | string[] | boolean> = {};\n\n buildFunctionTypeAnnotations(annotations, definition);\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n exportName,\n sourceFile,\n handlerType,\n ...(Object.keys(annotations).length > 0 ? { annotations } : {}),\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\nfunction buildFunctionTypeAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n definition: FunctionHandlerDefinition,\n): void {\n const meta = definition.metadata;\n\n switch (definition.type) {\n case \"http\": {\n const path = meta.path as string | undefined;\n const method = meta.method as string | undefined;\n if (path !== undefined && method !== undefined) {\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = method;\n annotations[\"celerity.handler.http.path\"] = path;\n }\n break;\n }\n case \"websocket\": {\n annotations[\"celerity.handler.websocket\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.websocket.route\"] = route;\n }\n break;\n }\n case \"consumer\": {\n annotations[\"celerity.handler.consumer\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.consumer.route\"] = route;\n }\n break;\n }\n case \"schedule\": {\n annotations[\"celerity.handler.schedule\"] = true;\n const source = meta.source as string | undefined;\n if (source) {\n annotations[\"celerity.handler.schedule.source\"] = source;\n }\n const schedule = meta.schedule as string | undefined;\n if (schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = schedule;\n }\n break;\n }\n case \"custom\": {\n annotations[\"celerity.handler.custom\"] = true;\n const name = meta.name as string | undefined;\n if (name) {\n annotations[\"celerity.handler.custom.name\"] = name;\n }\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Guard serialization (unchanged)\n// ---------------------------------------------------------------------------\n\ntype GuardMeta = {\n guardName: string;\n customMetadata: Record<string, unknown>;\n};\n\nfunction extractGuardMeta(guardClass: Type): GuardMeta | null {\n const guardName: string | undefined = Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, guardClass);\n if (!guardName) return null;\n\n return {\n guardName,\n customMetadata: Reflect.getOwnMetadata(CUSTOM_METADATA, guardClass) ?? {},\n };\n}\n\nfunction serializeClassGuard(\n guardClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const meta = extractGuardMeta(guardClass);\n if (!meta) return null;\n\n const className = guardClass.name;\n const methodName = \"check\";\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": meta.guardName,\n };\n\n for (const [key, value] of Object.entries(meta.customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n guardName: meta.guardName,\n sourceFile,\n guardType: \"class\",\n className,\n annotations,\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeFunctionGuard(\n definition: GuardDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const guardName = definition.name;\n if (!guardName) return null;\n\n const meta = (definition.metadata ?? {}) as {\n customMetadata?: Record<string, unknown>;\n };\n const customMetadata = meta.customMetadata ?? {};\n\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": guardName,\n };\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const exportName = guardName;\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n guardName,\n sourceFile,\n guardType: \"function\",\n exportName,\n annotations,\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction serializeAnnotationValue(value: unknown): string | string[] | boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value;\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n return JSON.stringify(value);\n}\n\nexport function serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return token;\n}\n\nexport function tokenType(token: InjectionToken): \"class\" | \"string\" | \"symbol\" {\n if (typeof token === \"function\") return \"class\";\n if (typeof token === \"symbol\") return \"symbol\";\n return \"string\";\n}\n\nfunction serializeDependencyGraph(scanned: ScannedModule): DependencyGraph {\n const nodes: DependencyNode[] = scanned.providers.map((provider) => ({\n token: serializeToken(provider.token),\n tokenType: tokenType(provider.token),\n providerType: provider.providerType,\n dependencies: provider.dependencies.map(serializeToken),\n }));\n\n return { nodes };\n}\n","export { joinHandlerPath } from \"@celerity-sdk/common\";\n","import { basename, dirname, relative } from \"node:path\";\n\n/**\n * Derives a resource name for a class-based handler method.\n * Format: camelCase(className) + \"_\" + methodName\n *\n * @example deriveClassResourceName(\"OrdersHandler\", \"getOrder\") => \"ordersHandler_getOrder\"\n */\nexport function deriveClassResourceName(className: string, methodName: string): string {\n const camelClass = className.charAt(0).toLowerCase() + className.slice(1);\n return `${camelClass}_${methodName}`;\n}\n\n/**\n * Derives a handler name for a class-based handler method.\n * Format: className + \"-\" + methodName\n *\n * @example deriveClassHandlerName(\"OrdersHandler\", \"getOrder\") => \"OrdersHandler-getOrder\"\n */\nexport function deriveClassHandlerName(className: string, methodName: string): string {\n return `${className}-${methodName}`;\n}\n\n/**\n * Derives the handler function reference for a class-based handler.\n * Format: moduleBaseName + \".\" + className + \".\" + methodName\n *\n * @example deriveClassHandlerFunction(\"src/handlers/orders.ts\", \"OrdersHandler\", \"getOrder\")\n * => \"orders.OrdersHandler.getOrder\"\n */\nexport function deriveClassHandlerFunction(\n sourceFile: string,\n className: string,\n methodName: string,\n): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${className}.${methodName}`;\n}\n\n/**\n * Derives a resource name for a function-based handler.\n * Uses the export name directly.\n *\n * @example deriveFunctionResourceName(\"getOrder\") => \"getOrder\"\n */\nexport function deriveFunctionResourceName(exportName: string): string {\n return exportName;\n}\n\n/**\n * Derives the handler function reference for a function-based handler.\n * Format: moduleBaseName + \".\" + exportName\n *\n * @example deriveFunctionHandlerFunction(\"src/handlers/orders.ts\", \"getOrder\")\n * => \"orders.getOrder\"\n */\nexport function deriveFunctionHandlerFunction(sourceFile: string, exportName: string): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${exportName}`;\n}\n\n/**\n * Derives the code location from a source file path relative to the project root.\n * Returns the directory prefixed with \"./\"\n *\n * @example deriveCodeLocation(\"src/handlers/orders.ts\", \"/project\") => \"./src/handlers\"\n */\nexport function deriveCodeLocation(sourceFile: string, projectRoot: string): string {\n const rel = relative(projectRoot, sourceFile);\n const dir = dirname(rel);\n return dir === \".\" ? \"./\" : `./${dir}`;\n}\n"],"mappings":"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","names":["import_node_path","import_debug","debug","createDebug","scanProvider","provider","seenTokens","has","add","token","providerType","dependencies","getClassDependencyTokens","typed","provide","getProviderDependencyTokens","buildScannedModule","rootModule","graph","buildModuleGraph","controllerClasses","functionHandlers","guardClasses","functionGuards","providers","Set","moduleClass","node","name","length","controllers","guards","scanned","push","controller","guard","validateScannedDependencies","registeredTokens","map","p","diagnostics","visited","walk","deps","dep","find","isRuntimeProvidedToken","consumer","serializeToken","dependency","description","String","import_reflect_metadata","import_core","import_common","deriveClassResourceName","className","methodName","camelClass","charAt","toLowerCase","slice","deriveClassHandlerName","deriveClassHandlerFunction","sourceFile","base","basename","replace","deriveFunctionResourceName","exportName","deriveFunctionHandlerFunction","deriveCodeLocation","projectRoot","rel","relative","dir","dirname","serializeManifest","scanned","sourceFile","options","handlers","functionHandlers","guardHandlers","controllerClass","controllerClasses","entries","serializeClassHandlers","push","fnHandler","entry","serializeFunctionHandler","guardClass","guardClasses","serializeClassGuard","fnGuard","functionGuards","serializeFunctionGuard","version","dependencyGraph","serializeDependencyGraph","extractControllerMeta","httpMeta","Reflect","getOwnMetadata","CONTROLLER_METADATA","controllerType","prefix","extractSharedClassMeta","isWebSocket","WEBSOCKET_CONTROLLER_METADATA","consumerMeta","CONSUMER_METADATA","source","protectedBy","GUARD_PROTECTEDBY_METADATA","customGuardName","GUARD_CUSTOM_METADATA","customMetadata","CUSTOM_METADATA","resourceRefs","USE_RESOURCE_METADATA","appendSharedAnnotations","annotations","meta","prototype","methodName","methodProtectedBy","allProtectedBy","length","isPublic","PUBLIC_METADATA","methodCustomMetadata","key","value","Object","undefined","serializeAnnotationValue","methodResourceRefs","allResourceRefs","Set","buildHttpAnnotations","httpMethod","fullPath","buildWebSocketAnnotations","wsEvent","route","eventType","buildConsumerAnnotations","consumerHandler","buildScheduleAnnotations","scheduleMeta","schedule","buildCustomAnnotations","invokeMeta","name","className","methods","getOwnPropertyNames","filter","n","typeEntry","serializeControllerTypeMethod","SCHEDULE_HANDLER_METADATA","resourceName","deriveClassResourceName","handlerType","spec","handlerName","deriveClassHandlerName","codeLocation","deriveCodeLocation","projectRoot","handler","deriveClassHandlerFunction","INVOKE_METADATA","serializeHttpMethod","serializeWebSocketMethod","serializeConsumerMethod","HTTP_METHOD_METADATA","routePath","ROUTE_PATH_METADATA","joinHandlerPath","WEBSOCKET_EVENT_METADATA","CONSUMER_HANDLER_METADATA","definition","supported","includes","type","exportName","metadata","buildFunctionTypeAnnotations","deriveFunctionResourceName","keys","deriveFunctionHandlerFunction","path","method","extractGuardMeta","guardName","guardType","Array","isArray","every","v","JSON","stringify","serializeToken","token","description","tokenType","nodes","providers","map","provider","providerType","dependencies","debug","createDebug","parseArgs","argv","modulePath","projectRoot","i","length","arg","Error","module","resolve","process","cwd","main","args","imported","rootModule","default","findModuleExport","name","scanned","buildScannedModule","controllerClasses","functionHandlers","providers","diagnostics","validateScannedDependencies","details","map","consumer","dependency","join","message","stderr","write","manifest","serializeManifest","stdout","JSON","stringify","key","Object","keys","value","undefined","catch","error","String","exitCode"]}
|
package/dist/extract/cli.js
CHANGED
|
@@ -9,7 +9,7 @@ import createDebug2 from "debug";
|
|
|
9
9
|
// src/extract/metadata-app.ts
|
|
10
10
|
import "reflect-metadata";
|
|
11
11
|
import createDebug from "debug";
|
|
12
|
-
import {
|
|
12
|
+
import { isRuntimeProvidedToken } from "@celerity-sdk/common";
|
|
13
13
|
import { buildModuleGraph, getClassDependencyTokens, getProviderDependencyTokens } from "@celerity-sdk/core";
|
|
14
14
|
var debug = createDebug("celerity:cli");
|
|
15
15
|
function scanProvider(provider, seenTokens) {
|
|
@@ -98,7 +98,7 @@ function validateScannedDependencies(scanned) {
|
|
|
98
98
|
}
|
|
99
99
|
} else if (typeof dep === "function") {
|
|
100
100
|
walk(dep, getClassDependencyTokens(dep));
|
|
101
|
-
} else if (!
|
|
101
|
+
} else if (!isRuntimeProvidedToken(dep)) {
|
|
102
102
|
diagnostics.push({
|
|
103
103
|
consumer: serializeToken(token),
|
|
104
104
|
dependency: serializeToken(dep)
|
package/dist/extract/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/extract/cli.ts","../../src/extract/metadata-app.ts","../../src/extract/serializer.ts","../../src/extract/path-utils.ts","../../src/extract/identity.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { resolve } from \"node:path\";\nimport createDebug from \"debug\";\nimport { buildScannedModule, validateScannedDependencies } from \"./metadata-app\";\nimport { serializeManifest } from \"./serializer\";\nimport type { Type } from \"@celerity-sdk/types\";\n\nconst debug = createDebug(\"celerity:cli\");\n\ninterface CliArgs {\n module: string;\n projectRoot: string;\n}\n\nfunction parseArgs(argv: string[]): CliArgs {\n let modulePath: string | undefined;\n let projectRoot: string | undefined;\n\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--module\" && i + 1 < argv.length) {\n modulePath = argv[++i];\n } else if (arg === \"--project-root\" && i + 1 < argv.length) {\n projectRoot = argv[++i];\n }\n }\n\n if (!modulePath) {\n throw new Error(\"Missing required argument: --module <path>\");\n }\n\n return {\n module: resolve(modulePath),\n projectRoot: projectRoot ? resolve(projectRoot) : process.cwd(),\n };\n}\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv);\n debug(\"extract: module=%s projectRoot=%s\", args.module, args.projectRoot);\n\n // Dynamically import the user's compiled module\n const imported = (await import(args.module)) as Record<string, unknown>;\n\n // Look for the root module class — prefer default export, fall back to first Type export\n const rootModule = (imported.default ?? findModuleExport(imported)) as Type | undefined;\n if (!rootModule || typeof rootModule !== \"function\") {\n throw new Error(\n `Could not find a module class in \"${args.module}\". Ensure the module is exported as the default export or as a named export.`,\n );\n }\n debug(\"extract: root module found: %s\", rootModule.name);\n\n // Scan metadata without instantiating anything\n const scanned = buildScannedModule(rootModule);\n debug(\n \"extract: scanned %d controllers, %d function handlers, %d providers\",\n scanned.controllerClasses.length,\n scanned.functionHandlers.length,\n scanned.providers.length,\n );\n\n // Validate dependency graph before proceeding\n const diagnostics = validateScannedDependencies(scanned);\n debug(\"extract: %d dependency diagnostics\", diagnostics.length);\n if (diagnostics.length > 0) {\n const details = diagnostics\n .map(\n ({ consumer, dependency }) =>\n ` ${consumer} requires ${dependency} — no provider registered`,\n )\n .join(\"\\n\");\n const message =\n `Unresolvable dependencies detected:\\n\\n${details}\\n\\n` +\n \"For each unresolved dependency, check that the module providing it is included\\n\" +\n 'in your root module\\'s \"imports\" array, or register a provider for it directly.';\n throw new Error(message);\n }\n\n if (scanned.controllerClasses.length === 0 && scanned.functionHandlers.length === 0) {\n process.stderr.write(`Warning: No handlers found in module \"${args.module}\"\\n`);\n }\n\n // Serialize to manifest JSON\n const manifest = serializeManifest(scanned, args.module, {\n projectRoot: args.projectRoot,\n });\n\n // Output JSON to stdout\n process.stdout.write(JSON.stringify(manifest, null, 2) + \"\\n\");\n}\n\nfunction findModuleExport(imported: Record<string, unknown>): unknown {\n for (const key of Object.keys(imported)) {\n if (key === \"default\") continue;\n const value = imported[key];\n if (typeof value === \"function\") {\n return value;\n }\n }\n return undefined;\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(JSON.stringify({ error: message }) + \"\\n\");\n process.exitCode = 1;\n});\n","import \"reflect-metadata\";\nimport createDebug from \"debug\";\nimport type {\n Type,\n InjectionToken,\n Provider,\n FunctionHandlerDefinition,\n GuardDefinition,\n} from \"@celerity-sdk/types\";\nimport { isResourceLayerToken } from \"@celerity-sdk/common\";\nimport {\n buildModuleGraph,\n getClassDependencyTokens,\n getProviderDependencyTokens,\n} from \"@celerity-sdk/core\";\nimport type { ModuleGraph } from \"@celerity-sdk/core\";\n\nconst debug = createDebug(\"celerity:cli\");\n\nexport type ScannedProvider = {\n token: InjectionToken;\n providerType: \"class\" | \"factory\" | \"value\";\n dependencies: InjectionToken[];\n};\n\nexport type ScannedModule = {\n controllerClasses: Type[];\n functionHandlers: FunctionHandlerDefinition[];\n guardClasses: Type[];\n functionGuards: GuardDefinition[];\n providers: ScannedProvider[];\n};\n\nfunction scanProvider(\n provider: Type | (Provider & { provide: InjectionToken }),\n seenTokens: Set<InjectionToken>,\n): ScannedProvider | null {\n if (typeof provider === \"function\") {\n if (seenTokens.has(provider)) return null;\n seenTokens.add(provider);\n return {\n token: provider,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(provider),\n };\n }\n\n const typed = provider as Provider & { provide: InjectionToken };\n if (seenTokens.has(typed.provide)) return null;\n seenTokens.add(typed.provide);\n\n return {\n token: typed.provide,\n providerType: \"useFactory\" in typed ? \"factory\" : \"useClass\" in typed ? \"class\" : \"value\",\n dependencies: getProviderDependencyTokens(typed),\n };\n}\n\n/**\n * Builds a scanned module from the root module class using the shared\n * `buildModuleGraph` from core. Collects all handler classes, function\n * handler definitions, and provider dependency information without\n * instantiating anything.\n *\n * Inherits circular import detection from the shared graph builder.\n */\nexport function buildScannedModule(rootModule: Type): ScannedModule {\n const graph: ModuleGraph = buildModuleGraph(rootModule);\n const controllerClasses: Type[] = [];\n const functionHandlers: FunctionHandlerDefinition[] = [];\n const guardClasses: Type[] = [];\n const functionGuards: GuardDefinition[] = [];\n const providers: ScannedProvider[] = [];\n const seenTokens = new Set<InjectionToken>();\n\n for (const [moduleClass, node] of graph) {\n debug(\n \"scan: module %s — %d providers, %d controllers, %d guards\",\n moduleClass.name,\n node.providers.length,\n node.controllers.length,\n node.guards.length,\n );\n for (const provider of node.providers) {\n const scanned = scanProvider(provider, seenTokens);\n if (scanned) providers.push(scanned);\n }\n\n for (const controller of node.controllers) {\n controllerClasses.push(controller);\n if (!seenTokens.has(controller)) {\n seenTokens.add(controller);\n providers.push({\n token: controller,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(controller),\n });\n }\n }\n\n for (const guard of node.guards) {\n if (typeof guard === \"function\") {\n guardClasses.push(guard);\n if (!seenTokens.has(guard)) {\n seenTokens.add(guard);\n providers.push({\n token: guard,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(guard),\n });\n }\n } else {\n functionGuards.push(guard);\n }\n }\n\n functionHandlers.push(...node.functionHandlers);\n }\n\n return { controllerClasses, functionHandlers, guardClasses, functionGuards, providers };\n}\n\nexport type DependencyDiagnostic = {\n consumer: string;\n dependency: string;\n};\n\n/**\n * Validates that all scanned providers have resolvable dependencies.\n * Returns an array of diagnostics for each unresolvable dependency.\n * A token is resolvable if it's registered or is a class (implicitly constructable).\n */\nexport function validateScannedDependencies(scanned: ScannedModule): DependencyDiagnostic[] {\n const registeredTokens = new Set<InjectionToken>(scanned.providers.map((p) => p.token));\n const diagnostics: DependencyDiagnostic[] = [];\n const visited = new Set<InjectionToken>();\n\n function walk(token: InjectionToken, deps: InjectionToken[]): void {\n if (visited.has(token)) return;\n visited.add(token);\n\n for (const dep of deps) {\n if (registeredTokens.has(dep)) {\n const provider = scanned.providers.find((p) => p.token === dep);\n if (provider) {\n walk(dep, provider.dependencies);\n }\n } else if (typeof dep === \"function\") {\n walk(dep, getClassDependencyTokens(dep as Type));\n } else if (!isResourceLayerToken(dep)) {\n diagnostics.push({\n consumer: serializeToken(token),\n dependency: serializeToken(dep),\n });\n }\n }\n }\n\n for (const provider of scanned.providers) {\n walk(provider.token, provider.dependencies);\n }\n\n return diagnostics;\n}\n\nfunction serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return String(token);\n}\n","import \"reflect-metadata\";\nimport type {\n Type,\n HttpMethod,\n InjectionToken,\n GuardDefinition,\n FunctionHandlerDefinition,\n} from \"@celerity-sdk/types\";\nimport {\n CONTROLLER_METADATA,\n HTTP_METHOD_METADATA,\n ROUTE_PATH_METADATA,\n WEBSOCKET_CONTROLLER_METADATA,\n WEBSOCKET_EVENT_METADATA,\n CONSUMER_METADATA,\n CONSUMER_HANDLER_METADATA,\n SCHEDULE_HANDLER_METADATA,\n INVOKE_METADATA,\n GUARD_PROTECTEDBY_METADATA,\n GUARD_CUSTOM_METADATA,\n PUBLIC_METADATA,\n CUSTOM_METADATA,\n USE_RESOURCE_METADATA,\n} from \"@celerity-sdk/core\";\nimport type {\n ControllerMetadata,\n WebSocketEventMetadata,\n ConsumerHandlerMetadata,\n ScheduleHandlerMetadata,\n InvokeMetadata,\n ConsumerMetadata,\n} from \"@celerity-sdk/core\";\nimport type { ScannedModule } from \"./metadata-app\";\nimport type {\n HandlerManifest,\n ClassHandlerEntry,\n FunctionHandlerEntry,\n GuardHandlerEntry,\n DependencyGraph,\n DependencyNode,\n} from \"./types\";\nimport { joinHandlerPath } from \"./path-utils\";\nimport {\n deriveClassResourceName,\n deriveClassHandlerName,\n deriveClassHandlerFunction,\n deriveCodeLocation,\n deriveFunctionResourceName,\n deriveFunctionHandlerFunction,\n} from \"./identity\";\n\nexport type SerializeOptions = {\n projectRoot: string;\n};\n\nexport function serializeManifest(\n scanned: ScannedModule,\n sourceFile: string,\n options: SerializeOptions,\n): HandlerManifest {\n const handlers: ClassHandlerEntry[] = [];\n const functionHandlers: FunctionHandlerEntry[] = [];\n const guardHandlers: GuardHandlerEntry[] = [];\n\n for (const controllerClass of scanned.controllerClasses) {\n const entries = serializeClassHandlers(controllerClass, sourceFile, options);\n handlers.push(...entries);\n }\n\n for (const fnHandler of scanned.functionHandlers) {\n const entry = serializeFunctionHandler(fnHandler, sourceFile, options);\n if (entry) {\n functionHandlers.push(entry);\n }\n }\n\n for (const guardClass of scanned.guardClasses) {\n const entry = serializeClassGuard(guardClass, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n for (const fnGuard of scanned.functionGuards) {\n const entry = serializeFunctionGuard(fnGuard, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n return {\n version: \"1.0.0\",\n handlers,\n functionHandlers,\n guardHandlers,\n dependencyGraph: serializeDependencyGraph(scanned),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Controller meta extraction\n// ---------------------------------------------------------------------------\n\ntype ControllerType = \"http\" | \"websocket\" | \"consumer\";\n\ntype ControllerMeta = {\n controllerType: ControllerType;\n prefix: string;\n source?: string;\n protectedBy: string[];\n customGuardName: string | undefined;\n customMetadata: Record<string, unknown>;\n resourceRefs: string[];\n};\n\nfunction extractControllerMeta(controllerClass: Type): ControllerMeta | null {\n const httpMeta: ControllerMetadata | undefined = Reflect.getOwnMetadata(\n CONTROLLER_METADATA,\n controllerClass,\n );\n if (httpMeta) {\n return {\n controllerType: \"http\",\n prefix: httpMeta.prefix ?? \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const isWebSocket: boolean | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_CONTROLLER_METADATA,\n controllerClass,\n );\n if (isWebSocket) {\n return {\n controllerType: \"websocket\",\n prefix: \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const consumerMeta: ConsumerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_METADATA,\n controllerClass,\n );\n if (consumerMeta) {\n return {\n controllerType: \"consumer\",\n prefix: \"\",\n source: consumerMeta.source,\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n return null;\n}\n\nfunction extractSharedClassMeta(controllerClass: Type) {\n return {\n protectedBy:\n (Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, controllerClass) as string[]) ?? [],\n customGuardName: Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, controllerClass) as\n | string\n | undefined,\n customMetadata:\n (Reflect.getOwnMetadata(CUSTOM_METADATA, controllerClass) as Record<string, unknown>) ?? {},\n resourceRefs:\n (Reflect.getOwnMetadata(USE_RESOURCE_METADATA, controllerClass) as string[]) ?? [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared annotation helpers\n// ---------------------------------------------------------------------------\n\nfunction appendSharedAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n): void {\n const methodProtectedBy: string[] =\n Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, prototype, methodName) ?? [];\n const allProtectedBy = [...meta.protectedBy, ...methodProtectedBy];\n if (allProtectedBy.length > 0) {\n annotations[\"celerity.handler.guard.protectedBy\"] = allProtectedBy;\n }\n if (meta.customGuardName) {\n annotations[\"celerity.handler.guard.custom\"] = meta.customGuardName;\n }\n\n const isPublic: boolean = Reflect.getOwnMetadata(PUBLIC_METADATA, prototype, methodName) === true;\n if (isPublic) {\n annotations[\"celerity.handler.public\"] = true;\n }\n\n const methodCustomMetadata: Record<string, unknown> =\n Reflect.getOwnMetadata(CUSTOM_METADATA, prototype, methodName) ?? {};\n const customMetadata = { ...meta.customMetadata, ...methodCustomMetadata };\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const methodResourceRefs: string[] =\n Reflect.getOwnMetadata(USE_RESOURCE_METADATA, prototype, methodName) ?? [];\n const allResourceRefs = [...new Set([...meta.resourceRefs, ...methodResourceRefs])];\n if (allResourceRefs.length > 0) {\n annotations[\"celerity.handler.resource.ref\"] = allResourceRefs;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type-specific annotation builders (class handlers)\n// ---------------------------------------------------------------------------\n\nfunction buildHttpAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n httpMethod: HttpMethod,\n fullPath: string,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = httpMethod;\n annotations[\"celerity.handler.http.path\"] = fullPath;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildWebSocketAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n wsEvent: WebSocketEventMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.websocket\"] = true;\n annotations[\"celerity.handler.websocket.route\"] = wsEvent.route;\n annotations[\"celerity.handler.websocket.eventType\"] = wsEvent.eventType;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildConsumerAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n consumerHandler: ConsumerHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.consumer\"] = true;\n if (meta.source) {\n annotations[\"celerity.handler.consumer.source\"] = meta.source;\n }\n if (consumerHandler.route) {\n annotations[\"celerity.handler.consumer.route\"] = consumerHandler.route;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildScheduleAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n scheduleMeta: ScheduleHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.schedule\"] = true;\n if (scheduleMeta.source) {\n annotations[\"celerity.handler.schedule.source\"] = scheduleMeta.source;\n }\n if (scheduleMeta.schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = scheduleMeta.schedule;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildCustomAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n invokeMeta: InvokeMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.custom\"] = true;\n annotations[\"celerity.handler.custom.name\"] = invokeMeta.name;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\n// ---------------------------------------------------------------------------\n// Class handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeClassHandlers(\n controllerClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry[] {\n const meta = extractControllerMeta(controllerClass);\n if (!meta) return [];\n\n const className = controllerClass.name;\n const prototype = controllerClass.prototype as object;\n const methods = Object.getOwnPropertyNames(prototype).filter((n) => n !== \"constructor\");\n const entries: ClassHandlerEntry[] = [];\n\n for (const methodName of methods) {\n // Type-specific handler decorator for the controller type.\n const typeEntry = serializeControllerTypeMethod(\n meta,\n className,\n prototype,\n methodName,\n sourceFile,\n options,\n );\n if (typeEntry) entries.push(typeEntry);\n\n // Cross-cutting: @ScheduleHandler on any controller type.\n const scheduleMeta: ScheduleHandlerMetadata | undefined = Reflect.getOwnMetadata(\n SCHEDULE_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (scheduleMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"schedule\",\n annotations: buildScheduleAnnotations(meta, prototype, methodName, scheduleMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n\n // Cross-cutting: @Invoke on any controller type.\n const invokeMeta: InvokeMetadata | undefined = Reflect.getOwnMetadata(\n INVOKE_METADATA,\n prototype,\n methodName,\n );\n if (invokeMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"custom\",\n annotations: buildCustomAnnotations(meta, prototype, methodName, invokeMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n }\n\n return entries;\n}\n\nfunction serializeControllerTypeMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n switch (meta.controllerType) {\n case \"http\":\n return serializeHttpMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"websocket\":\n return serializeWebSocketMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"consumer\":\n return serializeConsumerMethod(meta, className, prototype, methodName, sourceFile, options);\n default:\n return null;\n }\n}\n\nfunction serializeHttpMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const httpMethod: HttpMethod | undefined = Reflect.getOwnMetadata(\n HTTP_METHOD_METADATA,\n prototype,\n methodName,\n );\n if (!httpMethod) return null;\n\n const routePath: string =\n Reflect.getOwnMetadata(ROUTE_PATH_METADATA, prototype, methodName) ?? \"/\";\n const fullPath = joinHandlerPath(meta.prefix, routePath);\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"http\",\n annotations: buildHttpAnnotations(meta, prototype, methodName, httpMethod, fullPath),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeWebSocketMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const wsEvent: WebSocketEventMetadata | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_EVENT_METADATA,\n prototype,\n methodName,\n );\n if (!wsEvent) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"websocket\",\n annotations: buildWebSocketAnnotations(meta, prototype, methodName, wsEvent),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeConsumerMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const consumerHandler: ConsumerHandlerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (!consumerHandler) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"consumer\",\n annotations: buildConsumerAnnotations(meta, prototype, methodName, consumerHandler),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Function handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeFunctionHandler(\n definition: FunctionHandlerDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): FunctionHandlerEntry | null {\n // \"workflow\" is not part of v0 — skip unsupported handler types.\n const supported = [\"http\", \"websocket\", \"consumer\", \"schedule\", \"custom\"] as const;\n type SupportedType = (typeof supported)[number];\n if (!supported.includes(definition.type as SupportedType)) return null;\n\n const exportName = (definition.metadata.handlerName as string) ?? \"handler\";\n const customMetadata = (definition.metadata.customMetadata as Record<string, unknown>) ?? {};\n const handlerType = definition.type as SupportedType;\n\n const annotations: Record<string, string | string[] | boolean> = {};\n\n buildFunctionTypeAnnotations(annotations, definition);\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n exportName,\n sourceFile,\n handlerType,\n ...(Object.keys(annotations).length > 0 ? { annotations } : {}),\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\nfunction buildFunctionTypeAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n definition: FunctionHandlerDefinition,\n): void {\n const meta = definition.metadata;\n\n switch (definition.type) {\n case \"http\": {\n const path = meta.path as string | undefined;\n const method = meta.method as string | undefined;\n if (path !== undefined && method !== undefined) {\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = method;\n annotations[\"celerity.handler.http.path\"] = path;\n }\n break;\n }\n case \"websocket\": {\n annotations[\"celerity.handler.websocket\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.websocket.route\"] = route;\n }\n break;\n }\n case \"consumer\": {\n annotations[\"celerity.handler.consumer\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.consumer.route\"] = route;\n }\n break;\n }\n case \"schedule\": {\n annotations[\"celerity.handler.schedule\"] = true;\n const source = meta.source as string | undefined;\n if (source) {\n annotations[\"celerity.handler.schedule.source\"] = source;\n }\n const schedule = meta.schedule as string | undefined;\n if (schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = schedule;\n }\n break;\n }\n case \"custom\": {\n annotations[\"celerity.handler.custom\"] = true;\n const name = meta.name as string | undefined;\n if (name) {\n annotations[\"celerity.handler.custom.name\"] = name;\n }\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Guard serialization (unchanged)\n// ---------------------------------------------------------------------------\n\ntype GuardMeta = {\n guardName: string;\n customMetadata: Record<string, unknown>;\n};\n\nfunction extractGuardMeta(guardClass: Type): GuardMeta | null {\n const guardName: string | undefined = Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, guardClass);\n if (!guardName) return null;\n\n return {\n guardName,\n customMetadata: Reflect.getOwnMetadata(CUSTOM_METADATA, guardClass) ?? {},\n };\n}\n\nfunction serializeClassGuard(\n guardClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const meta = extractGuardMeta(guardClass);\n if (!meta) return null;\n\n const className = guardClass.name;\n const methodName = \"check\";\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": meta.guardName,\n };\n\n for (const [key, value] of Object.entries(meta.customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n guardName: meta.guardName,\n sourceFile,\n guardType: \"class\",\n className,\n annotations,\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeFunctionGuard(\n definition: GuardDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const guardName = definition.name;\n if (!guardName) return null;\n\n const meta = (definition.metadata ?? {}) as {\n customMetadata?: Record<string, unknown>;\n };\n const customMetadata = meta.customMetadata ?? {};\n\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": guardName,\n };\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const exportName = guardName;\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n guardName,\n sourceFile,\n guardType: \"function\",\n exportName,\n annotations,\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction serializeAnnotationValue(value: unknown): string | string[] | boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value;\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n return JSON.stringify(value);\n}\n\nexport function serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return token;\n}\n\nexport function tokenType(token: InjectionToken): \"class\" | \"string\" | \"symbol\" {\n if (typeof token === \"function\") return \"class\";\n if (typeof token === \"symbol\") return \"symbol\";\n return \"string\";\n}\n\nfunction serializeDependencyGraph(scanned: ScannedModule): DependencyGraph {\n const nodes: DependencyNode[] = scanned.providers.map((provider) => ({\n token: serializeToken(provider.token),\n tokenType: tokenType(provider.token),\n providerType: provider.providerType,\n dependencies: provider.dependencies.map(serializeToken),\n }));\n\n return { nodes };\n}\n","export { joinHandlerPath } from \"@celerity-sdk/common\";\n","import { basename, dirname, relative } from \"node:path\";\n\n/**\n * Derives a resource name for a class-based handler method.\n * Format: camelCase(className) + \"_\" + methodName\n *\n * @example deriveClassResourceName(\"OrdersHandler\", \"getOrder\") => \"ordersHandler_getOrder\"\n */\nexport function deriveClassResourceName(className: string, methodName: string): string {\n const camelClass = className.charAt(0).toLowerCase() + className.slice(1);\n return `${camelClass}_${methodName}`;\n}\n\n/**\n * Derives a handler name for a class-based handler method.\n * Format: className + \"-\" + methodName\n *\n * @example deriveClassHandlerName(\"OrdersHandler\", \"getOrder\") => \"OrdersHandler-getOrder\"\n */\nexport function deriveClassHandlerName(className: string, methodName: string): string {\n return `${className}-${methodName}`;\n}\n\n/**\n * Derives the handler function reference for a class-based handler.\n * Format: moduleBaseName + \".\" + className + \".\" + methodName\n *\n * @example deriveClassHandlerFunction(\"src/handlers/orders.ts\", \"OrdersHandler\", \"getOrder\")\n * => \"orders.OrdersHandler.getOrder\"\n */\nexport function deriveClassHandlerFunction(\n sourceFile: string,\n className: string,\n methodName: string,\n): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${className}.${methodName}`;\n}\n\n/**\n * Derives a resource name for a function-based handler.\n * Uses the export name directly.\n *\n * @example deriveFunctionResourceName(\"getOrder\") => \"getOrder\"\n */\nexport function deriveFunctionResourceName(exportName: string): string {\n return exportName;\n}\n\n/**\n * Derives the handler function reference for a function-based handler.\n * Format: moduleBaseName + \".\" + exportName\n *\n * @example deriveFunctionHandlerFunction(\"src/handlers/orders.ts\", \"getOrder\")\n * => \"orders.getOrder\"\n */\nexport function deriveFunctionHandlerFunction(sourceFile: string, exportName: string): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${exportName}`;\n}\n\n/**\n * Derives the code location from a source file path relative to the project root.\n * Returns the directory prefixed with \"./\"\n *\n * @example deriveCodeLocation(\"src/handlers/orders.ts\", \"/project\") => \"./src/handlers\"\n */\nexport function deriveCodeLocation(sourceFile: string, projectRoot: string): string {\n const rel = relative(projectRoot, sourceFile);\n const dir = dirname(rel);\n return dir === \".\" ? \"./\" : `./${dir}`;\n}\n"],"mappings":"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","names":["resolve","createDebug","createDebug","isResourceLayerToken","buildModuleGraph","getClassDependencyTokens","getProviderDependencyTokens","debug","createDebug","scanProvider","provider","seenTokens","has","add","token","providerType","dependencies","getClassDependencyTokens","typed","provide","getProviderDependencyTokens","buildScannedModule","rootModule","graph","buildModuleGraph","controllerClasses","functionHandlers","guardClasses","functionGuards","providers","Set","moduleClass","node","name","length","controllers","guards","scanned","push","controller","guard","validateScannedDependencies","registeredTokens","map","p","diagnostics","visited","walk","deps","dep","find","isResourceLayerToken","consumer","serializeToken","dependency","description","String","CONTROLLER_METADATA","HTTP_METHOD_METADATA","ROUTE_PATH_METADATA","WEBSOCKET_CONTROLLER_METADATA","WEBSOCKET_EVENT_METADATA","CONSUMER_METADATA","CONSUMER_HANDLER_METADATA","SCHEDULE_HANDLER_METADATA","INVOKE_METADATA","GUARD_PROTECTEDBY_METADATA","GUARD_CUSTOM_METADATA","PUBLIC_METADATA","CUSTOM_METADATA","USE_RESOURCE_METADATA","joinHandlerPath","basename","dirname","relative","deriveClassResourceName","className","methodName","camelClass","charAt","toLowerCase","slice","deriveClassHandlerName","deriveClassHandlerFunction","sourceFile","base","basename","replace","deriveFunctionResourceName","exportName","deriveFunctionHandlerFunction","deriveCodeLocation","projectRoot","rel","relative","dir","dirname","serializeManifest","scanned","sourceFile","options","handlers","functionHandlers","guardHandlers","controllerClass","controllerClasses","entries","serializeClassHandlers","push","fnHandler","entry","serializeFunctionHandler","guardClass","guardClasses","serializeClassGuard","fnGuard","functionGuards","serializeFunctionGuard","version","dependencyGraph","serializeDependencyGraph","extractControllerMeta","httpMeta","Reflect","getOwnMetadata","CONTROLLER_METADATA","controllerType","prefix","extractSharedClassMeta","isWebSocket","WEBSOCKET_CONTROLLER_METADATA","consumerMeta","CONSUMER_METADATA","source","protectedBy","GUARD_PROTECTEDBY_METADATA","customGuardName","GUARD_CUSTOM_METADATA","customMetadata","CUSTOM_METADATA","resourceRefs","USE_RESOURCE_METADATA","appendSharedAnnotations","annotations","meta","prototype","methodName","methodProtectedBy","allProtectedBy","length","isPublic","PUBLIC_METADATA","methodCustomMetadata","key","value","Object","undefined","serializeAnnotationValue","methodResourceRefs","allResourceRefs","Set","buildHttpAnnotations","httpMethod","fullPath","buildWebSocketAnnotations","wsEvent","route","eventType","buildConsumerAnnotations","consumerHandler","buildScheduleAnnotations","scheduleMeta","schedule","buildCustomAnnotations","invokeMeta","name","className","methods","getOwnPropertyNames","filter","n","typeEntry","serializeControllerTypeMethod","SCHEDULE_HANDLER_METADATA","resourceName","deriveClassResourceName","handlerType","spec","handlerName","deriveClassHandlerName","codeLocation","deriveCodeLocation","projectRoot","handler","deriveClassHandlerFunction","INVOKE_METADATA","serializeHttpMethod","serializeWebSocketMethod","serializeConsumerMethod","HTTP_METHOD_METADATA","routePath","ROUTE_PATH_METADATA","joinHandlerPath","WEBSOCKET_EVENT_METADATA","CONSUMER_HANDLER_METADATA","definition","supported","includes","type","exportName","metadata","buildFunctionTypeAnnotations","deriveFunctionResourceName","keys","deriveFunctionHandlerFunction","path","method","extractGuardMeta","guardName","guardType","Array","isArray","every","v","JSON","stringify","serializeToken","token","description","tokenType","nodes","providers","map","provider","providerType","dependencies","debug","createDebug","parseArgs","argv","modulePath","projectRoot","i","length","arg","Error","module","resolve","process","cwd","main","args","imported","rootModule","default","findModuleExport","name","scanned","buildScannedModule","controllerClasses","functionHandlers","providers","diagnostics","validateScannedDependencies","details","map","consumer","dependency","join","message","stderr","write","manifest","serializeManifest","stdout","JSON","stringify","key","Object","keys","value","undefined","catch","error","String","exitCode"]}
|
|
1
|
+
{"version":3,"sources":["../../src/extract/cli.ts","../../src/extract/metadata-app.ts","../../src/extract/serializer.ts","../../src/extract/path-utils.ts","../../src/extract/identity.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { resolve } from \"node:path\";\nimport createDebug from \"debug\";\nimport { buildScannedModule, validateScannedDependencies } from \"./metadata-app\";\nimport { serializeManifest } from \"./serializer\";\nimport type { Type } from \"@celerity-sdk/types\";\n\nconst debug = createDebug(\"celerity:cli\");\n\ninterface CliArgs {\n module: string;\n projectRoot: string;\n}\n\nfunction parseArgs(argv: string[]): CliArgs {\n let modulePath: string | undefined;\n let projectRoot: string | undefined;\n\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--module\" && i + 1 < argv.length) {\n modulePath = argv[++i];\n } else if (arg === \"--project-root\" && i + 1 < argv.length) {\n projectRoot = argv[++i];\n }\n }\n\n if (!modulePath) {\n throw new Error(\"Missing required argument: --module <path>\");\n }\n\n return {\n module: resolve(modulePath),\n projectRoot: projectRoot ? resolve(projectRoot) : process.cwd(),\n };\n}\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv);\n debug(\"extract: module=%s projectRoot=%s\", args.module, args.projectRoot);\n\n // Dynamically import the user's compiled module\n const imported = (await import(args.module)) as Record<string, unknown>;\n\n // Look for the root module class — prefer default export, fall back to first Type export\n const rootModule = (imported.default ?? findModuleExport(imported)) as Type | undefined;\n if (!rootModule || typeof rootModule !== \"function\") {\n throw new Error(\n `Could not find a module class in \"${args.module}\". Ensure the module is exported as the default export or as a named export.`,\n );\n }\n debug(\"extract: root module found: %s\", rootModule.name);\n\n // Scan metadata without instantiating anything\n const scanned = buildScannedModule(rootModule);\n debug(\n \"extract: scanned %d controllers, %d function handlers, %d providers\",\n scanned.controllerClasses.length,\n scanned.functionHandlers.length,\n scanned.providers.length,\n );\n\n // Validate dependency graph before proceeding\n const diagnostics = validateScannedDependencies(scanned);\n debug(\"extract: %d dependency diagnostics\", diagnostics.length);\n if (diagnostics.length > 0) {\n const details = diagnostics\n .map(\n ({ consumer, dependency }) =>\n ` ${consumer} requires ${dependency} — no provider registered`,\n )\n .join(\"\\n\");\n const message =\n `Unresolvable dependencies detected:\\n\\n${details}\\n\\n` +\n \"For each unresolved dependency, check that the module providing it is included\\n\" +\n 'in your root module\\'s \"imports\" array, or register a provider for it directly.';\n throw new Error(message);\n }\n\n if (scanned.controllerClasses.length === 0 && scanned.functionHandlers.length === 0) {\n process.stderr.write(`Warning: No handlers found in module \"${args.module}\"\\n`);\n }\n\n // Serialize to manifest JSON\n const manifest = serializeManifest(scanned, args.module, {\n projectRoot: args.projectRoot,\n });\n\n // Output JSON to stdout\n process.stdout.write(JSON.stringify(manifest, null, 2) + \"\\n\");\n}\n\nfunction findModuleExport(imported: Record<string, unknown>): unknown {\n for (const key of Object.keys(imported)) {\n if (key === \"default\") continue;\n const value = imported[key];\n if (typeof value === \"function\") {\n return value;\n }\n }\n return undefined;\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(JSON.stringify({ error: message }) + \"\\n\");\n process.exitCode = 1;\n});\n","import \"reflect-metadata\";\nimport createDebug from \"debug\";\nimport type {\n Type,\n InjectionToken,\n Provider,\n FunctionHandlerDefinition,\n GuardDefinition,\n} from \"@celerity-sdk/types\";\nimport { isRuntimeProvidedToken } from \"@celerity-sdk/common\";\nimport {\n buildModuleGraph,\n getClassDependencyTokens,\n getProviderDependencyTokens,\n} from \"@celerity-sdk/core\";\nimport type { ModuleGraph } from \"@celerity-sdk/core\";\n\nconst debug = createDebug(\"celerity:cli\");\n\nexport type ScannedProvider = {\n token: InjectionToken;\n providerType: \"class\" | \"factory\" | \"value\";\n dependencies: InjectionToken[];\n};\n\nexport type ScannedModule = {\n controllerClasses: Type[];\n functionHandlers: FunctionHandlerDefinition[];\n guardClasses: Type[];\n functionGuards: GuardDefinition[];\n providers: ScannedProvider[];\n};\n\nfunction scanProvider(\n provider: Type | (Provider & { provide: InjectionToken }),\n seenTokens: Set<InjectionToken>,\n): ScannedProvider | null {\n if (typeof provider === \"function\") {\n if (seenTokens.has(provider)) return null;\n seenTokens.add(provider);\n return {\n token: provider,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(provider),\n };\n }\n\n const typed = provider as Provider & { provide: InjectionToken };\n if (seenTokens.has(typed.provide)) return null;\n seenTokens.add(typed.provide);\n\n return {\n token: typed.provide,\n providerType: \"useFactory\" in typed ? \"factory\" : \"useClass\" in typed ? \"class\" : \"value\",\n dependencies: getProviderDependencyTokens(typed),\n };\n}\n\n/**\n * Builds a scanned module from the root module class using the shared\n * `buildModuleGraph` from core. Collects all handler classes, function\n * handler definitions, and provider dependency information without\n * instantiating anything.\n *\n * Inherits circular import detection from the shared graph builder.\n */\nexport function buildScannedModule(rootModule: Type): ScannedModule {\n const graph: ModuleGraph = buildModuleGraph(rootModule);\n const controllerClasses: Type[] = [];\n const functionHandlers: FunctionHandlerDefinition[] = [];\n const guardClasses: Type[] = [];\n const functionGuards: GuardDefinition[] = [];\n const providers: ScannedProvider[] = [];\n const seenTokens = new Set<InjectionToken>();\n\n for (const [moduleClass, node] of graph) {\n debug(\n \"scan: module %s — %d providers, %d controllers, %d guards\",\n moduleClass.name,\n node.providers.length,\n node.controllers.length,\n node.guards.length,\n );\n for (const provider of node.providers) {\n const scanned = scanProvider(provider, seenTokens);\n if (scanned) providers.push(scanned);\n }\n\n for (const controller of node.controllers) {\n controllerClasses.push(controller);\n if (!seenTokens.has(controller)) {\n seenTokens.add(controller);\n providers.push({\n token: controller,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(controller),\n });\n }\n }\n\n for (const guard of node.guards) {\n if (typeof guard === \"function\") {\n guardClasses.push(guard);\n if (!seenTokens.has(guard)) {\n seenTokens.add(guard);\n providers.push({\n token: guard,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(guard),\n });\n }\n } else {\n functionGuards.push(guard);\n }\n }\n\n functionHandlers.push(...node.functionHandlers);\n }\n\n return { controllerClasses, functionHandlers, guardClasses, functionGuards, providers };\n}\n\nexport type DependencyDiagnostic = {\n consumer: string;\n dependency: string;\n};\n\n/**\n * Validates that all scanned providers have resolvable dependencies.\n * Returns an array of diagnostics for each unresolvable dependency.\n * A token is resolvable if it's registered or is a class (implicitly constructable).\n */\nexport function validateScannedDependencies(scanned: ScannedModule): DependencyDiagnostic[] {\n const registeredTokens = new Set<InjectionToken>(scanned.providers.map((p) => p.token));\n const diagnostics: DependencyDiagnostic[] = [];\n const visited = new Set<InjectionToken>();\n\n function walk(token: InjectionToken, deps: InjectionToken[]): void {\n if (visited.has(token)) return;\n visited.add(token);\n\n for (const dep of deps) {\n if (registeredTokens.has(dep)) {\n const provider = scanned.providers.find((p) => p.token === dep);\n if (provider) {\n walk(dep, provider.dependencies);\n }\n } else if (typeof dep === \"function\") {\n walk(dep, getClassDependencyTokens(dep as Type));\n } else if (!isRuntimeProvidedToken(dep)) {\n diagnostics.push({\n consumer: serializeToken(token),\n dependency: serializeToken(dep),\n });\n }\n }\n }\n\n for (const provider of scanned.providers) {\n walk(provider.token, provider.dependencies);\n }\n\n return diagnostics;\n}\n\nfunction serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return String(token);\n}\n","import \"reflect-metadata\";\nimport type {\n Type,\n HttpMethod,\n InjectionToken,\n GuardDefinition,\n FunctionHandlerDefinition,\n} from \"@celerity-sdk/types\";\nimport {\n CONTROLLER_METADATA,\n HTTP_METHOD_METADATA,\n ROUTE_PATH_METADATA,\n WEBSOCKET_CONTROLLER_METADATA,\n WEBSOCKET_EVENT_METADATA,\n CONSUMER_METADATA,\n CONSUMER_HANDLER_METADATA,\n SCHEDULE_HANDLER_METADATA,\n INVOKE_METADATA,\n GUARD_PROTECTEDBY_METADATA,\n GUARD_CUSTOM_METADATA,\n PUBLIC_METADATA,\n CUSTOM_METADATA,\n USE_RESOURCE_METADATA,\n} from \"@celerity-sdk/core\";\nimport type {\n ControllerMetadata,\n WebSocketEventMetadata,\n ConsumerHandlerMetadata,\n ScheduleHandlerMetadata,\n InvokeMetadata,\n ConsumerMetadata,\n} from \"@celerity-sdk/core\";\nimport type { ScannedModule } from \"./metadata-app\";\nimport type {\n HandlerManifest,\n ClassHandlerEntry,\n FunctionHandlerEntry,\n GuardHandlerEntry,\n DependencyGraph,\n DependencyNode,\n} from \"./types\";\nimport { joinHandlerPath } from \"./path-utils\";\nimport {\n deriveClassResourceName,\n deriveClassHandlerName,\n deriveClassHandlerFunction,\n deriveCodeLocation,\n deriveFunctionResourceName,\n deriveFunctionHandlerFunction,\n} from \"./identity\";\n\nexport type SerializeOptions = {\n projectRoot: string;\n};\n\nexport function serializeManifest(\n scanned: ScannedModule,\n sourceFile: string,\n options: SerializeOptions,\n): HandlerManifest {\n const handlers: ClassHandlerEntry[] = [];\n const functionHandlers: FunctionHandlerEntry[] = [];\n const guardHandlers: GuardHandlerEntry[] = [];\n\n for (const controllerClass of scanned.controllerClasses) {\n const entries = serializeClassHandlers(controllerClass, sourceFile, options);\n handlers.push(...entries);\n }\n\n for (const fnHandler of scanned.functionHandlers) {\n const entry = serializeFunctionHandler(fnHandler, sourceFile, options);\n if (entry) {\n functionHandlers.push(entry);\n }\n }\n\n for (const guardClass of scanned.guardClasses) {\n const entry = serializeClassGuard(guardClass, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n for (const fnGuard of scanned.functionGuards) {\n const entry = serializeFunctionGuard(fnGuard, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n return {\n version: \"1.0.0\",\n handlers,\n functionHandlers,\n guardHandlers,\n dependencyGraph: serializeDependencyGraph(scanned),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Controller meta extraction\n// ---------------------------------------------------------------------------\n\ntype ControllerType = \"http\" | \"websocket\" | \"consumer\";\n\ntype ControllerMeta = {\n controllerType: ControllerType;\n prefix: string;\n source?: string;\n protectedBy: string[];\n customGuardName: string | undefined;\n customMetadata: Record<string, unknown>;\n resourceRefs: string[];\n};\n\nfunction extractControllerMeta(controllerClass: Type): ControllerMeta | null {\n const httpMeta: ControllerMetadata | undefined = Reflect.getOwnMetadata(\n CONTROLLER_METADATA,\n controllerClass,\n );\n if (httpMeta) {\n return {\n controllerType: \"http\",\n prefix: httpMeta.prefix ?? \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const isWebSocket: boolean | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_CONTROLLER_METADATA,\n controllerClass,\n );\n if (isWebSocket) {\n return {\n controllerType: \"websocket\",\n prefix: \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const consumerMeta: ConsumerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_METADATA,\n controllerClass,\n );\n if (consumerMeta) {\n return {\n controllerType: \"consumer\",\n prefix: \"\",\n source: consumerMeta.source,\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n return null;\n}\n\nfunction extractSharedClassMeta(controllerClass: Type) {\n return {\n protectedBy:\n (Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, controllerClass) as string[]) ?? [],\n customGuardName: Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, controllerClass) as\n | string\n | undefined,\n customMetadata:\n (Reflect.getOwnMetadata(CUSTOM_METADATA, controllerClass) as Record<string, unknown>) ?? {},\n resourceRefs:\n (Reflect.getOwnMetadata(USE_RESOURCE_METADATA, controllerClass) as string[]) ?? [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared annotation helpers\n// ---------------------------------------------------------------------------\n\nfunction appendSharedAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n): void {\n const methodProtectedBy: string[] =\n Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, prototype, methodName) ?? [];\n const allProtectedBy = [...meta.protectedBy, ...methodProtectedBy];\n if (allProtectedBy.length > 0) {\n annotations[\"celerity.handler.guard.protectedBy\"] = allProtectedBy;\n }\n if (meta.customGuardName) {\n annotations[\"celerity.handler.guard.custom\"] = meta.customGuardName;\n }\n\n const isPublic: boolean = Reflect.getOwnMetadata(PUBLIC_METADATA, prototype, methodName) === true;\n if (isPublic) {\n annotations[\"celerity.handler.public\"] = true;\n }\n\n const methodCustomMetadata: Record<string, unknown> =\n Reflect.getOwnMetadata(CUSTOM_METADATA, prototype, methodName) ?? {};\n const customMetadata = { ...meta.customMetadata, ...methodCustomMetadata };\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const methodResourceRefs: string[] =\n Reflect.getOwnMetadata(USE_RESOURCE_METADATA, prototype, methodName) ?? [];\n const allResourceRefs = [...new Set([...meta.resourceRefs, ...methodResourceRefs])];\n if (allResourceRefs.length > 0) {\n annotations[\"celerity.handler.resource.ref\"] = allResourceRefs;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type-specific annotation builders (class handlers)\n// ---------------------------------------------------------------------------\n\nfunction buildHttpAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n httpMethod: HttpMethod,\n fullPath: string,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = httpMethod;\n annotations[\"celerity.handler.http.path\"] = fullPath;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildWebSocketAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n wsEvent: WebSocketEventMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.websocket\"] = true;\n annotations[\"celerity.handler.websocket.route\"] = wsEvent.route;\n annotations[\"celerity.handler.websocket.eventType\"] = wsEvent.eventType;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildConsumerAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n consumerHandler: ConsumerHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.consumer\"] = true;\n if (meta.source) {\n annotations[\"celerity.handler.consumer.source\"] = meta.source;\n }\n if (consumerHandler.route) {\n annotations[\"celerity.handler.consumer.route\"] = consumerHandler.route;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildScheduleAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n scheduleMeta: ScheduleHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.schedule\"] = true;\n if (scheduleMeta.source) {\n annotations[\"celerity.handler.schedule.source\"] = scheduleMeta.source;\n }\n if (scheduleMeta.schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = scheduleMeta.schedule;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildCustomAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n invokeMeta: InvokeMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.custom\"] = true;\n annotations[\"celerity.handler.custom.name\"] = invokeMeta.name;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\n// ---------------------------------------------------------------------------\n// Class handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeClassHandlers(\n controllerClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry[] {\n const meta = extractControllerMeta(controllerClass);\n if (!meta) return [];\n\n const className = controllerClass.name;\n const prototype = controllerClass.prototype as object;\n const methods = Object.getOwnPropertyNames(prototype).filter((n) => n !== \"constructor\");\n const entries: ClassHandlerEntry[] = [];\n\n for (const methodName of methods) {\n // Type-specific handler decorator for the controller type.\n const typeEntry = serializeControllerTypeMethod(\n meta,\n className,\n prototype,\n methodName,\n sourceFile,\n options,\n );\n if (typeEntry) entries.push(typeEntry);\n\n // Cross-cutting: @ScheduleHandler on any controller type.\n const scheduleMeta: ScheduleHandlerMetadata | undefined = Reflect.getOwnMetadata(\n SCHEDULE_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (scheduleMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"schedule\",\n annotations: buildScheduleAnnotations(meta, prototype, methodName, scheduleMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n\n // Cross-cutting: @Invoke on any controller type.\n const invokeMeta: InvokeMetadata | undefined = Reflect.getOwnMetadata(\n INVOKE_METADATA,\n prototype,\n methodName,\n );\n if (invokeMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"custom\",\n annotations: buildCustomAnnotations(meta, prototype, methodName, invokeMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n }\n\n return entries;\n}\n\nfunction serializeControllerTypeMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n switch (meta.controllerType) {\n case \"http\":\n return serializeHttpMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"websocket\":\n return serializeWebSocketMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"consumer\":\n return serializeConsumerMethod(meta, className, prototype, methodName, sourceFile, options);\n default:\n return null;\n }\n}\n\nfunction serializeHttpMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const httpMethod: HttpMethod | undefined = Reflect.getOwnMetadata(\n HTTP_METHOD_METADATA,\n prototype,\n methodName,\n );\n if (!httpMethod) return null;\n\n const routePath: string =\n Reflect.getOwnMetadata(ROUTE_PATH_METADATA, prototype, methodName) ?? \"/\";\n const fullPath = joinHandlerPath(meta.prefix, routePath);\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"http\",\n annotations: buildHttpAnnotations(meta, prototype, methodName, httpMethod, fullPath),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeWebSocketMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const wsEvent: WebSocketEventMetadata | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_EVENT_METADATA,\n prototype,\n methodName,\n );\n if (!wsEvent) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"websocket\",\n annotations: buildWebSocketAnnotations(meta, prototype, methodName, wsEvent),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeConsumerMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const consumerHandler: ConsumerHandlerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (!consumerHandler) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"consumer\",\n annotations: buildConsumerAnnotations(meta, prototype, methodName, consumerHandler),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Function handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeFunctionHandler(\n definition: FunctionHandlerDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): FunctionHandlerEntry | null {\n // \"workflow\" is not part of v0 — skip unsupported handler types.\n const supported = [\"http\", \"websocket\", \"consumer\", \"schedule\", \"custom\"] as const;\n type SupportedType = (typeof supported)[number];\n if (!supported.includes(definition.type as SupportedType)) return null;\n\n const exportName = (definition.metadata.handlerName as string) ?? \"handler\";\n const customMetadata = (definition.metadata.customMetadata as Record<string, unknown>) ?? {};\n const handlerType = definition.type as SupportedType;\n\n const annotations: Record<string, string | string[] | boolean> = {};\n\n buildFunctionTypeAnnotations(annotations, definition);\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n exportName,\n sourceFile,\n handlerType,\n ...(Object.keys(annotations).length > 0 ? { annotations } : {}),\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\nfunction buildFunctionTypeAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n definition: FunctionHandlerDefinition,\n): void {\n const meta = definition.metadata;\n\n switch (definition.type) {\n case \"http\": {\n const path = meta.path as string | undefined;\n const method = meta.method as string | undefined;\n if (path !== undefined && method !== undefined) {\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = method;\n annotations[\"celerity.handler.http.path\"] = path;\n }\n break;\n }\n case \"websocket\": {\n annotations[\"celerity.handler.websocket\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.websocket.route\"] = route;\n }\n break;\n }\n case \"consumer\": {\n annotations[\"celerity.handler.consumer\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.consumer.route\"] = route;\n }\n break;\n }\n case \"schedule\": {\n annotations[\"celerity.handler.schedule\"] = true;\n const source = meta.source as string | undefined;\n if (source) {\n annotations[\"celerity.handler.schedule.source\"] = source;\n }\n const schedule = meta.schedule as string | undefined;\n if (schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = schedule;\n }\n break;\n }\n case \"custom\": {\n annotations[\"celerity.handler.custom\"] = true;\n const name = meta.name as string | undefined;\n if (name) {\n annotations[\"celerity.handler.custom.name\"] = name;\n }\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Guard serialization (unchanged)\n// ---------------------------------------------------------------------------\n\ntype GuardMeta = {\n guardName: string;\n customMetadata: Record<string, unknown>;\n};\n\nfunction extractGuardMeta(guardClass: Type): GuardMeta | null {\n const guardName: string | undefined = Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, guardClass);\n if (!guardName) return null;\n\n return {\n guardName,\n customMetadata: Reflect.getOwnMetadata(CUSTOM_METADATA, guardClass) ?? {},\n };\n}\n\nfunction serializeClassGuard(\n guardClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const meta = extractGuardMeta(guardClass);\n if (!meta) return null;\n\n const className = guardClass.name;\n const methodName = \"check\";\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": meta.guardName,\n };\n\n for (const [key, value] of Object.entries(meta.customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n guardName: meta.guardName,\n sourceFile,\n guardType: \"class\",\n className,\n annotations,\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeFunctionGuard(\n definition: GuardDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const guardName = definition.name;\n if (!guardName) return null;\n\n const meta = (definition.metadata ?? {}) as {\n customMetadata?: Record<string, unknown>;\n };\n const customMetadata = meta.customMetadata ?? {};\n\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": guardName,\n };\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const exportName = guardName;\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n guardName,\n sourceFile,\n guardType: \"function\",\n exportName,\n annotations,\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction serializeAnnotationValue(value: unknown): string | string[] | boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value;\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n return JSON.stringify(value);\n}\n\nexport function serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return token;\n}\n\nexport function tokenType(token: InjectionToken): \"class\" | \"string\" | \"symbol\" {\n if (typeof token === \"function\") return \"class\";\n if (typeof token === \"symbol\") return \"symbol\";\n return \"string\";\n}\n\nfunction serializeDependencyGraph(scanned: ScannedModule): DependencyGraph {\n const nodes: DependencyNode[] = scanned.providers.map((provider) => ({\n token: serializeToken(provider.token),\n tokenType: tokenType(provider.token),\n providerType: provider.providerType,\n dependencies: provider.dependencies.map(serializeToken),\n }));\n\n return { nodes };\n}\n","export { joinHandlerPath } from \"@celerity-sdk/common\";\n","import { basename, dirname, relative } from \"node:path\";\n\n/**\n * Derives a resource name for a class-based handler method.\n * Format: camelCase(className) + \"_\" + methodName\n *\n * @example deriveClassResourceName(\"OrdersHandler\", \"getOrder\") => \"ordersHandler_getOrder\"\n */\nexport function deriveClassResourceName(className: string, methodName: string): string {\n const camelClass = className.charAt(0).toLowerCase() + className.slice(1);\n return `${camelClass}_${methodName}`;\n}\n\n/**\n * Derives a handler name for a class-based handler method.\n * Format: className + \"-\" + methodName\n *\n * @example deriveClassHandlerName(\"OrdersHandler\", \"getOrder\") => \"OrdersHandler-getOrder\"\n */\nexport function deriveClassHandlerName(className: string, methodName: string): string {\n return `${className}-${methodName}`;\n}\n\n/**\n * Derives the handler function reference for a class-based handler.\n * Format: moduleBaseName + \".\" + className + \".\" + methodName\n *\n * @example deriveClassHandlerFunction(\"src/handlers/orders.ts\", \"OrdersHandler\", \"getOrder\")\n * => \"orders.OrdersHandler.getOrder\"\n */\nexport function deriveClassHandlerFunction(\n sourceFile: string,\n className: string,\n methodName: string,\n): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${className}.${methodName}`;\n}\n\n/**\n * Derives a resource name for a function-based handler.\n * Uses the export name directly.\n *\n * @example deriveFunctionResourceName(\"getOrder\") => \"getOrder\"\n */\nexport function deriveFunctionResourceName(exportName: string): string {\n return exportName;\n}\n\n/**\n * Derives the handler function reference for a function-based handler.\n * Format: moduleBaseName + \".\" + exportName\n *\n * @example deriveFunctionHandlerFunction(\"src/handlers/orders.ts\", \"getOrder\")\n * => \"orders.getOrder\"\n */\nexport function deriveFunctionHandlerFunction(sourceFile: string, exportName: string): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${exportName}`;\n}\n\n/**\n * Derives the code location from a source file path relative to the project root.\n * Returns the directory prefixed with \"./\"\n *\n * @example deriveCodeLocation(\"src/handlers/orders.ts\", \"/project\") => \"./src/handlers\"\n */\nexport function deriveCodeLocation(sourceFile: string, projectRoot: string): string {\n const rel = relative(projectRoot, sourceFile);\n const dir = dirname(rel);\n return dir === \".\" ? \"./\" : `./${dir}`;\n}\n"],"mappings":"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","names":["resolve","createDebug","createDebug","isRuntimeProvidedToken","buildModuleGraph","getClassDependencyTokens","getProviderDependencyTokens","debug","createDebug","scanProvider","provider","seenTokens","has","add","token","providerType","dependencies","getClassDependencyTokens","typed","provide","getProviderDependencyTokens","buildScannedModule","rootModule","graph","buildModuleGraph","controllerClasses","functionHandlers","guardClasses","functionGuards","providers","Set","moduleClass","node","name","length","controllers","guards","scanned","push","controller","guard","validateScannedDependencies","registeredTokens","map","p","diagnostics","visited","walk","deps","dep","find","isRuntimeProvidedToken","consumer","serializeToken","dependency","description","String","CONTROLLER_METADATA","HTTP_METHOD_METADATA","ROUTE_PATH_METADATA","WEBSOCKET_CONTROLLER_METADATA","WEBSOCKET_EVENT_METADATA","CONSUMER_METADATA","CONSUMER_HANDLER_METADATA","SCHEDULE_HANDLER_METADATA","INVOKE_METADATA","GUARD_PROTECTEDBY_METADATA","GUARD_CUSTOM_METADATA","PUBLIC_METADATA","CUSTOM_METADATA","USE_RESOURCE_METADATA","joinHandlerPath","basename","dirname","relative","deriveClassResourceName","className","methodName","camelClass","charAt","toLowerCase","slice","deriveClassHandlerName","deriveClassHandlerFunction","sourceFile","base","basename","replace","deriveFunctionResourceName","exportName","deriveFunctionHandlerFunction","deriveCodeLocation","projectRoot","rel","relative","dir","dirname","serializeManifest","scanned","sourceFile","options","handlers","functionHandlers","guardHandlers","controllerClass","controllerClasses","entries","serializeClassHandlers","push","fnHandler","entry","serializeFunctionHandler","guardClass","guardClasses","serializeClassGuard","fnGuard","functionGuards","serializeFunctionGuard","version","dependencyGraph","serializeDependencyGraph","extractControllerMeta","httpMeta","Reflect","getOwnMetadata","CONTROLLER_METADATA","controllerType","prefix","extractSharedClassMeta","isWebSocket","WEBSOCKET_CONTROLLER_METADATA","consumerMeta","CONSUMER_METADATA","source","protectedBy","GUARD_PROTECTEDBY_METADATA","customGuardName","GUARD_CUSTOM_METADATA","customMetadata","CUSTOM_METADATA","resourceRefs","USE_RESOURCE_METADATA","appendSharedAnnotations","annotations","meta","prototype","methodName","methodProtectedBy","allProtectedBy","length","isPublic","PUBLIC_METADATA","methodCustomMetadata","key","value","Object","undefined","serializeAnnotationValue","methodResourceRefs","allResourceRefs","Set","buildHttpAnnotations","httpMethod","fullPath","buildWebSocketAnnotations","wsEvent","route","eventType","buildConsumerAnnotations","consumerHandler","buildScheduleAnnotations","scheduleMeta","schedule","buildCustomAnnotations","invokeMeta","name","className","methods","getOwnPropertyNames","filter","n","typeEntry","serializeControllerTypeMethod","SCHEDULE_HANDLER_METADATA","resourceName","deriveClassResourceName","handlerType","spec","handlerName","deriveClassHandlerName","codeLocation","deriveCodeLocation","projectRoot","handler","deriveClassHandlerFunction","INVOKE_METADATA","serializeHttpMethod","serializeWebSocketMethod","serializeConsumerMethod","HTTP_METHOD_METADATA","routePath","ROUTE_PATH_METADATA","joinHandlerPath","WEBSOCKET_EVENT_METADATA","CONSUMER_HANDLER_METADATA","definition","supported","includes","type","exportName","metadata","buildFunctionTypeAnnotations","deriveFunctionResourceName","keys","deriveFunctionHandlerFunction","path","method","extractGuardMeta","guardName","guardType","Array","isArray","every","v","JSON","stringify","serializeToken","token","description","tokenType","nodes","providers","map","provider","providerType","dependencies","debug","createDebug","parseArgs","argv","modulePath","projectRoot","i","length","arg","Error","module","resolve","process","cwd","main","args","imported","rootModule","default","findModuleExport","name","scanned","buildScannedModule","controllerClasses","functionHandlers","providers","diagnostics","validateScannedDependencies","details","map","consumer","dependency","join","message","stderr","write","manifest","serializeManifest","stdout","JSON","stringify","key","Object","keys","value","undefined","catch","error","String","exitCode"]}
|
package/dist/index.cjs
CHANGED
|
@@ -136,7 +136,7 @@ function validateScannedDependencies(scanned) {
|
|
|
136
136
|
}
|
|
137
137
|
} else if (typeof dep === "function") {
|
|
138
138
|
walk(dep, (0, import_core.getClassDependencyTokens)(dep));
|
|
139
|
-
} else if (!(0, import_common.
|
|
139
|
+
} else if (!(0, import_common.isRuntimeProvidedToken)(dep)) {
|
|
140
140
|
diagnostics.push({
|
|
141
141
|
consumer: serializeToken(token),
|
|
142
142
|
dependency: serializeToken(dep)
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/extract/metadata-app.ts","../src/extract/serializer.ts","../src/extract/path-utils.ts","../src/extract/identity.ts"],"sourcesContent":["export {\n buildScannedModule,\n validateScannedDependencies,\n type ScannedModule,\n type DependencyDiagnostic,\n} from \"./extract/metadata-app\";\nexport { serializeManifest, type SerializeOptions } from \"./extract/serializer\";\nexport { joinHandlerPath } from \"./extract/path-utils\";\nexport {\n deriveClassResourceName,\n deriveClassHandlerName,\n deriveClassHandlerFunction,\n deriveFunctionResourceName,\n deriveFunctionHandlerFunction,\n deriveCodeLocation,\n} from \"./extract/identity\";\nexport type {\n HandlerManifest,\n ClassHandlerEntry,\n FunctionHandlerEntry,\n GuardHandlerEntry,\n} from \"./extract/types\";\n","import \"reflect-metadata\";\nimport createDebug from \"debug\";\nimport type {\n Type,\n InjectionToken,\n Provider,\n FunctionHandlerDefinition,\n GuardDefinition,\n} from \"@celerity-sdk/types\";\nimport { isResourceLayerToken } from \"@celerity-sdk/common\";\nimport {\n buildModuleGraph,\n getClassDependencyTokens,\n getProviderDependencyTokens,\n} from \"@celerity-sdk/core\";\nimport type { ModuleGraph } from \"@celerity-sdk/core\";\n\nconst debug = createDebug(\"celerity:cli\");\n\nexport type ScannedProvider = {\n token: InjectionToken;\n providerType: \"class\" | \"factory\" | \"value\";\n dependencies: InjectionToken[];\n};\n\nexport type ScannedModule = {\n controllerClasses: Type[];\n functionHandlers: FunctionHandlerDefinition[];\n guardClasses: Type[];\n functionGuards: GuardDefinition[];\n providers: ScannedProvider[];\n};\n\nfunction scanProvider(\n provider: Type | (Provider & { provide: InjectionToken }),\n seenTokens: Set<InjectionToken>,\n): ScannedProvider | null {\n if (typeof provider === \"function\") {\n if (seenTokens.has(provider)) return null;\n seenTokens.add(provider);\n return {\n token: provider,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(provider),\n };\n }\n\n const typed = provider as Provider & { provide: InjectionToken };\n if (seenTokens.has(typed.provide)) return null;\n seenTokens.add(typed.provide);\n\n return {\n token: typed.provide,\n providerType: \"useFactory\" in typed ? \"factory\" : \"useClass\" in typed ? \"class\" : \"value\",\n dependencies: getProviderDependencyTokens(typed),\n };\n}\n\n/**\n * Builds a scanned module from the root module class using the shared\n * `buildModuleGraph` from core. Collects all handler classes, function\n * handler definitions, and provider dependency information without\n * instantiating anything.\n *\n * Inherits circular import detection from the shared graph builder.\n */\nexport function buildScannedModule(rootModule: Type): ScannedModule {\n const graph: ModuleGraph = buildModuleGraph(rootModule);\n const controllerClasses: Type[] = [];\n const functionHandlers: FunctionHandlerDefinition[] = [];\n const guardClasses: Type[] = [];\n const functionGuards: GuardDefinition[] = [];\n const providers: ScannedProvider[] = [];\n const seenTokens = new Set<InjectionToken>();\n\n for (const [moduleClass, node] of graph) {\n debug(\n \"scan: module %s — %d providers, %d controllers, %d guards\",\n moduleClass.name,\n node.providers.length,\n node.controllers.length,\n node.guards.length,\n );\n for (const provider of node.providers) {\n const scanned = scanProvider(provider, seenTokens);\n if (scanned) providers.push(scanned);\n }\n\n for (const controller of node.controllers) {\n controllerClasses.push(controller);\n if (!seenTokens.has(controller)) {\n seenTokens.add(controller);\n providers.push({\n token: controller,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(controller),\n });\n }\n }\n\n for (const guard of node.guards) {\n if (typeof guard === \"function\") {\n guardClasses.push(guard);\n if (!seenTokens.has(guard)) {\n seenTokens.add(guard);\n providers.push({\n token: guard,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(guard),\n });\n }\n } else {\n functionGuards.push(guard);\n }\n }\n\n functionHandlers.push(...node.functionHandlers);\n }\n\n return { controllerClasses, functionHandlers, guardClasses, functionGuards, providers };\n}\n\nexport type DependencyDiagnostic = {\n consumer: string;\n dependency: string;\n};\n\n/**\n * Validates that all scanned providers have resolvable dependencies.\n * Returns an array of diagnostics for each unresolvable dependency.\n * A token is resolvable if it's registered or is a class (implicitly constructable).\n */\nexport function validateScannedDependencies(scanned: ScannedModule): DependencyDiagnostic[] {\n const registeredTokens = new Set<InjectionToken>(scanned.providers.map((p) => p.token));\n const diagnostics: DependencyDiagnostic[] = [];\n const visited = new Set<InjectionToken>();\n\n function walk(token: InjectionToken, deps: InjectionToken[]): void {\n if (visited.has(token)) return;\n visited.add(token);\n\n for (const dep of deps) {\n if (registeredTokens.has(dep)) {\n const provider = scanned.providers.find((p) => p.token === dep);\n if (provider) {\n walk(dep, provider.dependencies);\n }\n } else if (typeof dep === \"function\") {\n walk(dep, getClassDependencyTokens(dep as Type));\n } else if (!isResourceLayerToken(dep)) {\n diagnostics.push({\n consumer: serializeToken(token),\n dependency: serializeToken(dep),\n });\n }\n }\n }\n\n for (const provider of scanned.providers) {\n walk(provider.token, provider.dependencies);\n }\n\n return diagnostics;\n}\n\nfunction serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return String(token);\n}\n","import \"reflect-metadata\";\nimport type {\n Type,\n HttpMethod,\n InjectionToken,\n GuardDefinition,\n FunctionHandlerDefinition,\n} from \"@celerity-sdk/types\";\nimport {\n CONTROLLER_METADATA,\n HTTP_METHOD_METADATA,\n ROUTE_PATH_METADATA,\n WEBSOCKET_CONTROLLER_METADATA,\n WEBSOCKET_EVENT_METADATA,\n CONSUMER_METADATA,\n CONSUMER_HANDLER_METADATA,\n SCHEDULE_HANDLER_METADATA,\n INVOKE_METADATA,\n GUARD_PROTECTEDBY_METADATA,\n GUARD_CUSTOM_METADATA,\n PUBLIC_METADATA,\n CUSTOM_METADATA,\n USE_RESOURCE_METADATA,\n} from \"@celerity-sdk/core\";\nimport type {\n ControllerMetadata,\n WebSocketEventMetadata,\n ConsumerHandlerMetadata,\n ScheduleHandlerMetadata,\n InvokeMetadata,\n ConsumerMetadata,\n} from \"@celerity-sdk/core\";\nimport type { ScannedModule } from \"./metadata-app\";\nimport type {\n HandlerManifest,\n ClassHandlerEntry,\n FunctionHandlerEntry,\n GuardHandlerEntry,\n DependencyGraph,\n DependencyNode,\n} from \"./types\";\nimport { joinHandlerPath } from \"./path-utils\";\nimport {\n deriveClassResourceName,\n deriveClassHandlerName,\n deriveClassHandlerFunction,\n deriveCodeLocation,\n deriveFunctionResourceName,\n deriveFunctionHandlerFunction,\n} from \"./identity\";\n\nexport type SerializeOptions = {\n projectRoot: string;\n};\n\nexport function serializeManifest(\n scanned: ScannedModule,\n sourceFile: string,\n options: SerializeOptions,\n): HandlerManifest {\n const handlers: ClassHandlerEntry[] = [];\n const functionHandlers: FunctionHandlerEntry[] = [];\n const guardHandlers: GuardHandlerEntry[] = [];\n\n for (const controllerClass of scanned.controllerClasses) {\n const entries = serializeClassHandlers(controllerClass, sourceFile, options);\n handlers.push(...entries);\n }\n\n for (const fnHandler of scanned.functionHandlers) {\n const entry = serializeFunctionHandler(fnHandler, sourceFile, options);\n if (entry) {\n functionHandlers.push(entry);\n }\n }\n\n for (const guardClass of scanned.guardClasses) {\n const entry = serializeClassGuard(guardClass, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n for (const fnGuard of scanned.functionGuards) {\n const entry = serializeFunctionGuard(fnGuard, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n return {\n version: \"1.0.0\",\n handlers,\n functionHandlers,\n guardHandlers,\n dependencyGraph: serializeDependencyGraph(scanned),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Controller meta extraction\n// ---------------------------------------------------------------------------\n\ntype ControllerType = \"http\" | \"websocket\" | \"consumer\";\n\ntype ControllerMeta = {\n controllerType: ControllerType;\n prefix: string;\n source?: string;\n protectedBy: string[];\n customGuardName: string | undefined;\n customMetadata: Record<string, unknown>;\n resourceRefs: string[];\n};\n\nfunction extractControllerMeta(controllerClass: Type): ControllerMeta | null {\n const httpMeta: ControllerMetadata | undefined = Reflect.getOwnMetadata(\n CONTROLLER_METADATA,\n controllerClass,\n );\n if (httpMeta) {\n return {\n controllerType: \"http\",\n prefix: httpMeta.prefix ?? \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const isWebSocket: boolean | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_CONTROLLER_METADATA,\n controllerClass,\n );\n if (isWebSocket) {\n return {\n controllerType: \"websocket\",\n prefix: \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const consumerMeta: ConsumerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_METADATA,\n controllerClass,\n );\n if (consumerMeta) {\n return {\n controllerType: \"consumer\",\n prefix: \"\",\n source: consumerMeta.source,\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n return null;\n}\n\nfunction extractSharedClassMeta(controllerClass: Type) {\n return {\n protectedBy:\n (Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, controllerClass) as string[]) ?? [],\n customGuardName: Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, controllerClass) as\n | string\n | undefined,\n customMetadata:\n (Reflect.getOwnMetadata(CUSTOM_METADATA, controllerClass) as Record<string, unknown>) ?? {},\n resourceRefs:\n (Reflect.getOwnMetadata(USE_RESOURCE_METADATA, controllerClass) as string[]) ?? [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared annotation helpers\n// ---------------------------------------------------------------------------\n\nfunction appendSharedAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n): void {\n const methodProtectedBy: string[] =\n Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, prototype, methodName) ?? [];\n const allProtectedBy = [...meta.protectedBy, ...methodProtectedBy];\n if (allProtectedBy.length > 0) {\n annotations[\"celerity.handler.guard.protectedBy\"] = allProtectedBy;\n }\n if (meta.customGuardName) {\n annotations[\"celerity.handler.guard.custom\"] = meta.customGuardName;\n }\n\n const isPublic: boolean = Reflect.getOwnMetadata(PUBLIC_METADATA, prototype, methodName) === true;\n if (isPublic) {\n annotations[\"celerity.handler.public\"] = true;\n }\n\n const methodCustomMetadata: Record<string, unknown> =\n Reflect.getOwnMetadata(CUSTOM_METADATA, prototype, methodName) ?? {};\n const customMetadata = { ...meta.customMetadata, ...methodCustomMetadata };\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const methodResourceRefs: string[] =\n Reflect.getOwnMetadata(USE_RESOURCE_METADATA, prototype, methodName) ?? [];\n const allResourceRefs = [...new Set([...meta.resourceRefs, ...methodResourceRefs])];\n if (allResourceRefs.length > 0) {\n annotations[\"celerity.handler.resource.ref\"] = allResourceRefs;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type-specific annotation builders (class handlers)\n// ---------------------------------------------------------------------------\n\nfunction buildHttpAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n httpMethod: HttpMethod,\n fullPath: string,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = httpMethod;\n annotations[\"celerity.handler.http.path\"] = fullPath;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildWebSocketAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n wsEvent: WebSocketEventMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.websocket\"] = true;\n annotations[\"celerity.handler.websocket.route\"] = wsEvent.route;\n annotations[\"celerity.handler.websocket.eventType\"] = wsEvent.eventType;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildConsumerAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n consumerHandler: ConsumerHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.consumer\"] = true;\n if (meta.source) {\n annotations[\"celerity.handler.consumer.source\"] = meta.source;\n }\n if (consumerHandler.route) {\n annotations[\"celerity.handler.consumer.route\"] = consumerHandler.route;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildScheduleAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n scheduleMeta: ScheduleHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.schedule\"] = true;\n if (scheduleMeta.source) {\n annotations[\"celerity.handler.schedule.source\"] = scheduleMeta.source;\n }\n if (scheduleMeta.schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = scheduleMeta.schedule;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildCustomAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n invokeMeta: InvokeMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.custom\"] = true;\n annotations[\"celerity.handler.custom.name\"] = invokeMeta.name;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\n// ---------------------------------------------------------------------------\n// Class handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeClassHandlers(\n controllerClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry[] {\n const meta = extractControllerMeta(controllerClass);\n if (!meta) return [];\n\n const className = controllerClass.name;\n const prototype = controllerClass.prototype as object;\n const methods = Object.getOwnPropertyNames(prototype).filter((n) => n !== \"constructor\");\n const entries: ClassHandlerEntry[] = [];\n\n for (const methodName of methods) {\n // Type-specific handler decorator for the controller type.\n const typeEntry = serializeControllerTypeMethod(\n meta,\n className,\n prototype,\n methodName,\n sourceFile,\n options,\n );\n if (typeEntry) entries.push(typeEntry);\n\n // Cross-cutting: @ScheduleHandler on any controller type.\n const scheduleMeta: ScheduleHandlerMetadata | undefined = Reflect.getOwnMetadata(\n SCHEDULE_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (scheduleMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"schedule\",\n annotations: buildScheduleAnnotations(meta, prototype, methodName, scheduleMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n\n // Cross-cutting: @Invoke on any controller type.\n const invokeMeta: InvokeMetadata | undefined = Reflect.getOwnMetadata(\n INVOKE_METADATA,\n prototype,\n methodName,\n );\n if (invokeMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"custom\",\n annotations: buildCustomAnnotations(meta, prototype, methodName, invokeMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n }\n\n return entries;\n}\n\nfunction serializeControllerTypeMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n switch (meta.controllerType) {\n case \"http\":\n return serializeHttpMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"websocket\":\n return serializeWebSocketMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"consumer\":\n return serializeConsumerMethod(meta, className, prototype, methodName, sourceFile, options);\n default:\n return null;\n }\n}\n\nfunction serializeHttpMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const httpMethod: HttpMethod | undefined = Reflect.getOwnMetadata(\n HTTP_METHOD_METADATA,\n prototype,\n methodName,\n );\n if (!httpMethod) return null;\n\n const routePath: string =\n Reflect.getOwnMetadata(ROUTE_PATH_METADATA, prototype, methodName) ?? \"/\";\n const fullPath = joinHandlerPath(meta.prefix, routePath);\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"http\",\n annotations: buildHttpAnnotations(meta, prototype, methodName, httpMethod, fullPath),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeWebSocketMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const wsEvent: WebSocketEventMetadata | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_EVENT_METADATA,\n prototype,\n methodName,\n );\n if (!wsEvent) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"websocket\",\n annotations: buildWebSocketAnnotations(meta, prototype, methodName, wsEvent),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeConsumerMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const consumerHandler: ConsumerHandlerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (!consumerHandler) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"consumer\",\n annotations: buildConsumerAnnotations(meta, prototype, methodName, consumerHandler),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Function handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeFunctionHandler(\n definition: FunctionHandlerDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): FunctionHandlerEntry | null {\n // \"workflow\" is not part of v0 — skip unsupported handler types.\n const supported = [\"http\", \"websocket\", \"consumer\", \"schedule\", \"custom\"] as const;\n type SupportedType = (typeof supported)[number];\n if (!supported.includes(definition.type as SupportedType)) return null;\n\n const exportName = (definition.metadata.handlerName as string) ?? \"handler\";\n const customMetadata = (definition.metadata.customMetadata as Record<string, unknown>) ?? {};\n const handlerType = definition.type as SupportedType;\n\n const annotations: Record<string, string | string[] | boolean> = {};\n\n buildFunctionTypeAnnotations(annotations, definition);\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n exportName,\n sourceFile,\n handlerType,\n ...(Object.keys(annotations).length > 0 ? { annotations } : {}),\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\nfunction buildFunctionTypeAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n definition: FunctionHandlerDefinition,\n): void {\n const meta = definition.metadata;\n\n switch (definition.type) {\n case \"http\": {\n const path = meta.path as string | undefined;\n const method = meta.method as string | undefined;\n if (path !== undefined && method !== undefined) {\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = method;\n annotations[\"celerity.handler.http.path\"] = path;\n }\n break;\n }\n case \"websocket\": {\n annotations[\"celerity.handler.websocket\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.websocket.route\"] = route;\n }\n break;\n }\n case \"consumer\": {\n annotations[\"celerity.handler.consumer\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.consumer.route\"] = route;\n }\n break;\n }\n case \"schedule\": {\n annotations[\"celerity.handler.schedule\"] = true;\n const source = meta.source as string | undefined;\n if (source) {\n annotations[\"celerity.handler.schedule.source\"] = source;\n }\n const schedule = meta.schedule as string | undefined;\n if (schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = schedule;\n }\n break;\n }\n case \"custom\": {\n annotations[\"celerity.handler.custom\"] = true;\n const name = meta.name as string | undefined;\n if (name) {\n annotations[\"celerity.handler.custom.name\"] = name;\n }\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Guard serialization (unchanged)\n// ---------------------------------------------------------------------------\n\ntype GuardMeta = {\n guardName: string;\n customMetadata: Record<string, unknown>;\n};\n\nfunction extractGuardMeta(guardClass: Type): GuardMeta | null {\n const guardName: string | undefined = Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, guardClass);\n if (!guardName) return null;\n\n return {\n guardName,\n customMetadata: Reflect.getOwnMetadata(CUSTOM_METADATA, guardClass) ?? {},\n };\n}\n\nfunction serializeClassGuard(\n guardClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const meta = extractGuardMeta(guardClass);\n if (!meta) return null;\n\n const className = guardClass.name;\n const methodName = \"check\";\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": meta.guardName,\n };\n\n for (const [key, value] of Object.entries(meta.customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n guardName: meta.guardName,\n sourceFile,\n guardType: \"class\",\n className,\n annotations,\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeFunctionGuard(\n definition: GuardDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const guardName = definition.name;\n if (!guardName) return null;\n\n const meta = (definition.metadata ?? {}) as {\n customMetadata?: Record<string, unknown>;\n };\n const customMetadata = meta.customMetadata ?? {};\n\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": guardName,\n };\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const exportName = guardName;\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n guardName,\n sourceFile,\n guardType: \"function\",\n exportName,\n annotations,\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction serializeAnnotationValue(value: unknown): string | string[] | boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value;\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n return JSON.stringify(value);\n}\n\nexport function serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return token;\n}\n\nexport function tokenType(token: InjectionToken): \"class\" | \"string\" | \"symbol\" {\n if (typeof token === \"function\") return \"class\";\n if (typeof token === \"symbol\") return \"symbol\";\n return \"string\";\n}\n\nfunction serializeDependencyGraph(scanned: ScannedModule): DependencyGraph {\n const nodes: DependencyNode[] = scanned.providers.map((provider) => ({\n token: serializeToken(provider.token),\n tokenType: tokenType(provider.token),\n providerType: provider.providerType,\n dependencies: provider.dependencies.map(serializeToken),\n }));\n\n return { nodes };\n}\n","export { joinHandlerPath } from \"@celerity-sdk/common\";\n","import { basename, dirname, relative } from \"node:path\";\n\n/**\n * Derives a resource name for a class-based handler method.\n * Format: camelCase(className) + \"_\" + methodName\n *\n * @example deriveClassResourceName(\"OrdersHandler\", \"getOrder\") => \"ordersHandler_getOrder\"\n */\nexport function deriveClassResourceName(className: string, methodName: string): string {\n const camelClass = className.charAt(0).toLowerCase() + className.slice(1);\n return `${camelClass}_${methodName}`;\n}\n\n/**\n * Derives a handler name for a class-based handler method.\n * Format: className + \"-\" + methodName\n *\n * @example deriveClassHandlerName(\"OrdersHandler\", \"getOrder\") => \"OrdersHandler-getOrder\"\n */\nexport function deriveClassHandlerName(className: string, methodName: string): string {\n return `${className}-${methodName}`;\n}\n\n/**\n * Derives the handler function reference for a class-based handler.\n * Format: moduleBaseName + \".\" + className + \".\" + methodName\n *\n * @example deriveClassHandlerFunction(\"src/handlers/orders.ts\", \"OrdersHandler\", \"getOrder\")\n * => \"orders.OrdersHandler.getOrder\"\n */\nexport function deriveClassHandlerFunction(\n sourceFile: string,\n className: string,\n methodName: string,\n): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${className}.${methodName}`;\n}\n\n/**\n * Derives a resource name for a function-based handler.\n * Uses the export name directly.\n *\n * @example deriveFunctionResourceName(\"getOrder\") => \"getOrder\"\n */\nexport function deriveFunctionResourceName(exportName: string): string {\n return exportName;\n}\n\n/**\n * Derives the handler function reference for a function-based handler.\n * Format: moduleBaseName + \".\" + exportName\n *\n * @example deriveFunctionHandlerFunction(\"src/handlers/orders.ts\", \"getOrder\")\n * => \"orders.getOrder\"\n */\nexport function deriveFunctionHandlerFunction(sourceFile: string, exportName: string): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${exportName}`;\n}\n\n/**\n * Derives the code location from a source file path relative to the project root.\n * Returns the directory prefixed with \"./\"\n *\n * @example deriveCodeLocation(\"src/handlers/orders.ts\", \"/project\") => \"./src/handlers\"\n */\nexport function deriveCodeLocation(sourceFile: string, projectRoot: string): string {\n const rel = relative(projectRoot, sourceFile);\n const dir = dirname(rel);\n return dir === \".\" ? \"./\" : `./${dir}`;\n}\n"],"mappings":"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","names":["debug","createDebug","scanProvider","provider","seenTokens","has","add","token","providerType","dependencies","getClassDependencyTokens","typed","provide","getProviderDependencyTokens","buildScannedModule","rootModule","graph","buildModuleGraph","controllerClasses","functionHandlers","guardClasses","functionGuards","providers","Set","moduleClass","node","name","length","controllers","guards","scanned","push","controller","guard","validateScannedDependencies","registeredTokens","map","p","diagnostics","visited","walk","deps","dep","find","isResourceLayerToken","consumer","serializeToken","dependency","description","String","import_reflect_metadata","import_core","import_common","deriveClassResourceName","className","methodName","camelClass","charAt","toLowerCase","slice","deriveClassHandlerName","deriveClassHandlerFunction","sourceFile","base","basename","replace","deriveFunctionResourceName","exportName","deriveFunctionHandlerFunction","deriveCodeLocation","projectRoot","rel","relative","dir","dirname","serializeManifest","scanned","sourceFile","options","handlers","functionHandlers","guardHandlers","controllerClass","controllerClasses","entries","serializeClassHandlers","push","fnHandler","entry","serializeFunctionHandler","guardClass","guardClasses","serializeClassGuard","fnGuard","functionGuards","serializeFunctionGuard","version","dependencyGraph","serializeDependencyGraph","extractControllerMeta","httpMeta","Reflect","getOwnMetadata","CONTROLLER_METADATA","controllerType","prefix","extractSharedClassMeta","isWebSocket","WEBSOCKET_CONTROLLER_METADATA","consumerMeta","CONSUMER_METADATA","source","protectedBy","GUARD_PROTECTEDBY_METADATA","customGuardName","GUARD_CUSTOM_METADATA","customMetadata","CUSTOM_METADATA","resourceRefs","USE_RESOURCE_METADATA","appendSharedAnnotations","annotations","meta","prototype","methodName","methodProtectedBy","allProtectedBy","length","isPublic","PUBLIC_METADATA","methodCustomMetadata","key","value","Object","undefined","serializeAnnotationValue","methodResourceRefs","allResourceRefs","Set","buildHttpAnnotations","httpMethod","fullPath","buildWebSocketAnnotations","wsEvent","route","eventType","buildConsumerAnnotations","consumerHandler","buildScheduleAnnotations","scheduleMeta","schedule","buildCustomAnnotations","invokeMeta","name","className","methods","getOwnPropertyNames","filter","n","typeEntry","serializeControllerTypeMethod","SCHEDULE_HANDLER_METADATA","resourceName","deriveClassResourceName","handlerType","spec","handlerName","deriveClassHandlerName","codeLocation","deriveCodeLocation","projectRoot","handler","deriveClassHandlerFunction","INVOKE_METADATA","serializeHttpMethod","serializeWebSocketMethod","serializeConsumerMethod","HTTP_METHOD_METADATA","routePath","ROUTE_PATH_METADATA","joinHandlerPath","WEBSOCKET_EVENT_METADATA","CONSUMER_HANDLER_METADATA","definition","supported","includes","type","exportName","metadata","buildFunctionTypeAnnotations","deriveFunctionResourceName","keys","deriveFunctionHandlerFunction","path","method","extractGuardMeta","guardName","guardType","Array","isArray","every","v","JSON","stringify","serializeToken","token","description","tokenType","nodes","providers","map","provider","providerType","dependencies"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/extract/metadata-app.ts","../src/extract/serializer.ts","../src/extract/path-utils.ts","../src/extract/identity.ts"],"sourcesContent":["export {\n buildScannedModule,\n validateScannedDependencies,\n type ScannedModule,\n type DependencyDiagnostic,\n} from \"./extract/metadata-app\";\nexport { serializeManifest, type SerializeOptions } from \"./extract/serializer\";\nexport { joinHandlerPath } from \"./extract/path-utils\";\nexport {\n deriveClassResourceName,\n deriveClassHandlerName,\n deriveClassHandlerFunction,\n deriveFunctionResourceName,\n deriveFunctionHandlerFunction,\n deriveCodeLocation,\n} from \"./extract/identity\";\nexport type {\n HandlerManifest,\n ClassHandlerEntry,\n FunctionHandlerEntry,\n GuardHandlerEntry,\n} from \"./extract/types\";\n","import \"reflect-metadata\";\nimport createDebug from \"debug\";\nimport type {\n Type,\n InjectionToken,\n Provider,\n FunctionHandlerDefinition,\n GuardDefinition,\n} from \"@celerity-sdk/types\";\nimport { isRuntimeProvidedToken } from \"@celerity-sdk/common\";\nimport {\n buildModuleGraph,\n getClassDependencyTokens,\n getProviderDependencyTokens,\n} from \"@celerity-sdk/core\";\nimport type { ModuleGraph } from \"@celerity-sdk/core\";\n\nconst debug = createDebug(\"celerity:cli\");\n\nexport type ScannedProvider = {\n token: InjectionToken;\n providerType: \"class\" | \"factory\" | \"value\";\n dependencies: InjectionToken[];\n};\n\nexport type ScannedModule = {\n controllerClasses: Type[];\n functionHandlers: FunctionHandlerDefinition[];\n guardClasses: Type[];\n functionGuards: GuardDefinition[];\n providers: ScannedProvider[];\n};\n\nfunction scanProvider(\n provider: Type | (Provider & { provide: InjectionToken }),\n seenTokens: Set<InjectionToken>,\n): ScannedProvider | null {\n if (typeof provider === \"function\") {\n if (seenTokens.has(provider)) return null;\n seenTokens.add(provider);\n return {\n token: provider,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(provider),\n };\n }\n\n const typed = provider as Provider & { provide: InjectionToken };\n if (seenTokens.has(typed.provide)) return null;\n seenTokens.add(typed.provide);\n\n return {\n token: typed.provide,\n providerType: \"useFactory\" in typed ? \"factory\" : \"useClass\" in typed ? \"class\" : \"value\",\n dependencies: getProviderDependencyTokens(typed),\n };\n}\n\n/**\n * Builds a scanned module from the root module class using the shared\n * `buildModuleGraph` from core. Collects all handler classes, function\n * handler definitions, and provider dependency information without\n * instantiating anything.\n *\n * Inherits circular import detection from the shared graph builder.\n */\nexport function buildScannedModule(rootModule: Type): ScannedModule {\n const graph: ModuleGraph = buildModuleGraph(rootModule);\n const controllerClasses: Type[] = [];\n const functionHandlers: FunctionHandlerDefinition[] = [];\n const guardClasses: Type[] = [];\n const functionGuards: GuardDefinition[] = [];\n const providers: ScannedProvider[] = [];\n const seenTokens = new Set<InjectionToken>();\n\n for (const [moduleClass, node] of graph) {\n debug(\n \"scan: module %s — %d providers, %d controllers, %d guards\",\n moduleClass.name,\n node.providers.length,\n node.controllers.length,\n node.guards.length,\n );\n for (const provider of node.providers) {\n const scanned = scanProvider(provider, seenTokens);\n if (scanned) providers.push(scanned);\n }\n\n for (const controller of node.controllers) {\n controllerClasses.push(controller);\n if (!seenTokens.has(controller)) {\n seenTokens.add(controller);\n providers.push({\n token: controller,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(controller),\n });\n }\n }\n\n for (const guard of node.guards) {\n if (typeof guard === \"function\") {\n guardClasses.push(guard);\n if (!seenTokens.has(guard)) {\n seenTokens.add(guard);\n providers.push({\n token: guard,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(guard),\n });\n }\n } else {\n functionGuards.push(guard);\n }\n }\n\n functionHandlers.push(...node.functionHandlers);\n }\n\n return { controllerClasses, functionHandlers, guardClasses, functionGuards, providers };\n}\n\nexport type DependencyDiagnostic = {\n consumer: string;\n dependency: string;\n};\n\n/**\n * Validates that all scanned providers have resolvable dependencies.\n * Returns an array of diagnostics for each unresolvable dependency.\n * A token is resolvable if it's registered or is a class (implicitly constructable).\n */\nexport function validateScannedDependencies(scanned: ScannedModule): DependencyDiagnostic[] {\n const registeredTokens = new Set<InjectionToken>(scanned.providers.map((p) => p.token));\n const diagnostics: DependencyDiagnostic[] = [];\n const visited = new Set<InjectionToken>();\n\n function walk(token: InjectionToken, deps: InjectionToken[]): void {\n if (visited.has(token)) return;\n visited.add(token);\n\n for (const dep of deps) {\n if (registeredTokens.has(dep)) {\n const provider = scanned.providers.find((p) => p.token === dep);\n if (provider) {\n walk(dep, provider.dependencies);\n }\n } else if (typeof dep === \"function\") {\n walk(dep, getClassDependencyTokens(dep as Type));\n } else if (!isRuntimeProvidedToken(dep)) {\n diagnostics.push({\n consumer: serializeToken(token),\n dependency: serializeToken(dep),\n });\n }\n }\n }\n\n for (const provider of scanned.providers) {\n walk(provider.token, provider.dependencies);\n }\n\n return diagnostics;\n}\n\nfunction serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return String(token);\n}\n","import \"reflect-metadata\";\nimport type {\n Type,\n HttpMethod,\n InjectionToken,\n GuardDefinition,\n FunctionHandlerDefinition,\n} from \"@celerity-sdk/types\";\nimport {\n CONTROLLER_METADATA,\n HTTP_METHOD_METADATA,\n ROUTE_PATH_METADATA,\n WEBSOCKET_CONTROLLER_METADATA,\n WEBSOCKET_EVENT_METADATA,\n CONSUMER_METADATA,\n CONSUMER_HANDLER_METADATA,\n SCHEDULE_HANDLER_METADATA,\n INVOKE_METADATA,\n GUARD_PROTECTEDBY_METADATA,\n GUARD_CUSTOM_METADATA,\n PUBLIC_METADATA,\n CUSTOM_METADATA,\n USE_RESOURCE_METADATA,\n} from \"@celerity-sdk/core\";\nimport type {\n ControllerMetadata,\n WebSocketEventMetadata,\n ConsumerHandlerMetadata,\n ScheduleHandlerMetadata,\n InvokeMetadata,\n ConsumerMetadata,\n} from \"@celerity-sdk/core\";\nimport type { ScannedModule } from \"./metadata-app\";\nimport type {\n HandlerManifest,\n ClassHandlerEntry,\n FunctionHandlerEntry,\n GuardHandlerEntry,\n DependencyGraph,\n DependencyNode,\n} from \"./types\";\nimport { joinHandlerPath } from \"./path-utils\";\nimport {\n deriveClassResourceName,\n deriveClassHandlerName,\n deriveClassHandlerFunction,\n deriveCodeLocation,\n deriveFunctionResourceName,\n deriveFunctionHandlerFunction,\n} from \"./identity\";\n\nexport type SerializeOptions = {\n projectRoot: string;\n};\n\nexport function serializeManifest(\n scanned: ScannedModule,\n sourceFile: string,\n options: SerializeOptions,\n): HandlerManifest {\n const handlers: ClassHandlerEntry[] = [];\n const functionHandlers: FunctionHandlerEntry[] = [];\n const guardHandlers: GuardHandlerEntry[] = [];\n\n for (const controllerClass of scanned.controllerClasses) {\n const entries = serializeClassHandlers(controllerClass, sourceFile, options);\n handlers.push(...entries);\n }\n\n for (const fnHandler of scanned.functionHandlers) {\n const entry = serializeFunctionHandler(fnHandler, sourceFile, options);\n if (entry) {\n functionHandlers.push(entry);\n }\n }\n\n for (const guardClass of scanned.guardClasses) {\n const entry = serializeClassGuard(guardClass, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n for (const fnGuard of scanned.functionGuards) {\n const entry = serializeFunctionGuard(fnGuard, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n return {\n version: \"1.0.0\",\n handlers,\n functionHandlers,\n guardHandlers,\n dependencyGraph: serializeDependencyGraph(scanned),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Controller meta extraction\n// ---------------------------------------------------------------------------\n\ntype ControllerType = \"http\" | \"websocket\" | \"consumer\";\n\ntype ControllerMeta = {\n controllerType: ControllerType;\n prefix: string;\n source?: string;\n protectedBy: string[];\n customGuardName: string | undefined;\n customMetadata: Record<string, unknown>;\n resourceRefs: string[];\n};\n\nfunction extractControllerMeta(controllerClass: Type): ControllerMeta | null {\n const httpMeta: ControllerMetadata | undefined = Reflect.getOwnMetadata(\n CONTROLLER_METADATA,\n controllerClass,\n );\n if (httpMeta) {\n return {\n controllerType: \"http\",\n prefix: httpMeta.prefix ?? \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const isWebSocket: boolean | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_CONTROLLER_METADATA,\n controllerClass,\n );\n if (isWebSocket) {\n return {\n controllerType: \"websocket\",\n prefix: \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const consumerMeta: ConsumerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_METADATA,\n controllerClass,\n );\n if (consumerMeta) {\n return {\n controllerType: \"consumer\",\n prefix: \"\",\n source: consumerMeta.source,\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n return null;\n}\n\nfunction extractSharedClassMeta(controllerClass: Type) {\n return {\n protectedBy:\n (Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, controllerClass) as string[]) ?? [],\n customGuardName: Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, controllerClass) as\n | string\n | undefined,\n customMetadata:\n (Reflect.getOwnMetadata(CUSTOM_METADATA, controllerClass) as Record<string, unknown>) ?? {},\n resourceRefs:\n (Reflect.getOwnMetadata(USE_RESOURCE_METADATA, controllerClass) as string[]) ?? [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared annotation helpers\n// ---------------------------------------------------------------------------\n\nfunction appendSharedAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n): void {\n const methodProtectedBy: string[] =\n Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, prototype, methodName) ?? [];\n const allProtectedBy = [...meta.protectedBy, ...methodProtectedBy];\n if (allProtectedBy.length > 0) {\n annotations[\"celerity.handler.guard.protectedBy\"] = allProtectedBy;\n }\n if (meta.customGuardName) {\n annotations[\"celerity.handler.guard.custom\"] = meta.customGuardName;\n }\n\n const isPublic: boolean = Reflect.getOwnMetadata(PUBLIC_METADATA, prototype, methodName) === true;\n if (isPublic) {\n annotations[\"celerity.handler.public\"] = true;\n }\n\n const methodCustomMetadata: Record<string, unknown> =\n Reflect.getOwnMetadata(CUSTOM_METADATA, prototype, methodName) ?? {};\n const customMetadata = { ...meta.customMetadata, ...methodCustomMetadata };\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const methodResourceRefs: string[] =\n Reflect.getOwnMetadata(USE_RESOURCE_METADATA, prototype, methodName) ?? [];\n const allResourceRefs = [...new Set([...meta.resourceRefs, ...methodResourceRefs])];\n if (allResourceRefs.length > 0) {\n annotations[\"celerity.handler.resource.ref\"] = allResourceRefs;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type-specific annotation builders (class handlers)\n// ---------------------------------------------------------------------------\n\nfunction buildHttpAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n httpMethod: HttpMethod,\n fullPath: string,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = httpMethod;\n annotations[\"celerity.handler.http.path\"] = fullPath;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildWebSocketAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n wsEvent: WebSocketEventMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.websocket\"] = true;\n annotations[\"celerity.handler.websocket.route\"] = wsEvent.route;\n annotations[\"celerity.handler.websocket.eventType\"] = wsEvent.eventType;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildConsumerAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n consumerHandler: ConsumerHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.consumer\"] = true;\n if (meta.source) {\n annotations[\"celerity.handler.consumer.source\"] = meta.source;\n }\n if (consumerHandler.route) {\n annotations[\"celerity.handler.consumer.route\"] = consumerHandler.route;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildScheduleAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n scheduleMeta: ScheduleHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.schedule\"] = true;\n if (scheduleMeta.source) {\n annotations[\"celerity.handler.schedule.source\"] = scheduleMeta.source;\n }\n if (scheduleMeta.schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = scheduleMeta.schedule;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildCustomAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n invokeMeta: InvokeMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.custom\"] = true;\n annotations[\"celerity.handler.custom.name\"] = invokeMeta.name;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\n// ---------------------------------------------------------------------------\n// Class handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeClassHandlers(\n controllerClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry[] {\n const meta = extractControllerMeta(controllerClass);\n if (!meta) return [];\n\n const className = controllerClass.name;\n const prototype = controllerClass.prototype as object;\n const methods = Object.getOwnPropertyNames(prototype).filter((n) => n !== \"constructor\");\n const entries: ClassHandlerEntry[] = [];\n\n for (const methodName of methods) {\n // Type-specific handler decorator for the controller type.\n const typeEntry = serializeControllerTypeMethod(\n meta,\n className,\n prototype,\n methodName,\n sourceFile,\n options,\n );\n if (typeEntry) entries.push(typeEntry);\n\n // Cross-cutting: @ScheduleHandler on any controller type.\n const scheduleMeta: ScheduleHandlerMetadata | undefined = Reflect.getOwnMetadata(\n SCHEDULE_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (scheduleMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"schedule\",\n annotations: buildScheduleAnnotations(meta, prototype, methodName, scheduleMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n\n // Cross-cutting: @Invoke on any controller type.\n const invokeMeta: InvokeMetadata | undefined = Reflect.getOwnMetadata(\n INVOKE_METADATA,\n prototype,\n methodName,\n );\n if (invokeMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"custom\",\n annotations: buildCustomAnnotations(meta, prototype, methodName, invokeMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n }\n\n return entries;\n}\n\nfunction serializeControllerTypeMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n switch (meta.controllerType) {\n case \"http\":\n return serializeHttpMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"websocket\":\n return serializeWebSocketMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"consumer\":\n return serializeConsumerMethod(meta, className, prototype, methodName, sourceFile, options);\n default:\n return null;\n }\n}\n\nfunction serializeHttpMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const httpMethod: HttpMethod | undefined = Reflect.getOwnMetadata(\n HTTP_METHOD_METADATA,\n prototype,\n methodName,\n );\n if (!httpMethod) return null;\n\n const routePath: string =\n Reflect.getOwnMetadata(ROUTE_PATH_METADATA, prototype, methodName) ?? \"/\";\n const fullPath = joinHandlerPath(meta.prefix, routePath);\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"http\",\n annotations: buildHttpAnnotations(meta, prototype, methodName, httpMethod, fullPath),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeWebSocketMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const wsEvent: WebSocketEventMetadata | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_EVENT_METADATA,\n prototype,\n methodName,\n );\n if (!wsEvent) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"websocket\",\n annotations: buildWebSocketAnnotations(meta, prototype, methodName, wsEvent),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeConsumerMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const consumerHandler: ConsumerHandlerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (!consumerHandler) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"consumer\",\n annotations: buildConsumerAnnotations(meta, prototype, methodName, consumerHandler),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Function handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeFunctionHandler(\n definition: FunctionHandlerDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): FunctionHandlerEntry | null {\n // \"workflow\" is not part of v0 — skip unsupported handler types.\n const supported = [\"http\", \"websocket\", \"consumer\", \"schedule\", \"custom\"] as const;\n type SupportedType = (typeof supported)[number];\n if (!supported.includes(definition.type as SupportedType)) return null;\n\n const exportName = (definition.metadata.handlerName as string) ?? \"handler\";\n const customMetadata = (definition.metadata.customMetadata as Record<string, unknown>) ?? {};\n const handlerType = definition.type as SupportedType;\n\n const annotations: Record<string, string | string[] | boolean> = {};\n\n buildFunctionTypeAnnotations(annotations, definition);\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n exportName,\n sourceFile,\n handlerType,\n ...(Object.keys(annotations).length > 0 ? { annotations } : {}),\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\nfunction buildFunctionTypeAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n definition: FunctionHandlerDefinition,\n): void {\n const meta = definition.metadata;\n\n switch (definition.type) {\n case \"http\": {\n const path = meta.path as string | undefined;\n const method = meta.method as string | undefined;\n if (path !== undefined && method !== undefined) {\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = method;\n annotations[\"celerity.handler.http.path\"] = path;\n }\n break;\n }\n case \"websocket\": {\n annotations[\"celerity.handler.websocket\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.websocket.route\"] = route;\n }\n break;\n }\n case \"consumer\": {\n annotations[\"celerity.handler.consumer\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.consumer.route\"] = route;\n }\n break;\n }\n case \"schedule\": {\n annotations[\"celerity.handler.schedule\"] = true;\n const source = meta.source as string | undefined;\n if (source) {\n annotations[\"celerity.handler.schedule.source\"] = source;\n }\n const schedule = meta.schedule as string | undefined;\n if (schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = schedule;\n }\n break;\n }\n case \"custom\": {\n annotations[\"celerity.handler.custom\"] = true;\n const name = meta.name as string | undefined;\n if (name) {\n annotations[\"celerity.handler.custom.name\"] = name;\n }\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Guard serialization (unchanged)\n// ---------------------------------------------------------------------------\n\ntype GuardMeta = {\n guardName: string;\n customMetadata: Record<string, unknown>;\n};\n\nfunction extractGuardMeta(guardClass: Type): GuardMeta | null {\n const guardName: string | undefined = Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, guardClass);\n if (!guardName) return null;\n\n return {\n guardName,\n customMetadata: Reflect.getOwnMetadata(CUSTOM_METADATA, guardClass) ?? {},\n };\n}\n\nfunction serializeClassGuard(\n guardClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const meta = extractGuardMeta(guardClass);\n if (!meta) return null;\n\n const className = guardClass.name;\n const methodName = \"check\";\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": meta.guardName,\n };\n\n for (const [key, value] of Object.entries(meta.customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n guardName: meta.guardName,\n sourceFile,\n guardType: \"class\",\n className,\n annotations,\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeFunctionGuard(\n definition: GuardDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const guardName = definition.name;\n if (!guardName) return null;\n\n const meta = (definition.metadata ?? {}) as {\n customMetadata?: Record<string, unknown>;\n };\n const customMetadata = meta.customMetadata ?? {};\n\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": guardName,\n };\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const exportName = guardName;\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n guardName,\n sourceFile,\n guardType: \"function\",\n exportName,\n annotations,\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction serializeAnnotationValue(value: unknown): string | string[] | boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value;\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n return JSON.stringify(value);\n}\n\nexport function serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return token;\n}\n\nexport function tokenType(token: InjectionToken): \"class\" | \"string\" | \"symbol\" {\n if (typeof token === \"function\") return \"class\";\n if (typeof token === \"symbol\") return \"symbol\";\n return \"string\";\n}\n\nfunction serializeDependencyGraph(scanned: ScannedModule): DependencyGraph {\n const nodes: DependencyNode[] = scanned.providers.map((provider) => ({\n token: serializeToken(provider.token),\n tokenType: tokenType(provider.token),\n providerType: provider.providerType,\n dependencies: provider.dependencies.map(serializeToken),\n }));\n\n return { nodes };\n}\n","export { joinHandlerPath } from \"@celerity-sdk/common\";\n","import { basename, dirname, relative } from \"node:path\";\n\n/**\n * Derives a resource name for a class-based handler method.\n * Format: camelCase(className) + \"_\" + methodName\n *\n * @example deriveClassResourceName(\"OrdersHandler\", \"getOrder\") => \"ordersHandler_getOrder\"\n */\nexport function deriveClassResourceName(className: string, methodName: string): string {\n const camelClass = className.charAt(0).toLowerCase() + className.slice(1);\n return `${camelClass}_${methodName}`;\n}\n\n/**\n * Derives a handler name for a class-based handler method.\n * Format: className + \"-\" + methodName\n *\n * @example deriveClassHandlerName(\"OrdersHandler\", \"getOrder\") => \"OrdersHandler-getOrder\"\n */\nexport function deriveClassHandlerName(className: string, methodName: string): string {\n return `${className}-${methodName}`;\n}\n\n/**\n * Derives the handler function reference for a class-based handler.\n * Format: moduleBaseName + \".\" + className + \".\" + methodName\n *\n * @example deriveClassHandlerFunction(\"src/handlers/orders.ts\", \"OrdersHandler\", \"getOrder\")\n * => \"orders.OrdersHandler.getOrder\"\n */\nexport function deriveClassHandlerFunction(\n sourceFile: string,\n className: string,\n methodName: string,\n): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${className}.${methodName}`;\n}\n\n/**\n * Derives a resource name for a function-based handler.\n * Uses the export name directly.\n *\n * @example deriveFunctionResourceName(\"getOrder\") => \"getOrder\"\n */\nexport function deriveFunctionResourceName(exportName: string): string {\n return exportName;\n}\n\n/**\n * Derives the handler function reference for a function-based handler.\n * Format: moduleBaseName + \".\" + exportName\n *\n * @example deriveFunctionHandlerFunction(\"src/handlers/orders.ts\", \"getOrder\")\n * => \"orders.getOrder\"\n */\nexport function deriveFunctionHandlerFunction(sourceFile: string, exportName: string): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${exportName}`;\n}\n\n/**\n * Derives the code location from a source file path relative to the project root.\n * Returns the directory prefixed with \"./\"\n *\n * @example deriveCodeLocation(\"src/handlers/orders.ts\", \"/project\") => \"./src/handlers\"\n */\nexport function deriveCodeLocation(sourceFile: string, projectRoot: string): string {\n const rel = relative(projectRoot, sourceFile);\n const dir = dirname(rel);\n return dir === \".\" ? \"./\" : `./${dir}`;\n}\n"],"mappings":"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","names":["debug","createDebug","scanProvider","provider","seenTokens","has","add","token","providerType","dependencies","getClassDependencyTokens","typed","provide","getProviderDependencyTokens","buildScannedModule","rootModule","graph","buildModuleGraph","controllerClasses","functionHandlers","guardClasses","functionGuards","providers","Set","moduleClass","node","name","length","controllers","guards","scanned","push","controller","guard","validateScannedDependencies","registeredTokens","map","p","diagnostics","visited","walk","deps","dep","find","isRuntimeProvidedToken","consumer","serializeToken","dependency","description","String","import_reflect_metadata","import_core","import_common","deriveClassResourceName","className","methodName","camelClass","charAt","toLowerCase","slice","deriveClassHandlerName","deriveClassHandlerFunction","sourceFile","base","basename","replace","deriveFunctionResourceName","exportName","deriveFunctionHandlerFunction","deriveCodeLocation","projectRoot","rel","relative","dir","dirname","serializeManifest","scanned","sourceFile","options","handlers","functionHandlers","guardHandlers","controllerClass","controllerClasses","entries","serializeClassHandlers","push","fnHandler","entry","serializeFunctionHandler","guardClass","guardClasses","serializeClassGuard","fnGuard","functionGuards","serializeFunctionGuard","version","dependencyGraph","serializeDependencyGraph","extractControllerMeta","httpMeta","Reflect","getOwnMetadata","CONTROLLER_METADATA","controllerType","prefix","extractSharedClassMeta","isWebSocket","WEBSOCKET_CONTROLLER_METADATA","consumerMeta","CONSUMER_METADATA","source","protectedBy","GUARD_PROTECTEDBY_METADATA","customGuardName","GUARD_CUSTOM_METADATA","customMetadata","CUSTOM_METADATA","resourceRefs","USE_RESOURCE_METADATA","appendSharedAnnotations","annotations","meta","prototype","methodName","methodProtectedBy","allProtectedBy","length","isPublic","PUBLIC_METADATA","methodCustomMetadata","key","value","Object","undefined","serializeAnnotationValue","methodResourceRefs","allResourceRefs","Set","buildHttpAnnotations","httpMethod","fullPath","buildWebSocketAnnotations","wsEvent","route","eventType","buildConsumerAnnotations","consumerHandler","buildScheduleAnnotations","scheduleMeta","schedule","buildCustomAnnotations","invokeMeta","name","className","methods","getOwnPropertyNames","filter","n","typeEntry","serializeControllerTypeMethod","SCHEDULE_HANDLER_METADATA","resourceName","deriveClassResourceName","handlerType","spec","handlerName","deriveClassHandlerName","codeLocation","deriveCodeLocation","projectRoot","handler","deriveClassHandlerFunction","INVOKE_METADATA","serializeHttpMethod","serializeWebSocketMethod","serializeConsumerMethod","HTTP_METHOD_METADATA","routePath","ROUTE_PATH_METADATA","joinHandlerPath","WEBSOCKET_EVENT_METADATA","CONSUMER_HANDLER_METADATA","definition","supported","includes","type","exportName","metadata","buildFunctionTypeAnnotations","deriveFunctionResourceName","keys","deriveFunctionHandlerFunction","path","method","extractGuardMeta","guardName","guardType","Array","isArray","every","v","JSON","stringify","serializeToken","token","description","tokenType","nodes","providers","map","provider","providerType","dependencies"]}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
4
4
|
// src/extract/metadata-app.ts
|
|
5
5
|
import "reflect-metadata";
|
|
6
6
|
import createDebug from "debug";
|
|
7
|
-
import {
|
|
7
|
+
import { isRuntimeProvidedToken } from "@celerity-sdk/common";
|
|
8
8
|
import { buildModuleGraph, getClassDependencyTokens, getProviderDependencyTokens } from "@celerity-sdk/core";
|
|
9
9
|
var debug = createDebug("celerity:cli");
|
|
10
10
|
function scanProvider(provider, seenTokens) {
|
|
@@ -93,7 +93,7 @@ function validateScannedDependencies(scanned) {
|
|
|
93
93
|
}
|
|
94
94
|
} else if (typeof dep === "function") {
|
|
95
95
|
walk(dep, getClassDependencyTokens(dep));
|
|
96
|
-
} else if (!
|
|
96
|
+
} else if (!isRuntimeProvidedToken(dep)) {
|
|
97
97
|
diagnostics.push({
|
|
98
98
|
consumer: serializeToken(token),
|
|
99
99
|
dependency: serializeToken(dep)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/extract/metadata-app.ts","../src/extract/serializer.ts","../src/extract/path-utils.ts","../src/extract/identity.ts"],"sourcesContent":["import \"reflect-metadata\";\nimport createDebug from \"debug\";\nimport type {\n Type,\n InjectionToken,\n Provider,\n FunctionHandlerDefinition,\n GuardDefinition,\n} from \"@celerity-sdk/types\";\nimport { isResourceLayerToken } from \"@celerity-sdk/common\";\nimport {\n buildModuleGraph,\n getClassDependencyTokens,\n getProviderDependencyTokens,\n} from \"@celerity-sdk/core\";\nimport type { ModuleGraph } from \"@celerity-sdk/core\";\n\nconst debug = createDebug(\"celerity:cli\");\n\nexport type ScannedProvider = {\n token: InjectionToken;\n providerType: \"class\" | \"factory\" | \"value\";\n dependencies: InjectionToken[];\n};\n\nexport type ScannedModule = {\n controllerClasses: Type[];\n functionHandlers: FunctionHandlerDefinition[];\n guardClasses: Type[];\n functionGuards: GuardDefinition[];\n providers: ScannedProvider[];\n};\n\nfunction scanProvider(\n provider: Type | (Provider & { provide: InjectionToken }),\n seenTokens: Set<InjectionToken>,\n): ScannedProvider | null {\n if (typeof provider === \"function\") {\n if (seenTokens.has(provider)) return null;\n seenTokens.add(provider);\n return {\n token: provider,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(provider),\n };\n }\n\n const typed = provider as Provider & { provide: InjectionToken };\n if (seenTokens.has(typed.provide)) return null;\n seenTokens.add(typed.provide);\n\n return {\n token: typed.provide,\n providerType: \"useFactory\" in typed ? \"factory\" : \"useClass\" in typed ? \"class\" : \"value\",\n dependencies: getProviderDependencyTokens(typed),\n };\n}\n\n/**\n * Builds a scanned module from the root module class using the shared\n * `buildModuleGraph` from core. Collects all handler classes, function\n * handler definitions, and provider dependency information without\n * instantiating anything.\n *\n * Inherits circular import detection from the shared graph builder.\n */\nexport function buildScannedModule(rootModule: Type): ScannedModule {\n const graph: ModuleGraph = buildModuleGraph(rootModule);\n const controllerClasses: Type[] = [];\n const functionHandlers: FunctionHandlerDefinition[] = [];\n const guardClasses: Type[] = [];\n const functionGuards: GuardDefinition[] = [];\n const providers: ScannedProvider[] = [];\n const seenTokens = new Set<InjectionToken>();\n\n for (const [moduleClass, node] of graph) {\n debug(\n \"scan: module %s — %d providers, %d controllers, %d guards\",\n moduleClass.name,\n node.providers.length,\n node.controllers.length,\n node.guards.length,\n );\n for (const provider of node.providers) {\n const scanned = scanProvider(provider, seenTokens);\n if (scanned) providers.push(scanned);\n }\n\n for (const controller of node.controllers) {\n controllerClasses.push(controller);\n if (!seenTokens.has(controller)) {\n seenTokens.add(controller);\n providers.push({\n token: controller,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(controller),\n });\n }\n }\n\n for (const guard of node.guards) {\n if (typeof guard === \"function\") {\n guardClasses.push(guard);\n if (!seenTokens.has(guard)) {\n seenTokens.add(guard);\n providers.push({\n token: guard,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(guard),\n });\n }\n } else {\n functionGuards.push(guard);\n }\n }\n\n functionHandlers.push(...node.functionHandlers);\n }\n\n return { controllerClasses, functionHandlers, guardClasses, functionGuards, providers };\n}\n\nexport type DependencyDiagnostic = {\n consumer: string;\n dependency: string;\n};\n\n/**\n * Validates that all scanned providers have resolvable dependencies.\n * Returns an array of diagnostics for each unresolvable dependency.\n * A token is resolvable if it's registered or is a class (implicitly constructable).\n */\nexport function validateScannedDependencies(scanned: ScannedModule): DependencyDiagnostic[] {\n const registeredTokens = new Set<InjectionToken>(scanned.providers.map((p) => p.token));\n const diagnostics: DependencyDiagnostic[] = [];\n const visited = new Set<InjectionToken>();\n\n function walk(token: InjectionToken, deps: InjectionToken[]): void {\n if (visited.has(token)) return;\n visited.add(token);\n\n for (const dep of deps) {\n if (registeredTokens.has(dep)) {\n const provider = scanned.providers.find((p) => p.token === dep);\n if (provider) {\n walk(dep, provider.dependencies);\n }\n } else if (typeof dep === \"function\") {\n walk(dep, getClassDependencyTokens(dep as Type));\n } else if (!isResourceLayerToken(dep)) {\n diagnostics.push({\n consumer: serializeToken(token),\n dependency: serializeToken(dep),\n });\n }\n }\n }\n\n for (const provider of scanned.providers) {\n walk(provider.token, provider.dependencies);\n }\n\n return diagnostics;\n}\n\nfunction serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return String(token);\n}\n","import \"reflect-metadata\";\nimport type {\n Type,\n HttpMethod,\n InjectionToken,\n GuardDefinition,\n FunctionHandlerDefinition,\n} from \"@celerity-sdk/types\";\nimport {\n CONTROLLER_METADATA,\n HTTP_METHOD_METADATA,\n ROUTE_PATH_METADATA,\n WEBSOCKET_CONTROLLER_METADATA,\n WEBSOCKET_EVENT_METADATA,\n CONSUMER_METADATA,\n CONSUMER_HANDLER_METADATA,\n SCHEDULE_HANDLER_METADATA,\n INVOKE_METADATA,\n GUARD_PROTECTEDBY_METADATA,\n GUARD_CUSTOM_METADATA,\n PUBLIC_METADATA,\n CUSTOM_METADATA,\n USE_RESOURCE_METADATA,\n} from \"@celerity-sdk/core\";\nimport type {\n ControllerMetadata,\n WebSocketEventMetadata,\n ConsumerHandlerMetadata,\n ScheduleHandlerMetadata,\n InvokeMetadata,\n ConsumerMetadata,\n} from \"@celerity-sdk/core\";\nimport type { ScannedModule } from \"./metadata-app\";\nimport type {\n HandlerManifest,\n ClassHandlerEntry,\n FunctionHandlerEntry,\n GuardHandlerEntry,\n DependencyGraph,\n DependencyNode,\n} from \"./types\";\nimport { joinHandlerPath } from \"./path-utils\";\nimport {\n deriveClassResourceName,\n deriveClassHandlerName,\n deriveClassHandlerFunction,\n deriveCodeLocation,\n deriveFunctionResourceName,\n deriveFunctionHandlerFunction,\n} from \"./identity\";\n\nexport type SerializeOptions = {\n projectRoot: string;\n};\n\nexport function serializeManifest(\n scanned: ScannedModule,\n sourceFile: string,\n options: SerializeOptions,\n): HandlerManifest {\n const handlers: ClassHandlerEntry[] = [];\n const functionHandlers: FunctionHandlerEntry[] = [];\n const guardHandlers: GuardHandlerEntry[] = [];\n\n for (const controllerClass of scanned.controllerClasses) {\n const entries = serializeClassHandlers(controllerClass, sourceFile, options);\n handlers.push(...entries);\n }\n\n for (const fnHandler of scanned.functionHandlers) {\n const entry = serializeFunctionHandler(fnHandler, sourceFile, options);\n if (entry) {\n functionHandlers.push(entry);\n }\n }\n\n for (const guardClass of scanned.guardClasses) {\n const entry = serializeClassGuard(guardClass, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n for (const fnGuard of scanned.functionGuards) {\n const entry = serializeFunctionGuard(fnGuard, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n return {\n version: \"1.0.0\",\n handlers,\n functionHandlers,\n guardHandlers,\n dependencyGraph: serializeDependencyGraph(scanned),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Controller meta extraction\n// ---------------------------------------------------------------------------\n\ntype ControllerType = \"http\" | \"websocket\" | \"consumer\";\n\ntype ControllerMeta = {\n controllerType: ControllerType;\n prefix: string;\n source?: string;\n protectedBy: string[];\n customGuardName: string | undefined;\n customMetadata: Record<string, unknown>;\n resourceRefs: string[];\n};\n\nfunction extractControllerMeta(controllerClass: Type): ControllerMeta | null {\n const httpMeta: ControllerMetadata | undefined = Reflect.getOwnMetadata(\n CONTROLLER_METADATA,\n controllerClass,\n );\n if (httpMeta) {\n return {\n controllerType: \"http\",\n prefix: httpMeta.prefix ?? \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const isWebSocket: boolean | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_CONTROLLER_METADATA,\n controllerClass,\n );\n if (isWebSocket) {\n return {\n controllerType: \"websocket\",\n prefix: \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const consumerMeta: ConsumerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_METADATA,\n controllerClass,\n );\n if (consumerMeta) {\n return {\n controllerType: \"consumer\",\n prefix: \"\",\n source: consumerMeta.source,\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n return null;\n}\n\nfunction extractSharedClassMeta(controllerClass: Type) {\n return {\n protectedBy:\n (Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, controllerClass) as string[]) ?? [],\n customGuardName: Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, controllerClass) as\n | string\n | undefined,\n customMetadata:\n (Reflect.getOwnMetadata(CUSTOM_METADATA, controllerClass) as Record<string, unknown>) ?? {},\n resourceRefs:\n (Reflect.getOwnMetadata(USE_RESOURCE_METADATA, controllerClass) as string[]) ?? [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared annotation helpers\n// ---------------------------------------------------------------------------\n\nfunction appendSharedAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n): void {\n const methodProtectedBy: string[] =\n Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, prototype, methodName) ?? [];\n const allProtectedBy = [...meta.protectedBy, ...methodProtectedBy];\n if (allProtectedBy.length > 0) {\n annotations[\"celerity.handler.guard.protectedBy\"] = allProtectedBy;\n }\n if (meta.customGuardName) {\n annotations[\"celerity.handler.guard.custom\"] = meta.customGuardName;\n }\n\n const isPublic: boolean = Reflect.getOwnMetadata(PUBLIC_METADATA, prototype, methodName) === true;\n if (isPublic) {\n annotations[\"celerity.handler.public\"] = true;\n }\n\n const methodCustomMetadata: Record<string, unknown> =\n Reflect.getOwnMetadata(CUSTOM_METADATA, prototype, methodName) ?? {};\n const customMetadata = { ...meta.customMetadata, ...methodCustomMetadata };\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const methodResourceRefs: string[] =\n Reflect.getOwnMetadata(USE_RESOURCE_METADATA, prototype, methodName) ?? [];\n const allResourceRefs = [...new Set([...meta.resourceRefs, ...methodResourceRefs])];\n if (allResourceRefs.length > 0) {\n annotations[\"celerity.handler.resource.ref\"] = allResourceRefs;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type-specific annotation builders (class handlers)\n// ---------------------------------------------------------------------------\n\nfunction buildHttpAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n httpMethod: HttpMethod,\n fullPath: string,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = httpMethod;\n annotations[\"celerity.handler.http.path\"] = fullPath;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildWebSocketAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n wsEvent: WebSocketEventMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.websocket\"] = true;\n annotations[\"celerity.handler.websocket.route\"] = wsEvent.route;\n annotations[\"celerity.handler.websocket.eventType\"] = wsEvent.eventType;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildConsumerAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n consumerHandler: ConsumerHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.consumer\"] = true;\n if (meta.source) {\n annotations[\"celerity.handler.consumer.source\"] = meta.source;\n }\n if (consumerHandler.route) {\n annotations[\"celerity.handler.consumer.route\"] = consumerHandler.route;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildScheduleAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n scheduleMeta: ScheduleHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.schedule\"] = true;\n if (scheduleMeta.source) {\n annotations[\"celerity.handler.schedule.source\"] = scheduleMeta.source;\n }\n if (scheduleMeta.schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = scheduleMeta.schedule;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildCustomAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n invokeMeta: InvokeMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.custom\"] = true;\n annotations[\"celerity.handler.custom.name\"] = invokeMeta.name;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\n// ---------------------------------------------------------------------------\n// Class handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeClassHandlers(\n controllerClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry[] {\n const meta = extractControllerMeta(controllerClass);\n if (!meta) return [];\n\n const className = controllerClass.name;\n const prototype = controllerClass.prototype as object;\n const methods = Object.getOwnPropertyNames(prototype).filter((n) => n !== \"constructor\");\n const entries: ClassHandlerEntry[] = [];\n\n for (const methodName of methods) {\n // Type-specific handler decorator for the controller type.\n const typeEntry = serializeControllerTypeMethod(\n meta,\n className,\n prototype,\n methodName,\n sourceFile,\n options,\n );\n if (typeEntry) entries.push(typeEntry);\n\n // Cross-cutting: @ScheduleHandler on any controller type.\n const scheduleMeta: ScheduleHandlerMetadata | undefined = Reflect.getOwnMetadata(\n SCHEDULE_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (scheduleMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"schedule\",\n annotations: buildScheduleAnnotations(meta, prototype, methodName, scheduleMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n\n // Cross-cutting: @Invoke on any controller type.\n const invokeMeta: InvokeMetadata | undefined = Reflect.getOwnMetadata(\n INVOKE_METADATA,\n prototype,\n methodName,\n );\n if (invokeMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"custom\",\n annotations: buildCustomAnnotations(meta, prototype, methodName, invokeMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n }\n\n return entries;\n}\n\nfunction serializeControllerTypeMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n switch (meta.controllerType) {\n case \"http\":\n return serializeHttpMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"websocket\":\n return serializeWebSocketMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"consumer\":\n return serializeConsumerMethod(meta, className, prototype, methodName, sourceFile, options);\n default:\n return null;\n }\n}\n\nfunction serializeHttpMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const httpMethod: HttpMethod | undefined = Reflect.getOwnMetadata(\n HTTP_METHOD_METADATA,\n prototype,\n methodName,\n );\n if (!httpMethod) return null;\n\n const routePath: string =\n Reflect.getOwnMetadata(ROUTE_PATH_METADATA, prototype, methodName) ?? \"/\";\n const fullPath = joinHandlerPath(meta.prefix, routePath);\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"http\",\n annotations: buildHttpAnnotations(meta, prototype, methodName, httpMethod, fullPath),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeWebSocketMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const wsEvent: WebSocketEventMetadata | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_EVENT_METADATA,\n prototype,\n methodName,\n );\n if (!wsEvent) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"websocket\",\n annotations: buildWebSocketAnnotations(meta, prototype, methodName, wsEvent),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeConsumerMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const consumerHandler: ConsumerHandlerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (!consumerHandler) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"consumer\",\n annotations: buildConsumerAnnotations(meta, prototype, methodName, consumerHandler),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Function handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeFunctionHandler(\n definition: FunctionHandlerDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): FunctionHandlerEntry | null {\n // \"workflow\" is not part of v0 — skip unsupported handler types.\n const supported = [\"http\", \"websocket\", \"consumer\", \"schedule\", \"custom\"] as const;\n type SupportedType = (typeof supported)[number];\n if (!supported.includes(definition.type as SupportedType)) return null;\n\n const exportName = (definition.metadata.handlerName as string) ?? \"handler\";\n const customMetadata = (definition.metadata.customMetadata as Record<string, unknown>) ?? {};\n const handlerType = definition.type as SupportedType;\n\n const annotations: Record<string, string | string[] | boolean> = {};\n\n buildFunctionTypeAnnotations(annotations, definition);\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n exportName,\n sourceFile,\n handlerType,\n ...(Object.keys(annotations).length > 0 ? { annotations } : {}),\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\nfunction buildFunctionTypeAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n definition: FunctionHandlerDefinition,\n): void {\n const meta = definition.metadata;\n\n switch (definition.type) {\n case \"http\": {\n const path = meta.path as string | undefined;\n const method = meta.method as string | undefined;\n if (path !== undefined && method !== undefined) {\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = method;\n annotations[\"celerity.handler.http.path\"] = path;\n }\n break;\n }\n case \"websocket\": {\n annotations[\"celerity.handler.websocket\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.websocket.route\"] = route;\n }\n break;\n }\n case \"consumer\": {\n annotations[\"celerity.handler.consumer\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.consumer.route\"] = route;\n }\n break;\n }\n case \"schedule\": {\n annotations[\"celerity.handler.schedule\"] = true;\n const source = meta.source as string | undefined;\n if (source) {\n annotations[\"celerity.handler.schedule.source\"] = source;\n }\n const schedule = meta.schedule as string | undefined;\n if (schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = schedule;\n }\n break;\n }\n case \"custom\": {\n annotations[\"celerity.handler.custom\"] = true;\n const name = meta.name as string | undefined;\n if (name) {\n annotations[\"celerity.handler.custom.name\"] = name;\n }\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Guard serialization (unchanged)\n// ---------------------------------------------------------------------------\n\ntype GuardMeta = {\n guardName: string;\n customMetadata: Record<string, unknown>;\n};\n\nfunction extractGuardMeta(guardClass: Type): GuardMeta | null {\n const guardName: string | undefined = Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, guardClass);\n if (!guardName) return null;\n\n return {\n guardName,\n customMetadata: Reflect.getOwnMetadata(CUSTOM_METADATA, guardClass) ?? {},\n };\n}\n\nfunction serializeClassGuard(\n guardClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const meta = extractGuardMeta(guardClass);\n if (!meta) return null;\n\n const className = guardClass.name;\n const methodName = \"check\";\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": meta.guardName,\n };\n\n for (const [key, value] of Object.entries(meta.customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n guardName: meta.guardName,\n sourceFile,\n guardType: \"class\",\n className,\n annotations,\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeFunctionGuard(\n definition: GuardDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const guardName = definition.name;\n if (!guardName) return null;\n\n const meta = (definition.metadata ?? {}) as {\n customMetadata?: Record<string, unknown>;\n };\n const customMetadata = meta.customMetadata ?? {};\n\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": guardName,\n };\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const exportName = guardName;\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n guardName,\n sourceFile,\n guardType: \"function\",\n exportName,\n annotations,\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction serializeAnnotationValue(value: unknown): string | string[] | boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value;\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n return JSON.stringify(value);\n}\n\nexport function serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return token;\n}\n\nexport function tokenType(token: InjectionToken): \"class\" | \"string\" | \"symbol\" {\n if (typeof token === \"function\") return \"class\";\n if (typeof token === \"symbol\") return \"symbol\";\n return \"string\";\n}\n\nfunction serializeDependencyGraph(scanned: ScannedModule): DependencyGraph {\n const nodes: DependencyNode[] = scanned.providers.map((provider) => ({\n token: serializeToken(provider.token),\n tokenType: tokenType(provider.token),\n providerType: provider.providerType,\n dependencies: provider.dependencies.map(serializeToken),\n }));\n\n return { nodes };\n}\n","export { joinHandlerPath } from \"@celerity-sdk/common\";\n","import { basename, dirname, relative } from \"node:path\";\n\n/**\n * Derives a resource name for a class-based handler method.\n * Format: camelCase(className) + \"_\" + methodName\n *\n * @example deriveClassResourceName(\"OrdersHandler\", \"getOrder\") => \"ordersHandler_getOrder\"\n */\nexport function deriveClassResourceName(className: string, methodName: string): string {\n const camelClass = className.charAt(0).toLowerCase() + className.slice(1);\n return `${camelClass}_${methodName}`;\n}\n\n/**\n * Derives a handler name for a class-based handler method.\n * Format: className + \"-\" + methodName\n *\n * @example deriveClassHandlerName(\"OrdersHandler\", \"getOrder\") => \"OrdersHandler-getOrder\"\n */\nexport function deriveClassHandlerName(className: string, methodName: string): string {\n return `${className}-${methodName}`;\n}\n\n/**\n * Derives the handler function reference for a class-based handler.\n * Format: moduleBaseName + \".\" + className + \".\" + methodName\n *\n * @example deriveClassHandlerFunction(\"src/handlers/orders.ts\", \"OrdersHandler\", \"getOrder\")\n * => \"orders.OrdersHandler.getOrder\"\n */\nexport function deriveClassHandlerFunction(\n sourceFile: string,\n className: string,\n methodName: string,\n): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${className}.${methodName}`;\n}\n\n/**\n * Derives a resource name for a function-based handler.\n * Uses the export name directly.\n *\n * @example deriveFunctionResourceName(\"getOrder\") => \"getOrder\"\n */\nexport function deriveFunctionResourceName(exportName: string): string {\n return exportName;\n}\n\n/**\n * Derives the handler function reference for a function-based handler.\n * Format: moduleBaseName + \".\" + exportName\n *\n * @example deriveFunctionHandlerFunction(\"src/handlers/orders.ts\", \"getOrder\")\n * => \"orders.getOrder\"\n */\nexport function deriveFunctionHandlerFunction(sourceFile: string, exportName: string): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${exportName}`;\n}\n\n/**\n * Derives the code location from a source file path relative to the project root.\n * Returns the directory prefixed with \"./\"\n *\n * @example deriveCodeLocation(\"src/handlers/orders.ts\", \"/project\") => \"./src/handlers\"\n */\nexport function deriveCodeLocation(sourceFile: string, projectRoot: string): string {\n const rel = relative(projectRoot, sourceFile);\n const dir = dirname(rel);\n return dir === \".\" ? \"./\" : `./${dir}`;\n}\n"],"mappings":"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","names":["createDebug","isResourceLayerToken","buildModuleGraph","getClassDependencyTokens","getProviderDependencyTokens","debug","createDebug","scanProvider","provider","seenTokens","has","add","token","providerType","dependencies","getClassDependencyTokens","typed","provide","getProviderDependencyTokens","buildScannedModule","rootModule","graph","buildModuleGraph","controllerClasses","functionHandlers","guardClasses","functionGuards","providers","Set","moduleClass","node","name","length","controllers","guards","scanned","push","controller","guard","validateScannedDependencies","registeredTokens","map","p","diagnostics","visited","walk","deps","dep","find","isResourceLayerToken","consumer","serializeToken","dependency","description","String","CONTROLLER_METADATA","HTTP_METHOD_METADATA","ROUTE_PATH_METADATA","WEBSOCKET_CONTROLLER_METADATA","WEBSOCKET_EVENT_METADATA","CONSUMER_METADATA","CONSUMER_HANDLER_METADATA","SCHEDULE_HANDLER_METADATA","INVOKE_METADATA","GUARD_PROTECTEDBY_METADATA","GUARD_CUSTOM_METADATA","PUBLIC_METADATA","CUSTOM_METADATA","USE_RESOURCE_METADATA","joinHandlerPath","basename","dirname","relative","deriveClassResourceName","className","methodName","camelClass","charAt","toLowerCase","slice","deriveClassHandlerName","deriveClassHandlerFunction","sourceFile","base","basename","replace","deriveFunctionResourceName","exportName","deriveFunctionHandlerFunction","deriveCodeLocation","projectRoot","rel","relative","dir","dirname","serializeManifest","scanned","sourceFile","options","handlers","functionHandlers","guardHandlers","controllerClass","controllerClasses","entries","serializeClassHandlers","push","fnHandler","entry","serializeFunctionHandler","guardClass","guardClasses","serializeClassGuard","fnGuard","functionGuards","serializeFunctionGuard","version","dependencyGraph","serializeDependencyGraph","extractControllerMeta","httpMeta","Reflect","getOwnMetadata","CONTROLLER_METADATA","controllerType","prefix","extractSharedClassMeta","isWebSocket","WEBSOCKET_CONTROLLER_METADATA","consumerMeta","CONSUMER_METADATA","source","protectedBy","GUARD_PROTECTEDBY_METADATA","customGuardName","GUARD_CUSTOM_METADATA","customMetadata","CUSTOM_METADATA","resourceRefs","USE_RESOURCE_METADATA","appendSharedAnnotations","annotations","meta","prototype","methodName","methodProtectedBy","allProtectedBy","length","isPublic","PUBLIC_METADATA","methodCustomMetadata","key","value","Object","undefined","serializeAnnotationValue","methodResourceRefs","allResourceRefs","Set","buildHttpAnnotations","httpMethod","fullPath","buildWebSocketAnnotations","wsEvent","route","eventType","buildConsumerAnnotations","consumerHandler","buildScheduleAnnotations","scheduleMeta","schedule","buildCustomAnnotations","invokeMeta","name","className","methods","getOwnPropertyNames","filter","n","typeEntry","serializeControllerTypeMethod","SCHEDULE_HANDLER_METADATA","resourceName","deriveClassResourceName","handlerType","spec","handlerName","deriveClassHandlerName","codeLocation","deriveCodeLocation","projectRoot","handler","deriveClassHandlerFunction","INVOKE_METADATA","serializeHttpMethod","serializeWebSocketMethod","serializeConsumerMethod","HTTP_METHOD_METADATA","routePath","ROUTE_PATH_METADATA","joinHandlerPath","WEBSOCKET_EVENT_METADATA","CONSUMER_HANDLER_METADATA","definition","supported","includes","type","exportName","metadata","buildFunctionTypeAnnotations","deriveFunctionResourceName","keys","deriveFunctionHandlerFunction","path","method","extractGuardMeta","guardName","guardType","Array","isArray","every","v","JSON","stringify","serializeToken","token","description","tokenType","nodes","providers","map","provider","providerType","dependencies"]}
|
|
1
|
+
{"version":3,"sources":["../src/extract/metadata-app.ts","../src/extract/serializer.ts","../src/extract/path-utils.ts","../src/extract/identity.ts"],"sourcesContent":["import \"reflect-metadata\";\nimport createDebug from \"debug\";\nimport type {\n Type,\n InjectionToken,\n Provider,\n FunctionHandlerDefinition,\n GuardDefinition,\n} from \"@celerity-sdk/types\";\nimport { isRuntimeProvidedToken } from \"@celerity-sdk/common\";\nimport {\n buildModuleGraph,\n getClassDependencyTokens,\n getProviderDependencyTokens,\n} from \"@celerity-sdk/core\";\nimport type { ModuleGraph } from \"@celerity-sdk/core\";\n\nconst debug = createDebug(\"celerity:cli\");\n\nexport type ScannedProvider = {\n token: InjectionToken;\n providerType: \"class\" | \"factory\" | \"value\";\n dependencies: InjectionToken[];\n};\n\nexport type ScannedModule = {\n controllerClasses: Type[];\n functionHandlers: FunctionHandlerDefinition[];\n guardClasses: Type[];\n functionGuards: GuardDefinition[];\n providers: ScannedProvider[];\n};\n\nfunction scanProvider(\n provider: Type | (Provider & { provide: InjectionToken }),\n seenTokens: Set<InjectionToken>,\n): ScannedProvider | null {\n if (typeof provider === \"function\") {\n if (seenTokens.has(provider)) return null;\n seenTokens.add(provider);\n return {\n token: provider,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(provider),\n };\n }\n\n const typed = provider as Provider & { provide: InjectionToken };\n if (seenTokens.has(typed.provide)) return null;\n seenTokens.add(typed.provide);\n\n return {\n token: typed.provide,\n providerType: \"useFactory\" in typed ? \"factory\" : \"useClass\" in typed ? \"class\" : \"value\",\n dependencies: getProviderDependencyTokens(typed),\n };\n}\n\n/**\n * Builds a scanned module from the root module class using the shared\n * `buildModuleGraph` from core. Collects all handler classes, function\n * handler definitions, and provider dependency information without\n * instantiating anything.\n *\n * Inherits circular import detection from the shared graph builder.\n */\nexport function buildScannedModule(rootModule: Type): ScannedModule {\n const graph: ModuleGraph = buildModuleGraph(rootModule);\n const controllerClasses: Type[] = [];\n const functionHandlers: FunctionHandlerDefinition[] = [];\n const guardClasses: Type[] = [];\n const functionGuards: GuardDefinition[] = [];\n const providers: ScannedProvider[] = [];\n const seenTokens = new Set<InjectionToken>();\n\n for (const [moduleClass, node] of graph) {\n debug(\n \"scan: module %s — %d providers, %d controllers, %d guards\",\n moduleClass.name,\n node.providers.length,\n node.controllers.length,\n node.guards.length,\n );\n for (const provider of node.providers) {\n const scanned = scanProvider(provider, seenTokens);\n if (scanned) providers.push(scanned);\n }\n\n for (const controller of node.controllers) {\n controllerClasses.push(controller);\n if (!seenTokens.has(controller)) {\n seenTokens.add(controller);\n providers.push({\n token: controller,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(controller),\n });\n }\n }\n\n for (const guard of node.guards) {\n if (typeof guard === \"function\") {\n guardClasses.push(guard);\n if (!seenTokens.has(guard)) {\n seenTokens.add(guard);\n providers.push({\n token: guard,\n providerType: \"class\",\n dependencies: getClassDependencyTokens(guard),\n });\n }\n } else {\n functionGuards.push(guard);\n }\n }\n\n functionHandlers.push(...node.functionHandlers);\n }\n\n return { controllerClasses, functionHandlers, guardClasses, functionGuards, providers };\n}\n\nexport type DependencyDiagnostic = {\n consumer: string;\n dependency: string;\n};\n\n/**\n * Validates that all scanned providers have resolvable dependencies.\n * Returns an array of diagnostics for each unresolvable dependency.\n * A token is resolvable if it's registered or is a class (implicitly constructable).\n */\nexport function validateScannedDependencies(scanned: ScannedModule): DependencyDiagnostic[] {\n const registeredTokens = new Set<InjectionToken>(scanned.providers.map((p) => p.token));\n const diagnostics: DependencyDiagnostic[] = [];\n const visited = new Set<InjectionToken>();\n\n function walk(token: InjectionToken, deps: InjectionToken[]): void {\n if (visited.has(token)) return;\n visited.add(token);\n\n for (const dep of deps) {\n if (registeredTokens.has(dep)) {\n const provider = scanned.providers.find((p) => p.token === dep);\n if (provider) {\n walk(dep, provider.dependencies);\n }\n } else if (typeof dep === \"function\") {\n walk(dep, getClassDependencyTokens(dep as Type));\n } else if (!isRuntimeProvidedToken(dep)) {\n diagnostics.push({\n consumer: serializeToken(token),\n dependency: serializeToken(dep),\n });\n }\n }\n }\n\n for (const provider of scanned.providers) {\n walk(provider.token, provider.dependencies);\n }\n\n return diagnostics;\n}\n\nfunction serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return String(token);\n}\n","import \"reflect-metadata\";\nimport type {\n Type,\n HttpMethod,\n InjectionToken,\n GuardDefinition,\n FunctionHandlerDefinition,\n} from \"@celerity-sdk/types\";\nimport {\n CONTROLLER_METADATA,\n HTTP_METHOD_METADATA,\n ROUTE_PATH_METADATA,\n WEBSOCKET_CONTROLLER_METADATA,\n WEBSOCKET_EVENT_METADATA,\n CONSUMER_METADATA,\n CONSUMER_HANDLER_METADATA,\n SCHEDULE_HANDLER_METADATA,\n INVOKE_METADATA,\n GUARD_PROTECTEDBY_METADATA,\n GUARD_CUSTOM_METADATA,\n PUBLIC_METADATA,\n CUSTOM_METADATA,\n USE_RESOURCE_METADATA,\n} from \"@celerity-sdk/core\";\nimport type {\n ControllerMetadata,\n WebSocketEventMetadata,\n ConsumerHandlerMetadata,\n ScheduleHandlerMetadata,\n InvokeMetadata,\n ConsumerMetadata,\n} from \"@celerity-sdk/core\";\nimport type { ScannedModule } from \"./metadata-app\";\nimport type {\n HandlerManifest,\n ClassHandlerEntry,\n FunctionHandlerEntry,\n GuardHandlerEntry,\n DependencyGraph,\n DependencyNode,\n} from \"./types\";\nimport { joinHandlerPath } from \"./path-utils\";\nimport {\n deriveClassResourceName,\n deriveClassHandlerName,\n deriveClassHandlerFunction,\n deriveCodeLocation,\n deriveFunctionResourceName,\n deriveFunctionHandlerFunction,\n} from \"./identity\";\n\nexport type SerializeOptions = {\n projectRoot: string;\n};\n\nexport function serializeManifest(\n scanned: ScannedModule,\n sourceFile: string,\n options: SerializeOptions,\n): HandlerManifest {\n const handlers: ClassHandlerEntry[] = [];\n const functionHandlers: FunctionHandlerEntry[] = [];\n const guardHandlers: GuardHandlerEntry[] = [];\n\n for (const controllerClass of scanned.controllerClasses) {\n const entries = serializeClassHandlers(controllerClass, sourceFile, options);\n handlers.push(...entries);\n }\n\n for (const fnHandler of scanned.functionHandlers) {\n const entry = serializeFunctionHandler(fnHandler, sourceFile, options);\n if (entry) {\n functionHandlers.push(entry);\n }\n }\n\n for (const guardClass of scanned.guardClasses) {\n const entry = serializeClassGuard(guardClass, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n for (const fnGuard of scanned.functionGuards) {\n const entry = serializeFunctionGuard(fnGuard, sourceFile, options);\n if (entry) {\n guardHandlers.push(entry);\n }\n }\n\n return {\n version: \"1.0.0\",\n handlers,\n functionHandlers,\n guardHandlers,\n dependencyGraph: serializeDependencyGraph(scanned),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Controller meta extraction\n// ---------------------------------------------------------------------------\n\ntype ControllerType = \"http\" | \"websocket\" | \"consumer\";\n\ntype ControllerMeta = {\n controllerType: ControllerType;\n prefix: string;\n source?: string;\n protectedBy: string[];\n customGuardName: string | undefined;\n customMetadata: Record<string, unknown>;\n resourceRefs: string[];\n};\n\nfunction extractControllerMeta(controllerClass: Type): ControllerMeta | null {\n const httpMeta: ControllerMetadata | undefined = Reflect.getOwnMetadata(\n CONTROLLER_METADATA,\n controllerClass,\n );\n if (httpMeta) {\n return {\n controllerType: \"http\",\n prefix: httpMeta.prefix ?? \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const isWebSocket: boolean | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_CONTROLLER_METADATA,\n controllerClass,\n );\n if (isWebSocket) {\n return {\n controllerType: \"websocket\",\n prefix: \"\",\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n const consumerMeta: ConsumerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_METADATA,\n controllerClass,\n );\n if (consumerMeta) {\n return {\n controllerType: \"consumer\",\n prefix: \"\",\n source: consumerMeta.source,\n ...extractSharedClassMeta(controllerClass),\n };\n }\n\n return null;\n}\n\nfunction extractSharedClassMeta(controllerClass: Type) {\n return {\n protectedBy:\n (Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, controllerClass) as string[]) ?? [],\n customGuardName: Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, controllerClass) as\n | string\n | undefined,\n customMetadata:\n (Reflect.getOwnMetadata(CUSTOM_METADATA, controllerClass) as Record<string, unknown>) ?? {},\n resourceRefs:\n (Reflect.getOwnMetadata(USE_RESOURCE_METADATA, controllerClass) as string[]) ?? [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared annotation helpers\n// ---------------------------------------------------------------------------\n\nfunction appendSharedAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n): void {\n const methodProtectedBy: string[] =\n Reflect.getOwnMetadata(GUARD_PROTECTEDBY_METADATA, prototype, methodName) ?? [];\n const allProtectedBy = [...meta.protectedBy, ...methodProtectedBy];\n if (allProtectedBy.length > 0) {\n annotations[\"celerity.handler.guard.protectedBy\"] = allProtectedBy;\n }\n if (meta.customGuardName) {\n annotations[\"celerity.handler.guard.custom\"] = meta.customGuardName;\n }\n\n const isPublic: boolean = Reflect.getOwnMetadata(PUBLIC_METADATA, prototype, methodName) === true;\n if (isPublic) {\n annotations[\"celerity.handler.public\"] = true;\n }\n\n const methodCustomMetadata: Record<string, unknown> =\n Reflect.getOwnMetadata(CUSTOM_METADATA, prototype, methodName) ?? {};\n const customMetadata = { ...meta.customMetadata, ...methodCustomMetadata };\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const methodResourceRefs: string[] =\n Reflect.getOwnMetadata(USE_RESOURCE_METADATA, prototype, methodName) ?? [];\n const allResourceRefs = [...new Set([...meta.resourceRefs, ...methodResourceRefs])];\n if (allResourceRefs.length > 0) {\n annotations[\"celerity.handler.resource.ref\"] = allResourceRefs;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type-specific annotation builders (class handlers)\n// ---------------------------------------------------------------------------\n\nfunction buildHttpAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n httpMethod: HttpMethod,\n fullPath: string,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = httpMethod;\n annotations[\"celerity.handler.http.path\"] = fullPath;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildWebSocketAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n wsEvent: WebSocketEventMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.websocket\"] = true;\n annotations[\"celerity.handler.websocket.route\"] = wsEvent.route;\n annotations[\"celerity.handler.websocket.eventType\"] = wsEvent.eventType;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildConsumerAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n consumerHandler: ConsumerHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.consumer\"] = true;\n if (meta.source) {\n annotations[\"celerity.handler.consumer.source\"] = meta.source;\n }\n if (consumerHandler.route) {\n annotations[\"celerity.handler.consumer.route\"] = consumerHandler.route;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildScheduleAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n scheduleMeta: ScheduleHandlerMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.schedule\"] = true;\n if (scheduleMeta.source) {\n annotations[\"celerity.handler.schedule.source\"] = scheduleMeta.source;\n }\n if (scheduleMeta.schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = scheduleMeta.schedule;\n }\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\nfunction buildCustomAnnotations(\n meta: ControllerMeta,\n prototype: object,\n methodName: string,\n invokeMeta: InvokeMetadata,\n): Record<string, string | string[] | boolean> {\n const annotations: Record<string, string | string[] | boolean> = {};\n annotations[\"celerity.handler.custom\"] = true;\n annotations[\"celerity.handler.custom.name\"] = invokeMeta.name;\n appendSharedAnnotations(annotations, meta, prototype, methodName);\n return annotations;\n}\n\n// ---------------------------------------------------------------------------\n// Class handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeClassHandlers(\n controllerClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry[] {\n const meta = extractControllerMeta(controllerClass);\n if (!meta) return [];\n\n const className = controllerClass.name;\n const prototype = controllerClass.prototype as object;\n const methods = Object.getOwnPropertyNames(prototype).filter((n) => n !== \"constructor\");\n const entries: ClassHandlerEntry[] = [];\n\n for (const methodName of methods) {\n // Type-specific handler decorator for the controller type.\n const typeEntry = serializeControllerTypeMethod(\n meta,\n className,\n prototype,\n methodName,\n sourceFile,\n options,\n );\n if (typeEntry) entries.push(typeEntry);\n\n // Cross-cutting: @ScheduleHandler on any controller type.\n const scheduleMeta: ScheduleHandlerMetadata | undefined = Reflect.getOwnMetadata(\n SCHEDULE_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (scheduleMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"schedule\",\n annotations: buildScheduleAnnotations(meta, prototype, methodName, scheduleMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n\n // Cross-cutting: @Invoke on any controller type.\n const invokeMeta: InvokeMetadata | undefined = Reflect.getOwnMetadata(\n INVOKE_METADATA,\n prototype,\n methodName,\n );\n if (invokeMeta) {\n entries.push({\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"custom\",\n annotations: buildCustomAnnotations(meta, prototype, methodName, invokeMeta),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n });\n }\n }\n\n return entries;\n}\n\nfunction serializeControllerTypeMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n switch (meta.controllerType) {\n case \"http\":\n return serializeHttpMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"websocket\":\n return serializeWebSocketMethod(meta, className, prototype, methodName, sourceFile, options);\n case \"consumer\":\n return serializeConsumerMethod(meta, className, prototype, methodName, sourceFile, options);\n default:\n return null;\n }\n}\n\nfunction serializeHttpMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const httpMethod: HttpMethod | undefined = Reflect.getOwnMetadata(\n HTTP_METHOD_METADATA,\n prototype,\n methodName,\n );\n if (!httpMethod) return null;\n\n const routePath: string =\n Reflect.getOwnMetadata(ROUTE_PATH_METADATA, prototype, methodName) ?? \"/\";\n const fullPath = joinHandlerPath(meta.prefix, routePath);\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"http\",\n annotations: buildHttpAnnotations(meta, prototype, methodName, httpMethod, fullPath),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeWebSocketMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const wsEvent: WebSocketEventMetadata | undefined = Reflect.getOwnMetadata(\n WEBSOCKET_EVENT_METADATA,\n prototype,\n methodName,\n );\n if (!wsEvent) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"websocket\",\n annotations: buildWebSocketAnnotations(meta, prototype, methodName, wsEvent),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeConsumerMethod(\n meta: ControllerMeta,\n className: string,\n prototype: object,\n methodName: string,\n sourceFile: string,\n options: SerializeOptions,\n): ClassHandlerEntry | null {\n const consumerHandler: ConsumerHandlerMetadata | undefined = Reflect.getOwnMetadata(\n CONSUMER_HANDLER_METADATA,\n prototype,\n methodName,\n );\n if (!consumerHandler) return null;\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n className,\n methodName,\n sourceFile,\n handlerType: \"consumer\",\n annotations: buildConsumerAnnotations(meta, prototype, methodName, consumerHandler),\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Function handler serialization\n// ---------------------------------------------------------------------------\n\nfunction serializeFunctionHandler(\n definition: FunctionHandlerDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): FunctionHandlerEntry | null {\n // \"workflow\" is not part of v0 — skip unsupported handler types.\n const supported = [\"http\", \"websocket\", \"consumer\", \"schedule\", \"custom\"] as const;\n type SupportedType = (typeof supported)[number];\n if (!supported.includes(definition.type as SupportedType)) return null;\n\n const exportName = (definition.metadata.handlerName as string) ?? \"handler\";\n const customMetadata = (definition.metadata.customMetadata as Record<string, unknown>) ?? {};\n const handlerType = definition.type as SupportedType;\n\n const annotations: Record<string, string | string[] | boolean> = {};\n\n buildFunctionTypeAnnotations(annotations, definition);\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n exportName,\n sourceFile,\n handlerType,\n ...(Object.keys(annotations).length > 0 ? { annotations } : {}),\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\nfunction buildFunctionTypeAnnotations(\n annotations: Record<string, string | string[] | boolean>,\n definition: FunctionHandlerDefinition,\n): void {\n const meta = definition.metadata;\n\n switch (definition.type) {\n case \"http\": {\n const path = meta.path as string | undefined;\n const method = meta.method as string | undefined;\n if (path !== undefined && method !== undefined) {\n annotations[\"celerity.handler.http\"] = true;\n annotations[\"celerity.handler.http.method\"] = method;\n annotations[\"celerity.handler.http.path\"] = path;\n }\n break;\n }\n case \"websocket\": {\n annotations[\"celerity.handler.websocket\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.websocket.route\"] = route;\n }\n break;\n }\n case \"consumer\": {\n annotations[\"celerity.handler.consumer\"] = true;\n const route = meta.route as string | undefined;\n if (route) {\n annotations[\"celerity.handler.consumer.route\"] = route;\n }\n break;\n }\n case \"schedule\": {\n annotations[\"celerity.handler.schedule\"] = true;\n const source = meta.source as string | undefined;\n if (source) {\n annotations[\"celerity.handler.schedule.source\"] = source;\n }\n const schedule = meta.schedule as string | undefined;\n if (schedule) {\n annotations[\"celerity.handler.schedule.expression\"] = schedule;\n }\n break;\n }\n case \"custom\": {\n annotations[\"celerity.handler.custom\"] = true;\n const name = meta.name as string | undefined;\n if (name) {\n annotations[\"celerity.handler.custom.name\"] = name;\n }\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Guard serialization (unchanged)\n// ---------------------------------------------------------------------------\n\ntype GuardMeta = {\n guardName: string;\n customMetadata: Record<string, unknown>;\n};\n\nfunction extractGuardMeta(guardClass: Type): GuardMeta | null {\n const guardName: string | undefined = Reflect.getOwnMetadata(GUARD_CUSTOM_METADATA, guardClass);\n if (!guardName) return null;\n\n return {\n guardName,\n customMetadata: Reflect.getOwnMetadata(CUSTOM_METADATA, guardClass) ?? {},\n };\n}\n\nfunction serializeClassGuard(\n guardClass: Type,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const meta = extractGuardMeta(guardClass);\n if (!meta) return null;\n\n const className = guardClass.name;\n const methodName = \"check\";\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": meta.guardName,\n };\n\n for (const [key, value] of Object.entries(meta.customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n return {\n resourceName: deriveClassResourceName(className, methodName),\n guardName: meta.guardName,\n sourceFile,\n guardType: \"class\",\n className,\n annotations,\n spec: {\n handlerName: deriveClassHandlerName(className, methodName),\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveClassHandlerFunction(sourceFile, className, methodName),\n },\n };\n}\n\nfunction serializeFunctionGuard(\n definition: GuardDefinition,\n sourceFile: string,\n options: SerializeOptions,\n): GuardHandlerEntry | null {\n const guardName = definition.name;\n if (!guardName) return null;\n\n const meta = (definition.metadata ?? {}) as {\n customMetadata?: Record<string, unknown>;\n };\n const customMetadata = meta.customMetadata ?? {};\n\n const annotations: Record<string, string | string[] | boolean> = {\n \"celerity.handler.guard.custom\": guardName,\n };\n\n for (const [key, value] of Object.entries(customMetadata)) {\n if (value === undefined) continue;\n annotations[`celerity.handler.metadata.${key}`] = serializeAnnotationValue(value);\n }\n\n const exportName = guardName;\n\n return {\n resourceName: deriveFunctionResourceName(exportName),\n guardName,\n sourceFile,\n guardType: \"function\",\n exportName,\n annotations,\n spec: {\n handlerName: exportName,\n codeLocation: deriveCodeLocation(sourceFile, options.projectRoot),\n handler: deriveFunctionHandlerFunction(sourceFile, exportName),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction serializeAnnotationValue(value: unknown): string | string[] | boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value;\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n return JSON.stringify(value);\n}\n\nexport function serializeToken(token: InjectionToken): string {\n if (typeof token === \"function\") return token.name;\n if (typeof token === \"symbol\") return token.description ?? \"Symbol()\";\n return token;\n}\n\nexport function tokenType(token: InjectionToken): \"class\" | \"string\" | \"symbol\" {\n if (typeof token === \"function\") return \"class\";\n if (typeof token === \"symbol\") return \"symbol\";\n return \"string\";\n}\n\nfunction serializeDependencyGraph(scanned: ScannedModule): DependencyGraph {\n const nodes: DependencyNode[] = scanned.providers.map((provider) => ({\n token: serializeToken(provider.token),\n tokenType: tokenType(provider.token),\n providerType: provider.providerType,\n dependencies: provider.dependencies.map(serializeToken),\n }));\n\n return { nodes };\n}\n","export { joinHandlerPath } from \"@celerity-sdk/common\";\n","import { basename, dirname, relative } from \"node:path\";\n\n/**\n * Derives a resource name for a class-based handler method.\n * Format: camelCase(className) + \"_\" + methodName\n *\n * @example deriveClassResourceName(\"OrdersHandler\", \"getOrder\") => \"ordersHandler_getOrder\"\n */\nexport function deriveClassResourceName(className: string, methodName: string): string {\n const camelClass = className.charAt(0).toLowerCase() + className.slice(1);\n return `${camelClass}_${methodName}`;\n}\n\n/**\n * Derives a handler name for a class-based handler method.\n * Format: className + \"-\" + methodName\n *\n * @example deriveClassHandlerName(\"OrdersHandler\", \"getOrder\") => \"OrdersHandler-getOrder\"\n */\nexport function deriveClassHandlerName(className: string, methodName: string): string {\n return `${className}-${methodName}`;\n}\n\n/**\n * Derives the handler function reference for a class-based handler.\n * Format: moduleBaseName + \".\" + className + \".\" + methodName\n *\n * @example deriveClassHandlerFunction(\"src/handlers/orders.ts\", \"OrdersHandler\", \"getOrder\")\n * => \"orders.OrdersHandler.getOrder\"\n */\nexport function deriveClassHandlerFunction(\n sourceFile: string,\n className: string,\n methodName: string,\n): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${className}.${methodName}`;\n}\n\n/**\n * Derives a resource name for a function-based handler.\n * Uses the export name directly.\n *\n * @example deriveFunctionResourceName(\"getOrder\") => \"getOrder\"\n */\nexport function deriveFunctionResourceName(exportName: string): string {\n return exportName;\n}\n\n/**\n * Derives the handler function reference for a function-based handler.\n * Format: moduleBaseName + \".\" + exportName\n *\n * @example deriveFunctionHandlerFunction(\"src/handlers/orders.ts\", \"getOrder\")\n * => \"orders.getOrder\"\n */\nexport function deriveFunctionHandlerFunction(sourceFile: string, exportName: string): string {\n const base = basename(sourceFile).replace(/\\.[^.]+$/, \"\");\n return `${base}.${exportName}`;\n}\n\n/**\n * Derives the code location from a source file path relative to the project root.\n * Returns the directory prefixed with \"./\"\n *\n * @example deriveCodeLocation(\"src/handlers/orders.ts\", \"/project\") => \"./src/handlers\"\n */\nexport function deriveCodeLocation(sourceFile: string, projectRoot: string): string {\n const rel = relative(projectRoot, sourceFile);\n const dir = dirname(rel);\n return dir === \".\" ? \"./\" : `./${dir}`;\n}\n"],"mappings":"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","names":["createDebug","isRuntimeProvidedToken","buildModuleGraph","getClassDependencyTokens","getProviderDependencyTokens","debug","createDebug","scanProvider","provider","seenTokens","has","add","token","providerType","dependencies","getClassDependencyTokens","typed","provide","getProviderDependencyTokens","buildScannedModule","rootModule","graph","buildModuleGraph","controllerClasses","functionHandlers","guardClasses","functionGuards","providers","Set","moduleClass","node","name","length","controllers","guards","scanned","push","controller","guard","validateScannedDependencies","registeredTokens","map","p","diagnostics","visited","walk","deps","dep","find","isRuntimeProvidedToken","consumer","serializeToken","dependency","description","String","CONTROLLER_METADATA","HTTP_METHOD_METADATA","ROUTE_PATH_METADATA","WEBSOCKET_CONTROLLER_METADATA","WEBSOCKET_EVENT_METADATA","CONSUMER_METADATA","CONSUMER_HANDLER_METADATA","SCHEDULE_HANDLER_METADATA","INVOKE_METADATA","GUARD_PROTECTEDBY_METADATA","GUARD_CUSTOM_METADATA","PUBLIC_METADATA","CUSTOM_METADATA","USE_RESOURCE_METADATA","joinHandlerPath","basename","dirname","relative","deriveClassResourceName","className","methodName","camelClass","charAt","toLowerCase","slice","deriveClassHandlerName","deriveClassHandlerFunction","sourceFile","base","basename","replace","deriveFunctionResourceName","exportName","deriveFunctionHandlerFunction","deriveCodeLocation","projectRoot","rel","relative","dir","dirname","serializeManifest","scanned","sourceFile","options","handlers","functionHandlers","guardHandlers","controllerClass","controllerClasses","entries","serializeClassHandlers","push","fnHandler","entry","serializeFunctionHandler","guardClass","guardClasses","serializeClassGuard","fnGuard","functionGuards","serializeFunctionGuard","version","dependencyGraph","serializeDependencyGraph","extractControllerMeta","httpMeta","Reflect","getOwnMetadata","CONTROLLER_METADATA","controllerType","prefix","extractSharedClassMeta","isWebSocket","WEBSOCKET_CONTROLLER_METADATA","consumerMeta","CONSUMER_METADATA","source","protectedBy","GUARD_PROTECTEDBY_METADATA","customGuardName","GUARD_CUSTOM_METADATA","customMetadata","CUSTOM_METADATA","resourceRefs","USE_RESOURCE_METADATA","appendSharedAnnotations","annotations","meta","prototype","methodName","methodProtectedBy","allProtectedBy","length","isPublic","PUBLIC_METADATA","methodCustomMetadata","key","value","Object","undefined","serializeAnnotationValue","methodResourceRefs","allResourceRefs","Set","buildHttpAnnotations","httpMethod","fullPath","buildWebSocketAnnotations","wsEvent","route","eventType","buildConsumerAnnotations","consumerHandler","buildScheduleAnnotations","scheduleMeta","schedule","buildCustomAnnotations","invokeMeta","name","className","methods","getOwnPropertyNames","filter","n","typeEntry","serializeControllerTypeMethod","SCHEDULE_HANDLER_METADATA","resourceName","deriveClassResourceName","handlerType","spec","handlerName","deriveClassHandlerName","codeLocation","deriveCodeLocation","projectRoot","handler","deriveClassHandlerFunction","INVOKE_METADATA","serializeHttpMethod","serializeWebSocketMethod","serializeConsumerMethod","HTTP_METHOD_METADATA","routePath","ROUTE_PATH_METADATA","joinHandlerPath","WEBSOCKET_EVENT_METADATA","CONSUMER_HANDLER_METADATA","definition","supported","includes","type","exportName","metadata","buildFunctionTypeAnnotations","deriveFunctionResourceName","keys","deriveFunctionHandlerFunction","path","method","extractGuardMeta","guardName","guardType","Array","isArray","every","v","JSON","stringify","serializeToken","token","description","tokenType","nodes","providers","map","provider","providerType","dependencies"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@celerity-sdk/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Build-time extraction tool for Celerity decorator metadata",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -33,14 +33,14 @@
|
|
|
33
33
|
"schemas"
|
|
34
34
|
],
|
|
35
35
|
"engines": {
|
|
36
|
-
"node": ">=
|
|
36
|
+
"node": ">=24.0.0"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"debug": "^4.4.0",
|
|
40
40
|
"reflect-metadata": "^0.2.0",
|
|
41
|
-
"@celerity-sdk/
|
|
42
|
-
"@celerity-sdk/
|
|
43
|
-
"@celerity-sdk/
|
|
41
|
+
"@celerity-sdk/core": "^0.8.0",
|
|
42
|
+
"@celerity-sdk/types": "^0.8.0",
|
|
43
|
+
"@celerity-sdk/common": "^0.8.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"ajv": "^8.17.0"
|