@ir-kit/openapi 0.1.0 → 0.2.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.
Files changed (64) hide show
  1. package/README.md +1 -1
  2. package/dist/index.d.ts +5 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +4 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/operation/body.d.ts +2 -3
  7. package/dist/operation/body.d.ts.map +1 -1
  8. package/dist/operation/body.js +3 -4
  9. package/dist/operation/body.js.map +1 -1
  10. package/dist/operation/iter.d.ts +1 -1
  11. package/dist/operation/iter.d.ts.map +1 -1
  12. package/dist/operation/iter.js +2 -1
  13. package/dist/operation/iter.js.map +1 -1
  14. package/dist/operation/responses.js +1 -1
  15. package/dist/operation/responses.js.map +1 -1
  16. package/dist/operation/signature.d.ts +1 -1
  17. package/dist/operation/signature.js +1 -1
  18. package/dist/spec/constants.d.ts +20 -0
  19. package/dist/spec/constants.d.ts.map +1 -0
  20. package/dist/spec/constants.js +37 -0
  21. package/dist/spec/constants.js.map +1 -0
  22. package/dist/spec/normalize/allOf.d.ts +3 -0
  23. package/dist/spec/normalize/allOf.d.ts.map +1 -0
  24. package/dist/spec/normalize/allOf.js +42 -0
  25. package/dist/spec/normalize/allOf.js.map +1 -0
  26. package/dist/spec/normalize/enums.d.ts +10 -0
  27. package/dist/spec/normalize/enums.d.ts.map +1 -0
  28. package/dist/spec/normalize/enums.js +121 -0
  29. package/dist/spec/normalize/enums.js.map +1 -0
  30. package/dist/spec/normalize/index.d.ts +20 -0
  31. package/dist/spec/normalize/index.d.ts.map +1 -0
  32. package/dist/spec/normalize/index.js +37 -0
  33. package/dist/spec/normalize/index.js.map +1 -0
  34. package/dist/spec/normalize/metadata.d.ts +12 -0
  35. package/dist/spec/normalize/metadata.d.ts.map +1 -0
  36. package/dist/spec/normalize/metadata.js +49 -0
  37. package/dist/spec/normalize/metadata.js.map +1 -0
  38. package/dist/spec/normalize/name.d.ts +8 -0
  39. package/dist/spec/normalize/name.d.ts.map +1 -0
  40. package/dist/spec/normalize/name.js +24 -0
  41. package/dist/spec/normalize/name.js.map +1 -0
  42. package/dist/spec/normalize/objects.d.ts +14 -0
  43. package/dist/spec/normalize/objects.d.ts.map +1 -0
  44. package/dist/spec/normalize/objects.js +229 -0
  45. package/dist/spec/normalize/objects.js.map +1 -0
  46. package/dist/spec/normalize/prune.d.ts +15 -0
  47. package/dist/spec/normalize/prune.d.ts.map +1 -0
  48. package/dist/spec/normalize/prune.js +87 -0
  49. package/dist/spec/normalize/prune.js.map +1 -0
  50. package/dist/spec/normalize/walk.d.ts +21 -0
  51. package/dist/spec/normalize/walk.d.ts.map +1 -0
  52. package/dist/spec/normalize/walk.js +91 -0
  53. package/dist/spec/normalize/walk.js.map +1 -0
  54. package/dist/spec/ref.d.ts +17 -0
  55. package/dist/spec/ref.d.ts.map +1 -0
  56. package/dist/spec/ref.js +32 -0
  57. package/dist/spec/ref.js.map +1 -0
  58. package/dist/spec/security.d.ts +22 -0
  59. package/dist/spec/security.d.ts.map +1 -0
  60. package/dist/spec/security.js +47 -0
  61. package/dist/spec/security.js.map +1 -0
  62. package/dist/type/dispatch.js +1 -1
  63. package/dist/type/dispatch.js.map +1 -1
  64. package/package.json +2 -3
@@ -0,0 +1,14 @@
1
+ import type { NamingConfig } from "./name.js";
2
+ export interface ObjectPassOptions {
3
+ naming?: NamingConfig;
4
+ /** Skip shapes with fewer than this many properties. Default: 3. */
5
+ minProperties?: number;
6
+ }
7
+ /**
8
+ * Hoist structurally identical inline objects to `components.schemas`.
9
+ * Inline-only — never merges with existing roots, since structural
10
+ * equality is too weak a signal for object identity. Returns the set
11
+ * of newly-added schema names.
12
+ */
13
+ export declare function dedupeInlineObjects(spec: unknown, opts?: ObjectPassOptions): Set<string>;
14
+ //# sourceMappingURL=objects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objects.d.ts","sourceRoot":"","sources":["../../../src/spec/normalize/objects.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAS9C,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAOD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,IAAI,GAAE,iBAAsB,GAC3B,GAAG,CAAC,MAAM,CAAC,CAyEb"}
@@ -0,0 +1,229 @@
1
+ import { preserveMetadata } from "./metadata.js";
2
+ import { applyNaming, uniqueComponentName } from "./name.js";
3
+ import { getSchemasObject, isRootSchemaPath, schemasPointerPrefix, walkSchemas, } from "./walk.js";
4
+ const DEFAULT_NAMING = {
5
+ case: "PascalCase",
6
+ name: "{{name}}Object",
7
+ };
8
+ /**
9
+ * Hoist structurally identical inline objects to `components.schemas`.
10
+ * Inline-only — never merges with existing roots, since structural
11
+ * equality is too weak a signal for object identity. Returns the set
12
+ * of newly-added schema names.
13
+ */
14
+ export function dedupeInlineObjects(spec, opts = {}) {
15
+ const hoisted = new Set();
16
+ const schemas = getSchemasObject(spec);
17
+ if (!schemas)
18
+ return hoisted;
19
+ const pointerPrefix = schemasPointerPrefix(spec);
20
+ if (!pointerPrefix)
21
+ return hoisted;
22
+ const naming = opts.naming ?? DEFAULT_NAMING;
23
+ const minProperties = Math.max(1, opts.minProperties ?? 3);
24
+ const groups = new Map();
25
+ walkSchemas(spec, ({ key, node, parent, path }) => {
26
+ if (key === null || parent === null)
27
+ return;
28
+ if (isRootSchemaPath(path))
29
+ return;
30
+ const signature = objectSignature(node, minProperties);
31
+ if (!signature)
32
+ return;
33
+ const hit = {
34
+ parent: parent,
35
+ key: key,
36
+ signature,
37
+ schema: node,
38
+ };
39
+ const arr = groups.get(signature);
40
+ if (arr)
41
+ arr.push(hit);
42
+ else
43
+ groups.set(signature, [hit]);
44
+ });
45
+ if (groups.size === 0)
46
+ return hoisted;
47
+ const nameBySignature = new Map();
48
+ const schemaBySignature = new Map();
49
+ const reservedNames = new Set();
50
+ for (const [signature, hits] of groups) {
51
+ if (hits.length < 2)
52
+ continue;
53
+ const first = hits[0];
54
+ if (!first)
55
+ continue;
56
+ const baseSource = canonicalBase(first.schema, first.key);
57
+ if (!hasUsableName(first.schema, baseSource))
58
+ continue;
59
+ const base = applyNaming(baseSource, naming);
60
+ const name = uniqueComponentName(base, schemas, reservedNames);
61
+ reservedNames.add(name);
62
+ nameBySignature.set(signature, name);
63
+ schemaBySignature.set(signature, first.schema);
64
+ }
65
+ for (const [signature, name] of nameBySignature) {
66
+ if (name in schemas)
67
+ continue;
68
+ const schema = schemaBySignature.get(signature);
69
+ if (schema && typeof schema === "object") {
70
+ const target = schema;
71
+ preserveMetadata(groups.get(signature) ?? [], target);
72
+ schemas[name] = target;
73
+ hoisted.add(name);
74
+ }
75
+ }
76
+ for (const [signature, hits] of groups) {
77
+ const name = nameBySignature.get(signature);
78
+ if (!name)
79
+ continue;
80
+ for (const { parent, key } of hits) {
81
+ const ref = { $ref: `${pointerPrefix}${name}` };
82
+ if (Array.isArray(parent))
83
+ parent[key] = ref;
84
+ else
85
+ parent[key] = ref;
86
+ }
87
+ }
88
+ return hoisted;
89
+ }
90
+ function objectSignature(schema, minProperties) {
91
+ if (!schema || typeof schema !== "object")
92
+ return undefined;
93
+ const s = schema;
94
+ if (s.$ref)
95
+ return undefined;
96
+ if (Array.isArray(s.enum))
97
+ return undefined;
98
+ if (s.type !== undefined && s.type !== "object")
99
+ return undefined;
100
+ // Composition / conditional keywords change semantics if folded.
101
+ if ("allOf" in s ||
102
+ "anyOf" in s ||
103
+ "oneOf" in s ||
104
+ "not" in s ||
105
+ "if" in s ||
106
+ "then" in s ||
107
+ "else" in s) {
108
+ return undefined;
109
+ }
110
+ const properties = s.properties;
111
+ if (!properties ||
112
+ typeof properties !== "object" ||
113
+ Array.isArray(properties)) {
114
+ return undefined;
115
+ }
116
+ const propNames = Object.keys(properties).sort();
117
+ if (propNames.length < minProperties)
118
+ return undefined;
119
+ const required = Array.isArray(s.required)
120
+ ? [...s.required].sort()
121
+ : [];
122
+ const propsForSig = propNames.map((name) => [
123
+ name,
124
+ propertySignature(properties[name]),
125
+ ]);
126
+ return JSON.stringify({
127
+ properties: propsForSig,
128
+ required,
129
+ additionalProperties: additionalPropertiesSignature(s.additionalProperties),
130
+ });
131
+ }
132
+ /** Recursive structural hash of a property's shape. */
133
+ function propertySignature(node) {
134
+ if (!node || typeof node !== "object")
135
+ return "?";
136
+ const s = node;
137
+ if (typeof s.$ref === "string")
138
+ return `ref:${s.$ref}`;
139
+ if (Array.isArray(s.enum)) {
140
+ return `enum:${JSON.stringify({
141
+ type: s.type ?? "",
142
+ format: s.format ?? "",
143
+ values: [...s.enum].sort(),
144
+ })}`;
145
+ }
146
+ const type = (s.type ?? "any");
147
+ if (type === "array") {
148
+ const items = s.items;
149
+ return `array<${propertySignature(items ?? null)}>`;
150
+ }
151
+ if (type === "object" || s.properties) {
152
+ const props = s.properties;
153
+ const propPairs = props
154
+ ? Object.keys(props)
155
+ .sort()
156
+ .map((k) => [k, propertySignature(props[k])])
157
+ : [];
158
+ const required = Array.isArray(s.required)
159
+ ? [...s.required].sort()
160
+ : [];
161
+ return `object:${JSON.stringify({
162
+ properties: propPairs,
163
+ required,
164
+ additionalProperties: additionalPropertiesSignature(s.additionalProperties),
165
+ })}`;
166
+ }
167
+ const format = s.format ? `:${s.format}` : "";
168
+ return `${type}${format}`;
169
+ }
170
+ function additionalPropertiesSignature(value) {
171
+ if (value === undefined)
172
+ return "u";
173
+ if (value === false)
174
+ return "false";
175
+ if (value === true)
176
+ return "true";
177
+ return propertySignature(value);
178
+ }
179
+ function canonicalBase(schema, key) {
180
+ if (schema && typeof schema === "object" && "title" in schema) {
181
+ const title = schema.title;
182
+ if (typeof title === "string" && title)
183
+ return title;
184
+ }
185
+ return String(key);
186
+ }
187
+ /** Reject numeric / generic keys that would yield meaningless type names like `0Object` or `DataObject`. Title overrides. */
188
+ const GENERIC_KEYS = new Set([
189
+ "attributes",
190
+ "body",
191
+ "config",
192
+ "content",
193
+ "data",
194
+ "details",
195
+ "fields",
196
+ "info",
197
+ "item",
198
+ "items",
199
+ "key",
200
+ "metadata",
201
+ "name",
202
+ "options",
203
+ "params",
204
+ "parameters",
205
+ "payload",
206
+ "properties",
207
+ "props",
208
+ "request",
209
+ "response",
210
+ "result",
211
+ "results",
212
+ "schema",
213
+ "settings",
214
+ "value",
215
+ "values",
216
+ ]);
217
+ function hasUsableName(schema, base) {
218
+ if (schema && typeof schema === "object" && "title" in schema) {
219
+ const title = schema.title;
220
+ if (typeof title === "string" && title)
221
+ return true;
222
+ }
223
+ if (!base)
224
+ return false;
225
+ if (/^\d+$/.test(base))
226
+ return false;
227
+ return !GENERIC_KEYS.has(base.toLowerCase());
228
+ }
229
+ //# sourceMappingURL=objects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objects.js","sourceRoot":"","sources":["../../../src/spec/normalize/objects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface PruneOptions {
2
+ /**
3
+ * When set, only schemas whose name is in this set are eligible for
4
+ * deletion. Pass the union of names hoisted by earlier passes to
5
+ * keep user-authored schemas untouched. Omit for a global sweep.
6
+ */
7
+ targets?: ReadonlySet<string>;
8
+ }
9
+ /**
10
+ * Drop unreferenced `components.schemas` entries. Scoped to `targets`
11
+ * when supplied; otherwise performs a global reachability sweep
12
+ * (operations + non-schema components, then transitive closure).
13
+ */
14
+ export declare function pruneUnusedSchemas(spec: unknown, opts?: PruneOptions): void;
15
+ //# sourceMappingURL=prune.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../../../src/spec/normalize/prune.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,IAAI,GAAE,YAAiB,GACtB,IAAI,CAuDN"}
@@ -0,0 +1,87 @@
1
+ import { refToName } from "@hey-api/shared";
2
+ import { getSchemasObject, schemasPointerPrefix } from "./walk.js";
3
+ /**
4
+ * Drop unreferenced `components.schemas` entries. Scoped to `targets`
5
+ * when supplied; otherwise performs a global reachability sweep
6
+ * (operations + non-schema components, then transitive closure).
7
+ */
8
+ export function pruneUnusedSchemas(spec, opts = {}) {
9
+ if (opts.targets && opts.targets.size === 0)
10
+ return;
11
+ const schemas = getSchemasObject(spec);
12
+ if (!schemas)
13
+ return;
14
+ const pointerPrefix = schemasPointerPrefix(spec);
15
+ if (!pointerPrefix)
16
+ return;
17
+ const reachable = new Set();
18
+ if (opts.targets) {
19
+ // Any reference anywhere — even from a dead authored schema — keeps
20
+ // a hoisted target alive, otherwise the surviving authored schema
21
+ // would carry a dangling `$ref`.
22
+ collectRefs(spec, reachable,
23
+ /* skipComponentsSchemas */ false, pointerPrefix);
24
+ }
25
+ else {
26
+ collectRefs(spec, reachable,
27
+ /* skipComponentsSchemas */ true, pointerPrefix);
28
+ let frontier = new Set(reachable);
29
+ while (frontier.size > 0) {
30
+ const next = new Set();
31
+ for (const name of frontier) {
32
+ const schema = schemas[name];
33
+ if (!schema)
34
+ continue;
35
+ const refs = new Set();
36
+ collectRefs(schema, refs,
37
+ /* skipComponentsSchemas */ false, pointerPrefix);
38
+ for (const ref of refs) {
39
+ if (!reachable.has(ref)) {
40
+ reachable.add(ref);
41
+ next.add(ref);
42
+ }
43
+ }
44
+ }
45
+ frontier = next;
46
+ }
47
+ }
48
+ for (const name of Object.keys(schemas)) {
49
+ if (reachable.has(name))
50
+ continue;
51
+ if (opts.targets && !opts.targets.has(name))
52
+ continue;
53
+ delete schemas[name];
54
+ }
55
+ }
56
+ function collectRefs(node, out, skipComponentsSchemas, pointerPrefix, inComponents = false) {
57
+ if (!node || typeof node !== "object")
58
+ return;
59
+ if (Array.isArray(node)) {
60
+ for (const item of node) {
61
+ collectRefs(item, out, skipComponentsSchemas, pointerPrefix, inComponents);
62
+ }
63
+ return;
64
+ }
65
+ const value = node;
66
+ for (const [k, v] of Object.entries(value)) {
67
+ if (k === "$ref" && typeof v === "string" && v.startsWith(pointerPrefix)) {
68
+ out.add(refToName(v));
69
+ continue;
70
+ }
71
+ if (skipComponentsSchemas && !inComponents && k === "components") {
72
+ collectRefsInComponents(v, out, pointerPrefix);
73
+ continue;
74
+ }
75
+ collectRefs(v, out, skipComponentsSchemas, pointerPrefix, inComponents);
76
+ }
77
+ }
78
+ function collectRefsInComponents(node, out, pointerPrefix) {
79
+ if (!node || typeof node !== "object" || Array.isArray(node))
80
+ return;
81
+ for (const [k, v] of Object.entries(node)) {
82
+ if (k === "schemas")
83
+ continue;
84
+ collectRefs(v, out, /* skip */ false, pointerPrefix, true);
85
+ }
86
+ }
87
+ //# sourceMappingURL=prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../../src/spec/normalize/prune.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Pattern adapted from @hey-api/openapi-ts (MIT) —
3
+ * `packages/shared/src/openApi/shared/transforms/enums.ts`.
4
+ * Walker, root-path detection, and pointer-prefix logic mirror the
5
+ * upstream private helpers, which aren't re-exported.
6
+ */
7
+ export interface SchemaNode {
8
+ key: string | number | null;
9
+ node: unknown;
10
+ parent: unknown;
11
+ path: ReadonlyArray<string | number>;
12
+ }
13
+ /** Visit every schema-shaped object in `spec`. */
14
+ export declare function walkSchemas(spec: unknown, visit: (n: SchemaNode) => void): void;
15
+ /** True when `path` points at `components.schemas.<X>` or `definitions.<X>`. */
16
+ export declare function isRootSchemaPath(path: ReadonlyArray<string | number>): boolean;
17
+ /** Pointer prefix for shared schemas (OpenAPI 3.x or Swagger 2.0). */
18
+ export declare function schemasPointerPrefix(spec: unknown): string;
19
+ /** Live handle on the spec's shared-schema map; creates containers if absent. */
20
+ export declare function getSchemasObject(spec: unknown): Record<string, unknown> | undefined;
21
+ //# sourceMappingURL=walk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.d.ts","sourceRoot":"","sources":["../../../src/spec/normalize/walk.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CACtC;AAED,kDAAkD;AAClD,wBAAgB,WAAW,CACzB,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,GAC7B,IAAI,CAEN;AAgCD,gFAAgF;AAChF,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,GACnC,OAAO,CAKT;AAED,sEAAsE;AACtE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAK1D;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,OAAO,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAgBrC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Pattern adapted from @hey-api/openapi-ts (MIT) —
3
+ * `packages/shared/src/openApi/shared/transforms/enums.ts`.
4
+ * Walker, root-path detection, and pointer-prefix logic mirror the
5
+ * upstream private helpers, which aren't re-exported.
6
+ */
7
+ /** JSON Schema keywords that hold child schemas. */
8
+ const CHILD_SCHEMA_KEYWORDS = [
9
+ "additionalProperties",
10
+ "allOf",
11
+ "anyOf",
12
+ "contains",
13
+ "dependentSchemas",
14
+ "else",
15
+ "if",
16
+ "items",
17
+ "oneOf",
18
+ "patternProperties",
19
+ "properties",
20
+ "propertyNames",
21
+ "then",
22
+ "unevaluatedProperties",
23
+ ];
24
+ /** Visit every schema-shaped object in `spec`. */
25
+ export function walkSchemas(spec, visit) {
26
+ walk({ key: null, node: spec, parent: null, path: [] }, visit);
27
+ }
28
+ function walk(n, visit) {
29
+ const { node, path } = n;
30
+ if (!node || typeof node !== "object" || Array.isArray(node))
31
+ return;
32
+ const value = node;
33
+ if (isSchemaShaped(value))
34
+ visit(n);
35
+ for (const [k, v] of Object.entries(value)) {
36
+ if (v === null || typeof v !== "object")
37
+ continue;
38
+ if (Array.isArray(v)) {
39
+ v.forEach((item, index) => walk({ key: index, node: item, parent: v, path: [...path, k, index] }, visit));
40
+ }
41
+ else {
42
+ walk({ key: k, node: v, parent: node, path: [...path, k] }, visit);
43
+ }
44
+ }
45
+ }
46
+ function isSchemaShaped(value) {
47
+ if ("type" in value || "enum" in value)
48
+ return true;
49
+ for (const keyword of CHILD_SCHEMA_KEYWORDS) {
50
+ if (keyword in value)
51
+ return true;
52
+ }
53
+ return false;
54
+ }
55
+ /** True when `path` points at `components.schemas.<X>` or `definitions.<X>`. */
56
+ export function isRootSchemaPath(path) {
57
+ if (path.length === 3 && path[0] === "components" && path[1] === "schemas") {
58
+ return true;
59
+ }
60
+ return path.length === 2 && path[0] === "definitions";
61
+ }
62
+ /** Pointer prefix for shared schemas (OpenAPI 3.x or Swagger 2.0). */
63
+ export function schemasPointerPrefix(spec) {
64
+ if (!spec || typeof spec !== "object")
65
+ return "";
66
+ if ("openapi" in spec)
67
+ return "#/components/schemas/";
68
+ if ("swagger" in spec)
69
+ return "#/definitions/";
70
+ return "";
71
+ }
72
+ /** Live handle on the spec's shared-schema map; creates containers if absent. */
73
+ export function getSchemasObject(spec) {
74
+ if (!spec || typeof spec !== "object")
75
+ return undefined;
76
+ const s = spec;
77
+ if ("openapi" in s) {
78
+ const components = (s.components ?? {});
79
+ s.components = components;
80
+ const schemas = (components.schemas ?? {});
81
+ components.schemas = schemas;
82
+ return schemas;
83
+ }
84
+ if ("swagger" in s) {
85
+ const defs = (s.definitions ?? {});
86
+ s.definitions = defs;
87
+ return defs;
88
+ }
89
+ return undefined;
90
+ }
91
+ //# sourceMappingURL=walk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.js","sourceRoot":"","sources":["../../../src/spec/normalize/walk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { IR } from "@hey-api/shared";
2
+ /**
3
+ * Extract the type name from a `$ref` pointing into
4
+ * `#/components/schemas`. Non-schema refs pass through unchanged so
5
+ * the caller can decide how to surface them; in practice generators
6
+ * only see schema refs because hey-api's ref-parser inlines other
7
+ * pointer types (parameters, requestBodies, responses) before the IR
8
+ * stage.
9
+ */
10
+ export declare function refName(ref: string): string;
11
+ /**
12
+ * Empty / unknown / void schemas — used to short-circuit a 2xx response
13
+ * to a no-payload return type (Kotlin `Unit`, Swift `Void`, Go's
14
+ * absence of a return type).
15
+ */
16
+ export declare function isMeaningless(s: IR.SchemaObject): boolean;
17
+ //# sourceMappingURL=ref.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../../src/spec/ref.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAI1C;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI3C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,GAAG,OAAO,CAUzD"}
@@ -0,0 +1,32 @@
1
+ const REF_SCHEMA_PREFIX = "#/components/schemas/";
2
+ /**
3
+ * Extract the type name from a `$ref` pointing into
4
+ * `#/components/schemas`. Non-schema refs pass through unchanged so
5
+ * the caller can decide how to surface them; in practice generators
6
+ * only see schema refs because hey-api's ref-parser inlines other
7
+ * pointer types (parameters, requestBodies, responses) before the IR
8
+ * stage.
9
+ */
10
+ export function refName(ref) {
11
+ return ref.startsWith(REF_SCHEMA_PREFIX)
12
+ ? ref.slice(REF_SCHEMA_PREFIX.length)
13
+ : ref;
14
+ }
15
+ /**
16
+ * Empty / unknown / void schemas — used to short-circuit a 2xx response
17
+ * to a no-payload return type (Kotlin `Unit`, Swift `Void`, Go's
18
+ * absence of a return type).
19
+ */
20
+ export function isMeaningless(s) {
21
+ if (s.$ref || s.const !== undefined)
22
+ return false;
23
+ if (s.items && s.items.length > 0)
24
+ return false;
25
+ if (s.properties && Object.keys(s.properties).length > 0)
26
+ return false;
27
+ return (s.type === undefined ||
28
+ s.type === "unknown" ||
29
+ s.type === "void" ||
30
+ s.type === "never");
31
+ }
32
+ //# sourceMappingURL=ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref.js","sourceRoot":"","sources":["../../src/spec/ref.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AAElD;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACtC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC;QACrC,CAAC,CAAC,GAAG,CAAC;AACV,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,CAAkB;IAC9C,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACvE,OAAO,CACL,CAAC,CAAC,IAAI,KAAK,SAAS;QACpB,CAAC,CAAC,IAAI,KAAK,SAAS;QACpB,CAAC,CAAC,IAAI,KAAK,MAAM;QACjB,CAAC,CAAC,IAAI,KAAK,OAAO,CACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Per-operation security-scheme NAME extraction. hey-api's IR drops
3
+ * scheme names from `op.security` (it inlines the resolved scheme
4
+ * objects into a different shape), leaving downstream generators with
5
+ * no way to wire `client.auth["<name>"]`. So we walk the raw bundled
6
+ * spec instead and key results by `${path}|${method}` for fast
7
+ * lookups during the IR pass.
8
+ *
9
+ * Map shape: `"/me|get" → ["bearerAuth", "apiKeyAuth"]`.
10
+ *
11
+ * An operation with `security: [{a: []}, {b: []}]` (logical OR — any
12
+ * scheme satisfies the requirement) and an operation with
13
+ * `security: [{a: [], b: []}]` (logical AND — both required) both
14
+ * collapse to the same name set here. Generators currently apply
15
+ * every scheme that has a matching `client.auth` entry; if we ever
16
+ * need to honour OR/AND semantics, this map needs to grow shape.
17
+ */
18
+ export declare function extractSecuritySchemeNames(spec: Record<string, unknown>): Map<string, ReadonlyArray<string>>;
19
+ /** Key used in the security-scheme map for one (path, method) pair.
20
+ * The pipe is non-URL-safe so it can't collide with a path segment. */
21
+ export declare const securityKey: (path: string, method: string) => string;
22
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/spec/security.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAuBpC;AAED;wEACwE;AACxE,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,KAAG,MACtC,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Per-operation security-scheme NAME extraction. hey-api's IR drops
3
+ * scheme names from `op.security` (it inlines the resolved scheme
4
+ * objects into a different shape), leaving downstream generators with
5
+ * no way to wire `client.auth["<name>"]`. So we walk the raw bundled
6
+ * spec instead and key results by `${path}|${method}` for fast
7
+ * lookups during the IR pass.
8
+ *
9
+ * Map shape: `"/me|get" → ["bearerAuth", "apiKeyAuth"]`.
10
+ *
11
+ * An operation with `security: [{a: []}, {b: []}]` (logical OR — any
12
+ * scheme satisfies the requirement) and an operation with
13
+ * `security: [{a: [], b: []}]` (logical AND — both required) both
14
+ * collapse to the same name set here. Generators currently apply
15
+ * every scheme that has a matching `client.auth` entry; if we ever
16
+ * need to honour OR/AND semantics, this map needs to grow shape.
17
+ */
18
+ export function extractSecuritySchemeNames(spec) {
19
+ const map = new Map();
20
+ const paths = (spec.paths ?? {});
21
+ for (const [pathStr, pathItem] of Object.entries(paths)) {
22
+ if (!pathItem || typeof pathItem !== "object")
23
+ continue;
24
+ for (const [method, op] of Object.entries(pathItem)) {
25
+ if (!op || typeof op !== "object")
26
+ continue;
27
+ const security = op.security;
28
+ if (!Array.isArray(security))
29
+ continue;
30
+ const names = new Set();
31
+ for (const requirement of security) {
32
+ if (requirement && typeof requirement === "object") {
33
+ for (const name of Object.keys(requirement))
34
+ names.add(name);
35
+ }
36
+ }
37
+ if (names.size > 0) {
38
+ map.set(securityKey(pathStr, method), [...names]);
39
+ }
40
+ }
41
+ }
42
+ return map;
43
+ }
44
+ /** Key used in the security-scheme map for one (path, method) pair.
45
+ * The pipe is non-URL-safe so it can't collide with a path segment. */
46
+ export const securityKey = (path, method) => `${path}|${method}`;
47
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/spec/security.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,0BAA0B,CACxC,IAA6B;IAE7B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAiC,CAAC;IACrD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAC;IAC5D,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;YAAE,SAAS;QACxD,KAAK,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CACvC,QAAmC,CACpC,EAAE,CAAC;YACF,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ;gBAAE,SAAS;YAC5C,MAAM,QAAQ,GAAI,EAA6B,CAAC,QAAQ,CAAC;YACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACvC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;YAChC,KAAK,MAAM,WAAW,IAAI,QAAQ,EAAE,CAAC;gBACnC,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;oBACnD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;wBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;wEACwE;AACxE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,MAAc,EAAU,EAAE,CAClE,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC"}
@@ -1,4 +1,4 @@
1
- import { refName } from "@ir-kit/openapi-core";
1
+ import { refName } from "../spec/ref.js";
2
2
  import { assertNoEnumCollisions, classifyEnumLiterals, } from "./enum.js";
3
3
  import { classifyObjectShape, iterateObjectProperties, } from "./object.js";
4
4
  import { classifyUnion } from "./union.js";