@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.
@@ -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, };
@@ -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 scheme the API's own prose
96
- // documents (e.g. `Authorization: OAuth <key>`), else 'Bearer'
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
- 'Bearer';
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 prose showing the Authorization
145
- // header format, e.g. `Authorization: OAuth 89a2...` or
146
- // `-H "Authorization: token <key>"`. The prefix must be a short word on
147
- // the SAME line, followed by something credential-shaped — a long token,
148
- // or a `<key>` / `{token}` / `$KEY` / `YOUR_...`-style placeholder. Bare
149
- // credentials (`Authorization: 89a2...`) and prose coincidences yield no
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 m = 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,})/);
156
- if (null == m) {
157
- return null;
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
- return m[1];
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":";;;AAkaE,0CAAe;AACf,wCAAc;AACd,wCAAc;AACd,gDAAkB;AAClB,wCAAc;AArahB,2CAAqC;AAErC,oCAA8B;AAmB9B,6BAA6B;AAC7B,yCAAyC;AACzC,8BAA8B;AAC9B,gCAAgC;AAGhC,uBAAuB;AACvB,kBAAkB;AAClB,oCAAoC;AAEpC,uBAAuB;AACvB,iCAAiC;AACjC,IAAI;AAGJ,MAAM,YAAY,GAAG,KAAK,WACxB,GAAQ;IAER,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;IAC7B,MAAM,GAAG,GAAa,QAAQ,CAAC,IAAI,CAAC,WAAG,CAAC,CAAA;IAExC,GAAG,CAAC,IAAI,GAAG,oBAAoB,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IAC/C,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;IAE1D,sEAAsE;IACtE,yEAAyE;IACzE,8DAA8D;IAC9D,wEAAwE;IACxE,yEAAyE;IACzE,uEAAuE;IACvE,wEAAwE;IACxE,6DAA6D;IAC7D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAA;IACvB,CAAC;SACI,CAAC;QACJ,kEAAkE;QAClE,gEAAgE;QAChE,0DAA0D;QAC1D,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;QACrC,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAC9B,CAAC;IACH,CAAC;IAED,cAAc;IACd,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACpB,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,KAAK,GAAG,IAAA,aAAI,EAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC;SACvF,CAAC,CAAA;IACJ,CAAC;IAED,+DAA+D;IAC/D,wDAAwD;IACxD,2DAA2D;IAC3D,gEAAgE;IAChE,uCAAuC;IACvC,KAAK,MAAM,MAAM,IAAK,GAAG,CAAC,IAAI,CAAC,OAAiB,EAAE,CAAC;QACjD,IAAI,CAAC,MAAM,IAAI,QAAQ,KAAK,OAAO,MAAM,CAAC,GAAG;YAAE,SAAQ;QACvD,MAAM,GAAG,GAAW,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QACrC,IAAI,GAAG,KAAK,EAAE;YAAE,SAAQ;QACxB,IAAI,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAQ,CAAG,qBAAqB;QAC1E,8DAA8D;QAC9D,6DAA6D;QAC7D,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,GAAG,QAAQ,GAAG,GAAG,CAAA;YAC3B,SAAQ;QACV,CAAC;QACD,kEAAkE;QAClE,iDAAiD;QACjD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QACjC,MAAM,CAAC,GAAG,GAAG,UAAU,GAAG,GAAG,CAAA;IAC/B,CAAC;IAED,0EAA0E;IAC1E,qEAAqE;IACrE,yEAAyE;IACzE,uDAAuD;IACvD,MAAM,cAAc,GAAQ,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAA;IACtD,IAAI,IAAI,IAAI,cAAc,IAAI,EAAE,KAAK,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAA;IACH,CAAC;IAED,yEAAyE;IACzE,uEAAuE;IACvE,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;IACnC,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IAC5B,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,OAAgB,CAAC,CAAA;IAC9D,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IAC5B,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC,CAAA;AA0SC,oCAAY;AAvSd,gEAAgE;AAChE,2EAA2E;AAC3E,4EAA4E;AAC5E,uEAAuE;AACvE,uDAAuD;AACvD,SAAS,cAAc,CAAC,GAAQ;IAC9B,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,CAAA;IAE5B,MAAM,QAAQ,GAAG,QAAQ,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC5E,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;QACpB,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAA;IAChC,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,KAAK,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;IACzE,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACvB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9B,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,0EAA0E;IAC1E,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM;QACrB,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACrB,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,CAAC,EAAE,CAAA;IACL,CAAC;IACD,mEAAmE;IACnE,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM;QACrB,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QACtB,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAC1B,CAAC,EAAE,CAAA;IACL,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IACvC,OAAO,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;AAChE,CAAC;AAGD,2EAA2E;AAC3E,oEAAoE;AACpE,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IAClD,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;IAC9C,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC9B,MAAM,GAAG,GAAG,GAAG,CAAA;IACf,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACrB,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,CAAA;IAC7C,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAGD,qEAAqE;AACrE,qEAAqE;AACrE,uDAAuD;AACvD,4EAA4E;AAC5E,wBAAwB;AACxB,2BAA2B;AAC3B,SAAS,cAAc,CAAC,GAAQ,EAAE,OAAc;IAC9C,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,CAAA;IAE5B,MAAM,GAAG,GAAG,GAAG,EAAE,YAAY,EAAE,GAAG,CAAA;IAClC,IAAI,SAAS,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;IAErC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAA;IACrC,IAAI,SAAS,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;IAE/C,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAClD,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IAE7B,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IAChE,IAAI,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAA;IAErE,OAAO,SAAS,CAAA;AAClB,CAAC;AAGD,uEAAuE;AACvE,oEAAoE;AACpE,qEAAqE;AACrE,SAAS,kBAAkB,CAAC,GAAQ;IAClC,IAAI,QAAQ,KAAK,OAAO,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,SAAS,CAAA;IAClE,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAA;QAC/D,IAAI,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAA;QACrB,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAA;QACxD,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,6DAA6D,EAAE,EAAE,CAAC,CAAA;QACpE,OAAO,CAAC,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAA;IACjC,CAAC;IACD,OAAO,EAAE,EAAE,CAAC;QACV,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAGD,SAAS,SAAS,CAAC,CAAM;IACvB,OAAO,QAAQ,KAAK,OAAO,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAChE,CAAC;AAGD,6DAA6D;AAC7D,0EAA0E;AAC1E,yEAAyE;AACzE,yEAAyE;AACzE,uEAAuE;AACvE,iEAAiE;AACjE,EAAE;AACF,gBAAgB;AAChB,iDAAiD;AACjD,uEAAuE;AACvE,wEAAwE;AACxE,uEAAuE;AACvE,0EAA0E;AAC1E,sEAAsE;AACtE,yEAAyE;AACzE,gEAAgE;AAChE,0BAA0B;AAC1B,mEAAmE;AACnE,SAAS,eAAe,CAAC,GAAQ;IAC/B,MAAM,OAAO,GACX,GAAG,CAAC,UAAU,EAAE,eAAe,IAAI,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAA;IAElE,IAAI,UAAU,GACZ,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5C,QAAQ,KAAK,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAE/C,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IACtC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAC9D,IAAI,IAAI,IAAI,MAAM,IAAI,QAAQ,KAAK,OAAO,MAAM,EAAE,CAAC;QACjD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAEpD,MAAM,GAAG,GAA2B;QAClC,MAAM,EAAE,UAAoB;QAC5B,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;QACvB,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,eAAe;QACpC,MAAM,EAAE,EAAE;KACX,CAAA;IAED,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,0DAA0D;QAC1D,8BAA8B;QAC9B,GAAG,CAAC,MAAM,GAAG,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAClE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAA;IACtB,CAAC;SACI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC1B,GAAG,CAAC,MAAM,GAAG,OAAO,CAAA;IACtB,CAAC;SACI,IAAI,QAAQ,KAAK,IAAI,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;QACvD,GAAG,CAAC,EAAE,GAAG,QAAQ,CAAA;QACjB,GAAG,CAAC,IAAI,GAAG,eAAe,CAAA;QAC1B,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAA;IACvB,CAAC;SACI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC3B,IAAI,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE;YAC3C,eAAe,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACrD,oEAAoE;YACpE,gDAAgD;YAChD,GAAG,CAAC,MAAM;gBACR,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC;oBAClC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC;oBACrC,EAAE,CAAA;QACN,CAAC;QACD,mEAAmE;IACrE,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAGD,sEAAsE;AACtE,sCAAsC;AACtC,2EAA2E;AAC3E,2EAA2E;AAC3E,uEAAuE;AACvE,2EAA2E;AAC3E,yDAAyD;AACzD,0EAA0E;AAC1E,8DAA8D;AAC9D,sEAAsE;AACtE,gCAAgC;AAChC,6EAA6E;AAC7E,SAAS,cAAc,CAAC,IAAa;IACnC,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,kKAAkK,CAAC,CAAA;IACrK,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;QACrB,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;IAED,2EAA2E;IAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CACxB,4HAA4H,CAAC,CAAA;IAC/H,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;QACpB,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;IAED,gDAAgD;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CACtB,sFAAsF,CAAC,CAAA;IACzF,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;QAClB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAClC,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAGD,uEAAuE;AACvE,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IAC5B,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAA;IACzC,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAA;IACnC,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,OAAO,CAAA;IACjC,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,OAAO,CAAA;IACjC,OAAO,IAAI,CAAA;AACb,CAAC;AAGD,wEAAwE;AACxE,+DAA+D;AAC/D,mEAAmE;AACnE,sEAAsE;AACtE,4CAA4C;AAC5C,SAAS,gBAAgB,CAAC,GAAQ;IAChC,IAAI,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,OAAO,GAAG;QAAE,OAAO,KAAK,CAAA;IAExD,MAAM,WAAW,GAAG,CAAC,CAAM,EAAE,EAAE,CAC7B,IAAI,IAAI,CAAC,IAAI,QAAQ,KAAK,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;IAEjE,8BAA8B;IAC9B,IAAI,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC;QAAE,OAAO,IAAI,CAAA;IAE7D,kCAAkC;IAClC,IAAI,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAAE,OAAO,IAAI,CAAA;IAErD,kCAAkC;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAEvE,sCAAsC;IACtC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAA;IACvB,IAAI,KAAK,IAAI,QAAQ,KAAK,OAAO,KAAK,EAAE,CAAC;QACvC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,IAAI,IAAI,IAAI,QAAQ,IAAI,QAAQ,KAAK,OAAO,QAAQ;gBAAE,SAAQ;YAC9D,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,QAA+B,CAAC,EAAE,CAAC;gBAChE,IAAI,EAAE,IAAI,QAAQ,KAAK,OAAO,EAAE;oBAC9B,KAAK,CAAC,OAAO,CAAE,EAAU,CAAC,QAAQ,CAAC,IAAK,EAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzE,OAAO,IAAI,CAAA;gBACb,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAGD,0EAA0E;AAC1E,wEAAwE;AACxE,uEAAuE;AACvE,mEAAmE;AACnE,sEAAsE;AACtE,oEAAoE;AACpE,sDAAsD;AACtD,SAAS,oBAAoB,CAAC,IAAS;IACrC,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IAC9D,IAAI,QAAQ,KAAK,OAAO,IAAI,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAwB,EAAE,CAAA;QACnC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAA;QAClC,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,SAAS,KAAK,OAAO,IAAI,EAAE,CAAC;QAC1D,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAaD,gBAAgB;AAChB,iBAAiB;AACjB,IAAI"}
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voxgig/apidef",
3
- "version": "6.3.2",
3
+ "version": "6.3.5",
4
4
  "main": "dist/apidef.js",
5
5
  "type": "commonjs",
6
6
  "types": "dist/apidef.d.ts",
@@ -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 scheme the API's own prose
123
- // documents (e.g. `Authorization: OAuth <key>`), else 'Bearer'
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
- 'Bearer'
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 prose showing the Authorization
183
- // header format, e.g. `Authorization: OAuth 89a2...` or
184
- // `-H "Authorization: token <key>"`. The prefix must be a short word on
185
- // the SAME line, followed by something credential-shaped — a long token,
186
- // or a `<key>` / `{token}` / `$KEY` / `YOUR_...`-style placeholder. Bare
187
- // credentials (`Authorization: 89a2...`) and prose coincidences yield no
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
- const m = text.match(
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 == m) {
196
- return null
322
+ if (null != explicit) {
323
+ return explicit[1]
197
324
  }
198
- return m[1]
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