🎩 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.7.1
to
0.7.2
+33
-8
dist/cjs/analysis/GraphAnalyzer.cjs

@@ -75,4 +75,14 @@ "use strict";

}
if (typeof schema.type === 'undefined') {
return new Set(); // Any type
} else if (Array.isArray(schema.type)) {
const schemaAnyOf = {
anyOf: schema.type.map(type => ({
...schema,
type
}))
};
return depsShallow(schemaAnyOf);
}
switch (schema.type) {
case undefined: // Any type
case 'null':

@@ -127,6 +137,14 @@ case 'string':

}
if (typeof schema.type === 'undefined') {
return {}; // Any type
} else if (Array.isArray(schema.type)) {
const schemaAnyOf = {
anyOf: schema.type.map(type => ({
...schema,
type
}))
};
return depsDeep(schemaAnyOf, resolve, visited);
}
switch (schema.type) {
case undefined:
// Any type
return {};
case 'null':

@@ -274,7 +292,14 @@ case 'string':

}
if (typeof schema.type === 'undefined') {
return false; // Any type
} else if (Array.isArray(schema.type)) {
const schemaAnyOf = {
anyOf: schema.type.map(type => ({
...schema,
type
}))
};
return _isObjectSchema(schemaAnyOf, resolve, visited);
}
switch (schema.type) {
case undefined:
// Any type
return false;
// Possibly an object, but we cannot know
case 'null':

@@ -281,0 +306,0 @@ case 'string':

+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","undefined","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 switch (schema.type) {\n case undefined: // Any 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 switch (schema.type) {\n case undefined: // Any type\n return {};\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 switch (schema.type) {\n case undefined: // Any type\n return false; // Possibly an object, but we cannot know\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":";;;;;;AAQA,IAAAA,QAAA,GAAAC,OAAA;AARA;AACA;AACA;AACA;AACA;AACA;;AAMA;AACA;AACA;;AAEmB;AACyB;;AAErC,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,GAAG,IAAAC,0BAAiB,EAACJ,OAAO,CAAC,CAACK,KAAK,CAAC,CAAC,CAAC;EACtE,IAAI,OAAOH,WAAW,KAAK,WAAW,EAAE;IAAE,MAAM,IAAIH,KAAK,CAAC,mBAAmB,CAAC;EAAE;EAChF,IAAII,QAAQ,CAACG,MAAM,KAAK,CAAC,EAAE;IAAE,MAAM,IAAIP,KAAK,CAAC,uCAAuCJ,GAAG,EAAE,CAAC;EAAE;EAE5F,OAAOO,WAAW;AACpB,CAAC;AAACK,OAAA,CAAAb,eAAA,GAAAA,eAAA;AACK,MAAMc,eAAe,GAAIC,QAAyB,IAAU;EACjE,OAAO,GAAG,GAAG,IAAAC,0BAAiB,EAAC,CAAC,YAAY,EAAE,SAAS,EAAED,QAAQ,CAAC,CAAC;AACrE,CAAC;AAACF,OAAA,CAAAC,eAAA,GAAAA,eAAA;AAEF,MAAMG,QAAQ,GAAIC,OAA+C,IAAMjB,GAAW,IAAoB;EACpG,MAAMO,WAAW,GAAGR,eAAe,CAACC,GAAG,CAAC;EACxC,MAAMkB,SAAS,GAAGD,OAAO,CAACV,WAAW,CAAC;EACtC,IAAI,OAAOW,SAAS,KAAK,WAAW,EAAE;IAAE,MAAM,IAAId,KAAK,CAAC,mBAAmB,CAAC;EAAE;EAC9E,OAAOc,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,QAAQP,MAAM,CAACG,IAAI;QACjB,KAAKO,SAAS,CAAC,CAAC;QAChB,KAAK,MAAM;QACX,KAAK,QAAQ;QACb,KAAK,QAAQ;QACb,KAAK,SAAS;QACd,KAAK,SAAS;UACZ,OAAO,IAAIT,GAAG,CAAC,CAAC;QAClB,KAAK,QAAQ;UACX,MAAMU,KAA6C,GAAGX,MAAM,CAACY,UAAU,IAAI,CAAC,CAAC;UAC7E,MAAMC,eAAe,GAAGb,MAAM,CAACc,oBAAoB;UACnD,MAAMC,qBAA2C,GAC/C,OAAOF,eAAe,KAAK,QAAQ,IAAIA,eAAe,KAAK,IAAI,GAC3DA,eAAe,GACf,IAAI;UACV,OAAO,IAAIZ,GAAG,CAAC,CACb,GAAGe,MAAM,CAACC,MAAM,CAACN,KAAK,CAAC,CAACL,OAAO,CAACY,UAAU,IAAI,CAAC,GAAGnB,WAAW,CAACmB,UAAU,CAAC,CAAC,CAAC,EAC3E,IAAIH,qBAAqB,GAAGhB,WAAW,CAACgB,qBAAqB,CAAC,GAAG,EAAE,CAAC,CACrE,CAAC;QACJ;UAAS,MAAM,IAAII,SAAS,CAAC,oBAAoBC,IAAI,CAACC,SAAS,CAACrB,MAAM,CAACG,IAAI,CAAC,EAAE,CAAC;MACjF;IACF;EACF;AACF,CAAC;;AAED;AACA,MAAMmB,QAAQ,GAAGA,CAACtB,MAAqB,EAAEuB,OAAgB,EAAEC,OAAiB,KAAc;EACxF,IAAI,MAAM,IAAIxB,MAAM,EAAE;IAAE;IACtB,IAAIwB,OAAO,CAACC,GAAG,CAACzB,MAAM,CAACE,IAAI,CAAC,EAAE;MAAE,OAAO;QAAE,CAACF,MAAM,CAACE,IAAI,GAAG;MAAU,CAAC;IAAE;IACrE,OAAO;MAAE,CAACF,MAAM,CAACE,IAAI,GAAGoB,QAAQ,CAACC,OAAO,CAACvB,MAAM,CAACE,IAAI,CAAC,EAAEqB,OAAO,EAAE,IAAItB,GAAG,CAAC,CAAC,GAAGuB,OAAO,EAAExB,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,OAAOsB,QAAQ,CAACtB,MAAM,CAACI,KAAK,EAAEmB,OAAO,EAAEC,OAAO,CAAC;MACjD,CAAC,MAAM;QAAE;QACP,OAAO,CAAC,CAAC;MACX;IACF,CAAC,MAAM;MAAE;MACP,IAAI,OAAO,IAAIxB,MAAM,IAAI,OAAOA,MAAM,CAACK,KAAK,KAAK,WAAW,EAAE;QAC5D,OAAOW,MAAM,CAACU,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG1B,MAAM,CAACK,KAAK,CAACC,OAAO,CAACC,SAAS,IAAIe,QAAQ,CAACf,SAAS,EAAEgB,OAAO,EAAEC,OAAO,CAAC,CAAC,CAAC;MACvG,CAAC,MAAM,IAAI,OAAO,IAAIxB,MAAM,IAAI,OAAOA,MAAM,CAACQ,KAAK,KAAK,WAAW,EAAE;QACnE,OAAOQ,MAAM,CAACU,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG1B,MAAM,CAACQ,KAAK,CAACF,OAAO,CAACC,SAAS,IAAIe,QAAQ,CAACf,SAAS,EAAEgB,OAAO,EAAEC,OAAO,CAAC,CAAC,CAAC;MACvG,CAAC,MAAM,IAAI,OAAO,IAAIxB,MAAM,IAAI,OAAOA,MAAM,CAACS,KAAK,KAAK,WAAW,EAAE;QACnE,OAAOO,MAAM,CAACU,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG1B,MAAM,CAACS,KAAK,CAACH,OAAO,CAACC,SAAS,IAAIe,QAAQ,CAACf,SAAS,EAAEgB,OAAO,EAAEC,OAAO,CAAC,CAAC,CAAC;MACvG;MAEA,QAAQxB,MAAM,CAACG,IAAI;QACjB,KAAKO,SAAS;UAAE;UACd,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;QACX,KAAK,QAAQ;QACb,KAAK,QAAQ;QACb,KAAK,SAAS;QACd,KAAK,SAAS;UACZ,OAAO,CAAC,CAAC;QACX,KAAK,QAAQ;UACX,MAAMC,KAA6C,GAAGX,MAAM,CAACY,UAAU,IAAI,CAAC,CAAC;UAC7E,MAAMC,eAAe,GAAGb,MAAM,CAACc,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,CAACL,OAAO,CAACY,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,qBAAqBnB,MAAM,CAACG,IAAI,GAAG,CAAC;MACnE;IACF;EACF;AACF,CAAC;;AAGD;AACA;AACA;;AAIA;AACO,MAAMwB,cAAc,GAAGA,CAACC,QAA0B,EAAEC,aAAkB,KAAc;EACzF,MAAMhC,OAA+C,GAAG+B,QAAQ,CAACE,UAAU,EAAEjC,OAAO,IAAI,CAAC,CAAC;EAC1F,MAAMkC,YAAY,GAAGpD,eAAe,CAACkD,aAAa,CAAC;EAEnD,MAAMG,UAAqC,GAAGnC,OAAO,CAACkC,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,EAAEpC,QAAQ,CAACC,OAAO,CAAC,EAAE,IAAII,GAAG,CAAC,CAAC4B,aAAa,CAAC,CAAC;EAAE,CAAC;AAC/F,CAAC;;AAGD;AACA;AACA;AAAArC,OAAA,CAAAmC,cAAA,GAAAA,cAAA;AAIA;AACO,MAAMM,2BAA2B,GAAIL,QAA0B,IAAmB;EACvF,MAAM/B,OAA+C,GAAG+B,QAAQ,CAACE,UAAU,EAAEjC,OAAO,IAAI,CAAC,CAAC;;EAE1F;EACA,MAAMqC,eAA6B,GAAG,IAAIC,GAAG,CAAgB,CAAC;EAE9D,KAAK,MAAM,CAACzC,QAAQ,EAAEM,MAAM,CAAC,IAAIgB,MAAM,CAACoB,OAAO,CAACvC,OAAO,CAAC,EAAE;IACxD,MAAMwC,SAAS,GAAG5C,eAAe,CAACC,QAAQ,CAAC;IAC3C,MAAM4C,YAAsB,GAAGvC,WAAW,CAACC,MAAM,CAAC;IAElDkC,eAAe,CAACK,GAAG,CAACF,SAAS,EAAEC,YAAY,CAAC;EAC9C;EAEA,OAAOJ,eAAe;AACxB,CAAC;;AAED;AAAA1C,OAAA,CAAAyC,2BAAA,GAAAA,2BAAA;AACO,MAAMO,yBAAyB,GAAIZ,QAA0B,IAAmB;EACrF,MAAM/B,OAA+C,GAAG+B,QAAQ,CAACE,UAAU,EAAEjC,OAAO,IAAI,CAAC,CAAC;;EAE1F;EACA,MAAM4C,aAA2B,GAAG,IAAIN,GAAG,CAAgB,CAAC;EAE5D,KAAK,MAAM,CAACzC,QAAQ,EAAEM,MAAM,CAAC,IAAIgB,MAAM,CAACoB,OAAO,CAACvC,OAAO,CAAC,EAAE;IACxD,MAAMwC,SAAS,GAAG5C,eAAe,CAACC,QAAQ,CAAC;IAC3C,MAAM4C,YAAY,GAAG,CAAC,MAAgB;MACpC,IAAI;QACF,OAAOvC,WAAW,CAACC,MAAM,CAAC;MAC5B,CAAC,CAAC,OAAO0C,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,IAAI3C,GAAG,CAAC,CACpC,IAAIwC,aAAa,CAACI,GAAG,CAACD,UAAU,CAAC,IAAI,IAAI3C,GAAG,CAAC,CAAC,CAAC,EAC/CoC,SAAS,CACV,CAAC,CAAC;IACL;EACF;EAEA,OAAOI,aAAa;AACtB,CAAC;;AAGD;AACA;AACA;AAAAjD,OAAA,CAAAgD,yBAAA,GAAAA,yBAAA;AAMA,MAAMM,iBAAiB,GAAIL,aAA2B,IAAK;EACzD,MAAMjB,OAAO,GAAG,IAAIvB,GAAG,CAAM,CAAC,CAAC,CAAC;EAChC,MAAM8C,cAAc,GAAG,IAAI9C,GAAG,CAAM,CAAC,CAAC,CAAC;EACvC,MAAM+C,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,IAAIpC,GAAG,CAAC,CAAC;IAC5D,KAAK,MAAMmD,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;AAEM,MAAMO,eAAe,GAAI3B,QAA0B,IAAsB;EAC9E,MAAM/B,OAA+C,GAAG+B,QAAQ,CAACE,UAAU,EAAEjC,OAAO,IAAI,CAAC,CAAC;EAE1F,MAAM2D,SAAS,GAAGhB,yBAAyB,CAACZ,QAAQ,CAAC;EACrD,MAAM6B,MAAM,GAAGX,iBAAiB,CAACU,SAAS,CAAC;EAE3C,KAAK,MAAM9D,QAAQ,IAAIsB,MAAM,CAAC0C,IAAI,CAAC7D,OAAO,CAAC,EAAE;IAC3C,MAAMwC,SAAS,GAAG5C,eAAe,CAACC,QAAQ,CAAC;IAC3C+D,MAAM,CAACR,KAAK,CAACZ,SAAS,CAAC;EACzB;EAEA,OAAOoB,MAAM,CAACT,MAAM;AACtB,CAAC;;AAGD;AAAAxD,OAAA,CAAA+D,eAAA,GAAAA,eAAA;AACO,MAAMI,sBAAsB,SAAS3E,KAAK,CAAC;AAAEQ,OAAA,CAAAmE,sBAAA,GAAAA,sBAAA;AACpD,MAAMC,eAAe,GAAGA,CAAC5D,MAAqB,EAAEuB,OAAgB,EAAEC,OAAiB,KAAc;EAC/F,IAAI,MAAM,IAAIxB,MAAM,EAAE;IAAE;IACtB,IAAIwB,OAAO,CAACC,GAAG,CAACzB,MAAM,CAACE,IAAI,CAAC,EAAE;MAC5B,MAAM,IAAIyD,sBAAsB,CAAC,yBAAyB3D,MAAM,CAACE,IAAI,EAAE,CAAC;IAC1E;IACA,OAAO0D,eAAe,CAACrC,OAAO,CAACvB,MAAM,CAACE,IAAI,CAAC,EAAEqB,OAAO,EAAE,IAAItB,GAAG,CAAC,CAAC,GAAGuB,OAAO,EAAExB,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,IAAIqD,eAAe,CAACrD,SAAS,EAAEgB,OAAO,EAAEC,OAAO,CAAC,CAAC,CAACqC,KAAK,CAACC,OAAO,CAAC;MACvG,CAAC,MAAM,IAAI,OAAO,IAAI9D,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,QAAQT,MAAM,CAACG,IAAI;QACjB,KAAKO,SAAS;UAAE;UACd,OAAO,KAAK;QAAE;QAChB,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,IAAIS,SAAS,CAAC,qBAAqBnB,MAAM,CAACG,IAAI,GAAG,CAAC;MACnE;IACF;EACF;AACF,CAAC;AACM,MAAM4D,cAAc,GAAGA,CAAClE,OAA+C,EAAEgC,aAAkB,KAAc;EAC9G,MAAME,YAAY,GAAGpD,eAAe,CAACkD,aAAa,CAAC;EAEnD,MAAMG,UAAqC,GAAGnC,OAAO,CAACkC,YAAY,CAAC;EACnE,IAAI,CAACC,UAAU,EAAE;IAAE,MAAM,IAAIhD,KAAK,CAAC,0BAA0B6C,aAAa,GAAG,CAAC;EAAE;EAEhF,OAAO+B,eAAe,CAAC5B,UAAU,EAAEpC,QAAQ,CAACC,OAAO,CAAC,EAAE,IAAII,GAAG,CAAC,CAAC4B,aAAa,CAAC,CAAC,CAAC;AACjF,CAAC;AAACrC,OAAA,CAAAuE,cAAA,GAAAA,cAAA","ignoreList":[]}
{"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":[]}

@@ -332,4 +332,4 @@ "use strict";

});
} else if (isNonArraySchemaType(schema)) {
// Case: OpenApi.NonArraySchemaObject
} else {
// Case: OpenApi.NonArraySchemaObject | OpenApi.MixedSchemaObject
if ('allOf' in schema && typeof schema.allOf !== 'undefined') {

@@ -497,3 +497,3 @@ const schemasHead = schema.allOf[0];

${code}, ${commentsGenerated.commentInline}
`;
`.trim();
}).join('\n')}

@@ -517,26 +517,37 @@ )

} else {
switch (type) {
case undefined:
result = generateForUnknownSchema(ctx, schema);
break;
case 'null':
result = generateForNullSchema(ctx, schema);
break;
case 'string':
result = generateForStringSchema(ctx, schema);
break;
case 'number':
result = generateForNumberSchema(ctx, schema);
break;
case 'integer':
result = generateForNumberSchema(ctx, schema);
break;
case 'boolean':
result = generateForBooleanSchema(ctx, schema);
break;
case 'object':
result = generateForObjectSchema(ctx, schema);
break;
default:
throw new TypeError(`Unsupported type "${type}"`);
if (typeof type === 'undefined') {
result = generateForUnknownSchema(ctx, schema); // Any type
} else if (Array.isArray(type)) {
// `type` as an array is equivalent to `anyOf` with `type` set to the individual type string
const schemaAnyOf = {
anyOf: type.map(type => ({
...schema,
type
}))
};
result = generateForSchema(ctx, schemaAnyOf);
} else {
const schemaNonMixed = schema;
switch (type) {
case 'null':
result = generateForNullSchema(ctx, schemaNonMixed);
break;
case 'string':
result = generateForStringSchema(ctx, schemaNonMixed);
break;
case 'number':
result = generateForNumberSchema(ctx, schemaNonMixed);
break;
case 'integer':
result = generateForNumberSchema(ctx, schemaNonMixed);
break;
case 'boolean':
result = generateForBooleanSchema(ctx, schemaNonMixed);
break;
case 'object':
result = generateForObjectSchema(ctx, schemaNonMixed);
break;
default:
throw new TypeError(`Unsupported type "${type}"`);
}
}

@@ -548,5 +559,2 @@ }

};
} else {
// Case: OpenApi.MixedSchemaObject
throw new Error(`Currently unsupported: MixedSchemaObject`);
}

@@ -553,0 +561,0 @@ }

@@ -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","printOptionalParams","keys","length","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","undefined"],"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 { OpenApiSchemaId, type OpenApiRef, 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 printOptionalParams = (optionalParams: OptionalParams): string => {\n if (Object.keys(optionalParams).length === 0) { return ''; }\n return `, {\n ${Object.hasOwn(optionalParams, 'exact') ? `exact: ${optionalParams.exact},` : ''}\n ${Object.hasOwn(optionalParams, 'default') ? `default: ${optionalParams.default}` : ''}\n }`;\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 = `S.optional(S.NullOr(${propCode})${printOptionalParams(optionalParams)})`;\n } else {\n propCode = `S.optional(${propCode}${printOptionalParams(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(S.String, S.Unknown())`;\n } else if (additionalPropSchema === false) {\n code = `S.Record(S.Never, 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(S.String, ${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 if (isNonArraySchemaType(schema)) { // Case: OpenApi.NonArraySchemaObject\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 `;\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 switch (type) {\n case undefined: result = generateForUnknownSchema(ctx, schema); break;\n case 'null': result = generateForNullSchema(ctx, schema); break;\n case 'string': result = generateForStringSchema(ctx, schema); break;\n case 'number': result = generateForNumberSchema(ctx, schema); break;\n case 'integer': result = generateForNumberSchema(ctx, schema); break;\n case 'boolean': result = generateForBooleanSchema(ctx, schema); break;\n case 'object': result = generateForObjectSchema(ctx, schema); break;\n default: throw new TypeError(`Unsupported type \"${type}\"`);\n }\n }\n return {\n ...result,\n code: `${result.code}`,\n };\n } else { // Case: OpenApi.MixedSchemaObject\n throw new Error(`Currently unsupported: MixedSchemaObject`);\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","printOptionalParams","keys","length","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 { OpenApiSchemaId, type OpenApiRef, 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 printOptionalParams = (optionalParams: OptionalParams): string => {\n if (Object.keys(optionalParams).length === 0) { return ''; }\n return `, {\n ${Object.hasOwn(optionalParams, 'exact') ? `exact: ${optionalParams.exact},` : ''}\n ${Object.hasOwn(optionalParams, 'default') ? `default: ${optionalParams.default}` : ''}\n }`;\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 = `S.optional(S.NullOr(${propCode})${printOptionalParams(optionalParams)})`;\n } else {\n propCode = `S.optional(${propCode}${printOptionalParams(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(S.String, S.Unknown())`;\n } else if (additionalPropSchema === false) {\n code = `S.Record(S.Never, 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(S.String, ${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":[]}

@@ -496,6 +496,6 @@ "use strict";

};
// Detect if this module is being run directly from the command line
exports.run = run;
const [_argExec, argScript, ...args] = process.argv; // First two arguments should be the executable + script
// Detect if this module is being run directly from the command line
if (argScript && (await fs.realpath(argScript)) === (0, _nodeUrl.fileURLToPath)(import.meta.url)) {

@@ -502,0 +502,0 @@ try {

@@ -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\nconst [_argExec, argScript, ...args] = process.argv; // First two arguments should be the executable + script\n\n// Detect if this module is being run directly from the command line\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 } 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":[]}

@@ -69,4 +69,14 @@ /* Copyright (c) Fortanix, Inc.

}
if (typeof schema.type === 'undefined') {
return new Set(); // Any type
} else if (Array.isArray(schema.type)) {
const schemaAnyOf = {
anyOf: schema.type.map(type => ({
...schema,
type
}))
};
return depsShallow(schemaAnyOf);
}
switch (schema.type) {
case undefined: // Any type
case 'null':

@@ -121,6 +131,14 @@ case 'string':

}
if (typeof schema.type === 'undefined') {
return {}; // Any type
} else if (Array.isArray(schema.type)) {
const schemaAnyOf = {
anyOf: schema.type.map(type => ({
...schema,
type
}))
};
return depsDeep(schemaAnyOf, resolve, visited);
}
switch (schema.type) {
case undefined:
// Any type
return {};
case 'null':

@@ -265,7 +283,14 @@ case 'string':

}
if (typeof schema.type === 'undefined') {
return false; // Any type
} else if (Array.isArray(schema.type)) {
const schemaAnyOf = {
anyOf: schema.type.map(type => ({
...schema,
type
}))
};
return _isObjectSchema(schemaAnyOf, resolve, visited);
}
switch (schema.type) {
case undefined:
// Any type
return false;
// Possibly an object, but we cannot know
case 'null':

@@ -272,0 +297,0 @@ case 'string':

@@ -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","undefined","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 switch (schema.type) {\n case undefined: // Any 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 switch (schema.type) {\n case undefined: // Any type\n return {};\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 switch (schema.type) {\n case undefined: // Any type\n return false; // Possibly an object, but we cannot know\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.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":"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","ignoreList":[]}

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

});
} else if (isNonArraySchemaType(schema)) {
// Case: OpenApi.NonArraySchemaObject
} else {
// Case: OpenApi.NonArraySchemaObject | OpenApi.MixedSchemaObject
if ('allOf' in schema && typeof schema.allOf !== 'undefined') {

@@ -482,3 +482,3 @@ const schemasHead = schema.allOf[0];

${code}, ${commentsGenerated.commentInline}
`;
`.trim();
}).join('\n')}

@@ -502,26 +502,37 @@ )

} else {
switch (type) {
case undefined:
result = generateForUnknownSchema(ctx, schema);
break;
case 'null':
result = generateForNullSchema(ctx, schema);
break;
case 'string':
result = generateForStringSchema(ctx, schema);
break;
case 'number':
result = generateForNumberSchema(ctx, schema);
break;
case 'integer':
result = generateForNumberSchema(ctx, schema);
break;
case 'boolean':
result = generateForBooleanSchema(ctx, schema);
break;
case 'object':
result = generateForObjectSchema(ctx, schema);
break;
default:
throw new TypeError(`Unsupported type "${type}"`);
if (typeof type === 'undefined') {
result = generateForUnknownSchema(ctx, schema); // Any type
} else if (Array.isArray(type)) {
// `type` as an array is equivalent to `anyOf` with `type` set to the individual type string
const schemaAnyOf = {
anyOf: type.map(type => ({
...schema,
type
}))
};
result = generateForSchema(ctx, schemaAnyOf);
} else {
const schemaNonMixed = schema;
switch (type) {
case 'null':
result = generateForNullSchema(ctx, schemaNonMixed);
break;
case 'string':
result = generateForStringSchema(ctx, schemaNonMixed);
break;
case 'number':
result = generateForNumberSchema(ctx, schemaNonMixed);
break;
case 'integer':
result = generateForNumberSchema(ctx, schemaNonMixed);
break;
case 'boolean':
result = generateForBooleanSchema(ctx, schemaNonMixed);
break;
case 'object':
result = generateForObjectSchema(ctx, schemaNonMixed);
break;
default:
throw new TypeError(`Unsupported type "${type}"`);
}
}

@@ -533,5 +544,2 @@ }

};
} else {
// Case: OpenApi.MixedSchemaObject
throw new Error(`Currently unsupported: MixedSchemaObject`);
}

@@ -538,0 +546,0 @@ }

@@ -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","printOptionalParams","keys","length","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","undefined"],"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 { OpenApiSchemaId, type OpenApiRef, 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 printOptionalParams = (optionalParams: OptionalParams): string => {\n if (Object.keys(optionalParams).length === 0) { return ''; }\n return `, {\n ${Object.hasOwn(optionalParams, 'exact') ? `exact: ${optionalParams.exact},` : ''}\n ${Object.hasOwn(optionalParams, 'default') ? `default: ${optionalParams.default}` : ''}\n }`;\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 = `S.optional(S.NullOr(${propCode})${printOptionalParams(optionalParams)})`;\n } else {\n propCode = `S.optional(${propCode}${printOptionalParams(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(S.String, S.Unknown())`;\n } else if (additionalPropSchema === false) {\n code = `S.Record(S.Never, 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(S.String, ${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 if (isNonArraySchemaType(schema)) { // Case: OpenApi.NonArraySchemaObject\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 `;\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 switch (type) {\n case undefined: result = generateForUnknownSchema(ctx, schema); break;\n case 'null': result = generateForNullSchema(ctx, schema); break;\n case 'string': result = generateForStringSchema(ctx, schema); break;\n case 'number': result = generateForNumberSchema(ctx, schema); break;\n case 'integer': result = generateForNumberSchema(ctx, schema); break;\n case 'boolean': result = generateForBooleanSchema(ctx, schema); break;\n case 'object': result = generateForObjectSchema(ctx, schema); break;\n default: throw new TypeError(`Unsupported type \"${type}\"`);\n }\n }\n return {\n ...result,\n code: `${result.code}`,\n };\n } else { // Case: OpenApi.MixedSchemaObject\n throw new Error(`Currently unsupported: MixedSchemaObject`);\n }\n }\n};\n"],"mappings":"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","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","printOptionalParams","keys","length","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 { OpenApiSchemaId, type OpenApiRef, 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 printOptionalParams = (optionalParams: OptionalParams): string => {\n if (Object.keys(optionalParams).length === 0) { return ''; }\n return `, {\n ${Object.hasOwn(optionalParams, 'exact') ? `exact: ${optionalParams.exact},` : ''}\n ${Object.hasOwn(optionalParams, 'default') ? `default: ${optionalParams.default}` : ''}\n }`;\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 = `S.optional(S.NullOr(${propCode})${printOptionalParams(optionalParams)})`;\n } else {\n propCode = `S.optional(${propCode}${printOptionalParams(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(S.String, S.Unknown())`;\n } else if (additionalPropSchema === false) {\n code = `S.Record(S.Never, 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(S.String, ${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":[]}

@@ -485,5 +485,5 @@ function __transformExtension(filepath, extMapping) {

};
const [_argExec, argScript, ...args] = process.argv; // First two arguments should be the executable + script
// Detect if this module is being run directly from the command line
const [_argExec, argScript, ...args] = process.argv; // First two arguments should be the executable + script
if (argScript && (await fs.realpath(argScript)) === fileURLToPath(import.meta.url)) {

@@ -490,0 +490,0 @@ try {

@@ -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\nconst [_argExec, argScript, ...args] = process.argv; // First two arguments should be the executable + script\n\n// Detect if this module is being run directly from the command line\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.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":"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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;AA2GF,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;AAmCpD,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,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"}

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

{"version":3,"file":"schemaGen.d.ts","sourceRoot":"","sources":["../../../../src/generation/effSchemGen/schemaGen.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,WAAW,IAAI,OAAO,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAmB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE7F,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,cAAc,CAAC;AAK7D,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC;IAC/B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,OAAO,CAAC;CAC1D,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAAS,OAAO,UAAU,OAAO,CAAC,oBAAoB,KAAG,SAM7F,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAS,OAAO,UAAU,OAAO,CAAC,oBAAoB,KAAG,SAM1F,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAAS,OAAO,UAAU,OAAO,CAAC,oBAAoB,KAAG,SAkD5F,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAC7B,OAAO,UACJ,OAAO,CAAC,oBAAoB,KACnC,SAyCF,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAAS,OAAO,UAAU,OAAO,CAAC,oBAAoB,KAAG,SAa7F,CAAC;AAWF,eAAO,MAAM,6BAA6B,QAAS,OAAO,UAAU,OAAO,CAAC,oBAAoB,KAAG,SA8DlG,CAAC;AACF,eAAO,MAAM,uBAAuB,QAAS,OAAO,UAAU,OAAO,CAAC,oBAAoB,KAAG,SAwD5F,CAAC;AAEF,eAAO,MAAM,sBAAsB,QAAS,OAAO,UAAU,OAAO,CAAC,iBAAiB,KAAG,SAkBxF,CAAC;AAEF,eAAO,MAAM,0BAA0B,QAAS,OAAO,UAAU,OAAO,CAAC,eAAe,KAAG,SAW1F,CAAC;AAGF,eAAO,MAAM,iBAAiB,QAAS,OAAO,UAAU,aAAa,KAAG,SAoNvE,CAAC"}
{"version":3,"file":"schemaGen.d.ts","sourceRoot":"","sources":["../../../../src/generation/effSchemGen/schemaGen.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,WAAW,IAAI,OAAO,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAmB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE7F,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,cAAc,CAAC;AAK7D,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC;IAC/B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,OAAO,CAAC;CAC1D,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAAS,OAAO,UAAU,OAAO,CAAC,oBAAoB,KAAG,SAM7F,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAS,OAAO,UAAU,OAAO,CAAC,oBAAoB,KAAG,SAM1F,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAAS,OAAO,UAAU,OAAO,CAAC,oBAAoB,KAAG,SAkD5F,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAC7B,OAAO,UACJ,OAAO,CAAC,oBAAoB,KACnC,SAyCF,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAAS,OAAO,UAAU,OAAO,CAAC,oBAAoB,KAAG,SAa7F,CAAC;AAWF,eAAO,MAAM,6BAA6B,QAAS,OAAO,UAAU,OAAO,CAAC,oBAAoB,KAAG,SA8DlG,CAAC;AACF,eAAO,MAAM,uBAAuB,QAAS,OAAO,UAAU,OAAO,CAAC,oBAAoB,KAAG,SAwD5F,CAAC;AAEF,eAAO,MAAM,sBAAsB,QAAS,OAAO,UAAU,OAAO,CAAC,iBAAiB,KAAG,SAkBxF,CAAC;AAEF,eAAO,MAAM,0BAA0B,QAAS,OAAO,UAAU,OAAO,CAAC,eAAe,KAAG,SAW1F,CAAC;AAGF,eAAO,MAAM,iBAAiB,QAAS,OAAO,UAAU,aAAa,KAAG,SA0NvE,CAAC"}
{
"name": "openapi-to-effect",
"version": "0.7.1",
"version": "0.7.2",
"license": "MPL-2.0",

@@ -5,0 +5,0 @@ "homepage": "https://github.com/fortanix/openapi-to-effect",