@keycardai/oauth 0.19.0 → 0.21.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 +65 -4
- package/dist/cjs/discovery.d.ts +21 -0
- package/dist/cjs/discovery.d.ts.map +1 -1
- package/dist/cjs/discovery.js +8 -0
- package/dist/cjs/discovery.js.map +1 -1
- package/dist/cjs/errors.d.ts +17 -0
- package/dist/cjs/errors.d.ts.map +1 -1
- package/dist/cjs/errors.js +26 -1
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/index.d.ts +5 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +8 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/pkce.d.ts +5 -0
- package/dist/cjs/pkce.d.ts.map +1 -1
- package/dist/cjs/pkce.js +4 -1
- package/dist/cjs/pkce.js.map +1 -1
- package/dist/cjs/server/eksWorkloadIdentity.d.ts +7 -6
- package/dist/cjs/server/eksWorkloadIdentity.d.ts.map +1 -1
- package/dist/cjs/server/eksWorkloadIdentity.js +11 -95
- package/dist/cjs/server/eksWorkloadIdentity.js.map +1 -1
- package/dist/cjs/server/index.d.ts +2 -0
- package/dist/cjs/server/index.d.ts.map +1 -1
- package/dist/cjs/server/index.js +13 -1
- package/dist/cjs/server/index.js.map +1 -1
- package/dist/cjs/server/workloadIdentity.d.ts +166 -0
- package/dist/cjs/server/workloadIdentity.d.ts.map +1 -0
- package/dist/cjs/server/workloadIdentity.js +355 -0
- package/dist/cjs/server/workloadIdentity.js.map +1 -0
- package/dist/cjs/tokenExchange.d.ts +6 -0
- package/dist/cjs/tokenExchange.d.ts.map +1 -1
- package/dist/cjs/tokenExchange.js +2 -0
- package/dist/cjs/tokenExchange.js.map +1 -1
- package/dist/cjs/userinfo.d.ts +35 -0
- package/dist/cjs/userinfo.d.ts.map +1 -0
- package/dist/cjs/userinfo.js +79 -0
- package/dist/cjs/userinfo.js.map +1 -0
- package/dist/cjs/webApp.d.ts +78 -0
- package/dist/cjs/webApp.d.ts.map +1 -0
- package/dist/cjs/webApp.js +95 -0
- package/dist/cjs/webApp.js.map +1 -0
- package/dist/esm/discovery.d.ts +21 -0
- package/dist/esm/discovery.d.ts.map +1 -1
- package/dist/esm/discovery.js +8 -0
- package/dist/esm/discovery.js.map +1 -1
- package/dist/esm/errors.d.ts +17 -0
- package/dist/esm/errors.d.ts.map +1 -1
- package/dist/esm/errors.js +23 -0
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.d.ts +5 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/pkce.d.ts +5 -0
- package/dist/esm/pkce.d.ts.map +1 -1
- package/dist/esm/pkce.js +4 -1
- package/dist/esm/pkce.js.map +1 -1
- package/dist/esm/server/eksWorkloadIdentity.d.ts +7 -6
- package/dist/esm/server/eksWorkloadIdentity.d.ts.map +1 -1
- package/dist/esm/server/eksWorkloadIdentity.js +11 -62
- package/dist/esm/server/eksWorkloadIdentity.js.map +1 -1
- package/dist/esm/server/index.d.ts +2 -0
- package/dist/esm/server/index.d.ts.map +1 -1
- package/dist/esm/server/index.js +1 -0
- package/dist/esm/server/index.js.map +1 -1
- package/dist/esm/server/workloadIdentity.d.ts +166 -0
- package/dist/esm/server/workloadIdentity.d.ts.map +1 -0
- package/dist/esm/server/workloadIdentity.js +312 -0
- package/dist/esm/server/workloadIdentity.js.map +1 -0
- package/dist/esm/tokenExchange.d.ts +6 -0
- package/dist/esm/tokenExchange.d.ts.map +1 -1
- package/dist/esm/tokenExchange.js +2 -0
- package/dist/esm/tokenExchange.js.map +1 -1
- package/dist/esm/userinfo.d.ts +35 -0
- package/dist/esm/userinfo.d.ts.map +1 -0
- package/dist/esm/userinfo.js +76 -0
- package/dist/esm/userinfo.js.map +1 -0
- package/dist/esm/webApp.d.ts +78 -0
- package/dist/esm/webApp.d.ts.map +1 -0
- package/dist/esm/webApp.js +88 -0
- package/dist/esm/webApp.js.map +1 -0
- package/package.json +12 -2
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _FileTokenSource_tokenFilePath, _GCPMetadataTokenSource_audience, _GCPMetadataTokenSource_metadataUrl, _GCPMetadataTokenSource_timeoutMs, _FlyTokenSource_audience, _FlyTokenSource_socketPath, _WorkloadIdentity_instances, _WorkloadIdentity_source, _WorkloadIdentity_clientId, _WorkloadIdentity_fetchIdentityToken;
|
|
13
|
+
import * as fs from "node:fs";
|
|
14
|
+
/**
|
|
15
|
+
* Source identifiers carried on WorkloadIdentityConfigurationError and
|
|
16
|
+
* WorkloadIdentityRuntimeError, for branching on which token source failed.
|
|
17
|
+
*/
|
|
18
|
+
export const WORKLOAD_IDENTITY_SOURCE_FILE = "file";
|
|
19
|
+
export const WORKLOAD_IDENTITY_SOURCE_GCP_METADATA = "gcp-metadata";
|
|
20
|
+
export const WORKLOAD_IDENTITY_SOURCE_FLY = "fly";
|
|
21
|
+
export const WORKLOAD_IDENTITY_SOURCE_CUSTOM = "custom";
|
|
22
|
+
/**
|
|
23
|
+
* A workload identity credential or token source was misconfigured at
|
|
24
|
+
* construction: a missing or empty token file, no discovery environment
|
|
25
|
+
* variable set, a missing required audience, or an invalid source.
|
|
26
|
+
*
|
|
27
|
+
* `source` identifies the token source ("file", "gcp-metadata", "fly");
|
|
28
|
+
* undefined when the fault is in the credential itself. The underlying cause,
|
|
29
|
+
* when any, is on `cause`.
|
|
30
|
+
*/
|
|
31
|
+
export class WorkloadIdentityConfigurationError extends Error {
|
|
32
|
+
constructor(message, options) {
|
|
33
|
+
super(message);
|
|
34
|
+
this.name = "WorkloadIdentityConfigurationError";
|
|
35
|
+
this.source = options?.source;
|
|
36
|
+
this.cause = options?.cause;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The subject token could not be obtained at request time: the token file was
|
|
41
|
+
* rotated away or emptied after construction, or the platform endpoint was
|
|
42
|
+
* unreachable. Distinct from WorkloadIdentityConfigurationError, which is a
|
|
43
|
+
* construction-time fault.
|
|
44
|
+
*
|
|
45
|
+
* `source` identifies the token source ("file", "gcp-metadata", "fly", or
|
|
46
|
+
* "custom" for a source whose error is not one of this module's typed
|
|
47
|
+
* errors). The underlying cause, when any, is on `cause`.
|
|
48
|
+
*/
|
|
49
|
+
export class WorkloadIdentityRuntimeError extends Error {
|
|
50
|
+
constructor(message, options) {
|
|
51
|
+
super(message);
|
|
52
|
+
this.name = "WorkloadIdentityRuntimeError";
|
|
53
|
+
this.source = options?.source;
|
|
54
|
+
this.cause = options?.cause;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export const DEFAULT_FILE_TOKEN_ENV_VARS = [
|
|
58
|
+
"KEYCARD_EKS_WORKLOAD_IDENTITY_TOKEN_FILE",
|
|
59
|
+
"AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE",
|
|
60
|
+
"AWS_WEB_IDENTITY_TOKEN_FILE",
|
|
61
|
+
"AZURE_FEDERATED_TOKEN_FILE",
|
|
62
|
+
];
|
|
63
|
+
/** @internal Shared by FileTokenSource and the deprecated EKSWorkloadIdentity. */
|
|
64
|
+
export function resolveTokenFilePath(discoveryEnvVars, options) {
|
|
65
|
+
if (options?.tokenFilePath) {
|
|
66
|
+
return options.tokenFilePath;
|
|
67
|
+
}
|
|
68
|
+
const envNames = options?.envVarName
|
|
69
|
+
? [options.envVarName, ...discoveryEnvVars]
|
|
70
|
+
: discoveryEnvVars;
|
|
71
|
+
const found = envNames.find((name) => process.env[name]);
|
|
72
|
+
if (!found || !process.env[found]) {
|
|
73
|
+
throw new WorkloadIdentityConfigurationError(`Could not find token file path in environment variables; checked: ${envNames.join(", ")}`, { source: WORKLOAD_IDENTITY_SOURCE_FILE });
|
|
74
|
+
}
|
|
75
|
+
return process.env[found];
|
|
76
|
+
}
|
|
77
|
+
function readTokenFile(tokenFilePath, errorClass) {
|
|
78
|
+
let contents;
|
|
79
|
+
try {
|
|
80
|
+
contents = fs.readFileSync(tokenFilePath, "utf-8");
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
throw new errorClass(`Error reading token file: ${tokenFilePath}`, {
|
|
84
|
+
source: WORKLOAD_IDENTITY_SOURCE_FILE,
|
|
85
|
+
cause: error,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const token = contents.trim();
|
|
89
|
+
if (!token) {
|
|
90
|
+
throw new errorClass(`Token file is empty: ${tokenFilePath}`, {
|
|
91
|
+
source: WORKLOAD_IDENTITY_SOURCE_FILE,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return token;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Reads a platform-projected OIDC token from a mounted file, fresh on every
|
|
98
|
+
* call (platforms rotate projected tokens). Covers EKS pod identity, AKS
|
|
99
|
+
* workload identity, any Kubernetes projected service-account token, and CI
|
|
100
|
+
* providers that write the token to a file.
|
|
101
|
+
*
|
|
102
|
+
* When no explicit path is given, the path is discovered from the first set
|
|
103
|
+
* environment variable: the variable named by `envVarName` when given, then
|
|
104
|
+
* KEYCARD_EKS_WORKLOAD_IDENTITY_TOKEN_FILE, AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE,
|
|
105
|
+
* AWS_WEB_IDENTITY_TOKEN_FILE, and AZURE_FEDERATED_TOKEN_FILE.
|
|
106
|
+
*
|
|
107
|
+
* **Requires Node.js.** Validates at construction that the resolved file
|
|
108
|
+
* exists and is non-empty.
|
|
109
|
+
*/
|
|
110
|
+
export class FileTokenSource {
|
|
111
|
+
constructor(options) {
|
|
112
|
+
_FileTokenSource_tokenFilePath.set(this, void 0);
|
|
113
|
+
__classPrivateFieldSet(this, _FileTokenSource_tokenFilePath, resolveTokenFilePath(DEFAULT_FILE_TOKEN_ENV_VARS, options), "f");
|
|
114
|
+
readTokenFile(__classPrivateFieldGet(this, _FileTokenSource_tokenFilePath, "f"), WorkloadIdentityConfigurationError);
|
|
115
|
+
}
|
|
116
|
+
/** Re-reads the token file and returns its trimmed contents. */
|
|
117
|
+
async identityToken() {
|
|
118
|
+
return readTokenFile(__classPrivateFieldGet(this, _FileTokenSource_tokenFilePath, "f"), WorkloadIdentityRuntimeError);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
_FileTokenSource_tokenFilePath = new WeakMap();
|
|
122
|
+
const DEFAULT_GCP_METADATA_URL = "http://metadata.google.internal";
|
|
123
|
+
const DEFAULT_GCP_TIMEOUT_MS = 5000;
|
|
124
|
+
const GCP_IDENTITY_PATH = "/computeMetadata/v1/instance/service-accounts/default/identity";
|
|
125
|
+
/**
|
|
126
|
+
* Fetches an OIDC identity token for the default service account from the
|
|
127
|
+
* GCP metadata server. Covers GKE, GCE, and Cloud Run.
|
|
128
|
+
*/
|
|
129
|
+
export class GCPMetadataTokenSource {
|
|
130
|
+
constructor(options) {
|
|
131
|
+
_GCPMetadataTokenSource_audience.set(this, void 0);
|
|
132
|
+
_GCPMetadataTokenSource_metadataUrl.set(this, void 0);
|
|
133
|
+
_GCPMetadataTokenSource_timeoutMs.set(this, void 0);
|
|
134
|
+
if (!options.audience || !options.audience.trim()) {
|
|
135
|
+
throw new WorkloadIdentityConfigurationError("audience must not be empty", {
|
|
136
|
+
source: WORKLOAD_IDENTITY_SOURCE_GCP_METADATA,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
__classPrivateFieldSet(this, _GCPMetadataTokenSource_audience, options.audience, "f");
|
|
140
|
+
__classPrivateFieldSet(this, _GCPMetadataTokenSource_metadataUrl, (options.metadataUrl ?? DEFAULT_GCP_METADATA_URL).replace(/\/$/, ""), "f");
|
|
141
|
+
__classPrivateFieldSet(this, _GCPMetadataTokenSource_timeoutMs, options.timeoutMs ?? DEFAULT_GCP_TIMEOUT_MS, "f");
|
|
142
|
+
}
|
|
143
|
+
/** Requests a GCP-signed OIDC JWT from the metadata server. */
|
|
144
|
+
async identityToken() {
|
|
145
|
+
const url = `${__classPrivateFieldGet(this, _GCPMetadataTokenSource_metadataUrl, "f")}${GCP_IDENTITY_PATH}` +
|
|
146
|
+
`?audience=${encodeURIComponent(__classPrivateFieldGet(this, _GCPMetadataTokenSource_audience, "f"))}&format=full`;
|
|
147
|
+
let response;
|
|
148
|
+
let body;
|
|
149
|
+
try {
|
|
150
|
+
response = await fetch(url, {
|
|
151
|
+
headers: { "Metadata-Flavor": "Google" },
|
|
152
|
+
signal: AbortSignal.timeout(__classPrivateFieldGet(this, _GCPMetadataTokenSource_timeoutMs, "f")),
|
|
153
|
+
});
|
|
154
|
+
body = await response.text();
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
throw new WorkloadIdentityRuntimeError(`Error calling metadata server at ${__classPrivateFieldGet(this, _GCPMetadataTokenSource_metadataUrl, "f")} (is this running on GCP?)`, { source: WORKLOAD_IDENTITY_SOURCE_GCP_METADATA, cause: error });
|
|
158
|
+
}
|
|
159
|
+
if (!response.ok) {
|
|
160
|
+
throw new WorkloadIdentityRuntimeError(`Metadata server returned status ${response.status}`, { source: WORKLOAD_IDENTITY_SOURCE_GCP_METADATA });
|
|
161
|
+
}
|
|
162
|
+
const token = body.trim();
|
|
163
|
+
if (!token) {
|
|
164
|
+
throw new WorkloadIdentityRuntimeError("Metadata server returned an empty token", {
|
|
165
|
+
source: WORKLOAD_IDENTITY_SOURCE_GCP_METADATA,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return token;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
_GCPMetadataTokenSource_audience = new WeakMap(), _GCPMetadataTokenSource_metadataUrl = new WeakMap(), _GCPMetadataTokenSource_timeoutMs = new WeakMap();
|
|
172
|
+
const DEFAULT_FLY_SOCKET_PATH = "/.fly/api";
|
|
173
|
+
const FLY_TOKEN_PATH = "/v1/tokens/oidc";
|
|
174
|
+
const FLY_TIMEOUT_MS = 5000;
|
|
175
|
+
/**
|
|
176
|
+
* Fetches an OIDC token from the Fly.io Machines API over the local Unix
|
|
177
|
+
* socket. Covers workloads running on Fly Machines.
|
|
178
|
+
*
|
|
179
|
+
* **Requires Node.js** (Unix domain sockets). The socket is not probed at
|
|
180
|
+
* construction; an unreachable Machines API surfaces as a
|
|
181
|
+
* WorkloadIdentityRuntimeError at the first fetch.
|
|
182
|
+
*/
|
|
183
|
+
export class FlyTokenSource {
|
|
184
|
+
constructor(options) {
|
|
185
|
+
_FlyTokenSource_audience.set(this, void 0);
|
|
186
|
+
_FlyTokenSource_socketPath.set(this, void 0);
|
|
187
|
+
__classPrivateFieldSet(this, _FlyTokenSource_audience, options?.audience, "f");
|
|
188
|
+
__classPrivateFieldSet(this, _FlyTokenSource_socketPath, options?.socketPath ?? DEFAULT_FLY_SOCKET_PATH, "f");
|
|
189
|
+
}
|
|
190
|
+
/** Requests a Fly-signed OIDC JWT from the Machines API. */
|
|
191
|
+
async identityToken() {
|
|
192
|
+
const http = await import("node:http");
|
|
193
|
+
const payload = JSON.stringify(__classPrivateFieldGet(this, _FlyTokenSource_audience, "f") ? { aud: __classPrivateFieldGet(this, _FlyTokenSource_audience, "f") } : {});
|
|
194
|
+
return new Promise((resolve, reject) => {
|
|
195
|
+
const request = http.request({
|
|
196
|
+
socketPath: __classPrivateFieldGet(this, _FlyTokenSource_socketPath, "f"),
|
|
197
|
+
path: FLY_TOKEN_PATH,
|
|
198
|
+
method: "POST",
|
|
199
|
+
headers: {
|
|
200
|
+
"Content-Type": "application/json",
|
|
201
|
+
"Content-Length": Buffer.byteLength(payload),
|
|
202
|
+
},
|
|
203
|
+
timeout: FLY_TIMEOUT_MS,
|
|
204
|
+
}, (response) => {
|
|
205
|
+
const chunks = [];
|
|
206
|
+
response.on("data", (chunk) => chunks.push(chunk));
|
|
207
|
+
response.on("end", () => {
|
|
208
|
+
if (response.statusCode !== 200) {
|
|
209
|
+
reject(new WorkloadIdentityRuntimeError(`Machines API returned status ${response.statusCode}`, { source: WORKLOAD_IDENTITY_SOURCE_FLY }));
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const token = Buffer.concat(chunks).toString("utf-8").trim();
|
|
213
|
+
if (!token) {
|
|
214
|
+
reject(new WorkloadIdentityRuntimeError("Machines API returned an empty token", {
|
|
215
|
+
source: WORKLOAD_IDENTITY_SOURCE_FLY,
|
|
216
|
+
}));
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
resolve(token);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
request.on("error", (error) => {
|
|
223
|
+
if (error instanceof WorkloadIdentityRuntimeError) {
|
|
224
|
+
reject(error);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
reject(new WorkloadIdentityRuntimeError(`Error calling Machines API socket ${__classPrivateFieldGet(this, _FlyTokenSource_socketPath, "f")} (is this running on a Fly Machine?)`, { source: WORKLOAD_IDENTITY_SOURCE_FLY, cause: error }));
|
|
228
|
+
});
|
|
229
|
+
request.on("timeout", () => {
|
|
230
|
+
request.destroy(new WorkloadIdentityRuntimeError(`Machines API request timed out after ${FLY_TIMEOUT_MS}ms`, { source: WORKLOAD_IDENTITY_SOURCE_FLY }));
|
|
231
|
+
});
|
|
232
|
+
request.write(payload);
|
|
233
|
+
request.end();
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
_FlyTokenSource_audience = new WeakMap(), _FlyTokenSource_socketPath = new WeakMap();
|
|
238
|
+
/**
|
|
239
|
+
* Workload identity credential using a platform-signed OIDC token obtained
|
|
240
|
+
* from a {@link IdentityTokenSource}. On every token exchange it fetches the
|
|
241
|
+
* current token from the source and attaches it as a jwt-bearer client
|
|
242
|
+
* assertion. It holds no shared secret and never caches the token across
|
|
243
|
+
* requests.
|
|
244
|
+
*
|
|
245
|
+
* @example
|
|
246
|
+
* // EKS / AKS / Kubernetes projected token (path discovered from env)
|
|
247
|
+
* const credential = new WorkloadIdentity(new FileTokenSource());
|
|
248
|
+
*
|
|
249
|
+
* // GKE / GCE / Cloud Run
|
|
250
|
+
* const credential = new WorkloadIdentity(
|
|
251
|
+
* new GCPMetadataTokenSource({ audience: "https://zone.keycard.cloud" }),
|
|
252
|
+
* );
|
|
253
|
+
*
|
|
254
|
+
* // Custom fetch
|
|
255
|
+
* const credential = new WorkloadIdentity(() => fetchMyToken());
|
|
256
|
+
*/
|
|
257
|
+
export class WorkloadIdentity {
|
|
258
|
+
constructor(source, options) {
|
|
259
|
+
_WorkloadIdentity_instances.add(this);
|
|
260
|
+
_WorkloadIdentity_source.set(this, void 0);
|
|
261
|
+
_WorkloadIdentity_clientId.set(this, void 0);
|
|
262
|
+
if (source == null) {
|
|
263
|
+
throw new WorkloadIdentityConfigurationError("identity token source must not be null");
|
|
264
|
+
}
|
|
265
|
+
if (typeof source !== "function" &&
|
|
266
|
+
typeof source.identityToken !== "function") {
|
|
267
|
+
throw new WorkloadIdentityConfigurationError("identity token source must provide identityToken() or be a function");
|
|
268
|
+
}
|
|
269
|
+
__classPrivateFieldSet(this, _WorkloadIdentity_source, source, "f");
|
|
270
|
+
__classPrivateFieldSet(this, _WorkloadIdentity_clientId, options?.clientId, "f");
|
|
271
|
+
}
|
|
272
|
+
getAuth() {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
async prepareTokenExchangeRequest(subjectToken, resource) {
|
|
276
|
+
const assertion = await __classPrivateFieldGet(this, _WorkloadIdentity_instances, "m", _WorkloadIdentity_fetchIdentityToken).call(this);
|
|
277
|
+
return {
|
|
278
|
+
subjectToken,
|
|
279
|
+
resource,
|
|
280
|
+
subjectTokenType: "urn:ietf:params:oauth:token-type:access_token",
|
|
281
|
+
clientAssertionType: "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
|
|
282
|
+
clientAssertion: assertion,
|
|
283
|
+
clientId: __classPrivateFieldGet(this, _WorkloadIdentity_clientId, "f"),
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
_WorkloadIdentity_source = new WeakMap(), _WorkloadIdentity_clientId = new WeakMap(), _WorkloadIdentity_instances = new WeakSet(), _WorkloadIdentity_fetchIdentityToken = async function _WorkloadIdentity_fetchIdentityToken() {
|
|
288
|
+
let token;
|
|
289
|
+
try {
|
|
290
|
+
token =
|
|
291
|
+
typeof __classPrivateFieldGet(this, _WorkloadIdentity_source, "f") === "function"
|
|
292
|
+
? await __classPrivateFieldGet(this, _WorkloadIdentity_source, "f").call(this)
|
|
293
|
+
: await __classPrivateFieldGet(this, _WorkloadIdentity_source, "f").identityToken();
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
if (error instanceof WorkloadIdentityConfigurationError ||
|
|
297
|
+
error instanceof WorkloadIdentityRuntimeError) {
|
|
298
|
+
throw error;
|
|
299
|
+
}
|
|
300
|
+
throw new WorkloadIdentityRuntimeError("Error fetching identity token", {
|
|
301
|
+
source: WORKLOAD_IDENTITY_SOURCE_CUSTOM,
|
|
302
|
+
cause: error,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
if (typeof token !== "string" || !token.trim()) {
|
|
306
|
+
throw new WorkloadIdentityRuntimeError("Identity token source returned an empty token", {
|
|
307
|
+
source: WORKLOAD_IDENTITY_SOURCE_CUSTOM,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
return token;
|
|
311
|
+
};
|
|
312
|
+
//# sourceMappingURL=workloadIdentity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workloadIdentity.js","sourceRoot":"","sources":["../../../src/server/workloadIdentity.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,12 @@ export interface TokenExchangeRequest {
|
|
|
20
20
|
actorTokenType?: string;
|
|
21
21
|
clientAssertion?: string;
|
|
22
22
|
clientAssertionType?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Names the application credential the client authenticates as, sent as
|
|
25
|
+
* the client_id form parameter. Used with assertion-based credentials that
|
|
26
|
+
* are resolved by ID rather than by the assertion's subject.
|
|
27
|
+
*/
|
|
28
|
+
clientId?: string;
|
|
23
29
|
}
|
|
24
30
|
export interface TokenResponse {
|
|
25
31
|
accessToken: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenExchange.d.ts","sourceRoot":"","sources":["../../src/tokenExchange.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAO9D,eAAO,MAAM,SAAS;;IAEpB;;;OAGG;;CAEK,CAAC;AACX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"tokenExchange.d.ts","sourceRoot":"","sources":["../../src/tokenExchange.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAO9D,eAAO,MAAM,SAAS;;IAEpB;;;OAGG;;CAEK,CAAC;AACX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA0BD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAqBrF;AAMD,qBAAa,mBAAmB;;gBAQlB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,0BAA0B;IAO1D,aAAa,CACjB,OAAO,EAAE,oBAAoB,EAC7B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,aAAa,CAAC;IA+CnB,WAAW,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IA+BlE;;;;OAIG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;CAuB1C"}
|
|
@@ -48,6 +48,8 @@ function serializeRequest(request) {
|
|
|
48
48
|
params.set("client_assertion", request.clientAssertion);
|
|
49
49
|
if (request.clientAssertionType)
|
|
50
50
|
params.set("client_assertion_type", request.clientAssertionType);
|
|
51
|
+
if (request.clientId)
|
|
52
|
+
params.set("client_id", request.clientId);
|
|
51
53
|
return params;
|
|
52
54
|
}
|
|
53
55
|
export function deserializeTokenResponse(json) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenExchange.js","sourceRoot":"","sources":["../../src/tokenExchange.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,gFAAgF;AAChF,kCAAkC;AAClC,gFAAgF;AAEhF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,YAAY,EAAE,+CAA+C;IAC7D;;;OAGG;IACH,eAAe,EAAE,qDAAqD;CAC9D,CAAC;
|
|
1
|
+
{"version":3,"file":"tokenExchange.js","sourceRoot":"","sources":["../../src/tokenExchange.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type OAuthAuthorizationServerMetadata } from "./discovery.js";
|
|
2
|
+
/**
|
|
3
|
+
* Claims returned by the UserInfo endpoint (OIDC Core 1.0 §5.3).
|
|
4
|
+
*
|
|
5
|
+
* Claims are returned exactly as the provider sent them: nothing is filtered
|
|
6
|
+
* to a known set. `sub` is the only claim OIDC requires and is validated
|
|
7
|
+
* present.
|
|
8
|
+
*/
|
|
9
|
+
export interface UserInfoResponse {
|
|
10
|
+
sub: string;
|
|
11
|
+
/** The full claims document as returned, `sub` included. */
|
|
12
|
+
claims: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
export interface FetchUserInfoOptions {
|
|
15
|
+
/** Pre-discovered metadata. When set, no discovery request is made. */
|
|
16
|
+
metadata?: OAuthAuthorizationServerMetadata;
|
|
17
|
+
signal?: AbortSignal;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Fetch the signed-in user's identity claims from the issuer's UserInfo
|
|
21
|
+
* endpoint (OIDC Core 1.0 §5.3).
|
|
22
|
+
*
|
|
23
|
+
* Keycard zone access tokens are authorization-only: identity claims such as
|
|
24
|
+
* `email` or `groups` are not in the token and live behind the issuer's
|
|
25
|
+
* `userinfo_endpoint`. The endpoint is resolved by discovery unless
|
|
26
|
+
* `options.metadata` is supplied, in which case the caller owns caching and
|
|
27
|
+
* refreshing that metadata.
|
|
28
|
+
*
|
|
29
|
+
* The access token is presented as a Bearer credential; the request carries no
|
|
30
|
+
* client authentication, because UserInfo authenticates the user, not the
|
|
31
|
+
* client. Signed (`application/jwt`) responses are not supported. Nothing is
|
|
32
|
+
* cached: caching claims per token is the caller's concern.
|
|
33
|
+
*/
|
|
34
|
+
export declare function fetchUserInfo(issuer: string, accessToken: string, options?: FetchUserInfoOptions): Promise<UserInfoResponse>;
|
|
35
|
+
//# sourceMappingURL=userinfo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userinfo.d.ts","sourceRoot":"","sources":["../../src/userinfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAGzG;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,uEAAuE;IACvE,QAAQ,CAAC,EAAE,gCAAgC,CAAC;IAC5C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AASD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAuE3B"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { fetchAuthorizationServerMetadata } from "./discovery.js";
|
|
2
|
+
import { HTTPError, InsufficientScopeError, InvalidTokenError, OAuthError } from "./errors.js";
|
|
3
|
+
/** Extract the RFC 6750 §3 `error` code from a `WWW-Authenticate` challenge. */
|
|
4
|
+
function challengeError(wwwAuthenticate) {
|
|
5
|
+
if (!wwwAuthenticate)
|
|
6
|
+
return "invalid_token";
|
|
7
|
+
const match = /error\s*=\s*"?([^",\s]+)"?/.exec(wwwAuthenticate);
|
|
8
|
+
return match ? match[1] : "invalid_token";
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Fetch the signed-in user's identity claims from the issuer's UserInfo
|
|
12
|
+
* endpoint (OIDC Core 1.0 §5.3).
|
|
13
|
+
*
|
|
14
|
+
* Keycard zone access tokens are authorization-only: identity claims such as
|
|
15
|
+
* `email` or `groups` are not in the token and live behind the issuer's
|
|
16
|
+
* `userinfo_endpoint`. The endpoint is resolved by discovery unless
|
|
17
|
+
* `options.metadata` is supplied, in which case the caller owns caching and
|
|
18
|
+
* refreshing that metadata.
|
|
19
|
+
*
|
|
20
|
+
* The access token is presented as a Bearer credential; the request carries no
|
|
21
|
+
* client authentication, because UserInfo authenticates the user, not the
|
|
22
|
+
* client. Signed (`application/jwt`) responses are not supported. Nothing is
|
|
23
|
+
* cached: caching claims per token is the caller's concern.
|
|
24
|
+
*/
|
|
25
|
+
export async function fetchUserInfo(issuer, accessToken, options = {}) {
|
|
26
|
+
const metadata = options.metadata
|
|
27
|
+
?? await fetchAuthorizationServerMetadata(issuer, { signal: options.signal });
|
|
28
|
+
if (!metadata.userinfo_endpoint) {
|
|
29
|
+
throw new Error(`Authorization server "${issuer}" does not advertise a userinfo_endpoint`);
|
|
30
|
+
}
|
|
31
|
+
const response = await fetch(metadata.userinfo_endpoint, {
|
|
32
|
+
method: "GET",
|
|
33
|
+
headers: {
|
|
34
|
+
Accept: "application/json",
|
|
35
|
+
Authorization: `Bearer ${accessToken}`,
|
|
36
|
+
},
|
|
37
|
+
signal: options.signal,
|
|
38
|
+
});
|
|
39
|
+
if (response.status === 401) {
|
|
40
|
+
const errorCode = challengeError(response.headers.get("www-authenticate"));
|
|
41
|
+
const message = `UserInfo request rejected with "${errorCode}": the access token is expired, ` +
|
|
42
|
+
"revoked, or not accepted at the UserInfo endpoint";
|
|
43
|
+
if (errorCode === "insufficient_scope") {
|
|
44
|
+
throw new InsufficientScopeError(message);
|
|
45
|
+
}
|
|
46
|
+
if (errorCode === "invalid_token") {
|
|
47
|
+
throw new InvalidTokenError(message);
|
|
48
|
+
}
|
|
49
|
+
throw new OAuthError(errorCode, message);
|
|
50
|
+
}
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
throw new HTTPError(`UserInfo request to "${metadata.userinfo_endpoint}" failed (HTTP ${response.status})`);
|
|
53
|
+
}
|
|
54
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
55
|
+
if (contentType.toLowerCase().includes("application/jwt")) {
|
|
56
|
+
throw new OAuthError("invalid_response", `Unsupported UserInfo response content type "${contentType}": signed and ` +
|
|
57
|
+
"encrypted UserInfo responses are not supported");
|
|
58
|
+
}
|
|
59
|
+
let json;
|
|
60
|
+
try {
|
|
61
|
+
json = await response.json();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
throw new OAuthError("invalid_response", "Malformed JSON in UserInfo response");
|
|
65
|
+
}
|
|
66
|
+
if (!json || typeof json !== "object" || Array.isArray(json)) {
|
|
67
|
+
throw new OAuthError("invalid_response", "UserInfo response must be a JSON object of claims");
|
|
68
|
+
}
|
|
69
|
+
const claims = json;
|
|
70
|
+
const sub = claims.sub;
|
|
71
|
+
if (typeof sub !== "string" || sub.length === 0) {
|
|
72
|
+
throw new OAuthError("invalid_response", "UserInfo response must include a 'sub' claim");
|
|
73
|
+
}
|
|
74
|
+
return { sub, claims };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=userinfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userinfo.js","sourceRoot":"","sources":["../../src/userinfo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { type OAuthAuthorizationServerMetadata } from "./discovery.js";
|
|
2
|
+
import type { TokenResponse } from "./tokenExchange.js";
|
|
3
|
+
export interface BeginAuthorizationOptions {
|
|
4
|
+
clientId: string;
|
|
5
|
+
/** Registered redirect URI handled by the web application. */
|
|
6
|
+
redirectUri: string;
|
|
7
|
+
/**
|
|
8
|
+
* Protected resources the authorization is targeting. Each entry is sent as
|
|
9
|
+
* its own RFC 8707 `resource` parameter, so one authorization can cover
|
|
10
|
+
* several resources and the issued token's audience covers all of them.
|
|
11
|
+
*/
|
|
12
|
+
resources?: readonly string[];
|
|
13
|
+
scopes?: readonly string[];
|
|
14
|
+
/** Pre-discovered metadata. When set, no discovery request is made. */
|
|
15
|
+
metadata?: OAuthAuthorizationServerMetadata;
|
|
16
|
+
signal?: AbortSignal;
|
|
17
|
+
}
|
|
18
|
+
export interface AuthorizationRedirect {
|
|
19
|
+
/** The authorization URL to redirect the user's browser to. */
|
|
20
|
+
url: string;
|
|
21
|
+
/** Generated CSRF value to store until the callback. */
|
|
22
|
+
state: string;
|
|
23
|
+
/** Generated PKCE verifier to store until the callback; never send it to the browser. */
|
|
24
|
+
codeVerifier: string;
|
|
25
|
+
/**
|
|
26
|
+
* The resources the authorization request was scoped to. They are not needed
|
|
27
|
+
* to redeem the code — the authorization server derives the issued token's
|
|
28
|
+
* audience from the code itself — but applications commonly need to know
|
|
29
|
+
* which resources a session was authorized for.
|
|
30
|
+
*/
|
|
31
|
+
resources: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface CompleteAuthorizationOptions {
|
|
34
|
+
/** Query parameters the callback route received. */
|
|
35
|
+
callbackParams: URLSearchParams | Record<string, string>;
|
|
36
|
+
/** The `state` stored at the begin step. */
|
|
37
|
+
state: string;
|
|
38
|
+
/** The `codeVerifier` stored at the begin step. */
|
|
39
|
+
codeVerifier: string;
|
|
40
|
+
clientId: string;
|
|
41
|
+
/** The same registered redirect URI used at the begin step. */
|
|
42
|
+
redirectUri: string;
|
|
43
|
+
/** Client secret for confidential clients. Public clients omit it. */
|
|
44
|
+
clientSecret?: string;
|
|
45
|
+
/** Pre-discovered metadata. When set, no discovery request is made. */
|
|
46
|
+
metadata?: OAuthAuthorizationServerMetadata;
|
|
47
|
+
signal?: AbortSignal;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Begin a web-app authorization-code-with-PKCE flow.
|
|
51
|
+
*
|
|
52
|
+
* For applications that own a registered redirect URI and receive the callback
|
|
53
|
+
* on their own route, where the loopback listener `authenticate()` runs is
|
|
54
|
+
* wrong. Generates the PKCE pair and a CSRF `state`, resolves the
|
|
55
|
+
* `authorization_endpoint` by discovery, and builds the authorization URL with
|
|
56
|
+
* one `resource` parameter per entry of `resources`.
|
|
57
|
+
*
|
|
58
|
+
* The SDK holds no state between begin and complete: where `state` and
|
|
59
|
+
* `codeVerifier` live between the redirect and the callback (a session, a
|
|
60
|
+
* signed cookie) is the application's concern, which is what makes the flow
|
|
61
|
+
* safe under concurrent sign-ins and multi-process servers.
|
|
62
|
+
*/
|
|
63
|
+
export declare function beginAuthorization(issuer: string, options: BeginAuthorizationOptions): Promise<AuthorizationRedirect>;
|
|
64
|
+
/**
|
|
65
|
+
* Complete a web-app authorization-code-with-PKCE flow from the callback route.
|
|
66
|
+
*
|
|
67
|
+
* Callback validation happens before discovery or any token request: a
|
|
68
|
+
* callback carrying `error` throws `AuthorizationDeniedError`, a missing or
|
|
69
|
+
* non-matching `state` throws `StateMismatchError`, and a missing `code`
|
|
70
|
+
* throws `OAuthError("invalid_request")`.
|
|
71
|
+
*
|
|
72
|
+
* No RFC 8707 `resource` parameter is sent on the token request: the
|
|
73
|
+
* authorization server derives the issued token's audience from the
|
|
74
|
+
* authorization code, which already records the resources authorized at the
|
|
75
|
+
* begin step.
|
|
76
|
+
*/
|
|
77
|
+
export declare function completeAuthorization(issuer: string, options: CompleteAuthorizationOptions): Promise<TokenResponse>;
|
|
78
|
+
//# sourceMappingURL=webApp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webApp.d.ts","sourceRoot":"","sources":["../../src/webApp.ts"],"names":[],"mappings":"AACA,OAAO,EAAoC,KAAK,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAGzG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMxD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,gCAAgC,CAAC;IAC5C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,yFAAyF;IACzF,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,oDAAoD;IACpD,cAAc,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,gCAAgC,CAAC;IAC5C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,qBAAqB,CAAC,CA0BhC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,aAAa,CAAC,CAmCxB"}
|