@sponson/sim 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.
Files changed (78) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +9 -2
  3. package/dist/auth.d.ts +60 -0
  4. package/dist/auth.js +195 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/bin.d.ts +2 -0
  7. package/dist/bin.js +16 -0
  8. package/dist/bin.js.map +1 -0
  9. package/dist/chaos.d.ts +74 -0
  10. package/dist/chaos.js +80 -0
  11. package/dist/chaos.js.map +1 -0
  12. package/dist/cli.d.ts +29 -0
  13. package/dist/cli.js +99 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/demo.d.ts +39 -0
  16. package/dist/demo.js +168 -0
  17. package/dist/demo.js.map +1 -0
  18. package/dist/graphql.d.ts +22 -0
  19. package/dist/graphql.js +36 -0
  20. package/dist/graphql.js.map +1 -0
  21. package/dist/index.d.ts +46 -0
  22. package/dist/index.js +54 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/provider.d.ts +138 -0
  25. package/dist/provider.js +68 -0
  26. package/dist/provider.js.map +1 -0
  27. package/dist/routes/algolia.d.ts +37 -0
  28. package/dist/routes/algolia.js +83 -0
  29. package/dist/routes/algolia.js.map +1 -0
  30. package/dist/routes/aws.d.ts +43 -0
  31. package/dist/routes/aws.js +211 -0
  32. package/dist/routes/aws.js.map +1 -0
  33. package/dist/routes/clerk.d.ts +33 -0
  34. package/dist/routes/clerk.js +85 -0
  35. package/dist/routes/clerk.js.map +1 -0
  36. package/dist/routes/cloudflare.d.ts +80 -0
  37. package/dist/routes/cloudflare.js +176 -0
  38. package/dist/routes/cloudflare.js.map +1 -0
  39. package/dist/routes/digitalocean.d.ts +58 -0
  40. package/dist/routes/digitalocean.js +158 -0
  41. package/dist/routes/digitalocean.js.map +1 -0
  42. package/dist/routes/fly.d.ts +22 -0
  43. package/dist/routes/fly.js +113 -0
  44. package/dist/routes/fly.js.map +1 -0
  45. package/dist/routes/launchdarkly.d.ts +98 -0
  46. package/dist/routes/launchdarkly.js +213 -0
  47. package/dist/routes/launchdarkly.js.map +1 -0
  48. package/dist/routes/neon.d.ts +73 -0
  49. package/dist/routes/neon.js +184 -0
  50. package/dist/routes/neon.js.map +1 -0
  51. package/dist/routes/netlify.d.ts +126 -0
  52. package/dist/routes/netlify.js +347 -0
  53. package/dist/routes/netlify.js.map +1 -0
  54. package/dist/routes/planetscale.d.ts +95 -0
  55. package/dist/routes/planetscale.js +234 -0
  56. package/dist/routes/planetscale.js.map +1 -0
  57. package/dist/routes/railway.d.ts +24 -0
  58. package/dist/routes/railway.js +112 -0
  59. package/dist/routes/railway.js.map +1 -0
  60. package/dist/routes/rest.d.ts +138 -0
  61. package/dist/routes/rest.js +462 -0
  62. package/dist/routes/rest.js.map +1 -0
  63. package/dist/routes/supabase.d.ts +103 -0
  64. package/dist/routes/supabase.js +234 -0
  65. package/dist/routes/supabase.js.map +1 -0
  66. package/dist/routes/vercel.d.ts +114 -0
  67. package/dist/routes/vercel.js +370 -0
  68. package/dist/routes/vercel.js.map +1 -0
  69. package/dist/routes/xata.d.ts +57 -0
  70. package/dist/routes/xata.js +115 -0
  71. package/dist/routes/xata.js.map +1 -0
  72. package/dist/server.d.ts +4 -0
  73. package/dist/server.js +189 -0
  74. package/dist/server.js.map +1 -0
  75. package/dist/state.d.ts +102 -0
  76. package/dist/state.js +121 -0
  77. package/dist/state.js.map +1 -0
  78. package/package.json +51 -3
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Simulated Vercel: project env vars and deployments.
3
+ *
4
+ * Assumptions about the real API that this fake encodes, each marked with how far it is checked. "Verified" means
5
+ * against Vercel's published OpenAPI document (https://openapi.vercel.sh/, fetched 2026-10-10); see
6
+ * docs/api-verification.md for the per-call table. A local fake cannot prove the rest; scenarios/contract.test.ts
7
+ * pins the critical ones against live accounts (`pnpm test:live`):
8
+ * V1. Env writes are visible to the next deployment immediately (no propagation delay). Lists are
9
+ * read-your-writes here; the real list may lag a write, so adapters trust write responses instead.
10
+ * Unverified: needs a live account.
11
+ * V2. GET /v7/deployments?projectId=&sha= filters by commit and returns newest first. The `sha` filter is
12
+ * verified (a v7 query parameter; v6 is not in the spec); items carry `readyState` (required) and `state`
13
+ * (optional), and `url` may be null until the upload completes (verified). The order is unverified: the
14
+ * adapter sorts by createdAt anyway.
15
+ * V3. GET /v10/projects/:id/env?decrypt=true returns plaintext with `decrypted: true`; without `decrypt`,
16
+ * `encrypted` values are opaque. `decrypt` (deprecated), `decrypted` and GET /v1/projects/:id/env/:id
17
+ * ("Retrieve the decrypted value") are verified; whether the deprecated parameter still decrypts is
18
+ * unverified, so the adapter falls back to the per-variable GET. `sensitive` values are never returned
19
+ * (the GET /v1 variant without `value`), so those always diff as `update`.
20
+ * V4. POST /v10/projects/:id/env?upsert=true answers 201 with `{ created, failed }` (verified: `upsert`, the
21
+ * status, `created` as one object or a list, `failed[].error` with `code`, `message`, `key`/`envVarKey`).
22
+ * Unverified: that `created` lists every entry written (new or updated, `createdAt === updatedAt` only for
23
+ * new ones), and that an entry whose key+gitBranch exists with an overlapping but different target set
24
+ * fails the whole request with 400 `ENV_CONFLICT`. Entries named in chaos `env_upsert_fail` come back under
25
+ * `failed` and are not written. Without `upsert` a duplicate answers 403 (verified: documented 403 reason).
26
+ * V5. POST /v13/deployments: `project` overrides `name` and a GitHub `gitSource` needs `ref` plus `repoId` (or
27
+ * `org` + `repo`) — both verified, as is `forceNew`. Deployments go QUEUED → BUILDING → READY over chaos
28
+ * `deploy_ms` (default 0: READY at once; the real API also passes through INITIALIZING, which the adapter
29
+ * handles as in progress). Every deployment has its own URL (verified: "the unique URL of the deployment").
30
+ * `deploy: cancel` cancels a branch's in-progress builds when a new one starts (unverified).
31
+ * V6. Pagination (chaos `page_size`): `{ envs, pagination: { count, next, prev } }` (verified: the spec's
32
+ * Pagination schema). The `?until=` page parameter is unverified for the env list, which documents no page
33
+ * parameter; the adapter drops repeated records, so an API that ignores it costs one extra request.
34
+ * V7. GET /v9/projects/:id carries `link`, the connected repository (`type`, `repoId`, …); verified.
35
+ * V8. GET /v7/deployments accepts `target` (`production` | `preview`) and each item's `target` is `production`,
36
+ * a custom environment name such as `staging`, or null for a preview; verified against the spec's
37
+ * `/v7/deployments` parameters and item schema. The git integration builds previews; production builds
38
+ * of a commit exist separately.
39
+ */
40
+ import { page, Reply, route, router } from "../provider.js";
41
+ /** Simulated Vercel (env vars, deployments); see the assumptions at the top of this file. */
42
+ export const vercelSim = {
43
+ env: { token: "VERCEL_TOKEN", url: "VERCEL_API_URL", testToken: "tok_vercel" },
44
+ defaultSeed: { projects: { prj_demo: { envs: [] } } },
45
+ reset(core, seed) {
46
+ const state = { projects: {} };
47
+ const now = Date.now();
48
+ for (const [id, p] of Object.entries(seed?.projects ?? {})) {
49
+ const project = { envs: [], deployments: [], link: { type: "github", repoId: 100000 + Object.keys(state.projects).length, org: "sim", repo: id, productionBranch: "main" } };
50
+ for (const e of p.envs) {
51
+ project.envs.push({
52
+ id: core.nextId("env_"),
53
+ key: e.key,
54
+ value: e.value,
55
+ target: [e.target],
56
+ type: "encrypted",
57
+ ...(e.gitBranch ? { gitBranch: e.gitBranch } : {}),
58
+ createdAt: now,
59
+ updatedAt: now,
60
+ createdBy: "sim",
61
+ });
62
+ }
63
+ state.projects[id] = project;
64
+ }
65
+ return state;
66
+ },
67
+ /**
68
+ * `env.<target>.<NAME>` every record of NAME in target
69
+ * `env.<target>@<branch>.<NAME>` only the record for that git branch (`@*`: the project-wide one)
70
+ * Value: a new value, "delete", or "recreate" (delete and re-create with the same name and a new id).
71
+ */
72
+ drift(core, state, { key, rest, value, only }) {
73
+ if (!rest.startsWith("env."))
74
+ return false;
75
+ const spec = rest.slice("env.".length);
76
+ // Env names have no dots; git branches may.
77
+ const dot = spec.lastIndexOf(".");
78
+ if (dot < 0)
79
+ throw new Error(`bad drift key: ${key}`);
80
+ const [target, branch] = splitOnce(spec.slice(0, dot), "@");
81
+ const name = spec.slice(dot + 1);
82
+ for (const [id, p] of Object.entries(state.projects)) {
83
+ if (only !== undefined && id !== only)
84
+ continue;
85
+ const hit = p.envs.filter((e) => e.key === name && e.target.includes(target) && (branch === undefined || (e.gitBranch ?? "*") === branch));
86
+ if (value === "delete")
87
+ p.envs = p.envs.filter((e) => !hit.includes(e));
88
+ else if (value === "recreate") {
89
+ p.envs = p.envs.filter((e) => !hit.includes(e));
90
+ for (const e of hit)
91
+ p.envs.push({ ...e, id: core.nextId("env_"), createdAt: Date.now(), updatedAt: Date.now(), createdBy: "sim" });
92
+ }
93
+ else
94
+ for (const e of hit)
95
+ Object.assign(e, { value, updatedAt: Date.now() });
96
+ }
97
+ return true;
98
+ },
99
+ routes(core, state, req) {
100
+ return routes(core, state, req);
101
+ },
102
+ };
103
+ const routes = router([
104
+ route("GET", "/v9/projects/:project", ({ state, params }) => {
105
+ const p = state.projects[params.project];
106
+ if (!p)
107
+ return notFound("project");
108
+ return new Reply(200, { id: params.project, name: params.project, ...(p.link ? { link: p.link } : {}) });
109
+ }),
110
+ route("GET", "/v10/projects/:project/env", ({ core, state, params, url }) => {
111
+ const p = state.projects[params.project];
112
+ if (!p)
113
+ return notFound("project");
114
+ const decrypt = url.searchParams.get("decrypt") === "true";
115
+ const pg = page(core, p.envs, url.searchParams.get("until"));
116
+ return new Reply(200, { envs: pg.items.map((e) => listedEnv(e, decrypt)), pagination: { count: pg.items.length, next: pg.next, prev: null } });
117
+ }),
118
+ route("POST", "/v10/projects/:project/env", ({ core, state, params, url, body }) => {
119
+ const p = state.projects[params.project];
120
+ if (!p)
121
+ return notFound("project");
122
+ return upsertEnvs(core, p, Array.isArray(body) ? body : [body], url.searchParams.get("upsert") === "true");
123
+ }),
124
+ route("GET", "/v1/projects/:project/env/:id", ({ state, params }) => {
125
+ const env = state.projects[params.project]?.envs.find((e) => e.id === params.id);
126
+ return env ? new Reply(200, listedEnv(env, true)) : notFound("env");
127
+ }),
128
+ route("PATCH", "/v9/projects/:project/env/:id", ({ state, params, body }) => {
129
+ const p = state.projects[params.project];
130
+ if (!p)
131
+ return notFound("project");
132
+ const env = p.envs.find((e) => e.id === params.id);
133
+ if (!env)
134
+ return notFound("env");
135
+ const b = (body ?? {});
136
+ if (typeof b.value === "string")
137
+ env.value = b.value;
138
+ env.updatedAt = Date.now();
139
+ return new Reply(200, publicEnv(env));
140
+ }),
141
+ route("DELETE", "/v9/projects/:project/env/:id", ({ state, params }) => {
142
+ const p = state.projects[params.project];
143
+ if (!p)
144
+ return notFound("project");
145
+ const env = p.envs.find((e) => e.id === params.id);
146
+ if (!env)
147
+ return notFound("env");
148
+ p.envs = p.envs.filter((e) => e !== env);
149
+ return new Reply(200, publicEnv(env));
150
+ }),
151
+ route("GET", "/v7/deployments", ({ core, state, url }) => listDeployments(core, state, url)),
152
+ route("POST", "/v13/deployments", ({ core, state, body }) => postDeployment(core, state, body)),
153
+ route("GET", "/v13/deployments/:id", ({ state, params }) => {
154
+ for (const p of Object.values(state.projects)) {
155
+ refreshDeployments(p.deployments);
156
+ const d = p.deployments.find((x) => x.uid === params.id);
157
+ if (d)
158
+ return new Reply(200, deploymentDetail(d));
159
+ }
160
+ return notFound("deployment");
161
+ }),
162
+ ], () => notFound("route"));
163
+ /**
164
+ * `GET /v7/deployments?projectId&sha&target&limit`. `target`: production → production deployments; preview →
165
+ * deployments whose target is null (previews). Asking for a sha the project has not deployed yet triggers the
166
+ * git integration's automatic deployment, as a push would have.
167
+ */
168
+ function listDeployments(core, state, url) {
169
+ const projectId = url.searchParams.get("projectId") ?? "";
170
+ const sha = url.searchParams.get("sha") ?? "";
171
+ const target = url.searchParams.get("target");
172
+ const inTarget = (d) => target === null || (target === "production" ? d.target === "production" : target === "preview" ? d.target === null : false);
173
+ const p = state.projects[projectId];
174
+ if (!p)
175
+ return notFound("project");
176
+ if (sha && !p.deployments.some((d) => d.meta.githubCommitSha === sha && inTarget(d)))
177
+ autoDeploy(core, projectId, p, sha, target === "production" ? "production" : undefined);
178
+ refreshDeployments(p.deployments);
179
+ const list = p.deployments.filter((d) => (!sha || d.meta.githubCommitSha === sha) && inTarget(d)).sort((a, b) => b.createdAt - a.createdAt);
180
+ const limit = Number(url.searchParams.get("limit") ?? 20);
181
+ const items = list.slice(0, limit);
182
+ return new Reply(200, { deployments: items.map((d) => publicDeployment(projectId, d)), pagination: { count: items.length, next: list.length > limit ? (items.at(-1)?.createdAt ?? null) : null, prev: null } });
183
+ }
184
+ function isGitSource(g) {
185
+ if (!g || g.type !== "github" || typeof g.ref !== "string")
186
+ return false;
187
+ return g.repoId !== undefined || (typeof g.org === "string" && typeof g.repo === "string");
188
+ }
189
+ /** `POST /v13/deployments`: a (re)deployment from a git source of the project's connected repository. */
190
+ function postDeployment(core, state, body) {
191
+ const b = (body ?? {});
192
+ if (typeof b.name !== "string" || b.name === "")
193
+ return badRequest("missing_name", "`name` is required");
194
+ // `project`, when given, overrides `name`.
195
+ const projectId = b.project ?? b.name;
196
+ const p = state.projects[projectId];
197
+ if (!p)
198
+ return notFound("project");
199
+ const g = b.gitSource;
200
+ if (!isGitSource(g))
201
+ return badRequest("bad_request", "Invalid request: `gitSource` needs `type`, `ref` and `repoId` (or `org` and `repo`)");
202
+ if (!p.link || (g.repoId !== undefined && String(g.repoId) !== String(p.link.repoId)))
203
+ return badRequest("incorrect_git_source_info", "The repository is not connected to this project");
204
+ const d = createDeployment(core, projectId, p, g.sha ?? "unknown", core.chaos.deploy === "fail" ? "ERROR" : "READY", Date.now(), {
205
+ ref: g.ref,
206
+ buildMs: core.chaos.deploy_ms,
207
+ ...(b.target === "production" ? { target: "production" } : {}),
208
+ });
209
+ return new Reply(200, deploymentDetail(d));
210
+ }
211
+ function isEnvInput(v) {
212
+ if (typeof v !== "object" || v === null)
213
+ return false;
214
+ const it = v;
215
+ return typeof it.key === "string" && typeof it.value === "string" && Array.isArray(it.target) && (it.gitBranch === undefined || typeof it.gitBranch === "string");
216
+ }
217
+ function upsertEnvs(core, p, body, upsert) {
218
+ const sameScope = (e, it) => e.key === it.key && (e.gitBranch ?? null) === (it.gitBranch ?? null);
219
+ // Validate the whole batch first: a rejected request writes nothing.
220
+ if (!body.every(isEnvInput))
221
+ return badRequest("bad_request", "bad env");
222
+ const items = body;
223
+ for (const it of items) {
224
+ const overlapping = p.envs.find((e) => sameScope(e, it) && !sameSet(e.target, it.target) && e.target.some((t) => it.target.includes(t)));
225
+ if (overlapping) {
226
+ return new Reply(400, { error: { code: "ENV_CONFLICT", key: it.key, message: `A variable with the key ${it.key} already exists for the target ${overlapping.target.join(",")}` } });
227
+ }
228
+ }
229
+ const created = [];
230
+ const failed = [];
231
+ for (const it of items) {
232
+ if (core.chaos.env_upsert_fail.includes(it.key)) {
233
+ failed.push({ error: { code: "ENV_CONFLICT", key: it.key, message: "rejected by chaos env_upsert_fail" } });
234
+ continue;
235
+ }
236
+ const existing = p.envs.find((e) => sameScope(e, it) && sameSet(e.target, it.target));
237
+ if (existing) {
238
+ // Without `upsert`, the spec documents 403 "cannot be created because it already exists".
239
+ if (!upsert)
240
+ return new Reply(403, { error: { code: "ENV_ALREADY_EXISTS", key: it.key, message: "already exists" } });
241
+ existing.value = it.value;
242
+ existing.updatedAt = Math.max(Date.now(), existing.createdAt + 1);
243
+ created.push(existing);
244
+ continue;
245
+ }
246
+ const now = Date.now();
247
+ const env = {
248
+ id: core.nextId("env_"),
249
+ key: it.key,
250
+ value: it.value,
251
+ target: [...it.target],
252
+ type: it.type === "plain" ? "plain" : "encrypted",
253
+ ...(it.gitBranch ? { gitBranch: it.gitBranch } : {}),
254
+ createdAt: now,
255
+ updatedAt: now,
256
+ createdBy: "api",
257
+ };
258
+ p.envs.push(env);
259
+ created.push(env);
260
+ }
261
+ return new Reply(201, { created: created.map(publicEnv), failed });
262
+ }
263
+ /**
264
+ * Every deployment gets its own URL: the first one of a sha is `<project>-<sha8>.vercel.app`, later ones
265
+ * (redeploys) `-2`, `-3`, … `buildMs` > 0 starts it QUEUED and makes it reach `state` over that time.
266
+ */
267
+ export function createDeployment(core, projectId, project, sha, state, createdAt, opts = {}) {
268
+ const n = project.deployments.filter((d) => d.meta.githubCommitSha === sha).length + 1;
269
+ const buildMs = opts.buildMs ?? 0;
270
+ const d = {
271
+ uid: core.nextId("dpl_"),
272
+ url: `${projectId}-${sha.slice(0, 8)}${n > 1 ? `-${n}` : ""}.vercel.app`,
273
+ state: buildMs > 0 ? "QUEUED" : state,
274
+ createdAt,
275
+ ...(buildMs > 0 ? { buildingAt: createdAt + buildMs / 3, readyAt: createdAt + buildMs, finalState: state } : {}),
276
+ meta: { githubCommitSha: sha, ...(opts.ref ? { githubCommitRef: opts.ref } : {}) },
277
+ target: opts.target ?? null,
278
+ createdBy: "api",
279
+ };
280
+ if (core.chaos.deploy === "cancel" && opts.ref) {
281
+ // Vercel's auto-cancel: a new build on a branch cancels the builds of that branch still in progress.
282
+ refreshDeployments(project.deployments, createdAt);
283
+ for (const old of project.deployments) {
284
+ if (old.meta.githubCommitRef === opts.ref && (old.state === "QUEUED" || old.state === "BUILDING")) {
285
+ old.state = "CANCELED";
286
+ delete old.finalState;
287
+ }
288
+ }
289
+ }
290
+ project.deployments.push(d);
291
+ return d;
292
+ }
293
+ /** Advance in-progress deployments to the state their timings say they are in now. */
294
+ export function refreshDeployments(list, now = Date.now()) {
295
+ for (const d of list) {
296
+ if (d.state !== "QUEUED" && d.state !== "BUILDING")
297
+ continue;
298
+ if (d.readyAt !== undefined && now >= d.readyAt) {
299
+ d.state = d.finalState ?? "READY";
300
+ delete d.finalState;
301
+ }
302
+ else if (d.state === "QUEUED" && (d.buildingAt === undefined || now >= d.buildingAt))
303
+ d.state = "BUILDING";
304
+ }
305
+ }
306
+ /** Stand-in for Vercel's git integration: the first lookup of a sha "triggers" its auto-deploy per the chaos mode. */
307
+ function autoDeploy(core, projectId, p, sha, target) {
308
+ const mode = core.chaos.deploy;
309
+ const now = Date.now();
310
+ // Vercel's git integration builds the production branch for production and every other push as a preview.
311
+ const opts = target ? { target } : {};
312
+ if (mode === "never")
313
+ return;
314
+ if (mode === "fail") {
315
+ createDeployment(core, projectId, p, sha, "ERROR", now, opts);
316
+ return;
317
+ }
318
+ if (mode === "stale") {
319
+ createDeployment(core, projectId, p, sha, "READY", now - 60_000, opts);
320
+ return;
321
+ }
322
+ if (mode === "double") {
323
+ createDeployment(core, projectId, p, sha, "READY", now - 1_000, opts);
324
+ createDeployment(core, projectId, p, sha, "READY", now, opts);
325
+ return;
326
+ }
327
+ const delay = mode.match(/^delay:(\d+(?:\.\d+)?)$/);
328
+ if (delay) {
329
+ const d = createDeployment(core, projectId, p, sha, "BUILDING", now, opts);
330
+ d.readyAt = now + Number(delay[1]) * 1000;
331
+ return;
332
+ }
333
+ createDeployment(core, projectId, p, sha, "READY", now, { ...opts, buildMs: core.chaos.deploy_ms });
334
+ }
335
+ function publicEnv(e) {
336
+ const { createdBy: _c, ...rest } = e;
337
+ return rest;
338
+ }
339
+ /** An item of GET /v7/deployments: `readyState` is the field the spec requires; `state` is optional there. */
340
+ function publicDeployment(projectId, d) {
341
+ return { uid: d.uid, name: projectId, projectId, url: d.url, readyState: d.state, state: d.state, created: d.createdAt, createdAt: d.createdAt, target: d.target, meta: d.meta };
342
+ }
343
+ function deploymentDetail(d) {
344
+ return { id: d.uid, url: d.url, readyState: d.state, createdAt: d.createdAt, target: d.target };
345
+ }
346
+ /**
347
+ * An env var as GET /v10/projects/:id/env (with `decrypt`) or GET /v1/projects/:id/env/:id (always decrypting)
348
+ * shows it: an `encrypted` value is opaque unless decrypted, a `sensitive` one is never returned.
349
+ */
350
+ function listedEnv(e, decrypt) {
351
+ const { createdBy: _c, value, ...rest } = e;
352
+ if (e.type === "plain")
353
+ return { ...rest, value, decrypted: false };
354
+ return { ...rest, value: decrypt ? value : `enc:${Buffer.from(value).toString("base64")}`, decrypted: decrypt };
355
+ }
356
+ /** Vercel's error body: `{ error: { code, message } }`. */
357
+ function badRequest(code, message) {
358
+ return new Reply(400, { error: { code, message } });
359
+ }
360
+ function notFound(what) {
361
+ return new Reply(404, { error: { code: "not_found", message: `${what} not found` } });
362
+ }
363
+ function sameSet(a, b) {
364
+ return a.length === b.length && a.every((x) => b.includes(x));
365
+ }
366
+ function splitOnce(s, sep) {
367
+ const i = s.indexOf(sep);
368
+ return i < 0 ? [s, undefined] : [s.slice(0, i), s.slice(i + 1)];
369
+ }
370
+ //# sourceMappingURL=vercel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../src/routes/vercel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Simulated Xata (the Postgres platform): branches of projects, created as copy-on-write children of a parent.
3
+ *
4
+ * Assumptions about the real API this fake encodes, checked against the official OpenAPI document
5
+ * (https://api.xata.tech/openapi.json) and the docs (https://xata.io/docs) unless marked unverified. The critical
6
+ * ones are pinned in scenarios/contract.test.ts (`assumption XA…`).
7
+ * XA1. The API is served at `https://api.xata.tech`, authenticated with an API key as `Authorization: Bearer`;
8
+ * the CLI reads it from `XATA_API_KEY`. (verified: spec security scheme; https://xata.io/docs/cli)
9
+ * XA2. `POST /organizations/{org}/projects/{project}/branches` with `{ mode: "inherit", parentID, name }`
10
+ * creates a copy-on-write child of the parent branch (by id) and answers 201 with the branch, bare:
11
+ * `{ id, name, parentID, region, createdAt, … }`. (verified: spec)
12
+ * XA3. `GET` of the same path answers `{ branches: [{ id, name, parentID, … }] }`, unpaginated. Names are not
13
+ * documented as unique and the create documents no 409, so a lookup by name may find more than one.
14
+ * (verified: spec; uniqueness unverified)
15
+ * XA4. `GET …/branches/{branchID}` answers the branch with `status: { statusType, … }`, and 404 when it does
16
+ * not exist; `DELETE` on the same path removes it permanently (204; 404 when gone). (verified: spec)
17
+ * XA5. A new branch "takes a moment to come up"; it is ready when `statusType` is healthy and broken when it is
18
+ * a fault (`STATUS_TYPE_HEALTHY`, `STATUS_TYPE_FAULT`; the adapter matches the suffix). (verified: the CLI's
19
+ * `branch wait-ready`, https://xata.io/docs/cli/branch; the exact enum spelling is unverified)
20
+ * XA6. `GET …/branches/{branchID}/credentials?username=xata` answers `{ username, password, hostname, port,
21
+ * dbname, connectionString }`, readable at any time (not only after the create). (verified: spec and
22
+ * https://xata.io/docs/platform/branch; "any time" inferred from it being a plain GET)
23
+ * XA7. A branch is ready within minutes, usually seconds (unverified: the adapter waits up to
24
+ * SPONSON_XATA_READY_TIMEOUT_MS, ten minutes by default).
25
+ */
26
+ import { type CreatedBy, type ProviderSim } from "../provider.js";
27
+ /** A branch as the simulated Xata stores it. */
28
+ export interface XataBranch {
29
+ id: string;
30
+ name: string;
31
+ parentID: string | null;
32
+ password: string;
33
+ /** GETs of the branch that still answer a transient status before it is healthy. */
34
+ pending: number;
35
+ createdBy: CreatedBy;
36
+ }
37
+ /** The simulated Xata's state: branches per `<org>/<project>`. */
38
+ export interface XataState {
39
+ projects: Record<string, {
40
+ branches: XataBranch[];
41
+ }>;
42
+ /** GETs of a new branch that answer a transient status (default 1). */
43
+ readyPolls: number;
44
+ }
45
+ /** What a scenario or test seeds the simulated Xata with (`seed: { xata: … }`). */
46
+ export interface XataSeed {
47
+ /** `<org>/<project>` → branches that exist already (unmanaged), by id and name. */
48
+ projects?: Record<string, Array<{
49
+ id: string;
50
+ name: string;
51
+ }>>;
52
+ readyPolls?: number;
53
+ }
54
+ /** The simulated Xata API, registered in `PROVIDERS` (packages/sim/src/state.ts) and served under `/xata`. */
55
+ export declare const xataSim: ProviderSim<XataState, XataSeed>;
56
+ /** The connection string of a branch (XA6), as the sim makes it up. */
57
+ export declare function xataConnectionString(b: XataBranch): string;
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Simulated Xata (the Postgres platform): branches of projects, created as copy-on-write children of a parent.
3
+ *
4
+ * Assumptions about the real API this fake encodes, checked against the official OpenAPI document
5
+ * (https://api.xata.tech/openapi.json) and the docs (https://xata.io/docs) unless marked unverified. The critical
6
+ * ones are pinned in scenarios/contract.test.ts (`assumption XA…`).
7
+ * XA1. The API is served at `https://api.xata.tech`, authenticated with an API key as `Authorization: Bearer`;
8
+ * the CLI reads it from `XATA_API_KEY`. (verified: spec security scheme; https://xata.io/docs/cli)
9
+ * XA2. `POST /organizations/{org}/projects/{project}/branches` with `{ mode: "inherit", parentID, name }`
10
+ * creates a copy-on-write child of the parent branch (by id) and answers 201 with the branch, bare:
11
+ * `{ id, name, parentID, region, createdAt, … }`. (verified: spec)
12
+ * XA3. `GET` of the same path answers `{ branches: [{ id, name, parentID, … }] }`, unpaginated. Names are not
13
+ * documented as unique and the create documents no 409, so a lookup by name may find more than one.
14
+ * (verified: spec; uniqueness unverified)
15
+ * XA4. `GET …/branches/{branchID}` answers the branch with `status: { statusType, … }`, and 404 when it does
16
+ * not exist; `DELETE` on the same path removes it permanently (204; 404 when gone). (verified: spec)
17
+ * XA5. A new branch "takes a moment to come up"; it is ready when `statusType` is healthy and broken when it is
18
+ * a fault (`STATUS_TYPE_HEALTHY`, `STATUS_TYPE_FAULT`; the adapter matches the suffix). (verified: the CLI's
19
+ * `branch wait-ready`, https://xata.io/docs/cli/branch; the exact enum spelling is unverified)
20
+ * XA6. `GET …/branches/{branchID}/credentials?username=xata` answers `{ username, password, hostname, port,
21
+ * dbname, connectionString }`, readable at any time (not only after the create). (verified: spec and
22
+ * https://xata.io/docs/platform/branch; "any time" inferred from it being a plain GET)
23
+ * XA7. A branch is ready within minutes, usually seconds (unverified: the adapter waits up to
24
+ * SPONSON_XATA_READY_TIMEOUT_MS, ten minutes by default).
25
+ */
26
+ import { Reply, route, router } from "../provider.js";
27
+ /** The simulated Xata API, registered in `PROVIDERS` (packages/sim/src/state.ts) and served under `/xata`. */
28
+ export const xataSim = {
29
+ env: { token: "XATA_API_KEY", url: "XATA_API_URL", testToken: "tok_xata" },
30
+ defaultSeed: { projects: { "acme/app": [{ id: "br_main", name: "main" }] } },
31
+ reset(core, seed) {
32
+ const projects = {};
33
+ for (const [key, list] of Object.entries(seed?.projects ?? {})) {
34
+ projects[key] = { branches: list.map((b) => ({ id: b.id, name: b.name, parentID: null, password: password(core), pending: 0, createdBy: "sim" })) };
35
+ }
36
+ return { projects, readyPolls: seed?.readyPolls ?? 1 };
37
+ },
38
+ /** `branch.<name>`: "delete" — what a human in the Xata console would do. */
39
+ drift(_core, state, { key, rest, value, only }) {
40
+ if (only !== undefined || !rest.startsWith("branch."))
41
+ return false;
42
+ const name = rest.slice("branch.".length);
43
+ if (value !== "delete")
44
+ throw new Error(`drift ${key}: only "delete" is supported`);
45
+ let hit = false;
46
+ for (const p of Object.values(state.projects)) {
47
+ const before = p.branches.length;
48
+ p.branches = p.branches.filter((b) => b.name !== name);
49
+ hit ||= p.branches.length < before;
50
+ }
51
+ if (!hit)
52
+ throw new Error(`drift ${key}: no branch ${name}`);
53
+ return true;
54
+ },
55
+ routes(core, state, req) {
56
+ return routes(core, state, req);
57
+ },
58
+ };
59
+ function password(core) {
60
+ return `xata_pw_sim_${core.nextId("")}`;
61
+ }
62
+ /** The connection string of a branch (XA6), as the sim makes it up. */
63
+ export function xataConnectionString(b) {
64
+ return `postgresql://xata:${b.password}@${b.id}.us-east-1.sim.xata.tech:5432/xata?sslmode=require`;
65
+ }
66
+ function publicBranch(b) {
67
+ return { id: b.id, name: b.name, parentID: b.parentID, region: "us-east-1", publicAccess: false };
68
+ }
69
+ function find(state, p) {
70
+ return state.projects[`${p.org}/${p.project}`]?.branches.find((b) => b.id === p.id);
71
+ }
72
+ const notFound = () => new Reply(404, { id: "not_found", message: "branch not found" });
73
+ const routes = router([
74
+ route("GET", "/organizations/:org/projects/:project/branches", ({ state, params }) => {
75
+ const p = state.projects[`${params.org}/${params.project}`];
76
+ return p ? new Reply(200, { branches: p.branches.map(publicBranch) }) : new Reply(404, { id: "not_found", message: "project not found" });
77
+ }),
78
+ route("POST", "/organizations/:org/projects/:project/branches", ({ core, state, params, body }) => {
79
+ const p = state.projects[`${params.org}/${params.project}`];
80
+ if (!p)
81
+ return new Reply(404, { id: "not_found", message: "project not found" });
82
+ const b = (body ?? {});
83
+ if (b.mode !== "inherit" || typeof b.name !== "string" || b.name === "" || typeof b.parentID !== "string")
84
+ return new Reply(400, { id: "bad_request", message: "mode inherit, parentID and name are required" });
85
+ if (!p.branches.some((x) => x.id === b.parentID))
86
+ return new Reply(404, { id: "not_found", message: "parent branch not found" });
87
+ const created = { id: core.nextId("br_"), name: b.name, parentID: b.parentID, password: password(core), pending: state.readyPolls, createdBy: "api" };
88
+ p.branches.push(created);
89
+ return new Reply(201, publicBranch(created));
90
+ }),
91
+ route("GET", "/organizations/:org/projects/:project/branches/:id", ({ state, params }) => {
92
+ const b = find(state, params);
93
+ if (!b)
94
+ return notFound();
95
+ const transient = b.pending > 0;
96
+ if (transient)
97
+ b.pending--;
98
+ return new Reply(200, { ...publicBranch(b), status: { statusType: transient ? "STATUS_TYPE_TRANSIENT" : "STATUS_TYPE_HEALTHY", instanceCount: 1, instanceReadyCount: transient ? 0 : 1 } });
99
+ }),
100
+ route("GET", "/organizations/:org/projects/:project/branches/:id/credentials", ({ state, params }) => {
101
+ const b = find(state, params);
102
+ if (!b)
103
+ return notFound();
104
+ return new Reply(200, { username: "xata", password: b.password, hostname: `${b.id}.us-east-1.sim.xata.tech`, port: 5432, dbname: "xata", connectionString: xataConnectionString(b) });
105
+ }),
106
+ route("DELETE", "/organizations/:org/projects/:project/branches/:id", ({ state, params }) => {
107
+ const p = state.projects[`${params.org}/${params.project}`];
108
+ const b = find(state, params);
109
+ if (!p || !b)
110
+ return notFound();
111
+ p.branches = p.branches.filter((x) => x !== b);
112
+ return new Reply(204, null);
113
+ }),
114
+ ], notFound);
115
+ //# sourceMappingURL=xata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xata.js","sourceRoot":"","sources":["../../src/routes/xata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type Server } from "node:http";
2
+ import { type SimState } from "./state.js";
3
+ /** The sim's HTTP server over `state`, not yet listening. Most callers want `startSim`. */
4
+ export declare function createSimServer(state: SimState): Server;