@celsoft/platform 0.7.0 → 0.9.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.
@@ -1,7 +1,9 @@
1
- import type { Cloudflare, DnsRecord, Hyperdrive, Zone, ZoneRecord } from "../ports.js";
1
+ import type { Cloudflare, DnsRecord, Hyperdrive, LegacyWorker, Zone, ZoneRecord } from "../ports.js";
2
+ import { R2S3 } from "./r2.js";
2
3
  export declare class CloudflareApi implements Cloudflare {
3
4
  private readonly client;
4
5
  private account;
6
+ readonly s3: R2S3;
5
7
  constructor(apiToken: string);
6
8
  accountId(): Promise<string>;
7
9
  findZone(hostname: string): Promise<Zone | undefined>;
@@ -11,24 +13,23 @@ export declare class CloudflareApi implements Cloudflare {
11
13
  updateHyperdrive(id: string, connectionUri: string): Promise<Hyperdrive>;
12
14
  deleteHyperdrive(id: string): Promise<void>;
13
15
  findWorker(name: string): Promise<boolean>;
14
- workerOwner(name: string): Promise<{
15
- app: string | null;
16
- hyperdriveIds: string[];
17
- } | undefined>;
18
- tagWorker(name: string, app: string, pr: number | undefined): Promise<void>;
16
+ legacyWorker(name: string): Promise<LegacyWorker | undefined>;
19
17
  listWorkers(namePrefix: string): Promise<string[]>;
20
18
  deleteWorker(name: string): Promise<void>;
21
19
  workerSecretNames(worker: string): Promise<string[]>;
22
20
  dnsRecords(zoneId: string, name: string): Promise<ZoneRecord[]>;
23
- managedDnsRecords(zoneId: string): Promise<ZoneRecord[]>;
21
+ commentedDnsRecords(zoneId: string, comment: string): Promise<ZoneRecord[]>;
22
+ setDnsRecordComment(zoneId: string, id: string, comment: string): Promise<void>;
24
23
  findBucket(name: string): Promise<boolean>;
25
- createBucket(name: string, app: string): Promise<void>;
26
- bucketOwner(name: string): Promise<string | null | undefined>;
24
+ createBucket(name: string): Promise<void>;
25
+ legacyBucketApp(name: string): Promise<string | null | undefined>;
27
26
  deleteBucket(name: string): Promise<void>;
28
27
  bucketExpiryDays(name: string): Promise<number | undefined>;
29
28
  setBucketExpiry(name: string, days: number): Promise<void>;
30
29
  deleteObjects(bucket: string, prefix: string): Promise<number>;
30
+ listObjects(bucket: string, prefix: string): Promise<string[]>;
31
+ copyObject(from: string, key: string, to: string): Promise<void>;
31
32
  deleteDnsRecord(zoneId: string, id: string): Promise<void>;
32
33
  private listRecords;
33
- createDnsRecord(zoneId: string, record: DnsRecord): Promise<void>;
34
+ createDnsRecord(zoneId: string, record: DnsRecord, comment: string): Promise<void>;
34
35
  }
@@ -1,13 +1,15 @@
1
1
  import CloudflareClient from "cloudflare";
2
- import { MANAGED_COMMENT } from "../lifecycle.js";
3
- import { appTag, BUCKET_MARKER, PLATFORM_TAG, prTag } from "../ownership.js";
2
+ import { LEGACY_BUCKET_MARKER, LEGACY_PLATFORM_TAG } from "../legacy.js";
3
+ import { R2S3 } from "./r2.js";
4
4
  import { originOf } from "../target.js";
5
5
  const EXPIRY_RULE = "platform-expiry";
6
6
  export class CloudflareApi {
7
7
  client;
8
8
  account;
9
+ s3;
9
10
  constructor(apiToken) {
10
11
  this.client = new CloudflareClient({ apiToken });
12
+ this.s3 = new R2S3(apiToken, () => this.accountId());
11
13
  }
12
14
  async accountId() {
13
15
  if (this.account)
@@ -72,20 +74,16 @@ export class CloudflareApi {
72
74
  }
73
75
  return false;
74
76
  }
75
- async workerOwner(name) {
77
+ async legacyWorker(name) {
76
78
  if (!(await this.findWorker(name)))
77
79
  return undefined;
78
80
  const account_id = await this.accountId();
79
81
  const { tags } = await this.client.workers.scripts.settings.get(name, { account_id });
80
82
  const { bindings = [] } = await this.client.workers.scripts.scriptAndVersionSettings.get(name, { account_id });
81
- const app = tags?.includes(PLATFORM_TAG) ? (tags.find((t) => t.startsWith("app:"))?.slice(4) ?? null) : null;
83
+ const app = tags?.includes(LEGACY_PLATFORM_TAG) ? (tags.find((t) => t.startsWith("app:"))?.slice(4) ?? null) : null;
82
84
  const hyperdriveIds = bindings.filter((b) => b.type === "hyperdrive" && b.id).map((b) => b.id);
83
85
  return { app, hyperdriveIds };
84
86
  }
85
- async tagWorker(name, app, pr) {
86
- const tags = [PLATFORM_TAG, appTag(app), ...(pr ? [prTag(pr)] : [])];
87
- await this.client.workers.scripts.settings.edit(name, { account_id: await this.accountId(), tags });
88
- }
89
87
  async listWorkers(namePrefix) {
90
88
  const account_id = await this.accountId();
91
89
  const names = [];
@@ -111,22 +109,23 @@ export class CloudflareApi {
111
109
  async dnsRecords(zoneId, name) {
112
110
  return this.listRecords({ zone_id: zoneId, name: { exact: name } });
113
111
  }
114
- async managedDnsRecords(zoneId) {
115
- return this.listRecords({ zone_id: zoneId, comment: { exact: MANAGED_COMMENT } });
112
+ async commentedDnsRecords(zoneId, comment) {
113
+ return this.listRecords({ zone_id: zoneId, comment: { exact: comment } });
114
+ }
115
+ async setDnsRecordComment(zoneId, id, comment) {
116
+ await this.client.dns.records.edit(id, { zone_id: zoneId, comment });
116
117
  }
117
118
  async findBucket(name) {
118
119
  const { buckets = [] } = await this.client.r2.buckets.list({ account_id: await this.accountId(), name_contains: name });
119
120
  return buckets.some((b) => b.name === name);
120
121
  }
121
- async createBucket(name, app) {
122
- const account_id = await this.accountId();
123
- await this.client.r2.buckets.create({ account_id, name });
124
- await this.client.r2.buckets.objects.upload(BUCKET_MARKER, app, { account_id, bucket_name: name });
122
+ async createBucket(name) {
123
+ await this.client.r2.buckets.create({ account_id: await this.accountId(), name });
125
124
  }
126
- async bucketOwner(name) {
125
+ async legacyBucketApp(name) {
127
126
  if (!(await this.findBucket(name)))
128
127
  return undefined;
129
- const response = await this.client.r2.buckets.objects.get(BUCKET_MARKER, { account_id: await this.accountId(), bucket_name: name }).catch(() => undefined);
128
+ const response = await this.client.r2.buckets.objects.get(LEGACY_BUCKET_MARKER, { account_id: await this.accountId(), bucket_name: name }).catch(() => undefined);
130
129
  return response?.ok ? (await response.text()).trim() : null;
131
130
  }
132
131
  async deleteBucket(name) {
@@ -144,15 +143,23 @@ export class CloudflareApi {
144
143
  });
145
144
  }
146
145
  async deleteObjects(bucket, prefix) {
146
+ const account_id = await this.accountId();
147
+ const keys = await this.listObjects(bucket, prefix);
148
+ for (const key of keys)
149
+ await this.client.r2.buckets.objects.delete(key, { account_id, bucket_name: bucket });
150
+ return keys.length;
151
+ }
152
+ async listObjects(bucket, prefix) {
147
153
  const account_id = await this.accountId();
148
154
  const keys = [];
149
155
  for await (const object of this.client.r2.buckets.objects.list(bucket, { account_id, prefix })) {
150
156
  if (object.key)
151
157
  keys.push(object.key);
152
158
  }
153
- for (const key of keys)
154
- await this.client.r2.buckets.objects.delete(key, { account_id, bucket_name: bucket });
155
- return keys.length;
159
+ return keys;
160
+ }
161
+ async copyObject(from, key, to) {
162
+ await this.s3.copy(from, key, to);
156
163
  }
157
164
  async deleteDnsRecord(zoneId, id) {
158
165
  await this.client.dns.records.delete(id, { zone_id: zoneId });
@@ -161,18 +168,18 @@ export class CloudflareApi {
161
168
  const records = [];
162
169
  for await (const r of this.client.dns.records.list(params)) {
163
170
  const priority = "priority" in r ? r.priority : undefined;
164
- records.push({ id: r.id, type: r.type, name: r.name, content: String(r.content ?? ""), ...(priority !== undefined && { priority }), managed: r.comment === MANAGED_COMMENT });
171
+ records.push({ id: r.id, type: r.type, name: r.name, content: String(r.content ?? ""), ...(priority !== undefined && { priority }), comment: r.comment ?? undefined });
165
172
  }
166
173
  return records;
167
174
  }
168
- async createDnsRecord(zoneId, record) {
175
+ async createDnsRecord(zoneId, record, comment) {
169
176
  await this.client.dns.records.create({
170
177
  zone_id: zoneId,
171
178
  type: record.type,
172
179
  name: record.name,
173
180
  content: record.content,
174
181
  ttl: 1,
175
- comment: MANAGED_COMMENT,
182
+ comment,
176
183
  ...(record.priority !== undefined && { priority: record.priority }),
177
184
  });
178
185
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../../src/adapters/cloudflare.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../../src/adapters/cloudflare.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
- import type { GitHub } from "../ports.js";
1
+ import type { GitHub, Repo } from "../ports.js";
2
2
  export declare class GhCli implements GitHub {
3
3
  private readonly repoRoot;
4
4
  constructor(repoRoot: string);
5
5
  setSecret(name: string, value: string): Promise<void>;
6
6
  ensureEnvironment(name: string): Promise<void>;
7
7
  openPullRequests(): Promise<number[]>;
8
+ repository(): Promise<Repo>;
8
9
  private gh;
9
10
  }
10
11
  export declare function commentPreviewLink(env: NodeJS.ProcessEnv, pr: number, url: string, sha?: string): Promise<void>;
@@ -15,6 +15,11 @@ export class GhCli {
15
15
  const out = await this.gh(["pr", "list", "--state", "open", "--limit", "1000", "--json", "number", "--jq", ".[].number"]);
16
16
  return out.split("\n").filter(Boolean).map(Number);
17
17
  }
18
+ // `gh repo view` gives a GraphQL node id; the REST API gives the numeric one Actions also uses.
19
+ async repository() {
20
+ const name = (await this.gh(["repo", "view", "--json", "nameWithOwner", "--jq", ".nameWithOwner"])).trim();
21
+ return JSON.parse(await this.gh(["api", `repos/${name}`, "--jq", "{id, name: .full_name}"]));
22
+ }
18
23
  gh(args, stdin) {
19
24
  return new Promise((resolve, reject) => {
20
25
  const child = spawn("gh", args, { cwd: this.repoRoot, stdio: ["pipe", "pipe", "inherit"] });
@@ -1 +1 @@
1
- {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/adapters/github.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/adapters/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare class R2S3 {
2
+ private readonly apiToken;
3
+ private readonly accountId;
4
+ private keys;
5
+ constructor(apiToken: string, accountId: () => Promise<string>);
6
+ put(bucket: string, key: string, body: string, { ifAbsent }?: {
7
+ ifAbsent?: boolean | undefined;
8
+ }): Promise<boolean>;
9
+ get(bucket: string, key: string): Promise<string | undefined>;
10
+ delete(bucket: string, key: string): Promise<void>;
11
+ copy(from: string, key: string, to: string): Promise<void>;
12
+ list(bucket: string, prefix: string): Promise<string[]>;
13
+ private request;
14
+ private credentials;
15
+ }
@@ -0,0 +1,99 @@
1
+ import { createHash, createHmac } from "node:crypto";
2
+ // R2's S3 API, for what its REST API cannot do: writing only if absent (the REST API ignores
3
+ // If-None-Match) and copying objects with their metadata. Its keys come from the API token
4
+ // itself: the token's id is the access key, and the SHA-256 of its value is the secret.
5
+ export class R2S3 {
6
+ apiToken;
7
+ accountId;
8
+ keys;
9
+ constructor(apiToken, accountId) {
10
+ this.apiToken = apiToken;
11
+ this.accountId = accountId;
12
+ }
13
+ // False when ifAbsent is set and the key already exists.
14
+ async put(bucket, key, body, { ifAbsent = false } = {}) {
15
+ const response = await this.request("PUT", bucket, key, { body, headers: { "content-type": "application/json", ...(ifAbsent && { "if-none-match": "*" }) } });
16
+ if (response.status === 412)
17
+ return false;
18
+ await expectOk(response, `write ${bucket}/${key}`);
19
+ return true;
20
+ }
21
+ async get(bucket, key) {
22
+ const response = await this.request("GET", bucket, key);
23
+ if (response.status === 404)
24
+ return undefined;
25
+ await expectOk(response, `read ${bucket}/${key}`);
26
+ return response.text();
27
+ }
28
+ async delete(bucket, key) {
29
+ const response = await this.request("DELETE", bucket, key);
30
+ if (response.status !== 404)
31
+ await expectOk(response, `delete ${bucket}/${key}`);
32
+ }
33
+ async copy(from, key, to) {
34
+ const source = `/${from}/${key.split("/").map(encodeURIComponent).join("/")}`;
35
+ await expectOk(await this.request("PUT", to, key, { headers: { "x-amz-copy-source": source } }), `copy ${key} from ${from} to ${to}`);
36
+ }
37
+ async list(bucket, prefix) {
38
+ const keys = [];
39
+ let token;
40
+ do {
41
+ const query = { "list-type": "2", prefix, ...(token && { "continuation-token": token }) };
42
+ const response = await this.request("GET", bucket, "", { query });
43
+ await expectOk(response, `list ${bucket}`);
44
+ const xml = await response.text();
45
+ for (const match of xml.matchAll(/<Key>([^<]*)<\/Key>/g))
46
+ keys.push(unescapeXml(match[1]));
47
+ token = /<IsTruncated>true<\/IsTruncated>/.test(xml) ? unescapeXml(/<NextContinuationToken>([^<]*)</.exec(xml)?.[1] ?? "") : undefined;
48
+ } while (token);
49
+ return keys;
50
+ }
51
+ async request(method, bucket, key, options = {}) {
52
+ const { accessKey, secretKey } = await (this.keys ??= this.credentials());
53
+ const host = `${await this.accountId()}.r2.cloudflarestorage.com`;
54
+ const path = `/${bucket}${key ? `/${key.split("/").map(encodeRfc3986).join("/")}` : ""}`;
55
+ const query = Object.entries(options.query ?? {})
56
+ .map(([k, v]) => `${encodeRfc3986(k)}=${encodeRfc3986(v)}`)
57
+ .sort()
58
+ .join("&");
59
+ const now = new Date().toISOString().replace(/[-:]|\.\d{3}/g, "");
60
+ const day = now.slice(0, 8);
61
+ const payload = sha256(options.body ?? "");
62
+ const headers = { host, "x-amz-content-sha256": payload, "x-amz-date": now, ...options.headers };
63
+ const names = Object.keys(headers).sort();
64
+ const canonical = [method, path, query, names.map((n) => `${n}:${headers[n].trim()}\n`).join(""), names.join(";"), payload].join("\n");
65
+ const scope = `${day}/auto/s3/aws4_request`;
66
+ const toSign = ["AWS4-HMAC-SHA256", now, scope, sha256(canonical)].join("\n");
67
+ let signingKey = Buffer.from(`AWS4${secretKey}`);
68
+ for (const part of [day, "auto", "s3", "aws4_request"])
69
+ signingKey = hmac(signingKey, part);
70
+ const signature = hmac(signingKey, toSign).toString("hex");
71
+ headers.authorization = `AWS4-HMAC-SHA256 Credential=${accessKey}/${scope}, SignedHeaders=${names.join(";")}, Signature=${signature}`;
72
+ delete headers.host;
73
+ return fetch(`https://${host}${path}${query ? `?${query}` : ""}`, { method, headers, ...(options.body !== undefined && { body: options.body }) });
74
+ }
75
+ async credentials() {
76
+ const response = await fetch("https://api.cloudflare.com/client/v4/user/tokens/verify", { headers: { authorization: `Bearer ${this.apiToken}` } });
77
+ const { result } = (await response.json());
78
+ if (!result?.id)
79
+ throw new Error("could not read the Cloudflare token's id, which R2's S3 API uses as its access key");
80
+ return { accessKey: result.id, secretKey: sha256(this.apiToken) };
81
+ }
82
+ }
83
+ async function expectOk(response, what) {
84
+ if (!response.ok)
85
+ throw new Error(`R2 could not ${what}: ${response.status} ${(await response.text()).slice(0, 200)}`);
86
+ }
87
+ function sha256(value) {
88
+ return createHash("sha256").update(value).digest("hex");
89
+ }
90
+ function hmac(key, value) {
91
+ return createHmac("sha256", key).update(value).digest();
92
+ }
93
+ function encodeRfc3986(value) {
94
+ return encodeURIComponent(value).replace(/[!'()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);
95
+ }
96
+ function unescapeXml(value) {
97
+ return value.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"').replace(/&apos;/g, "'").replace(/&amp;/g, "&");
98
+ }
99
+ //# sourceMappingURL=r2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r2.js","sourceRoot":"","sources":["../../src/adapters/r2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,6FAA6F;AAC7F,2FAA2F;AAC3F,wFAAwF;AACxF,MAAM,OAAO,IAAI;IAII,QAAQ;IACR,SAAS;IAJpB,IAAI,CAAgE;IAE5E,YACmB,QAAgB,EAChB,SAAgC;wBADhC,QAAQ;yBACR,SAAS;IACzB,CAAC;IAEJ,yDAAyD;IACzD,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,GAAW,EAAE,IAAY,EAAE,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,EAAE;QAC5E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9J,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QAC1C,MAAM,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,GAAW;QACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACxD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,SAAS,CAAC;QAC9C,MAAM,QAAQ,CAAC,QAAQ,EAAE,QAAQ,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,GAAW;QACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3D,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,QAAQ,CAAC,QAAQ,EAAE,UAAU,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,GAAW,EAAE,EAAU;QAC9C,MAAM,MAAM,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9E,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,SAAS,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;IACxI,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,MAAc;QACvC,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAI,KAAyB,CAAC;QAC9B,GAAG,CAAC;YACF,MAAM,KAAK,GAA2B,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAClH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAClE,MAAM,QAAQ,CAAC,QAAQ,EAAE,QAAQ,MAAM,EAAE,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;YAC5F,KAAK,GAAG,kCAAkC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,iCAAiC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzI,CAAC,QAAQ,KAAK,EAAE;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,MAAc,EAAE,GAAW,EAAE,OAAO,GAAwF,EAAE;QAClK,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,2BAA2B,CAAC;QAClE,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACzF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;aAC9C,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1D,IAAI,EAAE;aACN,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,OAAO,GAA2B,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QACzH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxI,MAAM,KAAK,GAAG,GAAG,GAAG,uBAAuB,CAAC;QAC5C,MAAM,MAAM,GAAG,CAAC,kBAAkB,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9E,IAAI,UAAU,GAAW,MAAM,CAAC,IAAI,CAAC,OAAO,SAAS,EAAE,CAAC,CAAC;QACzD,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC;YAAE,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC5F,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC3D,OAAO,CAAC,aAAa,GAAG,+BAA+B,SAAS,IAAI,KAAK,mBAAmB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,SAAS,EAAE,CAAC;QACtI,OAAO,OAAO,CAAC,IAAI,CAAC;QAEpB,OAAO,KAAK,CAAC,WAAW,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACpJ,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,yDAAyD,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QACnJ,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiC,CAAC;QAC3E,IAAI,CAAC,MAAM,EAAE,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;QACvH,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;IACpE,CAAC;CACF;AAED,KAAK,UAAU,QAAQ,CAAC,QAAkB,EAAE,IAAY;IACtD,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AACzH,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,IAAI,CAAC,GAAW,EAAE,KAAa;IACtC,OAAO,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAChH,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAClI,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Cloudflare, Registry, Repo } from "../ports.js";
2
+ import type { R2S3 } from "./r2.js";
3
+ export declare const REGISTRY_BUCKET = "celsoft-platform";
4
+ export declare class R2Registry implements Registry {
5
+ private readonly s3;
6
+ private readonly cloudflare;
7
+ private ready;
8
+ constructor(s3: R2S3, cloudflare: Cloudflare);
9
+ get(app: string): Promise<Repo | undefined>;
10
+ claim(app: string, repo: Repo): Promise<boolean>;
11
+ set(app: string, repo: Repo): Promise<void>;
12
+ release(app: string): Promise<void>;
13
+ private ensureBucket;
14
+ }
@@ -0,0 +1,42 @@
1
+ export const REGISTRY_BUCKET = "celsoft-platform";
2
+ const key = (app) => `apps/${app}.json`;
3
+ // One object per app in an account-wide bucket, each naming the repo that deploys it.
4
+ export class R2Registry {
5
+ s3;
6
+ cloudflare;
7
+ ready;
8
+ constructor(s3, cloudflare) {
9
+ this.s3 = s3;
10
+ this.cloudflare = cloudflare;
11
+ }
12
+ async get(app) {
13
+ if (!(await this.cloudflare.findBucket(REGISTRY_BUCKET)))
14
+ return undefined;
15
+ const text = await this.s3.get(REGISTRY_BUCKET, key(app));
16
+ return text === undefined ? undefined : JSON.parse(text);
17
+ }
18
+ async claim(app, repo) {
19
+ await this.ensureBucket();
20
+ return this.s3.put(REGISTRY_BUCKET, key(app), JSON.stringify(repo), { ifAbsent: true });
21
+ }
22
+ async set(app, repo) {
23
+ await this.ensureBucket();
24
+ await this.s3.put(REGISTRY_BUCKET, key(app), JSON.stringify(repo));
25
+ }
26
+ async release(app) {
27
+ if (await this.cloudflare.findBucket(REGISTRY_BUCKET))
28
+ await this.s3.delete(REGISTRY_BUCKET, key(app));
29
+ }
30
+ ensureBucket() {
31
+ return (this.ready ??= (async () => {
32
+ if (await this.cloudflare.findBucket(REGISTRY_BUCKET))
33
+ return;
34
+ // Two first deploys may both try; the loser's create fails, and the bucket exists either way.
35
+ await this.cloudflare.createBucket(REGISTRY_BUCKET).catch(async (error) => {
36
+ if (!(await this.cloudflare.findBucket(REGISTRY_BUCKET)))
37
+ throw error;
38
+ });
39
+ })());
40
+ }
41
+ }
42
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/adapters/registry.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAElD,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,QAAQ,GAAG,OAAO,CAAC;AAEhD,sFAAsF;AACtF,MAAM,OAAO,UAAU;IAIF,EAAE;IACF,UAAU;IAJrB,KAAK,CAA4B;IAEzC,YACmB,EAAQ,EACR,UAAsB;kBADtB,EAAE;0BACF,UAAU;IAC1B,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QAC3E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAU,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,IAAU;QACjC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,IAAU;QAC/B,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACzG,CAAC;IAEO,YAAY;QAClB,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,IAAI,EAAE;YACjC,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC;gBAAE,OAAO;YAC9D,8FAA8F;YAC9F,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAc,EAAE,EAAE;gBACjF,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;oBAAE,MAAM,KAAK,CAAC;YACxE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,EAAE,CAAC,CAAC;IACR,CAAC;CACF"}
package/dist/cli.js CHANGED
@@ -8,14 +8,14 @@ import { parseArgs } from "node:util";
8
8
  import { CloudflareApi } from "./adapters/cloudflare.js";
9
9
  import { commentPreviewLink, GhCli } from "./adapters/github.js";
10
10
  import { NeonApi } from "./adapters/neon.js";
11
+ import { R2Registry } from "./adapters/registry.js";
11
12
  import { ResendApi } from "./adapters/resend.js";
12
13
  import { DrizzleMigrator } from "./adapters/drizzle.js";
13
14
  import { resetOwner } from "./adapters/owner.js";
14
15
  import { WranglerCli } from "./adapters/process.js";
15
16
  import { CONFIG_FILE, ConfigError, configVariables, parseConfig, readConfigText, upgradeConfigText } from "./config.js";
16
17
  import { checkWorkflow, init, tokenNames } from "./init.js";
17
- import { cleanup, deploy, destroy, dev, PreflightError, sweep } from "./lifecycle.js";
18
- import { UnprovenError } from "./ownership.js";
18
+ import { cleanup, deploy, destroy, dev, findPreviews, moveApp, PreflightError, sweep } from "./lifecycle.js";
19
19
  import { Run } from "./run.js";
20
20
  import { loadSecrets, loadVars } from "./secrets.js";
21
21
  const usage = `usage: npx @celsoft/platform <command> [--dry-run] [--dir <app dir>]
@@ -28,10 +28,12 @@ commands:
28
28
  deploy deploy prod
29
29
  preview <pr> create or update the preview for a pull request
30
30
  cleanup <pr> delete the preview for a pull request
31
+ previews list the previews that exist, with their pull request's state
31
32
  sweep delete previews whose pull request is closed
32
33
  owner reset <email> [--pr <n>]
33
34
  make that account the owner and set its password, for an owner locked out
34
35
  destroy [--data] delete everything the platform made for the app; --data also deletes its data
36
+ apps move give the app's name to this repo, when it takes the app over from another
35
37
  ci run the command for the current GitHub Actions event`;
36
38
  async function main(argv) {
37
39
  const { values, positionals } = parseArgs({
@@ -96,6 +98,10 @@ async function main(argv) {
96
98
  await ownerReset(ctx, app.config, command.email, values.pr === undefined ? undefined : prNumber(values.pr));
97
99
  return;
98
100
  }
101
+ if (command.name === "previews") {
102
+ await listPreviews(ctx, appDir);
103
+ return;
104
+ }
99
105
  if (command.name === "sweep") {
100
106
  await sweep(ctx, await new GhCli(repoRoot(appDir)).openPullRequests());
101
107
  return;
@@ -104,6 +110,10 @@ async function main(argv) {
104
110
  await confirmDestroy(ctx, app.config.name, values.data);
105
111
  return;
106
112
  }
113
+ if (command.name === "apps move") {
114
+ await moveApp(ctx);
115
+ return;
116
+ }
107
117
  const { hostname } = await deploy(ctx, command.name === "deploy" ? { kind: "prod" } : { kind: "preview", pr: command.pr });
108
118
  if (dryRun)
109
119
  return;
@@ -122,7 +132,9 @@ function parseCommand([name, pr, extra]) {
122
132
  }
123
133
  if (name === "db" && pr === "generate")
124
134
  return { name: "db generate" };
125
- if (name === "upgrade" || name === "sweep")
135
+ if (name === "apps" && pr === "move")
136
+ return { name: "apps move" };
137
+ if (name === "upgrade" || name === "sweep" || name === "previews")
126
138
  return { name };
127
139
  if (name === "init" || name === "dev" || name === "deploy" || name === "destroy")
128
140
  return { name };
@@ -155,23 +167,48 @@ async function loadApp(appDir) {
155
167
  return { config: parseConfig(text, join(appDir, CONFIG_FILE), variables), variables };
156
168
  }
157
169
  async function context(appDir, config, dryRun) {
158
- const secrets = await loadSecrets(appDir, [...tokenNames(config), ...config.secrets]);
170
+ // Every provider key is read whatever platform.jsonc turns on, so destroy can find what an
171
+ // earlier configuration made.
172
+ const secrets = await loadSecrets(appDir, [...tokenNames({ ...config, email: true }), ...(config.database ? [] : ["NEON_API_KEY"]), ...config.secrets]);
159
173
  const cloudflareToken = requireToken(secrets, "CLOUDFLARE_API_TOKEN");
160
- const neonKey = config.database ? requireToken(secrets, "NEON_API_KEY") : "";
161
- const resendKey = config.email ? requireToken(secrets, "RESEND_API_KEY") : "";
174
+ const neonKey = config.database ? requireToken(secrets, "NEON_API_KEY") : (secrets.NEON_API_KEY ?? "");
175
+ const resendKey = config.email ? requireToken(secrets, "RESEND_API_KEY") : (secrets.RESEND_API_KEY ?? "");
176
+ const cloudflare = new CloudflareApi(cloudflareToken);
177
+ let repo;
162
178
  return {
163
179
  config,
164
180
  secrets,
165
181
  run: new Run(dryRun, (line) => console.log(line)),
182
+ repo: () => (repo ??= currentRepo(appDir)),
183
+ providers: { neon: Boolean(neonKey), mail: Boolean(resendKey) },
166
184
  ports: {
167
- cloudflare: new CloudflareApi(cloudflareToken),
185
+ cloudflare,
168
186
  neon: new NeonApi(neonKey),
169
187
  mail: new ResendApi(resendKey),
188
+ registry: new R2Registry(cloudflare.s3, cloudflare),
170
189
  wrangler: new WranglerCli(appDir, { CLOUDFLARE_API_TOKEN: cloudflareToken }, config.worker),
171
190
  migrator: new DrizzleMigrator(appDir, config),
172
191
  },
173
192
  };
174
193
  }
194
+ // Actions names the repo it runs in; locally the GitHub CLI looks it up from the git remote.
195
+ async function currentRepo(appDir) {
196
+ const { GITHUB_REPOSITORY_ID: id, GITHUB_REPOSITORY: name } = process.env;
197
+ if (id && name)
198
+ return { id: Number(id), name };
199
+ return new GhCli(repoRoot(appDir)).repository();
200
+ }
201
+ // Read-only: what exists for each preview, so leftovers a cleanup missed stand out.
202
+ async function listPreviews(ctx, appDir) {
203
+ const previews = await findPreviews(ctx);
204
+ if (previews.length === 0)
205
+ return console.log("no previews");
206
+ const open = await new GhCli(repoRoot(appDir)).openPullRequests();
207
+ for (const { pr, pieces } of previews) {
208
+ const state = open.includes(pr) ? "open" : "closed, the next sweep removes it";
209
+ console.log(`PR ${String(pr).padEnd(6)} ${state}\n ${pieces.join(", ")}`);
210
+ }
211
+ }
175
212
  // Recovery for an owner who lost their password or email: whoever holds the project's tokens can
176
213
  // already reach everything, so the new password is typed here, never passed as an argument.
177
214
  async function ownerReset(ctx, config, email, pr) {
@@ -285,7 +322,7 @@ function maskInCi(values) {
285
322
  class UsageError extends Error {
286
323
  }
287
324
  main(process.argv.slice(2)).catch((error) => {
288
- const known = error instanceof ConfigError || error instanceof PreflightError || error instanceof UnprovenError || error instanceof UsageError;
325
+ const known = error instanceof ConfigError || error instanceof PreflightError || error instanceof UsageError;
289
326
  console.error(`✗ ${known ? error.message : error instanceof Error ? (error.stack ?? error.message) : String(error)}`);
290
327
  process.exit(1);
291
328
  });