@contentrail/cloudflare 0.1.0 → 0.2.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/README.md +11 -7
- package/dist/api/handler.d.ts +3 -0
- package/dist/api/handler.d.ts.map +1 -1
- package/dist/api/handler.js +43 -4
- package/dist/api/handler.js.map +1 -1
- package/dist/api/rate-limit.d.ts +17 -0
- package/dist/api/rate-limit.d.ts.map +1 -0
- package/dist/api/rate-limit.js +23 -0
- package/dist/api/rate-limit.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/pages/capabilities.d.ts +10 -0
- package/dist/pages/capabilities.d.ts.map +1 -0
- package/dist/pages/capabilities.js +25 -0
- package/dist/pages/capabilities.js.map +1 -0
- package/dist/pages/client.d.ts +68 -0
- package/dist/pages/client.d.ts.map +1 -0
- package/dist/pages/client.js +153 -0
- package/dist/pages/client.js.map +1 -0
- package/dist/pages/csrf.d.ts +7 -0
- package/dist/pages/csrf.d.ts.map +1 -0
- package/dist/pages/csrf.js +24 -0
- package/dist/pages/csrf.js.map +1 -0
- package/dist/pages/site-handler.d.ts +20 -0
- package/dist/pages/site-handler.d.ts.map +1 -0
- package/dist/pages/site-handler.js +130 -0
- package/dist/pages/site-handler.js.map +1 -0
- package/dist/pages/templates.d.ts +8 -0
- package/dist/pages/templates.d.ts.map +1 -0
- package/dist/pages/templates.js +115 -0
- package/dist/pages/templates.js.map +1 -0
- package/package.json +10 -5
package/README.md
CHANGED
|
@@ -11,19 +11,17 @@ Server-only Cloudflare Worker publishing API with **Cloudflare Access** authenti
|
|
|
11
11
|
|
|
12
12
|
## Install
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
### Monorepo (current)
|
|
14
|
+
### Monorepo
|
|
17
15
|
|
|
18
16
|
```sh
|
|
19
17
|
pnpm install
|
|
20
18
|
pnpm --filter @contentrail/cloudflare build
|
|
21
19
|
```
|
|
22
20
|
|
|
23
|
-
###
|
|
21
|
+
### From npm (`0.2.1`)
|
|
24
22
|
|
|
25
23
|
```sh
|
|
26
|
-
pnpm add @contentrail/core @contentrail/publisher @contentrail/cloudflare zod
|
|
24
|
+
pnpm add @contentrail/core@0.2.1 @contentrail/publisher@0.2.1 @contentrail/cloudflare@0.2.1 zod@^4.6.7
|
|
27
25
|
```
|
|
28
26
|
|
|
29
27
|
## ADR 011b summary
|
|
@@ -36,7 +34,11 @@ pnpm add @contentrail/core @contentrail/publisher @contentrail/cloudflare zod
|
|
|
36
34
|
|
|
37
35
|
| Method | Path | Auth | Purpose |
|
|
38
36
|
| ------ | ---------------------------------------------- | ------------ | ------------------------------------------------------ |
|
|
39
|
-
| `GET` | `/health`
|
|
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 |
|
|
40
42
|
| `GET` | `/v1/sites` | Yes | Sites the identity may access (no destination secrets) |
|
|
41
43
|
| `GET` | `/v1/sites/:siteId/config` | Yes | Editor-safe site metadata |
|
|
42
44
|
| `GET` | `/v1/sites/:siteId/collections/:name/content` | Yes (`read`) | Active published snapshot (`?entryId=` optional) |
|
|
@@ -95,11 +97,13 @@ export default {
|
|
|
95
97
|
};
|
|
96
98
|
```
|
|
97
99
|
|
|
100
|
+
Pages Functions: `createPagesSiteHandler` (see `docs/CLOUDFLARE_PAGES.md`). Static `/admin` is not protected by Functions middleware.
|
|
101
|
+
|
|
98
102
|
## Deferred
|
|
99
103
|
|
|
100
104
|
- File uploads (not required for Phase 4 JSON publishing)
|
|
101
105
|
- Live production deploy verification
|
|
102
|
-
-
|
|
106
|
+
- Automated Cloudflare Access application creation
|
|
103
107
|
|
|
104
108
|
## Credential rotation
|
|
105
109
|
|
package/dist/api/handler.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/api/handler.js
CHANGED
|
@@ -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 >
|
|
326
|
+
if (record.entries.length > maxPublishEntries) {
|
|
294
327
|
return {
|
|
295
328
|
ok: false,
|
|
296
329
|
code: "PAYLOAD_TOO_LARGE",
|
|
297
|
-
message: `Field "entries" exceeds ${
|
|
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",
|
package/dist/api/handler.js.map
CHANGED
|
@@ -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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAElE,MAAM,GAAG,GAAG,sCAAsC,CAAC;AA2BnD,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,MAAM,CAAS;IACf,MAAM,CAAU;IAEzB,YAAY,OAAe,EAAE,MAAc,EAAE,MAAe;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,SAAS,UAAU,CACjB,OAAe,EACf,MAAc,EACd,MAAe;IAEf,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,QAAQ,IAAI,KAAK;QAChB,KAA4B,CAAC,MAAM,KAAK,GAAG,CAC7C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAqC;IAErC,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC7C,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE7D,KAAK,UAAU,OAAO,CACpB,MAAc,EACd,IAAY,EACZ,IAAc;QAEd,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;YAC1B,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;YACxC,MAAM,EAAE,kBAAkB;SAC3B,CAAC,CAAC;QACH,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,OAAO,GAAG,IAAI,EAAE,EAAE;YACpD,MAAM;YACN,OAAO;YACP,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAIlC,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC3C,MAAM,UAAU,CACd,kBAAkB,MAAM,IAAI,IAAI,YAAY,QAAQ,CAAC,MAAM,IAAI,EAC/D,QAAQ,CAAC,MAAM,EACf,IAAI,CAAC,MAAM,CACZ,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,MAAW,CAAC;IAC1B,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,SAAiB,EAAE,IAAY;QACvD,OAAO,OAAO,CACZ,KAAK,EACL,aAAa,kBAAkB,CAAC,SAAS,CAAC,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,EAAE,CACxF,CAAC;IACJ,CAAC;IAED,KAAK,UAAU,WAAW,CACxB,SAAiB,EACjB,KAAwB;QAExB,MAAM,OAAO,GAAyB,EAAE,CAAC;QACzC,IAAI,QAAQ,GAAmC,IAAI,CAAC;QACpD,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,yBAAyB,KAAK,CAAC,IAAI,GAAG;gBAC/C,OAAO,EAAE;oBACP,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;oBACxC,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,cAAc,EAAE,KAAK,CAAC,cAAc;iBACrC;aACF,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,wBAAwB,KAAK,CAAC,IAAI,iCAAiC;gBAC5E,OAAO,EAAE;oBACP,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;oBACxC,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,cAAc,EAAE,KAAK,CAAC,cAAc;iBACrC;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,QAAQ;gBACd,OAAO,EACL,0IAA0I;gBAC5I,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE;aAC1B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EACL,wIAAwI;SAC3I,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO;QACL,YAAY,EAAE,6BAA6B;QAE3C,YAAY;YACV,OAAO,OAAO,CAAsC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC1E,CAAC;QAED,YAAY,CAAC,SAAiB;YAC5B,OAAO,OAAO,CACZ,KAAK,EACL,aAAa,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,CAC5D,CAAC;QACJ,CAAC;QAED,UAAU;QAEV,eAAe,CAAC,SAAiB,EAAE,WAAmB;YACpD,OAAO,OAAO,CAOZ,KAAK,EACL,aAAa,kBAAkB,CAAC,SAAS,CAAC,mBAAmB,kBAAkB,CAAC,WAAW,CAAC,cAAc,CAC3G,CAAC;QACJ,CAAC;QAED,WAAW;QAEX,KAAK,CAAC,gBAAgB,CACpB,SAAiB,EACjB,KAAwB,EACxB,YAAmD;YAEnD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;gBACjD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YACrC,CAAC;YAED,MAAM,IAAI,GAAG;gBACX,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,iBAAiB,EAAE,KAAK,CAAC,gBAAgB;gBACzC,YAAY,EAAE;oBACZ,aAAa,EAAE,KAAK,CAAC,YAAY;oBACjC,eAAe,EAAE,KAAK,CAAC,cAAc;oBACrC,QAAQ,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;iBAC9B;gBACD,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS;oBAC7B,CAAC,CAAC;wBACE,kBAAkB,EAAE;4BAClB,UAAU,EAAE;gCACV,QAAQ,EAAE,MAAM,CAAC,WAAW,CAC1B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;oCAClD,GAAG;oCACH,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE;iCAC9B,CAAC,CACH;6BACF;yBACF;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACxC,MAAM,OAAO,CACX,OAAO,EACP,aAAa,kBAAkB,CAAC,SAAS,CAAC,mBAAmB,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAC7F,IAAI,CACL,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvB,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,OAAO,CACX,MAAM,EACN,aAAa,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,EAC3D,IAAI,CACL,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -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.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
|
-
"description": "Server-only Cloudflare Worker publishing API with Access auth and
|
|
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,13 +29,13 @@
|
|
|
24
29
|
],
|
|
25
30
|
"dependencies": {
|
|
26
31
|
"jose": "^6.2.14",
|
|
27
|
-
"@contentrail/core": "0.1
|
|
28
|
-
"@contentrail/publisher": "0.1
|
|
32
|
+
"@contentrail/core": "0.2.1",
|
|
33
|
+
"@contentrail/publisher": "0.2.1"
|
|
29
34
|
},
|
|
30
35
|
"devDependencies": {
|
|
31
36
|
"@types/node": "^22.20.5",
|
|
32
37
|
"typescript": "5.9.3",
|
|
33
|
-
"zod": "
|
|
38
|
+
"zod": "4.6.7"
|
|
34
39
|
},
|
|
35
40
|
"repository": {
|
|
36
41
|
"type": "git",
|