@voxgig/apidef 6.3.2 → 6.3.5
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/transform/top.d.ts +4 -1
- package/dist/transform/top.js +153 -14
- package/dist/transform/top.js.map +1 -1
- package/model/apidef.aontu +14 -0
- package/package.json +1 -1
- package/src/transform/top.ts +170 -14
package/dist/transform/top.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import type { TransformResult } from '../transform';
|
|
2
2
|
declare const topTransform: (ctx: any) => Promise<TransformResult>;
|
|
3
|
+
declare function resolveSummary(def: any): string | undefined;
|
|
4
|
+
declare function resolveWebsite(def: any, servers: any[]): string | undefined;
|
|
5
|
+
declare function homepageFromServer(url: any): string | undefined;
|
|
3
6
|
declare function resolveSecurity(def: any): Record<string, string> | null;
|
|
4
7
|
declare function findAuthPrefix(text: unknown): string | null;
|
|
5
|
-
export { topTransform, resolveSecurity, findAuthPrefix, };
|
|
8
|
+
export { topTransform, resolveSecurity, resolveSummary, resolveWebsite, homepageFromServer, findAuthPrefix, };
|
package/dist/transform/top.js
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.topTransform = void 0;
|
|
4
4
|
exports.resolveSecurity = resolveSecurity;
|
|
5
|
+
exports.resolveSummary = resolveSummary;
|
|
6
|
+
exports.resolveWebsite = resolveWebsite;
|
|
7
|
+
exports.homepageFromServer = homepageFromServer;
|
|
5
8
|
exports.findAuthPrefix = findAuthPrefix;
|
|
6
9
|
const struct_1 = require("@voxgig/struct");
|
|
7
10
|
const types_1 = require("../types");
|
|
@@ -79,9 +82,110 @@ const topTransform = async function (ctx) {
|
|
|
79
82
|
if (null == firstServerUrl || '' === String(firstServerUrl).trim()) {
|
|
80
83
|
throw new Error('apidef: no server URL found in API definition (servers[0].url is required).');
|
|
81
84
|
}
|
|
85
|
+
// A short "what this API is" blurb and a canonical website link, for doc
|
|
86
|
+
// generators. Only set when derivable, so downstream can gate on them.
|
|
87
|
+
const summary = resolveSummary(def);
|
|
88
|
+
if (null != summary) {
|
|
89
|
+
kit.info.summary = summary;
|
|
90
|
+
}
|
|
91
|
+
const website = resolveWebsite(def, kit.info.servers);
|
|
92
|
+
if (null != website) {
|
|
93
|
+
kit.info.website = website;
|
|
94
|
+
}
|
|
82
95
|
return { ok: true, msg: 'top' };
|
|
83
96
|
};
|
|
84
97
|
exports.topTransform = topTransform;
|
|
98
|
+
// A short one-line description of the API's purpose: the spec's
|
|
99
|
+
// `info.summary` (OpenAPI 3.1) when present, else the first prose sentence
|
|
100
|
+
// of `info.description` with leading markdown headings/blank lines stripped
|
|
101
|
+
// and the length capped. Returns undefined when no usable prose exists
|
|
102
|
+
// (e.g. GitLab, whose top-level description is empty).
|
|
103
|
+
function resolveSummary(def) {
|
|
104
|
+
const info = def?.info ?? {};
|
|
105
|
+
const explicit = 'string' === typeof info.summary ? info.summary.trim() : '';
|
|
106
|
+
if ('' !== explicit) {
|
|
107
|
+
return firstSentence(explicit);
|
|
108
|
+
}
|
|
109
|
+
const desc = 'string' === typeof info.description ? info.description : '';
|
|
110
|
+
if ('' === desc.trim()) {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
const lines = desc.split('\n');
|
|
114
|
+
let i = 0;
|
|
115
|
+
// Skip leading blank lines, ATX headings (`# ...`) and setext underlines.
|
|
116
|
+
while (i < lines.length &&
|
|
117
|
+
('' === lines[i].trim() ||
|
|
118
|
+
/^\s*#{1,6}\s/.test(lines[i]) ||
|
|
119
|
+
/^\s*(-{2,}|={2,})\s*$/.test(lines[i]))) {
|
|
120
|
+
i++;
|
|
121
|
+
}
|
|
122
|
+
// Take the first paragraph (up to the next blank line or heading).
|
|
123
|
+
const para = [];
|
|
124
|
+
while (i < lines.length &&
|
|
125
|
+
'' !== lines[i].trim() &&
|
|
126
|
+
!/^\s*#{1,6}\s/.test(lines[i])) {
|
|
127
|
+
para.push(lines[i].trim());
|
|
128
|
+
i++;
|
|
129
|
+
}
|
|
130
|
+
const paragraph = para.join(' ').trim();
|
|
131
|
+
return '' === paragraph ? undefined : firstSentence(paragraph);
|
|
132
|
+
}
|
|
133
|
+
// The first sentence of `text` (up to a `.`/`!`/`?` followed by whitespace
|
|
134
|
+
// or end), whitespace-collapsed and length-capped with an ellipsis.
|
|
135
|
+
function firstSentence(text) {
|
|
136
|
+
const collapsed = text.replace(/\s+/g, ' ').trim();
|
|
137
|
+
const m = collapsed.match(/^(.+?[.!?])(\s|$)/);
|
|
138
|
+
let out = m ? m[1] : collapsed;
|
|
139
|
+
const MAX = 240;
|
|
140
|
+
if (out.length > MAX) {
|
|
141
|
+
out = out.slice(0, MAX - 1).trimEnd() + '…';
|
|
142
|
+
}
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
// A canonical link back to the API's own website, in priority order:
|
|
146
|
+
// 1. externalDocs.url (the spec's explicit external link)
|
|
147
|
+
// 2. info['x-logo'].href (redoc homepage link)
|
|
148
|
+
// 3. homepage from the server (strip an api./developer./docs. subdomain)
|
|
149
|
+
// 4. info.contact.url
|
|
150
|
+
// 5. info.termsOfService
|
|
151
|
+
function resolveWebsite(def, servers) {
|
|
152
|
+
const info = def?.info ?? {};
|
|
153
|
+
const ext = def?.externalDocs?.url;
|
|
154
|
+
if (isHttpUrl(ext))
|
|
155
|
+
return ext.trim();
|
|
156
|
+
const logoHref = info['x-logo']?.href;
|
|
157
|
+
if (isHttpUrl(logoHref))
|
|
158
|
+
return logoHref.trim();
|
|
159
|
+
const home = homepageFromServer(servers?.[0]?.url);
|
|
160
|
+
if (null != home)
|
|
161
|
+
return home;
|
|
162
|
+
if (isHttpUrl(info.contact?.url))
|
|
163
|
+
return info.contact.url.trim();
|
|
164
|
+
if (isHttpUrl(info.termsOfService))
|
|
165
|
+
return info.termsOfService.trim();
|
|
166
|
+
return undefined;
|
|
167
|
+
}
|
|
168
|
+
// Derive a homepage from an API server URL by dropping the path and an
|
|
169
|
+
// `api.` / `developer.` / `docs.` / `www.` service subdomain — e.g.
|
|
170
|
+
// `https://api.thesmsworks.co.uk/v1` -> `https://thesmsworks.co.uk`.
|
|
171
|
+
function homepageFromServer(url) {
|
|
172
|
+
if ('string' !== typeof url || '' === url.trim())
|
|
173
|
+
return undefined;
|
|
174
|
+
try {
|
|
175
|
+
const u = new URL(url.includes('://') ? url : 'https://' + url);
|
|
176
|
+
let host = u.hostname;
|
|
177
|
+
if ('' === host || !host.includes('.'))
|
|
178
|
+
return undefined;
|
|
179
|
+
host = host.replace(/^(api|api-[a-z0-9]+|apis|developer|developers|docs?|www)\./i, '');
|
|
180
|
+
return u.protocol + '//' + host;
|
|
181
|
+
}
|
|
182
|
+
catch (_e) {
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function isHttpUrl(v) {
|
|
187
|
+
return 'string' === typeof v && /^https?:\/\//i.test(v.trim());
|
|
188
|
+
}
|
|
85
189
|
// Describe the spec's PRIMARY security scheme as model facts
|
|
86
190
|
// (info.security): scheme key, type, where the credential goes (in/name),
|
|
87
191
|
// and the value prefix for Authorization-header credentials. The primary
|
|
@@ -92,8 +196,13 @@ exports.topTransform = topTransform;
|
|
|
92
196
|
// Prefix rules:
|
|
93
197
|
// http basic/bearer -> 'Basic' / 'Bearer'
|
|
94
198
|
// oauth2 / openIdConnect -> 'Bearer' (access token in Authorization)
|
|
95
|
-
// apiKey in an Authorization header -> the
|
|
96
|
-
// documents (e.g. `Authorization: OAuth <key>`), else '
|
|
199
|
+
// apiKey in an Authorization header -> the prefix the API's own prose
|
|
200
|
+
// documents (e.g. `Authorization: OAuth <key>`), else '' (raw). An
|
|
201
|
+
// `apiKey` scheme means "send the credential as-is" — a `Bearer`/etc.
|
|
202
|
+
// prefix is only implied by an `http`+`bearer` scheme or explicit
|
|
203
|
+
// prose, so absent evidence the key goes in raw (e.g. The SMS Works'
|
|
204
|
+
// `Authorization: <jwt>`). A user override is available via
|
|
205
|
+
// config.auth.prefix.
|
|
97
206
|
// apiKey in any other header/query/cookie -> '' (raw credential)
|
|
98
207
|
function resolveSecurity(def) {
|
|
99
208
|
const schemes = def.components?.securitySchemes ?? def.securityDefinitions ?? {};
|
|
@@ -132,31 +241,61 @@ function resolveSecurity(def) {
|
|
|
132
241
|
else if ('apikey' === type) {
|
|
133
242
|
if ('header' === String(out.in).toLowerCase() &&
|
|
134
243
|
'authorization' === String(out.name).toLowerCase()) {
|
|
244
|
+
// Only adopt a prefix the API's prose actually documents; otherwise
|
|
245
|
+
// the apiKey goes in raw (no assumed 'Bearer').
|
|
135
246
|
out.prefix =
|
|
136
247
|
findAuthPrefix(scheme.description) ??
|
|
137
248
|
findAuthPrefix(def.info?.description) ??
|
|
138
|
-
'
|
|
249
|
+
'';
|
|
139
250
|
}
|
|
140
251
|
// else: raw credential in a named header/query/cookie — no prefix.
|
|
141
252
|
}
|
|
142
253
|
return out;
|
|
143
254
|
}
|
|
144
|
-
// Extract the credential prefix from
|
|
145
|
-
//
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
//
|
|
150
|
-
// match.
|
|
255
|
+
// Extract the credential prefix from a securityScheme's / info prose.
|
|
256
|
+
// Three signals, in confidence order:
|
|
257
|
+
// 1. An explicit `Authorization: <prefix> <cred>` line (any prefix word)
|
|
258
|
+
// — e.g. Statuspage's `Authorization: OAuth 89a2...`. The prefix must
|
|
259
|
+
// be a short word followed by something credential-shaped (a long
|
|
260
|
+
// token, or a `<key>` / `{token}` / `$KEY` / `YOUR_...` placeholder),
|
|
261
|
+
// so a bare `Authorization: 89a2...` doesn't match.
|
|
262
|
+
// 2. A KNOWN scheme word (Bearer/OAuth/Token/Basic) shown as an example
|
|
263
|
+
// prefix — `Example: Bearer eyJ...` (NoFrixion's shape).
|
|
264
|
+
// 3. A KNOWN scheme word named as the scheme — `the Bearer scheme`,
|
|
265
|
+
// `Bearer authentication`.
|
|
266
|
+
// Returns null when nothing indicates a prefix (an apiKey then goes in raw).
|
|
151
267
|
function findAuthPrefix(text) {
|
|
152
268
|
if ('string' !== typeof text || '' === text) {
|
|
153
269
|
return null;
|
|
154
270
|
}
|
|
155
|
-
const
|
|
156
|
-
if (null
|
|
157
|
-
return
|
|
271
|
+
const explicit = text.match(/Authorization:[ \t]*([A-Za-z][A-Za-z0-9._-]{0,14})[ \t]+(?:<[^>\n]+>|\{[^}\n]+\}|\$[A-Za-z_][A-Za-z0-9_]*|[Yy][Oo][Uu][Rr][A-Za-z0-9_-]*|[A-Za-z0-9._~+/=-]{8,})/);
|
|
272
|
+
if (null != explicit) {
|
|
273
|
+
return explicit[1];
|
|
274
|
+
}
|
|
275
|
+
// A known scheme word as an example prefix, then a credential-shaped tail.
|
|
276
|
+
const example = text.match(/(?:example|e\.g\.)[:\s][^\n]{0,20}?\b(Bearer|OAuth2?|Token|Basic)\b[ \t]+(?:<[^>\n]+>|\{[^}\n]+\}|[A-Za-z0-9._~+/=-]{6,})/i);
|
|
277
|
+
if (null != example) {
|
|
278
|
+
return canonAuthScheme(example[1]);
|
|
158
279
|
}
|
|
159
|
-
|
|
280
|
+
// A known scheme word named as the auth scheme.
|
|
281
|
+
const named = text.match(/\b(Bearer|OAuth2?|Token|Basic)\b[ \t]+(?:scheme|authentication|auth\b|credentials?)/i);
|
|
282
|
+
if (null != named) {
|
|
283
|
+
return canonAuthScheme(named[1]);
|
|
284
|
+
}
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
// Canonical casing for a known scheme word (Bearer/OAuth/Token/Basic).
|
|
288
|
+
function canonAuthScheme(word) {
|
|
289
|
+
const w = word.toLowerCase();
|
|
290
|
+
if (w.startsWith('oauth'))
|
|
291
|
+
return 'OAuth';
|
|
292
|
+
if ('bearer' === w)
|
|
293
|
+
return 'Bearer';
|
|
294
|
+
if ('token' === w)
|
|
295
|
+
return 'Token';
|
|
296
|
+
if ('basic' === w)
|
|
297
|
+
return 'Basic';
|
|
298
|
+
return word;
|
|
160
299
|
}
|
|
161
300
|
// Does the spec declare any authentication? True if it defines security
|
|
162
301
|
// schemes (OpenAPI 3 `components.securitySchemes` or Swagger 2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"top.js","sourceRoot":"","sources":["../../src/transform/top.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"top.js","sourceRoot":"","sources":["../../src/transform/top.ts"],"names":[],"mappings":"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"}
|
package/model/apidef.aontu
CHANGED
|
@@ -4,6 +4,20 @@ main: kit: info: {
|
|
|
4
4
|
title?: string
|
|
5
5
|
version?: string
|
|
6
6
|
|
|
7
|
+
# Short one-line description of the API's purpose, set by the top
|
|
8
|
+
# transform: the spec's `info.summary` when present, else the first
|
|
9
|
+
# prose sentence of `info.description` (leading markdown headings
|
|
10
|
+
# stripped, capped). Downstream doc generators surface it as the SDK's
|
|
11
|
+
# "what this API is" blurb. Unset when the spec offers no usable prose.
|
|
12
|
+
summary?: string
|
|
13
|
+
|
|
14
|
+
# Canonical link back to the API's own website, set by the top
|
|
15
|
+
# transform: `externalDocs.url`, else the redoc `x-logo.href`, else the
|
|
16
|
+
# homepage derived from the primary server host (stripping an `api.` /
|
|
17
|
+
# `developer.` / `docs.` subdomain), else `contact.url` / termsOfService.
|
|
18
|
+
# Doc generators link to it so readers can reach the source API.
|
|
19
|
+
website?: string
|
|
20
|
+
|
|
7
21
|
# Set to false by the top transform when the spec declares no
|
|
8
22
|
# authentication (no security schemes / security requirements). sdkgen's
|
|
9
23
|
# isAuthActive() reads this to suppress apikey/auth code and docs. Left
|
package/package.json
CHANGED
package/src/transform/top.ts
CHANGED
|
@@ -105,10 +105,124 @@ const topTransform = async function(
|
|
|
105
105
|
)
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
+
// A short "what this API is" blurb and a canonical website link, for doc
|
|
109
|
+
// generators. Only set when derivable, so downstream can gate on them.
|
|
110
|
+
const summary = resolveSummary(def)
|
|
111
|
+
if (null != summary) {
|
|
112
|
+
kit.info.summary = summary
|
|
113
|
+
}
|
|
114
|
+
const website = resolveWebsite(def, kit.info.servers as any[])
|
|
115
|
+
if (null != website) {
|
|
116
|
+
kit.info.website = website
|
|
117
|
+
}
|
|
118
|
+
|
|
108
119
|
return { ok: true, msg: 'top' }
|
|
109
120
|
}
|
|
110
121
|
|
|
111
122
|
|
|
123
|
+
// A short one-line description of the API's purpose: the spec's
|
|
124
|
+
// `info.summary` (OpenAPI 3.1) when present, else the first prose sentence
|
|
125
|
+
// of `info.description` with leading markdown headings/blank lines stripped
|
|
126
|
+
// and the length capped. Returns undefined when no usable prose exists
|
|
127
|
+
// (e.g. GitLab, whose top-level description is empty).
|
|
128
|
+
function resolveSummary(def: any): string | undefined {
|
|
129
|
+
const info = def?.info ?? {}
|
|
130
|
+
|
|
131
|
+
const explicit = 'string' === typeof info.summary ? info.summary.trim() : ''
|
|
132
|
+
if ('' !== explicit) {
|
|
133
|
+
return firstSentence(explicit)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const desc = 'string' === typeof info.description ? info.description : ''
|
|
137
|
+
if ('' === desc.trim()) {
|
|
138
|
+
return undefined
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const lines = desc.split('\n')
|
|
142
|
+
let i = 0
|
|
143
|
+
// Skip leading blank lines, ATX headings (`# ...`) and setext underlines.
|
|
144
|
+
while (i < lines.length &&
|
|
145
|
+
('' === lines[i].trim() ||
|
|
146
|
+
/^\s*#{1,6}\s/.test(lines[i]) ||
|
|
147
|
+
/^\s*(-{2,}|={2,})\s*$/.test(lines[i]))) {
|
|
148
|
+
i++
|
|
149
|
+
}
|
|
150
|
+
// Take the first paragraph (up to the next blank line or heading).
|
|
151
|
+
const para: string[] = []
|
|
152
|
+
while (i < lines.length &&
|
|
153
|
+
'' !== lines[i].trim() &&
|
|
154
|
+
!/^\s*#{1,6}\s/.test(lines[i])) {
|
|
155
|
+
para.push(lines[i].trim())
|
|
156
|
+
i++
|
|
157
|
+
}
|
|
158
|
+
const paragraph = para.join(' ').trim()
|
|
159
|
+
return '' === paragraph ? undefined : firstSentence(paragraph)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
// The first sentence of `text` (up to a `.`/`!`/`?` followed by whitespace
|
|
164
|
+
// or end), whitespace-collapsed and length-capped with an ellipsis.
|
|
165
|
+
function firstSentence(text: string): string {
|
|
166
|
+
const collapsed = text.replace(/\s+/g, ' ').trim()
|
|
167
|
+
const m = collapsed.match(/^(.+?[.!?])(\s|$)/)
|
|
168
|
+
let out = m ? m[1] : collapsed
|
|
169
|
+
const MAX = 240
|
|
170
|
+
if (out.length > MAX) {
|
|
171
|
+
out = out.slice(0, MAX - 1).trimEnd() + '…'
|
|
172
|
+
}
|
|
173
|
+
return out
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
// A canonical link back to the API's own website, in priority order:
|
|
178
|
+
// 1. externalDocs.url (the spec's explicit external link)
|
|
179
|
+
// 2. info['x-logo'].href (redoc homepage link)
|
|
180
|
+
// 3. homepage from the server (strip an api./developer./docs. subdomain)
|
|
181
|
+
// 4. info.contact.url
|
|
182
|
+
// 5. info.termsOfService
|
|
183
|
+
function resolveWebsite(def: any, servers: any[]): string | undefined {
|
|
184
|
+
const info = def?.info ?? {}
|
|
185
|
+
|
|
186
|
+
const ext = def?.externalDocs?.url
|
|
187
|
+
if (isHttpUrl(ext)) return ext.trim()
|
|
188
|
+
|
|
189
|
+
const logoHref = info['x-logo']?.href
|
|
190
|
+
if (isHttpUrl(logoHref)) return logoHref.trim()
|
|
191
|
+
|
|
192
|
+
const home = homepageFromServer(servers?.[0]?.url)
|
|
193
|
+
if (null != home) return home
|
|
194
|
+
|
|
195
|
+
if (isHttpUrl(info.contact?.url)) return info.contact.url.trim()
|
|
196
|
+
if (isHttpUrl(info.termsOfService)) return info.termsOfService.trim()
|
|
197
|
+
|
|
198
|
+
return undefined
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
// Derive a homepage from an API server URL by dropping the path and an
|
|
203
|
+
// `api.` / `developer.` / `docs.` / `www.` service subdomain — e.g.
|
|
204
|
+
// `https://api.thesmsworks.co.uk/v1` -> `https://thesmsworks.co.uk`.
|
|
205
|
+
function homepageFromServer(url: any): string | undefined {
|
|
206
|
+
if ('string' !== typeof url || '' === url.trim()) return undefined
|
|
207
|
+
try {
|
|
208
|
+
const u = new URL(url.includes('://') ? url : 'https://' + url)
|
|
209
|
+
let host = u.hostname
|
|
210
|
+
if ('' === host || !host.includes('.')) return undefined
|
|
211
|
+
host = host.replace(
|
|
212
|
+
/^(api|api-[a-z0-9]+|apis|developer|developers|docs?|www)\./i, '')
|
|
213
|
+
return u.protocol + '//' + host
|
|
214
|
+
}
|
|
215
|
+
catch (_e) {
|
|
216
|
+
return undefined
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
function isHttpUrl(v: any): boolean {
|
|
222
|
+
return 'string' === typeof v && /^https?:\/\//i.test(v.trim())
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
|
|
112
226
|
// Describe the spec's PRIMARY security scheme as model facts
|
|
113
227
|
// (info.security): scheme key, type, where the credential goes (in/name),
|
|
114
228
|
// and the value prefix for Authorization-header credentials. The primary
|
|
@@ -119,8 +233,13 @@ const topTransform = async function(
|
|
|
119
233
|
// Prefix rules:
|
|
120
234
|
// http basic/bearer -> 'Basic' / 'Bearer'
|
|
121
235
|
// oauth2 / openIdConnect -> 'Bearer' (access token in Authorization)
|
|
122
|
-
// apiKey in an Authorization header -> the
|
|
123
|
-
// documents (e.g. `Authorization: OAuth <key>`), else '
|
|
236
|
+
// apiKey in an Authorization header -> the prefix the API's own prose
|
|
237
|
+
// documents (e.g. `Authorization: OAuth <key>`), else '' (raw). An
|
|
238
|
+
// `apiKey` scheme means "send the credential as-is" — a `Bearer`/etc.
|
|
239
|
+
// prefix is only implied by an `http`+`bearer` scheme or explicit
|
|
240
|
+
// prose, so absent evidence the key goes in raw (e.g. The SMS Works'
|
|
241
|
+
// `Authorization: <jwt>`). A user override is available via
|
|
242
|
+
// config.auth.prefix.
|
|
124
243
|
// apiKey in any other header/query/cookie -> '' (raw credential)
|
|
125
244
|
function resolveSecurity(def: any): Record<string, string> | null {
|
|
126
245
|
const schemes: Record<string, any> =
|
|
@@ -167,10 +286,12 @@ function resolveSecurity(def: any): Record<string, string> | null {
|
|
|
167
286
|
else if ('apikey' === type) {
|
|
168
287
|
if ('header' === String(out.in).toLowerCase() &&
|
|
169
288
|
'authorization' === String(out.name).toLowerCase()) {
|
|
289
|
+
// Only adopt a prefix the API's prose actually documents; otherwise
|
|
290
|
+
// the apiKey goes in raw (no assumed 'Bearer').
|
|
170
291
|
out.prefix =
|
|
171
292
|
findAuthPrefix(scheme.description) ??
|
|
172
293
|
findAuthPrefix(def.info?.description) ??
|
|
173
|
-
'
|
|
294
|
+
''
|
|
174
295
|
}
|
|
175
296
|
// else: raw credential in a named header/query/cookie — no prefix.
|
|
176
297
|
}
|
|
@@ -179,23 +300,55 @@ function resolveSecurity(def: any): Record<string, string> | null {
|
|
|
179
300
|
}
|
|
180
301
|
|
|
181
302
|
|
|
182
|
-
// Extract the credential prefix from
|
|
183
|
-
//
|
|
184
|
-
//
|
|
185
|
-
//
|
|
186
|
-
//
|
|
187
|
-
//
|
|
188
|
-
// match.
|
|
303
|
+
// Extract the credential prefix from a securityScheme's / info prose.
|
|
304
|
+
// Three signals, in confidence order:
|
|
305
|
+
// 1. An explicit `Authorization: <prefix> <cred>` line (any prefix word)
|
|
306
|
+
// — e.g. Statuspage's `Authorization: OAuth 89a2...`. The prefix must
|
|
307
|
+
// be a short word followed by something credential-shaped (a long
|
|
308
|
+
// token, or a `<key>` / `{token}` / `$KEY` / `YOUR_...` placeholder),
|
|
309
|
+
// so a bare `Authorization: 89a2...` doesn't match.
|
|
310
|
+
// 2. A KNOWN scheme word (Bearer/OAuth/Token/Basic) shown as an example
|
|
311
|
+
// prefix — `Example: Bearer eyJ...` (NoFrixion's shape).
|
|
312
|
+
// 3. A KNOWN scheme word named as the scheme — `the Bearer scheme`,
|
|
313
|
+
// `Bearer authentication`.
|
|
314
|
+
// Returns null when nothing indicates a prefix (an apiKey then goes in raw).
|
|
189
315
|
function findAuthPrefix(text: unknown): string | null {
|
|
190
316
|
if ('string' !== typeof text || '' === text) {
|
|
191
317
|
return null
|
|
192
318
|
}
|
|
193
|
-
|
|
319
|
+
|
|
320
|
+
const explicit = text.match(
|
|
194
321
|
/Authorization:[ \t]*([A-Za-z][A-Za-z0-9._-]{0,14})[ \t]+(?:<[^>\n]+>|\{[^}\n]+\}|\$[A-Za-z_][A-Za-z0-9_]*|[Yy][Oo][Uu][Rr][A-Za-z0-9_-]*|[A-Za-z0-9._~+/=-]{8,})/)
|
|
195
|
-
if (null
|
|
196
|
-
return
|
|
322
|
+
if (null != explicit) {
|
|
323
|
+
return explicit[1]
|
|
197
324
|
}
|
|
198
|
-
|
|
325
|
+
|
|
326
|
+
// A known scheme word as an example prefix, then a credential-shaped tail.
|
|
327
|
+
const example = text.match(
|
|
328
|
+
/(?:example|e\.g\.)[:\s][^\n]{0,20}?\b(Bearer|OAuth2?|Token|Basic)\b[ \t]+(?:<[^>\n]+>|\{[^}\n]+\}|[A-Za-z0-9._~+/=-]{6,})/i)
|
|
329
|
+
if (null != example) {
|
|
330
|
+
return canonAuthScheme(example[1])
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// A known scheme word named as the auth scheme.
|
|
334
|
+
const named = text.match(
|
|
335
|
+
/\b(Bearer|OAuth2?|Token|Basic)\b[ \t]+(?:scheme|authentication|auth\b|credentials?)/i)
|
|
336
|
+
if (null != named) {
|
|
337
|
+
return canonAuthScheme(named[1])
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return null
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
// Canonical casing for a known scheme word (Bearer/OAuth/Token/Basic).
|
|
345
|
+
function canonAuthScheme(word: string): string {
|
|
346
|
+
const w = word.toLowerCase()
|
|
347
|
+
if (w.startsWith('oauth')) return 'OAuth'
|
|
348
|
+
if ('bearer' === w) return 'Bearer'
|
|
349
|
+
if ('token' === w) return 'Token'
|
|
350
|
+
if ('basic' === w) return 'Basic'
|
|
351
|
+
return word
|
|
199
352
|
}
|
|
200
353
|
|
|
201
354
|
|
|
@@ -264,6 +417,9 @@ function stringifyInfoScalars(node: any): any {
|
|
|
264
417
|
export {
|
|
265
418
|
topTransform,
|
|
266
419
|
resolveSecurity,
|
|
420
|
+
resolveSummary,
|
|
421
|
+
resolveWebsite,
|
|
422
|
+
homepageFromServer,
|
|
267
423
|
findAuthPrefix,
|
|
268
424
|
}
|
|
269
425
|
|