@sponson/adapters 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/algolia.d.ts +6 -0
- package/dist/algolia.js +151 -0
- package/dist/algolia.js.map +1 -0
- package/dist/clerk.js +1 -1
- package/dist/clerk.js.map +1 -1
- package/dist/cloudflare.d.ts +25 -0
- package/dist/cloudflare.js +310 -0
- package/dist/cloudflare.js.map +1 -0
- package/dist/common.d.ts +2 -6
- package/dist/common.js.map +1 -1
- package/dist/digest.d.ts +46 -0
- package/dist/digest.js +129 -0
- package/dist/digest.js.map +1 -0
- package/dist/digitalocean.d.ts +5 -0
- package/dist/digitalocean.js +243 -0
- package/dist/digitalocean.js.map +1 -0
- package/dist/http-adapter-action.d.ts +63 -0
- package/dist/http-adapter-action.js +369 -0
- package/dist/http-adapter-action.js.map +1 -0
- package/dist/http-adapter-auth.d.ts +88 -0
- package/dist/http-adapter-auth.js +437 -0
- package/dist/http-adapter-auth.js.map +1 -0
- package/dist/http-adapter-client.d.ts +51 -0
- package/dist/http-adapter-client.js +156 -0
- package/dist/http-adapter-client.js.map +1 -0
- package/dist/http-adapter-graphql.d.ts +39 -0
- package/dist/http-adapter-graphql.js +157 -0
- package/dist/http-adapter-graphql.js.map +1 -0
- package/dist/http-adapter-list.d.ts +33 -0
- package/dist/http-adapter-list.js +421 -0
- package/dist/http-adapter-list.js.map +1 -0
- package/dist/http-adapter-resource.d.ts +29 -0
- package/dist/http-adapter-resource.js +462 -0
- package/dist/http-adapter-resource.js.map +1 -0
- package/dist/http-adapter-spec.d.ts +216 -0
- package/dist/http-adapter-spec.js +660 -0
- package/dist/http-adapter-spec.js.map +1 -0
- package/dist/http-adapter.d.ts +16 -0
- package/dist/http-adapter.js +28 -0
- package/dist/http-adapter.js.map +1 -0
- package/dist/http.d.ts +61 -2
- package/dist/http.js +79 -18
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.js +24 -2
- package/dist/index.js.map +1 -1
- package/dist/launchdarkly.d.ts +15 -0
- package/dist/launchdarkly.js +337 -0
- package/dist/launchdarkly.js.map +1 -0
- package/dist/manual.d.ts +13 -0
- package/dist/manual.js +201 -0
- package/dist/manual.js.map +1 -0
- package/dist/neon.js +1 -1
- package/dist/neon.js.map +1 -1
- package/dist/netlify.d.ts +18 -0
- package/dist/netlify.js +436 -0
- package/dist/netlify.js.map +1 -0
- package/dist/planetscale.d.ts +10 -0
- package/dist/planetscale.js +311 -0
- package/dist/planetscale.js.map +1 -0
- package/dist/providers.d.ts +26 -0
- package/dist/providers.js +36 -0
- package/dist/providers.js.map +1 -0
- package/dist/recipes.d.ts +167 -0
- package/dist/recipes.js +246 -0
- package/dist/recipes.js.map +1 -0
- package/dist/secrets.d.ts +44 -0
- package/dist/secrets.js +279 -0
- package/dist/secrets.js.map +1 -1
- package/dist/sigv4.d.ts +56 -0
- package/dist/sigv4.js +118 -0
- package/dist/sigv4.js.map +1 -0
- package/dist/supabase.d.ts +9 -0
- package/dist/supabase.js +385 -0
- package/dist/supabase.js.map +1 -0
- package/dist/vercel.js +1 -1
- package/dist/vercel.js.map +1 -1
- package/dist/xata.d.ts +8 -0
- package/dist/xata.js +142 -0
- package/dist/xata.js.map +1 -0
- package/dist/xml.d.ts +25 -0
- package/dist/xml.js +211 -0
- package/dist/xml.js.map +1 -0
- package/package.json +11 -4
- package/recipes/amplify.yaml +147 -0
- package/recipes/auth0.yaml +178 -0
- package/recipes/azure_swa.yaml +116 -0
- package/recipes/cloud_run.yaml +97 -0
- package/recipes/cloudflare.yaml +108 -0
- package/recipes/cockroachdb.yaml +132 -0
- package/recipes/configcat.yaml +123 -0
- package/recipes/datadog.yaml +136 -0
- package/recipes/firebase.yaml +84 -0
- package/recipes/flagsmith.yaml +98 -0
- package/recipes/fly.yaml +97 -0
- package/recipes/fly_machines.yaml +67 -0
- package/recipes/gcs.yaml +102 -0
- package/recipes/github.yaml +123 -0
- package/recipes/growthbook.yaml +124 -0
- package/recipes/heroku.yaml +98 -0
- package/recipes/honeycomb.yaml +89 -0
- package/recipes/inngest.yaml +97 -0
- package/recipes/kinde.yaml +120 -0
- package/recipes/mongodb_atlas.yaml +119 -0
- package/recipes/okta.yaml +177 -0
- package/recipes/posthog.yaml +127 -0
- package/recipes/postmark.yaml +105 -0
- package/recipes/postmark_server.yaml +93 -0
- package/recipes/prisma.yaml +150 -0
- package/recipes/qstash.yaml +134 -0
- package/recipes/railway.yaml +130 -0
- package/recipes/render.yaml +103 -0
- package/recipes/resend.yaml +130 -0
- package/recipes/s3.yaml +108 -0
- package/recipes/sendgrid.yaml +165 -0
- package/recipes/sentry.yaml +158 -0
- package/recipes/split.yaml +121 -0
- package/recipes/statsig.yaml +124 -0
- package/recipes/stripe.yaml +310 -0
- package/recipes/stytch.yaml +113 -0
- package/recipes/svix.yaml +109 -0
- package/recipes/turso.yaml +98 -0
- package/recipes/unleash.yaml +149 -0
- package/recipes/upstash.yaml +130 -0
- package/recipes/vercel.yaml +116 -0
- package/recipes/workos.yaml +70 -0
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `http.resource`: one object per item in a REST API (a feature flag, a webhook endpoint), declared entirely in the
|
|
3
|
+
* plan. See ADR 0017 and docs/plan-format.md#httpresource.
|
|
4
|
+
*
|
|
5
|
+
* - Key: where the object lives and what identifies it there: `<find.path>[<field>=<value>,…]` when it is located
|
|
6
|
+
* by `find`, else its `read.path` (a URL that names it). A GraphQL `find` or `read` stands in for the path as
|
|
7
|
+
* `graphql:<root field>(<variables>)<data path>`. The provider block (base URL, credential) is part of the ledger
|
|
8
|
+
* identity already.
|
|
9
|
+
* - Id: the request that removes it, `DELETE /things/<id>` (`KEEP /things/<id>` with `destroy: keep`), plus any
|
|
10
|
+
* `gone_status`, or `GRAPHQL {"query":…,"variables":…}` for a GraphQL delete, so `destroy` needs nothing but the
|
|
11
|
+
* ledger. A new provider id makes a new record id: replaced
|
|
12
|
+
* outside Sponson.
|
|
13
|
+
* - Hash: `sha256(canonicalJson({ <field>: <value> }))` over the declared `fields` only; `diff` compares the same
|
|
14
|
+
* form, so a console edit of a declared field is `changed` drift and anything else the provider stores is not.
|
|
15
|
+
*/
|
|
16
|
+
import { SponsonError, canonicalJson, sha256 } from "@sponson/core";
|
|
17
|
+
import { ABSENT, SENSITIVE, assertNoPending, desiredSide, paramError } from "./common.js";
|
|
18
|
+
import { isObject, isProviderError, listAll } from "./http.js";
|
|
19
|
+
import { failedWith, httpClient, idOf, itemOf, literalOf, withLineCredential, write } from "./http-adapter-client.js";
|
|
20
|
+
import { ADAPTER, apiBlock, apiEnvironment, at, credentialInputs, bodyOf, deepMerge, fieldTokens, fillPath, firstMarker, isKeep, parseResource, pointerTokens, projection, requestHeaders, resourceOutputs, stateHash } from "./http-adapter-spec.js";
|
|
21
|
+
import { fillVariables, graphqlRequest, requestName, usesId, variablesPending } from "./http-adapter-graphql.js";
|
|
22
|
+
/** What `read` found, kept for `diff` and `apply` of the same inspection (the engine passes the same object). */
|
|
23
|
+
const found = new WeakMap();
|
|
24
|
+
/** The resource key, or undefined while a value it depends on is pending. */
|
|
25
|
+
export function resourceKey(spec) {
|
|
26
|
+
if (!spec.find)
|
|
27
|
+
return spec.read.graphql ? graphqlKey(spec.read.graphql, spec.itemPath) : fillPath(spec.read.path, spec.vars);
|
|
28
|
+
const path = spec.find.graphql ? graphqlKey(spec.find.graphql, spec.find.listPath) : fillPath(spec.find.path, spec.vars);
|
|
29
|
+
const match = Object.entries(spec.find.match).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
30
|
+
if (path === undefined || match.some(([, v]) => firstMarker(v) !== undefined || isKeep(v)))
|
|
31
|
+
return undefined;
|
|
32
|
+
return `${path}[${match.map(([f, v]) => `${f}=${typeof v === "string" ? v : canonicalJson(v)}`).join(",")}]`;
|
|
33
|
+
}
|
|
34
|
+
/** A GraphQL locating request as a key: its root field, its variables and where the result is; undefined while pending. */
|
|
35
|
+
function graphqlKey(g, fallbackPath) {
|
|
36
|
+
return variablesPending(g.variables) ? undefined : `${requestName(g)}${g.dataPath ?? fallbackPath}`;
|
|
37
|
+
}
|
|
38
|
+
/** True when any request of the line is GraphQL: its client then speaks JSON, whatever the API's encoding. */
|
|
39
|
+
function isGraphql(spec) {
|
|
40
|
+
return [spec.find, spec.read, spec.create, spec.update, spec.delete].some((r) => r?.graphql !== undefined);
|
|
41
|
+
}
|
|
42
|
+
/** The client for a line's requests. */
|
|
43
|
+
function clientOf(actx, spec) {
|
|
44
|
+
return httpClient(actx, isGraphql(spec) ? { encoding: "json" } : {});
|
|
45
|
+
}
|
|
46
|
+
function label(spec, key) {
|
|
47
|
+
return `${spec.api} ${key}`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The record id: the request that removes the object (or `KEEP`), the statuses that mean it is gone, and the body
|
|
51
|
+
* of an archiving `POST` (canonical JSON, last).
|
|
52
|
+
*/
|
|
53
|
+
function locator(spec, id) {
|
|
54
|
+
if (spec.delete.graphql) {
|
|
55
|
+
const g = spec.delete.graphql;
|
|
56
|
+
const request = canonicalJson({ query: g.query, variables: fillVariables(g.variables, id) });
|
|
57
|
+
return `${spec.destroy === "keep" ? "KEEP " : ""}GRAPHQL ${request}`;
|
|
58
|
+
}
|
|
59
|
+
const method = spec.destroy === "keep" ? "KEEP" : spec.delete.method;
|
|
60
|
+
const gone = spec.goneStatus.length ? ` gone=${spec.goneStatus.join(",")}` : "";
|
|
61
|
+
const body = spec.delete.body ? ` body=${canonicalJson(bodyWithId(spec.delete.body, id))}` : "";
|
|
62
|
+
return `${method} ${fillPath(spec.delete.path, spec.vars, id)}${gone}${body}`;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A delete body with every `{id}` in its strings replaced by the object's id: a delete that names the object in its
|
|
66
|
+
* body (`{ public_ids: ["{id}"] }`). The filled body is part of the record id, so destroy still needs only the ledger.
|
|
67
|
+
*/
|
|
68
|
+
function bodyWithId(body, id) {
|
|
69
|
+
if (typeof body === "string")
|
|
70
|
+
return body.split("{id}").join(id);
|
|
71
|
+
if (Array.isArray(body))
|
|
72
|
+
return body.map((v) => bodyWithId(v, id));
|
|
73
|
+
if (isObject(body))
|
|
74
|
+
return Object.fromEntries(Object.entries(body).map(([k, v]) => [k, bodyWithId(v, id)]));
|
|
75
|
+
return body;
|
|
76
|
+
}
|
|
77
|
+
/** `actx` for a line: its own `credential` when it has one (`withLineCredential`). */
|
|
78
|
+
function lineContext(actx, spec) {
|
|
79
|
+
return withLineCredential(actx, spec.credential);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* What the ledger knows a line's object by: its key, and its record id with `id` standing for the provider's id.
|
|
83
|
+
* The recipe identity lock (recipes.test.ts) pins it per recipe op.
|
|
84
|
+
*/
|
|
85
|
+
export function resourceIdentity(spec, id) {
|
|
86
|
+
return { key: resourceKey(spec), id: locator(spec, id) };
|
|
87
|
+
}
|
|
88
|
+
/** The request a record id names. */
|
|
89
|
+
function parseLocator(id) {
|
|
90
|
+
const g = /^(KEEP )?GRAPHQL (\{.*\})$/s.exec(id);
|
|
91
|
+
if (g) {
|
|
92
|
+
try {
|
|
93
|
+
const r = JSON.parse(g[2]);
|
|
94
|
+
if (typeof r.query === "string" && isObject(r.variables))
|
|
95
|
+
return { method: g[1] ? "KEEP" : "GRAPHQL", path: "", gone: [], body: {}, graphql: { query: r.query, variables: r.variables, idempotent: true } };
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// reported by the caller
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
const m = /^(DELETE|POST|KEEP) (\/\S*)(?: gone=([\d,]+))?(?: body=(\{.*\}))?$/.exec(id);
|
|
103
|
+
if (!m)
|
|
104
|
+
return null;
|
|
105
|
+
let body = {};
|
|
106
|
+
try {
|
|
107
|
+
body = m[4] ? JSON.parse(m[4]) : {};
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
return isObject(body) ? { method: m[1], path: m[2], gone: m[3] ? m[3].split(",").map(Number) : [], body } : null;
|
|
113
|
+
}
|
|
114
|
+
function fieldNames(spec) {
|
|
115
|
+
return Object.keys(spec.fields);
|
|
116
|
+
}
|
|
117
|
+
/** The desired state; `{ keep: true }` fields take the live value. */
|
|
118
|
+
function desiredState(spec, live) {
|
|
119
|
+
return Object.fromEntries(Object.entries(spec.fields).map(([f, v]) => [f, isKeep(v) ? (at(live, fieldTokens(f)) ?? null) : v]));
|
|
120
|
+
}
|
|
121
|
+
function record(spec, key, l) {
|
|
122
|
+
return { key, id: locator(spec, l.id), hash: stateHash(projection(l.item, fieldNames(spec))), label: label(spec, key) };
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The outputs read from `item`. A `once` output only from `revealed`, the answer of the create that made the object:
|
|
126
|
+
* anywhere else the provider does not show it, and a value taken from a read would be a fake (ADR 0018).
|
|
127
|
+
*/
|
|
128
|
+
function outputsOf(spec, item, id, revealed = false) {
|
|
129
|
+
const out = { id };
|
|
130
|
+
for (const [name, d] of Object.entries(spec.outputs)) {
|
|
131
|
+
if (d.once && !revealed)
|
|
132
|
+
continue;
|
|
133
|
+
const v = literalOf(at(item, pointerTokens(d.path)));
|
|
134
|
+
if (v !== undefined)
|
|
135
|
+
out[name] = v;
|
|
136
|
+
}
|
|
137
|
+
return out;
|
|
138
|
+
}
|
|
139
|
+
function matches(item, match) {
|
|
140
|
+
return Object.entries(match).every(([f, v]) => canonicalJson(at(item, fieldTokens(f)) ?? null) === canonicalJson(v));
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* The object's id at `id_path`. An object located by GraphQL may have none (a variable is named by the request
|
|
144
|
+
* itself); unless a request needs `{id}`, the resource key then stands in for it.
|
|
145
|
+
*/
|
|
146
|
+
function idFor(spec, item, key) {
|
|
147
|
+
const id = idOf(item, spec.idPath);
|
|
148
|
+
if (id !== undefined || key === undefined || !isGraphql(spec))
|
|
149
|
+
return id;
|
|
150
|
+
const needsId = [spec.read, spec.update, spec.delete].some((r) => r?.graphql && usesId(r.graphql.variables)) || placeholders(spec);
|
|
151
|
+
return needsId ? undefined : key;
|
|
152
|
+
}
|
|
153
|
+
/** True when a REST path of the line uses `{id}`. */
|
|
154
|
+
function placeholders(spec) {
|
|
155
|
+
return [spec.read, spec.update, spec.delete].some((r) => r !== undefined && !r.graphql && r.path.includes("{id}"));
|
|
156
|
+
}
|
|
157
|
+
function noId(spec, where) {
|
|
158
|
+
return new SponsonError("PROVIDER_RESPONSE", `${ADAPTER}: ${where} has no id at \`id_path\` ${spec.idPath || '""'}`, { adapter: ADAPTER, param: "id_path" });
|
|
159
|
+
}
|
|
160
|
+
/** Every object of a `find` list, following `find.next` cursors when declared. */
|
|
161
|
+
function listObjects(api, find, path) {
|
|
162
|
+
return listAll(api, path, (body) => {
|
|
163
|
+
const list = at(body, pointerTokens(find.listPath));
|
|
164
|
+
if (!Array.isArray(list))
|
|
165
|
+
throw new SponsonError("PROVIDER_RESPONSE", `${ADAPTER}: GET ${path}: no list at \`find.list_path\` ${find.listPath || '""'}`, { adapter: ADAPTER, param: "find.list_path" });
|
|
166
|
+
const cursor = find.next ? at(body, pointerTokens(find.next.path)) : undefined;
|
|
167
|
+
const next = find.next && (typeof cursor === "string" || typeof cursor === "number") && cursor !== "" ? { [find.next.param]: String(cursor) } : null;
|
|
168
|
+
return { items: list.filter(isObject), next };
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/** GET a path that names the object; null when it answers 404 (or a declared `gone_status`). */
|
|
172
|
+
async function getObject(api, spec, path) {
|
|
173
|
+
let body;
|
|
174
|
+
try {
|
|
175
|
+
body = await api.get(path);
|
|
176
|
+
}
|
|
177
|
+
catch (e) {
|
|
178
|
+
if (failedWith(e, "PROVIDER_NOT_FOUND", spec.goneStatus))
|
|
179
|
+
return null;
|
|
180
|
+
throw e;
|
|
181
|
+
}
|
|
182
|
+
const item = itemOf(body, spec.itemPath);
|
|
183
|
+
if (!item)
|
|
184
|
+
throw new SponsonError("PROVIDER_RESPONSE", `${ADAPTER}: GET ${path}: no object at \`item_path\` ${spec.itemPath || '""'}`, { adapter: ADAPTER, param: "item_path" });
|
|
185
|
+
return item;
|
|
186
|
+
}
|
|
187
|
+
/** The value at a GraphQL request's result path: null when absent, a scalar as `{ value }`. */
|
|
188
|
+
function graphqlItem(data, path, name) {
|
|
189
|
+
const v = at(data, pointerTokens(path));
|
|
190
|
+
if (v === undefined || v === null)
|
|
191
|
+
return null;
|
|
192
|
+
if (isObject(v))
|
|
193
|
+
return v;
|
|
194
|
+
if (Array.isArray(v))
|
|
195
|
+
throw new SponsonError("PROVIDER_RESPONSE", `${ADAPTER}: GraphQL ${name}: a list where the object should be (check \`data_path\`)`, { adapter: ADAPTER, param: "data_path" });
|
|
196
|
+
return { value: v };
|
|
197
|
+
}
|
|
198
|
+
/** Run a locating GraphQL query and take the object it answers; null when absent or "not found". */
|
|
199
|
+
async function getGraphqlObject(actx, api, spec, g, id) {
|
|
200
|
+
try {
|
|
201
|
+
return graphqlItem(await graphqlRequest(api, g, id, actx.redact, false), g.dataPath ?? spec.itemPath, requestName(g));
|
|
202
|
+
}
|
|
203
|
+
catch (e) {
|
|
204
|
+
if (failedWith(e, "PROVIDER_NOT_FOUND", []))
|
|
205
|
+
return null;
|
|
206
|
+
throw e;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/** The objects a GraphQL `find` lists. */
|
|
210
|
+
async function graphqlObjects(actx, api, find, g) {
|
|
211
|
+
const data = await graphqlRequest(api, g, undefined, actx.redact, false);
|
|
212
|
+
const list = at(data, pointerTokens(g.dataPath ?? find.listPath));
|
|
213
|
+
if (list === null || list === undefined)
|
|
214
|
+
return [];
|
|
215
|
+
if (!Array.isArray(list))
|
|
216
|
+
throw new SponsonError("PROVIDER_RESPONSE", `${ADAPTER}: GraphQL ${requestName(g)}: no list at ${g.dataPath ?? find.listPath}`, { adapter: ADAPTER, param: "find.list_path" });
|
|
217
|
+
return list.filter(isObject);
|
|
218
|
+
}
|
|
219
|
+
/** The detail of a found object: by its `read` request, REST or GraphQL. */
|
|
220
|
+
async function readDetail(actx, api, spec, id) {
|
|
221
|
+
const read = spec.read;
|
|
222
|
+
if (read.graphql)
|
|
223
|
+
return getGraphqlObject(actx, api, spec, read.graphql, id);
|
|
224
|
+
return getObject(api, spec, fillPath(read.path, spec.vars, id));
|
|
225
|
+
}
|
|
226
|
+
async function locateByFind(actx, api, spec, find, key) {
|
|
227
|
+
const path = find.graphql ? requestName(find.graphql) : fillPath(find.path, spec.vars);
|
|
228
|
+
const listed = find.graphql ? await graphqlObjects(actx, api, find, find.graphql) : await listObjects(api, find, path);
|
|
229
|
+
const hits = listed.filter((i) => matches(i, find.match));
|
|
230
|
+
if (hits.length === 0)
|
|
231
|
+
return null;
|
|
232
|
+
if (hits.length > 1)
|
|
233
|
+
throw paramError(ADAPTER, `\`find.match\` matches ${hits.length} objects at ${path}; add fields until it identifies one`, "find.match");
|
|
234
|
+
const id = idFor(spec, hits[0], key);
|
|
235
|
+
if (id === undefined)
|
|
236
|
+
throw noId(spec, `an object listed by ${find.graphql ? path : `GET ${path}`}`);
|
|
237
|
+
if (!spec.read)
|
|
238
|
+
return { id, item: hits[0] };
|
|
239
|
+
const item = await readDetail(actx, api, spec, id);
|
|
240
|
+
return item ? { id, item } : null;
|
|
241
|
+
}
|
|
242
|
+
/** Find the object the line declares; null when it does not exist. */
|
|
243
|
+
async function locate(actx, api, spec) {
|
|
244
|
+
const key = resourceKey(spec);
|
|
245
|
+
if (spec.find)
|
|
246
|
+
return locateByFind(actx, api, spec, spec.find, key);
|
|
247
|
+
const read = spec.read;
|
|
248
|
+
const item = read.graphql ? await getGraphqlObject(actx, api, spec, read.graphql, undefined) : await getObject(api, spec, fillPath(read.path, spec.vars));
|
|
249
|
+
if (!item)
|
|
250
|
+
return null;
|
|
251
|
+
const id = idFor(spec, item, key);
|
|
252
|
+
if (id === undefined)
|
|
253
|
+
throw noId(spec, read.graphql ? requestName(read.graphql) : `GET ${fillPath(read.path, spec.vars)}`);
|
|
254
|
+
return { id, item };
|
|
255
|
+
}
|
|
256
|
+
/** A side showing a whole state, or the first reference it waits on. */
|
|
257
|
+
function stateSide(state) {
|
|
258
|
+
const marker = firstMarker(state);
|
|
259
|
+
return marker ? desiredSide(marker, false) : { state: "literal", value: canonicalJson(state) };
|
|
260
|
+
}
|
|
261
|
+
function noUpdate(spec, key) {
|
|
262
|
+
return paramError(ADAPTER, `${label(spec, key)}: the declared \`fields\` differ from the live object, but the line declares no \`update\` request`, "update");
|
|
263
|
+
}
|
|
264
|
+
function diffExisting(spec, key, current, live) {
|
|
265
|
+
const lbl = label(spec, key);
|
|
266
|
+
const before = live ? { state: "literal", value: canonicalJson(projection(live.item, fieldNames(spec))) } : SENSITIVE;
|
|
267
|
+
if (firstMarker(spec.fields) !== undefined)
|
|
268
|
+
return { key, kind: "update", label: lbl, before, after: stateSide(spec.fields) };
|
|
269
|
+
const desired = desiredState(spec, live?.item);
|
|
270
|
+
if (stateHash(desired) === current.hash)
|
|
271
|
+
return { key, kind: "unchanged", label: lbl };
|
|
272
|
+
if (!spec.update)
|
|
273
|
+
throw noUpdate(spec, key);
|
|
274
|
+
return { key, kind: "update", label: lbl, before, after: stateSide(desired) };
|
|
275
|
+
}
|
|
276
|
+
function keepWithoutObject(spec, key) {
|
|
277
|
+
return paramError(ADAPTER, `${label(spec, key)} declares a field \`{ keep: true }\` but does not exist, so there is no value to keep. Give it a value or remove it.`, "fields");
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* The `Idempotency-Key` of a create: the same for every attempt of this create in this commit (a retried request
|
|
281
|
+
* is answered from the provider's record), different for another key, scope, commit or body.
|
|
282
|
+
*/
|
|
283
|
+
function idempotencyKey(actx, key, body) {
|
|
284
|
+
const { env, scope, git } = actx.ctx;
|
|
285
|
+
return `sponson-${sha256(`${env}|${scope}|${git.sha}|${key}|${canonicalJson(body)}`).slice(0, 40)}`;
|
|
286
|
+
}
|
|
287
|
+
/** Send the create; null when the provider says it exists already (a conflict, or a declared `exists_status`). */
|
|
288
|
+
async function sendCreate(actx, spec, key, path, body) {
|
|
289
|
+
const { method, idempotencyKey: withKey, contentType, graphql } = spec.create;
|
|
290
|
+
if (graphql)
|
|
291
|
+
return sendGraphqlCreate(actx, spec, graphql);
|
|
292
|
+
const headers = { ...requestHeaders(spec.create, "create"), ...(withKey ? { "Idempotency-Key": idempotencyKey(actx, key, body) } : {}) };
|
|
293
|
+
const api = httpClient(actx, { ...(contentType ? { contentType } : {}), headers });
|
|
294
|
+
try {
|
|
295
|
+
// With an idempotency key, a create whose answer was lost can be sent again: the provider answers it once.
|
|
296
|
+
return { response: await write(api, method, path, body, method === "PUT" || withKey) };
|
|
297
|
+
}
|
|
298
|
+
catch (e) {
|
|
299
|
+
if (failedWith(e, "PROVIDER_CONFLICT", spec.existsStatus))
|
|
300
|
+
return null;
|
|
301
|
+
throw e;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/** A GraphQL create: the mutation; its answer at the result path (when an object) stands for the created object. */
|
|
305
|
+
async function sendGraphqlCreate(actx, spec, g) {
|
|
306
|
+
try {
|
|
307
|
+
const data = await graphqlRequest(clientOf(actx, spec), g, undefined, actx.redact, true);
|
|
308
|
+
const v = at(data, pointerTokens(g.dataPath ?? spec.itemPath));
|
|
309
|
+
return { response: isObject(v) ? { [CREATED]: v } : {} };
|
|
310
|
+
}
|
|
311
|
+
catch (e) {
|
|
312
|
+
if (failedWith(e, "PROVIDER_CONFLICT", []))
|
|
313
|
+
return null;
|
|
314
|
+
throw e;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
/** Where `sendGraphqlCreate` puts the created object, so `create` reads it with item_path `/<CREATED>`. */
|
|
318
|
+
const CREATED = "created";
|
|
319
|
+
/** The created object in a create's answer. */
|
|
320
|
+
function createdItem(spec, response) {
|
|
321
|
+
return spec.create.graphql ? itemOf(response, `/${CREATED}`) : itemOf(response, spec.itemPath);
|
|
322
|
+
}
|
|
323
|
+
async function create(actx, api, spec, key) {
|
|
324
|
+
if (Object.values(spec.fields).some(isKeep))
|
|
325
|
+
throw keepWithoutObject(spec, key);
|
|
326
|
+
const path = fillPath(spec.create.path, spec.vars);
|
|
327
|
+
const declared = spec.create.sendFields ? deepMerge(bodyOf(spec.find?.match ?? {}), bodyOf(spec.fields)) : {};
|
|
328
|
+
const body = deepMerge(declared, spec.create.body);
|
|
329
|
+
await actx.intend([key]);
|
|
330
|
+
actx.log(`create ${label(spec, key)}`);
|
|
331
|
+
const sent = await sendCreate(actx, spec, key, path, body);
|
|
332
|
+
if (!sent) {
|
|
333
|
+
// It exists already: someone else's, or ours from an attempt whose answer was lost. Not created by this call;
|
|
334
|
+
// the engine claims it when an earlier intent of ours named it.
|
|
335
|
+
const existing = await locate(actx, api, spec);
|
|
336
|
+
if (!existing)
|
|
337
|
+
throw new SponsonError("PROVIDER_CONFLICT", `${ADAPTER}: ${label(spec, key)}: the provider says it exists, but it cannot be found with the line's \`find\`/\`read\``, { adapter: ADAPTER, key });
|
|
338
|
+
return { resources: [record(spec, key, existing)], outputs: outputsOf(spec, existing.item, existing.id), created: [] };
|
|
339
|
+
}
|
|
340
|
+
// `create.locate`: the answer is not the object (the parent it was added to, an acknowledgement).
|
|
341
|
+
let item = spec.create.locate ? undefined : createdItem(spec, sent.response);
|
|
342
|
+
let id = idOf(item, spec.idPath);
|
|
343
|
+
const revealed = id !== undefined;
|
|
344
|
+
if (id === undefined) {
|
|
345
|
+
// Some APIs answer a create with no body (201, 204), with something else, or (GraphQL) with a boolean: find
|
|
346
|
+
// what was created. Found so, it reveals no once-only value.
|
|
347
|
+
const l = await locate(actx, api, spec);
|
|
348
|
+
if (!l)
|
|
349
|
+
throw noId(spec, spec.create.graphql ? `the answer to ${requestName(spec.create.graphql)}` : `the answer to ${spec.create.method} ${path}`);
|
|
350
|
+
({ id, item } = l);
|
|
351
|
+
}
|
|
352
|
+
const resource = { key, id: locator(spec, id), hash: stateHash(desiredState(spec, undefined)), label: label(spec, key) };
|
|
353
|
+
return { resources: [resource], outputs: outputsOf(spec, item, id, revealed), created: [key] };
|
|
354
|
+
}
|
|
355
|
+
/** Send the update (REST, or the GraphQL mutation); the updated object when the answer holds one. */
|
|
356
|
+
async function sendUpdate(actx, api, spec, upd, desired, id) {
|
|
357
|
+
if (upd.graphql) {
|
|
358
|
+
// An update sets state: sending it twice is harmless, so a dropped connection is retried.
|
|
359
|
+
const data = await graphqlRequest(api, { ...upd.graphql, idempotent: true }, id, actx.redact, true);
|
|
360
|
+
const v = at(data, pointerTokens(upd.graphql.dataPath ?? spec.itemPath));
|
|
361
|
+
return isObject(v) ? v : undefined;
|
|
362
|
+
}
|
|
363
|
+
const { method, contentType, sendFields } = upd;
|
|
364
|
+
// PUT replaces the object, so the identifying fields and kept fields are sent back as they are; PATCH and POST
|
|
365
|
+
// send only what the plan sets; `send_fields: false` sends none (the request carries them in headers).
|
|
366
|
+
const fields = !sendFields ? {} : method === "PUT" ? deepMerge(bodyOf(spec.find?.match ?? {}), bodyOf(desired)) : bodyOf(spec.fields, isKeep);
|
|
367
|
+
const path = fillPath(upd.path, spec.vars, id);
|
|
368
|
+
const headers = requestHeaders(upd, "update");
|
|
369
|
+
const client = contentType || Object.keys(headers).length ? httpClient(actx, { ...(contentType ? { contentType } : {}), headers }) : api;
|
|
370
|
+
const response = await write(client, method, path, deepMerge(fields, upd.body), true);
|
|
371
|
+
return itemOf(response, spec.itemPath);
|
|
372
|
+
}
|
|
373
|
+
async function update(actx, api, spec, key, current, live) {
|
|
374
|
+
const l = found.get(live) ?? (await locate(actx, api, spec));
|
|
375
|
+
if (!l)
|
|
376
|
+
return create(actx, api, spec, key);
|
|
377
|
+
const desired = desiredState(spec, l.item);
|
|
378
|
+
if (stateHash(desired) === current.hash)
|
|
379
|
+
return { resources: [current], outputs: live.outputs, created: [] };
|
|
380
|
+
if (!spec.update)
|
|
381
|
+
throw noUpdate(spec, key);
|
|
382
|
+
actx.log(`update ${label(spec, key)}`);
|
|
383
|
+
const item = await sendUpdate(actx, api, spec, spec.update, desired, l.id);
|
|
384
|
+
const resource = { key, id: locator(spec, l.id), hash: stateHash(desired), label: label(spec, key) };
|
|
385
|
+
return { resources: [resource], outputs: { ...live.outputs, ...outputsOf(spec, item, l.id) }, created: [] };
|
|
386
|
+
}
|
|
387
|
+
const PENDING_KEY = "(pending)";
|
|
388
|
+
/**
|
|
389
|
+
* A delete the provider accepted (2xx) but answered with something that is not JSON (Upstash answers `OK`): the
|
|
390
|
+
* answer is never read, so the object is gone all the same.
|
|
391
|
+
*/
|
|
392
|
+
function acceptedWithoutJson(e) {
|
|
393
|
+
if (!isProviderError(e, "PROVIDER_RESPONSE"))
|
|
394
|
+
return false;
|
|
395
|
+
const status = e.details.status;
|
|
396
|
+
return typeof status === "number" && status >= 200 && status < 300;
|
|
397
|
+
}
|
|
398
|
+
/** `http.resource`: one object per item, located by a path or by `find`, its declared `fields` kept as planned. */
|
|
399
|
+
export const resource = {
|
|
400
|
+
outputs: { id: { available: "immediate" } },
|
|
401
|
+
outputsFor: resourceOutputs,
|
|
402
|
+
providerFor: apiBlock,
|
|
403
|
+
credentialInputs: credentialInputs("resource"),
|
|
404
|
+
writesEnvironment: apiEnvironment,
|
|
405
|
+
async read(actx, params) {
|
|
406
|
+
const spec = parseResource(params);
|
|
407
|
+
const key = resourceKey(spec);
|
|
408
|
+
// Nothing can exist under a credential that does not exist yet (the line it comes from is still to be created).
|
|
409
|
+
if (key === undefined || firstMarker(spec.credential) !== undefined)
|
|
410
|
+
return null;
|
|
411
|
+
actx = lineContext(actx, spec);
|
|
412
|
+
const l = await locate(actx, clientOf(actx, spec), spec);
|
|
413
|
+
if (!l)
|
|
414
|
+
return null;
|
|
415
|
+
const state = { resources: [record(spec, key, l)], outputs: outputsOf(spec, l.item, l.id) };
|
|
416
|
+
found.set(state, l);
|
|
417
|
+
return state;
|
|
418
|
+
},
|
|
419
|
+
diff(live, params) {
|
|
420
|
+
const spec = parseResource(params);
|
|
421
|
+
const key = resourceKey(spec);
|
|
422
|
+
if (key === undefined)
|
|
423
|
+
return [{ key: PENDING_KEY, kind: "create", label: `${spec.api} object`, before: ABSENT, after: desiredSide(firstMarker(params) ?? "", false) }];
|
|
424
|
+
const current = live?.resources.find((r) => r.key === key);
|
|
425
|
+
if (current)
|
|
426
|
+
return [diffExisting(spec, key, current, live ? found.get(live) : undefined)];
|
|
427
|
+
if (Object.values(spec.fields).some(isKeep))
|
|
428
|
+
throw keepWithoutObject(spec, key);
|
|
429
|
+
return [{ key, kind: "create", label: label(spec, key), before: ABSENT, after: stateSide(spec.fields) }];
|
|
430
|
+
},
|
|
431
|
+
async apply(actx, params, live) {
|
|
432
|
+
assertNoPending(params, ADAPTER);
|
|
433
|
+
const spec = parseResource(params);
|
|
434
|
+
const key = resourceKey(spec);
|
|
435
|
+
actx = lineContext(actx, spec);
|
|
436
|
+
const api = clientOf(actx, spec);
|
|
437
|
+
const current = live?.resources.find((r) => r.key === key);
|
|
438
|
+
return current && live ? update(actx, api, spec, key, current, live) : create(actx, api, spec, key);
|
|
439
|
+
},
|
|
440
|
+
async destroy(actx, resources) {
|
|
441
|
+
for (const r of resources) {
|
|
442
|
+
if (r.id === "")
|
|
443
|
+
continue; // an intent never located: nothing was created under it
|
|
444
|
+
const req = parseLocator(r.id);
|
|
445
|
+
if (!req)
|
|
446
|
+
throw new SponsonError("INTERNAL", `${ADAPTER}: ${r.key}: record id is not a delete request`, { adapter: ADAPTER, key: r.key });
|
|
447
|
+
if (req.method === "KEEP")
|
|
448
|
+
continue; // `destroy: keep`: left in place on purpose
|
|
449
|
+
try {
|
|
450
|
+
if (req.graphql)
|
|
451
|
+
await graphqlRequest(httpClient(actx, { encoding: "json" }), req.graphql, undefined, actx.redact, true);
|
|
452
|
+
else
|
|
453
|
+
await write(httpClient(actx), req.method, req.path, req.method === "POST" ? req.body : undefined, true);
|
|
454
|
+
}
|
|
455
|
+
catch (e) {
|
|
456
|
+
if (!failedWith(e, "PROVIDER_NOT_FOUND", req.gone) && !acceptedWithoutJson(e))
|
|
457
|
+
throw e;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
},
|
|
461
|
+
};
|
|
462
|
+
//# sourceMappingURL=http-adapter-resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-adapter-resource.js","sourceRoot":"","sources":["../src/http-adapter-resource.ts"],"names":[],"mappings":"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"}
|