@lssm/lib.contracts-transformers 0.0.0-canary-20251221164004 → 0.0.0-canary-20251221185840
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/openapi/exporter/data-views.js.map +1 -1
- package/dist/openapi/exporter/events.js.map +1 -1
- package/dist/openapi/exporter/features.js.map +1 -1
- package/dist/openapi/exporter/forms.js.map +1 -1
- package/dist/openapi/exporter/operations.d.ts.map +1 -1
- package/dist/openapi/exporter/operations.js.map +1 -1
- package/dist/openapi/exporter/presentations.d.ts.map +1 -1
- package/dist/openapi/exporter/presentations.js.map +1 -1
- package/dist/openapi/exporter/workflows.js.map +1 -1
- package/dist/openapi/exporter.d.ts.map +1 -1
- package/dist/openapi/exporter.js.map +1 -1
- package/dist/openapi/importer/grouping.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-views.js","names":["registrations: string[]"],"sources":["../../../src/openapi/exporter/data-views.ts"],"sourcesContent":["/**\n * Data views exporter - exports DataViewSpec to OpenAPI extensions.\n */\nimport type { DataViewRegistry
|
|
1
|
+
{"version":3,"file":"data-views.js","names":["registrations: string[]"],"sources":["../../../src/openapi/exporter/data-views.ts"],"sourcesContent":["/**\n * Data views exporter - exports DataViewSpec to OpenAPI extensions.\n */\nimport type { DataViewRegistry } from '@lssm/lib.contracts';\nimport type { GeneratedRegistryCode } from '../types';\n\n/**\n * Exported data view structure for OpenAPI extensions.\n */\nexport interface ExportedDataView {\n name: string;\n version: number;\n description?: string;\n stability?: string;\n entity: string;\n kind: 'list' | 'detail' | 'table' | 'grid';\n source: {\n primary: { name: string; version: number };\n item?: { name: string; version: number };\n };\n fields: unknown[];\n}\n\n/**\n * Export data views to OpenAPI extension format.\n */\nexport function exportDataViews(\n registry: DataViewRegistry\n): ExportedDataView[] {\n return registry.list().map((dv) => ({\n name: dv.meta.name,\n version: dv.meta.version,\n description: dv.meta.description,\n stability: dv.meta.stability,\n entity: dv.meta.entity,\n kind: dv.view.kind,\n source: dv.source,\n fields: dv.view.fields,\n }));\n}\n\n/**\n * Generate TypeScript code for data views registry.\n */\nexport function generateDataViewsRegistry(\n registry: DataViewRegistry\n): GeneratedRegistryCode {\n const dataViews = registry.list();\n const imports = new Set<string>();\n const registrations: string[] = [];\n\n for (const dv of dataViews) {\n const dvVarName = dv.meta.name.replace(/\\./g, '_') + `_v${dv.meta.version}`;\n imports.add(\n `import { ${dvVarName} } from './${dv.meta.name.split('.')[0]}';`\n );\n registrations.push(` .register(${dvVarName})`);\n }\n\n const code = `/**\n * Auto-generated data views registry.\n * DO NOT EDIT - This file is generated by ContractSpec exporter.\n */\nimport { DataViewRegistry } from '@lssm/lib.contracts';\n\n${Array.from(imports).join('\\n')}\n\nexport const dataViewsRegistry = new DataViewRegistry()\n${registrations.join('\\n')};\n`;\n\n return {\n code,\n fileName: 'dataviews-registry.ts',\n };\n}\n"],"mappings":";;;;AA0BA,SAAgB,gBACd,UACoB;AACpB,QAAO,SAAS,MAAM,CAAC,KAAK,QAAQ;EAClC,MAAM,GAAG,KAAK;EACd,SAAS,GAAG,KAAK;EACjB,aAAa,GAAG,KAAK;EACrB,WAAW,GAAG,KAAK;EACnB,QAAQ,GAAG,KAAK;EAChB,MAAM,GAAG,KAAK;EACd,QAAQ,GAAG;EACX,QAAQ,GAAG,KAAK;EACjB,EAAE;;;;;AAML,SAAgB,0BACd,UACuB;CACvB,MAAM,YAAY,SAAS,MAAM;CACjC,MAAM,0BAAU,IAAI,KAAa;CACjC,MAAMA,gBAA0B,EAAE;AAElC,MAAK,MAAM,MAAM,WAAW;EAC1B,MAAM,YAAY,GAAG,KAAK,KAAK,QAAQ,OAAO,IAAI,GAAG,KAAK,GAAG,KAAK;AAClE,UAAQ,IACN,YAAY,UAAU,aAAa,GAAG,KAAK,KAAK,MAAM,IAAI,CAAC,GAAG,IAC/D;AACD,gBAAc,KAAK,eAAe,UAAU,GAAG;;AAejD,QAAO;EACL,MAbW;;;;;;EAMb,MAAM,KAAK,QAAQ,CAAC,KAAK,KAAK,CAAC;;;EAG/B,cAAc,KAAK,KAAK,CAAC;;EAKvB,UAAU;EACX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","names":["eventExports: string[]"],"sources":["../../../src/openapi/exporter/events.ts"],"sourcesContent":["/**\n * Events exporter - exports EventSpec to OpenAPI extensions.\n */\nimport type { EventSpec } from '@lssm/lib.contracts';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport { z } from 'zod';\nimport type { GeneratedRegistryCode } from '../types';\n\ntype OpenApiSchemaObject = Record<string, unknown>;\n\n/**\n * Exported event structure for OpenAPI extensions.\n */\nexport interface ExportedEvent {\n name: string;\n version: number;\n description?: string;\n payload: OpenApiSchemaObject | null;\n pii?: string[];\n}\n\n/**\n * Export events to OpenAPI extension format.\n */\nexport function exportEvents(\n events: EventSpec<AnySchemaModel>[]\n): ExportedEvent[] {\n return events.map((event) => ({\n name: event.name,\n version: event.version,\n description: event.description,\n payload: event.payload\n ? (z.toJSONSchema(event.payload.getZod()) as OpenApiSchemaObject)\n : null,\n pii: event.pii,\n }));\n}\n\n/**\n * Generate TypeScript code for events exports.\n */\nexport function generateEventsExports(\n events: EventSpec<AnySchemaModel>[]\n): GeneratedRegistryCode {\n const eventExports: string[] = [];\n\n for (const event of events) {\n const eventVarName = event.name.replace(/\\./g, '_') + `_v${event.version}`;\n eventExports.push(`export { ${eventVarName} } from './${event.name.split('.')[0]}'
|
|
1
|
+
{"version":3,"file":"events.js","names":["eventExports: string[]"],"sources":["../../../src/openapi/exporter/events.ts"],"sourcesContent":["/**\n * Events exporter - exports EventSpec to OpenAPI extensions.\n */\nimport type { EventSpec } from '@lssm/lib.contracts';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport { z } from 'zod';\nimport type { GeneratedRegistryCode } from '../types';\n\ntype OpenApiSchemaObject = Record<string, unknown>;\n\n/**\n * Exported event structure for OpenAPI extensions.\n */\nexport interface ExportedEvent {\n name: string;\n version: number;\n description?: string;\n payload: OpenApiSchemaObject | null;\n pii?: string[];\n}\n\n/**\n * Export events to OpenAPI extension format.\n */\nexport function exportEvents(\n events: EventSpec<AnySchemaModel>[]\n): ExportedEvent[] {\n return events.map((event) => ({\n name: event.name,\n version: event.version,\n description: event.description,\n payload: event.payload\n ? (z.toJSONSchema(event.payload.getZod()) as OpenApiSchemaObject)\n : null,\n pii: event.pii,\n }));\n}\n\n/**\n * Generate TypeScript code for events exports.\n */\nexport function generateEventsExports(\n events: EventSpec<AnySchemaModel>[]\n): GeneratedRegistryCode {\n const eventExports: string[] = [];\n\n for (const event of events) {\n const eventVarName = event.name.replace(/\\./g, '_') + `_v${event.version}`;\n eventExports.push(\n `export { ${eventVarName} } from './${event.name.split('.')[0]}';`\n );\n }\n\n const code = `/**\n * Auto-generated events exports.\n * DO NOT EDIT - This file is generated by ContractSpec exporter.\n */\n\n${eventExports.join('\\n')}\n`;\n\n return {\n code,\n fileName: 'events-exports.ts',\n };\n}\n"],"mappings":";;;;;;AAwBA,SAAgB,aACd,QACiB;AACjB,QAAO,OAAO,KAAK,WAAW;EAC5B,MAAM,MAAM;EACZ,SAAS,MAAM;EACf,aAAa,MAAM;EACnB,SAAS,MAAM,UACV,EAAE,aAAa,MAAM,QAAQ,QAAQ,CAAC,GACvC;EACJ,KAAK,MAAM;EACZ,EAAE;;;;;AAML,SAAgB,sBACd,QACuB;CACvB,MAAMA,eAAyB,EAAE;AAEjC,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,eAAe,MAAM,KAAK,QAAQ,OAAO,IAAI,GAAG,KAAK,MAAM;AACjE,eAAa,KACX,YAAY,aAAa,aAAa,MAAM,KAAK,MAAM,IAAI,CAAC,GAAG,IAChE;;AAWH,QAAO;EACL,MATW;;;;;EAKb,aAAa,KAAK,KAAK,CAAC;;EAKtB,UAAU;EACX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features.js","names":["registrations: string[]"],"sources":["../../../src/openapi/exporter/features.ts"],"sourcesContent":["/**\n * Features exporter - exports FeatureModuleSpec to OpenAPI extensions.\n */\nimport type {
|
|
1
|
+
{"version":3,"file":"features.js","names":["registrations: string[]"],"sources":["../../../src/openapi/exporter/features.ts"],"sourcesContent":["/**\n * Features exporter - exports FeatureModuleSpec to OpenAPI extensions.\n */\nimport type { FeatureRegistry } from '@lssm/lib.contracts';\nimport type { GeneratedRegistryCode } from '../types';\n\n/**\n * Exported feature structure for OpenAPI extensions.\n */\nexport interface ExportedFeature {\n key: string;\n description?: string;\n owners?: string[];\n stability?: string;\n operations?: { name: string; version: number }[];\n events?: { name: string; version: number }[];\n presentations?: { name: string; version: number }[];\n}\n\n/**\n * Export features to OpenAPI extension format.\n */\nexport function exportFeatures(registry: FeatureRegistry): ExportedFeature[] {\n return registry.list().map((feature) => ({\n key: feature.meta.key,\n description: feature.meta.description,\n owners: feature.meta.owners,\n stability: feature.meta.stability,\n operations: feature.operations,\n events: feature.events,\n presentations: feature.presentations,\n }));\n}\n\n/**\n * Generate TypeScript code for features registry.\n */\nexport function generateFeaturesRegistry(\n registry: FeatureRegistry\n): GeneratedRegistryCode {\n const features = registry.list();\n const imports = new Set<string>();\n const registrations: string[] = [];\n\n for (const feature of features) {\n const featureVarName = feature.meta.key.replace(/-/g, '_');\n imports.add(`import { ${featureVarName} } from './${feature.meta.key}';`);\n registrations.push(` .register(${featureVarName})`);\n }\n\n const code = `/**\n * Auto-generated features registry.\n * DO NOT EDIT - This file is generated by ContractSpec exporter.\n */\nimport { FeatureRegistry } from '@lssm/lib.contracts';\n\n${Array.from(imports).join('\\n')}\n\nexport const featuresRegistry = new FeatureRegistry()\n${registrations.join('\\n')};\n`;\n\n return {\n code,\n fileName: 'features-registry.ts',\n };\n}\n"],"mappings":";;;;AAsBA,SAAgB,eAAe,UAA8C;AAC3E,QAAO,SAAS,MAAM,CAAC,KAAK,aAAa;EACvC,KAAK,QAAQ,KAAK;EAClB,aAAa,QAAQ,KAAK;EAC1B,QAAQ,QAAQ,KAAK;EACrB,WAAW,QAAQ,KAAK;EACxB,YAAY,QAAQ;EACpB,QAAQ,QAAQ;EAChB,eAAe,QAAQ;EACxB,EAAE;;;;;AAML,SAAgB,yBACd,UACuB;CACvB,MAAM,WAAW,SAAS,MAAM;CAChC,MAAM,0BAAU,IAAI,KAAa;CACjC,MAAMA,gBAA0B,EAAE;AAElC,MAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,iBAAiB,QAAQ,KAAK,IAAI,QAAQ,MAAM,IAAI;AAC1D,UAAQ,IAAI,YAAY,eAAe,aAAa,QAAQ,KAAK,IAAI,IAAI;AACzE,gBAAc,KAAK,eAAe,eAAe,GAAG;;AAetD,QAAO;EACL,MAbW;;;;;;EAMb,MAAM,KAAK,QAAQ,CAAC,KAAK,KAAK,CAAC;;;EAG/B,cAAc,KAAK,KAAK,CAAC;;EAKvB,UAAU;EACX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forms.js","names":["registrations: string[]"],"sources":["../../../src/openapi/exporter/forms.ts"],"sourcesContent":["/**\n * Forms exporter - exports FormSpec to OpenAPI extensions.\n */\nimport type { FormRegistry
|
|
1
|
+
{"version":3,"file":"forms.js","names":["registrations: string[]"],"sources":["../../../src/openapi/exporter/forms.ts"],"sourcesContent":["/**\n * Forms exporter - exports FormSpec to OpenAPI extensions.\n */\nimport type { FormRegistry } from '@lssm/lib.contracts';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport { z } from 'zod';\nimport type { GeneratedRegistryCode } from '../types';\n\ntype OpenApiSchemaObject = Record<string, unknown>;\n\n/**\n * Exported form structure for OpenAPI extensions.\n */\nexport interface ExportedForm {\n key: string;\n version: number;\n description?: string;\n stability?: string;\n owners?: string[];\n fields: unknown[];\n model: OpenApiSchemaObject | null;\n actions?: unknown[];\n}\n\n/**\n * Export forms to OpenAPI extension format.\n */\nexport function exportForms(registry: FormRegistry): ExportedForm[] {\n return registry.list().map((form) => ({\n key: form.meta.key,\n version: form.meta.version,\n description: form.meta.description,\n stability: form.meta.stability,\n owners: form.meta.owners,\n fields: form.fields,\n model: form.model\n ? (z.toJSONSchema(\n (form.model as AnySchemaModel).getZod()\n ) as OpenApiSchemaObject)\n : null,\n actions: form.actions,\n }));\n}\n\n/**\n * Generate TypeScript code for forms registry.\n */\nexport function generateFormsRegistry(\n registry: FormRegistry\n): GeneratedRegistryCode {\n const forms = registry.list();\n const imports = new Set<string>();\n const registrations: string[] = [];\n\n for (const form of forms) {\n const formVarName =\n form.meta.key.replace(/-/g, '_') + `_v${form.meta.version}`;\n imports.add(`import { ${formVarName} } from './${form.meta.key}';`);\n registrations.push(` .register(${formVarName})`);\n }\n\n const code = `/**\n * Auto-generated forms registry.\n * DO NOT EDIT - This file is generated by ContractSpec exporter.\n */\nimport { FormRegistry } from '@lssm/lib.contracts';\n\n${Array.from(imports).join('\\n')}\n\nexport const formsRegistry = new FormRegistry()\n${registrations.join('\\n')};\n`;\n\n return {\n code,\n fileName: 'forms-registry.ts',\n };\n}\n"],"mappings":";;;;;;AA2BA,SAAgB,YAAY,UAAwC;AAClE,QAAO,SAAS,MAAM,CAAC,KAAK,UAAU;EACpC,KAAK,KAAK,KAAK;EACf,SAAS,KAAK,KAAK;EACnB,aAAa,KAAK,KAAK;EACvB,WAAW,KAAK,KAAK;EACrB,QAAQ,KAAK,KAAK;EAClB,QAAQ,KAAK;EACb,OAAO,KAAK,QACP,EAAE,aACA,KAAK,MAAyB,QAAQ,CACxC,GACD;EACJ,SAAS,KAAK;EACf,EAAE;;;;;AAML,SAAgB,sBACd,UACuB;CACvB,MAAM,QAAQ,SAAS,MAAM;CAC7B,MAAM,0BAAU,IAAI,KAAa;CACjC,MAAMA,gBAA0B,EAAE;AAElC,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,cACJ,KAAK,KAAK,IAAI,QAAQ,MAAM,IAAI,GAAG,KAAK,KAAK,KAAK;AACpD,UAAQ,IAAI,YAAY,YAAY,aAAa,KAAK,KAAK,IAAI,IAAI;AACnE,gBAAc,KAAK,eAAe,YAAY,GAAG;;AAenD,QAAO;EACL,MAbW;;;;;;EAMb,MAAM,KAAK,QAAQ,CAAC,KAAK,KAAK,CAAC;;;EAG/B,cAAc,KAAK,KAAK,CAAC;;EAKvB,UAAU;EACX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.d.ts","names":[],"sources":["../../../src/openapi/exporter/operations.ts"],"sourcesContent":[],"mappings":";;;;;;AAiBA,KALK,mBAAA,GAAsB,MAKE,CAAA,MAAA,EAAA,OAAA,CAAA;AAO7B;AAWA;AAWA;AAOgB,iBApCA,aAAA,CAoCiB,IAAA,EAAA,MAAgB,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAUjD;AAKC;AAkBD;AACsB,iBA/DN,YAAA,CA+DM,MAAA,EAAA,OAAA,GAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;AACL,iBArDD,YAAA,CAqDC,IAAA,EAAA,SAAA,GAAA,OAAA,EAAA,QAAA,CAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EAAA,MAAA;AAkBjB;;;AAE0B,iBA9DV,eAAA,CA8DU,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;AAM1B;
|
|
1
|
+
{"version":3,"file":"operations.d.ts","names":[],"sources":["../../../src/openapi/exporter/operations.ts"],"sourcesContent":[],"mappings":";;;;;;AAiBA,KALK,mBAAA,GAAsB,MAKE,CAAA,MAAA,EAAA,OAAA,CAAA;AAO7B;AAWA;AAWA;AAOgB,iBApCA,aAAA,CAoCiB,IAAA,EAAA,MAAgB,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAUjD;AAKC;AAkBD;AACsB,iBA/DN,YAAA,CA+DM,MAAA,EAAA,OAAA,GAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;AACL,iBArDD,YAAA,CAqDC,IAAA,EAAA,SAAA,GAAA,OAAA,EAAA,QAAA,CAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EAAA,MAAA;AAkBjB;;;AAE0B,iBA9DV,eAAA,CA8DU,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;AAM1B;AAwFgB,iBArJA,UAAA,CAqJ0B,IAAA,EArJT,gBAsJrB,CAAA,EAAA,MAAA;;;;iBA5II,uBAAA,SACN,wBACP;UAKO,cAAA;SACD;UACC;;;;;;;;;;;;;iBAcM,iBAAA,OACR,cAAc,gBAAgB,kBACnC;;;;UAkBc,sBAAA;SACR,eAAe;WACb,eAAe;;;;;iBAMV,gBAAA,WACJ,wBACT;;;;iBAsFa,0BAAA,WACJ,wBACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.js","names":["paths: Record<string, Record<string, unknown>>","schemas: Record<string, OpenApiSchemaObject>","op: Record<string, unknown>","responses: Record<string, unknown>","registrations: string[]"],"sources":["../../../src/openapi/exporter/operations.ts"],"sourcesContent":["/**\n * Operations exporter - exports OperationSpec to OpenAPI paths.\n */\nimport type {\n AnyOperationSpec,\n OperationSpec,\n OperationSpecRegistry,\n} from '@lssm/lib.contracts';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport { z } from 'zod';\nimport type { GeneratedRegistryCode } from '../types';\n\ntype OpenApiSchemaObject = Record<string, unknown>;\n\n/**\n * Convert a spec name and version to an operationId.\n */\nexport function toOperationId(name: string, version: number): string {\n return `${name.replace(/\\./g, '_')}_v${version}`;\n}\n\n/**\n * Convert a spec name and version to a schema name.\n */\nexport function toSchemaName(\n prefix: 'Input' | 'Output',\n name: string,\n version: number\n): string {\n return `${prefix}_${toOperationId(name, version)}`;\n}\n\n/**\n * Determine HTTP method from spec kind and override.\n */\nexport function toHttpMethod(\n kind: 'command' | 'query',\n override?: 'GET' | 'POST'\n): string {\n const method = override ?? (kind === 'query' ? 'GET' : 'POST');\n return method.toLowerCase();\n}\n\n/**\n * Generate default REST path from spec name and version.\n */\nexport function defaultRestPath(name: string, version: number): string {\n return `/${name.replace(/\\./g, '/')}/v${version}`;\n}\n\n/**\n * Get REST path from spec, using transport override or default.\n */\nexport function toRestPath(spec: AnyOperationSpec): string {\n const path =\n spec.transport?.rest?.path ??\n defaultRestPath(spec.meta.name, spec.meta.version);\n return path.startsWith('/') ? path : `/${path}`;\n}\n\n/**\n * Convert a SchemaModel to JSON Schema using Zod.\n */\nexport function schemaModelToJsonSchema(\n schema: AnySchemaModel | null\n): OpenApiSchemaObject | null {\n if (!schema) return null;\n return z.toJSONSchema(schema.getZod()) as OpenApiSchemaObject;\n}\n\ninterface SpecJsonSchema {\n input: OpenApiSchemaObject | null;\n output: OpenApiSchemaObject | null;\n meta: {\n name: string;\n version: number;\n kind: 'command' | 'query';\n description: string;\n tags: string[];\n stability: string;\n };\n}\n\n/**\n * Extract JSON Schema for a spec's input and output.\n */\nexport function jsonSchemaForSpec(\n spec: OperationSpec<AnySchemaModel, AnySchemaModel>\n): SpecJsonSchema {\n return {\n input: schemaModelToJsonSchema(spec.io.input),\n output: schemaModelToJsonSchema(spec.io.output as AnySchemaModel | null),\n meta: {\n name: spec.meta.name,\n version: spec.meta.version,\n kind: spec.meta.kind,\n description: spec.meta.description,\n tags: spec.meta.tags ?? [],\n stability: spec.meta.stability ?? 'stable',\n },\n };\n}\n\n/**\n * Result of exporting operations to OpenAPI format.\n */\nexport interface OperationsExportResult {\n paths: Record<string, Record<string, unknown>>;\n schemas: Record<string, OpenApiSchemaObject>;\n}\n\n/**\n * Export operations from a registry to OpenAPI paths and schemas.\n */\nexport function exportOperations(\n registry: OperationSpecRegistry\n): OperationsExportResult {\n const specs = registry\n .listSpecs()\n .filter(\n (s): s is AnyOperationSpec =>\n s.meta.kind === 'command' || s.meta.kind === 'query'\n )\n .slice()\n .sort((a, b) => {\n const byName = a.meta.name.localeCompare(b.meta.name);\n return byName !== 0 ? byName : a.meta.version - b.meta.version;\n });\n\n const paths: Record<string, Record<string, unknown>> = {};\n const schemas: Record<string, OpenApiSchemaObject> = {};\n\n for (const spec of specs) {\n const schema = jsonSchemaForSpec(\n spec as unknown as OperationSpec<AnySchemaModel, AnySchemaModel>\n );\n const method = toHttpMethod(spec.meta.kind, spec.transport?.rest?.method);\n const path = toRestPath(spec);\n\n const operationId = toOperationId(spec.meta.name, spec.meta.version);\n\n const pathItem = (paths[path] ??= {});\n const op: Record<string, unknown> = {\n operationId,\n summary: spec.meta.description ?? spec.meta.name,\n description: spec.meta.description,\n tags: spec.meta.tags ?? [],\n 'x-contractspec': {\n name: spec.meta.name,\n version: spec.meta.version,\n kind: spec.meta.kind,\n },\n responses: {},\n };\n\n if (schema.input) {\n const inputName = toSchemaName('Input'
|
|
1
|
+
{"version":3,"file":"operations.js","names":["paths: Record<string, Record<string, unknown>>","schemas: Record<string, OpenApiSchemaObject>","op: Record<string, unknown>","responses: Record<string, unknown>","registrations: string[]"],"sources":["../../../src/openapi/exporter/operations.ts"],"sourcesContent":["/**\n * Operations exporter - exports OperationSpec to OpenAPI paths.\n */\nimport type {\n AnyOperationSpec,\n OperationSpec,\n OperationSpecRegistry,\n} from '@lssm/lib.contracts';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport { z } from 'zod';\nimport type { GeneratedRegistryCode } from '../types';\n\ntype OpenApiSchemaObject = Record<string, unknown>;\n\n/**\n * Convert a spec name and version to an operationId.\n */\nexport function toOperationId(name: string, version: number): string {\n return `${name.replace(/\\./g, '_')}_v${version}`;\n}\n\n/**\n * Convert a spec name and version to a schema name.\n */\nexport function toSchemaName(\n prefix: 'Input' | 'Output',\n name: string,\n version: number\n): string {\n return `${prefix}_${toOperationId(name, version)}`;\n}\n\n/**\n * Determine HTTP method from spec kind and override.\n */\nexport function toHttpMethod(\n kind: 'command' | 'query',\n override?: 'GET' | 'POST'\n): string {\n const method = override ?? (kind === 'query' ? 'GET' : 'POST');\n return method.toLowerCase();\n}\n\n/**\n * Generate default REST path from spec name and version.\n */\nexport function defaultRestPath(name: string, version: number): string {\n return `/${name.replace(/\\./g, '/')}/v${version}`;\n}\n\n/**\n * Get REST path from spec, using transport override or default.\n */\nexport function toRestPath(spec: AnyOperationSpec): string {\n const path =\n spec.transport?.rest?.path ??\n defaultRestPath(spec.meta.name, spec.meta.version);\n return path.startsWith('/') ? path : `/${path}`;\n}\n\n/**\n * Convert a SchemaModel to JSON Schema using Zod.\n */\nexport function schemaModelToJsonSchema(\n schema: AnySchemaModel | null\n): OpenApiSchemaObject | null {\n if (!schema) return null;\n return z.toJSONSchema(schema.getZod()) as OpenApiSchemaObject;\n}\n\ninterface SpecJsonSchema {\n input: OpenApiSchemaObject | null;\n output: OpenApiSchemaObject | null;\n meta: {\n name: string;\n version: number;\n kind: 'command' | 'query';\n description: string;\n tags: string[];\n stability: string;\n };\n}\n\n/**\n * Extract JSON Schema for a spec's input and output.\n */\nexport function jsonSchemaForSpec(\n spec: OperationSpec<AnySchemaModel, AnySchemaModel>\n): SpecJsonSchema {\n return {\n input: schemaModelToJsonSchema(spec.io.input),\n output: schemaModelToJsonSchema(spec.io.output as AnySchemaModel | null),\n meta: {\n name: spec.meta.name,\n version: spec.meta.version,\n kind: spec.meta.kind,\n description: spec.meta.description,\n tags: spec.meta.tags ?? [],\n stability: spec.meta.stability ?? 'stable',\n },\n };\n}\n\n/**\n * Result of exporting operations to OpenAPI format.\n */\nexport interface OperationsExportResult {\n paths: Record<string, Record<string, unknown>>;\n schemas: Record<string, OpenApiSchemaObject>;\n}\n\n/**\n * Export operations from a registry to OpenAPI paths and schemas.\n */\nexport function exportOperations(\n registry: OperationSpecRegistry\n): OperationsExportResult {\n const specs = registry\n .listSpecs()\n .filter(\n (s): s is AnyOperationSpec =>\n s.meta.kind === 'command' || s.meta.kind === 'query'\n )\n .slice()\n .sort((a, b) => {\n const byName = a.meta.name.localeCompare(b.meta.name);\n return byName !== 0 ? byName : a.meta.version - b.meta.version;\n });\n\n const paths: Record<string, Record<string, unknown>> = {};\n const schemas: Record<string, OpenApiSchemaObject> = {};\n\n for (const spec of specs) {\n const schema = jsonSchemaForSpec(\n spec as unknown as OperationSpec<AnySchemaModel, AnySchemaModel>\n );\n const method = toHttpMethod(spec.meta.kind, spec.transport?.rest?.method);\n const path = toRestPath(spec);\n\n const operationId = toOperationId(spec.meta.name, spec.meta.version);\n\n const pathItem = (paths[path] ??= {});\n const op: Record<string, unknown> = {\n operationId,\n summary: spec.meta.description ?? spec.meta.name,\n description: spec.meta.description,\n tags: spec.meta.tags ?? [],\n 'x-contractspec': {\n name: spec.meta.name,\n version: spec.meta.version,\n kind: spec.meta.kind,\n },\n responses: {},\n };\n\n if (schema.input) {\n const inputName = toSchemaName(\n 'Input',\n spec.meta.name,\n spec.meta.version\n );\n schemas[inputName] = schema.input;\n op['requestBody'] = {\n required: true,\n content: {\n 'application/json': {\n schema: { $ref: `#/components/schemas/${inputName}` },\n },\n },\n };\n }\n\n const responses: Record<string, unknown> = {};\n if (schema.output) {\n const outputName = toSchemaName(\n 'Output',\n spec.meta.name,\n spec.meta.version\n );\n schemas[outputName] = schema.output;\n responses['200'] = {\n description: 'OK',\n content: {\n 'application/json': {\n schema: { $ref: `#/components/schemas/${outputName}` },\n },\n },\n };\n } else {\n responses['200'] = { description: 'OK' };\n }\n op['responses'] = responses;\n\n pathItem[method] = op;\n }\n\n return { paths, schemas };\n}\n\n/**\n * Generate TypeScript code for operations registry.\n */\nexport function generateOperationsRegistry(\n registry: OperationSpecRegistry\n): GeneratedRegistryCode {\n const specs = registry.listSpecs();\n\n const imports = new Set<string>();\n const registrations: string[] = [];\n\n for (const spec of specs) {\n const specVarName =\n spec.meta.name.replace(/\\./g, '_') + `_v${spec.meta.version}`;\n imports.add(\n `import { ${specVarName} } from './${spec.meta.name.split('.')[0]}';`\n );\n registrations.push(` .register(${specVarName})`);\n }\n\n const code = `/**\n * Auto-generated operations registry.\n * DO NOT EDIT - This file is generated by ContractSpec exporter.\n */\nimport { OperationSpecRegistry } from '@lssm/lib.contracts';\n\n${Array.from(imports).join('\\n')}\n\nexport const operationsRegistry = new OperationSpecRegistry()\n${registrations.join('\\n')};\n`;\n\n return {\n code,\n fileName: 'operations-registry.ts',\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentations.d.ts","names":[],"sources":["../../../src/openapi/exporter/presentations.ts"],"sourcesContent":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"presentations.d.ts","names":[],"sources":["../../../src/openapi/exporter/presentations.ts"],"sourcesContent":[],"mappings":";;;;;AAwBA;AAgBA;AAWA;AAegB,UAtDC,oBAAA,CAsDkB;EACvB,IAAA,EAAA,MAAA;EACM,OAAA,EAAA,MAAA;EAEZ,WAAA,CAAA,EAAA,MAAA;EACA,SAAA,CAAA,EAAA,MAAA;EAAsB,IAAA,EAAA,eAAA,GAAA,UAAA,GAAA,MAAA;EAWZ,IAAA,CAAA,EAAA,MAAA,EAAA;;;;;iBA1DA,qBAAA,WACJ,uBACT;;;;UAcc,sBAAA;;;;;;;;;;iBAWD,qBAAA,cACD,6BACZ;;;;iBAaa,mBAAA,WACJ,sCACM;MAEZ;MACA;;;;;iBAWU,6BAAA,WACJ,uBACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentations.js","names":["registrations: string[]"],"sources":["../../../src/openapi/exporter/presentations.ts"],"sourcesContent":["/**\n * Presentations exporter - exports PresentationSpec to OpenAPI extensions.\n */\nimport type {\n
|
|
1
|
+
{"version":3,"file":"presentations.js","names":["registrations: string[]"],"sources":["../../../src/openapi/exporter/presentations.ts"],"sourcesContent":["/**\n * Presentations exporter - exports PresentationSpec to OpenAPI extensions.\n */\nimport type {\n PresentationDescriptorV2,\n PresentationRegistry,\n} from '@lssm/lib.contracts';\nimport type { GeneratedRegistryCode } from '../types';\n\n/**\n * Exported presentation structure for OpenAPI extensions.\n */\nexport interface ExportedPresentation {\n name: string;\n version: number;\n description?: string;\n stability?: string;\n kind: 'web_component' | 'markdown' | 'data';\n tags?: string[];\n}\n\n/**\n * Export presentations (V1) to OpenAPI extension format.\n */\nexport function exportPresentationsV1(\n registry: PresentationRegistry\n): ExportedPresentation[] {\n return registry.list().map((pres) => ({\n name: pres.meta.name,\n version: pres.meta.version,\n description: pres.meta.description,\n stability: pres.meta.stability,\n kind: pres.content.kind,\n tags: pres.meta.tags,\n }));\n}\n\n/**\n * Exported V2 presentation structure for OpenAPI extensions.\n */\nexport interface ExportedPresentationV2 {\n name: string;\n version: number;\n description?: string;\n targets: string[];\n sourceType: string;\n}\n\n/**\n * Export presentations (V2) to OpenAPI extension format.\n */\nexport function exportPresentationsV2(\n descriptors: PresentationDescriptorV2[]\n): ExportedPresentationV2[] {\n return descriptors.map((desc) => ({\n name: desc.meta.name,\n version: desc.meta.version,\n description: desc.meta.description,\n targets: desc.targets,\n sourceType: desc.source.type,\n }));\n}\n\n/**\n * Combined presentations export.\n */\nexport function exportPresentations(\n registry: PresentationRegistry,\n v2Descriptors?: PresentationDescriptorV2[]\n): {\n v1: ExportedPresentation[];\n v2: ExportedPresentationV2[];\n} {\n return {\n v1: exportPresentationsV1(registry),\n v2: v2Descriptors ? exportPresentationsV2(v2Descriptors) : [],\n };\n}\n\n/**\n * Generate TypeScript code for presentations registry.\n */\nexport function generatePresentationsRegistry(\n registry: PresentationRegistry\n): GeneratedRegistryCode {\n const presentations = registry.list();\n const imports = new Set<string>();\n const registrations: string[] = [];\n\n for (const pres of presentations) {\n const presVarName =\n pres.meta.name.replace(/\\./g, '_') + `_v${pres.meta.version}`;\n imports.add(\n `import { ${presVarName} } from './${pres.meta.name.split('.')[0]}';`\n );\n registrations.push(` .register(${presVarName})`);\n }\n\n const code = `/**\n * Auto-generated presentations registry.\n * DO NOT EDIT - This file is generated by ContractSpec exporter.\n */\nimport { PresentationRegistry } from '@lssm/lib.contracts';\n\n${Array.from(imports).join('\\n')}\n\nexport const presentationsRegistry = new PresentationRegistry()\n${registrations.join('\\n')};\n`;\n\n return {\n code,\n fileName: 'presentations-registry.ts',\n };\n}\n"],"mappings":";;;;AAwBA,SAAgB,sBACd,UACwB;AACxB,QAAO,SAAS,MAAM,CAAC,KAAK,UAAU;EACpC,MAAM,KAAK,KAAK;EAChB,SAAS,KAAK,KAAK;EACnB,aAAa,KAAK,KAAK;EACvB,WAAW,KAAK,KAAK;EACrB,MAAM,KAAK,QAAQ;EACnB,MAAM,KAAK,KAAK;EACjB,EAAE;;;;;AAiBL,SAAgB,sBACd,aAC0B;AAC1B,QAAO,YAAY,KAAK,UAAU;EAChC,MAAM,KAAK,KAAK;EAChB,SAAS,KAAK,KAAK;EACnB,aAAa,KAAK,KAAK;EACvB,SAAS,KAAK;EACd,YAAY,KAAK,OAAO;EACzB,EAAE;;;;;AAML,SAAgB,oBACd,UACA,eAIA;AACA,QAAO;EACL,IAAI,sBAAsB,SAAS;EACnC,IAAI,gBAAgB,sBAAsB,cAAc,GAAG,EAAE;EAC9D;;;;;AAMH,SAAgB,8BACd,UACuB;CACvB,MAAM,gBAAgB,SAAS,MAAM;CACrC,MAAM,0BAAU,IAAI,KAAa;CACjC,MAAMA,gBAA0B,EAAE;AAElC,MAAK,MAAM,QAAQ,eAAe;EAChC,MAAM,cACJ,KAAK,KAAK,KAAK,QAAQ,OAAO,IAAI,GAAG,KAAK,KAAK,KAAK;AACtD,UAAQ,IACN,YAAY,YAAY,aAAa,KAAK,KAAK,KAAK,MAAM,IAAI,CAAC,GAAG,IACnE;AACD,gBAAc,KAAK,eAAe,YAAY,GAAG;;AAenD,QAAO;EACL,MAbW;;;;;;EAMb,MAAM,KAAK,QAAQ,CAAC,KAAK,KAAK,CAAC;;;EAG/B,cAAc,KAAK,KAAK,CAAC;;EAKvB,UAAU;EACX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows.js","names":["registrations: string[]"],"sources":["../../../src/openapi/exporter/workflows.ts"],"sourcesContent":["/**\n * Workflows exporter - exports WorkflowSpec to OpenAPI extensions.\n */\nimport type { WorkflowRegistry
|
|
1
|
+
{"version":3,"file":"workflows.js","names":["registrations: string[]"],"sources":["../../../src/openapi/exporter/workflows.ts"],"sourcesContent":["/**\n * Workflows exporter - exports WorkflowSpec to OpenAPI extensions.\n */\nimport type { WorkflowRegistry } from '@lssm/lib.contracts';\nimport type { GeneratedRegistryCode } from '../types';\n\n/**\n * Exported workflow structure for OpenAPI extensions.\n */\nexport interface ExportedWorkflow {\n name: string;\n version: number;\n description?: string;\n stability?: string;\n owners?: string[];\n steps: {\n id: string;\n type: 'human' | 'automation' | 'decision';\n label: string;\n }[];\n transitions: {\n from: string;\n to: string;\n label?: string;\n }[];\n}\n\n/**\n * Export workflows to OpenAPI extension format.\n */\nexport function exportWorkflows(\n registry: WorkflowRegistry\n): ExportedWorkflow[] {\n return registry.list().map((wf) => ({\n name: wf.meta.name,\n version: wf.meta.version,\n description: wf.meta.description,\n stability: wf.meta.stability,\n owners: wf.meta.owners,\n steps: wf.definition.steps.map((s) => ({\n id: s.id,\n type: s.type,\n label: s.label,\n })),\n transitions: wf.definition.transitions.map((t) => ({\n from: t.from,\n to: t.to,\n label: t.label,\n })),\n }));\n}\n\n/**\n * Generate TypeScript code for workflows registry.\n */\nexport function generateWorkflowsRegistry(\n registry: WorkflowRegistry\n): GeneratedRegistryCode {\n const workflows = registry.list();\n const imports = new Set<string>();\n const registrations: string[] = [];\n\n for (const wf of workflows) {\n const wfVarName = wf.meta.name.replace(/\\./g, '_') + `_v${wf.meta.version}`;\n imports.add(\n `import { ${wfVarName} } from './${wf.meta.name.split('.')[0]}';`\n );\n registrations.push(` .register(${wfVarName})`);\n }\n\n const code = `/**\n * Auto-generated workflows registry.\n * DO NOT EDIT - This file is generated by ContractSpec exporter.\n */\nimport { WorkflowRegistry } from '@lssm/lib.contracts';\n\n${Array.from(imports).join('\\n')}\n\nexport const workflowsRegistry = new WorkflowRegistry()\n${registrations.join('\\n')};\n`;\n\n return {\n code,\n fileName: 'workflows-registry.ts',\n };\n}\n"],"mappings":";;;;AA8BA,SAAgB,gBACd,UACoB;AACpB,QAAO,SAAS,MAAM,CAAC,KAAK,QAAQ;EAClC,MAAM,GAAG,KAAK;EACd,SAAS,GAAG,KAAK;EACjB,aAAa,GAAG,KAAK;EACrB,WAAW,GAAG,KAAK;EACnB,QAAQ,GAAG,KAAK;EAChB,OAAO,GAAG,WAAW,MAAM,KAAK,OAAO;GACrC,IAAI,EAAE;GACN,MAAM,EAAE;GACR,OAAO,EAAE;GACV,EAAE;EACH,aAAa,GAAG,WAAW,YAAY,KAAK,OAAO;GACjD,MAAM,EAAE;GACR,IAAI,EAAE;GACN,OAAO,EAAE;GACV,EAAE;EACJ,EAAE;;;;;AAML,SAAgB,0BACd,UACuB;CACvB,MAAM,YAAY,SAAS,MAAM;CACjC,MAAM,0BAAU,IAAI,KAAa;CACjC,MAAMA,gBAA0B,EAAE;AAElC,MAAK,MAAM,MAAM,WAAW;EAC1B,MAAM,YAAY,GAAG,KAAK,KAAK,QAAQ,OAAO,IAAI,GAAG,KAAK,GAAG,KAAK;AAClE,UAAQ,IACN,YAAY,UAAU,aAAa,GAAG,KAAK,KAAK,MAAM,IAAI,CAAC,GAAG,IAC/D;AACD,gBAAc,KAAK,eAAe,UAAU,GAAG;;AAejD,QAAO;EACL,MAbW;;;;;;EAMb,MAAM,KAAK,QAAQ,CAAC,KAAK,KAAK,CAAC;;;EAG/B,cAAc,KAAK,KAAK,CAAC;;EAKvB,UAAU;EACX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exporter.d.ts","names":[],"sources":["../../src/openapi/exporter.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAmDkB,UAJD,sBAAA,CAIC;EACE,UAAA,CAAA,EAJL,qBAIK;EACV,MAAA,CAAA,EAJC,SAID,CAJW,cAIX,CAAA,EAAA;EACI,QAAA,CAAA,EAJD,eAIC;EACA,aAAA,CAAA,EAJI,oBAIJ;EAAgB,eAAA,CAAA,EAHV,wBAGU,EAAA;EAUd,KAAA,CAAA,EAZN,YAYM;EACJ,SAAA,CAAA,EAZE,gBAYF;EACD,SAAA,CAAA,EAZG,gBAYH;;AAoBX;;;;AAG2B,iBAzBX,kBAAA,CAyBW,QAAA,EAxBf,qBAwBe,EAAA,OAAA,CAAA,EAvBhB,oBAuBgB,CAAA,EAtBxB,2BAsBwB;
|
|
1
|
+
{"version":3,"file":"exporter.d.ts","names":[],"sources":["../../src/openapi/exporter.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAmDkB,UAJD,sBAAA,CAIC;EACE,UAAA,CAAA,EAJL,qBAIK;EACV,MAAA,CAAA,EAJC,SAID,CAJW,cAIX,CAAA,EAAA;EACI,QAAA,CAAA,EAJD,eAIC;EACA,aAAA,CAAA,EAJI,oBAIJ;EAAgB,eAAA,CAAA,EAHV,wBAGU,EAAA;EAUd,KAAA,CAAA,EAZN,YAYM;EACJ,SAAA,CAAA,EAZE,gBAYF;EACD,SAAA,CAAA,EAZG,gBAYH;;AAoBX;;;;AAG2B,iBAzBX,kBAAA,CAyBW,QAAA,EAxBf,qBAwBe,EAAA,OAAA,CAAA,EAvBhB,oBAuBgB,CAAA,EAtBxB,2BAsBwB;AAgI3B;AAWA;AAWA;AAWgB,iBApKA,kBAAA,CAqKF,UAAA,EApKA,sBAqKH,EAAA,OAA8B,CAAA,EApK9B,yBAoK8B,CAAA,EAnKtC,wBAmKsC;;;;iBAnCzB,aAAA,WACJ,iCACD;;;;iBASK,aAAA,WACJ,iCACD;;;;iBASK,kBAAA,aACF,kCACH;;;;iBASK,kBAAA,aACF,kCACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exporter.js","names":["paths: Record<string, Record<string, unknown>>","schemas: Record<string, Record<string, unknown>>","doc: ContractSpecOpenApiDocument","result: ContractSpecExportResult"],"sources":["../../src/openapi/exporter.ts"],"sourcesContent":["/**\n * Export ContractSpec specs to OpenAPI 3.1 format.\n * Refactored to use modular exporters for all surfaces.\n */\nimport type {\n OperationSpecRegistry,\n FeatureRegistry,\n PresentationRegistry,\n FormRegistry,\n DataViewRegistry,\n WorkflowRegistry,\n EventSpec,\n PresentationDescriptorV2,\n} from '@lssm/lib.contracts';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport type {\n ContractSpecOpenApiDocument,\n OpenApiExportOptions,\n OpenApiServer,\n ContractSpecExportOptions,\n ContractSpecExportResult,\n} from './types';\nimport {\n exportOperations,\n generateOperationsRegistry,\n defaultRestPath as defaultRestPathFn,\n} from './exporter/operations';\nimport { exportEvents, generateEventsExports } from './exporter/events';\nimport { exportFeatures, generateFeaturesRegistry } from './exporter/features';\nimport {\n exportPresentations,\n generatePresentationsRegistry,\n} from './exporter/presentations';\nimport { exportForms, generateFormsRegistry } from './exporter/forms';\nimport {\n exportDataViews,\n generateDataViewsRegistry,\n} from './exporter/data-views';\nimport {\n exportWorkflows,\n generateWorkflowsRegistry,\n} from './exporter/workflows';\nimport { generateRegistryIndex } from './exporter/registries';\n\n/**\n * Input registries for unified export.\n */\nexport interface ContractSpecRegistries {\n operations?: OperationSpecRegistry;\n events?: EventSpec<AnySchemaModel>[];\n features?: FeatureRegistry;\n presentations?: PresentationRegistry;\n presentationsV2?: PresentationDescriptorV2[];\n forms?: FormRegistry;\n dataViews?: DataViewRegistry;\n workflows?: WorkflowRegistry;\n}\n\n// Re-export for backwards compatibility\nexport { defaultRestPathFn as defaultRestPath };\n\n/**\n * Export a OperationSpecRegistry to an OpenAPI 3.1 document.\n * @deprecated Use exportContractSpec for full surface support.\n */\nexport function openApiForRegistry(\n registry: OperationSpecRegistry,\n options: OpenApiExportOptions = {}\n): ContractSpecOpenApiDocument {\n const { paths, schemas } = exportOperations(registry);\n\n return {\n openapi: '3.1.0',\n info: {\n title: options.title ?? 'ContractSpec API',\n version: options.version ?? '0.0.0',\n ...(options.description ? { description: options.description } : {}),\n },\n ...(options.servers ? { servers: options.servers } : {}),\n paths,\n components: { schemas },\n };\n}\n\n/**\n * Export all ContractSpec surfaces to OpenAPI document with extensions.\n */\nexport function exportContractSpec(\n registries: ContractSpecRegistries,\n options: ContractSpecExportOptions = {}\n): ContractSpecExportResult {\n const {\n operations: includeOps = true,\n events: includeEvents = true,\n features: includeFeatures = true,\n presentations: includePresentations = true,\n forms: includeForms = true,\n dataViews: includeDataViews = true,\n workflows: includeWorkflows = true,\n generateRegistries = true,\n } = options;\n\n // Build OpenAPI document\n let paths: Record<string, Record<string, unknown>> = {};\n let schemas: Record<string, Record<string, unknown>> = {};\n\n // Export operations\n if (includeOps && registries.operations) {\n const opResult = exportOperations(registries.operations);\n paths = opResult.paths;\n schemas = opResult.schemas;\n }\n\n const doc: ContractSpecOpenApiDocument = {\n openapi: '3.1.0',\n info: {\n title: options.title ?? 'ContractSpec API',\n version: options.version ?? '0.0.0',\n ...(options.description ? { description: options.description } : {}),\n },\n ...(options.servers ? { servers: options.servers } : {}),\n paths,\n components: { schemas },\n };\n\n // Add extensions for other surfaces\n if (includeEvents && registries.events?.length) {\n doc['x-contractspec-events'] = exportEvents(registries.events);\n }\n\n if (includeFeatures && registries.features) {\n doc['x-contractspec-features'] = exportFeatures(registries.features);\n }\n\n if (includePresentations && registries.presentations) {\n const presExport = exportPresentations(\n registries.presentations,\n registries.presentationsV2\n );\n doc['x-contractspec-presentations'] = [\n ...presExport.v1,\n ...presExport.v2,\n ];\n }\n\n if (includeForms && registries.forms) {\n doc['x-contractspec-forms'] = exportForms(registries.forms);\n }\n\n if (includeDataViews && registries.dataViews) {\n doc['x-contractspec-dataviews'] = exportDataViews(registries.dataViews);\n }\n\n if (includeWorkflows && registries.workflows) {\n doc['x-contractspec-workflows'] = exportWorkflows(registries.workflows);\n }\n\n const result: ContractSpecExportResult = {\n openApi: doc,\n };\n\n // Generate registry code if requested\n if (generateRegistries) {\n result.registries = {};\n\n if (includeOps && registries.operations) {\n result.registries.operations = generateOperationsRegistry(\n registries.operations\n );\n }\n\n if (includeEvents && registries.events?.length) {\n result.registries.events = generateEventsExports(registries.events);\n }\n\n if (includeFeatures && registries.features) {\n result.registries.features = generateFeaturesRegistry(registries.features);\n }\n\n if (includePresentations && registries.presentations) {\n result.registries.presentations = generatePresentationsRegistry(\n registries.presentations\n );\n }\n\n if (includeForms && registries.forms) {\n result.registries.forms = generateFormsRegistry(registries.forms);\n }\n\n if (includeDataViews && registries.dataViews) {\n result.registries.dataViews = generateDataViewsRegistry(\n registries.dataViews\n );\n }\n\n if (includeWorkflows && registries.workflows) {\n result.registries.workflows = generateWorkflowsRegistry(\n registries.workflows\n );\n }\n\n // Generate index file\n result.registries.index = generateRegistryIndex({\n operations: includeOps && !!registries.operations,\n events: includeEvents && !!registries.events?.length,\n features: includeFeatures && !!registries.features,\n presentations: includePresentations && !!registries.presentations,\n forms: includeForms && !!registries.forms,\n dataViews: includeDataViews && !!registries.dataViews,\n workflows: includeWorkflows && !!registries.workflows,\n });\n }\n\n return result;\n}\n\n/**\n * Export a OperationSpecRegistry to OpenAPI JSON string.\n */\nexport function openApiToJson(\n registry: OperationSpecRegistry,\n options: OpenApiExportOptions = {}\n): string {\n const doc = openApiForRegistry(registry, options);\n return JSON.stringify(doc, null, 2);\n}\n\n/**\n * Export a OperationSpecRegistry to OpenAPI YAML string.\n */\nexport function openApiToYaml(\n registry: OperationSpecRegistry,\n options: OpenApiExportOptions = {}\n): string {\n const doc = openApiForRegistry(registry, options);\n return jsonToYaml(doc);\n}\n\n/**\n * Export ContractSpec to JSON string (all surfaces).\n */\nexport function contractSpecToJson(\n registries: ContractSpecRegistries,\n options: ContractSpecExportOptions = {}\n): string {\n const result = exportContractSpec(registries, options);\n return JSON.stringify(result.openApi, null, 2);\n}\n\n/**\n * Export ContractSpec to YAML string (all surfaces).\n */\nexport function contractSpecToYaml(\n registries: ContractSpecRegistries,\n options: ContractSpecExportOptions = {}\n): string {\n const result = exportContractSpec(registries, options);\n return jsonToYaml(result.openApi);\n}\n\n/**\n * Simple JSON to YAML conversion.\n */\nfunction jsonToYaml(obj: unknown, indent = 0): string {\n const spaces = ' '.repeat(indent);\n let yaml = '';\n\n if (Array.isArray(obj)) {\n for (const item of obj) {\n if (typeof item === 'object' && item !== null) {\n yaml += `${spaces}-\\n${jsonToYaml(item, indent + 1)}`;\n } else {\n yaml += `${spaces}- ${JSON.stringify(item)}\\n`;\n }\n }\n } else if (typeof obj === 'object' && obj !== null) {\n for (const [key, value] of Object.entries(obj)) {\n if (Array.isArray(value)) {\n yaml += `${spaces}${key}:\\n${jsonToYaml(value, indent + 1)}`;\n } else if (typeof value === 'object' && value !== null) {\n yaml += `${spaces}${key}:\\n${jsonToYaml(value, indent + 1)}`;\n } else {\n yaml += `${spaces}${key}: ${JSON.stringify(value)}\\n`;\n }\n }\n }\n\n return yaml;\n}\n\n// Re-export types for convenience\nexport type {\n OpenApiExportOptions,\n OpenApiServer,\n ContractSpecOpenApiDocument,\n ContractSpecExportOptions,\n ContractSpecExportResult,\n};\n"],"mappings":";;;;;;;;;;;;;;AAiEA,SAAgB,mBACd,UACA,UAAgC,EAAE,EACL;CAC7B,MAAM,EAAE,OAAO,YAAY,iBAAiB,SAAS;AAErD,QAAO;EACL,SAAS;EACT,MAAM;GACJ,OAAO,QAAQ,SAAS;GACxB,SAAS,QAAQ,WAAW;GAC5B,GAAI,QAAQ,cAAc,EAAE,aAAa,QAAQ,aAAa,GAAG,EAAE;GACpE;EACD,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,SAAS,GAAG,EAAE;EACvD;EACA,YAAY,EAAE,SAAS;EACxB;;;;;AAMH,SAAgB,mBACd,YACA,UAAqC,EAAE,EACb;CAC1B,MAAM,EACJ,YAAY,aAAa,MACzB,QAAQ,gBAAgB,MACxB,UAAU,kBAAkB,MAC5B,eAAe,uBAAuB,MACtC,OAAO,eAAe,MACtB,WAAW,mBAAmB,MAC9B,WAAW,mBAAmB,MAC9B,qBAAqB,SACnB;CAGJ,IAAIA,QAAiD,EAAE;CACvD,IAAIC,UAAmD,EAAE;AAGzD,KAAI,cAAc,WAAW,YAAY;EACvC,MAAM,WAAW,iBAAiB,WAAW,WAAW;AACxD,UAAQ,SAAS;AACjB,YAAU,SAAS;;CAGrB,MAAMC,MAAmC;EACvC,SAAS;EACT,MAAM;GACJ,OAAO,QAAQ,SAAS;GACxB,SAAS,QAAQ,WAAW;GAC5B,GAAI,QAAQ,cAAc,EAAE,aAAa,QAAQ,aAAa,GAAG,EAAE;GACpE;EACD,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,SAAS,GAAG,EAAE;EACvD;EACA,YAAY,EAAE,SAAS;EACxB;AAGD,KAAI,iBAAiB,WAAW,QAAQ,OACtC,KAAI,2BAA2B,aAAa,WAAW,OAAO;AAGhE,KAAI,mBAAmB,WAAW,SAChC,KAAI,6BAA6B,eAAe,WAAW,SAAS;AAGtE,KAAI,wBAAwB,WAAW,eAAe;EACpD,MAAM,aAAa,oBACjB,WAAW,eACX,WAAW,gBACZ;AACD,MAAI,kCAAkC,CACpC,GAAG,WAAW,IACd,GAAG,WAAW,GACf;;AAGH,KAAI,gBAAgB,WAAW,MAC7B,KAAI,0BAA0B,YAAY,WAAW,MAAM;AAG7D,KAAI,oBAAoB,WAAW,UACjC,KAAI,8BAA8B,gBAAgB,WAAW,UAAU;AAGzE,KAAI,oBAAoB,WAAW,UACjC,KAAI,8BAA8B,gBAAgB,WAAW,UAAU;CAGzE,MAAMC,SAAmC,EACvC,SAAS,KACV;AAGD,KAAI,oBAAoB;AACtB,SAAO,aAAa,EAAE;AAEtB,MAAI,cAAc,WAAW,WAC3B,QAAO,WAAW,aAAa,2BAC7B,WAAW,WACZ;AAGH,MAAI,iBAAiB,WAAW,QAAQ,OACtC,QAAO,WAAW,SAAS,sBAAsB,WAAW,OAAO;AAGrE,MAAI,mBAAmB,WAAW,SAChC,QAAO,WAAW,WAAW,yBAAyB,WAAW,SAAS;AAG5E,MAAI,wBAAwB,WAAW,cACrC,QAAO,WAAW,gBAAgB,8BAChC,WAAW,cACZ;AAGH,MAAI,gBAAgB,WAAW,MAC7B,QAAO,WAAW,QAAQ,sBAAsB,WAAW,MAAM;AAGnE,MAAI,oBAAoB,WAAW,UACjC,QAAO,WAAW,YAAY,0BAC5B,WAAW,UACZ;AAGH,MAAI,oBAAoB,WAAW,UACjC,QAAO,WAAW,YAAY,0BAC5B,WAAW,UACZ;AAIH,SAAO,WAAW,QAAQ,sBAAsB;GAC9C,YAAY,cAAc,CAAC,CAAC,WAAW;GACvC,QAAQ,iBAAiB,CAAC,CAAC,WAAW,QAAQ;GAC9C,UAAU,mBAAmB,CAAC,CAAC,WAAW;GAC1C,eAAe,wBAAwB,CAAC,CAAC,WAAW;GACpD,OAAO,gBAAgB,CAAC,CAAC,WAAW;GACpC,WAAW,oBAAoB,CAAC,CAAC,WAAW;GAC5C,WAAW,oBAAoB,CAAC,CAAC,WAAW;GAC7C,CAAC;;AAGJ,QAAO;;;;;AAMT,SAAgB,cACd,UACA,UAAgC,EAAE,EAC1B;CACR,MAAM,MAAM,mBAAmB,UAAU,QAAQ;AACjD,QAAO,KAAK,UAAU,KAAK,MAAM,EAAE;;;;;AAMrC,SAAgB,cACd,UACA,UAAgC,EAAE,EAC1B;AAER,QAAO,WADK,mBAAmB,UAAU,QAAQ,CAC3B;;;;;AAMxB,SAAgB,mBACd,YACA,UAAqC,EAAE,EAC/B;CACR,MAAM,SAAS,mBAAmB,YAAY,QAAQ;AACtD,QAAO,KAAK,UAAU,OAAO,SAAS,MAAM,EAAE;;;;;AAMhD,SAAgB,mBACd,YACA,UAAqC,EAAE,EAC/B;AAER,QAAO,WADQ,mBAAmB,YAAY,QAAQ,CAC7B,QAAQ;;;;;AAMnC,SAAS,WAAW,KAAc,SAAS,GAAW;CACpD,MAAM,SAAS,KAAK,OAAO,OAAO;CAClC,IAAI,OAAO;AAEX,KAAI,MAAM,QAAQ,IAAI,CACpB,MAAK,MAAM,QAAQ,IACjB,KAAI,OAAO,SAAS,YAAY,SAAS,KACvC,SAAQ,GAAG,OAAO,KAAK,WAAW,MAAM,SAAS,EAAE;KAEnD,SAAQ,GAAG,OAAO,IAAI,KAAK,UAAU,KAAK,CAAC;UAGtC,OAAO,QAAQ,YAAY,QAAQ,KAC5C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,CAC5C,KAAI,MAAM,QAAQ,MAAM,CACtB,SAAQ,GAAG,SAAS,IAAI,KAAK,WAAW,OAAO,SAAS,EAAE;UACjD,OAAO,UAAU,YAAY,UAAU,KAChD,SAAQ,GAAG,SAAS,IAAI,KAAK,WAAW,OAAO,SAAS,EAAE;KAE1D,SAAQ,GAAG,SAAS,IAAI,IAAI,KAAK,UAAU,MAAM,CAAC;AAKxD,QAAO"}
|
|
1
|
+
{"version":3,"file":"exporter.js","names":["paths: Record<string, Record<string, unknown>>","schemas: Record<string, Record<string, unknown>>","doc: ContractSpecOpenApiDocument","result: ContractSpecExportResult"],"sources":["../../src/openapi/exporter.ts"],"sourcesContent":["/**\n * Export ContractSpec specs to OpenAPI 3.1 format.\n * Refactored to use modular exporters for all surfaces.\n */\nimport type {\n OperationSpecRegistry,\n FeatureRegistry,\n PresentationRegistry,\n FormRegistry,\n DataViewRegistry,\n WorkflowRegistry,\n EventSpec,\n PresentationDescriptorV2,\n} from '@lssm/lib.contracts';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport type {\n ContractSpecOpenApiDocument,\n OpenApiExportOptions,\n OpenApiServer,\n ContractSpecExportOptions,\n ContractSpecExportResult,\n} from './types';\nimport {\n exportOperations,\n generateOperationsRegistry,\n defaultRestPath as defaultRestPathFn,\n} from './exporter/operations';\nimport { exportEvents, generateEventsExports } from './exporter/events';\nimport { exportFeatures, generateFeaturesRegistry } from './exporter/features';\nimport {\n exportPresentations,\n generatePresentationsRegistry,\n} from './exporter/presentations';\nimport { exportForms, generateFormsRegistry } from './exporter/forms';\nimport {\n exportDataViews,\n generateDataViewsRegistry,\n} from './exporter/data-views';\nimport {\n exportWorkflows,\n generateWorkflowsRegistry,\n} from './exporter/workflows';\nimport { generateRegistryIndex } from './exporter/registries';\n\n/**\n * Input registries for unified export.\n */\nexport interface ContractSpecRegistries {\n operations?: OperationSpecRegistry;\n events?: EventSpec<AnySchemaModel>[];\n features?: FeatureRegistry;\n presentations?: PresentationRegistry;\n presentationsV2?: PresentationDescriptorV2[];\n forms?: FormRegistry;\n dataViews?: DataViewRegistry;\n workflows?: WorkflowRegistry;\n}\n\n// Re-export for backwards compatibility\nexport { defaultRestPathFn as defaultRestPath };\n\n/**\n * Export a OperationSpecRegistry to an OpenAPI 3.1 document.\n * @deprecated Use exportContractSpec for full surface support.\n */\nexport function openApiForRegistry(\n registry: OperationSpecRegistry,\n options: OpenApiExportOptions = {}\n): ContractSpecOpenApiDocument {\n const { paths, schemas } = exportOperations(registry);\n\n return {\n openapi: '3.1.0',\n info: {\n title: options.title ?? 'ContractSpec API',\n version: options.version ?? '0.0.0',\n ...(options.description ? { description: options.description } : {}),\n },\n ...(options.servers ? { servers: options.servers } : {}),\n paths,\n components: { schemas },\n };\n}\n\n/**\n * Export all ContractSpec surfaces to OpenAPI document with extensions.\n */\nexport function exportContractSpec(\n registries: ContractSpecRegistries,\n options: ContractSpecExportOptions = {}\n): ContractSpecExportResult {\n const {\n operations: includeOps = true,\n events: includeEvents = true,\n features: includeFeatures = true,\n presentations: includePresentations = true,\n forms: includeForms = true,\n dataViews: includeDataViews = true,\n workflows: includeWorkflows = true,\n generateRegistries = true,\n } = options;\n\n // Build OpenAPI document\n let paths: Record<string, Record<string, unknown>> = {};\n let schemas: Record<string, Record<string, unknown>> = {};\n\n // Export operations\n if (includeOps && registries.operations) {\n const opResult = exportOperations(registries.operations);\n paths = opResult.paths;\n schemas = opResult.schemas;\n }\n\n const doc: ContractSpecOpenApiDocument = {\n openapi: '3.1.0',\n info: {\n title: options.title ?? 'ContractSpec API',\n version: options.version ?? '0.0.0',\n ...(options.description ? { description: options.description } : {}),\n },\n ...(options.servers ? { servers: options.servers } : {}),\n paths,\n components: { schemas },\n };\n\n // Add extensions for other surfaces\n if (includeEvents && registries.events?.length) {\n doc['x-contractspec-events'] = exportEvents(registries.events);\n }\n\n if (includeFeatures && registries.features) {\n doc['x-contractspec-features'] = exportFeatures(registries.features);\n }\n\n if (includePresentations && registries.presentations) {\n const presExport = exportPresentations(\n registries.presentations,\n registries.presentationsV2\n );\n doc['x-contractspec-presentations'] = [...presExport.v1, ...presExport.v2];\n }\n\n if (includeForms && registries.forms) {\n doc['x-contractspec-forms'] = exportForms(registries.forms);\n }\n\n if (includeDataViews && registries.dataViews) {\n doc['x-contractspec-dataviews'] = exportDataViews(registries.dataViews);\n }\n\n if (includeWorkflows && registries.workflows) {\n doc['x-contractspec-workflows'] = exportWorkflows(registries.workflows);\n }\n\n const result: ContractSpecExportResult = {\n openApi: doc,\n };\n\n // Generate registry code if requested\n if (generateRegistries) {\n result.registries = {};\n\n if (includeOps && registries.operations) {\n result.registries.operations = generateOperationsRegistry(\n registries.operations\n );\n }\n\n if (includeEvents && registries.events?.length) {\n result.registries.events = generateEventsExports(registries.events);\n }\n\n if (includeFeatures && registries.features) {\n result.registries.features = generateFeaturesRegistry(\n registries.features\n );\n }\n\n if (includePresentations && registries.presentations) {\n result.registries.presentations = generatePresentationsRegistry(\n registries.presentations\n );\n }\n\n if (includeForms && registries.forms) {\n result.registries.forms = generateFormsRegistry(registries.forms);\n }\n\n if (includeDataViews && registries.dataViews) {\n result.registries.dataViews = generateDataViewsRegistry(\n registries.dataViews\n );\n }\n\n if (includeWorkflows && registries.workflows) {\n result.registries.workflows = generateWorkflowsRegistry(\n registries.workflows\n );\n }\n\n // Generate index file\n result.registries.index = generateRegistryIndex({\n operations: includeOps && !!registries.operations,\n events: includeEvents && !!registries.events?.length,\n features: includeFeatures && !!registries.features,\n presentations: includePresentations && !!registries.presentations,\n forms: includeForms && !!registries.forms,\n dataViews: includeDataViews && !!registries.dataViews,\n workflows: includeWorkflows && !!registries.workflows,\n });\n }\n\n return result;\n}\n\n/**\n * Export a OperationSpecRegistry to OpenAPI JSON string.\n */\nexport function openApiToJson(\n registry: OperationSpecRegistry,\n options: OpenApiExportOptions = {}\n): string {\n const doc = openApiForRegistry(registry, options);\n return JSON.stringify(doc, null, 2);\n}\n\n/**\n * Export a OperationSpecRegistry to OpenAPI YAML string.\n */\nexport function openApiToYaml(\n registry: OperationSpecRegistry,\n options: OpenApiExportOptions = {}\n): string {\n const doc = openApiForRegistry(registry, options);\n return jsonToYaml(doc);\n}\n\n/**\n * Export ContractSpec to JSON string (all surfaces).\n */\nexport function contractSpecToJson(\n registries: ContractSpecRegistries,\n options: ContractSpecExportOptions = {}\n): string {\n const result = exportContractSpec(registries, options);\n return JSON.stringify(result.openApi, null, 2);\n}\n\n/**\n * Export ContractSpec to YAML string (all surfaces).\n */\nexport function contractSpecToYaml(\n registries: ContractSpecRegistries,\n options: ContractSpecExportOptions = {}\n): string {\n const result = exportContractSpec(registries, options);\n return jsonToYaml(result.openApi);\n}\n\n/**\n * Simple JSON to YAML conversion.\n */\nfunction jsonToYaml(obj: unknown, indent = 0): string {\n const spaces = ' '.repeat(indent);\n let yaml = '';\n\n if (Array.isArray(obj)) {\n for (const item of obj) {\n if (typeof item === 'object' && item !== null) {\n yaml += `${spaces}-\\n${jsonToYaml(item, indent + 1)}`;\n } else {\n yaml += `${spaces}- ${JSON.stringify(item)}\\n`;\n }\n }\n } else if (typeof obj === 'object' && obj !== null) {\n for (const [key, value] of Object.entries(obj)) {\n if (Array.isArray(value)) {\n yaml += `${spaces}${key}:\\n${jsonToYaml(value, indent + 1)}`;\n } else if (typeof value === 'object' && value !== null) {\n yaml += `${spaces}${key}:\\n${jsonToYaml(value, indent + 1)}`;\n } else {\n yaml += `${spaces}${key}: ${JSON.stringify(value)}\\n`;\n }\n }\n }\n\n return yaml;\n}\n\n// Re-export types for convenience\nexport type {\n OpenApiExportOptions,\n OpenApiServer,\n ContractSpecOpenApiDocument,\n ContractSpecExportOptions,\n ContractSpecExportResult,\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grouping.js","names":[],"sources":["../../../src/openapi/importer/grouping.ts"],"sourcesContent":["/**\n * Grouping utilities for OpenAPI import/export.\n * Determines output folder structure based on configuration.\n */\nimport type {
|
|
1
|
+
{"version":3,"file":"grouping.js","names":[],"sources":["../../../src/openapi/importer/grouping.ts"],"sourcesContent":["/**\n * Grouping utilities for OpenAPI import/export.\n * Determines output folder structure based on configuration.\n */\nimport type { FolderConventions } from '@lssm/lib.contracts';\nimport type { ParsedOperation } from '../types';\n\n/**\n * Grouping strategy type (matches ContractSpec config).\n */\ntype GroupingStrategy =\n | 'by-tag'\n | 'by-owner'\n | 'by-domain'\n | 'by-url-path-single'\n | 'by-url-path-multi'\n | 'by-feature'\n | 'none';\n\n/**\n * Grouping rule configuration.\n */\ninterface GroupingRule {\n strategy: GroupingStrategy;\n urlPathLevel?: number;\n pattern?: string;\n}\n\n/**\n * Resolve the group folder for an operation based on grouping config.\n */\nexport function resolveOperationGroupFolder(\n operation: ParsedOperation,\n conventions: FolderConventions\n): string {\n const groupingRule = conventions.operationsGrouping as\n | GroupingRule\n | undefined;\n\n if (!groupingRule || groupingRule.strategy === 'none') {\n return '';\n }\n\n return applyGroupingStrategy(groupingRule, {\n name: operation.operationId,\n tags: operation.tags,\n path: operation.path,\n });\n}\n\n/**\n * Resolve the group folder for a model based on grouping config.\n */\nexport function resolveModelGroupFolder(\n modelName: string,\n conventions: FolderConventions,\n relatedPath?: string,\n relatedTags?: string[]\n): string {\n const groupingRule = conventions.modelsGrouping as GroupingRule | undefined;\n\n if (!groupingRule || groupingRule.strategy === 'none') {\n return '';\n }\n\n return applyGroupingStrategy(groupingRule, {\n name: modelName,\n tags: relatedTags ?? [],\n path: relatedPath,\n });\n}\n\n/**\n * Resolve the group folder for an event based on grouping config.\n */\nexport function resolveEventGroupFolder(\n eventName: string,\n conventions: FolderConventions,\n relatedTags?: string[]\n): string {\n const groupingRule = conventions.eventsGrouping as GroupingRule | undefined;\n\n if (!groupingRule || groupingRule.strategy === 'none') {\n return '';\n }\n\n return applyGroupingStrategy(groupingRule, {\n name: eventName,\n tags: relatedTags ?? [],\n });\n}\n\n/**\n * Apply grouping strategy to extract folder name.\n */\nfunction applyGroupingStrategy(\n rule: GroupingRule,\n context: {\n name: string;\n tags?: string[];\n path?: string;\n owners?: string[];\n }\n): string {\n switch (rule.strategy) {\n case 'by-tag':\n return context.tags?.[0] ?? 'untagged';\n\n case 'by-owner':\n return context.owners?.[0] ?? 'unowned';\n\n case 'by-domain':\n return extractDomain(context.name);\n\n case 'by-url-path-single':\n return extractUrlPathLevel(context.path, 1);\n\n case 'by-url-path-multi':\n return extractUrlPathLevel(context.path, rule.urlPathLevel ?? 2);\n\n case 'by-feature':\n // Use domain extraction for feature grouping\n return extractDomain(context.name);\n\n case 'none':\n default:\n return '';\n }\n}\n\n/**\n * Extract domain from operation/model name.\n * e.g., \"users.create\" -> \"users\"\n */\nfunction extractDomain(name: string): string {\n // Handle camelCase/PascalCase names\n if (name.includes('.')) {\n return name.split('.')[0] ?? 'default';\n }\n if (name.includes('_')) {\n return name.split('_')[0] ?? 'default';\n }\n // Extract from camelCase like \"createUser\" -> \"create\"\n const match = name.match(/^([a-z]+)/i);\n return match?.[1]?.toLowerCase() ?? 'default';\n}\n\n/**\n * Extract URL path segments for grouping.\n */\nfunction extractUrlPathLevel(path: string | undefined, level: number): string {\n if (!path) return 'root';\n const segments = path.split('/').filter(Boolean);\n\n // Filter out path parameters like {id}\n const nonParamSegments = segments.filter((s) => !s.startsWith('{'));\n\n if (nonParamSegments.length === 0) return 'root';\n\n return nonParamSegments.slice(0, level).join('/');\n}\n\n/**\n * Build full output path including group folder.\n */\nexport function buildOutputPath(\n baseDir: string,\n surfaceDir: string,\n groupFolder: string,\n fileName: string\n): string {\n const parts = [baseDir, surfaceDir];\n\n if (groupFolder) {\n parts.push(groupFolder);\n }\n\n parts.push(fileName);\n\n return parts.filter(Boolean).join('/');\n}\n\n/**\n * Determine if feature-based grouping should be applied.\n */\nexport function shouldGroupByFeature(conventions: FolderConventions): boolean {\n return conventions.groupByFeature;\n}\n"],"mappings":";;;;AA+BA,SAAgB,4BACd,WACA,aACQ;CACR,MAAM,eAAe,YAAY;AAIjC,KAAI,CAAC,gBAAgB,aAAa,aAAa,OAC7C,QAAO;AAGT,QAAO,sBAAsB,cAAc;EACzC,MAAM,UAAU;EAChB,MAAM,UAAU;EAChB,MAAM,UAAU;EACjB,CAAC;;;;;AAMJ,SAAgB,wBACd,WACA,aACA,aACA,aACQ;CACR,MAAM,eAAe,YAAY;AAEjC,KAAI,CAAC,gBAAgB,aAAa,aAAa,OAC7C,QAAO;AAGT,QAAO,sBAAsB,cAAc;EACzC,MAAM;EACN,MAAM,eAAe,EAAE;EACvB,MAAM;EACP,CAAC;;;;;AAMJ,SAAgB,wBACd,WACA,aACA,aACQ;CACR,MAAM,eAAe,YAAY;AAEjC,KAAI,CAAC,gBAAgB,aAAa,aAAa,OAC7C,QAAO;AAGT,QAAO,sBAAsB,cAAc;EACzC,MAAM;EACN,MAAM,eAAe,EAAE;EACxB,CAAC;;;;;AAMJ,SAAS,sBACP,MACA,SAMQ;AACR,SAAQ,KAAK,UAAb;EACE,KAAK,SACH,QAAO,QAAQ,OAAO,MAAM;EAE9B,KAAK,WACH,QAAO,QAAQ,SAAS,MAAM;EAEhC,KAAK,YACH,QAAO,cAAc,QAAQ,KAAK;EAEpC,KAAK,qBACH,QAAO,oBAAoB,QAAQ,MAAM,EAAE;EAE7C,KAAK,oBACH,QAAO,oBAAoB,QAAQ,MAAM,KAAK,gBAAgB,EAAE;EAElE,KAAK,aAEH,QAAO,cAAc,QAAQ,KAAK;EAEpC,KAAK;EACL,QACE,QAAO;;;;;;;AAQb,SAAS,cAAc,MAAsB;AAE3C,KAAI,KAAK,SAAS,IAAI,CACpB,QAAO,KAAK,MAAM,IAAI,CAAC,MAAM;AAE/B,KAAI,KAAK,SAAS,IAAI,CACpB,QAAO,KAAK,MAAM,IAAI,CAAC,MAAM;AAI/B,QADc,KAAK,MAAM,aAAa,GACvB,IAAI,aAAa,IAAI;;;;;AAMtC,SAAS,oBAAoB,MAA0B,OAAuB;AAC5E,KAAI,CAAC,KAAM,QAAO;CAIlB,MAAM,mBAHW,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ,CAGd,QAAQ,MAAM,CAAC,EAAE,WAAW,IAAI,CAAC;AAEnE,KAAI,iBAAiB,WAAW,EAAG,QAAO;AAE1C,QAAO,iBAAiB,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lssm/lib.contracts-transformers",
|
|
3
|
-
"version": "0.0.0-canary-
|
|
3
|
+
"version": "0.0.0-canary-20251221185840",
|
|
4
4
|
"description": "Contract format transformations: import/export between ContractSpec and external formats (OpenAPI, AsyncAPI, etc.)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -17,15 +17,15 @@
|
|
|
17
17
|
"test": "bun test"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@lssm/lib.contracts": "0.0.0-canary-
|
|
21
|
-
"@lssm/lib.schema": "0.0.0-canary-
|
|
20
|
+
"@lssm/lib.contracts": "0.0.0-canary-20251221185840",
|
|
21
|
+
"@lssm/lib.schema": "0.0.0-canary-20251221185840",
|
|
22
22
|
"openapi-types": "^12.1.3",
|
|
23
23
|
"yaml": "^2.7.1",
|
|
24
24
|
"zod": "^4.1.13"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@lssm/tool.tsdown": "0.0.0-canary-
|
|
28
|
-
"@lssm/tool.typescript": "0.0.0-canary-
|
|
27
|
+
"@lssm/tool.tsdown": "0.0.0-canary-20251221185840",
|
|
28
|
+
"@lssm/tool.typescript": "0.0.0-canary-20251221185840",
|
|
29
29
|
"tsdown": "^0.18.1",
|
|
30
30
|
"typescript": "^5.9.3"
|
|
31
31
|
},
|