@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,260 @@
1
+ import { stripBodyCredentials } from './bodyCredentials.js';
2
+ import { nameFromRoute, toRequestName, uniqueName } from './names.js';
3
+ const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
4
+ const METHODS = new Set(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']);
5
+ /** Header and variable names whose values are credentials. */
6
+ const CREDENTIAL_NAME = /(token|secret|password|passwd|api[-_]?key|apikey|auth|bearer|session|cookie|private)/i;
7
+ /** A `{{name}}` that is the whole value. */
8
+ const WHOLE_VARIABLE = /^\{\{\s*([^}]+?)\s*\}\}$/;
9
+ /** `apiToken` / `api-token` → `API_TOKEN`, the shape secret names take. */
10
+ const secretName = (name) => toRequestName(name)
11
+ .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
12
+ .toUpperCase();
13
+ /** Whether the text is a Postman collection export. */
14
+ export const looksLikePostman = (text) => /^\s*\{[\s\S]*"info"[\s\S]*"schema"\s*:\s*"[^"]*getpostman\.com\/json\/collection/.test(text);
15
+ /** Every request in the collection, folders flattened depth-first. */
16
+ const flatten = (items, out = []) => {
17
+ for (const item of items) {
18
+ if (!isObject(item))
19
+ continue;
20
+ if (Array.isArray(item.item)) {
21
+ flatten(item.item, out);
22
+ continue;
23
+ }
24
+ const request = typeof item.request === 'string'
25
+ ? { url: item.request, method: 'GET' }
26
+ : item.request;
27
+ if (!isObject(request))
28
+ continue;
29
+ out.push({
30
+ name: typeof item.name === 'string' ? item.name : '',
31
+ request,
32
+ response: Array.isArray(item.response) ? item.response : [],
33
+ });
34
+ }
35
+ return out;
36
+ };
37
+ const rawUrl = (url) => {
38
+ if (typeof url === 'string')
39
+ return url;
40
+ if (isObject(url) && typeof url.raw === 'string')
41
+ return url.raw;
42
+ throw new Error('A Postman request has no URL');
43
+ };
44
+ /** A collection/request `auth` block as a Mapples auth, plus the warning it costs. */
45
+ const authFrom = (auth, where, warnings) => {
46
+ if (!isObject(auth) || auth.type === 'noauth')
47
+ return undefined;
48
+ const entries = Array.isArray(auth[auth.type])
49
+ ? auth[auth.type]
50
+ : [];
51
+ const field = (key) => {
52
+ const entry = entries.find((candidate) => isObject(candidate) && candidate.key === key);
53
+ return isObject(entry) && typeof entry.value === 'string'
54
+ ? entry.value
55
+ : undefined;
56
+ };
57
+ const secretFor = (value, fallback) => {
58
+ const variable = value?.match(WHOLE_VARIABLE)?.[1];
59
+ return secretName(variable ?? fallback);
60
+ };
61
+ if (auth.type === 'bearer') {
62
+ const secretRef = secretFor(field('token'), 'API_TOKEN');
63
+ warnings.push(`${where}: the bearer token was not imported. Store it as the secret ${secretRef}.`);
64
+ return { kind: 'bearer', secretRef };
65
+ }
66
+ if (auth.type === 'apikey' && field('in') !== 'query') {
67
+ const header = field('key') ?? 'X-API-Key';
68
+ const secretRef = secretFor(field('value'), 'API_KEY');
69
+ warnings.push(`${where}: the ${header} value was not imported. Store it as the secret ${secretRef}.`);
70
+ return { kind: 'header', header, secretRef };
71
+ }
72
+ warnings.push(`${where}: Postman "${String(auth.type)}" auth is not supported — set the request's auth by hand.`);
73
+ return undefined;
74
+ };
75
+ /**
76
+ * Splits a URL into the shared origin and the path. A leading
77
+ * `{{baseUrl}}`-style variable is the origin (its value becomes the
78
+ * environment's base URL); otherwise the scheme + host are.
79
+ */
80
+ const splitUrl = (url) => {
81
+ const variable = url.match(/^(\{\{\s*[^}]+?\s*\}\})(.*)$/);
82
+ if (variable)
83
+ return { origin: variable[1], path: variable[2] || '/' };
84
+ const absolute = url.match(/^(https?:\/\/[^/?#]+)(.*)$/i);
85
+ if (absolute)
86
+ return { origin: absolute[1], path: absolute[2] || '/' };
87
+ throw new Error(`"${url}" is neither absolute nor starts with a {{variable}}`);
88
+ };
89
+ /**
90
+ * A Postman collection → one request per item. The most common origin
91
+ * becomes the environment's base URL (a `{{baseUrl}}` variable resolves to
92
+ * its collection value); requests on another origin keep absolute URLs.
93
+ * `:id` path segments become `{id}` tokens with the item's example values.
94
+ */
95
+ export const importPostman = (text) => {
96
+ const collection = JSON.parse(text);
97
+ if (!isObject(collection) || !Array.isArray(collection.item)) {
98
+ throw new Error('The text is not a Postman collection');
99
+ }
100
+ const info = isObject(collection.info) ? collection.info : {};
101
+ const warnings = [];
102
+ const variables = {};
103
+ for (const entry of Array.isArray(collection.variable)
104
+ ? collection.variable
105
+ : []) {
106
+ if (!isObject(entry) || typeof entry.key !== 'string')
107
+ continue;
108
+ if (CREDENTIAL_NAME.test(entry.key)) {
109
+ warnings.push(`The collection variable "${entry.key}" looks like a credential and was not imported. Store it as the secret ${secretName(entry.key)}.`);
110
+ continue;
111
+ }
112
+ variables[entry.key] = entry.value === undefined ? '' : String(entry.value);
113
+ }
114
+ const items = flatten(collection.item);
115
+ if (items.length === 0) {
116
+ throw new Error('The Postman collection holds no requests');
117
+ }
118
+ const origins = new Map();
119
+ const parsed = items.map((item) => {
120
+ const split = splitUrl(rawUrl(item.request.url));
121
+ origins.set(split.origin, (origins.get(split.origin) ?? 0) + 1);
122
+ return { item, ...split };
123
+ });
124
+ const origin = [...origins.entries()].sort((a, b) => b[1] - a[1])[0][0];
125
+ const originVariable = origin.match(WHOLE_VARIABLE)?.[1];
126
+ let baseUrl = origin;
127
+ if (originVariable) {
128
+ const value = variables[originVariable];
129
+ if (!value) {
130
+ throw new Error(`The requests start with {{${originVariable}}}, which the collection gives no value — export the collection with its variables`);
131
+ }
132
+ baseUrl = value;
133
+ delete variables[originVariable];
134
+ }
135
+ // Resolved once: requests without their own auth inherit it.
136
+ const collectionAuth = authFrom(collection.auth, 'Collection', warnings);
137
+ const taken = new Set();
138
+ const credentials = [];
139
+ const requests = parsed.map(({ item, origin: itemOrigin, path: rawPath }, index) => {
140
+ const method = String(item.request.method ?? 'GET').toUpperCase();
141
+ if (!METHODS.has(method)) {
142
+ throw new Error(`"${item.name}": method ${method} is not supported`);
143
+ }
144
+ const where = `${method} ${item.name || rawPath}`;
145
+ const url = isObject(item.request.url) ? item.request.url : {};
146
+ // `:id` → `{id}`; the query string moves into params.
147
+ const [pathPart, queryPart] = rawPath.split('?');
148
+ const path = pathPart.replace(/:([A-Za-z_][A-Za-z0-9_]*)/g, '{$1}');
149
+ const params = {};
150
+ for (const entry of Array.isArray(url.variable) ? url.variable : []) {
151
+ if (isObject(entry) && typeof entry.key === 'string') {
152
+ params[entry.key] = {
153
+ kind: 'static',
154
+ value: entry.value === undefined ? '' : String(entry.value),
155
+ };
156
+ }
157
+ }
158
+ // A URL given as a plain string carries its query only in the text.
159
+ const query = Array.isArray(url.query)
160
+ ? url.query
161
+ : (queryPart ?? '')
162
+ .split('&')
163
+ .filter((pair) => pair !== '')
164
+ .map((pair) => {
165
+ const [key, ...value] = pair.split('=');
166
+ return {
167
+ key: decodeURIComponent(key),
168
+ value: decodeURIComponent(value.join('=')),
169
+ };
170
+ });
171
+ for (const entry of query) {
172
+ if (!isObject(entry) || typeof entry.key !== 'string' || entry.disabled)
173
+ continue;
174
+ if (CREDENTIAL_NAME.test(entry.key)) {
175
+ warnings.push(`${where}: the query parameter "${entry.key}" looks like a credential and was not imported.`);
176
+ continue;
177
+ }
178
+ params[entry.key] = {
179
+ kind: 'static',
180
+ value: entry.value == null ? '' : String(entry.value),
181
+ };
182
+ }
183
+ const headers = {};
184
+ for (const entry of Array.isArray(item.request.header)
185
+ ? item.request.header
186
+ : []) {
187
+ if (!isObject(entry) || typeof entry.key !== 'string' || entry.disabled)
188
+ continue;
189
+ if (CREDENTIAL_NAME.test(entry.key)) {
190
+ warnings.push(`${where}: the ${entry.key} header was not imported — it carries a credential; set the request's auth instead.`);
191
+ continue;
192
+ }
193
+ if (entry.key.toLowerCase() === 'content-type')
194
+ continue;
195
+ headers[entry.key] = String(entry.value ?? '');
196
+ }
197
+ let template;
198
+ const body = isObject(item.request.body) ? item.request.body : null;
199
+ if (body && body.mode === 'raw' && typeof body.raw === 'string') {
200
+ const raw = body.raw.trim();
201
+ if (raw !== '') {
202
+ try {
203
+ template = JSON.parse(raw);
204
+ }
205
+ catch {
206
+ warnings.push(`${where}: the body is not plain JSON (Postman variables inside it?) — it was not imported.`);
207
+ }
208
+ }
209
+ }
210
+ else if (body && body.mode && body.mode !== 'none') {
211
+ warnings.push(`${where}: a ${String(body.mode)} body is not supported — only raw JSON bodies are imported.`);
212
+ }
213
+ if (template !== undefined) {
214
+ const stripped = stripBodyCredentials(template, index);
215
+ template = stripped.template;
216
+ credentials.push(...stripped.credentials);
217
+ }
218
+ let responseSample;
219
+ for (const response of item.response) {
220
+ if (!isObject(response) || typeof response.body !== 'string')
221
+ continue;
222
+ const code = Number(response.code);
223
+ if (Number.isFinite(code) && (code < 200 || code >= 300))
224
+ continue;
225
+ try {
226
+ responseSample = JSON.parse(response.body);
227
+ break;
228
+ }
229
+ catch {
230
+ // A non-JSON saved response is no sample.
231
+ }
232
+ }
233
+ return {
234
+ name: uniqueName(item.name ? toRequestName(item.name) : nameFromRoute(method, path), taken),
235
+ method: method,
236
+ path: itemOrigin === origin ? path : `${itemOrigin}${path}`,
237
+ headers: Object.keys(headers).length > 0 ? headers : undefined,
238
+ params: Object.keys(params).length > 0 ? params : undefined,
239
+ body: template === undefined ? undefined : { kind: 'json', template },
240
+ // The collection's credential is for its own API: a request to
241
+ // another origin never inherits it.
242
+ auth: item.request.auth !== undefined
243
+ ? authFrom(item.request.auth, where, warnings)
244
+ : itemOrigin === origin
245
+ ? collectionAuth
246
+ : undefined,
247
+ responseSample,
248
+ };
249
+ });
250
+ return {
251
+ format: 'postman',
252
+ baseUrl: baseUrl.replace(/\/$/, ''),
253
+ environmentName: typeof info.name === 'string' ? info.name : 'API',
254
+ requests,
255
+ variables: Object.keys(variables).length > 0 ? variables : undefined,
256
+ warnings,
257
+ bodyCredentials: credentials.length > 0 ? credentials : undefined,
258
+ };
259
+ };
260
+ //# sourceMappingURL=postman.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postman.js","sourceRoot":"","sources":["../src/postman.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAStE,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAiB,EAAE,CACjD,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE/E,8DAA8D;AAC9D,MAAM,eAAe,GACnB,uFAAuF,CAAC;AAE1F,4CAA4C;AAC5C,MAAM,cAAc,GAAG,0BAA0B,CAAC;AAElD,2EAA2E;AAC3E,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CAC1C,aAAa,CAAC,IAAI,CAAC;KAChB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;KACtC,WAAW,EAAE,CAAC;AAEnB,uDAAuD;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAW,EAAE,CACxD,kFAAkF,CAAC,IAAI,CACrF,IAAI,CACL,CAAC;AAQJ,sEAAsE;AACtE,MAAM,OAAO,GAAG,CAAC,KAAgB,EAAE,MAAkB,EAAE,EAAc,EAAE;IACrE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GACX,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;YAC9B,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;YACtC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACjC,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;YACpD,OAAO;YACP,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;SAC5D,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,GAAY,EAAU,EAAE;IACtC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC;IACjE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF,sFAAsF;AACtF,MAAM,QAAQ,GAAG,CACf,IAAa,EACb,KAAa,EACb,QAAkB,EACU,EAAE;IAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC;QACtD,CAAC,CAAE,IAAI,CAAC,IAAI,CAAC,IAAc,CAAe;QAC1C,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,KAAK,GAAG,CAAC,GAAW,EAAsB,EAAE;QAChD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CACxB,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,GAAG,KAAK,GAAG,CAC5D,CAAC;QACF,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YACvD,CAAC,CAAC,KAAK,CAAC,KAAK;YACb,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,CAAC,KAAyB,EAAE,QAAgB,EAAU,EAAE;QACxE,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO,UAAU,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC;IACF,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,CACX,GAAG,KAAK,+DAA+D,SAAS,GAAG,CACpF,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACvC,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;QACtD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC;QAC3C,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;QACvD,QAAQ,CAAC,IAAI,CACX,GAAG,KAAK,SAAS,MAAM,mDAAmD,SAAS,GAAG,CACvF,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/C,CAAC;IACD,QAAQ,CAAC,IAAI,CACX,GAAG,KAAK,cAAc,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,2DAA2D,CACnG,CAAC;IACF,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAoC,EAAE;IACjE,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC3D,IAAI,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;IACvE,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC1D,IAAI,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;IACvE,MAAM,IAAI,KAAK,CACb,IAAI,GAAG,sDAAsD,CAC9D,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAmB,EAAE;IAC7D,MAAM,UAAU,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QACpD,CAAC,CAAC,UAAU,CAAC,QAAQ;QACrB,CAAC,CAAC,EAAE,EAAE,CAAC;QACP,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;YAAE,SAAS;QAChE,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CACX,4BAA4B,KAAK,CAAC,GAAG,0EAA0E,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CACxI,CAAC;YACF,SAAS;QACX,CAAC;QACD,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,OAAO,GAAG,MAAM,CAAC;IACrB,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,6BAA6B,cAAc,oFAAoF,CAChI,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,KAAK,CAAC;QAChB,OAAO,SAAS,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC;IAED,6DAA6D;IAC7D,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAsB,MAAM,CAAC,GAAG,CAC5C,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE;QACrD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAoB,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,mBAAmB,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAE/D,sDAAsD;QACtD,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;QACpE,MAAM,MAAM,GAAmC,EAAE,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACpE,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACrD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;oBAClB,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;iBAC5D,CAAC;YACJ,CAAC;QACH,CAAC;QACD,oEAAoE;QACpE,MAAM,KAAK,GAAc,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YAC/C,CAAC,CAAC,GAAG,CAAC,KAAK;YACX,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;iBACd,KAAK,CAAC,GAAG,CAAC;iBACV,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;iBAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACZ,MAAM,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxC,OAAO;oBACL,GAAG,EAAE,kBAAkB,CAAC,GAAG,CAAC;oBAC5B,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBAC3C,CAAC;YACJ,CAAC,CAAC,CAAC;QACT,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ;gBACrE,SAAS;YACX,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,QAAQ,CAAC,IAAI,CACX,GAAG,KAAK,0BAA0B,KAAK,CAAC,GAAG,iDAAiD,CAC7F,CAAC;gBACF,SAAS;YACX,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;gBAClB,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;aACtD,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACpD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;YACrB,CAAC,CAAC,EAAE,EAAE,CAAC;YACP,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ;gBACrE,SAAS;YACX,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,QAAQ,CAAC,IAAI,CACX,GAAG,KAAK,SAAS,KAAK,CAAC,GAAG,qFAAqF,CAChH,CAAC;gBACF,SAAS;YACX,CAAC;YACD,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,cAAc;gBAAE,SAAS;YACzD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,QAAiB,CAAC;QACtB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAChE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC7B,CAAC;gBAAC,MAAM,CAAC;oBACP,QAAQ,CAAC,IAAI,CACX,GAAG,KAAK,oFAAoF,CAC7F,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACrD,QAAQ,CAAC,IAAI,CACX,GAAG,KAAK,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,6DAA6D,CAC9F,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACvD,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;YAC7B,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,cAAuB,CAAC;QAC5B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACvE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC;gBAAE,SAAS;YACnE,IAAI,CAAC;gBACH,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3C,MAAM;YACR,CAAC;YAAC,MAAM,CAAC;gBACP,0CAA0C;YAC5C,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,UAAU,CACd,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,EAClE,KAAK,CACN;YACD,MAAM,EAAE,MAAoB;YAC5B,IAAI,EAAE,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,EAAE;YAC3D,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YAC9D,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAC3D,IAAI,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE;YACrE,+DAA+D;YAC/D,oCAAoC;YACpC,IAAI,EACF,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS;gBAC7B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC;gBAC9C,CAAC,CAAC,UAAU,KAAK,MAAM;oBACrB,CAAC,CAAC,cAAc;oBAChB,CAAC,CAAC,SAAS;YACjB,cAAc;SACf,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACnC,eAAe,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;QAClE,QAAQ;QACR,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACpE,QAAQ;QACR,eAAe,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;KAClE,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @fileoverview Swagger 2.0 → the OpenAPI 3 shape `importOpenApi` reads.
3
+ * Only what the importer uses is translated: the server URL, `$ref` roots,
4
+ * parameters (a `body` parameter becomes the request body), JSON responses
5
+ * and the security schemes. PostgREST (Supabase, Neon's Data API) serves
6
+ * this format, with most parameters shared under `#/parameters`.
7
+ */
8
+ type Json = Record<string, unknown>;
9
+ /**
10
+ * Translates a parsed Swagger 2.0 document. `resolveParameter` reads a
11
+ * shared parameter, so a `$ref`'d body parameter still becomes a body.
12
+ * `baseUrl` replaces `host` + `basePath` (a spec served behind a proxy
13
+ * often names the wrong host, or none).
14
+ */
15
+ export declare const swaggerToOpenApi: (swagger: Json, baseUrl?: string) => Json;
16
+ export {};
17
+ //# sourceMappingURL=swagger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.d.ts","sourceRoot":"","sources":["../src/swagger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAwEpC;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAS,IAAI,EAAE,UAAU,MAAM,KAAG,IAsGlE,CAAC"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * @fileoverview Swagger 2.0 → the OpenAPI 3 shape `importOpenApi` reads.
3
+ * Only what the importer uses is translated: the server URL, `$ref` roots,
4
+ * parameters (a `body` parameter becomes the request body), JSON responses
5
+ * and the security schemes. PostgREST (Supabase, Neon's Data API) serves
6
+ * this format, with most parameters shared under `#/parameters`.
7
+ */
8
+ const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
9
+ const METHODS = ['get', 'post', 'put', 'patch', 'delete'];
10
+ /** `#/definitions/x` → `#/components/schemas/x`, and so on, everywhere. */
11
+ const rewriteRefs = (node) => {
12
+ if (Array.isArray(node))
13
+ return node.map(rewriteRefs);
14
+ if (!isObject(node))
15
+ return node;
16
+ const out = {};
17
+ for (const [key, value] of Object.entries(node)) {
18
+ out[key] =
19
+ key === '$ref' && typeof value === 'string'
20
+ ? value
21
+ .replace(/^#\/definitions\//, '#/components/schemas/')
22
+ .replace(/^#\/parameters\//, '#/components/parameters/')
23
+ .replace(/^#\/responses\//, '#/components/responses/')
24
+ : rewriteRefs(value);
25
+ }
26
+ return out;
27
+ };
28
+ /** A Swagger 2 non-body parameter: its type fields move under `schema`. */
29
+ const parameter3 = (parameter) => {
30
+ if (parameter.in === 'body' || isObject(parameter.schema))
31
+ return parameter;
32
+ const { type, format, items, enum: values, default: fallback, ...rest } = parameter;
33
+ const schema = {};
34
+ if (type !== undefined)
35
+ schema.type = type;
36
+ if (format !== undefined)
37
+ schema.format = format;
38
+ if (items !== undefined)
39
+ schema.items = items;
40
+ if (values !== undefined)
41
+ schema.enum = values;
42
+ if (fallback !== undefined)
43
+ schema.default = fallback;
44
+ return { ...rest, schema };
45
+ };
46
+ /** A Swagger 2 response: `schema` / `examples` move under `content`. */
47
+ const response3 = (response) => {
48
+ if (!isObject(response) || typeof response.$ref === 'string')
49
+ return response;
50
+ const { schema, examples, ...rest } = response;
51
+ if (schema === undefined)
52
+ return rest;
53
+ const media = { schema };
54
+ if (isObject(examples) && 'application/json' in examples) {
55
+ media.example = examples['application/json'];
56
+ }
57
+ return { ...rest, content: { 'application/json': media } };
58
+ };
59
+ const serverUrl = (document, override) => {
60
+ if (override)
61
+ return override.replace(/\/$/, '');
62
+ if (typeof document.host !== 'string') {
63
+ throw new Error('The Swagger document has no host — the requests would have no base URL');
64
+ }
65
+ const schemes = Array.isArray(document.schemes) ? document.schemes : [];
66
+ const scheme = schemes.includes('https') ? 'https' : (schemes[0] ?? 'https');
67
+ const basePath = typeof document.basePath === 'string' ? document.basePath : '';
68
+ // `:443` adds nothing to an https URL and only clutters the environment.
69
+ const host = document.host.replace(/:443$/, '');
70
+ return `${String(scheme)}://${host}${basePath}`.replace(/\/$/, '');
71
+ };
72
+ /**
73
+ * Translates a parsed Swagger 2.0 document. `resolveParameter` reads a
74
+ * shared parameter, so a `$ref`'d body parameter still becomes a body.
75
+ * `baseUrl` replaces `host` + `basePath` (a spec served behind a proxy
76
+ * often names the wrong host, or none).
77
+ */
78
+ export const swaggerToOpenApi = (swagger, baseUrl) => {
79
+ const document = rewriteRefs(swagger);
80
+ const sharedParameters = isObject(document.parameters)
81
+ ? document.parameters
82
+ : {};
83
+ const resolveParameter = (node) => {
84
+ if (!isObject(node))
85
+ return null;
86
+ if (typeof node.$ref === 'string') {
87
+ const name = node.$ref.replace(/^#\/components\/parameters\//, '');
88
+ const target = sharedParameters[name];
89
+ return isObject(target) ? target : null;
90
+ }
91
+ return node;
92
+ };
93
+ const paths = {};
94
+ for (const [path, pathNode] of Object.entries(isObject(document.paths) ? document.paths : {})) {
95
+ if (!isObject(pathNode))
96
+ continue;
97
+ const pathItem = { ...pathNode };
98
+ for (const method of METHODS) {
99
+ const operation = pathNode[method];
100
+ if (!isObject(operation))
101
+ continue;
102
+ const parameters = [];
103
+ let requestBody;
104
+ for (const node of Array.isArray(operation.parameters)
105
+ ? operation.parameters
106
+ : []) {
107
+ const parameter = resolveParameter(node);
108
+ if (parameter?.in === 'body') {
109
+ requestBody = {
110
+ content: { 'application/json': { schema: parameter.schema } },
111
+ };
112
+ continue;
113
+ }
114
+ // formData has no JSON-body equivalent; the importer skips it anyway.
115
+ if (parameter?.in === 'formData')
116
+ continue;
117
+ parameters.push(isObject(node) && typeof node.$ref === 'string'
118
+ ? node
119
+ : parameter && parameter3(parameter));
120
+ }
121
+ const responses = isObject(operation.responses)
122
+ ? Object.fromEntries(Object.entries(operation.responses).map(([code, response]) => [
123
+ code,
124
+ response3(response),
125
+ ]))
126
+ : {};
127
+ pathItem[method] = {
128
+ ...operation,
129
+ parameters,
130
+ ...(requestBody ? { requestBody } : {}),
131
+ responses,
132
+ };
133
+ }
134
+ paths[path] = pathItem;
135
+ }
136
+ const securitySchemes = {};
137
+ for (const [name, scheme] of Object.entries(isObject(document.securityDefinitions) ? document.securityDefinitions : {})) {
138
+ if (!isObject(scheme))
139
+ continue;
140
+ // Swagger 2 has no bearer type: an `Authorization` API key is one.
141
+ securitySchemes[name] =
142
+ scheme.type === 'apiKey' &&
143
+ scheme.in === 'header' &&
144
+ typeof scheme.name === 'string' &&
145
+ scheme.name.toLowerCase() === 'authorization'
146
+ ? { type: 'http', scheme: 'bearer' }
147
+ : scheme;
148
+ }
149
+ return {
150
+ openapi: '3.0.0',
151
+ info: document.info,
152
+ servers: [{ url: serverUrl(document, baseUrl) }],
153
+ paths,
154
+ security: document.security,
155
+ components: {
156
+ schemas: document.definitions,
157
+ parameters: Object.fromEntries(Object.entries(sharedParameters).map(([name, parameter]) => [
158
+ name,
159
+ isObject(parameter) ? parameter3(parameter) : parameter,
160
+ ])),
161
+ responses: isObject(document.responses)
162
+ ? Object.fromEntries(Object.entries(document.responses).map(([name, response]) => [
163
+ name,
164
+ response3(response),
165
+ ]))
166
+ : undefined,
167
+ securitySchemes,
168
+ },
169
+ };
170
+ };
171
+ //# sourceMappingURL=swagger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.js","sourceRoot":"","sources":["../src/swagger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { ApiRequest, ApiValueSource } from '@mapples/types';
2
+ /** A request as an importer produces it: no id yet, path relative to `baseUrl`. */
3
+ export type ImportedRequest = Omit<ApiRequest, 'id'>;
4
+ export interface ApiImportResult {
5
+ /** Where the source came from — shown in the import preview. */
6
+ format: 'curl' | 'openapi' | 'swagger' | 'postman';
7
+ /**
8
+ * The origin the requests' relative paths hang off (`https://api.acme.com/v1`).
9
+ * The store decides whether that becomes an environment or the paths are
10
+ * made absolute.
11
+ */
12
+ baseUrl: string;
13
+ /** A name for the environment `baseUrl` may become. */
14
+ environmentName: string;
15
+ requests: ImportedRequest[];
16
+ /**
17
+ * `{{name}}` values the requests' url/header templates read (a Postman
18
+ * collection's variables). They become the environment's variables; a
19
+ * credential-looking one is never imported, only named in `warnings`.
20
+ */
21
+ variables?: Record<string, string>;
22
+ /**
23
+ * What the import left out on purpose — above all secrets: a token found in
24
+ * the source is never imported, only the name of the secret to store it as.
25
+ */
26
+ warnings: string[];
27
+ /**
28
+ * Credential-like fields found in a request body (`password`, `token`, …).
29
+ * The requests already read them from `replacement` instead; the values
30
+ * are kept here only so the author can explicitly choose to keep them.
31
+ */
32
+ bodyCredentials?: BodyCredential[];
33
+ }
34
+ /** A credential-like body field the importer took out of a request body. */
35
+ export interface BodyCredential {
36
+ /** Index into `ApiImportResult.requests`. */
37
+ requestIndex: number;
38
+ /** Where in the body template the field sits. */
39
+ path: string[];
40
+ /** The value found in the source. */
41
+ value: string;
42
+ /** What the body reads instead. */
43
+ replacement: ApiValueSource;
44
+ }
45
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEjE,mFAAmF;AACnF,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACnD;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC;;;OAGG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;CACpC;AAED,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,WAAW,EAAE,cAAc,CAAC;CAC7B"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@mapples/api-import",
3
+ "version": "1.5.0",
4
+ "description": "Turns cURL commands, OpenAPI 3 / Swagger 2 documents and Postman collections into Mapples API requests, and merges them into a project API document. Pure: no I/O.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "scripts": {
9
+ "build": "tsc -b tsconfig.build.json",
10
+ "lint": "eslint .",
11
+ "type-check": "tsc --noEmit",
12
+ "clean": "rm -rf dist *.tsbuildinfo"
13
+ },
14
+ "author": {
15
+ "name": "Oleksandr Soloviov",
16
+ "url": "https://mapples.org/people/olek_soloviov"
17
+ },
18
+ "license": "MIT",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/mapplesorg/mapples-open-kit.git",
22
+ "directory": "packages/@mapples/api-import"
23
+ },
24
+ "dependencies": {
25
+ "@mapples/types": "^1.5.0",
26
+ "yaml": "^2.6.1"
27
+ },
28
+ "devDependencies": {
29
+ "typescript": "~6.0.3"
30
+ },
31
+ "engines": {
32
+ "node": ">=18.18"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "README.md",
37
+ "package.json"
38
+ ]
39
+ }