@mapples/api-import 1.5.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.
@@ -0,0 +1,7 @@
1
+ /** Turns free text into a request name (`API_REQUEST_NAME_PATTERN`). */
2
+ export declare const toRequestName: (text: string) => string;
3
+ /** A name from a method + path: `GET /users/{id}` → `getUsersId`. */
4
+ export declare const nameFromRoute: (method: string, path: string) => string;
5
+ /** Makes `name` unique against `taken` (`users`, `users2`, …) and claims it. */
6
+ export declare const uniqueName: (name: string, taken: Set<string>) => string;
7
+ //# sourceMappingURL=names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAW5C,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,EAAE,MAAM,MAAM,KAAG,MACX,CAAC;AAEnD,gFAAgF;AAChF,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC,KAAG,MAO7D,CAAC"}
package/dist/names.js ADDED
@@ -0,0 +1,24 @@
1
+ /** Turns free text into a request name (`API_REQUEST_NAME_PATTERN`). */
2
+ export const toRequestName = (text) => {
3
+ const words = text.match(/[A-Za-z0-9]+/g) ?? [];
4
+ const name = words
5
+ .map((word, index) => index === 0
6
+ ? word.charAt(0).toLowerCase() + word.slice(1)
7
+ : word.charAt(0).toUpperCase() + word.slice(1))
8
+ .join('');
9
+ if (name === '')
10
+ return 'request';
11
+ return /^[0-9]/.test(name) ? `_${name}` : name;
12
+ };
13
+ /** A name from a method + path: `GET /users/{id}` → `getUsersId`. */
14
+ export const nameFromRoute = (method, path) => toRequestName(`${method.toLowerCase()} ${path}`);
15
+ /** Makes `name` unique against `taken` (`users`, `users2`, …) and claims it. */
16
+ export const uniqueName = (name, taken) => {
17
+ let candidate = name;
18
+ for (let suffix = 2; taken.has(candidate); suffix += 1) {
19
+ candidate = `${name}${suffix}`;
20
+ }
21
+ taken.add(candidate);
22
+ return candidate;
23
+ };
24
+ //# sourceMappingURL=names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.js","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAU,EAAE;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,KAAK;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACnB,KAAK,KAAK,CAAC;QACT,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACjD;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,IAAY,EAAU,EAAE,CACpE,aAAa,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;AAEnD,gFAAgF;AAChF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,KAAkB,EAAU,EAAE;IACrE,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QACvD,SAAS,GAAG,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;IACjC,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACrB,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { ApiImportResult } from './types.js';
2
+ /** Whether the text is an OpenAPI 3 or Swagger 2 document (JSON or YAML). */
3
+ export declare const looksLikeOpenApi: (text: string) => boolean;
4
+ export interface OpenApiImportOptions {
5
+ /**
6
+ * The base URL the requests hang off, replacing the spec's own servers
7
+ * (or Swagger `host` + `basePath`) — for a spec that names a different
8
+ * host than the one the app calls, or none.
9
+ */
10
+ baseUrl?: string;
11
+ /**
12
+ * Where the document was fetched from: a relative server URL (`/api/v3`)
13
+ * resolves against it. Without it a relative server URL throws.
14
+ */
15
+ sourceUrl?: string;
16
+ }
17
+ /**
18
+ * An OpenAPI 3.x (or Swagger 2.0) document → one request per operation. Path parameters and
19
+ * required query parameters become `params` (with the spec's example as the
20
+ * value), a JSON request body becomes the body template, and the first 2xx
21
+ * JSON response becomes the response sample, synthesized from the schema
22
+ * when the spec gives no example.
23
+ */
24
+ export declare const importOpenApi: (text: string, options?: OpenApiImportOptions) => ApiImportResult;
25
+ //# sourceMappingURL=openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAYnE,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,OAEP,CAAC;AAE1C,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8ND;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GACxB,MAAM,MAAM,EACZ,UAAS,oBAAyB,KACjC,eAoGF,CAAC"}
@@ -0,0 +1,299 @@
1
+ import { parse as parseYaml } from 'yaml';
2
+ import { nameFromRoute, toRequestName, uniqueName } from './names.js';
3
+ import { swaggerToOpenApi } from './swagger.js';
4
+ const METHODS = ['get', 'post', 'put', 'patch', 'delete'];
5
+ /** How deep a schema is followed when a sample is synthesized from it. */
6
+ const MAX_SCHEMA_DEPTH = 6;
7
+ const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
8
+ /** Whether the text is an OpenAPI 3 or Swagger 2 document (JSON or YAML). */
9
+ export const looksLikeOpenApi = (text) => /^\s*\{[\s\S]*"(openapi|swagger)"\s*:/.test(text) ||
10
+ /^\s*(openapi|swagger)\s*:/m.test(text);
11
+ /** The parsed document, translated to the OpenAPI 3 shape when it is Swagger 2. */
12
+ const parseDocument = (text, options) => {
13
+ const trimmed = text.trim();
14
+ const document = trimmed.startsWith('{')
15
+ ? JSON.parse(trimmed)
16
+ : parseYaml(trimmed);
17
+ if (!isObject(document)) {
18
+ throw new Error('The OpenAPI document is not an object');
19
+ }
20
+ if (typeof document.swagger === 'string') {
21
+ if (!document.swagger.startsWith('2')) {
22
+ throw new Error(`Swagger ${document.swagger} is not supported`);
23
+ }
24
+ return {
25
+ document: swaggerToOpenApi(document, options.baseUrl),
26
+ format: 'swagger',
27
+ };
28
+ }
29
+ if (typeof document.openapi !== 'string' ||
30
+ !document.openapi.startsWith('3')) {
31
+ throw new Error('The document is not an OpenAPI 3.x or Swagger 2.0 definition');
32
+ }
33
+ if (options.baseUrl) {
34
+ return {
35
+ document: { ...document, servers: [{ url: options.baseUrl }] },
36
+ format: 'openapi',
37
+ };
38
+ }
39
+ return { document, format: 'openapi' };
40
+ };
41
+ /** Follows a local `$ref`; a reference outside the document throws. */
42
+ const createResolver = (root) => {
43
+ const resolve = (node, seen = []) => {
44
+ if (!isObject(node) || typeof node.$ref !== 'string')
45
+ return node;
46
+ const ref = node.$ref;
47
+ if (!ref.startsWith('#/')) {
48
+ throw new Error(`External reference "${ref}" is not supported`);
49
+ }
50
+ if (seen.includes(ref)) {
51
+ throw new Error(`Circular reference "${ref}"`);
52
+ }
53
+ let target = root;
54
+ for (const segment of ref.slice(2).split('/')) {
55
+ const key = segment.replace(/~1/g, '/').replace(/~0/g, '~');
56
+ if (!isObject(target) || !(key in target)) {
57
+ throw new Error(`Reference "${ref}" does not resolve`);
58
+ }
59
+ target = target[key];
60
+ }
61
+ return resolve(target, [...seen, ref]);
62
+ };
63
+ return resolve;
64
+ };
65
+ /**
66
+ * A sample value for a schema: its example or default when it has one,
67
+ * otherwise a placeholder of the right type. A schema that refers back to
68
+ * itself stops at `null` for that branch.
69
+ */
70
+ const sampleFromSchema = (schemaNode, resolve, depth = 0, refs = []) => {
71
+ let nextRefs = refs;
72
+ if (isObject(schemaNode) && typeof schemaNode.$ref === 'string') {
73
+ if (refs.includes(schemaNode.$ref))
74
+ return null;
75
+ nextRefs = [...refs, schemaNode.$ref];
76
+ }
77
+ const schema = resolve(schemaNode);
78
+ if (!isObject(schema) || depth > MAX_SCHEMA_DEPTH)
79
+ return null;
80
+ if ('example' in schema)
81
+ return schema.example;
82
+ if ('default' in schema)
83
+ return schema.default;
84
+ if (Array.isArray(schema.enum) && schema.enum.length > 0) {
85
+ return schema.enum[0];
86
+ }
87
+ if (Array.isArray(schema.allOf)) {
88
+ return schema.allOf.reduce((merged, part) => {
89
+ const sample = sampleFromSchema(part, resolve, depth + 1, nextRefs);
90
+ return isObject(sample) ? { ...merged, ...sample } : merged;
91
+ }, {});
92
+ }
93
+ const alternatives = schema.oneOf ?? schema.anyOf;
94
+ if (Array.isArray(alternatives) && alternatives.length > 0) {
95
+ return sampleFromSchema(alternatives[0], resolve, depth + 1, nextRefs);
96
+ }
97
+ const type = Array.isArray(schema.type)
98
+ ? schema.type.find((entry) => entry !== 'null')
99
+ : schema.type;
100
+ if (type === 'object' || isObject(schema.properties)) {
101
+ const properties = isObject(schema.properties) ? schema.properties : {};
102
+ return Object.fromEntries(Object.entries(properties).map(([key, property]) => [
103
+ key,
104
+ sampleFromSchema(property, resolve, depth + 1, nextRefs),
105
+ ]));
106
+ }
107
+ if (type === 'array') {
108
+ return [sampleFromSchema(schema.items, resolve, depth + 1, nextRefs)];
109
+ }
110
+ if (type === 'integer' || type === 'number')
111
+ return 0;
112
+ if (type === 'boolean')
113
+ return true;
114
+ if (type === 'string') {
115
+ if (schema.format === 'date-time')
116
+ return '2025-01-01T00:00:00Z';
117
+ if (schema.format === 'date')
118
+ return '2025-01-01';
119
+ if (schema.format === 'email')
120
+ return 'user@example.com';
121
+ if (schema.format === 'uuid')
122
+ return '00000000-0000-0000-0000-000000000000';
123
+ return 'string';
124
+ }
125
+ return null;
126
+ };
127
+ /** The JSON sample of a `content` map: its example, else its schema's. */
128
+ const sampleFromContent = (content, resolve) => {
129
+ if (!isObject(content))
130
+ return undefined;
131
+ const mediaType = Object.keys(content).find((key) => key.includes('json'));
132
+ if (!mediaType)
133
+ return undefined;
134
+ const media = resolve(content[mediaType]);
135
+ if (!isObject(media))
136
+ return undefined;
137
+ if ('example' in media)
138
+ return media.example;
139
+ if (isObject(media.examples)) {
140
+ const first = resolve(Object.values(media.examples)[0]);
141
+ if (isObject(first) && 'value' in first)
142
+ return first.value;
143
+ }
144
+ return media.schema === undefined
145
+ ? undefined
146
+ : sampleFromSchema(media.schema, resolve);
147
+ };
148
+ const parameterValue = (parameter, resolve) => {
149
+ const schema = resolve(parameter.schema);
150
+ const example = parameter.example ??
151
+ (isObject(schema) ? (schema.example ?? schema.default) : undefined);
152
+ return example === undefined || example === null ? '' : String(example);
153
+ };
154
+ const serverUrl = (document, resolve, sourceUrl) => {
155
+ const servers = Array.isArray(document.servers) ? document.servers : [];
156
+ const server = resolve(servers[0]);
157
+ if (!isObject(server) || typeof server.url !== 'string') {
158
+ throw new Error('The OpenAPI document has no servers[0].url — the requests would have no base URL');
159
+ }
160
+ const variables = isObject(server.variables) ? server.variables : {};
161
+ let url = server.url;
162
+ if (!/^https?:\/\//i.test(url)) {
163
+ if (!sourceUrl) {
164
+ throw new Error(`The server URL "${url}" is relative — pass the URL the document came from, or a base URL`);
165
+ }
166
+ url = new URL(url, sourceUrl).toString();
167
+ }
168
+ return url
169
+ .replace(/\{([^}]+)\}/g, (_match, name) => {
170
+ const variable = resolve(variables[name]);
171
+ if (!isObject(variable) || variable.default === undefined) {
172
+ throw new Error(`Server variable "${name}" has no default`);
173
+ }
174
+ return String(variable.default);
175
+ })
176
+ .replace(/\/$/, '');
177
+ };
178
+ /**
179
+ * The first security requirement a request can carry: HTTP bearer, or an API
180
+ * key in a header. Only the scheme's *name* is kept, as the secret to store.
181
+ */
182
+ const authFor = (security, schemes, resolve) => {
183
+ if (!Array.isArray(security))
184
+ return undefined;
185
+ for (const requirement of security) {
186
+ if (!isObject(requirement))
187
+ continue;
188
+ for (const schemeName of Object.keys(requirement)) {
189
+ const scheme = resolve(schemes[schemeName]);
190
+ if (!isObject(scheme))
191
+ continue;
192
+ const secretRef = toRequestName(schemeName)
193
+ .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
194
+ .toUpperCase();
195
+ if (scheme.type === 'http' && scheme.scheme === 'bearer') {
196
+ return { kind: 'bearer', secretRef };
197
+ }
198
+ if (scheme.type === 'apiKey' &&
199
+ scheme.in === 'header' &&
200
+ typeof scheme.name === 'string') {
201
+ return { kind: 'header', header: scheme.name, secretRef };
202
+ }
203
+ }
204
+ }
205
+ return undefined;
206
+ };
207
+ /**
208
+ * An OpenAPI 3.x (or Swagger 2.0) document → one request per operation. Path parameters and
209
+ * required query parameters become `params` (with the spec's example as the
210
+ * value), a JSON request body becomes the body template, and the first 2xx
211
+ * JSON response becomes the response sample, synthesized from the schema
212
+ * when the spec gives no example.
213
+ */
214
+ export const importOpenApi = (text, options = {}) => {
215
+ const { document, format } = parseDocument(text, options);
216
+ const resolve = createResolver(document);
217
+ const warnings = [];
218
+ const components = isObject(document.components) ? document.components : {};
219
+ const schemes = isObject(components.securitySchemes)
220
+ ? components.securitySchemes
221
+ : {};
222
+ const info = isObject(document.info) ? document.info : {};
223
+ const paths = isObject(document.paths) ? document.paths : {};
224
+ const taken = new Set();
225
+ const requests = [];
226
+ for (const [path, pathNode] of Object.entries(paths)) {
227
+ const pathItem = resolve(pathNode);
228
+ if (!isObject(pathItem))
229
+ continue;
230
+ const sharedParameters = Array.isArray(pathItem.parameters)
231
+ ? pathItem.parameters
232
+ : [];
233
+ for (const method of METHODS) {
234
+ const operation = pathItem[method];
235
+ if (!isObject(operation))
236
+ continue;
237
+ const params = {};
238
+ const parameters = [
239
+ ...sharedParameters,
240
+ ...(Array.isArray(operation.parameters) ? operation.parameters : []),
241
+ ];
242
+ for (const parameterNode of parameters) {
243
+ const parameter = resolve(parameterNode);
244
+ if (!isObject(parameter) || typeof parameter.name !== 'string')
245
+ continue;
246
+ const wanted = parameter.in === 'path' ||
247
+ (parameter.in === 'query' && parameter.required === true);
248
+ if (!wanted)
249
+ continue;
250
+ params[parameter.name] = {
251
+ kind: 'static',
252
+ value: parameterValue(parameter, resolve),
253
+ };
254
+ }
255
+ const requestBody = resolve(operation.requestBody);
256
+ const template = method === 'get' || !isObject(requestBody)
257
+ ? undefined
258
+ : sampleFromContent(requestBody.content, resolve);
259
+ const responses = isObject(operation.responses)
260
+ ? operation.responses
261
+ : {};
262
+ const successCode = Object.keys(responses)
263
+ .filter((code) => /^2\d\d$/.test(code))
264
+ .sort()[0] ?? ('default' in responses ? 'default' : undefined);
265
+ const response = successCode
266
+ ? resolve(responses[successCode])
267
+ : undefined;
268
+ const security = operation.security ?? document.security;
269
+ const auth = authFor(security, schemes, resolve);
270
+ if (Array.isArray(security) && security.length > 0 && !auth) {
271
+ warnings.push(`${method.toUpperCase()} ${path}: its security scheme is neither HTTP bearer nor a header API key — set its auth by hand.`);
272
+ }
273
+ requests.push({
274
+ name: uniqueName(typeof operation.operationId === 'string'
275
+ ? toRequestName(operation.operationId)
276
+ : nameFromRoute(method, path), taken),
277
+ method: method.toUpperCase(),
278
+ path,
279
+ params: Object.keys(params).length > 0 ? params : undefined,
280
+ body: template === undefined ? undefined : { kind: 'json', template },
281
+ auth,
282
+ responseSample: isObject(response)
283
+ ? sampleFromContent(response.content, resolve)
284
+ : undefined,
285
+ });
286
+ }
287
+ }
288
+ if (requests.length === 0) {
289
+ throw new Error('The OpenAPI document declares no operations');
290
+ }
291
+ return {
292
+ format,
293
+ baseUrl: serverUrl(document, resolve, options.sourceUrl),
294
+ environmentName: typeof info.title === 'string' ? info.title : 'API',
295
+ requests,
296
+ warnings,
297
+ };
298
+ };
299
+ //# sourceMappingURL=openapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ApiImportResult } from './types.js';
2
+ /** Whether the text is a Postman collection export. */
3
+ export declare const looksLikePostman: (text: string) => boolean;
4
+ /**
5
+ * A Postman collection → one request per item. The most common origin
6
+ * becomes the environment's base URL (a `{{baseUrl}}` variable resolves to
7
+ * its collection value); requests on another origin keep absolute URLs.
8
+ * `:id` path segments become `{id}` tokens with the item's example values.
9
+ */
10
+ export declare const importPostman: (text: string) => ApiImportResult;
11
+ //# sourceMappingURL=postman.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postman.d.ts","sourceRoot":"","sources":["../src/postman.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,YAAY,CAAC;AAsBpB,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,OAG7C,CAAC;AA8FJ;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,eAyL5C,CAAC"}