@celsoft/platform 0.2.0 → 0.4.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 (51) hide show
  1. package/dist/adapters/cloudflare.d.ts +12 -1
  2. package/dist/adapters/cloudflare.js +69 -0
  3. package/dist/adapters/cloudflare.js.map +1 -1
  4. package/dist/adapters/github.d.ts +0 -1
  5. package/dist/adapters/github.js +0 -3
  6. package/dist/adapters/github.js.map +1 -1
  7. package/dist/adapters/process.d.ts +2 -0
  8. package/dist/adapters/process.js +35 -2
  9. package/dist/adapters/process.js.map +1 -1
  10. package/dist/adapters/resend.d.ts +14 -0
  11. package/dist/adapters/resend.js +50 -0
  12. package/dist/adapters/resend.js.map +1 -0
  13. package/dist/cli.js +11 -2
  14. package/dist/cli.js.map +1 -1
  15. package/dist/config.d.ts +3 -0
  16. package/dist/config.js +6 -2
  17. package/dist/config.js.map +1 -1
  18. package/dist/fakes.d.ts +56 -1
  19. package/dist/fakes.js +88 -2
  20. package/dist/fakes.js.map +1 -1
  21. package/dist/init.d.ts +2 -1
  22. package/dist/init.js +11 -3
  23. package/dist/init.js.map +1 -1
  24. package/dist/lifecycle.d.ts +5 -0
  25. package/dist/lifecycle.js +113 -2
  26. package/dist/lifecycle.js.map +1 -1
  27. package/dist/ports.d.ts +37 -1
  28. package/dist/runtime/auth.d.ts +15 -0
  29. package/dist/runtime/auth.js +35 -0
  30. package/dist/runtime/auth.js.map +1 -0
  31. package/dist/runtime/email.d.ts +15 -0
  32. package/dist/runtime/email.js +22 -0
  33. package/dist/runtime/email.js.map +1 -0
  34. package/dist/runtime/files.d.ts +54 -0
  35. package/dist/runtime/files.js +50 -0
  36. package/dist/runtime/files.js.map +1 -0
  37. package/dist/runtime/index.d.ts +14 -1
  38. package/dist/runtime/index.js +35 -1
  39. package/dist/runtime/index.js.map +1 -1
  40. package/dist/secrets.js +1 -1
  41. package/dist/secrets.js.map +1 -1
  42. package/dist/target.d.ts +2 -0
  43. package/dist/target.js +9 -2
  44. package/dist/target.js.map +1 -1
  45. package/dist/workflow.js +2 -1
  46. package/dist/workflow.js.map +1 -1
  47. package/dist/wrangler-config.d.ts +3 -1
  48. package/dist/wrangler-config.js +3 -1
  49. package/dist/wrangler-config.js.map +1 -1
  50. package/package.json +12 -3
  51. package/schema.json +15 -0
@@ -0,0 +1,54 @@
1
+ export interface FilesBucket {
2
+ put(key: string, value: ReadableStream | ArrayBuffer | string | Blob, options?: {
3
+ httpMetadata?: {
4
+ contentType?: string;
5
+ };
6
+ }): Promise<unknown>;
7
+ get(key: string): Promise<StoredObject | null>;
8
+ delete(key: string): Promise<void>;
9
+ list(options: {
10
+ prefix: string;
11
+ delimiter: string;
12
+ cursor?: string;
13
+ }): Promise<{
14
+ objects: {
15
+ key: string;
16
+ size: number;
17
+ uploaded: Date;
18
+ }[];
19
+ delimitedPrefixes: string[];
20
+ truncated: boolean;
21
+ cursor?: string;
22
+ }>;
23
+ }
24
+ export interface StoredObject {
25
+ body: ReadableStream;
26
+ size: number;
27
+ httpMetadata?: {
28
+ contentType?: string;
29
+ };
30
+ text(): Promise<string>;
31
+ }
32
+ export interface FilesBindings {
33
+ FILES?: FilesBucket;
34
+ FILES_PREFIX?: string;
35
+ }
36
+ export interface FileEntry {
37
+ path: string;
38
+ size: number;
39
+ uploaded: Date;
40
+ }
41
+ export interface Folder {
42
+ files: FileEntry[];
43
+ folders: string[];
44
+ }
45
+ export interface Files {
46
+ put(path: string, body: ReadableStream | ArrayBuffer | string | Blob, contentType?: string): Promise<void>;
47
+ get(path: string): Promise<StoredObject | null>;
48
+ getJson<T = unknown>(path: string): Promise<T | null>;
49
+ putJson(path: string, value: unknown): Promise<void>;
50
+ list(folder?: string): Promise<Folder>;
51
+ delete(path: string): Promise<void>;
52
+ response(path: string): Promise<Response>;
53
+ }
54
+ export declare function createFiles(env: FilesBindings): Files;
@@ -0,0 +1,50 @@
1
+ // Paths are "folder/sub/file.json"; "/" makes folders. Previews share one bucket, so each
2
+ // preview's prefix is added here and never seen by app code.
3
+ export function createFiles(env) {
4
+ const bucket = () => {
5
+ if (!env.FILES)
6
+ throw new Error("this app has no files; set `files: true` in platform.jsonc");
7
+ return env.FILES;
8
+ };
9
+ const prefix = env.FILES_PREFIX ?? "";
10
+ const key = (path) => prefix + clean(path);
11
+ const files = {
12
+ async put(path, body, contentType) {
13
+ await bucket().put(key(path), body, contentType ? { httpMetadata: { contentType } } : undefined);
14
+ },
15
+ get: (path) => bucket().get(key(path)),
16
+ async getJson(path) {
17
+ const object = await files.get(path);
18
+ return object ? JSON.parse(await object.text()) : null;
19
+ },
20
+ putJson: (path, value) => files.put(path, JSON.stringify(value), "application/json"),
21
+ async list(folder = "") {
22
+ const inner = clean(folder);
23
+ const base = prefix + (inner ? `${inner}/` : "");
24
+ const result = { files: [], folders: [] };
25
+ let cursor;
26
+ do {
27
+ const page = await bucket().list({ prefix: base, delimiter: "/", ...(cursor && { cursor }) });
28
+ result.files.push(...page.objects.map((o) => ({ path: o.key.slice(prefix.length), size: o.size, uploaded: o.uploaded })));
29
+ result.folders.push(...page.delimitedPrefixes.map((p) => p.slice(prefix.length)));
30
+ cursor = page.truncated ? page.cursor : undefined;
31
+ } while (cursor);
32
+ return result;
33
+ },
34
+ delete: (path) => bucket().delete(key(path)),
35
+ async response(path) {
36
+ const object = await files.get(path);
37
+ if (!object)
38
+ return new Response("not found", { status: 404 });
39
+ return new Response(object.body, { headers: { "content-type": object.httpMetadata?.contentType ?? "application/octet-stream", "content-length": String(object.size) } });
40
+ },
41
+ };
42
+ return files;
43
+ }
44
+ function clean(path) {
45
+ const parts = path.split("/").filter((p) => p !== "" && p !== ".");
46
+ if (parts.some((p) => p === ".."))
47
+ throw new Error(`file paths cannot contain "..": ${path}`);
48
+ return parts.join("/");
49
+ }
50
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/runtime/files.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,29 @@
1
1
  import postgres from "postgres";
2
+ import { type Auth } from "./auth.js";
3
+ import { type Email, type EmailBindings } from "./email.js";
4
+ import { type Files, type FilesBindings } from "./files.js";
5
+ export type { Auth } from "./auth.js";
6
+ export type { Email, EmailMessage } from "./email.js";
7
+ export type { FileEntry, Files, Folder, StoredObject } from "./files.js";
2
8
  export type Sql = postgres.Sql;
3
- export interface PlatformBindings {
9
+ export interface PlatformBindings extends EmailBindings, FilesBindings {
4
10
  DB?: {
5
11
  connectionString: string;
6
12
  };
13
+ APP_URL?: string;
14
+ BETTER_AUTH_SECRET?: string;
7
15
  }
8
16
  export interface ExecutionContext {
9
17
  waitUntil(promise: Promise<unknown>): void;
10
18
  }
19
+ export type Session = NonNullable<Awaited<ReturnType<Auth["api"]["getSession"]>>>;
11
20
  export interface AppContext<Env> {
12
21
  env: Env;
13
22
  readonly sql: Sql;
23
+ readonly email: Email;
24
+ readonly files: Files;
25
+ readonly auth: Auth;
26
+ session(): Promise<Session | null>;
14
27
  waitUntil(promise: Promise<unknown>): void;
15
28
  }
16
29
  export type Handler<Env> = (request: Request, app: AppContext<Env>) => Response | Promise<Response>;
@@ -1,12 +1,19 @@
1
1
  import postgres from "postgres";
2
+ import { AUTH_PATH, authPool, createAuth } from "./auth.js";
3
+ import { createEmail } from "./email.js";
4
+ import { createFiles } from "./files.js";
2
5
  const defaultConnect = (connectionString) => postgres(connectionString, { max: 5, fetch_types: false });
3
6
  // `Secrets` names the app's secrets, such as `defineApp<{ SESSION_SECRET: string }>`; the
4
- // platform's own bindings are added to it.
7
+ // platform's own bindings are added to it. With `auth` on, /api/auth/* is handled for the app.
5
8
  export function defineApp(handler, options = {}) {
6
9
  const connect = options.connect ?? defaultConnect;
7
10
  return {
8
11
  async fetch(request, env, ctx) {
9
12
  let sql;
13
+ let email;
14
+ let files;
15
+ let auth;
16
+ let pool;
10
17
  const app = {
11
18
  env,
12
19
  get sql() {
@@ -14,14 +21,41 @@ export function defineApp(handler, options = {}) {
14
21
  throw new Error("this app has no database; add `database` to platform.jsonc");
15
22
  return (sql ??= connect(env.DB.connectionString));
16
23
  },
24
+ get email() {
25
+ return (email ??= createEmail(env));
26
+ },
27
+ get files() {
28
+ return (files ??= createFiles(env));
29
+ },
30
+ get auth() {
31
+ if (!env.BETTER_AUTH_SECRET)
32
+ throw new Error("this app has no auth; set `auth: true` in platform.jsonc");
33
+ if (!env.DB)
34
+ throw new Error("auth needs a database; add `database` to platform.jsonc");
35
+ return (auth ??= createAuth({
36
+ pool: (pool ??= authPool(env.DB.connectionString)),
37
+ secret: env.BETTER_AUTH_SECRET,
38
+ baseURL: env.APP_URL ?? new URL(request.url).origin,
39
+ email: app.email,
40
+ requireVerification: env.EMAIL_MODE === "send",
41
+ }));
42
+ },
43
+ async session() {
44
+ return env.BETTER_AUTH_SECRET ? app.auth.api.getSession({ headers: request.headers }) : null;
45
+ },
17
46
  waitUntil: (promise) => ctx.waitUntil(promise),
18
47
  };
19
48
  try {
49
+ if (env.BETTER_AUTH_SECRET && new URL(request.url).pathname.startsWith(`${AUTH_PATH}/`)) {
50
+ return await app.auth.handler(request);
51
+ }
20
52
  return await handler(request, app);
21
53
  }
22
54
  finally {
23
55
  if (sql)
24
56
  ctx.waitUntil(sql.end({ timeout: 5 }));
57
+ if (pool)
58
+ ctx.waitUntil(pool.end());
25
59
  }
26
60
  },
27
61
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAwBhC,MAAM,cAAc,GAAG,CAAC,gBAAwB,EAAE,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;AAEhH,0FAA0F;AAC1F,2CAA2C;AAC3C,MAAM,UAAU,SAAS,CAAkC,OAA4C,EAAE,OAAO,GAAe,EAAE;IAC/H,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,CAAC;IAElD,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,OAAgB,EAAE,GAA+B,EAAE,GAAqB;YAClF,IAAI,GAAoB,CAAC;YACzB,MAAM,GAAG,GAA2C;gBAClD,GAAG;gBACH,IAAI,GAAG;oBACL,IAAI,CAAC,GAAG,CAAC,EAAE;wBAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;oBAC3F,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBACpD,CAAC;gBACD,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC;aAC/C,CAAC;YAEF,IAAI,CAAC;gBACH,OAAO,MAAM,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACrC,CAAC;oBAAS,CAAC;gBACT,IAAI,GAAG;oBAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
package/dist/secrets.js CHANGED
@@ -21,7 +21,7 @@ export async function loadSecrets(startDir, names, env = process.env) {
21
21
  return { ...(await findEnvFile(startDir, SECRETS_FILE)), ...pick(env, names) };
22
22
  }
23
23
  // Non-secret values platform.jsonc references as ${NAME}: the nearest .env locally,
24
- // GitHub Actions variables passed by name in CI.
24
+ // GitHub secrets passed by name in CI.
25
25
  export async function loadVars(startDir, names, env = process.env) {
26
26
  return { ...(await findEnvFile(startDir, VARS_FILE)), ...pick(env, names) };
27
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC;AAC3C,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC;AAEhC,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,4DAA4D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtF,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;QAC5B,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAI,CAAC;QACvD,IAAI,KAAK;YAAE,MAAM,CAAC,IAAK,CAAC,GAAG,KAAK,CAAC;IACnC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2FAA2F;AAC3F,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,KAAe,EAAE,GAAG,GAAsB,OAAO,CAAC,GAAG;IACvG,OAAO,EAAE,GAAG,CAAC,MAAM,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,oFAAoF;AACpF,iDAAiD;AACjD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB,EAAE,KAAe,EAAE,GAAG,GAAsB,OAAO,CAAC,GAAG;IACpG,OAAO,EAAE,GAAG,CAAC,MAAM,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;AAC9E,CAAC;AAED,SAAS,IAAI,CAAC,GAAsB,EAAE,KAAe;IACnD,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAE,CAAC,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,IAAY;IAClD,KAAK,IAAI,OAAO,GAAG,GAAG,GAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC;YACH,OAAO,WAAW,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO;gBAAE,OAAO,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC;AAC3C,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC;AAEhC,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,4DAA4D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtF,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;QAC5B,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAI,CAAC;QACvD,IAAI,KAAK;YAAE,MAAM,CAAC,IAAK,CAAC,GAAG,KAAK,CAAC;IACnC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2FAA2F;AAC3F,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,KAAe,EAAE,GAAG,GAAsB,OAAO,CAAC,GAAG;IACvG,OAAO,EAAE,GAAG,CAAC,MAAM,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,oFAAoF;AACpF,uCAAuC;AACvC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB,EAAE,KAAe,EAAE,GAAG,GAAsB,OAAO,CAAC,GAAG;IACpG,OAAO,EAAE,GAAG,CAAC,MAAM,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;AAC9E,CAAC;AAED,SAAS,IAAI,CAAC,GAAsB,EAAE,KAAe;IACnD,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAE,CAAC,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,IAAY;IAClD,KAAK,IAAI,OAAO,GAAG,GAAG,GAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC;YACH,OAAO,WAAW,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO;gBAAE,OAAO,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC"}
package/dist/target.d.ts CHANGED
@@ -9,6 +9,8 @@ export interface Names {
9
9
  worker: string;
10
10
  hyperdrive: string;
11
11
  neonBranch: string | undefined;
12
+ bucket: string;
13
+ filesPrefix: string;
12
14
  }
13
15
  export declare function names(config: Config, target: Target): Names;
14
16
  export declare function previewHostname(worker: string, zoneName: string): string;
package/dist/target.js CHANGED
@@ -1,9 +1,16 @@
1
+ // Prod gets its own bucket; previews share one, each under its PR's folder.
1
2
  export function names(config, target) {
2
3
  if (target.kind === "prod") {
3
- return { worker: config.name, hyperdrive: config.name, neonBranch: undefined };
4
+ return { worker: config.name, hyperdrive: config.name, neonBranch: undefined, bucket: `${config.name}-files`, filesPrefix: "" };
4
5
  }
5
6
  const suffix = `pr-${target.pr}`;
6
- return { worker: `${config.name}-${suffix}`, hyperdrive: `${config.name}-${suffix}`, neonBranch: suffix };
7
+ return {
8
+ worker: `${config.name}-${suffix}`,
9
+ hyperdrive: `${config.name}-${suffix}`,
10
+ neonBranch: suffix,
11
+ bucket: `${config.name}-previews`,
12
+ filesPrefix: `${suffix}/`,
13
+ };
7
14
  }
8
15
  export function previewHostname(worker, zoneName) {
9
16
  return `${worker}.${zoneName}`;
@@ -1 +1 @@
1
- {"version":3,"file":"target.js","sourceRoot":"","sources":["../src/target.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,KAAK,CAAC,MAAc,EAAE,MAAc;IAClD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IACjF,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,EAAE,EAAE,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAC5G,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,QAAgB;IAC9D,OAAO,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,aAAqB;IAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IACnC,OAAO,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"target.js","sourceRoot":"","sources":["../src/target.ts"],"names":[],"mappings":"AAYA,4EAA4E;AAC5E,MAAM,UAAU,KAAK,CAAC,MAAc,EAAE,MAAc;IAClD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAClI,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,EAAE,EAAE,CAAC;IACjC,OAAO;QACL,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE;QAClC,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE;QACtC,UAAU,EAAE,MAAM;QAClB,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,WAAW;QACjC,WAAW,EAAE,GAAG,MAAM,GAAG;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,QAAgB;IAC9D,OAAO,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,aAAqB;IAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IACnC,OAAO,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;AACtD,CAAC"}
package/dist/workflow.js CHANGED
@@ -8,7 +8,8 @@ export function renderWorkflow({ appDir, packageManager, secrets, variables }) {
8
8
  const workingDirectory = appDir === "." ? "" : `\n working-directory: ${appDir}`;
9
9
  const env = [
10
10
  ...[...new Set(secrets)].sort().map((name) => `${name}: \${{ secrets.${name} }}`),
11
- ...[...new Set(variables)].sort().map((name) => `${name}: \${{ vars.${name} }}`),
11
+ // Config values are stored as secrets too: GitHub prints a step's variables in its public log, but hides secrets.
12
+ ...[...new Set(variables)].sort().map((name) => `${name}: \${{ secrets.${name} }}`),
12
13
  "GITHUB_TOKEN: ${{ github.token }}",
13
14
  ];
14
15
  return `# Written by \`platform init\`; rerun it to update this file.
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,gCAAgC,CAAC;AAW9D,2FAA2F;AAC3F,4FAA4F;AAC5F,MAAM,UAAU,cAAc,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAiB;IAC1F,MAAM,OAAO,GAAG,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxF,MAAM,IAAI,GAAG,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,8BAA8B,CAAC;IAClG,MAAM,SAAS,GAAG,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,MAAM,gBAAgB,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gCAAgC,MAAM,EAAE,CAAC;IACxF,MAAM,GAAG,GAAG;QACV,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,kBAAkB,IAAI,KAAK,CAAC;QACjF,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,eAAe,IAAI,KAAK,CAAC;QAChF,mCAAmC;KACpC,CAAC;IAEF,OAAO;;;;;;;;;;;;;;;;;;;;;;;mCAuB0B,SAAS;;;;mBAIzB,cAAc;eAClB,OAAO;eACP,IAAI,GAAG,gBAAgB;;EAEpC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CAClD,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,gCAAgC,CAAC;AAW9D,2FAA2F;AAC3F,4FAA4F;AAC5F,MAAM,UAAU,cAAc,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAiB;IAC1F,MAAM,OAAO,GAAG,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxF,MAAM,IAAI,GAAG,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,8BAA8B,CAAC;IAClG,MAAM,SAAS,GAAG,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,MAAM,gBAAgB,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gCAAgC,MAAM,EAAE,CAAC;IACxF,MAAM,GAAG,GAAG;QACV,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,kBAAkB,IAAI,KAAK,CAAC;QACjF,kHAAkH;QAClH,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,kBAAkB,IAAI,KAAK,CAAC;QACnF,mCAAmC;KACpC,CAAC;IAEF,OAAO;;;;;;;;;;;;;;;;;;;;;;;mCAuB0B,SAAS;;;;mBAIzB,cAAc;eAClB,OAAO;eACP,IAAI,GAAG,gBAAgB;;EAEpC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CAClD,CAAC;AACF,CAAC"}
@@ -5,5 +5,7 @@ export interface WranglerInput {
5
5
  hostname: string;
6
6
  accountId: string;
7
7
  hyperdriveId: string | undefined;
8
+ vars: Record<string, string>;
9
+ bucket?: string | undefined;
8
10
  }
9
- export declare function wranglerConfig({ config, worker, hostname, accountId, hyperdriveId }: WranglerInput): object;
11
+ export declare function wranglerConfig({ config, worker, hostname, accountId, hyperdriveId, vars, bucket }: WranglerInput): object;
@@ -1,4 +1,4 @@
1
- export function wranglerConfig({ config, worker, hostname, accountId, hyperdriveId }) {
1
+ export function wranglerConfig({ config, worker, hostname, accountId, hyperdriveId, vars, bucket }) {
2
2
  return {
3
3
  name: worker,
4
4
  account_id: accountId,
@@ -8,10 +8,12 @@ export function wranglerConfig({ config, worker, hostname, accountId, hyperdrive
8
8
  workers_dev: false,
9
9
  routes: [{ pattern: hostname, custom_domain: true }],
10
10
  observability: { enabled: true },
11
+ vars,
11
12
  ...(config.frontend && {
12
13
  assets: { directory: config.frontend, not_found_handling: "single-page-application", run_worker_first: ["/api/*"] },
13
14
  }),
14
15
  ...(hyperdriveId && { hyperdrive: [{ binding: "DB", id: hyperdriveId }] }),
16
+ ...(bucket && { r2_buckets: [{ binding: "FILES", bucket_name: bucket }] }),
15
17
  };
16
18
  }
17
19
  //# sourceMappingURL=wrangler-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wrangler-config.js","sourceRoot":"","sources":["../src/wrangler-config.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAiB;IACjG,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,MAAM,CAAC,MAAM;QACnB,kBAAkB,EAAE,MAAM,CAAC,iBAAiB;QAC5C,mBAAmB,EAAE,CAAC,eAAe,CAAC;QACtC,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QACpD,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAChC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI;YACrB,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,CAAC,QAAQ,CAAC,EAAE;SACpH,CAAC;QACF,GAAG,CAAC,YAAY,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;KAC3E,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"wrangler-config.js","sourceRoot":"","sources":["../src/wrangler-config.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAiB;IAC/G,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,MAAM,CAAC,MAAM;QACnB,kBAAkB,EAAE,MAAM,CAAC,iBAAiB;QAC5C,mBAAmB,EAAE,CAAC,eAAe,CAAC;QACtC,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QACpD,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAChC,IAAI;QACJ,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI;YACrB,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,CAAC,QAAQ,CAAC,EAAE;SACpH,CAAC;QACF,GAAG,CAAC,YAAY,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,MAAM,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;KAC3E,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,11 +1,17 @@
1
1
  {
2
2
  "name": "@celsoft/platform",
3
- "version": "0.2.0",
3
+ "version": "0.4.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
- "repository": { "type": "git", "url": "git+https://github.com/celsoft-com/platform.git", "directory": "packages/platform" },
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/celsoft-com/platform.git",
9
+ "directory": "packages/platform"
10
+ },
7
11
  "homepage": "https://github.com/celsoft-com/platform#readme",
8
- "publishConfig": { "access": "public" },
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
9
15
  "type": "module",
10
16
  "bin": {
11
17
  "platform": "./dist/cli.js"
@@ -22,13 +28,16 @@
22
28
  },
23
29
  "dependencies": {
24
30
  "@neondatabase/api-client": "^2.7.3",
31
+ "better-auth": "^1.7.12",
25
32
  "cloudflare": "^7.3.0",
26
33
  "jsonc-parser": "^3.3.1",
34
+ "pg": "^8.23.1",
27
35
  "postgres": "^3.4.9",
28
36
  "wrangler": "^4.152.0",
29
37
  "zod": "^4.6.7"
30
38
  },
31
39
  "devDependencies": {
40
+ "@types/pg": "^8.23.1",
32
41
  "typescript": "7.0.2"
33
42
  }
34
43
  }
package/schema.json CHANGED
@@ -78,6 +78,21 @@
78
78
  ],
79
79
  "additionalProperties": false
80
80
  },
81
+ "email": {
82
+ "default": false,
83
+ "description": "Send email through Resend from noreply@ the app's own hostname; the app only sends",
84
+ "type": "boolean"
85
+ },
86
+ "auth": {
87
+ "default": false,
88
+ "description": "Sign-up and login with email and password; needs database and email",
89
+ "type": "boolean"
90
+ },
91
+ "files": {
92
+ "default": false,
93
+ "description": "Object storage in an R2 bucket, organized in folders",
94
+ "type": "boolean"
95
+ },
81
96
  "secrets": {
82
97
  "default": [],
83
98
  "type": "array",