@access-dlsu/leapify 0.260505.5 → 0.260506.1
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/app.d.ts +15 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/auth/auth.d.ts +99 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/middleware.d.ts +20 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/types.d.ts +17 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/bun-sqlite-dialect-na--YwnN-CVHVB5NF.js +160 -0
- package/dist/bun-sqlite-dialect-na--YwnN-CVHVB5NF.js.map +1 -0
- package/dist/bun-sqlite-dialect-na--YwnN-QDBSQQTR.cjs +162 -0
- package/dist/bun-sqlite-dialect-na--YwnN-QDBSQQTR.cjs.map +1 -0
- package/dist/chunk-4DPT2KQR.cjs +467 -0
- package/dist/chunk-4DPT2KQR.cjs.map +1 -0
- package/dist/chunk-57ANXUP7.cjs +6191 -0
- package/dist/chunk-57ANXUP7.cjs.map +1 -0
- package/dist/chunk-5JKLV7IE.cjs +2962 -0
- package/dist/chunk-5JKLV7IE.cjs.map +1 -0
- package/dist/{chunk-FLR7TNLN.js → chunk-63CUZGSZ.js} +4 -12
- package/dist/chunk-63CUZGSZ.js.map +1 -0
- package/dist/chunk-ANNHE3PZ.js +2285 -0
- package/dist/chunk-ANNHE3PZ.js.map +1 -0
- package/dist/chunk-DPPGYCX3.cjs +72 -0
- package/dist/chunk-DPPGYCX3.cjs.map +1 -0
- package/dist/chunk-EGRHWZRV.js +3 -0
- package/dist/chunk-EGRHWZRV.js.map +1 -0
- package/dist/chunk-EIF2O2BG.js +6187 -0
- package/dist/chunk-EIF2O2BG.js.map +1 -0
- package/dist/chunk-EMMSS5I5.cjs +37 -0
- package/dist/chunk-EMMSS5I5.cjs.map +1 -0
- package/dist/chunk-FTSMZYD7.js +3025 -0
- package/dist/chunk-FTSMZYD7.js.map +1 -0
- package/dist/chunk-G3PMV62Z.js +33 -0
- package/dist/chunk-G3PMV62Z.js.map +1 -0
- package/dist/chunk-GNRL67OU.js +2949 -0
- package/dist/chunk-GNRL67OU.js.map +1 -0
- package/dist/chunk-HHNEB7YR.js +8 -0
- package/dist/chunk-HHNEB7YR.js.map +1 -0
- package/dist/chunk-IQEWVHLM.js +889 -0
- package/dist/chunk-IQEWVHLM.js.map +1 -0
- package/dist/chunk-JPVIXCF5.cjs +10 -0
- package/dist/chunk-JPVIXCF5.cjs.map +1 -0
- package/dist/chunk-MNEW2V4T.js +447 -0
- package/dist/chunk-MNEW2V4T.js.map +1 -0
- package/dist/chunk-NKIQRCOM.cjs +4 -0
- package/dist/chunk-NKIQRCOM.cjs.map +1 -0
- package/dist/chunk-QARF2YFF.cjs +2296 -0
- package/dist/chunk-QARF2YFF.cjs.map +1 -0
- package/dist/chunk-RFP2X2FA.cjs +903 -0
- package/dist/chunk-RFP2X2FA.cjs.map +1 -0
- package/dist/chunk-SXBTHGIL.js +7138 -0
- package/dist/chunk-SXBTHGIL.js.map +1 -0
- package/dist/chunk-UWXYXU7J.cjs +7166 -0
- package/dist/chunk-UWXYXU7J.cjs.map +1 -0
- package/dist/chunk-XY4KBWXT.cjs +3066 -0
- package/dist/chunk-XY4KBWXT.cjs.map +1 -0
- package/dist/{chunk-3ZWIJNZG.cjs → chunk-YFJBE3AU.cjs} +4 -12
- package/dist/chunk-YFJBE3AU.cjs.map +1 -0
- package/dist/chunk-ZYHBHSSO.js +68 -0
- package/dist/chunk-ZYHBHSSO.js.map +1 -0
- package/dist/client/{index.d.cts → auth.d.ts} +140 -394
- package/dist/client/auth.d.ts.map +1 -0
- package/dist/client/index.cjs +840 -48
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.ts +34 -1134
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +839 -47
- package/dist/client/index.js.map +1 -1
- package/dist/client/pow.d.ts +28 -0
- package/dist/client/pow.d.ts.map +1 -0
- package/dist/client/session.d.ts +29 -0
- package/dist/client/session.d.ts.map +1 -0
- package/dist/client/types.d.ts +25 -23
- package/dist/client/types.d.ts.map +1 -0
- package/dist/cron/batch-release.d.ts +9 -0
- package/dist/cron/batch-release.d.ts.map +1 -0
- package/dist/cron/lifecycle-check.d.ts +10 -0
- package/dist/cron/lifecycle-check.d.ts.map +1 -0
- package/dist/cron/reconcile-slots.d.ts +10 -0
- package/dist/cron/reconcile-slots.d.ts.map +1 -0
- package/dist/cron/reminder-emails.d.ts +9 -0
- package/dist/cron/reminder-emails.d.ts.map +1 -0
- package/dist/cron/renew-watches.d.ts +9 -0
- package/dist/cron/renew-watches.d.ts.map +1 -0
- package/dist/d1-sqlite-dialect-C2B7YsIT-CEUMIZZI.js +122 -0
- package/dist/d1-sqlite-dialect-C2B7YsIT-CEUMIZZI.js.map +1 -0
- package/dist/d1-sqlite-dialect-C2B7YsIT-JUX3YYMX.cjs +124 -0
- package/dist/d1-sqlite-dialect-C2B7YsIT-JUX3YYMX.cjs.map +1 -0
- package/dist/db/index.d.ts +7 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/migrate.d.ts +23 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/schema/auth.d.ts +649 -0
- package/dist/db/schema/auth.d.ts.map +1 -0
- package/dist/db/schema/bookmarks.d.ts +88 -0
- package/dist/db/schema/bookmarks.d.ts.map +1 -0
- package/dist/db/schema/events.d.ts +539 -0
- package/dist/db/schema/events.d.ts.map +1 -0
- package/dist/db/schema/faqs.d.ts +154 -0
- package/dist/db/schema/faqs.d.ts.map +1 -0
- package/dist/db/schema/index.d.ts +8 -0
- package/dist/db/schema/index.d.ts.map +1 -0
- package/dist/db/schema/site-config.d.ts +64 -0
- package/dist/db/schema/site-config.d.ts.map +1 -0
- package/dist/db/schema/themes.d.ts +123 -0
- package/dist/db/schema/themes.d.ts.map +1 -0
- package/dist/{types-lTjxCp88.d.cts → db/schema/users.d.ts} +11 -96
- package/dist/db/schema/users.d.ts.map +1 -0
- package/dist/dist-DZHA5VYX.cjs +260 -0
- package/dist/dist-DZHA5VYX.cjs.map +1 -0
- package/dist/dist-RRQUBLLO.js +258 -0
- package/dist/dist-RRQUBLLO.js.map +1 -0
- package/dist/index.cjs +36987 -781
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +23 -1818
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36846 -642
- package/dist/index.js.map +1 -1
- package/dist/kysely-adapter-5ZCECLNV.cjs +27 -0
- package/dist/kysely-adapter-5ZCECLNV.cjs.map +1 -0
- package/dist/kysely-adapter-6CZEASJQ.js +10 -0
- package/dist/kysely-adapter-6CZEASJQ.js.map +1 -0
- package/dist/lib/errors.d.ts +15 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/middleware/cors.d.ts +3 -0
- package/dist/lib/middleware/cors.d.ts.map +1 -0
- package/dist/lib/middleware/error-handler.d.ts +3 -0
- package/dist/lib/middleware/error-handler.d.ts.map +1 -0
- package/dist/lib/middleware/pow-challenge.cjs +7 -7
- package/dist/lib/middleware/pow-challenge.d.ts +29 -18
- package/dist/lib/middleware/pow-challenge.d.ts.map +1 -0
- package/dist/lib/middleware/pow-challenge.js +2 -2
- package/dist/lib/middleware/rate-limit.d.ts +48 -0
- package/dist/lib/middleware/rate-limit.d.ts.map +1 -0
- package/dist/lib/middleware/referer-guard.d.ts +18 -0
- package/dist/lib/middleware/referer-guard.d.ts.map +1 -0
- package/dist/lib/retry.d.ts +12 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/node-sqlite-dialect-HEMUZ4B2.js +160 -0
- package/dist/node-sqlite-dialect-HEMUZ4B2.js.map +1 -0
- package/dist/node-sqlite-dialect-QUBEEKKU.cjs +162 -0
- package/dist/node-sqlite-dialect-QUBEEKKU.cjs.map +1 -0
- package/dist/queues/handlers.d.ts +13 -0
- package/dist/queues/handlers.d.ts.map +1 -0
- package/dist/queues/jobs.d.ts +42 -0
- package/dist/queues/jobs.d.ts.map +1 -0
- package/dist/routes/events.d.ts +4 -0
- package/dist/routes/events.d.ts.map +1 -0
- package/dist/routes/faqs.d.ts +4 -0
- package/dist/routes/faqs.d.ts.map +1 -0
- package/dist/routes/health.d.ts +4 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/internal/gforms-webhook.d.ts +4 -0
- package/dist/routes/internal/gforms-webhook.d.ts.map +1 -0
- package/dist/routes/site-config.d.ts +4 -0
- package/dist/routes/site-config.d.ts.map +1 -0
- package/dist/routes/themes.d.ts +4 -0
- package/dist/routes/themes.d.ts.map +1 -0
- package/dist/routes/uploads.d.ts +4 -0
- package/dist/routes/uploads.d.ts.map +1 -0
- package/dist/routes/users.d.ts +4 -0
- package/dist/routes/users.d.ts.map +1 -0
- package/dist/services/cache.d.ts +22 -0
- package/dist/services/cache.d.ts.map +1 -0
- package/dist/services/contentful-management.d.ts +53 -0
- package/dist/services/contentful-management.d.ts.map +1 -0
- package/dist/services/contentful.d.ts +97 -0
- package/dist/services/contentful.d.ts.map +1 -0
- package/dist/services/email.d.ts +75 -0
- package/dist/services/email.d.ts.map +1 -0
- package/dist/services/gforms.d.ts +60 -0
- package/dist/services/gforms.d.ts.map +1 -0
- package/dist/services/resend.d.ts +34 -0
- package/dist/services/resend.d.ts.map +1 -0
- package/dist/services/ses.d.ts +58 -0
- package/dist/services/ses.d.ts.map +1 -0
- package/dist/services/slots.d.ts +48 -0
- package/dist/services/slots.d.ts.map +1 -0
- package/dist/services/snapshot.d.ts +90 -0
- package/dist/services/snapshot.d.ts.map +1 -0
- package/dist/types.d.ts +66 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/worker-handler.d.ts +64 -0
- package/dist/worker-handler.d.ts.map +1 -0
- package/dist/worker.d.ts +36 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +2195 -2553
- package/dist/worker.js.map +1 -1
- package/package.json +152 -152
- package/dist/chunk-3ZWIJNZG.cjs.map +0 -1
- package/dist/chunk-FLR7TNLN.js.map +0 -1
- package/dist/client/types.d.cts +0 -192
- package/dist/index.d.cts +0 -1879
- package/dist/lib/middleware/pow-challenge.d.cts +0 -47
- package/dist/types-lTjxCp88.d.ts +0 -208
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../node_modules/@better-auth/kysely-adapter/dist/node-sqlite-dialect.mjs"],"names":["CompiledQuery","sql","DEFAULT_MIGRATION_TABLE","DEFAULT_MIGRATION_LOCK_TABLE","DefaultQueryCompiler"],"mappings":"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","file":"node-sqlite-dialect-QUBEEKKU.cjs","sourcesContent":["import { CompiledQuery, DEFAULT_MIGRATION_LOCK_TABLE, DEFAULT_MIGRATION_TABLE, DefaultQueryCompiler, sql } from \"kysely\";\n//#region src/node-sqlite-dialect.ts\nvar NodeSqliteAdapter = class {\n\tget supportsCreateIfNotExists() {\n\t\treturn true;\n\t}\n\tget supportsTransactionalDdl() {\n\t\treturn false;\n\t}\n\tget supportsReturning() {\n\t\treturn true;\n\t}\n\tasync acquireMigrationLock() {}\n\tasync releaseMigrationLock() {}\n\tget supportsOutput() {\n\t\treturn true;\n\t}\n};\nvar NodeSqliteDriver = class {\n\t#config;\n\t#connectionMutex = new ConnectionMutex();\n\t#db;\n\t#connection;\n\tconstructor(config) {\n\t\tthis.#config = { ...config };\n\t}\n\tasync init() {\n\t\tthis.#db = this.#config.database;\n\t\tthis.#connection = new NodeSqliteConnection(this.#db);\n\t\tif (this.#config.onCreateConnection) await this.#config.onCreateConnection(this.#connection);\n\t}\n\tasync acquireConnection() {\n\t\tawait this.#connectionMutex.lock();\n\t\treturn this.#connection;\n\t}\n\tasync beginTransaction(connection) {\n\t\tawait connection.executeQuery(CompiledQuery.raw(\"begin\"));\n\t}\n\tasync commitTransaction(connection) {\n\t\tawait connection.executeQuery(CompiledQuery.raw(\"commit\"));\n\t}\n\tasync rollbackTransaction(connection) {\n\t\tawait connection.executeQuery(CompiledQuery.raw(\"rollback\"));\n\t}\n\tasync releaseConnection() {\n\t\tthis.#connectionMutex.unlock();\n\t}\n\tasync destroy() {\n\t\tthis.#db?.close();\n\t}\n};\nvar NodeSqliteConnection = class {\n\t#db;\n\tconstructor(db) {\n\t\tthis.#db = db;\n\t}\n\texecuteQuery(compiledQuery) {\n\t\tconst { sql, parameters } = compiledQuery;\n\t\tconst rows = this.#db.prepare(sql).all(...parameters);\n\t\treturn Promise.resolve({ rows });\n\t}\n\tasync *streamQuery() {\n\t\tthrow new Error(\"Streaming query is not supported by SQLite driver.\");\n\t}\n};\nvar ConnectionMutex = class {\n\t#promise;\n\t#resolve;\n\tasync lock() {\n\t\twhile (this.#promise !== void 0) await this.#promise;\n\t\tthis.#promise = new Promise((resolve) => {\n\t\t\tthis.#resolve = resolve;\n\t\t});\n\t}\n\tunlock() {\n\t\tconst resolve = this.#resolve;\n\t\tthis.#promise = void 0;\n\t\tthis.#resolve = void 0;\n\t\tresolve?.();\n\t}\n};\nvar NodeSqliteIntrospector = class {\n\t#db;\n\tconstructor(db) {\n\t\tthis.#db = db;\n\t}\n\tasync getSchemas() {\n\t\treturn [];\n\t}\n\tasync getTables(options = { withInternalKyselyTables: false }) {\n\t\tlet query = this.#db.selectFrom(\"sqlite_schema\").where(\"type\", \"=\", \"table\").where(\"name\", \"not like\", \"sqlite_%\").select(\"name\").$castTo();\n\t\tif (!options.withInternalKyselyTables) query = query.where(\"name\", \"!=\", DEFAULT_MIGRATION_TABLE).where(\"name\", \"!=\", DEFAULT_MIGRATION_LOCK_TABLE);\n\t\tconst tables = await query.execute();\n\t\treturn Promise.all(tables.map(({ name }) => this.#getTableMetadata(name)));\n\t}\n\tasync getMetadata(options) {\n\t\treturn { tables: await this.getTables(options) };\n\t}\n\tasync #getTableMetadata(table) {\n\t\tconst db = this.#db;\n\t\tconst autoIncrementCol = (await db.selectFrom(\"sqlite_master\").where(\"name\", \"=\", table).select(\"sql\").$castTo().execute())[0]?.sql?.split(/[\\(\\),]/)?.find((it) => it.toLowerCase().includes(\"autoincrement\"))?.split(/\\s+/)?.[0]?.replace(/[\"`]/g, \"\");\n\t\treturn {\n\t\t\tname: table,\n\t\t\tcolumns: (await db.selectFrom(sql`pragma_table_info(${table})`.as(\"table_info\")).select([\n\t\t\t\t\"name\",\n\t\t\t\t\"type\",\n\t\t\t\t\"notnull\",\n\t\t\t\t\"dflt_value\"\n\t\t\t]).execute()).map((col) => ({\n\t\t\t\tname: col.name,\n\t\t\t\tdataType: col.type,\n\t\t\t\tisNullable: !col.notnull,\n\t\t\t\tisAutoIncrementing: col.name === autoIncrementCol,\n\t\t\t\thasDefaultValue: col.dflt_value != null\n\t\t\t})),\n\t\t\tisView: true\n\t\t};\n\t}\n};\nvar NodeSqliteQueryCompiler = class extends DefaultQueryCompiler {\n\tgetCurrentParameterPlaceholder() {\n\t\treturn \"?\";\n\t}\n\tgetLeftIdentifierWrapper() {\n\t\treturn \"\\\"\";\n\t}\n\tgetRightIdentifierWrapper() {\n\t\treturn \"\\\"\";\n\t}\n\tgetAutoIncrement() {\n\t\treturn \"autoincrement\";\n\t}\n};\nvar NodeSqliteDialect = class {\n\t#config;\n\tconstructor(config) {\n\t\tthis.#config = { ...config };\n\t}\n\tcreateDriver() {\n\t\treturn new NodeSqliteDriver(this.#config);\n\t}\n\tcreateQueryCompiler() {\n\t\treturn new NodeSqliteQueryCompiler();\n\t}\n\tcreateAdapter() {\n\t\treturn new NodeSqliteAdapter();\n\t}\n\tcreateIntrospector(db) {\n\t\treturn new NodeSqliteIntrospector(db);\n\t}\n};\n//#endregion\nexport { NodeSqliteDialect };\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { LeapifyBindings } from '../types';
|
|
2
|
+
import type { LeapifyJob } from './jobs';
|
|
3
|
+
/**
|
|
4
|
+
* CF Queue consumer handler.
|
|
5
|
+
* Export from the consumer repo's worker entry like:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { createQueueHandler } from 'leapify'
|
|
9
|
+
* export const queue = createQueueHandler
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export declare function createQueueHandler(env: LeapifyBindings): (batch: MessageBatch<LeapifyJob>) => Promise<void>;
|
|
13
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/queues/handlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAUxC;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,IACvC,OAAO,YAAY,CAAC,UAAU,CAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAe9D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discriminated union of all async job types processed by the CF Queue consumer.
|
|
3
|
+
*/
|
|
4
|
+
export type LeapifyJob = {
|
|
5
|
+
type: 'send_reminder_email';
|
|
6
|
+
payload: {
|
|
7
|
+
eventId: string;
|
|
8
|
+
hoursBeforeEvent: 24 | 1;
|
|
9
|
+
};
|
|
10
|
+
} | {
|
|
11
|
+
type: 'send_email';
|
|
12
|
+
payload: {
|
|
13
|
+
to: string;
|
|
14
|
+
subject: string;
|
|
15
|
+
html: string;
|
|
16
|
+
};
|
|
17
|
+
} | {
|
|
18
|
+
type: 'audit_log';
|
|
19
|
+
payload: {
|
|
20
|
+
action: string;
|
|
21
|
+
userId: string;
|
|
22
|
+
meta: unknown;
|
|
23
|
+
};
|
|
24
|
+
} | {
|
|
25
|
+
type: 'snapshot_content';
|
|
26
|
+
payload: {
|
|
27
|
+
triggeredAt: number;
|
|
28
|
+
};
|
|
29
|
+
} | {
|
|
30
|
+
type: 'notify_batch_release';
|
|
31
|
+
payload: {
|
|
32
|
+
eventIds: string[];
|
|
33
|
+
releasedAt: number;
|
|
34
|
+
};
|
|
35
|
+
} | {
|
|
36
|
+
type: 'renew_forms_watch';
|
|
37
|
+
payload: {
|
|
38
|
+
formId: string;
|
|
39
|
+
watchId: string;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/queues/jobs.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,qBAAqB,CAAA;IAC3B,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAA;KAAE,CAAA;CACvD,GACD;IACE,IAAI,EAAE,YAAY,CAAA;IAClB,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CACvD,GACD;IACE,IAAI,EAAE,WAAW,CAAA;IACjB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAA;CAC3D,GACD;IACE,IAAI,EAAE,kBAAkB,CAAA;IACxB,OAAO,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;CACjC,GACD;IACE,IAAI,EAAE,sBAAsB,CAAA;IAC5B,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAA;CACpD,GACD;IACE,IAAI,EAAE,mBAAmB,CAAA;IACzB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAC7C,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/routes/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAmG1C,eAAO,MAAM,WAAW,yDAAyB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"faqs.d.ts","sourceRoot":"","sources":["../../src/routes/faqs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAmB1C,eAAO,MAAM,SAAS,yDAAyB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,eAAO,MAAM,WAAW,yDAAyB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gforms-webhook.d.ts","sourceRoot":"","sources":["../../../src/routes/internal/gforms-webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAO9C,eAAO,MAAM,kBAAkB,yDAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-config.d.ts","sourceRoot":"","sources":["../../src/routes/site-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAgC,MAAM,UAAU,CAAC;AAQzE,eAAO,MAAM,eAAe,yDAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../../src/routes/themes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAuE1C,eAAO,MAAM,WAAW,yDAAyB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../src/routes/uploads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAkB1C,eAAO,MAAM,YAAY,yDAAyB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/routes/users.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAS3C,eAAO,MAAM,UAAU,yDAAyB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { KVNamespace } from '@cloudflare/workers-types';
|
|
2
|
+
/**
|
|
3
|
+
* Typed KV cache wrapper with get/set/del and stale-while-revalidate helpers.
|
|
4
|
+
*/
|
|
5
|
+
export declare class CacheService {
|
|
6
|
+
private readonly kv;
|
|
7
|
+
constructor(kv: KVNamespace);
|
|
8
|
+
get<T>(key: string): Promise<T | null>;
|
|
9
|
+
set<T>(key: string, value: T, ttlSeconds?: number): Promise<void>;
|
|
10
|
+
del(key: string): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Returns cached value immediately. If stale or missing, refreshes in
|
|
13
|
+
* the background using the provided fetcher. Pass `ctx` to use
|
|
14
|
+
* ctx.waitUntil() so the refresh doesn't block the response.
|
|
15
|
+
*/
|
|
16
|
+
getOrSet<T>(key: string, fetcher: () => Promise<T>, ttlSeconds: number, ctx?: ExecutionContext): Promise<T>;
|
|
17
|
+
/**
|
|
18
|
+
* Generate a simple ETag from a version string by hashing with SHA-256.
|
|
19
|
+
*/
|
|
20
|
+
generateETag(versionString: string): Promise<string>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/services/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAE5D;;GAEG;AACH,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,WAAW;IAEtC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAItC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC;;;;OAIG;IACG,QAAQ,CAAC,CAAC,EACd,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,UAAU,EAAE,MAAM,EAClB,GAAG,CAAC,EAAE,gBAAgB,GACrB,OAAO,CAAC,CAAC,CAAC;IAgBb;;OAEG;IACG,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAO3D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contentful Content Management API client.
|
|
3
|
+
* Hand-rolled fetch-based — fully edge-compatible (CF Workers).
|
|
4
|
+
*
|
|
5
|
+
* Contentful content type lifecycle:
|
|
6
|
+
* POST /content_types → Draft (version 1)
|
|
7
|
+
* PUT /content_types/{id} → Changed (version 2+)
|
|
8
|
+
* PUT /content_types/{id}/published → Published
|
|
9
|
+
*
|
|
10
|
+
* After POST, there is eventual consistency. The content type may not
|
|
11
|
+
* be immediately available for PUT/GET. We handle this with retries.
|
|
12
|
+
*/
|
|
13
|
+
export interface ContentTypeField {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
type: 'Symbol' | 'Text' | 'Integer' | 'Number' | 'Boolean' | 'Date' | 'Object' | 'Link' | 'Array';
|
|
17
|
+
required?: boolean;
|
|
18
|
+
localized?: boolean;
|
|
19
|
+
validations?: unknown[];
|
|
20
|
+
items?: {
|
|
21
|
+
type: string;
|
|
22
|
+
validations?: unknown[];
|
|
23
|
+
};
|
|
24
|
+
linkType?: 'Entry' | 'Asset';
|
|
25
|
+
}
|
|
26
|
+
export declare class ContentfulManagement {
|
|
27
|
+
private readonly spaceId;
|
|
28
|
+
private readonly token;
|
|
29
|
+
private readonly environment;
|
|
30
|
+
constructor(spaceId: string, token: string, environment?: string);
|
|
31
|
+
static isConfigured(spaceId?: string, token?: string): boolean;
|
|
32
|
+
getContentType(contentTypeId: string): Promise<any | null>;
|
|
33
|
+
ensureContentType(contentTypeId: string, name: string, fields: ContentTypeField[]): Promise<void>;
|
|
34
|
+
getEntry(entryId: string): Promise<any | null>;
|
|
35
|
+
upsertEntry(contentTypeId: string, entryId: string, fields: Record<string, Record<string, unknown>>): Promise<any>;
|
|
36
|
+
uploadFile(_fileName: string, data: ArrayBuffer, contentType: string): Promise<string>;
|
|
37
|
+
createAssetFromUpload(uploadId: string, title: string, fileName: string, contentType: string): Promise<{
|
|
38
|
+
id: string;
|
|
39
|
+
url: string;
|
|
40
|
+
}>;
|
|
41
|
+
static locale(value: unknown): Record<string, unknown>;
|
|
42
|
+
static entryRef(entryId: string): Record<string, unknown>;
|
|
43
|
+
static assetRef(assetId: string): Record<string, unknown>;
|
|
44
|
+
private authHeader;
|
|
45
|
+
private fetch;
|
|
46
|
+
private createContentType;
|
|
47
|
+
private saveContentType;
|
|
48
|
+
private publishContentType;
|
|
49
|
+
private createEntry;
|
|
50
|
+
private updateEntry;
|
|
51
|
+
private publishEntry;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=contentful-management.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contentful-management.d.ts","sourceRoot":"","sources":["../../src/services/contentful-management.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;IACjG,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,OAAO,EAAE,CAAA;IACvB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,CAAA;IACjD,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;CAC7B;AAID,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAExB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,SAAW;IAMlE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAMxD,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAW1D,iBAAiB,CACrB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC;IAqDV,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAW9C,WAAW,CACf,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC9C,OAAO,CAAC,GAAG,CAAC;IAeT,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBtF,qBAAqB,CACzB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAkCvC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAItD,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIzD,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAMzD,OAAO,CAAC,UAAU;YAIJ,KAAK;YAQL,iBAAiB;YAmBjB,eAAe;YAkBf,kBAAkB;YAalB,WAAW;YAeX,WAAW;YAaX,YAAY;CAQ3B"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contentful Delivery API client.
|
|
3
|
+
* Fully fetch-native — no SDK (edge compatible).
|
|
4
|
+
*
|
|
5
|
+
* Uses the Content Delivery API (read-only, published content only).
|
|
6
|
+
* All responses are JSON; asset files are fetched separately via their CDN URL.
|
|
7
|
+
*/
|
|
8
|
+
interface ContentfulSys {
|
|
9
|
+
id: string;
|
|
10
|
+
type: string;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
updatedAt: string;
|
|
13
|
+
contentType?: {
|
|
14
|
+
sys: {
|
|
15
|
+
type: string;
|
|
16
|
+
linkType: string;
|
|
17
|
+
id: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
interface ContentfulAssetFile {
|
|
22
|
+
url: string;
|
|
23
|
+
details: {
|
|
24
|
+
size: number;
|
|
25
|
+
image?: {
|
|
26
|
+
width: number;
|
|
27
|
+
height: number;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
fileName: string;
|
|
31
|
+
contentType: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ContentfulEntry {
|
|
34
|
+
sys: ContentfulSys;
|
|
35
|
+
fields: Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
export interface ContentfulAsset {
|
|
38
|
+
sys: {
|
|
39
|
+
id: string;
|
|
40
|
+
type: 'Asset';
|
|
41
|
+
createdAt: string;
|
|
42
|
+
updatedAt: string;
|
|
43
|
+
};
|
|
44
|
+
fields: {
|
|
45
|
+
title?: string;
|
|
46
|
+
description?: string;
|
|
47
|
+
file?: ContentfulAssetFile;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export declare class ContentfulService {
|
|
51
|
+
private readonly spaceId;
|
|
52
|
+
private readonly accessToken;
|
|
53
|
+
private readonly environment;
|
|
54
|
+
constructor(spaceId: string, accessToken: string, environment?: string);
|
|
55
|
+
/**
|
|
56
|
+
* Returns true if the required Contentful credentials are configured.
|
|
57
|
+
*/
|
|
58
|
+
static isConfigured(spaceId?: string, accessToken?: string): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Fetch all entries of a given content type.
|
|
61
|
+
* Handles pagination automatically (100 per page, Contentful max).
|
|
62
|
+
*/
|
|
63
|
+
getEntries(contentTypeId: string): Promise<ContentfulEntry[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Fetch all assets. Handles pagination.
|
|
66
|
+
*/
|
|
67
|
+
getAssets(): Promise<ContentfulAsset[]>;
|
|
68
|
+
/**
|
|
69
|
+
* Download an asset file from Contentful's CDN.
|
|
70
|
+
* Returns the raw ArrayBuffer and content type.
|
|
71
|
+
*/
|
|
72
|
+
downloadAsset(assetUrl: string): Promise<{
|
|
73
|
+
data: ArrayBuffer;
|
|
74
|
+
contentType: string;
|
|
75
|
+
}>;
|
|
76
|
+
/**
|
|
77
|
+
* Extract a field value from a Contentful entry, handling locale wrapping.
|
|
78
|
+
* Contentful fields are often `{ "en-US": value }` — this unwraps them.
|
|
79
|
+
*/
|
|
80
|
+
static getField<T = unknown>(entry: ContentfulEntry, fieldName: string): T | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* Extract a linked entry/sys reference ID from a reference field.
|
|
83
|
+
*/
|
|
84
|
+
static getRefId(entry: ContentfulEntry, fieldName: string): string | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* Extract an asset URL from a linked asset field.
|
|
87
|
+
*/
|
|
88
|
+
static getAssetUrl(entry: ContentfulEntry, fieldName: string): string | undefined;
|
|
89
|
+
/**
|
|
90
|
+
* Resolve an asset URL by ID from a list of fetched assets.
|
|
91
|
+
*/
|
|
92
|
+
static resolveAssetUrl(assets: ContentfulAsset[], assetId: string): string | undefined;
|
|
93
|
+
private headers;
|
|
94
|
+
private buildUrl;
|
|
95
|
+
}
|
|
96
|
+
export {};
|
|
97
|
+
//# sourceMappingURL=contentful.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contentful.d.ts","sourceRoot":"","sources":["../../src/services/contentful.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE;QAAE,GAAG,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CACtE;AAED,UAAU,mBAAmB;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;IACpE,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,aAAa,CAAA;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IACxE,MAAM,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,IAAI,CAAC,EAAE,mBAAmB,CAAA;KAC3B,CAAA;CACF;AAgBD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAExB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,SAAW;IAMxE;;OAEG;IACH,MAAM,CAAC,YAAY,CACjB,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO;IAMV;;;OAGG;IACG,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA4BnE;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IA+B7C;;;OAGG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAiB1F;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAYtF;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK9E;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKjF;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAOtF,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,QAAQ;CAajB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmailRouter — provider-agnostic email facade.
|
|
3
|
+
*
|
|
4
|
+
* Strategy:
|
|
5
|
+
* 1. Try Amazon SES (primary) with up to SES_MAX_ATTEMPTS retries.
|
|
6
|
+
* 2. If SES raises a non-retryable error AND Resend is configured
|
|
7
|
+
* (RESEND_API_KEY is set), fall back to Resend.
|
|
8
|
+
* 3. If Resend is not configured, re-throw the SES error immediately.
|
|
9
|
+
*
|
|
10
|
+
* The caller (queue handler) is responsible for final DLQ behaviour via
|
|
11
|
+
* message.retry() / message.ack().
|
|
12
|
+
*/
|
|
13
|
+
export interface EmailPayload {
|
|
14
|
+
to: string | string[];
|
|
15
|
+
subject: string;
|
|
16
|
+
html: string;
|
|
17
|
+
from?: string;
|
|
18
|
+
replyTo?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface EmailRouterConfig {
|
|
21
|
+
/** SES credentials — optional */
|
|
22
|
+
ses?: {
|
|
23
|
+
region: string;
|
|
24
|
+
accessKeyId: string;
|
|
25
|
+
secretAccessKey: string;
|
|
26
|
+
fromAddress: string;
|
|
27
|
+
} | undefined;
|
|
28
|
+
/** Resend credentials — optional */
|
|
29
|
+
resend?: {
|
|
30
|
+
apiKey: string;
|
|
31
|
+
fromAddress: string;
|
|
32
|
+
} | undefined;
|
|
33
|
+
/** Optional display name for 'From' header (e.g. "Leapify") */
|
|
34
|
+
fromName?: string | undefined;
|
|
35
|
+
}
|
|
36
|
+
export declare class EmailRouter {
|
|
37
|
+
private readonly ses;
|
|
38
|
+
private readonly resend;
|
|
39
|
+
constructor(config: EmailRouterConfig);
|
|
40
|
+
/**
|
|
41
|
+
* Send a single email.
|
|
42
|
+
* Tries SES first (with retries), then Resend if configured and SES fails permanently.
|
|
43
|
+
*/
|
|
44
|
+
sendEmail(payload: EmailPayload): Promise<{
|
|
45
|
+
provider: 'ses' | 'resend';
|
|
46
|
+
id: string;
|
|
47
|
+
}>;
|
|
48
|
+
/**
|
|
49
|
+
* Send a batch of emails.
|
|
50
|
+
* Each email is routed individually through sendEmail() so per-message
|
|
51
|
+
* fallback logic applies consistently.
|
|
52
|
+
*
|
|
53
|
+
* Returns settled results — partial failures do NOT abort the batch.
|
|
54
|
+
*/
|
|
55
|
+
sendBatch(payloads: EmailPayload[]): Promise<PromiseSettledResult<{
|
|
56
|
+
provider: 'ses' | 'resend';
|
|
57
|
+
id: string;
|
|
58
|
+
}>[]>;
|
|
59
|
+
}
|
|
60
|
+
export type EmailEnv = {
|
|
61
|
+
SES_REGION?: string;
|
|
62
|
+
SES_ACCESS_KEY_ID?: string;
|
|
63
|
+
SES_SECRET_ACCESS_KEY?: string;
|
|
64
|
+
SES_FROM_ADDRESS?: string;
|
|
65
|
+
EMAIL_FROM_NAME?: string;
|
|
66
|
+
ALLOWED_ORIGINS?: string;
|
|
67
|
+
RESEND_API_KEY?: string;
|
|
68
|
+
RESEND_FROM_ADDRESS?: string;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Build an EmailRouter from Cloudflare Worker bindings.
|
|
72
|
+
* Returns null if no email providers are configured.
|
|
73
|
+
*/
|
|
74
|
+
export declare function createEmailRouter(env: EmailEnv): EmailRouter | null;
|
|
75
|
+
//# sourceMappingURL=email.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/services/email.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,iCAAiC;IACjC,GAAG,CAAC,EAAE;QACJ,MAAM,EAAE,MAAM,CAAA;QACd,WAAW,EAAE,MAAM,CAAA;QACnB,eAAe,EAAE,MAAM,CAAA;QACvB,WAAW,EAAE,MAAM,CAAA;KACpB,GAAG,SAAS,CAAA;IACb,oCAAoC;IACpC,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAA;QACd,WAAW,EAAE,MAAM,CAAA;KACpB,GAAG,SAAS,CAAA;IACb,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC9B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmB;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;gBAEjC,MAAM,EAAE,iBAAiB;IASrC;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,KAAK,GAAG,QAAQ,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAiC3F;;;;;;OAMG;IACG,SAAS,CACb,QAAQ,EAAE,YAAY,EAAE,GACvB,OAAO,CAAC,oBAAoB,CAAC;QAAE,QAAQ,EAAE,KAAK,GAAG,QAAQ,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;CAG/E;AAMD,MAAM,MAAM,QAAQ,GAAG;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,WAAW,GAAG,IAAI,CAyBnE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Forms API client using service account OAuth2.
|
|
3
|
+
* Fully fetch-native — no googleapis SDK (not edge compatible).
|
|
4
|
+
*/
|
|
5
|
+
interface FormResponse {
|
|
6
|
+
responseId: string;
|
|
7
|
+
createTime: string;
|
|
8
|
+
lastSubmittedTime: string;
|
|
9
|
+
respondentEmail?: string;
|
|
10
|
+
answers?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export declare class GFormsService {
|
|
13
|
+
private accessToken;
|
|
14
|
+
private tokenExpiresAt;
|
|
15
|
+
private readonly credentials;
|
|
16
|
+
constructor(serviceAccountJson: string);
|
|
17
|
+
private getAccessToken;
|
|
18
|
+
private fetchServiceAccountToken;
|
|
19
|
+
private createJwt;
|
|
20
|
+
/**
|
|
21
|
+
* Get the total response count for a form.
|
|
22
|
+
* Used by reconciliation cron — not called at runtime per-user.
|
|
23
|
+
*/
|
|
24
|
+
getResponseCount(formId: string): Promise<number>;
|
|
25
|
+
/**
|
|
26
|
+
* List all form responses including respondent emails.
|
|
27
|
+
* Used by reminder email cron — 1 call per event per reminder cycle.
|
|
28
|
+
*/
|
|
29
|
+
getAllResponses(formId: string): Promise<FormResponse[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Get respondent email addresses for a form.
|
|
32
|
+
* Google Forms automatically collects emails when "Collect email addresses" is enabled.
|
|
33
|
+
*/
|
|
34
|
+
getRespondentEmails(formId: string): Promise<string[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Get the total response count more accurately by fetching all responses.
|
|
37
|
+
* Used for precise reconciliation.
|
|
38
|
+
*/
|
|
39
|
+
getExactResponseCount(formId: string): Promise<number>;
|
|
40
|
+
/**
|
|
41
|
+
* Create a Watch on a Google Form.
|
|
42
|
+
* Fires a push notification to webhookUrl on every new response.
|
|
43
|
+
*
|
|
44
|
+
* @param formId - Google Form ID
|
|
45
|
+
* @param webhookUrl - Full HTTPS URL Google will POST to on new submissions
|
|
46
|
+
* (e.g. https://leap.yourdomain.com/internal/gforms-webhook)
|
|
47
|
+
*/
|
|
48
|
+
createWatch(formId: string, webhookUrl: string): Promise<{
|
|
49
|
+
watchId: string;
|
|
50
|
+
expireTime: string;
|
|
51
|
+
}>;
|
|
52
|
+
/**
|
|
53
|
+
* Renew an existing Watch (reset its 7-day TTL).
|
|
54
|
+
*/
|
|
55
|
+
renewWatch(formId: string, watchId: string): Promise<{
|
|
56
|
+
expireTime: string;
|
|
57
|
+
}>;
|
|
58
|
+
}
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=gforms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gforms.d.ts","sourceRoot":"","sources":["../../src/services/gforms.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,UAAU,YAAY;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAOD,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;gBAE5C,kBAAkB,EAAE,MAAM;YAQxB,cAAc;YAWd,wBAAwB;YA6BxB,SAAS;IA6CvB;;;OAGG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvD;;;OAGG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA0B9D;;;OAGG;IACG,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAO5D;;;OAGG;IACG,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO5D;;;;;;;OAOG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAiCnD;;OAEG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAuBnC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resend transactional email client.
|
|
3
|
+
* Fully fetch-native — no SDK, fully edge-compatible.
|
|
4
|
+
*/
|
|
5
|
+
export interface SendEmailOptions {
|
|
6
|
+
to: string | string[];
|
|
7
|
+
subject: string;
|
|
8
|
+
html: string;
|
|
9
|
+
from?: string;
|
|
10
|
+
replyTo?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface BatchEmailOptions {
|
|
13
|
+
emails: SendEmailOptions[];
|
|
14
|
+
}
|
|
15
|
+
export declare class ResendService {
|
|
16
|
+
private readonly apiKey;
|
|
17
|
+
private readonly defaultFrom;
|
|
18
|
+
constructor(apiKey: string, fromAddress: string);
|
|
19
|
+
private get headers();
|
|
20
|
+
sendEmail(options: SendEmailOptions): Promise<{
|
|
21
|
+
id: string;
|
|
22
|
+
}>;
|
|
23
|
+
sendBatch(emails: SendEmailOptions[]): Promise<{
|
|
24
|
+
id: string;
|
|
25
|
+
}[]>;
|
|
26
|
+
}
|
|
27
|
+
export declare function buildReminderEmail(event: {
|
|
28
|
+
title: string;
|
|
29
|
+
dateTime?: string | null;
|
|
30
|
+
venue?: string | null;
|
|
31
|
+
gformsUrl?: string | null;
|
|
32
|
+
org?: string | null;
|
|
33
|
+
}): string;
|
|
34
|
+
//# sourceMappingURL=resend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resend.d.ts","sourceRoot":"","sources":["../../src/services/resend.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAK/C,OAAO,KAAK,OAAO,GAKlB;IAEK,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAqB7D,SAAS,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAuBvE;AAID,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,GAAG,MAAM,CAmBT"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Amazon SES (v2) transactional email client.
|
|
3
|
+
*
|
|
4
|
+
* Uses the SES v2 SendEmail REST endpoint with AWS SigV4 signing.
|
|
5
|
+
* Fully fetch-native — no SDK, fully edge-compatible (Cloudflare Workers).
|
|
6
|
+
*
|
|
7
|
+
* Docs: https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html
|
|
8
|
+
*/
|
|
9
|
+
export interface SesEmailOptions {
|
|
10
|
+
to: string | string[];
|
|
11
|
+
subject: string;
|
|
12
|
+
html: string;
|
|
13
|
+
from?: string;
|
|
14
|
+
replyTo?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface SesBatchEmailOptions {
|
|
17
|
+
emails: SesEmailOptions[];
|
|
18
|
+
}
|
|
19
|
+
export declare class SesService {
|
|
20
|
+
private readonly region;
|
|
21
|
+
private readonly accessKeyId;
|
|
22
|
+
private readonly secretAccessKey;
|
|
23
|
+
private readonly defaultFrom;
|
|
24
|
+
constructor(opts: {
|
|
25
|
+
region: string;
|
|
26
|
+
accessKeyId: string;
|
|
27
|
+
secretAccessKey: string;
|
|
28
|
+
fromAddress: string;
|
|
29
|
+
fromName?: string | undefined;
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* Send a single email via SES v2 SendEmail.
|
|
33
|
+
* Throws on any non-2xx response.
|
|
34
|
+
*/
|
|
35
|
+
sendEmail(options: SesEmailOptions): Promise<{
|
|
36
|
+
messageId: string;
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Send a batch of emails sequentially (SES v2 has no native batch endpoint).
|
|
40
|
+
* Each message is sent individually; partial failure does NOT abort remaining sends.
|
|
41
|
+
* Returns settled results so the caller can decide what to do with failures.
|
|
42
|
+
*/
|
|
43
|
+
sendBatch(emails: SesEmailOptions[]): Promise<PromiseSettledResult<{
|
|
44
|
+
messageId: string;
|
|
45
|
+
}>[]>;
|
|
46
|
+
private _signedFetch;
|
|
47
|
+
}
|
|
48
|
+
export declare class SesError extends Error {
|
|
49
|
+
readonly status: number;
|
|
50
|
+
constructor(status: number, message: string);
|
|
51
|
+
/**
|
|
52
|
+
* True for errors that are permanent (not worth retrying via SES again).
|
|
53
|
+
* 400 BadRequest, 403 Forbidden, 404 NotFound → non-retryable.
|
|
54
|
+
* 429 ThrottlingException, 5xx → retryable.
|
|
55
|
+
*/
|
|
56
|
+
get isNonRetryable(): boolean;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=ses.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ses.d.ts","sourceRoot":"","sources":["../../src/services/ses.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,eAAe,EAAE,CAAA;CAC1B;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAExB,IAAI,EAAE;QAChB,MAAM,EAAE,MAAM,CAAA;QACd,WAAW,EAAE,MAAM,CAAA;QACnB,eAAe,EAAE,MAAM,CAAA;QACvB,WAAW,EAAE,MAAM,CAAA;QACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC9B;IAOD;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IA6BzE;;;;OAIG;IACG,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;YAQpF,YAAY;CA+C3B;AAMD,qBAAa,QAAS,SAAQ,KAAK;aAEf,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM;IAMjB;;;;OAIG;IACH,IAAI,cAAc,IAAI,OAAO,CAE5B;CACF"}
|