@sponson/adapters 0.0.0-stage → 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/LICENSE +202 -0
- package/README.md +4 -2
- package/dist/algolia.d.ts +6 -0
- package/dist/algolia.js +151 -0
- package/dist/algolia.js.map +1 -0
- package/dist/clerk.d.ts +8 -0
- package/dist/clerk.js +107 -0
- package/dist/clerk.js.map +1 -0
- 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 +73 -0
- package/dist/common.js +140 -0
- package/dist/common.js.map +1 -0
- 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 +179 -0
- package/dist/http.js +352 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- 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.d.ts +8 -0
- package/dist/neon.js +167 -0
- package/dist/neon.js.map +1 -0
- 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 +72 -0
- package/dist/secrets.js +476 -0
- package/dist/secrets.js.map +1 -0
- 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.d.ts +8 -0
- package/dist/vercel.js +475 -0
- package/dist/vercel.js.map +1 -0
- 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 +58 -3
- 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
package/dist/manual.js
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The built-in `manual` adapter: op `step`, a change a person makes by hand because no API can (a Google OAuth web
|
|
3
|
+
* client's redirect URIs, a Clerk webhook endpoint, a Stripe sandbox). The plan line says what to do; the engine
|
|
4
|
+
* shows it as `todo` until a person confirms it (`apply --confirm <line>`) or its verify request sees it done, and
|
|
5
|
+
* records who confirmed it and when (ADR 0021, `OpSpec.manual`). Nothing is ever sent to a provider except the
|
|
6
|
+
* optional verify GET, made with the generic `http` adapter's client against an API block under `providers.manual`.
|
|
7
|
+
*/
|
|
8
|
+
import { SponsonError, canonicalJson, isFromRef, isKeepRef, isSecretRef, markerKind, sha256, walkParams } from "@sponson/core";
|
|
9
|
+
import { paramError } from "./common.js";
|
|
10
|
+
import { isObject } from "./http.js";
|
|
11
|
+
import { httpClient, failedWith } from "./http-adapter-client.js";
|
|
12
|
+
import { at, fillPath, parseApi, placeholders, pointerTokens } from "./http-adapter-spec.js";
|
|
13
|
+
const ADAPTER = "manual";
|
|
14
|
+
/** Where a verify request's API is configured; declared for the generated docs. Steps without `verify` need nothing. */
|
|
15
|
+
const ABOUT = { credentialEnv: "none (verify: providers.manual.<api>.auth, optional)", baseUrlEnv: "providers.manual.<api>.base_url_env" };
|
|
16
|
+
const PARAMS = ["title", "instructions", "undo", "vars", "verify"];
|
|
17
|
+
const VERIFY_KEYS = ["api", "path", "match", "absent_status"];
|
|
18
|
+
const KEY_PREFIX = "step:";
|
|
19
|
+
function fail(message, param) {
|
|
20
|
+
return paramError(ADAPTER, message, param);
|
|
21
|
+
}
|
|
22
|
+
function textParam(params, name, required) {
|
|
23
|
+
const v = params[name];
|
|
24
|
+
if (v === undefined || v === null) {
|
|
25
|
+
if (required)
|
|
26
|
+
throw fail(`\`${name}\` is required`, name);
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
// Before resolution a `{ from }` stands for text; after it, a pending marker does.
|
|
30
|
+
if (typeof v !== "string" && !isFromRef(v))
|
|
31
|
+
throw fail(`\`${name}\` must be text (Markdown), or a \`{ from }\` reference to text`, name);
|
|
32
|
+
if (typeof v === "string" && markerKind(v) === null && v.trim() === "")
|
|
33
|
+
throw fail(`\`${name}\` must not be blank`, name);
|
|
34
|
+
return v;
|
|
35
|
+
}
|
|
36
|
+
function parseVerify(v) {
|
|
37
|
+
if (v === undefined || v === null)
|
|
38
|
+
return undefined;
|
|
39
|
+
if (!isObject(v))
|
|
40
|
+
throw fail("`verify` must be a map: `{ api, path, match?, absent_status? }`", "verify");
|
|
41
|
+
const extra = Object.keys(v).find((k) => !VERIFY_KEYS.includes(k));
|
|
42
|
+
if (extra)
|
|
43
|
+
throw fail(`\`verify.${extra}\` is not a verify key (known: ${VERIFY_KEYS.join(", ")})`, `verify.${extra}`);
|
|
44
|
+
if (typeof v.api !== "string" || v.api === "")
|
|
45
|
+
throw fail("`verify.api` is required: an API block under `providers.manual`", "verify.api");
|
|
46
|
+
if (typeof v.path !== "string" || !v.path.startsWith("/"))
|
|
47
|
+
throw fail("`verify.path` must be a path starting with \"/\" (relative to the API's base_url)", "verify.path");
|
|
48
|
+
const match = v.match ?? {};
|
|
49
|
+
if (!isObject(match) || Object.keys(match).some((p) => !p.startsWith("/")))
|
|
50
|
+
throw fail("`verify.match` must map JSON pointers (\"/status\") to the values the answer must have", "verify.match");
|
|
51
|
+
const absent = v.absent_status ?? [];
|
|
52
|
+
if (!Array.isArray(absent) || !absent.every((s) => Number.isInteger(s) && s >= 400 && s <= 599))
|
|
53
|
+
throw fail("`verify.absent_status` must be a list of HTTP error statuses (400–599)", "verify.absent_status");
|
|
54
|
+
return { api: v.api, path: v.path, match, absentStatus: absent };
|
|
55
|
+
}
|
|
56
|
+
function varsOf(params) {
|
|
57
|
+
const v = params.vars ?? {};
|
|
58
|
+
if (!isObject(v))
|
|
59
|
+
throw fail("`vars` must be a map of name → value", "vars");
|
|
60
|
+
return v;
|
|
61
|
+
}
|
|
62
|
+
/** Every param checked; refuses unknown params and, before anything resolves them, secret references. */
|
|
63
|
+
function check(params) {
|
|
64
|
+
const extra = Object.keys(params).find((k) => !PARAMS.includes(k));
|
|
65
|
+
if (extra)
|
|
66
|
+
throw fail(`\`${extra}\` is not a parameter of manual.step (known: ${PARAMS.join(", ")})`, extra);
|
|
67
|
+
textParam(params, "title", true);
|
|
68
|
+
textParam(params, "instructions", true);
|
|
69
|
+
textParam(params, "undo", false);
|
|
70
|
+
const vars = varsOf(params);
|
|
71
|
+
const verify = parseVerify(params.verify);
|
|
72
|
+
for (const name of ["title", "instructions", "undo"]) {
|
|
73
|
+
const t = params[name];
|
|
74
|
+
if (typeof t === "string" && markerKind(t) === null)
|
|
75
|
+
usedVars(t, vars, name);
|
|
76
|
+
}
|
|
77
|
+
if (verify)
|
|
78
|
+
usedVars(verify.path, vars, "verify.path");
|
|
79
|
+
}
|
|
80
|
+
/** Placeholders `{name}` of a text must all be declared in `vars`, so a typo fails at plan time. */
|
|
81
|
+
function usedVars(text, vars, param) {
|
|
82
|
+
const unknown = placeholders(text).find((n) => !(n in vars));
|
|
83
|
+
if (unknown)
|
|
84
|
+
throw fail(`\`${param}\` uses \`{${unknown}}\`, which is not declared in \`vars\``, param);
|
|
85
|
+
}
|
|
86
|
+
/** `text` with every `{name}` replaced by its value from `vars`; undefined while a value is pending. */
|
|
87
|
+
function render(text, vars) {
|
|
88
|
+
const pending = placeholders(text).some((n) => markerKind(vars[n]) !== null);
|
|
89
|
+
if (pending)
|
|
90
|
+
return undefined;
|
|
91
|
+
return text.replace(/\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (_m, n) => {
|
|
92
|
+
const v = vars[n];
|
|
93
|
+
if (typeof v === "object" && v !== null)
|
|
94
|
+
throw fail(`\`vars.${n}\` must be a single value to fill \`{${n}}\``, `vars.${n}`);
|
|
95
|
+
return String(v);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/** A text param rendered; undefined while it (or a value it uses) is still pending. */
|
|
99
|
+
function rendered(params, name, vars) {
|
|
100
|
+
const t = params[name];
|
|
101
|
+
if (t === undefined || markerKind(t) !== null)
|
|
102
|
+
return undefined;
|
|
103
|
+
return render(String(t), vars);
|
|
104
|
+
}
|
|
105
|
+
/** The step as a person sees it, or null while anything it shows is still pending. */
|
|
106
|
+
function stepOf(params) {
|
|
107
|
+
check(params);
|
|
108
|
+
const vars = varsOf(params);
|
|
109
|
+
const title = rendered(params, "title", vars);
|
|
110
|
+
const instructions = rendered(params, "instructions", vars);
|
|
111
|
+
const undo = params.undo === undefined ? undefined : rendered(params, "undo", vars);
|
|
112
|
+
if (title === undefined || instructions === undefined || (params.undo !== undefined && undo === undefined))
|
|
113
|
+
return null;
|
|
114
|
+
if (/[\r\n]/.test(title))
|
|
115
|
+
throw fail("`title` must be one line", "title");
|
|
116
|
+
return {
|
|
117
|
+
key: `${KEY_PREFIX}${title}`,
|
|
118
|
+
title,
|
|
119
|
+
instructions,
|
|
120
|
+
...(undo !== undefined ? { undo } : {}),
|
|
121
|
+
hash: sha256(canonicalJson({ title, instructions })),
|
|
122
|
+
observable: params.verify !== undefined && params.verify !== null,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/** Whether the verify request sees the step done. A 404 (or an `absent_status`) means not yet. */
|
|
126
|
+
async function verified(actx, verify, vars) {
|
|
127
|
+
const path = fillPath(verify.path, vars);
|
|
128
|
+
if (path === undefined)
|
|
129
|
+
return false;
|
|
130
|
+
const api = httpClient(actx, {}, { where: `providers.manual.${verify.api}`, authOptional: true, adapter: ADAPTER });
|
|
131
|
+
let body;
|
|
132
|
+
try {
|
|
133
|
+
body = await api.get(path);
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
if (failedWith(e, "PROVIDER_NOT_FOUND", verify.absentStatus))
|
|
137
|
+
return false;
|
|
138
|
+
throw e;
|
|
139
|
+
}
|
|
140
|
+
return Object.entries(verify.match).every(([pointer, want]) => canonicalJson(at(body, pointerTokens(pointer)) ?? null) === canonicalJson(want));
|
|
141
|
+
}
|
|
142
|
+
/** `manual.step`: one change a person makes by hand, confirmed by a person or seen by a verify request. */
|
|
143
|
+
const step = {
|
|
144
|
+
outputs: {},
|
|
145
|
+
/**
|
|
146
|
+
* Checked before anything resolves: a secret has no place in instructions a person reads (and `plan` would show
|
|
147
|
+
* them masked), so a `{ secret }` reference is refused here, before any provider call.
|
|
148
|
+
*/
|
|
149
|
+
defaults(params) {
|
|
150
|
+
walkParams(params, [], (path, v) => {
|
|
151
|
+
const where = path.join(".");
|
|
152
|
+
if (isSecretRef(v))
|
|
153
|
+
throw fail(`\`${where}\` is a secret reference; a manual step's text is shown to people and kept in receipts, so it may not carry a secret`, where);
|
|
154
|
+
if (isKeepRef(v))
|
|
155
|
+
throw fail(`\`${where}\` is \`{ keep: true }\`; a manual step has no live value to keep`, where);
|
|
156
|
+
});
|
|
157
|
+
check(params);
|
|
158
|
+
return params;
|
|
159
|
+
},
|
|
160
|
+
/** The verify request's API block, `providers.manual.<verify.api>`; nothing for a step without one. */
|
|
161
|
+
providerFor(block, params) {
|
|
162
|
+
const verify = isObject(params.verify) ? params.verify : undefined;
|
|
163
|
+
if (!verify || typeof verify.api !== "string")
|
|
164
|
+
return {};
|
|
165
|
+
const cfg = block[verify.api];
|
|
166
|
+
if (!isObject(cfg)) {
|
|
167
|
+
const known = Object.keys(block);
|
|
168
|
+
throw new SponsonError("PLAN_INVALID", `${ADAPTER}: providers.manual.${verify.api}: no API \`${verify.api}\` is configured for the verify request (known: ${known.length ? known.join(", ") : "none"})`, { adapter: ADAPTER, key: `providers.manual.${verify.api}` });
|
|
169
|
+
}
|
|
170
|
+
parseApi(cfg, `providers.manual.${verify.api}`, { authOptional: true });
|
|
171
|
+
return cfg;
|
|
172
|
+
},
|
|
173
|
+
manual: (params) => stepOf(params),
|
|
174
|
+
/** Done, as far as an API can tell: only a step with `verify` is ever seen; any other is known done only by confirmation. */
|
|
175
|
+
async read(actx, params) {
|
|
176
|
+
const s = stepOf(params);
|
|
177
|
+
const verify = parseVerify(params.verify);
|
|
178
|
+
if (!s || !verify || !(await verified(actx, verify, varsOf(params))))
|
|
179
|
+
return null;
|
|
180
|
+
return { resources: [{ key: s.key, id: "manual", hash: s.hash, label: `manual step: ${s.title}` }], outputs: {} };
|
|
181
|
+
},
|
|
182
|
+
diff(live, params) {
|
|
183
|
+
const s = stepOf(params);
|
|
184
|
+
if (!s)
|
|
185
|
+
return [{ key: `${KEY_PREFIX}(pending)`, kind: "create", label: "manual step", before: { state: "absent" }, after: { state: "pending" } }];
|
|
186
|
+
const label = `manual step: ${s.title}`;
|
|
187
|
+
return [live ? { key: s.key, kind: "unchanged", label } : { key: s.key, kind: "create", label, before: { state: "absent" }, after: { state: "literal", value: s.title } }];
|
|
188
|
+
},
|
|
189
|
+
/** Never called: the engine records a manual step (OpSpec.manual). */
|
|
190
|
+
async apply() {
|
|
191
|
+
throw new SponsonError("INTERNAL", `${ADAPTER}: a manual step is done by a person and recorded by the engine; apply must not be called`, { adapter: ADAPTER });
|
|
192
|
+
},
|
|
193
|
+
/** Nothing to delete at any provider: undoing a step is a person's job (its `undo`), confirmed on destroy. */
|
|
194
|
+
async destroy() { },
|
|
195
|
+
};
|
|
196
|
+
/**
|
|
197
|
+
* The `manual` adapter (`adapter: manual` in a plan): op `step`, a change a person makes by hand, shown as a todo
|
|
198
|
+
* with its instructions until someone confirms it or its verify request sees it done (ADR 0021).
|
|
199
|
+
*/
|
|
200
|
+
export const manualAdapter = { name: ADAPTER, ops: { step }, about: ABOUT };
|
|
201
|
+
//# sourceMappingURL=manual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manual.js","sourceRoot":"","sources":["../src/manual.ts"],"names":[],"mappings":"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"}
|
package/dist/neon.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ResourceAdapter } from "@sponson/core";
|
|
2
|
+
/** Neon's API base URL; `NEON_API_URL` overrides it (the sim and tests use that). */
|
|
3
|
+
export declare const NEON_DEFAULT_API_URL = "https://console.neon.tech/api/v2";
|
|
4
|
+
/**
|
|
5
|
+
* Neon: op `branch` creates a database branch per scope and outputs its connection string (sensitive). Needs
|
|
6
|
+
* `NEON_API_KEY` and `providers.neon.project`.
|
|
7
|
+
*/
|
|
8
|
+
export declare const neonAdapter: ResourceAdapter;
|
package/dist/neon.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { canonicalJson, isPendingMarker, sha256 } from "@sponson/core";
|
|
2
|
+
import { ABSENT, assertNoPending, clientFor, deleteIgnoringNotFound, desiredSide, optionalEnv, paramError, requireEnv, requireProvider, stringParam } from "./common.js";
|
|
3
|
+
import { ShapeError, isProviderError, listAll, obj, records } from "./http.js";
|
|
4
|
+
/** The environment neon reads; declared once, used by the code below and by the generated docs. */
|
|
5
|
+
const ABOUT = { credentialEnv: "NEON_API_KEY", baseUrlEnv: "NEON_API_URL", title: "Neon", category: "databases", detect: { deps: ["@neondatabase/", "@prisma/adapter-neon", "neonctl"], env: ["NEON_*"], files: [".neon"], dbHosts: [".neon.tech"] } };
|
|
6
|
+
/** Neon's API base URL; `NEON_API_URL` overrides it (the sim and tests use that). */
|
|
7
|
+
export const NEON_DEFAULT_API_URL = "https://console.neon.tech/api/v2";
|
|
8
|
+
function client(actx) {
|
|
9
|
+
const token = requireEnv(actx.env, ABOUT.credentialEnv, "neon");
|
|
10
|
+
const project = requireProvider(actx, "project", "neon");
|
|
11
|
+
return { api: clientFor(actx, "neon", { baseUrl: optionalEnv(actx.env, ABOUT.baseUrlEnv) ?? NEON_DEFAULT_API_URL, token }), project };
|
|
12
|
+
}
|
|
13
|
+
function branchKey(name) {
|
|
14
|
+
return `${BRANCH_PREFIX}${name}`;
|
|
15
|
+
}
|
|
16
|
+
const BRANCH_PREFIX = "branch:";
|
|
17
|
+
/** Identity hash: name and parent, the two things that define a branch for us. A replacement shows as a new provider id. */
|
|
18
|
+
function branchHash(b) {
|
|
19
|
+
return sha256(canonicalJson({ name: b.name, parent_id: b.parent_id }));
|
|
20
|
+
}
|
|
21
|
+
function record(b) {
|
|
22
|
+
return { key: branchKey(b.name), id: b.id, hash: branchHash(b), label: `Neon branch ${b.name}` };
|
|
23
|
+
}
|
|
24
|
+
function parseBranches(v, what) {
|
|
25
|
+
return records(v, what, ["id", "name"]).map((b, i) => {
|
|
26
|
+
if (b.parent_id !== undefined && b.parent_id !== null && typeof b.parent_id !== "string")
|
|
27
|
+
throw new ShapeError(`expected ${what}[${i}].parent_id to be a string or null`);
|
|
28
|
+
return { id: b.id, name: b.name, parent_id: b.parent_id ?? null, default: b.default === true, primary: b.primary === true };
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/** `{ branches, pagination: { next } }`; the next page is `?cursor=<next>`. Older responses call it `cursor`. */
|
|
32
|
+
function branchPage(body) {
|
|
33
|
+
const o = obj(body, "the branch list");
|
|
34
|
+
const items = parseBranches(o.branches, "`branches`");
|
|
35
|
+
const p = o.pagination;
|
|
36
|
+
const cursor = p && typeof p === "object" ? (p.next ?? p.cursor) : undefined;
|
|
37
|
+
return { items, next: typeof cursor === "string" && cursor !== "" ? { cursor } : null };
|
|
38
|
+
}
|
|
39
|
+
async function listBranches(c) {
|
|
40
|
+
return listAll(c.api, `/projects/${c.project}/branches`, branchPage);
|
|
41
|
+
}
|
|
42
|
+
/** The database a branch's connection string points at: `neondb` (a new project's default) if present, else the first one. */
|
|
43
|
+
const DEFAULT_DATABASE = "neondb";
|
|
44
|
+
/**
|
|
45
|
+
* The branch's endpoint host and connection string. GET /projects/:id/connection_uri requires `database_name` and
|
|
46
|
+
* `role_name`; both come from the branch's own database list (the database's `owner_name` is the role), so a
|
|
47
|
+
* project whose database or role is not named like a new project's defaults still works.
|
|
48
|
+
*/
|
|
49
|
+
async function outputsFor(c, b) {
|
|
50
|
+
const [host, db] = await Promise.all([
|
|
51
|
+
c.api.get(`/projects/${c.project}/branches/${b.id}/endpoints`, (body) => {
|
|
52
|
+
const eps = records(obj(body, "the endpoint list").endpoints, "`endpoints`", ["id", "host"]);
|
|
53
|
+
const h = (eps.find((e) => e.type === "read_write") ?? eps[0])?.host;
|
|
54
|
+
if (!h)
|
|
55
|
+
throw new ShapeError(`branch ${b.name} has no endpoint`);
|
|
56
|
+
return h;
|
|
57
|
+
}),
|
|
58
|
+
c.api.get(`/projects/${c.project}/branches/${b.id}/databases`, (body) => {
|
|
59
|
+
const dbs = records(obj(body, "the database list").databases, "`databases`", ["name", "owner_name"]);
|
|
60
|
+
const d = dbs.find((x) => x.name === DEFAULT_DATABASE) ?? dbs[0];
|
|
61
|
+
if (!d)
|
|
62
|
+
throw new ShapeError(`branch ${b.name} has no database`);
|
|
63
|
+
return d;
|
|
64
|
+
}),
|
|
65
|
+
]);
|
|
66
|
+
const q = new URLSearchParams({ branch_id: b.id, database_name: db.name, role_name: db.owner_name });
|
|
67
|
+
const uri = await c.api.get(`/projects/${c.project}/connection_uri?${q}`, (body) => {
|
|
68
|
+
const o = obj(body, "the connection URI");
|
|
69
|
+
if (typeof o.uri !== "string")
|
|
70
|
+
throw new ShapeError("expected `uri` to be a string");
|
|
71
|
+
return o.uri;
|
|
72
|
+
});
|
|
73
|
+
return { branch_id: b.id, connection_string: uri, host };
|
|
74
|
+
}
|
|
75
|
+
function parseCreated(body) {
|
|
76
|
+
const o = obj(body, "the create-branch response");
|
|
77
|
+
const branch = parseBranches([o.branch], "`branch`")[0];
|
|
78
|
+
const endpoints = Array.isArray(o.endpoints) ? records(o.endpoints, "`endpoints`", ["host"]) : [];
|
|
79
|
+
const uris = Array.isArray(o.connection_uris) ? records(o.connection_uris, "`connection_uris`", ["connection_uri"]) : [];
|
|
80
|
+
return { branch, ...(endpoints[0] ? { host: endpoints[0].host } : {}), ...(uris[0] ? { uri: uris[0].connection_uri } : {}) };
|
|
81
|
+
}
|
|
82
|
+
const branch = {
|
|
83
|
+
outputs: {
|
|
84
|
+
branch_id: { available: "immediate" },
|
|
85
|
+
connection_string: { available: "immediate", sensitive: true },
|
|
86
|
+
host: { available: "immediate" },
|
|
87
|
+
},
|
|
88
|
+
defaults(params, ctx) {
|
|
89
|
+
return { parent: "main", name: `sponson/${ctx.env}/${ctx.scope}`, ...params };
|
|
90
|
+
},
|
|
91
|
+
async read(actx, params) {
|
|
92
|
+
if (isPendingMarker(params.name))
|
|
93
|
+
return null;
|
|
94
|
+
const c = client(actx);
|
|
95
|
+
const name = stringParam(params, "name", "neon");
|
|
96
|
+
const found = (await listBranches(c)).find((b) => b.name === name);
|
|
97
|
+
if (!found)
|
|
98
|
+
return null;
|
|
99
|
+
return { resources: [record(found)], outputs: await outputsFor(c, found) };
|
|
100
|
+
},
|
|
101
|
+
diff(live, params) {
|
|
102
|
+
const name = params.name;
|
|
103
|
+
if (isPendingMarker(name))
|
|
104
|
+
return [{ key: "branch:(pending)", kind: "create", label: "Neon branch", before: ABSENT, after: desiredSide(name, false) }];
|
|
105
|
+
const key = branchKey(String(name));
|
|
106
|
+
const current = live?.resources.find((r) => r.key === key);
|
|
107
|
+
// A branch's identity is its name; re-parenting is not supported, so an existing branch is unchanged whatever `parent` says.
|
|
108
|
+
if (current)
|
|
109
|
+
return [{ key, kind: "unchanged", label: current.label ?? key }];
|
|
110
|
+
return [{ key, kind: "create", label: `Neon branch ${String(name)}`, before: ABSENT, after: desiredSide(name, false) }];
|
|
111
|
+
},
|
|
112
|
+
async apply(actx, params, live) {
|
|
113
|
+
assertNoPending(params, "neon");
|
|
114
|
+
const c = client(actx);
|
|
115
|
+
const name = stringParam(params, "name", "neon");
|
|
116
|
+
const key = branchKey(name);
|
|
117
|
+
if (live?.resources.some((r) => r.key === key))
|
|
118
|
+
return { resources: live.resources, outputs: live.outputs, created: [] };
|
|
119
|
+
const parentName = stringParam(params, "parent", "neon", "main");
|
|
120
|
+
const branches = await listBranches(c);
|
|
121
|
+
const parent = branches.find((b) => b.name === parentName || b.id === parentName);
|
|
122
|
+
if (!parent)
|
|
123
|
+
throw paramError("neon", `parent branch \`${parentName}\` not found in project ${c.project}`, "parent");
|
|
124
|
+
await actx.intend([key]);
|
|
125
|
+
actx.log(`create branch ${name} from ${parent.name}`);
|
|
126
|
+
let r;
|
|
127
|
+
try {
|
|
128
|
+
r = await c.api.post(`/projects/${c.project}/branches`, { branch: { name, parent_id: parent.id }, endpoints: [{ type: "read_write" }] }, parseCreated);
|
|
129
|
+
}
|
|
130
|
+
catch (e) {
|
|
131
|
+
if (!isProviderError(e, "PROVIDER_CONFLICT"))
|
|
132
|
+
throw e;
|
|
133
|
+
// It exists already (a lost response of ours, or someone else's). Not created by this call; the engine
|
|
134
|
+
// claims it when an earlier intent of ours named it.
|
|
135
|
+
const found = (await listBranches(c)).find((b) => b.name === name);
|
|
136
|
+
if (!found)
|
|
137
|
+
throw e;
|
|
138
|
+
return { resources: [record(found)], outputs: await outputsFor(c, found), created: [] };
|
|
139
|
+
}
|
|
140
|
+
// Trust the write's answer: listing right after a create may not show it yet.
|
|
141
|
+
const outputs = r.host && r.uri ? { branch_id: r.branch.id, connection_string: r.uri, host: r.host } : await outputsFor(c, r.branch);
|
|
142
|
+
return { resources: [record(r.branch)], outputs, created: [key] };
|
|
143
|
+
},
|
|
144
|
+
async destroy(actx, resources) {
|
|
145
|
+
const c = client(actx);
|
|
146
|
+
for (const r of resources)
|
|
147
|
+
await deleteIgnoringNotFound(c.api, `/projects/${c.project}/branches/${encodeURIComponent(r.id)}`);
|
|
148
|
+
},
|
|
149
|
+
/** Every branch but the project's root: anything else may be a preview branch some scope (or nobody) manages. */
|
|
150
|
+
async listScope(actx) {
|
|
151
|
+
const c = client(actx);
|
|
152
|
+
return (await listBranches(c)).filter((b) => !b.default && !b.primary).map(record);
|
|
153
|
+
},
|
|
154
|
+
/** One line per branch, naming it: the line then manages exactly that branch. */
|
|
155
|
+
adopt(resources) {
|
|
156
|
+
return resources.map((r) => {
|
|
157
|
+
const name = r.key.slice(BRANCH_PREFIX.length);
|
|
158
|
+
return { id: `db-${name}`, params: { name }, keys: [r.key] };
|
|
159
|
+
});
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Neon: op `branch` creates a database branch per scope and outputs its connection string (sensitive). Needs
|
|
164
|
+
* `NEON_API_KEY` and `providers.neon.project`.
|
|
165
|
+
*/
|
|
166
|
+
export const neonAdapter = { name: "neon", ops: { branch }, about: ABOUT };
|
|
167
|
+
//# sourceMappingURL=neon.js.map
|
package/dist/neon.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neon.js","sourceRoot":"","sources":["../src/neon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Netlify: environment variable values per deploy context, and the deploy that carries them.
|
|
3
|
+
*
|
|
4
|
+
* Netlify stores one object per variable (`key`) with a list of values, one per deploy context (`production`,
|
|
5
|
+
* `deploy-preview`, `branch-deploy`, `dev`, `dev-server`, or `branch` with the branch name in
|
|
6
|
+
* `context_parameter`). A line owns one context's value of each variable it declares, never the variable: a
|
|
7
|
+
* value a human set for another context is never read as ours, changed or deleted. Every call and field below is
|
|
8
|
+
* checked against Netlify's OpenAPI document; see the NL assumptions in packages/sim/src/routes/netlify.ts and the
|
|
9
|
+
* Netlify section of docs/api-verification.md.
|
|
10
|
+
*/
|
|
11
|
+
import { type ResourceAdapter } from "@sponson/core";
|
|
12
|
+
/** Netlify's API base URL (OpenAPI `host` + `basePath`); `NETLIFY_API_URL` overrides it (the sim and tests use that). */
|
|
13
|
+
export declare const NETLIFY_DEFAULT_API_URL = "https://api.netlify.com/api/v1";
|
|
14
|
+
/**
|
|
15
|
+
* Netlify (`adapter: netlify`): op `env` manages environment variable values per deploy context and outputs the
|
|
16
|
+
* `preview_url` of the deploy that carries them. Needs `NETLIFY_AUTH_TOKEN` and `providers.netlify.site`.
|
|
17
|
+
*/
|
|
18
|
+
export declare const netlifyAdapter: ResourceAdapter;
|