@executor-js/plugin-graphql 1.5.12 → 1.5.14

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,7 +1,7 @@
1
1
  import {
2
2
  addGraphqlIntegrationOptimistic,
3
3
  graphqlAuthMethodInputsFromPlacements
4
- } from "./chunk-YH4WFUKM.js";
4
+ } from "./chunk-VSLIDDNK.js";
5
5
  import "./chunk-732HGFSH.js";
6
6
 
7
7
  // src/react/AddGraphqlSource.tsx
@@ -177,4 +177,4 @@ function AddGraphqlSource(props) {
177
177
  export {
178
178
  AddGraphqlSource as default
179
179
  };
180
- //# sourceMappingURL=AddGraphqlSource-WVFRGZGF.js.map
180
+ //# sourceMappingURL=AddGraphqlSource-B7ZOZ7WM.js.map
@@ -4,7 +4,7 @@ import {
4
4
  graphqlConfigAtom,
5
5
  graphqlConfigure,
6
6
  graphqlWireAuthInput
7
- } from "./chunk-YH4WFUKM.js";
7
+ } from "./chunk-VSLIDDNK.js";
8
8
  import "./chunk-732HGFSH.js";
9
9
 
10
10
  // src/react/GraphqlAccountsPanel.tsx
@@ -75,4 +75,4 @@ function GraphqlAccountsPanel(props) {
75
75
  export {
76
76
  GraphqlAccountsPanel as default
77
77
  };
78
- //# sourceMappingURL=GraphqlAccountsPanel-2O7QVW2F.js.map
78
+ //# sourceMappingURL=GraphqlAccountsPanel-QGBVXP2A.js.map
@@ -6,7 +6,7 @@ var graphqlPresets = [
6
6
  summary: "Repos, issues, PRs, and users via GitHub's GraphQL API.",
7
7
  url: "https://api.github.com/graphql",
8
8
  endpoint: "https://api.github.com/graphql",
9
- icon: "https://github.com/favicon.ico",
9
+ icon: "https://svgl.app/library/github_dark.svg",
10
10
  featured: true
11
11
  },
12
12
  {
@@ -48,4 +48,4 @@ var graphqlPresets = [
48
48
  export {
49
49
  graphqlPresets
50
50
  };
51
- //# sourceMappingURL=chunk-D6E4WAYW.js.map
51
+ //# sourceMappingURL=chunk-QVJ2HNNZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sdk/presets.ts"],"sourcesContent":["export interface GraphqlPreset {\n readonly id: string;\n readonly name: string;\n readonly summary: string;\n readonly url: string;\n readonly endpoint: string;\n readonly icon?: string;\n readonly featured?: boolean;\n}\n\nexport const graphqlPresets: readonly GraphqlPreset[] = [\n {\n id: \"github-graphql\",\n name: \"GitHub GraphQL\",\n summary: \"Repos, issues, PRs, and users via GitHub's GraphQL API.\",\n url: \"https://api.github.com/graphql\",\n endpoint: \"https://api.github.com/graphql\",\n icon: \"https://svgl.app/library/github_dark.svg\",\n featured: true,\n },\n {\n id: \"gitlab\",\n name: \"GitLab\",\n summary: \"Projects, merge requests, pipelines, and users.\",\n url: \"https://gitlab.com/api/graphql\",\n endpoint: \"https://gitlab.com/api/graphql\",\n icon: \"https://gitlab.com/favicon.ico\",\n featured: true,\n },\n {\n id: \"linear\",\n name: \"Linear\",\n summary: \"Issues, projects, teams, and cycles.\",\n url: \"https://api.linear.app/graphql\",\n endpoint: \"https://api.linear.app/graphql\",\n icon: \"https://linear.app/favicon.ico\",\n featured: true,\n },\n {\n id: \"monday\",\n name: \"Monday.com\",\n summary: \"Boards, items, columns, and workspace automation.\",\n url: \"https://api.monday.com/v2\",\n endpoint: \"https://api.monday.com/v2\",\n icon: \"https://monday.com/favicon.ico\",\n },\n {\n id: \"anilist\",\n name: \"AniList\",\n summary: \"Anime and manga database — no auth required.\",\n url: \"https://graphql.anilist.co\",\n endpoint: \"https://graphql.anilist.co\",\n icon: \"https://anilist.co/img/icons/favicon-32x32.png\",\n },\n];\n"],"mappings":";AAUO,IAAM,iBAA2C;AAAA,EACtD;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,EACR;AACF;","names":[]}
@@ -14,6 +14,7 @@ import { ReactivityKey } from "@executor-js/react/api/reactivity-keys";
14
14
  // src/react/client.ts
15
15
  import { createPluginAtomClient } from "@executor-js/sdk/client";
16
16
  import {
17
+ getExecutorOrganizationHeaders,
17
18
  getExecutorApiBaseUrl,
18
19
  getExecutorServerAuthorizationHeader
19
20
  } from "@executor-js/react/api/server-connection";
@@ -93,7 +94,8 @@ var GraphqlGroup = HttpApiGroup.make("graphql").add(
93
94
  // src/react/client.ts
94
95
  var GraphqlClient = createPluginAtomClient(GraphqlGroup, {
95
96
  baseUrl: getExecutorApiBaseUrl,
96
- authorizationHeader: getExecutorServerAuthorizationHeader
97
+ authorizationHeader: getExecutorServerAuthorizationHeader,
98
+ headers: getExecutorOrganizationHeaders
97
99
  });
98
100
 
99
101
  // src/react/atoms.ts
@@ -164,4 +166,4 @@ export {
164
166
  graphqlAuthMethodInputsFromPlacements,
165
167
  graphqlWireAuthInput
166
168
  };
167
- //# sourceMappingURL=chunk-YH4WFUKM.js.map
169
+ //# sourceMappingURL=chunk-VSLIDDNK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/atoms.ts","../src/react/client.ts","../src/api/group.ts","../src/react/auth-method-config.ts"],"sourcesContent":["import type { IntegrationSlug } from \"@executor-js/sdk/shared\";\nimport * as Atom from \"effect/unstable/reactivity/Atom\";\nimport * as AsyncResult from \"effect/unstable/reactivity/AsyncResult\";\nimport { integrationsOptimisticAtom } from \"@executor-js/react/api/atoms\";\nimport { ReactivityKey } from \"@executor-js/react/api/reactivity-keys\";\nimport { GraphqlClient } from \"./client\";\n\n// ---------------------------------------------------------------------------\n// Query atoms — v2 is integration-centric. The graphql HTTP surface exposes\n// only the catalog integration (`getIntegration` → its stored config, which\n// carries the `authenticationTemplate[]`). Connections are created through the\n// core API (`createConnection` / `oauth.start`), not through this plugin's\n// surface.\n// ---------------------------------------------------------------------------\n\nexport const graphqlIntegrationConfigAtom = (slug: IntegrationSlug) =>\n GraphqlClient.query(\"graphql\", \"getIntegration\", {\n params: { slug: String(slug) },\n timeToLive: \"15 seconds\",\n reactivityKeys: [ReactivityKey.integrations, ReactivityKey.tools],\n });\n\n// The full opaque config (including `authenticationTemplate`), used by the\n// configure UX to render existing auth methods and add custom ones.\nexport const graphqlConfigAtom = (slug: IntegrationSlug) =>\n GraphqlClient.query(\"graphql\", \"getConfig\", {\n params: { slug: String(slug) },\n timeToLive: \"15 seconds\",\n reactivityKeys: [ReactivityKey.integrations, ReactivityKey.tools],\n });\n\n// ---------------------------------------------------------------------------\n// Mutation atoms\n// ---------------------------------------------------------------------------\n\nexport const addGraphqlIntegration = GraphqlClient.mutation(\"graphql\", \"addIntegration\");\n\n// Merge-append custom auth methods onto an integration's `authenticationTemplate`.\nexport const graphqlConfigure = GraphqlClient.mutation(\"graphql\", \"configure\");\n\n// Optimistically slot a pending row into the shared integration catalog so the\n// integrations list reflects the new GraphQL integration before the server\n// round-trips. The reducer mirrors the catalog `Integration` shape.\nexport const addGraphqlIntegrationOptimistic = integrationsOptimisticAtom.pipe(\n Atom.optimisticFn({\n reducer: (\n current,\n arg: {\n readonly payload: {\n readonly endpoint: string;\n readonly slug?: string;\n readonly name?: string;\n };\n },\n ) =>\n AsyncResult.map(current, (rows) => {\n const slug = (arg.payload.slug ??\n `pending-${Math.random().toString(36).slice(2)}`) as IntegrationSlug;\n const integration = {\n slug,\n kind: \"graphql\",\n name: arg.payload.name ?? arg.payload.endpoint,\n description: arg.payload.name ?? arg.payload.endpoint,\n canRemove: false,\n canRefresh: false,\n authMethods: [],\n };\n return [integration, ...rows.filter((row) => row.slug !== slug)].sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n }),\n fn: addGraphqlIntegration,\n }),\n);\n","import { createPluginAtomClient } from \"@executor-js/sdk/client\";\nimport {\n getExecutorOrganizationHeaders,\n getExecutorApiBaseUrl,\n getExecutorServerAuthorizationHeader,\n} from \"@executor-js/react/api/server-connection\";\nimport { GraphqlGroup } from \"../api/group\";\n\nexport const GraphqlClient = createPluginAtomClient(GraphqlGroup, {\n baseUrl: getExecutorApiBaseUrl,\n authorizationHeader: getExecutorServerAuthorizationHeader,\n headers: getExecutorOrganizationHeaders,\n});\n","import { HttpApiEndpoint, HttpApiGroup } from \"effect/unstable/httpapi\";\nimport { Schema } from \"effect\";\nimport { InternalError, IntegrationAlreadyExistsError } from \"@executor-js/sdk/shared\";\n\nimport { GraphqlIntrospectionError, GraphqlExtractionError } from \"../sdk/errors\";\nimport { GraphqlAuthMethod, GraphqlAuthMethodInput } from \"../sdk/types\";\n\n// ---------------------------------------------------------------------------\n// Params\n// ---------------------------------------------------------------------------\n\nconst IntegrationParams = {\n slug: Schema.String,\n};\n\n// ---------------------------------------------------------------------------\n// Payloads\n// ---------------------------------------------------------------------------\n\nconst AddIntegrationPayload = Schema.Struct({\n endpoint: Schema.String,\n slug: Schema.optional(Schema.String),\n name: Schema.optional(Schema.String),\n description: Schema.optional(Schema.String),\n introspectionJson: Schema.optional(Schema.String),\n headers: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n queryParams: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n authenticationTemplate: Schema.optional(Schema.Array(GraphqlAuthMethodInput)),\n});\n\n// The `configure` payload — the custom auth methods to merge-append onto the\n// integration's `authenticationTemplate`. Reuses the same input schema as\n// `addIntegration` (slug optional — the backend backfills it) so a custom\n// apikey method round-trips identically.\nconst ConfigurePayload = Schema.Struct({\n authenticationTemplate: Schema.Array(GraphqlAuthMethodInput),\n mode: Schema.optional(Schema.Literals([\"merge\", \"replace\"])),\n});\n\n// ---------------------------------------------------------------------------\n// Responses\n// ---------------------------------------------------------------------------\n\nconst AddIntegrationResponse = Schema.Struct({\n slug: Schema.String,\n name: Schema.String,\n});\n\n// The integration config surfaced for the configure UX. Carries the\n// `authenticationTemplate` the configure / custom-method flow reads/writes.\n// The introspection snapshot is deliberately NOT served: it's a multi-MB\n// build artifact in the plugin blob store, and no client reads it.\nconst GraphqlConfigView = Schema.Struct({\n endpoint: Schema.String,\n name: Schema.String,\n headers: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n queryParams: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n authenticationTemplate: Schema.Array(GraphqlAuthMethod),\n});\n\n// The configure result — the merged `authenticationTemplate` after the new\n// custom methods were appended/replaced.\nconst ConfigureResponse = Schema.Struct({\n authenticationTemplate: Schema.Array(GraphqlAuthMethod),\n});\n\n// ---------------------------------------------------------------------------\n// Errors with HTTP status\n// ---------------------------------------------------------------------------\n\nconst IntrospectionError = GraphqlIntrospectionError.annotate({\n httpApiStatus: 400,\n});\nconst ExtractionError = GraphqlExtractionError.annotate({ httpApiStatus: 400 });\n\n// ---------------------------------------------------------------------------\n// Group — the GraphQL HTTP surface over integrations.\n//\n// Plugin SDK errors (GraphqlIntrospectionError etc.) are declared once at the\n// group level via `.addError(...)`. `InternalError` is the shared opaque-by-\n// schema 500 surface translated from `StorageError` by `withCapture` at the\n// HTTP edge.\n// ---------------------------------------------------------------------------\n\nconst GraphqlErrors = [\n InternalError,\n IntrospectionError,\n ExtractionError,\n IntegrationAlreadyExistsError,\n] as const;\n\nexport const GraphqlGroup = HttpApiGroup.make(\"graphql\")\n .add(\n HttpApiEndpoint.post(\"addIntegration\", \"/graphql/integrations\", {\n payload: AddIntegrationPayload,\n success: AddIntegrationResponse,\n error: GraphqlErrors,\n }),\n )\n .add(\n HttpApiEndpoint.get(\"getIntegration\", \"/graphql/integrations/:slug\", {\n params: IntegrationParams,\n success: Schema.NullOr(Schema.Unknown),\n error: GraphqlErrors,\n }),\n )\n .add(\n HttpApiEndpoint.get(\"getConfig\", \"/graphql/integrations/:slug/config\", {\n params: IntegrationParams,\n success: Schema.NullOr(GraphqlConfigView),\n error: GraphqlErrors,\n }),\n )\n .add(\n HttpApiEndpoint.post(\"configure\", \"/graphql/integrations/:slug/config\", {\n params: IntegrationParams,\n payload: ConfigurePayload,\n success: ConfigureResponse,\n error: GraphqlErrors,\n }),\n );\n","// ---------------------------------------------------------------------------\n// GraphQL ↔ generic auth-method converters — a thin oauth adapter over the\n// shared codec (`@executor-js/react/lib/shared-auth-method-codec`). The\n// apikey/none paths (multi-placement, multi-variable) live in the shared\n// codec; GraphQL only contributes its oauth flavor: endpoint-less methods that\n// render the connection's access token as a bearer header at invoke time\n// (optionally overriding the header name / prefix).\n// ---------------------------------------------------------------------------\n\nimport { AuthTemplateSlug } from \"@executor-js/sdk/shared\";\nimport type { AuthTemplateEditorValue } from \"@executor-js/react/components/auth-template-editor\";\nimport type { AuthMethod, Placement } from \"@executor-js/react/lib/auth-placements\";\nimport {\n wireAuthInputFromShared,\n authMethodFromSharedTemplate,\n editorValueFromSharedMethod,\n sharedMethodInputFromEditorValue,\n wirePlacementsFromEditor,\n} from \"@executor-js/react/lib/shared-auth-method-codec\";\n\nimport type {\n GraphqlAuthMethod,\n GraphqlAuthMethodInput,\n GraphqlCanonicalAuthMethodInput,\n} from \"../sdk/types\";\n\nconst oauthAuthMethod = (slug: string): AuthMethod => ({\n id: slug,\n label: \"OAuth\",\n kind: \"oauth\",\n source: slug.startsWith(\"custom_\") ? \"custom\" : \"spec\",\n template: AuthTemplateSlug.make(slug),\n placements: [],\n oauth: {},\n});\n\n/** Convert a generic editor value into one GraphQL auth-method input (no slug\n * — the backend assigns carrier-derived slugs). An apikey value keeps every\n * named placement (headers and query params mix freely); one with no usable\n * placement falls back to `none`. */\nexport function graphqlAuthMethodInputFromEditorValue(\n value: AuthTemplateEditorValue,\n): GraphqlAuthMethodInput {\n if (value.kind === \"oauth\") return { kind: \"oauth2\" };\n return (sharedMethodInputFromEditorValue(value) ?? { kind: \"none\" }) as GraphqlAuthMethodInput;\n}\n\n/** Convert one stored GraphQL method into the generic editor value. */\nexport function editorValueFromGraphqlAuthMethod(\n method: GraphqlAuthMethod,\n): AuthTemplateEditorValue {\n if (method.kind === \"oauth2\") {\n // GraphQL oauth methods store no endpoints — only the bearer rendering.\n return { kind: \"oauth\", authorizationUrl: \"\", tokenUrl: \"\", scopes: [] };\n }\n return editorValueFromSharedMethod(method);\n}\n\n/** Project the stored methods into the generic `AuthMethod[]` the hub renders.\n * Mirrors the server's `describeGraphqlAuthMethods`; `custom_` slugs mark\n * user-created methods (removable from the hub). */\nexport function authMethodsFromConfig(methods: readonly GraphqlAuthMethod[]): AuthMethod[] {\n return methods.map((method: GraphqlAuthMethod): AuthMethod => {\n if (method.kind === \"oauth2\") return oauthAuthMethod(method.slug);\n return authMethodFromSharedTemplate(method);\n });\n}\n\n/** Build the GraphQL method input for a custom method from generic placements\n * — ONE method carrying every named placement (header + query mix in a single\n * method; each placement renders from its own input variable, or shares one).\n * Empty when no placement is usable. */\nexport function graphqlAuthMethodInputsFromPlacements(\n placements: readonly Placement[],\n): GraphqlAuthMethodInput[] {\n const wire = wirePlacementsFromEditor(placements);\n if (wire.length === 0) return [];\n return [graphqlWireAuthInput({ kind: \"apikey\", placements: wire })];\n}\n\n/** Serialize a canonical method into the wire input union (apikey → the\n * request-shaped dialect; none/oauth2 pass through). */\nexport const graphqlWireAuthInput = (\n method: GraphqlAuthMethod | GraphqlCanonicalAuthMethodInput,\n): GraphqlAuthMethodInput => wireAuthInputFromShared(method) as GraphqlAuthMethodInput;\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  graphqlPresets
3
- } from "./chunk-D6E4WAYW.js";
3
+ } from "./chunk-QVJ2HNNZ.js";
4
4
  import {
5
5
  ExtractedField,
6
6
  ExtractionResult,
@@ -1307,4 +1307,4 @@ export {
1307
1307
  describeGraphqlAuthMethods,
1308
1308
  graphqlPlugin
1309
1309
  };
1310
- //# sourceMappingURL=chunk-XFH7IECG.js.map
1310
+ //# sourceMappingURL=chunk-W4ARRR5Q.js.map
package/dist/client.js CHANGED
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  graphqlPresets
3
- } from "./chunk-D6E4WAYW.js";
3
+ } from "./chunk-QVJ2HNNZ.js";
4
4
 
5
5
  // src/react/plugin-client.tsx
6
6
  import { defineClientPlugin } from "@executor-js/sdk/client";
7
7
 
8
8
  // src/react/source-plugin.ts
9
9
  import { lazy } from "react";
10
- var importAdd = () => import("./AddGraphqlSource-WVFRGZGF.js");
11
- var importAccounts = () => import("./GraphqlAccountsPanel-2O7QVW2F.js");
10
+ var importAdd = () => import("./AddGraphqlSource-B7ZOZ7WM.js");
11
+ var importAccounts = () => import("./GraphqlAccountsPanel-QGBVXP2A.js");
12
12
  var graphqlIntegrationPlugin = {
13
13
  key: "graphql",
14
14
  label: "GraphQL",
package/dist/core.js CHANGED
@@ -7,8 +7,8 @@ import {
7
7
  invokeWithLayer,
8
8
  makeDefaultGraphqlStore,
9
9
  parseIntrospectionJson
10
- } from "./chunk-XFH7IECG.js";
11
- import "./chunk-D6E4WAYW.js";
10
+ } from "./chunk-W4ARRR5Q.js";
11
+ import "./chunk-QVJ2HNNZ.js";
12
12
  import {
13
13
  ExtractedField,
14
14
  ExtractionResult,
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  graphqlPlugin
3
- } from "./chunk-XFH7IECG.js";
4
- import "./chunk-D6E4WAYW.js";
3
+ } from "./chunk-W4ARRR5Q.js";
4
+ import "./chunk-QVJ2HNNZ.js";
5
5
  import "./chunk-732HGFSH.js";
6
6
  export {
7
7
  graphqlPlugin
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@executor-js/plugin-graphql",
3
- "version": "1.5.12",
3
+ "version": "1.5.14",
4
4
  "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/graphql",
5
5
  "bugs": {
6
6
  "url": "https://github.com/RhysSullivan/executor/issues"
@@ -53,8 +53,8 @@
53
53
  },
54
54
  "dependencies": {
55
55
  "@effect/platform-node": "4.0.0-beta.59",
56
- "@executor-js/config": "1.5.12",
57
- "@executor-js/sdk": "1.5.12",
56
+ "@executor-js/config": "1.5.14",
57
+ "@executor-js/sdk": "1.5.14",
58
58
  "graphql": "^16.12.0",
59
59
  "graphql-yoga": "^5.17.0"
60
60
  },
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/sdk/presets.ts"],"sourcesContent":["export interface GraphqlPreset {\n readonly id: string;\n readonly name: string;\n readonly summary: string;\n readonly url: string;\n readonly endpoint: string;\n readonly icon?: string;\n readonly featured?: boolean;\n}\n\nexport const graphqlPresets: readonly GraphqlPreset[] = [\n {\n id: \"github-graphql\",\n name: \"GitHub GraphQL\",\n summary: \"Repos, issues, PRs, and users via GitHub's GraphQL API.\",\n url: \"https://api.github.com/graphql\",\n endpoint: \"https://api.github.com/graphql\",\n icon: \"https://github.com/favicon.ico\",\n featured: true,\n },\n {\n id: \"gitlab\",\n name: \"GitLab\",\n summary: \"Projects, merge requests, pipelines, and users.\",\n url: \"https://gitlab.com/api/graphql\",\n endpoint: \"https://gitlab.com/api/graphql\",\n icon: \"https://gitlab.com/favicon.ico\",\n featured: true,\n },\n {\n id: \"linear\",\n name: \"Linear\",\n summary: \"Issues, projects, teams, and cycles.\",\n url: \"https://api.linear.app/graphql\",\n endpoint: \"https://api.linear.app/graphql\",\n icon: \"https://linear.app/favicon.ico\",\n featured: true,\n },\n {\n id: \"monday\",\n name: \"Monday.com\",\n summary: \"Boards, items, columns, and workspace automation.\",\n url: \"https://api.monday.com/v2\",\n endpoint: \"https://api.monday.com/v2\",\n icon: \"https://monday.com/favicon.ico\",\n },\n {\n id: \"anilist\",\n name: \"AniList\",\n summary: \"Anime and manga database — no auth required.\",\n url: \"https://graphql.anilist.co\",\n endpoint: \"https://graphql.anilist.co\",\n icon: \"https://anilist.co/img/icons/favicon-32x32.png\",\n },\n];\n"],"mappings":";AAUO,IAAM,iBAA2C;AAAA,EACtD;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,EACR;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/react/atoms.ts","../src/react/client.ts","../src/api/group.ts","../src/react/auth-method-config.ts"],"sourcesContent":["import type { IntegrationSlug } from \"@executor-js/sdk/shared\";\nimport * as Atom from \"effect/unstable/reactivity/Atom\";\nimport * as AsyncResult from \"effect/unstable/reactivity/AsyncResult\";\nimport { integrationsOptimisticAtom } from \"@executor-js/react/api/atoms\";\nimport { ReactivityKey } from \"@executor-js/react/api/reactivity-keys\";\nimport { GraphqlClient } from \"./client\";\n\n// ---------------------------------------------------------------------------\n// Query atoms — v2 is integration-centric. The graphql HTTP surface exposes\n// only the catalog integration (`getIntegration` → its stored config, which\n// carries the `authenticationTemplate[]`). Connections are created through the\n// core API (`createConnection` / `oauth.start`), not through this plugin's\n// surface.\n// ---------------------------------------------------------------------------\n\nexport const graphqlIntegrationConfigAtom = (slug: IntegrationSlug) =>\n GraphqlClient.query(\"graphql\", \"getIntegration\", {\n params: { slug: String(slug) },\n timeToLive: \"15 seconds\",\n reactivityKeys: [ReactivityKey.integrations, ReactivityKey.tools],\n });\n\n// The full opaque config (including `authenticationTemplate`), used by the\n// configure UX to render existing auth methods and add custom ones.\nexport const graphqlConfigAtom = (slug: IntegrationSlug) =>\n GraphqlClient.query(\"graphql\", \"getConfig\", {\n params: { slug: String(slug) },\n timeToLive: \"15 seconds\",\n reactivityKeys: [ReactivityKey.integrations, ReactivityKey.tools],\n });\n\n// ---------------------------------------------------------------------------\n// Mutation atoms\n// ---------------------------------------------------------------------------\n\nexport const addGraphqlIntegration = GraphqlClient.mutation(\"graphql\", \"addIntegration\");\n\n// Merge-append custom auth methods onto an integration's `authenticationTemplate`.\nexport const graphqlConfigure = GraphqlClient.mutation(\"graphql\", \"configure\");\n\n// Optimistically slot a pending row into the shared integration catalog so the\n// integrations list reflects the new GraphQL integration before the server\n// round-trips. The reducer mirrors the catalog `Integration` shape.\nexport const addGraphqlIntegrationOptimistic = integrationsOptimisticAtom.pipe(\n Atom.optimisticFn({\n reducer: (\n current,\n arg: {\n readonly payload: {\n readonly endpoint: string;\n readonly slug?: string;\n readonly name?: string;\n };\n },\n ) =>\n AsyncResult.map(current, (rows) => {\n const slug = (arg.payload.slug ??\n `pending-${Math.random().toString(36).slice(2)}`) as IntegrationSlug;\n const integration = {\n slug,\n kind: \"graphql\",\n name: arg.payload.name ?? arg.payload.endpoint,\n description: arg.payload.name ?? arg.payload.endpoint,\n canRemove: false,\n canRefresh: false,\n authMethods: [],\n };\n return [integration, ...rows.filter((row) => row.slug !== slug)].sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n }),\n fn: addGraphqlIntegration,\n }),\n);\n","import { createPluginAtomClient } from \"@executor-js/sdk/client\";\nimport {\n getExecutorApiBaseUrl,\n getExecutorServerAuthorizationHeader,\n} from \"@executor-js/react/api/server-connection\";\nimport { GraphqlGroup } from \"../api/group\";\n\nexport const GraphqlClient = createPluginAtomClient(GraphqlGroup, {\n baseUrl: getExecutorApiBaseUrl,\n authorizationHeader: getExecutorServerAuthorizationHeader,\n});\n","import { HttpApiEndpoint, HttpApiGroup } from \"effect/unstable/httpapi\";\nimport { Schema } from \"effect\";\nimport { InternalError, IntegrationAlreadyExistsError } from \"@executor-js/sdk/shared\";\n\nimport { GraphqlIntrospectionError, GraphqlExtractionError } from \"../sdk/errors\";\nimport { GraphqlAuthMethod, GraphqlAuthMethodInput } from \"../sdk/types\";\n\n// ---------------------------------------------------------------------------\n// Params\n// ---------------------------------------------------------------------------\n\nconst IntegrationParams = {\n slug: Schema.String,\n};\n\n// ---------------------------------------------------------------------------\n// Payloads\n// ---------------------------------------------------------------------------\n\nconst AddIntegrationPayload = Schema.Struct({\n endpoint: Schema.String,\n slug: Schema.optional(Schema.String),\n name: Schema.optional(Schema.String),\n description: Schema.optional(Schema.String),\n introspectionJson: Schema.optional(Schema.String),\n headers: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n queryParams: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n authenticationTemplate: Schema.optional(Schema.Array(GraphqlAuthMethodInput)),\n});\n\n// The `configure` payload — the custom auth methods to merge-append onto the\n// integration's `authenticationTemplate`. Reuses the same input schema as\n// `addIntegration` (slug optional — the backend backfills it) so a custom\n// apikey method round-trips identically.\nconst ConfigurePayload = Schema.Struct({\n authenticationTemplate: Schema.Array(GraphqlAuthMethodInput),\n mode: Schema.optional(Schema.Literals([\"merge\", \"replace\"])),\n});\n\n// ---------------------------------------------------------------------------\n// Responses\n// ---------------------------------------------------------------------------\n\nconst AddIntegrationResponse = Schema.Struct({\n slug: Schema.String,\n name: Schema.String,\n});\n\n// The integration config surfaced for the configure UX. Carries the\n// `authenticationTemplate` the configure / custom-method flow reads/writes.\n// The introspection snapshot is deliberately NOT served: it's a multi-MB\n// build artifact in the plugin blob store, and no client reads it.\nconst GraphqlConfigView = Schema.Struct({\n endpoint: Schema.String,\n name: Schema.String,\n headers: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n queryParams: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n authenticationTemplate: Schema.Array(GraphqlAuthMethod),\n});\n\n// The configure result — the merged `authenticationTemplate` after the new\n// custom methods were appended/replaced.\nconst ConfigureResponse = Schema.Struct({\n authenticationTemplate: Schema.Array(GraphqlAuthMethod),\n});\n\n// ---------------------------------------------------------------------------\n// Errors with HTTP status\n// ---------------------------------------------------------------------------\n\nconst IntrospectionError = GraphqlIntrospectionError.annotate({\n httpApiStatus: 400,\n});\nconst ExtractionError = GraphqlExtractionError.annotate({ httpApiStatus: 400 });\n\n// ---------------------------------------------------------------------------\n// Group — the GraphQL HTTP surface over integrations.\n//\n// Plugin SDK errors (GraphqlIntrospectionError etc.) are declared once at the\n// group level via `.addError(...)`. `InternalError` is the shared opaque-by-\n// schema 500 surface translated from `StorageError` by `withCapture` at the\n// HTTP edge.\n// ---------------------------------------------------------------------------\n\nconst GraphqlErrors = [\n InternalError,\n IntrospectionError,\n ExtractionError,\n IntegrationAlreadyExistsError,\n] as const;\n\nexport const GraphqlGroup = HttpApiGroup.make(\"graphql\")\n .add(\n HttpApiEndpoint.post(\"addIntegration\", \"/graphql/integrations\", {\n payload: AddIntegrationPayload,\n success: AddIntegrationResponse,\n error: GraphqlErrors,\n }),\n )\n .add(\n HttpApiEndpoint.get(\"getIntegration\", \"/graphql/integrations/:slug\", {\n params: IntegrationParams,\n success: Schema.NullOr(Schema.Unknown),\n error: GraphqlErrors,\n }),\n )\n .add(\n HttpApiEndpoint.get(\"getConfig\", \"/graphql/integrations/:slug/config\", {\n params: IntegrationParams,\n success: Schema.NullOr(GraphqlConfigView),\n error: GraphqlErrors,\n }),\n )\n .add(\n HttpApiEndpoint.post(\"configure\", \"/graphql/integrations/:slug/config\", {\n params: IntegrationParams,\n payload: ConfigurePayload,\n success: ConfigureResponse,\n error: GraphqlErrors,\n }),\n );\n","// ---------------------------------------------------------------------------\n// GraphQL ↔ generic auth-method converters — a thin oauth adapter over the\n// shared codec (`@executor-js/react/lib/shared-auth-method-codec`). The\n// apikey/none paths (multi-placement, multi-variable) live in the shared\n// codec; GraphQL only contributes its oauth flavor: endpoint-less methods that\n// render the connection's access token as a bearer header at invoke time\n// (optionally overriding the header name / prefix).\n// ---------------------------------------------------------------------------\n\nimport { AuthTemplateSlug } from \"@executor-js/sdk/shared\";\nimport type { AuthTemplateEditorValue } from \"@executor-js/react/components/auth-template-editor\";\nimport type { AuthMethod, Placement } from \"@executor-js/react/lib/auth-placements\";\nimport {\n wireAuthInputFromShared,\n authMethodFromSharedTemplate,\n editorValueFromSharedMethod,\n sharedMethodInputFromEditorValue,\n wirePlacementsFromEditor,\n} from \"@executor-js/react/lib/shared-auth-method-codec\";\n\nimport type {\n GraphqlAuthMethod,\n GraphqlAuthMethodInput,\n GraphqlCanonicalAuthMethodInput,\n} from \"../sdk/types\";\n\nconst oauthAuthMethod = (slug: string): AuthMethod => ({\n id: slug,\n label: \"OAuth\",\n kind: \"oauth\",\n source: slug.startsWith(\"custom_\") ? \"custom\" : \"spec\",\n template: AuthTemplateSlug.make(slug),\n placements: [],\n oauth: {},\n});\n\n/** Convert a generic editor value into one GraphQL auth-method input (no slug\n * — the backend assigns carrier-derived slugs). An apikey value keeps every\n * named placement (headers and query params mix freely); one with no usable\n * placement falls back to `none`. */\nexport function graphqlAuthMethodInputFromEditorValue(\n value: AuthTemplateEditorValue,\n): GraphqlAuthMethodInput {\n if (value.kind === \"oauth\") return { kind: \"oauth2\" };\n return (sharedMethodInputFromEditorValue(value) ?? { kind: \"none\" }) as GraphqlAuthMethodInput;\n}\n\n/** Convert one stored GraphQL method into the generic editor value. */\nexport function editorValueFromGraphqlAuthMethod(\n method: GraphqlAuthMethod,\n): AuthTemplateEditorValue {\n if (method.kind === \"oauth2\") {\n // GraphQL oauth methods store no endpoints — only the bearer rendering.\n return { kind: \"oauth\", authorizationUrl: \"\", tokenUrl: \"\", scopes: [] };\n }\n return editorValueFromSharedMethod(method);\n}\n\n/** Project the stored methods into the generic `AuthMethod[]` the hub renders.\n * Mirrors the server's `describeGraphqlAuthMethods`; `custom_` slugs mark\n * user-created methods (removable from the hub). */\nexport function authMethodsFromConfig(methods: readonly GraphqlAuthMethod[]): AuthMethod[] {\n return methods.map((method: GraphqlAuthMethod): AuthMethod => {\n if (method.kind === \"oauth2\") return oauthAuthMethod(method.slug);\n return authMethodFromSharedTemplate(method);\n });\n}\n\n/** Build the GraphQL method input for a custom method from generic placements\n * — ONE method carrying every named placement (header + query mix in a single\n * method; each placement renders from its own input variable, or shares one).\n * Empty when no placement is usable. */\nexport function graphqlAuthMethodInputsFromPlacements(\n placements: readonly Placement[],\n): GraphqlAuthMethodInput[] {\n const wire = wirePlacementsFromEditor(placements);\n if (wire.length === 0) return [];\n return [graphqlWireAuthInput({ kind: \"apikey\", placements: wire })];\n}\n\n/** Serialize a canonical method into the wire input union (apikey → the\n * request-shaped dialect; none/oauth2 pass through). */\nexport const graphqlWireAuthInput = (\n method: GraphqlAuthMethod | GraphqlCanonicalAuthMethodInput,\n): GraphqlAuthMethodInput => wireAuthInputFromShared(method) as GraphqlAuthMethodInput;\n"],"mappings":"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","names":[]}