🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

openapi-to-effect

Package Overview
Dependencies
Maintainers
1
Versions
13
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

openapi-to-effect - npm Package Compare versions

Comparing version
0.8.0
to
0.9.0
+0
-1
dist/cjs/analysis/GraphAnalyzer.cjs

@@ -23,3 +23,2 @@ "use strict";

const schemaIdFromRef = ref => {
const matches = ref.match(/^#\/components\/schemas\/.+/);
if (!/^#\/components\/schemas\/.+/.test(ref)) {

@@ -26,0 +25,0 @@ throw new Error(`Reference format not supported: ${ref}`);

+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"GraphAnalyzer.cjs","names":["_openapi","require","schemaIdFromRef","ref","matches","match","test","Error","pointer","replace","refSchemaId","segments","decodeJsonPointer","slice","length","exports","refFromSchemaId","schemaId","encodeJsonPointer","resolver","schemas","refSchema","depsShallow","schema","Set","$ref","type","items","allOf","flatMap","subschema","oneOf","anyOf","Array","isArray","schemaAnyOf","map","props","properties","additionalProps","additionalProperties","additionalPropsSchema","Object","values","propSchema","TypeError","JSON","stringify","depsDeep","resolve","visited","has","assign","dependencyTree","document","rootSchemaRef","components","rootSchemaId","rootSchema","dependenciesMapFromDocument","dependenciesMap","Map","entries","schemaRef","dependencies","set","dependentsMapFromDocument","dependentsMap","error","cause","dependency","get","topologicalSorter","refsWithCycles","sorted","visit","add","dependents","dependentSchemaRef","unshift","circularDependency","topologicalSort","adjacency","sorter","keys","InfiniteRecursionError","_isObjectSchema","every","Boolean","isObjectSchema"],"sources":["../../../src/analysis/GraphAnalyzer.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { type OpenAPIV3_1 as OpenApi } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema, decodeJsonPointer, encodeJsonPointer } from '../util/openapi.ts';\n\n\n//\n// Reference resolving\n//\n\ntype Ref = string; // OpenAPI schema reference\ntype Resolve = (ref: Ref) => OpenApiSchema; // Callback to take a ref and resolve it to the corresponding schema\n\nexport const schemaIdFromRef = (ref: Ref): OpenApiSchemaId => {\n const matches = ref.match(/^#\\/components\\/schemas\\/.+/);\n if (!/^#\\/components\\/schemas\\/.+/.test(ref)) {\n throw new Error(`Reference format not supported: ${ref}`);\n }\n \n const pointer = ref.replace(/^#/, '');\n const [refSchemaId, ...segments] = decodeJsonPointer(pointer).slice(2);\n if (typeof refSchemaId === 'undefined') { throw new Error('Should not happen'); }\n if (segments.length !== 0) { throw new Error(`Refs to nested paths not supported: ${ref}`); }\n \n return refSchemaId;\n};\nexport const refFromSchemaId = (schemaId: OpenApiSchemaId): Ref => {\n return '#' + encodeJsonPointer(['components', 'schemas', schemaId]);\n};\n\nconst resolver = (schemas: Record<OpenApiSchemaId, OpenApiSchema>) => (ref: string): OpenApiSchema => {\n const refSchemaId = schemaIdFromRef(ref);\n const refSchema = schemas[refSchemaId];\n if (typeof refSchema === 'undefined') { throw new Error('Should not happen'); }\n return refSchema;\n};\n\n// Get all direct (shallow) dependencies\nconst depsShallow = (schema: OpenApiSchema): Set<Ref> => {\n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n return new Set([schema.$ref]);\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n if ('items' in schema) {\n return depsShallow(schema.items);\n } else { // Array of unknown\n return new Set();\n }\n } else { // Case: OpenApi.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return new Set(schema.allOf.flatMap(subschema => [...depsShallow(subschema)]));\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return new Set(schema.oneOf.flatMap(subschema => [...depsShallow(subschema)]));\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return new Set(schema.anyOf.flatMap(subschema => [...depsShallow(subschema)]));\n }\n \n if (typeof schema.type === 'undefined') {\n return new Set(); // Any type\n } else if (Array.isArray(schema.type)) {\n const schemaAnyOf = { anyOf: schema.type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n return depsShallow(schemaAnyOf);\n }\n switch (schema.type) {\n case 'null':\n case 'string':\n case 'number':\n case 'integer':\n case 'boolean':\n return new Set();\n case 'object':\n const props: Record<OpenApiSchemaId, OpenApiSchema> = schema.properties ?? {};\n const additionalProps = schema.additionalProperties;\n const additionalPropsSchema: null | OpenApiSchema =\n typeof additionalProps === 'object' && additionalProps !== null\n ? additionalProps\n : null;\n return new Set([\n ...Object.values(props).flatMap(propSchema => [...depsShallow(propSchema)]),\n ...(additionalPropsSchema ? depsShallow(additionalPropsSchema) : []),\n ]);\n default: throw new TypeError(`Unsupported type ${JSON.stringify(schema.type)}`);\n }\n }\n }\n};\n\n// Get all dependencies for the given schema (as a dependency tree rooted at `schema`)\nconst depsDeep = (schema: OpenApiSchema, resolve: Resolve, visited: Set<Ref>): DepTree => {\n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n if (visited.has(schema.$ref)) { return { [schema.$ref]: 'recurse' }; }\n return { [schema.$ref]: depsDeep(resolve(schema.$ref), resolve, new Set([...visited, schema.$ref])) };\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n if ('items' in schema) {\n return depsDeep(schema.items, resolve, visited);\n } else { // Array of unknown\n return {};\n }\n } else { // Case: OpenApi.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return Object.assign({}, ...schema.allOf.flatMap(subschema => depsDeep(subschema, resolve, visited)));\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return Object.assign({}, ...schema.oneOf.flatMap(subschema => depsDeep(subschema, resolve, visited)));\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return Object.assign({}, ...schema.anyOf.flatMap(subschema => depsDeep(subschema, resolve, visited)));\n }\n \n if (typeof schema.type === 'undefined') {\n return {}; // Any type\n } else if (Array.isArray(schema.type)) {\n const schemaAnyOf = { anyOf: schema.type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n return depsDeep(schemaAnyOf, resolve, visited);\n }\n switch (schema.type) {\n case 'null':\n case 'string':\n case 'number':\n case 'integer':\n case 'boolean':\n return {};\n case 'object':\n const props: Record<OpenApiSchemaId, OpenApiSchema> = schema.properties ?? {};\n const additionalProps = schema.additionalProperties;\n const additionalPropsSchema: null | OpenApiSchema =\n typeof additionalProps === 'object' && additionalProps !== null\n ? additionalProps\n : null;\n return Object.assign(\n {},\n ...Object.values(props).flatMap(propSchema => depsDeep(propSchema, resolve, visited)),\n additionalPropsSchema ? depsDeep(additionalPropsSchema, resolve, visited) : {},\n );\n default: throw new TypeError(`Unsupported type \"${schema.type}\"`);\n }\n }\n }\n};\n\n\n//\n// Dependency trees\n//\n\ntype DepTree = { [ref: Ref]: DepTree | 'recurse' };\n\n// Create a dependency tree rooted at `rootRef`. If we find a cycle, inject a special \"recurse\" marker.\nexport const dependencyTree = (document: OpenApi.Document, rootSchemaRef: Ref): DepTree => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n const rootSchemaId = schemaIdFromRef(rootSchemaRef);\n \n const rootSchema: undefined | OpenApiSchema = schemas[rootSchemaId];\n if (!rootSchema) { throw new Error(`Unable to find schema \"${rootSchemaRef}\"`); }\n \n return { [rootSchemaRef]: depsDeep(rootSchema, resolver(schemas), new Set([rootSchemaRef])) };\n};\n\n\n//\n// Adjacency maps\n//\n\ntype AdjacencyMap = Map<Ref, Set<Ref>>;\n\n// Get a mapping from schemas to all of their direct dependencies\nexport const dependenciesMapFromDocument = (document: OpenApi.Document): AdjacencyMap => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n // Mapping from a particular schema to its dependencies (directed neighbors in the graph: schema -> dependency)\n const dependenciesMap: AdjacencyMap = new Map<Ref, Set<Ref>>();\n \n for (const [schemaId, schema] of Object.entries(schemas)) {\n const schemaRef = refFromSchemaId(schemaId);\n const dependencies: Set<Ref> = depsShallow(schema);\n \n dependenciesMap.set(schemaRef, dependencies);\n }\n \n return dependenciesMap;\n};\n\n// Get a mapping from schemas to all of their direct dependents\nexport const dependentsMapFromDocument = (document: OpenApi.Document): AdjacencyMap => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n // Mapping from a particular schema to its dependents (directed neighbors in the graph: schema <- dependent)\n const dependentsMap: AdjacencyMap = new Map<Ref, Set<Ref>>();\n \n for (const [schemaId, schema] of Object.entries(schemas)) {\n const schemaRef = refFromSchemaId(schemaId);\n const dependencies = ((): Set<Ref> => {\n try {\n return depsShallow(schema);\n } catch (error: unknown) {\n throw new Error(`Unable to determine dependents for '${schemaRef}'`, { cause: error });\n }\n })();\n \n for (const dependency of dependencies) {\n dependentsMap.set(dependency, new Set([\n ...(dependentsMap.get(dependency) ?? new Set()),\n schemaRef,\n ]));\n }\n }\n \n return dependentsMap;\n};\n\n\n//\n// Topological sort\n//\n\ntype TopologicalSort = Array<{\n ref: Ref,\n circularDependency: boolean, // If true, then this has at least one dependency that breaks the topological ordering\n}>;\nconst topologicalSorter = (dependentsMap: AdjacencyMap) => {\n const visited = new Set<Ref>(); // Keep track of schemas we've already visited\n const refsWithCycles = new Set<Ref>(); // Keep track of schemas that have at least one circular dependency\n const sorted: TopologicalSort = [];\n \n const visit = (schemaRef: Ref): void => {\n if (visited.has(schemaRef)) {\n refsWithCycles.add(schemaRef);\n return;\n }\n \n visited.add(schemaRef);\n \n const dependents = dependentsMap.get(schemaRef) ?? new Set();\n for (const dependentSchemaRef of dependents) {\n visit(dependentSchemaRef);\n }\n \n sorted.unshift({ ref: schemaRef, circularDependency: refsWithCycles.has(schemaRef) });\n };\n \n return { visit, sorted };\n};\n\nexport const topologicalSort = (document: OpenApi.Document): TopologicalSort => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n const adjacency = dependentsMapFromDocument(document);\n const sorter = topologicalSorter(adjacency);\n \n for (const schemaId of Object.keys(schemas)) {\n const schemaRef = refFromSchemaId(schemaId);\n sorter.visit(schemaRef);\n }\n \n return sorter.sorted;\n};\n\n\n// Util: check if a given schema is an object schema\nexport class InfiniteRecursionError extends Error {}\nconst _isObjectSchema = (schema: OpenApiSchema, resolve: Resolve, visited: Set<Ref>): boolean => {\n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n if (visited.has(schema.$ref)) {\n throw new InfiniteRecursionError(`Infinite recursion at ${schema.$ref}`);\n }\n return _isObjectSchema(resolve(schema.$ref), resolve, new Set([...visited, schema.$ref]));\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n return false;\n } else { // Case: OpenApi.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return schema.allOf.flatMap(subschema => _isObjectSchema(subschema, resolve, visited)).every(Boolean);\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return false; // Union\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return false; // Union\n }\n \n if (typeof schema.type === 'undefined') {\n return false; // Any type\n } else if (Array.isArray(schema.type)) {\n const schemaAnyOf = { anyOf: schema.type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n return _isObjectSchema(schemaAnyOf, resolve, visited);\n }\n switch (schema.type) {\n case 'null':\n case 'string':\n case 'number':\n case 'integer':\n case 'boolean':\n return false;\n case 'object':\n return true;\n default: throw new TypeError(`Unsupported type \"${schema.type}\"`);\n }\n }\n }\n};\nexport const isObjectSchema = (schemas: Record<OpenApiSchemaId, OpenApiSchema>, rootSchemaRef: Ref): boolean => {\n const rootSchemaId = schemaIdFromRef(rootSchemaRef);\n \n const rootSchema: undefined | OpenApiSchema = schemas[rootSchemaId];\n if (!rootSchema) { throw new Error(`Unable to find schema \"${rootSchemaRef}\"`); }\n \n return _isObjectSchema(rootSchema, resolver(schemas), new Set([rootSchemaRef]));\n};\n"],"mappings":"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","ignoreList":[]}
{"version":3,"file":"GraphAnalyzer.cjs","names":["_openapi","require","schemaIdFromRef","ref","test","Error","pointer","replace","refSchemaId","segments","decodeJsonPointer","slice","length","exports","refFromSchemaId","schemaId","encodeJsonPointer","resolver","schemas","refSchema","depsShallow","schema","Set","$ref","type","items","allOf","flatMap","subschema","oneOf","anyOf","Array","isArray","schemaAnyOf","map","props","properties","additionalProps","additionalProperties","additionalPropsSchema","Object","values","propSchema","TypeError","JSON","stringify","depsDeep","resolve","visited","has","assign","dependencyTree","document","rootSchemaRef","components","rootSchemaId","rootSchema","dependenciesMapFromDocument","dependenciesMap","Map","entries","schemaRef","dependencies","set","dependentsMapFromDocument","dependentsMap","error","cause","dependency","get","topologicalSorter","refsWithCycles","sorted","visit","add","dependents","dependentSchemaRef","unshift","circularDependency","topologicalSort","adjacency","sorter","keys","InfiniteRecursionError","_isObjectSchema","every","Boolean","isObjectSchema"],"sources":["../../../src/analysis/GraphAnalyzer.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { type OpenAPIV3_1 as OpenApi } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema, decodeJsonPointer, encodeJsonPointer } from '../util/openapi.ts';\n\n\n//\n// Reference resolving\n//\n\ntype Ref = string; // OpenAPI schema reference\ntype Resolve = (ref: Ref) => OpenApiSchema; // Callback to take a ref and resolve it to the corresponding schema\n\nexport const schemaIdFromRef = (ref: Ref): OpenApiSchemaId => {\n if (!/^#\\/components\\/schemas\\/.+/.test(ref)) {\n throw new Error(`Reference format not supported: ${ref}`);\n }\n \n const pointer = ref.replace(/^#/, '');\n const [refSchemaId, ...segments] = decodeJsonPointer(pointer).slice(2);\n if (typeof refSchemaId === 'undefined') { throw new Error('Should not happen'); }\n if (segments.length !== 0) { throw new Error(`Refs to nested paths not supported: ${ref}`); }\n \n return refSchemaId;\n};\nexport const refFromSchemaId = (schemaId: OpenApiSchemaId): Ref => {\n return '#' + encodeJsonPointer(['components', 'schemas', schemaId]);\n};\n\nconst resolver = (schemas: Record<OpenApiSchemaId, OpenApiSchema>) => (ref: string): OpenApiSchema => {\n const refSchemaId = schemaIdFromRef(ref);\n const refSchema = schemas[refSchemaId];\n if (typeof refSchema === 'undefined') { throw new Error('Should not happen'); }\n return refSchema;\n};\n\n// Get all direct (shallow) dependencies\nconst depsShallow = (schema: OpenApiSchema): Set<Ref> => {\n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n return new Set([schema.$ref]);\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n if ('items' in schema) {\n return depsShallow(schema.items);\n } else { // Array of unknown\n return new Set();\n }\n } else { // Case: OpenApi.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return new Set(schema.allOf.flatMap(subschema => [...depsShallow(subschema)]));\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return new Set(schema.oneOf.flatMap(subschema => [...depsShallow(subschema)]));\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return new Set(schema.anyOf.flatMap(subschema => [...depsShallow(subschema)]));\n }\n \n if (typeof schema.type === 'undefined') {\n return new Set(); // Any type\n } else if (Array.isArray(schema.type)) {\n const schemaAnyOf = { anyOf: schema.type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n return depsShallow(schemaAnyOf);\n }\n switch (schema.type) {\n case 'null':\n case 'string':\n case 'number':\n case 'integer':\n case 'boolean':\n return new Set();\n case 'object':\n const props: Record<OpenApiSchemaId, OpenApiSchema> = schema.properties ?? {};\n const additionalProps = schema.additionalProperties;\n const additionalPropsSchema: null | OpenApiSchema =\n typeof additionalProps === 'object' && additionalProps !== null\n ? additionalProps\n : null;\n return new Set([\n ...Object.values(props).flatMap(propSchema => [...depsShallow(propSchema)]),\n ...(additionalPropsSchema ? depsShallow(additionalPropsSchema) : []),\n ]);\n default: throw new TypeError(`Unsupported type ${JSON.stringify(schema.type)}`);\n }\n }\n }\n};\n\n// Get all dependencies for the given schema (as a dependency tree rooted at `schema`)\nconst depsDeep = (schema: OpenApiSchema, resolve: Resolve, visited: Set<Ref>): DepTree => {\n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n if (visited.has(schema.$ref)) { return { [schema.$ref]: 'recurse' }; }\n return { [schema.$ref]: depsDeep(resolve(schema.$ref), resolve, new Set([...visited, schema.$ref])) };\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n if ('items' in schema) {\n return depsDeep(schema.items, resolve, visited);\n } else { // Array of unknown\n return {};\n }\n } else { // Case: OpenApi.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return Object.assign({}, ...schema.allOf.flatMap(subschema => depsDeep(subschema, resolve, visited)));\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return Object.assign({}, ...schema.oneOf.flatMap(subschema => depsDeep(subschema, resolve, visited)));\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return Object.assign({}, ...schema.anyOf.flatMap(subschema => depsDeep(subschema, resolve, visited)));\n }\n \n if (typeof schema.type === 'undefined') {\n return {}; // Any type\n } else if (Array.isArray(schema.type)) {\n const schemaAnyOf = { anyOf: schema.type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n return depsDeep(schemaAnyOf, resolve, visited);\n }\n switch (schema.type) {\n case 'null':\n case 'string':\n case 'number':\n case 'integer':\n case 'boolean':\n return {};\n case 'object':\n const props: Record<OpenApiSchemaId, OpenApiSchema> = schema.properties ?? {};\n const additionalProps = schema.additionalProperties;\n const additionalPropsSchema: null | OpenApiSchema =\n typeof additionalProps === 'object' && additionalProps !== null\n ? additionalProps\n : null;\n return Object.assign(\n {},\n ...Object.values(props).flatMap(propSchema => depsDeep(propSchema, resolve, visited)),\n additionalPropsSchema ? depsDeep(additionalPropsSchema, resolve, visited) : {},\n );\n default: throw new TypeError(`Unsupported type \"${schema.type}\"`);\n }\n }\n }\n};\n\n\n//\n// Dependency trees\n//\n\ntype DepTree = { [ref: Ref]: DepTree | 'recurse' };\n\n// Create a dependency tree rooted at `rootRef`. If we find a cycle, inject a special \"recurse\" marker.\nexport const dependencyTree = (document: OpenApi.Document, rootSchemaRef: Ref): DepTree => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n const rootSchemaId = schemaIdFromRef(rootSchemaRef);\n \n const rootSchema: undefined | OpenApiSchema = schemas[rootSchemaId];\n if (!rootSchema) { throw new Error(`Unable to find schema \"${rootSchemaRef}\"`); }\n \n return { [rootSchemaRef]: depsDeep(rootSchema, resolver(schemas), new Set([rootSchemaRef])) };\n};\n\n\n//\n// Adjacency maps\n//\n\ntype AdjacencyMap = Map<Ref, Set<Ref>>;\n\n// Get a mapping from schemas to all of their direct dependencies\nexport const dependenciesMapFromDocument = (document: OpenApi.Document): AdjacencyMap => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n // Mapping from a particular schema to its dependencies (directed neighbors in the graph: schema -> dependency)\n const dependenciesMap: AdjacencyMap = new Map<Ref, Set<Ref>>();\n \n for (const [schemaId, schema] of Object.entries(schemas)) {\n const schemaRef = refFromSchemaId(schemaId);\n const dependencies: Set<Ref> = depsShallow(schema);\n \n dependenciesMap.set(schemaRef, dependencies);\n }\n \n return dependenciesMap;\n};\n\n// Get a mapping from schemas to all of their direct dependents\nexport const dependentsMapFromDocument = (document: OpenApi.Document): AdjacencyMap => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n // Mapping from a particular schema to its dependents (directed neighbors in the graph: schema <- dependent)\n const dependentsMap: AdjacencyMap = new Map<Ref, Set<Ref>>();\n \n for (const [schemaId, schema] of Object.entries(schemas)) {\n const schemaRef = refFromSchemaId(schemaId);\n const dependencies = ((): Set<Ref> => {\n try {\n return depsShallow(schema);\n } catch (error: unknown) {\n throw new Error(`Unable to determine dependents for '${schemaRef}'`, { cause: error });\n }\n })();\n \n for (const dependency of dependencies) {\n dependentsMap.set(dependency, new Set([\n ...(dependentsMap.get(dependency) ?? new Set()),\n schemaRef,\n ]));\n }\n }\n \n return dependentsMap;\n};\n\n\n//\n// Topological sort\n//\n\ntype TopologicalSort = Array<{\n ref: Ref,\n circularDependency: boolean, // If true, then this has at least one dependency that breaks the topological ordering\n}>;\nconst topologicalSorter = (dependentsMap: AdjacencyMap) => {\n const visited = new Set<Ref>(); // Keep track of schemas we've already visited\n const refsWithCycles = new Set<Ref>(); // Keep track of schemas that have at least one circular dependency\n const sorted: TopologicalSort = [];\n \n const visit = (schemaRef: Ref): void => {\n if (visited.has(schemaRef)) {\n refsWithCycles.add(schemaRef);\n return;\n }\n \n visited.add(schemaRef);\n \n const dependents = dependentsMap.get(schemaRef) ?? new Set();\n for (const dependentSchemaRef of dependents) {\n visit(dependentSchemaRef);\n }\n \n sorted.unshift({ ref: schemaRef, circularDependency: refsWithCycles.has(schemaRef) });\n };\n \n return { visit, sorted };\n};\n\nexport const topologicalSort = (document: OpenApi.Document): TopologicalSort => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n const adjacency = dependentsMapFromDocument(document);\n const sorter = topologicalSorter(adjacency);\n \n for (const schemaId of Object.keys(schemas)) {\n const schemaRef = refFromSchemaId(schemaId);\n sorter.visit(schemaRef);\n }\n \n return sorter.sorted;\n};\n\n\n// Util: check if a given schema is an object schema\nexport class InfiniteRecursionError extends Error {}\nconst _isObjectSchema = (schema: OpenApiSchema, resolve: Resolve, visited: Set<Ref>): boolean => {\n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n if (visited.has(schema.$ref)) {\n throw new InfiniteRecursionError(`Infinite recursion at ${schema.$ref}`);\n }\n return _isObjectSchema(resolve(schema.$ref), resolve, new Set([...visited, schema.$ref]));\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n return false;\n } else { // Case: OpenApi.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return schema.allOf.flatMap(subschema => _isObjectSchema(subschema, resolve, visited)).every(Boolean);\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return false; // Union\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return false; // Union\n }\n \n if (typeof schema.type === 'undefined') {\n return false; // Any type\n } else if (Array.isArray(schema.type)) {\n const schemaAnyOf = { anyOf: schema.type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n return _isObjectSchema(schemaAnyOf, resolve, visited);\n }\n switch (schema.type) {\n case 'null':\n case 'string':\n case 'number':\n case 'integer':\n case 'boolean':\n return false;\n case 'object':\n return true;\n default: throw new TypeError(`Unsupported type \"${schema.type}\"`);\n }\n }\n }\n};\nexport const isObjectSchema = (schemas: Record<OpenApiSchemaId, OpenApiSchema>, rootSchemaRef: Ref): boolean => {\n const rootSchemaId = schemaIdFromRef(rootSchemaRef);\n \n const rootSchema: undefined | OpenApiSchema = schemas[rootSchemaId];\n if (!rootSchema) { throw new Error(`Unable to find schema \"${rootSchemaRef}\"`); }\n \n return _isObjectSchema(rootSchema, resolver(schemas), new Set([rootSchemaRef]));\n};\n"],"mappings":"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","ignoreList":[]}

@@ -47,4 +47,3 @@ "use strict";

return (0, _tsDedent.dedent)`
import { pipe, Option } from 'effect';
import { Schema as S } from '@effect/schema';
import { pipe, Option, Schema as S } from 'effect';

@@ -51,0 +50,0 @@ ${refsSorted.map(ref => {

@@ -1,1 +0,1 @@

{"version":3,"file":"moduleGen.cjs","names":["_tsDedent","require","_genUtil","_schemaGen","id","GenResultUtil","encodeIdentifier","generateModule","schemaId","schema","generationContext","schemas","hooks","isSchemaIdBefore","_schemaId","code","refs","comments","generateForSchema","commentsGenerated","commentsToCode","fileNameForRef","ref","split","at","schemaIdForRef","replace","refsSorted","filter","sort","ref1","ref2","startsWith","dedent","map","refId","Error","join","commentBlock","commentInline","exports"],"sources":["../../../../src/generation/effSchemGen/moduleGen.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport { type OpenApiSchemaId, type OpenApiSchema } from '../../util/openapi.ts';\n\nimport { GenResultUtil } from './genUtil.ts';\nimport { type Context as SchemaGenContext, generateForSchema } from './schemaGen.ts';\n\n\nconst id = GenResultUtil.encodeIdentifier;\n\n// Take an OpenAPI schema and generate a top-level module, as a string.\n// @throws Error When we cannot generate a module from the given schema.\nexport const generateModule = (schemaId: string, schema: OpenApiSchema): string => {\n const generationContext: SchemaGenContext = {\n schemas: {}, // FIXME\n hooks: {},\n isSchemaIdBefore(_schemaId: OpenApiSchemaId) { return true; },\n };\n const { code, refs, comments } = generateForSchema(generationContext, schema);\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n \n const fileNameForRef = (ref: string): undefined | string => ref.split('/').at(-1);\n const schemaIdForRef = (ref: string): undefined | string => fileNameForRef(ref)?.replace(/\\.ts$/, '');\n \n const refsSorted = [...refs]\n .filter(ref => schemaIdForRef(ref) !== schemaId)\n .sort((ref1, ref2) => {\n if (ref1.startsWith('../util/')) {\n return -1;\n } else if (ref2.startsWith('../util/')) {\n return +1;\n }\n return 0;\n });\n return dedent`\n import { pipe, Option } from 'effect';\n import { Schema as S } from '@effect/schema';\n \n ${refsSorted.map(ref => {\n const refId = schemaIdForRef(ref);\n if (!refId) { throw new Error(`Invalid ref: ${ref}`); }\n return `import { ${id(refId)} } from '${ref}';`;\n }).join('\\n')}\n \n ${commentsGenerated.commentBlock}\n export const ${id(schemaId)} = ${code}; ${commentsGenerated.commentInline}\n export type ${id(schemaId)} = S.Schema.Type<typeof ${id(schemaId)}>;\n export const ${id(schemaId)}Encoded = S.encodedSchema(${id(schemaId)});\n export type ${id(schemaId)}Encoded = S.Schema.Encoded<typeof ${id(schemaId)}>;\n `;\n};\n"],"mappings":";;;;;;AAOA,IAAAA,SAAA,GAAAC,OAAA;AAGA,IAAAC,QAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAF,OAAA;AAXA;AACA;AACA;AACA;AACA;AACA;;AASA,MAAMG,EAAE,GAAGC,sBAAa,CAACC,gBAAgB;;AAEzC;AACA;AACO,MAAMC,cAAc,GAAGA,CAACC,QAAgB,EAAEC,MAAqB,KAAa;EACjF,MAAMC,iBAAmC,GAAG;IAC1CC,OAAO,EAAE,CAAC,CAAC;IAAE;IACbC,KAAK,EAAE,CAAC,CAAC;IACTC,gBAAgBA,CAACC,SAA0B,EAAE;MAAE,OAAO,IAAI;IAAE;EAC9D,CAAC;EACD,MAAM;IAAEC,IAAI;IAAEC,IAAI;IAAEC;EAAS,CAAC,GAAG,IAAAC,4BAAiB,EAACR,iBAAiB,EAAED,MAAM,CAAC;EAC7E,MAAMU,iBAAiB,GAAGd,sBAAa,CAACe,cAAc,CAACH,QAAQ,CAAC;EAEhE,MAAMI,cAAc,GAAIC,GAAW,IAAyBA,GAAG,CAACC,KAAK,CAAC,GAAG,CAAC,CAACC,EAAE,CAAC,CAAC,CAAC,CAAC;EACjF,MAAMC,cAAc,GAAIH,GAAW,IAAyBD,cAAc,CAACC,GAAG,CAAC,EAAEI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;EAErG,MAAMC,UAAU,GAAG,CAAC,GAAGX,IAAI,CAAC,CACzBY,MAAM,CAACN,GAAG,IAAIG,cAAc,CAACH,GAAG,CAAC,KAAKd,QAAQ,CAAC,CAC/CqB,IAAI,CAAC,CAACC,IAAI,EAAEC,IAAI,KAAK;IACpB,IAAID,IAAI,CAACE,UAAU,CAAC,UAAU,CAAC,EAAE;MAC/B,OAAO,CAAC,CAAC;IACX,CAAC,MAAM,IAAID,IAAI,CAACC,UAAU,CAAC,UAAU,CAAC,EAAE;MACtC,OAAO,CAAC,CAAC;IACX;IACA,OAAO,CAAC;EACV,CAAC,CAAC;EACJ,OAAO,IAAAC,gBAAM;AACf;AACA;AACA;AACA,MAAMN,UAAU,CAACO,GAAG,CAACZ,GAAG,IAAI;IACtB,MAAMa,KAAK,GAAGV,cAAc,CAACH,GAAG,CAAC;IACjC,IAAI,CAACa,KAAK,EAAE;MAAE,MAAM,IAAIC,KAAK,CAAC,gBAAgBd,GAAG,EAAE,CAAC;IAAE;IACtD,OAAO,YAAYlB,EAAE,CAAC+B,KAAK,CAAC,YAAYb,GAAG,IAAI;EACjD,CAAC,CAAC,CAACe,IAAI,CAAC,IAAI,CAAC;AACjB;AACA,MAAMlB,iBAAiB,CAACmB,YAAY;AACpC,mBAAmBlC,EAAE,CAACI,QAAQ,CAAC,MAAMO,IAAI,KAAKI,iBAAiB,CAACoB,aAAa;AAC7E,kBAAkBnC,EAAE,CAACI,QAAQ,CAAC,2BAA2BJ,EAAE,CAACI,QAAQ,CAAC;AACrE,mBAAmBJ,EAAE,CAACI,QAAQ,CAAC,6BAA6BJ,EAAE,CAACI,QAAQ,CAAC;AACxE,kBAAkBJ,EAAE,CAACI,QAAQ,CAAC,qCAAqCJ,EAAE,CAACI,QAAQ,CAAC;AAC/E,GAAG;AACH,CAAC;AAACgC,OAAA,CAAAjC,cAAA,GAAAA,cAAA","ignoreList":[]}
{"version":3,"file":"moduleGen.cjs","names":["_tsDedent","require","_genUtil","_schemaGen","id","GenResultUtil","encodeIdentifier","generateModule","schemaId","schema","generationContext","schemas","hooks","isSchemaIdBefore","_schemaId","code","refs","comments","generateForSchema","commentsGenerated","commentsToCode","fileNameForRef","ref","split","at","schemaIdForRef","replace","refsSorted","filter","sort","ref1","ref2","startsWith","dedent","map","refId","Error","join","commentBlock","commentInline","exports"],"sources":["../../../../src/generation/effSchemGen/moduleGen.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport { type OpenApiSchemaId, type OpenApiSchema } from '../../util/openapi.ts';\n\nimport { GenResultUtil } from './genUtil.ts';\nimport { type Context as SchemaGenContext, generateForSchema } from './schemaGen.ts';\n\n\nconst id = GenResultUtil.encodeIdentifier;\n\n// Take an OpenAPI schema and generate a top-level module, as a string.\n// @throws Error When we cannot generate a module from the given schema.\nexport const generateModule = (schemaId: string, schema: OpenApiSchema): string => {\n const generationContext: SchemaGenContext = {\n schemas: {}, // FIXME\n hooks: {},\n isSchemaIdBefore(_schemaId: OpenApiSchemaId) { return true; },\n };\n const { code, refs, comments } = generateForSchema(generationContext, schema);\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n \n const fileNameForRef = (ref: string): undefined | string => ref.split('/').at(-1);\n const schemaIdForRef = (ref: string): undefined | string => fileNameForRef(ref)?.replace(/\\.ts$/, '');\n \n const refsSorted = [...refs]\n .filter(ref => schemaIdForRef(ref) !== schemaId)\n .sort((ref1, ref2) => {\n if (ref1.startsWith('../util/')) {\n return -1;\n } else if (ref2.startsWith('../util/')) {\n return +1;\n }\n return 0;\n });\n return dedent`\n import { pipe, Option, Schema as S } from 'effect';\n \n ${refsSorted.map(ref => {\n const refId = schemaIdForRef(ref);\n if (!refId) { throw new Error(`Invalid ref: ${ref}`); }\n return `import { ${id(refId)} } from '${ref}';`;\n }).join('\\n')}\n \n ${commentsGenerated.commentBlock}\n export const ${id(schemaId)} = ${code}; ${commentsGenerated.commentInline}\n export type ${id(schemaId)} = S.Schema.Type<typeof ${id(schemaId)}>;\n export const ${id(schemaId)}Encoded = S.encodedSchema(${id(schemaId)});\n export type ${id(schemaId)}Encoded = S.Schema.Encoded<typeof ${id(schemaId)}>;\n `;\n};\n"],"mappings":";;;;;;AAOA,IAAAA,SAAA,GAAAC,OAAA;AAGA,IAAAC,QAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAF,OAAA;AAXA;AACA;AACA;AACA;AACA;AACA;;AASA,MAAMG,EAAE,GAAGC,sBAAa,CAACC,gBAAgB;;AAEzC;AACA;AACO,MAAMC,cAAc,GAAGA,CAACC,QAAgB,EAAEC,MAAqB,KAAa;EACjF,MAAMC,iBAAmC,GAAG;IAC1CC,OAAO,EAAE,CAAC,CAAC;IAAE;IACbC,KAAK,EAAE,CAAC,CAAC;IACTC,gBAAgBA,CAACC,SAA0B,EAAE;MAAE,OAAO,IAAI;IAAE;EAC9D,CAAC;EACD,MAAM;IAAEC,IAAI;IAAEC,IAAI;IAAEC;EAAS,CAAC,GAAG,IAAAC,4BAAiB,EAACR,iBAAiB,EAAED,MAAM,CAAC;EAC7E,MAAMU,iBAAiB,GAAGd,sBAAa,CAACe,cAAc,CAACH,QAAQ,CAAC;EAEhE,MAAMI,cAAc,GAAIC,GAAW,IAAyBA,GAAG,CAACC,KAAK,CAAC,GAAG,CAAC,CAACC,EAAE,CAAC,CAAC,CAAC,CAAC;EACjF,MAAMC,cAAc,GAAIH,GAAW,IAAyBD,cAAc,CAACC,GAAG,CAAC,EAAEI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;EAErG,MAAMC,UAAU,GAAG,CAAC,GAAGX,IAAI,CAAC,CACzBY,MAAM,CAACN,GAAG,IAAIG,cAAc,CAACH,GAAG,CAAC,KAAKd,QAAQ,CAAC,CAC/CqB,IAAI,CAAC,CAACC,IAAI,EAAEC,IAAI,KAAK;IACpB,IAAID,IAAI,CAACE,UAAU,CAAC,UAAU,CAAC,EAAE;MAC/B,OAAO,CAAC,CAAC;IACX,CAAC,MAAM,IAAID,IAAI,CAACC,UAAU,CAAC,UAAU,CAAC,EAAE;MACtC,OAAO,CAAC,CAAC;IACX;IACA,OAAO,CAAC;EACV,CAAC,CAAC;EACJ,OAAO,IAAAC,gBAAM;AACf;AACA;AACA,MAAMN,UAAU,CAACO,GAAG,CAACZ,GAAG,IAAI;IACtB,MAAMa,KAAK,GAAGV,cAAc,CAACH,GAAG,CAAC;IACjC,IAAI,CAACa,KAAK,EAAE;MAAE,MAAM,IAAIC,KAAK,CAAC,gBAAgBd,GAAG,EAAE,CAAC;IAAE;IACtD,OAAO,YAAYlB,EAAE,CAAC+B,KAAK,CAAC,YAAYb,GAAG,IAAI;EACjD,CAAC,CAAC,CAACe,IAAI,CAAC,IAAI,CAAC;AACjB;AACA,MAAMlB,iBAAiB,CAACmB,YAAY;AACpC,mBAAmBlC,EAAE,CAACI,QAAQ,CAAC,MAAMO,IAAI,KAAKI,iBAAiB,CAACoB,aAAa;AAC7E,kBAAkBnC,EAAE,CAACI,QAAQ,CAAC,2BAA2BJ,EAAE,CAACI,QAAQ,CAAC;AACrE,mBAAmBJ,EAAE,CAACI,QAAQ,CAAC,6BAA6BJ,EAAE,CAACI,QAAQ,CAAC;AACxE,kBAAkBJ,EAAE,CAACI,QAAQ,CAAC,qCAAqCJ,EAAE,CAACI,QAAQ,CAAC;AAC/E,GAAG;AACH,CAAC;AAACgC,OAAA,CAAAjC,cAAA,GAAAA,cAAA","ignoreList":[]}

@@ -121,3 +121,3 @@ "use strict";

// Generate an @effect/schema module for the given module as per the given module spec
// Generate an Effect Schema module for the given module as per the given module spec

@@ -352,4 +352,3 @@ const generateModuleWithSpec = (schemas, spec, modulePath, options) => {

return (0, _tsDedent.dedent)`
import { pipe, Option } from 'effect';
import { Schema as S } from '@effect/schema';
import { pipe, Option, Schema as S } from 'effect';

@@ -356,0 +355,0 @@ ${codeImports}

@@ -1,1 +0,1 @@

{"version":3,"file":"moduleGenWithSpec.cjs","names":["_tsDedent","require","path","_interopRequireWildcard","GenSpec","_genUtil","_schemaGen","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","assertUnreachable","x","Error","id","GenResultUtil","encodeIdentifier","reorderFields","fieldGroups","schema","TypeError","allOf","map","oneOf","anyOf","type","properties","orderingKeys","Set","values","flatMap","fieldGroup","keys","fieldNames","split","orderingHeadings","entries","reduce","acc","fieldGroupKey","fieldGroupNames","fieldInitial","fromEntries","filter","propKey","includes","sort","prop1Key","prop2Key","indexOf","prop","hasOwn","processSchemaWithSpec","spec","action","fields","generateModuleWithSpec","schemas","modulePath","options","generationContext","hooks","isSchemaIdBefore","schemaId","specModules","runtime","modules","moduleSpec","schemaIds","definitions","def","DefUtil","sourceSchemaIdFromDef","schemasToDefinitionsMap","Map","definition","codeExports","refsModule","definitionSpec","targetSchemaId","targetSchemaIdFromDef","generationContextForSchema","referencedSchemaId","isSchemaBefore","code","sourceSchemaId","refs","comments","generateForSchema","commentsGenerated","commentsToCode","combineRefs","schemaExportComment","dedent","commentBlock","trim","typeDeclaration","commentInline","schemaRaw","replace","typeDeclarationEncoded","typeAnnotation","schemaCode","JSON","stringify","shouldGenerateOpaqueStruct","shouldGenerateOpaqueClass","refsSorted","ref","importName","importNameFromRef","ref1","ref2","codeImports","definitionLocator","modulePathRelative","relative","dirname","startsWith","join","exports"],"sources":["../../../../src/generation/effSchemGen/moduleGenWithSpec.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport * as path from 'node:path';\nimport { type OpenApiRef, type OpenApiSchemaId, type OpenApiSchema } from '../../util/openapi.ts';\n\nimport { refFromSchemaId, isObjectSchema } from '../../analysis/GraphAnalyzer.ts';\nimport * as GenSpec from '../generationSpec.ts';\nimport { type GenResult, GenResultUtil } from './genUtil.ts';\nimport { type Context as SchemaGenContext, generateForSchema } from './schemaGen.ts';\n\n\nconst assertUnreachable = (x: never): never => { throw new Error(`Should not happen`); };\nconst id = GenResultUtil.encodeIdentifier;\n\n\n// Transform the given `schema` by reordering object fields according the given `ordering` spec.\n// @throws TypeError When `schema` is not an object schema.\nconst reorderFields = (fieldGroups: GenSpec.FieldGroups, schema: OpenApiSchema): OpenApiSchema => {\n // We assume the `schema` is an object schema (or close enough to one). If `schema` is an allOf/oneOf/anyOf then\n // we reorder all of the possibilities.\n \n if ('$ref' in schema) { // Case: OpenAPIV3.ReferenceObject\n throw new TypeError(`Not an object schema`);\n } else { // Case: OpenAPIV3.SchemaObject\n if ('items' in schema) { // Case: OpenAPIV3.ArraySchemaObject\n throw new TypeError(`Not an object schema`);\n } else { // Case: OpenAPIV3.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return { ...schema, allOf: schema.allOf.map(schema => reorderFields(fieldGroups, schema)) };\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return { ...schema, oneOf: schema.oneOf.map(schema => reorderFields(fieldGroups, schema)) };\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return { ...schema, anyOf: schema.anyOf.map(schema => reorderFields(fieldGroups, schema)) };\n }\n \n if (schema.type !== 'object') {\n throw new TypeError(`Not an object schema`);\n }\n \n // Reorder `properties` (if any)\n // Note: we don't care about `required` or `additionalProperties` here\n \n const properties: undefined | Record<string, OpenApiSchema> = schema.properties;\n if (typeof properties === 'undefined') { return schema; }\n \n // Prep: get the list of all keys across all groups, for quick lookup purposes\n const orderingKeys: Array<string> = [...new Set(Object.values(fieldGroups).flatMap(fieldGroup => {\n // Each key may be a comma-separated string of field names\n return Object.keys(fieldGroup).flatMap(fieldNames => fieldNames.split(/,\\s*/));\n }))];\n \n // FIXME\n // const groupHeadingComment: null | string = groupKey.startsWith('//')\n // ? groupKey.replace('//', '').trim()\n // : null;\n \n // Get a mapping of the initial fields in the group to the group name (for later annotation purposes)\n const orderingHeadings = Object.entries(fieldGroups).reduce(\n (acc, [fieldGroupKey, fieldGroup]) => {\n const fieldGroupNames = Object.keys(fieldGroup).flatMap(fieldNames => fieldNames.split(/,\\s*/));\n \n // Get the first field in the list (this field will be annotated to identify where the group starts)\n const fieldInitial: undefined | string = fieldGroupNames[0];\n \n if (typeof fieldInitial === 'string') {\n acc[fieldInitial] = fieldGroupKey;\n }\n return acc;\n },\n {} as Record<string, string>,\n );\n \n return {\n ...schema,\n properties: Object.fromEntries(Object.entries(properties)\n .filter(([propKey]) => orderingKeys.includes(propKey))\n .sort(([prop1Key], [prop2Key]) => {\n return orderingKeys.indexOf(prop1Key) - orderingKeys.indexOf(prop2Key);\n })\n .map(([propKey, prop]) => {\n if (Object.hasOwn(orderingHeadings, propKey)) {\n return [propKey, { ...prop, 'x-heading': orderingHeadings[propKey] }];\n } else {\n return [propKey, prop];\n }\n }),\n ),\n };\n }\n }\n};\nconst processSchemaWithSpec = (spec: GenSpec.GenerationDefinitionSpec, schema: OpenApiSchema): OpenApiSchema => {\n if (spec.action !== 'generate-schema') { return schema; }\n \n const fields: undefined | GenSpec.FieldGroups = spec.fields;\n if (typeof fields !== 'undefined') {\n return reorderFields(fields, schema);\n }\n \n return schema;\n};\n\n// Generate an @effect/schema module for the given module as per the given module spec\ntype GenerateModuleWithSpecOptions = {\n // Whether `schema1` is before `schema2` in the generation order\n isSchemaBefore: (schema1: OpenApiSchemaId, schema2: OpenApiSchemaId) => boolean,\n};\nexport const generateModuleWithSpec = (\n schemas: Record<string, OpenApiSchema>, // All available source schemas (may contain ones we don't need)\n spec: GenSpec.GenerationSpec, // The (full) generation spec\n modulePath: GenSpec.ModulePath, // The specific module we want to generate\n options: GenerateModuleWithSpecOptions,\n): string => {\n const generationContext: SchemaGenContext = {\n schemas,\n hooks: spec.hooks,\n isSchemaIdBefore: (schemaId: OpenApiSchemaId): boolean => {\n return true;\n },\n };\n \n const specModules = { ...spec.runtime, ...spec.modules };\n \n const moduleSpec: undefined | GenSpec.GenerationModuleSpec = specModules[modulePath];\n if (typeof moduleSpec === 'undefined') { throw new Error(`Cannot find definition for module ${modulePath}`); }\n \n // Derive the list of all schema IDs from `schemas`\n const schemaIds: Set<OpenApiSchemaId> = new Set(moduleSpec.definitions.map((def): OpenApiSchemaId => {\n return GenSpec.DefUtil.sourceSchemaIdFromDef(def);\n }));\n \n // Reverse mapping of schema IDs to the first definition that contains it\n type DefinitionLocator = { modulePath: GenSpec.ModulePath, definition: GenSpec.GenerationDefinitionSpec };\n const schemasToDefinitionsMap: Map<OpenApiSchemaId, DefinitionLocator> = new Map();\n for (const [modulePath, moduleSpec] of Object.entries(specModules)) {\n for (const definition of moduleSpec.definitions) {\n const schemaId = GenSpec.DefUtil.sourceSchemaIdFromDef(definition);\n if (!schemasToDefinitionsMap.has(schemaId)) {\n schemasToDefinitionsMap.set(schemaId, { modulePath, definition });\n }\n }\n }\n \n let codeExports = '';\n let refsModule: GenResult['refs'] = [];\n for (const definitionSpec of moduleSpec.definitions) {\n const targetSchemaId = GenSpec.DefUtil.targetSchemaIdFromDef(definitionSpec);\n \n const generationContextForSchema: SchemaGenContext = {\n ...generationContext,\n isSchemaIdBefore: (referencedSchemaId: OpenApiSchemaId): boolean => {\n return options.isSchemaBefore(referencedSchemaId, targetSchemaId);\n \n // const referencedDef = schemasToDefinitionsMap.get(referencedSchemaId);\n // if (!referencedDef) { return false; }\n // const defs = moduleSpec.definitions;\n // \n // console.log('YYY', referencedSchemaId, '<-', targetSchemaId, referencedDef.definition);\n // if (defs.indexOf(referencedDef.definition) >= defs.indexOf(definitionSpec)) {\n // console.log('XXX', referencedSchemaId, '>=', targetSchemaId);\n // }\n // \n // return defs.indexOf(referencedDef.definition) < defs.indexOf(definitionSpec);\n },\n };\n \n switch (definitionSpec.action) {\n case 'custom-code': {\n codeExports = definitionSpec.code;\n break;\n };\n case 'custom-schema': {\n const schema: OpenApiSchema = definitionSpec.schema;\n const sourceSchemaId: OpenApiSchemaId = GenSpec.DefUtil.sourceSchemaIdFromDef(definitionSpec);\n \n const { code, refs, comments } = generateForSchema(generationContextForSchema, schema);\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n \n refsModule = GenResultUtil.combineRefs(refsModule, refs);\n \n const schemaExportComment: string = dedent`\n ${commentsGenerated.commentBlock}\n ${sourceSchemaId === targetSchemaId ? '' : `// Generated from OpenAPI \\`${sourceSchemaId}\\` schema`}\n `.trim();\n \n codeExports += '\\n\\n' + dedent`\n ${schemaExportComment ? `${schemaExportComment}\\n` : ''}${\n typeof definitionSpec.typeDeclaration === 'string'\n //? `export const ${id(targetSchemaId)}: S.Schema<${id(targetSchemaId)}> = ` // Replaced with suspend annotations\n ? `export const ${id(targetSchemaId)} = `\n : `export const ${id(targetSchemaId)} = `\n }${\n //definitionSpec.lazy ? `S.suspend(() => ${code});` : code // Replaced with suspend annotations\n code\n }; ${commentsGenerated.commentInline}\n `.trim();\n if (typeof definitionSpec.typeDeclaration === 'string') {\n codeExports += dedent`\n export type ${id(targetSchemaId)} = ${definitionSpec.typeDeclaration};\n `;\n } else {\n codeExports += dedent`\n export type ${id(targetSchemaId)} = S.Schema.Type<typeof ${id(targetSchemaId)}>;\n `;\n }\n break;\n };\n case 'generate-schema': {\n const sourceSchemaId: OpenApiSchemaId = GenSpec.DefUtil.sourceSchemaIdFromDef(definitionSpec);\n const schemaRaw: undefined | OpenApiSchema = schemas[sourceSchemaId];\n if (!schemaRaw) { throw new Error(`Could not find a schema named ${sourceSchemaId}`) }\n const schema: OpenApiSchema = processSchemaWithSpec(definitionSpec, schemaRaw);\n \n const { code, refs, comments } = generateForSchema(generationContextForSchema, schema);\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n \n refsModule = GenResultUtil.combineRefs(refsModule, refs);\n \n \n // Start generating the schema exports\n codeExports += '\\n\\n';\n \n // Comments\n codeExports += dedent`\n /* ${id(targetSchemaId)} */\n ${commentsGenerated.commentBlock}\n ${sourceSchemaId === targetSchemaId ? '' : `// Generated from OpenAPI \\`${sourceSchemaId}\\` schema`}\n `.replace(/[\\n]+/, '\\n') + '\\n';\n \n // Manual type declarations (for recursive references)\n if (typeof definitionSpec.typeDeclaration === 'string') {\n codeExports += `type _${id(targetSchemaId)} = ${definitionSpec.typeDeclaration};`;\n if (typeof definitionSpec.typeDeclarationEncoded === 'string') {\n codeExports += `type _${id(targetSchemaId)}Encoded = ${definitionSpec.typeDeclarationEncoded};`;\n }\n }\n /*\n const typeAnnotation = typeof definitionSpec.typeDeclaration === 'string'\n ? (\n typeof definitionSpec.typeDeclarationEncoded === 'string'\n ? `: S.Schema<_${id(targetSchemaId)}, _${id(targetSchemaId)}Encoded>`\n : `: S.Schema<_${id(targetSchemaId)}>`\n )\n : '';\n */\n const typeAnnotation = ''; // Replaced with suspend annotations\n \n const schemaCode = dedent`\n ${\n //definitionSpec.lazy ? `S.suspend(() => ${code})` : code // Replaced with suspend annotations\n code\n }\n .annotations({ identifier: ${JSON.stringify(targetSchemaId)} })\n `.trim();\n \n // See: https://github.com/Effect-TS/effect/tree/main/packages/schema#understanding-opaque-names\n const shouldGenerateOpaqueStruct = false;//isObjectSchema(schemas, refFromSchemaId(sourceSchemaId));\n const shouldGenerateOpaqueClass = false; //isObjectSchema(schemas, refFromSchemaId(sourceSchemaId)) && /^S.Struct/.test(code);\n if (shouldGenerateOpaqueStruct) {\n codeExports += dedent`\n const _${id(targetSchemaId)}${typeAnnotation} = ${schemaCode}; ${commentsGenerated.commentInline}\n export interface ${id(targetSchemaId)} extends S.Schema.Type<typeof _${id(targetSchemaId)}> {}\n export interface ${id(targetSchemaId)}Encoded extends S.Schema.Encoded<typeof _${id(targetSchemaId)}> {}\n export const ${id(targetSchemaId)}: S.Schema<${id(targetSchemaId)}, ${id(targetSchemaId)}Encoded> = _${id(targetSchemaId)};\n `.trim();\n /* To generate the runtime encoded schema:\n export const ${id(targetSchemaId)}Encoded: S.Schema<${id(targetSchemaId)}Encoded, ${id(targetSchemaId)}Encoded> =\n S.encodedSchema(_${id(targetSchemaId)});\n */\n } else if (shouldGenerateOpaqueClass) {\n // Experimental: generate a top level Struct as a class (for better opaque types)\n codeExports += dedent`\n export class ${id(targetSchemaId)} extends S.Class<${id(targetSchemaId)}>(\"${id(targetSchemaId)}\")(\n ${code.replace(/^S\\.Struct\\(/, '').replace(/\\),?$/, '')}\n ) {}\n `.trim();\n } else {\n codeExports += dedent`\n export const ${id(targetSchemaId)}${typeAnnotation} = ${schemaCode}; ${commentsGenerated.commentInline}\n export type ${id(targetSchemaId)} = S.Schema.Type<typeof ${id(targetSchemaId)}>;\n export type ${id(targetSchemaId)}Encoded = S.Schema.Encoded<typeof ${id(targetSchemaId)}>;\n `.trim();\n /* To generate the runtime encoded schema:\n export const ${id(targetSchemaId)}Encoded = S.encodedSchema(${id(targetSchemaId)});\n */\n }\n break;\n };\n default: assertUnreachable(definitionSpec);\n }\n }\n \n const refsSorted = [...refsModule]\n .filter(ref => {\n // Filter out imports that are already part of this file\n const importName = GenResultUtil.importNameFromRef(ref);\n return !schemaIds.has(importName);\n })\n .sort((ref1, ref2) => {\n // Sort certain imports at the top\n // FIXME: unhardcode this logic somehow\n if (ref1.includes('/util/')) {\n return -1;\n } else if (ref2.includes('/util/')) {\n return +1;\n }\n return 0;\n });\n \n const codeImports = dedent`\n ${refsSorted.map(ref => {\n const sourceSchemaId: OpenApiSchemaId = GenResultUtil.importNameFromRef(ref); // Get the source schema ID\n \n // Try to reverse-map this schema ID to one of the spec's definitions\n const definitionLocator: undefined | DefinitionLocator = schemasToDefinitionsMap.get(sourceSchemaId);\n \n if (typeof definitionLocator !== 'undefined') {\n const targetSchemaId = GenSpec.DefUtil.targetSchemaIdFromDef(definitionLocator.definition);\n \n // Calculate the relative path to the module\n let modulePathRelative = path.relative(path.dirname(modulePath), definitionLocator.modulePath);\n if (!modulePathRelative.startsWith('.')) { // Ensure the path starts with a `.` (ESM import paths require it)\n modulePathRelative = './' + modulePathRelative;\n }\n \n return `import { ${id(targetSchemaId)} } from '${modulePathRelative}';`;\n } else {\n return `// MISSING ${sourceSchemaId}`;\n //return `import { ${sourceSchemaId} } from '${ref}';`;\n }\n }).join('\\n')}\n `;\n \n // TODO: may want to add a comment at the top like:\n // /* Generated on ${new Date().toISOString()} from ${apiName} version ${apiVersion} */\n // Currently leaving this out because it means even simple changes cause a git diff upon regeneration.\n return dedent`\n import { pipe, Option } from 'effect';\n import { Schema as S } from '@effect/schema';\n \n ${codeImports}\n \n ${codeExports}\n `;\n};\n"],"mappings":";;;;;;AAOA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAC,uBAAA,CAAAF,OAAA;AAIA,IAAAG,OAAA,GAAAD,uBAAA,CAAAF,OAAA;AACA,IAAAI,QAAA,GAAAJ,OAAA;AACA,IAAAK,UAAA,GAAAL,OAAA;AAAqF,SAAAM,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAL,wBAAAK,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAdrF;AACA;AACA;AACA;AACA;AACA;;AAYA,MAAMW,iBAAiB,GAAIC,CAAQ,IAAY;EAAE,MAAM,IAAIC,KAAK,CAAC,mBAAmB,CAAC;AAAE,CAAC;AACxF,MAAMC,EAAE,GAAGC,sBAAa,CAACC,gBAAgB;;AAGzC;AACA;AACA,MAAMC,aAAa,GAAGA,CAACC,WAAgC,EAAEC,MAAqB,KAAoB;EAChG;EACA;;EAEA,IAAI,MAAM,IAAIA,MAAM,EAAE;IAAE;IACtB,MAAM,IAAIC,SAAS,CAAC,sBAAsB,CAAC;EAC7C,CAAC,MAAM;IAAE;IACP,IAAI,OAAO,IAAID,MAAM,EAAE;MAAE;MACvB,MAAM,IAAIC,SAAS,CAAC,sBAAsB,CAAC;IAC7C,CAAC,MAAM;MAAE;MACP,IAAI,OAAO,IAAID,MAAM,IAAI,OAAOA,MAAM,CAACE,KAAK,KAAK,WAAW,EAAE;QAC5D,OAAO;UAAE,GAAGF,MAAM;UAAEE,KAAK,EAAEF,MAAM,CAACE,KAAK,CAACC,GAAG,CAACH,MAAM,IAAIF,aAAa,CAACC,WAAW,EAAEC,MAAM,CAAC;QAAE,CAAC;MAC7F,CAAC,MAAM,IAAI,OAAO,IAAIA,MAAM,IAAI,OAAOA,MAAM,CAACI,KAAK,KAAK,WAAW,EAAE;QACnE,OAAO;UAAE,GAAGJ,MAAM;UAAEI,KAAK,EAAEJ,MAAM,CAACI,KAAK,CAACD,GAAG,CAACH,MAAM,IAAIF,aAAa,CAACC,WAAW,EAAEC,MAAM,CAAC;QAAE,CAAC;MAC7F,CAAC,MAAM,IAAI,OAAO,IAAIA,MAAM,IAAI,OAAOA,MAAM,CAACK,KAAK,KAAK,WAAW,EAAE;QACnE,OAAO;UAAE,GAAGL,MAAM;UAAEK,KAAK,EAAEL,MAAM,CAACK,KAAK,CAACF,GAAG,CAACH,MAAM,IAAIF,aAAa,CAACC,WAAW,EAAEC,MAAM,CAAC;QAAE,CAAC;MAC7F;MAEA,IAAIA,MAAM,CAACM,IAAI,KAAK,QAAQ,EAAE;QAC5B,MAAM,IAAIL,SAAS,CAAC,sBAAsB,CAAC;MAC7C;;MAEA;MACA;;MAEA,MAAMM,UAAqD,GAAGP,MAAM,CAACO,UAAU;MAC/E,IAAI,OAAOA,UAAU,KAAK,WAAW,EAAE;QAAE,OAAOP,MAAM;MAAE;;MAExD;MACA,MAAMQ,YAA2B,GAAG,CAAC,GAAG,IAAIC,GAAG,CAACzB,MAAM,CAAC0B,MAAM,CAACX,WAAW,CAAC,CAACY,OAAO,CAACC,UAAU,IAAI;QAC/F;QACA,OAAO5B,MAAM,CAAC6B,IAAI,CAACD,UAAU,CAAC,CAACD,OAAO,CAACG,UAAU,IAAIA,UAAU,CAACC,KAAK,CAAC,MAAM,CAAC,CAAC;MAChF,CAAC,CAAC,CAAC,CAAC;;MAEJ;MACA;MACA;MACA;;MAEA;MACA,MAAMC,gBAAgB,GAAGhC,MAAM,CAACiC,OAAO,CAAClB,WAAW,CAAC,CAACmB,MAAM,CACzD,CAACC,GAAG,EAAE,CAACC,aAAa,EAAER,UAAU,CAAC,KAAK;QACpC,MAAMS,eAAe,GAAGrC,MAAM,CAAC6B,IAAI,CAACD,UAAU,CAAC,CAACD,OAAO,CAACG,UAAU,IAAIA,UAAU,CAACC,KAAK,CAAC,MAAM,CAAC,CAAC;;QAE/F;QACA,MAAMO,YAAgC,GAAGD,eAAe,CAAC,CAAC,CAAC;QAE3D,IAAI,OAAOC,YAAY,KAAK,QAAQ,EAAE;UACpCH,GAAG,CAACG,YAAY,CAAC,GAAGF,aAAa;QACnC;QACA,OAAOD,GAAG;MACZ,CAAC,EACD,CAAC,CACH,CAAC;MAED,OAAO;QACL,GAAGnB,MAAM;QACTO,UAAU,EAAEvB,MAAM,CAACuC,WAAW,CAACvC,MAAM,CAACiC,OAAO,CAACV,UAAU,CAAC,CACtDiB,MAAM,CAAC,CAAC,CAACC,OAAO,CAAC,KAAKjB,YAAY,CAACkB,QAAQ,CAACD,OAAO,CAAC,CAAC,CACrDE,IAAI,CAAC,CAAC,CAACC,QAAQ,CAAC,EAAE,CAACC,QAAQ,CAAC,KAAK;UAChC,OAAOrB,YAAY,CAACsB,OAAO,CAACF,QAAQ,CAAC,GAAGpB,YAAY,CAACsB,OAAO,CAACD,QAAQ,CAAC;QACxE,CAAC,CAAC,CACD1B,GAAG,CAAC,CAAC,CAACsB,OAAO,EAAEM,IAAI,CAAC,KAAK;UACxB,IAAI/C,MAAM,CAACgD,MAAM,CAAChB,gBAAgB,EAAES,OAAO,CAAC,EAAE;YAC5C,OAAO,CAACA,OAAO,EAAE;cAAE,GAAGM,IAAI;cAAE,WAAW,EAAEf,gBAAgB,CAACS,OAAO;YAAE,CAAC,CAAC;UACvE,CAAC,MAAM;YACL,OAAO,CAACA,OAAO,EAAEM,IAAI,CAAC;UACxB;QACF,CAAC,CACH;MACF,CAAC;IACH;EACF;AACF,CAAC;AACD,MAAME,qBAAqB,GAAGA,CAACC,IAAsC,EAAElC,MAAqB,KAAoB;EAC9G,IAAIkC,IAAI,CAACC,MAAM,KAAK,iBAAiB,EAAE;IAAE,OAAOnC,MAAM;EAAE;EAExD,MAAMoC,MAAuC,GAAGF,IAAI,CAACE,MAAM;EAC3D,IAAI,OAAOA,MAAM,KAAK,WAAW,EAAE;IACjC,OAAOtC,aAAa,CAACsC,MAAM,EAAEpC,MAAM,CAAC;EACtC;EAEA,OAAOA,MAAM;AACf,CAAC;;AAED;;AAKO,MAAMqC,sBAAsB,GAAGA,CACpCC,OAAsC,EACtCJ,IAA4B,EAC5BK,UAA8B,EAC9BC,OAAsC,KAC3B;EACX,MAAMC,iBAAmC,GAAG;IAC1CH,OAAO;IACPI,KAAK,EAAER,IAAI,CAACQ,KAAK;IACjBC,gBAAgB,EAAGC,QAAyB,IAAc;MACxD,OAAO,IAAI;IACb;EACF,CAAC;EAED,MAAMC,WAAW,GAAG;IAAE,GAAGX,IAAI,CAACY,OAAO;IAAE,GAAGZ,IAAI,CAACa;EAAQ,CAAC;EAExD,MAAMC,UAAoD,GAAGH,WAAW,CAACN,UAAU,CAAC;EACpF,IAAI,OAAOS,UAAU,KAAK,WAAW,EAAE;IAAE,MAAM,IAAItD,KAAK,CAAC,qCAAqC6C,UAAU,EAAE,CAAC;EAAE;;EAE7G;EACA,MAAMU,SAA+B,GAAG,IAAIxC,GAAG,CAACuC,UAAU,CAACE,WAAW,CAAC/C,GAAG,CAAEgD,GAAG,IAAsB;IACnG,OAAOlF,OAAO,CAACmF,OAAO,CAACC,qBAAqB,CAACF,GAAG,CAAC;EACnD,CAAC,CAAC,CAAC;;EAEH;;EAEA,MAAMG,uBAAgE,GAAG,IAAIC,GAAG,CAAC,CAAC;EAClF,KAAK,MAAM,CAAChB,UAAU,EAAES,UAAU,CAAC,IAAIhE,MAAM,CAACiC,OAAO,CAAC4B,WAAW,CAAC,EAAE;IAClE,KAAK,MAAMW,UAAU,IAAIR,UAAU,CAACE,WAAW,EAAE;MAC/C,MAAMN,QAAQ,GAAG3E,OAAO,CAACmF,OAAO,CAACC,qBAAqB,CAACG,UAAU,CAAC;MAClE,IAAI,CAACF,uBAAuB,CAAC3E,GAAG,CAACiE,QAAQ,CAAC,EAAE;QAC1CU,uBAAuB,CAAC/D,GAAG,CAACqD,QAAQ,EAAE;UAAEL,UAAU;UAAEiB;QAAW,CAAC,CAAC;MACnE;IACF;EACF;EAEA,IAAIC,WAAW,GAAG,EAAE;EACpB,IAAIC,UAA6B,GAAG,EAAE;EACtC,KAAK,MAAMC,cAAc,IAAIX,UAAU,CAACE,WAAW,EAAE;IACnD,MAAMU,cAAc,GAAG3F,OAAO,CAACmF,OAAO,CAACS,qBAAqB,CAACF,cAAc,CAAC;IAE5E,MAAMG,0BAA4C,GAAG;MACnD,GAAGrB,iBAAiB;MACpBE,gBAAgB,EAAGoB,kBAAmC,IAAc;QAClE,OAAOvB,OAAO,CAACwB,cAAc,CAACD,kBAAkB,EAAEH,cAAc,CAAC;;QAEjE;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;MACF;IACF,CAAC;IAED,QAAQD,cAAc,CAACxB,MAAM;MAC3B,KAAK,aAAa;QAAE;UAClBsB,WAAW,GAAGE,cAAc,CAACM,IAAI;UACjC;QACF;QAAC;MACD,KAAK,eAAe;QAAE;UACpB,MAAMjE,MAAqB,GAAG2D,cAAc,CAAC3D,MAAM;UACnD,MAAMkE,cAA+B,GAAGjG,OAAO,CAACmF,OAAO,CAACC,qBAAqB,CAACM,cAAc,CAAC;UAE7F,MAAM;YAAEM,IAAI;YAAEE,IAAI;YAAEC;UAAS,CAAC,GAAG,IAAAC,4BAAiB,EAACP,0BAA0B,EAAE9D,MAAM,CAAC;UACtF,MAAMsE,iBAAiB,GAAG1E,sBAAa,CAAC2E,cAAc,CAACH,QAAQ,CAAC;UAEhEV,UAAU,GAAG9D,sBAAa,CAAC4E,WAAW,CAACd,UAAU,EAAES,IAAI,CAAC;UAExD,MAAMM,mBAA2B,GAAG,IAAAC,gBAAM;AAClD,YAAYJ,iBAAiB,CAACK,YAAY;AAC1C,YAAYT,cAAc,KAAKN,cAAc,GAAG,EAAE,GAAG,+BAA+BM,cAAc,WAAW;AAC7G,SAAS,CAACU,IAAI,CAAC,CAAC;UAERnB,WAAW,IAAI,MAAM,GAAG,IAAAiB,gBAAM;AACtC,YAAYD,mBAAmB,GAAG,GAAGA,mBAAmB,IAAI,GAAG,EAAE,GACrD,OAAOd,cAAc,CAACkB,eAAe,KAAK;UACxC;UAAA,EACE,gBAAgBlF,EAAE,CAACiE,cAAc,CAAC,KAAK,GACvC,gBAAgBjE,EAAE,CAACiE,cAAc,CAAC,KAAK;UAE3C;UACAK,IAAI,KACDK,iBAAiB,CAACQ,aAAa;AAC9C,SAAS,CAACF,IAAI,CAAC,CAAC;UACR,IAAI,OAAOjB,cAAc,CAACkB,eAAe,KAAK,QAAQ,EAAE;YACtDpB,WAAW,IAAI,IAAAiB,gBAAM;AAC/B,0BAA0B/E,EAAE,CAACiE,cAAc,CAAC,MAAMD,cAAc,CAACkB,eAAe;AAChF,WAAW;UACH,CAAC,MAAM;YACLpB,WAAW,IAAI,IAAAiB,gBAAM;AAC/B,0BAA0B/E,EAAE,CAACiE,cAAc,CAAC,2BAA2BjE,EAAE,CAACiE,cAAc,CAAC;AACzF,WAAW;UACH;UACA;QACF;QAAC;MACD,KAAK,iBAAiB;QAAE;UACtB,MAAMM,cAA+B,GAAGjG,OAAO,CAACmF,OAAO,CAACC,qBAAqB,CAACM,cAAc,CAAC;UAC7F,MAAMoB,SAAoC,GAAGzC,OAAO,CAAC4B,cAAc,CAAC;UACpE,IAAI,CAACa,SAAS,EAAE;YAAE,MAAM,IAAIrF,KAAK,CAAC,iCAAiCwE,cAAc,EAAE,CAAC;UAAC;UACrF,MAAMlE,MAAqB,GAAGiC,qBAAqB,CAAC0B,cAAc,EAAEoB,SAAS,CAAC;UAE9E,MAAM;YAAEd,IAAI;YAAEE,IAAI;YAAEC;UAAS,CAAC,GAAG,IAAAC,4BAAiB,EAACP,0BAA0B,EAAE9D,MAAM,CAAC;UACtF,MAAMsE,iBAAiB,GAAG1E,sBAAa,CAAC2E,cAAc,CAACH,QAAQ,CAAC;UAEhEV,UAAU,GAAG9D,sBAAa,CAAC4E,WAAW,CAACd,UAAU,EAAES,IAAI,CAAC;;UAGxD;UACAV,WAAW,IAAI,MAAM;;UAErB;UACAA,WAAW,IAAI,IAAAiB,gBAAM;AAC7B,eAAe/E,EAAE,CAACiE,cAAc,CAAC;AACjC,YAAYU,iBAAiB,CAACK,YAAY;AAC1C,YAAYT,cAAc,KAAKN,cAAc,GAAG,EAAE,GAAG,+BAA+BM,cAAc,WAAW;AAC7G,SAAS,CAACc,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI;;UAE/B;UACA,IAAI,OAAOrB,cAAc,CAACkB,eAAe,KAAK,QAAQ,EAAE;YACtDpB,WAAW,IAAI,SAAS9D,EAAE,CAACiE,cAAc,CAAC,MAAMD,cAAc,CAACkB,eAAe,GAAG;YACjF,IAAI,OAAOlB,cAAc,CAACsB,sBAAsB,KAAK,QAAQ,EAAE;cAC7DxB,WAAW,IAAI,SAAS9D,EAAE,CAACiE,cAAc,CAAC,aAAaD,cAAc,CAACsB,sBAAsB,GAAG;YACjG;UACF;UACA;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;UACO,MAAMC,cAAc,GAAG,EAAE,CAAC,CAAC;;UAE1B,MAAMC,UAAU,GAAG,IAAAT,gBAAM;AACjC;UACY;UACAT,IAAI;AAChB,yCACyCmB,IAAI,CAACC,SAAS,CAACzB,cAAc,CAAC;AACvE,SAAS,CAACgB,IAAI,CAAC,CAAC;;UAER;UACA,MAAMU,0BAA0B,GAAG,KAAK,CAAC;UACzC,MAAMC,yBAAyB,GAAG,KAAK,CAAC,CAAC;UACzC,IAAID,0BAA0B,EAAE;YAC9B7B,WAAW,IAAI,IAAAiB,gBAAM;AAC/B,qBAAqB/E,EAAE,CAACiE,cAAc,CAAC,GAAGsB,cAAc,MAAMC,UAAU,KAAKb,iBAAiB,CAACQ,aAAa;AAC5G,+BAA+BnF,EAAE,CAACiE,cAAc,CAAC,kCAAkCjE,EAAE,CAACiE,cAAc,CAAC;AACrG,+BAA+BjE,EAAE,CAACiE,cAAc,CAAC,4CAA4CjE,EAAE,CAACiE,cAAc,CAAC;AAC/G,2BAA2BjE,EAAE,CAACiE,cAAc,CAAC,cAAcjE,EAAE,CAACiE,cAAc,CAAC,KAAKjE,EAAE,CAACiE,cAAc,CAAC,eAAejE,EAAE,CAACiE,cAAc,CAAC;AACrI,WAAW,CAACgB,IAAI,CAAC,CAAC;YACR;AACV;AACA;AACA;UACQ,CAAC,MAAM,IAAIW,yBAAyB,EAAE;YACpC;YACA9B,WAAW,IAAI,IAAAiB,gBAAM;AAC/B,2BAA2B/E,EAAE,CAACiE,cAAc,CAAC,oBAAoBjE,EAAE,CAACiE,cAAc,CAAC,MAAMjE,EAAE,CAACiE,cAAc,CAAC;AAC3G,gBAAgBK,IAAI,CAACe,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;AACrE;AACA,WAAW,CAACJ,IAAI,CAAC,CAAC;UACV,CAAC,MAAM;YACLnB,WAAW,IAAI,IAAAiB,gBAAM;AAC/B,2BAA2B/E,EAAE,CAACiE,cAAc,CAAC,GAAGsB,cAAc,MAAMC,UAAU,KAAKb,iBAAiB,CAACQ,aAAa;AAClH,0BAA0BnF,EAAE,CAACiE,cAAc,CAAC,2BAA2BjE,EAAE,CAACiE,cAAc,CAAC;AACzF,0BAA0BjE,EAAE,CAACiE,cAAc,CAAC,qCAAqCjE,EAAE,CAACiE,cAAc,CAAC;AACnG,WAAW,CAACgB,IAAI,CAAC,CAAC;YACR;AACV;AACA;UACQ;UACA;QACF;QAAC;MACD;QAASpF,iBAAiB,CAACmE,cAAc,CAAC;IAC5C;EACF;EAEA,MAAM6B,UAAU,GAAG,CAAC,GAAG9B,UAAU,CAAC,CAC/BlC,MAAM,CAACiE,GAAG,IAAI;IACb;IACA,MAAMC,UAAU,GAAG9F,sBAAa,CAAC+F,iBAAiB,CAACF,GAAG,CAAC;IACvD,OAAO,CAACxC,SAAS,CAACtE,GAAG,CAAC+G,UAAU,CAAC;EACnC,CAAC,CAAC,CACD/D,IAAI,CAAC,CAACiE,IAAI,EAAEC,IAAI,KAAK;IACpB;IACA;IACA,IAAID,IAAI,CAAClE,QAAQ,CAAC,QAAQ,CAAC,EAAE;MAC3B,OAAO,CAAC,CAAC;IACX,CAAC,MAAM,IAAImE,IAAI,CAACnE,QAAQ,CAAC,QAAQ,CAAC,EAAE;MAClC,OAAO,CAAC,CAAC;IACX;IACA,OAAO,CAAC;EACV,CAAC,CAAC;EAEJ,MAAMoE,WAAW,GAAG,IAAApB,gBAAM;AAC5B,MAAMc,UAAU,CAACrF,GAAG,CAACsF,GAAG,IAAI;IACtB,MAAMvB,cAA+B,GAAGtE,sBAAa,CAAC+F,iBAAiB,CAACF,GAAG,CAAC,CAAC,CAAC;;IAE9E;IACA,MAAMM,iBAAgD,GAAGzC,uBAAuB,CAAC1E,GAAG,CAACsF,cAAc,CAAC;IAEpG,IAAI,OAAO6B,iBAAiB,KAAK,WAAW,EAAE;MAC5C,MAAMnC,cAAc,GAAG3F,OAAO,CAACmF,OAAO,CAACS,qBAAqB,CAACkC,iBAAiB,CAACvC,UAAU,CAAC;;MAE1F;MACA,IAAIwC,kBAAkB,GAAGjI,IAAI,CAACkI,QAAQ,CAAClI,IAAI,CAACmI,OAAO,CAAC3D,UAAU,CAAC,EAAEwD,iBAAiB,CAACxD,UAAU,CAAC;MAC9F,IAAI,CAACyD,kBAAkB,CAACG,UAAU,CAAC,GAAG,CAAC,EAAE;QAAE;QACzCH,kBAAkB,GAAG,IAAI,GAAGA,kBAAkB;MAChD;MAEA,OAAO,YAAYrG,EAAE,CAACiE,cAAc,CAAC,YAAYoC,kBAAkB,IAAI;IACzE,CAAC,MAAM;MACL,OAAO,cAAc9B,cAAc,EAAE;MACrC;IACF;EACF,CAAC,CAAC,CAACkC,IAAI,CAAC,IAAI,CAAC;AACjB,GAAG;;EAED;EACA;EACA;EACA,OAAO,IAAA1B,gBAAM;AACf;AACA;AACA;AACA,MAAMoB,WAAW;AACjB;AACA,MAAMrC,WAAW;AACjB,GAAG;AACH,CAAC;AAAC4C,OAAA,CAAAhE,sBAAA,GAAAA,sBAAA","ignoreList":[]}
{"version":3,"file":"moduleGenWithSpec.cjs","names":["_tsDedent","require","path","_interopRequireWildcard","GenSpec","_genUtil","_schemaGen","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","assertUnreachable","x","Error","id","GenResultUtil","encodeIdentifier","reorderFields","fieldGroups","schema","TypeError","allOf","map","oneOf","anyOf","type","properties","orderingKeys","Set","values","flatMap","fieldGroup","keys","fieldNames","split","orderingHeadings","entries","reduce","acc","fieldGroupKey","fieldGroupNames","fieldInitial","fromEntries","filter","propKey","includes","sort","prop1Key","prop2Key","indexOf","prop","hasOwn","processSchemaWithSpec","spec","action","fields","generateModuleWithSpec","schemas","modulePath","options","generationContext","hooks","isSchemaIdBefore","schemaId","specModules","runtime","modules","moduleSpec","schemaIds","definitions","def","DefUtil","sourceSchemaIdFromDef","schemasToDefinitionsMap","Map","definition","codeExports","refsModule","definitionSpec","targetSchemaId","targetSchemaIdFromDef","generationContextForSchema","referencedSchemaId","isSchemaBefore","code","sourceSchemaId","refs","comments","generateForSchema","commentsGenerated","commentsToCode","combineRefs","schemaExportComment","dedent","commentBlock","trim","typeDeclaration","commentInline","schemaRaw","replace","typeDeclarationEncoded","typeAnnotation","schemaCode","JSON","stringify","shouldGenerateOpaqueStruct","shouldGenerateOpaqueClass","refsSorted","ref","importName","importNameFromRef","ref1","ref2","codeImports","definitionLocator","modulePathRelative","relative","dirname","startsWith","join","exports"],"sources":["../../../../src/generation/effSchemGen/moduleGenWithSpec.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport * as path from 'node:path';\nimport { type OpenApiRef, type OpenApiSchemaId, type OpenApiSchema } from '../../util/openapi.ts';\n\nimport { refFromSchemaId, isObjectSchema } from '../../analysis/GraphAnalyzer.ts';\nimport * as GenSpec from '../generationSpec.ts';\nimport { type GenResult, GenResultUtil } from './genUtil.ts';\nimport { type Context as SchemaGenContext, generateForSchema } from './schemaGen.ts';\n\n\nconst assertUnreachable = (x: never): never => { throw new Error(`Should not happen`); };\nconst id = GenResultUtil.encodeIdentifier;\n\n\n// Transform the given `schema` by reordering object fields according the given `ordering` spec.\n// @throws TypeError When `schema` is not an object schema.\nconst reorderFields = (fieldGroups: GenSpec.FieldGroups, schema: OpenApiSchema): OpenApiSchema => {\n // We assume the `schema` is an object schema (or close enough to one). If `schema` is an allOf/oneOf/anyOf then\n // we reorder all of the possibilities.\n \n if ('$ref' in schema) { // Case: OpenAPIV3.ReferenceObject\n throw new TypeError(`Not an object schema`);\n } else { // Case: OpenAPIV3.SchemaObject\n if ('items' in schema) { // Case: OpenAPIV3.ArraySchemaObject\n throw new TypeError(`Not an object schema`);\n } else { // Case: OpenAPIV3.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return { ...schema, allOf: schema.allOf.map(schema => reorderFields(fieldGroups, schema)) };\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return { ...schema, oneOf: schema.oneOf.map(schema => reorderFields(fieldGroups, schema)) };\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return { ...schema, anyOf: schema.anyOf.map(schema => reorderFields(fieldGroups, schema)) };\n }\n \n if (schema.type !== 'object') {\n throw new TypeError(`Not an object schema`);\n }\n \n // Reorder `properties` (if any)\n // Note: we don't care about `required` or `additionalProperties` here\n \n const properties: undefined | Record<string, OpenApiSchema> = schema.properties;\n if (typeof properties === 'undefined') { return schema; }\n \n // Prep: get the list of all keys across all groups, for quick lookup purposes\n const orderingKeys: Array<string> = [...new Set(Object.values(fieldGroups).flatMap(fieldGroup => {\n // Each key may be a comma-separated string of field names\n return Object.keys(fieldGroup).flatMap(fieldNames => fieldNames.split(/,\\s*/));\n }))];\n \n // FIXME\n // const groupHeadingComment: null | string = groupKey.startsWith('//')\n // ? groupKey.replace('//', '').trim()\n // : null;\n \n // Get a mapping of the initial fields in the group to the group name (for later annotation purposes)\n const orderingHeadings = Object.entries(fieldGroups).reduce(\n (acc, [fieldGroupKey, fieldGroup]) => {\n const fieldGroupNames = Object.keys(fieldGroup).flatMap(fieldNames => fieldNames.split(/,\\s*/));\n \n // Get the first field in the list (this field will be annotated to identify where the group starts)\n const fieldInitial: undefined | string = fieldGroupNames[0];\n \n if (typeof fieldInitial === 'string') {\n acc[fieldInitial] = fieldGroupKey;\n }\n return acc;\n },\n {} as Record<string, string>,\n );\n \n return {\n ...schema,\n properties: Object.fromEntries(Object.entries(properties)\n .filter(([propKey]) => orderingKeys.includes(propKey))\n .sort(([prop1Key], [prop2Key]) => {\n return orderingKeys.indexOf(prop1Key) - orderingKeys.indexOf(prop2Key);\n })\n .map(([propKey, prop]) => {\n if (Object.hasOwn(orderingHeadings, propKey)) {\n return [propKey, { ...prop, 'x-heading': orderingHeadings[propKey] }];\n } else {\n return [propKey, prop];\n }\n }),\n ),\n };\n }\n }\n};\nconst processSchemaWithSpec = (spec: GenSpec.GenerationDefinitionSpec, schema: OpenApiSchema): OpenApiSchema => {\n if (spec.action !== 'generate-schema') { return schema; }\n \n const fields: undefined | GenSpec.FieldGroups = spec.fields;\n if (typeof fields !== 'undefined') {\n return reorderFields(fields, schema);\n }\n \n return schema;\n};\n\n// Generate an Effect Schema module for the given module as per the given module spec\ntype GenerateModuleWithSpecOptions = {\n // Whether `schema1` is before `schema2` in the generation order\n isSchemaBefore: (schema1: OpenApiSchemaId, schema2: OpenApiSchemaId) => boolean,\n};\nexport const generateModuleWithSpec = (\n schemas: Record<string, OpenApiSchema>, // All available source schemas (may contain ones we don't need)\n spec: GenSpec.GenerationSpec, // The (full) generation spec\n modulePath: GenSpec.ModulePath, // The specific module we want to generate\n options: GenerateModuleWithSpecOptions,\n): string => {\n const generationContext: SchemaGenContext = {\n schemas,\n hooks: spec.hooks,\n isSchemaIdBefore: (schemaId: OpenApiSchemaId): boolean => {\n return true;\n },\n };\n \n const specModules = { ...spec.runtime, ...spec.modules };\n \n const moduleSpec: undefined | GenSpec.GenerationModuleSpec = specModules[modulePath];\n if (typeof moduleSpec === 'undefined') { throw new Error(`Cannot find definition for module ${modulePath}`); }\n \n // Derive the list of all schema IDs from `schemas`\n const schemaIds: Set<OpenApiSchemaId> = new Set(moduleSpec.definitions.map((def): OpenApiSchemaId => {\n return GenSpec.DefUtil.sourceSchemaIdFromDef(def);\n }));\n \n // Reverse mapping of schema IDs to the first definition that contains it\n type DefinitionLocator = { modulePath: GenSpec.ModulePath, definition: GenSpec.GenerationDefinitionSpec };\n const schemasToDefinitionsMap: Map<OpenApiSchemaId, DefinitionLocator> = new Map();\n for (const [modulePath, moduleSpec] of Object.entries(specModules)) {\n for (const definition of moduleSpec.definitions) {\n const schemaId = GenSpec.DefUtil.sourceSchemaIdFromDef(definition);\n if (!schemasToDefinitionsMap.has(schemaId)) {\n schemasToDefinitionsMap.set(schemaId, { modulePath, definition });\n }\n }\n }\n \n let codeExports = '';\n let refsModule: GenResult['refs'] = [];\n for (const definitionSpec of moduleSpec.definitions) {\n const targetSchemaId = GenSpec.DefUtil.targetSchemaIdFromDef(definitionSpec);\n \n const generationContextForSchema: SchemaGenContext = {\n ...generationContext,\n isSchemaIdBefore: (referencedSchemaId: OpenApiSchemaId): boolean => {\n return options.isSchemaBefore(referencedSchemaId, targetSchemaId);\n \n // const referencedDef = schemasToDefinitionsMap.get(referencedSchemaId);\n // if (!referencedDef) { return false; }\n // const defs = moduleSpec.definitions;\n // \n // console.log('YYY', referencedSchemaId, '<-', targetSchemaId, referencedDef.definition);\n // if (defs.indexOf(referencedDef.definition) >= defs.indexOf(definitionSpec)) {\n // console.log('XXX', referencedSchemaId, '>=', targetSchemaId);\n // }\n // \n // return defs.indexOf(referencedDef.definition) < defs.indexOf(definitionSpec);\n },\n };\n \n switch (definitionSpec.action) {\n case 'custom-code': {\n codeExports = definitionSpec.code;\n break;\n };\n case 'custom-schema': {\n const schema: OpenApiSchema = definitionSpec.schema;\n const sourceSchemaId: OpenApiSchemaId = GenSpec.DefUtil.sourceSchemaIdFromDef(definitionSpec);\n \n const { code, refs, comments } = generateForSchema(generationContextForSchema, schema);\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n \n refsModule = GenResultUtil.combineRefs(refsModule, refs);\n \n const schemaExportComment: string = dedent`\n ${commentsGenerated.commentBlock}\n ${sourceSchemaId === targetSchemaId ? '' : `// Generated from OpenAPI \\`${sourceSchemaId}\\` schema`}\n `.trim();\n \n codeExports += '\\n\\n' + dedent`\n ${schemaExportComment ? `${schemaExportComment}\\n` : ''}${\n typeof definitionSpec.typeDeclaration === 'string'\n //? `export const ${id(targetSchemaId)}: S.Schema<${id(targetSchemaId)}> = ` // Replaced with suspend annotations\n ? `export const ${id(targetSchemaId)} = `\n : `export const ${id(targetSchemaId)} = `\n }${\n //definitionSpec.lazy ? `S.suspend(() => ${code});` : code // Replaced with suspend annotations\n code\n }; ${commentsGenerated.commentInline}\n `.trim();\n if (typeof definitionSpec.typeDeclaration === 'string') {\n codeExports += dedent`\n export type ${id(targetSchemaId)} = ${definitionSpec.typeDeclaration};\n `;\n } else {\n codeExports += dedent`\n export type ${id(targetSchemaId)} = S.Schema.Type<typeof ${id(targetSchemaId)}>;\n `;\n }\n break;\n };\n case 'generate-schema': {\n const sourceSchemaId: OpenApiSchemaId = GenSpec.DefUtil.sourceSchemaIdFromDef(definitionSpec);\n const schemaRaw: undefined | OpenApiSchema = schemas[sourceSchemaId];\n if (!schemaRaw) { throw new Error(`Could not find a schema named ${sourceSchemaId}`) }\n const schema: OpenApiSchema = processSchemaWithSpec(definitionSpec, schemaRaw);\n \n const { code, refs, comments } = generateForSchema(generationContextForSchema, schema);\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n \n refsModule = GenResultUtil.combineRefs(refsModule, refs);\n \n \n // Start generating the schema exports\n codeExports += '\\n\\n';\n \n // Comments\n codeExports += dedent`\n /* ${id(targetSchemaId)} */\n ${commentsGenerated.commentBlock}\n ${sourceSchemaId === targetSchemaId ? '' : `// Generated from OpenAPI \\`${sourceSchemaId}\\` schema`}\n `.replace(/[\\n]+/, '\\n') + '\\n';\n \n // Manual type declarations (for recursive references)\n if (typeof definitionSpec.typeDeclaration === 'string') {\n codeExports += `type _${id(targetSchemaId)} = ${definitionSpec.typeDeclaration};`;\n if (typeof definitionSpec.typeDeclarationEncoded === 'string') {\n codeExports += `type _${id(targetSchemaId)}Encoded = ${definitionSpec.typeDeclarationEncoded};`;\n }\n }\n /*\n const typeAnnotation = typeof definitionSpec.typeDeclaration === 'string'\n ? (\n typeof definitionSpec.typeDeclarationEncoded === 'string'\n ? `: S.Schema<_${id(targetSchemaId)}, _${id(targetSchemaId)}Encoded>`\n : `: S.Schema<_${id(targetSchemaId)}>`\n )\n : '';\n */\n const typeAnnotation = ''; // Replaced with suspend annotations\n \n const schemaCode = dedent`\n ${\n //definitionSpec.lazy ? `S.suspend(() => ${code})` : code // Replaced with suspend annotations\n code\n }\n .annotations({ identifier: ${JSON.stringify(targetSchemaId)} })\n `.trim();\n \n // See: https://github.com/Effect-TS/effect/tree/main/packages/schema#understanding-opaque-names\n const shouldGenerateOpaqueStruct = false;//isObjectSchema(schemas, refFromSchemaId(sourceSchemaId));\n const shouldGenerateOpaqueClass = false; //isObjectSchema(schemas, refFromSchemaId(sourceSchemaId)) && /^S.Struct/.test(code);\n if (shouldGenerateOpaqueStruct) {\n codeExports += dedent`\n const _${id(targetSchemaId)}${typeAnnotation} = ${schemaCode}; ${commentsGenerated.commentInline}\n export interface ${id(targetSchemaId)} extends S.Schema.Type<typeof _${id(targetSchemaId)}> {}\n export interface ${id(targetSchemaId)}Encoded extends S.Schema.Encoded<typeof _${id(targetSchemaId)}> {}\n export const ${id(targetSchemaId)}: S.Schema<${id(targetSchemaId)}, ${id(targetSchemaId)}Encoded> = _${id(targetSchemaId)};\n `.trim();\n /* To generate the runtime encoded schema:\n export const ${id(targetSchemaId)}Encoded: S.Schema<${id(targetSchemaId)}Encoded, ${id(targetSchemaId)}Encoded> =\n S.encodedSchema(_${id(targetSchemaId)});\n */\n } else if (shouldGenerateOpaqueClass) {\n // Experimental: generate a top level Struct as a class (for better opaque types)\n codeExports += dedent`\n export class ${id(targetSchemaId)} extends S.Class<${id(targetSchemaId)}>(\"${id(targetSchemaId)}\")(\n ${code.replace(/^S\\.Struct\\(/, '').replace(/\\),?$/, '')}\n ) {}\n `.trim();\n } else {\n codeExports += dedent`\n export const ${id(targetSchemaId)}${typeAnnotation} = ${schemaCode}; ${commentsGenerated.commentInline}\n export type ${id(targetSchemaId)} = S.Schema.Type<typeof ${id(targetSchemaId)}>;\n export type ${id(targetSchemaId)}Encoded = S.Schema.Encoded<typeof ${id(targetSchemaId)}>;\n `.trim();\n /* To generate the runtime encoded schema:\n export const ${id(targetSchemaId)}Encoded = S.encodedSchema(${id(targetSchemaId)});\n */\n }\n break;\n };\n default: assertUnreachable(definitionSpec);\n }\n }\n \n const refsSorted = [...refsModule]\n .filter(ref => {\n // Filter out imports that are already part of this file\n const importName = GenResultUtil.importNameFromRef(ref);\n return !schemaIds.has(importName);\n })\n .sort((ref1, ref2) => {\n // Sort certain imports at the top\n // FIXME: unhardcode this logic somehow\n if (ref1.includes('/util/')) {\n return -1;\n } else if (ref2.includes('/util/')) {\n return +1;\n }\n return 0;\n });\n \n const codeImports = dedent`\n ${refsSorted.map(ref => {\n const sourceSchemaId: OpenApiSchemaId = GenResultUtil.importNameFromRef(ref); // Get the source schema ID\n \n // Try to reverse-map this schema ID to one of the spec's definitions\n const definitionLocator: undefined | DefinitionLocator = schemasToDefinitionsMap.get(sourceSchemaId);\n \n if (typeof definitionLocator !== 'undefined') {\n const targetSchemaId = GenSpec.DefUtil.targetSchemaIdFromDef(definitionLocator.definition);\n \n // Calculate the relative path to the module\n let modulePathRelative = path.relative(path.dirname(modulePath), definitionLocator.modulePath);\n if (!modulePathRelative.startsWith('.')) { // Ensure the path starts with a `.` (ESM import paths require it)\n modulePathRelative = './' + modulePathRelative;\n }\n \n return `import { ${id(targetSchemaId)} } from '${modulePathRelative}';`;\n } else {\n return `// MISSING ${sourceSchemaId}`;\n //return `import { ${sourceSchemaId} } from '${ref}';`;\n }\n }).join('\\n')}\n `;\n \n // TODO: may want to add a comment at the top like:\n // /* Generated on ${new Date().toISOString()} from ${apiName} version ${apiVersion} */\n // Currently leaving this out because it means even simple changes cause a git diff upon regeneration.\n return dedent`\n import { pipe, Option, Schema as S } from 'effect';\n \n ${codeImports}\n \n ${codeExports}\n `;\n};\n"],"mappings":"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","ignoreList":[]}

@@ -316,3 +316,3 @@ "use strict";

// Generate the @effect/schema code for the given OpenAPI schema
// Generate the Effect Schema code for the given OpenAPI schema
exports.generateForReferenceObject = generateForReferenceObject;

@@ -343,3 +343,3 @@ const generateForSchema = (ctx, schema) => {

// `allOf` supports any type, but `@effect/schema` does not currently support generic intersections. Thus,
// `allOf` supports any type, but Effect Schema does not currently support generic intersections. Thus,
// currently we only support `allOf` if it consists only of object schemas.

@@ -421,3 +421,3 @@ // Idea: merge `allOf` schema first, e.g. using https://github.com/mokkabonna/json-schema-merge-allof

// Note: `extend` doesn't quite cover the semantics of `allOf`, since it only accepts objects and
// assumes distinct types. However, @effect/schema has no generic built-in mechanism for this.
// assumes distinct types. However, Effect Schema has no generic built-in mechanism for this.
code = (0, _tsDedent.dedent)`

@@ -457,3 +457,3 @@ pipe(

// Note: `union` doesn't quite cover the semantics of `oneOf`, since `oneOf` must guarantee that exactly
// one schema matches. However, @effect/schema has no easy built-in mechanism for this.
// one schema matches. However, Effect Schema has no easy built-in mechanism for this.
const code = (0, _tsDedent.dedent)`

@@ -460,0 +460,0 @@ S.Union(

@@ -1,1 +0,1 @@

{"version":3,"file":"schemaGen.cjs","names":["_tsDedent","require","_GraphAnalyzer","_genUtil","id","GenResultUtil","encodeIdentifier","generateForUnknownSchema","ctx","schema","code","refs","comments","commentsFromSchemaObject","exports","generateForNullSchema","generateForStringSchema","Array","isArray","enum","every","value","TypeError","JSON","stringify","dedent","map","String","join","baseSchema","format","pipe","push","pattern","minLength","maxLength","hookResult","hooks","generateStringType","combineRefs","generatePipe","generateForNumberSchema","type","generateNumberType","minimum","maximum","exclusiveMinimum","exclusiveMaximum","generateForBooleanSchema","Error","propertyNameAsIdentifier","propertyName","test","replaceAll","generateFieldsForObjectSchema","propSchemas","properties","propsRequired","Set","required","Object","entries","propName","propSchema","propIndex","propResult","generateForSchema","commentsGenerated","commentsToCode","propCode","has","optionalParams","printOptional","keys","length","paramsFormatted","hasOwn","exact","default","hasDefault","optionalFieldRepresentation","propNeedsSeparator","propHeading","propHeadingComment","startsWith","commentBlock","commentInline","trim","generateForObjectSchema","additionalPropSchema","additionalProperties","additionalPropsResult","indexSignature","fieldsGen","generateForArraySchema","itemSchema","items","itemResult","generateForReferenceObject","schemaId","schemaIdFromRef","$ref","shouldSuspend","isSchemaIdBefore","initComments","isNonArraySchemaType","allOf","schemasHead","areAllObjects","reduce","acc","isObjectSchema","schemas","isObject","filter","props","schemasResults","genResult","index","flatMap","oneOf","flat","anyOf","generateSchema","result","schemaAnyOf","schemaNonMixed"],"sources":["../../../../src/generation/effSchemGen/schemaGen.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport { type OpenAPIV3_1 as OpenApi } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema } from '../../util/openapi.ts';\n\nimport * as GenSpec from '../generationSpec.ts';\nimport { isObjectSchema, schemaIdFromRef } from '../../analysis/GraphAnalyzer.ts';\nimport { type GenResult, GenResultUtil } from './genUtil.ts';\n\n\nconst id = GenResultUtil.encodeIdentifier;\n\nexport type Context = {\n schemas: Record<string, OpenApiSchema>,\n hooks: GenSpec.GenerationHooks,\n isSchemaIdBefore: (schemaId: OpenApiSchemaId) => boolean,\n};\n\nexport const generateForUnknownSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n return {\n code: `S.Unknown`,\n refs: [],\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForNullSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n return {\n code: `S.Null`,\n refs: [],\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForStringSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n let refs: GenResult['refs'] = [];\n const code = ((): string => {\n if (Array.isArray(schema.enum)) {\n if (!schema.enum.every(value => typeof value === 'string' || typeof value === 'number')) {\n throw new TypeError(`Unknown enum value, expected string array: ${JSON.stringify(schema.enum)}`);\n }\n return dedent`S.Literal(\n ${schema.enum.map((value: string | number) => JSON.stringify(String(value)) + ',').join('\\n')}\n )`;\n }\n \n let baseSchema = `S.String`;\n switch (schema.format) {\n case 'uuid': baseSchema = `S.UUID`; break;\n //case 'date': baseSchema = `S.Date`; // FIXME: validate lack of time component\n case 'date-time': baseSchema = `S.Date`; break;\n // FIXME: using `S.Base64` will result in `Uint8Array` rather than strings, which will break some downstream\n // consumers.\n //case 'byte': baseSchema = `S.Base64`; break;\n }\n \n let pipe: Array<string> = [baseSchema];\n \n // Note: no built-in validator for emails, see https://github.com/effect-ts/effect/tree/main/packages/schema#email\n if (schema.format === 'email') { pipe.push(`S.pattern(/.+@.+/)`); }\n \n if (typeof schema.pattern === 'string') {\n pipe.push(`S.pattern(new RegExp(${JSON.stringify(schema.pattern)}))`);\n }\n \n if (typeof schema.minLength === 'number') { pipe.push(`S.minLength(${schema.minLength})`); }\n if (typeof schema.maxLength === 'number') { pipe.push(`S.maxLength(${schema.maxLength})`); }\n \n // Run hook\n const hookResult = ctx.hooks.generateStringType?.(schema) ?? null;\n if (hookResult !== null) {\n refs = GenResultUtil.combineRefs(refs, hookResult.refs);\n pipe = [hookResult.code];\n }\n \n //if (schema.nullable) { pipe.push(`S.NullOr`); }\n \n return GenResultUtil.generatePipe(pipe);\n })();\n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForNumberSchema = (\n ctx: Context,\n schema: OpenApi.NonArraySchemaObject,\n): GenResult => {\n let refs: GenResult['refs'] = [];\n const code = ((): string => {\n if (Array.isArray(schema.enum)) {\n if (!schema.enum.every(value => typeof value === 'number')) {\n throw new TypeError(`Unknown enum value, expected number array: ${JSON.stringify(schema.enum)}`);\n }\n return dedent`S.Literal(\n ${schema.enum.map((value: number) => JSON.stringify(value) + ',').join('\\n')}\n )`;\n }\n \n let baseSchema = `S.Number`;\n switch (schema.format) {\n //case 'date': baseSchema = `S.Date`; break; // FIXME: validate lack of time component\n case 'date-time': baseSchema = `S.DateFromNumber.pipe(S.validDate())`; break;\n }\n \n let pipe: Array<string> = [baseSchema];\n if (schema.type === 'integer') { pipe.push(`S.int()`); }\n \n // Run hook\n const hookResult = ctx.hooks.generateNumberType?.(schema) ?? null;\n if (hookResult !== null) {\n refs = GenResultUtil.combineRefs(refs, hookResult.refs);\n pipe = [hookResult.code];\n }\n \n if (typeof schema.minimum === 'number') { pipe.push(`S.greaterThanOrEqualTo(${schema.minimum})`); }\n if (typeof schema.maximum === 'number') { pipe.push(`S.lessThanOrEqualTo(${schema.maximum})`); }\n if (typeof schema.exclusiveMinimum === 'number') { pipe.push(`S.greaterThan(${schema.exclusiveMinimum})`); }\n if (typeof schema.exclusiveMaximum === 'number') { pipe.push(`S.lessThan(${schema.exclusiveMaximum})`); }\n //if (schema.nullable) { pipe.push(`S.NullOr`); }\n \n return GenResultUtil.generatePipe(pipe);\n })();\n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForBooleanSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n const code = ((): string => {\n if (Array.isArray(schema.enum)) { throw new Error(`Boolean enum currently not supported`); }\n \n let code = `S.Boolean`;\n //if (schema.nullable) { code = `S.NullOr(${code})`; }\n return code;\n })();\n return {\n code,\n refs: [],\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\n// Format a property name as valid JS identifier, to be used in a JS object literal\nconst propertyNameAsIdentifier = (propertyName: string): string => {\n if (!(/^[a-zA-Z$_][a-zA-Z0-9$_]*$/g.test(propertyName))) {\n return `'${propertyName.replaceAll(/'/g, '\\\\\\'')}'`;\n }\n\n return propertyName;\n};\n\nexport const generateFieldsForObjectSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n const propSchemas: Record<string, OpenApiSchema> = schema.properties ?? {};\n const propsRequired: Set<string> = new Set(schema.required ?? []);\n \n let refs: GenResult['refs'] = [];\n \n const code = Object.entries(propSchemas).map(([propName, propSchema], propIndex) => {\n const propResult = generateForSchema(ctx, propSchema);\n \n // Merge refs\n refs = GenResultUtil.combineRefs(refs, propResult.refs);\n \n const commentsGenerated = GenResultUtil.commentsToCode(propResult.comments);\n let propCode = propResult.code;\n \n // If the prop is optional, mark it as `S.optional()`\n if (!propsRequired.has(propName)) {\n type OptionalParams = { exact?: boolean, default?: string };\n const optionalParams: OptionalParams = {};\n const printOptional = (code: string, optionalParams: OptionalParams): string => {\n if (Object.keys(optionalParams).length === 0) { return `S.optional(${code})`; }\n const paramsFormatted = dedent`{\n ${Object.hasOwn(optionalParams, 'exact') ? `exact: ${optionalParams.exact},` : ''}\n ${Object.hasOwn(optionalParams, 'default') ? `default: ${optionalParams.default}` : ''}\n }`;\n return `S.optionalWith(${code}, ${paramsFormatted})`;\n };\n \n const hasDefault = 'default' in propSchema && typeof propSchema.default !== 'undefined';\n if (hasDefault) {\n if (typeof propSchema.default === 'object' && propSchema.default !== null) {\n // Add parens for object literals when used as arrow function return value\n optionalParams.default = `() => (${JSON.stringify(propSchema.default)})`;\n } else {\n optionalParams.default = `() => ${JSON.stringify(propSchema.default)}`;\n }\n }\n \n if (ctx.hooks.optionalFieldRepresentation === 'nullish') {\n propCode = printOptional(`S.NullOr(${propCode})`, optionalParams);\n } else {\n propCode = printOptional(propCode, optionalParams);\n }\n }\n \n // Handle (custom/hacked in) `x-heading` fields to group certain fields with a heading comment\n const propNeedsSeparator = propIndex > 0 && 'x-heading' in propSchema;\n const propHeading: null | string = 'x-heading' in propSchema ? propSchema['x-heading'] as string : null;\n const propHeadingComment: null | string = propHeading !== null && propHeading.startsWith('//')\n ? propHeading\n : null;\n \n return (propNeedsSeparator ? '\\n\\n' : '') + dedent`\n ${propHeadingComment ?? ''}${commentsGenerated.commentBlock ? `\\n${commentsGenerated.commentBlock}` : ''}\n ${propertyNameAsIdentifier(propName)}: ${propCode}, ${commentsGenerated.commentInline}\n `.trim();\n }).join('\\n');\n \n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\nexport const generateForObjectSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n const propSchemas: Record<string, OpenApiSchema> = schema.properties ?? {};\n \n let refs: GenResult['refs'] = [];\n \n const code = ((): string => {\n let code = '';\n if (Object.keys(propSchemas).length === 0) {\n const additionalPropSchema = schema.additionalProperties;\n if (typeof additionalPropSchema === 'undefined') {\n code = `S.Struct({})`;\n } else if (additionalPropSchema === true) {\n code = `S.Record({ key: S.String, value: S.Unknown() })`;\n } else if (additionalPropSchema === false) {\n code = `S.Record({ key: S.Never, value: S.Never })`;\n } else {\n const additionalPropsResult = generateForSchema(ctx, additionalPropSchema);\n refs = GenResultUtil.combineRefs(refs, additionalPropsResult.refs);\n // TODO: also include the `comments` from `additionalPropsResult`?\n code = `S.Record({ key: S.String, value: ${additionalPropsResult.code} })`;\n }\n } else {\n let indexSignature = '';\n if (typeof schema.additionalProperties !== 'undefined') {\n if (schema.additionalProperties === false) {\n // No equivalent for this on a schema level, requires the consumer to use `onExcessProperty: \"error\"`\n // https://github.com/Effect-TS/effect/tree/main/packages/schema#strict\n } else if (schema.additionalProperties === true) {\n // No equivalent for this on a schema level, requires the consumer to use `onExcessProperty: \"preserve\"`\n // https://github.com/Effect-TS/effect/tree/main/packages/schema#passthrough\n } else {\n const additionalPropsResult = generateForSchema(ctx, schema.additionalProperties);\n refs = GenResultUtil.combineRefs(refs, additionalPropsResult.refs);\n \n // https://github.com/Effect-TS/effect/tree/main/packages/schema#index-signatures\n // TODO: also include the `comments` from `additionalPropsResult`?\n indexSignature = `{ key: S.String, value: ${additionalPropsResult.code} }`;\n }\n }\n \n const fieldsGen = generateFieldsForObjectSchema(ctx, schema);\n refs = GenResultUtil.combineRefs(refs, fieldsGen.refs);\n code = dedent`\n S.Struct({\\n\n ${fieldsGen.code}\n }${indexSignature ? `, ${indexSignature}` : ''})\n `;\n }\n return code;\n })();\n \n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForArraySchema = (ctx: Context, schema: OpenApi.ArraySchemaObject): GenResult => {\n const itemSchema: OpenApiSchema = schema.items;\n const itemResult = generateForSchema(ctx, itemSchema);\n \n const code = ((): string => {\n let code = `S.Array(${itemResult.code})`;\n if (typeof schema.minLength === 'number') { code = `${code}.min(${schema.minLength})`; }\n if (typeof schema.maxLength === 'number') { code = `${code}.max(${schema.maxLength})`; }\n //if (schema.nullable) { code = `S.NullOr(${code})`; }\n return code;\n })();\n \n // FIXME: include the comments for `itemSchema` as well?\n return {\n code,\n refs: itemResult.refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForReferenceObject = (ctx: Context, schema: OpenApi.ReferenceObject): GenResult => {\n // FIXME: make this logic customizable (allow a callback to resolve a `$ref` string to a `Ref` instance?)\n const schemaId = schemaIdFromRef(schema.$ref);\n \n // If the referenced schema ID is topologically after the current one, wrap it in `S.suspend` for lazy eval\n const shouldSuspend = !ctx.isSchemaIdBefore(schemaId);\n const code = shouldSuspend\n ? `S.suspend((): S.Schema<_${id(schemaId)}, _${id(schemaId)}Encoded> => ${id(schemaId)})`\n : id(schemaId);\n \n return { code, refs: [`./${schemaId}.ts`], comments: GenResultUtil.initComments() };\n};\n\n// Generate the @effect/schema code for the given OpenAPI schema\nexport const generateForSchema = (ctx: Context, schema: OpenApiSchema): GenResult => {\n const isNonArraySchemaType = (schema: OpenApiSchema): schema is OpenApi.NonArraySchemaObject => {\n return !('$ref' in schema) && (!('type' in schema) || !Array.isArray(schema.type));\n };\n \n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n return generateForReferenceObject(ctx, schema);\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n return generateForArraySchema(ctx, { items: {}, ...schema } as OpenApi.ArraySchemaObject);\n } else { // Case: OpenApi.NonArraySchemaObject | OpenApi.MixedSchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n const schemasHead: undefined | OpenApiSchema = schema.allOf[0];\n if (schemasHead && schema.allOf.length === 1) { // If only one schema, simply generate that schema\n return generateForSchema(ctx, schemasHead);\n }\n \n // `allOf` supports any type, but `@effect/schema` does not currently support generic intersections. Thus,\n // currently we only support `allOf` if it consists only of object schemas.\n // Idea: merge `allOf` schema first, e.g. using https://github.com/mokkabonna/json-schema-merge-allof\n const areAllObjects: boolean = schema.allOf.reduce(\n (acc, schema) => {\n if ('$ref' in schema) {\n return acc && isObjectSchema(ctx.schemas, schema.$ref);\n }\n \n const isObject = isNonArraySchemaType(schema) && schema.type === 'object';\n return acc && isObject;\n },\n true,\n );\n \n /*\n if (!areAllObjects) {\n throw new Error(dedent`\n Found \\`allOf\\` with a non-object schema. Currently only object schemas or unions of object schemas are\n supported.\n `);\n }\n */\n \n const schemas: Array<OpenApiSchema> = schema.allOf\n // Filter out empty schemas\n // XXX this only makes sense when all schemas are objects, would not work if we supported generic `allOf`\n .filter((schema: OpenApiSchema) => {\n if (!isNonArraySchemaType(schema) || schema.type !== 'object') { return true; }\n \n const props = schema.properties ?? {};\n if (Object.keys(props).length === 0 && !schema.additionalProperties) {\n return false;\n } else {\n return true;\n }\n });\n \n if (typeof schemasHead === 'undefined') {\n // XXX this only works for object schemas, as in `S.extend()`, would not work if we support generic `allOf`\n return generateForObjectSchema(ctx, { type: 'object' }); // Empty `allOf`\n } else if (schemas.length === 1) {\n // Trivial case: only one schema\n return generateForSchema(ctx, schemasHead);\n } else {\n let code = '';\n let schemasResults: Array<GenResult>;\n if (areAllObjects) {\n // Experimental: using `...MySchema.fields` to combine struct schemas.\n // Note: doesn't work if `MySchema` is a union of structs\n \n schemasResults = schemas.map(schema => {\n const genResult = generateForSchema(ctx, schema);\n if ('$ref' in schema) {\n genResult.code = `...${genResult.code}.fields,`;\n } else if (isNonArraySchemaType(schema)) {\n genResult.code = generateFieldsForObjectSchema(ctx, schema).code;\n }\n return genResult;\n });\n \n code = dedent`\n S.Struct({\n ${schemasResults\n .map(({ code, comments }, index) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${commentsGenerated.commentInline}\n ${code}\n `.trim();\n })\n .join('\\n')\n }\n })\n `;\n } else {\n schemasResults = schemas.map(schema => generateForSchema(ctx, schema));\n \n // Note: `extend` doesn't quite cover the semantics of `allOf`, since it only accepts objects and\n // assumes distinct types. However, @effect/schema has no generic built-in mechanism for this.\n code = dedent`\n pipe(\n ${schemasResults\n .map(({ code, comments }, index) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${index > 0 ? `S.extend(${code})` : code}, ${commentsGenerated.commentInline}\n `.trim();\n })\n .join('\\n')\n }\n )\n `;\n }\n \n return {\n code,\n refs: GenResultUtil.combineRefs(schemasResults.flatMap(({ refs }) => refs)),\n comments: GenResultUtil.initComments(),\n };\n }\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n const schemas: Array<OpenApiSchema> = schema.oneOf;\n const schemasHead: undefined | OpenApiSchema = schemas[0];\n if (typeof schemasHead === 'undefined') {\n throw new TypeError(`oneOf must have at least one schema`);\n } else if (schemas.length === 1) {\n // Trivial case: only one schema\n return generateForSchema(ctx, schemasHead);\n } else {\n const schemasResults: Array<GenResult> = schemas.map(schema => generateForSchema(ctx, schema));\n // Note: `union` doesn't quite cover the semantics of `oneOf`, since `oneOf` must guarantee that exactly\n // one schema matches. However, @effect/schema has no easy built-in mechanism for this.\n const code = dedent`\n S.Union(\n ${schemasResults\n .map(({ code, comments }) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${code}, ${commentsGenerated.commentInline}\n `.trim();\n })\n .join('\\n')\n }\n )\n `;\n return {\n code,\n refs: GenResultUtil.combineRefs(schemasResults.map(({ refs }) => refs).flat()),\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n }\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n const schemas: Array<OpenApiSchema> = schema.anyOf;\n const schemasHead: undefined | OpenApiSchema = schemas[0];\n if (typeof schemasHead === 'undefined') {\n throw new TypeError(`anyOf must have at least one schema`);\n } else if (schemas.length === 1) {\n // Trivial case: only one schema\n return generateForSchema(ctx, schemasHead);\n } else {\n const schemasResults: Array<GenResult> = schemas.map(schema => generateForSchema(ctx, schema));\n const code = dedent`\n S.Union(\n ${schemasResults\n .map(({ code, comments }) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${code}, ${commentsGenerated.commentInline}\n `.trim();\n })\n .join('\\n')\n }\n )\n `;\n return {\n code,\n refs: GenResultUtil.combineRefs(schemasResults.map(({ refs }) => refs).flat()),\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n }\n }\n \n type SchemaType = 'array' | OpenApi.NonArraySchemaObjectType;\n const type: undefined | OpenApi.NonArraySchemaObjectType | Array<SchemaType> = schema.type;\n \n const hookResult: null | GenResult = ctx.hooks.generateSchema?.(schema) ?? null;\n \n let result: GenResult;\n if (hookResult !== null) {\n result = hookResult;\n } else {\n if (typeof type === 'undefined') {\n result = generateForUnknownSchema(ctx, schema as OpenApi.NonArraySchemaObject); // Any type\n } else if (Array.isArray(type)) {\n // `type` as an array is equivalent to `anyOf` with `type` set to the individual type string\n const schemaAnyOf = { anyOf: type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n result = generateForSchema(ctx, schemaAnyOf);\n } else {\n const schemaNonMixed = schema as OpenApi.NonArraySchemaObject;\n switch (type) {\n case 'null': result = generateForNullSchema(ctx, schemaNonMixed); break;\n case 'string': result = generateForStringSchema(ctx, schemaNonMixed); break;\n case 'number': result = generateForNumberSchema(ctx, schemaNonMixed); break;\n case 'integer': result = generateForNumberSchema(ctx, schemaNonMixed); break;\n case 'boolean': result = generateForBooleanSchema(ctx, schemaNonMixed); break;\n case 'object': result = generateForObjectSchema(ctx, schemaNonMixed); break;\n default: throw new TypeError(`Unsupported type \"${type}\"`);\n }\n }\n }\n return {\n ...result,\n code: `${result.code}`,\n };\n }\n }\n};\n"],"mappings":"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","ignoreList":[]}
{"version":3,"file":"schemaGen.cjs","names":["_tsDedent","require","_GraphAnalyzer","_genUtil","id","GenResultUtil","encodeIdentifier","generateForUnknownSchema","ctx","schema","code","refs","comments","commentsFromSchemaObject","exports","generateForNullSchema","generateForStringSchema","Array","isArray","enum","every","value","TypeError","JSON","stringify","dedent","map","String","join","baseSchema","format","pipe","push","pattern","minLength","maxLength","hookResult","hooks","generateStringType","combineRefs","generatePipe","generateForNumberSchema","type","generateNumberType","minimum","maximum","exclusiveMinimum","exclusiveMaximum","generateForBooleanSchema","Error","propertyNameAsIdentifier","propertyName","test","replaceAll","generateFieldsForObjectSchema","propSchemas","properties","propsRequired","Set","required","Object","entries","propName","propSchema","propIndex","propResult","generateForSchema","commentsGenerated","commentsToCode","propCode","has","optionalParams","printOptional","keys","length","paramsFormatted","hasOwn","exact","default","hasDefault","optionalFieldRepresentation","propNeedsSeparator","propHeading","propHeadingComment","startsWith","commentBlock","commentInline","trim","generateForObjectSchema","additionalPropSchema","additionalProperties","additionalPropsResult","indexSignature","fieldsGen","generateForArraySchema","itemSchema","items","itemResult","generateForReferenceObject","schemaId","schemaIdFromRef","$ref","shouldSuspend","isSchemaIdBefore","initComments","isNonArraySchemaType","allOf","schemasHead","areAllObjects","reduce","acc","isObjectSchema","schemas","isObject","filter","props","schemasResults","genResult","index","flatMap","oneOf","flat","anyOf","generateSchema","result","schemaAnyOf","schemaNonMixed"],"sources":["../../../../src/generation/effSchemGen/schemaGen.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport { type OpenAPIV3_1 as OpenApi } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema } from '../../util/openapi.ts';\n\nimport * as GenSpec from '../generationSpec.ts';\nimport { isObjectSchema, schemaIdFromRef } from '../../analysis/GraphAnalyzer.ts';\nimport { type GenResult, GenResultUtil } from './genUtil.ts';\n\n\nconst id = GenResultUtil.encodeIdentifier;\n\nexport type Context = {\n schemas: Record<string, OpenApiSchema>,\n hooks: GenSpec.GenerationHooks,\n isSchemaIdBefore: (schemaId: OpenApiSchemaId) => boolean,\n};\n\nexport const generateForUnknownSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n return {\n code: `S.Unknown`,\n refs: [],\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForNullSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n return {\n code: `S.Null`,\n refs: [],\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForStringSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n let refs: GenResult['refs'] = [];\n const code = ((): string => {\n if (Array.isArray(schema.enum)) {\n if (!schema.enum.every(value => typeof value === 'string' || typeof value === 'number')) {\n throw new TypeError(`Unknown enum value, expected string array: ${JSON.stringify(schema.enum)}`);\n }\n return dedent`S.Literal(\n ${schema.enum.map((value: string | number) => JSON.stringify(String(value)) + ',').join('\\n')}\n )`;\n }\n \n let baseSchema = `S.String`;\n switch (schema.format) {\n case 'uuid': baseSchema = `S.UUID`; break;\n //case 'date': baseSchema = `S.Date`; // FIXME: validate lack of time component\n case 'date-time': baseSchema = `S.Date`; break;\n // FIXME: using `S.Base64` will result in `Uint8Array` rather than strings, which will break some downstream\n // consumers.\n //case 'byte': baseSchema = `S.Base64`; break;\n }\n \n let pipe: Array<string> = [baseSchema];\n \n // Note: no built-in validator for emails, see https://github.com/effect-ts/effect/tree/main/packages/schema#email\n if (schema.format === 'email') { pipe.push(`S.pattern(/.+@.+/)`); }\n \n if (typeof schema.pattern === 'string') {\n pipe.push(`S.pattern(new RegExp(${JSON.stringify(schema.pattern)}))`);\n }\n \n if (typeof schema.minLength === 'number') { pipe.push(`S.minLength(${schema.minLength})`); }\n if (typeof schema.maxLength === 'number') { pipe.push(`S.maxLength(${schema.maxLength})`); }\n \n // Run hook\n const hookResult = ctx.hooks.generateStringType?.(schema) ?? null;\n if (hookResult !== null) {\n refs = GenResultUtil.combineRefs(refs, hookResult.refs);\n pipe = [hookResult.code];\n }\n \n //if (schema.nullable) { pipe.push(`S.NullOr`); }\n \n return GenResultUtil.generatePipe(pipe);\n })();\n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForNumberSchema = (\n ctx: Context,\n schema: OpenApi.NonArraySchemaObject,\n): GenResult => {\n let refs: GenResult['refs'] = [];\n const code = ((): string => {\n if (Array.isArray(schema.enum)) {\n if (!schema.enum.every(value => typeof value === 'number')) {\n throw new TypeError(`Unknown enum value, expected number array: ${JSON.stringify(schema.enum)}`);\n }\n return dedent`S.Literal(\n ${schema.enum.map((value: number) => JSON.stringify(value) + ',').join('\\n')}\n )`;\n }\n \n let baseSchema = `S.Number`;\n switch (schema.format) {\n //case 'date': baseSchema = `S.Date`; break; // FIXME: validate lack of time component\n case 'date-time': baseSchema = `S.DateFromNumber.pipe(S.validDate())`; break;\n }\n \n let pipe: Array<string> = [baseSchema];\n if (schema.type === 'integer') { pipe.push(`S.int()`); }\n \n // Run hook\n const hookResult = ctx.hooks.generateNumberType?.(schema) ?? null;\n if (hookResult !== null) {\n refs = GenResultUtil.combineRefs(refs, hookResult.refs);\n pipe = [hookResult.code];\n }\n \n if (typeof schema.minimum === 'number') { pipe.push(`S.greaterThanOrEqualTo(${schema.minimum})`); }\n if (typeof schema.maximum === 'number') { pipe.push(`S.lessThanOrEqualTo(${schema.maximum})`); }\n if (typeof schema.exclusiveMinimum === 'number') { pipe.push(`S.greaterThan(${schema.exclusiveMinimum})`); }\n if (typeof schema.exclusiveMaximum === 'number') { pipe.push(`S.lessThan(${schema.exclusiveMaximum})`); }\n //if (schema.nullable) { pipe.push(`S.NullOr`); }\n \n return GenResultUtil.generatePipe(pipe);\n })();\n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForBooleanSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n const code = ((): string => {\n if (Array.isArray(schema.enum)) { throw new Error(`Boolean enum currently not supported`); }\n \n let code = `S.Boolean`;\n //if (schema.nullable) { code = `S.NullOr(${code})`; }\n return code;\n })();\n return {\n code,\n refs: [],\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\n// Format a property name as valid JS identifier, to be used in a JS object literal\nconst propertyNameAsIdentifier = (propertyName: string): string => {\n if (!(/^[a-zA-Z$_][a-zA-Z0-9$_]*$/g.test(propertyName))) {\n return `'${propertyName.replaceAll(/'/g, '\\\\\\'')}'`;\n }\n\n return propertyName;\n};\n\nexport const generateFieldsForObjectSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n const propSchemas: Record<string, OpenApiSchema> = schema.properties ?? {};\n const propsRequired: Set<string> = new Set(schema.required ?? []);\n \n let refs: GenResult['refs'] = [];\n \n const code = Object.entries(propSchemas).map(([propName, propSchema], propIndex) => {\n const propResult = generateForSchema(ctx, propSchema);\n \n // Merge refs\n refs = GenResultUtil.combineRefs(refs, propResult.refs);\n \n const commentsGenerated = GenResultUtil.commentsToCode(propResult.comments);\n let propCode = propResult.code;\n \n // If the prop is optional, mark it as `S.optional()`\n if (!propsRequired.has(propName)) {\n type OptionalParams = { exact?: boolean, default?: string };\n const optionalParams: OptionalParams = {};\n const printOptional = (code: string, optionalParams: OptionalParams): string => {\n if (Object.keys(optionalParams).length === 0) { return `S.optional(${code})`; }\n const paramsFormatted = dedent`{\n ${Object.hasOwn(optionalParams, 'exact') ? `exact: ${optionalParams.exact},` : ''}\n ${Object.hasOwn(optionalParams, 'default') ? `default: ${optionalParams.default}` : ''}\n }`;\n return `S.optionalWith(${code}, ${paramsFormatted})`;\n };\n \n const hasDefault = 'default' in propSchema && typeof propSchema.default !== 'undefined';\n if (hasDefault) {\n if (typeof propSchema.default === 'object' && propSchema.default !== null) {\n // Add parens for object literals when used as arrow function return value\n optionalParams.default = `() => (${JSON.stringify(propSchema.default)})`;\n } else {\n optionalParams.default = `() => ${JSON.stringify(propSchema.default)}`;\n }\n }\n \n if (ctx.hooks.optionalFieldRepresentation === 'nullish') {\n propCode = printOptional(`S.NullOr(${propCode})`, optionalParams);\n } else {\n propCode = printOptional(propCode, optionalParams);\n }\n }\n \n // Handle (custom/hacked in) `x-heading` fields to group certain fields with a heading comment\n const propNeedsSeparator = propIndex > 0 && 'x-heading' in propSchema;\n const propHeading: null | string = 'x-heading' in propSchema ? propSchema['x-heading'] as string : null;\n const propHeadingComment: null | string = propHeading !== null && propHeading.startsWith('//')\n ? propHeading\n : null;\n \n return (propNeedsSeparator ? '\\n\\n' : '') + dedent`\n ${propHeadingComment ?? ''}${commentsGenerated.commentBlock ? `\\n${commentsGenerated.commentBlock}` : ''}\n ${propertyNameAsIdentifier(propName)}: ${propCode}, ${commentsGenerated.commentInline}\n `.trim();\n }).join('\\n');\n \n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\nexport const generateForObjectSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n const propSchemas: Record<string, OpenApiSchema> = schema.properties ?? {};\n \n let refs: GenResult['refs'] = [];\n \n const code = ((): string => {\n let code = '';\n if (Object.keys(propSchemas).length === 0) {\n const additionalPropSchema = schema.additionalProperties;\n if (typeof additionalPropSchema === 'undefined') {\n code = `S.Struct({})`;\n } else if (additionalPropSchema === true) {\n code = `S.Record({ key: S.String, value: S.Unknown() })`;\n } else if (additionalPropSchema === false) {\n code = `S.Record({ key: S.Never, value: S.Never })`;\n } else {\n const additionalPropsResult = generateForSchema(ctx, additionalPropSchema);\n refs = GenResultUtil.combineRefs(refs, additionalPropsResult.refs);\n // TODO: also include the `comments` from `additionalPropsResult`?\n code = `S.Record({ key: S.String, value: ${additionalPropsResult.code} })`;\n }\n } else {\n let indexSignature = '';\n if (typeof schema.additionalProperties !== 'undefined') {\n if (schema.additionalProperties === false) {\n // No equivalent for this on a schema level, requires the consumer to use `onExcessProperty: \"error\"`\n // https://github.com/Effect-TS/effect/tree/main/packages/schema#strict\n } else if (schema.additionalProperties === true) {\n // No equivalent for this on a schema level, requires the consumer to use `onExcessProperty: \"preserve\"`\n // https://github.com/Effect-TS/effect/tree/main/packages/schema#passthrough\n } else {\n const additionalPropsResult = generateForSchema(ctx, schema.additionalProperties);\n refs = GenResultUtil.combineRefs(refs, additionalPropsResult.refs);\n \n // https://github.com/Effect-TS/effect/tree/main/packages/schema#index-signatures\n // TODO: also include the `comments` from `additionalPropsResult`?\n indexSignature = `{ key: S.String, value: ${additionalPropsResult.code} }`;\n }\n }\n \n const fieldsGen = generateFieldsForObjectSchema(ctx, schema);\n refs = GenResultUtil.combineRefs(refs, fieldsGen.refs);\n code = dedent`\n S.Struct({\\n\n ${fieldsGen.code}\n }${indexSignature ? `, ${indexSignature}` : ''})\n `;\n }\n return code;\n })();\n \n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForArraySchema = (ctx: Context, schema: OpenApi.ArraySchemaObject): GenResult => {\n const itemSchema: OpenApiSchema = schema.items;\n const itemResult = generateForSchema(ctx, itemSchema);\n \n const code = ((): string => {\n let code = `S.Array(${itemResult.code})`;\n if (typeof schema.minLength === 'number') { code = `${code}.min(${schema.minLength})`; }\n if (typeof schema.maxLength === 'number') { code = `${code}.max(${schema.maxLength})`; }\n //if (schema.nullable) { code = `S.NullOr(${code})`; }\n return code;\n })();\n \n // FIXME: include the comments for `itemSchema` as well?\n return {\n code,\n refs: itemResult.refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForReferenceObject = (ctx: Context, schema: OpenApi.ReferenceObject): GenResult => {\n // FIXME: make this logic customizable (allow a callback to resolve a `$ref` string to a `Ref` instance?)\n const schemaId = schemaIdFromRef(schema.$ref);\n \n // If the referenced schema ID is topologically after the current one, wrap it in `S.suspend` for lazy eval\n const shouldSuspend = !ctx.isSchemaIdBefore(schemaId);\n const code = shouldSuspend\n ? `S.suspend((): S.Schema<_${id(schemaId)}, _${id(schemaId)}Encoded> => ${id(schemaId)})`\n : id(schemaId);\n \n return { code, refs: [`./${schemaId}.ts`], comments: GenResultUtil.initComments() };\n};\n\n// Generate the Effect Schema code for the given OpenAPI schema\nexport const generateForSchema = (ctx: Context, schema: OpenApiSchema): GenResult => {\n const isNonArraySchemaType = (schema: OpenApiSchema): schema is OpenApi.NonArraySchemaObject => {\n return !('$ref' in schema) && (!('type' in schema) || !Array.isArray(schema.type));\n };\n \n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n return generateForReferenceObject(ctx, schema);\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n return generateForArraySchema(ctx, { items: {}, ...schema } as OpenApi.ArraySchemaObject);\n } else { // Case: OpenApi.NonArraySchemaObject | OpenApi.MixedSchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n const schemasHead: undefined | OpenApiSchema = schema.allOf[0];\n if (schemasHead && schema.allOf.length === 1) { // If only one schema, simply generate that schema\n return generateForSchema(ctx, schemasHead);\n }\n \n // `allOf` supports any type, but Effect Schema does not currently support generic intersections. Thus,\n // currently we only support `allOf` if it consists only of object schemas.\n // Idea: merge `allOf` schema first, e.g. using https://github.com/mokkabonna/json-schema-merge-allof\n const areAllObjects: boolean = schema.allOf.reduce(\n (acc, schema) => {\n if ('$ref' in schema) {\n return acc && isObjectSchema(ctx.schemas, schema.$ref);\n }\n \n const isObject = isNonArraySchemaType(schema) && schema.type === 'object';\n return acc && isObject;\n },\n true,\n );\n \n /*\n if (!areAllObjects) {\n throw new Error(dedent`\n Found \\`allOf\\` with a non-object schema. Currently only object schemas or unions of object schemas are\n supported.\n `);\n }\n */\n \n const schemas: Array<OpenApiSchema> = schema.allOf\n // Filter out empty schemas\n // XXX this only makes sense when all schemas are objects, would not work if we supported generic `allOf`\n .filter((schema: OpenApiSchema) => {\n if (!isNonArraySchemaType(schema) || schema.type !== 'object') { return true; }\n \n const props = schema.properties ?? {};\n if (Object.keys(props).length === 0 && !schema.additionalProperties) {\n return false;\n } else {\n return true;\n }\n });\n \n if (typeof schemasHead === 'undefined') {\n // XXX this only works for object schemas, as in `S.extend()`, would not work if we support generic `allOf`\n return generateForObjectSchema(ctx, { type: 'object' }); // Empty `allOf`\n } else if (schemas.length === 1) {\n // Trivial case: only one schema\n return generateForSchema(ctx, schemasHead);\n } else {\n let code = '';\n let schemasResults: Array<GenResult>;\n if (areAllObjects) {\n // Experimental: using `...MySchema.fields` to combine struct schemas.\n // Note: doesn't work if `MySchema` is a union of structs\n \n schemasResults = schemas.map(schema => {\n const genResult = generateForSchema(ctx, schema);\n if ('$ref' in schema) {\n genResult.code = `...${genResult.code}.fields,`;\n } else if (isNonArraySchemaType(schema)) {\n genResult.code = generateFieldsForObjectSchema(ctx, schema).code;\n }\n return genResult;\n });\n \n code = dedent`\n S.Struct({\n ${schemasResults\n .map(({ code, comments }, index) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${commentsGenerated.commentInline}\n ${code}\n `.trim();\n })\n .join('\\n')\n }\n })\n `;\n } else {\n schemasResults = schemas.map(schema => generateForSchema(ctx, schema));\n \n // Note: `extend` doesn't quite cover the semantics of `allOf`, since it only accepts objects and\n // assumes distinct types. However, Effect Schema has no generic built-in mechanism for this.\n code = dedent`\n pipe(\n ${schemasResults\n .map(({ code, comments }, index) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${index > 0 ? `S.extend(${code})` : code}, ${commentsGenerated.commentInline}\n `.trim();\n })\n .join('\\n')\n }\n )\n `;\n }\n \n return {\n code,\n refs: GenResultUtil.combineRefs(schemasResults.flatMap(({ refs }) => refs)),\n comments: GenResultUtil.initComments(),\n };\n }\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n const schemas: Array<OpenApiSchema> = schema.oneOf;\n const schemasHead: undefined | OpenApiSchema = schemas[0];\n if (typeof schemasHead === 'undefined') {\n throw new TypeError(`oneOf must have at least one schema`);\n } else if (schemas.length === 1) {\n // Trivial case: only one schema\n return generateForSchema(ctx, schemasHead);\n } else {\n const schemasResults: Array<GenResult> = schemas.map(schema => generateForSchema(ctx, schema));\n // Note: `union` doesn't quite cover the semantics of `oneOf`, since `oneOf` must guarantee that exactly\n // one schema matches. However, Effect Schema has no easy built-in mechanism for this.\n const code = dedent`\n S.Union(\n ${schemasResults\n .map(({ code, comments }) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${code}, ${commentsGenerated.commentInline}\n `.trim();\n })\n .join('\\n')\n }\n )\n `;\n return {\n code,\n refs: GenResultUtil.combineRefs(schemasResults.map(({ refs }) => refs).flat()),\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n }\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n const schemas: Array<OpenApiSchema> = schema.anyOf;\n const schemasHead: undefined | OpenApiSchema = schemas[0];\n if (typeof schemasHead === 'undefined') {\n throw new TypeError(`anyOf must have at least one schema`);\n } else if (schemas.length === 1) {\n // Trivial case: only one schema\n return generateForSchema(ctx, schemasHead);\n } else {\n const schemasResults: Array<GenResult> = schemas.map(schema => generateForSchema(ctx, schema));\n const code = dedent`\n S.Union(\n ${schemasResults\n .map(({ code, comments }) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${code}, ${commentsGenerated.commentInline}\n `.trim();\n })\n .join('\\n')\n }\n )\n `;\n return {\n code,\n refs: GenResultUtil.combineRefs(schemasResults.map(({ refs }) => refs).flat()),\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n }\n }\n \n type SchemaType = 'array' | OpenApi.NonArraySchemaObjectType;\n const type: undefined | OpenApi.NonArraySchemaObjectType | Array<SchemaType> = schema.type;\n \n const hookResult: null | GenResult = ctx.hooks.generateSchema?.(schema) ?? null;\n \n let result: GenResult;\n if (hookResult !== null) {\n result = hookResult;\n } else {\n if (typeof type === 'undefined') {\n result = generateForUnknownSchema(ctx, schema as OpenApi.NonArraySchemaObject); // Any type\n } else if (Array.isArray(type)) {\n // `type` as an array is equivalent to `anyOf` with `type` set to the individual type string\n const schemaAnyOf = { anyOf: type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n result = generateForSchema(ctx, schemaAnyOf);\n } else {\n const schemaNonMixed = schema as OpenApi.NonArraySchemaObject;\n switch (type) {\n case 'null': result = generateForNullSchema(ctx, schemaNonMixed); break;\n case 'string': result = generateForStringSchema(ctx, schemaNonMixed); break;\n case 'number': result = generateForNumberSchema(ctx, schemaNonMixed); break;\n case 'integer': result = generateForNumberSchema(ctx, schemaNonMixed); break;\n case 'boolean': result = generateForBooleanSchema(ctx, schemaNonMixed); break;\n case 'object': result = generateForObjectSchema(ctx, schemaNonMixed); break;\n default: throw new TypeError(`Unsupported type \"${type}\"`);\n }\n }\n }\n return {\n ...result,\n code: `${result.code}`,\n };\n }\n }\n};\n"],"mappings":"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","ignoreList":[]}

@@ -18,3 +18,3 @@ "use strict";

// @effect/schema
// Effect Schema

@@ -21,0 +21,0 @@ // Comma-separated string of field names (identifiers)

@@ -1,1 +0,1 @@

{"version":3,"file":"generationSpec.cjs","names":["assertUnreachable","x","Error","DefUtil","exports","sourceSchemaIdFromDef","def","action","schemaId","sourceSchemaId","targetSchemaIdFromDef"],"sources":["../../../src/generation/generationSpec.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { type JSONPatchDocument } from 'immutable-json-patch';\n\nimport { type OpenAPIV3_1 as OpenAPIV3 } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema } from '../util/openapi.ts';\nimport { type GenResult } from './effSchemGen/genUtil.ts';\n\n\nconst assertUnreachable = (x: never): never => { throw new Error(`Should not happen`); };\n\n\nexport type GenerationHooks = {\n generateSchema?: (schema: OpenApiSchema) => null | GenResult,\n generateStringType?: (schema: OpenAPIV3.NonArraySchemaObject) => null | GenResult,\n generateNumberType?: (schema: OpenAPIV3.NonArraySchemaObject) => null | GenResult,\n optionalFieldRepresentation?: undefined | 'nullish', // TEMP\n};\n\n\n// @effect/schema\nexport type EffectSchemaId = string;\n\nexport type FieldNames = string; // Comma-separated string of field names (identifiers)\nexport type FieldSpec = {\n default?: undefined | unknown,\n};\nexport type FieldGroup = Record<FieldNames, FieldSpec>;\nexport type FieldGroups = Record<string, FieldGroup>;\n\nexport type ModulePath = string;\nexport type GenerationDefinitionSpec = (\n | {\n action: 'custom-code',\n schemaId: EffectSchemaId,\n code: string,\n }\n | {\n action: 'custom-schema',\n schemaId: EffectSchemaId,\n schema: OpenApiSchema,\n lazy?: undefined | boolean, // Whether we should wrap this in a `suspend()` call (for recursive references)\n typeDeclaration?: undefined | string, // Explicit type annotation (overrides inferred), usually used with `suspend`\n typeDeclarationEncoded?: undefined | string, // If specified, uses this as the \"Encoded\" type\n }\n | {\n action: 'generate-schema',\n sourceSchemaId?: undefined | OpenApiSchemaId,\n schemaId: EffectSchemaId,\n lazy?: undefined | boolean, // Whether we should wrap this in a `suspend()` call (for recursive references)\n typeDeclaration?: undefined | string, // Explicit type annotation (overrides inferred), usually used with `suspend`\n typeDeclarationEncoded?: undefined | string, // If specified, uses this as the \"Encoded\" type\n fields?: undefined | FieldGroups,\n }\n);\nexport type GenerationModuleSpec = {\n definitions: Array<GenerationDefinitionSpec>,\n};\nexport type GenerationSpec = {\n patch?: undefined | JSONPatchDocument, // A JSON Patch to apply on the OpenAPI document on initialization\n generationMethod: (\n | { method: 'one-to-one', generateBarrelFile?: undefined | boolean /* Default: false */ }\n | { method: 'bundled', bundleName: string }\n | { method: 'custom' }\n ),\n hooks: GenerationHooks,\n runtime: Record<ModulePath, GenerationModuleSpec>,\n modules: Record<ModulePath, GenerationModuleSpec>,\n};\n\n\nexport const DefUtil = {\n sourceSchemaIdFromDef(def: GenerationDefinitionSpec): OpenApiSchemaId {\n switch (def.action) {\n case 'custom-code': return def.schemaId;\n case 'custom-schema': return def.schemaId;\n case 'generate-schema': return def.sourceSchemaId ?? def.schemaId;\n default: return assertUnreachable(def);\n }\n },\n targetSchemaIdFromDef(def: GenerationDefinitionSpec): EffectSchemaId {\n switch (def.action) {\n case 'custom-code': return def.schemaId;\n case 'custom-schema': return def.schemaId;\n case 'generate-schema': return def.schemaId;\n default: return assertUnreachable(def);\n }\n },\n};\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;AASA,MAAMA,iBAAiB,GAAIC,CAAQ,IAAY;EAAE,MAAM,IAAIC,KAAK,CAAC,mBAAmB,CAAC;AAAE,CAAC;;AAWxF;;AAGiC;;AAgD1B,MAAMC,OAAO,GAAAC,OAAA,CAAAD,OAAA,GAAG;EACrBE,qBAAqBA,CAACC,GAA6B,EAAmB;IACpE,QAAQA,GAAG,CAACC,MAAM;MAChB,KAAK,aAAa;QAAE,OAAOD,GAAG,CAACE,QAAQ;MACvC,KAAK,eAAe;QAAE,OAAOF,GAAG,CAACE,QAAQ;MACzC,KAAK,iBAAiB;QAAE,OAAOF,GAAG,CAACG,cAAc,IAAIH,GAAG,CAACE,QAAQ;MACjE;QAAS,OAAOR,iBAAiB,CAACM,GAAG,CAAC;IACxC;EACF,CAAC;EACDI,qBAAqBA,CAACJ,GAA6B,EAAkB;IACnE,QAAQA,GAAG,CAACC,MAAM;MAChB,KAAK,aAAa;QAAE,OAAOD,GAAG,CAACE,QAAQ;MACvC,KAAK,eAAe;QAAE,OAAOF,GAAG,CAACE,QAAQ;MACzC,KAAK,iBAAiB;QAAE,OAAOF,GAAG,CAACE,QAAQ;MAC3C;QAAS,OAAOR,iBAAiB,CAACM,GAAG,CAAC;IACxC;EACF;AACF,CAAC","ignoreList":[]}
{"version":3,"file":"generationSpec.cjs","names":["assertUnreachable","x","Error","DefUtil","exports","sourceSchemaIdFromDef","def","action","schemaId","sourceSchemaId","targetSchemaIdFromDef"],"sources":["../../../src/generation/generationSpec.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { type JSONPatchDocument } from 'immutable-json-patch';\n\nimport { type OpenAPIV3_1 as OpenAPIV3 } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema } from '../util/openapi.ts';\nimport { type GenResult } from './effSchemGen/genUtil.ts';\n\n\nconst assertUnreachable = (x: never): never => { throw new Error(`Should not happen`); };\n\n\nexport type GenerationHooks = {\n generateSchema?: (schema: OpenApiSchema) => null | GenResult,\n generateStringType?: (schema: OpenAPIV3.NonArraySchemaObject) => null | GenResult,\n generateNumberType?: (schema: OpenAPIV3.NonArraySchemaObject) => null | GenResult,\n optionalFieldRepresentation?: undefined | 'nullish', // TEMP\n};\n\n\n// Effect Schema\nexport type EffectSchemaId = string;\n\nexport type FieldNames = string; // Comma-separated string of field names (identifiers)\nexport type FieldSpec = {\n default?: undefined | unknown,\n};\nexport type FieldGroup = Record<FieldNames, FieldSpec>;\nexport type FieldGroups = Record<string, FieldGroup>;\n\nexport type ModulePath = string;\nexport type GenerationDefinitionSpec = (\n | {\n action: 'custom-code',\n schemaId: EffectSchemaId,\n code: string,\n }\n | {\n action: 'custom-schema',\n schemaId: EffectSchemaId,\n schema: OpenApiSchema,\n lazy?: undefined | boolean, // Whether we should wrap this in a `suspend()` call (for recursive references)\n typeDeclaration?: undefined | string, // Explicit type annotation (overrides inferred), usually used with `suspend`\n typeDeclarationEncoded?: undefined | string, // If specified, uses this as the \"Encoded\" type\n }\n | {\n action: 'generate-schema',\n sourceSchemaId?: undefined | OpenApiSchemaId,\n schemaId: EffectSchemaId,\n lazy?: undefined | boolean, // Whether we should wrap this in a `suspend()` call (for recursive references)\n typeDeclaration?: undefined | string, // Explicit type annotation (overrides inferred), usually used with `suspend`\n typeDeclarationEncoded?: undefined | string, // If specified, uses this as the \"Encoded\" type\n fields?: undefined | FieldGroups,\n }\n);\nexport type GenerationModuleSpec = {\n definitions: Array<GenerationDefinitionSpec>,\n};\nexport type GenerationSpec = {\n patch?: undefined | JSONPatchDocument, // A JSON Patch to apply on the OpenAPI document on initialization\n generationMethod: (\n | { method: 'one-to-one', generateBarrelFile?: undefined | boolean /* Default: false */ }\n | { method: 'bundled', bundleName: string }\n | { method: 'custom' }\n ),\n hooks: GenerationHooks,\n runtime: Record<ModulePath, GenerationModuleSpec>,\n modules: Record<ModulePath, GenerationModuleSpec>,\n};\n\n\nexport const DefUtil = {\n sourceSchemaIdFromDef(def: GenerationDefinitionSpec): OpenApiSchemaId {\n switch (def.action) {\n case 'custom-code': return def.schemaId;\n case 'custom-schema': return def.schemaId;\n case 'generate-schema': return def.sourceSchemaId ?? def.schemaId;\n default: return assertUnreachable(def);\n }\n },\n targetSchemaIdFromDef(def: GenerationDefinitionSpec): EffectSchemaId {\n switch (def.action) {\n case 'custom-code': return def.schemaId;\n case 'custom-schema': return def.schemaId;\n case 'generate-schema': return def.schemaId;\n default: return assertUnreachable(def);\n }\n },\n};\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;AASA,MAAMA,iBAAiB,GAAIC,CAAQ,IAAY;EAAE,MAAM,IAAIC,KAAK,CAAC,mBAAmB,CAAC;AAAE,CAAC;;AAWxF;;AAGiC;;AAgD1B,MAAMC,OAAO,GAAAC,OAAA,CAAAD,OAAA,GAAG;EACrBE,qBAAqBA,CAACC,GAA6B,EAAmB;IACpE,QAAQA,GAAG,CAACC,MAAM;MAChB,KAAK,aAAa;QAAE,OAAOD,GAAG,CAACE,QAAQ;MACvC,KAAK,eAAe;QAAE,OAAOF,GAAG,CAACE,QAAQ;MACzC,KAAK,iBAAiB;QAAE,OAAOF,GAAG,CAACG,cAAc,IAAIH,GAAG,CAACE,QAAQ;MACjE;QAAS,OAAOR,iBAAiB,CAACM,GAAG,CAAC;IACxC;EACF,CAAC;EACDI,qBAAqBA,CAACJ,GAA6B,EAAkB;IACnE,QAAQA,GAAG,CAACC,MAAM;MAChB,KAAK,aAAa;QAAE,OAAOD,GAAG,CAACE,QAAQ;MACvC,KAAK,eAAe;QAAE,OAAOF,GAAG,CAACE,QAAQ;MACzC,KAAK,iBAAiB;QAAE,OAAOF,GAAG,CAACE,QAAQ;MAC3C;QAAS,OAAOR,iBAAiB,CAACM,GAAG,CAAC;IACxC;EACF;AACF,CAAC","ignoreList":[]}

@@ -282,4 +282,3 @@ "use strict";

import { pipe, Option } from 'effect';
import { Schema as S } from '@effect/schema';
import { pipe, Option, Schema as S } from 'effect';

@@ -286,0 +285,0 @@ ${bundle.replace(/(^|\n)(\s*)import [^;]+;(?! \/\/ <runtime>)/g, '')}

@@ -1,1 +0,1 @@

{"version":3,"file":"openapiToEffect.cjs","names":["_tsDedent","require","_nodeUtil","path","_interopRequireWildcard","_nodeUrl","fs","_nodeAsync_hooks","_moduleGen","_moduleGenWithSpec","_formatting","_immutableJsonPatch","_GraphAnalyzer","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","__transformExtension","filepath","extMapping","startsWith","idx","lastIndexOf","includes","newExt","origExt","entries","sort","b","length","endsWith","slice","ensureTrailingSlash","replace","cwd","pathToFileURL","process","servicesStorage","AsyncLocalStorage","getServices","services","getStore","Error","parseDocument","documentUrl","content","readFile","contentJson","JSON","parse","error","SyntaxError","cause","isDocument","openapi","trim","documentVersion","generateSchemas","request","logger","document","outputDirectory","info","title","version","schemas","components","schemaId","schema","outputUrl","URL","relative","fileURLToPath","generatedCode","generateModule","generatedCodeFormatted","formatGeneratedCode","writeFile","exports","generateSchemasWithSpec","spec","schemasSorted","topologicalSort","specParsed","generationMethod","method","modules","fromEntries","keys","map","definitions","action","ref","circularDependency","schemaIdFromRef","def","find","lazy","bundle","modulePath","_moduleSpec","runtime","generateModuleWithSpec","isSchemaBefore","schema1","schema2","schema1Index","findIndex","schema2Index","mkdir","dirname","recursive","bundleName","bundleFormatted","dedent","Date","toISOString","generateBarrelFile","barrelContent","moduleSpec","barrelUrl","log","parseRequest","documentPath","outputPath","specPath","specUrl","stat","outputUrlStats","isDirectory","specifier","Promise","then","s","href","patch","Array","isArray","documentPatched","immutableJSONPatch","printUsage","runGenerator","args","positionals","requestInput","values","runAnalyzeDependencyTree","rootSchemaRef","tree","dependencyTree","run","argsRaw","parseArgs","allowPositionals","options","help","type","short","silent","console","command","argsForCommand","_argExec","argScript","argv","realpath","import","meta","url","exit"],"sources":["../../src/openapiToEffect.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport { parseArgs } from 'node:util';\nimport * as path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { type Stats } from 'node:fs';\nimport * as fs from 'node:fs/promises';\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\nimport { type OpenAPIV3_1 as OpenApi } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema } from './util/openapi.ts';\n\nimport * as GenSpec from './generation/generationSpec.ts';\nimport { generateModule } from './generation/effSchemGen/moduleGen.ts';\nimport { generateModuleWithSpec } from './generation/effSchemGen/moduleGenWithSpec.ts';\nimport { formatGeneratedCode } from './generation/formatting.ts';\nimport { type JSONPatchDocument, immutableJSONPatch } from 'immutable-json-patch';\nimport { schemaIdFromRef, topologicalSort, dependencyTree } from './analysis/GraphAnalyzer.ts';\n\n\n// To use a directory path as a base URL in `new URL(<path>, <base>)` we need to ensure it has a trailing slash,\n// otherwise the path will be relative to the parent directory.\nconst ensureTrailingSlash = (path: string) => path.replace(/[/]+$/, '') + '/';\n\nconst cwd: URL = pathToFileURL(ensureTrailingSlash(process.cwd())); // Trailing slash so we can use it as a base URL\n\n\ntype Logger = Pick<Console, 'info' | 'error' | 'log'>;\ntype Services = { logger: Logger };\nconst servicesStorage = new AsyncLocalStorage<Services>();\nconst getServices = () => {\n const services = servicesStorage.getStore();\n if (typeof services === 'undefined') { throw new Error(`Missing services`); }\n return services;\n};\n\n// Parse an OpenAPI v3.1 document (in JSON format).\n// @throws Error[code=ENOENT] When the document cannot be read.\n// @throws SyntaxError When the document is not a valid OpenAPI v3.1 JSON document.\nconst parseDocument = async (documentUrl: URL): Promise<OpenApi.Document> => {\n const content: string = await fs.readFile(documentUrl, 'utf8');\n \n const contentJson = ((): unknown => {\n try {\n return JSON.parse(content);\n } catch (error: unknown) {\n if (error instanceof SyntaxError) {\n throw error;\n } else {\n throw new Error(`Unable to parse JSON`, { cause: error }); // Unexpected error\n }\n }\n })();\n \n // Some quick sanity checks\n const isDocument = typeof contentJson === 'object' && contentJson !== null && 'openapi' in contentJson;\n if (!isDocument) { throw new SyntaxError('Not a valid OpenAPI document'); }\n if (typeof contentJson.openapi !== 'string' || !contentJson.openapi.trim().startsWith('3.1')) {\n const documentVersion = typeof contentJson.openapi !== 'string' ? contentJson.openapi : '(unknown version)';\n throw new SyntaxError(`Expected OpenAPI version 3.1, but got version '${documentVersion}'`);\n }\n \n // Note: we assume that this is a valid instance of `OpenApi.Document`\n // We may want to do some proper runtime validation here (but this can be expensive since the document may be large)\n return contentJson as any as OpenApi.Document; // (!) Unsafe cast\n};\n\n\nexport type GenerateRequest = {\n document: OpenApi.Document,\n spec: null | GenSpec.GenerationSpec,\n outputDirectory: URL,\n};\ntype GenerateRequestWithSpec = GenerateRequest & { spec: GenSpec.GenerationSpec };\n\n// Generate one module per schema (does not support a spec file)\nexport const generateSchemas = async (request: GenerateRequest): Promise<void> => {\n const { logger } = getServices();\n const { document, outputDirectory } = request;\n \n logger.info(`Generating schemas from document: ${document.info.title} ${document.info.version}`);\n \n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n for (const [schemaId, schema] of Object.entries(schemas)) {\n const outputUrl = new URL(`${schemaId}.ts`, outputDirectory);\n \n logger.info(`Generating schema: '${path.relative(process.cwd(), fileURLToPath(outputUrl))}'`);\n \n try {\n // Generate the effect-schema module code\n const generatedCode = ((): string => {\n try {\n return generateModule(schemaId, schema);\n } catch (error: unknown) {\n logger.error(`Unable to convert to effect-schema`);\n throw error;\n }\n })();\n \n // Format the generated code\n const generatedCodeFormatted = await (async (): Promise<string> => {\n try {\n return await formatGeneratedCode(generatedCode);\n } catch (error: unknown) {\n // Note: if we made a mistake in our code generation logic (and generate invalid syntax), it will usually\n // appear as an error here\n logger.info(generatedCode);\n logger.error(`Unable to format code`);\n throw error;\n }\n })();\n \n // Write to the output file\n try {\n await fs.writeFile(outputUrl, generatedCodeFormatted, 'utf-8');\n } catch (error: unknown) {\n logger.error(`Failed to write to file: '${fileURLToPath(outputUrl)}'`);\n throw error;\n }\n } catch (error: unknown) {\n // If anything fails, just print the error and continue with the next schema\n logger.error(error);\n }\n }\n};\n\n// Generate schemas based on the given spec file\nexport const generateSchemasWithSpec = async (request: GenerateRequestWithSpec): Promise<void> => {\n const { logger } = getServices();\n const { document, spec, outputDirectory } = request;\n \n logger.info(`Generating schemas from document: ${document.info.title} ${document.info.version}`);\n \n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n const schemasSorted = topologicalSort(document);\n \n const specParsed = ((): GenSpec.GenerationSpec => {\n if (spec.generationMethod.method === 'one-to-one') { // Autogenerate modules one-to-one (one file per schema)\n return {\n ...spec,\n modules: {\n // Add each schema in the OpenAPI document to the spec modules list, so as to be autogenerated\n ...Object.fromEntries(Object.keys(schemas)\n .map((schemaId: OpenApiSchemaId): [GenSpec.ModulePath, GenSpec.GenerationModuleSpec] => {\n return [`./${schemaId}.ts`, { definitions: [{ action: 'generate-schema', schemaId }] }];\n }),\n ),\n // Modules already in the spec can still override the default autogenerate directives.\n ...spec.modules,\n },\n };\n } else if (spec.generationMethod.method === 'bundled') { // Bundle everything into one file\n return {\n ...spec,\n modules: {\n ...Object.fromEntries(schemasSorted\n .map(({ ref, circularDependency }): [GenSpec.ModulePath, GenSpec.GenerationModuleSpec] => {\n const schemaId = schemaIdFromRef(ref);\n const def: GenSpec.GenerationDefinitionSpec = {\n ...(spec.modules[`./${schemaId}.ts`]?.definitions?.find(def => def.schemaId === schemaId) ?? {}),\n action: 'generate-schema',\n schemaId,\n lazy: circularDependency,\n };\n return [`./${schemaId}.ts`, { definitions: [def] }];\n }),\n ),\n },\n };\n } else {\n return spec;\n }\n })();\n \n let bundle = '';\n for (const [modulePath, _moduleSpec] of Object.entries({ ...specParsed.runtime, ...specParsed.modules })) {\n logger.info(`Generating module: ${modulePath}`);\n \n try {\n // Generate the effect-schema module code\n const generatedCode = ((): string => {\n try {\n return generateModuleWithSpec(schemas, specParsed, modulePath, {\n isSchemaBefore(schema1: OpenApiSchemaId, schema2: OpenApiSchemaId): boolean {\n if (spec.generationMethod.method !== 'bundled') { return true; }\n \n const schema1Index = schemasSorted.findIndex(({ ref }) => schemaIdFromRef(ref) === schema1);\n const schema2Index = schemasSorted.findIndex(({ ref }) => schemaIdFromRef(ref) === schema2);\n \n if (schema1Index === -1 || schema2Index === -1) {\n return true;\n }\n \n return schema1Index < schema2Index;\n },\n });\n } catch (error: unknown) {\n logger.error(`Unable to convert to effect-schema`);\n throw error;\n }\n })();\n \n // Format the generated code\n const generatedCodeFormatted = await (async (): Promise<string> => {\n try {\n return await formatGeneratedCode(generatedCode);\n } catch (error: unknown) {\n // Note: if we made a mistake in our code generation logic (and generate invalid syntax), it will usually\n // appear as an error here\n logger.info(generatedCode);\n logger.error(`Unable to format code`);\n throw error;\n }\n })();\n \n // Write to an output file\n const outputUrl = new URL(modulePath, outputDirectory);\n try {\n if (specParsed.generationMethod.method === 'bundled') {\n bundle += '\\n\\n' + generatedCodeFormatted;\n } else {\n await fs.mkdir(path.dirname(fileURLToPath(outputUrl)), { recursive: true });\n await fs.writeFile(outputUrl, generatedCodeFormatted, 'utf-8');\n }\n } catch (error: unknown) {\n logger.error(`Failed to write to file: ${outputUrl}`);\n throw error;\n }\n } catch (error: unknown) {\n if (specParsed.generationMethod.method === 'bundled') {\n throw error; // Stop bundling on first error\n } else {\n // If anything fails, just print the error and continue with the next schema\n logger.error('Error:', error);\n }\n }\n }\n \n if (specParsed.generationMethod.method === 'bundled') {\n const outputUrl = new URL(`${specParsed.generationMethod.bundleName}.ts`, outputDirectory);\n logger.info(`Writing to bundle: ${fileURLToPath(outputUrl)}`);\n \n try {\n const bundleFormatted = await formatGeneratedCode(\n dedent`\n /* Generated on ${new Date().toISOString()} from ${document.info.title} version ${document.info.version} */\n \n import { pipe, Option } from 'effect';\n import { Schema as S } from '@effect/schema';\n \n ${bundle.replace(/(^|\\n)(\\s*)import [^;]+;(?! \\/\\/ <runtime>)/g, '')}\n `,\n );\n \n await fs.mkdir(path.dirname(fileURLToPath(outputUrl)), { recursive: true });\n await fs.writeFile(outputUrl, bundleFormatted, 'utf-8');\n } catch (error: unknown) {\n logger.error(`Failed to write to file: ${outputUrl}`);\n throw error;\n }\n }\n \n if (spec.generationMethod.method === 'one-to-one' && spec.generationMethod.generateBarrelFile) {\n // Generate a barrel file containing all exports\n let barrelContent = '';\n for (const [modulePath, moduleSpec] of Object.entries({ ...specParsed.runtime, ...specParsed.modules })) {\n barrelContent += `export * from '${modulePath}';\\n`;\n }\n const barrelUrl = new URL('./index.ts', outputDirectory);\n logger.log(`Generating barrel file: ./index.ts`);\n await fs.writeFile(barrelUrl, barrelContent, 'utf-8');\n }\n};\n\n\nexport type RequestInput = {\n documentPath: string,\n outputPath: string,\n specPath?: undefined | string,\n};\n\n// Parse the given input and return a valid `GenerateRequest` (or throw an error).\n// @throws TypeError[ERR_INVALID_URL] If any of the given file paths are syntactically invalid.\nexport const parseRequest = async ({ documentPath, outputPath, specPath }: RequestInput): Promise<GenerateRequest> => {\n const { logger } = getServices();\n \n // Note: the following could throw a `TypeError` exception if the paths are (syntactically) invalid, e.g. `//`\n const documentUrl = new URL(documentPath, cwd);\n const outputUrl = new URL(ensureTrailingSlash(outputPath), cwd); // Trailing slash for use as base URL\n const specUrl: null | URL = typeof specPath === 'undefined' ? null : new URL(specPath, cwd);\n \n // Check if the OpenAPI document exists\n try {\n await fs.stat(documentUrl);\n } catch (error: unknown) {\n throw new Error(`Provided OpenAPI file does not exist: '${documentPath}'`, { cause: error });\n }\n \n // Check if the output path exists and is a directory\n let outputUrlStats: Stats;\n try {\n outputUrlStats = await fs.stat(outputUrl);\n } catch (error: unknown) {\n throw new Error(`Provided output path does not exist: '${outputPath}'`, { cause: error });\n }\n if (!outputUrlStats.isDirectory()) {\n throw new Error(`Provided output path '${outputPath}' is not a directory`);\n }\n \n // Check if the generation spec file exists\n if (specUrl !== null) {\n try {\n await fs.stat(specUrl);\n } catch (error: unknown) {\n throw new Error(`Provided generation spec file does not exist: '${specPath}'`, { cause: error });\n }\n }\n \n // Load the generation spec\n const spec: null | GenSpec.GenerationSpec = specUrl === null ? null : (await import(specUrl.href)).default;\n \n // Load the OpenAPI document\n const document = await (async (): Promise<OpenApi.Document> => {\n try {\n return await parseDocument(documentUrl);\n } catch (error: unknown) {\n logger.error(`Unable to parse OpenAPI document: '${documentPath}'`);\n throw error;\n }\n })();\n \n // Apply JSON Patch (if any)\n const patch: null | JSONPatchDocument = spec !== null && Array.isArray(spec?.patch) ? spec.patch : null;\n const documentPatched = patch === null\n ? document\n : immutableJSONPatch<OpenApi.Document>(document, patch);\n \n return { document: documentPatched, outputDirectory: outputUrl, spec };\n};\n\n\nconst printUsage = () => {\n const { logger } = getServices();\n \n logger.info(dedent`\n Usage: openapi-to-effect [-h | --help] [--silent] <command> [<args>]\n \n Commands:\n gen [--spec=<path>] <openapi-document-path> <output-path>\n analyze:dependency-tree <openapi-document-path> <root-schema-ref>\n `);\n};\n\ntype ScriptArgs = {\n values: {\n help: boolean | undefined,\n spec: string | undefined,\n },\n positionals: Array<string>,\n};\n\nexport const runGenerator = async (args: ScriptArgs): Promise<void> => {\n const { logger } = getServices();\n \n const documentPath: undefined | string = args.positionals[0];\n const outputPath: undefined | string = args.positionals[1];\n if (!documentPath || !outputPath) {\n printUsage();\n return;\n }\n \n const requestInput: RequestInput = {\n documentPath,\n outputPath,\n specPath: args.values.spec,\n };\n const request: GenerateRequest = await parseRequest(requestInput);\n \n if (request.spec === null) {\n await generateSchemas(request);\n } else {\n await generateSchemasWithSpec(request as GenerateRequestWithSpec);\n }\n \n logger.info('Done!');\n};\n\n// Example:\n// `npm --silent run node src/openapiToEffect.ts analyze:dependency-tree tests/fixtures/fixture1_api.json\\\n// '#/components/schemas/BatchRequest'`\nexport const runAnalyzeDependencyTree = async (args: ScriptArgs): Promise<void> => {\n const { logger } = getServices();\n \n const documentPath: undefined | string = args.positionals[0];\n const rootSchemaRef: undefined | string = args.positionals[1];\n if (!documentPath || !rootSchemaRef) {\n printUsage();\n return;\n }\n \n const documentUrl = new URL(documentPath, cwd);\n const document = await parseDocument(documentUrl);\n const tree = await dependencyTree(document, rootSchemaRef);\n \n logger.log(tree);\n \n logger.info('Done!');\n};\n\n// Run the script with the given CLI arguments\nexport const run = async (argsRaw: Array<string>): Promise<void> => {\n // Ref: https://exploringjs.com/nodejs-shell-scripting/ch_node-util-parseargs.html\n const args = parseArgs({\n args: argsRaw,\n allowPositionals: true,\n options: {\n help: { type: 'boolean', short: 'h' },\n silent: { type: 'boolean' },\n spec: { type: 'string' }, // Path to a spec file (optional)\n //runtime: { type: 'string' } // TODO: allow specifying a path to a \"runtime\" dir that we include in the output?\n },\n });\n \n // Services\n const logger: Logger = {\n info: args.values.silent ? () => {} : console.info,\n error: console.error,\n log: console.log,\n };\n \n await servicesStorage.run({ logger }, async () => {\n const command: null | string = args.positionals[0] ?? null;\n if (command === null || args.values.help) {\n printUsage();\n return;\n }\n \n const argsForCommand = { ...args, positionals: args.positionals.slice(1) };\n switch (command) {\n case 'gen':\n await runGenerator(argsForCommand);\n break;\n case 'analyze:dependency-tree':\n await runAnalyzeDependencyTree(argsForCommand);\n break;\n default:\n logger.error(`Unknown command '${command}'\\n`);\n printUsage();\n break;\n }\n });\n};\n\n// Detect if this module is being run directly from the command line\nconst [_argExec, argScript, ...args] = process.argv; // First two arguments should be the executable + script\nif (argScript && await fs.realpath(argScript) === fileURLToPath(import.meta.url)) {\n try {\n await run(args);\n process.exit(0);\n } catch (error: unknown) {\n console.error(error);\n process.exit(1);\n }\n}\n"],"mappings":"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","ignoreList":[]}
{"version":3,"file":"openapiToEffect.cjs","names":["_tsDedent","require","_nodeUtil","path","_interopRequireWildcard","_nodeUrl","fs","_nodeAsync_hooks","_moduleGen","_moduleGenWithSpec","_formatting","_immutableJsonPatch","_GraphAnalyzer","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","__transformExtension","filepath","extMapping","startsWith","idx","lastIndexOf","includes","newExt","origExt","entries","sort","b","length","endsWith","slice","ensureTrailingSlash","replace","cwd","pathToFileURL","process","servicesStorage","AsyncLocalStorage","getServices","services","getStore","Error","parseDocument","documentUrl","content","readFile","contentJson","JSON","parse","error","SyntaxError","cause","isDocument","openapi","trim","documentVersion","generateSchemas","request","logger","document","outputDirectory","info","title","version","schemas","components","schemaId","schema","outputUrl","URL","relative","fileURLToPath","generatedCode","generateModule","generatedCodeFormatted","formatGeneratedCode","writeFile","exports","generateSchemasWithSpec","spec","schemasSorted","topologicalSort","specParsed","generationMethod","method","modules","fromEntries","keys","map","definitions","action","ref","circularDependency","schemaIdFromRef","def","find","lazy","bundle","modulePath","_moduleSpec","runtime","generateModuleWithSpec","isSchemaBefore","schema1","schema2","schema1Index","findIndex","schema2Index","mkdir","dirname","recursive","bundleName","bundleFormatted","dedent","Date","toISOString","generateBarrelFile","barrelContent","moduleSpec","barrelUrl","log","parseRequest","documentPath","outputPath","specPath","specUrl","stat","outputUrlStats","isDirectory","specifier","Promise","then","s","href","patch","Array","isArray","documentPatched","immutableJSONPatch","printUsage","runGenerator","args","positionals","requestInput","values","runAnalyzeDependencyTree","rootSchemaRef","tree","dependencyTree","run","argsRaw","parseArgs","allowPositionals","options","help","type","short","silent","console","command","argsForCommand","_argExec","argScript","argv","realpath","import","meta","url","exit"],"sources":["../../src/openapiToEffect.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport { parseArgs } from 'node:util';\nimport * as path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { type Stats } from 'node:fs';\nimport * as fs from 'node:fs/promises';\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\nimport { type OpenAPIV3_1 as OpenApi } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema } from './util/openapi.ts';\n\nimport * as GenSpec from './generation/generationSpec.ts';\nimport { generateModule } from './generation/effSchemGen/moduleGen.ts';\nimport { generateModuleWithSpec } from './generation/effSchemGen/moduleGenWithSpec.ts';\nimport { formatGeneratedCode } from './generation/formatting.ts';\nimport { type JSONPatchDocument, immutableJSONPatch } from 'immutable-json-patch';\nimport { schemaIdFromRef, topologicalSort, dependencyTree } from './analysis/GraphAnalyzer.ts';\n\n\n// To use a directory path as a base URL in `new URL(<path>, <base>)` we need to ensure it has a trailing slash,\n// otherwise the path will be relative to the parent directory.\nconst ensureTrailingSlash = (path: string) => path.replace(/[/]+$/, '') + '/';\n\nconst cwd: URL = pathToFileURL(ensureTrailingSlash(process.cwd())); // Trailing slash so we can use it as a base URL\n\n\ntype Logger = Pick<Console, 'info' | 'error' | 'log'>;\ntype Services = { logger: Logger };\nconst servicesStorage = new AsyncLocalStorage<Services>();\nconst getServices = () => {\n const services = servicesStorage.getStore();\n if (typeof services === 'undefined') { throw new Error(`Missing services`); }\n return services;\n};\n\n// Parse an OpenAPI v3.1 document (in JSON format).\n// @throws Error[code=ENOENT] When the document cannot be read.\n// @throws SyntaxError When the document is not a valid OpenAPI v3.1 JSON document.\nconst parseDocument = async (documentUrl: URL): Promise<OpenApi.Document> => {\n const content: string = await fs.readFile(documentUrl, 'utf8');\n \n const contentJson = ((): unknown => {\n try {\n return JSON.parse(content);\n } catch (error: unknown) {\n if (error instanceof SyntaxError) {\n throw error;\n } else {\n throw new Error(`Unable to parse JSON`, { cause: error }); // Unexpected error\n }\n }\n })();\n \n // Some quick sanity checks\n const isDocument = typeof contentJson === 'object' && contentJson !== null && 'openapi' in contentJson;\n if (!isDocument) { throw new SyntaxError('Not a valid OpenAPI document'); }\n if (typeof contentJson.openapi !== 'string' || !contentJson.openapi.trim().startsWith('3.1')) {\n const documentVersion = typeof contentJson.openapi !== 'string' ? contentJson.openapi : '(unknown version)';\n throw new SyntaxError(`Expected OpenAPI version 3.1, but got version '${documentVersion}'`);\n }\n \n // Note: we assume that this is a valid instance of `OpenApi.Document`\n // We may want to do some proper runtime validation here (but this can be expensive since the document may be large)\n return contentJson as any as OpenApi.Document; // (!) Unsafe cast\n};\n\n\nexport type GenerateRequest = {\n document: OpenApi.Document,\n spec: null | GenSpec.GenerationSpec,\n outputDirectory: URL,\n};\ntype GenerateRequestWithSpec = GenerateRequest & { spec: GenSpec.GenerationSpec };\n\n// Generate one module per schema (does not support a spec file)\nexport const generateSchemas = async (request: GenerateRequest): Promise<void> => {\n const { logger } = getServices();\n const { document, outputDirectory } = request;\n \n logger.info(`Generating schemas from document: ${document.info.title} ${document.info.version}`);\n \n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n for (const [schemaId, schema] of Object.entries(schemas)) {\n const outputUrl = new URL(`${schemaId}.ts`, outputDirectory);\n \n logger.info(`Generating schema: '${path.relative(process.cwd(), fileURLToPath(outputUrl))}'`);\n \n try {\n // Generate the effect-schema module code\n const generatedCode = ((): string => {\n try {\n return generateModule(schemaId, schema);\n } catch (error: unknown) {\n logger.error(`Unable to convert to effect-schema`);\n throw error;\n }\n })();\n \n // Format the generated code\n const generatedCodeFormatted = await (async (): Promise<string> => {\n try {\n return await formatGeneratedCode(generatedCode);\n } catch (error: unknown) {\n // Note: if we made a mistake in our code generation logic (and generate invalid syntax), it will usually\n // appear as an error here\n logger.info(generatedCode);\n logger.error(`Unable to format code`);\n throw error;\n }\n })();\n \n // Write to the output file\n try {\n await fs.writeFile(outputUrl, generatedCodeFormatted, 'utf-8');\n } catch (error: unknown) {\n logger.error(`Failed to write to file: '${fileURLToPath(outputUrl)}'`);\n throw error;\n }\n } catch (error: unknown) {\n // If anything fails, just print the error and continue with the next schema\n logger.error(error);\n }\n }\n};\n\n// Generate schemas based on the given spec file\nexport const generateSchemasWithSpec = async (request: GenerateRequestWithSpec): Promise<void> => {\n const { logger } = getServices();\n const { document, spec, outputDirectory } = request;\n \n logger.info(`Generating schemas from document: ${document.info.title} ${document.info.version}`);\n \n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n const schemasSorted = topologicalSort(document);\n \n const specParsed = ((): GenSpec.GenerationSpec => {\n if (spec.generationMethod.method === 'one-to-one') { // Autogenerate modules one-to-one (one file per schema)\n return {\n ...spec,\n modules: {\n // Add each schema in the OpenAPI document to the spec modules list, so as to be autogenerated\n ...Object.fromEntries(Object.keys(schemas)\n .map((schemaId: OpenApiSchemaId): [GenSpec.ModulePath, GenSpec.GenerationModuleSpec] => {\n return [`./${schemaId}.ts`, { definitions: [{ action: 'generate-schema', schemaId }] }];\n }),\n ),\n // Modules already in the spec can still override the default autogenerate directives.\n ...spec.modules,\n },\n };\n } else if (spec.generationMethod.method === 'bundled') { // Bundle everything into one file\n return {\n ...spec,\n modules: {\n ...Object.fromEntries(schemasSorted\n .map(({ ref, circularDependency }): [GenSpec.ModulePath, GenSpec.GenerationModuleSpec] => {\n const schemaId = schemaIdFromRef(ref);\n const def: GenSpec.GenerationDefinitionSpec = {\n ...(spec.modules[`./${schemaId}.ts`]?.definitions?.find(def => def.schemaId === schemaId) ?? {}),\n action: 'generate-schema',\n schemaId,\n lazy: circularDependency,\n };\n return [`./${schemaId}.ts`, { definitions: [def] }];\n }),\n ),\n },\n };\n } else {\n return spec;\n }\n })();\n \n let bundle = '';\n for (const [modulePath, _moduleSpec] of Object.entries({ ...specParsed.runtime, ...specParsed.modules })) {\n logger.info(`Generating module: ${modulePath}`);\n \n try {\n // Generate the effect-schema module code\n const generatedCode = ((): string => {\n try {\n return generateModuleWithSpec(schemas, specParsed, modulePath, {\n isSchemaBefore(schema1: OpenApiSchemaId, schema2: OpenApiSchemaId): boolean {\n if (spec.generationMethod.method !== 'bundled') { return true; }\n \n const schema1Index = schemasSorted.findIndex(({ ref }) => schemaIdFromRef(ref) === schema1);\n const schema2Index = schemasSorted.findIndex(({ ref }) => schemaIdFromRef(ref) === schema2);\n \n if (schema1Index === -1 || schema2Index === -1) {\n return true;\n }\n \n return schema1Index < schema2Index;\n },\n });\n } catch (error: unknown) {\n logger.error(`Unable to convert to effect-schema`);\n throw error;\n }\n })();\n \n // Format the generated code\n const generatedCodeFormatted = await (async (): Promise<string> => {\n try {\n return await formatGeneratedCode(generatedCode);\n } catch (error: unknown) {\n // Note: if we made a mistake in our code generation logic (and generate invalid syntax), it will usually\n // appear as an error here\n logger.info(generatedCode);\n logger.error(`Unable to format code`);\n throw error;\n }\n })();\n \n // Write to an output file\n const outputUrl = new URL(modulePath, outputDirectory);\n try {\n if (specParsed.generationMethod.method === 'bundled') {\n bundle += '\\n\\n' + generatedCodeFormatted;\n } else {\n await fs.mkdir(path.dirname(fileURLToPath(outputUrl)), { recursive: true });\n await fs.writeFile(outputUrl, generatedCodeFormatted, 'utf-8');\n }\n } catch (error: unknown) {\n logger.error(`Failed to write to file: ${outputUrl}`);\n throw error;\n }\n } catch (error: unknown) {\n if (specParsed.generationMethod.method === 'bundled') {\n throw error; // Stop bundling on first error\n } else {\n // If anything fails, just print the error and continue with the next schema\n logger.error('Error:', error);\n }\n }\n }\n \n if (specParsed.generationMethod.method === 'bundled') {\n const outputUrl = new URL(`${specParsed.generationMethod.bundleName}.ts`, outputDirectory);\n logger.info(`Writing to bundle: ${fileURLToPath(outputUrl)}`);\n \n try {\n const bundleFormatted = await formatGeneratedCode(\n dedent`\n /* Generated on ${new Date().toISOString()} from ${document.info.title} version ${document.info.version} */\n \n import { pipe, Option, Schema as S } from 'effect';\n \n ${bundle.replace(/(^|\\n)(\\s*)import [^;]+;(?! \\/\\/ <runtime>)/g, '')}\n `,\n );\n \n await fs.mkdir(path.dirname(fileURLToPath(outputUrl)), { recursive: true });\n await fs.writeFile(outputUrl, bundleFormatted, 'utf-8');\n } catch (error: unknown) {\n logger.error(`Failed to write to file: ${outputUrl}`);\n throw error;\n }\n }\n \n if (spec.generationMethod.method === 'one-to-one' && spec.generationMethod.generateBarrelFile) {\n // Generate a barrel file containing all exports\n let barrelContent = '';\n for (const [modulePath, moduleSpec] of Object.entries({ ...specParsed.runtime, ...specParsed.modules })) {\n barrelContent += `export * from '${modulePath}';\\n`;\n }\n const barrelUrl = new URL('./index.ts', outputDirectory);\n logger.log(`Generating barrel file: ./index.ts`);\n await fs.writeFile(barrelUrl, barrelContent, 'utf-8');\n }\n};\n\n\nexport type RequestInput = {\n documentPath: string,\n outputPath: string,\n specPath?: undefined | string,\n};\n\n// Parse the given input and return a valid `GenerateRequest` (or throw an error).\n// @throws TypeError[ERR_INVALID_URL] If any of the given file paths are syntactically invalid.\nexport const parseRequest = async ({ documentPath, outputPath, specPath }: RequestInput): Promise<GenerateRequest> => {\n const { logger } = getServices();\n \n // Note: the following could throw a `TypeError` exception if the paths are (syntactically) invalid, e.g. `//`\n const documentUrl = new URL(documentPath, cwd);\n const outputUrl = new URL(ensureTrailingSlash(outputPath), cwd); // Trailing slash for use as base URL\n const specUrl: null | URL = typeof specPath === 'undefined' ? null : new URL(specPath, cwd);\n \n // Check if the OpenAPI document exists\n try {\n await fs.stat(documentUrl);\n } catch (error: unknown) {\n throw new Error(`Provided OpenAPI file does not exist: '${documentPath}'`, { cause: error });\n }\n \n // Check if the output path exists and is a directory\n let outputUrlStats: Stats;\n try {\n outputUrlStats = await fs.stat(outputUrl);\n } catch (error: unknown) {\n throw new Error(`Provided output path does not exist: '${outputPath}'`, { cause: error });\n }\n if (!outputUrlStats.isDirectory()) {\n throw new Error(`Provided output path '${outputPath}' is not a directory`);\n }\n \n // Check if the generation spec file exists\n if (specUrl !== null) {\n try {\n await fs.stat(specUrl);\n } catch (error: unknown) {\n throw new Error(`Provided generation spec file does not exist: '${specPath}'`, { cause: error });\n }\n }\n \n // Load the generation spec\n const spec: null | GenSpec.GenerationSpec = specUrl === null ? null : (await import(specUrl.href)).default;\n \n // Load the OpenAPI document\n const document = await (async (): Promise<OpenApi.Document> => {\n try {\n return await parseDocument(documentUrl);\n } catch (error: unknown) {\n logger.error(`Unable to parse OpenAPI document: '${documentPath}'`);\n throw error;\n }\n })();\n \n // Apply JSON Patch (if any)\n const patch: null | JSONPatchDocument = spec !== null && Array.isArray(spec?.patch) ? spec.patch : null;\n const documentPatched = patch === null\n ? document\n : immutableJSONPatch<OpenApi.Document>(document, patch);\n \n return { document: documentPatched, outputDirectory: outputUrl, spec };\n};\n\n\nconst printUsage = () => {\n const { logger } = getServices();\n \n logger.info(dedent`\n Usage: openapi-to-effect [-h | --help] [--silent] <command> [<args>]\n \n Commands:\n gen [--spec=<path>] <openapi-document-path> <output-path>\n analyze:dependency-tree <openapi-document-path> <root-schema-ref>\n `);\n};\n\ntype ScriptArgs = {\n values: {\n help?: undefined | boolean,\n spec?: undefined | string,\n },\n positionals: Array<string>,\n};\n\nexport const runGenerator = async (args: ScriptArgs): Promise<void> => {\n const { logger } = getServices();\n \n const documentPath: undefined | string = args.positionals[0];\n const outputPath: undefined | string = args.positionals[1];\n if (!documentPath || !outputPath) {\n printUsage();\n return;\n }\n \n const requestInput: RequestInput = {\n documentPath,\n outputPath,\n specPath: args.values.spec,\n };\n const request: GenerateRequest = await parseRequest(requestInput);\n \n if (request.spec === null) {\n await generateSchemas(request);\n } else {\n await generateSchemasWithSpec(request as GenerateRequestWithSpec);\n }\n \n logger.info('Done!');\n};\n\n// Example:\n// `npm --silent run node src/openapiToEffect.ts analyze:dependency-tree tests/fixtures/fixture1_api.json\\\n// '#/components/schemas/BatchRequest'`\nexport const runAnalyzeDependencyTree = async (args: ScriptArgs): Promise<void> => {\n const { logger } = getServices();\n \n const documentPath: undefined | string = args.positionals[0];\n const rootSchemaRef: undefined | string = args.positionals[1];\n if (!documentPath || !rootSchemaRef) {\n printUsage();\n return;\n }\n \n const documentUrl = new URL(documentPath, cwd);\n const document = await parseDocument(documentUrl);\n const tree = await dependencyTree(document, rootSchemaRef);\n \n logger.log(tree);\n \n logger.info('Done!');\n};\n\n// Run the script with the given CLI arguments\nexport const run = async (argsRaw: Array<string>): Promise<void> => {\n // Ref: https://exploringjs.com/nodejs-shell-scripting/ch_node-util-parseargs.html\n const args = parseArgs({\n args: argsRaw,\n allowPositionals: true,\n options: {\n help: { type: 'boolean', short: 'h' },\n silent: { type: 'boolean' },\n spec: { type: 'string' }, // Path to a spec file (optional)\n //runtime: { type: 'string' } // TODO: allow specifying a path to a \"runtime\" dir that we include in the output?\n },\n });\n \n // Services\n const logger: Logger = {\n info: args.values.silent ? () => {} : console.info,\n error: console.error,\n log: console.log,\n };\n \n await servicesStorage.run({ logger }, async () => {\n const command: null | string = args.positionals[0] ?? null;\n if (command === null || args.values.help) {\n printUsage();\n return;\n }\n \n const argsForCommand: ScriptArgs = { ...args, positionals: args.positionals.slice(1) };\n switch (command) {\n case 'gen':\n await runGenerator(argsForCommand);\n break;\n case 'analyze:dependency-tree':\n await runAnalyzeDependencyTree(argsForCommand);\n break;\n default:\n logger.error(`Unknown command '${command}'\\n`);\n printUsage();\n break;\n }\n });\n};\n\n// Detect if this module is being run directly from the command line\nconst [_argExec, argScript, ...args] = process.argv; // First two arguments should be the executable + script\nif (argScript && await fs.realpath(argScript) === fileURLToPath(import.meta.url)) {\n try {\n await run(args);\n process.exit(0);\n } catch (error: unknown) {\n console.error(error);\n process.exit(1);\n }\n}\n"],"mappings":";;;;;;AAOA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,IAAA,GAAAC,uBAAA,CAAAH,OAAA;AACA,IAAAI,QAAA,GAAAJ,OAAA;AAEA,IAAAK,EAAA,GAAAF,uBAAA,CAAAH,OAAA;AACA,IAAAM,gBAAA,GAAAN,OAAA;AAMA,IAAAO,UAAA,GAAAP,OAAA;AACA,IAAAQ,kBAAA,GAAAR,OAAA;AACA,IAAAS,WAAA,GAAAT,OAAA;AACA,IAAAU,mBAAA,GAAAV,OAAA;AACA,IAAAW,cAAA,GAAAX,OAAA;AAA+F,SAAAY,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAV,wBAAAU,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAvB9F,SAASW,oBAAoBA,CAACC,QAAQ,EAAEC,UAAU,EAAE;EACnD,IAAG,CAACD,QAAQ,CAACE,UAAU,CAAC,IAAI,CAAC,IAAI,CAACF,QAAQ,CAACE,UAAU,CAAC,KAAK,CAAC,EAAE;IAC5D;IACA,OAAOF,QAAQ;EACjB;EAEA,MAAMG,GAAG,GAAGH,QAAQ,CAACI,WAAW,CAAC,GAAG,CAAC;EACrC,IAAGD,GAAG,KAAK,CAAC,CAAC,IAAIH,QAAQ,CAACK,QAAQ,CAAC,GAAG,EAAEF,GAAG,CAAC,EAAE;IAC5C;IACA,MAAMG,MAAM,GAAGL,UAAU,CAAC,EAAE,CAAC;IAC7B,IAAGK,MAAM,EAAE;MACT,OAAON,QAAQ,GAAGM,MAAM;IAC1B;IACA,OAAON,QAAQ;EACjB;EAEA,KAAI,IAAI,CAACO,OAAO,EAAED,MAAM,CAAC,IAAIf,MAAM,CAACiB,OAAO,CAACP,UAAU,CAAC,CAACQ,IAAI,CAC1D,CAACnB,CAAC,EAAEoB,CAAC,KAAKA,CAAC,CAAC,CAAC,CAAC,CAACC,MAAM,GAAGrB,CAAC,CAAC,CAAC,CAAC,CAACqB,MAC/B,CAAC,EAAE;IACD,IAAGX,QAAQ,CAACY,QAAQ,CAACL,OAAO,CAAC,EAAE;MAC7B,OAAOP,QAAQ,CAACa,KAAK,CAAC,CAAC,EAAE,CAACN,OAAO,CAACI,MAAM,CAAC,GAAGL,MAAM;IACpD;EACF;EACA,OAAON,QAAQ;AACjB,CAAC,CAxBD;AACA;AACA;AACA;AACA;AACA;;AAqBA;AACA;AACA,MAAMc,mBAAmB,GAAI7C,IAAY,IAAKA,IAAI,CAAC8C,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,GAAG;AAE7E,MAAMC,GAAQ,GAAG,IAAAC,sBAAa,EAACH,mBAAmB,CAACI,OAAO,CAACF,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;AAKpE,MAAMG,eAAe,GAAG,IAAIC,kCAAiB,CAAW,CAAC;AACzD,MAAMC,WAAW,GAAGA,CAAA,KAAM;EACxB,MAAMC,QAAQ,GAAGH,eAAe,CAACI,QAAQ,CAAC,CAAC;EAC3C,IAAI,OAAOD,QAAQ,KAAK,WAAW,EAAE;IAAE,MAAM,IAAIE,KAAK,CAAC,kBAAkB,CAAC;EAAE;EAC5E,OAAOF,QAAQ;AACjB,CAAC;;AAED;AACA;AACA;AACA,MAAMG,aAAa,GAAG,MAAOC,WAAgB,IAAgC;EAC3E,MAAMC,OAAe,GAAG,MAAMvD,EAAE,CAACwD,QAAQ,CAACF,WAAW,EAAE,MAAM,CAAC;EAE9D,MAAMG,WAAW,GAAG,CAAC,MAAe;IAClC,IAAI;MACF,OAAOC,IAAI,CAACC,KAAK,CAACJ,OAAO,CAAC;IAC5B,CAAC,CAAC,OAAOK,KAAc,EAAE;MACvB,IAAIA,KAAK,YAAYC,WAAW,EAAE;QAChC,MAAMD,KAAK;MACb,CAAC,MAAM;QACL,MAAM,IAAIR,KAAK,CAAC,sBAAsB,EAAE;UAAEU,KAAK,EAAEF;QAAM,CAAC,CAAC,CAAC,CAAC;MAC7D;IACF;EACF,CAAC,EAAE,CAAC;;EAEJ;EACA,MAAMG,UAAU,GAAG,OAAON,WAAW,KAAK,QAAQ,IAAIA,WAAW,KAAK,IAAI,IAAI,SAAS,IAAIA,WAAW;EACtG,IAAI,CAACM,UAAU,EAAE;IAAE,MAAM,IAAIF,WAAW,CAAC,8BAA8B,CAAC;EAAE;EAC1E,IAAI,OAAOJ,WAAW,CAACO,OAAO,KAAK,QAAQ,IAAI,CAACP,WAAW,CAACO,OAAO,CAACC,IAAI,CAAC,CAAC,CAACnC,UAAU,CAAC,KAAK,CAAC,EAAE;IAC5F,MAAMoC,eAAe,GAAG,OAAOT,WAAW,CAACO,OAAO,KAAK,QAAQ,GAAGP,WAAW,CAACO,OAAO,GAAG,mBAAmB;IAC3G,MAAM,IAAIH,WAAW,CAAC,kDAAkDK,eAAe,GAAG,CAAC;EAC7F;;EAEA;EACA;EACA,OAAOT,WAAW,CAA4B,CAAC;AACjD,CAAC;AAUD;AACO,MAAMU,eAAe,GAAG,MAAOC,OAAwB,IAAoB;EAChF,MAAM;IAAEC;EAAO,CAAC,GAAGpB,WAAW,CAAC,CAAC;EAChC,MAAM;IAAEqB,QAAQ;IAAEC;EAAgB,CAAC,GAAGH,OAAO;EAE7CC,MAAM,CAACG,IAAI,CAAC,qCAAqCF,QAAQ,CAACE,IAAI,CAACC,KAAK,IAAIH,QAAQ,CAACE,IAAI,CAACE,OAAO,EAAE,CAAC;EAEhG,MAAMC,OAA+C,GAAGL,QAAQ,CAACM,UAAU,EAAED,OAAO,IAAI,CAAC,CAAC;EAE1F,KAAK,MAAM,CAACE,QAAQ,EAAEC,MAAM,CAAC,IAAI3D,MAAM,CAACiB,OAAO,CAACuC,OAAO,CAAC,EAAE;IACxD,MAAMI,SAAS,GAAG,IAAIC,GAAG,CAAC,GAAGH,QAAQ,KAAK,EAAEN,eAAe,CAAC;IAE5DF,MAAM,CAACG,IAAI,CAAC,uBAAuB3E,IAAI,CAACoF,QAAQ,CAACnC,OAAO,CAACF,GAAG,CAAC,CAAC,EAAE,IAAAsC,sBAAa,EAACH,SAAS,CAAC,CAAC,GAAG,CAAC;IAE7F,IAAI;MACF;MACA,MAAMI,aAAa,GAAG,CAAC,MAAc;QACnC,IAAI;UACF,OAAO,IAAAC,yBAAc,EAACP,QAAQ,EAAEC,MAAM,CAAC;QACzC,CAAC,CAAC,OAAOlB,KAAc,EAAE;UACvBS,MAAM,CAACT,KAAK,CAAC,oCAAoC,CAAC;UAClD,MAAMA,KAAK;QACb;MACF,CAAC,EAAE,CAAC;;MAEJ;MACA,MAAMyB,sBAAsB,GAAG,MAAM,CAAC,YAA6B;QACjE,IAAI;UACF,OAAO,MAAM,IAAAC,+BAAmB,EAACH,aAAa,CAAC;QACjD,CAAC,CAAC,OAAOvB,KAAc,EAAE;UACvB;UACA;UACAS,MAAM,CAACG,IAAI,CAACW,aAAa,CAAC;UAC1Bd,MAAM,CAACT,KAAK,CAAC,uBAAuB,CAAC;UACrC,MAAMA,KAAK;QACb;MACF,CAAC,EAAE,CAAC;;MAEJ;MACA,IAAI;QACF,MAAM5D,EAAE,CAACuF,SAAS,CAACR,SAAS,EAAEM,sBAAsB,EAAE,OAAO,CAAC;MAChE,CAAC,CAAC,OAAOzB,KAAc,EAAE;QACvBS,MAAM,CAACT,KAAK,CAAC,6BAA6B,IAAAsB,sBAAa,EAACH,SAAS,CAAC,GAAG,CAAC;QACtE,MAAMnB,KAAK;MACb;IACF,CAAC,CAAC,OAAOA,KAAc,EAAE;MACvB;MACAS,MAAM,CAACT,KAAK,CAACA,KAAK,CAAC;IACrB;EACF;AACF,CAAC;;AAED;AAAA4B,OAAA,CAAArB,eAAA,GAAAA,eAAA;AACO,MAAMsB,uBAAuB,GAAG,MAAOrB,OAAgC,IAAoB;EAChG,MAAM;IAAEC;EAAO,CAAC,GAAGpB,WAAW,CAAC,CAAC;EAChC,MAAM;IAAEqB,QAAQ;IAAEoB,IAAI;IAAEnB;EAAgB,CAAC,GAAGH,OAAO;EAEnDC,MAAM,CAACG,IAAI,CAAC,qCAAqCF,QAAQ,CAACE,IAAI,CAACC,KAAK,IAAIH,QAAQ,CAACE,IAAI,CAACE,OAAO,EAAE,CAAC;EAEhG,MAAMC,OAA+C,GAAGL,QAAQ,CAACM,UAAU,EAAED,OAAO,IAAI,CAAC,CAAC;EAC1F,MAAMgB,aAAa,GAAG,IAAAC,8BAAe,EAACtB,QAAQ,CAAC;EAE/C,MAAMuB,UAAU,GAAG,CAAC,MAA8B;IAChD,IAAIH,IAAI,CAACI,gBAAgB,CAACC,MAAM,KAAK,YAAY,EAAE;MAAE;MACnD,OAAO;QACL,GAAGL,IAAI;QACPM,OAAO,EAAE;UACP;UACA,GAAG7E,MAAM,CAAC8E,WAAW,CAAC9E,MAAM,CAAC+E,IAAI,CAACvB,OAAO,CAAC,CACvCwB,GAAG,CAAEtB,QAAyB,IAAyD;YACtF,OAAO,CAAC,KAAKA,QAAQ,KAAK,EAAE;cAAEuB,WAAW,EAAE,CAAC;gBAAEC,MAAM,EAAE,iBAAiB;gBAAExB;cAAS,CAAC;YAAE,CAAC,CAAC;UACzF,CAAC,CACH,CAAC;UACD;UACA,GAAGa,IAAI,CAACM;QACV;MACF,CAAC;IACH,CAAC,MAAM,IAAIN,IAAI,CAACI,gBAAgB,CAACC,MAAM,KAAK,SAAS,EAAE;MAAE;MACvD,OAAO;QACL,GAAGL,IAAI;QACPM,OAAO,EAAE;UACP,GAAG7E,MAAM,CAAC8E,WAAW,CAACN,aAAa,CAChCQ,GAAG,CAAC,CAAC;YAAEG,GAAG;YAAEC;UAAmB,CAAC,KAAyD;YACxF,MAAM1B,QAAQ,GAAG,IAAA2B,8BAAe,EAACF,GAAG,CAAC;YACrC,MAAMG,GAAqC,GAAG;cAC5C,IAAIf,IAAI,CAACM,OAAO,CAAC,KAAKnB,QAAQ,KAAK,CAAC,EAAEuB,WAAW,EAAEM,IAAI,CAACD,GAAG,IAAIA,GAAG,CAAC5B,QAAQ,KAAMA,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;cACjGwB,MAAM,EAAE,iBAAiB;cACzBxB,QAAQ;cACR8B,IAAI,EAAEJ;YACR,CAAC;YACD,OAAO,CAAC,KAAK1B,QAAQ,KAAK,EAAE;cAAEuB,WAAW,EAAE,CAACK,GAAG;YAAE,CAAC,CAAC;UACrD,CAAC,CACH;QACF;MACF,CAAC;IACH,CAAC,MAAM;MACL,OAAOf,IAAI;IACb;EACF,CAAC,EAAE,CAAC;EAEJ,IAAIkB,MAAM,GAAG,EAAE;EACf,KAAK,MAAM,CAACC,UAAU,EAAEC,WAAW,CAAC,IAAI3F,MAAM,CAACiB,OAAO,CAAC;IAAE,GAAGyD,UAAU,CAACkB,OAAO;IAAE,GAAGlB,UAAU,CAACG;EAAQ,CAAC,CAAC,EAAE;IACxG3B,MAAM,CAACG,IAAI,CAAC,sBAAsBqC,UAAU,EAAE,CAAC;IAE/C,IAAI;MACF;MACA,MAAM1B,aAAa,GAAG,CAAC,MAAc;QACnC,IAAI;UACF,OAAO,IAAA6B,yCAAsB,EAACrC,OAAO,EAAEkB,UAAU,EAAEgB,UAAU,EAAE;YAC7DI,cAAcA,CAACC,OAAwB,EAAEC,OAAwB,EAAW;cAC1E,IAAIzB,IAAI,CAACI,gBAAgB,CAACC,MAAM,KAAK,SAAS,EAAE;gBAAE,OAAO,IAAI;cAAE;cAE/D,MAAMqB,YAAY,GAAGzB,aAAa,CAAC0B,SAAS,CAAC,CAAC;gBAAEf;cAAI,CAAC,KAAK,IAAAE,8BAAe,EAACF,GAAG,CAAC,KAAKY,OAAO,CAAC;cAC3F,MAAMI,YAAY,GAAG3B,aAAa,CAAC0B,SAAS,CAAC,CAAC;gBAAEf;cAAI,CAAC,KAAK,IAAAE,8BAAe,EAACF,GAAG,CAAC,KAAKa,OAAO,CAAC;cAE3F,IAAIC,YAAY,KAAK,CAAC,CAAC,IAAIE,YAAY,KAAK,CAAC,CAAC,EAAE;gBAC9C,OAAO,IAAI;cACb;cAEA,OAAOF,YAAY,GAAGE,YAAY;YACpC;UACF,CAAC,CAAC;QACJ,CAAC,CAAC,OAAO1D,KAAc,EAAE;UACvBS,MAAM,CAACT,KAAK,CAAC,oCAAoC,CAAC;UAClD,MAAMA,KAAK;QACb;MACF,CAAC,EAAE,CAAC;;MAEJ;MACA,MAAMyB,sBAAsB,GAAG,MAAM,CAAC,YAA6B;QACjE,IAAI;UACF,OAAO,MAAM,IAAAC,+BAAmB,EAACH,aAAa,CAAC;QACjD,CAAC,CAAC,OAAOvB,KAAc,EAAE;UACvB;UACA;UACAS,MAAM,CAACG,IAAI,CAACW,aAAa,CAAC;UAC1Bd,MAAM,CAACT,KAAK,CAAC,uBAAuB,CAAC;UACrC,MAAMA,KAAK;QACb;MACF,CAAC,EAAE,CAAC;;MAEJ;MACA,MAAMmB,SAAS,GAAG,IAAIC,GAAG,CAAC6B,UAAU,EAAEtC,eAAe,CAAC;MACtD,IAAI;QACF,IAAIsB,UAAU,CAACC,gBAAgB,CAACC,MAAM,KAAK,SAAS,EAAE;UACpDa,MAAM,IAAI,MAAM,GAAGvB,sBAAsB;QAC3C,CAAC,MAAM;UACL,MAAMrF,EAAE,CAACuH,KAAK,CAAC1H,IAAI,CAAC2H,OAAO,CAAC,IAAAtC,sBAAa,EAACH,SAAS,CAAC,CAAC,EAAE;YAAE0C,SAAS,EAAE;UAAK,CAAC,CAAC;UAC3E,MAAMzH,EAAE,CAACuF,SAAS,CAACR,SAAS,EAAEM,sBAAsB,EAAE,OAAO,CAAC;QAChE;MACF,CAAC,CAAC,OAAOzB,KAAc,EAAE;QACvBS,MAAM,CAACT,KAAK,CAAC,4BAA4BmB,SAAS,EAAE,CAAC;QACrD,MAAMnB,KAAK;MACb;IACF,CAAC,CAAC,OAAOA,KAAc,EAAE;MACvB,IAAIiC,UAAU,CAACC,gBAAgB,CAACC,MAAM,KAAK,SAAS,EAAE;QACpD,MAAMnC,KAAK,CAAC,CAAC;MACf,CAAC,MAAM;QACL;QACAS,MAAM,CAACT,KAAK,CAAC,QAAQ,EAAEA,KAAK,CAAC;MAC/B;IACF;EACF;EAEA,IAAIiC,UAAU,CAACC,gBAAgB,CAACC,MAAM,KAAK,SAAS,EAAE;IACpD,MAAMhB,SAAS,GAAG,IAAIC,GAAG,CAAC,GAAGa,UAAU,CAACC,gBAAgB,CAAC4B,UAAU,KAAK,EAAEnD,eAAe,CAAC;IAC1FF,MAAM,CAACG,IAAI,CAAC,sBAAsB,IAAAU,sBAAa,EAACH,SAAS,CAAC,EAAE,CAAC;IAE7D,IAAI;MACF,MAAM4C,eAAe,GAAG,MAAM,IAAArC,+BAAmB,EAC/C,IAAAsC,gBAAM;AACd,4BAA4B,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,SAASxD,QAAQ,CAACE,IAAI,CAACC,KAAK,YAAYH,QAAQ,CAACE,IAAI,CAACE,OAAO;AACjH;AACA;AACA;AACA,YAAYkC,MAAM,CAACjE,OAAO,CAAC,8CAA8C,EAAE,EAAE,CAAC;AAC9E,SACM,CAAC;MAED,MAAM3C,EAAE,CAACuH,KAAK,CAAC1H,IAAI,CAAC2H,OAAO,CAAC,IAAAtC,sBAAa,EAACH,SAAS,CAAC,CAAC,EAAE;QAAE0C,SAAS,EAAE;MAAK,CAAC,CAAC;MAC3E,MAAMzH,EAAE,CAACuF,SAAS,CAACR,SAAS,EAAE4C,eAAe,EAAE,OAAO,CAAC;IACzD,CAAC,CAAC,OAAO/D,KAAc,EAAE;MACvBS,MAAM,CAACT,KAAK,CAAC,4BAA4BmB,SAAS,EAAE,CAAC;MACrD,MAAMnB,KAAK;IACb;EACF;EAEA,IAAI8B,IAAI,CAACI,gBAAgB,CAACC,MAAM,KAAK,YAAY,IAAIL,IAAI,CAACI,gBAAgB,CAACiC,kBAAkB,EAAE;IAC7F;IACA,IAAIC,aAAa,GAAG,EAAE;IACtB,KAAK,MAAM,CAACnB,UAAU,EAAEoB,UAAU,CAAC,IAAI9G,MAAM,CAACiB,OAAO,CAAC;MAAE,GAAGyD,UAAU,CAACkB,OAAO;MAAE,GAAGlB,UAAU,CAACG;IAAQ,CAAC,CAAC,EAAE;MACvGgC,aAAa,IAAI,kBAAkBnB,UAAU,MAAM;IACrD;IACA,MAAMqB,SAAS,GAAG,IAAIlD,GAAG,CAAC,YAAY,EAAET,eAAe,CAAC;IACxDF,MAAM,CAAC8D,GAAG,CAAC,oCAAoC,CAAC;IAChD,MAAMnI,EAAE,CAACuF,SAAS,CAAC2C,SAAS,EAAEF,aAAa,EAAE,OAAO,CAAC;EACvD;AACF,CAAC;AAACxC,OAAA,CAAAC,uBAAA,GAAAA,uBAAA;AASF;AACA;AACO,MAAM2C,YAAY,GAAG,MAAAA,CAAO;EAAEC,YAAY;EAAEC,UAAU;EAAEC;AAAuB,CAAC,KAA+B;EACpH,MAAM;IAAElE;EAAO,CAAC,GAAGpB,WAAW,CAAC,CAAC;;EAEhC;EACA,MAAMK,WAAW,GAAG,IAAI0B,GAAG,CAACqD,YAAY,EAAEzF,GAAG,CAAC;EAC9C,MAAMmC,SAAS,GAAG,IAAIC,GAAG,CAACtC,mBAAmB,CAAC4F,UAAU,CAAC,EAAE1F,GAAG,CAAC,CAAC,CAAC;EACjE,MAAM4F,OAAmB,GAAG,OAAOD,QAAQ,KAAK,WAAW,GAAG,IAAI,GAAG,IAAIvD,GAAG,CAACuD,QAAQ,EAAE3F,GAAG,CAAC;;EAE3F;EACA,IAAI;IACF,MAAM5C,EAAE,CAACyI,IAAI,CAACnF,WAAW,CAAC;EAC5B,CAAC,CAAC,OAAOM,KAAc,EAAE;IACvB,MAAM,IAAIR,KAAK,CAAC,0CAA0CiF,YAAY,GAAG,EAAE;MAAEvE,KAAK,EAAEF;IAAM,CAAC,CAAC;EAC9F;;EAEA;EACA,IAAI8E,cAAqB;EACzB,IAAI;IACFA,cAAc,GAAG,MAAM1I,EAAE,CAACyI,IAAI,CAAC1D,SAAS,CAAC;EAC3C,CAAC,CAAC,OAAOnB,KAAc,EAAE;IACvB,MAAM,IAAIR,KAAK,CAAC,yCAAyCkF,UAAU,GAAG,EAAE;MAAExE,KAAK,EAAEF;IAAM,CAAC,CAAC;EAC3F;EACA,IAAI,CAAC8E,cAAc,CAACC,WAAW,CAAC,CAAC,EAAE;IACjC,MAAM,IAAIvF,KAAK,CAAC,yBAAyBkF,UAAU,sBAAsB,CAAC;EAC5E;;EAEA;EACA,IAAIE,OAAO,KAAK,IAAI,EAAE;IACpB,IAAI;MACF,MAAMxI,EAAE,CAACyI,IAAI,CAACD,OAAO,CAAC;IACxB,CAAC,CAAC,OAAO5E,KAAc,EAAE;MACvB,MAAM,IAAIR,KAAK,CAAC,kDAAkDmF,QAAQ,GAAG,EAAE;QAAEzE,KAAK,EAAEF;MAAM,CAAC,CAAC;IAClG;EACF;;EAEA;EACA,MAAM8B,IAAmC,GAAG8C,OAAO,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC,OAAAI,SAAA,QAAAC,OAAA,CAAAnI,CAAA,IAAAA,CAAA,IAAAkI,SAAA,KAAAE,IAAA,CAAAC,CAAA,IAAAjJ,uBAAA,CAAAH,OAAA,CAAAoJ,CAAA,KAAApH,oBAAA,CAAa6G,OAAO,CAACQ,IAAI;IAAA;EAAA,GAAC,EAAEnI,OAAO;;EAE1G;EACA,MAAMyD,QAAQ,GAAG,MAAM,CAAC,YAAuC;IAC7D,IAAI;MACF,OAAO,MAAMjB,aAAa,CAACC,WAAW,CAAC;IACzC,CAAC,CAAC,OAAOM,KAAc,EAAE;MACvBS,MAAM,CAACT,KAAK,CAAC,sCAAsCyE,YAAY,GAAG,CAAC;MACnE,MAAMzE,KAAK;IACb;EACF,CAAC,EAAE,CAAC;;EAEJ;EACA,MAAMqF,KAA+B,GAAGvD,IAAI,KAAK,IAAI,IAAIwD,KAAK,CAACC,OAAO,CAACzD,IAAI,EAAEuD,KAAK,CAAC,GAAGvD,IAAI,CAACuD,KAAK,GAAG,IAAI;EACvG,MAAMG,eAAe,GAAGH,KAAK,KAAK,IAAI,GAClC3E,QAAQ,GACR,IAAA+E,sCAAkB,EAAmB/E,QAAQ,EAAE2E,KAAK,CAAC;EAEzD,OAAO;IAAE3E,QAAQ,EAAE8E,eAAe;IAAE7E,eAAe,EAAEQ,SAAS;IAAEW;EAAK,CAAC;AACxE,CAAC;AAACF,OAAA,CAAA4C,YAAA,GAAAA,YAAA;AAGF,MAAMkB,UAAU,GAAGA,CAAA,KAAM;EACvB,MAAM;IAAEjF;EAAO,CAAC,GAAGpB,WAAW,CAAC,CAAC;EAEhCoB,MAAM,CAACG,IAAI,CAAC,IAAAoD,gBAAM;AACpB;AACA;AACA;AACA;AACA;AACA,GAAG,CAAC;AACJ,CAAC;AAUM,MAAM2B,YAAY,GAAG,MAAOC,IAAgB,IAAoB;EACrE,MAAM;IAAEnF;EAAO,CAAC,GAAGpB,WAAW,CAAC,CAAC;EAEhC,MAAMoF,YAAgC,GAAGmB,IAAI,CAACC,WAAW,CAAC,CAAC,CAAC;EAC5D,MAAMnB,UAA8B,GAAGkB,IAAI,CAACC,WAAW,CAAC,CAAC,CAAC;EAC1D,IAAI,CAACpB,YAAY,IAAI,CAACC,UAAU,EAAE;IAChCgB,UAAU,CAAC,CAAC;IACZ;EACF;EAEA,MAAMI,YAA0B,GAAG;IACjCrB,YAAY;IACZC,UAAU;IACVC,QAAQ,EAAEiB,IAAI,CAACG,MAAM,CAACjE;EACxB,CAAC;EACD,MAAMtB,OAAwB,GAAG,MAAMgE,YAAY,CAACsB,YAAY,CAAC;EAEjE,IAAItF,OAAO,CAACsB,IAAI,KAAK,IAAI,EAAE;IACzB,MAAMvB,eAAe,CAACC,OAAO,CAAC;EAChC,CAAC,MAAM;IACL,MAAMqB,uBAAuB,CAACrB,OAAkC,CAAC;EACnE;EAEAC,MAAM,CAACG,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC;;AAED;AACA;AACA;AAAAgB,OAAA,CAAA+D,YAAA,GAAAA,YAAA;AACO,MAAMK,wBAAwB,GAAG,MAAOJ,IAAgB,IAAoB;EACjF,MAAM;IAAEnF;EAAO,CAAC,GAAGpB,WAAW,CAAC,CAAC;EAEhC,MAAMoF,YAAgC,GAAGmB,IAAI,CAACC,WAAW,CAAC,CAAC,CAAC;EAC5D,MAAMI,aAAiC,GAAGL,IAAI,CAACC,WAAW,CAAC,CAAC,CAAC;EAC7D,IAAI,CAACpB,YAAY,IAAI,CAACwB,aAAa,EAAE;IACnCP,UAAU,CAAC,CAAC;IACZ;EACF;EAEA,MAAMhG,WAAW,GAAG,IAAI0B,GAAG,CAACqD,YAAY,EAAEzF,GAAG,CAAC;EAC9C,MAAM0B,QAAQ,GAAG,MAAMjB,aAAa,CAACC,WAAW,CAAC;EACjD,MAAMwG,IAAI,GAAG,MAAM,IAAAC,6BAAc,EAACzF,QAAQ,EAAEuF,aAAa,CAAC;EAE1DxF,MAAM,CAAC8D,GAAG,CAAC2B,IAAI,CAAC;EAEhBzF,MAAM,CAACG,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC;;AAED;AAAAgB,OAAA,CAAAoE,wBAAA,GAAAA,wBAAA;AACO,MAAMI,GAAG,GAAG,MAAOC,OAAsB,IAAoB;EAClE;EACA,MAAMT,IAAI,GAAG,IAAAU,mBAAS,EAAC;IACrBV,IAAI,EAAES,OAAO;IACbE,gBAAgB,EAAE,IAAI;IACtBC,OAAO,EAAE;MACPC,IAAI,EAAE;QAAEC,IAAI,EAAE,SAAS;QAAEC,KAAK,EAAE;MAAI,CAAC;MACrCC,MAAM,EAAE;QAAEF,IAAI,EAAE;MAAU,CAAC;MAC3B5E,IAAI,EAAE;QAAE4E,IAAI,EAAE;MAAS,CAAC,CAAE;MAC1B;IACF;EACF,CAAC,CAAC;;EAEF;EACA,MAAMjG,MAAc,GAAG;IACrBG,IAAI,EAAEgF,IAAI,CAACG,MAAM,CAACa,MAAM,GAAG,MAAM,CAAC,CAAC,GAAGC,OAAO,CAACjG,IAAI;IAClDZ,KAAK,EAAE6G,OAAO,CAAC7G,KAAK;IACpBuE,GAAG,EAAEsC,OAAO,CAACtC;EACf,CAAC;EAED,MAAMpF,eAAe,CAACiH,GAAG,CAAC;IAAE3F;EAAO,CAAC,EAAE,YAAY;IAChD,MAAMqG,OAAsB,GAAGlB,IAAI,CAACC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI;IAC1D,IAAIiB,OAAO,KAAK,IAAI,IAAIlB,IAAI,CAACG,MAAM,CAACU,IAAI,EAAE;MACxCf,UAAU,CAAC,CAAC;MACZ;IACF;IAEA,MAAMqB,cAA0B,GAAG;MAAE,GAAGnB,IAAI;MAAEC,WAAW,EAAED,IAAI,CAACC,WAAW,CAAChH,KAAK,CAAC,CAAC;IAAE,CAAC;IACtF,QAAQiI,OAAO;MACb,KAAK,KAAK;QACR,MAAMnB,YAAY,CAACoB,cAAc,CAAC;QAClC;MACF,KAAK,yBAAyB;QAC5B,MAAMf,wBAAwB,CAACe,cAAc,CAAC;QAC9C;MACF;QACEtG,MAAM,CAACT,KAAK,CAAC,oBAAoB8G,OAAO,KAAK,CAAC;QAC9CpB,UAAU,CAAC,CAAC;QACZ;IACJ;EACF,CAAC,CAAC;AACJ,CAAC;;AAED;AAAA9D,OAAA,CAAAwE,GAAA,GAAAA,GAAA;AACA,MAAM,CAACY,QAAQ,EAAEC,SAAS,EAAE,GAAGrB,IAAI,CAAC,GAAG1G,OAAO,CAACgI,IAAI,CAAC,CAAC;AACrD,IAAID,SAAS,IAAI,OAAM7K,EAAE,CAAC+K,QAAQ,CAACF,SAAS,CAAC,MAAK,IAAA3F,sBAAa,EAAC8F,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC,EAAE;EAChF,IAAI;IACF,MAAMlB,GAAG,CAACR,IAAI,CAAC;IACf1G,OAAO,CAACqI,IAAI,CAAC,CAAC,CAAC;EACjB,CAAC,CAAC,OAAOvH,KAAc,EAAE;IACvB6G,OAAO,CAAC7G,KAAK,CAACA,KAAK,CAAC;IACpBd,OAAO,CAACqI,IAAI,CAAC,CAAC,CAAC;EACjB;AACF","ignoreList":[]}

@@ -19,3 +19,2 @@ /* Copyright (c) Fortanix, Inc.

export const schemaIdFromRef = ref => {
const matches = ref.match(/^#\/components\/schemas\/.+/);
if (!/^#\/components\/schemas\/.+/.test(ref)) {

@@ -22,0 +21,0 @@ throw new Error(`Reference format not supported: ${ref}`);

@@ -1,1 +0,1 @@

{"version":3,"file":"GraphAnalyzer.mjs","names":["decodeJsonPointer","encodeJsonPointer","schemaIdFromRef","ref","matches","match","test","Error","pointer","replace","refSchemaId","segments","slice","length","refFromSchemaId","schemaId","resolver","schemas","refSchema","depsShallow","schema","Set","$ref","type","items","allOf","flatMap","subschema","oneOf","anyOf","Array","isArray","schemaAnyOf","map","props","properties","additionalProps","additionalProperties","additionalPropsSchema","Object","values","propSchema","TypeError","JSON","stringify","depsDeep","resolve","visited","has","assign","dependencyTree","document","rootSchemaRef","components","rootSchemaId","rootSchema","dependenciesMapFromDocument","dependenciesMap","Map","entries","schemaRef","dependencies","set","dependentsMapFromDocument","dependentsMap","error","cause","dependency","get","topologicalSorter","refsWithCycles","sorted","visit","add","dependents","dependentSchemaRef","unshift","circularDependency","topologicalSort","adjacency","sorter","keys","InfiniteRecursionError","_isObjectSchema","every","Boolean","isObjectSchema"],"sources":["../../../src/analysis/GraphAnalyzer.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { type OpenAPIV3_1 as OpenApi } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema, decodeJsonPointer, encodeJsonPointer } from '../util/openapi.ts';\n\n\n//\n// Reference resolving\n//\n\ntype Ref = string; // OpenAPI schema reference\ntype Resolve = (ref: Ref) => OpenApiSchema; // Callback to take a ref and resolve it to the corresponding schema\n\nexport const schemaIdFromRef = (ref: Ref): OpenApiSchemaId => {\n const matches = ref.match(/^#\\/components\\/schemas\\/.+/);\n if (!/^#\\/components\\/schemas\\/.+/.test(ref)) {\n throw new Error(`Reference format not supported: ${ref}`);\n }\n \n const pointer = ref.replace(/^#/, '');\n const [refSchemaId, ...segments] = decodeJsonPointer(pointer).slice(2);\n if (typeof refSchemaId === 'undefined') { throw new Error('Should not happen'); }\n if (segments.length !== 0) { throw new Error(`Refs to nested paths not supported: ${ref}`); }\n \n return refSchemaId;\n};\nexport const refFromSchemaId = (schemaId: OpenApiSchemaId): Ref => {\n return '#' + encodeJsonPointer(['components', 'schemas', schemaId]);\n};\n\nconst resolver = (schemas: Record<OpenApiSchemaId, OpenApiSchema>) => (ref: string): OpenApiSchema => {\n const refSchemaId = schemaIdFromRef(ref);\n const refSchema = schemas[refSchemaId];\n if (typeof refSchema === 'undefined') { throw new Error('Should not happen'); }\n return refSchema;\n};\n\n// Get all direct (shallow) dependencies\nconst depsShallow = (schema: OpenApiSchema): Set<Ref> => {\n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n return new Set([schema.$ref]);\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n if ('items' in schema) {\n return depsShallow(schema.items);\n } else { // Array of unknown\n return new Set();\n }\n } else { // Case: OpenApi.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return new Set(schema.allOf.flatMap(subschema => [...depsShallow(subschema)]));\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return new Set(schema.oneOf.flatMap(subschema => [...depsShallow(subschema)]));\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return new Set(schema.anyOf.flatMap(subschema => [...depsShallow(subschema)]));\n }\n \n if (typeof schema.type === 'undefined') {\n return new Set(); // Any type\n } else if (Array.isArray(schema.type)) {\n const schemaAnyOf = { anyOf: schema.type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n return depsShallow(schemaAnyOf);\n }\n switch (schema.type) {\n case 'null':\n case 'string':\n case 'number':\n case 'integer':\n case 'boolean':\n return new Set();\n case 'object':\n const props: Record<OpenApiSchemaId, OpenApiSchema> = schema.properties ?? {};\n const additionalProps = schema.additionalProperties;\n const additionalPropsSchema: null | OpenApiSchema =\n typeof additionalProps === 'object' && additionalProps !== null\n ? additionalProps\n : null;\n return new Set([\n ...Object.values(props).flatMap(propSchema => [...depsShallow(propSchema)]),\n ...(additionalPropsSchema ? depsShallow(additionalPropsSchema) : []),\n ]);\n default: throw new TypeError(`Unsupported type ${JSON.stringify(schema.type)}`);\n }\n }\n }\n};\n\n// Get all dependencies for the given schema (as a dependency tree rooted at `schema`)\nconst depsDeep = (schema: OpenApiSchema, resolve: Resolve, visited: Set<Ref>): DepTree => {\n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n if (visited.has(schema.$ref)) { return { [schema.$ref]: 'recurse' }; }\n return { [schema.$ref]: depsDeep(resolve(schema.$ref), resolve, new Set([...visited, schema.$ref])) };\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n if ('items' in schema) {\n return depsDeep(schema.items, resolve, visited);\n } else { // Array of unknown\n return {};\n }\n } else { // Case: OpenApi.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return Object.assign({}, ...schema.allOf.flatMap(subschema => depsDeep(subschema, resolve, visited)));\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return Object.assign({}, ...schema.oneOf.flatMap(subschema => depsDeep(subschema, resolve, visited)));\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return Object.assign({}, ...schema.anyOf.flatMap(subschema => depsDeep(subschema, resolve, visited)));\n }\n \n if (typeof schema.type === 'undefined') {\n return {}; // Any type\n } else if (Array.isArray(schema.type)) {\n const schemaAnyOf = { anyOf: schema.type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n return depsDeep(schemaAnyOf, resolve, visited);\n }\n switch (schema.type) {\n case 'null':\n case 'string':\n case 'number':\n case 'integer':\n case 'boolean':\n return {};\n case 'object':\n const props: Record<OpenApiSchemaId, OpenApiSchema> = schema.properties ?? {};\n const additionalProps = schema.additionalProperties;\n const additionalPropsSchema: null | OpenApiSchema =\n typeof additionalProps === 'object' && additionalProps !== null\n ? additionalProps\n : null;\n return Object.assign(\n {},\n ...Object.values(props).flatMap(propSchema => depsDeep(propSchema, resolve, visited)),\n additionalPropsSchema ? depsDeep(additionalPropsSchema, resolve, visited) : {},\n );\n default: throw new TypeError(`Unsupported type \"${schema.type}\"`);\n }\n }\n }\n};\n\n\n//\n// Dependency trees\n//\n\ntype DepTree = { [ref: Ref]: DepTree | 'recurse' };\n\n// Create a dependency tree rooted at `rootRef`. If we find a cycle, inject a special \"recurse\" marker.\nexport const dependencyTree = (document: OpenApi.Document, rootSchemaRef: Ref): DepTree => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n const rootSchemaId = schemaIdFromRef(rootSchemaRef);\n \n const rootSchema: undefined | OpenApiSchema = schemas[rootSchemaId];\n if (!rootSchema) { throw new Error(`Unable to find schema \"${rootSchemaRef}\"`); }\n \n return { [rootSchemaRef]: depsDeep(rootSchema, resolver(schemas), new Set([rootSchemaRef])) };\n};\n\n\n//\n// Adjacency maps\n//\n\ntype AdjacencyMap = Map<Ref, Set<Ref>>;\n\n// Get a mapping from schemas to all of their direct dependencies\nexport const dependenciesMapFromDocument = (document: OpenApi.Document): AdjacencyMap => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n // Mapping from a particular schema to its dependencies (directed neighbors in the graph: schema -> dependency)\n const dependenciesMap: AdjacencyMap = new Map<Ref, Set<Ref>>();\n \n for (const [schemaId, schema] of Object.entries(schemas)) {\n const schemaRef = refFromSchemaId(schemaId);\n const dependencies: Set<Ref> = depsShallow(schema);\n \n dependenciesMap.set(schemaRef, dependencies);\n }\n \n return dependenciesMap;\n};\n\n// Get a mapping from schemas to all of their direct dependents\nexport const dependentsMapFromDocument = (document: OpenApi.Document): AdjacencyMap => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n // Mapping from a particular schema to its dependents (directed neighbors in the graph: schema <- dependent)\n const dependentsMap: AdjacencyMap = new Map<Ref, Set<Ref>>();\n \n for (const [schemaId, schema] of Object.entries(schemas)) {\n const schemaRef = refFromSchemaId(schemaId);\n const dependencies = ((): Set<Ref> => {\n try {\n return depsShallow(schema);\n } catch (error: unknown) {\n throw new Error(`Unable to determine dependents for '${schemaRef}'`, { cause: error });\n }\n })();\n \n for (const dependency of dependencies) {\n dependentsMap.set(dependency, new Set([\n ...(dependentsMap.get(dependency) ?? new Set()),\n schemaRef,\n ]));\n }\n }\n \n return dependentsMap;\n};\n\n\n//\n// Topological sort\n//\n\ntype TopologicalSort = Array<{\n ref: Ref,\n circularDependency: boolean, // If true, then this has at least one dependency that breaks the topological ordering\n}>;\nconst topologicalSorter = (dependentsMap: AdjacencyMap) => {\n const visited = new Set<Ref>(); // Keep track of schemas we've already visited\n const refsWithCycles = new Set<Ref>(); // Keep track of schemas that have at least one circular dependency\n const sorted: TopologicalSort = [];\n \n const visit = (schemaRef: Ref): void => {\n if (visited.has(schemaRef)) {\n refsWithCycles.add(schemaRef);\n return;\n }\n \n visited.add(schemaRef);\n \n const dependents = dependentsMap.get(schemaRef) ?? new Set();\n for (const dependentSchemaRef of dependents) {\n visit(dependentSchemaRef);\n }\n \n sorted.unshift({ ref: schemaRef, circularDependency: refsWithCycles.has(schemaRef) });\n };\n \n return { visit, sorted };\n};\n\nexport const topologicalSort = (document: OpenApi.Document): TopologicalSort => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n const adjacency = dependentsMapFromDocument(document);\n const sorter = topologicalSorter(adjacency);\n \n for (const schemaId of Object.keys(schemas)) {\n const schemaRef = refFromSchemaId(schemaId);\n sorter.visit(schemaRef);\n }\n \n return sorter.sorted;\n};\n\n\n// Util: check if a given schema is an object schema\nexport class InfiniteRecursionError extends Error {}\nconst _isObjectSchema = (schema: OpenApiSchema, resolve: Resolve, visited: Set<Ref>): boolean => {\n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n if (visited.has(schema.$ref)) {\n throw new InfiniteRecursionError(`Infinite recursion at ${schema.$ref}`);\n }\n return _isObjectSchema(resolve(schema.$ref), resolve, new Set([...visited, schema.$ref]));\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n return false;\n } else { // Case: OpenApi.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return schema.allOf.flatMap(subschema => _isObjectSchema(subschema, resolve, visited)).every(Boolean);\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return false; // Union\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return false; // Union\n }\n \n if (typeof schema.type === 'undefined') {\n return false; // Any type\n } else if (Array.isArray(schema.type)) {\n const schemaAnyOf = { anyOf: schema.type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n return _isObjectSchema(schemaAnyOf, resolve, visited);\n }\n switch (schema.type) {\n case 'null':\n case 'string':\n case 'number':\n case 'integer':\n case 'boolean':\n return false;\n case 'object':\n return true;\n default: throw new TypeError(`Unsupported type \"${schema.type}\"`);\n }\n }\n }\n};\nexport const isObjectSchema = (schemas: Record<OpenApiSchemaId, OpenApiSchema>, rootSchemaRef: Ref): boolean => {\n const rootSchemaId = schemaIdFromRef(rootSchemaRef);\n \n const rootSchema: undefined | OpenApiSchema = schemas[rootSchemaId];\n if (!rootSchema) { throw new Error(`Unable to find schema \"${rootSchemaRef}\"`); }\n \n return _isObjectSchema(rootSchema, resolver(schemas), new Set([rootSchemaRef]));\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAAmDA,iBAAiB,EAAEC,iBAAiB,QAAQ,qBAAoB;;AAGnH;AACA;AACA;;AAEmB;;AACyB;;AAE5C,OAAO,MAAMC,eAAe,GAAIC,GAAQ,IAAsB;EAC5D,MAAMC,OAAO,GAAGD,GAAG,CAACE,KAAK,CAAC,6BAA6B,CAAC;EACxD,IAAI,CAAC,6BAA6B,CAACC,IAAI,CAACH,GAAG,CAAC,EAAE;IAC5C,MAAM,IAAII,KAAK,CAAC,mCAAmCJ,GAAG,EAAE,CAAC;EAC3D;EAEA,MAAMK,OAAO,GAAGL,GAAG,CAACM,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;EACrC,MAAM,CAACC,WAAW,EAAE,GAAGC,QAAQ,CAAC,GAAGX,iBAAiB,CAACQ,OAAO,CAAC,CAACI,KAAK,CAAC,CAAC,CAAC;EACtE,IAAI,OAAOF,WAAW,KAAK,WAAW,EAAE;IAAE,MAAM,IAAIH,KAAK,CAAC,mBAAmB,CAAC;EAAE;EAChF,IAAII,QAAQ,CAACE,MAAM,KAAK,CAAC,EAAE;IAAE,MAAM,IAAIN,KAAK,CAAC,uCAAuCJ,GAAG,EAAE,CAAC;EAAE;EAE5F,OAAOO,WAAW;AACpB,CAAC;AACD,OAAO,MAAMI,eAAe,GAAIC,QAAyB,IAAU;EACjE,OAAO,GAAG,GAAGd,iBAAiB,CAAC,CAAC,YAAY,EAAE,SAAS,EAAEc,QAAQ,CAAC,CAAC;AACrE,CAAC;AAED,MAAMC,QAAQ,GAAIC,OAA+C,IAAMd,GAAW,IAAoB;EACpG,MAAMO,WAAW,GAAGR,eAAe,CAACC,GAAG,CAAC;EACxC,MAAMe,SAAS,GAAGD,OAAO,CAACP,WAAW,CAAC;EACtC,IAAI,OAAOQ,SAAS,KAAK,WAAW,EAAE;IAAE,MAAM,IAAIX,KAAK,CAAC,mBAAmB,CAAC;EAAE;EAC9E,OAAOW,SAAS;AAClB,CAAC;;AAED;AACA,MAAMC,WAAW,GAAIC,MAAqB,IAAe;EACvD,IAAI,MAAM,IAAIA,MAAM,EAAE;IAAE;IACtB,OAAO,IAAIC,GAAG,CAAC,CAACD,MAAM,CAACE,IAAI,CAAC,CAAC;EAC/B,CAAC,MAAM;IAAE;IACP,IAAIF,MAAM,CAACG,IAAI,KAAK,OAAO,IAAI,OAAO,IAAIH,MAAM,EAAE;MAAE;MAClD,IAAI,OAAO,IAAIA,MAAM,EAAE;QACrB,OAAOD,WAAW,CAACC,MAAM,CAACI,KAAK,CAAC;MAClC,CAAC,MAAM;QAAE;QACP,OAAO,IAAIH,GAAG,CAAC,CAAC;MAClB;IACF,CAAC,MAAM;MAAE;MACP,IAAI,OAAO,IAAID,MAAM,IAAI,OAAOA,MAAM,CAACK,KAAK,KAAK,WAAW,EAAE;QAC5D,OAAO,IAAIJ,GAAG,CAACD,MAAM,CAACK,KAAK,CAACC,OAAO,CAACC,SAAS,IAAI,CAAC,GAAGR,WAAW,CAACQ,SAAS,CAAC,CAAC,CAAC,CAAC;MAChF,CAAC,MAAM,IAAI,OAAO,IAAIP,MAAM,IAAI,OAAOA,MAAM,CAACQ,KAAK,KAAK,WAAW,EAAE;QACnE,OAAO,IAAIP,GAAG,CAACD,MAAM,CAACQ,KAAK,CAACF,OAAO,CAACC,SAAS,IAAI,CAAC,GAAGR,WAAW,CAACQ,SAAS,CAAC,CAAC,CAAC,CAAC;MAChF,CAAC,MAAM,IAAI,OAAO,IAAIP,MAAM,IAAI,OAAOA,MAAM,CAACS,KAAK,KAAK,WAAW,EAAE;QACnE,OAAO,IAAIR,GAAG,CAACD,MAAM,CAACS,KAAK,CAACH,OAAO,CAACC,SAAS,IAAI,CAAC,GAAGR,WAAW,CAACQ,SAAS,CAAC,CAAC,CAAC,CAAC;MAChF;MAEA,IAAI,OAAOP,MAAM,CAACG,IAAI,KAAK,WAAW,EAAE;QACtC,OAAO,IAAIF,GAAG,CAAC,CAAC,CAAC,CAAC;MACpB,CAAC,MAAM,IAAIS,KAAK,CAACC,OAAO,CAACX,MAAM,CAACG,IAAI,CAAC,EAAE;QACrC,MAAMS,WAAW,GAAG;UAAEH,KAAK,EAAET,MAAM,CAACG,IAAI,CAACU,GAAG,CAACV,IAAI,KAAK;YAAE,GAAGH,MAAM;YAAEG;UAAK,CAAC,CAAC;QAAE,CAAkB;QAC9F,OAAOJ,WAAW,CAACa,WAAW,CAAC;MACjC;MACA,QAAQZ,MAAM,CAACG,IAAI;QACjB,KAAK,MAAM;QACX,KAAK,QAAQ;QACb,KAAK,QAAQ;QACb,KAAK,SAAS;QACd,KAAK,SAAS;UACZ,OAAO,IAAIF,GAAG,CAAC,CAAC;QAClB,KAAK,QAAQ;UACX,MAAMa,KAA6C,GAAGd,MAAM,CAACe,UAAU,IAAI,CAAC,CAAC;UAC7E,MAAMC,eAAe,GAAGhB,MAAM,CAACiB,oBAAoB;UACnD,MAAMC,qBAA2C,GAC/C,OAAOF,eAAe,KAAK,QAAQ,IAAIA,eAAe,KAAK,IAAI,GAC3DA,eAAe,GACf,IAAI;UACV,OAAO,IAAIf,GAAG,CAAC,CACb,GAAGkB,MAAM,CAACC,MAAM,CAACN,KAAK,CAAC,CAACR,OAAO,CAACe,UAAU,IAAI,CAAC,GAAGtB,WAAW,CAACsB,UAAU,CAAC,CAAC,CAAC,EAC3E,IAAIH,qBAAqB,GAAGnB,WAAW,CAACmB,qBAAqB,CAAC,GAAG,EAAE,CAAC,CACrE,CAAC;QACJ;UAAS,MAAM,IAAII,SAAS,CAAC,oBAAoBC,IAAI,CAACC,SAAS,CAACxB,MAAM,CAACG,IAAI,CAAC,EAAE,CAAC;MACjF;IACF;EACF;AACF,CAAC;;AAED;AACA,MAAMsB,QAAQ,GAAGA,CAACzB,MAAqB,EAAE0B,OAAgB,EAAEC,OAAiB,KAAc;EACxF,IAAI,MAAM,IAAI3B,MAAM,EAAE;IAAE;IACtB,IAAI2B,OAAO,CAACC,GAAG,CAAC5B,MAAM,CAACE,IAAI,CAAC,EAAE;MAAE,OAAO;QAAE,CAACF,MAAM,CAACE,IAAI,GAAG;MAAU,CAAC;IAAE;IACrE,OAAO;MAAE,CAACF,MAAM,CAACE,IAAI,GAAGuB,QAAQ,CAACC,OAAO,CAAC1B,MAAM,CAACE,IAAI,CAAC,EAAEwB,OAAO,EAAE,IAAIzB,GAAG,CAAC,CAAC,GAAG0B,OAAO,EAAE3B,MAAM,CAACE,IAAI,CAAC,CAAC;IAAE,CAAC;EACvG,CAAC,MAAM;IAAE;IACP,IAAIF,MAAM,CAACG,IAAI,KAAK,OAAO,IAAI,OAAO,IAAIH,MAAM,EAAE;MAAE;MAClD,IAAI,OAAO,IAAIA,MAAM,EAAE;QACrB,OAAOyB,QAAQ,CAACzB,MAAM,CAACI,KAAK,EAAEsB,OAAO,EAAEC,OAAO,CAAC;MACjD,CAAC,MAAM;QAAE;QACP,OAAO,CAAC,CAAC;MACX;IACF,CAAC,MAAM;MAAE;MACP,IAAI,OAAO,IAAI3B,MAAM,IAAI,OAAOA,MAAM,CAACK,KAAK,KAAK,WAAW,EAAE;QAC5D,OAAOc,MAAM,CAACU,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG7B,MAAM,CAACK,KAAK,CAACC,OAAO,CAACC,SAAS,IAAIkB,QAAQ,CAAClB,SAAS,EAAEmB,OAAO,EAAEC,OAAO,CAAC,CAAC,CAAC;MACvG,CAAC,MAAM,IAAI,OAAO,IAAI3B,MAAM,IAAI,OAAOA,MAAM,CAACQ,KAAK,KAAK,WAAW,EAAE;QACnE,OAAOW,MAAM,CAACU,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG7B,MAAM,CAACQ,KAAK,CAACF,OAAO,CAACC,SAAS,IAAIkB,QAAQ,CAAClB,SAAS,EAAEmB,OAAO,EAAEC,OAAO,CAAC,CAAC,CAAC;MACvG,CAAC,MAAM,IAAI,OAAO,IAAI3B,MAAM,IAAI,OAAOA,MAAM,CAACS,KAAK,KAAK,WAAW,EAAE;QACnE,OAAOU,MAAM,CAACU,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG7B,MAAM,CAACS,KAAK,CAACH,OAAO,CAACC,SAAS,IAAIkB,QAAQ,CAAClB,SAAS,EAAEmB,OAAO,EAAEC,OAAO,CAAC,CAAC,CAAC;MACvG;MAEA,IAAI,OAAO3B,MAAM,CAACG,IAAI,KAAK,WAAW,EAAE;QACtC,OAAO,CAAC,CAAC,CAAC,CAAC;MACb,CAAC,MAAM,IAAIO,KAAK,CAACC,OAAO,CAACX,MAAM,CAACG,IAAI,CAAC,EAAE;QACrC,MAAMS,WAAW,GAAG;UAAEH,KAAK,EAAET,MAAM,CAACG,IAAI,CAACU,GAAG,CAACV,IAAI,KAAK;YAAE,GAAGH,MAAM;YAAEG;UAAK,CAAC,CAAC;QAAE,CAAkB;QAC9F,OAAOsB,QAAQ,CAACb,WAAW,EAAEc,OAAO,EAAEC,OAAO,CAAC;MAChD;MACA,QAAQ3B,MAAM,CAACG,IAAI;QACjB,KAAK,MAAM;QACX,KAAK,QAAQ;QACb,KAAK,QAAQ;QACb,KAAK,SAAS;QACd,KAAK,SAAS;UACZ,OAAO,CAAC,CAAC;QACX,KAAK,QAAQ;UACX,MAAMW,KAA6C,GAAGd,MAAM,CAACe,UAAU,IAAI,CAAC,CAAC;UAC7E,MAAMC,eAAe,GAAGhB,MAAM,CAACiB,oBAAoB;UACnD,MAAMC,qBAA2C,GAC/C,OAAOF,eAAe,KAAK,QAAQ,IAAIA,eAAe,KAAK,IAAI,GAC3DA,eAAe,GACf,IAAI;UACV,OAAOG,MAAM,CAACU,MAAM,CAClB,CAAC,CAAC,EACF,GAAGV,MAAM,CAACC,MAAM,CAACN,KAAK,CAAC,CAACR,OAAO,CAACe,UAAU,IAAII,QAAQ,CAACJ,UAAU,EAAEK,OAAO,EAAEC,OAAO,CAAC,CAAC,EACrFT,qBAAqB,GAAGO,QAAQ,CAACP,qBAAqB,EAAEQ,OAAO,EAAEC,OAAO,CAAC,GAAG,CAAC,CAC/E,CAAC;QACH;UAAS,MAAM,IAAIL,SAAS,CAAC,qBAAqBtB,MAAM,CAACG,IAAI,GAAG,CAAC;MACnE;IACF;EACF;AACF,CAAC;;AAGD;AACA;AACA;;AAIA;AACA,OAAO,MAAM2B,cAAc,GAAGA,CAACC,QAA0B,EAAEC,aAAkB,KAAc;EACzF,MAAMnC,OAA+C,GAAGkC,QAAQ,CAACE,UAAU,EAAEpC,OAAO,IAAI,CAAC,CAAC;EAC1F,MAAMqC,YAAY,GAAGpD,eAAe,CAACkD,aAAa,CAAC;EAEnD,MAAMG,UAAqC,GAAGtC,OAAO,CAACqC,YAAY,CAAC;EACnE,IAAI,CAACC,UAAU,EAAE;IAAE,MAAM,IAAIhD,KAAK,CAAC,0BAA0B6C,aAAa,GAAG,CAAC;EAAE;EAEhF,OAAO;IAAE,CAACA,aAAa,GAAGP,QAAQ,CAACU,UAAU,EAAEvC,QAAQ,CAACC,OAAO,CAAC,EAAE,IAAII,GAAG,CAAC,CAAC+B,aAAa,CAAC,CAAC;EAAE,CAAC;AAC/F,CAAC;;AAGD;AACA;AACA;;AAIA;AACA,OAAO,MAAMI,2BAA2B,GAAIL,QAA0B,IAAmB;EACvF,MAAMlC,OAA+C,GAAGkC,QAAQ,CAACE,UAAU,EAAEpC,OAAO,IAAI,CAAC,CAAC;;EAE1F;EACA,MAAMwC,eAA6B,GAAG,IAAIC,GAAG,CAAgB,CAAC;EAE9D,KAAK,MAAM,CAAC3C,QAAQ,EAAEK,MAAM,CAAC,IAAImB,MAAM,CAACoB,OAAO,CAAC1C,OAAO,CAAC,EAAE;IACxD,MAAM2C,SAAS,GAAG9C,eAAe,CAACC,QAAQ,CAAC;IAC3C,MAAM8C,YAAsB,GAAG1C,WAAW,CAACC,MAAM,CAAC;IAElDqC,eAAe,CAACK,GAAG,CAACF,SAAS,EAAEC,YAAY,CAAC;EAC9C;EAEA,OAAOJ,eAAe;AACxB,CAAC;;AAED;AACA,OAAO,MAAMM,yBAAyB,GAAIZ,QAA0B,IAAmB;EACrF,MAAMlC,OAA+C,GAAGkC,QAAQ,CAACE,UAAU,EAAEpC,OAAO,IAAI,CAAC,CAAC;;EAE1F;EACA,MAAM+C,aAA2B,GAAG,IAAIN,GAAG,CAAgB,CAAC;EAE5D,KAAK,MAAM,CAAC3C,QAAQ,EAAEK,MAAM,CAAC,IAAImB,MAAM,CAACoB,OAAO,CAAC1C,OAAO,CAAC,EAAE;IACxD,MAAM2C,SAAS,GAAG9C,eAAe,CAACC,QAAQ,CAAC;IAC3C,MAAM8C,YAAY,GAAG,CAAC,MAAgB;MACpC,IAAI;QACF,OAAO1C,WAAW,CAACC,MAAM,CAAC;MAC5B,CAAC,CAAC,OAAO6C,KAAc,EAAE;QACvB,MAAM,IAAI1D,KAAK,CAAC,uCAAuCqD,SAAS,GAAG,EAAE;UAAEM,KAAK,EAAED;QAAM,CAAC,CAAC;MACxF;IACF,CAAC,EAAE,CAAC;IAEJ,KAAK,MAAME,UAAU,IAAIN,YAAY,EAAE;MACrCG,aAAa,CAACF,GAAG,CAACK,UAAU,EAAE,IAAI9C,GAAG,CAAC,CACpC,IAAI2C,aAAa,CAACI,GAAG,CAACD,UAAU,CAAC,IAAI,IAAI9C,GAAG,CAAC,CAAC,CAAC,EAC/CuC,SAAS,CACV,CAAC,CAAC;IACL;EACF;EAEA,OAAOI,aAAa;AACtB,CAAC;;AAGD;AACA;AACA;;AAMA,MAAMK,iBAAiB,GAAIL,aAA2B,IAAK;EACzD,MAAMjB,OAAO,GAAG,IAAI1B,GAAG,CAAM,CAAC,CAAC,CAAC;EAChC,MAAMiD,cAAc,GAAG,IAAIjD,GAAG,CAAM,CAAC,CAAC,CAAC;EACvC,MAAMkD,MAAuB,GAAG,EAAE;EAElC,MAAMC,KAAK,GAAIZ,SAAc,IAAW;IACtC,IAAIb,OAAO,CAACC,GAAG,CAACY,SAAS,CAAC,EAAE;MAC1BU,cAAc,CAACG,GAAG,CAACb,SAAS,CAAC;MAC7B;IACF;IAEAb,OAAO,CAAC0B,GAAG,CAACb,SAAS,CAAC;IAEtB,MAAMc,UAAU,GAAGV,aAAa,CAACI,GAAG,CAACR,SAAS,CAAC,IAAI,IAAIvC,GAAG,CAAC,CAAC;IAC5D,KAAK,MAAMsD,kBAAkB,IAAID,UAAU,EAAE;MAC3CF,KAAK,CAACG,kBAAkB,CAAC;IAC3B;IAEAJ,MAAM,CAACK,OAAO,CAAC;MAAEzE,GAAG,EAAEyD,SAAS;MAAEiB,kBAAkB,EAAEP,cAAc,CAACtB,GAAG,CAACY,SAAS;IAAE,CAAC,CAAC;EACvF,CAAC;EAED,OAAO;IAAEY,KAAK;IAAED;EAAO,CAAC;AAC1B,CAAC;AAED,OAAO,MAAMO,eAAe,GAAI3B,QAA0B,IAAsB;EAC9E,MAAMlC,OAA+C,GAAGkC,QAAQ,CAACE,UAAU,EAAEpC,OAAO,IAAI,CAAC,CAAC;EAE1F,MAAM8D,SAAS,GAAGhB,yBAAyB,CAACZ,QAAQ,CAAC;EACrD,MAAM6B,MAAM,GAAGX,iBAAiB,CAACU,SAAS,CAAC;EAE3C,KAAK,MAAMhE,QAAQ,IAAIwB,MAAM,CAAC0C,IAAI,CAAChE,OAAO,CAAC,EAAE;IAC3C,MAAM2C,SAAS,GAAG9C,eAAe,CAACC,QAAQ,CAAC;IAC3CiE,MAAM,CAACR,KAAK,CAACZ,SAAS,CAAC;EACzB;EAEA,OAAOoB,MAAM,CAACT,MAAM;AACtB,CAAC;;AAGD;AACA,OAAO,MAAMW,sBAAsB,SAAS3E,KAAK,CAAC;AAClD,MAAM4E,eAAe,GAAGA,CAAC/D,MAAqB,EAAE0B,OAAgB,EAAEC,OAAiB,KAAc;EAC/F,IAAI,MAAM,IAAI3B,MAAM,EAAE;IAAE;IACtB,IAAI2B,OAAO,CAACC,GAAG,CAAC5B,MAAM,CAACE,IAAI,CAAC,EAAE;MAC5B,MAAM,IAAI4D,sBAAsB,CAAC,yBAAyB9D,MAAM,CAACE,IAAI,EAAE,CAAC;IAC1E;IACA,OAAO6D,eAAe,CAACrC,OAAO,CAAC1B,MAAM,CAACE,IAAI,CAAC,EAAEwB,OAAO,EAAE,IAAIzB,GAAG,CAAC,CAAC,GAAG0B,OAAO,EAAE3B,MAAM,CAACE,IAAI,CAAC,CAAC,CAAC;EAC3F,CAAC,MAAM;IAAE;IACP,IAAIF,MAAM,CAACG,IAAI,KAAK,OAAO,IAAI,OAAO,IAAIH,MAAM,EAAE;MAAE;MAClD,OAAO,KAAK;IACd,CAAC,MAAM;MAAE;MACP,IAAI,OAAO,IAAIA,MAAM,IAAI,OAAOA,MAAM,CAACK,KAAK,KAAK,WAAW,EAAE;QAC5D,OAAOL,MAAM,CAACK,KAAK,CAACC,OAAO,CAACC,SAAS,IAAIwD,eAAe,CAACxD,SAAS,EAAEmB,OAAO,EAAEC,OAAO,CAAC,CAAC,CAACqC,KAAK,CAACC,OAAO,CAAC;MACvG,CAAC,MAAM,IAAI,OAAO,IAAIjE,MAAM,IAAI,OAAOA,MAAM,CAACQ,KAAK,KAAK,WAAW,EAAE;QACnE,OAAO,KAAK,CAAC,CAAC;MAChB,CAAC,MAAM,IAAI,OAAO,IAAIR,MAAM,IAAI,OAAOA,MAAM,CAACS,KAAK,KAAK,WAAW,EAAE;QACnE,OAAO,KAAK,CAAC,CAAC;MAChB;MAEA,IAAI,OAAOT,MAAM,CAACG,IAAI,KAAK,WAAW,EAAE;QACtC,OAAO,KAAK,CAAC,CAAC;MAChB,CAAC,MAAM,IAAIO,KAAK,CAACC,OAAO,CAACX,MAAM,CAACG,IAAI,CAAC,EAAE;QACrC,MAAMS,WAAW,GAAG;UAAEH,KAAK,EAAET,MAAM,CAACG,IAAI,CAACU,GAAG,CAACV,IAAI,KAAK;YAAE,GAAGH,MAAM;YAAEG;UAAK,CAAC,CAAC;QAAE,CAAkB;QAC9F,OAAO4D,eAAe,CAACnD,WAAW,EAAEc,OAAO,EAAEC,OAAO,CAAC;MACvD;MACA,QAAQ3B,MAAM,CAACG,IAAI;QACjB,KAAK,MAAM;QACX,KAAK,QAAQ;QACb,KAAK,QAAQ;QACb,KAAK,SAAS;QACd,KAAK,SAAS;UACZ,OAAO,KAAK;QACd,KAAK,QAAQ;UACX,OAAO,IAAI;QACb;UAAS,MAAM,IAAImB,SAAS,CAAC,qBAAqBtB,MAAM,CAACG,IAAI,GAAG,CAAC;MACnE;IACF;EACF;AACF,CAAC;AACD,OAAO,MAAM+D,cAAc,GAAGA,CAACrE,OAA+C,EAAEmC,aAAkB,KAAc;EAC9G,MAAME,YAAY,GAAGpD,eAAe,CAACkD,aAAa,CAAC;EAEnD,MAAMG,UAAqC,GAAGtC,OAAO,CAACqC,YAAY,CAAC;EACnE,IAAI,CAACC,UAAU,EAAE;IAAE,MAAM,IAAIhD,KAAK,CAAC,0BAA0B6C,aAAa,GAAG,CAAC;EAAE;EAEhF,OAAO+B,eAAe,CAAC5B,UAAU,EAAEvC,QAAQ,CAACC,OAAO,CAAC,EAAE,IAAII,GAAG,CAAC,CAAC+B,aAAa,CAAC,CAAC,CAAC;AACjF,CAAC","ignoreList":[]}
{"version":3,"file":"GraphAnalyzer.mjs","names":["decodeJsonPointer","encodeJsonPointer","schemaIdFromRef","ref","test","Error","pointer","replace","refSchemaId","segments","slice","length","refFromSchemaId","schemaId","resolver","schemas","refSchema","depsShallow","schema","Set","$ref","type","items","allOf","flatMap","subschema","oneOf","anyOf","Array","isArray","schemaAnyOf","map","props","properties","additionalProps","additionalProperties","additionalPropsSchema","Object","values","propSchema","TypeError","JSON","stringify","depsDeep","resolve","visited","has","assign","dependencyTree","document","rootSchemaRef","components","rootSchemaId","rootSchema","dependenciesMapFromDocument","dependenciesMap","Map","entries","schemaRef","dependencies","set","dependentsMapFromDocument","dependentsMap","error","cause","dependency","get","topologicalSorter","refsWithCycles","sorted","visit","add","dependents","dependentSchemaRef","unshift","circularDependency","topologicalSort","adjacency","sorter","keys","InfiniteRecursionError","_isObjectSchema","every","Boolean","isObjectSchema"],"sources":["../../../src/analysis/GraphAnalyzer.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { type OpenAPIV3_1 as OpenApi } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema, decodeJsonPointer, encodeJsonPointer } from '../util/openapi.ts';\n\n\n//\n// Reference resolving\n//\n\ntype Ref = string; // OpenAPI schema reference\ntype Resolve = (ref: Ref) => OpenApiSchema; // Callback to take a ref and resolve it to the corresponding schema\n\nexport const schemaIdFromRef = (ref: Ref): OpenApiSchemaId => {\n if (!/^#\\/components\\/schemas\\/.+/.test(ref)) {\n throw new Error(`Reference format not supported: ${ref}`);\n }\n \n const pointer = ref.replace(/^#/, '');\n const [refSchemaId, ...segments] = decodeJsonPointer(pointer).slice(2);\n if (typeof refSchemaId === 'undefined') { throw new Error('Should not happen'); }\n if (segments.length !== 0) { throw new Error(`Refs to nested paths not supported: ${ref}`); }\n \n return refSchemaId;\n};\nexport const refFromSchemaId = (schemaId: OpenApiSchemaId): Ref => {\n return '#' + encodeJsonPointer(['components', 'schemas', schemaId]);\n};\n\nconst resolver = (schemas: Record<OpenApiSchemaId, OpenApiSchema>) => (ref: string): OpenApiSchema => {\n const refSchemaId = schemaIdFromRef(ref);\n const refSchema = schemas[refSchemaId];\n if (typeof refSchema === 'undefined') { throw new Error('Should not happen'); }\n return refSchema;\n};\n\n// Get all direct (shallow) dependencies\nconst depsShallow = (schema: OpenApiSchema): Set<Ref> => {\n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n return new Set([schema.$ref]);\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n if ('items' in schema) {\n return depsShallow(schema.items);\n } else { // Array of unknown\n return new Set();\n }\n } else { // Case: OpenApi.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return new Set(schema.allOf.flatMap(subschema => [...depsShallow(subschema)]));\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return new Set(schema.oneOf.flatMap(subschema => [...depsShallow(subschema)]));\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return new Set(schema.anyOf.flatMap(subschema => [...depsShallow(subschema)]));\n }\n \n if (typeof schema.type === 'undefined') {\n return new Set(); // Any type\n } else if (Array.isArray(schema.type)) {\n const schemaAnyOf = { anyOf: schema.type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n return depsShallow(schemaAnyOf);\n }\n switch (schema.type) {\n case 'null':\n case 'string':\n case 'number':\n case 'integer':\n case 'boolean':\n return new Set();\n case 'object':\n const props: Record<OpenApiSchemaId, OpenApiSchema> = schema.properties ?? {};\n const additionalProps = schema.additionalProperties;\n const additionalPropsSchema: null | OpenApiSchema =\n typeof additionalProps === 'object' && additionalProps !== null\n ? additionalProps\n : null;\n return new Set([\n ...Object.values(props).flatMap(propSchema => [...depsShallow(propSchema)]),\n ...(additionalPropsSchema ? depsShallow(additionalPropsSchema) : []),\n ]);\n default: throw new TypeError(`Unsupported type ${JSON.stringify(schema.type)}`);\n }\n }\n }\n};\n\n// Get all dependencies for the given schema (as a dependency tree rooted at `schema`)\nconst depsDeep = (schema: OpenApiSchema, resolve: Resolve, visited: Set<Ref>): DepTree => {\n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n if (visited.has(schema.$ref)) { return { [schema.$ref]: 'recurse' }; }\n return { [schema.$ref]: depsDeep(resolve(schema.$ref), resolve, new Set([...visited, schema.$ref])) };\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n if ('items' in schema) {\n return depsDeep(schema.items, resolve, visited);\n } else { // Array of unknown\n return {};\n }\n } else { // Case: OpenApi.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return Object.assign({}, ...schema.allOf.flatMap(subschema => depsDeep(subschema, resolve, visited)));\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return Object.assign({}, ...schema.oneOf.flatMap(subschema => depsDeep(subschema, resolve, visited)));\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return Object.assign({}, ...schema.anyOf.flatMap(subschema => depsDeep(subschema, resolve, visited)));\n }\n \n if (typeof schema.type === 'undefined') {\n return {}; // Any type\n } else if (Array.isArray(schema.type)) {\n const schemaAnyOf = { anyOf: schema.type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n return depsDeep(schemaAnyOf, resolve, visited);\n }\n switch (schema.type) {\n case 'null':\n case 'string':\n case 'number':\n case 'integer':\n case 'boolean':\n return {};\n case 'object':\n const props: Record<OpenApiSchemaId, OpenApiSchema> = schema.properties ?? {};\n const additionalProps = schema.additionalProperties;\n const additionalPropsSchema: null | OpenApiSchema =\n typeof additionalProps === 'object' && additionalProps !== null\n ? additionalProps\n : null;\n return Object.assign(\n {},\n ...Object.values(props).flatMap(propSchema => depsDeep(propSchema, resolve, visited)),\n additionalPropsSchema ? depsDeep(additionalPropsSchema, resolve, visited) : {},\n );\n default: throw new TypeError(`Unsupported type \"${schema.type}\"`);\n }\n }\n }\n};\n\n\n//\n// Dependency trees\n//\n\ntype DepTree = { [ref: Ref]: DepTree | 'recurse' };\n\n// Create a dependency tree rooted at `rootRef`. If we find a cycle, inject a special \"recurse\" marker.\nexport const dependencyTree = (document: OpenApi.Document, rootSchemaRef: Ref): DepTree => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n const rootSchemaId = schemaIdFromRef(rootSchemaRef);\n \n const rootSchema: undefined | OpenApiSchema = schemas[rootSchemaId];\n if (!rootSchema) { throw new Error(`Unable to find schema \"${rootSchemaRef}\"`); }\n \n return { [rootSchemaRef]: depsDeep(rootSchema, resolver(schemas), new Set([rootSchemaRef])) };\n};\n\n\n//\n// Adjacency maps\n//\n\ntype AdjacencyMap = Map<Ref, Set<Ref>>;\n\n// Get a mapping from schemas to all of their direct dependencies\nexport const dependenciesMapFromDocument = (document: OpenApi.Document): AdjacencyMap => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n // Mapping from a particular schema to its dependencies (directed neighbors in the graph: schema -> dependency)\n const dependenciesMap: AdjacencyMap = new Map<Ref, Set<Ref>>();\n \n for (const [schemaId, schema] of Object.entries(schemas)) {\n const schemaRef = refFromSchemaId(schemaId);\n const dependencies: Set<Ref> = depsShallow(schema);\n \n dependenciesMap.set(schemaRef, dependencies);\n }\n \n return dependenciesMap;\n};\n\n// Get a mapping from schemas to all of their direct dependents\nexport const dependentsMapFromDocument = (document: OpenApi.Document): AdjacencyMap => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n // Mapping from a particular schema to its dependents (directed neighbors in the graph: schema <- dependent)\n const dependentsMap: AdjacencyMap = new Map<Ref, Set<Ref>>();\n \n for (const [schemaId, schema] of Object.entries(schemas)) {\n const schemaRef = refFromSchemaId(schemaId);\n const dependencies = ((): Set<Ref> => {\n try {\n return depsShallow(schema);\n } catch (error: unknown) {\n throw new Error(`Unable to determine dependents for '${schemaRef}'`, { cause: error });\n }\n })();\n \n for (const dependency of dependencies) {\n dependentsMap.set(dependency, new Set([\n ...(dependentsMap.get(dependency) ?? new Set()),\n schemaRef,\n ]));\n }\n }\n \n return dependentsMap;\n};\n\n\n//\n// Topological sort\n//\n\ntype TopologicalSort = Array<{\n ref: Ref,\n circularDependency: boolean, // If true, then this has at least one dependency that breaks the topological ordering\n}>;\nconst topologicalSorter = (dependentsMap: AdjacencyMap) => {\n const visited = new Set<Ref>(); // Keep track of schemas we've already visited\n const refsWithCycles = new Set<Ref>(); // Keep track of schemas that have at least one circular dependency\n const sorted: TopologicalSort = [];\n \n const visit = (schemaRef: Ref): void => {\n if (visited.has(schemaRef)) {\n refsWithCycles.add(schemaRef);\n return;\n }\n \n visited.add(schemaRef);\n \n const dependents = dependentsMap.get(schemaRef) ?? new Set();\n for (const dependentSchemaRef of dependents) {\n visit(dependentSchemaRef);\n }\n \n sorted.unshift({ ref: schemaRef, circularDependency: refsWithCycles.has(schemaRef) });\n };\n \n return { visit, sorted };\n};\n\nexport const topologicalSort = (document: OpenApi.Document): TopologicalSort => {\n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n const adjacency = dependentsMapFromDocument(document);\n const sorter = topologicalSorter(adjacency);\n \n for (const schemaId of Object.keys(schemas)) {\n const schemaRef = refFromSchemaId(schemaId);\n sorter.visit(schemaRef);\n }\n \n return sorter.sorted;\n};\n\n\n// Util: check if a given schema is an object schema\nexport class InfiniteRecursionError extends Error {}\nconst _isObjectSchema = (schema: OpenApiSchema, resolve: Resolve, visited: Set<Ref>): boolean => {\n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n if (visited.has(schema.$ref)) {\n throw new InfiniteRecursionError(`Infinite recursion at ${schema.$ref}`);\n }\n return _isObjectSchema(resolve(schema.$ref), resolve, new Set([...visited, schema.$ref]));\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n return false;\n } else { // Case: OpenApi.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return schema.allOf.flatMap(subschema => _isObjectSchema(subschema, resolve, visited)).every(Boolean);\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return false; // Union\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return false; // Union\n }\n \n if (typeof schema.type === 'undefined') {\n return false; // Any type\n } else if (Array.isArray(schema.type)) {\n const schemaAnyOf = { anyOf: schema.type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n return _isObjectSchema(schemaAnyOf, resolve, visited);\n }\n switch (schema.type) {\n case 'null':\n case 'string':\n case 'number':\n case 'integer':\n case 'boolean':\n return false;\n case 'object':\n return true;\n default: throw new TypeError(`Unsupported type \"${schema.type}\"`);\n }\n }\n }\n};\nexport const isObjectSchema = (schemas: Record<OpenApiSchemaId, OpenApiSchema>, rootSchemaRef: Ref): boolean => {\n const rootSchemaId = schemaIdFromRef(rootSchemaRef);\n \n const rootSchema: undefined | OpenApiSchema = schemas[rootSchemaId];\n if (!rootSchema) { throw new Error(`Unable to find schema \"${rootSchemaRef}\"`); }\n \n return _isObjectSchema(rootSchema, resolver(schemas), new Set([rootSchemaRef]));\n};\n"],"mappings":"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","ignoreList":[]}

@@ -41,4 +41,3 @@ /* Copyright (c) Fortanix, Inc.

return dedent`
import { pipe, Option } from 'effect';
import { Schema as S } from '@effect/schema';
import { pipe, Option, Schema as S } from 'effect';

@@ -45,0 +44,0 @@ ${refsSorted.map(ref => {

@@ -1,1 +0,1 @@

{"version":3,"file":"moduleGen.mjs","names":["dedent","GenResultUtil","generateForSchema","id","encodeIdentifier","generateModule","schemaId","schema","generationContext","schemas","hooks","isSchemaIdBefore","_schemaId","code","refs","comments","commentsGenerated","commentsToCode","fileNameForRef","ref","split","at","schemaIdForRef","replace","refsSorted","filter","sort","ref1","ref2","startsWith","map","refId","Error","join","commentBlock","commentInline"],"sources":["../../../../src/generation/effSchemGen/moduleGen.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport { type OpenApiSchemaId, type OpenApiSchema } from '../../util/openapi.ts';\n\nimport { GenResultUtil } from './genUtil.ts';\nimport { type Context as SchemaGenContext, generateForSchema } from './schemaGen.ts';\n\n\nconst id = GenResultUtil.encodeIdentifier;\n\n// Take an OpenAPI schema and generate a top-level module, as a string.\n// @throws Error When we cannot generate a module from the given schema.\nexport const generateModule = (schemaId: string, schema: OpenApiSchema): string => {\n const generationContext: SchemaGenContext = {\n schemas: {}, // FIXME\n hooks: {},\n isSchemaIdBefore(_schemaId: OpenApiSchemaId) { return true; },\n };\n const { code, refs, comments } = generateForSchema(generationContext, schema);\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n \n const fileNameForRef = (ref: string): undefined | string => ref.split('/').at(-1);\n const schemaIdForRef = (ref: string): undefined | string => fileNameForRef(ref)?.replace(/\\.ts$/, '');\n \n const refsSorted = [...refs]\n .filter(ref => schemaIdForRef(ref) !== schemaId)\n .sort((ref1, ref2) => {\n if (ref1.startsWith('../util/')) {\n return -1;\n } else if (ref2.startsWith('../util/')) {\n return +1;\n }\n return 0;\n });\n return dedent`\n import { pipe, Option } from 'effect';\n import { Schema as S } from '@effect/schema';\n \n ${refsSorted.map(ref => {\n const refId = schemaIdForRef(ref);\n if (!refId) { throw new Error(`Invalid ref: ${ref}`); }\n return `import { ${id(refId)} } from '${ref}';`;\n }).join('\\n')}\n \n ${commentsGenerated.commentBlock}\n export const ${id(schemaId)} = ${code}; ${commentsGenerated.commentInline}\n export type ${id(schemaId)} = S.Schema.Type<typeof ${id(schemaId)}>;\n export const ${id(schemaId)}Encoded = S.encodedSchema(${id(schemaId)});\n export type ${id(schemaId)}Encoded = S.Schema.Encoded<typeof ${id(schemaId)}>;\n `;\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,QAAQ,WAAW;AAGlC,SAASC,aAAa,QAAQ,eAAc;AAC5C,SAA2CC,iBAAiB,QAAQ,iBAAgB;AAGpF,MAAMC,EAAE,GAAGF,aAAa,CAACG,gBAAgB;;AAEzC;AACA;AACA,OAAO,MAAMC,cAAc,GAAGA,CAACC,QAAgB,EAAEC,MAAqB,KAAa;EACjF,MAAMC,iBAAmC,GAAG;IAC1CC,OAAO,EAAE,CAAC,CAAC;IAAE;IACbC,KAAK,EAAE,CAAC,CAAC;IACTC,gBAAgBA,CAACC,SAA0B,EAAE;MAAE,OAAO,IAAI;IAAE;EAC9D,CAAC;EACD,MAAM;IAAEC,IAAI;IAAEC,IAAI;IAAEC;EAAS,CAAC,GAAGb,iBAAiB,CAACM,iBAAiB,EAAED,MAAM,CAAC;EAC7E,MAAMS,iBAAiB,GAAGf,aAAa,CAACgB,cAAc,CAACF,QAAQ,CAAC;EAEhE,MAAMG,cAAc,GAAIC,GAAW,IAAyBA,GAAG,CAACC,KAAK,CAAC,GAAG,CAAC,CAACC,EAAE,CAAC,CAAC,CAAC,CAAC;EACjF,MAAMC,cAAc,GAAIH,GAAW,IAAyBD,cAAc,CAACC,GAAG,CAAC,EAAEI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;EAErG,MAAMC,UAAU,GAAG,CAAC,GAAGV,IAAI,CAAC,CACzBW,MAAM,CAACN,GAAG,IAAIG,cAAc,CAACH,GAAG,CAAC,KAAKb,QAAQ,CAAC,CAC/CoB,IAAI,CAAC,CAACC,IAAI,EAAEC,IAAI,KAAK;IACpB,IAAID,IAAI,CAACE,UAAU,CAAC,UAAU,CAAC,EAAE;MAC/B,OAAO,CAAC,CAAC;IACX,CAAC,MAAM,IAAID,IAAI,CAACC,UAAU,CAAC,UAAU,CAAC,EAAE;MACtC,OAAO,CAAC,CAAC;IACX;IACA,OAAO,CAAC;EACV,CAAC,CAAC;EACJ,OAAO7B,MAAM;AACf;AACA;AACA;AACA,MAAMwB,UAAU,CAACM,GAAG,CAACX,GAAG,IAAI;IACtB,MAAMY,KAAK,GAAGT,cAAc,CAACH,GAAG,CAAC;IACjC,IAAI,CAACY,KAAK,EAAE;MAAE,MAAM,IAAIC,KAAK,CAAC,gBAAgBb,GAAG,EAAE,CAAC;IAAE;IACtD,OAAO,YAAYhB,EAAE,CAAC4B,KAAK,CAAC,YAAYZ,GAAG,IAAI;EACjD,CAAC,CAAC,CAACc,IAAI,CAAC,IAAI,CAAC;AACjB;AACA,MAAMjB,iBAAiB,CAACkB,YAAY;AACpC,mBAAmB/B,EAAE,CAACG,QAAQ,CAAC,MAAMO,IAAI,KAAKG,iBAAiB,CAACmB,aAAa;AAC7E,kBAAkBhC,EAAE,CAACG,QAAQ,CAAC,2BAA2BH,EAAE,CAACG,QAAQ,CAAC;AACrE,mBAAmBH,EAAE,CAACG,QAAQ,CAAC,6BAA6BH,EAAE,CAACG,QAAQ,CAAC;AACxE,kBAAkBH,EAAE,CAACG,QAAQ,CAAC,qCAAqCH,EAAE,CAACG,QAAQ,CAAC;AAC/E,GAAG;AACH,CAAC","ignoreList":[]}
{"version":3,"file":"moduleGen.mjs","names":["dedent","GenResultUtil","generateForSchema","id","encodeIdentifier","generateModule","schemaId","schema","generationContext","schemas","hooks","isSchemaIdBefore","_schemaId","code","refs","comments","commentsGenerated","commentsToCode","fileNameForRef","ref","split","at","schemaIdForRef","replace","refsSorted","filter","sort","ref1","ref2","startsWith","map","refId","Error","join","commentBlock","commentInline"],"sources":["../../../../src/generation/effSchemGen/moduleGen.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport { type OpenApiSchemaId, type OpenApiSchema } from '../../util/openapi.ts';\n\nimport { GenResultUtil } from './genUtil.ts';\nimport { type Context as SchemaGenContext, generateForSchema } from './schemaGen.ts';\n\n\nconst id = GenResultUtil.encodeIdentifier;\n\n// Take an OpenAPI schema and generate a top-level module, as a string.\n// @throws Error When we cannot generate a module from the given schema.\nexport const generateModule = (schemaId: string, schema: OpenApiSchema): string => {\n const generationContext: SchemaGenContext = {\n schemas: {}, // FIXME\n hooks: {},\n isSchemaIdBefore(_schemaId: OpenApiSchemaId) { return true; },\n };\n const { code, refs, comments } = generateForSchema(generationContext, schema);\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n \n const fileNameForRef = (ref: string): undefined | string => ref.split('/').at(-1);\n const schemaIdForRef = (ref: string): undefined | string => fileNameForRef(ref)?.replace(/\\.ts$/, '');\n \n const refsSorted = [...refs]\n .filter(ref => schemaIdForRef(ref) !== schemaId)\n .sort((ref1, ref2) => {\n if (ref1.startsWith('../util/')) {\n return -1;\n } else if (ref2.startsWith('../util/')) {\n return +1;\n }\n return 0;\n });\n return dedent`\n import { pipe, Option, Schema as S } from 'effect';\n \n ${refsSorted.map(ref => {\n const refId = schemaIdForRef(ref);\n if (!refId) { throw new Error(`Invalid ref: ${ref}`); }\n return `import { ${id(refId)} } from '${ref}';`;\n }).join('\\n')}\n \n ${commentsGenerated.commentBlock}\n export const ${id(schemaId)} = ${code}; ${commentsGenerated.commentInline}\n export type ${id(schemaId)} = S.Schema.Type<typeof ${id(schemaId)}>;\n export const ${id(schemaId)}Encoded = S.encodedSchema(${id(schemaId)});\n export type ${id(schemaId)}Encoded = S.Schema.Encoded<typeof ${id(schemaId)}>;\n `;\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,QAAQ,WAAW;AAGlC,SAASC,aAAa,QAAQ,eAAc;AAC5C,SAA2CC,iBAAiB,QAAQ,iBAAgB;AAGpF,MAAMC,EAAE,GAAGF,aAAa,CAACG,gBAAgB;;AAEzC;AACA;AACA,OAAO,MAAMC,cAAc,GAAGA,CAACC,QAAgB,EAAEC,MAAqB,KAAa;EACjF,MAAMC,iBAAmC,GAAG;IAC1CC,OAAO,EAAE,CAAC,CAAC;IAAE;IACbC,KAAK,EAAE,CAAC,CAAC;IACTC,gBAAgBA,CAACC,SAA0B,EAAE;MAAE,OAAO,IAAI;IAAE;EAC9D,CAAC;EACD,MAAM;IAAEC,IAAI;IAAEC,IAAI;IAAEC;EAAS,CAAC,GAAGb,iBAAiB,CAACM,iBAAiB,EAAED,MAAM,CAAC;EAC7E,MAAMS,iBAAiB,GAAGf,aAAa,CAACgB,cAAc,CAACF,QAAQ,CAAC;EAEhE,MAAMG,cAAc,GAAIC,GAAW,IAAyBA,GAAG,CAACC,KAAK,CAAC,GAAG,CAAC,CAACC,EAAE,CAAC,CAAC,CAAC,CAAC;EACjF,MAAMC,cAAc,GAAIH,GAAW,IAAyBD,cAAc,CAACC,GAAG,CAAC,EAAEI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;EAErG,MAAMC,UAAU,GAAG,CAAC,GAAGV,IAAI,CAAC,CACzBW,MAAM,CAACN,GAAG,IAAIG,cAAc,CAACH,GAAG,CAAC,KAAKb,QAAQ,CAAC,CAC/CoB,IAAI,CAAC,CAACC,IAAI,EAAEC,IAAI,KAAK;IACpB,IAAID,IAAI,CAACE,UAAU,CAAC,UAAU,CAAC,EAAE;MAC/B,OAAO,CAAC,CAAC;IACX,CAAC,MAAM,IAAID,IAAI,CAACC,UAAU,CAAC,UAAU,CAAC,EAAE;MACtC,OAAO,CAAC,CAAC;IACX;IACA,OAAO,CAAC;EACV,CAAC,CAAC;EACJ,OAAO7B,MAAM;AACf;AACA;AACA,MAAMwB,UAAU,CAACM,GAAG,CAACX,GAAG,IAAI;IACtB,MAAMY,KAAK,GAAGT,cAAc,CAACH,GAAG,CAAC;IACjC,IAAI,CAACY,KAAK,EAAE;MAAE,MAAM,IAAIC,KAAK,CAAC,gBAAgBb,GAAG,EAAE,CAAC;IAAE;IACtD,OAAO,YAAYhB,EAAE,CAAC4B,KAAK,CAAC,YAAYZ,GAAG,IAAI;EACjD,CAAC,CAAC,CAACc,IAAI,CAAC,IAAI,CAAC;AACjB;AACA,MAAMjB,iBAAiB,CAACkB,YAAY;AACpC,mBAAmB/B,EAAE,CAACG,QAAQ,CAAC,MAAMO,IAAI,KAAKG,iBAAiB,CAACmB,aAAa;AAC7E,kBAAkBhC,EAAE,CAACG,QAAQ,CAAC,2BAA2BH,EAAE,CAACG,QAAQ,CAAC;AACrE,mBAAmBH,EAAE,CAACG,QAAQ,CAAC,6BAA6BH,EAAE,CAACG,QAAQ,CAAC;AACxE,kBAAkBH,EAAE,CAACG,QAAQ,CAAC,qCAAqCH,EAAE,CAACG,QAAQ,CAAC;AAC/E,GAAG;AACH,CAAC","ignoreList":[]}

@@ -113,3 +113,3 @@ /* Copyright (c) Fortanix, Inc.

// Generate an @effect/schema module for the given module as per the given module spec
// Generate an Effect Schema module for the given module as per the given module spec

@@ -344,4 +344,3 @@ export const generateModuleWithSpec = (schemas, spec, modulePath, options) => {

return dedent`
import { pipe, Option } from 'effect';
import { Schema as S } from '@effect/schema';
import { pipe, Option, Schema as S } from 'effect';

@@ -348,0 +347,0 @@ ${codeImports}

@@ -1,1 +0,1 @@

{"version":3,"file":"moduleGenWithSpec.mjs","names":["dedent","path","GenSpec","GenResultUtil","generateForSchema","assertUnreachable","x","Error","id","encodeIdentifier","reorderFields","fieldGroups","schema","TypeError","allOf","map","oneOf","anyOf","type","properties","orderingKeys","Set","Object","values","flatMap","fieldGroup","keys","fieldNames","split","orderingHeadings","entries","reduce","acc","fieldGroupKey","fieldGroupNames","fieldInitial","fromEntries","filter","propKey","includes","sort","prop1Key","prop2Key","indexOf","prop","hasOwn","processSchemaWithSpec","spec","action","fields","generateModuleWithSpec","schemas","modulePath","options","generationContext","hooks","isSchemaIdBefore","schemaId","specModules","runtime","modules","moduleSpec","schemaIds","definitions","def","DefUtil","sourceSchemaIdFromDef","schemasToDefinitionsMap","Map","definition","has","set","codeExports","refsModule","definitionSpec","targetSchemaId","targetSchemaIdFromDef","generationContextForSchema","referencedSchemaId","isSchemaBefore","code","sourceSchemaId","refs","comments","commentsGenerated","commentsToCode","combineRefs","schemaExportComment","commentBlock","trim","typeDeclaration","commentInline","schemaRaw","replace","typeDeclarationEncoded","typeAnnotation","schemaCode","JSON","stringify","shouldGenerateOpaqueStruct","shouldGenerateOpaqueClass","refsSorted","ref","importName","importNameFromRef","ref1","ref2","codeImports","definitionLocator","get","modulePathRelative","relative","dirname","startsWith","join"],"sources":["../../../../src/generation/effSchemGen/moduleGenWithSpec.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport * as path from 'node:path';\nimport { type OpenApiRef, type OpenApiSchemaId, type OpenApiSchema } from '../../util/openapi.ts';\n\nimport { refFromSchemaId, isObjectSchema } from '../../analysis/GraphAnalyzer.ts';\nimport * as GenSpec from '../generationSpec.ts';\nimport { type GenResult, GenResultUtil } from './genUtil.ts';\nimport { type Context as SchemaGenContext, generateForSchema } from './schemaGen.ts';\n\n\nconst assertUnreachable = (x: never): never => { throw new Error(`Should not happen`); };\nconst id = GenResultUtil.encodeIdentifier;\n\n\n// Transform the given `schema` by reordering object fields according the given `ordering` spec.\n// @throws TypeError When `schema` is not an object schema.\nconst reorderFields = (fieldGroups: GenSpec.FieldGroups, schema: OpenApiSchema): OpenApiSchema => {\n // We assume the `schema` is an object schema (or close enough to one). If `schema` is an allOf/oneOf/anyOf then\n // we reorder all of the possibilities.\n \n if ('$ref' in schema) { // Case: OpenAPIV3.ReferenceObject\n throw new TypeError(`Not an object schema`);\n } else { // Case: OpenAPIV3.SchemaObject\n if ('items' in schema) { // Case: OpenAPIV3.ArraySchemaObject\n throw new TypeError(`Not an object schema`);\n } else { // Case: OpenAPIV3.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return { ...schema, allOf: schema.allOf.map(schema => reorderFields(fieldGroups, schema)) };\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return { ...schema, oneOf: schema.oneOf.map(schema => reorderFields(fieldGroups, schema)) };\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return { ...schema, anyOf: schema.anyOf.map(schema => reorderFields(fieldGroups, schema)) };\n }\n \n if (schema.type !== 'object') {\n throw new TypeError(`Not an object schema`);\n }\n \n // Reorder `properties` (if any)\n // Note: we don't care about `required` or `additionalProperties` here\n \n const properties: undefined | Record<string, OpenApiSchema> = schema.properties;\n if (typeof properties === 'undefined') { return schema; }\n \n // Prep: get the list of all keys across all groups, for quick lookup purposes\n const orderingKeys: Array<string> = [...new Set(Object.values(fieldGroups).flatMap(fieldGroup => {\n // Each key may be a comma-separated string of field names\n return Object.keys(fieldGroup).flatMap(fieldNames => fieldNames.split(/,\\s*/));\n }))];\n \n // FIXME\n // const groupHeadingComment: null | string = groupKey.startsWith('//')\n // ? groupKey.replace('//', '').trim()\n // : null;\n \n // Get a mapping of the initial fields in the group to the group name (for later annotation purposes)\n const orderingHeadings = Object.entries(fieldGroups).reduce(\n (acc, [fieldGroupKey, fieldGroup]) => {\n const fieldGroupNames = Object.keys(fieldGroup).flatMap(fieldNames => fieldNames.split(/,\\s*/));\n \n // Get the first field in the list (this field will be annotated to identify where the group starts)\n const fieldInitial: undefined | string = fieldGroupNames[0];\n \n if (typeof fieldInitial === 'string') {\n acc[fieldInitial] = fieldGroupKey;\n }\n return acc;\n },\n {} as Record<string, string>,\n );\n \n return {\n ...schema,\n properties: Object.fromEntries(Object.entries(properties)\n .filter(([propKey]) => orderingKeys.includes(propKey))\n .sort(([prop1Key], [prop2Key]) => {\n return orderingKeys.indexOf(prop1Key) - orderingKeys.indexOf(prop2Key);\n })\n .map(([propKey, prop]) => {\n if (Object.hasOwn(orderingHeadings, propKey)) {\n return [propKey, { ...prop, 'x-heading': orderingHeadings[propKey] }];\n } else {\n return [propKey, prop];\n }\n }),\n ),\n };\n }\n }\n};\nconst processSchemaWithSpec = (spec: GenSpec.GenerationDefinitionSpec, schema: OpenApiSchema): OpenApiSchema => {\n if (spec.action !== 'generate-schema') { return schema; }\n \n const fields: undefined | GenSpec.FieldGroups = spec.fields;\n if (typeof fields !== 'undefined') {\n return reorderFields(fields, schema);\n }\n \n return schema;\n};\n\n// Generate an @effect/schema module for the given module as per the given module spec\ntype GenerateModuleWithSpecOptions = {\n // Whether `schema1` is before `schema2` in the generation order\n isSchemaBefore: (schema1: OpenApiSchemaId, schema2: OpenApiSchemaId) => boolean,\n};\nexport const generateModuleWithSpec = (\n schemas: Record<string, OpenApiSchema>, // All available source schemas (may contain ones we don't need)\n spec: GenSpec.GenerationSpec, // The (full) generation spec\n modulePath: GenSpec.ModulePath, // The specific module we want to generate\n options: GenerateModuleWithSpecOptions,\n): string => {\n const generationContext: SchemaGenContext = {\n schemas,\n hooks: spec.hooks,\n isSchemaIdBefore: (schemaId: OpenApiSchemaId): boolean => {\n return true;\n },\n };\n \n const specModules = { ...spec.runtime, ...spec.modules };\n \n const moduleSpec: undefined | GenSpec.GenerationModuleSpec = specModules[modulePath];\n if (typeof moduleSpec === 'undefined') { throw new Error(`Cannot find definition for module ${modulePath}`); }\n \n // Derive the list of all schema IDs from `schemas`\n const schemaIds: Set<OpenApiSchemaId> = new Set(moduleSpec.definitions.map((def): OpenApiSchemaId => {\n return GenSpec.DefUtil.sourceSchemaIdFromDef(def);\n }));\n \n // Reverse mapping of schema IDs to the first definition that contains it\n type DefinitionLocator = { modulePath: GenSpec.ModulePath, definition: GenSpec.GenerationDefinitionSpec };\n const schemasToDefinitionsMap: Map<OpenApiSchemaId, DefinitionLocator> = new Map();\n for (const [modulePath, moduleSpec] of Object.entries(specModules)) {\n for (const definition of moduleSpec.definitions) {\n const schemaId = GenSpec.DefUtil.sourceSchemaIdFromDef(definition);\n if (!schemasToDefinitionsMap.has(schemaId)) {\n schemasToDefinitionsMap.set(schemaId, { modulePath, definition });\n }\n }\n }\n \n let codeExports = '';\n let refsModule: GenResult['refs'] = [];\n for (const definitionSpec of moduleSpec.definitions) {\n const targetSchemaId = GenSpec.DefUtil.targetSchemaIdFromDef(definitionSpec);\n \n const generationContextForSchema: SchemaGenContext = {\n ...generationContext,\n isSchemaIdBefore: (referencedSchemaId: OpenApiSchemaId): boolean => {\n return options.isSchemaBefore(referencedSchemaId, targetSchemaId);\n \n // const referencedDef = schemasToDefinitionsMap.get(referencedSchemaId);\n // if (!referencedDef) { return false; }\n // const defs = moduleSpec.definitions;\n // \n // console.log('YYY', referencedSchemaId, '<-', targetSchemaId, referencedDef.definition);\n // if (defs.indexOf(referencedDef.definition) >= defs.indexOf(definitionSpec)) {\n // console.log('XXX', referencedSchemaId, '>=', targetSchemaId);\n // }\n // \n // return defs.indexOf(referencedDef.definition) < defs.indexOf(definitionSpec);\n },\n };\n \n switch (definitionSpec.action) {\n case 'custom-code': {\n codeExports = definitionSpec.code;\n break;\n };\n case 'custom-schema': {\n const schema: OpenApiSchema = definitionSpec.schema;\n const sourceSchemaId: OpenApiSchemaId = GenSpec.DefUtil.sourceSchemaIdFromDef(definitionSpec);\n \n const { code, refs, comments } = generateForSchema(generationContextForSchema, schema);\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n \n refsModule = GenResultUtil.combineRefs(refsModule, refs);\n \n const schemaExportComment: string = dedent`\n ${commentsGenerated.commentBlock}\n ${sourceSchemaId === targetSchemaId ? '' : `// Generated from OpenAPI \\`${sourceSchemaId}\\` schema`}\n `.trim();\n \n codeExports += '\\n\\n' + dedent`\n ${schemaExportComment ? `${schemaExportComment}\\n` : ''}${\n typeof definitionSpec.typeDeclaration === 'string'\n //? `export const ${id(targetSchemaId)}: S.Schema<${id(targetSchemaId)}> = ` // Replaced with suspend annotations\n ? `export const ${id(targetSchemaId)} = `\n : `export const ${id(targetSchemaId)} = `\n }${\n //definitionSpec.lazy ? `S.suspend(() => ${code});` : code // Replaced with suspend annotations\n code\n }; ${commentsGenerated.commentInline}\n `.trim();\n if (typeof definitionSpec.typeDeclaration === 'string') {\n codeExports += dedent`\n export type ${id(targetSchemaId)} = ${definitionSpec.typeDeclaration};\n `;\n } else {\n codeExports += dedent`\n export type ${id(targetSchemaId)} = S.Schema.Type<typeof ${id(targetSchemaId)}>;\n `;\n }\n break;\n };\n case 'generate-schema': {\n const sourceSchemaId: OpenApiSchemaId = GenSpec.DefUtil.sourceSchemaIdFromDef(definitionSpec);\n const schemaRaw: undefined | OpenApiSchema = schemas[sourceSchemaId];\n if (!schemaRaw) { throw new Error(`Could not find a schema named ${sourceSchemaId}`) }\n const schema: OpenApiSchema = processSchemaWithSpec(definitionSpec, schemaRaw);\n \n const { code, refs, comments } = generateForSchema(generationContextForSchema, schema);\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n \n refsModule = GenResultUtil.combineRefs(refsModule, refs);\n \n \n // Start generating the schema exports\n codeExports += '\\n\\n';\n \n // Comments\n codeExports += dedent`\n /* ${id(targetSchemaId)} */\n ${commentsGenerated.commentBlock}\n ${sourceSchemaId === targetSchemaId ? '' : `// Generated from OpenAPI \\`${sourceSchemaId}\\` schema`}\n `.replace(/[\\n]+/, '\\n') + '\\n';\n \n // Manual type declarations (for recursive references)\n if (typeof definitionSpec.typeDeclaration === 'string') {\n codeExports += `type _${id(targetSchemaId)} = ${definitionSpec.typeDeclaration};`;\n if (typeof definitionSpec.typeDeclarationEncoded === 'string') {\n codeExports += `type _${id(targetSchemaId)}Encoded = ${definitionSpec.typeDeclarationEncoded};`;\n }\n }\n /*\n const typeAnnotation = typeof definitionSpec.typeDeclaration === 'string'\n ? (\n typeof definitionSpec.typeDeclarationEncoded === 'string'\n ? `: S.Schema<_${id(targetSchemaId)}, _${id(targetSchemaId)}Encoded>`\n : `: S.Schema<_${id(targetSchemaId)}>`\n )\n : '';\n */\n const typeAnnotation = ''; // Replaced with suspend annotations\n \n const schemaCode = dedent`\n ${\n //definitionSpec.lazy ? `S.suspend(() => ${code})` : code // Replaced with suspend annotations\n code\n }\n .annotations({ identifier: ${JSON.stringify(targetSchemaId)} })\n `.trim();\n \n // See: https://github.com/Effect-TS/effect/tree/main/packages/schema#understanding-opaque-names\n const shouldGenerateOpaqueStruct = false;//isObjectSchema(schemas, refFromSchemaId(sourceSchemaId));\n const shouldGenerateOpaqueClass = false; //isObjectSchema(schemas, refFromSchemaId(sourceSchemaId)) && /^S.Struct/.test(code);\n if (shouldGenerateOpaqueStruct) {\n codeExports += dedent`\n const _${id(targetSchemaId)}${typeAnnotation} = ${schemaCode}; ${commentsGenerated.commentInline}\n export interface ${id(targetSchemaId)} extends S.Schema.Type<typeof _${id(targetSchemaId)}> {}\n export interface ${id(targetSchemaId)}Encoded extends S.Schema.Encoded<typeof _${id(targetSchemaId)}> {}\n export const ${id(targetSchemaId)}: S.Schema<${id(targetSchemaId)}, ${id(targetSchemaId)}Encoded> = _${id(targetSchemaId)};\n `.trim();\n /* To generate the runtime encoded schema:\n export const ${id(targetSchemaId)}Encoded: S.Schema<${id(targetSchemaId)}Encoded, ${id(targetSchemaId)}Encoded> =\n S.encodedSchema(_${id(targetSchemaId)});\n */\n } else if (shouldGenerateOpaqueClass) {\n // Experimental: generate a top level Struct as a class (for better opaque types)\n codeExports += dedent`\n export class ${id(targetSchemaId)} extends S.Class<${id(targetSchemaId)}>(\"${id(targetSchemaId)}\")(\n ${code.replace(/^S\\.Struct\\(/, '').replace(/\\),?$/, '')}\n ) {}\n `.trim();\n } else {\n codeExports += dedent`\n export const ${id(targetSchemaId)}${typeAnnotation} = ${schemaCode}; ${commentsGenerated.commentInline}\n export type ${id(targetSchemaId)} = S.Schema.Type<typeof ${id(targetSchemaId)}>;\n export type ${id(targetSchemaId)}Encoded = S.Schema.Encoded<typeof ${id(targetSchemaId)}>;\n `.trim();\n /* To generate the runtime encoded schema:\n export const ${id(targetSchemaId)}Encoded = S.encodedSchema(${id(targetSchemaId)});\n */\n }\n break;\n };\n default: assertUnreachable(definitionSpec);\n }\n }\n \n const refsSorted = [...refsModule]\n .filter(ref => {\n // Filter out imports that are already part of this file\n const importName = GenResultUtil.importNameFromRef(ref);\n return !schemaIds.has(importName);\n })\n .sort((ref1, ref2) => {\n // Sort certain imports at the top\n // FIXME: unhardcode this logic somehow\n if (ref1.includes('/util/')) {\n return -1;\n } else if (ref2.includes('/util/')) {\n return +1;\n }\n return 0;\n });\n \n const codeImports = dedent`\n ${refsSorted.map(ref => {\n const sourceSchemaId: OpenApiSchemaId = GenResultUtil.importNameFromRef(ref); // Get the source schema ID\n \n // Try to reverse-map this schema ID to one of the spec's definitions\n const definitionLocator: undefined | DefinitionLocator = schemasToDefinitionsMap.get(sourceSchemaId);\n \n if (typeof definitionLocator !== 'undefined') {\n const targetSchemaId = GenSpec.DefUtil.targetSchemaIdFromDef(definitionLocator.definition);\n \n // Calculate the relative path to the module\n let modulePathRelative = path.relative(path.dirname(modulePath), definitionLocator.modulePath);\n if (!modulePathRelative.startsWith('.')) { // Ensure the path starts with a `.` (ESM import paths require it)\n modulePathRelative = './' + modulePathRelative;\n }\n \n return `import { ${id(targetSchemaId)} } from '${modulePathRelative}';`;\n } else {\n return `// MISSING ${sourceSchemaId}`;\n //return `import { ${sourceSchemaId} } from '${ref}';`;\n }\n }).join('\\n')}\n `;\n \n // TODO: may want to add a comment at the top like:\n // /* Generated on ${new Date().toISOString()} from ${apiName} version ${apiVersion} */\n // Currently leaving this out because it means even simple changes cause a git diff upon regeneration.\n return dedent`\n import { pipe, Option } from 'effect';\n import { Schema as S } from '@effect/schema';\n \n ${codeImports}\n \n ${codeExports}\n `;\n};\n"],"mappings":"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","ignoreList":[]}
{"version":3,"file":"moduleGenWithSpec.mjs","names":["dedent","path","GenSpec","GenResultUtil","generateForSchema","assertUnreachable","x","Error","id","encodeIdentifier","reorderFields","fieldGroups","schema","TypeError","allOf","map","oneOf","anyOf","type","properties","orderingKeys","Set","Object","values","flatMap","fieldGroup","keys","fieldNames","split","orderingHeadings","entries","reduce","acc","fieldGroupKey","fieldGroupNames","fieldInitial","fromEntries","filter","propKey","includes","sort","prop1Key","prop2Key","indexOf","prop","hasOwn","processSchemaWithSpec","spec","action","fields","generateModuleWithSpec","schemas","modulePath","options","generationContext","hooks","isSchemaIdBefore","schemaId","specModules","runtime","modules","moduleSpec","schemaIds","definitions","def","DefUtil","sourceSchemaIdFromDef","schemasToDefinitionsMap","Map","definition","has","set","codeExports","refsModule","definitionSpec","targetSchemaId","targetSchemaIdFromDef","generationContextForSchema","referencedSchemaId","isSchemaBefore","code","sourceSchemaId","refs","comments","commentsGenerated","commentsToCode","combineRefs","schemaExportComment","commentBlock","trim","typeDeclaration","commentInline","schemaRaw","replace","typeDeclarationEncoded","typeAnnotation","schemaCode","JSON","stringify","shouldGenerateOpaqueStruct","shouldGenerateOpaqueClass","refsSorted","ref","importName","importNameFromRef","ref1","ref2","codeImports","definitionLocator","get","modulePathRelative","relative","dirname","startsWith","join"],"sources":["../../../../src/generation/effSchemGen/moduleGenWithSpec.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport * as path from 'node:path';\nimport { type OpenApiRef, type OpenApiSchemaId, type OpenApiSchema } from '../../util/openapi.ts';\n\nimport { refFromSchemaId, isObjectSchema } from '../../analysis/GraphAnalyzer.ts';\nimport * as GenSpec from '../generationSpec.ts';\nimport { type GenResult, GenResultUtil } from './genUtil.ts';\nimport { type Context as SchemaGenContext, generateForSchema } from './schemaGen.ts';\n\n\nconst assertUnreachable = (x: never): never => { throw new Error(`Should not happen`); };\nconst id = GenResultUtil.encodeIdentifier;\n\n\n// Transform the given `schema` by reordering object fields according the given `ordering` spec.\n// @throws TypeError When `schema` is not an object schema.\nconst reorderFields = (fieldGroups: GenSpec.FieldGroups, schema: OpenApiSchema): OpenApiSchema => {\n // We assume the `schema` is an object schema (or close enough to one). If `schema` is an allOf/oneOf/anyOf then\n // we reorder all of the possibilities.\n \n if ('$ref' in schema) { // Case: OpenAPIV3.ReferenceObject\n throw new TypeError(`Not an object schema`);\n } else { // Case: OpenAPIV3.SchemaObject\n if ('items' in schema) { // Case: OpenAPIV3.ArraySchemaObject\n throw new TypeError(`Not an object schema`);\n } else { // Case: OpenAPIV3.NonArraySchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n return { ...schema, allOf: schema.allOf.map(schema => reorderFields(fieldGroups, schema)) };\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n return { ...schema, oneOf: schema.oneOf.map(schema => reorderFields(fieldGroups, schema)) };\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n return { ...schema, anyOf: schema.anyOf.map(schema => reorderFields(fieldGroups, schema)) };\n }\n \n if (schema.type !== 'object') {\n throw new TypeError(`Not an object schema`);\n }\n \n // Reorder `properties` (if any)\n // Note: we don't care about `required` or `additionalProperties` here\n \n const properties: undefined | Record<string, OpenApiSchema> = schema.properties;\n if (typeof properties === 'undefined') { return schema; }\n \n // Prep: get the list of all keys across all groups, for quick lookup purposes\n const orderingKeys: Array<string> = [...new Set(Object.values(fieldGroups).flatMap(fieldGroup => {\n // Each key may be a comma-separated string of field names\n return Object.keys(fieldGroup).flatMap(fieldNames => fieldNames.split(/,\\s*/));\n }))];\n \n // FIXME\n // const groupHeadingComment: null | string = groupKey.startsWith('//')\n // ? groupKey.replace('//', '').trim()\n // : null;\n \n // Get a mapping of the initial fields in the group to the group name (for later annotation purposes)\n const orderingHeadings = Object.entries(fieldGroups).reduce(\n (acc, [fieldGroupKey, fieldGroup]) => {\n const fieldGroupNames = Object.keys(fieldGroup).flatMap(fieldNames => fieldNames.split(/,\\s*/));\n \n // Get the first field in the list (this field will be annotated to identify where the group starts)\n const fieldInitial: undefined | string = fieldGroupNames[0];\n \n if (typeof fieldInitial === 'string') {\n acc[fieldInitial] = fieldGroupKey;\n }\n return acc;\n },\n {} as Record<string, string>,\n );\n \n return {\n ...schema,\n properties: Object.fromEntries(Object.entries(properties)\n .filter(([propKey]) => orderingKeys.includes(propKey))\n .sort(([prop1Key], [prop2Key]) => {\n return orderingKeys.indexOf(prop1Key) - orderingKeys.indexOf(prop2Key);\n })\n .map(([propKey, prop]) => {\n if (Object.hasOwn(orderingHeadings, propKey)) {\n return [propKey, { ...prop, 'x-heading': orderingHeadings[propKey] }];\n } else {\n return [propKey, prop];\n }\n }),\n ),\n };\n }\n }\n};\nconst processSchemaWithSpec = (spec: GenSpec.GenerationDefinitionSpec, schema: OpenApiSchema): OpenApiSchema => {\n if (spec.action !== 'generate-schema') { return schema; }\n \n const fields: undefined | GenSpec.FieldGroups = spec.fields;\n if (typeof fields !== 'undefined') {\n return reorderFields(fields, schema);\n }\n \n return schema;\n};\n\n// Generate an Effect Schema module for the given module as per the given module spec\ntype GenerateModuleWithSpecOptions = {\n // Whether `schema1` is before `schema2` in the generation order\n isSchemaBefore: (schema1: OpenApiSchemaId, schema2: OpenApiSchemaId) => boolean,\n};\nexport const generateModuleWithSpec = (\n schemas: Record<string, OpenApiSchema>, // All available source schemas (may contain ones we don't need)\n spec: GenSpec.GenerationSpec, // The (full) generation spec\n modulePath: GenSpec.ModulePath, // The specific module we want to generate\n options: GenerateModuleWithSpecOptions,\n): string => {\n const generationContext: SchemaGenContext = {\n schemas,\n hooks: spec.hooks,\n isSchemaIdBefore: (schemaId: OpenApiSchemaId): boolean => {\n return true;\n },\n };\n \n const specModules = { ...spec.runtime, ...spec.modules };\n \n const moduleSpec: undefined | GenSpec.GenerationModuleSpec = specModules[modulePath];\n if (typeof moduleSpec === 'undefined') { throw new Error(`Cannot find definition for module ${modulePath}`); }\n \n // Derive the list of all schema IDs from `schemas`\n const schemaIds: Set<OpenApiSchemaId> = new Set(moduleSpec.definitions.map((def): OpenApiSchemaId => {\n return GenSpec.DefUtil.sourceSchemaIdFromDef(def);\n }));\n \n // Reverse mapping of schema IDs to the first definition that contains it\n type DefinitionLocator = { modulePath: GenSpec.ModulePath, definition: GenSpec.GenerationDefinitionSpec };\n const schemasToDefinitionsMap: Map<OpenApiSchemaId, DefinitionLocator> = new Map();\n for (const [modulePath, moduleSpec] of Object.entries(specModules)) {\n for (const definition of moduleSpec.definitions) {\n const schemaId = GenSpec.DefUtil.sourceSchemaIdFromDef(definition);\n if (!schemasToDefinitionsMap.has(schemaId)) {\n schemasToDefinitionsMap.set(schemaId, { modulePath, definition });\n }\n }\n }\n \n let codeExports = '';\n let refsModule: GenResult['refs'] = [];\n for (const definitionSpec of moduleSpec.definitions) {\n const targetSchemaId = GenSpec.DefUtil.targetSchemaIdFromDef(definitionSpec);\n \n const generationContextForSchema: SchemaGenContext = {\n ...generationContext,\n isSchemaIdBefore: (referencedSchemaId: OpenApiSchemaId): boolean => {\n return options.isSchemaBefore(referencedSchemaId, targetSchemaId);\n \n // const referencedDef = schemasToDefinitionsMap.get(referencedSchemaId);\n // if (!referencedDef) { return false; }\n // const defs = moduleSpec.definitions;\n // \n // console.log('YYY', referencedSchemaId, '<-', targetSchemaId, referencedDef.definition);\n // if (defs.indexOf(referencedDef.definition) >= defs.indexOf(definitionSpec)) {\n // console.log('XXX', referencedSchemaId, '>=', targetSchemaId);\n // }\n // \n // return defs.indexOf(referencedDef.definition) < defs.indexOf(definitionSpec);\n },\n };\n \n switch (definitionSpec.action) {\n case 'custom-code': {\n codeExports = definitionSpec.code;\n break;\n };\n case 'custom-schema': {\n const schema: OpenApiSchema = definitionSpec.schema;\n const sourceSchemaId: OpenApiSchemaId = GenSpec.DefUtil.sourceSchemaIdFromDef(definitionSpec);\n \n const { code, refs, comments } = generateForSchema(generationContextForSchema, schema);\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n \n refsModule = GenResultUtil.combineRefs(refsModule, refs);\n \n const schemaExportComment: string = dedent`\n ${commentsGenerated.commentBlock}\n ${sourceSchemaId === targetSchemaId ? '' : `// Generated from OpenAPI \\`${sourceSchemaId}\\` schema`}\n `.trim();\n \n codeExports += '\\n\\n' + dedent`\n ${schemaExportComment ? `${schemaExportComment}\\n` : ''}${\n typeof definitionSpec.typeDeclaration === 'string'\n //? `export const ${id(targetSchemaId)}: S.Schema<${id(targetSchemaId)}> = ` // Replaced with suspend annotations\n ? `export const ${id(targetSchemaId)} = `\n : `export const ${id(targetSchemaId)} = `\n }${\n //definitionSpec.lazy ? `S.suspend(() => ${code});` : code // Replaced with suspend annotations\n code\n }; ${commentsGenerated.commentInline}\n `.trim();\n if (typeof definitionSpec.typeDeclaration === 'string') {\n codeExports += dedent`\n export type ${id(targetSchemaId)} = ${definitionSpec.typeDeclaration};\n `;\n } else {\n codeExports += dedent`\n export type ${id(targetSchemaId)} = S.Schema.Type<typeof ${id(targetSchemaId)}>;\n `;\n }\n break;\n };\n case 'generate-schema': {\n const sourceSchemaId: OpenApiSchemaId = GenSpec.DefUtil.sourceSchemaIdFromDef(definitionSpec);\n const schemaRaw: undefined | OpenApiSchema = schemas[sourceSchemaId];\n if (!schemaRaw) { throw new Error(`Could not find a schema named ${sourceSchemaId}`) }\n const schema: OpenApiSchema = processSchemaWithSpec(definitionSpec, schemaRaw);\n \n const { code, refs, comments } = generateForSchema(generationContextForSchema, schema);\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n \n refsModule = GenResultUtil.combineRefs(refsModule, refs);\n \n \n // Start generating the schema exports\n codeExports += '\\n\\n';\n \n // Comments\n codeExports += dedent`\n /* ${id(targetSchemaId)} */\n ${commentsGenerated.commentBlock}\n ${sourceSchemaId === targetSchemaId ? '' : `// Generated from OpenAPI \\`${sourceSchemaId}\\` schema`}\n `.replace(/[\\n]+/, '\\n') + '\\n';\n \n // Manual type declarations (for recursive references)\n if (typeof definitionSpec.typeDeclaration === 'string') {\n codeExports += `type _${id(targetSchemaId)} = ${definitionSpec.typeDeclaration};`;\n if (typeof definitionSpec.typeDeclarationEncoded === 'string') {\n codeExports += `type _${id(targetSchemaId)}Encoded = ${definitionSpec.typeDeclarationEncoded};`;\n }\n }\n /*\n const typeAnnotation = typeof definitionSpec.typeDeclaration === 'string'\n ? (\n typeof definitionSpec.typeDeclarationEncoded === 'string'\n ? `: S.Schema<_${id(targetSchemaId)}, _${id(targetSchemaId)}Encoded>`\n : `: S.Schema<_${id(targetSchemaId)}>`\n )\n : '';\n */\n const typeAnnotation = ''; // Replaced with suspend annotations\n \n const schemaCode = dedent`\n ${\n //definitionSpec.lazy ? `S.suspend(() => ${code})` : code // Replaced with suspend annotations\n code\n }\n .annotations({ identifier: ${JSON.stringify(targetSchemaId)} })\n `.trim();\n \n // See: https://github.com/Effect-TS/effect/tree/main/packages/schema#understanding-opaque-names\n const shouldGenerateOpaqueStruct = false;//isObjectSchema(schemas, refFromSchemaId(sourceSchemaId));\n const shouldGenerateOpaqueClass = false; //isObjectSchema(schemas, refFromSchemaId(sourceSchemaId)) && /^S.Struct/.test(code);\n if (shouldGenerateOpaqueStruct) {\n codeExports += dedent`\n const _${id(targetSchemaId)}${typeAnnotation} = ${schemaCode}; ${commentsGenerated.commentInline}\n export interface ${id(targetSchemaId)} extends S.Schema.Type<typeof _${id(targetSchemaId)}> {}\n export interface ${id(targetSchemaId)}Encoded extends S.Schema.Encoded<typeof _${id(targetSchemaId)}> {}\n export const ${id(targetSchemaId)}: S.Schema<${id(targetSchemaId)}, ${id(targetSchemaId)}Encoded> = _${id(targetSchemaId)};\n `.trim();\n /* To generate the runtime encoded schema:\n export const ${id(targetSchemaId)}Encoded: S.Schema<${id(targetSchemaId)}Encoded, ${id(targetSchemaId)}Encoded> =\n S.encodedSchema(_${id(targetSchemaId)});\n */\n } else if (shouldGenerateOpaqueClass) {\n // Experimental: generate a top level Struct as a class (for better opaque types)\n codeExports += dedent`\n export class ${id(targetSchemaId)} extends S.Class<${id(targetSchemaId)}>(\"${id(targetSchemaId)}\")(\n ${code.replace(/^S\\.Struct\\(/, '').replace(/\\),?$/, '')}\n ) {}\n `.trim();\n } else {\n codeExports += dedent`\n export const ${id(targetSchemaId)}${typeAnnotation} = ${schemaCode}; ${commentsGenerated.commentInline}\n export type ${id(targetSchemaId)} = S.Schema.Type<typeof ${id(targetSchemaId)}>;\n export type ${id(targetSchemaId)}Encoded = S.Schema.Encoded<typeof ${id(targetSchemaId)}>;\n `.trim();\n /* To generate the runtime encoded schema:\n export const ${id(targetSchemaId)}Encoded = S.encodedSchema(${id(targetSchemaId)});\n */\n }\n break;\n };\n default: assertUnreachable(definitionSpec);\n }\n }\n \n const refsSorted = [...refsModule]\n .filter(ref => {\n // Filter out imports that are already part of this file\n const importName = GenResultUtil.importNameFromRef(ref);\n return !schemaIds.has(importName);\n })\n .sort((ref1, ref2) => {\n // Sort certain imports at the top\n // FIXME: unhardcode this logic somehow\n if (ref1.includes('/util/')) {\n return -1;\n } else if (ref2.includes('/util/')) {\n return +1;\n }\n return 0;\n });\n \n const codeImports = dedent`\n ${refsSorted.map(ref => {\n const sourceSchemaId: OpenApiSchemaId = GenResultUtil.importNameFromRef(ref); // Get the source schema ID\n \n // Try to reverse-map this schema ID to one of the spec's definitions\n const definitionLocator: undefined | DefinitionLocator = schemasToDefinitionsMap.get(sourceSchemaId);\n \n if (typeof definitionLocator !== 'undefined') {\n const targetSchemaId = GenSpec.DefUtil.targetSchemaIdFromDef(definitionLocator.definition);\n \n // Calculate the relative path to the module\n let modulePathRelative = path.relative(path.dirname(modulePath), definitionLocator.modulePath);\n if (!modulePathRelative.startsWith('.')) { // Ensure the path starts with a `.` (ESM import paths require it)\n modulePathRelative = './' + modulePathRelative;\n }\n \n return `import { ${id(targetSchemaId)} } from '${modulePathRelative}';`;\n } else {\n return `// MISSING ${sourceSchemaId}`;\n //return `import { ${sourceSchemaId} } from '${ref}';`;\n }\n }).join('\\n')}\n `;\n \n // TODO: may want to add a comment at the top like:\n // /* Generated on ${new Date().toISOString()} from ${apiName} version ${apiVersion} */\n // Currently leaving this out because it means even simple changes cause a git diff upon regeneration.\n return dedent`\n import { pipe, Option, Schema as S } from 'effect';\n \n ${codeImports}\n \n ${codeExports}\n `;\n};\n"],"mappings":"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","ignoreList":[]}

@@ -302,3 +302,3 @@ /* Copyright (c) Fortanix, Inc.

// Generate the @effect/schema code for the given OpenAPI schema
// Generate the Effect Schema code for the given OpenAPI schema
export const generateForSchema = (ctx, schema) => {

@@ -328,3 +328,3 @@ const isNonArraySchemaType = schema => {

// `allOf` supports any type, but `@effect/schema` does not currently support generic intersections. Thus,
// `allOf` supports any type, but Effect Schema does not currently support generic intersections. Thus,
// currently we only support `allOf` if it consists only of object schemas.

@@ -406,3 +406,3 @@ // Idea: merge `allOf` schema first, e.g. using https://github.com/mokkabonna/json-schema-merge-allof

// Note: `extend` doesn't quite cover the semantics of `allOf`, since it only accepts objects and
// assumes distinct types. However, @effect/schema has no generic built-in mechanism for this.
// assumes distinct types. However, Effect Schema has no generic built-in mechanism for this.
code = dedent`

@@ -442,3 +442,3 @@ pipe(

// Note: `union` doesn't quite cover the semantics of `oneOf`, since `oneOf` must guarantee that exactly
// one schema matches. However, @effect/schema has no easy built-in mechanism for this.
// one schema matches. However, Effect Schema has no easy built-in mechanism for this.
const code = dedent`

@@ -445,0 +445,0 @@ S.Union(

@@ -1,1 +0,1 @@

{"version":3,"file":"schemaGen.mjs","names":["dedent","isObjectSchema","schemaIdFromRef","GenResultUtil","id","encodeIdentifier","generateForUnknownSchema","ctx","schema","code","refs","comments","commentsFromSchemaObject","generateForNullSchema","generateForStringSchema","Array","isArray","enum","every","value","TypeError","JSON","stringify","map","String","join","baseSchema","format","pipe","push","pattern","minLength","maxLength","hookResult","hooks","generateStringType","combineRefs","generatePipe","generateForNumberSchema","type","generateNumberType","minimum","maximum","exclusiveMinimum","exclusiveMaximum","generateForBooleanSchema","Error","propertyNameAsIdentifier","propertyName","test","replaceAll","generateFieldsForObjectSchema","propSchemas","properties","propsRequired","Set","required","Object","entries","propName","propSchema","propIndex","propResult","generateForSchema","commentsGenerated","commentsToCode","propCode","has","optionalParams","printOptional","keys","length","paramsFormatted","hasOwn","exact","default","hasDefault","optionalFieldRepresentation","propNeedsSeparator","propHeading","propHeadingComment","startsWith","commentBlock","commentInline","trim","generateForObjectSchema","additionalPropSchema","additionalProperties","additionalPropsResult","indexSignature","fieldsGen","generateForArraySchema","itemSchema","items","itemResult","generateForReferenceObject","schemaId","$ref","shouldSuspend","isSchemaIdBefore","initComments","isNonArraySchemaType","allOf","schemasHead","areAllObjects","reduce","acc","schemas","isObject","filter","props","schemasResults","genResult","index","flatMap","oneOf","flat","anyOf","generateSchema","result","schemaAnyOf","schemaNonMixed"],"sources":["../../../../src/generation/effSchemGen/schemaGen.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport { type OpenAPIV3_1 as OpenApi } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema } from '../../util/openapi.ts';\n\nimport * as GenSpec from '../generationSpec.ts';\nimport { isObjectSchema, schemaIdFromRef } from '../../analysis/GraphAnalyzer.ts';\nimport { type GenResult, GenResultUtil } from './genUtil.ts';\n\n\nconst id = GenResultUtil.encodeIdentifier;\n\nexport type Context = {\n schemas: Record<string, OpenApiSchema>,\n hooks: GenSpec.GenerationHooks,\n isSchemaIdBefore: (schemaId: OpenApiSchemaId) => boolean,\n};\n\nexport const generateForUnknownSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n return {\n code: `S.Unknown`,\n refs: [],\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForNullSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n return {\n code: `S.Null`,\n refs: [],\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForStringSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n let refs: GenResult['refs'] = [];\n const code = ((): string => {\n if (Array.isArray(schema.enum)) {\n if (!schema.enum.every(value => typeof value === 'string' || typeof value === 'number')) {\n throw new TypeError(`Unknown enum value, expected string array: ${JSON.stringify(schema.enum)}`);\n }\n return dedent`S.Literal(\n ${schema.enum.map((value: string | number) => JSON.stringify(String(value)) + ',').join('\\n')}\n )`;\n }\n \n let baseSchema = `S.String`;\n switch (schema.format) {\n case 'uuid': baseSchema = `S.UUID`; break;\n //case 'date': baseSchema = `S.Date`; // FIXME: validate lack of time component\n case 'date-time': baseSchema = `S.Date`; break;\n // FIXME: using `S.Base64` will result in `Uint8Array` rather than strings, which will break some downstream\n // consumers.\n //case 'byte': baseSchema = `S.Base64`; break;\n }\n \n let pipe: Array<string> = [baseSchema];\n \n // Note: no built-in validator for emails, see https://github.com/effect-ts/effect/tree/main/packages/schema#email\n if (schema.format === 'email') { pipe.push(`S.pattern(/.+@.+/)`); }\n \n if (typeof schema.pattern === 'string') {\n pipe.push(`S.pattern(new RegExp(${JSON.stringify(schema.pattern)}))`);\n }\n \n if (typeof schema.minLength === 'number') { pipe.push(`S.minLength(${schema.minLength})`); }\n if (typeof schema.maxLength === 'number') { pipe.push(`S.maxLength(${schema.maxLength})`); }\n \n // Run hook\n const hookResult = ctx.hooks.generateStringType?.(schema) ?? null;\n if (hookResult !== null) {\n refs = GenResultUtil.combineRefs(refs, hookResult.refs);\n pipe = [hookResult.code];\n }\n \n //if (schema.nullable) { pipe.push(`S.NullOr`); }\n \n return GenResultUtil.generatePipe(pipe);\n })();\n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForNumberSchema = (\n ctx: Context,\n schema: OpenApi.NonArraySchemaObject,\n): GenResult => {\n let refs: GenResult['refs'] = [];\n const code = ((): string => {\n if (Array.isArray(schema.enum)) {\n if (!schema.enum.every(value => typeof value === 'number')) {\n throw new TypeError(`Unknown enum value, expected number array: ${JSON.stringify(schema.enum)}`);\n }\n return dedent`S.Literal(\n ${schema.enum.map((value: number) => JSON.stringify(value) + ',').join('\\n')}\n )`;\n }\n \n let baseSchema = `S.Number`;\n switch (schema.format) {\n //case 'date': baseSchema = `S.Date`; break; // FIXME: validate lack of time component\n case 'date-time': baseSchema = `S.DateFromNumber.pipe(S.validDate())`; break;\n }\n \n let pipe: Array<string> = [baseSchema];\n if (schema.type === 'integer') { pipe.push(`S.int()`); }\n \n // Run hook\n const hookResult = ctx.hooks.generateNumberType?.(schema) ?? null;\n if (hookResult !== null) {\n refs = GenResultUtil.combineRefs(refs, hookResult.refs);\n pipe = [hookResult.code];\n }\n \n if (typeof schema.minimum === 'number') { pipe.push(`S.greaterThanOrEqualTo(${schema.minimum})`); }\n if (typeof schema.maximum === 'number') { pipe.push(`S.lessThanOrEqualTo(${schema.maximum})`); }\n if (typeof schema.exclusiveMinimum === 'number') { pipe.push(`S.greaterThan(${schema.exclusiveMinimum})`); }\n if (typeof schema.exclusiveMaximum === 'number') { pipe.push(`S.lessThan(${schema.exclusiveMaximum})`); }\n //if (schema.nullable) { pipe.push(`S.NullOr`); }\n \n return GenResultUtil.generatePipe(pipe);\n })();\n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForBooleanSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n const code = ((): string => {\n if (Array.isArray(schema.enum)) { throw new Error(`Boolean enum currently not supported`); }\n \n let code = `S.Boolean`;\n //if (schema.nullable) { code = `S.NullOr(${code})`; }\n return code;\n })();\n return {\n code,\n refs: [],\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\n// Format a property name as valid JS identifier, to be used in a JS object literal\nconst propertyNameAsIdentifier = (propertyName: string): string => {\n if (!(/^[a-zA-Z$_][a-zA-Z0-9$_]*$/g.test(propertyName))) {\n return `'${propertyName.replaceAll(/'/g, '\\\\\\'')}'`;\n }\n\n return propertyName;\n};\n\nexport const generateFieldsForObjectSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n const propSchemas: Record<string, OpenApiSchema> = schema.properties ?? {};\n const propsRequired: Set<string> = new Set(schema.required ?? []);\n \n let refs: GenResult['refs'] = [];\n \n const code = Object.entries(propSchemas).map(([propName, propSchema], propIndex) => {\n const propResult = generateForSchema(ctx, propSchema);\n \n // Merge refs\n refs = GenResultUtil.combineRefs(refs, propResult.refs);\n \n const commentsGenerated = GenResultUtil.commentsToCode(propResult.comments);\n let propCode = propResult.code;\n \n // If the prop is optional, mark it as `S.optional()`\n if (!propsRequired.has(propName)) {\n type OptionalParams = { exact?: boolean, default?: string };\n const optionalParams: OptionalParams = {};\n const printOptional = (code: string, optionalParams: OptionalParams): string => {\n if (Object.keys(optionalParams).length === 0) { return `S.optional(${code})`; }\n const paramsFormatted = dedent`{\n ${Object.hasOwn(optionalParams, 'exact') ? `exact: ${optionalParams.exact},` : ''}\n ${Object.hasOwn(optionalParams, 'default') ? `default: ${optionalParams.default}` : ''}\n }`;\n return `S.optionalWith(${code}, ${paramsFormatted})`;\n };\n \n const hasDefault = 'default' in propSchema && typeof propSchema.default !== 'undefined';\n if (hasDefault) {\n if (typeof propSchema.default === 'object' && propSchema.default !== null) {\n // Add parens for object literals when used as arrow function return value\n optionalParams.default = `() => (${JSON.stringify(propSchema.default)})`;\n } else {\n optionalParams.default = `() => ${JSON.stringify(propSchema.default)}`;\n }\n }\n \n if (ctx.hooks.optionalFieldRepresentation === 'nullish') {\n propCode = printOptional(`S.NullOr(${propCode})`, optionalParams);\n } else {\n propCode = printOptional(propCode, optionalParams);\n }\n }\n \n // Handle (custom/hacked in) `x-heading` fields to group certain fields with a heading comment\n const propNeedsSeparator = propIndex > 0 && 'x-heading' in propSchema;\n const propHeading: null | string = 'x-heading' in propSchema ? propSchema['x-heading'] as string : null;\n const propHeadingComment: null | string = propHeading !== null && propHeading.startsWith('//')\n ? propHeading\n : null;\n \n return (propNeedsSeparator ? '\\n\\n' : '') + dedent`\n ${propHeadingComment ?? ''}${commentsGenerated.commentBlock ? `\\n${commentsGenerated.commentBlock}` : ''}\n ${propertyNameAsIdentifier(propName)}: ${propCode}, ${commentsGenerated.commentInline}\n `.trim();\n }).join('\\n');\n \n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\nexport const generateForObjectSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n const propSchemas: Record<string, OpenApiSchema> = schema.properties ?? {};\n \n let refs: GenResult['refs'] = [];\n \n const code = ((): string => {\n let code = '';\n if (Object.keys(propSchemas).length === 0) {\n const additionalPropSchema = schema.additionalProperties;\n if (typeof additionalPropSchema === 'undefined') {\n code = `S.Struct({})`;\n } else if (additionalPropSchema === true) {\n code = `S.Record({ key: S.String, value: S.Unknown() })`;\n } else if (additionalPropSchema === false) {\n code = `S.Record({ key: S.Never, value: S.Never })`;\n } else {\n const additionalPropsResult = generateForSchema(ctx, additionalPropSchema);\n refs = GenResultUtil.combineRefs(refs, additionalPropsResult.refs);\n // TODO: also include the `comments` from `additionalPropsResult`?\n code = `S.Record({ key: S.String, value: ${additionalPropsResult.code} })`;\n }\n } else {\n let indexSignature = '';\n if (typeof schema.additionalProperties !== 'undefined') {\n if (schema.additionalProperties === false) {\n // No equivalent for this on a schema level, requires the consumer to use `onExcessProperty: \"error\"`\n // https://github.com/Effect-TS/effect/tree/main/packages/schema#strict\n } else if (schema.additionalProperties === true) {\n // No equivalent for this on a schema level, requires the consumer to use `onExcessProperty: \"preserve\"`\n // https://github.com/Effect-TS/effect/tree/main/packages/schema#passthrough\n } else {\n const additionalPropsResult = generateForSchema(ctx, schema.additionalProperties);\n refs = GenResultUtil.combineRefs(refs, additionalPropsResult.refs);\n \n // https://github.com/Effect-TS/effect/tree/main/packages/schema#index-signatures\n // TODO: also include the `comments` from `additionalPropsResult`?\n indexSignature = `{ key: S.String, value: ${additionalPropsResult.code} }`;\n }\n }\n \n const fieldsGen = generateFieldsForObjectSchema(ctx, schema);\n refs = GenResultUtil.combineRefs(refs, fieldsGen.refs);\n code = dedent`\n S.Struct({\\n\n ${fieldsGen.code}\n }${indexSignature ? `, ${indexSignature}` : ''})\n `;\n }\n return code;\n })();\n \n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForArraySchema = (ctx: Context, schema: OpenApi.ArraySchemaObject): GenResult => {\n const itemSchema: OpenApiSchema = schema.items;\n const itemResult = generateForSchema(ctx, itemSchema);\n \n const code = ((): string => {\n let code = `S.Array(${itemResult.code})`;\n if (typeof schema.minLength === 'number') { code = `${code}.min(${schema.minLength})`; }\n if (typeof schema.maxLength === 'number') { code = `${code}.max(${schema.maxLength})`; }\n //if (schema.nullable) { code = `S.NullOr(${code})`; }\n return code;\n })();\n \n // FIXME: include the comments for `itemSchema` as well?\n return {\n code,\n refs: itemResult.refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForReferenceObject = (ctx: Context, schema: OpenApi.ReferenceObject): GenResult => {\n // FIXME: make this logic customizable (allow a callback to resolve a `$ref` string to a `Ref` instance?)\n const schemaId = schemaIdFromRef(schema.$ref);\n \n // If the referenced schema ID is topologically after the current one, wrap it in `S.suspend` for lazy eval\n const shouldSuspend = !ctx.isSchemaIdBefore(schemaId);\n const code = shouldSuspend\n ? `S.suspend((): S.Schema<_${id(schemaId)}, _${id(schemaId)}Encoded> => ${id(schemaId)})`\n : id(schemaId);\n \n return { code, refs: [`./${schemaId}.ts`], comments: GenResultUtil.initComments() };\n};\n\n// Generate the @effect/schema code for the given OpenAPI schema\nexport const generateForSchema = (ctx: Context, schema: OpenApiSchema): GenResult => {\n const isNonArraySchemaType = (schema: OpenApiSchema): schema is OpenApi.NonArraySchemaObject => {\n return !('$ref' in schema) && (!('type' in schema) || !Array.isArray(schema.type));\n };\n \n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n return generateForReferenceObject(ctx, schema);\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n return generateForArraySchema(ctx, { items: {}, ...schema } as OpenApi.ArraySchemaObject);\n } else { // Case: OpenApi.NonArraySchemaObject | OpenApi.MixedSchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n const schemasHead: undefined | OpenApiSchema = schema.allOf[0];\n if (schemasHead && schema.allOf.length === 1) { // If only one schema, simply generate that schema\n return generateForSchema(ctx, schemasHead);\n }\n \n // `allOf` supports any type, but `@effect/schema` does not currently support generic intersections. Thus,\n // currently we only support `allOf` if it consists only of object schemas.\n // Idea: merge `allOf` schema first, e.g. using https://github.com/mokkabonna/json-schema-merge-allof\n const areAllObjects: boolean = schema.allOf.reduce(\n (acc, schema) => {\n if ('$ref' in schema) {\n return acc && isObjectSchema(ctx.schemas, schema.$ref);\n }\n \n const isObject = isNonArraySchemaType(schema) && schema.type === 'object';\n return acc && isObject;\n },\n true,\n );\n \n /*\n if (!areAllObjects) {\n throw new Error(dedent`\n Found \\`allOf\\` with a non-object schema. Currently only object schemas or unions of object schemas are\n supported.\n `);\n }\n */\n \n const schemas: Array<OpenApiSchema> = schema.allOf\n // Filter out empty schemas\n // XXX this only makes sense when all schemas are objects, would not work if we supported generic `allOf`\n .filter((schema: OpenApiSchema) => {\n if (!isNonArraySchemaType(schema) || schema.type !== 'object') { return true; }\n \n const props = schema.properties ?? {};\n if (Object.keys(props).length === 0 && !schema.additionalProperties) {\n return false;\n } else {\n return true;\n }\n });\n \n if (typeof schemasHead === 'undefined') {\n // XXX this only works for object schemas, as in `S.extend()`, would not work if we support generic `allOf`\n return generateForObjectSchema(ctx, { type: 'object' }); // Empty `allOf`\n } else if (schemas.length === 1) {\n // Trivial case: only one schema\n return generateForSchema(ctx, schemasHead);\n } else {\n let code = '';\n let schemasResults: Array<GenResult>;\n if (areAllObjects) {\n // Experimental: using `...MySchema.fields` to combine struct schemas.\n // Note: doesn't work if `MySchema` is a union of structs\n \n schemasResults = schemas.map(schema => {\n const genResult = generateForSchema(ctx, schema);\n if ('$ref' in schema) {\n genResult.code = `...${genResult.code}.fields,`;\n } else if (isNonArraySchemaType(schema)) {\n genResult.code = generateFieldsForObjectSchema(ctx, schema).code;\n }\n return genResult;\n });\n \n code = dedent`\n S.Struct({\n ${schemasResults\n .map(({ code, comments }, index) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${commentsGenerated.commentInline}\n ${code}\n `.trim();\n })\n .join('\\n')\n }\n })\n `;\n } else {\n schemasResults = schemas.map(schema => generateForSchema(ctx, schema));\n \n // Note: `extend` doesn't quite cover the semantics of `allOf`, since it only accepts objects and\n // assumes distinct types. However, @effect/schema has no generic built-in mechanism for this.\n code = dedent`\n pipe(\n ${schemasResults\n .map(({ code, comments }, index) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${index > 0 ? `S.extend(${code})` : code}, ${commentsGenerated.commentInline}\n `.trim();\n })\n .join('\\n')\n }\n )\n `;\n }\n \n return {\n code,\n refs: GenResultUtil.combineRefs(schemasResults.flatMap(({ refs }) => refs)),\n comments: GenResultUtil.initComments(),\n };\n }\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n const schemas: Array<OpenApiSchema> = schema.oneOf;\n const schemasHead: undefined | OpenApiSchema = schemas[0];\n if (typeof schemasHead === 'undefined') {\n throw new TypeError(`oneOf must have at least one schema`);\n } else if (schemas.length === 1) {\n // Trivial case: only one schema\n return generateForSchema(ctx, schemasHead);\n } else {\n const schemasResults: Array<GenResult> = schemas.map(schema => generateForSchema(ctx, schema));\n // Note: `union` doesn't quite cover the semantics of `oneOf`, since `oneOf` must guarantee that exactly\n // one schema matches. However, @effect/schema has no easy built-in mechanism for this.\n const code = dedent`\n S.Union(\n ${schemasResults\n .map(({ code, comments }) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${code}, ${commentsGenerated.commentInline}\n `.trim();\n })\n .join('\\n')\n }\n )\n `;\n return {\n code,\n refs: GenResultUtil.combineRefs(schemasResults.map(({ refs }) => refs).flat()),\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n }\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n const schemas: Array<OpenApiSchema> = schema.anyOf;\n const schemasHead: undefined | OpenApiSchema = schemas[0];\n if (typeof schemasHead === 'undefined') {\n throw new TypeError(`anyOf must have at least one schema`);\n } else if (schemas.length === 1) {\n // Trivial case: only one schema\n return generateForSchema(ctx, schemasHead);\n } else {\n const schemasResults: Array<GenResult> = schemas.map(schema => generateForSchema(ctx, schema));\n const code = dedent`\n S.Union(\n ${schemasResults\n .map(({ code, comments }) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${code}, ${commentsGenerated.commentInline}\n `.trim();\n })\n .join('\\n')\n }\n )\n `;\n return {\n code,\n refs: GenResultUtil.combineRefs(schemasResults.map(({ refs }) => refs).flat()),\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n }\n }\n \n type SchemaType = 'array' | OpenApi.NonArraySchemaObjectType;\n const type: undefined | OpenApi.NonArraySchemaObjectType | Array<SchemaType> = schema.type;\n \n const hookResult: null | GenResult = ctx.hooks.generateSchema?.(schema) ?? null;\n \n let result: GenResult;\n if (hookResult !== null) {\n result = hookResult;\n } else {\n if (typeof type === 'undefined') {\n result = generateForUnknownSchema(ctx, schema as OpenApi.NonArraySchemaObject); // Any type\n } else if (Array.isArray(type)) {\n // `type` as an array is equivalent to `anyOf` with `type` set to the individual type string\n const schemaAnyOf = { anyOf: type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n result = generateForSchema(ctx, schemaAnyOf);\n } else {\n const schemaNonMixed = schema as OpenApi.NonArraySchemaObject;\n switch (type) {\n case 'null': result = generateForNullSchema(ctx, schemaNonMixed); break;\n case 'string': result = generateForStringSchema(ctx, schemaNonMixed); break;\n case 'number': result = generateForNumberSchema(ctx, schemaNonMixed); break;\n case 'integer': result = generateForNumberSchema(ctx, schemaNonMixed); break;\n case 'boolean': result = generateForBooleanSchema(ctx, schemaNonMixed); break;\n case 'object': result = generateForObjectSchema(ctx, schemaNonMixed); break;\n default: throw new TypeError(`Unsupported type \"${type}\"`);\n }\n }\n }\n return {\n ...result,\n code: `${result.code}`,\n };\n }\n }\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,QAAQ,WAAW;AAKlC,SAASC,cAAc,EAAEC,eAAe,QAAQ,kCAAiC;AACjF,SAAyBC,aAAa,QAAQ,eAAc;AAG5D,MAAMC,EAAE,GAAGD,aAAa,CAACE,gBAAgB;AAQzC,OAAO,MAAMC,wBAAwB,GAAGA,CAACC,GAAY,EAAEC,MAAoC,KAAgB;EACzG,OAAO;IACLC,IAAI,EAAE,WAAW;IACjBC,IAAI,EAAE,EAAE;IACRC,QAAQ,EAAER,aAAa,CAACS,wBAAwB,CAACJ,MAAM;EACzD,CAAC;AACH,CAAC;AAED,OAAO,MAAMK,qBAAqB,GAAGA,CAACN,GAAY,EAAEC,MAAoC,KAAgB;EACtG,OAAO;IACLC,IAAI,EAAE,QAAQ;IACdC,IAAI,EAAE,EAAE;IACRC,QAAQ,EAAER,aAAa,CAACS,wBAAwB,CAACJ,MAAM;EACzD,CAAC;AACH,CAAC;AAED,OAAO,MAAMM,uBAAuB,GAAGA,CAACP,GAAY,EAAEC,MAAoC,KAAgB;EACxG,IAAIE,IAAuB,GAAG,EAAE;EAChC,MAAMD,IAAI,GAAG,CAAC,MAAc;IAC1B,IAAIM,KAAK,CAACC,OAAO,CAACR,MAAM,CAACS,IAAI,CAAC,EAAE;MAC9B,IAAI,CAACT,MAAM,CAACS,IAAI,CAACC,KAAK,CAACC,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,OAAOA,KAAK,KAAK,QAAQ,CAAC,EAAE;QACvF,MAAM,IAAIC,SAAS,CAAC,8CAA8CC,IAAI,CAACC,SAAS,CAACd,MAAM,CAACS,IAAI,CAAC,EAAE,CAAC;MAClG;MACA,OAAOjB,MAAM;AACnB,UAAUQ,MAAM,CAACS,IAAI,CAACM,GAAG,CAAEJ,KAAsB,IAAKE,IAAI,CAACC,SAAS,CAACE,MAAM,CAACL,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAACM,IAAI,CAAC,IAAI,CAAC;AACrG,QAAQ;IACJ;IAEA,IAAIC,UAAU,GAAG,UAAU;IAC3B,QAAQlB,MAAM,CAACmB,MAAM;MACnB,KAAK,MAAM;QAAED,UAAU,GAAG,QAAQ;QAAE;MACpC;MACA,KAAK,WAAW;QAAEA,UAAU,GAAG,QAAQ;QAAE;MACzC;MACA;MACA;IACF;IAEA,IAAIE,IAAmB,GAAG,CAACF,UAAU,CAAC;;IAEtC;IACA,IAAIlB,MAAM,CAACmB,MAAM,KAAK,OAAO,EAAE;MAAEC,IAAI,CAACC,IAAI,CAAC,oBAAoB,CAAC;IAAE;IAElE,IAAI,OAAOrB,MAAM,CAACsB,OAAO,KAAK,QAAQ,EAAE;MACtCF,IAAI,CAACC,IAAI,CAAC,wBAAwBR,IAAI,CAACC,SAAS,CAACd,MAAM,CAACsB,OAAO,CAAC,IAAI,CAAC;IACvE;IAEA,IAAI,OAAOtB,MAAM,CAACuB,SAAS,KAAK,QAAQ,EAAE;MAAEH,IAAI,CAACC,IAAI,CAAC,eAAerB,MAAM,CAACuB,SAAS,GAAG,CAAC;IAAE;IAC3F,IAAI,OAAOvB,MAAM,CAACwB,SAAS,KAAK,QAAQ,EAAE;MAAEJ,IAAI,CAACC,IAAI,CAAC,eAAerB,MAAM,CAACwB,SAAS,GAAG,CAAC;IAAE;;IAE3F;IACA,MAAMC,UAAU,GAAG1B,GAAG,CAAC2B,KAAK,CAACC,kBAAkB,GAAG3B,MAAM,CAAC,IAAI,IAAI;IACjE,IAAIyB,UAAU,KAAK,IAAI,EAAE;MACvBvB,IAAI,GAAGP,aAAa,CAACiC,WAAW,CAAC1B,IAAI,EAAEuB,UAAU,CAACvB,IAAI,CAAC;MACvDkB,IAAI,GAAG,CAACK,UAAU,CAACxB,IAAI,CAAC;IAC1B;;IAEA;;IAEA,OAAON,aAAa,CAACkC,YAAY,CAACT,IAAI,CAAC;EACzC,CAAC,EAAE,CAAC;EACJ,OAAO;IACLnB,IAAI;IACJC,IAAI;IACJC,QAAQ,EAAER,aAAa,CAACS,wBAAwB,CAACJ,MAAM;EACzD,CAAC;AACH,CAAC;AAED,OAAO,MAAM8B,uBAAuB,GAAGA,CACrC/B,GAAY,EACZC,MAAoC,KACtB;EACd,IAAIE,IAAuB,GAAG,EAAE;EAChC,MAAMD,IAAI,GAAG,CAAC,MAAc;IAC1B,IAAIM,KAAK,CAACC,OAAO,CAACR,MAAM,CAACS,IAAI,CAAC,EAAE;MAC9B,IAAI,CAACT,MAAM,CAACS,IAAI,CAACC,KAAK,CAACC,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,CAAC,EAAE;QAC1D,MAAM,IAAIC,SAAS,CAAC,8CAA8CC,IAAI,CAACC,SAAS,CAACd,MAAM,CAACS,IAAI,CAAC,EAAE,CAAC;MAClG;MACA,OAAOjB,MAAM;AACnB,UAAUQ,MAAM,CAACS,IAAI,CAACM,GAAG,CAAEJ,KAAa,IAAKE,IAAI,CAACC,SAAS,CAACH,KAAK,CAAC,GAAG,GAAG,CAAC,CAACM,IAAI,CAAC,IAAI,CAAC;AACpF,QAAQ;IACJ;IAEA,IAAIC,UAAU,GAAG,UAAU;IAC3B,QAAQlB,MAAM,CAACmB,MAAM;MACnB;MACA,KAAK,WAAW;QAAED,UAAU,GAAG,sCAAsC;QAAE;IACzE;IAEA,IAAIE,IAAmB,GAAG,CAACF,UAAU,CAAC;IACtC,IAAIlB,MAAM,CAAC+B,IAAI,KAAK,SAAS,EAAE;MAAEX,IAAI,CAACC,IAAI,CAAC,SAAS,CAAC;IAAE;;IAEvD;IACA,MAAMI,UAAU,GAAG1B,GAAG,CAAC2B,KAAK,CAACM,kBAAkB,GAAGhC,MAAM,CAAC,IAAI,IAAI;IACjE,IAAIyB,UAAU,KAAK,IAAI,EAAE;MACvBvB,IAAI,GAAGP,aAAa,CAACiC,WAAW,CAAC1B,IAAI,EAAEuB,UAAU,CAACvB,IAAI,CAAC;MACvDkB,IAAI,GAAG,CAACK,UAAU,CAACxB,IAAI,CAAC;IAC1B;IAEA,IAAI,OAAOD,MAAM,CAACiC,OAAO,KAAK,QAAQ,EAAE;MAAEb,IAAI,CAACC,IAAI,CAAC,0BAA0BrB,MAAM,CAACiC,OAAO,GAAG,CAAC;IAAE;IAClG,IAAI,OAAOjC,MAAM,CAACkC,OAAO,KAAK,QAAQ,EAAE;MAAEd,IAAI,CAACC,IAAI,CAAC,uBAAuBrB,MAAM,CAACkC,OAAO,GAAG,CAAC;IAAE;IAC/F,IAAI,OAAOlC,MAAM,CAACmC,gBAAgB,KAAK,QAAQ,EAAE;MAAEf,IAAI,CAACC,IAAI,CAAC,iBAAiBrB,MAAM,CAACmC,gBAAgB,GAAG,CAAC;IAAE;IAC3G,IAAI,OAAOnC,MAAM,CAACoC,gBAAgB,KAAK,QAAQ,EAAE;MAAEhB,IAAI,CAACC,IAAI,CAAC,cAAcrB,MAAM,CAACoC,gBAAgB,GAAG,CAAC;IAAE;IACxG;;IAEA,OAAOzC,aAAa,CAACkC,YAAY,CAACT,IAAI,CAAC;EACzC,CAAC,EAAE,CAAC;EACJ,OAAO;IACLnB,IAAI;IACJC,IAAI;IACJC,QAAQ,EAAER,aAAa,CAACS,wBAAwB,CAACJ,MAAM;EACzD,CAAC;AACH,CAAC;AAED,OAAO,MAAMqC,wBAAwB,GAAGA,CAACtC,GAAY,EAAEC,MAAoC,KAAgB;EACzG,MAAMC,IAAI,GAAG,CAAC,MAAc;IAC1B,IAAIM,KAAK,CAACC,OAAO,CAACR,MAAM,CAACS,IAAI,CAAC,EAAE;MAAE,MAAM,IAAI6B,KAAK,CAAC,sCAAsC,CAAC;IAAE;IAE3F,IAAIrC,IAAI,GAAG,WAAW;IACtB;IACA,OAAOA,IAAI;EACb,CAAC,EAAE,CAAC;EACJ,OAAO;IACLA,IAAI;IACJC,IAAI,EAAE,EAAE;IACRC,QAAQ,EAAER,aAAa,CAACS,wBAAwB,CAACJ,MAAM;EACzD,CAAC;AACH,CAAC;;AAED;AACA,MAAMuC,wBAAwB,GAAIC,YAAoB,IAAa;EACjE,IAAI,CAAE,6BAA6B,CAACC,IAAI,CAACD,YAAY,CAAE,EAAE;IACvD,OAAO,IAAIA,YAAY,CAACE,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG;EACrD;EAEA,OAAOF,YAAY;AACrB,CAAC;AAED,OAAO,MAAMG,6BAA6B,GAAGA,CAAC5C,GAAY,EAAEC,MAAoC,KAAgB;EAC9G,MAAM4C,WAA0C,GAAG5C,MAAM,CAAC6C,UAAU,IAAI,CAAC,CAAC;EAC1E,MAAMC,aAA0B,GAAG,IAAIC,GAAG,CAAC/C,MAAM,CAACgD,QAAQ,IAAI,EAAE,CAAC;EAEjE,IAAI9C,IAAuB,GAAG,EAAE;EAEhC,MAAMD,IAAI,GAAGgD,MAAM,CAACC,OAAO,CAACN,WAAW,CAAC,CAAC7B,GAAG,CAAC,CAAC,CAACoC,QAAQ,EAAEC,UAAU,CAAC,EAAEC,SAAS,KAAK;IAClF,MAAMC,UAAU,GAAGC,iBAAiB,CAACxD,GAAG,EAAEqD,UAAU,CAAC;;IAErD;IACAlD,IAAI,GAAGP,aAAa,CAACiC,WAAW,CAAC1B,IAAI,EAAEoD,UAAU,CAACpD,IAAI,CAAC;IAEvD,MAAMsD,iBAAiB,GAAG7D,aAAa,CAAC8D,cAAc,CAACH,UAAU,CAACnD,QAAQ,CAAC;IAC3E,IAAIuD,QAAQ,GAAGJ,UAAU,CAACrD,IAAI;;IAE9B;IACA,IAAI,CAAC6C,aAAa,CAACa,GAAG,CAACR,QAAQ,CAAC,EAAE;MAEhC,MAAMS,cAA8B,GAAG,CAAC,CAAC;MACzC,MAAMC,aAAa,GAAGA,CAAC5D,IAAY,EAAE2D,cAA8B,KAAa;QAC9E,IAAIX,MAAM,CAACa,IAAI,CAACF,cAAc,CAAC,CAACG,MAAM,KAAK,CAAC,EAAE;UAAE,OAAO,cAAc9D,IAAI,GAAG;QAAE;QAC9E,MAAM+D,eAAe,GAAGxE,MAAM;AACtC,YAAYyD,MAAM,CAACgB,MAAM,CAACL,cAAc,EAAE,OAAO,CAAC,GAAG,UAAUA,cAAc,CAACM,KAAK,GAAG,GAAG,EAAE;AAC3F,YAAYjB,MAAM,CAACgB,MAAM,CAACL,cAAc,EAAE,SAAS,CAAC,GAAG,YAAYA,cAAc,CAACO,OAAO,EAAE,GAAG,EAAE;AAChG,UAAU;QACF,OAAO,kBAAkBlE,IAAI,KAAK+D,eAAe,GAAG;MACtD,CAAC;MAED,MAAMI,UAAU,GAAG,SAAS,IAAIhB,UAAU,IAAI,OAAOA,UAAU,CAACe,OAAO,KAAK,WAAW;MACvF,IAAIC,UAAU,EAAE;QACd,IAAI,OAAOhB,UAAU,CAACe,OAAO,KAAK,QAAQ,IAAIf,UAAU,CAACe,OAAO,KAAK,IAAI,EAAE;UACzE;UACAP,cAAc,CAACO,OAAO,GAAG,UAAUtD,IAAI,CAACC,SAAS,CAACsC,UAAU,CAACe,OAAO,CAAC,GAAG;QAC1E,CAAC,MAAM;UACLP,cAAc,CAACO,OAAO,GAAG,SAAStD,IAAI,CAACC,SAAS,CAACsC,UAAU,CAACe,OAAO,CAAC,EAAE;QACxE;MACF;MAEA,IAAIpE,GAAG,CAAC2B,KAAK,CAAC2C,2BAA2B,KAAK,SAAS,EAAE;QACvDX,QAAQ,GAAGG,aAAa,CAAC,YAAYH,QAAQ,GAAG,EAAEE,cAAc,CAAC;MACnE,CAAC,MAAM;QACLF,QAAQ,GAAGG,aAAa,CAACH,QAAQ,EAAEE,cAAc,CAAC;MACpD;IACF;;IAEA;IACA,MAAMU,kBAAkB,GAAGjB,SAAS,GAAG,CAAC,IAAI,WAAW,IAAID,UAAU;IACrE,MAAMmB,WAA0B,GAAG,WAAW,IAAInB,UAAU,GAAGA,UAAU,CAAC,WAAW,CAAC,GAAa,IAAI;IACvG,MAAMoB,kBAAiC,GAAGD,WAAW,KAAK,IAAI,IAAIA,WAAW,CAACE,UAAU,CAAC,IAAI,CAAC,GAC1FF,WAAW,GACX,IAAI;IAER,OAAO,CAACD,kBAAkB,GAAG,MAAM,GAAG,EAAE,IAAI9E,MAAM;AACtD,QAAQgF,kBAAkB,IAAI,EAAE,GAAGhB,iBAAiB,CAACkB,YAAY,GAAG,KAAKlB,iBAAiB,CAACkB,YAAY,EAAE,GAAG,EAAE;AAC9G,QAAQnC,wBAAwB,CAACY,QAAQ,CAAC,KAAKO,QAAQ,KAAKF,iBAAiB,CAACmB,aAAa;AAC3F,KAAK,CAACC,IAAI,CAAC,CAAC;EACV,CAAC,CAAC,CAAC3D,IAAI,CAAC,IAAI,CAAC;EAEb,OAAO;IACLhB,IAAI;IACJC,IAAI;IACJC,QAAQ,EAAER,aAAa,CAACS,wBAAwB,CAACJ,MAAM;EACzD,CAAC;AACH,CAAC;AACD,OAAO,MAAM6E,uBAAuB,GAAGA,CAAC9E,GAAY,EAAEC,MAAoC,KAAgB;EACxG,MAAM4C,WAA0C,GAAG5C,MAAM,CAAC6C,UAAU,IAAI,CAAC,CAAC;EAE1E,IAAI3C,IAAuB,GAAG,EAAE;EAEhC,MAAMD,IAAI,GAAG,CAAC,MAAc;IAC1B,IAAIA,IAAI,GAAG,EAAE;IACb,IAAIgD,MAAM,CAACa,IAAI,CAAClB,WAAW,CAAC,CAACmB,MAAM,KAAK,CAAC,EAAE;MACzC,MAAMe,oBAAoB,GAAG9E,MAAM,CAAC+E,oBAAoB;MACxD,IAAI,OAAOD,oBAAoB,KAAK,WAAW,EAAE;QAC/C7E,IAAI,GAAG,cAAc;MACvB,CAAC,MAAM,IAAI6E,oBAAoB,KAAK,IAAI,EAAE;QACxC7E,IAAI,GAAG,iDAAiD;MAC1D,CAAC,MAAM,IAAI6E,oBAAoB,KAAK,KAAK,EAAE;QACzC7E,IAAI,GAAG,4CAA4C;MACrD,CAAC,MAAM;QACL,MAAM+E,qBAAqB,GAAGzB,iBAAiB,CAACxD,GAAG,EAAE+E,oBAAoB,CAAC;QAC1E5E,IAAI,GAAGP,aAAa,CAACiC,WAAW,CAAC1B,IAAI,EAAE8E,qBAAqB,CAAC9E,IAAI,CAAC;QAClE;QACAD,IAAI,GAAG,oCAAoC+E,qBAAqB,CAAC/E,IAAI,KAAK;MAC5E;IACF,CAAC,MAAM;MACL,IAAIgF,cAAc,GAAG,EAAE;MACvB,IAAI,OAAOjF,MAAM,CAAC+E,oBAAoB,KAAK,WAAW,EAAE;QACtD,IAAI/E,MAAM,CAAC+E,oBAAoB,KAAK,KAAK,EAAE;UACzC;UACA;QAAA,CACD,MAAM,IAAI/E,MAAM,CAAC+E,oBAAoB,KAAK,IAAI,EAAE;UAC/C;UACA;QAAA,CACD,MAAM;UACL,MAAMC,qBAAqB,GAAGzB,iBAAiB,CAACxD,GAAG,EAAEC,MAAM,CAAC+E,oBAAoB,CAAC;UACjF7E,IAAI,GAAGP,aAAa,CAACiC,WAAW,CAAC1B,IAAI,EAAE8E,qBAAqB,CAAC9E,IAAI,CAAC;;UAElE;UACA;UACA+E,cAAc,GAAG,2BAA2BD,qBAAqB,CAAC/E,IAAI,IAAI;QAC5E;MACF;MAEA,MAAMiF,SAAS,GAAGvC,6BAA6B,CAAC5C,GAAG,EAAEC,MAAM,CAAC;MAC5DE,IAAI,GAAGP,aAAa,CAACiC,WAAW,CAAC1B,IAAI,EAAEgF,SAAS,CAAChF,IAAI,CAAC;MACtDD,IAAI,GAAGT,MAAM;AACnB;AACA,YAAY0F,SAAS,CAACjF,IAAI;AAC1B,WAAWgF,cAAc,GAAG,KAAKA,cAAc,EAAE,GAAG,EAAE;AACtD,OAAO;IACH;IACA,OAAOhF,IAAI;EACb,CAAC,EAAE,CAAC;EAEJ,OAAO;IACLA,IAAI;IACJC,IAAI;IACJC,QAAQ,EAAER,aAAa,CAACS,wBAAwB,CAACJ,MAAM;EACzD,CAAC;AACH,CAAC;AAED,OAAO,MAAMmF,sBAAsB,GAAGA,CAACpF,GAAY,EAAEC,MAAiC,KAAgB;EACpG,MAAMoF,UAAyB,GAAGpF,MAAM,CAACqF,KAAK;EAC9C,MAAMC,UAAU,GAAG/B,iBAAiB,CAACxD,GAAG,EAAEqF,UAAU,CAAC;EAErD,MAAMnF,IAAI,GAAG,CAAC,MAAc;IAC1B,IAAIA,IAAI,GAAG,WAAWqF,UAAU,CAACrF,IAAI,GAAG;IACxC,IAAI,OAAOD,MAAM,CAACuB,SAAS,KAAK,QAAQ,EAAE;MAAEtB,IAAI,GAAG,GAAGA,IAAI,QAAQD,MAAM,CAACuB,SAAS,GAAG;IAAE;IACvF,IAAI,OAAOvB,MAAM,CAACwB,SAAS,KAAK,QAAQ,EAAE;MAAEvB,IAAI,GAAG,GAAGA,IAAI,QAAQD,MAAM,CAACwB,SAAS,GAAG;IAAE;IACvF;IACA,OAAOvB,IAAI;EACb,CAAC,EAAE,CAAC;;EAEJ;EACA,OAAO;IACLA,IAAI;IACJC,IAAI,EAAEoF,UAAU,CAACpF,IAAI;IACrBC,QAAQ,EAAER,aAAa,CAACS,wBAAwB,CAACJ,MAAM;EACzD,CAAC;AACH,CAAC;AAED,OAAO,MAAMuF,0BAA0B,GAAGA,CAACxF,GAAY,EAAEC,MAA+B,KAAgB;EACtG;EACA,MAAMwF,QAAQ,GAAG9F,eAAe,CAACM,MAAM,CAACyF,IAAI,CAAC;;EAE7C;EACA,MAAMC,aAAa,GAAG,CAAC3F,GAAG,CAAC4F,gBAAgB,CAACH,QAAQ,CAAC;EACrD,MAAMvF,IAAI,GAAGyF,aAAa,GACtB,2BAA2B9F,EAAE,CAAC4F,QAAQ,CAAC,MAAM5F,EAAE,CAAC4F,QAAQ,CAAC,eAAe5F,EAAE,CAAC4F,QAAQ,CAAC,GAAG,GACvF5F,EAAE,CAAC4F,QAAQ,CAAC;EAEhB,OAAO;IAAEvF,IAAI;IAAEC,IAAI,EAAE,CAAC,KAAKsF,QAAQ,KAAK,CAAC;IAAErF,QAAQ,EAAER,aAAa,CAACiG,YAAY,CAAC;EAAE,CAAC;AACrF,CAAC;;AAED;AACA,OAAO,MAAMrC,iBAAiB,GAAGA,CAACxD,GAAY,EAAEC,MAAqB,KAAgB;EACnF,MAAM6F,oBAAoB,GAAI7F,MAAqB,IAA6C;IAC9F,OAAO,EAAE,MAAM,IAAIA,MAAM,CAAC,KAAK,EAAE,MAAM,IAAIA,MAAM,CAAC,IAAI,CAACO,KAAK,CAACC,OAAO,CAACR,MAAM,CAAC+B,IAAI,CAAC,CAAC;EACpF,CAAC;EAED,IAAI,MAAM,IAAI/B,MAAM,EAAE;IAAE;IACtB,OAAOuF,0BAA0B,CAACxF,GAAG,EAAEC,MAAM,CAAC;EAChD,CAAC,MAAM;IAAE;IACP,IAAIA,MAAM,CAAC+B,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI/B,MAAM,EAAE;MAAE;MAClD,OAAOmF,sBAAsB,CAACpF,GAAG,EAAE;QAAEsF,KAAK,EAAE,CAAC,CAAC;QAAE,GAAGrF;MAAO,CAA8B,CAAC;IAC3F,CAAC,MAAM;MAAE;MACP,IAAI,OAAO,IAAIA,MAAM,IAAI,OAAOA,MAAM,CAAC8F,KAAK,KAAK,WAAW,EAAE;QAC5D,MAAMC,WAAsC,GAAG/F,MAAM,CAAC8F,KAAK,CAAC,CAAC,CAAC;QAC9D,IAAIC,WAAW,IAAI/F,MAAM,CAAC8F,KAAK,CAAC/B,MAAM,KAAK,CAAC,EAAE;UAAE;UAC9C,OAAOR,iBAAiB,CAACxD,GAAG,EAAEgG,WAAW,CAAC;QAC5C;;QAEA;QACA;QACA;QACA,MAAMC,aAAsB,GAAGhG,MAAM,CAAC8F,KAAK,CAACG,MAAM,CAChD,CAACC,GAAG,EAAElG,MAAM,KAAK;UACf,IAAI,MAAM,IAAIA,MAAM,EAAE;YACpB,OAAOkG,GAAG,IAAIzG,cAAc,CAACM,GAAG,CAACoG,OAAO,EAAEnG,MAAM,CAACyF,IAAI,CAAC;UACxD;UAEA,MAAMW,QAAQ,GAAGP,oBAAoB,CAAC7F,MAAM,CAAC,IAAIA,MAAM,CAAC+B,IAAI,KAAK,QAAQ;UACzE,OAAOmE,GAAG,IAAIE,QAAQ;QACxB,CAAC,EACD,IACF,CAAC;;QAED;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;QAEQ,MAAMD,OAA6B,GAAGnG,MAAM,CAAC8F;QAC3C;QACA;QAAA,CACCO,MAAM,CAAErG,MAAqB,IAAK;UACjC,IAAI,CAAC6F,oBAAoB,CAAC7F,MAAM,CAAC,IAAIA,MAAM,CAAC+B,IAAI,KAAK,QAAQ,EAAE;YAAE,OAAO,IAAI;UAAE;UAE9E,MAAMuE,KAAK,GAAGtG,MAAM,CAAC6C,UAAU,IAAI,CAAC,CAAC;UACrC,IAAII,MAAM,CAACa,IAAI,CAACwC,KAAK,CAAC,CAACvC,MAAM,KAAK,CAAC,IAAI,CAAC/D,MAAM,CAAC+E,oBAAoB,EAAE;YACnE,OAAO,KAAK;UACd,CAAC,MAAM;YACL,OAAO,IAAI;UACb;QACF,CAAC,CAAC;QAEJ,IAAI,OAAOgB,WAAW,KAAK,WAAW,EAAE;UACtC;UACA,OAAOlB,uBAAuB,CAAC9E,GAAG,EAAE;YAAEgC,IAAI,EAAE;UAAS,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC,MAAM,IAAIoE,OAAO,CAACpC,MAAM,KAAK,CAAC,EAAE;UAC/B;UACA,OAAOR,iBAAiB,CAACxD,GAAG,EAAEgG,WAAW,CAAC;QAC5C,CAAC,MAAM;UACL,IAAI9F,IAAI,GAAG,EAAE;UACb,IAAIsG,cAAgC;UACpC,IAAIP,aAAa,EAAE;YACjB;YACA;;YAEAO,cAAc,GAAGJ,OAAO,CAACpF,GAAG,CAACf,MAAM,IAAI;cACrC,MAAMwG,SAAS,GAAGjD,iBAAiB,CAACxD,GAAG,EAAEC,MAAM,CAAC;cAChD,IAAI,MAAM,IAAIA,MAAM,EAAE;gBACpBwG,SAAS,CAACvG,IAAI,GAAG,MAAMuG,SAAS,CAACvG,IAAI,UAAU;cACjD,CAAC,MAAM,IAAI4F,oBAAoB,CAAC7F,MAAM,CAAC,EAAE;gBACvCwG,SAAS,CAACvG,IAAI,GAAG0C,6BAA6B,CAAC5C,GAAG,EAAEC,MAAM,CAAC,CAACC,IAAI;cAClE;cACA,OAAOuG,SAAS;YAClB,CAAC,CAAC;YAEFvG,IAAI,GAAGT,MAAM;AACzB;AACA,kBAAkB+G,cAAc,CACbxF,GAAG,CAAC,CAAC;cAAEd,IAAI;cAAEE;YAAS,CAAC,EAAEsG,KAAK,KAAK;cAClC,MAAMjD,iBAAiB,GAAG7D,aAAa,CAAC8D,cAAc,CAACtD,QAAQ,CAAC;cAChE,OAAOX,MAAM;AACjC,wBAAwBgE,iBAAiB,CAACkB,YAAY;AACtD,wBAAwBlB,iBAAiB,CAACmB,aAAa;AACvD,wBAAwB1E,IAAI;AAC5B,qBAAqB,CAAC2E,IAAI,CAAC,CAAC;YACV,CAAC,CAAC,CACD3D,IAAI,CAAC,IAAI,CAAC;AAC7B;AACA,aACa;UACH,CAAC,MAAM;YACLsF,cAAc,GAAGJ,OAAO,CAACpF,GAAG,CAACf,MAAM,IAAIuD,iBAAiB,CAACxD,GAAG,EAAEC,MAAM,CAAC,CAAC;;YAEtE;YACA;YACAC,IAAI,GAAGT,MAAM;AACzB;AACA,kBAAkB+G,cAAc,CACbxF,GAAG,CAAC,CAAC;cAAEd,IAAI;cAAEE;YAAS,CAAC,EAAEsG,KAAK,KAAK;cAClC,MAAMjD,iBAAiB,GAAG7D,aAAa,CAAC8D,cAAc,CAACtD,QAAQ,CAAC;cAChE,OAAOX,MAAM;AACjC,wBAAwBgE,iBAAiB,CAACkB,YAAY;AACtD,wBAAwB+B,KAAK,GAAG,CAAC,GAAG,YAAYxG,IAAI,GAAG,GAAGA,IAAI,KAAKuD,iBAAiB,CAACmB,aAAa;AAClG,qBAAqB,CAACC,IAAI,CAAC,CAAC;YACV,CAAC,CAAC,CACD3D,IAAI,CAAC,IAAI,CAAC;AAC7B;AACA,aACa;UACH;UAEA,OAAO;YACLhB,IAAI;YACJC,IAAI,EAAEP,aAAa,CAACiC,WAAW,CAAC2E,cAAc,CAACG,OAAO,CAAC,CAAC;cAAExG;YAAK,CAAC,KAAKA,IAAI,CAAC,CAAC;YAC3EC,QAAQ,EAAER,aAAa,CAACiG,YAAY,CAAC;UACvC,CAAC;QACH;MACF,CAAC,MAAM,IAAI,OAAO,IAAI5F,MAAM,IAAI,OAAOA,MAAM,CAAC2G,KAAK,KAAK,WAAW,EAAE;QACnE,MAAMR,OAA6B,GAAGnG,MAAM,CAAC2G,KAAK;QAClD,MAAMZ,WAAsC,GAAGI,OAAO,CAAC,CAAC,CAAC;QACzD,IAAI,OAAOJ,WAAW,KAAK,WAAW,EAAE;UACtC,MAAM,IAAInF,SAAS,CAAC,qCAAqC,CAAC;QAC5D,CAAC,MAAM,IAAIuF,OAAO,CAACpC,MAAM,KAAK,CAAC,EAAE;UAC/B;UACA,OAAOR,iBAAiB,CAACxD,GAAG,EAAEgG,WAAW,CAAC;QAC5C,CAAC,MAAM;UACL,MAAMQ,cAAgC,GAAGJ,OAAO,CAACpF,GAAG,CAACf,MAAM,IAAIuD,iBAAiB,CAACxD,GAAG,EAAEC,MAAM,CAAC,CAAC;UAC9F;UACA;UACA,MAAMC,IAAI,GAAGT,MAAM;AAC7B;AACA,gBAAgB+G,cAAc,CACbxF,GAAG,CAAC,CAAC;YAAEd,IAAI;YAAEE;UAAS,CAAC,KAAK;YAC3B,MAAMqD,iBAAiB,GAAG7D,aAAa,CAAC8D,cAAc,CAACtD,QAAQ,CAAC;YAChE,OAAOX,MAAM;AAC/B,sBAAsBgE,iBAAiB,CAACkB,YAAY;AACpD,sBAAsBzE,IAAI,KAAKuD,iBAAiB,CAACmB,aAAa;AAC9D,mBAAmB,CAACC,IAAI,CAAC,CAAC;UACV,CAAC,CAAC,CACD3D,IAAI,CAAC,IAAI,CAAC;AAC3B;AACA,WACW;UACD,OAAO;YACLhB,IAAI;YACJC,IAAI,EAAEP,aAAa,CAACiC,WAAW,CAAC2E,cAAc,CAACxF,GAAG,CAAC,CAAC;cAAEb;YAAK,CAAC,KAAKA,IAAI,CAAC,CAAC0G,IAAI,CAAC,CAAC,CAAC;YAC9EzG,QAAQ,EAAER,aAAa,CAACS,wBAAwB,CAACJ,MAAM;UACzD,CAAC;QACH;MACF,CAAC,MAAM,IAAI,OAAO,IAAIA,MAAM,IAAI,OAAOA,MAAM,CAAC6G,KAAK,KAAK,WAAW,EAAE;QACnE,MAAMV,OAA6B,GAAGnG,MAAM,CAAC6G,KAAK;QAClD,MAAMd,WAAsC,GAAGI,OAAO,CAAC,CAAC,CAAC;QACzD,IAAI,OAAOJ,WAAW,KAAK,WAAW,EAAE;UACtC,MAAM,IAAInF,SAAS,CAAC,qCAAqC,CAAC;QAC5D,CAAC,MAAM,IAAIuF,OAAO,CAACpC,MAAM,KAAK,CAAC,EAAE;UAC/B;UACA,OAAOR,iBAAiB,CAACxD,GAAG,EAAEgG,WAAW,CAAC;QAC5C,CAAC,MAAM;UACL,MAAMQ,cAAgC,GAAGJ,OAAO,CAACpF,GAAG,CAACf,MAAM,IAAIuD,iBAAiB,CAACxD,GAAG,EAAEC,MAAM,CAAC,CAAC;UAC9F,MAAMC,IAAI,GAAGT,MAAM;AAC7B;AACA,gBAAgB+G,cAAc,CACbxF,GAAG,CAAC,CAAC;YAAEd,IAAI;YAAEE;UAAS,CAAC,KAAK;YAC3B,MAAMqD,iBAAiB,GAAG7D,aAAa,CAAC8D,cAAc,CAACtD,QAAQ,CAAC;YAChE,OAAOX,MAAM;AAC/B,sBAAsBgE,iBAAiB,CAACkB,YAAY;AACpD,sBAAsBzE,IAAI,KAAKuD,iBAAiB,CAACmB,aAAa;AAC9D,mBAAmB,CAACC,IAAI,CAAC,CAAC;UACV,CAAC,CAAC,CACD3D,IAAI,CAAC,IAAI,CAAC;AAC3B;AACA,WACW;UACD,OAAO;YACLhB,IAAI;YACJC,IAAI,EAAEP,aAAa,CAACiC,WAAW,CAAC2E,cAAc,CAACxF,GAAG,CAAC,CAAC;cAAEb;YAAK,CAAC,KAAKA,IAAI,CAAC,CAAC0G,IAAI,CAAC,CAAC,CAAC;YAC9EzG,QAAQ,EAAER,aAAa,CAACS,wBAAwB,CAACJ,MAAM;UACzD,CAAC;QACH;MACF;MAGA,MAAM+B,IAAsE,GAAG/B,MAAM,CAAC+B,IAAI;MAE1F,MAAMN,UAA4B,GAAG1B,GAAG,CAAC2B,KAAK,CAACoF,cAAc,GAAG9G,MAAM,CAAC,IAAI,IAAI;MAE/E,IAAI+G,MAAiB;MACrB,IAAItF,UAAU,KAAK,IAAI,EAAE;QACvBsF,MAAM,GAAGtF,UAAU;MACrB,CAAC,MAAM;QACL,IAAI,OAAOM,IAAI,KAAK,WAAW,EAAE;UAC/BgF,MAAM,GAAGjH,wBAAwB,CAACC,GAAG,EAAEC,MAAsC,CAAC,CAAC,CAAC;QAClF,CAAC,MAAM,IAAIO,KAAK,CAACC,OAAO,CAACuB,IAAI,CAAC,EAAE;UAC9B;UACA,MAAMiF,WAAW,GAAG;YAAEH,KAAK,EAAE9E,IAAI,CAAChB,GAAG,CAACgB,IAAI,KAAK;cAAE,GAAG/B,MAAM;cAAE+B;YAAK,CAAC,CAAC;UAAE,CAAkB;UACvFgF,MAAM,GAAGxD,iBAAiB,CAACxD,GAAG,EAAEiH,WAAW,CAAC;QAC9C,CAAC,MAAM;UACL,MAAMC,cAAc,GAAGjH,MAAsC;UAC7D,QAAQ+B,IAAI;YACV,KAAK,MAAM;cAAEgF,MAAM,GAAG1G,qBAAqB,CAACN,GAAG,EAAEkH,cAAc,CAAC;cAAE;YAClE,KAAK,QAAQ;cAAEF,MAAM,GAAGzG,uBAAuB,CAACP,GAAG,EAAEkH,cAAc,CAAC;cAAE;YACtE,KAAK,QAAQ;cAAEF,MAAM,GAAGjF,uBAAuB,CAAC/B,GAAG,EAAEkH,cAAc,CAAC;cAAE;YACtE,KAAK,SAAS;cAAEF,MAAM,GAAGjF,uBAAuB,CAAC/B,GAAG,EAAEkH,cAAc,CAAC;cAAE;YACvE,KAAK,SAAS;cAAEF,MAAM,GAAG1E,wBAAwB,CAACtC,GAAG,EAAEkH,cAAc,CAAC;cAAE;YACxE,KAAK,QAAQ;cAAEF,MAAM,GAAGlC,uBAAuB,CAAC9E,GAAG,EAAEkH,cAAc,CAAC;cAAE;YACtE;cAAS,MAAM,IAAIrG,SAAS,CAAC,qBAAqBmB,IAAI,GAAG,CAAC;UAC5D;QACF;MACF;MACA,OAAO;QACL,GAAGgF,MAAM;QACT9G,IAAI,EAAE,GAAG8G,MAAM,CAAC9G,IAAI;MACtB,CAAC;IACH;EACF;AACF,CAAC","ignoreList":[]}
{"version":3,"file":"schemaGen.mjs","names":["dedent","isObjectSchema","schemaIdFromRef","GenResultUtil","id","encodeIdentifier","generateForUnknownSchema","ctx","schema","code","refs","comments","commentsFromSchemaObject","generateForNullSchema","generateForStringSchema","Array","isArray","enum","every","value","TypeError","JSON","stringify","map","String","join","baseSchema","format","pipe","push","pattern","minLength","maxLength","hookResult","hooks","generateStringType","combineRefs","generatePipe","generateForNumberSchema","type","generateNumberType","minimum","maximum","exclusiveMinimum","exclusiveMaximum","generateForBooleanSchema","Error","propertyNameAsIdentifier","propertyName","test","replaceAll","generateFieldsForObjectSchema","propSchemas","properties","propsRequired","Set","required","Object","entries","propName","propSchema","propIndex","propResult","generateForSchema","commentsGenerated","commentsToCode","propCode","has","optionalParams","printOptional","keys","length","paramsFormatted","hasOwn","exact","default","hasDefault","optionalFieldRepresentation","propNeedsSeparator","propHeading","propHeadingComment","startsWith","commentBlock","commentInline","trim","generateForObjectSchema","additionalPropSchema","additionalProperties","additionalPropsResult","indexSignature","fieldsGen","generateForArraySchema","itemSchema","items","itemResult","generateForReferenceObject","schemaId","$ref","shouldSuspend","isSchemaIdBefore","initComments","isNonArraySchemaType","allOf","schemasHead","areAllObjects","reduce","acc","schemas","isObject","filter","props","schemasResults","genResult","index","flatMap","oneOf","flat","anyOf","generateSchema","result","schemaAnyOf","schemaNonMixed"],"sources":["../../../../src/generation/effSchemGen/schemaGen.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport { type OpenAPIV3_1 as OpenApi } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema } from '../../util/openapi.ts';\n\nimport * as GenSpec from '../generationSpec.ts';\nimport { isObjectSchema, schemaIdFromRef } from '../../analysis/GraphAnalyzer.ts';\nimport { type GenResult, GenResultUtil } from './genUtil.ts';\n\n\nconst id = GenResultUtil.encodeIdentifier;\n\nexport type Context = {\n schemas: Record<string, OpenApiSchema>,\n hooks: GenSpec.GenerationHooks,\n isSchemaIdBefore: (schemaId: OpenApiSchemaId) => boolean,\n};\n\nexport const generateForUnknownSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n return {\n code: `S.Unknown`,\n refs: [],\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForNullSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n return {\n code: `S.Null`,\n refs: [],\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForStringSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n let refs: GenResult['refs'] = [];\n const code = ((): string => {\n if (Array.isArray(schema.enum)) {\n if (!schema.enum.every(value => typeof value === 'string' || typeof value === 'number')) {\n throw new TypeError(`Unknown enum value, expected string array: ${JSON.stringify(schema.enum)}`);\n }\n return dedent`S.Literal(\n ${schema.enum.map((value: string | number) => JSON.stringify(String(value)) + ',').join('\\n')}\n )`;\n }\n \n let baseSchema = `S.String`;\n switch (schema.format) {\n case 'uuid': baseSchema = `S.UUID`; break;\n //case 'date': baseSchema = `S.Date`; // FIXME: validate lack of time component\n case 'date-time': baseSchema = `S.Date`; break;\n // FIXME: using `S.Base64` will result in `Uint8Array` rather than strings, which will break some downstream\n // consumers.\n //case 'byte': baseSchema = `S.Base64`; break;\n }\n \n let pipe: Array<string> = [baseSchema];\n \n // Note: no built-in validator for emails, see https://github.com/effect-ts/effect/tree/main/packages/schema#email\n if (schema.format === 'email') { pipe.push(`S.pattern(/.+@.+/)`); }\n \n if (typeof schema.pattern === 'string') {\n pipe.push(`S.pattern(new RegExp(${JSON.stringify(schema.pattern)}))`);\n }\n \n if (typeof schema.minLength === 'number') { pipe.push(`S.minLength(${schema.minLength})`); }\n if (typeof schema.maxLength === 'number') { pipe.push(`S.maxLength(${schema.maxLength})`); }\n \n // Run hook\n const hookResult = ctx.hooks.generateStringType?.(schema) ?? null;\n if (hookResult !== null) {\n refs = GenResultUtil.combineRefs(refs, hookResult.refs);\n pipe = [hookResult.code];\n }\n \n //if (schema.nullable) { pipe.push(`S.NullOr`); }\n \n return GenResultUtil.generatePipe(pipe);\n })();\n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForNumberSchema = (\n ctx: Context,\n schema: OpenApi.NonArraySchemaObject,\n): GenResult => {\n let refs: GenResult['refs'] = [];\n const code = ((): string => {\n if (Array.isArray(schema.enum)) {\n if (!schema.enum.every(value => typeof value === 'number')) {\n throw new TypeError(`Unknown enum value, expected number array: ${JSON.stringify(schema.enum)}`);\n }\n return dedent`S.Literal(\n ${schema.enum.map((value: number) => JSON.stringify(value) + ',').join('\\n')}\n )`;\n }\n \n let baseSchema = `S.Number`;\n switch (schema.format) {\n //case 'date': baseSchema = `S.Date`; break; // FIXME: validate lack of time component\n case 'date-time': baseSchema = `S.DateFromNumber.pipe(S.validDate())`; break;\n }\n \n let pipe: Array<string> = [baseSchema];\n if (schema.type === 'integer') { pipe.push(`S.int()`); }\n \n // Run hook\n const hookResult = ctx.hooks.generateNumberType?.(schema) ?? null;\n if (hookResult !== null) {\n refs = GenResultUtil.combineRefs(refs, hookResult.refs);\n pipe = [hookResult.code];\n }\n \n if (typeof schema.minimum === 'number') { pipe.push(`S.greaterThanOrEqualTo(${schema.minimum})`); }\n if (typeof schema.maximum === 'number') { pipe.push(`S.lessThanOrEqualTo(${schema.maximum})`); }\n if (typeof schema.exclusiveMinimum === 'number') { pipe.push(`S.greaterThan(${schema.exclusiveMinimum})`); }\n if (typeof schema.exclusiveMaximum === 'number') { pipe.push(`S.lessThan(${schema.exclusiveMaximum})`); }\n //if (schema.nullable) { pipe.push(`S.NullOr`); }\n \n return GenResultUtil.generatePipe(pipe);\n })();\n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForBooleanSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n const code = ((): string => {\n if (Array.isArray(schema.enum)) { throw new Error(`Boolean enum currently not supported`); }\n \n let code = `S.Boolean`;\n //if (schema.nullable) { code = `S.NullOr(${code})`; }\n return code;\n })();\n return {\n code,\n refs: [],\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\n// Format a property name as valid JS identifier, to be used in a JS object literal\nconst propertyNameAsIdentifier = (propertyName: string): string => {\n if (!(/^[a-zA-Z$_][a-zA-Z0-9$_]*$/g.test(propertyName))) {\n return `'${propertyName.replaceAll(/'/g, '\\\\\\'')}'`;\n }\n\n return propertyName;\n};\n\nexport const generateFieldsForObjectSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n const propSchemas: Record<string, OpenApiSchema> = schema.properties ?? {};\n const propsRequired: Set<string> = new Set(schema.required ?? []);\n \n let refs: GenResult['refs'] = [];\n \n const code = Object.entries(propSchemas).map(([propName, propSchema], propIndex) => {\n const propResult = generateForSchema(ctx, propSchema);\n \n // Merge refs\n refs = GenResultUtil.combineRefs(refs, propResult.refs);\n \n const commentsGenerated = GenResultUtil.commentsToCode(propResult.comments);\n let propCode = propResult.code;\n \n // If the prop is optional, mark it as `S.optional()`\n if (!propsRequired.has(propName)) {\n type OptionalParams = { exact?: boolean, default?: string };\n const optionalParams: OptionalParams = {};\n const printOptional = (code: string, optionalParams: OptionalParams): string => {\n if (Object.keys(optionalParams).length === 0) { return `S.optional(${code})`; }\n const paramsFormatted = dedent`{\n ${Object.hasOwn(optionalParams, 'exact') ? `exact: ${optionalParams.exact},` : ''}\n ${Object.hasOwn(optionalParams, 'default') ? `default: ${optionalParams.default}` : ''}\n }`;\n return `S.optionalWith(${code}, ${paramsFormatted})`;\n };\n \n const hasDefault = 'default' in propSchema && typeof propSchema.default !== 'undefined';\n if (hasDefault) {\n if (typeof propSchema.default === 'object' && propSchema.default !== null) {\n // Add parens for object literals when used as arrow function return value\n optionalParams.default = `() => (${JSON.stringify(propSchema.default)})`;\n } else {\n optionalParams.default = `() => ${JSON.stringify(propSchema.default)}`;\n }\n }\n \n if (ctx.hooks.optionalFieldRepresentation === 'nullish') {\n propCode = printOptional(`S.NullOr(${propCode})`, optionalParams);\n } else {\n propCode = printOptional(propCode, optionalParams);\n }\n }\n \n // Handle (custom/hacked in) `x-heading` fields to group certain fields with a heading comment\n const propNeedsSeparator = propIndex > 0 && 'x-heading' in propSchema;\n const propHeading: null | string = 'x-heading' in propSchema ? propSchema['x-heading'] as string : null;\n const propHeadingComment: null | string = propHeading !== null && propHeading.startsWith('//')\n ? propHeading\n : null;\n \n return (propNeedsSeparator ? '\\n\\n' : '') + dedent`\n ${propHeadingComment ?? ''}${commentsGenerated.commentBlock ? `\\n${commentsGenerated.commentBlock}` : ''}\n ${propertyNameAsIdentifier(propName)}: ${propCode}, ${commentsGenerated.commentInline}\n `.trim();\n }).join('\\n');\n \n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\nexport const generateForObjectSchema = (ctx: Context, schema: OpenApi.NonArraySchemaObject): GenResult => {\n const propSchemas: Record<string, OpenApiSchema> = schema.properties ?? {};\n \n let refs: GenResult['refs'] = [];\n \n const code = ((): string => {\n let code = '';\n if (Object.keys(propSchemas).length === 0) {\n const additionalPropSchema = schema.additionalProperties;\n if (typeof additionalPropSchema === 'undefined') {\n code = `S.Struct({})`;\n } else if (additionalPropSchema === true) {\n code = `S.Record({ key: S.String, value: S.Unknown() })`;\n } else if (additionalPropSchema === false) {\n code = `S.Record({ key: S.Never, value: S.Never })`;\n } else {\n const additionalPropsResult = generateForSchema(ctx, additionalPropSchema);\n refs = GenResultUtil.combineRefs(refs, additionalPropsResult.refs);\n // TODO: also include the `comments` from `additionalPropsResult`?\n code = `S.Record({ key: S.String, value: ${additionalPropsResult.code} })`;\n }\n } else {\n let indexSignature = '';\n if (typeof schema.additionalProperties !== 'undefined') {\n if (schema.additionalProperties === false) {\n // No equivalent for this on a schema level, requires the consumer to use `onExcessProperty: \"error\"`\n // https://github.com/Effect-TS/effect/tree/main/packages/schema#strict\n } else if (schema.additionalProperties === true) {\n // No equivalent for this on a schema level, requires the consumer to use `onExcessProperty: \"preserve\"`\n // https://github.com/Effect-TS/effect/tree/main/packages/schema#passthrough\n } else {\n const additionalPropsResult = generateForSchema(ctx, schema.additionalProperties);\n refs = GenResultUtil.combineRefs(refs, additionalPropsResult.refs);\n \n // https://github.com/Effect-TS/effect/tree/main/packages/schema#index-signatures\n // TODO: also include the `comments` from `additionalPropsResult`?\n indexSignature = `{ key: S.String, value: ${additionalPropsResult.code} }`;\n }\n }\n \n const fieldsGen = generateFieldsForObjectSchema(ctx, schema);\n refs = GenResultUtil.combineRefs(refs, fieldsGen.refs);\n code = dedent`\n S.Struct({\\n\n ${fieldsGen.code}\n }${indexSignature ? `, ${indexSignature}` : ''})\n `;\n }\n return code;\n })();\n \n return {\n code,\n refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForArraySchema = (ctx: Context, schema: OpenApi.ArraySchemaObject): GenResult => {\n const itemSchema: OpenApiSchema = schema.items;\n const itemResult = generateForSchema(ctx, itemSchema);\n \n const code = ((): string => {\n let code = `S.Array(${itemResult.code})`;\n if (typeof schema.minLength === 'number') { code = `${code}.min(${schema.minLength})`; }\n if (typeof schema.maxLength === 'number') { code = `${code}.max(${schema.maxLength})`; }\n //if (schema.nullable) { code = `S.NullOr(${code})`; }\n return code;\n })();\n \n // FIXME: include the comments for `itemSchema` as well?\n return {\n code,\n refs: itemResult.refs,\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n};\n\nexport const generateForReferenceObject = (ctx: Context, schema: OpenApi.ReferenceObject): GenResult => {\n // FIXME: make this logic customizable (allow a callback to resolve a `$ref` string to a `Ref` instance?)\n const schemaId = schemaIdFromRef(schema.$ref);\n \n // If the referenced schema ID is topologically after the current one, wrap it in `S.suspend` for lazy eval\n const shouldSuspend = !ctx.isSchemaIdBefore(schemaId);\n const code = shouldSuspend\n ? `S.suspend((): S.Schema<_${id(schemaId)}, _${id(schemaId)}Encoded> => ${id(schemaId)})`\n : id(schemaId);\n \n return { code, refs: [`./${schemaId}.ts`], comments: GenResultUtil.initComments() };\n};\n\n// Generate the Effect Schema code for the given OpenAPI schema\nexport const generateForSchema = (ctx: Context, schema: OpenApiSchema): GenResult => {\n const isNonArraySchemaType = (schema: OpenApiSchema): schema is OpenApi.NonArraySchemaObject => {\n return !('$ref' in schema) && (!('type' in schema) || !Array.isArray(schema.type));\n };\n \n if ('$ref' in schema) { // Case: OpenApi.ReferenceObject\n return generateForReferenceObject(ctx, schema);\n } else { // Case: OpenApi.SchemaObject\n if (schema.type === 'array' || 'items' in schema) { // Case: OpenApi.ArraySchemaObject\n return generateForArraySchema(ctx, { items: {}, ...schema } as OpenApi.ArraySchemaObject);\n } else { // Case: OpenApi.NonArraySchemaObject | OpenApi.MixedSchemaObject\n if ('allOf' in schema && typeof schema.allOf !== 'undefined') {\n const schemasHead: undefined | OpenApiSchema = schema.allOf[0];\n if (schemasHead && schema.allOf.length === 1) { // If only one schema, simply generate that schema\n return generateForSchema(ctx, schemasHead);\n }\n \n // `allOf` supports any type, but Effect Schema does not currently support generic intersections. Thus,\n // currently we only support `allOf` if it consists only of object schemas.\n // Idea: merge `allOf` schema first, e.g. using https://github.com/mokkabonna/json-schema-merge-allof\n const areAllObjects: boolean = schema.allOf.reduce(\n (acc, schema) => {\n if ('$ref' in schema) {\n return acc && isObjectSchema(ctx.schemas, schema.$ref);\n }\n \n const isObject = isNonArraySchemaType(schema) && schema.type === 'object';\n return acc && isObject;\n },\n true,\n );\n \n /*\n if (!areAllObjects) {\n throw new Error(dedent`\n Found \\`allOf\\` with a non-object schema. Currently only object schemas or unions of object schemas are\n supported.\n `);\n }\n */\n \n const schemas: Array<OpenApiSchema> = schema.allOf\n // Filter out empty schemas\n // XXX this only makes sense when all schemas are objects, would not work if we supported generic `allOf`\n .filter((schema: OpenApiSchema) => {\n if (!isNonArraySchemaType(schema) || schema.type !== 'object') { return true; }\n \n const props = schema.properties ?? {};\n if (Object.keys(props).length === 0 && !schema.additionalProperties) {\n return false;\n } else {\n return true;\n }\n });\n \n if (typeof schemasHead === 'undefined') {\n // XXX this only works for object schemas, as in `S.extend()`, would not work if we support generic `allOf`\n return generateForObjectSchema(ctx, { type: 'object' }); // Empty `allOf`\n } else if (schemas.length === 1) {\n // Trivial case: only one schema\n return generateForSchema(ctx, schemasHead);\n } else {\n let code = '';\n let schemasResults: Array<GenResult>;\n if (areAllObjects) {\n // Experimental: using `...MySchema.fields` to combine struct schemas.\n // Note: doesn't work if `MySchema` is a union of structs\n \n schemasResults = schemas.map(schema => {\n const genResult = generateForSchema(ctx, schema);\n if ('$ref' in schema) {\n genResult.code = `...${genResult.code}.fields,`;\n } else if (isNonArraySchemaType(schema)) {\n genResult.code = generateFieldsForObjectSchema(ctx, schema).code;\n }\n return genResult;\n });\n \n code = dedent`\n S.Struct({\n ${schemasResults\n .map(({ code, comments }, index) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${commentsGenerated.commentInline}\n ${code}\n `.trim();\n })\n .join('\\n')\n }\n })\n `;\n } else {\n schemasResults = schemas.map(schema => generateForSchema(ctx, schema));\n \n // Note: `extend` doesn't quite cover the semantics of `allOf`, since it only accepts objects and\n // assumes distinct types. However, Effect Schema has no generic built-in mechanism for this.\n code = dedent`\n pipe(\n ${schemasResults\n .map(({ code, comments }, index) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${index > 0 ? `S.extend(${code})` : code}, ${commentsGenerated.commentInline}\n `.trim();\n })\n .join('\\n')\n }\n )\n `;\n }\n \n return {\n code,\n refs: GenResultUtil.combineRefs(schemasResults.flatMap(({ refs }) => refs)),\n comments: GenResultUtil.initComments(),\n };\n }\n } else if ('oneOf' in schema && typeof schema.oneOf !== 'undefined') {\n const schemas: Array<OpenApiSchema> = schema.oneOf;\n const schemasHead: undefined | OpenApiSchema = schemas[0];\n if (typeof schemasHead === 'undefined') {\n throw new TypeError(`oneOf must have at least one schema`);\n } else if (schemas.length === 1) {\n // Trivial case: only one schema\n return generateForSchema(ctx, schemasHead);\n } else {\n const schemasResults: Array<GenResult> = schemas.map(schema => generateForSchema(ctx, schema));\n // Note: `union` doesn't quite cover the semantics of `oneOf`, since `oneOf` must guarantee that exactly\n // one schema matches. However, Effect Schema has no easy built-in mechanism for this.\n const code = dedent`\n S.Union(\n ${schemasResults\n .map(({ code, comments }) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${code}, ${commentsGenerated.commentInline}\n `.trim();\n })\n .join('\\n')\n }\n )\n `;\n return {\n code,\n refs: GenResultUtil.combineRefs(schemasResults.map(({ refs }) => refs).flat()),\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n }\n } else if ('anyOf' in schema && typeof schema.anyOf !== 'undefined') {\n const schemas: Array<OpenApiSchema> = schema.anyOf;\n const schemasHead: undefined | OpenApiSchema = schemas[0];\n if (typeof schemasHead === 'undefined') {\n throw new TypeError(`anyOf must have at least one schema`);\n } else if (schemas.length === 1) {\n // Trivial case: only one schema\n return generateForSchema(ctx, schemasHead);\n } else {\n const schemasResults: Array<GenResult> = schemas.map(schema => generateForSchema(ctx, schema));\n const code = dedent`\n S.Union(\n ${schemasResults\n .map(({ code, comments }) => {\n const commentsGenerated = GenResultUtil.commentsToCode(comments);\n return dedent`\n ${commentsGenerated.commentBlock}\n ${code}, ${commentsGenerated.commentInline}\n `.trim();\n })\n .join('\\n')\n }\n )\n `;\n return {\n code,\n refs: GenResultUtil.combineRefs(schemasResults.map(({ refs }) => refs).flat()),\n comments: GenResultUtil.commentsFromSchemaObject(schema),\n };\n }\n }\n \n type SchemaType = 'array' | OpenApi.NonArraySchemaObjectType;\n const type: undefined | OpenApi.NonArraySchemaObjectType | Array<SchemaType> = schema.type;\n \n const hookResult: null | GenResult = ctx.hooks.generateSchema?.(schema) ?? null;\n \n let result: GenResult;\n if (hookResult !== null) {\n result = hookResult;\n } else {\n if (typeof type === 'undefined') {\n result = generateForUnknownSchema(ctx, schema as OpenApi.NonArraySchemaObject); // Any type\n } else if (Array.isArray(type)) {\n // `type` as an array is equivalent to `anyOf` with `type` set to the individual type string\n const schemaAnyOf = { anyOf: type.map(type => ({ ...schema, type })) } as OpenApiSchema;\n result = generateForSchema(ctx, schemaAnyOf);\n } else {\n const schemaNonMixed = schema as OpenApi.NonArraySchemaObject;\n switch (type) {\n case 'null': result = generateForNullSchema(ctx, schemaNonMixed); break;\n case 'string': result = generateForStringSchema(ctx, schemaNonMixed); break;\n case 'number': result = generateForNumberSchema(ctx, schemaNonMixed); break;\n case 'integer': result = generateForNumberSchema(ctx, schemaNonMixed); break;\n case 'boolean': result = generateForBooleanSchema(ctx, schemaNonMixed); break;\n case 'object': result = generateForObjectSchema(ctx, schemaNonMixed); break;\n default: throw new TypeError(`Unsupported type \"${type}\"`);\n }\n }\n }\n return {\n ...result,\n code: `${result.code}`,\n };\n }\n }\n};\n"],"mappings":"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","ignoreList":[]}

@@ -12,3 +12,3 @@ /* Copyright (c) Fortanix, Inc.

// @effect/schema
// Effect Schema

@@ -15,0 +15,0 @@ // Comma-separated string of field names (identifiers)

@@ -1,1 +0,1 @@

{"version":3,"file":"generationSpec.mjs","names":["assertUnreachable","x","Error","DefUtil","sourceSchemaIdFromDef","def","action","schemaId","sourceSchemaId","targetSchemaIdFromDef"],"sources":["../../../src/generation/generationSpec.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { type JSONPatchDocument } from 'immutable-json-patch';\n\nimport { type OpenAPIV3_1 as OpenAPIV3 } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema } from '../util/openapi.ts';\nimport { type GenResult } from './effSchemGen/genUtil.ts';\n\n\nconst assertUnreachable = (x: never): never => { throw new Error(`Should not happen`); };\n\n\nexport type GenerationHooks = {\n generateSchema?: (schema: OpenApiSchema) => null | GenResult,\n generateStringType?: (schema: OpenAPIV3.NonArraySchemaObject) => null | GenResult,\n generateNumberType?: (schema: OpenAPIV3.NonArraySchemaObject) => null | GenResult,\n optionalFieldRepresentation?: undefined | 'nullish', // TEMP\n};\n\n\n// @effect/schema\nexport type EffectSchemaId = string;\n\nexport type FieldNames = string; // Comma-separated string of field names (identifiers)\nexport type FieldSpec = {\n default?: undefined | unknown,\n};\nexport type FieldGroup = Record<FieldNames, FieldSpec>;\nexport type FieldGroups = Record<string, FieldGroup>;\n\nexport type ModulePath = string;\nexport type GenerationDefinitionSpec = (\n | {\n action: 'custom-code',\n schemaId: EffectSchemaId,\n code: string,\n }\n | {\n action: 'custom-schema',\n schemaId: EffectSchemaId,\n schema: OpenApiSchema,\n lazy?: undefined | boolean, // Whether we should wrap this in a `suspend()` call (for recursive references)\n typeDeclaration?: undefined | string, // Explicit type annotation (overrides inferred), usually used with `suspend`\n typeDeclarationEncoded?: undefined | string, // If specified, uses this as the \"Encoded\" type\n }\n | {\n action: 'generate-schema',\n sourceSchemaId?: undefined | OpenApiSchemaId,\n schemaId: EffectSchemaId,\n lazy?: undefined | boolean, // Whether we should wrap this in a `suspend()` call (for recursive references)\n typeDeclaration?: undefined | string, // Explicit type annotation (overrides inferred), usually used with `suspend`\n typeDeclarationEncoded?: undefined | string, // If specified, uses this as the \"Encoded\" type\n fields?: undefined | FieldGroups,\n }\n);\nexport type GenerationModuleSpec = {\n definitions: Array<GenerationDefinitionSpec>,\n};\nexport type GenerationSpec = {\n patch?: undefined | JSONPatchDocument, // A JSON Patch to apply on the OpenAPI document on initialization\n generationMethod: (\n | { method: 'one-to-one', generateBarrelFile?: undefined | boolean /* Default: false */ }\n | { method: 'bundled', bundleName: string }\n | { method: 'custom' }\n ),\n hooks: GenerationHooks,\n runtime: Record<ModulePath, GenerationModuleSpec>,\n modules: Record<ModulePath, GenerationModuleSpec>,\n};\n\n\nexport const DefUtil = {\n sourceSchemaIdFromDef(def: GenerationDefinitionSpec): OpenApiSchemaId {\n switch (def.action) {\n case 'custom-code': return def.schemaId;\n case 'custom-schema': return def.schemaId;\n case 'generate-schema': return def.sourceSchemaId ?? def.schemaId;\n default: return assertUnreachable(def);\n }\n },\n targetSchemaIdFromDef(def: GenerationDefinitionSpec): EffectSchemaId {\n switch (def.action) {\n case 'custom-code': return def.schemaId;\n case 'custom-schema': return def.schemaId;\n case 'generate-schema': return def.schemaId;\n default: return assertUnreachable(def);\n }\n },\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;;AASA,MAAMA,iBAAiB,GAAIC,CAAQ,IAAY;EAAE,MAAM,IAAIC,KAAK,CAAC,mBAAmB,CAAC;AAAE,CAAC;;AAWxF;;AAGiC;;AAgDjC,OAAO,MAAMC,OAAO,GAAG;EACrBC,qBAAqBA,CAACC,GAA6B,EAAmB;IACpE,QAAQA,GAAG,CAACC,MAAM;MAChB,KAAK,aAAa;QAAE,OAAOD,GAAG,CAACE,QAAQ;MACvC,KAAK,eAAe;QAAE,OAAOF,GAAG,CAACE,QAAQ;MACzC,KAAK,iBAAiB;QAAE,OAAOF,GAAG,CAACG,cAAc,IAAIH,GAAG,CAACE,QAAQ;MACjE;QAAS,OAAOP,iBAAiB,CAACK,GAAG,CAAC;IACxC;EACF,CAAC;EACDI,qBAAqBA,CAACJ,GAA6B,EAAkB;IACnE,QAAQA,GAAG,CAACC,MAAM;MAChB,KAAK,aAAa;QAAE,OAAOD,GAAG,CAACE,QAAQ;MACvC,KAAK,eAAe;QAAE,OAAOF,GAAG,CAACE,QAAQ;MACzC,KAAK,iBAAiB;QAAE,OAAOF,GAAG,CAACE,QAAQ;MAC3C;QAAS,OAAOP,iBAAiB,CAACK,GAAG,CAAC;IACxC;EACF;AACF,CAAC","ignoreList":[]}
{"version":3,"file":"generationSpec.mjs","names":["assertUnreachable","x","Error","DefUtil","sourceSchemaIdFromDef","def","action","schemaId","sourceSchemaId","targetSchemaIdFromDef"],"sources":["../../../src/generation/generationSpec.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { type JSONPatchDocument } from 'immutable-json-patch';\n\nimport { type OpenAPIV3_1 as OpenAPIV3 } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema } from '../util/openapi.ts';\nimport { type GenResult } from './effSchemGen/genUtil.ts';\n\n\nconst assertUnreachable = (x: never): never => { throw new Error(`Should not happen`); };\n\n\nexport type GenerationHooks = {\n generateSchema?: (schema: OpenApiSchema) => null | GenResult,\n generateStringType?: (schema: OpenAPIV3.NonArraySchemaObject) => null | GenResult,\n generateNumberType?: (schema: OpenAPIV3.NonArraySchemaObject) => null | GenResult,\n optionalFieldRepresentation?: undefined | 'nullish', // TEMP\n};\n\n\n// Effect Schema\nexport type EffectSchemaId = string;\n\nexport type FieldNames = string; // Comma-separated string of field names (identifiers)\nexport type FieldSpec = {\n default?: undefined | unknown,\n};\nexport type FieldGroup = Record<FieldNames, FieldSpec>;\nexport type FieldGroups = Record<string, FieldGroup>;\n\nexport type ModulePath = string;\nexport type GenerationDefinitionSpec = (\n | {\n action: 'custom-code',\n schemaId: EffectSchemaId,\n code: string,\n }\n | {\n action: 'custom-schema',\n schemaId: EffectSchemaId,\n schema: OpenApiSchema,\n lazy?: undefined | boolean, // Whether we should wrap this in a `suspend()` call (for recursive references)\n typeDeclaration?: undefined | string, // Explicit type annotation (overrides inferred), usually used with `suspend`\n typeDeclarationEncoded?: undefined | string, // If specified, uses this as the \"Encoded\" type\n }\n | {\n action: 'generate-schema',\n sourceSchemaId?: undefined | OpenApiSchemaId,\n schemaId: EffectSchemaId,\n lazy?: undefined | boolean, // Whether we should wrap this in a `suspend()` call (for recursive references)\n typeDeclaration?: undefined | string, // Explicit type annotation (overrides inferred), usually used with `suspend`\n typeDeclarationEncoded?: undefined | string, // If specified, uses this as the \"Encoded\" type\n fields?: undefined | FieldGroups,\n }\n);\nexport type GenerationModuleSpec = {\n definitions: Array<GenerationDefinitionSpec>,\n};\nexport type GenerationSpec = {\n patch?: undefined | JSONPatchDocument, // A JSON Patch to apply on the OpenAPI document on initialization\n generationMethod: (\n | { method: 'one-to-one', generateBarrelFile?: undefined | boolean /* Default: false */ }\n | { method: 'bundled', bundleName: string }\n | { method: 'custom' }\n ),\n hooks: GenerationHooks,\n runtime: Record<ModulePath, GenerationModuleSpec>,\n modules: Record<ModulePath, GenerationModuleSpec>,\n};\n\n\nexport const DefUtil = {\n sourceSchemaIdFromDef(def: GenerationDefinitionSpec): OpenApiSchemaId {\n switch (def.action) {\n case 'custom-code': return def.schemaId;\n case 'custom-schema': return def.schemaId;\n case 'generate-schema': return def.sourceSchemaId ?? def.schemaId;\n default: return assertUnreachable(def);\n }\n },\n targetSchemaIdFromDef(def: GenerationDefinitionSpec): EffectSchemaId {\n switch (def.action) {\n case 'custom-code': return def.schemaId;\n case 'custom-schema': return def.schemaId;\n case 'generate-schema': return def.schemaId;\n default: return assertUnreachable(def);\n }\n },\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;;AASA,MAAMA,iBAAiB,GAAIC,CAAQ,IAAY;EAAE,MAAM,IAAIC,KAAK,CAAC,mBAAmB,CAAC;AAAE,CAAC;;AAWxF;;AAGiC;;AAgDjC,OAAO,MAAMC,OAAO,GAAG;EACrBC,qBAAqBA,CAACC,GAA6B,EAAmB;IACpE,QAAQA,GAAG,CAACC,MAAM;MAChB,KAAK,aAAa;QAAE,OAAOD,GAAG,CAACE,QAAQ;MACvC,KAAK,eAAe;QAAE,OAAOF,GAAG,CAACE,QAAQ;MACzC,KAAK,iBAAiB;QAAE,OAAOF,GAAG,CAACG,cAAc,IAAIH,GAAG,CAACE,QAAQ;MACjE;QAAS,OAAOP,iBAAiB,CAACK,GAAG,CAAC;IACxC;EACF,CAAC;EACDI,qBAAqBA,CAACJ,GAA6B,EAAkB;IACnE,QAAQA,GAAG,CAACC,MAAM;MAChB,KAAK,aAAa;QAAE,OAAOD,GAAG,CAACE,QAAQ;MACvC,KAAK,eAAe;QAAE,OAAOF,GAAG,CAACE,QAAQ;MACzC,KAAK,iBAAiB;QAAE,OAAOF,GAAG,CAACE,QAAQ;MAC3C;QAAS,OAAOP,iBAAiB,CAACK,GAAG,CAAC;IACxC;EACF;AACF,CAAC","ignoreList":[]}

@@ -275,4 +275,3 @@ function __transformExtension(filepath, extMapping) {

import { pipe, Option } from 'effect';
import { Schema as S } from '@effect/schema';
import { pipe, Option, Schema as S } from 'effect';

@@ -279,0 +278,0 @@ ${bundle.replace(/(^|\n)(\s*)import [^;]+;(?! \/\/ <runtime>)/g, '')}

@@ -1,1 +0,1 @@

{"version":3,"file":"openapiToEffect.mjs","names":["__transformExtension","filepath","extMapping","startsWith","idx","lastIndexOf","includes","newExt","origExt","Object","entries","sort","a","b","length","endsWith","slice","dedent","parseArgs","path","fileURLToPath","pathToFileURL","fs","AsyncLocalStorage","generateModule","generateModuleWithSpec","formatGeneratedCode","immutableJSONPatch","schemaIdFromRef","topologicalSort","dependencyTree","ensureTrailingSlash","replace","cwd","process","servicesStorage","getServices","services","getStore","Error","parseDocument","documentUrl","content","readFile","contentJson","JSON","parse","error","SyntaxError","cause","isDocument","openapi","trim","documentVersion","generateSchemas","request","logger","document","outputDirectory","info","title","version","schemas","components","schemaId","schema","outputUrl","URL","relative","generatedCode","generatedCodeFormatted","writeFile","generateSchemasWithSpec","spec","schemasSorted","specParsed","generationMethod","method","modules","fromEntries","keys","map","definitions","action","ref","circularDependency","def","find","lazy","bundle","modulePath","_moduleSpec","runtime","isSchemaBefore","schema1","schema2","schema1Index","findIndex","schema2Index","mkdir","dirname","recursive","bundleName","bundleFormatted","Date","toISOString","generateBarrelFile","barrelContent","moduleSpec","barrelUrl","log","parseRequest","documentPath","outputPath","specPath","specUrl","stat","outputUrlStats","isDirectory","href","default","patch","Array","isArray","documentPatched","printUsage","runGenerator","args","positionals","requestInput","values","runAnalyzeDependencyTree","rootSchemaRef","tree","run","argsRaw","allowPositionals","options","help","type","short","silent","console","command","argsForCommand","_argExec","argScript","argv","realpath","import","meta","url","exit"],"sources":["../../src/openapiToEffect.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport { parseArgs } from 'node:util';\nimport * as path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { type Stats } from 'node:fs';\nimport * as fs from 'node:fs/promises';\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\nimport { type OpenAPIV3_1 as OpenApi } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema } from './util/openapi.ts';\n\nimport * as GenSpec from './generation/generationSpec.ts';\nimport { generateModule } from './generation/effSchemGen/moduleGen.ts';\nimport { generateModuleWithSpec } from './generation/effSchemGen/moduleGenWithSpec.ts';\nimport { formatGeneratedCode } from './generation/formatting.ts';\nimport { type JSONPatchDocument, immutableJSONPatch } from 'immutable-json-patch';\nimport { schemaIdFromRef, topologicalSort, dependencyTree } from './analysis/GraphAnalyzer.ts';\n\n\n// To use a directory path as a base URL in `new URL(<path>, <base>)` we need to ensure it has a trailing slash,\n// otherwise the path will be relative to the parent directory.\nconst ensureTrailingSlash = (path: string) => path.replace(/[/]+$/, '') + '/';\n\nconst cwd: URL = pathToFileURL(ensureTrailingSlash(process.cwd())); // Trailing slash so we can use it as a base URL\n\n\ntype Logger = Pick<Console, 'info' | 'error' | 'log'>;\ntype Services = { logger: Logger };\nconst servicesStorage = new AsyncLocalStorage<Services>();\nconst getServices = () => {\n const services = servicesStorage.getStore();\n if (typeof services === 'undefined') { throw new Error(`Missing services`); }\n return services;\n};\n\n// Parse an OpenAPI v3.1 document (in JSON format).\n// @throws Error[code=ENOENT] When the document cannot be read.\n// @throws SyntaxError When the document is not a valid OpenAPI v3.1 JSON document.\nconst parseDocument = async (documentUrl: URL): Promise<OpenApi.Document> => {\n const content: string = await fs.readFile(documentUrl, 'utf8');\n \n const contentJson = ((): unknown => {\n try {\n return JSON.parse(content);\n } catch (error: unknown) {\n if (error instanceof SyntaxError) {\n throw error;\n } else {\n throw new Error(`Unable to parse JSON`, { cause: error }); // Unexpected error\n }\n }\n })();\n \n // Some quick sanity checks\n const isDocument = typeof contentJson === 'object' && contentJson !== null && 'openapi' in contentJson;\n if (!isDocument) { throw new SyntaxError('Not a valid OpenAPI document'); }\n if (typeof contentJson.openapi !== 'string' || !contentJson.openapi.trim().startsWith('3.1')) {\n const documentVersion = typeof contentJson.openapi !== 'string' ? contentJson.openapi : '(unknown version)';\n throw new SyntaxError(`Expected OpenAPI version 3.1, but got version '${documentVersion}'`);\n }\n \n // Note: we assume that this is a valid instance of `OpenApi.Document`\n // We may want to do some proper runtime validation here (but this can be expensive since the document may be large)\n return contentJson as any as OpenApi.Document; // (!) Unsafe cast\n};\n\n\nexport type GenerateRequest = {\n document: OpenApi.Document,\n spec: null | GenSpec.GenerationSpec,\n outputDirectory: URL,\n};\ntype GenerateRequestWithSpec = GenerateRequest & { spec: GenSpec.GenerationSpec };\n\n// Generate one module per schema (does not support a spec file)\nexport const generateSchemas = async (request: GenerateRequest): Promise<void> => {\n const { logger } = getServices();\n const { document, outputDirectory } = request;\n \n logger.info(`Generating schemas from document: ${document.info.title} ${document.info.version}`);\n \n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n for (const [schemaId, schema] of Object.entries(schemas)) {\n const outputUrl = new URL(`${schemaId}.ts`, outputDirectory);\n \n logger.info(`Generating schema: '${path.relative(process.cwd(), fileURLToPath(outputUrl))}'`);\n \n try {\n // Generate the effect-schema module code\n const generatedCode = ((): string => {\n try {\n return generateModule(schemaId, schema);\n } catch (error: unknown) {\n logger.error(`Unable to convert to effect-schema`);\n throw error;\n }\n })();\n \n // Format the generated code\n const generatedCodeFormatted = await (async (): Promise<string> => {\n try {\n return await formatGeneratedCode(generatedCode);\n } catch (error: unknown) {\n // Note: if we made a mistake in our code generation logic (and generate invalid syntax), it will usually\n // appear as an error here\n logger.info(generatedCode);\n logger.error(`Unable to format code`);\n throw error;\n }\n })();\n \n // Write to the output file\n try {\n await fs.writeFile(outputUrl, generatedCodeFormatted, 'utf-8');\n } catch (error: unknown) {\n logger.error(`Failed to write to file: '${fileURLToPath(outputUrl)}'`);\n throw error;\n }\n } catch (error: unknown) {\n // If anything fails, just print the error and continue with the next schema\n logger.error(error);\n }\n }\n};\n\n// Generate schemas based on the given spec file\nexport const generateSchemasWithSpec = async (request: GenerateRequestWithSpec): Promise<void> => {\n const { logger } = getServices();\n const { document, spec, outputDirectory } = request;\n \n logger.info(`Generating schemas from document: ${document.info.title} ${document.info.version}`);\n \n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n const schemasSorted = topologicalSort(document);\n \n const specParsed = ((): GenSpec.GenerationSpec => {\n if (spec.generationMethod.method === 'one-to-one') { // Autogenerate modules one-to-one (one file per schema)\n return {\n ...spec,\n modules: {\n // Add each schema in the OpenAPI document to the spec modules list, so as to be autogenerated\n ...Object.fromEntries(Object.keys(schemas)\n .map((schemaId: OpenApiSchemaId): [GenSpec.ModulePath, GenSpec.GenerationModuleSpec] => {\n return [`./${schemaId}.ts`, { definitions: [{ action: 'generate-schema', schemaId }] }];\n }),\n ),\n // Modules already in the spec can still override the default autogenerate directives.\n ...spec.modules,\n },\n };\n } else if (spec.generationMethod.method === 'bundled') { // Bundle everything into one file\n return {\n ...spec,\n modules: {\n ...Object.fromEntries(schemasSorted\n .map(({ ref, circularDependency }): [GenSpec.ModulePath, GenSpec.GenerationModuleSpec] => {\n const schemaId = schemaIdFromRef(ref);\n const def: GenSpec.GenerationDefinitionSpec = {\n ...(spec.modules[`./${schemaId}.ts`]?.definitions?.find(def => def.schemaId === schemaId) ?? {}),\n action: 'generate-schema',\n schemaId,\n lazy: circularDependency,\n };\n return [`./${schemaId}.ts`, { definitions: [def] }];\n }),\n ),\n },\n };\n } else {\n return spec;\n }\n })();\n \n let bundle = '';\n for (const [modulePath, _moduleSpec] of Object.entries({ ...specParsed.runtime, ...specParsed.modules })) {\n logger.info(`Generating module: ${modulePath}`);\n \n try {\n // Generate the effect-schema module code\n const generatedCode = ((): string => {\n try {\n return generateModuleWithSpec(schemas, specParsed, modulePath, {\n isSchemaBefore(schema1: OpenApiSchemaId, schema2: OpenApiSchemaId): boolean {\n if (spec.generationMethod.method !== 'bundled') { return true; }\n \n const schema1Index = schemasSorted.findIndex(({ ref }) => schemaIdFromRef(ref) === schema1);\n const schema2Index = schemasSorted.findIndex(({ ref }) => schemaIdFromRef(ref) === schema2);\n \n if (schema1Index === -1 || schema2Index === -1) {\n return true;\n }\n \n return schema1Index < schema2Index;\n },\n });\n } catch (error: unknown) {\n logger.error(`Unable to convert to effect-schema`);\n throw error;\n }\n })();\n \n // Format the generated code\n const generatedCodeFormatted = await (async (): Promise<string> => {\n try {\n return await formatGeneratedCode(generatedCode);\n } catch (error: unknown) {\n // Note: if we made a mistake in our code generation logic (and generate invalid syntax), it will usually\n // appear as an error here\n logger.info(generatedCode);\n logger.error(`Unable to format code`);\n throw error;\n }\n })();\n \n // Write to an output file\n const outputUrl = new URL(modulePath, outputDirectory);\n try {\n if (specParsed.generationMethod.method === 'bundled') {\n bundle += '\\n\\n' + generatedCodeFormatted;\n } else {\n await fs.mkdir(path.dirname(fileURLToPath(outputUrl)), { recursive: true });\n await fs.writeFile(outputUrl, generatedCodeFormatted, 'utf-8');\n }\n } catch (error: unknown) {\n logger.error(`Failed to write to file: ${outputUrl}`);\n throw error;\n }\n } catch (error: unknown) {\n if (specParsed.generationMethod.method === 'bundled') {\n throw error; // Stop bundling on first error\n } else {\n // If anything fails, just print the error and continue with the next schema\n logger.error('Error:', error);\n }\n }\n }\n \n if (specParsed.generationMethod.method === 'bundled') {\n const outputUrl = new URL(`${specParsed.generationMethod.bundleName}.ts`, outputDirectory);\n logger.info(`Writing to bundle: ${fileURLToPath(outputUrl)}`);\n \n try {\n const bundleFormatted = await formatGeneratedCode(\n dedent`\n /* Generated on ${new Date().toISOString()} from ${document.info.title} version ${document.info.version} */\n \n import { pipe, Option } from 'effect';\n import { Schema as S } from '@effect/schema';\n \n ${bundle.replace(/(^|\\n)(\\s*)import [^;]+;(?! \\/\\/ <runtime>)/g, '')}\n `,\n );\n \n await fs.mkdir(path.dirname(fileURLToPath(outputUrl)), { recursive: true });\n await fs.writeFile(outputUrl, bundleFormatted, 'utf-8');\n } catch (error: unknown) {\n logger.error(`Failed to write to file: ${outputUrl}`);\n throw error;\n }\n }\n \n if (spec.generationMethod.method === 'one-to-one' && spec.generationMethod.generateBarrelFile) {\n // Generate a barrel file containing all exports\n let barrelContent = '';\n for (const [modulePath, moduleSpec] of Object.entries({ ...specParsed.runtime, ...specParsed.modules })) {\n barrelContent += `export * from '${modulePath}';\\n`;\n }\n const barrelUrl = new URL('./index.ts', outputDirectory);\n logger.log(`Generating barrel file: ./index.ts`);\n await fs.writeFile(barrelUrl, barrelContent, 'utf-8');\n }\n};\n\n\nexport type RequestInput = {\n documentPath: string,\n outputPath: string,\n specPath?: undefined | string,\n};\n\n// Parse the given input and return a valid `GenerateRequest` (or throw an error).\n// @throws TypeError[ERR_INVALID_URL] If any of the given file paths are syntactically invalid.\nexport const parseRequest = async ({ documentPath, outputPath, specPath }: RequestInput): Promise<GenerateRequest> => {\n const { logger } = getServices();\n \n // Note: the following could throw a `TypeError` exception if the paths are (syntactically) invalid, e.g. `//`\n const documentUrl = new URL(documentPath, cwd);\n const outputUrl = new URL(ensureTrailingSlash(outputPath), cwd); // Trailing slash for use as base URL\n const specUrl: null | URL = typeof specPath === 'undefined' ? null : new URL(specPath, cwd);\n \n // Check if the OpenAPI document exists\n try {\n await fs.stat(documentUrl);\n } catch (error: unknown) {\n throw new Error(`Provided OpenAPI file does not exist: '${documentPath}'`, { cause: error });\n }\n \n // Check if the output path exists and is a directory\n let outputUrlStats: Stats;\n try {\n outputUrlStats = await fs.stat(outputUrl);\n } catch (error: unknown) {\n throw new Error(`Provided output path does not exist: '${outputPath}'`, { cause: error });\n }\n if (!outputUrlStats.isDirectory()) {\n throw new Error(`Provided output path '${outputPath}' is not a directory`);\n }\n \n // Check if the generation spec file exists\n if (specUrl !== null) {\n try {\n await fs.stat(specUrl);\n } catch (error: unknown) {\n throw new Error(`Provided generation spec file does not exist: '${specPath}'`, { cause: error });\n }\n }\n \n // Load the generation spec\n const spec: null | GenSpec.GenerationSpec = specUrl === null ? null : (await import(specUrl.href)).default;\n \n // Load the OpenAPI document\n const document = await (async (): Promise<OpenApi.Document> => {\n try {\n return await parseDocument(documentUrl);\n } catch (error: unknown) {\n logger.error(`Unable to parse OpenAPI document: '${documentPath}'`);\n throw error;\n }\n })();\n \n // Apply JSON Patch (if any)\n const patch: null | JSONPatchDocument = spec !== null && Array.isArray(spec?.patch) ? spec.patch : null;\n const documentPatched = patch === null\n ? document\n : immutableJSONPatch<OpenApi.Document>(document, patch);\n \n return { document: documentPatched, outputDirectory: outputUrl, spec };\n};\n\n\nconst printUsage = () => {\n const { logger } = getServices();\n \n logger.info(dedent`\n Usage: openapi-to-effect [-h | --help] [--silent] <command> [<args>]\n \n Commands:\n gen [--spec=<path>] <openapi-document-path> <output-path>\n analyze:dependency-tree <openapi-document-path> <root-schema-ref>\n `);\n};\n\ntype ScriptArgs = {\n values: {\n help: boolean | undefined,\n spec: string | undefined,\n },\n positionals: Array<string>,\n};\n\nexport const runGenerator = async (args: ScriptArgs): Promise<void> => {\n const { logger } = getServices();\n \n const documentPath: undefined | string = args.positionals[0];\n const outputPath: undefined | string = args.positionals[1];\n if (!documentPath || !outputPath) {\n printUsage();\n return;\n }\n \n const requestInput: RequestInput = {\n documentPath,\n outputPath,\n specPath: args.values.spec,\n };\n const request: GenerateRequest = await parseRequest(requestInput);\n \n if (request.spec === null) {\n await generateSchemas(request);\n } else {\n await generateSchemasWithSpec(request as GenerateRequestWithSpec);\n }\n \n logger.info('Done!');\n};\n\n// Example:\n// `npm --silent run node src/openapiToEffect.ts analyze:dependency-tree tests/fixtures/fixture1_api.json\\\n// '#/components/schemas/BatchRequest'`\nexport const runAnalyzeDependencyTree = async (args: ScriptArgs): Promise<void> => {\n const { logger } = getServices();\n \n const documentPath: undefined | string = args.positionals[0];\n const rootSchemaRef: undefined | string = args.positionals[1];\n if (!documentPath || !rootSchemaRef) {\n printUsage();\n return;\n }\n \n const documentUrl = new URL(documentPath, cwd);\n const document = await parseDocument(documentUrl);\n const tree = await dependencyTree(document, rootSchemaRef);\n \n logger.log(tree);\n \n logger.info('Done!');\n};\n\n// Run the script with the given CLI arguments\nexport const run = async (argsRaw: Array<string>): Promise<void> => {\n // Ref: https://exploringjs.com/nodejs-shell-scripting/ch_node-util-parseargs.html\n const args = parseArgs({\n args: argsRaw,\n allowPositionals: true,\n options: {\n help: { type: 'boolean', short: 'h' },\n silent: { type: 'boolean' },\n spec: { type: 'string' }, // Path to a spec file (optional)\n //runtime: { type: 'string' } // TODO: allow specifying a path to a \"runtime\" dir that we include in the output?\n },\n });\n \n // Services\n const logger: Logger = {\n info: args.values.silent ? () => {} : console.info,\n error: console.error,\n log: console.log,\n };\n \n await servicesStorage.run({ logger }, async () => {\n const command: null | string = args.positionals[0] ?? null;\n if (command === null || args.values.help) {\n printUsage();\n return;\n }\n \n const argsForCommand = { ...args, positionals: args.positionals.slice(1) };\n switch (command) {\n case 'gen':\n await runGenerator(argsForCommand);\n break;\n case 'analyze:dependency-tree':\n await runAnalyzeDependencyTree(argsForCommand);\n break;\n default:\n logger.error(`Unknown command '${command}'\\n`);\n printUsage();\n break;\n }\n });\n};\n\n// Detect if this module is being run directly from the command line\nconst [_argExec, argScript, ...args] = process.argv; // First two arguments should be the executable + script\nif (argScript && await fs.realpath(argScript) === fileURLToPath(import.meta.url)) {\n try {\n await run(args);\n process.exit(0);\n } catch (error: unknown) {\n console.error(error);\n process.exit(1);\n }\n}\n"],"mappings":"AAAC,SAASA,oBAAoBA,CAACC,QAAQ,EAAEC,UAAU,EAAE;EACnD,IAAG,CAACD,QAAQ,CAACE,UAAU,CAAC,IAAI,CAAC,IAAI,CAACF,QAAQ,CAACE,UAAU,CAAC,KAAK,CAAC,EAAE;IAC5D;IACA,OAAOF,QAAQ;EACjB;EAEA,MAAMG,GAAG,GAAGH,QAAQ,CAACI,WAAW,CAAC,GAAG,CAAC;EACrC,IAAGD,GAAG,KAAK,CAAC,CAAC,IAAIH,QAAQ,CAACK,QAAQ,CAAC,GAAG,EAAEF,GAAG,CAAC,EAAE;IAC5C;IACA,MAAMG,MAAM,GAAGL,UAAU,CAAC,EAAE,CAAC;IAC7B,IAAGK,MAAM,EAAE;MACT,OAAON,QAAQ,GAAGM,MAAM;IAC1B;IACA,OAAON,QAAQ;EACjB;EAEA,KAAI,IAAI,CAACO,OAAO,EAAED,MAAM,CAAC,IAAIE,MAAM,CAACC,OAAO,CAACR,UAAU,CAAC,CAACS,IAAI,CAC1D,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,CAAC,CAAC,CAAC,CAACC,MAAM,GAAGF,CAAC,CAAC,CAAC,CAAC,CAACE,MAC/B,CAAC,EAAE;IACD,IAAGb,QAAQ,CAACc,QAAQ,CAACP,OAAO,CAAC,EAAE;MAC7B,OAAOP,QAAQ,CAACe,KAAK,CAAC,CAAC,EAAE,CAACR,OAAO,CAACM,MAAM,CAAC,GAAGP,MAAM;IACpD;EACF;EACA,OAAON,QAAQ;AACjB;AAxBA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASgB,MAAM,QAAQ,WAAW;AAClC,SAASC,SAAS,QAAQ,WAAW;AACrC,OAAO,KAAKC,IAAI,MAAM,WAAW;AACjC,SAASC,aAAa,EAAEC,aAAa,QAAQ,UAAU;AAEvD,OAAO,KAAKC,EAAE,MAAM,kBAAkB;AACtC,SAASC,iBAAiB,QAAQ,kBAAkB;AAMpD,SAASC,cAAc,QAAQ,wCAAuC;AACtE,SAASC,sBAAsB,QAAQ,gDAA+C;AACtF,SAASC,mBAAmB,QAAQ,6BAA4B;AAChE,SAAiCC,kBAAkB,QAAQ,sBAAsB;AACjF,SAASC,eAAe,EAAEC,eAAe,EAAEC,cAAc,QAAQ,8BAA6B;;AAG9F;AACA;AACA,MAAMC,mBAAmB,GAAIZ,IAAY,IAAKA,IAAI,CAACa,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,GAAG;AAE7E,MAAMC,GAAQ,GAAGZ,aAAa,CAACU,mBAAmB,CAACG,OAAO,CAACD,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;AAKpE,MAAME,eAAe,GAAG,IAAIZ,iBAAiB,CAAW,CAAC;AACzD,MAAMa,WAAW,GAAGA,CAAA,KAAM;EACxB,MAAMC,QAAQ,GAAGF,eAAe,CAACG,QAAQ,CAAC,CAAC;EAC3C,IAAI,OAAOD,QAAQ,KAAK,WAAW,EAAE;IAAE,MAAM,IAAIE,KAAK,CAAC,kBAAkB,CAAC;EAAE;EAC5E,OAAOF,QAAQ;AACjB,CAAC;;AAED;AACA;AACA;AACA,MAAMG,aAAa,GAAG,MAAOC,WAAgB,IAAgC;EAC3E,MAAMC,OAAe,GAAG,MAAMpB,EAAE,CAACqB,QAAQ,CAACF,WAAW,EAAE,MAAM,CAAC;EAE9D,MAAMG,WAAW,GAAG,CAAC,MAAe;IAClC,IAAI;MACF,OAAOC,IAAI,CAACC,KAAK,CAACJ,OAAO,CAAC;IAC5B,CAAC,CAAC,OAAOK,KAAc,EAAE;MACvB,IAAIA,KAAK,YAAYC,WAAW,EAAE;QAChC,MAAMD,KAAK;MACb,CAAC,MAAM;QACL,MAAM,IAAIR,KAAK,CAAC,sBAAsB,EAAE;UAAEU,KAAK,EAAEF;QAAM,CAAC,CAAC,CAAC,CAAC;MAC7D;IACF;EACF,CAAC,EAAE,CAAC;;EAEJ;EACA,MAAMG,UAAU,GAAG,OAAON,WAAW,KAAK,QAAQ,IAAIA,WAAW,KAAK,IAAI,IAAI,SAAS,IAAIA,WAAW;EACtG,IAAI,CAACM,UAAU,EAAE;IAAE,MAAM,IAAIF,WAAW,CAAC,8BAA8B,CAAC;EAAE;EAC1E,IAAI,OAAOJ,WAAW,CAACO,OAAO,KAAK,QAAQ,IAAI,CAACP,WAAW,CAACO,OAAO,CAACC,IAAI,CAAC,CAAC,CAACjD,UAAU,CAAC,KAAK,CAAC,EAAE;IAC5F,MAAMkD,eAAe,GAAG,OAAOT,WAAW,CAACO,OAAO,KAAK,QAAQ,GAAGP,WAAW,CAACO,OAAO,GAAG,mBAAmB;IAC3G,MAAM,IAAIH,WAAW,CAAC,kDAAkDK,eAAe,GAAG,CAAC;EAC7F;;EAEA;EACA;EACA,OAAOT,WAAW,CAA4B,CAAC;AACjD,CAAC;AAUD;AACA,OAAO,MAAMU,eAAe,GAAG,MAAOC,OAAwB,IAAoB;EAChF,MAAM;IAAEC;EAAO,CAAC,GAAGpB,WAAW,CAAC,CAAC;EAChC,MAAM;IAAEqB,QAAQ;IAAEC;EAAgB,CAAC,GAAGH,OAAO;EAE7CC,MAAM,CAACG,IAAI,CAAC,qCAAqCF,QAAQ,CAACE,IAAI,CAACC,KAAK,IAAIH,QAAQ,CAACE,IAAI,CAACE,OAAO,EAAE,CAAC;EAEhG,MAAMC,OAA+C,GAAGL,QAAQ,CAACM,UAAU,EAAED,OAAO,IAAI,CAAC,CAAC;EAE1F,KAAK,MAAM,CAACE,QAAQ,EAAEC,MAAM,CAAC,IAAIxD,MAAM,CAACC,OAAO,CAACoD,OAAO,CAAC,EAAE;IACxD,MAAMI,SAAS,GAAG,IAAIC,GAAG,CAAC,GAAGH,QAAQ,KAAK,EAAEN,eAAe,CAAC;IAE5DF,MAAM,CAACG,IAAI,CAAC,uBAAuBxC,IAAI,CAACiD,QAAQ,CAAClC,OAAO,CAACD,GAAG,CAAC,CAAC,EAAEb,aAAa,CAAC8C,SAAS,CAAC,CAAC,GAAG,CAAC;IAE7F,IAAI;MACF;MACA,MAAMG,aAAa,GAAG,CAAC,MAAc;QACnC,IAAI;UACF,OAAO7C,cAAc,CAACwC,QAAQ,EAAEC,MAAM,CAAC;QACzC,CAAC,CAAC,OAAOlB,KAAc,EAAE;UACvBS,MAAM,CAACT,KAAK,CAAC,oCAAoC,CAAC;UAClD,MAAMA,KAAK;QACb;MACF,CAAC,EAAE,CAAC;;MAEJ;MACA,MAAMuB,sBAAsB,GAAG,MAAM,CAAC,YAA6B;QACjE,IAAI;UACF,OAAO,MAAM5C,mBAAmB,CAAC2C,aAAa,CAAC;QACjD,CAAC,CAAC,OAAOtB,KAAc,EAAE;UACvB;UACA;UACAS,MAAM,CAACG,IAAI,CAACU,aAAa,CAAC;UAC1Bb,MAAM,CAACT,KAAK,CAAC,uBAAuB,CAAC;UACrC,MAAMA,KAAK;QACb;MACF,CAAC,EAAE,CAAC;;MAEJ;MACA,IAAI;QACF,MAAMzB,EAAE,CAACiD,SAAS,CAACL,SAAS,EAAEI,sBAAsB,EAAE,OAAO,CAAC;MAChE,CAAC,CAAC,OAAOvB,KAAc,EAAE;QACvBS,MAAM,CAACT,KAAK,CAAC,6BAA6B3B,aAAa,CAAC8C,SAAS,CAAC,GAAG,CAAC;QACtE,MAAMnB,KAAK;MACb;IACF,CAAC,CAAC,OAAOA,KAAc,EAAE;MACvB;MACAS,MAAM,CAACT,KAAK,CAACA,KAAK,CAAC;IACrB;EACF;AACF,CAAC;;AAED;AACA,OAAO,MAAMyB,uBAAuB,GAAG,MAAOjB,OAAgC,IAAoB;EAChG,MAAM;IAAEC;EAAO,CAAC,GAAGpB,WAAW,CAAC,CAAC;EAChC,MAAM;IAAEqB,QAAQ;IAAEgB,IAAI;IAAEf;EAAgB,CAAC,GAAGH,OAAO;EAEnDC,MAAM,CAACG,IAAI,CAAC,qCAAqCF,QAAQ,CAACE,IAAI,CAACC,KAAK,IAAIH,QAAQ,CAACE,IAAI,CAACE,OAAO,EAAE,CAAC;EAEhG,MAAMC,OAA+C,GAAGL,QAAQ,CAACM,UAAU,EAAED,OAAO,IAAI,CAAC,CAAC;EAC1F,MAAMY,aAAa,GAAG7C,eAAe,CAAC4B,QAAQ,CAAC;EAE/C,MAAMkB,UAAU,GAAG,CAAC,MAA8B;IAChD,IAAIF,IAAI,CAACG,gBAAgB,CAACC,MAAM,KAAK,YAAY,EAAE;MAAE;MACnD,OAAO;QACL,GAAGJ,IAAI;QACPK,OAAO,EAAE;UACP;UACA,GAAGrE,MAAM,CAACsE,WAAW,CAACtE,MAAM,CAACuE,IAAI,CAAClB,OAAO,CAAC,CACvCmB,GAAG,CAAEjB,QAAyB,IAAyD;YACtF,OAAO,CAAC,KAAKA,QAAQ,KAAK,EAAE;cAAEkB,WAAW,EAAE,CAAC;gBAAEC,MAAM,EAAE,iBAAiB;gBAAEnB;cAAS,CAAC;YAAE,CAAC,CAAC;UACzF,CAAC,CACH,CAAC;UACD;UACA,GAAGS,IAAI,CAACK;QACV;MACF,CAAC;IACH,CAAC,MAAM,IAAIL,IAAI,CAACG,gBAAgB,CAACC,MAAM,KAAK,SAAS,EAAE;MAAE;MACvD,OAAO;QACL,GAAGJ,IAAI;QACPK,OAAO,EAAE;UACP,GAAGrE,MAAM,CAACsE,WAAW,CAACL,aAAa,CAChCO,GAAG,CAAC,CAAC;YAAEG,GAAG;YAAEC;UAAmB,CAAC,KAAyD;YACxF,MAAMrB,QAAQ,GAAGpC,eAAe,CAACwD,GAAG,CAAC;YACrC,MAAME,GAAqC,GAAG;cAC5C,IAAIb,IAAI,CAACK,OAAO,CAAC,KAAKd,QAAQ,KAAK,CAAC,EAAEkB,WAAW,EAAEK,IAAI,CAACD,GAAG,IAAIA,GAAG,CAACtB,QAAQ,KAAMA,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;cACjGmB,MAAM,EAAE,iBAAiB;cACzBnB,QAAQ;cACRwB,IAAI,EAAEH;YACR,CAAC;YACD,OAAO,CAAC,KAAKrB,QAAQ,KAAK,EAAE;cAAEkB,WAAW,EAAE,CAACI,GAAG;YAAE,CAAC,CAAC;UACrD,CAAC,CACH;QACF;MACF,CAAC;IACH,CAAC,MAAM;MACL,OAAOb,IAAI;IACb;EACF,CAAC,EAAE,CAAC;EAEJ,IAAIgB,MAAM,GAAG,EAAE;EACf,KAAK,MAAM,CAACC,UAAU,EAAEC,WAAW,CAAC,IAAIlF,MAAM,CAACC,OAAO,CAAC;IAAE,GAAGiE,UAAU,CAACiB,OAAO;IAAE,GAAGjB,UAAU,CAACG;EAAQ,CAAC,CAAC,EAAE;IACxGtB,MAAM,CAACG,IAAI,CAAC,sBAAsB+B,UAAU,EAAE,CAAC;IAE/C,IAAI;MACF;MACA,MAAMrB,aAAa,GAAG,CAAC,MAAc;QACnC,IAAI;UACF,OAAO5C,sBAAsB,CAACqC,OAAO,EAAEa,UAAU,EAAEe,UAAU,EAAE;YAC7DG,cAAcA,CAACC,OAAwB,EAAEC,OAAwB,EAAW;cAC1E,IAAItB,IAAI,CAACG,gBAAgB,CAACC,MAAM,KAAK,SAAS,EAAE;gBAAE,OAAO,IAAI;cAAE;cAE/D,MAAMmB,YAAY,GAAGtB,aAAa,CAACuB,SAAS,CAAC,CAAC;gBAAEb;cAAI,CAAC,KAAKxD,eAAe,CAACwD,GAAG,CAAC,KAAKU,OAAO,CAAC;cAC3F,MAAMI,YAAY,GAAGxB,aAAa,CAACuB,SAAS,CAAC,CAAC;gBAAEb;cAAI,CAAC,KAAKxD,eAAe,CAACwD,GAAG,CAAC,KAAKW,OAAO,CAAC;cAE3F,IAAIC,YAAY,KAAK,CAAC,CAAC,IAAIE,YAAY,KAAK,CAAC,CAAC,EAAE;gBAC9C,OAAO,IAAI;cACb;cAEA,OAAOF,YAAY,GAAGE,YAAY;YACpC;UACF,CAAC,CAAC;QACJ,CAAC,CAAC,OAAOnD,KAAc,EAAE;UACvBS,MAAM,CAACT,KAAK,CAAC,oCAAoC,CAAC;UAClD,MAAMA,KAAK;QACb;MACF,CAAC,EAAE,CAAC;;MAEJ;MACA,MAAMuB,sBAAsB,GAAG,MAAM,CAAC,YAA6B;QACjE,IAAI;UACF,OAAO,MAAM5C,mBAAmB,CAAC2C,aAAa,CAAC;QACjD,CAAC,CAAC,OAAOtB,KAAc,EAAE;UACvB;UACA;UACAS,MAAM,CAACG,IAAI,CAACU,aAAa,CAAC;UAC1Bb,MAAM,CAACT,KAAK,CAAC,uBAAuB,CAAC;UACrC,MAAMA,KAAK;QACb;MACF,CAAC,EAAE,CAAC;;MAEJ;MACA,MAAMmB,SAAS,GAAG,IAAIC,GAAG,CAACuB,UAAU,EAAEhC,eAAe,CAAC;MACtD,IAAI;QACF,IAAIiB,UAAU,CAACC,gBAAgB,CAACC,MAAM,KAAK,SAAS,EAAE;UACpDY,MAAM,IAAI,MAAM,GAAGnB,sBAAsB;QAC3C,CAAC,MAAM;UACL,MAAMhD,EAAE,CAAC6E,KAAK,CAAChF,IAAI,CAACiF,OAAO,CAAChF,aAAa,CAAC8C,SAAS,CAAC,CAAC,EAAE;YAAEmC,SAAS,EAAE;UAAK,CAAC,CAAC;UAC3E,MAAM/E,EAAE,CAACiD,SAAS,CAACL,SAAS,EAAEI,sBAAsB,EAAE,OAAO,CAAC;QAChE;MACF,CAAC,CAAC,OAAOvB,KAAc,EAAE;QACvBS,MAAM,CAACT,KAAK,CAAC,4BAA4BmB,SAAS,EAAE,CAAC;QACrD,MAAMnB,KAAK;MACb;IACF,CAAC,CAAC,OAAOA,KAAc,EAAE;MACvB,IAAI4B,UAAU,CAACC,gBAAgB,CAACC,MAAM,KAAK,SAAS,EAAE;QACpD,MAAM9B,KAAK,CAAC,CAAC;MACf,CAAC,MAAM;QACL;QACAS,MAAM,CAACT,KAAK,CAAC,QAAQ,EAAEA,KAAK,CAAC;MAC/B;IACF;EACF;EAEA,IAAI4B,UAAU,CAACC,gBAAgB,CAACC,MAAM,KAAK,SAAS,EAAE;IACpD,MAAMX,SAAS,GAAG,IAAIC,GAAG,CAAC,GAAGQ,UAAU,CAACC,gBAAgB,CAAC0B,UAAU,KAAK,EAAE5C,eAAe,CAAC;IAC1FF,MAAM,CAACG,IAAI,CAAC,sBAAsBvC,aAAa,CAAC8C,SAAS,CAAC,EAAE,CAAC;IAE7D,IAAI;MACF,MAAMqC,eAAe,GAAG,MAAM7E,mBAAmB,CAC/CT,MAAM;AACd,4BAA4B,IAAIuF,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,SAAShD,QAAQ,CAACE,IAAI,CAACC,KAAK,YAAYH,QAAQ,CAACE,IAAI,CAACE,OAAO;AACjH;AACA;AACA;AACA;AACA,YAAY4B,MAAM,CAACzD,OAAO,CAAC,8CAA8C,EAAE,EAAE,CAAC;AAC9E,SACM,CAAC;MAED,MAAMV,EAAE,CAAC6E,KAAK,CAAChF,IAAI,CAACiF,OAAO,CAAChF,aAAa,CAAC8C,SAAS,CAAC,CAAC,EAAE;QAAEmC,SAAS,EAAE;MAAK,CAAC,CAAC;MAC3E,MAAM/E,EAAE,CAACiD,SAAS,CAACL,SAAS,EAAEqC,eAAe,EAAE,OAAO,CAAC;IACzD,CAAC,CAAC,OAAOxD,KAAc,EAAE;MACvBS,MAAM,CAACT,KAAK,CAAC,4BAA4BmB,SAAS,EAAE,CAAC;MACrD,MAAMnB,KAAK;IACb;EACF;EAEA,IAAI0B,IAAI,CAACG,gBAAgB,CAACC,MAAM,KAAK,YAAY,IAAIJ,IAAI,CAACG,gBAAgB,CAAC8B,kBAAkB,EAAE;IAC7F;IACA,IAAIC,aAAa,GAAG,EAAE;IACtB,KAAK,MAAM,CAACjB,UAAU,EAAEkB,UAAU,CAAC,IAAInG,MAAM,CAACC,OAAO,CAAC;MAAE,GAAGiE,UAAU,CAACiB,OAAO;MAAE,GAAGjB,UAAU,CAACG;IAAQ,CAAC,CAAC,EAAE;MACvG6B,aAAa,IAAI,kBAAkBjB,UAAU,MAAM;IACrD;IACA,MAAMmB,SAAS,GAAG,IAAI1C,GAAG,CAAC,YAAY,EAAET,eAAe,CAAC;IACxDF,MAAM,CAACsD,GAAG,CAAC,oCAAoC,CAAC;IAChD,MAAMxF,EAAE,CAACiD,SAAS,CAACsC,SAAS,EAAEF,aAAa,EAAE,OAAO,CAAC;EACvD;AACF,CAAC;AASD;AACA;AACA,OAAO,MAAMI,YAAY,GAAG,MAAAA,CAAO;EAAEC,YAAY;EAAEC,UAAU;EAAEC;AAAuB,CAAC,KAA+B;EACpH,MAAM;IAAE1D;EAAO,CAAC,GAAGpB,WAAW,CAAC,CAAC;;EAEhC;EACA,MAAMK,WAAW,GAAG,IAAI0B,GAAG,CAAC6C,YAAY,EAAE/E,GAAG,CAAC;EAC9C,MAAMiC,SAAS,GAAG,IAAIC,GAAG,CAACpC,mBAAmB,CAACkF,UAAU,CAAC,EAAEhF,GAAG,CAAC,CAAC,CAAC;EACjE,MAAMkF,OAAmB,GAAG,OAAOD,QAAQ,KAAK,WAAW,GAAG,IAAI,GAAG,IAAI/C,GAAG,CAAC+C,QAAQ,EAAEjF,GAAG,CAAC;;EAE3F;EACA,IAAI;IACF,MAAMX,EAAE,CAAC8F,IAAI,CAAC3E,WAAW,CAAC;EAC5B,CAAC,CAAC,OAAOM,KAAc,EAAE;IACvB,MAAM,IAAIR,KAAK,CAAC,0CAA0CyE,YAAY,GAAG,EAAE;MAAE/D,KAAK,EAAEF;IAAM,CAAC,CAAC;EAC9F;;EAEA;EACA,IAAIsE,cAAqB;EACzB,IAAI;IACFA,cAAc,GAAG,MAAM/F,EAAE,CAAC8F,IAAI,CAAClD,SAAS,CAAC;EAC3C,CAAC,CAAC,OAAOnB,KAAc,EAAE;IACvB,MAAM,IAAIR,KAAK,CAAC,yCAAyC0E,UAAU,GAAG,EAAE;MAAEhE,KAAK,EAAEF;IAAM,CAAC,CAAC;EAC3F;EACA,IAAI,CAACsE,cAAc,CAACC,WAAW,CAAC,CAAC,EAAE;IACjC,MAAM,IAAI/E,KAAK,CAAC,yBAAyB0E,UAAU,sBAAsB,CAAC;EAC5E;;EAEA;EACA,IAAIE,OAAO,KAAK,IAAI,EAAE;IACpB,IAAI;MACF,MAAM7F,EAAE,CAAC8F,IAAI,CAACD,OAAO,CAAC;IACxB,CAAC,CAAC,OAAOpE,KAAc,EAAE;MACvB,MAAM,IAAIR,KAAK,CAAC,kDAAkD2E,QAAQ,GAAG,EAAE;QAAEjE,KAAK,EAAEF;MAAM,CAAC,CAAC;IAClG;EACF;;EAEA;EACA,MAAM0B,IAAmC,GAAG0C,OAAO,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,MAAM,CAAAnH,oBAAA,CAACmH,OAAO,CAACI,IAAI;IAAA;EAAA,GAAC,EAAEC,OAAO;;EAE1G;EACA,MAAM/D,QAAQ,GAAG,MAAM,CAAC,YAAuC;IAC7D,IAAI;MACF,OAAO,MAAMjB,aAAa,CAACC,WAAW,CAAC;IACzC,CAAC,CAAC,OAAOM,KAAc,EAAE;MACvBS,MAAM,CAACT,KAAK,CAAC,sCAAsCiE,YAAY,GAAG,CAAC;MACnE,MAAMjE,KAAK;IACb;EACF,CAAC,EAAE,CAAC;;EAEJ;EACA,MAAM0E,KAA+B,GAAGhD,IAAI,KAAK,IAAI,IAAIiD,KAAK,CAACC,OAAO,CAAClD,IAAI,EAAEgD,KAAK,CAAC,GAAGhD,IAAI,CAACgD,KAAK,GAAG,IAAI;EACvG,MAAMG,eAAe,GAAGH,KAAK,KAAK,IAAI,GAClChE,QAAQ,GACR9B,kBAAkB,CAAmB8B,QAAQ,EAAEgE,KAAK,CAAC;EAEzD,OAAO;IAAEhE,QAAQ,EAAEmE,eAAe;IAAElE,eAAe,EAAEQ,SAAS;IAAEO;EAAK,CAAC;AACxE,CAAC;AAGD,MAAMoD,UAAU,GAAGA,CAAA,KAAM;EACvB,MAAM;IAAErE;EAAO,CAAC,GAAGpB,WAAW,CAAC,CAAC;EAEhCoB,MAAM,CAACG,IAAI,CAAC1C,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA,GAAG,CAAC;AACJ,CAAC;AAUD,OAAO,MAAM6G,YAAY,GAAG,MAAOC,IAAgB,IAAoB;EACrE,MAAM;IAAEvE;EAAO,CAAC,GAAGpB,WAAW,CAAC,CAAC;EAEhC,MAAM4E,YAAgC,GAAGe,IAAI,CAACC,WAAW,CAAC,CAAC,CAAC;EAC5D,MAAMf,UAA8B,GAAGc,IAAI,CAACC,WAAW,CAAC,CAAC,CAAC;EAC1D,IAAI,CAAChB,YAAY,IAAI,CAACC,UAAU,EAAE;IAChCY,UAAU,CAAC,CAAC;IACZ;EACF;EAEA,MAAMI,YAA0B,GAAG;IACjCjB,YAAY;IACZC,UAAU;IACVC,QAAQ,EAAEa,IAAI,CAACG,MAAM,CAACzD;EACxB,CAAC;EACD,MAAMlB,OAAwB,GAAG,MAAMwD,YAAY,CAACkB,YAAY,CAAC;EAEjE,IAAI1E,OAAO,CAACkB,IAAI,KAAK,IAAI,EAAE;IACzB,MAAMnB,eAAe,CAACC,OAAO,CAAC;EAChC,CAAC,MAAM;IACL,MAAMiB,uBAAuB,CAACjB,OAAkC,CAAC;EACnE;EAEAC,MAAM,CAACG,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC;;AAED;AACA;AACA;AACA,OAAO,MAAMwE,wBAAwB,GAAG,MAAOJ,IAAgB,IAAoB;EACjF,MAAM;IAAEvE;EAAO,CAAC,GAAGpB,WAAW,CAAC,CAAC;EAEhC,MAAM4E,YAAgC,GAAGe,IAAI,CAACC,WAAW,CAAC,CAAC,CAAC;EAC5D,MAAMI,aAAiC,GAAGL,IAAI,CAACC,WAAW,CAAC,CAAC,CAAC;EAC7D,IAAI,CAAChB,YAAY,IAAI,CAACoB,aAAa,EAAE;IACnCP,UAAU,CAAC,CAAC;IACZ;EACF;EAEA,MAAMpF,WAAW,GAAG,IAAI0B,GAAG,CAAC6C,YAAY,EAAE/E,GAAG,CAAC;EAC9C,MAAMwB,QAAQ,GAAG,MAAMjB,aAAa,CAACC,WAAW,CAAC;EACjD,MAAM4F,IAAI,GAAG,MAAMvG,cAAc,CAAC2B,QAAQ,EAAE2E,aAAa,CAAC;EAE1D5E,MAAM,CAACsD,GAAG,CAACuB,IAAI,CAAC;EAEhB7E,MAAM,CAACG,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC;;AAED;AACA,OAAO,MAAM2E,GAAG,GAAG,MAAOC,OAAsB,IAAoB;EAClE;EACA,MAAMR,IAAI,GAAG7G,SAAS,CAAC;IACrB6G,IAAI,EAAEQ,OAAO;IACbC,gBAAgB,EAAE,IAAI;IACtBC,OAAO,EAAE;MACPC,IAAI,EAAE;QAAEC,IAAI,EAAE,SAAS;QAAEC,KAAK,EAAE;MAAI,CAAC;MACrCC,MAAM,EAAE;QAAEF,IAAI,EAAE;MAAU,CAAC;MAC3BlE,IAAI,EAAE;QAAEkE,IAAI,EAAE;MAAS,CAAC,CAAE;MAC1B;IACF;EACF,CAAC,CAAC;;EAEF;EACA,MAAMnF,MAAc,GAAG;IACrBG,IAAI,EAAEoE,IAAI,CAACG,MAAM,CAACW,MAAM,GAAG,MAAM,CAAC,CAAC,GAAGC,OAAO,CAACnF,IAAI;IAClDZ,KAAK,EAAE+F,OAAO,CAAC/F,KAAK;IACpB+D,GAAG,EAAEgC,OAAO,CAAChC;EACf,CAAC;EAED,MAAM3E,eAAe,CAACmG,GAAG,CAAC;IAAE9E;EAAO,CAAC,EAAE,YAAY;IAChD,MAAMuF,OAAsB,GAAGhB,IAAI,CAACC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI;IAC1D,IAAIe,OAAO,KAAK,IAAI,IAAIhB,IAAI,CAACG,MAAM,CAACQ,IAAI,EAAE;MACxCb,UAAU,CAAC,CAAC;MACZ;IACF;IAEA,MAAMmB,cAAc,GAAG;MAAE,GAAGjB,IAAI;MAAEC,WAAW,EAAED,IAAI,CAACC,WAAW,CAAChH,KAAK,CAAC,CAAC;IAAE,CAAC;IAC1E,QAAQ+H,OAAO;MACb,KAAK,KAAK;QACR,MAAMjB,YAAY,CAACkB,cAAc,CAAC;QAClC;MACF,KAAK,yBAAyB;QAC5B,MAAMb,wBAAwB,CAACa,cAAc,CAAC;QAC9C;MACF;QACExF,MAAM,CAACT,KAAK,CAAC,oBAAoBgG,OAAO,KAAK,CAAC;QAC9ClB,UAAU,CAAC,CAAC;QACZ;IACJ;EACF,CAAC,CAAC;AACJ,CAAC;;AAED;AACA,MAAM,CAACoB,QAAQ,EAAEC,SAAS,EAAE,GAAGnB,IAAI,CAAC,GAAG7F,OAAO,CAACiH,IAAI,CAAC,CAAC;AACrD,IAAID,SAAS,IAAI,OAAM5H,EAAE,CAAC8H,QAAQ,CAACF,SAAS,CAAC,MAAK9H,aAAa,CAACiI,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC,EAAE;EAChF,IAAI;IACF,MAAMjB,GAAG,CAACP,IAAI,CAAC;IACf7F,OAAO,CAACsH,IAAI,CAAC,CAAC,CAAC;EACjB,CAAC,CAAC,OAAOzG,KAAc,EAAE;IACvB+F,OAAO,CAAC/F,KAAK,CAACA,KAAK,CAAC;IACpBb,OAAO,CAACsH,IAAI,CAAC,CAAC,CAAC;EACjB;AACF","ignoreList":[]}
{"version":3,"file":"openapiToEffect.mjs","names":["__transformExtension","filepath","extMapping","startsWith","idx","lastIndexOf","includes","newExt","origExt","Object","entries","sort","a","b","length","endsWith","slice","dedent","parseArgs","path","fileURLToPath","pathToFileURL","fs","AsyncLocalStorage","generateModule","generateModuleWithSpec","formatGeneratedCode","immutableJSONPatch","schemaIdFromRef","topologicalSort","dependencyTree","ensureTrailingSlash","replace","cwd","process","servicesStorage","getServices","services","getStore","Error","parseDocument","documentUrl","content","readFile","contentJson","JSON","parse","error","SyntaxError","cause","isDocument","openapi","trim","documentVersion","generateSchemas","request","logger","document","outputDirectory","info","title","version","schemas","components","schemaId","schema","outputUrl","URL","relative","generatedCode","generatedCodeFormatted","writeFile","generateSchemasWithSpec","spec","schemasSorted","specParsed","generationMethod","method","modules","fromEntries","keys","map","definitions","action","ref","circularDependency","def","find","lazy","bundle","modulePath","_moduleSpec","runtime","isSchemaBefore","schema1","schema2","schema1Index","findIndex","schema2Index","mkdir","dirname","recursive","bundleName","bundleFormatted","Date","toISOString","generateBarrelFile","barrelContent","moduleSpec","barrelUrl","log","parseRequest","documentPath","outputPath","specPath","specUrl","stat","outputUrlStats","isDirectory","href","default","patch","Array","isArray","documentPatched","printUsage","runGenerator","args","positionals","requestInput","values","runAnalyzeDependencyTree","rootSchemaRef","tree","run","argsRaw","allowPositionals","options","help","type","short","silent","console","command","argsForCommand","_argExec","argScript","argv","realpath","import","meta","url","exit"],"sources":["../../src/openapiToEffect.ts"],"sourcesContent":["/* Copyright (c) Fortanix, Inc.\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { dedent } from 'ts-dedent';\nimport { parseArgs } from 'node:util';\nimport * as path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { type Stats } from 'node:fs';\nimport * as fs from 'node:fs/promises';\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\nimport { type OpenAPIV3_1 as OpenApi } from 'openapi-types';\nimport { type OpenApiSchemaId, type OpenApiSchema } from './util/openapi.ts';\n\nimport * as GenSpec from './generation/generationSpec.ts';\nimport { generateModule } from './generation/effSchemGen/moduleGen.ts';\nimport { generateModuleWithSpec } from './generation/effSchemGen/moduleGenWithSpec.ts';\nimport { formatGeneratedCode } from './generation/formatting.ts';\nimport { type JSONPatchDocument, immutableJSONPatch } from 'immutable-json-patch';\nimport { schemaIdFromRef, topologicalSort, dependencyTree } from './analysis/GraphAnalyzer.ts';\n\n\n// To use a directory path as a base URL in `new URL(<path>, <base>)` we need to ensure it has a trailing slash,\n// otherwise the path will be relative to the parent directory.\nconst ensureTrailingSlash = (path: string) => path.replace(/[/]+$/, '') + '/';\n\nconst cwd: URL = pathToFileURL(ensureTrailingSlash(process.cwd())); // Trailing slash so we can use it as a base URL\n\n\ntype Logger = Pick<Console, 'info' | 'error' | 'log'>;\ntype Services = { logger: Logger };\nconst servicesStorage = new AsyncLocalStorage<Services>();\nconst getServices = () => {\n const services = servicesStorage.getStore();\n if (typeof services === 'undefined') { throw new Error(`Missing services`); }\n return services;\n};\n\n// Parse an OpenAPI v3.1 document (in JSON format).\n// @throws Error[code=ENOENT] When the document cannot be read.\n// @throws SyntaxError When the document is not a valid OpenAPI v3.1 JSON document.\nconst parseDocument = async (documentUrl: URL): Promise<OpenApi.Document> => {\n const content: string = await fs.readFile(documentUrl, 'utf8');\n \n const contentJson = ((): unknown => {\n try {\n return JSON.parse(content);\n } catch (error: unknown) {\n if (error instanceof SyntaxError) {\n throw error;\n } else {\n throw new Error(`Unable to parse JSON`, { cause: error }); // Unexpected error\n }\n }\n })();\n \n // Some quick sanity checks\n const isDocument = typeof contentJson === 'object' && contentJson !== null && 'openapi' in contentJson;\n if (!isDocument) { throw new SyntaxError('Not a valid OpenAPI document'); }\n if (typeof contentJson.openapi !== 'string' || !contentJson.openapi.trim().startsWith('3.1')) {\n const documentVersion = typeof contentJson.openapi !== 'string' ? contentJson.openapi : '(unknown version)';\n throw new SyntaxError(`Expected OpenAPI version 3.1, but got version '${documentVersion}'`);\n }\n \n // Note: we assume that this is a valid instance of `OpenApi.Document`\n // We may want to do some proper runtime validation here (but this can be expensive since the document may be large)\n return contentJson as any as OpenApi.Document; // (!) Unsafe cast\n};\n\n\nexport type GenerateRequest = {\n document: OpenApi.Document,\n spec: null | GenSpec.GenerationSpec,\n outputDirectory: URL,\n};\ntype GenerateRequestWithSpec = GenerateRequest & { spec: GenSpec.GenerationSpec };\n\n// Generate one module per schema (does not support a spec file)\nexport const generateSchemas = async (request: GenerateRequest): Promise<void> => {\n const { logger } = getServices();\n const { document, outputDirectory } = request;\n \n logger.info(`Generating schemas from document: ${document.info.title} ${document.info.version}`);\n \n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n \n for (const [schemaId, schema] of Object.entries(schemas)) {\n const outputUrl = new URL(`${schemaId}.ts`, outputDirectory);\n \n logger.info(`Generating schema: '${path.relative(process.cwd(), fileURLToPath(outputUrl))}'`);\n \n try {\n // Generate the effect-schema module code\n const generatedCode = ((): string => {\n try {\n return generateModule(schemaId, schema);\n } catch (error: unknown) {\n logger.error(`Unable to convert to effect-schema`);\n throw error;\n }\n })();\n \n // Format the generated code\n const generatedCodeFormatted = await (async (): Promise<string> => {\n try {\n return await formatGeneratedCode(generatedCode);\n } catch (error: unknown) {\n // Note: if we made a mistake in our code generation logic (and generate invalid syntax), it will usually\n // appear as an error here\n logger.info(generatedCode);\n logger.error(`Unable to format code`);\n throw error;\n }\n })();\n \n // Write to the output file\n try {\n await fs.writeFile(outputUrl, generatedCodeFormatted, 'utf-8');\n } catch (error: unknown) {\n logger.error(`Failed to write to file: '${fileURLToPath(outputUrl)}'`);\n throw error;\n }\n } catch (error: unknown) {\n // If anything fails, just print the error and continue with the next schema\n logger.error(error);\n }\n }\n};\n\n// Generate schemas based on the given spec file\nexport const generateSchemasWithSpec = async (request: GenerateRequestWithSpec): Promise<void> => {\n const { logger } = getServices();\n const { document, spec, outputDirectory } = request;\n \n logger.info(`Generating schemas from document: ${document.info.title} ${document.info.version}`);\n \n const schemas: Record<OpenApiSchemaId, OpenApiSchema> = document.components?.schemas ?? {};\n const schemasSorted = topologicalSort(document);\n \n const specParsed = ((): GenSpec.GenerationSpec => {\n if (spec.generationMethod.method === 'one-to-one') { // Autogenerate modules one-to-one (one file per schema)\n return {\n ...spec,\n modules: {\n // Add each schema in the OpenAPI document to the spec modules list, so as to be autogenerated\n ...Object.fromEntries(Object.keys(schemas)\n .map((schemaId: OpenApiSchemaId): [GenSpec.ModulePath, GenSpec.GenerationModuleSpec] => {\n return [`./${schemaId}.ts`, { definitions: [{ action: 'generate-schema', schemaId }] }];\n }),\n ),\n // Modules already in the spec can still override the default autogenerate directives.\n ...spec.modules,\n },\n };\n } else if (spec.generationMethod.method === 'bundled') { // Bundle everything into one file\n return {\n ...spec,\n modules: {\n ...Object.fromEntries(schemasSorted\n .map(({ ref, circularDependency }): [GenSpec.ModulePath, GenSpec.GenerationModuleSpec] => {\n const schemaId = schemaIdFromRef(ref);\n const def: GenSpec.GenerationDefinitionSpec = {\n ...(spec.modules[`./${schemaId}.ts`]?.definitions?.find(def => def.schemaId === schemaId) ?? {}),\n action: 'generate-schema',\n schemaId,\n lazy: circularDependency,\n };\n return [`./${schemaId}.ts`, { definitions: [def] }];\n }),\n ),\n },\n };\n } else {\n return spec;\n }\n })();\n \n let bundle = '';\n for (const [modulePath, _moduleSpec] of Object.entries({ ...specParsed.runtime, ...specParsed.modules })) {\n logger.info(`Generating module: ${modulePath}`);\n \n try {\n // Generate the effect-schema module code\n const generatedCode = ((): string => {\n try {\n return generateModuleWithSpec(schemas, specParsed, modulePath, {\n isSchemaBefore(schema1: OpenApiSchemaId, schema2: OpenApiSchemaId): boolean {\n if (spec.generationMethod.method !== 'bundled') { return true; }\n \n const schema1Index = schemasSorted.findIndex(({ ref }) => schemaIdFromRef(ref) === schema1);\n const schema2Index = schemasSorted.findIndex(({ ref }) => schemaIdFromRef(ref) === schema2);\n \n if (schema1Index === -1 || schema2Index === -1) {\n return true;\n }\n \n return schema1Index < schema2Index;\n },\n });\n } catch (error: unknown) {\n logger.error(`Unable to convert to effect-schema`);\n throw error;\n }\n })();\n \n // Format the generated code\n const generatedCodeFormatted = await (async (): Promise<string> => {\n try {\n return await formatGeneratedCode(generatedCode);\n } catch (error: unknown) {\n // Note: if we made a mistake in our code generation logic (and generate invalid syntax), it will usually\n // appear as an error here\n logger.info(generatedCode);\n logger.error(`Unable to format code`);\n throw error;\n }\n })();\n \n // Write to an output file\n const outputUrl = new URL(modulePath, outputDirectory);\n try {\n if (specParsed.generationMethod.method === 'bundled') {\n bundle += '\\n\\n' + generatedCodeFormatted;\n } else {\n await fs.mkdir(path.dirname(fileURLToPath(outputUrl)), { recursive: true });\n await fs.writeFile(outputUrl, generatedCodeFormatted, 'utf-8');\n }\n } catch (error: unknown) {\n logger.error(`Failed to write to file: ${outputUrl}`);\n throw error;\n }\n } catch (error: unknown) {\n if (specParsed.generationMethod.method === 'bundled') {\n throw error; // Stop bundling on first error\n } else {\n // If anything fails, just print the error and continue with the next schema\n logger.error('Error:', error);\n }\n }\n }\n \n if (specParsed.generationMethod.method === 'bundled') {\n const outputUrl = new URL(`${specParsed.generationMethod.bundleName}.ts`, outputDirectory);\n logger.info(`Writing to bundle: ${fileURLToPath(outputUrl)}`);\n \n try {\n const bundleFormatted = await formatGeneratedCode(\n dedent`\n /* Generated on ${new Date().toISOString()} from ${document.info.title} version ${document.info.version} */\n \n import { pipe, Option, Schema as S } from 'effect';\n \n ${bundle.replace(/(^|\\n)(\\s*)import [^;]+;(?! \\/\\/ <runtime>)/g, '')}\n `,\n );\n \n await fs.mkdir(path.dirname(fileURLToPath(outputUrl)), { recursive: true });\n await fs.writeFile(outputUrl, bundleFormatted, 'utf-8');\n } catch (error: unknown) {\n logger.error(`Failed to write to file: ${outputUrl}`);\n throw error;\n }\n }\n \n if (spec.generationMethod.method === 'one-to-one' && spec.generationMethod.generateBarrelFile) {\n // Generate a barrel file containing all exports\n let barrelContent = '';\n for (const [modulePath, moduleSpec] of Object.entries({ ...specParsed.runtime, ...specParsed.modules })) {\n barrelContent += `export * from '${modulePath}';\\n`;\n }\n const barrelUrl = new URL('./index.ts', outputDirectory);\n logger.log(`Generating barrel file: ./index.ts`);\n await fs.writeFile(barrelUrl, barrelContent, 'utf-8');\n }\n};\n\n\nexport type RequestInput = {\n documentPath: string,\n outputPath: string,\n specPath?: undefined | string,\n};\n\n// Parse the given input and return a valid `GenerateRequest` (or throw an error).\n// @throws TypeError[ERR_INVALID_URL] If any of the given file paths are syntactically invalid.\nexport const parseRequest = async ({ documentPath, outputPath, specPath }: RequestInput): Promise<GenerateRequest> => {\n const { logger } = getServices();\n \n // Note: the following could throw a `TypeError` exception if the paths are (syntactically) invalid, e.g. `//`\n const documentUrl = new URL(documentPath, cwd);\n const outputUrl = new URL(ensureTrailingSlash(outputPath), cwd); // Trailing slash for use as base URL\n const specUrl: null | URL = typeof specPath === 'undefined' ? null : new URL(specPath, cwd);\n \n // Check if the OpenAPI document exists\n try {\n await fs.stat(documentUrl);\n } catch (error: unknown) {\n throw new Error(`Provided OpenAPI file does not exist: '${documentPath}'`, { cause: error });\n }\n \n // Check if the output path exists and is a directory\n let outputUrlStats: Stats;\n try {\n outputUrlStats = await fs.stat(outputUrl);\n } catch (error: unknown) {\n throw new Error(`Provided output path does not exist: '${outputPath}'`, { cause: error });\n }\n if (!outputUrlStats.isDirectory()) {\n throw new Error(`Provided output path '${outputPath}' is not a directory`);\n }\n \n // Check if the generation spec file exists\n if (specUrl !== null) {\n try {\n await fs.stat(specUrl);\n } catch (error: unknown) {\n throw new Error(`Provided generation spec file does not exist: '${specPath}'`, { cause: error });\n }\n }\n \n // Load the generation spec\n const spec: null | GenSpec.GenerationSpec = specUrl === null ? null : (await import(specUrl.href)).default;\n \n // Load the OpenAPI document\n const document = await (async (): Promise<OpenApi.Document> => {\n try {\n return await parseDocument(documentUrl);\n } catch (error: unknown) {\n logger.error(`Unable to parse OpenAPI document: '${documentPath}'`);\n throw error;\n }\n })();\n \n // Apply JSON Patch (if any)\n const patch: null | JSONPatchDocument = spec !== null && Array.isArray(spec?.patch) ? spec.patch : null;\n const documentPatched = patch === null\n ? document\n : immutableJSONPatch<OpenApi.Document>(document, patch);\n \n return { document: documentPatched, outputDirectory: outputUrl, spec };\n};\n\n\nconst printUsage = () => {\n const { logger } = getServices();\n \n logger.info(dedent`\n Usage: openapi-to-effect [-h | --help] [--silent] <command> [<args>]\n \n Commands:\n gen [--spec=<path>] <openapi-document-path> <output-path>\n analyze:dependency-tree <openapi-document-path> <root-schema-ref>\n `);\n};\n\ntype ScriptArgs = {\n values: {\n help?: undefined | boolean,\n spec?: undefined | string,\n },\n positionals: Array<string>,\n};\n\nexport const runGenerator = async (args: ScriptArgs): Promise<void> => {\n const { logger } = getServices();\n \n const documentPath: undefined | string = args.positionals[0];\n const outputPath: undefined | string = args.positionals[1];\n if (!documentPath || !outputPath) {\n printUsage();\n return;\n }\n \n const requestInput: RequestInput = {\n documentPath,\n outputPath,\n specPath: args.values.spec,\n };\n const request: GenerateRequest = await parseRequest(requestInput);\n \n if (request.spec === null) {\n await generateSchemas(request);\n } else {\n await generateSchemasWithSpec(request as GenerateRequestWithSpec);\n }\n \n logger.info('Done!');\n};\n\n// Example:\n// `npm --silent run node src/openapiToEffect.ts analyze:dependency-tree tests/fixtures/fixture1_api.json\\\n// '#/components/schemas/BatchRequest'`\nexport const runAnalyzeDependencyTree = async (args: ScriptArgs): Promise<void> => {\n const { logger } = getServices();\n \n const documentPath: undefined | string = args.positionals[0];\n const rootSchemaRef: undefined | string = args.positionals[1];\n if (!documentPath || !rootSchemaRef) {\n printUsage();\n return;\n }\n \n const documentUrl = new URL(documentPath, cwd);\n const document = await parseDocument(documentUrl);\n const tree = await dependencyTree(document, rootSchemaRef);\n \n logger.log(tree);\n \n logger.info('Done!');\n};\n\n// Run the script with the given CLI arguments\nexport const run = async (argsRaw: Array<string>): Promise<void> => {\n // Ref: https://exploringjs.com/nodejs-shell-scripting/ch_node-util-parseargs.html\n const args = parseArgs({\n args: argsRaw,\n allowPositionals: true,\n options: {\n help: { type: 'boolean', short: 'h' },\n silent: { type: 'boolean' },\n spec: { type: 'string' }, // Path to a spec file (optional)\n //runtime: { type: 'string' } // TODO: allow specifying a path to a \"runtime\" dir that we include in the output?\n },\n });\n \n // Services\n const logger: Logger = {\n info: args.values.silent ? () => {} : console.info,\n error: console.error,\n log: console.log,\n };\n \n await servicesStorage.run({ logger }, async () => {\n const command: null | string = args.positionals[0] ?? null;\n if (command === null || args.values.help) {\n printUsage();\n return;\n }\n \n const argsForCommand: ScriptArgs = { ...args, positionals: args.positionals.slice(1) };\n switch (command) {\n case 'gen':\n await runGenerator(argsForCommand);\n break;\n case 'analyze:dependency-tree':\n await runAnalyzeDependencyTree(argsForCommand);\n break;\n default:\n logger.error(`Unknown command '${command}'\\n`);\n printUsage();\n break;\n }\n });\n};\n\n// Detect if this module is being run directly from the command line\nconst [_argExec, argScript, ...args] = process.argv; // First two arguments should be the executable + script\nif (argScript && await fs.realpath(argScript) === fileURLToPath(import.meta.url)) {\n try {\n await run(args);\n process.exit(0);\n } catch (error: unknown) {\n console.error(error);\n process.exit(1);\n }\n}\n"],"mappings":"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","ignoreList":[]}

@@ -1,1 +0,1 @@

{"version":3,"file":"GraphAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/analysis/GraphAnalyzer.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,WAAW,IAAI,OAAO,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAwC,MAAM,oBAAoB,CAAC;AAOpH,KAAK,GAAG,GAAG,MAAM,CAAC;AAGlB,eAAO,MAAM,eAAe,QAAS,GAAG,KAAG,eAY1C,CAAC;AACF,eAAO,MAAM,eAAe,aAAc,eAAe,KAAG,GAE3D,CAAC;AAoHF,KAAK,OAAO,GAAG;IAAE,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,GAAG,SAAS,CAAA;CAAE,CAAC;AAGnD,eAAO,MAAM,cAAc,aAAc,OAAO,CAAC,QAAQ,iBAAiB,GAAG,KAAG,OAQ/E,CAAC;AAOF,KAAK,YAAY,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAGvC,eAAO,MAAM,2BAA2B,aAAc,OAAO,CAAC,QAAQ,KAAG,YAcxE,CAAC;AAGF,eAAO,MAAM,yBAAyB,aAAc,OAAO,CAAC,QAAQ,KAAG,YAyBtE,CAAC;AAOF,KAAK,eAAe,GAAG,KAAK,CAAC;IAC3B,GAAG,EAAE,GAAG,CAAC;IACT,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC,CAAC;AAyBH,eAAO,MAAM,eAAe,aAAc,OAAO,CAAC,QAAQ,KAAG,eAY5D,CAAC;AAIF,qBAAa,sBAAuB,SAAQ,KAAK;CAAG;AAuCpD,eAAO,MAAM,cAAc,YAAa,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,iBAAiB,GAAG,KAAG,OAOpG,CAAC"}
{"version":3,"file":"GraphAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/analysis/GraphAnalyzer.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,WAAW,IAAI,OAAO,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAwC,MAAM,oBAAoB,CAAC;AAOpH,KAAK,GAAG,GAAG,MAAM,CAAC;AAGlB,eAAO,MAAM,eAAe,QAAS,GAAG,KAAG,eAW1C,CAAC;AACF,eAAO,MAAM,eAAe,aAAc,eAAe,KAAG,GAE3D,CAAC;AAoHF,KAAK,OAAO,GAAG;IAAE,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,GAAG,SAAS,CAAA;CAAE,CAAC;AAGnD,eAAO,MAAM,cAAc,aAAc,OAAO,CAAC,QAAQ,iBAAiB,GAAG,KAAG,OAQ/E,CAAC;AAOF,KAAK,YAAY,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAGvC,eAAO,MAAM,2BAA2B,aAAc,OAAO,CAAC,QAAQ,KAAG,YAcxE,CAAC;AAGF,eAAO,MAAM,yBAAyB,aAAc,OAAO,CAAC,QAAQ,KAAG,YAyBtE,CAAC;AAOF,KAAK,eAAe,GAAG,KAAK,CAAC;IAC3B,GAAG,EAAE,GAAG,CAAC;IACT,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC,CAAC;AAyBH,eAAO,MAAM,eAAe,aAAc,OAAO,CAAC,QAAQ,KAAG,eAY5D,CAAC;AAIF,qBAAa,sBAAuB,SAAQ,KAAK;CAAG;AAuCpD,eAAO,MAAM,cAAc,YAAa,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,iBAAiB,GAAG,KAAG,OAOpG,CAAC"}

@@ -1,1 +0,1 @@

{"version":3,"file":"moduleGen.d.ts","sourceRoot":"","sources":["../../../../src/generation/effSchemGen/moduleGen.ts"],"names":[],"mappings":"AAQA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAUjF,eAAO,MAAM,cAAc,aAAc,MAAM,UAAU,aAAa,KAAG,MAsCxE,CAAC"}
{"version":3,"file":"moduleGen.d.ts","sourceRoot":"","sources":["../../../../src/generation/effSchemGen/moduleGen.ts"],"names":[],"mappings":"AAQA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAUjF,eAAO,MAAM,cAAc,aAAc,MAAM,UAAU,aAAa,KAAG,MAqCxE,CAAC"}

@@ -1,1 +0,1 @@

{"version":3,"file":"moduleGenWithSpec.d.ts","sourceRoot":"","sources":["../../../../src/generation/effSchemGen/moduleGenWithSpec.ts"],"names":[],"mappings":"AASA,OAAO,EAAmB,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGlG,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAiGhD,KAAK,6BAA6B,GAAG;IAEnC,cAAc,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC;CACjF,CAAC;AACF,eAAO,MAAM,sBAAsB,YACxB,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,QAChC,OAAO,CAAC,cAAc,cAChB,OAAO,CAAC,UAAU,WACrB,6BAA6B,KACrC,MAwOF,CAAC"}
{"version":3,"file":"moduleGenWithSpec.d.ts","sourceRoot":"","sources":["../../../../src/generation/effSchemGen/moduleGenWithSpec.ts"],"names":[],"mappings":"AASA,OAAO,EAAmB,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGlG,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAiGhD,KAAK,6BAA6B,GAAG;IAEnC,cAAc,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC;CACjF,CAAC;AACF,eAAO,MAAM,sBAAsB,YACxB,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,QAChC,OAAO,CAAC,cAAc,cAChB,OAAO,CAAC,UAAU,WACrB,6BAA6B,KACrC,MAuOF,CAAC"}

@@ -21,4 +21,4 @@ import { type OpenAPIV3_1 as OpenApi } from 'openapi-types';

values: {
help: boolean | undefined;
spec: string | undefined;
help?: undefined | boolean;
spec?: undefined | string;
};

@@ -25,0 +25,0 @@ positionals: Array<string>;

@@ -1,1 +0,1 @@

{"version":3,"file":"openapiToEffect.d.ts","sourceRoot":"","sources":["../../src/openapiToEffect.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,WAAW,IAAI,OAAO,EAAE,MAAM,eAAe,CAAC;AAG5D,OAAO,KAAK,OAAO,MAAM,gCAAgC,CAAC;AAwD1D,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC;IAC3B,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC;IACpC,eAAe,EAAE,GAAG,CAAC;CACtB,CAAC;AACF,KAAK,uBAAuB,GAAG,eAAe,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC,cAAc,CAAA;CAAE,CAAC;AAGlF,eAAO,MAAM,eAAe,YAAmB,eAAe,KAAG,OAAO,CAAC,IAAI,CAiD5E,CAAC;AAGF,eAAO,MAAM,uBAAuB,YAAmB,uBAAuB,KAAG,OAAO,CAAC,IAAI,CAiJ5F,CAAC;AAGF,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC/B,CAAC;AAIF,eAAO,MAAM,YAAY,2CAAkD,YAAY,KAAG,OAAO,CAAC,eAAe,CAuDhH,CAAC;AAeF,KAAK,UAAU,GAAG;IAChB,MAAM,EAAE;QACN,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;QAC1B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;KAC1B,CAAC;IACF,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,YAAY,SAAgB,UAAU,KAAG,OAAO,CAAC,IAAI,CAwBjE,CAAC;AAKF,eAAO,MAAM,wBAAwB,SAAgB,UAAU,KAAG,OAAO,CAAC,IAAI,CAiB7E,CAAC;AAGF,eAAO,MAAM,GAAG,YAAmB,KAAK,CAAC,MAAM,CAAC,KAAG,OAAO,CAAC,IAAI,CAyC9D,CAAC"}
{"version":3,"file":"openapiToEffect.d.ts","sourceRoot":"","sources":["../../src/openapiToEffect.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,WAAW,IAAI,OAAO,EAAE,MAAM,eAAe,CAAC;AAG5D,OAAO,KAAK,OAAO,MAAM,gCAAgC,CAAC;AAwD1D,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC;IAC3B,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC;IACpC,eAAe,EAAE,GAAG,CAAC;CACtB,CAAC;AACF,KAAK,uBAAuB,GAAG,eAAe,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC,cAAc,CAAA;CAAE,CAAC;AAGlF,eAAO,MAAM,eAAe,YAAmB,eAAe,KAAG,OAAO,CAAC,IAAI,CAiD5E,CAAC;AAGF,eAAO,MAAM,uBAAuB,YAAmB,uBAAuB,KAAG,OAAO,CAAC,IAAI,CAgJ5F,CAAC;AAGF,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC/B,CAAC;AAIF,eAAO,MAAM,YAAY,2CAAkD,YAAY,KAAG,OAAO,CAAC,eAAe,CAuDhH,CAAC;AAeF,KAAK,UAAU,GAAG;IAChB,MAAM,EAAE;QACN,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;QAC3B,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;KAC3B,CAAC;IACF,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,YAAY,SAAgB,UAAU,KAAG,OAAO,CAAC,IAAI,CAwBjE,CAAC;AAKF,eAAO,MAAM,wBAAwB,SAAgB,UAAU,KAAG,OAAO,CAAC,IAAI,CAiB7E,CAAC;AAGF,eAAO,MAAM,GAAG,YAAmB,KAAK,CAAC,MAAM,CAAC,KAAG,OAAO,CAAC,IAAI,CAyC9D,CAAC"}
{
"name": "openapi-to-effect",
"version": "0.8.0",
"version": "0.9.0",
"license": "MPL-2.0",
"homepage": "https://github.com/fortanix/openapi-to-effect",
"description": "OpenAPI to @effect/schema code generator",
"description": "OpenAPI to Effect Schema code generator",
"author": "Fortanix",

@@ -57,10 +57,10 @@ "repository": {

"devDependencies": {
"typescript": "^5.6.2",
"tsx": "^4.19.1",
"@babel/core": "^7.25.2",
"@babel/cli": "^7.25.6",
"@babel/preset-env": "^7.25.4",
"@babel/preset-typescript": "^7.24.7",
"typescript": "^5.6.3",
"tsx": "^4.19.2",
"@babel/core": "^7.26.0",
"@babel/cli": "^7.25.9",
"@babel/preset-env": "^7.26.0",
"@babel/preset-typescript": "^7.26.0",
"babel-plugin-replace-import-extension": "^1.1.4",
"@types/node": "^22.5.4",
"@types/node": "^22.9.0",
"openapi-types": "^12.1.3"

@@ -73,5 +73,3 @@ },

"prettier-plugin-jsdoc": "^1.3.0",
"effect": "^3.7.3",
"fast-check": "^3.22.0",
"@effect/schema": "^0.72.4"
"effect": "^3.10.14"
},

@@ -78,0 +76,0 @@ "peerDependencies": {

+10
-12

@@ -7,6 +7,4 @@

Generate [@effect/schema](https://www.npmjs.com/package/@effect/schema) definitions from an [OpenAPI](https://www.openapis.org) document.
Generate [Effect Schema](https://effect.website/docs/schema/introduction) definitions from an [OpenAPI](https://www.openapis.org) document.
Note that `@effect/schema` is currently in pre-stable version, and thus there will likely be breaking changes in the future.
**Features:**

@@ -24,3 +22,3 @@

- Only JSON is supported for the OpenAPI document format. For other formats like YAML, run it through a [converter](https://onlineyamltools.com/convert-yaml-to-json) first.
- The input must be a single OpenAPI document. Cross-document [references](https://swagger.io/docs/specification/using-ref/) are not currently supported.
- The input must be a single OpenAPI document. Cross-document [references](https://swagger.io/docs/specification/using-ref) are not currently supported.
- The `$allOf` operator currently only supports schemas of type `object`. Generic intersections are not currently supported.

@@ -36,3 +34,3 @@

### Generating `@effect/schema` code with the `gen` command
### Generating Effect Schema code with the `gen` command

@@ -145,3 +143,3 @@ The `gen` command takes the path to an OpenAPI v3.1 document (in JSON format), the path to the output directory, and optionally a spec file to configure the output:

```ts
import { Schema as S } from '@effect/schema';
import { Schema as S } from 'effect';

@@ -160,7 +158,7 @@ /* Category */

name: S.String,
subcategories: S.optional(
S.Record(
S.String,
S.suspend((): S.Schema<_Category, _CategoryEncoded> => Category),
),
subcategories: S.optionalWith(
S.Record({
key: S.String,
value: S.suspend((): S.Schema<_Category, _CategoryEncoded> => Category),
}),
{

@@ -188,3 +186,3 @@ default: () => ({}),

role: S.Literal('ADMIN', 'USER', 'AUDITOR'), // The user's role within the system.
interests: S.optional(S.Array(Category), {
interests: S.optionalWith(S.Array(Category), {
default: () => [],

@@ -191,0 +189,0 @@ }),