@we8/cms 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -14
- package/dist/env.d.ts +5 -14
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js.map +1 -1
- package/dist/index.d.ts +17 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +53 -25
- package/dist/index.js.map +1 -1
- package/dist/keys/middleware.d.ts +2 -2
- package/dist/keys/middleware.d.ts.map +1 -1
- package/dist/keys/middleware.js +4 -2
- package/dist/keys/middleware.js.map +1 -1
- package/dist/lib/admin-auth.d.ts +95 -0
- package/dist/lib/admin-auth.d.ts.map +1 -0
- package/dist/lib/admin-auth.js +58 -0
- package/dist/lib/admin-auth.js.map +1 -0
- package/dist/middleware/auth.d.ts +21 -13
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +30 -24
- package/dist/middleware/auth.js.map +1 -1
- package/dist/modules/openapi/spec.d.ts.map +1 -1
- package/dist/modules/openapi/spec.js +26 -0
- package/dist/modules/openapi/spec.js.map +1 -1
- package/package.json +5 -5
- package/migrations/0007_auth.sql +0 -81
package/README.md
CHANGED
|
@@ -1,12 +1,28 @@
|
|
|
1
1
|
# @we8/cms
|
|
2
2
|
|
|
3
3
|
`@we8/cms` is the core headless CMS of the we8 package: a Hono application
|
|
4
|
-
carrying the content, forms, analytics, media, and SEO modules
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
carrying the content, forms, analytics, media, and SEO modules behind the `/v1`
|
|
5
|
+
public API that every frontend consumes. It is single-site by construction (one
|
|
6
|
+
site, one worker, one database, one bucket), it validates public pk and sk API
|
|
7
|
+
keys itself, and it owns the AEO backend that is its headline feature: llms.txt
|
|
8
|
+
publishing, answer-oriented content fields, AEO check endpoints, and crawler
|
|
9
|
+
attribution.
|
|
10
|
+
|
|
11
|
+
**Auth is not built in.** The CMS knows what an owner may do and what a member
|
|
12
|
+
may do; who somebody is comes from a provider your worker registers in one
|
|
13
|
+
line. [`@we8/auth`](https://www.npmjs.com/package/@we8/auth) is the embedded
|
|
14
|
+
one (Better Auth over your own D1, email and password), and it is what
|
|
15
|
+
`npm create we8` composes. Register nothing and every `/v1/admin/*` request is
|
|
16
|
+
refused: an unconfigured deploy is a locked site, never an open one.
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
import cms, { registerAdminAuth } from '@we8/cms';
|
|
20
|
+
import { embeddedAdminAuth } from '@we8/auth';
|
|
21
|
+
|
|
22
|
+
registerAdminAuth(embeddedAdminAuth);
|
|
23
|
+
|
|
24
|
+
export default cms;
|
|
25
|
+
```
|
|
10
26
|
|
|
11
27
|
## Requirements
|
|
12
28
|
|
|
@@ -14,10 +30,12 @@ answer-oriented content fields, AEO check endpoints, and crawler attribution.
|
|
|
14
30
|
(what `npm create we8` sets up), or with your own Worker config.
|
|
15
31
|
- Bindings: a D1 database as `DB`, an R2 bucket as `MEDIA`, and optionally
|
|
16
32
|
static assets as `ASSETS` for the admin portal.
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
|
|
33
|
+
- An admin auth provider, registered by your worker. `@we8/auth` is the
|
|
34
|
+
embedded one and requires the secret `BETTER_AUTH_SECRET`.
|
|
35
|
+
- Secrets: `TURNSTILE_SECRET` is optional, and only enforced for forms that
|
|
36
|
+
enable Turnstile.
|
|
37
|
+
- Runtime dependencies, bundled at deploy: `hono` and `zod`. Node 20 or newer
|
|
38
|
+
for the tooling around it.
|
|
21
39
|
## Local development
|
|
22
40
|
|
|
23
41
|
```sh
|
|
@@ -37,6 +55,14 @@ curl -H "X-We8-Key: pk_live_000000000000000000000000000000000000000000000000" \
|
|
|
37
55
|
http://localhost:8787/v1/posts
|
|
38
56
|
```
|
|
39
57
|
|
|
58
|
+
`npm run dev` runs the composed worker in `dev/index.ts`, which registers the
|
|
59
|
+
embedded provider, so local development behaves like a scaffolded project.
|
|
60
|
+
`npm run db:migrate` applies both migration directories: this package's, and
|
|
61
|
+
the one `@we8/auth` ships.
|
|
62
|
+
|
|
63
|
+
`GET /v1/auth/mode` says which mode a worker is in (`embedded`, `external`, or
|
|
64
|
+
`none`) and whether the first account can still be created.
|
|
65
|
+
|
|
40
66
|
Create the owner account by signing up once; the endpoint closes as soon as an
|
|
41
67
|
account exists.
|
|
42
68
|
|
|
@@ -64,13 +90,48 @@ no bundle behind the binding.
|
|
|
64
90
|
|
|
65
91
|
## Bindings
|
|
66
92
|
|
|
67
|
-
`DB` (D1) and `MEDIA` (R2), plus the vars `SITE_URL` and `CMS_VERSION
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
93
|
+
`DB` (D1) and `MEDIA` (R2), plus the vars `SITE_URL` and `CMS_VERSION`.
|
|
94
|
+
`TURNSTILE_SECRET`, `EMAIL_MODE`, and `EMAIL_FROM` are optional, and `ASSETS`
|
|
95
|
+
is the optional static-asset binding that carries the admin portal. An auth
|
|
96
|
+
provider adds its own: `@we8/auth` requires `BETTER_AUTH_SECRET` and takes an
|
|
97
|
+
optional `AUTH_URL`.
|
|
98
|
+
|
|
99
|
+
## Upgrading from 0.1
|
|
100
|
+
|
|
101
|
+
0.2 makes auth optional, and that is the whole breaking change. The core no
|
|
102
|
+
longer embeds Better Auth; a provider is composed in `src/index.ts` instead.
|
|
103
|
+
|
|
104
|
+
1. Update every `@we8/*` dependency to `^0.2.0`. To keep exactly the 0.1
|
|
105
|
+
behavior, add `@we8/auth` and register it in your worker entry:
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
import cms, { registerAdminAuth, registerEmailSender } from '@we8/cms';
|
|
109
|
+
import { embeddedAdminAuth } from '@we8/auth';
|
|
110
|
+
import { cloudflareEmailSender } from '@we8/cloudflare';
|
|
111
|
+
|
|
112
|
+
registerAdminAuth(embeddedAdminAuth);
|
|
113
|
+
registerEmailSender(cloudflareEmailSender);
|
|
114
|
+
|
|
115
|
+
export default cms;
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
2. Run `npm run db:migrate` (locally, then `db:migrate:remote`). The auth
|
|
119
|
+
tables now belong to `@we8/auth`, whose migrations are written to be safe
|
|
120
|
+
on a database that already carries them: existing users, sessions, and
|
|
121
|
+
content are untouched.
|
|
122
|
+
3. Run `npx we8-cloudflare doctor`. It knows the auth modes and names
|
|
123
|
+
anything still missing.
|
|
124
|
+
4. Optionally, refresh the project's agent skill: `npx we8-cloudflare skill`.
|
|
125
|
+
|
|
126
|
+
A worker that registers no provider refuses every `/v1/admin/*` request with
|
|
127
|
+
a 403 explaining the two ways forward. To run without `@we8/auth`, compose
|
|
128
|
+
`cloudflareAccessAdminAuth()` or `perimeterAdminAuth({ acknowledged: true })`
|
|
129
|
+
from `@we8/cloudflare` instead; their README documents both.
|
|
71
130
|
|
|
72
131
|
## More
|
|
73
132
|
|
|
133
|
+
- [`@we8/auth`](https://www.npmjs.com/package/@we8/auth): the embedded admin
|
|
134
|
+
sign-in, as its own package.
|
|
74
135
|
- [`create-we8`](https://www.npmjs.com/package/create-we8): the fastest path
|
|
75
136
|
from nothing to a working site; the README it writes into your project
|
|
76
137
|
carries every step.
|
package/dist/env.d.ts
CHANGED
|
@@ -3,9 +3,13 @@ import { type SiteSettings, type SiteSettingsUpdateInput } from './shared/index.
|
|
|
3
3
|
* Everything this worker consumes from its environment. One site, one
|
|
4
4
|
* database, one bucket: there is no tenant id, no dispatch namespace, and no
|
|
5
5
|
* control plane, because there is nothing above this worker to belong to.
|
|
6
|
+
*
|
|
7
|
+
* Nothing about signing in appears here. An admin auth provider names its own
|
|
8
|
+
* requirements and narrows this environment itself; `@we8/auth` adds
|
|
9
|
+
* `BETTER_AUTH_SECRET` and `AUTH_URL` to the list a deployment must set.
|
|
6
10
|
*/
|
|
7
11
|
export interface Bindings {
|
|
8
|
-
/** The site's D1 database. Content, forms, analytics,
|
|
12
|
+
/** The site's D1 database. Content, forms, analytics, and keys all live here. */
|
|
9
13
|
DB: D1Database;
|
|
10
14
|
/** The site's R2 bucket, holding uploaded media bytes. */
|
|
11
15
|
MEDIA: R2Bucket;
|
|
@@ -19,19 +23,6 @@ export interface Bindings {
|
|
|
19
23
|
SITE_URL: string;
|
|
20
24
|
/** The version string reported by /v1/health. Set from the package version at deploy time. */
|
|
21
25
|
CMS_VERSION: string;
|
|
22
|
-
/**
|
|
23
|
-
* The secret Better Auth signs sessions with. A deployment MUST set this;
|
|
24
|
-
* `wrangler secret put BETTER_AUTH_SECRET` in production, `.dev.vars`
|
|
25
|
-
* locally. Sign-in is refused when it is missing rather than falling back to
|
|
26
|
-
* a default, because a predictable session secret is a forged session.
|
|
27
|
-
*/
|
|
28
|
-
BETTER_AUTH_SECRET?: string;
|
|
29
|
-
/**
|
|
30
|
-
* The origin Better Auth builds its own URLs from and trusts as an origin.
|
|
31
|
-
* Defaults to SITE_URL, which is correct when the CMS and the site share an
|
|
32
|
-
* origin; set it when the admin lives somewhere else.
|
|
33
|
-
*/
|
|
34
|
-
AUTH_URL?: string;
|
|
35
26
|
/** Optional. Only enforced for forms with settings.turnstileEnabled. */
|
|
36
27
|
TURNSTILE_SECRET?: string;
|
|
37
28
|
/**
|
package/dist/env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,KAAK,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAExG
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,KAAK,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAExG;;;;;;;;GAQG;AACH,MAAM,WAAW,QAAQ;IACvB,iFAAiF;IACjF,EAAE,EAAE,UAAU,CAAC;IACf,0DAA0D;IAC1D,KAAK,EAAE,QAAQ,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,8FAA8F;IAC9F,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiBD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiBjG;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,uBAAuB,EAC9B,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,YAAY,CAAC,CAcvB;AAED,mEAAmE;AACnE,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
|
package/dist/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAmD,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAmD,MAAM,mBAAmB,CAAC;AA0CxG,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAErC,sFAAsF;AACtF,IAAI,KAAK,GAA8B,IAAI,CAAC;AAO5C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAc,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IACxE,IAAI,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE;SACzB,OAAO,CAAC,sCAAsC,CAAC;SAC/C,GAAG,EAAkB,CAAC;IAEzB,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5C,KAAK,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,GAAG,qBAAqB,EAAE,CAAC;IAC1D,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAc,EACd,KAA8B,EAC9B,MAAc,IAAI,CAAC,GAAG,EAAE;IAExB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAElE,MAAM,EAAE,CAAC,KAAK,CACZ,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAC1C,EAAE;SACC,OAAO,CAAC,mEAAmE,CAAC;SAC5E,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACpC,CACF,CAAC;IAEF,KAAK,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,qBAAqB,EAAE,CAAC;IAClE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,0BAA0B;IACxC,KAAK,GAAG,IAAI,CAAC;AACf,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,7 +8,23 @@ import { type RequestIdVariables } from './middleware/request-id.js';
|
|
|
8
8
|
* without reaching into the package's internals. A scaffolded project calls
|
|
9
9
|
* `registerEmailSender(cloudflareEmailSender)` at module scope and is done.
|
|
10
10
|
*/
|
|
11
|
-
export { registerEmailSender, type EmailMessage, type EmailSender, type EmailSenderFactory, } from './lib/email.js';
|
|
11
|
+
export { registerEmailSender, resolveEmailSender, sendBestEffort, type EmailMessage, type EmailSender, type EmailSenderFactory, } from './lib/email.js';
|
|
12
|
+
/**
|
|
13
|
+
* The admin auth seam, and everything a provider needs to speak this worker's
|
|
14
|
+
* language: the registration itself, the gate the core mounts on
|
|
15
|
+
* `/v1/admin/*`, the owner check, the error envelope, per-route CORS, and the
|
|
16
|
+
* input validator. A provider that claims routes of its own reuses these
|
|
17
|
+
* rather than restating them, so there is one admin policy and one wire
|
|
18
|
+
* contract however a site signs in.
|
|
19
|
+
*/
|
|
20
|
+
export { ADMIN_AUTH_NOT_CONFIGURED, EMBEDDED_PROVIDER_NAME, adminAuthMode, adminAuthProvider, normalizeRole, registerAdminAuth, type AdminAuthMode, type AdminAuthProvider, type AdminIdentity, type FirstRunState, } from './lib/admin-auth.js';
|
|
21
|
+
export { adminAuth, requireOwner, type AuthContext, type AuthVariables } from './middleware/auth.js';
|
|
22
|
+
export { corsMiddleware, type CorsKind } from './middleware/cors.js';
|
|
23
|
+
export { HttpError, errorBoundary, notFoundHandler } from './lib/errors.js';
|
|
24
|
+
export { buildPasswordResetEmail } from './lib/notify.js';
|
|
25
|
+
export { parseOrThrow } from './lib/validate.js';
|
|
26
|
+
export { ok, err, USER_ROLES, type ErrorCode, type UserRole } from './shared/index.js';
|
|
27
|
+
export type { Bindings } from './env.js';
|
|
12
28
|
type Variables = RequestIdVariables & AuthVariables & KeyVariables;
|
|
13
29
|
export declare const app: Hono<{
|
|
14
30
|
Bindings: Bindings;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAItD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrE,OAAO,EAAa,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAqBhF;;;;GAIG;AACH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAC;AAExB;;;;;;;GAOG;AACH,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrG,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACvF,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,KAAK,SAAS,GAAG,kBAAkB,GAAG,aAAa,GAAG,YAAY,CAAC;AAKnE,eAAO,MAAM,GAAG;cAAwB,QAAQ;eAAa,SAAS;yCAAK,CAAC;;;;;AA4J5E,wBASsC"}
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
2
|
import { createMiddleware } from 'hono/factory';
|
|
3
3
|
import { ok } from './shared/index.js';
|
|
4
|
-
import {
|
|
5
|
-
import { usersAdminRoutes } from './auth/routes.admin.js';
|
|
4
|
+
import { adminAuthMode, adminAuthProvider } from './lib/admin-auth.js';
|
|
6
5
|
import { getSettings } from './env.js';
|
|
7
6
|
import { HttpError, errorBoundary, notFoundHandler } from './lib/errors.js';
|
|
8
7
|
import { runRetentionCleanup } from './lib/retention.js';
|
|
9
8
|
import { keysAdminRoutes } from './keys/routes.admin.js';
|
|
10
9
|
import { publicApiAuth } from './keys/middleware.js';
|
|
11
|
-
import {
|
|
10
|
+
import { adminAuth } from './middleware/auth.js';
|
|
12
11
|
import { corsMiddleware } from './middleware/cors.js';
|
|
13
12
|
import { moduleGate } from './middleware/module-gate.js';
|
|
14
13
|
import { requestId } from './middleware/request-id.js';
|
|
@@ -36,7 +35,22 @@ import { siteDocumentsPublicRoutes } from './modules/site-documents/routes.publi
|
|
|
36
35
|
* without reaching into the package's internals. A scaffolded project calls
|
|
37
36
|
* `registerEmailSender(cloudflareEmailSender)` at module scope and is done.
|
|
38
37
|
*/
|
|
39
|
-
export { registerEmailSender, } from './lib/email.js';
|
|
38
|
+
export { registerEmailSender, resolveEmailSender, sendBestEffort, } from './lib/email.js';
|
|
39
|
+
/**
|
|
40
|
+
* The admin auth seam, and everything a provider needs to speak this worker's
|
|
41
|
+
* language: the registration itself, the gate the core mounts on
|
|
42
|
+
* `/v1/admin/*`, the owner check, the error envelope, per-route CORS, and the
|
|
43
|
+
* input validator. A provider that claims routes of its own reuses these
|
|
44
|
+
* rather than restating them, so there is one admin policy and one wire
|
|
45
|
+
* contract however a site signs in.
|
|
46
|
+
*/
|
|
47
|
+
export { ADMIN_AUTH_NOT_CONFIGURED, EMBEDDED_PROVIDER_NAME, adminAuthMode, adminAuthProvider, normalizeRole, registerAdminAuth, } from './lib/admin-auth.js';
|
|
48
|
+
export { adminAuth, requireOwner } from './middleware/auth.js';
|
|
49
|
+
export { corsMiddleware } from './middleware/cors.js';
|
|
50
|
+
export { HttpError, errorBoundary, notFoundHandler } from './lib/errors.js';
|
|
51
|
+
export { buildPasswordResetEmail } from './lib/notify.js';
|
|
52
|
+
export { parseOrThrow } from './lib/validate.js';
|
|
53
|
+
export { ok, err, USER_ROLES } from './shared/index.js';
|
|
40
54
|
// Named export as well as default, so tests can call app.request(...) directly:
|
|
41
55
|
// the default export is the plain {fetch, scheduled} object Cloudflare's module
|
|
42
56
|
// Worker format expects, which has no .request() of its own.
|
|
@@ -51,37 +65,33 @@ app.onError(errorBoundary);
|
|
|
51
65
|
app.notFound(async (c) => (await serveSpaShell(c.req.raw, c.env)) ?? notFoundHandler(c));
|
|
52
66
|
app.use('*', requestId);
|
|
53
67
|
// ---------------------------------------------------------------------------
|
|
54
|
-
//
|
|
68
|
+
// Provider-owned routes
|
|
55
69
|
// ---------------------------------------------------------------------------
|
|
56
70
|
/**
|
|
57
|
-
*
|
|
58
|
-
* the owner. After that this closes and further accounts are created by the
|
|
59
|
-
* owner through /v1/admin/users.
|
|
71
|
+
* First refusal for the registered admin auth provider.
|
|
60
72
|
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
73
|
+
* A sign-in endpoint cannot sit behind a sign-in check, so this runs ahead of
|
|
74
|
+
* every gate below it. The embedded provider in `@we8/auth` answers here for
|
|
75
|
+
* `/api/auth/*` and for the site-user routes under `/v1/admin/users`;
|
|
76
|
+
* returning null passes the request back untouched, which is what every
|
|
77
|
+
* provider does for every path it does not own, and what happens on every
|
|
78
|
+
* request when no provider is registered at all.
|
|
65
79
|
*/
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
80
|
+
const providerRoutes = createMiddleware(async (c, next) => {
|
|
81
|
+
const provider = adminAuthProvider();
|
|
82
|
+
if (provider?.handleRoute) {
|
|
83
|
+
const response = await provider.handleRoute(c.req.raw, c.env);
|
|
84
|
+
if (response)
|
|
85
|
+
return response;
|
|
69
86
|
}
|
|
70
87
|
await next();
|
|
71
88
|
});
|
|
72
|
-
app.use(
|
|
73
|
-
app.use(`${AUTH_BASE_PATH}/sign-up/*`, bootstrapGate);
|
|
74
|
-
app.all(`${AUTH_BASE_PATH}/*`, async (c) => {
|
|
75
|
-
if (!c.env.BETTER_AUTH_SECRET) {
|
|
76
|
-
throw new HttpError('internal', 'BETTER_AUTH_SECRET is not configured');
|
|
77
|
-
}
|
|
78
|
-
return createAuth(c.env).handler(c.req.raw);
|
|
79
|
-
});
|
|
89
|
+
app.use('*', providerRoutes);
|
|
80
90
|
// ---------------------------------------------------------------------------
|
|
81
91
|
// Gates
|
|
82
92
|
// ---------------------------------------------------------------------------
|
|
83
93
|
app.use('/v1/*', publicApiAuth);
|
|
84
|
-
app.use('/v1/admin/*', corsMiddleware('admin'),
|
|
94
|
+
app.use('/v1/admin/*', corsMiddleware('admin'), adminAuth);
|
|
85
95
|
// ---------------------------------------------------------------------------
|
|
86
96
|
// Meta
|
|
87
97
|
// ---------------------------------------------------------------------------
|
|
@@ -90,6 +100,25 @@ app.get('/v1/health', async (c) => {
|
|
|
90
100
|
const settings = await getSettings(c.env.DB);
|
|
91
101
|
return c.json(ok({ cmsVersion: c.env.CMS_VERSION, modules: settings.modules }));
|
|
92
102
|
});
|
|
103
|
+
/**
|
|
104
|
+
* How this site signs its admin in, so a portal never has to guess.
|
|
105
|
+
*
|
|
106
|
+
* Keyless and unauthenticated by necessity: the screen that asks this question
|
|
107
|
+
* is the one nobody has signed in to yet. It reveals only what a sign-in page
|
|
108
|
+
* displays anyway, which is why it can be answered before a key exists.
|
|
109
|
+
*
|
|
110
|
+
* `mode` is `embedded` when @we8/auth is composed, `external` for any other
|
|
111
|
+
* provider, and `none` when nothing is registered, in which case every
|
|
112
|
+
* /v1/admin request is refused. `signUp` is `open` only while the provider
|
|
113
|
+
* still offers a first-account flow, which is what makes the portal's
|
|
114
|
+
* first-run screen a read rather than a probe against the sign-up route.
|
|
115
|
+
*/
|
|
116
|
+
app.use('/v1/auth/mode', corsMiddleware('publicRead'));
|
|
117
|
+
app.get('/v1/auth/mode', async (c) => {
|
|
118
|
+
const provider = adminAuthProvider();
|
|
119
|
+
const signUp = provider?.firstRun ? await provider.firstRun(c.env) : 'closed';
|
|
120
|
+
return c.json(ok({ mode: adminAuthMode(), provider: provider?.name ?? null, signUp }));
|
|
121
|
+
});
|
|
93
122
|
// Self-describing API: keyless, so any developer can read the contract before
|
|
94
123
|
// they have a key. Not module-gated either; it documents whatever is enabled
|
|
95
124
|
// and is cheap and static.
|
|
@@ -156,7 +185,6 @@ app.route('/v1/documents', siteDocumentsPublicRoutes);
|
|
|
156
185
|
app.route('/v1/admin/documents', siteDocumentsAdminRoutes);
|
|
157
186
|
app.route('/v1/admin/aeo', aeoAdminRoutes);
|
|
158
187
|
app.route('/v1/admin/keys', keysAdminRoutes);
|
|
159
|
-
app.route('/v1/admin/users', usersAdminRoutes);
|
|
160
188
|
export default {
|
|
161
189
|
fetch: app.fetch,
|
|
162
190
|
// The daily retention sweep. The schedule is configured in wrangler.jsonc's
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,8 +26,8 @@ export declare const publicKeyAuth: import("hono").MiddlewareHandler<{
|
|
|
26
26
|
* Each one is keyless because its reader cannot hold a key. A crawler fetching
|
|
27
27
|
* the sitemap has no credential to present; an image in published HTML cannot
|
|
28
28
|
* carry a rotating secret without every historical page breaking on the next
|
|
29
|
-
* rotation; health
|
|
30
|
-
* anyone has a key at all.
|
|
29
|
+
* rotation; health, the OpenAPI document, and the auth mode exist to be read
|
|
30
|
+
* before anyone has a key at all, by a portal nobody has signed in to yet.
|
|
31
31
|
*
|
|
32
32
|
* Treat the media exemption as irreversible: once keyless media URLs are in
|
|
33
33
|
* published content, re-gating them breaks that content permanently.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/keys/middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAI1C,MAAM,MAAM,YAAY,GAAG;IACzB,kFAAkF;IAClF,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa;cAAgC,QAAQ;eAAa,YAAY;wBAe1F,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/keys/middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAI1C,MAAM,MAAM,YAAY,GAAG;IACzB,kFAAkF;IAClF,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa;cAAgC,QAAQ;eAAa,YAAY;wBAe1F,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQ9E;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa;cAAgC,QAAQ;eAAa,YAAY;wBAa1F,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB;cAAgC,QAAQ;eAAa,YAAY;wBAO7F,CAAC"}
|
package/dist/keys/middleware.js
CHANGED
|
@@ -32,8 +32,8 @@ export const publicKeyAuth = createMiddleware(async (c, next) => {
|
|
|
32
32
|
* Each one is keyless because its reader cannot hold a key. A crawler fetching
|
|
33
33
|
* the sitemap has no credential to present; an image in published HTML cannot
|
|
34
34
|
* carry a rotating secret without every historical page breaking on the next
|
|
35
|
-
* rotation; health
|
|
36
|
-
* anyone has a key at all.
|
|
35
|
+
* rotation; health, the OpenAPI document, and the auth mode exist to be read
|
|
36
|
+
* before anyone has a key at all, by a portal nobody has signed in to yet.
|
|
37
37
|
*
|
|
38
38
|
* Treat the media exemption as irreversible: once keyless media URLs are in
|
|
39
39
|
* published content, re-gating them breaks that content permanently.
|
|
@@ -46,6 +46,8 @@ export function isKeylessPublicRoute(method, pathname) {
|
|
|
46
46
|
return true;
|
|
47
47
|
if (pathname === '/v1/openapi.json')
|
|
48
48
|
return true;
|
|
49
|
+
if (pathname === '/v1/auth/mode')
|
|
50
|
+
return true;
|
|
49
51
|
if (pathname === '/v1/sitemap.xml')
|
|
50
52
|
return true;
|
|
51
53
|
return pathname.startsWith('/v1/media/');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/keys/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,SAAS,EAAmB,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAOjE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAgB,CAC3C,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IAChB,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,SAAS,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;IAChF,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,cAAc,EAAE,4BAA4B,CAAC,CAAC;IACpE,CAAC;IAED,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,EAAE,CAAC;AACf,CAAC,CACF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,QAAgB;IACnE,MAAM,MAAM,GAAG,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC;IACrD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,QAAQ,KAAK,kBAAkB;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,QAAQ,KAAK,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAChD,OAAO,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAgB,CAC3C,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IAChB,wEAAwE;IACxE,wEAAwE;IACxE,sEAAsE;IACtE,yEAAyE;IACzE,sDAAsD;IACtD,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC7C,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IACpD,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IAChE,OAAO,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC,CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAC9C,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IAChB,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE,qCAAqC,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,IAAI,EAAE,CAAC;AACf,CAAC,CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/keys/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,SAAS,EAAmB,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAOjE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAgB,CAC3C,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IAChB,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,SAAS,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;IAChF,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,cAAc,EAAE,4BAA4B,CAAC,CAAC;IACpE,CAAC;IAED,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,EAAE,CAAC;AACf,CAAC,CACF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,QAAgB;IACnE,MAAM,MAAM,GAAG,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC;IACrD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,QAAQ,KAAK,kBAAkB;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,QAAQ,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,QAAQ,KAAK,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAChD,OAAO,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAgB,CAC3C,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IAChB,wEAAwE;IACxE,wEAAwE;IACxE,sEAAsE;IACtE,yEAAyE;IACzE,sDAAsD;IACtD,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC7C,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IACpD,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IAChE,OAAO,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC,CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAC9C,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IAChB,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE,qCAAqC,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,IAAI,EAAE,CAAC;AACf,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The admin auth seam.
|
|
3
|
+
*
|
|
4
|
+
* The core of this CMS does not know how anybody signs in. It knows what an
|
|
5
|
+
* `owner` may do and what a `member` may do, and it knows that no request
|
|
6
|
+
* reaches `/v1/admin/*` without an identity; WHO somebody is comes from a
|
|
7
|
+
* provider a composed worker registers here, exactly the way `registerEmailSender`
|
|
8
|
+
* supplies a transport.
|
|
9
|
+
*
|
|
10
|
+
* Three shapes of deployment come out of one interface:
|
|
11
|
+
*
|
|
12
|
+
* - **embedded**: `@we8/auth` runs Better Auth over the site's own D1 and
|
|
13
|
+
* claims `/api/auth/*`. This is the default a scaffolded project gets and
|
|
14
|
+
* behaves as the CMS always has.
|
|
15
|
+
* - **external**: a provider that reads an identity someone else established,
|
|
16
|
+
* for instance a Cloudflare Access assertion at the perimeter.
|
|
17
|
+
* - **none**: nothing registered. Every admin request is refused. An
|
|
18
|
+
* unconfigured deploy is a locked site, never an open one.
|
|
19
|
+
*/
|
|
20
|
+
import type { UserRole } from '../shared/index.js';
|
|
21
|
+
/**
|
|
22
|
+
* Who the provider says this request is. `email` is optional because not every
|
|
23
|
+
* identity source has one; it is what publish history is attributed to, and
|
|
24
|
+
* falls back to nothing rather than to a fabricated address.
|
|
25
|
+
*/
|
|
26
|
+
export interface AdminIdentity {
|
|
27
|
+
userId: string;
|
|
28
|
+
role: UserRole;
|
|
29
|
+
email?: string | null;
|
|
30
|
+
}
|
|
31
|
+
/** Whether a provider still offers a way to create the very first account. */
|
|
32
|
+
export type FirstRunState = 'open' | 'closed';
|
|
33
|
+
export interface AdminAuthProvider {
|
|
34
|
+
/**
|
|
35
|
+
* The provider's name, which is also what `GET /v1/auth/mode` reports a mode
|
|
36
|
+
* from: `embedded` is the shipped Better Auth provider, anything else is an
|
|
37
|
+
* external identity source.
|
|
38
|
+
*/
|
|
39
|
+
name: string;
|
|
40
|
+
/**
|
|
41
|
+
* Resolves the request to an identity, or null when it carries none. Throw an
|
|
42
|
+
* `HttpError` to say something more specific than "not signed in", for
|
|
43
|
+
* instance that the provider itself is misconfigured.
|
|
44
|
+
*/
|
|
45
|
+
resolve(request: Request, env: unknown): Promise<AdminIdentity | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Lets the provider own routes of its own: the embedded provider serves
|
|
48
|
+
* `/api/auth/*` and the site-user management under `/v1/admin/users` this
|
|
49
|
+
* way. Return null to decline the request, which passes it back to the core
|
|
50
|
+
* untouched.
|
|
51
|
+
*
|
|
52
|
+
* This runs BEFORE the core's own gates, because a sign-in endpoint cannot
|
|
53
|
+
* sit behind a sign-in check. A provider that claims a path under
|
|
54
|
+
* `/v1/admin/` therefore takes on the admin gate for it; the shipped
|
|
55
|
+
* embedded provider mounts the core's own `adminAuth` and `requireOwner` on
|
|
56
|
+
* its routes rather than inventing a second policy.
|
|
57
|
+
*/
|
|
58
|
+
handleRoute?(request: Request, env: unknown): Promise<Response | null>;
|
|
59
|
+
/**
|
|
60
|
+
* Whether a first-account flow is available right now. The portal reads this
|
|
61
|
+
* through `/v1/auth/mode` so its first-run screen never has to probe a
|
|
62
|
+
* sign-up route to find out.
|
|
63
|
+
*/
|
|
64
|
+
firstRun?(env: unknown): Promise<FirstRunState>;
|
|
65
|
+
}
|
|
66
|
+
/** What `GET /v1/auth/mode` reports. */
|
|
67
|
+
export type AdminAuthMode = 'embedded' | 'external' | 'none';
|
|
68
|
+
/** The name the shipped `@we8/auth` provider registers under. */
|
|
69
|
+
export declare const EMBEDDED_PROVIDER_NAME = "embedded";
|
|
70
|
+
/**
|
|
71
|
+
* The refusal a request to `/v1/admin/*` gets when nothing is registered.
|
|
72
|
+
*
|
|
73
|
+
* Exported as a constant so a test, a doctor, or an operator's grep can match
|
|
74
|
+
* it exactly, and so the two ways forward are stated in the one place they are
|
|
75
|
+
* true.
|
|
76
|
+
*/
|
|
77
|
+
export declare const ADMIN_AUTH_NOT_CONFIGURED = "admin auth is not configured: install @we8/auth and call registerAdminAuth(embeddedAdminAuth), or register a provider for the perimeter this admin sits behind";
|
|
78
|
+
/**
|
|
79
|
+
* Registers the admin auth provider. A composed worker calls this once at
|
|
80
|
+
* module scope, before any request is served; passing `null` unregisters,
|
|
81
|
+
* which is what a test of the refusal wants.
|
|
82
|
+
*/
|
|
83
|
+
export declare function registerAdminAuth(provider: AdminAuthProvider | null): void;
|
|
84
|
+
/** The registered provider, or null when the site is running unconfigured. */
|
|
85
|
+
export declare function adminAuthProvider(): AdminAuthProvider | null;
|
|
86
|
+
/** The mode the registered provider puts this site in. */
|
|
87
|
+
export declare function adminAuthMode(): AdminAuthMode;
|
|
88
|
+
/**
|
|
89
|
+
* Normalizes whatever a provider hands back into one of the two roles.
|
|
90
|
+
* Anything unrecognized, absent, or empty reads as `member`: least privilege,
|
|
91
|
+
* so a row written by hand, a claim from a misconfigured identity provider, or
|
|
92
|
+
* a leftover from a botched migration cannot grant ownership.
|
|
93
|
+
*/
|
|
94
|
+
export declare function normalizeRole(role: unknown): UserRole;
|
|
95
|
+
//# sourceMappingURL=admin-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-auth.d.ts","sourceRoot":"","sources":["../../src/lib/admin-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,8EAA8E;AAC9E,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACvE;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACvE;;;;OAIG;IACH,QAAQ,CAAC,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACjD;AAED,wCAAwC;AACxC,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAE7D,iEAAiE;AACjE,eAAO,MAAM,sBAAsB,aAAa,CAAC;AAEjD;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,mKAC4H,CAAC;AAInK;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAE1E;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,IAAI,iBAAiB,GAAG,IAAI,CAE5D;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,IAAI,aAAa,CAG7C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAErD"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The admin auth seam.
|
|
3
|
+
*
|
|
4
|
+
* The core of this CMS does not know how anybody signs in. It knows what an
|
|
5
|
+
* `owner` may do and what a `member` may do, and it knows that no request
|
|
6
|
+
* reaches `/v1/admin/*` without an identity; WHO somebody is comes from a
|
|
7
|
+
* provider a composed worker registers here, exactly the way `registerEmailSender`
|
|
8
|
+
* supplies a transport.
|
|
9
|
+
*
|
|
10
|
+
* Three shapes of deployment come out of one interface:
|
|
11
|
+
*
|
|
12
|
+
* - **embedded**: `@we8/auth` runs Better Auth over the site's own D1 and
|
|
13
|
+
* claims `/api/auth/*`. This is the default a scaffolded project gets and
|
|
14
|
+
* behaves as the CMS always has.
|
|
15
|
+
* - **external**: a provider that reads an identity someone else established,
|
|
16
|
+
* for instance a Cloudflare Access assertion at the perimeter.
|
|
17
|
+
* - **none**: nothing registered. Every admin request is refused. An
|
|
18
|
+
* unconfigured deploy is a locked site, never an open one.
|
|
19
|
+
*/
|
|
20
|
+
/** The name the shipped `@we8/auth` provider registers under. */
|
|
21
|
+
export const EMBEDDED_PROVIDER_NAME = 'embedded';
|
|
22
|
+
/**
|
|
23
|
+
* The refusal a request to `/v1/admin/*` gets when nothing is registered.
|
|
24
|
+
*
|
|
25
|
+
* Exported as a constant so a test, a doctor, or an operator's grep can match
|
|
26
|
+
* it exactly, and so the two ways forward are stated in the one place they are
|
|
27
|
+
* true.
|
|
28
|
+
*/
|
|
29
|
+
export const ADMIN_AUTH_NOT_CONFIGURED = 'admin auth is not configured: install @we8/auth and call registerAdminAuth(embeddedAdminAuth), or register a provider for the perimeter this admin sits behind';
|
|
30
|
+
let registered = null;
|
|
31
|
+
/**
|
|
32
|
+
* Registers the admin auth provider. A composed worker calls this once at
|
|
33
|
+
* module scope, before any request is served; passing `null` unregisters,
|
|
34
|
+
* which is what a test of the refusal wants.
|
|
35
|
+
*/
|
|
36
|
+
export function registerAdminAuth(provider) {
|
|
37
|
+
registered = provider;
|
|
38
|
+
}
|
|
39
|
+
/** The registered provider, or null when the site is running unconfigured. */
|
|
40
|
+
export function adminAuthProvider() {
|
|
41
|
+
return registered;
|
|
42
|
+
}
|
|
43
|
+
/** The mode the registered provider puts this site in. */
|
|
44
|
+
export function adminAuthMode() {
|
|
45
|
+
if (!registered)
|
|
46
|
+
return 'none';
|
|
47
|
+
return registered.name === EMBEDDED_PROVIDER_NAME ? 'embedded' : 'external';
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Normalizes whatever a provider hands back into one of the two roles.
|
|
51
|
+
* Anything unrecognized, absent, or empty reads as `member`: least privilege,
|
|
52
|
+
* so a row written by hand, a claim from a misconfigured identity provider, or
|
|
53
|
+
* a leftover from a botched migration cannot grant ownership.
|
|
54
|
+
*/
|
|
55
|
+
export function normalizeRole(role) {
|
|
56
|
+
return role === 'owner' ? 'owner' : 'member';
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=admin-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-auth.js","sourceRoot":"","sources":["../../src/lib/admin-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAuDH,iEAAiE;AACjE,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GACpC,gKAAgK,CAAC;AAEnK,IAAI,UAAU,GAA6B,IAAI,CAAC;AAEhD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAkC;IAClE,UAAU,GAAG,QAAQ,CAAC;AACxB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB;IAC/B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC;IAC/B,OAAO,UAAU,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;AAC9E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/C,CAAC"}
|
|
@@ -12,23 +12,31 @@ export type AuthVariables = {
|
|
|
12
12
|
auth: AuthContext;
|
|
13
13
|
};
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* The gate on /v1/admin/*.
|
|
16
16
|
*
|
|
17
17
|
* This is the seam where managed we8 and this package genuinely differ. There,
|
|
18
18
|
* a control-plane proxy signs an internal HMAC and the engine trusts the
|
|
19
|
-
* identity headers riding along with it. Here there is no proxy
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* exactly the place the engine's header trust used to
|
|
19
|
+
* identity headers riding along with it. Here there is no proxy, and no
|
|
20
|
+
* assumption about how anybody signed in either: the registered admin auth
|
|
21
|
+
* provider resolves the request to an identity, and the user and role it
|
|
22
|
+
* yields are injected into exactly the place the engine's header trust used to
|
|
23
|
+
* fill. What that identity may then do is decided here and nowhere else.
|
|
23
24
|
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
25
|
+
* With no provider registered the request is refused outright. That is the
|
|
26
|
+
* secure default and the reason the refusal is a 403 rather than a 401: a 401
|
|
27
|
+
* invites a credential, and there is no credential that would help. Nothing
|
|
28
|
+
* about this site's configuration admits anyone to the admin API, so the
|
|
29
|
+
* honest answer is that the door does not open, plus the two ways to give it a
|
|
30
|
+
* lock (see ADMIN_AUTH_NOT_CONFIGURED).
|
|
31
|
+
*
|
|
32
|
+
* A public API key never reaches the admin surface, whatever the mode. A
|
|
33
|
+
* publishable key travels in browser code, so if presenting one could reach
|
|
34
|
+
* /v1/admin/*, every visitor to the site could read the submission inbox and
|
|
35
|
+
* rewrite content. Any request carrying a key on an admin route is rejected
|
|
36
|
+
* before the provider is even consulted, so the boundary is explicit rather
|
|
37
|
+
* than incidental.
|
|
30
38
|
*/
|
|
31
|
-
export declare const
|
|
39
|
+
export declare const adminAuth: import("hono").MiddlewareHandler<{
|
|
32
40
|
Bindings: Bindings;
|
|
33
41
|
Variables: AuthVariables;
|
|
34
42
|
}, string, {}, Response>;
|
|
@@ -39,7 +47,7 @@ export declare const sessionAuth: import("hono").MiddlewareHandler<{
|
|
|
39
47
|
* people's personal data. Everything else in the admin API is open to a
|
|
40
48
|
* member, because a member is an editor.
|
|
41
49
|
*
|
|
42
|
-
* Only mounted behind
|
|
50
|
+
* Only mounted behind adminAuth, so the request is already authenticated;
|
|
43
51
|
* this narrows which authenticated user.
|
|
44
52
|
*/
|
|
45
53
|
export declare function requireOwner(c: Context, next: () => Promise<void>): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAQ1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,MAAM,WAAW,GAAG;IACxB,kFAAkF;IAClF,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iFAAiF;IACjF,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,SAAS;cAAgC,QAAQ;eAAa,aAAa;wBAwBvF,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAMjF"}
|
package/dist/middleware/auth.js
CHANGED
|
@@ -1,42 +1,48 @@
|
|
|
1
1
|
import { createMiddleware } from 'hono/factory';
|
|
2
2
|
import { HttpError } from '../lib/errors.js';
|
|
3
|
-
import {
|
|
3
|
+
import { ADMIN_AUTH_NOT_CONFIGURED, adminAuthProvider, normalizeRole, } from '../lib/admin-auth.js';
|
|
4
4
|
import { extractApiKey } from '../keys/service.js';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* The gate on /v1/admin/*.
|
|
7
7
|
*
|
|
8
8
|
* This is the seam where managed we8 and this package genuinely differ. There,
|
|
9
9
|
* a control-plane proxy signs an internal HMAC and the engine trusts the
|
|
10
|
-
* identity headers riding along with it. Here there is no proxy
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* exactly the place the engine's header trust used to
|
|
10
|
+
* identity headers riding along with it. Here there is no proxy, and no
|
|
11
|
+
* assumption about how anybody signed in either: the registered admin auth
|
|
12
|
+
* provider resolves the request to an identity, and the user and role it
|
|
13
|
+
* yields are injected into exactly the place the engine's header trust used to
|
|
14
|
+
* fill. What that identity may then do is decided here and nowhere else.
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
16
|
+
* With no provider registered the request is refused outright. That is the
|
|
17
|
+
* secure default and the reason the refusal is a 403 rather than a 401: a 401
|
|
18
|
+
* invites a credential, and there is no credential that would help. Nothing
|
|
19
|
+
* about this site's configuration admits anyone to the admin API, so the
|
|
20
|
+
* honest answer is that the door does not open, plus the two ways to give it a
|
|
21
|
+
* lock (see ADMIN_AUTH_NOT_CONFIGURED).
|
|
22
|
+
*
|
|
23
|
+
* A public API key never reaches the admin surface, whatever the mode. A
|
|
24
|
+
* publishable key travels in browser code, so if presenting one could reach
|
|
25
|
+
* /v1/admin/*, every visitor to the site could read the submission inbox and
|
|
26
|
+
* rewrite content. Any request carrying a key on an admin route is rejected
|
|
27
|
+
* before the provider is even consulted, so the boundary is explicit rather
|
|
28
|
+
* than incidental.
|
|
21
29
|
*/
|
|
22
|
-
export const
|
|
30
|
+
export const adminAuth = createMiddleware(async (c, next) => {
|
|
23
31
|
if (extractApiKey(c) !== undefined) {
|
|
24
32
|
throw new HttpError('forbidden', 'API keys cannot access admin routes');
|
|
25
33
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
throw new HttpError('unauthorized', 'authentication is not configured');
|
|
34
|
+
const provider = adminAuthProvider();
|
|
35
|
+
if (!provider) {
|
|
36
|
+
throw new HttpError('forbidden', ADMIN_AUTH_NOT_CONFIGURED);
|
|
30
37
|
}
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
if (!session) {
|
|
38
|
+
const identity = await provider.resolve(c.req.raw, c.env);
|
|
39
|
+
if (!identity) {
|
|
34
40
|
throw new HttpError('unauthorized', 'sign in required');
|
|
35
41
|
}
|
|
36
42
|
c.set('auth', {
|
|
37
|
-
userId:
|
|
38
|
-
user:
|
|
39
|
-
role: normalizeRole(
|
|
43
|
+
userId: identity.userId,
|
|
44
|
+
user: identity.email ?? null,
|
|
45
|
+
role: normalizeRole(identity.role),
|
|
40
46
|
});
|
|
41
47
|
await next();
|
|
42
48
|
});
|
|
@@ -47,7 +53,7 @@ export const sessionAuth = createMiddleware(async (c, next) => {
|
|
|
47
53
|
* people's personal data. Everything else in the admin API is open to a
|
|
48
54
|
* member, because a member is an editor.
|
|
49
55
|
*
|
|
50
|
-
* Only mounted behind
|
|
56
|
+
* Only mounted behind adminAuth, so the request is already authenticated;
|
|
51
57
|
* this narrows which authenticated user.
|
|
52
58
|
*/
|
|
53
59
|
export function requireOwner(c, next) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAenD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CACvC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IAChB,IAAI,aAAa,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE,qCAAqC,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAC1D,CAAC;IAED,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE;QACZ,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,IAAI,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI;QAC5B,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;KACnC,CAAC,CAAC;IAEH,MAAM,IAAI,EAAE,CAAC;AACf,CAAC,CACF,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,CAAU,EAAE,IAAyB;IAChE,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAA4B,CAAC;IACtD,IAAI,IAAI,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,IAAI,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../../src/modules/openapi/spec.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../../src/modules/openapi/spec.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgezE"}
|
|
@@ -339,6 +339,32 @@ export function buildOpenApiSpec(siteUrl) {
|
|
|
339
339
|
},
|
|
340
340
|
},
|
|
341
341
|
},
|
|
342
|
+
'/v1/auth/mode': {
|
|
343
|
+
get: {
|
|
344
|
+
tags: ['meta'],
|
|
345
|
+
summary: 'How this site signs its admin in (keyless)',
|
|
346
|
+
description: 'Keyless because the screen that asks is the one nobody has signed in to ' +
|
|
347
|
+
'yet. `mode` is "embedded" when @we8/auth is composed, "external" for any ' +
|
|
348
|
+
'other identity provider, and "none" when nothing is registered, in which ' +
|
|
349
|
+
'case every /v1/admin request is refused. `signUp` is "open" only while a ' +
|
|
350
|
+
'first-account flow is still available.',
|
|
351
|
+
security: [],
|
|
352
|
+
responses: {
|
|
353
|
+
'200': {
|
|
354
|
+
description: 'The mode.',
|
|
355
|
+
content: {
|
|
356
|
+
'application/json': {
|
|
357
|
+
schema: okEnvelope({
|
|
358
|
+
mode: { type: 'string', enum: ['embedded', 'external', 'none'] },
|
|
359
|
+
provider: { type: ['string', 'null'] },
|
|
360
|
+
signUp: { type: 'string', enum: ['open', 'closed'] },
|
|
361
|
+
}),
|
|
362
|
+
},
|
|
363
|
+
},
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
},
|
|
367
|
+
},
|
|
342
368
|
'/v1/openapi.json': {
|
|
343
369
|
get: {
|
|
344
370
|
tags: ['meta'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../src/modules/openapi/spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEtE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,UAAU,GAAG,CAAC,SAAkC,EAAE,WAAqB,EAAE,EAAE,EAAE,CAAC,CAAC;QACnF,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC;QAC7B,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE;KACpE,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE;YACJ,KAAK,EAAE,gBAAgB;YACvB,OAAO,EAAE,OAAO;YAChB,WAAW,EACT,yEAAyE;gBACzE,yEAAyE;gBACzE,qEAAqE;gBACrE,0EAA0E;SAC7E;QACD,yEAAyE;QACzE,iDAAiD;QACjD,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;QACpD,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;QAClC,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,6BAA6B,EAAE;YAC/D,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,6BAA6B,EAAE;YAC5D,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE;YAClD,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,2BAA2B,EAAE;YAC/D,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,0BAA0B,EAAE;YAC1D,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,wBAAwB,EAAE;YACtD,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE;SACtD;QACD,KAAK,EAAE;YACL,WAAW,EAAE;gBACX,GAAG,EAAE;oBACH,IAAI,EAAE,CAAC,SAAS,CAAC;oBACjB,OAAO,EAAE,sBAAsB;oBAC/B,UAAU,EAAE;wBACV,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE;wBAClF;4BACE,IAAI,EAAE,UAAU;4BAChB,EAAE,EAAE,OAAO;4BACX,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;yBAClE;wBACD,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE;wBAChF,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;wBAC7D,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;qBACzD;oBACD,SAAS,EAAE;wBACT,KAAK,EAAE;4BACL,WAAW,EAAE,4BAA4B;4BACzC,OAAO,EAAE;gCACP,kBAAkB,EAAE;oCAClB,MAAM,EAAE,UAAU,CAAC;wCACjB,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE,EAAE;wCACtE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;wCACzB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;wCAC7B,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;qCAC3B,CAAC;iCACH;6BACF;yBACF;qBACF;iBACF;aACF;YACD,kBAAkB,EAAE;gBAClB,GAAG,EAAE;oBACH,IAAI,EAAE,CAAC,SAAS,CAAC;oBACjB,OAAO,EAAE,8BAA8B;oBACvC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;oBACtF,SAAS,EAAE;wBACT,KAAK,EAAE;4BACL,WAAW,EAAE,kDAAkD;4BAC/D,OAAO,EAAE;gCACP,kBAAkB,EAAE;oCAClB,MAAM,EAAE,UAAU,CAAC;wCACjB,IAAI,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE;wCAC3C,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE,EAAE;wCAC1E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE;qCACvD,CAAC;iCACH;6BACF;yBACF;wBACD,KAAK,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE;qBACnD;iBACF;aACF;YACD,uBAAuB,EAAE;gBACvB,IAAI,EAAE;oBACJ,IAAI,EAAE,CAAC,SAAS,CAAC;oBACjB,OAAO,EAAE,iCAAiC;oBAC1C,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;oBACtF,WAAW,EAAE,EAAE,IAAI,EAAE,sCAAsC,EAAE;oBAC7D,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE,EAAE;iBAC5D;aACF;YACD,uBAAuB,EAAE;gBACvB,IAAI,EAAE;oBACJ,IAAI,EAAE,CAAC,SAAS,CAAC;oBACjB,OAAO,EAAE,iCAAiC;oBAC1C,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;oBACtF,WAAW,EAAE,EAAE,IAAI,EAAE,sCAAsC,EAAE;oBAC7D,SAAS,EAAE;wBACT,KAAK,EAAE;4BACL,WAAW,EAAE,qBAAqB;4BAClC,OAAO,EAAE;gCACP,kBAAkB,EAAE;oCAClB,MAAM,EAAE,UAAU,CAAC;wCACjB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;wCAC1B,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;qCAC/B,CAAC;iCACH;6BACF;yBACF;qBACF;iBACF;aACF;YACD,oBAAoB,EAAE;gBACpB,GAAG,EAAE;oBACH,IAAI,EAAE,CAAC,SAAS,CAAC;oBACjB,OAAO,EAAE,uBAAuB;oBAChC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;oBACtF,SAAS,EAAE;wBACT,KAAK,EAAE;4BACL,WAAW,EAAE,aAAa;4BAC1B,OAAO,EAAE;gCACP,kBAAkB,EAAE;oCAClB,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE,EAAE,CAAC;iCACxE;6BACF;yBACF;wBACD,KAAK,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE;qBACnD;iBACF;aACF;YACD,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,CAAC,MAAM,CAAC;oBACd,OAAO,EAAE,wCAAwC;oBACjD,SAAS,EAAE;wBACT,KAAK,EAAE;4BACL,WAAW,EAAE,kBAAkB;4BAC/B,OAAO,EAAE;gCACP,kBAAkB,EAAE;oCAClB,MAAM,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,CAAC;iCAC7E;6BACF;yBACF;qBACF;iBACF;aACF;YACD,sBAAsB,EAAE;gBACtB,GAAG,EAAE;oBACH,IAAI,EAAE,CAAC,MAAM,CAAC;oBACd,OAAO,EAAE,6CAA6C;oBACtD,WAAW,EACT,0EAA0E;wBAC1E,6DAA6D;oBAC/D,UAAU,EAAE;wBACV;4BACE,IAAI,EAAE,MAAM;4BACZ,EAAE,EAAE,MAAM;4BACV,QAAQ,EAAE,IAAI;4BACd,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE;yBAC5D;qBACF;oBACD,SAAS,EAAE;wBACT,KAAK,EAAE;4BACL,WAAW,EAAE,eAAe;4BAC5B,OAAO,EAAE;gCACP,kBAAkB,EAAE;oCAClB,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,CAAC;iCACjF;6BACF;yBACF;wBACD,KAAK,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE;qBACnD;iBACF;aACF;YACD,iCAAiC,EAAE;gBACjC,IAAI,EAAE;oBACJ,IAAI,EAAE,CAAC,OAAO,CAAC;oBACf,OAAO,EAAE,eAAe;oBACxB,WAAW,EACT,wEAAwE;wBACxE,uEAAuE;oBACzE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;oBACzF,WAAW,EAAE;wBACX,QAAQ,EAAE,IAAI;wBACd,OAAO,EAAE;4BACP,kBAAkB,EAAE;gCAClB,MAAM,EAAE;oCACN,IAAI,EAAE,QAAQ;oCACd,UAAU,EAAE;wCACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;wCAC1C,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wCACxB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wCAC3B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wCAC9B,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qCACnC;oCACD,oBAAoB,EAAE,IAAI;iCAC3B;6BACF;yBACF;qBACF;oBACD,SAAS,EAAE;wBACT,KAAK,EAAE;4BACL,WAAW,EAAE,gEAAgE;4BAC7E,OAAO,EAAE;gCACP,kBAAkB,EAAE;oCAClB,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;iCAC/D;6BACF;yBACF;qBACF;iBACF;aACF;YACD,kBAAkB,EAAE;gBAClB,IAAI,EAAE;oBACJ,IAAI,EAAE,CAAC,WAAW,CAAC;oBACnB,OAAO,EAAE,gCAAgC;oBACzC,WAAW,EAAE;wBACX,QAAQ,EAAE,IAAI;wBACd,OAAO,EAAE;4BACP,kBAAkB,EAAE;gCAClB,MAAM,EAAE;oCACN,IAAI,EAAE,QAAQ;oCACd,QAAQ,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;oCACnC,UAAU,EAAE;wCACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wCAC5B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wCAC7B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qCAC7B;iCACF;6BACF;yBACF;qBACF;oBACD,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE,EAAE;iBAC5D;aACF;YACD,oBAAoB,EAAE;gBACpB,IAAI,EAAE;oBACJ,IAAI,EAAE,CAAC,WAAW,CAAC;oBACnB,OAAO,EAAE,kCAAkC;oBAC3C,WAAW,EAAE;wBACX,QAAQ,EAAE,IAAI;wBACd,OAAO,EAAE;4BACP,kBAAkB,EAAE;gCAClB,MAAM,EAAE;oCACN,IAAI,EAAE,QAAQ;oCACd,QAAQ,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,CAAC;oCAC/D,UAAU,EAAE;wCACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wCAC7B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,iBAAiB,CAAC,EAAE;wCAC1D,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;wCAC9B,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;qCACjC;iCACF;6BACF;yBACF;qBACF;oBACD,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE,EAAE;iBAC5D;aACF;YACD,iBAAiB,EAAE;gBACjB,GAAG,EAAE;oBACH,IAAI,EAAE,CAAC,OAAO,CAAC;oBACf,OAAO,EAAE,0CAA0C;oBACnD,QAAQ,EAAE,EAAE;oBACZ,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;oBACrF,SAAS,EAAE;wBACT,KAAK,EAAE;4BACL,WAAW,EAAE,oBAAoB;4BACjC,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;yBACrE;wBACD,KAAK,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE;qBACnD;iBACF;aACF;YACD,iBAAiB,EAAE;gBACjB,GAAG,EAAE;oBACH,IAAI,EAAE,CAAC,MAAM,CAAC;oBACd,gEAAgE;oBAChE,yCAAyC;oBACzC,OAAO,EAAE,uBAAuB;oBAChC,QAAQ,EAAE,EAAE;oBACZ,SAAS,EAAE;wBACT,KAAK,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,EAAE;qBAC3E;iBACF;aACF;YACD,WAAW,EAAE;gBACX,GAAG,EAAE;oBACH,IAAI,EAAE,CAAC,KAAK,CAAC;oBACb,OAAO,EAAE,2CAA2C;oBACpD,WAAW,EACT,wEAAwE;wBACxE,qEAAqE;wBACrE,wEAAwE;wBACxE,2EAA2E;oBAC7E,QAAQ,EAAE,EAAE;oBACZ,SAAS,EAAE;wBACT,KAAK,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE;wBACtE,KAAK,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE;qBACnD;iBACF;aACF;YACD,YAAY,EAAE;gBACZ,GAAG,EAAE;oBACH,IAAI,EAAE,CAAC,MAAM,CAAC;oBACd,OAAO,EAAE,0CAA0C;oBACnD,QAAQ,EAAE,EAAE;oBACZ,SAAS,EAAE;wBACT,KAAK,EAAE;4BACL,WAAW,EAAE,SAAS;4BACtB,OAAO,EAAE;gCACP,kBAAkB,EAAE;oCAClB,MAAM,EAAE,UAAU,CAAC;wCACjB,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wCAC9B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;qCACvE,CAAC;iCACH;6BACF;yBACF;qBACF;iBACF;aACF;YACD,kBAAkB,EAAE;gBAClB,GAAG,EAAE;oBACH,IAAI,EAAE,CAAC,MAAM,CAAC;oBACd,OAAO,EAAE,iCAAiC;oBAC1C,QAAQ,EAAE,EAAE;oBACZ,SAAS,EAAE;wBACT,KAAK,EAAE;4BACL,WAAW,EAAE,WAAW;4BACxB,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;yBAChE;qBACF;iBACF;aACF;SACF;QACD,UAAU,EAAE;YACV,eAAe,EAAE;gBACf,cAAc,EAAE;oBACd,IAAI,EAAE,QAAQ;oBACd,EAAE,EAAE,QAAQ;oBACZ,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,2DAA2D;iBACzE;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,QAAQ;oBAChB,WAAW,EACT,kEAAkE;wBAClE,sEAAsE;wBACtE,qDAAqD;iBACxD;aACF;YACD,aAAa,EAAE;gBACb,SAAS,EAAE;oBACT,QAAQ,EAAE,IAAI;oBACd,OAAO,EAAE;wBACP,kBAAkB,EAAE;4BAClB,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,QAAQ,EAAE,CAAC,WAAW,CAAC;gCACvB,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;6BAC9C;yBACF;qBACF;iBACF;aACF;YACD,SAAS,EAAE;gBACT,EAAE,EAAE;oBACF,WAAW,EAAE,UAAU;oBACvB,OAAO,EAAE;wBACP,kBAAkB,EAAE;4BAClB,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,QAAQ,EAAE,CAAC,IAAI,CAAC;gCAChB,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE;6BACtD;yBACF;qBACF;iBACF;gBACD,QAAQ,EAAE;oBACR,WAAW,EAAE,YAAY;oBACzB,OAAO,EAAE;wBACP,kBAAkB,EAAE;4BAClB,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC;gCACjC,UAAU,EAAE;oCACV,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE;oCACtC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oCACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iCACzB;6BACF;yBACF;qBACF;iBACF;aACF;YACD,OAAO,EAAE;gBACP,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gDAAgD;oBAC7D,UAAU,EAAE;wBACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACtB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE;wBAC/C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBAC3C,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE;wBAC3D,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBACjD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBAC5C,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;wBAClD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBAC3C,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBACjD,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBAC9C,aAAa,EAAE;4BACb,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,IAAI;4BACd,WAAW,EACT,oEAAoE;yBACvE;wBACD,eAAe,EAAE;4BACf,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,IAAI;4BACd,WAAW,EAAE,gEAAgE;yBAC9E;wBACD,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;wBACvD,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;wBAC9B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBAC/C,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;wBAC9B,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;qBAC/B;iBACF;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACtB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACxB,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBAC7C,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBAC7C,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBACvC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE;qBAChF;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../src/modules/openapi/spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@we8/cms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"homepage": "https://we8.io",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"description": "The core we8 headless CMS: content, forms, analytics, media, and SEO modules behind a single-site /v1 API with
|
|
7
|
+
"description": "The core we8 headless CMS: content, forms, analytics, media, and SEO modules behind a single-site /v1 API, with a pluggable admin auth seam.",
|
|
8
8
|
"keywords": [
|
|
9
9
|
"we8",
|
|
10
10
|
"cms",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"types": "./dist/index.d.ts",
|
|
20
20
|
"exports": {
|
|
21
21
|
".": {
|
|
22
|
+
"@we8/source": "./src/index.ts",
|
|
22
23
|
"types": "./dist/index.d.ts",
|
|
23
24
|
"default": "./dist/index.js"
|
|
24
25
|
}
|
|
@@ -36,7 +37,7 @@
|
|
|
36
37
|
"typecheck": "tsc -p tsconfig.json",
|
|
37
38
|
"test": "vitest run",
|
|
38
39
|
"dev": "wrangler dev",
|
|
39
|
-
"db:migrate": "wrangler d1 migrations apply DB --local",
|
|
40
|
+
"db:migrate": "wrangler d1 migrations apply DB --local && wrangler d1 migrations apply DB --local --config wrangler.auth-migrations.jsonc",
|
|
40
41
|
"db:seed": "wrangler d1 execute DB --local --file=./seed/local.sql",
|
|
41
42
|
"admin:bundle": "node scripts/bundle-admin.mjs",
|
|
42
43
|
"prepack": "npm run build"
|
|
@@ -45,14 +46,13 @@
|
|
|
45
46
|
"access": "public"
|
|
46
47
|
},
|
|
47
48
|
"dependencies": {
|
|
48
|
-
"better-auth": "^1.7.1",
|
|
49
|
-
"drizzle-orm": "^0.45.2",
|
|
50
49
|
"hono": "^4.12.27",
|
|
51
50
|
"zod": "^3.24.1"
|
|
52
51
|
},
|
|
53
52
|
"devDependencies": {
|
|
54
53
|
"@cloudflare/vitest-pool-workers": "^0.18.0",
|
|
55
54
|
"@cloudflare/workers-types": "^5.20260705.1",
|
|
55
|
+
"@we8/auth": "*",
|
|
56
56
|
"vitest": "^4.1.9",
|
|
57
57
|
"wrangler": "^4.107.0"
|
|
58
58
|
},
|
package/migrations/0007_auth.sql
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
-- 0007: the embedded Better Auth schema, as a plain migration under this
|
|
2
|
-
-- package's own numbering rather than ORM migration tooling. Additive only.
|
|
3
|
-
--
|
|
4
|
-
-- Canonical source of the field list: Better Auth's own model definitions for
|
|
5
|
-
-- the four core tables. No auth plugin is enabled, so there are no plugin
|
|
6
|
-
-- columns here and nothing unused: `role` is this package's own additional
|
|
7
|
-
-- field, carrying 'owner' or 'member'. A Drizzle mirror of these exact columns
|
|
8
|
-
-- lives at src/auth/schema.ts so the Drizzle adapter can build typed queries;
|
|
9
|
-
-- the two are kept in lockstep by hand. To regenerate a reference schema after
|
|
10
|
-
-- a Better Auth version bump, run the CLI against the auth config:
|
|
11
|
-
-- npx @better-auth/cli@latest generate --config src/auth/auth.ts
|
|
12
|
-
--
|
|
13
|
-
-- Column-type decisions: the Drizzle adapter passes native Date and boolean
|
|
14
|
-
-- values straight through, so date fields are INTEGER unix-second timestamps
|
|
15
|
-
-- (Drizzle `mode: 'timestamp'`) and boolean fields are INTEGER 0/1 (Drizzle
|
|
16
|
-
-- `mode: 'boolean'`). Ids are Better Auth's own generated TEXT strings. Column
|
|
17
|
-
-- names are Better Auth's default camelCase, so they intentionally differ from
|
|
18
|
-
-- the snake_case convention of this package's own tables: these four are owned
|
|
19
|
-
-- end to end by the library.
|
|
20
|
-
|
|
21
|
-
CREATE TABLE user (
|
|
22
|
-
id TEXT PRIMARY KEY,
|
|
23
|
-
name TEXT NOT NULL,
|
|
24
|
-
email TEXT NOT NULL UNIQUE,
|
|
25
|
-
emailVerified INTEGER NOT NULL DEFAULT 0,
|
|
26
|
-
image TEXT,
|
|
27
|
-
createdAt INTEGER NOT NULL,
|
|
28
|
-
updatedAt INTEGER NOT NULL,
|
|
29
|
-
-- The site role: 'owner' for the first user created, 'member' for everyone
|
|
30
|
-
-- after. Assigned server-side on user creation and never writable through
|
|
31
|
-
-- the auth API, so a member cannot promote themselves.
|
|
32
|
-
role TEXT
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
CREATE TABLE session (
|
|
36
|
-
id TEXT PRIMARY KEY,
|
|
37
|
-
expiresAt INTEGER NOT NULL,
|
|
38
|
-
token TEXT NOT NULL UNIQUE,
|
|
39
|
-
createdAt INTEGER NOT NULL,
|
|
40
|
-
updatedAt INTEGER NOT NULL,
|
|
41
|
-
ipAddress TEXT,
|
|
42
|
-
userAgent TEXT,
|
|
43
|
-
userId TEXT NOT NULL REFERENCES user (id) ON DELETE CASCADE
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
CREATE INDEX idx_session_user ON session (userId);
|
|
47
|
-
|
|
48
|
-
CREATE TABLE account (
|
|
49
|
-
id TEXT PRIMARY KEY,
|
|
50
|
-
-- Who vouches for this identity. For an email and password login it is the
|
|
51
|
-
-- local credential issuer; for a future social login it is that provider.
|
|
52
|
-
-- (issuer, accountId) is the identity's unique key.
|
|
53
|
-
issuer TEXT NOT NULL,
|
|
54
|
-
accountId TEXT NOT NULL,
|
|
55
|
-
providerId TEXT NOT NULL,
|
|
56
|
-
userId TEXT NOT NULL REFERENCES user (id) ON DELETE CASCADE,
|
|
57
|
-
accessToken TEXT,
|
|
58
|
-
refreshToken TEXT,
|
|
59
|
-
idToken TEXT,
|
|
60
|
-
accessTokenExpiresAt INTEGER,
|
|
61
|
-
refreshTokenExpiresAt INTEGER,
|
|
62
|
-
scope TEXT,
|
|
63
|
-
-- The password hash for the email and password credential account.
|
|
64
|
-
password TEXT,
|
|
65
|
-
createdAt INTEGER NOT NULL,
|
|
66
|
-
updatedAt INTEGER NOT NULL
|
|
67
|
-
);
|
|
68
|
-
|
|
69
|
-
CREATE INDEX idx_account_user ON account (userId);
|
|
70
|
-
CREATE UNIQUE INDEX idx_account_issuer_account ON account (issuer, accountId);
|
|
71
|
-
|
|
72
|
-
CREATE TABLE verification (
|
|
73
|
-
id TEXT PRIMARY KEY,
|
|
74
|
-
identifier TEXT NOT NULL,
|
|
75
|
-
value TEXT NOT NULL,
|
|
76
|
-
expiresAt INTEGER NOT NULL,
|
|
77
|
-
createdAt INTEGER NOT NULL,
|
|
78
|
-
updatedAt INTEGER NOT NULL
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
CREATE INDEX idx_verification_identifier ON verification (identifier);
|