@contentrail/cloudflare 0.2.0 → 0.2.2

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/README.md CHANGED
@@ -18,10 +18,10 @@ pnpm install
18
18
  pnpm --filter @contentrail/cloudflare build
19
19
  ```
20
20
 
21
- ### From npm (upcoming `0.2.0` after authorized publish)
21
+ ### From npm (`0.2.2`)
22
22
 
23
23
  ```sh
24
- pnpm add @contentrail/core@0.2.0 @contentrail/publisher@0.2.0 @contentrail/cloudflare@0.2.0 zod@^4.6.7
24
+ pnpm add @contentrail/core@0.2.2 @contentrail/publisher@0.2.2 @contentrail/cloudflare@0.2.2 zod@^4.6.7
25
25
  ```
26
26
 
27
27
  ## ADR 011b summary
@@ -34,7 +34,11 @@ pnpm add @contentrail/core@0.2.0 @contentrail/publisher@0.2.0 @contentrail/cloud
34
34
 
35
35
  | Method | Path | Auth | Purpose |
36
36
  | ------ | ---------------------------------------------- | ------------ | ------------------------------------------------------ |
37
- | `GET` | `/health` | No | Liveness; no secrets |
37
+ | `GET` | `/api/health` | No | Pages Functions liveness |
38
+ | `GET` | `/api/content/:collection` | Yes | Pages: active snapshot (`/:id` optional) |
39
+ | `POST` | `/api/publish` | Yes | Pages: body includes `collection` |
40
+ | `GET` | `/api/publish/status` | Yes | Pages: `?collection=` |
41
+ | `GET` | `/health` | No | Worker liveness; no secrets |
38
42
  | `GET` | `/v1/sites` | Yes | Sites the identity may access (no destination secrets) |
39
43
  | `GET` | `/v1/sites/:siteId/config` | Yes | Editor-safe site metadata |
40
44
  | `GET` | `/v1/sites/:siteId/collections/:name/content` | Yes (`read`) | Active published snapshot (`?entryId=` optional) |
@@ -93,11 +97,13 @@ export default {
93
97
  };
94
98
  ```
95
99
 
100
+ Pages Functions: `createPagesSiteHandler` (see `docs/CLOUDFLARE_PAGES.md`). Static `/admin` is not protected by Functions middleware.
101
+
96
102
  ## Deferred
97
103
 
98
104
  - File uploads (not required for Phase 4 JSON publishing)
99
105
  - Live production deploy verification
100
- - Editor UI (Phase 5)
106
+ - Automated Cloudflare Access application creation
101
107
 
102
108
  ## Credential rotation
103
109
 
@@ -2,6 +2,7 @@ import { type ContentCollection } from "@contentrail/core";
2
2
  import { type ContentPublisher } from "@contentrail/publisher";
3
3
  import type { Authenticator } from "../auth/types.js";
4
4
  import type { SiteAuthorizer } from "../authz/sites.js";
5
+ import { type MemoryRateLimiter } from "./rate-limit.js";
5
6
  export interface PublishApiOptions {
6
7
  readonly authenticator: Authenticator;
7
8
  readonly authorizer: SiteAuthorizer;
@@ -11,6 +12,8 @@ export interface PublishApiOptions {
11
12
  readonly collections: Readonly<Record<string, ContentCollection>>;
12
13
  readonly corsAllowedOrigins?: readonly string[];
13
14
  readonly maxBodyBytes?: number;
15
+ readonly maxPublishEntries?: number;
16
+ readonly rateLimiter?: MemoryRateLimiter;
14
17
  /** Optional safe logger — must not log tokens or full content payloads. */
15
18
  readonly log?: (event: Record<string, unknown>) => void;
16
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/api/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAiB,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAGL,KAAK,gBAAgB,EAEtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,mBAAmB,CAAC;AAGxE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,sEAAsE;IACtE,QAAQ,CAAC,YAAY,EAAE,CACrB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,KACnB,gBAAgB,CAAC;IACtB,kEAAkE;IAClE,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAClE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACzD;AAMD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,iBAAiB,GACzB,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAiRzC"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/api/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAiB,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAGL,KAAK,gBAAgB,EAEtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,mBAAmB,CAAC;AAExE,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,sEAAsE;IACtE,QAAQ,CAAC,YAAY,EAAE,CACrB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,KACnB,gBAAgB,CAAC;IACtB,kEAAkE;IAClE,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAClE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IACzC,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACzD;AAMD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,iBAAiB,GACzB,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAsTzC"}
@@ -1,6 +1,7 @@
1
1
  import { validateEntry } from "@contentrail/core";
2
2
  import { PublishConflictError, PublishError, } from "@contentrail/publisher";
3
3
  import { applyCors, getRequestId, jsonResponse, readJsonBody } from "./http.js";
4
+ import { createMemoryRateLimiter, } from "./rate-limit.js";
4
5
  const DEFAULT_MAX_BODY = 256_000;
5
6
  /** Caps publish/validate entry lists independently of nested JSON field bounds. */
6
7
  const DEFAULT_MAX_PUBLISH_ENTRIES = 500;
@@ -10,6 +11,9 @@ const DEFAULT_MAX_PUBLISH_ENTRIES = 500;
10
11
  */
11
12
  export function createPublishFetchHandler(options) {
12
13
  const maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY;
14
+ const maxPublishEntries = options.maxPublishEntries ?? DEFAULT_MAX_PUBLISH_ENTRIES;
15
+ const rateLimiter = options.rateLimiter ??
16
+ createMemoryRateLimiter({ windowMs: 60_000, max: 120 });
13
17
  const corsAllowedOrigins = options.corsAllowedOrigins ?? [];
14
18
  return async (request) => {
15
19
  const requestId = getRequestId(request);
@@ -37,6 +41,24 @@ export function createPublishFetchHandler(options) {
37
41
  requestId,
38
42
  });
39
43
  }
44
+ const limited = rateLimiter.allow(`${auth.identity.subject}:${request.method}:${url.pathname}`);
45
+ if (!limited.ok) {
46
+ options.log?.({
47
+ level: "warn",
48
+ requestId,
49
+ event: "rate_limited",
50
+ subject: auth.identity.subject,
51
+ });
52
+ const response = respond(429, {
53
+ error: {
54
+ code: "RATE_LIMITED",
55
+ message: "Too many publishing API requests. Retry shortly.",
56
+ },
57
+ requestId,
58
+ });
59
+ response.headers.set("Retry-After", String(limited.retryAfterSeconds));
60
+ return response;
61
+ }
40
62
  if (request.method === "GET" && url.pathname === "/v1/sites") {
41
63
  return respond(200, {
42
64
  sites: options.authorizer.listAccessibleSites(auth.identity),
@@ -153,7 +175,7 @@ export function createPublishFetchHandler(options) {
153
175
  });
154
176
  }
155
177
  if (action === "validate" || action === "publish") {
156
- const parsed = parsePublishBody(body.value);
178
+ const parsed = parsePublishBody(body.value, maxPublishEntries);
157
179
  if (!parsed.ok) {
158
180
  return respond(400, {
159
181
  error: { code: parsed.code, message: parsed.message },
@@ -198,6 +220,7 @@ export function createPublishFetchHandler(options) {
198
220
  collection: collectionName,
199
221
  version: result.version,
200
222
  rebuild: result.rebuild.state,
223
+ subject: auth.identity.subject,
201
224
  });
202
225
  return respond(200, publicPublishResult(result));
203
226
  }
@@ -215,6 +238,16 @@ export function createPublishFetchHandler(options) {
215
238
  targetVersion: parsed.targetVersion,
216
239
  expectedVersion: parsed.expectedVersion,
217
240
  });
241
+ options.log?.({
242
+ level: "info",
243
+ requestId,
244
+ event: "rollback_success",
245
+ siteId,
246
+ collection: collectionName,
247
+ version: result.version,
248
+ rebuild: result.rebuild.state,
249
+ subject: auth.identity.subject,
250
+ });
218
251
  return respond(200, publicPublishResult(result));
219
252
  }
220
253
  return respond(404, {
@@ -259,7 +292,7 @@ function publicPublishResult(result) {
259
292
  },
260
293
  };
261
294
  }
262
- function parsePublishBody(value) {
295
+ function parsePublishBody(value, maxPublishEntries) {
263
296
  if (value === null || typeof value !== "object") {
264
297
  return {
265
298
  ok: false,
@@ -290,11 +323,11 @@ function parsePublishBody(value) {
290
323
  message: 'Field "entries" must be an array.',
291
324
  };
292
325
  }
293
- if (record.entries.length > DEFAULT_MAX_PUBLISH_ENTRIES) {
326
+ if (record.entries.length > maxPublishEntries) {
294
327
  return {
295
328
  ok: false,
296
329
  code: "PAYLOAD_TOO_LARGE",
297
- message: `Field "entries" exceeds ${DEFAULT_MAX_PUBLISH_ENTRIES} items.`,
330
+ message: `Field "entries" exceeds ${maxPublishEntries} items.`,
298
331
  };
299
332
  }
300
333
  const entries = [];
@@ -368,6 +401,12 @@ function parseRollbackBody(value) {
368
401
  }
369
402
  function mapPublishError(error, respond, requestId, log) {
370
403
  if (error instanceof PublishConflictError) {
404
+ log?.({
405
+ level: "warn",
406
+ requestId,
407
+ event: "publish_conflict",
408
+ code: "CONFLICT",
409
+ });
371
410
  return respond(409, {
372
411
  error: {
373
412
  code: "CONFLICT",
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/api/handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/api/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface MemoryRateLimiter {
2
+ allow(key: string): {
3
+ ok: true;
4
+ } | {
5
+ ok: false;
6
+ retryAfterSeconds: number;
7
+ };
8
+ }
9
+ /**
10
+ * Process-local sliding window. Suitable for tests and single-isolate Workers.
11
+ * Multi-isolate production should use Durable Objects or an equivalent store.
12
+ */
13
+ export declare function createMemoryRateLimiter(options: {
14
+ readonly windowMs: number;
15
+ readonly max: number;
16
+ }): MemoryRateLimiter;
17
+ //# sourceMappingURL=rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/api/rate-limit.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,GAAG,iBAAiB,CAsBpB"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Process-local sliding window. Suitable for tests and single-isolate Workers.
3
+ * Multi-isolate production should use Durable Objects or an equivalent store.
4
+ */
5
+ export function createMemoryRateLimiter(options) {
6
+ const hits = new Map();
7
+ return {
8
+ allow(key) {
9
+ const now = Date.now();
10
+ const windowStart = now - options.windowMs;
11
+ const prior = (hits.get(key) ?? []).filter((stamp) => stamp > windowStart);
12
+ if (prior.length >= options.max) {
13
+ const retryAfterSeconds = Math.max(1, Math.ceil((prior[0] + options.windowMs - now) / 1000));
14
+ hits.set(key, prior);
15
+ return { ok: false, retryAfterSeconds };
16
+ }
17
+ prior.push(now);
18
+ hits.set(key, prior);
19
+ return { ok: true };
20
+ },
21
+ };
22
+ }
23
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/api/rate-limit.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAGvC;IACC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAC;IACzC,OAAO;QACL,KAAK,CAAC,GAAG;YACP,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;YAC3C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CACxC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,WAAW,CAC/B,CAAC;YACF,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAChC,CAAC,EACD,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CACvD,CAAC;gBACF,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;YAC1C,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACrB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -6,4 +6,10 @@ export { createCloudflareAccessAuthenticator, type CloudflareAccessOptions, } fr
6
6
  export type { AuthenticationFailure, AuthenticationFailureCode, AuthenticationResult, AuthenticationSuccess, Authenticator, Identity, } from "./auth/types.js";
7
7
  export { createSiteAuthorizer, type AccessibleSiteSummary, type AuthorizationFailure, type AuthorizationResult, type AuthorizationSuccess, type SiteAuthorizer, type SiteAuthorizationConfig, type SiteBinding, type SitePermission, } from "./authz/sites.js";
8
8
  export { createPublishFetchHandler, type PublishApiOptions, } from "./api/handler.js";
9
+ export { createMemoryRateLimiter, type MemoryRateLimiter, } from "./api/rate-limit.js";
10
+ export { CLOUDFLARE_PAGES_CAPABILITIES } from "./pages/capabilities.js";
11
+ export { createCloudflarePagesClient, type CloudflarePagesClientOptions, type PagesProjectInput, type PlannedPagesAction, } from "./pages/client.js";
12
+ export { createPagesSiteHandler, type PagesSiteHandlerOptions, } from "./pages/site-handler.js";
13
+ export { PAGES_DEV_VARS_EXAMPLE, PAGES_MIDDLEWARE_SOURCE, pagesApiFunctionSource, } from "./pages/templates.js";
14
+ export { checkMutationOrigin } from "./pages/csrf.js";
9
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mCAAmC,EACnC,KAAK,uBAAuB,GAC7B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,QAAQ,GACT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,EACzB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mCAAmC,EACnC,KAAK,uBAAuB,GAC7B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,QAAQ,GACT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,EACzB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,KAAK,iBAAiB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EACL,2BAA2B,EAC3B,KAAK,4BAA4B,EACjC,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -5,4 +5,10 @@
5
5
  export { createCloudflareAccessAuthenticator, } from "./auth/access.js";
6
6
  export { createSiteAuthorizer, } from "./authz/sites.js";
7
7
  export { createPublishFetchHandler, } from "./api/handler.js";
8
+ export { createMemoryRateLimiter, } from "./api/rate-limit.js";
9
+ export { CLOUDFLARE_PAGES_CAPABILITIES } from "./pages/capabilities.js";
10
+ export { createCloudflarePagesClient, } from "./pages/client.js";
11
+ export { createPagesSiteHandler, } from "./pages/site-handler.js";
12
+ export { PAGES_DEV_VARS_EXAMPLE, PAGES_MIDDLEWARE_SOURCE, pagesApiFunctionSource, } from "./pages/templates.js";
13
+ export { checkMutationOrigin } from "./pages/csrf.js";
8
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mCAAmC,GAEpC,MAAM,kBAAkB,CAAC;AAS1B,OAAO,EACL,oBAAoB,GASrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,GAE1B,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mCAAmC,GAEpC,MAAM,kBAAkB,CAAC;AAS1B,OAAO,EACL,oBAAoB,GASrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,GAE1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,GAExB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EACL,2BAA2B,GAI5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,GAEvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Honest capability map for Cloudflare Pages / Access automation.
3
+ * Do not treat dashboard-only steps as API success.
4
+ */
5
+ export declare const CLOUDFLARE_PAGES_CAPABILITIES: {
6
+ readonly automatedWithToken: readonly ["List accounts the API token can access", "List, get, create, and patch Pages projects (name, production branch, build command, output directory, env vars)", "List and get Pages deployments (status, errors when Cloudflare returns them)", "Set non-secret project environment variables via the Pages project API"];
7
+ readonly requiresUserAuthorization: readonly ["Creating the Cloudflare API token itself (dashboard or wrangler login)", "Installing the Cloudflare GitHub App / authorizing GitHub so Pages can attach a repository", "Creating Cloudflare Access (Zero Trust) applications, identity providers, and policy groups", "Uploading runtime secrets (GitHub App token, Access AUD) as Pages secret bindings"];
8
+ readonly dashboardOrManual: readonly ["Custom domains and DNS", "Access login methods (IdP) if not already configured on the account", "Protecting static /admin HTML: Pages Functions middleware does not run on static assets — Access must cover /admin*", "Production vs preview environment split in the Cloudflare dashboard when not set via API"];
9
+ };
10
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/pages/capabilities.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,6BAA6B;;;;CAmBhC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Honest capability map for Cloudflare Pages / Access automation.
3
+ * Do not treat dashboard-only steps as API success.
4
+ */
5
+ export const CLOUDFLARE_PAGES_CAPABILITIES = {
6
+ automatedWithToken: [
7
+ "List accounts the API token can access",
8
+ "List, get, create, and patch Pages projects (name, production branch, build command, output directory, env vars)",
9
+ "List and get Pages deployments (status, errors when Cloudflare returns them)",
10
+ "Set non-secret project environment variables via the Pages project API",
11
+ ],
12
+ requiresUserAuthorization: [
13
+ "Creating the Cloudflare API token itself (dashboard or wrangler login)",
14
+ "Installing the Cloudflare GitHub App / authorizing GitHub so Pages can attach a repository",
15
+ "Creating Cloudflare Access (Zero Trust) applications, identity providers, and policy groups",
16
+ "Uploading runtime secrets (GitHub App token, Access AUD) as Pages secret bindings",
17
+ ],
18
+ dashboardOrManual: [
19
+ "Custom domains and DNS",
20
+ "Access login methods (IdP) if not already configured on the account",
21
+ "Protecting static /admin HTML: Pages Functions middleware does not run on static assets — Access must cover /admin*",
22
+ "Production vs preview environment split in the Cloudflare dashboard when not set via API",
23
+ ],
24
+ };
25
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/pages/capabilities.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,kBAAkB,EAAE;QAClB,wCAAwC;QACxC,kHAAkH;QAClH,8EAA8E;QAC9E,wEAAwE;KACzE;IACD,yBAAyB,EAAE;QACzB,wEAAwE;QACxE,4FAA4F;QAC5F,6FAA6F;QAC7F,mFAAmF;KACpF;IACD,iBAAiB,EAAE;QACjB,wBAAwB;QACxB,qEAAqE;QACrE,qHAAqH;QACrH,0FAA0F;KAC3F;CACO,CAAC"}
@@ -0,0 +1,68 @@
1
+ export interface CloudflarePagesClientOptions {
2
+ readonly token: string;
3
+ readonly fetchImpl?: typeof fetch;
4
+ readonly apiBase?: string;
5
+ }
6
+ export interface PagesProjectInput {
7
+ readonly name: string;
8
+ readonly productionBranch: string;
9
+ readonly buildCommand: string;
10
+ readonly destinationDir: string;
11
+ readonly rootDir?: string;
12
+ readonly envVars?: Readonly<Record<string, string>>;
13
+ readonly git?: {
14
+ readonly owner: string;
15
+ readonly repoName: string;
16
+ };
17
+ }
18
+ export interface PlannedPagesAction {
19
+ readonly kind: "create" | "update" | "skip" | "manual";
20
+ readonly summary: string;
21
+ readonly details?: Record<string, unknown>;
22
+ }
23
+ export declare class CloudflareApiError extends Error {
24
+ readonly status: number;
25
+ readonly errors: unknown;
26
+ constructor(message: string, status: number, errors: unknown);
27
+ }
28
+ /**
29
+ * Cloudflare Pages REST client. Token stays in the caller process.
30
+ * Never pass this module into a browser bundle.
31
+ */
32
+ export declare function createCloudflarePagesClient(options: CloudflarePagesClientOptions): {
33
+ capabilities: {
34
+ readonly automatedWithToken: readonly ["List accounts the API token can access", "List, get, create, and patch Pages projects (name, production branch, build command, output directory, env vars)", "List and get Pages deployments (status, errors when Cloudflare returns them)", "Set non-secret project environment variables via the Pages project API"];
35
+ readonly requiresUserAuthorization: readonly ["Creating the Cloudflare API token itself (dashboard or wrangler login)", "Installing the Cloudflare GitHub App / authorizing GitHub so Pages can attach a repository", "Creating Cloudflare Access (Zero Trust) applications, identity providers, and policy groups", "Uploading runtime secrets (GitHub App token, Access AUD) as Pages secret bindings"];
36
+ readonly dashboardOrManual: readonly ["Custom domains and DNS", "Access login methods (IdP) if not already configured on the account", "Protecting static /admin HTML: Pages Functions middleware does not run on static assets — Access must cover /admin*", "Production vs preview environment split in the Cloudflare dashboard when not set via API"];
37
+ };
38
+ listAccounts(): Promise<{
39
+ id: string;
40
+ name: string;
41
+ }[]>;
42
+ listProjects(accountId: string): Promise<{
43
+ name: string;
44
+ id: string;
45
+ }[]>;
46
+ getProject: (accountId: string, name: string) => Promise<Record<string, unknown>>;
47
+ listDeployments(accountId: string, projectName: string): Promise<{
48
+ id: string;
49
+ latest_stage?: {
50
+ name?: string;
51
+ status?: string;
52
+ };
53
+ deployment_trigger?: {
54
+ metadata?: {
55
+ commit_hash?: string;
56
+ };
57
+ };
58
+ }[]>;
59
+ planProject: (accountId: string, input: PagesProjectInput) => Promise<PlannedPagesAction[]>;
60
+ applyProjectPlan(accountId: string, input: PagesProjectInput, optionsApply: {
61
+ confirm: boolean;
62
+ dryRun: boolean;
63
+ }): Promise<{
64
+ applied: boolean;
65
+ actions: PlannedPagesAction[];
66
+ }>;
67
+ };
68
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/pages/client.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,GAAG,CAAC,EAAE;QACb,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;CAM7D;AAmBD;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B;;;;;;;YAwGN,MAAM;cAAQ,MAAM;;4BAGzB,MAAM;cACC,MAAM;YAAM,MAAM;;4BApEd,MAAM,QAAQ,MAAM;+BA4E5B,MAAM,eAAe,MAAM;YAG5C,MAAM;uBACK;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE;6BAC5B;YAAE,QAAQ,CAAC,EAAE;gBAAE,WAAW,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE;;6BAzEvD,MAAM,SACV,iBAAiB,KACvB,OAAO,CAAC,kBAAkB,EAAE,CAAC;gCAkFjB,MAAM,SACV,iBAAiB,gBACV;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,GAClD,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,kBAAkB,EAAE,CAAA;KAAE,CAAC;EAkDlE"}
@@ -0,0 +1,153 @@
1
+ import { CLOUDFLARE_PAGES_CAPABILITIES } from "./capabilities.js";
2
+ const API = "https://api.cloudflare.com/client/v4";
3
+ export class CloudflareApiError extends Error {
4
+ status;
5
+ errors;
6
+ constructor(message, status, errors) {
7
+ super(message);
8
+ this.name = "CloudflareApiError";
9
+ this.status = status;
10
+ this.errors = errors;
11
+ }
12
+ }
13
+ function asApiError(message, status, errors) {
14
+ return new CloudflareApiError(message, status, errors);
15
+ }
16
+ function isNotFound(error) {
17
+ return (typeof error === "object" &&
18
+ error !== null &&
19
+ "status" in error &&
20
+ error.status === 404);
21
+ }
22
+ /**
23
+ * Cloudflare Pages REST client. Token stays in the caller process.
24
+ * Never pass this module into a browser bundle.
25
+ */
26
+ export function createCloudflarePagesClient(options) {
27
+ if (options.token.trim() === "") {
28
+ throw new Error("Cloudflare API token is required (server-side only).");
29
+ }
30
+ const fetchImpl = options.fetchImpl ?? fetch;
31
+ const apiBase = (options.apiBase ?? API).replace(/\/+$/, "");
32
+ async function request(method, path, body) {
33
+ const headers = new Headers({
34
+ Authorization: `Bearer ${options.token}`,
35
+ Accept: "application/json",
36
+ });
37
+ if (body !== undefined) {
38
+ headers.set("Content-Type", "application/json");
39
+ }
40
+ const response = await fetchImpl(`${apiBase}${path}`, {
41
+ method,
42
+ headers,
43
+ ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
44
+ });
45
+ const json = (await response.json());
46
+ if (!response.ok || json.success === false) {
47
+ throw asApiError(`Cloudflare API ${method} ${path} failed (${response.status}).`, response.status, json.errors);
48
+ }
49
+ return json.result;
50
+ }
51
+ async function getProject(accountId, name) {
52
+ return request("GET", `/accounts/${encodeURIComponent(accountId)}/pages/projects/${encodeURIComponent(name)}`);
53
+ }
54
+ async function planProject(accountId, input) {
55
+ const actions = [];
56
+ let existing = null;
57
+ try {
58
+ existing = await getProject(accountId, input.name);
59
+ }
60
+ catch (error) {
61
+ if (!isNotFound(error)) {
62
+ throw error;
63
+ }
64
+ }
65
+ if (existing === null) {
66
+ actions.push({
67
+ kind: "create",
68
+ summary: `Create Pages project "${input.name}"`,
69
+ details: {
70
+ productionBranch: input.productionBranch,
71
+ buildCommand: input.buildCommand,
72
+ destinationDir: input.destinationDir,
73
+ },
74
+ });
75
+ }
76
+ else {
77
+ actions.push({
78
+ kind: "update",
79
+ summary: `Patch Pages project "${input.name}" build settings if they differ`,
80
+ details: {
81
+ productionBranch: input.productionBranch,
82
+ buildCommand: input.buildCommand,
83
+ destinationDir: input.destinationDir,
84
+ },
85
+ });
86
+ }
87
+ if (input.git !== undefined) {
88
+ actions.push({
89
+ kind: "manual",
90
+ summary: "GitHub repository association requires the Cloudflare GitHub App to already be authorized on the account. The API cannot complete OAuth.",
91
+ details: { ...input.git },
92
+ });
93
+ }
94
+ actions.push({
95
+ kind: "manual",
96
+ summary: "Cloudflare Access for /admin* and /api* must be configured in Zero Trust. Pages Functions middleware cannot protect static admin HTML.",
97
+ });
98
+ return actions;
99
+ }
100
+ return {
101
+ capabilities: CLOUDFLARE_PAGES_CAPABILITIES,
102
+ listAccounts() {
103
+ return request("GET", "/accounts");
104
+ },
105
+ listProjects(accountId) {
106
+ return request("GET", `/accounts/${encodeURIComponent(accountId)}/pages/projects`);
107
+ },
108
+ getProject,
109
+ listDeployments(accountId, projectName) {
110
+ return request("GET", `/accounts/${encodeURIComponent(accountId)}/pages/projects/${encodeURIComponent(projectName)}/deployments`);
111
+ },
112
+ planProject,
113
+ async applyProjectPlan(accountId, input, optionsApply) {
114
+ const actions = await planProject(accountId, input);
115
+ if (optionsApply.dryRun || !optionsApply.confirm) {
116
+ return { applied: false, actions };
117
+ }
118
+ const body = {
119
+ name: input.name,
120
+ production_branch: input.productionBranch,
121
+ build_config: {
122
+ build_command: input.buildCommand,
123
+ destination_dir: input.destinationDir,
124
+ root_dir: input.rootDir ?? "",
125
+ },
126
+ ...(input.envVars !== undefined
127
+ ? {
128
+ deployment_configs: {
129
+ production: {
130
+ env_vars: Object.fromEntries(Object.entries(input.envVars).map(([key, value]) => [
131
+ key,
132
+ { type: "plain_text", value },
133
+ ])),
134
+ },
135
+ },
136
+ }
137
+ : {}),
138
+ };
139
+ try {
140
+ await getProject(accountId, input.name);
141
+ await request("PATCH", `/accounts/${encodeURIComponent(accountId)}/pages/projects/${encodeURIComponent(input.name)}`, body);
142
+ }
143
+ catch (error) {
144
+ if (!isNotFound(error)) {
145
+ throw error;
146
+ }
147
+ await request("POST", `/accounts/${encodeURIComponent(accountId)}/pages/projects`, body);
148
+ }
149
+ return { applied: true, actions };
150
+ },
151
+ };
152
+ }
153
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/pages/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function checkMutationOrigin(request: Request, allowedOrigins: readonly string[]): {
2
+ ok: true;
3
+ } | {
4
+ ok: false;
5
+ message: string;
6
+ };
7
+ //# sourceMappingURL=csrf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../src/pages/csrf.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA4B/C"}
@@ -0,0 +1,24 @@
1
+ export function checkMutationOrigin(request, allowedOrigins) {
2
+ const origin = request.headers.get("Origin");
3
+ const accessJwt = request.headers.get("Cf-Access-Jwt-Assertion");
4
+ const hasBearer = /^Bearer\s+\S+/i.test(request.headers.get("Authorization") ?? "");
5
+ if (origin !== null && origin !== "") {
6
+ if (!allowedOrigins.includes(origin)) {
7
+ return {
8
+ ok: false,
9
+ message: "Request origin is not allowlisted.",
10
+ };
11
+ }
12
+ return { ok: true };
13
+ }
14
+ // Browser Access sessions attach Cf-Access-Jwt-Assertion automatically.
15
+ // Reject cookie-style Access requests that omit Origin (CSRF).
16
+ if (accessJwt !== null && accessJwt !== "" && !hasBearer) {
17
+ return {
18
+ ok: false,
19
+ message: "Mutating Access session requests require an allowlisted Origin.",
20
+ };
21
+ }
22
+ return { ok: true };
23
+ }
24
+ //# sourceMappingURL=csrf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csrf.js","sourceRoot":"","sources":["../../src/pages/csrf.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CACjC,OAAgB,EAChB,cAAiC;IAEjC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CACrC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAC3C,CAAC;IAEF,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,oCAAoC;aAC9C,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,wEAAwE;IACxE,+DAA+D;IAC/D,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACzD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EACL,iEAAiE;SACpE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type PublishApiOptions } from "../api/handler.js";
2
+ export interface PagesSiteHandlerOptions extends PublishApiOptions {
3
+ /** Server-bound site id. Never taken from the URL. */
4
+ readonly siteId: string;
5
+ }
6
+ /**
7
+ * Pages Functions fetch adapter.
8
+ *
9
+ * Maps self-hosted routes onto the existing Worker publisher:
10
+ * - GET /api/health
11
+ * - GET /api/content/:collection
12
+ * - GET /api/content/:collection/:id
13
+ * - POST /api/publish
14
+ * - GET /api/publish/status?collection=
15
+ *
16
+ * `/v1/*` continues to work for the Worker-shaped API.
17
+ * Static `/admin` HTML is not handled here — protect it with Cloudflare Access.
18
+ */
19
+ export declare function createPagesSiteHandler(options: PagesSiteHandlerOptions): (request: Request) => Promise<Response>;
20
+ //# sourceMappingURL=site-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-handler.d.ts","sourceRoot":"","sources":["../../src/pages/site-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAmCzC"}
@@ -0,0 +1,130 @@
1
+ import { applyCors, getRequestId, jsonResponse } from "../api/http.js";
2
+ import { createPublishFetchHandler, } from "../api/handler.js";
3
+ import { checkMutationOrigin } from "./csrf.js";
4
+ /**
5
+ * Pages Functions fetch adapter.
6
+ *
7
+ * Maps self-hosted routes onto the existing Worker publisher:
8
+ * - GET /api/health
9
+ * - GET /api/content/:collection
10
+ * - GET /api/content/:collection/:id
11
+ * - POST /api/publish
12
+ * - GET /api/publish/status?collection=
13
+ *
14
+ * `/v1/*` continues to work for the Worker-shaped API.
15
+ * Static `/admin` HTML is not handled here — protect it with Cloudflare Access.
16
+ */
17
+ export function createPagesSiteHandler(options) {
18
+ const inner = createPublishFetchHandler(options);
19
+ const corsAllowedOrigins = options.corsAllowedOrigins ?? [];
20
+ return async (request) => {
21
+ const requestId = getRequestId(request);
22
+ const respond = (status, body) => applyCors(jsonResponse(status, body, { requestId }), request, corsAllowedOrigins);
23
+ const method = request.method.toUpperCase();
24
+ if (method === "POST" ||
25
+ method === "PUT" ||
26
+ method === "PATCH" ||
27
+ method === "DELETE") {
28
+ const csrf = checkMutationOrigin(request, corsAllowedOrigins);
29
+ if (!csrf.ok) {
30
+ return respond(403, {
31
+ error: { code: "CSRF", message: csrf.message },
32
+ requestId,
33
+ });
34
+ }
35
+ }
36
+ const mapped = await mapPagesRequest(request, options.siteId, respond);
37
+ if (mapped instanceof Response) {
38
+ return mapped;
39
+ }
40
+ return inner(mapped);
41
+ };
42
+ }
43
+ async function mapPagesRequest(request, siteId, respond) {
44
+ const url = new URL(request.url);
45
+ if (url.pathname === "/api/health") {
46
+ url.pathname = "/health";
47
+ return new Request(url, request);
48
+ }
49
+ const contentMatch = /^\/api\/content\/([^/]+)(?:\/([^/]+))?$/.exec(url.pathname);
50
+ if (contentMatch !== null) {
51
+ if (request.method !== "GET") {
52
+ return respond(405, {
53
+ error: { code: "METHOD_NOT_ALLOWED", message: "Use GET." },
54
+ });
55
+ }
56
+ const collection = decodeURIComponent(contentMatch[1]);
57
+ const entryId = contentMatch[2];
58
+ url.pathname = `/v1/sites/${encodeURIComponent(siteId)}/collections/${encodeURIComponent(collection)}/content`;
59
+ if (entryId !== undefined) {
60
+ url.searchParams.set("entryId", decodeURIComponent(entryId));
61
+ }
62
+ return new Request(url, request);
63
+ }
64
+ if (url.pathname === "/api/publish/status") {
65
+ if (request.method !== "GET") {
66
+ return respond(405, {
67
+ error: { code: "METHOD_NOT_ALLOWED", message: "Use GET." },
68
+ });
69
+ }
70
+ const collection = url.searchParams.get("collection");
71
+ if (collection === null || collection.trim() === "") {
72
+ return respond(400, {
73
+ error: {
74
+ code: "INVALID_QUERY",
75
+ message: 'Query parameter "collection" is required.',
76
+ },
77
+ });
78
+ }
79
+ url.pathname = `/v1/sites/${encodeURIComponent(siteId)}/collections/${encodeURIComponent(collection)}/status`;
80
+ url.searchParams.delete("collection");
81
+ return new Request(url, request);
82
+ }
83
+ if (url.pathname === "/api/publish") {
84
+ if (request.method !== "POST") {
85
+ return respond(405, {
86
+ error: { code: "METHOD_NOT_ALLOWED", message: "Use POST." },
87
+ });
88
+ }
89
+ let body;
90
+ try {
91
+ body = await request.clone().json();
92
+ }
93
+ catch {
94
+ return respond(400, {
95
+ error: {
96
+ code: "INVALID_JSON",
97
+ message: "Request body is not valid JSON.",
98
+ },
99
+ });
100
+ }
101
+ if (body === null || typeof body !== "object") {
102
+ return respond(400, {
103
+ error: { code: "INVALID_BODY", message: "JSON object required." },
104
+ });
105
+ }
106
+ const record = body;
107
+ if (typeof record.collection !== "string" ||
108
+ record.collection.trim() === "") {
109
+ return respond(400, {
110
+ error: {
111
+ code: "INVALID_BODY",
112
+ message: 'Field "collection" is required.',
113
+ },
114
+ });
115
+ }
116
+ const collection = record.collection;
117
+ const rest = { ...record };
118
+ delete rest.collection;
119
+ url.pathname = `/v1/sites/${encodeURIComponent(siteId)}/collections/${encodeURIComponent(collection)}/publish`;
120
+ const headers = new Headers(request.headers);
121
+ headers.set("content-type", "application/json");
122
+ return new Request(url, {
123
+ method: "POST",
124
+ headers,
125
+ body: JSON.stringify(rest),
126
+ });
127
+ }
128
+ return request;
129
+ }
130
+ //# sourceMappingURL=site-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-handler.js","sourceRoot":"","sources":["../../src/pages/site-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Source templates for Cloudflare Pages Functions.
3
+ * Secrets are named only — never inlined.
4
+ */
5
+ export declare const PAGES_DEV_VARS_EXAMPLE = "# Local Pages Functions secrets (gitignored as .dev.vars).\n# Copy to .dev.vars and fill values. Never commit real secrets.\n# Do not prefix secrets with PUBLIC_ or VITE_.\n\nCONTENTRAIL_ACCESS_TEAM_DOMAIN=\nCONTENTRAIL_ACCESS_AUD=\nCONTENTRAIL_SITE_ID=\nCONTENTRAIL_GIT_OWNER=\nCONTENTRAIL_GIT_REPO=\nCONTENTRAIL_GIT_BRANCH=main\nCONTENTRAIL_CONTENT_ROOT=content\nCONTENTRAIL_ADMIN_ORIGIN=http://localhost:4321\nCONTENTRAIL_GITHUB_TOKEN=\n";
6
+ export declare function pagesApiFunctionSource(collectionsImport: string): string;
7
+ export declare const PAGES_MIDDLEWARE_SOURCE = "/**\n * Rejects unauthenticated API mutations early.\n * Static /admin HTML is NOT covered \u2014 configure Cloudflare Access on /admin* as well.\n */\nexport const onRequest: PagesFunction = async (context) => {\n const url = new URL(context.request.url);\n if (\n url.pathname.startsWith(\"/api/\") &&\n url.pathname !== \"/api/health\" &&\n context.request.method !== \"OPTIONS\"\n ) {\n const access = context.request.headers.get(\"Cf-Access-Jwt-Assertion\");\n const authorization = context.request.headers.get(\"Authorization\");\n const hasBearer =\n authorization !== null && /^Bearer\\s+\\S+/i.test(authorization);\n if ((access === null || access.trim() === \"\") && !hasBearer) {\n return new Response(\n JSON.stringify({\n error: {\n code: \"MISSING_CREDENTIAL\",\n message: \"Missing Access JWT credential.\",\n },\n }),\n { status: 401, headers: { \"content-type\": \"application/json\" } },\n );\n }\n }\n return context.next();\n};\n";
8
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/pages/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,sBAAsB,6bAalC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAiExE;AAED,eAAO,MAAM,uBAAuB,miCA6BnC,CAAC"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Source templates for Cloudflare Pages Functions.
3
+ * Secrets are named only — never inlined.
4
+ */
5
+ export const PAGES_DEV_VARS_EXAMPLE = `# Local Pages Functions secrets (gitignored as .dev.vars).
6
+ # Copy to .dev.vars and fill values. Never commit real secrets.
7
+ # Do not prefix secrets with PUBLIC_ or VITE_.
8
+
9
+ CONTENTRAIL_ACCESS_TEAM_DOMAIN=
10
+ CONTENTRAIL_ACCESS_AUD=
11
+ CONTENTRAIL_SITE_ID=
12
+ CONTENTRAIL_GIT_OWNER=
13
+ CONTENTRAIL_GIT_REPO=
14
+ CONTENTRAIL_GIT_BRANCH=main
15
+ CONTENTRAIL_CONTENT_ROOT=content
16
+ CONTENTRAIL_ADMIN_ORIGIN=http://localhost:4321
17
+ CONTENTRAIL_GITHUB_TOKEN=
18
+ `;
19
+ export function pagesApiFunctionSource(collectionsImport) {
20
+ return `/**
21
+ * ContentRail Pages Functions API.
22
+ * Server-only. Secrets come from Pages bindings / .dev.vars — never PUBLIC_* or VITE_*.
23
+ */
24
+ import {
25
+ createCloudflareAccessAuthenticator,
26
+ createPagesSiteHandler,
27
+ createSiteAuthorizer,
28
+ } from "@contentrail/cloudflare";
29
+ import {
30
+ createGitHubGitDataClient,
31
+ createGitPublishProvider,
32
+ createPublisher,
33
+ } from "@contentrail/publisher";
34
+ ${collectionsImport}
35
+
36
+ interface Env {
37
+ CONTENTRAIL_ACCESS_TEAM_DOMAIN: string;
38
+ CONTENTRAIL_ACCESS_AUD: string;
39
+ CONTENTRAIL_SITE_ID: string;
40
+ CONTENTRAIL_GIT_OWNER: string;
41
+ CONTENTRAIL_GIT_REPO: string;
42
+ CONTENTRAIL_GIT_BRANCH: string;
43
+ CONTENTRAIL_CONTENT_ROOT: string;
44
+ CONTENTRAIL_ADMIN_ORIGIN: string;
45
+ CONTENTRAIL_GITHUB_TOKEN: string;
46
+ }
47
+
48
+ export const onRequest: PagesFunction<Env> = async (context) => {
49
+ const env = context.env;
50
+ const handler = createPagesSiteHandler({
51
+ siteId: env.CONTENTRAIL_SITE_ID,
52
+ authenticator: createCloudflareAccessAuthenticator({
53
+ teamDomain: env.CONTENTRAIL_ACCESS_TEAM_DOMAIN,
54
+ audience: env.CONTENTRAIL_ACCESS_AUD,
55
+ }),
56
+ authorizer: createSiteAuthorizer({
57
+ sites: {
58
+ [env.CONTENTRAIL_SITE_ID]: {
59
+ destinationRef: "git:allowlisted",
60
+ permissions: ["read", "publish", "status", "rollback", "validate"],
61
+ },
62
+ },
63
+ }),
64
+ collections: { articles },
65
+ corsAllowedOrigins: [env.CONTENTRAIL_ADMIN_ORIGIN],
66
+ getPublisher: () =>
67
+ createPublisher({
68
+ provider: createGitPublishProvider({
69
+ branch: env.CONTENTRAIL_GIT_BRANCH,
70
+ contentRoot: env.CONTENTRAIL_CONTENT_ROOT,
71
+ hasCredential: Boolean(env.CONTENTRAIL_GITHUB_TOKEN),
72
+ client: createGitHubGitDataClient({
73
+ token: env.CONTENTRAIL_GITHUB_TOKEN,
74
+ owner: env.CONTENTRAIL_GIT_OWNER,
75
+ repo: env.CONTENTRAIL_GIT_REPO,
76
+ allowedPathPrefix: env.CONTENTRAIL_CONTENT_ROOT,
77
+ }),
78
+ }),
79
+ }),
80
+ });
81
+ return handler(context.request);
82
+ };
83
+ `;
84
+ }
85
+ export const PAGES_MIDDLEWARE_SOURCE = `/**
86
+ * Rejects unauthenticated API mutations early.
87
+ * Static /admin HTML is NOT covered — configure Cloudflare Access on /admin* as well.
88
+ */
89
+ export const onRequest: PagesFunction = async (context) => {
90
+ const url = new URL(context.request.url);
91
+ if (
92
+ url.pathname.startsWith("/api/") &&
93
+ url.pathname !== "/api/health" &&
94
+ context.request.method !== "OPTIONS"
95
+ ) {
96
+ const access = context.request.headers.get("Cf-Access-Jwt-Assertion");
97
+ const authorization = context.request.headers.get("Authorization");
98
+ const hasBearer =
99
+ authorization !== null && /^Bearer\\s+\\S+/i.test(authorization);
100
+ if ((access === null || access.trim() === "") && !hasBearer) {
101
+ return new Response(
102
+ JSON.stringify({
103
+ error: {
104
+ code: "MISSING_CREDENTIAL",
105
+ message: "Missing Access JWT credential.",
106
+ },
107
+ }),
108
+ { status: 401, headers: { "content-type": "application/json" } },
109
+ );
110
+ }
111
+ }
112
+ return context.next();
113
+ };
114
+ `;
115
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/pages/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;CAarC,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,iBAAyB;IAC9D,OAAO;;;;;;;;;;;;;;EAcP,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDlB,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BtC,CAAC"}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@contentrail/cloudflare",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "private": false,
5
5
  "type": "module",
6
- "description": "Server-only Cloudflare Worker publishing API with Access auth and site authorization.",
6
+ "description": "Server-only Cloudflare Worker and Pages Functions publishing API with Access auth and Pages setup helpers.",
7
7
  "license": "MIT",
8
8
  "engines": {
9
9
  "node": ">=22"
@@ -15,6 +15,11 @@
15
15
  "import": "./dist/index.js",
16
16
  "node": "./dist/index.js"
17
17
  },
18
+ "./pages": {
19
+ "types": "./dist/pages/client.d.ts",
20
+ "import": "./dist/pages/client.js",
21
+ "node": "./dist/pages/client.js"
22
+ },
18
23
  "./package.json": "./package.json"
19
24
  },
20
25
  "files": [
@@ -24,8 +29,8 @@
24
29
  ],
25
30
  "dependencies": {
26
31
  "jose": "^6.2.14",
27
- "@contentrail/core": "0.2.0",
28
- "@contentrail/publisher": "0.2.0"
32
+ "@contentrail/core": "0.2.2",
33
+ "@contentrail/publisher": "0.2.2"
29
34
  },
30
35
  "devDependencies": {
31
36
  "@types/node": "^22.20.5",