@rafads/plugin-openapi 1.5.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +83 -0
  2. package/dist/AddOpenApiIntegration-JPAEXE56.js +512 -0
  3. package/dist/AddOpenApiIntegration-JPAEXE56.js.map +1 -0
  4. package/dist/OpenApiAccountsPanel-GZFDSTAU.js +106 -0
  5. package/dist/OpenApiAccountsPanel-GZFDSTAU.js.map +1 -0
  6. package/dist/UpdateSpecSection-KUSNI44Q.js +106 -0
  7. package/dist/UpdateSpecSection-KUSNI44Q.js.map +1 -0
  8. package/dist/api/group.d.ts +239 -0
  9. package/dist/api/handlers.d.ts +7 -0
  10. package/dist/api/index.d.ts +237 -0
  11. package/dist/chunk-6V45G2XQ.js +199 -0
  12. package/dist/chunk-6V45G2XQ.js.map +1 -0
  13. package/dist/chunk-CURJJXB3.js +132 -0
  14. package/dist/chunk-CURJJXB3.js.map +1 -0
  15. package/dist/chunk-CXFO6TLJ.js +39 -0
  16. package/dist/chunk-CXFO6TLJ.js.map +1 -0
  17. package/dist/chunk-HTHEUUJA.js +2873 -0
  18. package/dist/chunk-HTHEUUJA.js.map +1 -0
  19. package/dist/chunk-IG6QTTZB.js +79 -0
  20. package/dist/chunk-IG6QTTZB.js.map +1 -0
  21. package/dist/chunk-O2LMSZ2Z.js +120 -0
  22. package/dist/chunk-O2LMSZ2Z.js.map +1 -0
  23. package/dist/chunk-OR27BCXQ.js +956 -0
  24. package/dist/chunk-OR27BCXQ.js.map +1 -0
  25. package/dist/chunk-R7TVM3XD.js +275 -0
  26. package/dist/chunk-R7TVM3XD.js.map +1 -0
  27. package/dist/client.js +38 -0
  28. package/dist/client.js.map +1 -0
  29. package/dist/core.js +331 -0
  30. package/dist/core.js.map +1 -0
  31. package/dist/index.js +19 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/providers/google/config.d.ts +34 -0
  34. package/dist/providers/google/discovery.d.ts +49 -0
  35. package/dist/providers/google/discovery.test.d.ts +1 -0
  36. package/dist/providers/google/index.d.ts +5 -0
  37. package/dist/providers/google/oauth-scopes.d.ts +3 -0
  38. package/dist/providers/google/oauth-scopes.test.d.ts +1 -0
  39. package/dist/providers/google/openapi-ownership-migration.d.ts +7 -0
  40. package/dist/providers/google/openapi-ownership-migration.test.d.ts +1 -0
  41. package/dist/providers/google/presets.d.ts +31 -0
  42. package/dist/providers/google/presets.test.d.ts +1 -0
  43. package/dist/providers/google/spec-format-adapter.d.ts +3 -0
  44. package/dist/providers/google/spec-format-adapter.test.d.ts +1 -0
  45. package/dist/providers/google.js +1446 -0
  46. package/dist/providers/google.js.map +1 -0
  47. package/dist/providers/microsoft/graph.d.ts +76 -0
  48. package/dist/providers/microsoft/graph.test.d.ts +1 -0
  49. package/dist/providers/microsoft/index.d.ts +3 -0
  50. package/dist/providers/microsoft/presets.d.ts +46 -0
  51. package/dist/providers/microsoft/presets.test.d.ts +1 -0
  52. package/dist/providers/microsoft/spec-format-adapter.d.ts +2 -0
  53. package/dist/providers/microsoft/spec-format-adapter.test.d.ts +1 -0
  54. package/dist/providers/microsoft.js +1056 -0
  55. package/dist/providers/microsoft.js.map +1 -0
  56. package/dist/react/AddOpenApiIntegration.d.ts +22 -0
  57. package/dist/react/AddOpenApiIntegration.test.d.ts +1 -0
  58. package/dist/react/OpenApiAccountsPanel.d.ts +6 -0
  59. package/dist/react/OpenApiIntegrationDetailsFields.d.ts +25 -0
  60. package/dist/react/UpdateSpecSection.d.ts +2 -0
  61. package/dist/react/atoms.d.ts +317 -0
  62. package/dist/react/auth-method-config.d.ts +18 -0
  63. package/dist/react/auth-method-config.test.d.ts +1 -0
  64. package/dist/react/client.d.ts +233 -0
  65. package/dist/react/index.d.ts +5 -0
  66. package/dist/react/integration-plugin.d.ts +6 -0
  67. package/dist/react/plugin-client.d.ts +2 -0
  68. package/dist/sdk/backing.d.ts +188 -0
  69. package/dist/sdk/client-credentials-oauth.test.d.ts +1 -0
  70. package/dist/sdk/compiled-spec-cache.test.d.ts +1 -0
  71. package/dist/sdk/config.d.ts +81 -0
  72. package/dist/sdk/configure.test.d.ts +1 -0
  73. package/dist/sdk/definitions.d.ts +57 -0
  74. package/dist/sdk/derive-auth.d.ts +11 -0
  75. package/dist/sdk/describe-auth-methods.test.d.ts +1 -0
  76. package/dist/sdk/errors.d.ts +45 -0
  77. package/dist/sdk/extract.d.ts +157 -0
  78. package/dist/sdk/extract.test.d.ts +1 -0
  79. package/dist/sdk/form-urlencoded-body.test.d.ts +1 -0
  80. package/dist/sdk/index.d.ts +19 -0
  81. package/dist/sdk/index.test.d.ts +1 -0
  82. package/dist/sdk/invoke.d.ts +150 -0
  83. package/dist/sdk/migrate-config.d.ts +4 -0
  84. package/dist/sdk/migrate-config.test.d.ts +1 -0
  85. package/dist/sdk/multi-scope-bearer.test.d.ts +1 -0
  86. package/dist/sdk/multi-scope-oauth.test.d.ts +1 -0
  87. package/dist/sdk/ndjson-output-migration.d.ts +13 -0
  88. package/dist/sdk/ndjson-output-migration.test.d.ts +1 -0
  89. package/dist/sdk/non-json-body.test.d.ts +1 -0
  90. package/dist/sdk/oauth-refresh.test.d.ts +1 -0
  91. package/dist/sdk/openapi-utils.d.ts +65 -0
  92. package/dist/sdk/output-schema-migration.d.ts +21 -0
  93. package/dist/sdk/output-schema-migration.test.d.ts +1 -0
  94. package/dist/sdk/parse.d.ts +33 -0
  95. package/dist/sdk/parse.test.d.ts +1 -0
  96. package/dist/sdk/plugin.d.ts +109 -0
  97. package/dist/sdk/plugin.test.d.ts +1 -0
  98. package/dist/sdk/presets.d.ts +15 -0
  99. package/dist/sdk/preview-oauth2.test.d.ts +1 -0
  100. package/dist/sdk/preview.d.ts +514 -0
  101. package/dist/sdk/query-serialization.test.d.ts +1 -0
  102. package/dist/sdk/real-specs.test.d.ts +1 -0
  103. package/dist/sdk/request-user-agent.test.d.ts +1 -0
  104. package/dist/sdk/response-headers-timeout.test.d.ts +1 -0
  105. package/dist/sdk/server-url-resolution.test.d.ts +1 -0
  106. package/dist/sdk/spec-blob-migration.d.ts +7 -0
  107. package/dist/sdk/spec-blob.test.d.ts +1 -0
  108. package/dist/sdk/spec-format.d.ts +36 -0
  109. package/dist/sdk/spec-format.test.d.ts +1 -0
  110. package/dist/sdk/split.d.ts +84 -0
  111. package/dist/sdk/store.d.ts +49 -0
  112. package/dist/sdk/store.test.d.ts +1 -0
  113. package/dist/sdk/streaming-response.test.d.ts +1 -0
  114. package/dist/sdk/tool-row-projection.test.d.ts +1 -0
  115. package/dist/sdk/types.d.ts +352 -0
  116. package/dist/sdk/upstream-failures.test.d.ts +1 -0
  117. package/dist/sdk/usage-scope-isolation.test.d.ts +1 -0
  118. package/dist/testing/index.d.ts +177 -0
  119. package/dist/testing.js +454 -0
  120. package/dist/testing.js.map +1 -0
  121. package/dist/testing.test.d.ts +1 -0
  122. package/package.json +103 -0
@@ -0,0 +1,79 @@
1
+ // src/react/auth-method-config.ts
2
+ import { AuthTemplateSlug } from "@rafads/sdk/shared";
3
+ import {
4
+ authMethodFromSharedTemplate,
5
+ editorPlacementsFromWire,
6
+ editorValueFromSharedMethod,
7
+ wireAuthInputFromShared,
8
+ wirePlacementsFromEditor
9
+ } from "@rafads/react/lib/shared-auth-method-codec";
10
+ var openApiWireAuthInput = (method) => method.kind === "oauth2" ? method : wireAuthInputFromShared(method);
11
+ var oauthAuthMethod = (template) => {
12
+ const slug = String(template.slug);
13
+ return {
14
+ id: slug,
15
+ label: "OAuth2",
16
+ kind: "oauth",
17
+ source: slug.startsWith("custom_") ? "custom" : "spec",
18
+ template: AuthTemplateSlug.make(slug),
19
+ placements: [],
20
+ // Carry the integration's declared endpoints/scopes so the
21
+ // client-registration form pre-fills them.
22
+ oauth: {
23
+ authorizationUrl: template.authorizationUrl,
24
+ tokenUrl: template.tokenUrl,
25
+ resource: template.resource ?? null,
26
+ scopes: template.scopes,
27
+ supportsClientIdMetadataDocument: template.supportsClientIdMetadataDocument
28
+ }
29
+ };
30
+ };
31
+ function authMethodsFromConfig(templates) {
32
+ return templates.map((template) => {
33
+ if (template.kind === "oauth2") return oauthAuthMethod(template);
34
+ return authMethodFromSharedTemplate(template);
35
+ });
36
+ }
37
+ function templateFromPlacements(placements, slug) {
38
+ return {
39
+ slug: slug ?? "",
40
+ kind: "apikey",
41
+ placements: wirePlacementsFromEditor(placements)
42
+ };
43
+ }
44
+ function editorValueFromAuthentication(template) {
45
+ if (template.kind === "oauth2") {
46
+ return {
47
+ kind: "oauth",
48
+ authorizationUrl: template.authorizationUrl ?? "",
49
+ tokenUrl: template.tokenUrl ?? "",
50
+ resource: template.resource ?? null,
51
+ scopes: template.scopes ?? [],
52
+ supportsClientIdMetadataDocument: template.supportsClientIdMetadataDocument
53
+ };
54
+ }
55
+ return editorValueFromSharedMethod(template);
56
+ }
57
+ var oauthTemplateFromEditorValue = (value, slug) => ({
58
+ slug: AuthTemplateSlug.make(slug ?? ""),
59
+ kind: "oauth2",
60
+ authorizationUrl: value.authorizationUrl,
61
+ tokenUrl: value.tokenUrl,
62
+ resource: value.resource ?? null,
63
+ scopes: [...value.scopes],
64
+ ...value.supportsClientIdMetadataDocument === true ? { supportsClientIdMetadataDocument: true } : {}
65
+ });
66
+ function authenticationFromEditorValue(value, slug) {
67
+ if (value.kind === "none") return null;
68
+ if (value.kind === "oauth") return oauthTemplateFromEditorValue(value, slug);
69
+ return templateFromPlacements(value.placements, slug);
70
+ }
71
+
72
+ export {
73
+ openApiWireAuthInput,
74
+ authMethodsFromConfig,
75
+ templateFromPlacements,
76
+ editorValueFromAuthentication,
77
+ authenticationFromEditorValue
78
+ };
79
+ //# sourceMappingURL=chunk-IG6QTTZB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/auth-method-config.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// OpenAPI ↔ generic auth-method converters — a thin oauth adapter over the\n// shared codec (`@rafads/react/lib/shared-auth-method-codec`). The\n// apikey/none paths (multi-placement, multi-variable) live in the shared\n// codec; OpenAPI only contributes its oauth flavor: stored endpoints + scopes\n// (`kind: \"oauth2\"`, the core `OAuthAuthentication` shape) that pre-fill the client-registration form.\n// ---------------------------------------------------------------------------\n\nimport { AuthTemplateSlug } from \"@rafads/sdk/shared\";\nimport type { AuthMethod, Placement } from \"@rafads/react/lib/auth-placements\";\nimport type { AuthTemplateEditorValue } from \"@rafads/react/components/auth-template-editor\";\nimport {\n authMethodFromSharedTemplate,\n editorPlacementsFromWire,\n editorValueFromSharedMethod,\n wireAuthInputFromShared,\n wirePlacementsFromEditor,\n} from \"@rafads/react/lib/shared-auth-method-codec\";\n\nimport type { APIKeyAuthentication, Authentication, AuthenticationInput } from \"../sdk/types\";\n\n/** Serialize a canonical method into the wire input union (apikey → the\n * request-shaped dialect; oauth passes through). */\nexport const openApiWireAuthInput = (method: Authentication): AuthenticationInput =>\n method.kind === \"oauth2\" ? method : (wireAuthInputFromShared(method) as AuthenticationInput);\n\nexport const placementsFromApiKey = (template: APIKeyAuthentication): readonly Placement[] =>\n editorPlacementsFromWire(template.placements);\n\nconst oauthAuthMethod = (template: Extract<Authentication, { kind: \"oauth2\" }>): AuthMethod => {\n const slug = String(template.slug);\n return {\n id: slug,\n label: \"OAuth2\",\n kind: \"oauth\",\n source: slug.startsWith(\"custom_\") ? \"custom\" : \"spec\",\n template: AuthTemplateSlug.make(slug),\n placements: [],\n // Carry the integration's declared endpoints/scopes so the\n // client-registration form pre-fills them.\n oauth: {\n authorizationUrl: template.authorizationUrl,\n tokenUrl: template.tokenUrl,\n resource: template.resource ?? null,\n scopes: template.scopes,\n supportsClientIdMetadataDocument: template.supportsClientIdMetadataDocument,\n },\n };\n};\n\n/** Map each stored auth template to a generic `AuthMethod`. */\nexport function authMethodsFromConfig(templates: readonly Authentication[]): AuthMethod[] {\n return templates.map((template: Authentication): AuthMethod => {\n if (template.kind === \"oauth2\") return oauthAuthMethod(template);\n return authMethodFromSharedTemplate(template);\n });\n}\n\n/** Build an apikey method from generic placements. When `slug` is omitted the\n * backend assigns a `custom_<id>` slug. */\nexport function templateFromPlacements(\n placements: readonly Placement[],\n slug?: string,\n): APIKeyAuthentication {\n return {\n slug: slug ?? \"\",\n kind: \"apikey\",\n placements: wirePlacementsFromEditor(placements),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Stored `Authentication` ⇆ generic `AuthTemplateEditorValue`.\n// ---------------------------------------------------------------------------\n\n/** Convert one stored `Authentication` template into a generic editor value. */\nexport function editorValueFromAuthentication(template: Authentication): AuthTemplateEditorValue {\n if (template.kind === \"oauth2\") {\n return {\n kind: \"oauth\",\n authorizationUrl: template.authorizationUrl ?? \"\",\n tokenUrl: template.tokenUrl ?? \"\",\n resource: template.resource ?? null,\n scopes: template.scopes ?? [],\n supportsClientIdMetadataDocument: template.supportsClientIdMetadataDocument,\n };\n }\n return editorValueFromSharedMethod(template);\n}\n\n/** Build an `OAuthAuthentication` template from a generic oauth editor value. */\nconst oauthTemplateFromEditorValue = (\n value: Extract<AuthTemplateEditorValue, { kind: \"oauth\" }>,\n slug?: string,\n): Authentication => ({\n slug: AuthTemplateSlug.make(slug ?? \"\"),\n kind: \"oauth2\",\n authorizationUrl: value.authorizationUrl,\n tokenUrl: value.tokenUrl,\n resource: value.resource ?? null,\n scopes: [...value.scopes],\n ...(value.supportsClientIdMetadataDocument === true\n ? { supportsClientIdMetadataDocument: true }\n : {}),\n});\n\n/** Convert one generic editor value back into a stored `Authentication`, or\n * `null` for `none` (no method to register). The optional `slug` names the\n * template; when omitted the backend backfills `custom_<id>`. */\nexport function authenticationFromEditorValue(\n value: AuthTemplateEditorValue,\n slug?: string,\n): Authentication | null {\n if (value.kind === \"none\") return null;\n if (value.kind === \"oauth\") return oauthTemplateFromEditorValue(value, slug);\n return templateFromPlacements(value.placements, slug);\n}\n"],"mappings":";AAQA,SAAS,wBAAwB;AAGjC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMA,IAAM,uBAAuB,CAAC,WACnC,OAAO,SAAS,WAAW,SAAU,wBAAwB,MAAM;AAKrE,IAAM,kBAAkB,CAAC,aAAsE;AAC7F,QAAM,OAAO,OAAO,SAAS,IAAI;AACjC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ,KAAK,WAAW,SAAS,IAAI,WAAW;AAAA,IAChD,UAAU,iBAAiB,KAAK,IAAI;AAAA,IACpC,YAAY,CAAC;AAAA;AAAA;AAAA,IAGb,OAAO;AAAA,MACL,kBAAkB,SAAS;AAAA,MAC3B,UAAU,SAAS;AAAA,MACnB,UAAU,SAAS,YAAY;AAAA,MAC/B,QAAQ,SAAS;AAAA,MACjB,kCAAkC,SAAS;AAAA,IAC7C;AAAA,EACF;AACF;AAGO,SAAS,sBAAsB,WAAoD;AACxF,SAAO,UAAU,IAAI,CAAC,aAAyC;AAC7D,QAAI,SAAS,SAAS,SAAU,QAAO,gBAAgB,QAAQ;AAC/D,WAAO,6BAA6B,QAAQ;AAAA,EAC9C,CAAC;AACH;AAIO,SAAS,uBACd,YACA,MACsB;AACtB,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,MAAM;AAAA,IACN,YAAY,yBAAyB,UAAU;AAAA,EACjD;AACF;AAOO,SAAS,8BAA8B,UAAmD;AAC/F,MAAI,SAAS,SAAS,UAAU;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,kBAAkB,SAAS,oBAAoB;AAAA,MAC/C,UAAU,SAAS,YAAY;AAAA,MAC/B,UAAU,SAAS,YAAY;AAAA,MAC/B,QAAQ,SAAS,UAAU,CAAC;AAAA,MAC5B,kCAAkC,SAAS;AAAA,IAC7C;AAAA,EACF;AACA,SAAO,4BAA4B,QAAQ;AAC7C;AAGA,IAAM,+BAA+B,CACnC,OACA,UACoB;AAAA,EACpB,MAAM,iBAAiB,KAAK,QAAQ,EAAE;AAAA,EACtC,MAAM;AAAA,EACN,kBAAkB,MAAM;AAAA,EACxB,UAAU,MAAM;AAAA,EAChB,UAAU,MAAM,YAAY;AAAA,EAC5B,QAAQ,CAAC,GAAG,MAAM,MAAM;AAAA,EACxB,GAAI,MAAM,qCAAqC,OAC3C,EAAE,kCAAkC,KAAK,IACzC,CAAC;AACP;AAKO,SAAS,8BACd,OACA,MACuB;AACvB,MAAI,MAAM,SAAS,OAAQ,QAAO;AAClC,MAAI,MAAM,SAAS,QAAS,QAAO,6BAA6B,OAAO,IAAI;AAC3E,SAAO,uBAAuB,MAAM,YAAY,IAAI;AACtD;","names":[]}
@@ -0,0 +1,120 @@
1
+ import {
2
+ resolveServerUrl
3
+ } from "./chunk-HTHEUUJA.js";
4
+
5
+ // src/sdk/derive-auth.ts
6
+ import * as Option from "effect/Option";
7
+ import { AuthTemplateSlug } from "@rafads/sdk/shared";
8
+ function resolveOAuthUrl(url, baseUrl) {
9
+ if (!url) return url;
10
+ try {
11
+ new URL(url);
12
+ return url;
13
+ } catch {
14
+ if (!baseUrl) return url;
15
+ try {
16
+ return new URL(url, baseUrl).toString();
17
+ } catch {
18
+ return url;
19
+ }
20
+ }
21
+ }
22
+ var standardOidcIdentityScopes = ["openid", "email", "profile"];
23
+ var identityScopesForPreset = (identityScopes) => {
24
+ if (identityScopes === false) return [];
25
+ return identityScopes === "auto" ? standardOidcIdentityScopes : identityScopes;
26
+ };
27
+ var resolvedOAuthScopes = (apiScopes, identityScopes) => {
28
+ const merged = new Set(apiScopes);
29
+ for (const scope of identityScopesForPreset(identityScopes)) merged.add(scope);
30
+ return [...merged];
31
+ };
32
+ var headerPrefix = (preset, headerName) => {
33
+ const label = preset.label.toLowerCase();
34
+ if (headerName.toLowerCase() === "authorization") {
35
+ if (label.includes("bearer")) return "Bearer ";
36
+ if (label.includes("basic")) return "Basic ";
37
+ }
38
+ return void 0;
39
+ };
40
+ var slugifyVariable = (name) => name.toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "");
41
+ var variablesForHeaders = (headerNames) => {
42
+ const variables = /* @__PURE__ */ new Map();
43
+ if (headerNames.length <= 1) return variables;
44
+ const taken = /* @__PURE__ */ new Set();
45
+ for (const headerName of headerNames) {
46
+ const base = slugifyVariable(headerName) || "input";
47
+ let variable = base;
48
+ for (let suffix = 2; taken.has(variable); suffix += 1) {
49
+ variable = `${base}_${suffix}`;
50
+ }
51
+ taken.add(variable);
52
+ variables.set(headerName, variable);
53
+ }
54
+ return variables;
55
+ };
56
+ var apiKeyTemplateFromHeaderPreset = (preset, slug) => {
57
+ const variables = variablesForHeaders(preset.secretHeaders);
58
+ return {
59
+ slug,
60
+ kind: "apikey",
61
+ placements: preset.secretHeaders.map((headerName) => {
62
+ const prefix = headerPrefix(preset, headerName);
63
+ const variable = variables.get(headerName);
64
+ return {
65
+ carrier: "header",
66
+ name: headerName,
67
+ ...prefix ? { prefix } : {},
68
+ ...variable ? { variable } : {}
69
+ };
70
+ })
71
+ };
72
+ };
73
+ var oauthTemplateFromPreset = (preset, baseUrl, slug, scopes) => ({
74
+ slug,
75
+ kind: "oauth2",
76
+ authorizationUrl: resolveOAuthUrl(
77
+ Option.getOrElse(preset.authorizationUrl, () => ""),
78
+ baseUrl
79
+ ),
80
+ tokenUrl: resolveOAuthUrl(preset.tokenUrl, baseUrl),
81
+ resource: Option.getOrUndefined(preset.resource) ?? null,
82
+ scopes: [...scopes],
83
+ ...preset.supportsClientIdMetadataDocument === true ? { supportsClientIdMetadataDocument: true } : {}
84
+ });
85
+ var detectedAuthenticationTemplates = (headerPresets, oauth2Presets, baseUrl) => {
86
+ const templates = [];
87
+ headerPresets.forEach((preset, index) => {
88
+ templates.push(
89
+ apiKeyTemplateFromHeaderPreset(preset, AuthTemplateSlug.make(`apikey-${index}`))
90
+ );
91
+ });
92
+ for (const preset of oauth2Presets) {
93
+ const scopes = resolvedOAuthScopes(Object.keys(preset.scopes), preset.identityScopes);
94
+ templates.push(
95
+ oauthTemplateFromPreset(
96
+ preset,
97
+ baseUrl,
98
+ AuthTemplateSlug.make(`oauth-${preset.securitySchemeName}`),
99
+ scopes
100
+ )
101
+ );
102
+ }
103
+ return templates;
104
+ };
105
+ var firstBaseUrlForPreview = (preview) => {
106
+ const firstServer = preview.servers[0];
107
+ return firstServer ? resolveServerUrl(firstServer.url, Option.getOrUndefined(firstServer.variables), {}) : "";
108
+ };
109
+ var deriveAuthenticationTemplateFromPreview = (preview, baseUrl) => detectedAuthenticationTemplates(
110
+ preview.headerPresets,
111
+ preview.oauth2Presets,
112
+ baseUrl ?? firstBaseUrlForPreview(preview)
113
+ );
114
+
115
+ export {
116
+ detectedAuthenticationTemplates,
117
+ firstBaseUrlForPreview,
118
+ deriveAuthenticationTemplateFromPreview
119
+ };
120
+ //# sourceMappingURL=chunk-O2LMSZ2Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sdk/derive-auth.ts"],"sourcesContent":["// Spec-detected auth → stored `Authentication` templates, shared by every add\n// path. The React add flow derives templates from the preview before calling\n// `addSpec`; `addSpec` itself falls back to the same derivation when the\n// caller omits `authenticationTemplate` (the agentic/API path has no client\n// to do it). One implementation so the web UI and headless callers cannot\n// drift: an integration added over MCP gets the same auth methods the add\n// page would have produced.\nimport * as Option from \"effect/Option\";\n\nimport { AuthTemplateSlug, type OAuthAuthentication } from \"@rafads/sdk/shared\";\n\nimport type { HeaderPreset, OAuth2Preset, SpecPreview, SpecPreviewSummary } from \"./preview\";\nimport type { APIKeyAuthentication, Authentication } from \"./types\";\nimport { resolveServerUrl } from \"./openapi-utils\";\n\ntype PreviewAuthMetadata = SpecPreview | SpecPreviewSummary;\n\n// ---------------------------------------------------------------------------\n// OpenAPI url helpers — specs sometimes ship relative OAuth endpoints; resolve\n// them against the chosen base URL so the stored auth template is absolute.\n// ---------------------------------------------------------------------------\n\nexport function resolveOAuthUrl(url: string, baseUrl: string): string {\n if (!url) return url;\n // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: URL constructor normalizes provider metadata URLs\n try {\n new URL(url);\n return url;\n } catch {\n if (!baseUrl) return url;\n // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: URL constructor resolves relative provider metadata URLs\n try {\n return new URL(url, baseUrl).toString();\n } catch {\n return url;\n }\n }\n}\n\nconst standardOidcIdentityScopes = [\"openid\", \"email\", \"profile\"] as const;\n\nconst identityScopesForPreset = (\n identityScopes: OAuth2Preset[\"identityScopes\"],\n): readonly string[] => {\n if (identityScopes === false) return [];\n return identityScopes === \"auto\" ? standardOidcIdentityScopes : identityScopes;\n};\n\nexport const resolvedOAuthScopes = (\n apiScopes: Iterable<string>,\n identityScopes: OAuth2Preset[\"identityScopes\"],\n): string[] => {\n const merged = new Set(apiScopes);\n for (const scope of identityScopesForPreset(identityScopes)) merged.add(scope);\n return [...merged];\n};\n\n// ---------------------------------------------------------------------------\n// Auth-template builders — turn a preview preset into the integration's stored\n// `Authentication` template (v2). A single-header preset becomes an `apiKey`\n// template whose secret header value renders from the conventional `token`\n// input. A multi-header preset gets one input per header, matching OpenAPI's\n// security-strategy semantics where multiple schemes in one object are required\n// together. The oauth2 preset becomes an `oauth` template carrying the provider\n// endpoints.\n// ---------------------------------------------------------------------------\n\nconst headerPrefix = (preset: HeaderPreset, headerName: string): string | undefined => {\n const label = preset.label.toLowerCase();\n if (headerName.toLowerCase() === \"authorization\") {\n if (label.includes(\"bearer\")) return \"Bearer \";\n if (label.includes(\"basic\")) return \"Basic \";\n }\n return undefined;\n};\n\nconst slugifyVariable = (name: string): string =>\n name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n\nconst variablesForHeaders = (headerNames: readonly string[]): ReadonlyMap<string, string> => {\n const variables = new Map<string, string>();\n if (headerNames.length <= 1) return variables;\n\n const taken = new Set<string>();\n for (const headerName of headerNames) {\n const base = slugifyVariable(headerName) || \"input\";\n let variable = base;\n for (let suffix = 2; taken.has(variable); suffix += 1) {\n variable = `${base}_${suffix}`;\n }\n taken.add(variable);\n variables.set(headerName, variable);\n }\n return variables;\n};\n\nconst apiKeyTemplateFromHeaderPreset = (\n preset: HeaderPreset,\n slug: AuthTemplateSlug,\n): APIKeyAuthentication => {\n const variables = variablesForHeaders(preset.secretHeaders);\n return {\n slug,\n kind: \"apikey\",\n placements: preset.secretHeaders.map((headerName) => {\n const prefix = headerPrefix(preset, headerName);\n const variable = variables.get(headerName);\n return {\n carrier: \"header\" as const,\n name: headerName,\n ...(prefix ? { prefix } : {}),\n ...(variable ? { variable } : {}),\n };\n }),\n };\n};\n\nconst oauthTemplateFromPreset = (\n preset: OAuth2Preset,\n baseUrl: string,\n slug: AuthTemplateSlug,\n scopes: readonly string[],\n): OAuthAuthentication => ({\n slug,\n kind: \"oauth2\",\n authorizationUrl: resolveOAuthUrl(\n Option.getOrElse(preset.authorizationUrl, () => \"\"),\n baseUrl,\n ),\n tokenUrl: resolveOAuthUrl(preset.tokenUrl, baseUrl),\n resource: Option.getOrUndefined(preset.resource) ?? null,\n scopes: [...scopes],\n ...(preset.supportsClientIdMetadataDocument === true\n ? { supportsClientIdMetadataDocument: true }\n : {}),\n});\n\n// ---------------------------------------------------------------------------\n// All spec-detected auth methods → the union of stored `Authentication`\n// templates. Header presets become apiKey templates; each oauth2 preset becomes\n// an oauth template (with its declared API scopes plus, for auth-code flows,\n// the standard identity scopes). Slugs stay deterministic per method so the\n// stored template is stable across previews of the same spec.\n// ---------------------------------------------------------------------------\n\nexport const detectedAuthenticationTemplates = (\n headerPresets: readonly HeaderPreset[],\n oauth2Presets: readonly OAuth2Preset[],\n baseUrl: string,\n): readonly Authentication[] => {\n const templates: Authentication[] = [];\n headerPresets.forEach((preset, index) => {\n templates.push(\n apiKeyTemplateFromHeaderPreset(preset, AuthTemplateSlug.make(`apikey-${index}`)),\n );\n });\n for (const preset of oauth2Presets) {\n const scopes = resolvedOAuthScopes(Object.keys(preset.scopes), preset.identityScopes);\n templates.push(\n oauthTemplateFromPreset(\n preset,\n baseUrl,\n AuthTemplateSlug.make(`oauth-${preset.securitySchemeName}`),\n scopes,\n ),\n );\n }\n return templates;\n};\n\nexport const firstBaseUrlForPreview = (preview: PreviewAuthMetadata): string => {\n const firstServer = preview.servers[0];\n return firstServer\n ? resolveServerUrl(firstServer.url, Option.getOrUndefined(firstServer.variables), {})\n : \"\";\n};\n\n/** The fallback `addSpec` uses when no explicit template was passed: every\n * spec-detected method, resolved against the integration's base URL. */\nexport const deriveAuthenticationTemplateFromPreview = (\n preview: PreviewAuthMetadata,\n baseUrl: string | undefined,\n): readonly Authentication[] =>\n detectedAuthenticationTemplates(\n preview.headerPresets,\n preview.oauth2Presets,\n baseUrl ?? firstBaseUrlForPreview(preview),\n );\n"],"mappings":"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","names":[]}