@rexeus/typeweaver-gen 0.8.0 → 0.9.1
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/README.md +58 -29
- package/dist/index.cjs +409 -153
- package/dist/index.d.cts +196 -149
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +196 -149
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +386 -139
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -4
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/plugins/types.ts","../src/plugins/BasePlugin.ts","../src/plugins/BaseTemplatePlugin.ts","../src/plugins/PluginRegistry.ts","../src/plugins/PluginContext.ts","../src/helpers/Path.ts"],"sourcesContent":["import type { GetResourcesResult } from \"../Resource\";\n\n/**\n * Configuration for a typeweaver plugin\n */\nexport type PluginConfig = Record<string, unknown>;\n\n/**\n * Context provided to plugins during initialization and finalization\n */\nexport type PluginContext = {\n outputDir: string;\n inputDir: string;\n config: PluginConfig;\n};\n\n/**\n * Context provided to plugins during generation\n */\nexport type GeneratorContext = PluginContext & {\n resources: GetResourcesResult;\n templateDir: string;\n coreDir: string;\n\n // Utility functions\n writeFile: (relativePath: string, content: string) => void;\n renderTemplate: (templatePath: string, data: unknown) => string;\n addGeneratedFile: (relativePath: string) => void;\n getGeneratedFiles: () => string[];\n};\n\n/**\n * Plugin metadata\n */\nexport type PluginMetadata = {\n name: string;\n};\n\n/**\n * typeweaver plugin interface\n */\nexport type TypeweaverPlugin = PluginMetadata & {\n /**\n * Initialize the plugin\n * Called before any generation happens\n */\n initialize?(context: PluginContext): Promise<void> | void;\n\n /**\n * Collect and transform resources\n * Allows plugins to modify the resource collection\n */\n collectResources?(\n resources: GetResourcesResult\n ): Promise<GetResourcesResult> | GetResourcesResult;\n\n /**\n * Main generation logic\n * Called with all resources and utilities\n */\n generate?(context: GeneratorContext): Promise<void> | void;\n\n /**\n * Finalize the plugin\n * Called after all generation is complete\n */\n finalize?(context: PluginContext): Promise<void> | void;\n};\n\n/**\n * Plugin constructor type\n */\nexport type PluginConstructor = new (config?: PluginConfig) => TypeweaverPlugin;\n\n/**\n * Plugin module export\n */\nexport type PluginModule = {\n default: PluginConstructor;\n};\n\n/**\n * Plugin registration entry\n */\nexport type PluginRegistration = {\n name: string;\n plugin: TypeweaverPlugin;\n config?: PluginConfig;\n};\n\n/**\n * typeweaver configuration\n */\nexport type TypeweaverConfig = {\n input: string;\n output: string;\n shared?: string;\n plugins?: (string | [string, PluginConfig])[];\n format?: boolean;\n clean?: boolean;\n};\n\n/**\n * Plugin loading error\n */\nexport class PluginLoadError extends Error {\n constructor(\n public pluginName: string,\n message: string\n ) {\n super(`Failed to load plugin '${pluginName}': ${message}`);\n this.name = \"PluginLoadError\";\n }\n}\n\n/**\n * Plugin dependency error\n */\nexport class PluginDependencyError extends Error {\n constructor(\n public pluginName: string,\n public missingDependency: string\n ) {\n super(\n `Plugin '${pluginName}' depends on '${missingDependency}' which is not loaded`\n );\n this.name = \"PluginDependencyError\";\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { GetResourcesResult } from \"../Resource\";\nimport type {\n GeneratorContext,\n PluginConfig,\n PluginContext,\n TypeweaverPlugin,\n} from \"./types\";\n\n/**\n * Base class for typeweaver plugins\n * Provides default implementations and common utilities\n */\nexport abstract class BasePlugin implements TypeweaverPlugin {\n abstract name: string;\n description?: string;\n author?: string;\n depends?: string[];\n\n protected config: PluginConfig;\n\n constructor(config: PluginConfig = {}) {\n this.config = config;\n }\n\n /**\n * Default implementation - override in subclasses if needed\n */\n async initialize(_context: PluginContext): Promise<void> {\n // Default: no initialization needed\n }\n\n /**\n * Default implementation - override in subclasses if needed\n */\n collectResources(resources: GetResourcesResult): GetResourcesResult {\n // Default: return resources unchanged\n return resources;\n }\n\n /**\n * Main generation logic - must be implemented by subclasses\n */\n abstract generate(context: GeneratorContext): Promise<void> | void;\n\n /**\n * Default implementation - override in subclasses if needed\n */\n async finalize(_context: PluginContext): Promise<void> {\n // Default: no finalization needed\n }\n\n protected copyLibFiles(\n context: GeneratorContext,\n libSourceDir: string,\n libNamespace: string\n ): void {\n if (!fs.existsSync(libSourceDir)) return;\n\n const libDir = path.join(context.outputDir, \"lib\", libNamespace);\n\n fs.cpSync(libSourceDir, libDir, { recursive: true });\n\n const libIndexPath = path.join(\"lib\", libNamespace, \"index.ts\");\n if (fs.existsSync(path.join(libDir, \"index.ts\"))) {\n context.addGeneratedFile(libIndexPath);\n }\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { render } from \"ejs\";\nimport { BasePlugin } from \"./BasePlugin\";\nimport type { GeneratorContext } from \"./types\";\nimport type { Data } from \"ejs\";\n\n/**\n * Base class for template-based generator plugins\n * Provides utilities for working with EJS templates\n */\nexport abstract class BaseTemplatePlugin extends BasePlugin {\n /**\n * Render an EJS template with the given data\n */\n protected renderTemplate(templatePath: string, data: unknown): string {\n const template = fs.readFileSync(templatePath, \"utf8\");\n return render(template, data as Data);\n }\n\n /**\n * Write a file relative to the output directory\n */\n protected writeFile(\n context: GeneratorContext,\n relativePath: string,\n content: string\n ): void {\n context.writeFile(relativePath, content);\n }\n\n /**\n * Ensure a directory exists\n */\n protected ensureDir(context: GeneratorContext, relativePath: string): void {\n const fullPath = path.join(context.outputDir, relativePath);\n fs.mkdirSync(fullPath, { recursive: true });\n }\n\n /**\n * Get the template path for this plugin\n */\n protected getTemplatePath(\n context: GeneratorContext,\n templateName: string\n ): string {\n return path.join(context.templateDir, templateName);\n }\n}\n","import type { PluginRegistration, TypeweaverPlugin } from \"./types\";\n\n/**\n * Registry for managing typeweaver plugins\n */\nexport class PluginRegistry {\n private plugins: Map<string, PluginRegistration>;\n\n public constructor() {\n this.plugins = new Map();\n }\n\n /**\n * Register a plugin\n */\n public register(plugin: TypeweaverPlugin, config?: unknown): void {\n if (this.plugins.has(plugin.name)) {\n console.info(\n `Skipping duplicate registration of required plugin: ${plugin.name}`\n );\n return;\n }\n\n const registration: PluginRegistration = {\n name: plugin.name,\n plugin,\n config: config as Record<string, unknown>,\n };\n\n this.plugins.set(plugin.name, registration);\n console.info(`Registered plugin: ${plugin.name}`);\n }\n\n /**\n * Get a registered plugin\n */\n public get(name: string): PluginRegistration | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * Get all registered plugins\n */\n public getAll(): PluginRegistration[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Check if a plugin is registered\n */\n public has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /**\n * Clear all registered plugins (except required ones)\n */\n public clear(): void {\n this.plugins.clear();\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { render } from \"ejs\";\nimport type { GetResourcesResult } from \"../Resource\";\nimport type { GeneratorContext, PluginConfig, PluginContext } from \"./types\";\nimport type { Data } from \"ejs\";\n\n/**\n * Builder for plugin contexts\n */\nexport class PluginContextBuilder {\n private generatedFiles = new Set<string>();\n\n /**\n * Create a basic plugin context\n */\n createPluginContext(params: {\n outputDir: string;\n inputDir: string;\n config: PluginConfig;\n }): PluginContext {\n return {\n outputDir: params.outputDir,\n inputDir: params.inputDir,\n config: params.config,\n };\n }\n\n /**\n * Create a generator context with utilities\n */\n createGeneratorContext(params: {\n outputDir: string;\n inputDir: string;\n config: PluginConfig;\n resources: GetResourcesResult;\n templateDir: string;\n coreDir: string;\n }): GeneratorContext {\n const pluginContext = this.createPluginContext(params);\n\n return {\n ...pluginContext,\n resources: params.resources,\n templateDir: params.templateDir,\n coreDir: params.coreDir,\n\n // Utility functions\n writeFile: (relativePath: string, content: string) => {\n const fullPath = path.join(params.outputDir, relativePath);\n const dir = path.dirname(fullPath);\n\n // Ensure directory exists\n fs.mkdirSync(dir, { recursive: true });\n\n // Write file\n fs.writeFileSync(fullPath, content);\n\n // Track generated file\n this.generatedFiles.add(relativePath);\n\n console.info(`Generated: ${relativePath}`);\n },\n\n renderTemplate: (templatePath: string, data: unknown) => {\n const fullTemplatePath = path.isAbsolute(templatePath)\n ? templatePath\n : path.join(params.templateDir, templatePath);\n\n const template = fs.readFileSync(fullTemplatePath, \"utf8\");\n return render(template, data as Data);\n },\n\n addGeneratedFile: (relativePath: string) => {\n this.generatedFiles.add(relativePath);\n },\n\n getGeneratedFiles: () => {\n return Array.from(this.generatedFiles);\n },\n };\n }\n\n /**\n * Get all generated files\n */\n getGeneratedFiles(): string[] {\n return Array.from(this.generatedFiles);\n }\n\n /**\n * Clear generated files tracking\n */\n clearGeneratedFiles(): void {\n this.generatedFiles.clear();\n }\n}\n","import path from \"node:path\";\n\nexport class Path {\n public static relative(from: string, to: string): string {\n const relativePath = path.relative(from, to);\n\n if (relativePath.includes(\"node_modules\")) {\n const parts = relativePath.split(path.sep);\n const index = parts.indexOf(\"node_modules\");\n return parts.slice(index + 1).join(\"/\");\n }\n\n const posixPath = relativePath.split(path.sep).join(\"/\");\n\n if (!posixPath.startsWith(\"./\") && !posixPath.startsWith(\"../\")) {\n return `./${posixPath}`;\n }\n\n return posixPath;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/errors/DerivedResponseCycleError.ts","../src/errors/DuplicateOperationIdError.ts","../src/errors/DuplicateRouteError.ts","../src/errors/EmptyOperationResponsesError.ts","../src/errors/EmptyResourceOperationsError.ts","../src/errors/EmptySpecResourcesError.ts","../src/errors/InvalidDerivedResponseError.ts","../src/errors/InvalidRequestSchemaError.ts","../src/errors/MissingDerivedResponseParentError.ts","../src/errors/PathParameterMismatchError.ts","../src/helpers/routePath.ts","../src/validation/derivedResponseValidation.ts","../src/normalizeSpec.ts","../src/plugins/types.ts","../src/plugins/BasePlugin.ts","../src/plugins/pluginRegistry.ts","../src/helpers/path.ts","../src/plugins/pluginContext.ts","../src/helpers/routeSort.ts"],"sourcesContent":["export class DerivedResponseCycleError extends Error {\n public constructor(responseName: string) {\n super(`Derived response '${responseName}' contains a cyclic lineage.`);\n this.name = \"DerivedResponseCycleError\";\n }\n}\n","export class DuplicateOperationIdError extends Error {\n public constructor(operationId: string) {\n super(\n `Operation ID '${operationId}' must be globally unique within a spec.`\n );\n this.name = \"DuplicateOperationIdError\";\n }\n}\n","export class DuplicateRouteError extends Error {\n public constructor(method: string, path: string, normalizedPath: string) {\n super(\n `Route '${method} ${path}' conflicts with an existing route using normalized path '${normalizedPath}'.`\n );\n this.name = \"DuplicateRouteError\";\n }\n}\n","export class EmptyOperationResponsesError extends Error {\n public constructor(operationId: string) {\n super(`Operation '${operationId}' must declare at least one response.`);\n this.name = \"EmptyOperationResponsesError\";\n }\n}\n","export class EmptyResourceOperationsError extends Error {\n public constructor(resourceName: string) {\n super(`Resource '${resourceName}' must contain at least one operation.`);\n this.name = \"EmptyResourceOperationsError\";\n }\n}\n","export class EmptySpecResourcesError extends Error {\n public constructor() {\n super(\"Spec definition must contain at least one resource.\");\n this.name = \"EmptySpecResourcesError\";\n }\n}\n","export class InvalidDerivedResponseError extends Error {\n public constructor(responseName: string) {\n super(\n `Derived response '${responseName}' contains invalid lineage metadata.`\n );\n this.name = \"InvalidDerivedResponseError\";\n }\n}\n","import type { NormalizedRequest } from \"../NormalizedSpec\";\n\nexport class InvalidRequestSchemaError extends Error {\n public constructor(\n operationId: string,\n requestPart: keyof NormalizedRequest\n ) {\n super(\n `Operation '${operationId}' has an invalid request.${requestPart} schema definition.`\n );\n this.name = \"InvalidRequestSchemaError\";\n }\n}\n","export class MissingDerivedResponseParentError extends Error {\n public constructor(responseName: string, parentName: string) {\n super(\n `Derived response '${responseName}' references missing canonical parent '${parentName}'.`\n );\n this.name = \"MissingDerivedResponseParentError\";\n }\n}\n","export class PathParameterMismatchError extends Error {\n public constructor(\n operationId: string,\n path: string,\n pathParams: readonly string[],\n requestParams: readonly string[]\n ) {\n super(\n `Operation '${operationId}' has mismatched path parameters for '${path}'. Path params: [${pathParams.join(\n \", \"\n )}], request.param keys: [${requestParams.join(\", \")}].`\n );\n this.name = \"PathParameterMismatchError\";\n }\n}\n","const PATH_PARAMETER_PATTERN = /:([A-Za-z0-9_]+)/g;\n\nexport const normalizeRoutePath = (path: string): string => {\n const segments = path.split(\"/\").filter(Boolean);\n\n if (segments.length === 0) {\n return \"/\";\n }\n\n return `/${segments.map(segment => (segment.startsWith(\":\") ? \":\" : segment)).join(\"/\")}`;\n};\n\nexport const getPathParameterNames = (path: string): string[] => {\n return Array.from(\n path.matchAll(PATH_PARAMETER_PATTERN),\n match => match[1] as string\n );\n};\n","import {\n HttpStatusCodeNameMap,\n isNamedResponseDefinition,\n} from \"@rexeus/typeweaver-core\";\nimport type {\n ResponseDefinition,\n SpecDefinition,\n} from \"@rexeus/typeweaver-core\";\nimport {\n DerivedResponseCycleError,\n InvalidDerivedResponseError,\n MissingDerivedResponseParentError,\n} from \"../errors\";\nimport type { NormalizedResponse } from \"../NormalizedSpec\";\n\nexport const validateDerivedResponseMetadata = (\n response: ResponseDefinition\n): void => {\n const derived = response.derived;\n\n if (derived === undefined) {\n return;\n }\n\n if (derived.parentName === response.name) {\n throw new DerivedResponseCycleError(response.name);\n }\n\n if (derived.lineage.length === 0) {\n throw new InvalidDerivedResponseError(response.name);\n }\n\n if (derived.lineage.at(-1) !== response.name) {\n throw new InvalidDerivedResponseError(response.name);\n }\n\n if (derived.lineage.length !== derived.depth) {\n throw new InvalidDerivedResponseError(response.name);\n }\n\n if (new Set(derived.lineage).size !== derived.lineage.length) {\n throw new DerivedResponseCycleError(response.name);\n }\n\n if (derived.depth > 1 && derived.lineage.at(-2) !== derived.parentName) {\n throw new InvalidDerivedResponseError(response.name);\n }\n};\n\nexport const collectCanonicalResponseDefinitions = (\n definition: SpecDefinition\n): Map<string, ResponseDefinition> => {\n const canonicalResponses = new Map<string, ResponseDefinition>();\n\n for (const resource of Object.values(definition.resources)) {\n for (const operation of resource.operations) {\n for (const response of operation.responses) {\n if (!isNamedResponseDefinition(response)) {\n continue;\n }\n\n validateDerivedResponseMetadata(response);\n\n canonicalResponses.set(response.name, response);\n }\n }\n }\n\n return canonicalResponses;\n};\n\nexport const getDerivedResponseChain = (\n response: ResponseDefinition,\n canonicalResponses: ReadonlyMap<string, ResponseDefinition>\n): readonly string[] => {\n const chain: string[] = [response.name];\n const visitedResponseNames = new Set(chain);\n let parentName = response.derived?.parentName;\n\n while (parentName !== undefined) {\n if (visitedResponseNames.has(parentName)) {\n throw new DerivedResponseCycleError(response.name);\n }\n\n const parentResponse = canonicalResponses.get(parentName);\n\n if (parentResponse === undefined) {\n throw new MissingDerivedResponseParentError(response.name, parentName);\n }\n\n chain.unshift(parentResponse.name);\n visitedResponseNames.add(parentResponse.name);\n parentName = parentResponse.derived?.parentName;\n }\n\n return chain;\n};\n\nexport const validateDerivedResponseGraph = (\n canonicalResponses: ReadonlyMap<string, ResponseDefinition>\n): void => {\n for (const response of canonicalResponses.values()) {\n if (response.derived === undefined) {\n continue;\n }\n\n const chain = getDerivedResponseChain(response, canonicalResponses);\n const materializedLineage = chain.slice(1);\n\n if (response.derived.depth !== materializedLineage.length) {\n throw new InvalidDerivedResponseError(response.name);\n }\n\n if (\n materializedLineage.length !== response.derived.lineage.length ||\n materializedLineage.some(\n (lineageEntry, index) =>\n lineageEntry !== response.derived?.lineage[index]\n )\n ) {\n throw new InvalidDerivedResponseError(response.name);\n }\n }\n};\n\nexport const normalizeResponseDefinition = (\n response: ResponseDefinition\n): NormalizedResponse => {\n return {\n name: response.name,\n statusCode: response.statusCode,\n statusCodeName: HttpStatusCodeNameMap[response.statusCode],\n description: response.description,\n header: response.header,\n body: response.body,\n kind: response.derived === undefined ? \"response\" : \"derived-response\",\n derivedFrom: response.derived?.parentName,\n lineage: response.derived?.lineage,\n depth: response.derived?.depth,\n };\n};\n\nexport const collectCanonicalResponses = (\n definition: SpecDefinition\n): Map<string, NormalizedResponse> => {\n const canonicalResponseDefinitions =\n collectCanonicalResponseDefinitions(definition);\n\n validateDerivedResponseGraph(canonicalResponseDefinitions);\n\n return new Map(\n Array.from(\n canonicalResponseDefinitions.entries(),\n ([responseName, response]) => [\n responseName,\n normalizeResponseDefinition(response),\n ]\n )\n );\n};\n","import {\n isNamedResponseDefinition,\n validateUniqueResponseNames,\n} from \"@rexeus/typeweaver-core\";\nimport type {\n RequestDefinition,\n ResourceDefinition,\n ResponseDefinition,\n SpecDefinition,\n} from \"@rexeus/typeweaver-core\";\nimport { z } from \"zod\";\nimport {\n DuplicateOperationIdError,\n DuplicateRouteError,\n EmptyOperationResponsesError,\n EmptyResourceOperationsError,\n EmptySpecResourcesError,\n InvalidRequestSchemaError,\n PathParameterMismatchError,\n} from \"./errors\";\nimport { getPathParameterNames, normalizeRoutePath } from \"./helpers/routePath\";\nimport {\n collectCanonicalResponses,\n normalizeResponseDefinition,\n} from \"./validation\";\nimport type {\n NormalizedOperation,\n NormalizedRequest,\n NormalizedResponseUsage,\n NormalizedSpec,\n} from \"./NormalizedSpec\";\n\nconst isZodType = (schema: unknown): schema is z.ZodType => {\n return schema instanceof z.ZodType;\n};\n\nconst isZodObject = (\n schema: unknown\n): schema is z.ZodObject<z.core.$ZodShape> => {\n return schema instanceof z.ZodObject;\n};\n\nconst validateRequestSchema = (\n operationId: string,\n requestPart: keyof NormalizedRequest,\n schema: unknown\n): void => {\n if (!isZodType(schema)) {\n throw new InvalidRequestSchemaError(operationId, requestPart);\n }\n\n if (requestPart === \"param\" && !isZodObject(schema)) {\n throw new InvalidRequestSchemaError(operationId, requestPart);\n }\n};\n\nconst validateRequest = (\n operationId: string,\n path: string,\n request: RequestDefinition\n): NormalizedRequest | undefined => {\n if (request.header !== undefined) {\n validateRequestSchema(operationId, \"header\", request.header);\n }\n\n if (request.param !== undefined) {\n validateRequestSchema(operationId, \"param\", request.param);\n }\n\n if (request.query !== undefined) {\n validateRequestSchema(operationId, \"query\", request.query);\n }\n\n if (request.body !== undefined) {\n validateRequestSchema(operationId, \"body\", request.body);\n }\n\n const pathParams = getPathParameterNames(path);\n const requestParams =\n request.param === undefined ? [] : Object.keys(request.param.shape);\n\n if (\n pathParams.length !== requestParams.length ||\n pathParams.some(pathParam => !requestParams.includes(pathParam))\n ) {\n throw new PathParameterMismatchError(\n operationId,\n path,\n pathParams,\n requestParams\n );\n }\n\n if (\n request.header === undefined &&\n request.param === undefined &&\n request.query === undefined &&\n request.body === undefined\n ) {\n return undefined;\n }\n\n return {\n header: request.header,\n param: request.param,\n query: request.query,\n body: request.body,\n };\n};\n\nconst normalizeOperationResponses = (\n responses: readonly ResponseDefinition[]\n): NormalizedResponseUsage[] => {\n return responses.map(response => {\n if (isNamedResponseDefinition(response)) {\n return {\n responseName: response.name,\n source: \"canonical\",\n };\n }\n\n return {\n responseName: response.name,\n source: \"inline\",\n response: normalizeResponseDefinition(response),\n };\n });\n};\n\nconst normalizeOperation = (\n operationIds: Set<string>,\n routeKeys: Set<string>,\n operation: ResourceDefinition[\"operations\"][number]\n): NormalizedOperation => {\n if (operationIds.has(operation.operationId)) {\n throw new DuplicateOperationIdError(operation.operationId);\n }\n\n operationIds.add(operation.operationId);\n\n const normalizedPath = normalizeRoutePath(operation.path);\n const routeKey = `${operation.method}:${normalizedPath}`;\n\n if (routeKeys.has(routeKey)) {\n throw new DuplicateRouteError(\n operation.method,\n operation.path,\n normalizedPath\n );\n }\n\n routeKeys.add(routeKey);\n\n if (operation.responses.length === 0) {\n throw new EmptyOperationResponsesError(operation.operationId);\n }\n\n return {\n operationId: operation.operationId,\n method: operation.method,\n path: operation.path,\n summary: operation.summary,\n request: validateRequest(\n operation.operationId,\n operation.path,\n operation.request\n ),\n responses: normalizeOperationResponses(operation.responses),\n };\n};\n\nexport const normalizeSpec = (definition: SpecDefinition): NormalizedSpec => {\n const resourceEntries = Object.entries(definition.resources);\n\n if (resourceEntries.length === 0) {\n throw new EmptySpecResourcesError();\n }\n\n validateUniqueResponseNames(definition.resources);\n const canonicalResponses = collectCanonicalResponses(definition);\n const operationIds = new Set<string>();\n const routeKeys = new Set<string>();\n\n return {\n resources: resourceEntries.map(([resourceName, resource]) => {\n if (resource.operations.length === 0) {\n throw new EmptyResourceOperationsError(resourceName);\n }\n\n return {\n name: resourceName,\n operations: resource.operations.map(operation =>\n normalizeOperation(operationIds, routeKeys, operation)\n ),\n };\n }),\n responses: Array.from(canonicalResponses.values()),\n };\n};\n","import type { NormalizedResponse, NormalizedSpec } from \"../NormalizedSpec\";\n\n/**\n * Configuration for a typeweaver plugin\n */\nexport type PluginConfig = Record<string, unknown>;\n\n/**\n * Context provided to plugins during initialization and finalization\n */\nexport type PluginContext = {\n readonly outputDir: string;\n readonly inputDir: string;\n readonly config: PluginConfig;\n};\n\nexport type OperationOutputPaths = {\n readonly outputDir: string;\n readonly requestFile: string;\n readonly requestFileName: string;\n readonly responseFile: string;\n readonly responseFileName: string;\n readonly requestValidationFile: string;\n readonly requestValidationFileName: string;\n readonly responseValidationFile: string;\n readonly responseValidationFileName: string;\n readonly clientFile: string;\n readonly clientFileName: string;\n};\n\n/**\n * Context provided to plugins during generation\n */\nexport type GeneratorContext = PluginContext & {\n readonly normalizedSpec: NormalizedSpec;\n readonly templateDir: string;\n readonly coreDir: string;\n readonly responsesOutputDir: string;\n readonly specOutputDir: string;\n\n readonly getCanonicalResponse: (responseName: string) => NormalizedResponse;\n readonly getCanonicalResponseOutputFile: (responseName: string) => string;\n readonly getCanonicalResponseImportPath: (params: {\n readonly importerDir: string;\n readonly responseName: string;\n }) => string;\n readonly getSpecImportPath: (params: {\n readonly importerDir: string;\n }) => string;\n readonly getOperationDefinitionAccessor: (params: {\n readonly resourceName: string;\n readonly operationId: string;\n }) => string;\n readonly getOperationOutputPaths: (params: {\n readonly resourceName: string;\n readonly operationId: string;\n }) => OperationOutputPaths;\n readonly getResourceOutputDir: (resourceName: string) => string;\n readonly writeFile: (relativePath: string, content: string) => void;\n readonly renderTemplate: (templatePath: string, data: unknown) => string;\n readonly addGeneratedFile: (relativePath: string) => void;\n readonly getGeneratedFiles: () => string[];\n};\n\n/**\n * Plugin metadata\n */\nexport type PluginMetadata = {\n readonly name: string;\n};\n\n/**\n * typeweaver plugin interface\n */\nexport type TypeweaverPlugin = PluginMetadata & {\n /**\n * Initialize the plugin\n * Called before any generation happens\n */\n initialize?(context: PluginContext): Promise<void> | void;\n\n /**\n * Collect and transform resources\n * Allows plugins to modify the resource collection\n */\n collectResources?(\n normalizedSpec: NormalizedSpec\n ): Promise<NormalizedSpec> | NormalizedSpec;\n\n /**\n * Main generation logic\n * Called with all resources and utilities\n */\n generate?(context: GeneratorContext): Promise<void> | void;\n\n /**\n * Finalize the plugin\n * Called after all generation is complete\n */\n finalize?(context: PluginContext): Promise<void> | void;\n};\n\n/**\n * Plugin constructor type\n */\nexport type PluginConstructor = new (config?: PluginConfig) => TypeweaverPlugin;\n\n/**\n * Plugin module export\n */\nexport type PluginModule = {\n default: PluginConstructor;\n};\n\n/**\n * Plugin registration entry\n */\nexport type PluginRegistration = {\n name: string;\n plugin: TypeweaverPlugin;\n config?: PluginConfig;\n};\n\n/**\n * typeweaver configuration\n */\nexport type TypeweaverConfig = {\n input: string;\n output: string;\n plugins?: (string | [string, PluginConfig])[];\n format?: boolean;\n clean?: boolean;\n};\n\n/**\n * Plugin loading error\n */\nexport class PluginLoadError extends Error {\n constructor(\n public pluginName: string,\n message: string\n ) {\n super(`Failed to load plugin '${pluginName}': ${message}`);\n this.name = \"PluginLoadError\";\n }\n}\n\n/**\n * Plugin dependency error\n */\nexport class PluginDependencyError extends Error {\n constructor(\n public pluginName: string,\n public missingDependency: string\n ) {\n super(\n `Plugin '${pluginName}' depends on '${missingDependency}' which is not loaded`\n );\n this.name = \"PluginDependencyError\";\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { NormalizedSpec } from \"../NormalizedSpec\";\nimport type {\n GeneratorContext,\n PluginConfig,\n PluginContext,\n TypeweaverPlugin,\n} from \"./types\";\n\n/**\n * Base class for typeweaver plugins\n * Provides default implementations and common utilities\n */\nexport abstract class BasePlugin implements TypeweaverPlugin {\n abstract name: string;\n description?: string;\n author?: string;\n depends?: string[];\n\n protected config: PluginConfig;\n\n constructor(config: PluginConfig = {}) {\n this.config = config;\n }\n\n /**\n * Default implementation - override in subclasses if needed\n */\n async initialize(_context: PluginContext): Promise<void> {\n // Default: no initialization needed\n }\n\n /**\n * Default implementation - override in subclasses if needed\n */\n collectResources(normalizedSpec: NormalizedSpec): NormalizedSpec {\n return normalizedSpec;\n }\n\n /**\n * Main generation logic - must be implemented by subclasses\n */\n abstract generate(context: GeneratorContext): Promise<void> | void;\n\n /**\n * Default implementation - override in subclasses if needed\n */\n async finalize(_context: PluginContext): Promise<void> {\n // Default: no finalization needed\n }\n\n protected copyLibFiles(\n context: GeneratorContext,\n libSourceDir: string,\n libNamespace: string\n ): void {\n if (!fs.existsSync(libSourceDir)) return;\n\n const libDir = path.join(context.outputDir, \"lib\", libNamespace);\n\n fs.cpSync(libSourceDir, libDir, { recursive: true });\n\n const libIndexPath = path.join(\"lib\", libNamespace, \"index.ts\");\n if (fs.existsSync(path.join(libDir, \"index.ts\"))) {\n context.addGeneratedFile(libIndexPath);\n }\n }\n}\n","import type { PluginRegistration, TypeweaverPlugin } from \"./types\";\n\nexport type PluginRegistryApi = {\n readonly register: (plugin: TypeweaverPlugin, config?: unknown) => void;\n readonly get: (name: string) => PluginRegistration | undefined;\n readonly getAll: () => PluginRegistration[];\n readonly has: (name: string) => boolean;\n readonly clear: () => void;\n};\n\nexport function createPluginRegistry(): PluginRegistryApi {\n const plugins = new Map<string, PluginRegistration>();\n\n return {\n register: (plugin: TypeweaverPlugin, config?: unknown): void => {\n if (plugins.has(plugin.name)) {\n console.info(\n `Skipping duplicate registration of required plugin: ${plugin.name}`\n );\n return;\n }\n\n const registration: PluginRegistration = {\n name: plugin.name,\n plugin,\n config: config as Record<string, unknown>,\n };\n\n plugins.set(plugin.name, registration);\n console.info(`Registered plugin: ${plugin.name}`);\n },\n get: (name: string) => plugins.get(name),\n getAll: () => Array.from(plugins.values()),\n has: (name: string) => plugins.has(name),\n clear: () => plugins.clear(),\n };\n}\n","import path from \"node:path\";\n\nexport function relative(from: string, to: string): string {\n const relativePath = path.relative(from, to);\n\n if (relativePath.includes(\"node_modules\")) {\n const parts = relativePath.split(path.sep);\n const index = parts.indexOf(\"node_modules\");\n return parts.slice(index + 1).join(\"/\");\n }\n\n const posixPath = relativePath.split(path.sep).join(\"/\");\n\n if (!posixPath.startsWith(\"./\") && !posixPath.startsWith(\"../\")) {\n return `./${posixPath}`;\n }\n\n return posixPath;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport ejs from \"ejs\";\nimport { relative } from \"../helpers/path\";\nimport type { NormalizedResponse, NormalizedSpec } from \"../NormalizedSpec\";\nimport type { GeneratorContext, PluginConfig, PluginContext } from \"./types\";\n\nexport type PluginContextBuilderApi = {\n readonly createPluginContext: (params: {\n outputDir: string;\n inputDir: string;\n config: PluginConfig;\n }) => PluginContext;\n readonly createGeneratorContext: (params: {\n readonly outputDir: string;\n readonly inputDir: string;\n readonly config: PluginConfig;\n readonly normalizedSpec: NormalizedSpec;\n readonly templateDir: string;\n readonly coreDir: string;\n readonly responsesOutputDir: string;\n readonly specOutputDir: string;\n }) => GeneratorContext;\n readonly getGeneratedFiles: () => string[];\n readonly clearGeneratedFiles: () => void;\n};\n\nexport function createPluginContextBuilder(): PluginContextBuilderApi {\n const generatedFiles = new Set<string>();\n\n const createPluginContext = (params: {\n outputDir: string;\n inputDir: string;\n config: PluginConfig;\n }): PluginContext => {\n return {\n outputDir: params.outputDir,\n inputDir: params.inputDir,\n config: params.config,\n };\n };\n\n const createGeneratorContext = (params: {\n readonly outputDir: string;\n readonly inputDir: string;\n readonly config: PluginConfig;\n readonly normalizedSpec: NormalizedSpec;\n readonly templateDir: string;\n readonly coreDir: string;\n readonly responsesOutputDir: string;\n readonly specOutputDir: string;\n }): GeneratorContext => {\n const pluginContext = createPluginContext(params);\n const canonicalResponsesByName = new Map<string, NormalizedResponse>(\n params.normalizedSpec.responses.map(response => [response.name, response])\n );\n\n const getResourceOutputDir = (resourceName: string): string => {\n return path.join(params.outputDir, resourceName);\n };\n\n const getOperationOutputPaths = (config: {\n readonly resourceName: string;\n readonly operationId: string;\n }) => {\n const outputDir = getResourceOutputDir(config.resourceName);\n const requestFileName = `${config.operationId}Request.ts`;\n const responseFileName = `${config.operationId}Response.ts`;\n const requestValidationFileName = `${config.operationId}RequestValidator.ts`;\n const responseValidationFileName = `${config.operationId}ResponseValidator.ts`;\n const clientFileName = `${config.operationId}Client.ts`;\n\n return {\n outputDir,\n requestFile: path.join(outputDir, requestFileName),\n requestFileName,\n responseFile: path.join(outputDir, responseFileName),\n responseFileName,\n requestValidationFile: path.join(outputDir, requestValidationFileName),\n requestValidationFileName,\n responseValidationFile: path.join(\n outputDir,\n responseValidationFileName\n ),\n responseValidationFileName,\n clientFile: path.join(outputDir, clientFileName),\n clientFileName,\n };\n };\n\n const getCanonicalResponse = (responseName: string): NormalizedResponse => {\n const response = canonicalResponsesByName.get(responseName);\n\n if (response === undefined) {\n throw new Error(`Missing canonical response '${responseName}'.`);\n }\n\n return response;\n };\n\n const getCanonicalResponseOutputFile = (responseName: string): string => {\n return path.join(params.responsesOutputDir, `${responseName}Response.ts`);\n };\n\n return {\n ...pluginContext,\n normalizedSpec: params.normalizedSpec,\n templateDir: params.templateDir,\n coreDir: params.coreDir,\n responsesOutputDir: params.responsesOutputDir,\n specOutputDir: params.specOutputDir,\n getCanonicalResponse,\n getCanonicalResponseOutputFile,\n getCanonicalResponseImportPath: config => {\n return relative(\n config.importerDir,\n getCanonicalResponseOutputFile(config.responseName).replace(\n /\\.ts$/,\n \"\"\n )\n );\n },\n getSpecImportPath: config => {\n return relative(\n config.importerDir,\n path.join(params.specOutputDir, \"spec\").replace(/\\.ts$/, \"\")\n );\n },\n getOperationDefinitionAccessor: config => {\n return (\n `getOperationDefinition(` +\n `spec, ` +\n `${JSON.stringify(config.resourceName)}, ` +\n `${JSON.stringify(config.operationId)}` +\n `)`\n );\n },\n getOperationOutputPaths,\n getResourceOutputDir,\n\n writeFile: (relativePath: string, content: string) => {\n const fullPath = path.join(params.outputDir, relativePath);\n const dir = path.dirname(fullPath);\n\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(fullPath, content);\n generatedFiles.add(relativePath);\n\n console.info(`Generated: ${relativePath}`);\n },\n\n renderTemplate: (templatePath: string, data: unknown) => {\n const fullTemplatePath = path.isAbsolute(templatePath)\n ? templatePath\n : path.join(params.templateDir, templatePath);\n\n const template = fs.readFileSync(fullTemplatePath, \"utf8\");\n return ejs.render(template, data as ejs.Data);\n },\n\n addGeneratedFile: (relativePath: string) => {\n generatedFiles.add(relativePath);\n },\n\n getGeneratedFiles: () => {\n return Array.from(generatedFiles);\n },\n };\n };\n\n return {\n createPluginContext,\n createGeneratorContext,\n getGeneratedFiles: () => Array.from(generatedFiles),\n clearGeneratedFiles: () => generatedFiles.clear(),\n };\n}\n","import { HttpMethod } from \"@rexeus/typeweaver-core\";\n\n/**\n * HTTP method priority for route ordering.\n * Lower numbers = higher priority (sorted first).\n */\nconst METHOD_PRIORITY: Record<string, number> = {\n [HttpMethod.GET]: 1,\n [HttpMethod.POST]: 2,\n [HttpMethod.PUT]: 3,\n [HttpMethod.PATCH]: 4,\n [HttpMethod.DELETE]: 5,\n [HttpMethod.OPTIONS]: 6,\n [HttpMethod.HEAD]: 7,\n};\n\n/**\n * Returns the sort priority for an HTTP method.\n * Unrecognized methods default to priority 999.\n */\nexport const getMethodPriority = (method: string): number =>\n METHOD_PRIORITY[method] ?? 999;\n\n/**\n * Compares two path segments for route ordering.\n * Returns negative if a should come before b, positive if after.\n *\n * Order: static segments before parameters, then alphabetically.\n */\nconst comparePathSegments = (a: string, b: string): number => {\n const aIsParam = a.startsWith(\":\");\n const bIsParam = b.startsWith(\":\");\n\n if (aIsParam !== bIsParam) {\n return aIsParam ? 1 : -1;\n }\n\n return a.localeCompare(b);\n};\n\n/**\n * Compares two routes for ordering.\n * Routes are sorted by:\n * 1. Path depth (shallow to deep)\n * 2. Static segments before parameters\n * 3. Alphabetical within same segment type\n * 4. HTTP method priority\n */\nexport const compareRoutes = (\n a: { method: string; path: string },\n b: { method: string; path: string }\n): number => {\n const aSegments = a.path.split(\"/\").filter(Boolean);\n const bSegments = b.path.split(\"/\").filter(Boolean);\n\n if (aSegments.length !== bSegments.length) {\n return aSegments.length - bSegments.length;\n }\n\n for (let i = 0; i < aSegments.length; i++) {\n const cmp = comparePathSegments(aSegments[i]!, bSegments[i]!);\n if (cmp !== 0) {\n return cmp;\n }\n }\n\n return getMethodPriority(a.method) - getMethodPriority(b.method);\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rexeus/typeweaver-gen",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"description": "Template-driven engine that turns structured API definitions into production-ready artifacts. Powered by Typeweaver 🧵✨",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -47,13 +47,15 @@
|
|
|
47
47
|
},
|
|
48
48
|
"homepage": "https://github.com/rexeus/typeweaver#readme",
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"
|
|
50
|
+
"zod": "^4.3.0",
|
|
51
|
+
"@rexeus/typeweaver-core": "^0.9.1"
|
|
51
52
|
},
|
|
52
53
|
"devDependencies": {
|
|
53
|
-
"
|
|
54
|
+
"zod": "^4.3.6",
|
|
55
|
+
"@rexeus/typeweaver-core": "^0.9.1"
|
|
54
56
|
},
|
|
55
57
|
"dependencies": {
|
|
56
|
-
"ejs": "^
|
|
58
|
+
"ejs": "^5.0.1"
|
|
57
59
|
},
|
|
58
60
|
"scripts": {
|
|
59
61
|
"typecheck": "tsc --noEmit",
|