@pattern-js/mod-identity 0.3.0 → 0.4.0-main.f8ef342
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin-routes.d.ts +4 -0
- package/dist/admin-routes.d.ts.map +1 -1
- package/dist/admin-routes.js +16 -2
- package/dist/admin-routes.js.map +1 -1
- package/dist/api-token-provider.d.ts +18 -0
- package/dist/api-token-provider.d.ts.map +1 -0
- package/dist/api-token-provider.js +47 -0
- package/dist/api-token-provider.js.map +1 -0
- package/dist/deliver.d.ts +2 -0
- package/dist/deliver.d.ts.map +1 -1
- package/dist/deliver.js +55 -2
- package/dist/deliver.js.map +1 -1
- package/dist/frontend.d.ts.map +1 -1
- package/dist/frontend.js +101 -12
- package/dist/frontend.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +9 -2
- package/dist/mod.js.map +1 -1
- package/dist/ops.d.ts.map +1 -1
- package/dist/ops.js +149 -24
- package/dist/ops.js.map +1 -1
- package/dist/pages/html.d.ts.map +1 -1
- package/dist/pages/html.js +1 -0
- package/dist/pages/html.js.map +1 -1
- package/dist/pages/invited.d.ts +15 -0
- package/dist/pages/invited.d.ts.map +1 -0
- package/dist/pages/invited.js +21 -0
- package/dist/pages/invited.js.map +1 -0
- package/dist/service.d.ts +92 -3
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +187 -0
- package/dist/service.js.map +1 -1
- package/dist/store/memory.d.ts.map +1 -1
- package/dist/store/memory.js +0 -0
- package/dist/store/memory.js.map +1 -1
- package/dist/store/migrations.d.ts.map +1 -1
- package/dist/store/migrations.js +35 -0
- package/dist/store/migrations.js.map +1 -1
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +121 -0
- package/dist/store/sqlite.js.map +1 -1
- package/dist/store/types.d.ts +76 -0
- package/dist/store/types.d.ts.map +1 -1
- package/dist/store/types.js.map +1 -1
- package/dist/workflows.d.ts.map +1 -1
- package/dist/workflows.js +1 -0
- package/dist/workflows.js.map +1 -1
- package/docs/index.md +66 -0
- package/docs/ops/identity.apiTokens.create.md +13 -0
- package/docs/ops/identity.apiTokens.list.md +4 -0
- package/docs/ops/identity.apiTokens.revoke.md +4 -0
- package/docs/ops/identity.invited.page.md +6 -0
- package/docs/ops/identity.invites.list.md +6 -0
- package/docs/ops/identity.invites.revoke.md +6 -0
- package/docs/ops/identity.users.delete.md +6 -0
- package/docs/ops/identity.users.invite.md +11 -7
- package/docs/ops/identity.users.setRoles.md +7 -5
- package/docs/ops/identity.users.toggleDisabled.md +6 -4
- package/package.json +4 -4
package/dist/admin-routes.d.ts
CHANGED
|
@@ -19,9 +19,13 @@ export declare const PATHS: {
|
|
|
19
19
|
readonly userLoginLink: "/identity/users/:userId/login-link";
|
|
20
20
|
readonly userToggleDisabled: "/identity/users/:userId/toggle-disabled";
|
|
21
21
|
readonly userRevokeSessions: "/identity/users/:userId/revoke-sessions";
|
|
22
|
+
readonly userSetRoles: "/identity/users/:userId/roles";
|
|
22
23
|
readonly invites: "/identity/invites";
|
|
24
|
+
readonly inviteRevoke: "/identity/invites/:inviteId/revoke";
|
|
23
25
|
readonly sessions: "/identity/sessions";
|
|
24
26
|
readonly session: "/identity/sessions/:sessionId";
|
|
27
|
+
readonly apiTokens: "/identity/api-tokens";
|
|
28
|
+
readonly apiTokenRevoke: "/identity/api-tokens/:tokenId/revoke";
|
|
25
29
|
readonly settings: "/identity/settings";
|
|
26
30
|
readonly whoami: "/identity/whoami";
|
|
27
31
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-routes.d.ts","sourceRoot":"","sources":["../src/admin-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"admin-routes.d.ts","sourceRoot":"","sources":["../src/admin-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAsD,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIrG,oFAAoF;AACpF,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;CAiBR,CAAC;AAEX,8DAA8D;AAC9D,wBAAgB,mBAAmB,IAAI,QAAQ,EAAE,CAuChD"}
|
package/dist/admin-routes.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* principal, so it needs authentication, not the admin scope. Paths are
|
|
10
10
|
* single-sourced here so the workflows and the manifest can't drift.
|
|
11
11
|
*/
|
|
12
|
-
import { fromBody, fromParams, httpEndpoint } from "@pattern-js/core";
|
|
12
|
+
import { fromBody, fromParams, fromRequestUrl, httpEndpoint } from "@pattern-js/core";
|
|
13
13
|
const API = "/admin/api";
|
|
14
14
|
/** Route paths relative to the admin API mount — the manifest's `RouteRef.path`. */
|
|
15
15
|
export const PATHS = {
|
|
@@ -20,9 +20,13 @@ export const PATHS = {
|
|
|
20
20
|
userLoginLink: "/identity/users/:userId/login-link",
|
|
21
21
|
userToggleDisabled: "/identity/users/:userId/toggle-disabled",
|
|
22
22
|
userRevokeSessions: "/identity/users/:userId/revoke-sessions",
|
|
23
|
+
userSetRoles: "/identity/users/:userId/roles",
|
|
23
24
|
invites: "/identity/invites",
|
|
25
|
+
inviteRevoke: "/identity/invites/:inviteId/revoke",
|
|
24
26
|
sessions: "/identity/sessions",
|
|
25
27
|
session: "/identity/sessions/:sessionId",
|
|
28
|
+
apiTokens: "/identity/api-tokens",
|
|
29
|
+
apiTokenRevoke: "/identity/api-tokens/:tokenId/revoke",
|
|
26
30
|
settings: "/identity/settings",
|
|
27
31
|
whoami: "/identity/whoami",
|
|
28
32
|
};
|
|
@@ -40,13 +44,23 @@ export function identityAdminRoutes() {
|
|
|
40
44
|
r("identity.route.admin.settings.get", "GET", PATHS.settings, "identity.settings.get", { out: "settings" }),
|
|
41
45
|
// whoami is about the *caller* — authentication, not the admin scope.
|
|
42
46
|
r("identity.route.admin.whoami", "GET", PATHS.whoami, "identity.whoami", { out: "whoami" }, true),
|
|
47
|
+
r("identity.route.admin.invites.list", "GET", PATHS.invites, "identity.invites.list", { out: "invites" }),
|
|
43
48
|
// ── actions ──
|
|
44
|
-
|
|
49
|
+
// The invite's emailed link must be absolute: the request URL rides along so
|
|
50
|
+
// the op can derive the origin (PATTERN_PUBLIC_URL beats it when configured).
|
|
51
|
+
r("identity.route.admin.users.invite", "POST", PATHS.invites, "identity.users.invite", { in: { email: fromBody(), roles: fromBody(), next: fromBody(), url: fromRequestUrl() }, out: "result" }),
|
|
52
|
+
r("identity.route.admin.invites.revoke", "POST", PATHS.inviteRevoke, "identity.invites.revoke", { in: { inviteId: fromParams() }, out: "result" }),
|
|
45
53
|
r("identity.route.admin.users.loginLink", "POST", PATHS.userLoginLink, "identity.users.loginLink", { in: { userId: fromParams() }, out: "result" }),
|
|
46
54
|
r("identity.route.admin.users.toggleDisabled", "POST", PATHS.userToggleDisabled, "identity.users.toggleDisabled", { in: { userId: fromParams() }, out: "user" }),
|
|
47
55
|
r("identity.route.admin.users.revokeSessions", "POST", PATHS.userRevokeSessions, "identity.users.revokeSessions", { in: { userId: fromParams() }, out: "result" }),
|
|
56
|
+
r("identity.route.admin.users.setRoles", "POST", PATHS.userSetRoles, "identity.users.setRoles", { in: { userId: fromParams(), roles: fromBody() }, out: "user" }),
|
|
57
|
+
r("identity.route.admin.users.delete", "DELETE", PATHS.user, "identity.users.delete", { in: { userId: fromParams() }, out: "result" }),
|
|
48
58
|
r("identity.route.admin.sessions.revoke", "DELETE", PATHS.session, "identity.sessions.revoke", { in: { sessionId: fromParams() }, out: "result" }),
|
|
49
59
|
r("identity.route.admin.settings.set", "POST", PATHS.settings, "identity.settings.set", { in: { signup: fromBody() }, out: "result" }),
|
|
60
|
+
// ── API tokens ──
|
|
61
|
+
r("identity.route.admin.apiTokens.list", "GET", PATHS.apiTokens, "identity.apiTokens.list", { out: "tokens" }),
|
|
62
|
+
r("identity.route.admin.apiTokens.create", "POST", PATHS.apiTokens, "identity.apiTokens.create", { in: { name: fromBody(), scopes: fromBody(), ttlDays: fromBody() }, out: "result" }),
|
|
63
|
+
r("identity.route.admin.apiTokens.revoke", "POST", PATHS.apiTokenRevoke, "identity.apiTokens.revoke", { in: { tokenId: fromParams() }, out: "result" }),
|
|
50
64
|
];
|
|
51
65
|
}
|
|
52
66
|
//# sourceMappingURL=admin-routes.js.map
|
package/dist/admin-routes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-routes.js","sourceRoot":"","sources":["../src/admin-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAiB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"admin-routes.js","sourceRoot":"","sources":["../src/admin-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pattern-js/mod-identity — the API-token AuthProvider (0.4.0).
|
|
3
|
+
*
|
|
4
|
+
* The bridge from `Authorization: Bearer pat_…` to a principal, for the
|
|
5
|
+
* control-plane surface (MCP server, admin API automation, CI). Returns null
|
|
6
|
+
* fast when the header is absent or not token-shaped, so the session provider
|
|
7
|
+
* and any custom providers get their turn.
|
|
8
|
+
*
|
|
9
|
+
* The principal's id is the TOKEN id (`apitoken:<id>`), not the minting
|
|
10
|
+
* user's — audit trails then say which credential acted, which is the whole
|
|
11
|
+
* point of named revocable tokens. No CSRF concerns here: bearer headers are
|
|
12
|
+
* never attached cross-site by a browser.
|
|
13
|
+
*/
|
|
14
|
+
import type { AuthProvider } from "@pattern-js/core";
|
|
15
|
+
import { type IdentityService } from "./service.js";
|
|
16
|
+
export declare const API_TOKEN_PROVIDER_NAME = "@pattern-js/mod-identity/api-token";
|
|
17
|
+
export declare function apiTokenAuthProvider(svc: () => IdentityService | undefined): AuthProvider;
|
|
18
|
+
//# sourceMappingURL=api-token-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-token-provider.d.ts","sourceRoot":"","sources":["../src/api-token-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEtE,eAAO,MAAM,uBAAuB,uCAAuC,CAAC;AAE5E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,eAAe,GAAG,SAAS,GAAG,YAAY,CA6BzF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pattern-js/mod-identity — the API-token AuthProvider (0.4.0).
|
|
3
|
+
*
|
|
4
|
+
* The bridge from `Authorization: Bearer pat_…` to a principal, for the
|
|
5
|
+
* control-plane surface (MCP server, admin API automation, CI). Returns null
|
|
6
|
+
* fast when the header is absent or not token-shaped, so the session provider
|
|
7
|
+
* and any custom providers get their turn.
|
|
8
|
+
*
|
|
9
|
+
* The principal's id is the TOKEN id (`apitoken:<id>`), not the minting
|
|
10
|
+
* user's — audit trails then say which credential acted, which is the whole
|
|
11
|
+
* point of named revocable tokens. No CSRF concerns here: bearer headers are
|
|
12
|
+
* never attached cross-site by a browser.
|
|
13
|
+
*/
|
|
14
|
+
import { API_TOKEN_PREFIX } from "./service.js";
|
|
15
|
+
export const API_TOKEN_PROVIDER_NAME = "@pattern-js/mod-identity/api-token";
|
|
16
|
+
export function apiTokenAuthProvider(svc) {
|
|
17
|
+
return {
|
|
18
|
+
name: API_TOKEN_PROVIDER_NAME,
|
|
19
|
+
async authenticate(ctx) {
|
|
20
|
+
const service = svc();
|
|
21
|
+
if (!service)
|
|
22
|
+
return null;
|
|
23
|
+
const header = ctx.headers.get("authorization");
|
|
24
|
+
if (!header)
|
|
25
|
+
return null;
|
|
26
|
+
const [scheme, raw] = header.split(/\s+/, 2);
|
|
27
|
+
if (scheme?.toLowerCase() !== "bearer" || !raw?.startsWith(API_TOKEN_PREFIX))
|
|
28
|
+
return null;
|
|
29
|
+
const row = await service.verifyApiToken(raw);
|
|
30
|
+
if (!row)
|
|
31
|
+
return null;
|
|
32
|
+
return {
|
|
33
|
+
kind: "user",
|
|
34
|
+
id: `apitoken:${row.id}`,
|
|
35
|
+
provider: API_TOKEN_PROVIDER_NAME,
|
|
36
|
+
scopes: row.scopes,
|
|
37
|
+
claims: {
|
|
38
|
+
tokenId: row.id,
|
|
39
|
+
tokenName: row.name,
|
|
40
|
+
// The admin who minted it, when recorded — context, not authority.
|
|
41
|
+
mintedBy: row.userId ?? undefined,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=api-token-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-token-provider.js","sourceRoot":"","sources":["../src/api-token-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,gBAAgB,EAAwB,MAAM,cAAc,CAAC;AAEtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,oCAAoC,CAAC;AAE5E,MAAM,UAAU,oBAAoB,CAAC,GAAsC;IACzE,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,KAAK,CAAC,YAAY,CAAC,GAAG;YACpB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAE1B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC7C,IAAI,MAAM,EAAE,WAAW,EAAE,KAAK,QAAQ,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,gBAAgB,CAAC;gBAAE,OAAO,IAAI,CAAC;YAE1F,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAC9C,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YAEtB,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,EAAE,EAAE,YAAY,GAAG,CAAC,EAAE,EAAE;gBACxB,QAAQ,EAAE,uBAAuB;gBACjC,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,MAAM,EAAE;oBACN,OAAO,EAAE,GAAG,CAAC,EAAE;oBACf,SAAS,EAAE,GAAG,CAAC,IAAI;oBACnB,mEAAmE;oBACnE,QAAQ,EAAE,GAAG,CAAC,MAAM,IAAI,SAAS;iBAClC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/deliver.d.ts
CHANGED
|
@@ -17,6 +17,8 @@ export interface DeliverInput {
|
|
|
17
17
|
purpose: string;
|
|
18
18
|
/** The request origin (e.g. "http://localhost:3000"), when available — makes the link absolute. */
|
|
19
19
|
origin?: string | null;
|
|
20
|
+
/** Token expiry (ms epoch) — turns "expires soon" into "valid for 7 days" in the copy. */
|
|
21
|
+
expiresAt?: number;
|
|
20
22
|
}
|
|
21
23
|
export interface DeliverResult {
|
|
22
24
|
delivered: boolean;
|
package/dist/deliver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deliver.d.ts","sourceRoot":"","sources":["../src/deliver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,kBAAkB,0BAA0B,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,mGAAmG;IACnG,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"deliver.d.ts","sourceRoot":"","sources":["../src/deliver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,kBAAkB,0BAA0B,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,mGAAmG;IACnG,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAExE;AA8CD,wBAAsB,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CA6B9F"}
|
package/dist/deliver.js
CHANGED
|
@@ -13,9 +13,62 @@ export const DELIVER_TOKEN_HOOK = "identity.deliverToken";
|
|
|
13
13
|
export function absoluteUrl(path, origin) {
|
|
14
14
|
return origin ? `${origin.replace(/\/$/, "")}${path}` : path;
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* The canonical public origin, when configured. `PATTERN_PUBLIC_URL` beats any
|
|
18
|
+
* request-derived origin on purpose: behind a proxy or tunnel the Host header
|
|
19
|
+
* is whatever the hop put there, and links minted outside a request (cron,
|
|
20
|
+
* CLI) have no origin at all — an emailed link must survive both.
|
|
21
|
+
*/
|
|
22
|
+
function configuredOrigin(ctx) {
|
|
23
|
+
const raw = ctx.env?.PATTERN_PUBLIC_URL;
|
|
24
|
+
return typeof raw === "string" && raw.trim() ? raw.trim() : null;
|
|
25
|
+
}
|
|
26
|
+
/** "valid for 7 days" / "expires in 14 minutes" — humanized from the expiry stamp. */
|
|
27
|
+
function humanTtl(expiresAt) {
|
|
28
|
+
const ms = (expiresAt ?? 0) - Date.now();
|
|
29
|
+
if (ms <= 0)
|
|
30
|
+
return null;
|
|
31
|
+
const minutes = Math.round(ms / 60_000);
|
|
32
|
+
if (minutes < 90)
|
|
33
|
+
return `${minutes} minute${minutes === 1 ? "" : "s"}`;
|
|
34
|
+
const hours = Math.round(minutes / 60);
|
|
35
|
+
if (hours <= 48)
|
|
36
|
+
return `${hours} hour${hours === 1 ? "" : "s"}`;
|
|
37
|
+
const days = Math.round(hours / 24);
|
|
38
|
+
return `${days} day${days === 1 ? "" : "s"}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Human copy per purpose. It lives HERE, not in the delivery workflow, because
|
|
42
|
+
* identity owns the token's semantics (what it does, how long it lives) —
|
|
43
|
+
* every channel subscribed to the hook (email, SMS, chat…) gets sensible
|
|
44
|
+
* wording for free, and a forked delivery workflow may still write its own.
|
|
45
|
+
*/
|
|
46
|
+
function copyFor(purpose, ttl) {
|
|
47
|
+
const expiry = ttl ? `The link is single-use and valid for ${ttl}.` : "The link is single-use and expires soon.";
|
|
48
|
+
switch (purpose) {
|
|
49
|
+
case "invite":
|
|
50
|
+
return {
|
|
51
|
+
subject: "You've been invited",
|
|
52
|
+
message: `You've been invited to join. Open the link below to accept the invitation — your account is created on the spot, then you sign in for the first time. ${expiry}`,
|
|
53
|
+
};
|
|
54
|
+
case "login":
|
|
55
|
+
return { subject: "Your sign-in link", message: `Open the link below to sign in. ${expiry}` };
|
|
56
|
+
default:
|
|
57
|
+
return { subject: `Your ${purpose} link`, message: `Open the link below to continue. ${expiry}` };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
16
60
|
export async function deliverToken(ctx, input) {
|
|
17
|
-
const url = absoluteUrl(input.path, input.origin);
|
|
18
|
-
const
|
|
61
|
+
const url = absoluteUrl(input.path, configuredOrigin(ctx) ?? input.origin);
|
|
62
|
+
const { subject, message } = copyFor(input.purpose, humanTtl(input.expiresAt));
|
|
63
|
+
const payload = {
|
|
64
|
+
email: input.email,
|
|
65
|
+
url,
|
|
66
|
+
purpose: input.purpose,
|
|
67
|
+
delivered: false,
|
|
68
|
+
subject,
|
|
69
|
+
message,
|
|
70
|
+
...(input.expiresAt !== undefined ? { expiresAt: input.expiresAt } : {}),
|
|
71
|
+
};
|
|
19
72
|
let result;
|
|
20
73
|
try {
|
|
21
74
|
result = await ctx.services.hooks.invoke(DELIVER_TOKEN_HOOK, payload);
|
package/dist/deliver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deliver.js","sourceRoot":"","sources":["../src/deliver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"deliver.js","sourceRoot":"","sources":["../src/deliver.ts"],"names":[],"mappings":"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"}
|
package/dist/frontend.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontend.d.ts","sourceRoot":"","sources":["../src/frontend.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAG7D,wBAAgB,gBAAgB,IAAI,oBAAoB,
|
|
1
|
+
{"version":3,"file":"frontend.d.ts","sourceRoot":"","sources":["../src/frontend.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAG7D,wBAAgB,gBAAgB,IAAI,oBAAoB,CA2NvD"}
|
package/dist/frontend.js
CHANGED
|
@@ -10,8 +10,9 @@ export function identityFrontend() {
|
|
|
10
10
|
return {
|
|
11
11
|
menu: [
|
|
12
12
|
{ category: "Access", label: "Users", icon: "users", path: "/x/identity/users", order: 10 },
|
|
13
|
-
{ category: "Access", label: "
|
|
13
|
+
{ category: "Access", label: "Invites", icon: "user-plus", path: "/x/identity/invite", order: 20 },
|
|
14
14
|
{ category: "Access", label: "Sessions", icon: "key-round", path: "/x/identity/sessions", order: 30 },
|
|
15
|
+
{ category: "Access", label: "API tokens", icon: "key-square", path: "/x/identity/api-tokens", order: 40 },
|
|
15
16
|
],
|
|
16
17
|
pages: [
|
|
17
18
|
{
|
|
@@ -32,8 +33,9 @@ export function identityFrontend() {
|
|
|
32
33
|
// stay silent: the refreshed row is the feedback.
|
|
33
34
|
{ label: "Details", path: "/x/identity/users/:userId", args: { userId: "id" }, icon: "user" },
|
|
34
35
|
{ label: "Sign-in link", route: { method: "POST", path: PATHS.userLoginLink }, args: { userId: "id" }, icon: "key-round", result: "show" },
|
|
35
|
-
{ label: "
|
|
36
|
+
{ label: "Disable / enable", route: { method: "POST", path: PATHS.userToggleDisabled }, args: { userId: "id" }, icon: "ban", confirm: true },
|
|
36
37
|
{ label: "Log out everywhere", route: { method: "POST", path: PATHS.userRevokeSessions }, args: { userId: "id" }, icon: "log-out", confirm: true },
|
|
38
|
+
{ label: "Delete", route: { method: "DELETE", path: PATHS.user }, args: { userId: "id" }, icon: "trash", confirm: true },
|
|
37
39
|
],
|
|
38
40
|
},
|
|
39
41
|
},
|
|
@@ -43,6 +45,24 @@ export function identityFrontend() {
|
|
|
43
45
|
path: "/x/identity/users/:userId",
|
|
44
46
|
views: [
|
|
45
47
|
{ title: "Profile", view: { kind: "detail", route: { method: "GET", path: PATHS.user } } },
|
|
48
|
+
{
|
|
49
|
+
// Editing roles needs an input, which a row action can't carry —
|
|
50
|
+
// so it lives here as a form (the page's :userId fills the route).
|
|
51
|
+
title: "Set roles",
|
|
52
|
+
view: {
|
|
53
|
+
kind: "form",
|
|
54
|
+
schema: {
|
|
55
|
+
type: "object",
|
|
56
|
+
properties: {
|
|
57
|
+
roles: {
|
|
58
|
+
type: "string",
|
|
59
|
+
description: 'Comma-separated — REPLACES the current set, e.g. "admin" (empty = plain user). Ends the user\'s sessions.',
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
route: { method: "POST", path: PATHS.userSetRoles },
|
|
64
|
+
},
|
|
65
|
+
},
|
|
46
66
|
{
|
|
47
67
|
title: "Runs by workflow (recent window)",
|
|
48
68
|
view: {
|
|
@@ -76,19 +96,88 @@ export function identityFrontend() {
|
|
|
76
96
|
],
|
|
77
97
|
},
|
|
78
98
|
{
|
|
99
|
+
// Invites: send (form) + the sent list with statuses, one page.
|
|
79
100
|
path: "/x/identity/invite",
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
101
|
+
views: [
|
|
102
|
+
{
|
|
103
|
+
title: "Send an invite",
|
|
104
|
+
view: {
|
|
105
|
+
kind: "form",
|
|
106
|
+
schema: {
|
|
107
|
+
type: "object",
|
|
108
|
+
properties: {
|
|
109
|
+
email: { type: "string", description: "Who to invite" },
|
|
110
|
+
roles: { type: "string", description: 'Comma-separated roles, e.g. "admin" (empty = plain user)' },
|
|
111
|
+
next: { type: "string", description: "Where their first login lands, e.g. /admin or /chat (empty = the app default)" },
|
|
112
|
+
},
|
|
113
|
+
required: ["email"],
|
|
114
|
+
},
|
|
115
|
+
route: { method: "POST", path: PATHS.invites },
|
|
87
116
|
},
|
|
88
|
-
required: ["email"],
|
|
89
117
|
},
|
|
90
|
-
|
|
91
|
-
|
|
118
|
+
{
|
|
119
|
+
title: "Sent invites",
|
|
120
|
+
view: {
|
|
121
|
+
kind: "table",
|
|
122
|
+
route: { method: "GET", path: PATHS.invites },
|
|
123
|
+
columns: [
|
|
124
|
+
{ key: "email", label: "Email" },
|
|
125
|
+
{ key: "roles", label: "Roles" },
|
|
126
|
+
{ key: "status", label: "Status", format: "badge" },
|
|
127
|
+
{ key: "next", label: "Lands on" },
|
|
128
|
+
{ key: "invited by", label: "Invited by" },
|
|
129
|
+
{ key: "sent", label: "Sent", format: "date" },
|
|
130
|
+
{ key: "expires", label: "Expires", format: "date" },
|
|
131
|
+
],
|
|
132
|
+
rowActions: [
|
|
133
|
+
{ label: "Revoke", route: { method: "POST", path: PATHS.inviteRevoke }, args: { inviteId: "id" }, icon: "ban", confirm: true },
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
// API tokens: mint (show-once secret in the result view) + inventory.
|
|
141
|
+
path: "/x/identity/api-tokens",
|
|
142
|
+
views: [
|
|
143
|
+
{
|
|
144
|
+
title: "Mint a token",
|
|
145
|
+
view: {
|
|
146
|
+
kind: "form",
|
|
147
|
+
schema: {
|
|
148
|
+
type: "object",
|
|
149
|
+
properties: {
|
|
150
|
+
name: { type: "string", description: 'A label you\'ll recognize ("CI deploys", "Claude Code")' },
|
|
151
|
+
scopes: {
|
|
152
|
+
type: "string",
|
|
153
|
+
description: "Comma-separated: workflows:read, workflows:write, runs:read, runs:write, deploy, admin",
|
|
154
|
+
},
|
|
155
|
+
ttlDays: { type: "string", description: "Days until expiry (empty = never)" },
|
|
156
|
+
},
|
|
157
|
+
required: ["name", "scopes"],
|
|
158
|
+
},
|
|
159
|
+
route: { method: "POST", path: PATHS.apiTokens },
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
title: "Tokens",
|
|
164
|
+
view: {
|
|
165
|
+
kind: "table",
|
|
166
|
+
route: { method: "GET", path: PATHS.apiTokens },
|
|
167
|
+
columns: [
|
|
168
|
+
{ key: "name", label: "Name" },
|
|
169
|
+
{ key: "scopes", label: "Scopes" },
|
|
170
|
+
{ key: "status", label: "Status", format: "badge" },
|
|
171
|
+
{ key: "created", label: "Created", format: "date" },
|
|
172
|
+
{ key: "lastUsed", label: "Last used", format: "date" },
|
|
173
|
+
{ key: "expires", label: "Expires" },
|
|
174
|
+
],
|
|
175
|
+
rowActions: [
|
|
176
|
+
{ label: "Revoke", route: { method: "POST", path: PATHS.apiTokenRevoke }, args: { tokenId: "id" }, icon: "ban", confirm: true },
|
|
177
|
+
],
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
],
|
|
92
181
|
},
|
|
93
182
|
{
|
|
94
183
|
path: "/x/identity/sessions",
|
package/dist/frontend.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontend.js","sourceRoot":"","sources":["../src/frontend.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,IAAI,EAAE;YACJ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,EAAE;YAC3F,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"frontend.js","sourceRoot":"","sources":["../src/frontend.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,9 +7,10 @@
|
|
|
7
7
|
export { identityMod } from "./mod.js";
|
|
8
8
|
export { default } from "./mod.js";
|
|
9
9
|
export { resolveOptions, type IdentityOptions, type ResolvedIdentityOptions } from "./options.js";
|
|
10
|
-
export { DefaultIdentityService, type FindOrCreateInput, type IdentityService, type IssuedToken, type LoginMethod, type MintedSession, type ResolvedSession, } from "./service.js";
|
|
10
|
+
export { DefaultIdentityService, API_TOKEN_PREFIX, API_TOKEN_SCOPES, type ApiTokenScope, type FindOrCreateInput, type IdentityService, type IssuedToken, type LoginMethod, type MintedApiToken, type MintedSession, type ResolvedSession, } from "./service.js";
|
|
11
11
|
export { identityService, IDENTITY_SERVICE } from "./service-key.js";
|
|
12
12
|
export { sessionAuthProvider, SESSION_PROVIDER_NAME } from "./auth-provider.js";
|
|
13
|
+
export { apiTokenAuthProvider, API_TOKEN_PROVIDER_NAME } from "./api-token-provider.js";
|
|
13
14
|
export { deliverToken, absoluteUrl, DELIVER_TOKEN_HOOK, type DeliverInput, type DeliverResult } from "./deliver.js";
|
|
14
15
|
export { parseCookies, serializeSessionCookie, clearSessionCookie } from "./cookies.js";
|
|
15
16
|
export { isCrossSiteWrite, isStateChanging } from "./csrf.js";
|
|
@@ -19,5 +20,5 @@ export { layout, escapeHtml, safeNextPath } from "./pages/html.js";
|
|
|
19
20
|
export { memoryIdentityStores } from "./store/memory.js";
|
|
20
21
|
export { sqliteIdentityStores } from "./store/sqlite.js";
|
|
21
22
|
export { KeyedMutex } from "./store/mutex.js";
|
|
22
|
-
export { UniqueViolationError, type IdentityStores, type SessionRow, type SessionStore, type TokenPurpose, type TokenRow, type TokenStore, type UserRow, type UserStore, } from "./store/types.js";
|
|
23
|
+
export { UniqueViolationError, type ApiTokenRow, type ApiTokenStore, type IdentityStores, type SessionRow, type SessionStore, type TokenPurpose, type TokenRow, type TokenStore, type UserRow, type UserStore, } from "./store/types.js";
|
|
23
24
|
//# 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;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAClG,OAAO,EACL,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AACpH,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,SAAS,GACf,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAClG,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AACpH,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,SAAS,GACf,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,9 +7,10 @@
|
|
|
7
7
|
export { identityMod } from "./mod.js";
|
|
8
8
|
export { default } from "./mod.js";
|
|
9
9
|
export { resolveOptions } from "./options.js";
|
|
10
|
-
export { DefaultIdentityService, } from "./service.js";
|
|
10
|
+
export { DefaultIdentityService, API_TOKEN_PREFIX, API_TOKEN_SCOPES, } from "./service.js";
|
|
11
11
|
export { identityService, IDENTITY_SERVICE } from "./service-key.js";
|
|
12
12
|
export { sessionAuthProvider, SESSION_PROVIDER_NAME } from "./auth-provider.js";
|
|
13
|
+
export { apiTokenAuthProvider, API_TOKEN_PROVIDER_NAME } from "./api-token-provider.js";
|
|
13
14
|
export { deliverToken, absoluteUrl, DELIVER_TOKEN_HOOK } from "./deliver.js";
|
|
14
15
|
export { parseCookies, serializeSessionCookie, clearSessionCookie } from "./cookies.js";
|
|
15
16
|
export { isCrossSiteWrite, isStateChanging } from "./csrf.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAsD,MAAM,cAAc,CAAC;AAClG,OAAO,EACL,sBAAsB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAsD,MAAM,cAAc,CAAC;AAClG,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,GASjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAyC,MAAM,cAAc,CAAC;AACpH,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,oBAAoB,GAWrB,MAAM,kBAAkB,CAAC"}
|
package/dist/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,EAA+D,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAChH,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,EAA+D,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAChH,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAwBpE,wBAAgB,WAAW,CAAC,OAAO,GAAE,eAAoB,GAAG,UAAU,CA8DrE;AAED,+EAA+E;;AAC/E,wBAA6B"}
|
package/dist/mod.js
CHANGED
|
@@ -19,6 +19,7 @@ import { AUTH_LOGIN_URL, IDENTITY_SERVICE, defineMod, z } from "@pattern-js/core
|
|
|
19
19
|
import { resolveOptions } from "./options.js";
|
|
20
20
|
import { DefaultIdentityService } from "./service.js";
|
|
21
21
|
import { sessionAuthProvider } from "./auth-provider.js";
|
|
22
|
+
import { apiTokenAuthProvider } from "./api-token-provider.js";
|
|
22
23
|
import { identityOps } from "./ops.js";
|
|
23
24
|
import { endpointWorkflows } from "./workflows.js";
|
|
24
25
|
import { identityAdminRoutes } from "./admin-routes.js";
|
|
@@ -50,7 +51,7 @@ export function identityMod(options = {}) {
|
|
|
50
51
|
// Auth-page routes + the admin Access screens' dedicated routes (one
|
|
51
52
|
// purposeful endpoint per screen and action, replacing the invoke path).
|
|
52
53
|
workflows: [...endpointWorkflows(opts.mount), ...identityAdminRoutes()],
|
|
53
|
-
authProviders: [sessionAuthProvider(() => service)],
|
|
54
|
+
authProviders: [sessionAuthProvider(() => service), apiTokenAuthProvider(() => service)],
|
|
54
55
|
hooks: [
|
|
55
56
|
{
|
|
56
57
|
name: DELIVER_TOKEN_HOOK,
|
|
@@ -60,6 +61,11 @@ export function identityMod(options = {}) {
|
|
|
60
61
|
url: z.string(),
|
|
61
62
|
purpose: z.string(),
|
|
62
63
|
delivered: z.boolean(),
|
|
64
|
+
/** Ready-made human copy (purpose- and expiry-aware) — any channel may use or replace it. */
|
|
65
|
+
subject: z.string(),
|
|
66
|
+
message: z.string(),
|
|
67
|
+
/** Token expiry (ms epoch), when the issuer knows it. */
|
|
68
|
+
expiresAt: z.number().optional(),
|
|
63
69
|
})
|
|
64
70
|
.loose(),
|
|
65
71
|
},
|
|
@@ -85,7 +91,8 @@ export function identityMod(options = {}) {
|
|
|
85
91
|
data: { roles: opts.bootstrapRoles },
|
|
86
92
|
});
|
|
87
93
|
const path = `${opts.mount}/bootstrap?t=${issued.token}`;
|
|
88
|
-
const
|
|
94
|
+
const configured = process.env.PATTERN_PUBLIC_URL?.trim().replace(/\/$/, "");
|
|
95
|
+
const guess = configured ? `${configured}${path}` : `http://localhost:${process.env.PORT ?? 3000}${path}`;
|
|
89
96
|
console.log(`\n[pattern] ◆ No users yet. Create the first admin with this one-time link (valid 24h):\n` +
|
|
90
97
|
`[pattern] ${guess}\n` +
|
|
91
98
|
`[pattern] (path: ${path}; adjust host/port if your app serves elsewhere)\n`);
|
package/dist/mod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,EAAgC,MAAM,kBAAkB,CAAC;AAChH,OAAO,EAAE,cAAc,EAAwB,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,2DAA2D;AAE3D,sFAAsF;AACtF,SAAS,YAAY,CAAC,MAAc;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,iBAAiB,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,UAA2B,EAAE;IACvD,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAErC,4EAA4E;IAC5E,kEAAkE;IAClE,IAAI,OAA2C,CAAC;IAEhD,OAAO,SAAS,CAAC;QACf,IAAI,EAAE,0BAA0B;QAChC,IAAI,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;QACnE,GAAG,EAAE,WAAW;QAChB,qEAAqE;QACrE,yEAAyE;QACzE,SAAS,EAAE,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,mBAAmB,EAAE,CAAC;QACvE,aAAa,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,EAAgC,MAAM,kBAAkB,CAAC;AAChH,OAAO,EAAE,cAAc,EAAwB,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,2DAA2D;AAE3D,sFAAsF;AACtF,SAAS,YAAY,CAAC,MAAc;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,iBAAiB,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,UAA2B,EAAE;IACvD,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAErC,4EAA4E;IAC5E,kEAAkE;IAClE,IAAI,OAA2C,CAAC;IAEhD,OAAO,SAAS,CAAC;QACf,IAAI,EAAE,0BAA0B;QAChC,IAAI,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;QACnE,GAAG,EAAE,WAAW;QAChB,qEAAqE;QACrE,yEAAyE;QACzE,SAAS,EAAE,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,mBAAmB,EAAE,CAAC;QACvE,aAAa,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QACxF,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,CAAC;qBACP,MAAM,CAAC;oBACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;oBACjB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;oBACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;oBACnB,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;oBACtB,6FAA6F;oBAC7F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;oBACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;oBACnB,yDAAyD;oBACzD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;iBACjC,CAAC;qBACD,KAAK,EAAE;aACX;SACF;QACD,QAAQ,EAAE,gBAAgB,EAAE;QAC5B,KAAK,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;YAC9B,YAAY,CAAC,MAAM,CAAC,CAAC;YACrB,MAAM,MAAM,GACV,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,MAAM,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChG,OAAO,GAAG,IAAI,sBAAsB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACvE,MAAM,CAAC,cAAc,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC/D,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,wEAAwE;YACxE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO;YACtB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;gBACtC,OAAO,EAAE,WAAW;gBACpB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;gBAC1B,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE;aACrC,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,gBAAgB,MAAM,CAAC,KAAK,EAAE,CAAC;YACzD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC7E,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,oBAAoB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;YAC1G,OAAO,CAAC,GAAG,CACT,2FAA2F;gBACzF,eAAe,KAAK,IAAI;gBACxB,sBAAsB,IAAI,oDAAoD,CACjF,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,eAAe,WAAW,EAAE,CAAC"}
|
package/dist/ops.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../src/ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAA2C,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../src/ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAA2C,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAwE9F,6EAA6E;AAC7E,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAM,CAAC;AAomBxG,eAAO,MAAM,WAAW,EAAE,YAAY,EA2BrC,CAAC"}
|