@celsoft/platform 0.6.0 → 0.8.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/dist/adapters/cloudflare.d.ts +11 -10
- package/dist/adapters/cloudflare.js +29 -22
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/github.d.ts +2 -1
- package/dist/adapters/github.js +5 -0
- package/dist/adapters/github.js.map +1 -1
- package/dist/adapters/process.d.ts +3 -1
- package/dist/adapters/process.js +13 -1
- package/dist/adapters/process.js.map +1 -1
- package/dist/adapters/r2.d.ts +15 -0
- package/dist/adapters/r2.js +99 -0
- package/dist/adapters/r2.js.map +1 -0
- package/dist/adapters/registry.d.ts +14 -0
- package/dist/adapters/registry.js +42 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/cli.js +29 -8
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +6 -2
- package/dist/config.js.map +1 -1
- package/dist/fakes.d.ts +19 -9
- package/dist/fakes.js +51 -20
- package/dist/fakes.js.map +1 -1
- package/dist/legacy.d.ts +10 -0
- package/dist/legacy.js +13 -0
- package/dist/legacy.js.map +1 -0
- package/dist/lifecycle.d.ts +8 -2
- package/dist/lifecycle.js +201 -77
- package/dist/lifecycle.js.map +1 -1
- package/dist/ports.d.ts +25 -10
- package/dist/runtime/files.js +1 -4
- package/dist/runtime/files.js.map +1 -1
- package/dist/runtime/guard.js +2 -1
- package/dist/runtime/guard.js.map +1 -1
- package/dist/runtime/index.d.ts +16 -2
- package/dist/runtime/index.js +87 -44
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/live-client.d.ts +19 -0
- package/dist/runtime/live-client.js +74 -0
- package/dist/runtime/live-client.js.map +1 -0
- package/dist/runtime/live.d.ts +29 -0
- package/dist/runtime/live.js +158 -0
- package/dist/runtime/live.js.map +1 -0
- package/dist/target.d.ts +2 -1
- package/dist/target.js +9 -7
- package/dist/target.js.map +1 -1
- package/dist/wrangler-config.d.ts +2 -0
- package/dist/wrangler-config.js +12 -2
- package/dist/wrangler-config.js.map +1 -1
- package/package.json +3 -2
- package/schema.json +6 -1
- package/dist/ownership.d.ts +0 -16
- package/dist/ownership.js +0 -40
- package/dist/ownership.js.map +0 -1
package/dist/wrangler-config.js
CHANGED
|
@@ -1,23 +1,33 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { SCREEN_PATHS } from "./runtime/screens.js";
|
|
3
3
|
export const AUTH_LIMIT = { limit: 10, period: 60 };
|
|
4
|
+
// Wrangler deploys this generated module, which exports the app's handler and the live room
|
|
5
|
+
// class, so the app's own worker file never has to export platform code.
|
|
6
|
+
export const ENTRY_FILE = ".platform-entry.ts";
|
|
7
|
+
export function entryModule(worker) {
|
|
8
|
+
const path = worker.startsWith(".") ? worker : `./${worker}`;
|
|
9
|
+
return `// Written by @celsoft/platform at deploy; never edit or commit it.\nimport app from ${JSON.stringify(path)};\nexport default app;\nexport const LiveRoom = app.LiveRoom;\n`;
|
|
10
|
+
}
|
|
4
11
|
export function wranglerConfig({ config, worker, hostname, accountId, hyperdriveId, vars, bucket }) {
|
|
5
12
|
const auth = config.auth;
|
|
6
13
|
return {
|
|
7
14
|
name: worker,
|
|
8
15
|
account_id: accountId,
|
|
9
|
-
main:
|
|
16
|
+
main: ENTRY_FILE,
|
|
10
17
|
compatibility_date: config.compatibilityDate,
|
|
11
18
|
compatibility_flags: ["nodejs_compat"],
|
|
12
19
|
workers_dev: false,
|
|
13
20
|
routes: [{ pattern: hostname, custom_domain: true }],
|
|
14
21
|
observability: { enabled: true },
|
|
15
|
-
vars: { ...vars, APP_NAME: config.name, ...(auth && { AUTH_ORGANIZATIONS: auth.organizations ? "on" : "off" }) },
|
|
22
|
+
vars: { ...vars, APP_NAME: config.name, LIVE_ROOMS: config.live ? "on" : "off", ...(auth && { AUTH_ORGANIZATIONS: auth.organizations ? "on" : "off" }) },
|
|
16
23
|
...(config.frontend && {
|
|
17
24
|
assets: { directory: config.frontend, not_found_handling: "single-page-application", run_worker_first: ["/api/*", ...(auth ? SCREEN_PATHS : [])] },
|
|
18
25
|
}),
|
|
19
26
|
...(hyperdriveId && { hyperdrive: [{ binding: "DB", id: hyperdriveId }] }),
|
|
20
27
|
...(bucket && { r2_buckets: [{ binding: "FILES", bucket_name: bucket }] }),
|
|
28
|
+
// The room class is always deployed, so turning live off and on never needs a Durable Object migration.
|
|
29
|
+
durable_objects: { bindings: [{ name: "LIVE", class_name: "LiveRoom" }] },
|
|
30
|
+
migrations: [{ tag: "live-rooms-v1", new_sqlite_classes: ["LiveRoom"] }],
|
|
21
31
|
...(auth && { ratelimits: [{ name: "AUTH_LIMIT", namespace_id: namespaceId(worker), simple: AUTH_LIMIT }] }),
|
|
22
32
|
};
|
|
23
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrangler-config.js","sourceRoot":"","sources":["../src/wrangler-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAYpD,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAW,CAAC;AAE7D,MAAM,UAAU,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAiB;IAC/G,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"wrangler-config.js","sourceRoot":"","sources":["../src/wrangler-config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@celsoft/platform",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Deploy apps to Cloudflare Workers with Neon Postgres, prod on push and a preview per pull request",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
},
|
|
19
19
|
"exports": {
|
|
20
20
|
".": "./dist/runtime/index.js",
|
|
21
|
-
"./schema": "./dist/schema.js"
|
|
21
|
+
"./schema": "./dist/schema.js",
|
|
22
|
+
"./live": "./dist/runtime/live-client.js"
|
|
22
23
|
},
|
|
23
24
|
"files": [
|
|
24
25
|
"dist",
|
package/schema.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"type": "string",
|
|
10
10
|
"anyOf": [
|
|
11
11
|
{
|
|
12
|
-
"pattern": "^[a-z][a-z0-9-]
|
|
12
|
+
"pattern": "^(?=.{3,50}$)[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
"pattern": "^\\$\\{[A-Z][A-Z0-9_]*\\}$"
|
|
@@ -98,6 +98,11 @@
|
|
|
98
98
|
"description": "Object storage in an R2 bucket, organized in folders",
|
|
99
99
|
"type": "boolean"
|
|
100
100
|
},
|
|
101
|
+
"live": {
|
|
102
|
+
"default": false,
|
|
103
|
+
"description": "Live rooms: messages and presence over WebSockets, on Durable Objects",
|
|
104
|
+
"type": "boolean"
|
|
105
|
+
},
|
|
101
106
|
"secrets": {
|
|
102
107
|
"default": [],
|
|
103
108
|
"type": "array",
|
package/dist/ownership.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { Config } from "./config.js";
|
|
2
|
-
import type { Hyperdrive, Ports } from "./ports.js";
|
|
3
|
-
export declare const PLATFORM_TAG = "celsoft-platform";
|
|
4
|
-
export declare const appTag: (app: string) => string;
|
|
5
|
-
export declare const prTag: (pr: number) => string;
|
|
6
|
-
export declare const BUCKET_MARKER = ".celsoft-platform";
|
|
7
|
-
export declare class UnprovenError extends Error {
|
|
8
|
-
constructor(kind: string, name: string, app: string);
|
|
9
|
-
}
|
|
10
|
-
export interface OwnedWorker {
|
|
11
|
-
name: string;
|
|
12
|
-
hyperdriveIds: string[];
|
|
13
|
-
}
|
|
14
|
-
export declare function ownedWorker(ports: Ports, config: Config, name: string): Promise<OwnedWorker | undefined>;
|
|
15
|
-
export declare function requireOwnedHyperdrive(ports: Ports, config: Config, hyperdrive: Hyperdrive, boundIds: string[]): Promise<void>;
|
|
16
|
-
export declare function ownedBucket(ports: Ports, config: Config, name: string): Promise<boolean>;
|
package/dist/ownership.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
// Cloudflare has no project scope inside an account, so a matching name never proves the
|
|
2
|
-
// platform made a resource. Each resource carries proof instead, checked before any change.
|
|
3
|
-
export const PLATFORM_TAG = "celsoft-platform";
|
|
4
|
-
export const appTag = (app) => `app:${app}`;
|
|
5
|
-
export const prTag = (pr) => `pr:${pr}`;
|
|
6
|
-
export const BUCKET_MARKER = ".celsoft-platform";
|
|
7
|
-
export class UnprovenError extends Error {
|
|
8
|
-
constructor(kind, name, app) {
|
|
9
|
-
super(`${kind} ${name} exists, but nothing shows the platform made it for ${app}, so it was left untouched; remove it by hand if it is yours to remove, or choose another app name`);
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
// Undefined when there is no such Worker; throws when it exists without this app's tags.
|
|
13
|
-
export async function ownedWorker(ports, config, name) {
|
|
14
|
-
const owner = await ports.cloudflare.workerOwner(name);
|
|
15
|
-
if (!owner)
|
|
16
|
-
return undefined;
|
|
17
|
-
if (owner.app !== config.name)
|
|
18
|
-
throw new UnprovenError("Worker", name, config.name);
|
|
19
|
-
return { name, hyperdriveIds: owner.hyperdriveIds };
|
|
20
|
-
}
|
|
21
|
-
// A Hyperdrive config is the app's when one of its Workers binds it, or when it points at a
|
|
22
|
-
// database in the app's own Neon project, which covers a config whose Worker never deployed.
|
|
23
|
-
export async function requireOwnedHyperdrive(ports, config, hyperdrive, boundIds) {
|
|
24
|
-
if (boundIds.includes(hyperdrive.id))
|
|
25
|
-
return;
|
|
26
|
-
const host = hyperdrive.origin.split("@")[1]?.split("/")[0];
|
|
27
|
-
if (config.database && host && (await ports.neon.endpointHosts(config.database.neonProject)).includes(host))
|
|
28
|
-
return;
|
|
29
|
-
throw new UnprovenError("Hyperdrive config", hyperdrive.name, config.name);
|
|
30
|
-
}
|
|
31
|
-
// True when the bucket exists and its marker names this app; throws when it names nothing or another app.
|
|
32
|
-
export async function ownedBucket(ports, config, name) {
|
|
33
|
-
const owner = await ports.cloudflare.bucketOwner(name);
|
|
34
|
-
if (owner === undefined)
|
|
35
|
-
return false;
|
|
36
|
-
if (owner !== config.name)
|
|
37
|
-
throw new UnprovenError("R2 bucket", name, config.name);
|
|
38
|
-
return true;
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=ownership.js.map
|
package/dist/ownership.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ownership.js","sourceRoot":"","sources":["../src/ownership.ts"],"names":[],"mappings":"AAGA,yFAAyF;AACzF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAC/C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC;AACpD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;AAChD,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAEjD,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,IAAY,EAAE,IAAY,EAAE,GAAW;QACjD,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,uDAAuD,GAAG,oGAAoG,CAAC,CAAC;IACvL,CAAC;CACF;AAOD,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAY,EAAE,MAAc,EAAE,IAAY;IAC1E,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,IAAI;QAAE,MAAM,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACpF,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;AACtD,CAAC;AAED,4FAA4F;AAC5F,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAY,EAAE,MAAc,EAAE,UAAsB,EAAE,QAAkB;IACnH,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAAE,OAAO;IAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO;IACpH,MAAM,IAAI,aAAa,CAAC,mBAAmB,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED,0GAA0G;AAC1G,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAY,EAAE,MAAc,EAAE,IAAY;IAC1E,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,KAAK,KAAK,MAAM,CAAC,IAAI;QAAE,MAAM,IAAI,aAAa,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACnF,OAAO,IAAI,CAAC;AACd,CAAC"}
|