@nestjs-kit/better-auth 0.0.0-stage → 2.1.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/LICENSE +7 -0
- package/README.md +1078 -2
- package/dist/admin.cjs +88 -0
- package/dist/admin.cjs.map +1 -0
- package/dist/admin.d.cts +14 -0
- package/dist/admin.d.cts.map +1 -0
- package/dist/admin.d.mts +14 -0
- package/dist/admin.d.mts.map +1 -0
- package/dist/admin.mjs +85 -0
- package/dist/admin.mjs.map +1 -0
- package/dist/api-key.cjs +164 -0
- package/dist/api-key.cjs.map +1 -0
- package/dist/api-key.d.cts +42 -0
- package/dist/api-key.d.cts.map +1 -0
- package/dist/api-key.d.mts +42 -0
- package/dist/api-key.d.mts.map +1 -0
- package/dist/api-key.mjs +160 -0
- package/dist/api-key.mjs.map +1 -0
- package/dist/auth-contracts-Brh_Qko9.d.cts +1654 -0
- package/dist/auth-contracts-Brh_Qko9.d.cts.map +1 -0
- package/dist/auth-contracts-Cz7C4_Ch.d.mts +1654 -0
- package/dist/auth-contracts-Cz7C4_Ch.d.mts.map +1 -0
- package/dist/auth-decorators-B1mFnGJ6.mjs +284 -0
- package/dist/auth-decorators-B1mFnGJ6.mjs.map +1 -0
- package/dist/auth-decorators-Cu_nxWnF.cjs +421 -0
- package/dist/auth-decorators-Cu_nxWnF.cjs.map +1 -0
- package/dist/auth-errors-C3rbTV9p.mjs +301 -0
- package/dist/auth-errors-C3rbTV9p.mjs.map +1 -0
- package/dist/auth-errors-DmiKl0L_.cjs +378 -0
- package/dist/auth-errors-DmiKl0L_.cjs.map +1 -0
- package/dist/auth-guard-CLyhAEEj.cjs +136 -0
- package/dist/auth-guard-CLyhAEEj.cjs.map +1 -0
- package/dist/auth-guard-h9QB_l11.mjs +125 -0
- package/dist/auth-guard-h9QB_l11.mjs.map +1 -0
- package/dist/auth-module-BgcY2HpA.cjs +2809 -0
- package/dist/auth-module-BgcY2HpA.cjs.map +1 -0
- package/dist/auth-module-CtHx3gRU.mjs +2708 -0
- package/dist/auth-module-CtHx3gRU.mjs.map +1 -0
- package/dist/auth-scope-interceptor-BjxAL1-S.cjs +290 -0
- package/dist/auth-scope-interceptor-BjxAL1-S.cjs.map +1 -0
- package/dist/auth-scope-interceptor-DYPn3b8M.mjs +231 -0
- package/dist/auth-scope-interceptor-DYPn3b8M.mjs.map +1 -0
- package/dist/bridge-protocol-BDw8opAG.cjs +25 -0
- package/dist/bridge-protocol-BDw8opAG.cjs.map +1 -0
- package/dist/bridge-protocol-c66aEkr5.mjs +8 -0
- package/dist/bridge-protocol-c66aEkr5.mjs.map +1 -0
- package/dist/decorate-Cr4Q7bNE.cjs +319 -0
- package/dist/decorate-Cr4Q7bNE.cjs.map +1 -0
- package/dist/decorate-Dt0e9K6R.mjs +80 -0
- package/dist/decorate-Dt0e9K6R.mjs.map +1 -0
- package/dist/express.cjs +256 -0
- package/dist/express.cjs.map +1 -0
- package/dist/express.d.cts +37 -0
- package/dist/express.d.cts.map +1 -0
- package/dist/express.d.mts +37 -0
- package/dist/express.d.mts.map +1 -0
- package/dist/express.mjs +254 -0
- package/dist/express.mjs.map +1 -0
- package/dist/fastify.cjs +218 -0
- package/dist/fastify.cjs.map +1 -0
- package/dist/fastify.d.cts +28 -0
- package/dist/fastify.d.cts.map +1 -0
- package/dist/fastify.d.mts +28 -0
- package/dist/fastify.d.mts.map +1 -0
- package/dist/fastify.mjs +216 -0
- package/dist/fastify.mjs.map +1 -0
- package/dist/graphql.cjs +509 -0
- package/dist/graphql.cjs.map +1 -0
- package/dist/graphql.d.cts +38 -0
- package/dist/graphql.d.cts.map +1 -0
- package/dist/graphql.d.mts +38 -0
- package/dist/graphql.d.mts.map +1 -0
- package/dist/graphql.mjs +503 -0
- package/dist/graphql.mjs.map +1 -0
- package/dist/index.cjs +86 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.mjs +8 -0
- package/dist/microservices.cjs +231 -0
- package/dist/microservices.cjs.map +1 -0
- package/dist/microservices.d.cts +39 -0
- package/dist/microservices.d.cts.map +1 -0
- package/dist/microservices.d.mts +39 -0
- package/dist/microservices.d.mts.map +1 -0
- package/dist/microservices.mjs +222 -0
- package/dist/microservices.mjs.map +1 -0
- package/dist/organization.cjs +191 -0
- package/dist/organization.cjs.map +1 -0
- package/dist/organization.d.cts +40 -0
- package/dist/organization.d.cts.map +1 -0
- package/dist/organization.d.mts +40 -0
- package/dist/organization.d.mts.map +1 -0
- package/dist/organization.mjs +177 -0
- package/dist/organization.mjs.map +1 -0
- package/dist/platform-CZl7TY8j.mjs +414 -0
- package/dist/platform-CZl7TY8j.mjs.map +1 -0
- package/dist/platform-YICqqYv6.cjs +473 -0
- package/dist/platform-YICqqYv6.cjs.map +1 -0
- package/dist/platform.cjs +10 -0
- package/dist/platform.d.cts +43 -0
- package/dist/platform.d.cts.map +1 -0
- package/dist/platform.d.mts +43 -0
- package/dist/platform.d.mts.map +1 -0
- package/dist/platform.mjs +1 -0
- package/dist/plugin.cjs +323 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.cts +24 -0
- package/dist/plugin.d.cts.map +1 -0
- package/dist/plugin.d.mts +24 -0
- package/dist/plugin.d.mts.map +1 -0
- package/dist/plugin.mjs +321 -0
- package/dist/plugin.mjs.map +1 -0
- package/dist/principal-readings-Chmt6rQV.cjs +208 -0
- package/dist/principal-readings-Chmt6rQV.cjs.map +1 -0
- package/dist/principal-readings-Ied2staw.mjs +191 -0
- package/dist/principal-readings-Ied2staw.mjs.map +1 -0
- package/dist/rolldown-runtime-VH7oDXx4.cjs +28 -0
- package/dist/testing/conformance.cjs +6214 -0
- package/dist/testing/conformance.cjs.map +1 -0
- package/dist/testing/conformance.d.cts +528 -0
- package/dist/testing/conformance.d.cts.map +1 -0
- package/dist/testing/conformance.d.mts +528 -0
- package/dist/testing/conformance.d.mts.map +1 -0
- package/dist/testing/conformance.mjs +6204 -0
- package/dist/testing/conformance.mjs.map +1 -0
- package/dist/testing.cjs +221 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +64 -0
- package/dist/testing.d.cts.map +1 -0
- package/dist/testing.d.mts +64 -0
- package/dist/testing.d.mts.map +1 -0
- package/dist/testing.mjs +214 -0
- package/dist/testing.mjs.map +1 -0
- package/dist/websockets.cjs +396 -0
- package/dist/websockets.cjs.map +1 -0
- package/dist/websockets.d.cts +67 -0
- package/dist/websockets.d.cts.map +1 -0
- package/dist/websockets.d.mts +67 -0
- package/dist/websockets.d.mts.map +1 -0
- package/dist/websockets.mjs +383 -0
- package/dist/websockets.mjs.map +1 -0
- package/package.json +327 -3
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { c as isConfigurationError, n as BetterAuthConfigurationError } from "./auth-errors-C3rbTV9p.mjs";
|
|
2
|
+
import { IntrinsicException } from "@nestjs/common";
|
|
3
|
+
//#region src/principal-readings.ts
|
|
4
|
+
const RESOLUTION = Symbol.for("@nestjs-kit/better-auth:resolution");
|
|
5
|
+
const TEST_STAMP = Symbol.for("@nestjs-kit/better-auth:test-stamp");
|
|
6
|
+
function object(value) {
|
|
7
|
+
return value !== null && (typeof value === "object" || typeof value === "function");
|
|
8
|
+
}
|
|
9
|
+
function records(target, create = false) {
|
|
10
|
+
let value = Reflect.get(target, RESOLUTION);
|
|
11
|
+
if (!value && create) {
|
|
12
|
+
value = {
|
|
13
|
+
own: /* @__PURE__ */ new Map(),
|
|
14
|
+
positions: /* @__PURE__ */ new Map()
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(target, RESOLUTION, { value });
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function sameElements(stamp, args) {
|
|
21
|
+
return stamp.elements.length === args.length && stamp.elements.every((value, index) => value === args[index]);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The stamp of this invocation: the one on the args array itself (WS, RPC and GraphQL guards and interceptors share
|
|
25
|
+
* that array), or one on its elements when the elements identify the invocation. That takes at least two object
|
|
26
|
+
* elements (an HTTP request and its response): a lone object, such as a WS socket beside a primitive payload, is shared
|
|
27
|
+
* by every message on its connection, so a stamp found only through it may belong to another invocation.
|
|
28
|
+
*/
|
|
29
|
+
function matchingStamp(args) {
|
|
30
|
+
const own = Reflect.get(args, TEST_STAMP);
|
|
31
|
+
if (own && sameElements(own, args)) return own;
|
|
32
|
+
const objects = args.filter(object);
|
|
33
|
+
if (objects.length < 2) return;
|
|
34
|
+
for (const target of objects) {
|
|
35
|
+
const stamp = Reflect.get(target, TEST_STAMP);
|
|
36
|
+
if (stamp && sameElements(stamp, args)) return stamp;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function lineageFromArgs(args) {
|
|
40
|
+
const targets = [args, ...args.filter(object)];
|
|
41
|
+
for (const target of targets) {
|
|
42
|
+
const own = records(target)?.invocationLineage;
|
|
43
|
+
if (own) return own;
|
|
44
|
+
}
|
|
45
|
+
for (const target of targets) {
|
|
46
|
+
const carrier = records(target)?.lineage;
|
|
47
|
+
if (!carrier) continue;
|
|
48
|
+
for (const position of carrier.enclosing(args)) return {
|
|
49
|
+
...carrier,
|
|
50
|
+
position
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** The intrinsic twin suppresses Nest's repeated log, while retaining the safe wire shape. */
|
|
55
|
+
var RepeatedReaderError = class extends IntrinsicException {
|
|
56
|
+
constructor(error) {
|
|
57
|
+
super(error.message);
|
|
58
|
+
Object.defineProperties(this, Object.getOwnPropertyDescriptors(error));
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
var PrincipalReadings = class {
|
|
62
|
+
scope;
|
|
63
|
+
constructor(scope) {
|
|
64
|
+
this.scope = scope;
|
|
65
|
+
}
|
|
66
|
+
record(call, reading) {
|
|
67
|
+
const record = records(call.invocation, true);
|
|
68
|
+
record.own.set(reading.instance, reading);
|
|
69
|
+
if (call.lineage) {
|
|
70
|
+
record.invocationLineage = call.lineage;
|
|
71
|
+
this.recordLineage(call.lineage, reading);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
recordLineage(lineage, reading) {
|
|
75
|
+
const value = records(lineage.carrier, true);
|
|
76
|
+
value.positions.set(lineage.position, reading);
|
|
77
|
+
value.lineage = lineage;
|
|
78
|
+
}
|
|
79
|
+
enclosing(lineage, args) {
|
|
80
|
+
const positions = records(lineage.carrier)?.positions;
|
|
81
|
+
for (const position of lineage.enclosing(args)) {
|
|
82
|
+
const reading = positions?.get(position);
|
|
83
|
+
if (reading) return reading;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
read(input) {
|
|
87
|
+
const { plan, args, call } = input;
|
|
88
|
+
const lineage = input.lineage ?? call?.lineage;
|
|
89
|
+
let resolvedInstance = plan?.instance;
|
|
90
|
+
try {
|
|
91
|
+
if (plan?.access === "public") return {
|
|
92
|
+
outcome: "no-identity",
|
|
93
|
+
instance: plan.instance
|
|
94
|
+
};
|
|
95
|
+
let reading;
|
|
96
|
+
let validation = lineage ?? lineageFromArgs(args);
|
|
97
|
+
if (plan?.access === "inherit") reading = lineage && this.enclosing(lineage, args);
|
|
98
|
+
else {
|
|
99
|
+
const targets = call ? [call.invocation] : [args, ...args.filter(object)];
|
|
100
|
+
for (const target of targets) {
|
|
101
|
+
const own = records(target)?.own;
|
|
102
|
+
reading = plan ? own?.get(plan.instance) : own?.size === 1 ? own.values().next().value : void 0;
|
|
103
|
+
if (reading) break;
|
|
104
|
+
}
|
|
105
|
+
if (!reading && !plan) for (const target of [args, ...args.filter(object)]) {
|
|
106
|
+
const candidate = records(target)?.lineage;
|
|
107
|
+
if (!candidate) continue;
|
|
108
|
+
reading = this.enclosing(candidate, args);
|
|
109
|
+
if (reading) {
|
|
110
|
+
validation = candidate;
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (!reading) {
|
|
116
|
+
const stamp = matchingStamp(args);
|
|
117
|
+
const instance = plan?.instance ?? "default";
|
|
118
|
+
const result = stamp?.results.get(instance);
|
|
119
|
+
if (result) reading = {
|
|
120
|
+
...result,
|
|
121
|
+
instance
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
if (!reading) throw BetterAuthConfigurationError.atRequest(input.beforeGuard && plan?.access !== "inherit" ? "PRINCIPAL_READ_BEFORE_GUARD" : "NO_AUTH_RESULT", "No authentication result: BetterAuthGuard did not run for this invocation", {
|
|
125
|
+
site: plan?.site ?? input.site,
|
|
126
|
+
hint: "Run BetterAuthGuard before reading a principal; test replacements must stampPrincipal()."
|
|
127
|
+
});
|
|
128
|
+
resolvedInstance = reading.instance;
|
|
129
|
+
if (reading.outcome === "authenticated") validation?.assertReadable?.(args);
|
|
130
|
+
return reading;
|
|
131
|
+
} catch (error) {
|
|
132
|
+
if (isConfigurationError(error)) throw this.deliver(error, input, resolvedInstance);
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
current() {
|
|
137
|
+
const state = this.scope.current();
|
|
138
|
+
if (!state?.reading) throw BetterAuthConfigurationError.atRequest("NO_AUTH_SCOPE", "Principal readers require a handler scope");
|
|
139
|
+
return state.reading();
|
|
140
|
+
}
|
|
141
|
+
project(reading, spec, input) {
|
|
142
|
+
if (reading.outcome === "no-identity" || reading.outcome === "absent") return null;
|
|
143
|
+
if (reading.outcome === "rejected") throw reading.failure;
|
|
144
|
+
if (spec.kind && reading.principal.kind !== spec.kind) {
|
|
145
|
+
const error = BetterAuthConfigurationError.atRequest(spec.reason ?? "PRINCIPAL_KIND_REQUIRED", `This reader requires principal kind ${spec.kind}`, {
|
|
146
|
+
site: spec.site,
|
|
147
|
+
hint: "Use @CurrentPrincipal() or getPrincipal() and narrow p.kind."
|
|
148
|
+
});
|
|
149
|
+
throw this.deliver(error, input, reading.instance);
|
|
150
|
+
}
|
|
151
|
+
return spec.project(reading.principal);
|
|
152
|
+
}
|
|
153
|
+
deliver(error, input, instance) {
|
|
154
|
+
const state = this.scope.current();
|
|
155
|
+
const call = state?.call ?? input?.call;
|
|
156
|
+
const lineage = call?.lineage ?? input?.lineage ?? (input && lineageFromArgs(input.args));
|
|
157
|
+
const key = call?.key ?? lineage?.carrier ?? input?.args;
|
|
158
|
+
if (!key) return error;
|
|
159
|
+
return this.scope.surfaced(key, error, {
|
|
160
|
+
instance: instance ?? state?.plan?.instance ?? input?.plan?.instance ?? "default",
|
|
161
|
+
site: error.site ?? input?.site ?? input?.plan?.site ?? "principal reader",
|
|
162
|
+
lineage
|
|
163
|
+
}) ? new RepeatedReaderError(error) : error;
|
|
164
|
+
}
|
|
165
|
+
stamp(args, instance, result) {
|
|
166
|
+
stampResult(args, instance, result);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
/** Test stamps are verified by array or element identity (see matchingStamp), so a stamp never leaks into another invocation. */
|
|
170
|
+
function stampResult(args, instance, result) {
|
|
171
|
+
const stamp = matchingStamp(args) ?? {
|
|
172
|
+
elements: [...args],
|
|
173
|
+
results: /* @__PURE__ */ new Map()
|
|
174
|
+
};
|
|
175
|
+
stamp.results.set(instance, result);
|
|
176
|
+
for (const target of [args, ...args]) if (object(target) && Object.isExtensible(target)) Object.defineProperty(target, TEST_STAMP, {
|
|
177
|
+
value: stamp,
|
|
178
|
+
configurable: true
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
function stampedReading(args, instance) {
|
|
182
|
+
const result = matchingStamp(args)?.results.get(instance);
|
|
183
|
+
return result ? {
|
|
184
|
+
...result,
|
|
185
|
+
instance
|
|
186
|
+
} : void 0;
|
|
187
|
+
}
|
|
188
|
+
//#endregion
|
|
189
|
+
export { stampResult as n, stampedReading as r, PrincipalReadings as t };
|
|
190
|
+
|
|
191
|
+
//# sourceMappingURL=principal-readings-Ied2staw.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principal-readings-Ied2staw.mjs","names":[],"sources":["../src/principal-readings.ts"],"sourcesContent":["import { IntrinsicException } from \"@nestjs/common\";\nimport type {\n InvocationLineage,\n PrincipalReading,\n PrincipalResult,\n RoutePlan,\n TransportCall,\n} from \"./auth-contracts.js\";\nimport {\n BetterAuthConfigurationError,\n isConfigurationError,\n} from \"./auth-errors.js\";\nimport type { AuthPrincipal } from \"./auth-types.js\";\nimport { RequestScope } from \"./request-scope.js\";\n\nconst RESOLUTION = Symbol.for(\"@nestjs-kit/better-auth:resolution\");\nconst TEST_STAMP = Symbol.for(\"@nestjs-kit/better-auth:test-stamp\");\ninterface Records {\n own: Map<string, PrincipalReading>;\n positions: Map<string, PrincipalReading>;\n lineage?: InvocationLineage;\n invocationLineage?: InvocationLineage;\n}\ninterface TestStamp {\n elements: readonly unknown[];\n results: Map<string, PrincipalResult>;\n}\nexport interface ReadingInput {\n readonly args: readonly unknown[];\n readonly call?: TransportCall;\n readonly lineage?: InvocationLineage;\n readonly plan?: Pick<RoutePlan, \"access\" | \"instance\" | \"site\">;\n readonly beforeGuard?: boolean;\n readonly site?: string;\n}\n\nfunction object(value: unknown): value is object {\n return (\n value !== null && (typeof value === \"object\" || typeof value === \"function\")\n );\n}\nfunction records(target: object, create = false): Records | undefined {\n let value = Reflect.get(target, RESOLUTION) as Records | undefined;\n if (!value && create) {\n value = { own: new Map(), positions: new Map() };\n Object.defineProperty(target, RESOLUTION, { value });\n }\n return value;\n}\nfunction sameElements(stamp: TestStamp, args: readonly unknown[]): boolean {\n return (\n stamp.elements.length === args.length &&\n stamp.elements.every((value, index) => value === args[index])\n );\n}\n\n/**\n * The stamp of this invocation: the one on the args array itself (WS, RPC and GraphQL guards and interceptors share\n * that array), or one on its elements when the elements identify the invocation. That takes at least two object\n * elements (an HTTP request and its response): a lone object, such as a WS socket beside a primitive payload, is shared\n * by every message on its connection, so a stamp found only through it may belong to another invocation.\n */\nfunction matchingStamp(args: readonly unknown[]): TestStamp | undefined {\n const own = Reflect.get(args, TEST_STAMP) as TestStamp | undefined;\n if (own && sameElements(own, args)) {\n return own;\n }\n const objects = args.filter(object);\n if (objects.length < 2) {\n return undefined;\n }\n for (const target of objects) {\n const stamp = Reflect.get(target, TEST_STAMP) as TestStamp | undefined;\n if (stamp && sameElements(stamp, args)) {\n return stamp;\n }\n }\n return undefined;\n}\n\nfunction lineageFromArgs(\n args: readonly unknown[],\n): InvocationLineage | undefined {\n const targets = [args, ...args.filter(object)];\n for (const target of targets) {\n const own = records(target)?.invocationLineage;\n if (own) {\n return own;\n }\n }\n for (const target of targets) {\n const carrier = records(target)?.lineage;\n if (!carrier) {\n continue;\n }\n // The recorded callback is structural, but its recorded position may belong\n // to a sibling operation in the same batched GraphQL carrier.\n for (const position of carrier.enclosing(args)) {\n return { ...carrier, position };\n }\n }\n return undefined;\n}\n\n/** The intrinsic twin suppresses Nest's repeated log, while retaining the safe wire shape. */\nexport class RepeatedReaderError extends IntrinsicException {\n constructor(error: BetterAuthConfigurationError) {\n super(error.message);\n Object.defineProperties(this, Object.getOwnPropertyDescriptors(error));\n }\n}\n\nexport class PrincipalReadings {\n constructor(private readonly scope: RequestScope) {}\n\n record(\n call: Pick<TransportCall, \"invocation\" | \"lineage\">,\n reading: PrincipalReading,\n ): void {\n const record = records(call.invocation, true)!;\n record.own.set(reading.instance, reading);\n if (call.lineage) {\n record.invocationLineage = call.lineage;\n this.recordLineage(call.lineage, reading);\n }\n }\n\n recordLineage(lineage: InvocationLineage, reading: PrincipalReading): void {\n const value = records(lineage.carrier, true)!;\n value.positions.set(lineage.position, reading);\n value.lineage = lineage;\n }\n\n enclosing(\n lineage: InvocationLineage,\n args: readonly unknown[],\n ): PrincipalReading | undefined {\n const positions = records(lineage.carrier)?.positions;\n for (const position of lineage.enclosing(args)) {\n const reading = positions?.get(position);\n if (reading) {\n return reading;\n }\n }\n return undefined;\n }\n\n read(input: ReadingInput): PrincipalReading {\n const { plan, args, call } = input;\n const lineage = input.lineage ?? call?.lineage;\n let resolvedInstance = plan?.instance;\n try {\n if (plan?.access === \"public\") {\n return { outcome: \"no-identity\", instance: plan.instance };\n }\n let reading: PrincipalReading | undefined;\n let validation = lineage ?? lineageFromArgs(args);\n if (plan?.access === \"inherit\") {\n reading = lineage && this.enclosing(lineage, args);\n } else {\n const targets = call\n ? [call.invocation]\n : [args, ...args.filter(object)];\n for (const target of targets) {\n const own = records(target)?.own;\n reading = plan\n ? own?.get(plan.instance)\n : own?.size === 1\n ? own.values().next().value\n : undefined;\n if (reading) {\n break;\n }\n }\n if (!reading && !plan) {\n for (const target of [args, ...args.filter(object)]) {\n const candidate = records(target)?.lineage;\n if (!candidate) {\n continue;\n }\n reading = this.enclosing(candidate, args);\n if (reading) {\n validation = candidate;\n break;\n }\n }\n }\n }\n if (!reading) {\n const stamp = matchingStamp(args);\n const instance = plan?.instance ?? \"default\";\n const result = stamp?.results.get(instance);\n if (result) {\n reading = { ...result, instance };\n }\n }\n if (!reading) {\n throw BetterAuthConfigurationError.atRequest(\n input.beforeGuard && plan?.access !== \"inherit\"\n ? \"PRINCIPAL_READ_BEFORE_GUARD\"\n : \"NO_AUTH_RESULT\",\n \"No authentication result: BetterAuthGuard did not run for this invocation\",\n {\n site: plan?.site ?? input.site,\n hint: \"Run BetterAuthGuard before reading a principal; test replacements must stampPrincipal().\",\n },\n );\n }\n resolvedInstance = reading.instance;\n if (reading.outcome === \"authenticated\") {\n validation?.assertReadable?.(args);\n }\n return reading;\n } catch (error) {\n if (isConfigurationError(error)) {\n throw this.deliver(error, input, resolvedInstance);\n }\n throw error;\n }\n }\n\n current(): PrincipalReading {\n const state = this.scope.current();\n if (!state?.reading) {\n throw BetterAuthConfigurationError.atRequest(\n \"NO_AUTH_SCOPE\",\n \"Principal readers require a handler scope\",\n );\n }\n return state.reading();\n }\n\n project<T>(\n reading: PrincipalReading,\n spec: {\n kind?: string;\n reason?: string;\n site: string;\n project: (principal: AuthPrincipal) => T;\n },\n input?: ReadingInput,\n ): T | null {\n if (reading.outcome === \"no-identity\" || reading.outcome === \"absent\") {\n return null;\n }\n if (reading.outcome === \"rejected\") {\n throw reading.failure;\n }\n if (spec.kind && reading.principal.kind !== spec.kind) {\n const error = BetterAuthConfigurationError.atRequest(\n spec.reason ?? \"PRINCIPAL_KIND_REQUIRED\",\n `This reader requires principal kind ${spec.kind}`,\n {\n site: spec.site,\n hint: \"Use @CurrentPrincipal() or getPrincipal() and narrow p.kind.\",\n },\n );\n throw this.deliver(error, input, reading.instance);\n }\n return spec.project(reading.principal);\n }\n\n deliver(\n error: BetterAuthConfigurationError,\n input?: ReadingInput,\n instance?: string,\n ): BetterAuthConfigurationError | RepeatedReaderError {\n const state = this.scope.current();\n const call = state?.call ?? input?.call;\n const lineage =\n call?.lineage ?? input?.lineage ?? (input && lineageFromArgs(input.args));\n const key = call?.key ?? lineage?.carrier ?? input?.args;\n if (!key) {\n return error;\n }\n const repeated = this.scope.surfaced(key, error, {\n instance:\n instance ?? state?.plan?.instance ?? input?.plan?.instance ?? \"default\",\n site:\n error.site ?? input?.site ?? input?.plan?.site ?? \"principal reader\",\n lineage,\n });\n return repeated ? new RepeatedReaderError(error) : error;\n }\n\n stamp(\n args: readonly unknown[],\n instance: string,\n result: PrincipalResult,\n ): void {\n stampResult(args, instance, result);\n }\n}\n\n/** Test stamps are verified by array or element identity (see matchingStamp), so a stamp never leaks into another invocation. */\nexport function stampResult(\n args: readonly unknown[],\n instance: string,\n result: PrincipalResult,\n): void {\n const stamp = matchingStamp(args) ?? {\n elements: [...args],\n results: new Map(),\n };\n stamp.results.set(instance, result);\n for (const target of [args, ...args]) {\n if (object(target) && Object.isExtensible(target)) {\n Object.defineProperty(target, TEST_STAMP, {\n value: stamp,\n configurable: true,\n });\n }\n }\n}\n\nexport function stampedReading(\n args: readonly unknown[],\n instance: string,\n): PrincipalReading | undefined {\n const result = matchingStamp(args)?.results.get(instance);\n return result ? { ...result, instance } : undefined;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
10
|
+
key = keys[i];
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
12
|
+
get: ((k) => from[k]).bind(null, key),
|
|
13
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
|
|
19
|
+
value: mod,
|
|
20
|
+
enumerable: true
|
|
21
|
+
}) : target, mod));
|
|
22
|
+
//#endregion
|
|
23
|
+
Object.defineProperty(exports, "__toESM", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
get: function() {
|
|
26
|
+
return __toESM;
|
|
27
|
+
}
|
|
28
|
+
});
|