@sdk-it/spec 0.28.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/find-polymorphic-varients.d.ts +3 -3
- package/dist/lib/find-polymorphic-varients.d.ts.map +1 -1
- package/dist/lib/find-polymorphic-varients.js.map +1 -1
- package/dist/lib/find-polymorphic-varients.test.js +2 -2
- package/dist/lib/find-polymorphic-varients.test.js.map +2 -2
- package/dist/lib/for-each-operation.d.ts +2 -2
- package/dist/lib/for-each-operation.d.ts.map +1 -1
- package/dist/lib/for-each-operation.js.map +1 -1
- package/dist/lib/get-ref-usage.d.ts +2 -2
- package/dist/lib/get-ref-usage.d.ts.map +1 -1
- package/dist/lib/get-ref-usage.js.map +1 -1
- package/dist/lib/guess/guess-resource.d.ts.map +1 -1
- package/dist/lib/ir.d.ts +4 -0
- package/dist/lib/ir.d.ts.map +1 -0
- package/dist/lib/{operation.js → ir.js} +3 -3
- package/dist/lib/ir.js.map +7 -0
- package/dist/lib/ir.test.d.ts +2 -0
- package/dist/lib/ir.test.d.ts.map +1 -0
- package/dist/lib/{operation.test.js → ir.test.js} +1 -1
- package/dist/lib/{operation.test.js.map → ir.test.js.map} +1 -1
- package/dist/lib/options.d.ts +1 -1
- package/dist/lib/options.d.ts.map +1 -1
- package/dist/lib/options.js +2 -1
- package/dist/lib/options.js.map +2 -2
- package/dist/lib/overview-docs/doc-templates.d.ts +51 -0
- package/dist/lib/overview-docs/doc-templates.d.ts.map +1 -0
- package/dist/lib/overview-docs/doc-templates.js +123 -0
- package/dist/lib/overview-docs/doc-templates.js.map +7 -0
- package/dist/lib/overview-docs/doc-text-utils.d.ts +86 -0
- package/dist/lib/overview-docs/doc-text-utils.d.ts.map +1 -0
- package/dist/lib/overview-docs/doc-text-utils.js +108 -0
- package/dist/lib/overview-docs/doc-text-utils.js.map +7 -0
- package/dist/lib/overview-docs/overview-auth.d.ts +2 -2
- package/dist/lib/overview-docs/overview-auth.d.ts.map +1 -1
- package/dist/lib/overview-docs/overview-auth.js +34 -52
- package/dist/lib/overview-docs/overview-auth.js.map +2 -2
- package/dist/lib/overview-docs/overview-docs.d.ts +2 -2
- package/dist/lib/overview-docs/overview-docs.d.ts.map +1 -1
- package/dist/lib/overview-docs/overview-docs.js.map +1 -1
- package/dist/lib/overview-docs/overview-errors.d.ts +2 -2
- package/dist/lib/overview-docs/overview-errors.d.ts.map +1 -1
- package/dist/lib/overview-docs/overview-errors.js +11 -28
- package/dist/lib/overview-docs/overview-errors.js.map +2 -2
- package/dist/lib/overview-docs/overview-intro.d.ts +2 -2
- package/dist/lib/overview-docs/overview-intro.d.ts.map +1 -1
- package/dist/lib/overview-docs/overview-intro.js +41 -36
- package/dist/lib/overview-docs/overview-intro.js.map +2 -2
- package/dist/lib/overview-docs/overview-pagination.d.ts +2 -2
- package/dist/lib/overview-docs/overview-pagination.d.ts.map +1 -1
- package/dist/lib/overview-docs/overview-pagination.js +27 -9
- package/dist/lib/overview-docs/overview-pagination.js.map +2 -2
- package/dist/lib/pagination/pagination.d.ts +2 -2
- package/dist/lib/pagination/pagination.d.ts.map +1 -1
- package/dist/lib/pagination/pagination.js.map +2 -2
- package/dist/lib/security.d.ts +3 -3
- package/dist/lib/security.d.ts.map +1 -1
- package/dist/lib/security.js.map +2 -2
- package/dist/lib/sidebar.d.ts +2 -2
- package/dist/lib/sidebar.d.ts.map +1 -1
- package/dist/lib/sidebar.js.map +2 -2
- package/dist/lib/tune-request-body.d.ts +3 -3
- package/dist/lib/tune-request-body.d.ts.map +1 -1
- package/dist/lib/tune-request-body.js.map +1 -1
- package/dist/lib/tune-response.d.ts +2 -2
- package/dist/lib/tune-response.d.ts.map +1 -1
- package/dist/lib/tune-response.js.map +1 -1
- package/dist/lib/tune.d.ts +3 -3
- package/dist/lib/tune.d.ts.map +1 -1
- package/dist/lib/tune.js.map +1 -1
- package/dist/lib/tune.test.js +2 -2
- package/dist/lib/tune.test.js.map +2 -2
- package/dist/lib/types.d.ts +3 -2
- package/dist/lib/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/lib/operation.d.ts +0 -4
- package/dist/lib/operation.d.ts.map +0 -1
- package/dist/lib/operation.js.map +0 -7
- package/dist/lib/operation.test.d.ts +0 -2
- package/dist/lib/operation.test.d.ts.map +0 -1
- package/dist/lib/overview-docs/overview-quick-reference.d.ts +0 -4
- package/dist/lib/overview-docs/overview-quick-reference.d.ts.map +0 -1
- package/dist/lib/overview-docs/overview-sdk-examples.d.ts +0 -4
- package/dist/lib/overview-docs/overview-sdk-examples.d.ts.map +0 -1
- package/dist/lib/overview-docs/overview-usage.d.ts +0 -4
- package/dist/lib/overview-docs/overview-usage.d.ts.map +0 -1
- package/dist/lib/overview-docs.d.ts +0 -4
- package/dist/lib/overview-docs.d.ts.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -4,13 +4,13 @@ export * from './lib/find-unique-schema-name.js';
|
|
|
4
4
|
export * from './lib/for-each-operation.js';
|
|
5
5
|
export * from './lib/format-name.js';
|
|
6
6
|
export * from './lib/get-ref-usage.js';
|
|
7
|
+
export * from './lib/ir.js';
|
|
7
8
|
export * from './lib/is-primitive-schema.js';
|
|
8
9
|
export * from './lib/is.js';
|
|
9
10
|
export * from './lib/loaders/load-spec.js';
|
|
10
11
|
export * from './lib/loaders/local-loader.js';
|
|
11
12
|
export * from './lib/loaders/remote-loader.js';
|
|
12
13
|
export * from './lib/metadata.js';
|
|
13
|
-
export * from './lib/operation.js';
|
|
14
14
|
export * from './lib/options.js';
|
|
15
15
|
export * from './lib/overview-docs/overview-errors.js';
|
|
16
16
|
export * from './lib/reserved-keywords.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wCAAwC,CAAC;AACvD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,13 +4,13 @@ export * from "./lib/find-unique-schema-name.js";
|
|
|
4
4
|
export * from "./lib/for-each-operation.js";
|
|
5
5
|
export * from "./lib/format-name.js";
|
|
6
6
|
export * from "./lib/get-ref-usage.js";
|
|
7
|
+
export * from "./lib/ir.js";
|
|
7
8
|
export * from "./lib/is-primitive-schema.js";
|
|
8
9
|
export * from "./lib/is.js";
|
|
9
10
|
export * from "./lib/loaders/load-spec.js";
|
|
10
11
|
export * from "./lib/loaders/local-loader.js";
|
|
11
12
|
export * from "./lib/loaders/remote-loader.js";
|
|
12
13
|
export * from "./lib/metadata.js";
|
|
13
|
-
export * from "./lib/operation.js";
|
|
14
14
|
export * from "./lib/options.js";
|
|
15
15
|
export * from "./lib/overview-docs/overview-errors.js";
|
|
16
16
|
export * from "./lib/reserved-keywords.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["export * from './lib/create-operation.js';\nexport * from './lib/find-polymorphic-varients.js';\nexport * from './lib/find-unique-schema-name.js';\nexport * from './lib/for-each-operation.js';\nexport * from './lib/format-name.js';\nexport * from './lib/get-ref-usage.js';\nexport * from './lib/is-primitive-schema.js';\nexport * from './lib/is.js';\nexport * from './lib/loaders/load-spec.js';\nexport * from './lib/loaders/local-loader.js';\nexport * from './lib/loaders/remote-loader.js';\nexport * from './lib/metadata.js';\nexport * from './lib/
|
|
4
|
+
"sourcesContent": ["export * from './lib/create-operation.js';\nexport * from './lib/find-polymorphic-varients.js';\nexport * from './lib/find-unique-schema-name.js';\nexport * from './lib/for-each-operation.js';\nexport * from './lib/format-name.js';\nexport * from './lib/get-ref-usage.js';\nexport * from './lib/ir.js';\nexport * from './lib/is-primitive-schema.js';\nexport * from './lib/is.js';\nexport * from './lib/loaders/load-spec.js';\nexport * from './lib/loaders/local-loader.js';\nexport * from './lib/loaders/remote-loader.js';\nexport * from './lib/metadata.js';\nexport * from './lib/options.js';\nexport * from './lib/overview-docs/overview-errors.js';\nexport * from './lib/reserved-keywords.js';\nexport * from './lib/security.js';\nexport * from './lib/sidebar.js';\nexport * from './lib/tag.js';\nexport * from './lib/tune-request-body.js';\nexport * from './lib/tune-response.js';\nexport * from './lib/tune.js';\nexport * from './lib/types.js';\n"],
|
|
5
5
|
"mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ReferenceObject, SchemaObject, SchemaObjectType } from 'openapi3-ts/oas31';
|
|
2
|
-
import type {
|
|
2
|
+
import type { IR } from './types.js';
|
|
3
3
|
export type Varient = {
|
|
4
4
|
name: string;
|
|
5
5
|
type: string;
|
|
@@ -10,6 +10,6 @@ export type Varient = {
|
|
|
10
10
|
static?: boolean;
|
|
11
11
|
subtype?: SchemaObjectType;
|
|
12
12
|
};
|
|
13
|
-
export declare function findVarients(spec:
|
|
14
|
-
export declare function findPolymorphicVarients(spec:
|
|
13
|
+
export declare function findVarients(spec: IR, schemas: (SchemaObject | ReferenceObject)[]): Varient[];
|
|
14
|
+
export declare function findPolymorphicVarients(spec: IR, schemas: (SchemaObject | ReferenceObject)[]): Varient[];
|
|
15
15
|
//# sourceMappingURL=find-polymorphic-varients.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-polymorphic-varients.d.ts","sourceRoot":"","sources":["../../src/lib/find-polymorphic-varients.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"find-polymorphic-varients.d.ts","sourceRoot":"","sources":["../../src/lib/find-polymorphic-varients.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AA4EF,wBAAgB,YAAY,CAC1B,IAAI,EAAE,EAAE,EACR,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE,GAC1C,OAAO,EAAE,CA+QX;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,EAAE,EACR,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE,GAC1C,OAAO,EAAE,CAQX"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/find-polymorphic-varients.ts"],
|
|
4
|
-
"sourcesContent": ["import { groupBy, uniqBy } from 'lodash-es';\nimport type {\n ReferenceObject,\n SchemaObject,\n SchemaObjectType,\n} from 'openapi3-ts/oas31';\n\nimport { camelcase, isEmpty, isRef, resolveRef } from '@sdk-it/core';\n\nimport { coerceTypes } from './tune.js';\nimport type { OurOpenAPIObject } from './types.js';\n\nexport type Varient = {\n name: string;\n type: string;\n position: number;\n priority?: number;\n description?: string;\n source?: string;\n static?: boolean;\n subtype?: SchemaObjectType;\n};\n\nconst groupSchemasByType = (\n spec: OurOpenAPIObject,\n schemas: (SchemaObject | ReferenceObject)[],\n) => {\n const groups = schemas.reduce<\n Partial<{\n [K in\n | SchemaObjectType\n | '$ref'\n | 'oneOf'\n | 'anyOf']: K extends SchemaObjectType\n ? { schema: SchemaObject; position: number }[]\n : K extends 'oneOf' | 'anyOf'\n ? { schema: (SchemaObject | ReferenceObject)[]; position: number }[]\n : { schema: ReferenceObject; position: number }[];\n }>\n >((acc, schema, index) => {\n if (isRef(schema)) {\n const referenced = resolveRef<SchemaObject>(spec, schema);\n const [type] = coerceTypes(referenced, false);\n acc[type] ??= [];\n acc[type].push({ schema: referenced, position: index });\n return acc;\n }\n\n if (isRef(schema.items)) {\n const referenced = resolveRef<SchemaObject>(spec, schema.items);\n acc.array ??= [];\n acc.array.push({\n schema: { ...schema, items: referenced },\n position: index,\n });\n return acc;\n }\n if (schema.oneOf) {\n acc['oneOf'] ??= [];\n acc['oneOf'].push({ schema: schema.oneOf, position: index });\n return acc;\n }\n if (schema.anyOf) {\n acc['oneOf'] ??= [];\n acc['oneOf'].push({ schema: schema.anyOf, position: index });\n return acc;\n }\n if (schema.const) {\n switch (typeof schema.const) {\n case 'string':\n acc.string ??= [];\n acc.string.push({ schema, position: index });\n return acc;\n case 'number':\n acc.number ??= [];\n acc.number.push({ schema, position: index });\n return acc;\n case 'boolean':\n acc.boolean ??= [];\n acc.boolean.push({ schema, position: index });\n return acc;\n default:\n throw new Error(\n `Unsupported const type: ${typeof schema.const} for ${schema.const}`,\n );\n }\n }\n\n const [type] = coerceTypes(schema, false);\n acc[type] ??= [];\n acc[type].push({ schema, position: index });\n return acc;\n }, {});\n\n return groups;\n};\n\nexport function findVarients(\n spec: OurOpenAPIObject,\n schemas: (SchemaObject | ReferenceObject)[],\n): Varient[] {\n let varients: Varient[] = [];\n const schemasByType = groupSchemasByType(spec, schemas);\n if (!isEmpty(schemasByType.string)) {\n for (const { schema, position } of schemasByType.string) {\n if (schema.const !== undefined) {\n varients.push({\n name: schema.const || 'empty',\n type: 'string',\n position,\n priority: 100 - varients.length,\n });\n continue;\n }\n\n if (schema.format) {\n varients.push({\n name: camelcase(schema.format),\n type: 'string',\n position,\n priority: 90 - varients.length,\n });\n continue;\n }\n\n // if (!isEmpty(schema.enum)) {\n // for (const enumValue of schema.enum) {\n // if (enumValue === '') {\n // varients.push({\n // name: 'empty',\n // type: 'string',\n // position,\n // priority: 80 - varients.length,\n // });\n // continue;\n // }\n // varients.push({\n // name: enumValue,\n // type: 'string',\n // position,\n // priority: 80 - varients.length,\n // });\n // }\n // continue;\n // }\n\n varients.push({ name: 'textContent', type: 'string', position });\n }\n varients = uniqBy(varients, (it) => it.name);\n }\n\n if (!isEmpty(schemasByType.number) || !isEmpty(schemasByType.integer)) {\n const schemas = [\n ...(schemasByType.number ?? []),\n ...(schemasByType.integer ?? []),\n ];\n for (const { schema, position } of schemas) {\n if (schema.format === 'int64') {\n varients.push({\n name: 'integer',\n type: 'number',\n position,\n priority: 90 - varients.length,\n });\n continue;\n }\n if (schema.format === 'float') {\n varients.push({\n name: 'float',\n type: 'number',\n position,\n priority: 90 - varients.length,\n });\n continue;\n }\n if (schema.format === 'double') {\n varients.push({\n name: 'double',\n type: 'number',\n position,\n priority: 90 - varients.length,\n });\n continue;\n }\n varients.push({ name: 'number', type: 'number', position });\n }\n }\n\n if (!isEmpty(schemasByType.array)) {\n for (const { schema, position } of schemasByType.array) {\n const items = schema.items;\n if (!items) {\n varients.push({ name: 'any', type: 'array', position });\n continue;\n }\n const [type] = coerceTypes(items as SchemaObject);\n if (type === 'string') {\n varients.push({\n name: 'textList',\n type: 'array',\n subtype: 'string',\n position,\n });\n continue;\n }\n if (type === 'number') {\n varients.push({\n name: 'numList',\n type: 'array',\n subtype: 'number',\n position,\n });\n continue;\n }\n if (type === 'integer') {\n varients.push({\n name: 'intList',\n type: 'array',\n subtype: 'integer',\n position,\n });\n continue;\n }\n if (type === 'object') {\n const subvarients = findVarients(spec, [items]);\n for (const subvarient of subvarients) {\n varients.push({\n ...subvarient,\n type: 'array',\n position,\n });\n }\n continue;\n }\n if (type === 'array') {\n const subvarients = findVarients(spec, [items]);\n for (const subvarient of subvarients) {\n varients.push({\n ...subvarient,\n name: `${subvarient.name}Matrix`,\n type: 'array',\n position,\n });\n }\n continue;\n }\n varients.push({ name: 'list', type: 'array', position });\n }\n }\n\n if (!isEmpty(schemasByType.$ref)) {\n const subvarients = findVarients(\n spec,\n schemasByType.$ref.map((it) => resolveRef(spec, it.schema)),\n );\n varients.push(\n ...subvarients.map((it) => ({\n ...it,\n })),\n );\n }\n\n if (!isEmpty(schemasByType.oneOf)) {\n for (const { schema, position } of schemasByType.oneOf) {\n const subvarients = findVarients(spec, schema);\n varients.push(\n ...subvarients.map((it) => ({\n ...it,\n position,\n })),\n );\n }\n }\n\n const matrix: Varient[][] = [];\n\n for (const { schema, position } of schemasByType.object ?? []) {\n if (\n schema.additionalProperties ||\n isEmpty({ ...schema.properties, ...schema['x-properties'] })\n ) {\n continue;\n }\n\n for (const key of ['properties', 'x-properties'] as const) {\n if (!schema[key]) continue;\n const list = (\n Object.entries(schema[key]) as [\n string,\n SchemaObject | ReferenceObject,\n ][]\n ).map(([name, schemaOrRef]) => {\n const schema = resolveRef<SchemaObject>(spec, schemaOrRef);\n name = schema.const ?? schema.enum?.[0] ?? name;\n if (schema.type === 'string') {\n return {\n priority:\n schema.const !== undefined || schema.enum?.[0] !== undefined\n ? 100 - matrix.length\n : undefined,\n static: true,\n subtype: 'string',\n source: name,\n name: name,\n type: 'object',\n position,\n } satisfies Varient;\n }\n return {\n subtype: 'string',\n source: name,\n name: name,\n type: 'object',\n position,\n } satisfies Varient;\n });\n matrix.push([...new Set(list)].sort((a) => (a.static ? -1 : 1)));\n }\n if (matrix.length === 0) {\n throw new Error(\n 'No valid objects found. Please check your OpenAPI spec.',\n );\n }\n let discriminatorProp: Varient | undefined;\n const firstRow = matrix[0];\n for (const prop of firstRow) {\n // check if this prop is exists across all rows\n const existsCrossAllRows = matrix.every((row) => row.includes(prop));\n if (existsCrossAllRows) {\n discriminatorProp = prop;\n break;\n }\n }\n }\n\n for (const row of matrix) {\n for (const prop of row) {\n // check if this prop is unique across all rows\n const isUnique = matrix.every((it) =>\n it === row ? true : !it.some((p) => p.name === prop.name),\n );\n if (isUnique) {\n varients.push(prop);\n break;\n }\n }\n }\n\n // Sort all variants by priority (highest first), then by original position\n return varients.sort((a, b) => {\n const aHasPriority = a.priority !== undefined;\n const bHasPriority = b.priority !== undefined;\n\n if (aHasPriority && bHasPriority) {\n // Both have priority\n if (a.priority !== b.priority) {\n return b.priority! - a.priority!; // Higher priority first\n }\n // Priorities are equal, sort by original position as a tie-breaker\n return a.position - b.position;\n } else if (aHasPriority) {\n return -1; // 'a' comes first\n } else if (bHasPriority) {\n return 1; // 'b' comes first\n } else {\n // Neither has priority. Keep their relative order from before this sort.\n // This relies on a stable sort (standard in ES2019+).\n // Returning 0 preserves the order in which they were added to the 'varients' array.\n return 0;\n }\n });\n}\n\nexport function findPolymorphicVarients(\n spec: OurOpenAPIObject,\n schemas: (SchemaObject | ReferenceObject)[],\n): Varient[] {\n const varients = findVarients(spec, schemas);\n // prepend '-' to prevent key sortings\n return Object.values(groupBy(varients, (it) => '-' + it.position)).map(\n (group) => {\n return (group ?? [])[0];\n },\n );\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { groupBy, uniqBy } from 'lodash-es';\nimport type {\n ReferenceObject,\n SchemaObject,\n SchemaObjectType,\n} from 'openapi3-ts/oas31';\n\nimport { camelcase, isEmpty, isRef, resolveRef } from '@sdk-it/core';\n\nimport { coerceTypes } from './tune.js';\nimport type { IR } from './types.js';\n\nexport type Varient = {\n name: string;\n type: string;\n position: number;\n priority?: number;\n description?: string;\n source?: string;\n static?: boolean;\n subtype?: SchemaObjectType;\n};\n\nconst groupSchemasByType = (\n spec: IR,\n schemas: (SchemaObject | ReferenceObject)[],\n) => {\n const groups = schemas.reduce<\n Partial<{\n [K in\n | SchemaObjectType\n | '$ref'\n | 'oneOf'\n | 'anyOf']: K extends SchemaObjectType\n ? { schema: SchemaObject; position: number }[]\n : K extends 'oneOf' | 'anyOf'\n ? { schema: (SchemaObject | ReferenceObject)[]; position: number }[]\n : { schema: ReferenceObject; position: number }[];\n }>\n >((acc, schema, index) => {\n if (isRef(schema)) {\n const referenced = resolveRef<SchemaObject>(spec, schema);\n const [type] = coerceTypes(referenced, false);\n acc[type] ??= [];\n acc[type].push({ schema: referenced, position: index });\n return acc;\n }\n\n if (isRef(schema.items)) {\n const referenced = resolveRef<SchemaObject>(spec, schema.items);\n acc.array ??= [];\n acc.array.push({\n schema: { ...schema, items: referenced },\n position: index,\n });\n return acc;\n }\n if (schema.oneOf) {\n acc['oneOf'] ??= [];\n acc['oneOf'].push({ schema: schema.oneOf, position: index });\n return acc;\n }\n if (schema.anyOf) {\n acc['oneOf'] ??= [];\n acc['oneOf'].push({ schema: schema.anyOf, position: index });\n return acc;\n }\n if (schema.const) {\n switch (typeof schema.const) {\n case 'string':\n acc.string ??= [];\n acc.string.push({ schema, position: index });\n return acc;\n case 'number':\n acc.number ??= [];\n acc.number.push({ schema, position: index });\n return acc;\n case 'boolean':\n acc.boolean ??= [];\n acc.boolean.push({ schema, position: index });\n return acc;\n default:\n throw new Error(\n `Unsupported const type: ${typeof schema.const} for ${schema.const}`,\n );\n }\n }\n\n const [type] = coerceTypes(schema, false);\n acc[type] ??= [];\n acc[type].push({ schema, position: index });\n return acc;\n }, {});\n\n return groups;\n};\n\nexport function findVarients(\n spec: IR,\n schemas: (SchemaObject | ReferenceObject)[],\n): Varient[] {\n let varients: Varient[] = [];\n const schemasByType = groupSchemasByType(spec, schemas);\n if (!isEmpty(schemasByType.string)) {\n for (const { schema, position } of schemasByType.string) {\n if (schema.const !== undefined) {\n varients.push({\n name: schema.const || 'empty',\n type: 'string',\n position,\n priority: 100 - varients.length,\n });\n continue;\n }\n\n if (schema.format) {\n varients.push({\n name: camelcase(schema.format),\n type: 'string',\n position,\n priority: 90 - varients.length,\n });\n continue;\n }\n\n // if (!isEmpty(schema.enum)) {\n // for (const enumValue of schema.enum) {\n // if (enumValue === '') {\n // varients.push({\n // name: 'empty',\n // type: 'string',\n // position,\n // priority: 80 - varients.length,\n // });\n // continue;\n // }\n // varients.push({\n // name: enumValue,\n // type: 'string',\n // position,\n // priority: 80 - varients.length,\n // });\n // }\n // continue;\n // }\n\n varients.push({ name: 'textContent', type: 'string', position });\n }\n varients = uniqBy(varients, (it) => it.name);\n }\n\n if (!isEmpty(schemasByType.number) || !isEmpty(schemasByType.integer)) {\n const schemas = [\n ...(schemasByType.number ?? []),\n ...(schemasByType.integer ?? []),\n ];\n for (const { schema, position } of schemas) {\n if (schema.format === 'int64') {\n varients.push({\n name: 'integer',\n type: 'number',\n position,\n priority: 90 - varients.length,\n });\n continue;\n }\n if (schema.format === 'float') {\n varients.push({\n name: 'float',\n type: 'number',\n position,\n priority: 90 - varients.length,\n });\n continue;\n }\n if (schema.format === 'double') {\n varients.push({\n name: 'double',\n type: 'number',\n position,\n priority: 90 - varients.length,\n });\n continue;\n }\n varients.push({ name: 'number', type: 'number', position });\n }\n }\n\n if (!isEmpty(schemasByType.array)) {\n for (const { schema, position } of schemasByType.array) {\n const items = schema.items;\n if (!items) {\n varients.push({ name: 'any', type: 'array', position });\n continue;\n }\n const [type] = coerceTypes(items as SchemaObject);\n if (type === 'string') {\n varients.push({\n name: 'textList',\n type: 'array',\n subtype: 'string',\n position,\n });\n continue;\n }\n if (type === 'number') {\n varients.push({\n name: 'numList',\n type: 'array',\n subtype: 'number',\n position,\n });\n continue;\n }\n if (type === 'integer') {\n varients.push({\n name: 'intList',\n type: 'array',\n subtype: 'integer',\n position,\n });\n continue;\n }\n if (type === 'object') {\n const subvarients = findVarients(spec, [items]);\n for (const subvarient of subvarients) {\n varients.push({\n ...subvarient,\n type: 'array',\n position,\n });\n }\n continue;\n }\n if (type === 'array') {\n const subvarients = findVarients(spec, [items]);\n for (const subvarient of subvarients) {\n varients.push({\n ...subvarient,\n name: `${subvarient.name}Matrix`,\n type: 'array',\n position,\n });\n }\n continue;\n }\n varients.push({ name: 'list', type: 'array', position });\n }\n }\n\n if (!isEmpty(schemasByType.$ref)) {\n const subvarients = findVarients(\n spec,\n schemasByType.$ref.map((it) => resolveRef(spec, it.schema)),\n );\n varients.push(\n ...subvarients.map((it) => ({\n ...it,\n })),\n );\n }\n\n if (!isEmpty(schemasByType.oneOf)) {\n for (const { schema, position } of schemasByType.oneOf) {\n const subvarients = findVarients(spec, schema);\n varients.push(\n ...subvarients.map((it) => ({\n ...it,\n position,\n })),\n );\n }\n }\n\n const matrix: Varient[][] = [];\n\n for (const { schema, position } of schemasByType.object ?? []) {\n if (\n schema.additionalProperties ||\n isEmpty({ ...schema.properties, ...schema['x-properties'] })\n ) {\n continue;\n }\n\n for (const key of ['properties', 'x-properties'] as const) {\n if (!schema[key]) continue;\n const list = (\n Object.entries(schema[key]) as [\n string,\n SchemaObject | ReferenceObject,\n ][]\n ).map(([name, schemaOrRef]) => {\n const schema = resolveRef<SchemaObject>(spec, schemaOrRef);\n name = schema.const ?? schema.enum?.[0] ?? name;\n if (schema.type === 'string') {\n return {\n priority:\n schema.const !== undefined || schema.enum?.[0] !== undefined\n ? 100 - matrix.length\n : undefined,\n static: true,\n subtype: 'string',\n source: name,\n name: name,\n type: 'object',\n position,\n } satisfies Varient;\n }\n return {\n subtype: 'string',\n source: name,\n name: name,\n type: 'object',\n position,\n } satisfies Varient;\n });\n matrix.push([...new Set(list)].sort((a) => (a.static ? -1 : 1)));\n }\n if (matrix.length === 0) {\n throw new Error(\n 'No valid objects found. Please check your OpenAPI spec.',\n );\n }\n let discriminatorProp: Varient | undefined;\n const firstRow = matrix[0];\n for (const prop of firstRow) {\n // check if this prop is exists across all rows\n const existsCrossAllRows = matrix.every((row) => row.includes(prop));\n if (existsCrossAllRows) {\n discriminatorProp = prop;\n break;\n }\n }\n }\n\n for (const row of matrix) {\n for (const prop of row) {\n // check if this prop is unique across all rows\n const isUnique = matrix.every((it) =>\n it === row ? true : !it.some((p) => p.name === prop.name),\n );\n if (isUnique) {\n varients.push(prop);\n break;\n }\n }\n }\n\n // Sort all variants by priority (highest first), then by original position\n return varients.sort((a, b) => {\n const aHasPriority = a.priority !== undefined;\n const bHasPriority = b.priority !== undefined;\n\n if (aHasPriority && bHasPriority) {\n // Both have priority\n if (a.priority !== b.priority) {\n return b.priority! - a.priority!; // Higher priority first\n }\n // Priorities are equal, sort by original position as a tie-breaker\n return a.position - b.position;\n } else if (aHasPriority) {\n return -1; // 'a' comes first\n } else if (bHasPriority) {\n return 1; // 'b' comes first\n } else {\n // Neither has priority. Keep their relative order from before this sort.\n // This relies on a stable sort (standard in ES2019+).\n // Returning 0 preserves the order in which they were added to the 'varients' array.\n return 0;\n }\n });\n}\n\nexport function findPolymorphicVarients(\n spec: IR,\n schemas: (SchemaObject | ReferenceObject)[],\n): Varient[] {\n const varients = findVarients(spec, schemas);\n // prepend '-' to prevent key sortings\n return Object.values(groupBy(varients, (it) => '-' + it.position)).map(\n (group) => {\n return (group ?? [])[0];\n },\n );\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["type", "schemas", "schema"]
|
|
7
7
|
}
|
|
@@ -5,9 +5,9 @@ import {
|
|
|
5
5
|
findPolymorphicVarients,
|
|
6
6
|
findVarients
|
|
7
7
|
} from "./find-polymorphic-varients.ts";
|
|
8
|
-
import {
|
|
8
|
+
import { toIR } from "./ir.ts";
|
|
9
9
|
function createSpec(openapi) {
|
|
10
|
-
return
|
|
10
|
+
return toIR(
|
|
11
11
|
{
|
|
12
12
|
spec: merge(
|
|
13
13
|
{
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/find-polymorphic-varients.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { merge } from 'lodash-es';\nimport assert from 'node:assert';\nimport { describe, it } from 'node:test';\nimport type { OpenAPIObject, SchemaObject } from 'openapi3-ts/oas31';\n\nimport {\n type Varient,\n findPolymorphicVarients,\n findVarients,\n} from './find-polymorphic-varients.ts';\nimport { augmentSpec } from './operation.ts';\nimport type { OurOpenAPIObject } from './types.ts';\n\nfunction createSpec(openapi?: Partial<OpenAPIObject>): OurOpenAPIObject {\n return augmentSpec(\n {\n spec: merge(\n {\n openapi: '3.1.0',\n info: {\n title: 'Test API',\n version: '1.0.0',\n },\n components: {\n schemas: {},\n securitySchemes: {},\n },\n paths: {},\n },\n openapi,\n ),\n },\n true,\n );\n}\ndescribe('findVarients', () => {\n describe('strings', () => {\n it('names string type as text', () => {\n const spec = createSpec();\n const result = findVarients(spec, [{ type: 'string' }]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'text',\n position: 0,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n it('names string based on format', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n {\n type: 'string',\n format: 'date-time',\n },\n { type: 'string' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'dateTime',\n position: 0,\n priority: 90,\n type: 'string',\n },\n {\n name: 'text',\n position: 1,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it('names string based on const value', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n { type: 'string', const: 'active' },\n { type: 'string', const: '' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'active',\n position: 0,\n priority: 100,\n type: 'string',\n },\n {\n name: 'empty',\n position: 1,\n priority: 99,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it.skip('names string based on enum values', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n { type: 'string', enum: ['pending', 'completed', ''] },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'pending',\n position: 0,\n priority: 80,\n type: 'string',\n },\n {\n name: 'completed',\n position: 0,\n priority: 79,\n type: 'string',\n },\n {\n name: 'empty',\n position: 0,\n priority: 78,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it.skip('prioritizes const first', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n { type: 'string', format: 'email' },\n { type: 'string', const: 'fixed' },\n { type: 'string', enum: ['option1', 'option2'] },\n { type: 'string' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'fixed',\n position: 1,\n priority: 99,\n type: 'string',\n },\n {\n name: 'email',\n position: 0,\n priority: 90,\n type: 'string',\n },\n {\n name: 'option1',\n position: 2,\n priority: 78,\n type: 'string',\n },\n {\n name: 'option2',\n position: 2,\n priority: 77,\n type: 'string',\n },\n {\n name: 'text',\n position: 3,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it('handles format priority over enum', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n { type: 'string', format: 'email', enum: ['user@example.com'] },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'email',\n position: 0,\n priority: 90,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it('handles const priority over enum', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n { type: 'string', const: 'fixed', enum: ['option1', 'option2'] },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'fixed',\n position: 0,\n priority: 100,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it('handles complex format names with camelCase conversion', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n { type: 'string', format: 'date-time' },\n { type: 'string', format: 'iso-8601' },\n { type: 'string', format: 'binary' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'dateTime',\n position: 0,\n priority: 90,\n type: 'string',\n },\n {\n name: 'iso8601',\n position: 1,\n priority: 89,\n type: 'string',\n },\n {\n name: 'binary',\n position: 2,\n priority: 88,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n });\n\n describe('numbers', () => {\n it('names number type as number', () => {\n const spec = createSpec();\n const result = findVarients(spec, [{ type: 'number' }]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'number',\n position: 0,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n\n it('names integer type as integer', () => {\n const spec = createSpec();\n const result = findVarients(spec, [{ type: 'integer' }]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'number',\n position: 0,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n\n it('names number based on format', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n {\n type: 'number',\n format: 'float',\n },\n {\n type: 'number',\n format: 'double',\n },\n {\n type: 'integer',\n format: 'int64',\n },\n { type: 'number' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'float',\n position: 0,\n priority: 90,\n type: 'number',\n },\n {\n name: 'double',\n position: 1,\n priority: 89,\n type: 'number',\n },\n {\n name: 'integer',\n position: 2,\n priority: 87,\n type: 'number',\n },\n {\n name: 'number',\n position: 3,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n });\n\n describe('mixed types', () => {\n it('handles mixed string and number types', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n { type: 'number' },\n { type: 'string' },\n ]);\n assert.deepStrictEqual(result, [\n {\n name: 'text',\n position: 1,\n type: 'string',\n },\n {\n name: 'number',\n position: 0,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n });\n});\n\ndescribe('findPolymorphicVarients', () => {\n describe('strings', () => {\n it('returns single variant per position for multiple strings', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'string', format: 'date-time' },\n { type: 'string' },\n { type: 'string', const: 'active' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'active',\n position: 2,\n priority: 98,\n type: 'string',\n },\n {\n name: 'dateTime',\n position: 0,\n priority: 90,\n type: 'string',\n },\n {\n name: 'text',\n position: 1,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it.skip('returns first variant when multiple enums at same position', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'string', enum: ['first', 'second', 'third'] },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'first',\n position: 0,\n priority: 80,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it.skip('selects first variant from multiple at same position', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'string', enum: ['option1', 'option2'] },\n { type: 'string', format: 'email' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'email',\n position: 1,\n priority: 88,\n type: 'string',\n },\n {\n name: 'option1',\n position: 0,\n priority: 80,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it.skip('handles mixed types selecting one per position', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'string', enum: ['a', 'b'] },\n { type: 'number' },\n { type: 'string', const: 'fixed' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'fixed',\n position: 2,\n priority: 98,\n type: 'string',\n },\n {\n name: 'a',\n position: 0,\n priority: 80,\n type: 'string',\n },\n {\n name: 'number',\n position: 1,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n\n it('handles plain strings mixed with formatted strings', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'string' },\n { type: 'string', format: 'password' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'password',\n position: 1,\n priority: 89,\n type: 'string',\n },\n {\n name: 'text',\n position: 0,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n it('ignore duplicates', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'string' },\n { type: 'string', format: 'password' },\n { type: 'string' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'password',\n position: 1,\n priority: 89,\n type: 'string',\n },\n {\n name: 'text',\n position: 0,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n });\n\n describe('numbers', () => {\n it('returns single variant per position for multiple numbers', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'number', format: 'float' },\n { type: 'integer' },\n { type: 'number', format: 'double' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'float',\n position: 0,\n priority: 90,\n type: 'number',\n },\n {\n name: 'double',\n position: 2,\n priority: 89,\n type: 'number',\n },\n {\n name: 'number',\n position: 1,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n\n it('returns first variant when multiple number formats at same position', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'number', format: 'float' },\n { type: 'number', format: 'double' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'float',\n position: 0,\n priority: 90,\n type: 'number',\n },\n {\n name: 'double',\n position: 1,\n priority: 89,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n\n it('handles mixed number and integer types', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'integer', format: 'int64' },\n { type: 'number' },\n { type: 'integer' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'integer',\n position: 0,\n priority: 89,\n type: 'number',\n },\n {\n name: 'number',\n position: 1,\n type: 'number',\n },\n {\n name: 'number',\n position: 2,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n\n it('handles plain numbers mixed with formatted numbers', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'number' },\n { type: 'number', format: 'float' },\n { type: 'number' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'float',\n position: 1,\n priority: 89,\n type: 'number',\n },\n {\n name: 'number',\n position: 0,\n type: 'number',\n },\n {\n name: 'number',\n position: 2,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n });\n\n describe('arrays', () => {\n it.only('complex', () => {\n const spec = createSpec({\n components: {\n schemas: {\n RouteConfig: {\n anyOf: [\n {\n type: 'array',\n items: {\n anyOf: [\n {\n type: 'string',\n enum: ['image', 'video', 'audio'],\n },\n {\n type: 'string',\n enum: [\n 'application/andrew-inset',\n 'application/applixware',\n ],\n },\n ],\n },\n },\n {\n type: 'object',\n additionalProperties: {\n type: 'object',\n properties: {\n maxFileSize: {\n type: 'string',\n description:\n 'The maximum file size allowed for a given file type.',\n example: '4MB',\n },\n maxFileCount: {\n type: 'number',\n description:\n 'Maximum allowed files for a given file type.',\n example: 1,\n },\n contentDisposition: {\n type: 'string',\n enum: ['inline', 'attachment'],\n default: 'inline',\n },\n acl: {\n type: 'string',\n enum: ['public-read', 'private'],\n },\n },\n },\n },\n ],\n },\n },\n },\n });\n const varients = findVarients(\n spec,\n (spec.components.schemas.RouteConfig as SchemaObject).anyOf ?? [],\n );\n\n assert.deepStrictEqual(varients, [\n {\n name: 'textList',\n type: 'array',\n subtype: 'string',\n position: 0,\n },\n {\n static: true,\n subtype: 'string',\n source: 'public-read',\n name: 'public-read',\n type: 'object',\n position: 1,\n },\n ]);\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { merge } from 'lodash-es';\nimport assert from 'node:assert';\nimport { describe, it } from 'node:test';\nimport type { OpenAPIObject, SchemaObject } from 'openapi3-ts/oas31';\n\nimport {\n type Varient,\n findPolymorphicVarients,\n findVarients,\n} from './find-polymorphic-varients.ts';\nimport { toIR } from './ir.ts';\nimport type { IR } from './types.ts';\n\nfunction createSpec(openapi?: Partial<OpenAPIObject>): IR {\n return toIR(\n {\n spec: merge(\n {\n openapi: '3.1.0',\n info: {\n title: 'Test API',\n version: '1.0.0',\n },\n components: {\n schemas: {},\n securitySchemes: {},\n },\n paths: {},\n },\n openapi,\n ),\n },\n true,\n );\n}\ndescribe('findVarients', () => {\n describe('strings', () => {\n it('names string type as text', () => {\n const spec = createSpec();\n const result = findVarients(spec, [{ type: 'string' }]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'text',\n position: 0,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n it('names string based on format', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n {\n type: 'string',\n format: 'date-time',\n },\n { type: 'string' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'dateTime',\n position: 0,\n priority: 90,\n type: 'string',\n },\n {\n name: 'text',\n position: 1,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it('names string based on const value', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n { type: 'string', const: 'active' },\n { type: 'string', const: '' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'active',\n position: 0,\n priority: 100,\n type: 'string',\n },\n {\n name: 'empty',\n position: 1,\n priority: 99,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it.skip('names string based on enum values', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n { type: 'string', enum: ['pending', 'completed', ''] },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'pending',\n position: 0,\n priority: 80,\n type: 'string',\n },\n {\n name: 'completed',\n position: 0,\n priority: 79,\n type: 'string',\n },\n {\n name: 'empty',\n position: 0,\n priority: 78,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it.skip('prioritizes const first', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n { type: 'string', format: 'email' },\n { type: 'string', const: 'fixed' },\n { type: 'string', enum: ['option1', 'option2'] },\n { type: 'string' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'fixed',\n position: 1,\n priority: 99,\n type: 'string',\n },\n {\n name: 'email',\n position: 0,\n priority: 90,\n type: 'string',\n },\n {\n name: 'option1',\n position: 2,\n priority: 78,\n type: 'string',\n },\n {\n name: 'option2',\n position: 2,\n priority: 77,\n type: 'string',\n },\n {\n name: 'text',\n position: 3,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it('handles format priority over enum', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n { type: 'string', format: 'email', enum: ['user@example.com'] },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'email',\n position: 0,\n priority: 90,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it('handles const priority over enum', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n { type: 'string', const: 'fixed', enum: ['option1', 'option2'] },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'fixed',\n position: 0,\n priority: 100,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it('handles complex format names with camelCase conversion', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n { type: 'string', format: 'date-time' },\n { type: 'string', format: 'iso-8601' },\n { type: 'string', format: 'binary' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'dateTime',\n position: 0,\n priority: 90,\n type: 'string',\n },\n {\n name: 'iso8601',\n position: 1,\n priority: 89,\n type: 'string',\n },\n {\n name: 'binary',\n position: 2,\n priority: 88,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n });\n\n describe('numbers', () => {\n it('names number type as number', () => {\n const spec = createSpec();\n const result = findVarients(spec, [{ type: 'number' }]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'number',\n position: 0,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n\n it('names integer type as integer', () => {\n const spec = createSpec();\n const result = findVarients(spec, [{ type: 'integer' }]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'number',\n position: 0,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n\n it('names number based on format', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n {\n type: 'number',\n format: 'float',\n },\n {\n type: 'number',\n format: 'double',\n },\n {\n type: 'integer',\n format: 'int64',\n },\n { type: 'number' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'float',\n position: 0,\n priority: 90,\n type: 'number',\n },\n {\n name: 'double',\n position: 1,\n priority: 89,\n type: 'number',\n },\n {\n name: 'integer',\n position: 2,\n priority: 87,\n type: 'number',\n },\n {\n name: 'number',\n position: 3,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n });\n\n describe('mixed types', () => {\n it('handles mixed string and number types', () => {\n const spec = createSpec();\n const result = findVarients(spec, [\n { type: 'number' },\n { type: 'string' },\n ]);\n assert.deepStrictEqual(result, [\n {\n name: 'text',\n position: 1,\n type: 'string',\n },\n {\n name: 'number',\n position: 0,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n });\n});\n\ndescribe('findPolymorphicVarients', () => {\n describe('strings', () => {\n it('returns single variant per position for multiple strings', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'string', format: 'date-time' },\n { type: 'string' },\n { type: 'string', const: 'active' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'active',\n position: 2,\n priority: 98,\n type: 'string',\n },\n {\n name: 'dateTime',\n position: 0,\n priority: 90,\n type: 'string',\n },\n {\n name: 'text',\n position: 1,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it.skip('returns first variant when multiple enums at same position', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'string', enum: ['first', 'second', 'third'] },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'first',\n position: 0,\n priority: 80,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it.skip('selects first variant from multiple at same position', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'string', enum: ['option1', 'option2'] },\n { type: 'string', format: 'email' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'email',\n position: 1,\n priority: 88,\n type: 'string',\n },\n {\n name: 'option1',\n position: 0,\n priority: 80,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n\n it.skip('handles mixed types selecting one per position', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'string', enum: ['a', 'b'] },\n { type: 'number' },\n { type: 'string', const: 'fixed' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'fixed',\n position: 2,\n priority: 98,\n type: 'string',\n },\n {\n name: 'a',\n position: 0,\n priority: 80,\n type: 'string',\n },\n {\n name: 'number',\n position: 1,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n\n it('handles plain strings mixed with formatted strings', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'string' },\n { type: 'string', format: 'password' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'password',\n position: 1,\n priority: 89,\n type: 'string',\n },\n {\n name: 'text',\n position: 0,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n it('ignore duplicates', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'string' },\n { type: 'string', format: 'password' },\n { type: 'string' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'password',\n position: 1,\n priority: 89,\n type: 'string',\n },\n {\n name: 'text',\n position: 0,\n type: 'string',\n },\n ] satisfies Varient[]);\n });\n });\n\n describe('numbers', () => {\n it('returns single variant per position for multiple numbers', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'number', format: 'float' },\n { type: 'integer' },\n { type: 'number', format: 'double' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'float',\n position: 0,\n priority: 90,\n type: 'number',\n },\n {\n name: 'double',\n position: 2,\n priority: 89,\n type: 'number',\n },\n {\n name: 'number',\n position: 1,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n\n it('returns first variant when multiple number formats at same position', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'number', format: 'float' },\n { type: 'number', format: 'double' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'float',\n position: 0,\n priority: 90,\n type: 'number',\n },\n {\n name: 'double',\n position: 1,\n priority: 89,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n\n it('handles mixed number and integer types', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'integer', format: 'int64' },\n { type: 'number' },\n { type: 'integer' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'integer',\n position: 0,\n priority: 89,\n type: 'number',\n },\n {\n name: 'number',\n position: 1,\n type: 'number',\n },\n {\n name: 'number',\n position: 2,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n\n it('handles plain numbers mixed with formatted numbers', () => {\n const spec = createSpec();\n const result = findPolymorphicVarients(spec, [\n { type: 'number' },\n { type: 'number', format: 'float' },\n { type: 'number' },\n ]);\n\n assert.deepStrictEqual(result, [\n {\n name: 'float',\n position: 1,\n priority: 89,\n type: 'number',\n },\n {\n name: 'number',\n position: 0,\n type: 'number',\n },\n {\n name: 'number',\n position: 2,\n type: 'number',\n },\n ] satisfies Varient[]);\n });\n });\n\n describe('arrays', () => {\n it.only('complex', () => {\n const spec = createSpec({\n components: {\n schemas: {\n RouteConfig: {\n anyOf: [\n {\n type: 'array',\n items: {\n anyOf: [\n {\n type: 'string',\n enum: ['image', 'video', 'audio'],\n },\n {\n type: 'string',\n enum: [\n 'application/andrew-inset',\n 'application/applixware',\n ],\n },\n ],\n },\n },\n {\n type: 'object',\n additionalProperties: {\n type: 'object',\n properties: {\n maxFileSize: {\n type: 'string',\n description:\n 'The maximum file size allowed for a given file type.',\n example: '4MB',\n },\n maxFileCount: {\n type: 'number',\n description:\n 'Maximum allowed files for a given file type.',\n example: 1,\n },\n contentDisposition: {\n type: 'string',\n enum: ['inline', 'attachment'],\n default: 'inline',\n },\n acl: {\n type: 'string',\n enum: ['public-read', 'private'],\n },\n },\n },\n },\n ],\n },\n },\n },\n });\n const varients = findVarients(\n spec,\n (spec.components.schemas.RouteConfig as SchemaObject).anyOf ?? [],\n );\n\n assert.deepStrictEqual(varients, [\n {\n name: 'textList',\n type: 'array',\n subtype: 'string',\n position: 0,\n },\n {\n static: true,\n subtype: 'string',\n source: 'public-read',\n name: 'public-read',\n type: 'object',\n position: 1,\n },\n ]);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function forEachOperation<T>(spec:
|
|
1
|
+
import type { IR, OperationEntry, TunedOperationObject } from './types.js';
|
|
2
|
+
export declare function forEachOperation<T>(spec: IR, callback: (entry: OperationEntry, operation: TunedOperationObject) => T): T[];
|
|
3
3
|
//# sourceMappingURL=for-each-operation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"for-each-operation.d.ts","sourceRoot":"","sources":["../../src/lib/for-each-operation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"for-each-operation.d.ts","sourceRoot":"","sources":["../../src/lib/for-each-operation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAE,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAE3E,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,IAAI,EAAE,EAAE,EACR,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,oBAAoB,KAAK,CAAC,OA0BxE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/for-each-operation.ts"],
|
|
4
|
-
"sourcesContent": ["import type { OperationObject } from 'openapi3-ts/oas31';\n\nimport { type Method, methods } from '@sdk-it/core/paths.js';\n\nimport type {
|
|
4
|
+
"sourcesContent": ["import type { OperationObject } from 'openapi3-ts/oas31';\n\nimport { type Method, methods } from '@sdk-it/core/paths.js';\n\nimport type { IR, OperationEntry, TunedOperationObject } from './types.js';\n\nexport function forEachOperation<T>(\n spec: IR,\n callback: (entry: OperationEntry, operation: TunedOperationObject) => T,\n) {\n const result: T[] = [];\n for (const [path, pathItem] of Object.entries(spec.paths)) {\n for (const [method, operation] of Object.entries(pathItem) as [\n Method,\n OperationObject,\n ][]) {\n if (!methods.includes(method)) {\n continue;\n }\n const operationTag = operation.tags?.[0] as string;\n\n result.push(\n callback(\n {\n method,\n path: path,\n tag: operationTag,\n },\n operation as TunedOperationObject,\n ),\n );\n }\n }\n return result;\n}\n"],
|
|
5
5
|
"mappings": "AAEA,SAAsB,eAAe;AAI9B,SAAS,iBACd,MACA,UACA;AACA,QAAM,SAAc,CAAC;AACrB,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,KAAK,KAAK,GAAG;AACzD,eAAW,CAAC,QAAQ,SAAS,KAAK,OAAO,QAAQ,QAAQ,GAGpD;AACH,UAAI,CAAC,QAAQ,SAAS,MAAM,GAAG;AAC7B;AAAA,MACF;AACA,YAAM,eAAe,UAAU,OAAO,CAAC;AAEvC,aAAO;AAAA,QACL;AAAA,UACE;AAAA,YACE;AAAA,YACA;AAAA,YACA,KAAK;AAAA,UACP;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function getRefUsage(spec:
|
|
1
|
+
import type { IR } from './types.js';
|
|
2
|
+
export declare function getRefUsage(spec: IR, schemaName: string, list?: string[]): string[];
|
|
3
3
|
//# sourceMappingURL=get-ref-usage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-ref-usage.d.ts","sourceRoot":"","sources":["../../src/lib/get-ref-usage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"get-ref-usage.d.ts","sourceRoot":"","sources":["../../src/lib/get-ref-usage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAErC,wBAAgB,WAAW,CACzB,IAAI,EAAE,EAAE,EACR,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,MAAM,EAAO,GAClB,MAAM,EAAE,CAoDV"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/get-ref-usage.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ReferenceObject, SchemaObject } from 'openapi3-ts/oas31';\n\nimport { isEmpty, isRef, parseRef, pascalcase } from '@sdk-it/core';\n\nimport type {
|
|
4
|
+
"sourcesContent": ["import type { ReferenceObject, SchemaObject } from 'openapi3-ts/oas31';\n\nimport { isEmpty, isRef, parseRef, pascalcase } from '@sdk-it/core';\n\nimport type { IR } from './types.js';\n\nexport function getRefUsage(\n spec: IR,\n schemaName: string,\n list: string[] = [],\n): string[] {\n const checkSchema = (\n schema: SchemaObject | ReferenceObject,\n withRefCheck = false,\n ): any => {\n if (isRef(schema)) {\n if (!withRefCheck) return false;\n const { model } = parseRef(schema.$ref);\n return model === schemaName;\n }\n if (!isEmpty(schema.oneOf)) {\n return schema.oneOf.some((it) => checkSchema(it, true));\n }\n if (schema.type === 'array' && schema.items) {\n if (isRef(schema.items)) {\n return checkSchema(schema.items, withRefCheck);\n }\n if (schema.items.oneOf) {\n return schema.items.oneOf.some((it) => checkSchema(it, true));\n }\n return checkSchema(schema.items, withRefCheck);\n }\n\n if (schema.type === 'object') {\n const properties = schema.properties;\n if (!isEmpty(properties)) {\n let found = false;\n let propertyName = '';\n for (const [key, it] of Object.entries(properties)) {\n found = checkSchema(it, false);\n if (found) {\n propertyName = key;\n }\n }\n return propertyName;\n }\n }\n return false;\n };\n\n for (const [key, value] of Object.entries(spec.components.schemas)) {\n const thisWouldBeTheObjectPropertyKeyName = checkSchema(value);\n if (thisWouldBeTheObjectPropertyKeyName) {\n if (typeof thisWouldBeTheObjectPropertyKeyName === 'string') {\n list.push(pascalcase(`${key} ${thisWouldBeTheObjectPropertyKeyName}`));\n } else {\n list.push(pascalcase(key));\n }\n }\n }\n\n return list;\n}\n"],
|
|
5
5
|
"mappings": "AAEA,SAAS,SAAS,OAAO,UAAU,kBAAkB;AAI9C,SAAS,YACd,MACA,YACA,OAAiB,CAAC,GACR;AACV,QAAM,cAAc,CAClB,QACA,eAAe,UACP;AACR,QAAI,MAAM,MAAM,GAAG;AACjB,UAAI,CAAC,aAAc,QAAO;AAC1B,YAAM,EAAE,MAAM,IAAI,SAAS,OAAO,IAAI;AACtC,aAAO,UAAU;AAAA,IACnB;AACA,QAAI,CAAC,QAAQ,OAAO,KAAK,GAAG;AAC1B,aAAO,OAAO,MAAM,KAAK,CAAC,OAAO,YAAY,IAAI,IAAI,CAAC;AAAA,IACxD;AACA,QAAI,OAAO,SAAS,WAAW,OAAO,OAAO;AAC3C,UAAI,MAAM,OAAO,KAAK,GAAG;AACvB,eAAO,YAAY,OAAO,OAAO,YAAY;AAAA,MAC/C;AACA,UAAI,OAAO,MAAM,OAAO;AACtB,eAAO,OAAO,MAAM,MAAM,KAAK,CAAC,OAAO,YAAY,IAAI,IAAI,CAAC;AAAA,MAC9D;AACA,aAAO,YAAY,OAAO,OAAO,YAAY;AAAA,IAC/C;AAEA,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,aAAa,OAAO;AAC1B,UAAI,CAAC,QAAQ,UAAU,GAAG;AACxB,YAAI,QAAQ;AACZ,YAAI,eAAe;AACnB,mBAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,UAAU,GAAG;AAClD,kBAAQ,YAAY,IAAI,KAAK;AAC7B,cAAI,OAAO;AACT,2BAAe;AAAA,UACjB;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,WAAW,OAAO,GAAG;AAClE,UAAM,sCAAsC,YAAY,KAAK;AAC7D,QAAI,qCAAqC;AACvC,UAAI,OAAO,wCAAwC,UAAU;AAC3D,aAAK,KAAK,WAAW,GAAG,GAAG,IAAI,mCAAmC,EAAE,CAAC;AAAA,MACvE,OAAO;AACL,aAAK,KAAK,WAAW,GAAG,CAAC;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guess-resource.d.ts","sourceRoot":"","sources":["../../../src/lib/guess/guess-resource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAiHpD,wBAAgB,UAAU,CACxB,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"guess-resource.d.ts","sourceRoot":"","sources":["../../../src/lib/guess/guess-resource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAiHpD,wBAAgB,UAAU,CACxB,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM;;;EAaf"}
|
package/dist/lib/ir.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../../src/lib/ir.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,iBAAiB,EAAiB,MAAM,cAAc,CAAC;AAMrE,OAAO,KAAK,EAAE,EAAE,EAAwB,MAAM,YAAY,CAAC;AAiC3D,wBAAgB,IAAI,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,UAAQ,GAAG,EAAE,CAsGnE"}
|
|
@@ -27,7 +27,7 @@ function findUniqueOperationId(usedOperationIds, initialId, choices, formatter)
|
|
|
27
27
|
}
|
|
28
28
|
return uniqueOperationId;
|
|
29
29
|
}
|
|
30
|
-
function
|
|
30
|
+
function toIR(config, verbose = false) {
|
|
31
31
|
const coearcedConfig = coeraceConfig(config);
|
|
32
32
|
if ("x-sdk-augmented" in config.spec) {
|
|
33
33
|
return config.spec;
|
|
@@ -117,6 +117,6 @@ function augmentSpec(config, verbose = false) {
|
|
|
117
117
|
};
|
|
118
118
|
}
|
|
119
119
|
export {
|
|
120
|
-
|
|
120
|
+
toIR
|
|
121
121
|
};
|
|
122
|
-
//# sourceMappingURL=
|
|
122
|
+
//# sourceMappingURL=ir.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/lib/ir.ts"],
|
|
4
|
+
"sourcesContent": ["import type {\n OperationObject,\n ParameterObject,\n PathsObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { type Method, methods } from '@sdk-it/core/paths.js';\nimport { resolveRef } from '@sdk-it/core/ref.js';\nimport { snakecase } from '@sdk-it/core/utils.js';\n\nimport { toResource } from './guess/guess-resource.js';\nimport { type GenerateSdkConfig, coeraceConfig } from './options.js';\nimport { extractOverviewDocs } from './overview-docs/overview-docs.js';\nimport { toPagination } from './pagination/pagination.js';\nimport { tuneRequestBody } from './tune-request-body.js';\nimport { resolveResponses } from './tune-response.js';\nimport { expandSpec, fixSpec } from './tune.js';\nimport type { IR, TunedOperationObject } from './types.js';\n\nfunction findUniqueOperationId(\n usedOperationIds: Set<string>,\n initialId: string,\n choices: string[],\n formatter: (id: string) => string,\n) {\n let counter = 1;\n let uniqueOperationId = formatter(initialId);\n\n while (usedOperationIds.has(uniqueOperationId)) {\n // Try each prepend option\n const prependIndex = Math.min(counter - 1, choices.length - 1);\n const prefix = choices[prependIndex];\n\n if (prependIndex < choices.length - 1) {\n // Using one of the prepend options\n uniqueOperationId = formatter(\n `${prefix}${initialId.charAt(0).toUpperCase() + initialId.slice(1)}`,\n );\n } else {\n // If we've exhausted all prepend options, start adding numbers\n uniqueOperationId = formatter(\n `${prefix}${initialId.charAt(0).toUpperCase() + initialId.slice(1)}${counter - choices.length + 1}`,\n );\n }\n counter++;\n }\n\n return uniqueOperationId;\n}\n\nexport function toIR(config: GenerateSdkConfig, verbose = false): IR {\n const coearcedConfig = coeraceConfig(config);\n if ('x-sdk-augmented' in config.spec) {\n return config.spec as IR; // Already augmented\n }\n\n const paths: PathsObject = {};\n const usedOperationIds = new Set<string>();\n\n for (const [path, pathItem] of Object.entries(coearcedConfig.spec.paths)) {\n // Convert Express-style routes (:param) to OpenAPI-style routes ({param})\n const fixedPath = path.replace(/:([^/]+)/g, '{$1}');\n for (const [method, operation] of Object.entries(pathItem) as [\n Method,\n OperationObject,\n ][]) {\n if (!methods.includes(method)) {\n continue;\n }\n const { name } = toResource(operation, fixedPath, method);\n const operationTag = coearcedConfig.tag(operation, fixedPath);\n const operationId = findUniqueOperationId(\n usedOperationIds,\n coearcedConfig.operationId(operation, fixedPath, method),\n [operationTag, method, fixedPath.split('/').filter(Boolean).join('')],\n (id) =>\n coearcedConfig.operationId(\n { ...operation, operationId: id },\n fixedPath,\n method,\n ),\n );\n usedOperationIds.add(operationId);\n\n const parameters = [\n ...(pathItem.parameters ?? []),\n ...(operation.parameters ?? []),\n ].map((it) => resolveRef<ParameterObject>(coearcedConfig.spec, it));\n\n const tunedOperation: TunedOperationObject = {\n ...operation,\n parameters,\n 'x-fn-name': name,\n 'x-fn-group': operationTag,\n tags: [snakecase(operationTag)],\n operationId: operationId,\n responses: resolveResponses(\n coearcedConfig.spec,\n operationId,\n operation,\n coearcedConfig.responses,\n ),\n requestBody: tuneRequestBody(\n coearcedConfig.spec,\n operationId,\n // camelcase(`${name} ${operationTag}`),\n operation,\n parameters,\n operation.security ?? [],\n ),\n };\n\n if (coearcedConfig.pagination.enabled) {\n if (coearcedConfig.pagination.guess) {\n tunedOperation['x-pagination'] = toPagination(\n coearcedConfig.spec,\n tunedOperation,\n );\n }\n } else {\n delete tunedOperation['x-pagination'];\n }\n\n Object.assign(paths, {\n [fixedPath]: {\n ...paths[fixedPath],\n [method]: tunedOperation,\n },\n });\n }\n }\n\n fixSpec(\n coearcedConfig.spec,\n Object.values(coearcedConfig.spec.components.schemas),\n );\n\n if (verbose) {\n const newRefs: { name: string; value: SchemaObject }[] = [];\n expandSpec(\n coearcedConfig.spec,\n coearcedConfig.spec.components.schemas,\n newRefs,\n );\n }\n\n return {\n ...coearcedConfig.spec,\n paths,\n 'x-docs': extractOverviewDocs(coearcedConfig.spec),\n 'x-sdk-augmented': true,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ir.test.d.ts","sourceRoot":"","sources":["../../src/lib/ir.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/lib/
|
|
3
|
+
"sources": ["../../src/lib/ir.test.ts"],
|
|
4
4
|
"sourcesContent": ["import assert from 'node:assert/strict';\nimport { describe, test } from 'node:test';\nimport type { OperationObject } from 'openapi3-ts/oas31';\n\nimport { determineGenericTag } from './tag.ts';\n\nconst mockOperation = (operationId = ''): OperationObject => ({ operationId });\n\ndescribe('determineGenericTag', () => {\n describe('Heuristic 1: Path-Based Tag Determination', () => {\n test('should use the last non-parameter, non-version, non-@ segment', () => {\n assert.strictEqual(\n determineGenericTag('/users', mockOperation()),\n 'users',\n );\n assert.strictEqual(\n determineGenericTag('/users/{userId}/orders', mockOperation()),\n 'orders',\n );\n assert.strictEqual(\n determineGenericTag('/admin/system/logs', mockOperation()),\n 'logs',\n );\n });\n\n test('should ignore path parameters', () => {\n assert.strictEqual(\n determineGenericTag('/users/{userId}', mockOperation()),\n 'users',\n );\n assert.strictEqual(\n determineGenericTag('/items/{itemId}', mockOperation()),\n 'items',\n );\n });\n\n test('should ignore version segments', () => {\n assert.strictEqual(\n determineGenericTag('/v1/products', mockOperation()),\n 'products',\n );\n assert.strictEqual(\n determineGenericTag('/api/V2/items/{itemId}/details', mockOperation()),\n 'details',\n );\n assert.strictEqual(\n determineGenericTag('/api/resource/v2', mockOperation()),\n 'resource',\n );\n });\n\n test('should ignore segments starting with @', () => {\n assert.strictEqual(\n determineGenericTag('/users/@me', mockOperation()),\n 'users',\n );\n assert.strictEqual(\n determineGenericTag('/users/@me/guilds', mockOperation()),\n 'guilds',\n );\n assert.strictEqual(\n determineGenericTag(\n '/webhooks/{webhookId}/messages/@original',\n mockOperation(),\n ),\n 'messages',\n );\n assert.strictEqual(\n determineGenericTag('/@admin/users/{userId}', mockOperation()),\n 'users',\n );\n assert.strictEqual(\n determineGenericTag(\n '/guilds/{guild_id}/@audit-log/users/@me/settings',\n mockOperation(),\n ),\n 'settings',\n );\n assert.strictEqual(\n determineGenericTag('/system/tasks/@scheduled-jobs', mockOperation()),\n 'tasks',\n );\n });\n\n test('should sanitize results matching reserved keywords', () => {\n assert.strictEqual(\n determineGenericTag('/api/v1/public', mockOperation()),\n 'public_',\n );\n assert.strictEqual(\n determineGenericTag('/api/case/{id}', mockOperation()),\n 'case_',\n );\n assert.strictEqual(\n determineGenericTag('/permissions/check', mockOperation()),\n 'check_',\n );\n });\n\n test('should sanitize results starting with numbers', () => {\n // FIX: Expectation changed - last valid segment is 'enable'\n assert.strictEqual(\n determineGenericTag('/api/2fa/enable', mockOperation()),\n 'enable',\n );\n });\n\n test('should handle mixed separators via camelcase', () => {\n assert.strictEqual(\n determineGenericTag('/user-profiles/{id}', mockOperation()),\n 'userProfiles',\n );\n });\n });\n\n describe('Heuristic 2: OperationId Fallback', () => {\n test('should be used when path has no valid segments (root)', () => {\n assert.strictEqual(\n determineGenericTag('/', mockOperation('getRootResource')),\n 'rootResource',\n );\n // FIX: Expectation changed - 'healthCheck' is not reserved\n assert.strictEqual(\n determineGenericTag('/', mockOperation('healthCheck')),\n 'healthCheck',\n );\n });\n\n test('should be used when path has only params/version segments', () => {\n assert.strictEqual(\n determineGenericTag('/v3/{tenantId}/', mockOperation('getTenantRoot')),\n 'tenantRoot',\n );\n assert.strictEqual(\n determineGenericTag('/v1/{userId}/', mockOperation('listUserItems')),\n 'userItems',\n );\n });\n\n test('should extract nouns after common verb prefixes', () => {\n assert.strictEqual(\n determineGenericTag('/v1/', mockOperation('postUserPreferences')),\n 'userPreferences',\n );\n assert.strictEqual(\n determineGenericTag('/v1/', mockOperation('doFoo')),\n 'foo',\n );\n assert.strictEqual(\n determineGenericTag('/v1/', mockOperation('addUser')),\n 'user',\n );\n // FIX: Added 'make' to commonVerbs\n assert.strictEqual(\n determineGenericTag('/v1/', mockOperation('makePublic')),\n 'public_',\n );\n });\n\n test('should use the full operationId if no common verb prefix', () => {\n assert.strictEqual(\n determineGenericTag('/v1/', mockOperation('metrics')),\n 'metrics',\n );\n assert.strictEqual(\n determineGenericTag('/v1/', mockOperation('tenantAdminSettings')),\n 'tenantAdminSettings',\n );\n });\n\n test('should handle numbers within the operationId correctly', () => {\n // FIX: Expectation aligned with stringcase behavior\n assert.strictEqual(\n determineGenericTag('/v1/', mockOperation('getUser2FAStatus')),\n 'user2FAStatus',\n );\n assert.strictEqual(\n determineGenericTag('/api/', mockOperation('get2FAStatus')),\n 'api',\n ); // Sanitized (starts with number after verb removal)\n });\n\n test('should sanitize results matching reserved keywords', () => {\n assert.strictEqual(\n determineGenericTag('/v1/{id}', mockOperation('delete')),\n 'delete_',\n );\n assert.strictEqual(\n determineGenericTag('/v1/{id}', mockOperation('createCase')),\n 'case_',\n );\n assert.strictEqual(\n determineGenericTag('/v1/{id}', mockOperation('get')),\n 'get_',\n );\n });\n\n test('should use verb if it is the only part and no path fallback', () => {\n assert.strictEqual(\n determineGenericTag('/v1/', mockOperation('get')),\n 'get_',\n );\n assert.strictEqual(\n determineGenericTag('/v1/{id}', mockOperation('list')),\n 'list_',\n );\n });\n });\n\n describe('Heuristic 3: First Path Segment Fallback', () => {\n test('should be used when path only has @ segments and no suitable opId', () => {\n assert.strictEqual(\n determineGenericTag('/@system/@status', mockOperation()),\n 'system',\n );\n assert.strictEqual(\n determineGenericTag('/@audit-log/@entries', mockOperation()),\n 'auditLog',\n );\n });\n\n test('should be used when opId fallback yields only a common verb', () => {\n assert.strictEqual(\n determineGenericTag('/@system/@status', mockOperation('get')),\n 'system',\n );\n });\n\n test('should strip leading @ before using segment', () => {\n assert.strictEqual(\n determineGenericTag('/@system/@status', mockOperation()),\n 'system',\n );\n });\n\n test('should sanitize results matching reserved keywords', () => {\n assert.strictEqual(\n determineGenericTag('/@public/@data', mockOperation()),\n 'public_',\n );\n });\n\n test('should sanitize results starting with numbers', () => {\n assert.strictEqual(\n determineGenericTag('/@2fa/@status', mockOperation()),\n '_2fa',\n );\n });\n });\n\n describe('Heuristic Priority', () => {\n test('Path (Heuristic 1) should take priority over OperationId (Heuristic 2)', () => {\n const tag = determineGenericTag(\n '/users/{id}/permissions/check', // Path -> 'check' -> sanitized 'check_'\n mockOperation('verifyPermissions'), // opId -> 'permissions'\n );\n assert.strictEqual(tag, 'check_');\n });\n\n test('OperationId (Heuristic 2) should take priority over First Path Segment (Heuristic 3)', () => {\n const tag = determineGenericTag(\n '/@system/@status',\n mockOperation('getSystemStatus'),\n );\n assert.strictEqual(tag, 'systemStatus');\n });\n\n test('First Path Segment (Heuristic 3) is used if OperationId is skipped (verb-only)', () => {\n const tag = determineGenericTag('/@system/@status', mockOperation('get'));\n assert.strictEqual(tag, 'system');\n });\n });\n\n describe('Heuristic 4: Unknown Fallback', () => {\n test('should return \"unknown\" when no path segments and no operationId', () => {\n assert.strictEqual(determineGenericTag('/', mockOperation()), 'unknown');\n });\n\n test('should return \"unknown\" when path has only params/version and no operationId', () => {\n assert.strictEqual(\n determineGenericTag('/v3/{tenantId}/', mockOperation()),\n 'unknown',\n );\n });\n\n test('should return \"unknown\" for empty path string', () => {\n assert.strictEqual(determineGenericTag('', mockOperation()), 'unknown');\n });\n });\n});\n"],
|
|
5
5
|
"mappings": "AAAA,OAAO,YAAY;AACnB,SAAS,UAAU,YAAY;AAG/B,SAAS,2BAA2B;AAEpC,MAAM,gBAAgB,CAAC,cAAc,QAAyB,EAAE,YAAY;AAE5E,SAAS,uBAAuB,MAAM;AACpC,WAAS,6CAA6C,MAAM;AAC1D,SAAK,iEAAiE,MAAM;AAC1E,aAAO;AAAA,QACL,oBAAoB,UAAU,cAAc,CAAC;AAAA,QAC7C;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,0BAA0B,cAAc,CAAC;AAAA,QAC7D;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,sBAAsB,cAAc,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,iCAAiC,MAAM;AAC1C,aAAO;AAAA,QACL,oBAAoB,mBAAmB,cAAc,CAAC;AAAA,QACtD;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,mBAAmB,cAAc,CAAC;AAAA,QACtD;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,kCAAkC,MAAM;AAC3C,aAAO;AAAA,QACL,oBAAoB,gBAAgB,cAAc,CAAC;AAAA,QACnD;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,kCAAkC,cAAc,CAAC;AAAA,QACrE;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,oBAAoB,cAAc,CAAC;AAAA,QACvD;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,0CAA0C,MAAM;AACnD,aAAO;AAAA,QACL,oBAAoB,cAAc,cAAc,CAAC;AAAA,QACjD;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,qBAAqB,cAAc,CAAC;AAAA,QACxD;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,UACE;AAAA,UACA,cAAc;AAAA,QAChB;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,0BAA0B,cAAc,CAAC;AAAA,QAC7D;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,UACE;AAAA,UACA,cAAc;AAAA,QAChB;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,iCAAiC,cAAc,CAAC;AAAA,QACpE;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,sDAAsD,MAAM;AAC/D,aAAO;AAAA,QACL,oBAAoB,kBAAkB,cAAc,CAAC;AAAA,QACrD;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,kBAAkB,cAAc,CAAC;AAAA,QACrD;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,sBAAsB,cAAc,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,iDAAiD,MAAM;AAE1D,aAAO;AAAA,QACL,oBAAoB,mBAAmB,cAAc,CAAC;AAAA,QACtD;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,gDAAgD,MAAM;AACzD,aAAO;AAAA,QACL,oBAAoB,uBAAuB,cAAc,CAAC;AAAA,QAC1D;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,WAAS,qCAAqC,MAAM;AAClD,SAAK,yDAAyD,MAAM;AAClE,aAAO;AAAA,QACL,oBAAoB,KAAK,cAAc,iBAAiB,CAAC;AAAA,QACzD;AAAA,MACF;AAEA,aAAO;AAAA,QACL,oBAAoB,KAAK,cAAc,aAAa,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,6DAA6D,MAAM;AACtE,aAAO;AAAA,QACL,oBAAoB,mBAAmB,cAAc,eAAe,CAAC;AAAA,QACrE;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,iBAAiB,cAAc,eAAe,CAAC;AAAA,QACnE;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,mDAAmD,MAAM;AAC5D,aAAO;AAAA,QACL,oBAAoB,QAAQ,cAAc,qBAAqB,CAAC;AAAA,QAChE;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,QAAQ,cAAc,OAAO,CAAC;AAAA,QAClD;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,QAAQ,cAAc,SAAS,CAAC;AAAA,QACpD;AAAA,MACF;AAEA,aAAO;AAAA,QACL,oBAAoB,QAAQ,cAAc,YAAY,CAAC;AAAA,QACvD;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,4DAA4D,MAAM;AACrE,aAAO;AAAA,QACL,oBAAoB,QAAQ,cAAc,SAAS,CAAC;AAAA,QACpD;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,QAAQ,cAAc,qBAAqB,CAAC;AAAA,QAChE;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,0DAA0D,MAAM;AAEnE,aAAO;AAAA,QACL,oBAAoB,QAAQ,cAAc,kBAAkB,CAAC;AAAA,QAC7D;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,SAAS,cAAc,cAAc,CAAC;AAAA,QAC1D;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,sDAAsD,MAAM;AAC/D,aAAO;AAAA,QACL,oBAAoB,YAAY,cAAc,QAAQ,CAAC;AAAA,QACvD;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,YAAY,cAAc,YAAY,CAAC;AAAA,QAC3D;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,YAAY,cAAc,KAAK,CAAC;AAAA,QACpD;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,+DAA+D,MAAM;AACxE,aAAO;AAAA,QACL,oBAAoB,QAAQ,cAAc,KAAK,CAAC;AAAA,QAChD;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,YAAY,cAAc,MAAM,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,WAAS,4CAA4C,MAAM;AACzD,SAAK,qEAAqE,MAAM;AAC9E,aAAO;AAAA,QACL,oBAAoB,oBAAoB,cAAc,CAAC;AAAA,QACvD;AAAA,MACF;AACA,aAAO;AAAA,QACL,oBAAoB,wBAAwB,cAAc,CAAC;AAAA,QAC3D;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,+DAA+D,MAAM;AACxE,aAAO;AAAA,QACL,oBAAoB,oBAAoB,cAAc,KAAK,CAAC;AAAA,QAC5D;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,+CAA+C,MAAM;AACxD,aAAO;AAAA,QACL,oBAAoB,oBAAoB,cAAc,CAAC;AAAA,QACvD;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,sDAAsD,MAAM;AAC/D,aAAO;AAAA,QACL,oBAAoB,kBAAkB,cAAc,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,iDAAiD,MAAM;AAC1D,aAAO;AAAA,QACL,oBAAoB,iBAAiB,cAAc,CAAC;AAAA,QACpD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,WAAS,sBAAsB,MAAM;AACnC,SAAK,0EAA0E,MAAM;AACnF,YAAM,MAAM;AAAA,QACV;AAAA;AAAA,QACA,cAAc,mBAAmB;AAAA;AAAA,MACnC;AACA,aAAO,YAAY,KAAK,QAAQ;AAAA,IAClC,CAAC;AAED,SAAK,wFAAwF,MAAM;AACjG,YAAM,MAAM;AAAA,QACV;AAAA,QACA,cAAc,iBAAiB;AAAA,MACjC;AACA,aAAO,YAAY,KAAK,cAAc;AAAA,IACxC,CAAC;AAED,SAAK,kFAAkF,MAAM;AAC3F,YAAM,MAAM,oBAAoB,oBAAoB,cAAc,KAAK,CAAC;AACxE,aAAO,YAAY,KAAK,QAAQ;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;AAED,WAAS,iCAAiC,MAAM;AAC9C,SAAK,oEAAoE,MAAM;AAC7E,aAAO,YAAY,oBAAoB,KAAK,cAAc,CAAC,GAAG,SAAS;AAAA,IACzE,CAAC;AAED,SAAK,gFAAgF,MAAM;AACzF,aAAO;AAAA,QACL,oBAAoB,mBAAmB,cAAc,CAAC;AAAA,QACtD;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,iDAAiD,MAAM;AAC1D,aAAO,YAAY,oBAAoB,IAAI,cAAc,CAAC,GAAG,SAAS;AAAA,IACxE,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
|
|
6
6
|
"names": []
|
package/dist/lib/options.d.ts
CHANGED
|
@@ -53,9 +53,9 @@ export declare function coeraceConfig(config: GenerateSdkConfig): {
|
|
|
53
53
|
paths: import("openapi3-ts/oas31").PathsObject;
|
|
54
54
|
'x-docs': never[];
|
|
55
55
|
'x-tagGroups': any;
|
|
56
|
+
servers: import("openapi3-ts/oas31").ServerObject[];
|
|
56
57
|
openapi: string;
|
|
57
58
|
info: import("openapi3-ts/oas31").InfoObject;
|
|
58
|
-
servers?: import("openapi3-ts/oas31").ServerObject[];
|
|
59
59
|
security?: import("openapi3-ts/oas31").SecurityRequirementObject[];
|
|
60
60
|
tags?: import("openapi3-ts/oas31").TagObject[];
|
|
61
61
|
externalDocs?: import("openapi3-ts/oas31").ExternalDocumentationObject;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/lib/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,UAAU,CAAC,EAAE,gBAAgB,GAAG,KAAK,CAAC;IACtC,WAAW,CAAC,EAAE,CACZ,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,KACX,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC5D;AACD,MAAM,WAAW,eAAe;IAC9B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,UAOnD;AAED,eAAO,MAAM,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAC/C,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,GAAG,KAAK,CAAC,CAkBxD,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA5CxC,eAAe,QACpB,MAAM,UACJ,MAAM,KACX,MAAM;qBACO,eAAe,QAAQ,MAAM,KAAK,MAAM;
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/lib/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,UAAU,CAAC,EAAE,gBAAgB,GAAG,KAAK,CAAC;IACtC,WAAW,CAAC,EAAE,CACZ,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,KACX,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC5D;AACD,MAAM,WAAW,eAAe;IAC9B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,UAOnD;AAED,eAAO,MAAM,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAC/C,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,GAAG,KAAK,CAAC,CAkBxD,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA5CxC,eAAe,QACpB,MAAM,UACJ,MAAM,KACX,MAAM;qBACO,eAAe,QAAQ,MAAM,KAAK,MAAM;EAuE3D;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,gBAAgB,GAAG,SAAS,GAAG,KAAK;;;EAmB9C"}
|
package/dist/lib/options.js
CHANGED
|
@@ -44,7 +44,8 @@ function coeraceConfig(config) {
|
|
|
44
44
|
name: "API",
|
|
45
45
|
tags: config.spec.tags?.map((tag) => tag.name) ?? []
|
|
46
46
|
}
|
|
47
|
-
]
|
|
47
|
+
],
|
|
48
|
+
servers: config.spec.servers ?? []
|
|
48
49
|
},
|
|
49
50
|
operationId: config.operationId ?? defaults.operationId,
|
|
50
51
|
tag: config.tag ?? defaults.tag
|
package/dist/lib/options.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/options.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n OpenAPIObject,\n OperationObject,\n SecuritySchemeObject,\n} from 'openapi3-ts/oas31';\nimport { camelcase } from 'stringcase';\n\nimport { resolveRef } from '@sdk-it/core';\n\nimport { determineGenericTag, sanitizeTag } from './tag.js';\nimport type {
|
|
5
|
-
"mappings": "AAKA,SAAS,iBAAiB;AAE1B,SAAS,kBAAkB;AAE3B,SAAS,qBAAqB,mBAAmB;AAsB1C,SAAS,iBAAiB,aAAqB;AACpD,SAAO;AAAA,IACL,YACG,MAAM,GAAG,EACT,IAAI,EACJ,QAAQ,YAAY,EAAE;AAAA,EAC3B;AACF;AAEO,MAAM,WACgD;AAAA,EAC3D,aAAa,CAAC,WAAW,MAAM,WAAW;AACxC,QAAI,UAAU,aAAa;AACzB,aAAO,iBAAiB,UAAU,WAAW;AAAA,IAC/C;AAEA,WAAO;AAAA,MACL,CAAC,QAAQ,GAAG,KAAK,QAAQ,gBAAgB,GAAG,EAAE,MAAM,GAAG,CAAC,EACrD,OAAO,OAAO,EACd,KAAK,GAAG,EACR,KAAK;AAAA,IACV;AAAA,EACF;AAAA,EACA,KAAK,CAAC,WAAW,SAAS;AACxB,WAAO,UAAU,OAAO,CAAC,IACrB,YAAY,UAAU,OAAO,CAAC,CAAC,IAC/B,oBAAoB,MAAM,SAAS;AAAA,EACzC;AACF;AAEO,SAAS,cAAc,QAA2B;AACvD,SAAO;AAAA,IACL,YAAY,wBAAwB,OAAO,UAAU;AAAA,IACrD,WAAW,OAAO,aAAa,CAAC;AAAA,IAChC,MAAM;AAAA,MACJ,GAAG,OAAO;AAAA,MACV,YAAY;AAAA,QACV,GAAG,OAAO,KAAK;AAAA,QACf,SAAS,OAAO,KAAK,YAAY,WAAW,CAAC;AAAA,QAC7C,iBAAiB,OAAO;AAAA,UACtB,OAAO,QAAQ,OAAO,KAAK,YAAY,mBAAmB,CAAC,CAAC,EAAE;AAAA,YAC5D,CAAC,CAAC,MAAM,MAAM,MAAM;AAAA,cAClB;AAAA,cACA,WAAiC,OAAO,MAAM,MAAM;AAAA,YACtD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO,OAAO,KAAK,SAAS,CAAC;AAAA,MAC7B,UAAU,CAAC;AAAA,MACX,eAAe,OAAO,KAAK,aAAa,KAAK;AAAA,QAC3C;AAAA,UACE,MAAM;AAAA,UACN,MAAM,OAAO,KAAK,MAAM,IAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,
|
|
4
|
+
"sourcesContent": ["import type {\n OpenAPIObject,\n OperationObject,\n SecuritySchemeObject,\n} from 'openapi3-ts/oas31';\nimport { camelcase } from 'stringcase';\n\nimport { resolveRef } from '@sdk-it/core';\n\nimport { determineGenericTag, sanitizeTag } from './tag.js';\nimport type { IR } from './types.js';\n\nexport interface GenerateSdkConfig {\n spec: OpenAPIObject;\n responses?: ResponsesConfig;\n pagination?: PaginationConfig | false;\n operationId?: (\n operation: OperationObject,\n path: string,\n method: string,\n ) => string;\n tag?: (operation: OperationObject, path: string) => string;\n}\nexport interface ResponsesConfig {\n flattenErrorResponses?: boolean;\n}\n\nexport type PaginationConfig = {\n guess?: boolean;\n};\n\nexport function cleanOperationId(operationId: string) {\n return camelcase(\n operationId\n .split('#')\n .pop()!\n .replace(/-(?=\\d)/g, ''),\n );\n}\n\nexport const defaults: Partial<GenerateSdkConfig> &\n Required<Pick<GenerateSdkConfig, 'operationId' | 'tag'>> = {\n operationId: (operation, path, method) => {\n if (operation.operationId) {\n return cleanOperationId(operation.operationId);\n }\n\n return camelcase(\n [method, ...path.replace(/[\\\\/\\\\{\\\\}]/g, ' ').split(' ')]\n .filter(Boolean)\n .join(' ')\n .trim(),\n );\n },\n tag: (operation, path) => {\n return operation.tags?.[0]\n ? sanitizeTag(operation.tags?.[0])\n : determineGenericTag(path, operation);\n },\n};\n\nexport function coeraceConfig(config: GenerateSdkConfig) {\n return {\n pagination: coearcePaginationConfig(config.pagination),\n responses: config.responses ?? {},\n spec: {\n ...config.spec,\n components: {\n ...config.spec.components,\n schemas: config.spec.components?.schemas ?? {},\n securitySchemes: Object.fromEntries(\n Object.entries(config.spec.components?.securitySchemes ?? {}).map(\n ([name, schema]) => [\n name,\n resolveRef<SecuritySchemeObject>(config.spec, schema),\n ],\n ),\n ),\n },\n paths: config.spec.paths ?? {},\n 'x-docs': [],\n 'x-tagGroups': config.spec['x-tagGroups'] ?? [\n {\n name: 'API',\n tags: config.spec.tags?.map((tag) => tag.name) ?? [],\n },\n ],\n servers: config.spec.servers ?? [],\n } satisfies IR,\n operationId: config.operationId ?? defaults.operationId,\n tag: config.tag ?? defaults.tag,\n };\n}\n\nexport function coearcePaginationConfig(\n options: PaginationConfig | undefined | false,\n) {\n if (options === undefined) {\n return {\n guess: true,\n enabled: true,\n };\n }\n if (options === false) {\n return {\n enabled: false,\n guess: false,\n };\n }\n // If options is true, we assume pagination is enabled with guessing\n return {\n guess: options.guess ?? true,\n enabled: true,\n };\n}\n"],
|
|
5
|
+
"mappings": "AAKA,SAAS,iBAAiB;AAE1B,SAAS,kBAAkB;AAE3B,SAAS,qBAAqB,mBAAmB;AAsB1C,SAAS,iBAAiB,aAAqB;AACpD,SAAO;AAAA,IACL,YACG,MAAM,GAAG,EACT,IAAI,EACJ,QAAQ,YAAY,EAAE;AAAA,EAC3B;AACF;AAEO,MAAM,WACgD;AAAA,EAC3D,aAAa,CAAC,WAAW,MAAM,WAAW;AACxC,QAAI,UAAU,aAAa;AACzB,aAAO,iBAAiB,UAAU,WAAW;AAAA,IAC/C;AAEA,WAAO;AAAA,MACL,CAAC,QAAQ,GAAG,KAAK,QAAQ,gBAAgB,GAAG,EAAE,MAAM,GAAG,CAAC,EACrD,OAAO,OAAO,EACd,KAAK,GAAG,EACR,KAAK;AAAA,IACV;AAAA,EACF;AAAA,EACA,KAAK,CAAC,WAAW,SAAS;AACxB,WAAO,UAAU,OAAO,CAAC,IACrB,YAAY,UAAU,OAAO,CAAC,CAAC,IAC/B,oBAAoB,MAAM,SAAS;AAAA,EACzC;AACF;AAEO,SAAS,cAAc,QAA2B;AACvD,SAAO;AAAA,IACL,YAAY,wBAAwB,OAAO,UAAU;AAAA,IACrD,WAAW,OAAO,aAAa,CAAC;AAAA,IAChC,MAAM;AAAA,MACJ,GAAG,OAAO;AAAA,MACV,YAAY;AAAA,QACV,GAAG,OAAO,KAAK;AAAA,QACf,SAAS,OAAO,KAAK,YAAY,WAAW,CAAC;AAAA,QAC7C,iBAAiB,OAAO;AAAA,UACtB,OAAO,QAAQ,OAAO,KAAK,YAAY,mBAAmB,CAAC,CAAC,EAAE;AAAA,YAC5D,CAAC,CAAC,MAAM,MAAM,MAAM;AAAA,cAClB;AAAA,cACA,WAAiC,OAAO,MAAM,MAAM;AAAA,YACtD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO,OAAO,KAAK,SAAS,CAAC;AAAA,MAC7B,UAAU,CAAC;AAAA,MACX,eAAe,OAAO,KAAK,aAAa,KAAK;AAAA,QAC3C;AAAA,UACE,MAAM;AAAA,UACN,MAAM,OAAO,KAAK,MAAM,IAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,MACA,SAAS,OAAO,KAAK,WAAW,CAAC;AAAA,IACnC;AAAA,IACA,aAAa,OAAO,eAAe,SAAS;AAAA,IAC5C,KAAK,OAAO,OAAO,SAAS;AAAA,EAC9B;AACF;AAEO,SAAS,wBACd,SACA;AACA,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,EACF;AACA,MAAI,YAAY,OAAO;AACrB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,QAAQ,SAAS;AAAA,IACxB,SAAS;AAAA,EACX;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|