@stackframe/stack-shared 1.0.0 → 1.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/dist/interface/clientInterface.d.ts.map +1 -1
- package/dist/interface/clientInterface.js +13 -2
- package/dist/utils/bytes.d.ts +2 -0
- package/dist/utils/bytes.d.ts.map +1 -0
- package/dist/utils/bytes.js +48 -0
- package/dist/utils/caches.d.ts +4 -0
- package/dist/utils/caches.d.ts.map +1 -1
- package/dist/utils/caches.js +15 -0
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +6 -2
- package/dist/utils/maps.d.ts +22 -0
- package/dist/utils/maps.d.ts.map +1 -0
- package/dist/utils/maps.js +107 -0
- package/package.json +5 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clientInterface.d.ts","sourceRoot":"","sources":["../../src/interface/clientInterface.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,YAAY,EAEZ,eAAe,EACf,eAAe,EAKf,8BAA8B,EAG9B,0BAA0B,EAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,oBAAoB,GAAG;IAC5C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,cAAc,EAAE,SAAS;QAChC,EAAE,EAAE,MAAM,CAAC;KACZ,EAAE,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,GAAG,CAAC;IACH,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC,GAAG;IACF,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;CAC3C,CAAC,CAAC;AAOH,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;AAEjD,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE;QACf,EAAE,EAAE,MAAM,CAAC;QACX,cAAc,EAAE,OAAO,CAAC;QACxB,cAAc,EAAE,uBAAuB,EAAE,CAAC;QAC1C,WAAW,CAAC,EAAE,eAAe,CAAC;QAC9B,OAAO,EAAE,gBAAgB,EAAE,CAAC;KAC7B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,CACA;IACA,IAAI,EACA,eAAe,GACf,eAAe,GACf,iBAAiB,GACjB,cAAc,GACd,gBAAgB,GAChB,iBAAiB,GACjB,kBAAkB,CAAC;CACxB,GACC;IACA,IAAI,EACA,QAAQ,GACR,UAAU,GACV,OAAO,GACP,SAAS,GACT,UAAU,GACV,QAAQ,GACR,WAAW,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CACF,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAC5B;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACC;IACA,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,CACF,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB,CAAA;AAED,qBAAa,oBAAoB;aAMH,OAAO,EAAE,sBAAsB;IAH3D,SAAgB,gBAAgB,EAAE,UAAU,CAAC,UAAU,EAAE,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC1E,SAAgB,kBAAkB,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;gBAE3C,OAAO,EAAE,sBAAsB;IAgB3D,IAAI,SAAS,WAEZ;IAED,oBAAoB;IAIpB,SAAS;IAIH,WAAW,CAAC,UAAU,EAAE,UAAU;IAIlC,cAAc;cAIJ,kBAAkB,CAAC,UAAU,EAAE,UAAU;cAoEzC,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,WAAW,EAC3B,gBAAgB,EAAE,UAAU,GAAG,IAAI;;;;;;
|
|
1
|
+
{"version":3,"file":"clientInterface.d.ts","sourceRoot":"","sources":["../../src/interface/clientInterface.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { parseJson } from '../utils/json';
|
|
|
6
6
|
import { AsyncCache, AsyncValueCache } from '../utils/caches';
|
|
7
7
|
import { typedAssign } from '../utils/objects';
|
|
8
8
|
import { AsyncStore } from '../utils/stores';
|
|
9
|
-
import { runAsynchronously } from '../utils/promises';
|
|
9
|
+
import { neverResolve, runAsynchronously } from '../utils/promises';
|
|
10
10
|
function getSessionCookieName(projectId) {
|
|
11
11
|
return "__stack-token-" + crypto.createHash("sha256").update(projectId).digest("hex");
|
|
12
12
|
}
|
|
@@ -108,7 +108,18 @@ export class StackClientInterface {
|
|
|
108
108
|
accessToken: null,
|
|
109
109
|
refreshToken: null,
|
|
110
110
|
});
|
|
111
|
-
|
|
111
|
+
try {
|
|
112
|
+
return await Result.orThrowAsync(Result.retry(() => this.sendClientRequestInner(path, requestOptions, tokenStore), 5, { exponentialDelayBase: 1000 }));
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
// TODO this is a hack. Occurs when the admin access token is invalid, or expired. Has plenty of weird side effects so we should replace this
|
|
116
|
+
if ("internalAdminAccessToken" in this.options && error?.message?.includes?.("Invalid API key") && typeof window !== "undefined") {
|
|
117
|
+
alert("Your session has expired. The page will now reload." + (process.env.NODE_ENV == "development" ? "\n\nThis is a hack and we should probably fix this at some point." : ""));
|
|
118
|
+
window.location.reload();
|
|
119
|
+
await neverResolve();
|
|
120
|
+
}
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
112
123
|
}
|
|
113
124
|
async sendClientRequestAndCatchKnownError(path, requestOptions, tokenStoreOrNull, errorCodes) {
|
|
114
125
|
try {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../src/utils/bytes.tsx"],"names":[],"mappings":"AAOA,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAgBtD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAuBtD"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const crockfordAlphabet = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
2
|
+
const crockfordReplacements = new Map([
|
|
3
|
+
["o", "0"],
|
|
4
|
+
["i", "1"],
|
|
5
|
+
["l", "1"],
|
|
6
|
+
]);
|
|
7
|
+
export function encodeBase32(input) {
|
|
8
|
+
let bits = 0;
|
|
9
|
+
let value = 0;
|
|
10
|
+
let output = "";
|
|
11
|
+
for (let i = 0; i < input.length; i++) {
|
|
12
|
+
value = (value << 8) | input[i];
|
|
13
|
+
bits += 8;
|
|
14
|
+
while (bits >= 5) {
|
|
15
|
+
output += crockfordAlphabet[(value >>> (bits - 5)) & 31];
|
|
16
|
+
bits -= 5;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (bits > 0) {
|
|
20
|
+
output += crockfordAlphabet[(value << (5 - bits)) & 31];
|
|
21
|
+
}
|
|
22
|
+
return output;
|
|
23
|
+
}
|
|
24
|
+
export function decodeBase32(input) {
|
|
25
|
+
const output = new Uint8Array((input.length * 5 / 8) | 0);
|
|
26
|
+
let bits = 0;
|
|
27
|
+
let value = 0;
|
|
28
|
+
let outputIndex = 0;
|
|
29
|
+
for (let i = 0; i < input.length; i++) {
|
|
30
|
+
let char = input[i].toLowerCase();
|
|
31
|
+
if (char === " ")
|
|
32
|
+
continue;
|
|
33
|
+
if (crockfordReplacements.has(char)) {
|
|
34
|
+
char = crockfordReplacements.get(char);
|
|
35
|
+
}
|
|
36
|
+
const index = crockfordAlphabet.indexOf(char);
|
|
37
|
+
if (index === -1) {
|
|
38
|
+
throw new Error(`Invalid character: ${char}`);
|
|
39
|
+
}
|
|
40
|
+
value = (value << 5) | index;
|
|
41
|
+
bits += 5;
|
|
42
|
+
if (bits >= 8) {
|
|
43
|
+
output[outputIndex++] = (value >>> (bits - 8)) & 255;
|
|
44
|
+
bits -= 8;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return output;
|
|
48
|
+
}
|
package/dist/utils/caches.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { RateLimitOptions, ReactPromise } from "./promises";
|
|
2
2
|
import { ReadonlyAsyncStore } from "./stores";
|
|
3
|
+
/**
|
|
4
|
+
* Can be used to cache the result of a function call, for example for the `use` hook in React.
|
|
5
|
+
*/
|
|
6
|
+
export declare function cacheFunction<F extends Function>(f: F): F;
|
|
3
7
|
export declare class AsyncCache<K extends object, T> {
|
|
4
8
|
private readonly _fetcher;
|
|
5
9
|
private readonly _rateLimitOptions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caches.d.ts","sourceRoot":"","sources":["../../src/utils/caches.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"caches.d.ts","sourceRoot":"","sources":["../../src/utils/caches.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAe,MAAM,YAAY,CAAC;AACzE,OAAO,EAAc,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE1D;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAYzD;AAGD,qBAAa,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC;IAIvC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAJpC,OAAO,CAAC,IAAI,CAA6C;gBAGtC,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,EAClD,iBAAiB,GAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAoC;IAK7G,OAAO,CAAC,YAAY;IASpB,aAAa,CAAC,GAAG,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC;IAWzC,WAAW,QAlBF,CAAC,aAkBqC;IAC/C,cAAc,QAnBL,CAAC,UAmB2C;IACrD,GAAG,QApBM,CAAC;;;;;;;;;;;;;;;;OAoBqB;IAC/B,SAAS,QArBA,CAAC,qBAqBiC;IAC3C,OAAO,QAtBE,CAAC,gBAsB6B;IACvC,UAAU,QAvBD,CAAC,gBAuBmC;IAC7C,QAAQ,QAxBC,CAAC;;MAwB+B;IACzC,UAAU,QAzBD,CAAC;;MAyBmC;CAC9C;AAED,qBAAa,eAAe,CAAC,CAAC,CAAE,YAAW,kBAAkB,CAAC,CAAC,CAAC;IAO5D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IANpC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,aAAa,CAAmB;gBAGtC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,EACxB,iBAAiB,GAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAyC;IAmBlH,WAAW,IAAI,OAAO;IAItB,cAAc,IAAI,IAAI;IAItB,GAAG;;;;;;;;;;;;;;;;;IAIH,SAAS,IAAI,YAAY,CAAC,CAAC,CAAC;IAI5B,OAAO,CAAC,IAAI;YAIE,SAAS;YAIT,QAAQ;IAWhB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC;IAIrB,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC;IAK9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE;IAI5F,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE;CAG/F"}
|
package/dist/utils/caches.js
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
|
+
import { DependenciesMap } from "./maps";
|
|
1
2
|
import { rateLimited } from "./promises";
|
|
2
3
|
import { AsyncStore } from "./stores";
|
|
4
|
+
/**
|
|
5
|
+
* Can be used to cache the result of a function call, for example for the `use` hook in React.
|
|
6
|
+
*/
|
|
7
|
+
export function cacheFunction(f) {
|
|
8
|
+
const dependenciesMap = new DependenciesMap();
|
|
9
|
+
return ((...args) => {
|
|
10
|
+
if (dependenciesMap.has(args)) {
|
|
11
|
+
return dependenciesMap.get(args);
|
|
12
|
+
}
|
|
13
|
+
const value = f(...args);
|
|
14
|
+
dependenciesMap.set(args, value);
|
|
15
|
+
return value;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
3
18
|
export class AsyncCache {
|
|
4
19
|
_fetcher;
|
|
5
20
|
_rateLimitOptions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/utils/crypto.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/utils/crypto.tsx"],"names":[],"mappings":"AAMA,wBAAgB,0BAA0B,CAAC,gBAAgB,GAAE,MAAY,UAGxE"}
|
package/dist/utils/crypto.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import crypto from "node:crypto";
|
|
2
|
-
|
|
2
|
+
import { encodeBase32 } from "./bytes";
|
|
3
|
+
const characters = "23456789abcdefghjkmnopqrstuvwxyz";
|
|
4
|
+
if (characters.length !== 32)
|
|
5
|
+
throw new Error("Invalid characters length");
|
|
6
|
+
export function generateSecureRandomString(minBitsOfEntropy = 224) {
|
|
3
7
|
const randomBytes = crypto.randomBytes(Math.ceil(minBitsOfEntropy / 8));
|
|
4
|
-
return randomBytes.
|
|
8
|
+
return encodeBase32(randomBytes).toLowerCase();
|
|
5
9
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare class MaybeWeakMap<K, V> {
|
|
2
|
+
private readonly _primitiveMap;
|
|
3
|
+
private readonly _weakMap;
|
|
4
|
+
constructor(entries?: readonly (readonly [K, V])[] | null);
|
|
5
|
+
private _isAllowedInWeakMap;
|
|
6
|
+
get(key: K): V | undefined;
|
|
7
|
+
set(key: K, value: V): this;
|
|
8
|
+
delete(key: K): boolean;
|
|
9
|
+
has(key: K): boolean;
|
|
10
|
+
[Symbol.toStringTag]: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class DependenciesMap<K extends any[], V> {
|
|
13
|
+
private _inner;
|
|
14
|
+
private _valueToResult;
|
|
15
|
+
private _unwrapFromInner;
|
|
16
|
+
private _setInInner;
|
|
17
|
+
get(dependencies: K): V | undefined;
|
|
18
|
+
set(dependencies: K, value: V): this;
|
|
19
|
+
delete(dependencies: K): boolean;
|
|
20
|
+
has(dependencies: K): boolean;
|
|
21
|
+
[Symbol.toStringTag]: string;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maps.d.ts","sourceRoot":"","sources":["../../src/utils/maps.tsx"],"names":[],"mappings":"AAEA,qBAAa,YAAY,CAAC,CAAC,EAAE,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;gBAEvC,OAAO,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;IAMzD,OAAO,CAAC,mBAAmB;IAI3B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAQ1B,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAS3B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAQvB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAQpB,CAAC,MAAM,CAAC,WAAW,CAAC,SAAkB;CACvC;AAWD,qBAAa,eAAe,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC;IAC7C,OAAO,CAAC,MAAM,CAA2F;IAEzG,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,WAAW;IAqBnB,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAInC,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAKpC,MAAM,CAAC,YAAY,EAAE,CAAC,GAAG,OAAO;IAIhC,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,OAAO;IAI7B,CAAC,MAAM,CAAC,WAAW,CAAC,SAAqB;CAC1C"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Result } from "./results";
|
|
2
|
+
export class MaybeWeakMap {
|
|
3
|
+
_primitiveMap;
|
|
4
|
+
_weakMap;
|
|
5
|
+
constructor(entries) {
|
|
6
|
+
const entriesArray = [...entries ?? []];
|
|
7
|
+
this._primitiveMap = new Map(entriesArray.filter((e) => !this._isAllowedInWeakMap(e[0])));
|
|
8
|
+
this._weakMap = new WeakMap(entriesArray.filter((e) => this._isAllowedInWeakMap(e[0])));
|
|
9
|
+
}
|
|
10
|
+
_isAllowedInWeakMap(key) {
|
|
11
|
+
return (typeof key === "object" && key !== null) || (typeof key === "symbol" && Symbol.keyFor(key) === undefined);
|
|
12
|
+
}
|
|
13
|
+
get(key) {
|
|
14
|
+
if (this._isAllowedInWeakMap(key)) {
|
|
15
|
+
return this._weakMap.get(key);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
return this._primitiveMap.get(key);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
set(key, value) {
|
|
22
|
+
if (this._isAllowedInWeakMap(key)) {
|
|
23
|
+
this._weakMap.set(key, value);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
this._primitiveMap.set(key, value);
|
|
27
|
+
}
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
delete(key) {
|
|
31
|
+
if (this._isAllowedInWeakMap(key)) {
|
|
32
|
+
return this._weakMap.delete(key);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
return this._primitiveMap.delete(key);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
has(key) {
|
|
39
|
+
if (this._isAllowedInWeakMap(key)) {
|
|
40
|
+
return this._weakMap.has(key);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
return this._primitiveMap.has(key);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
[Symbol.toStringTag] = "MaybeWeakMap";
|
|
47
|
+
}
|
|
48
|
+
export class DependenciesMap {
|
|
49
|
+
_inner = { map: new MaybeWeakMap(), hasValue: false, value: undefined };
|
|
50
|
+
_valueToResult(inner) {
|
|
51
|
+
if (inner.hasValue) {
|
|
52
|
+
return Result.ok(inner.value);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
return Result.error(undefined);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
_unwrapFromInner(dependencies, inner) {
|
|
59
|
+
if ((dependencies.length === 0)) {
|
|
60
|
+
return this._valueToResult(inner);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const [key, ...rest] = dependencies;
|
|
64
|
+
const newInner = inner.map.get(key);
|
|
65
|
+
if (!newInner) {
|
|
66
|
+
return Result.error(undefined);
|
|
67
|
+
}
|
|
68
|
+
return this._unwrapFromInner(rest, newInner);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
_setInInner(dependencies, value, inner) {
|
|
72
|
+
if (dependencies.length === 0) {
|
|
73
|
+
const res = this._valueToResult(inner);
|
|
74
|
+
if (value.status === "ok") {
|
|
75
|
+
inner.hasValue = true;
|
|
76
|
+
inner.value = value.data;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
inner.hasValue = false;
|
|
80
|
+
inner.value = undefined;
|
|
81
|
+
}
|
|
82
|
+
return res;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const [key, ...rest] = dependencies;
|
|
86
|
+
let newInner = inner.map.get(key);
|
|
87
|
+
if (!newInner) {
|
|
88
|
+
inner.map.set(key, newInner = { map: new MaybeWeakMap(), hasValue: false, value: undefined });
|
|
89
|
+
}
|
|
90
|
+
return this._setInInner(rest, value, newInner);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
get(dependencies) {
|
|
94
|
+
return Result.or(this._unwrapFromInner(dependencies, this._inner), undefined);
|
|
95
|
+
}
|
|
96
|
+
set(dependencies, value) {
|
|
97
|
+
this._setInInner(dependencies, Result.ok(value), this._inner);
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
100
|
+
delete(dependencies) {
|
|
101
|
+
return this._setInInner(dependencies, Result.error(undefined), this._inner).status === "ok";
|
|
102
|
+
}
|
|
103
|
+
has(dependencies) {
|
|
104
|
+
return this._unwrapFromInner(dependencies, this._inner).status === "ok";
|
|
105
|
+
}
|
|
106
|
+
[Symbol.toStringTag] = "DependenciesMap";
|
|
107
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stackframe/stack-shared",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"files": [
|
|
@@ -28,12 +28,13 @@
|
|
|
28
28
|
"@typescript-eslint/parser": "^6.x",
|
|
29
29
|
"eslint": "^8",
|
|
30
30
|
"eslint-config-next": "^14",
|
|
31
|
-
"rimraf": "^5.0.5"
|
|
31
|
+
"rimraf": "^5.0.5",
|
|
32
|
+
"react": "^18.2.0"
|
|
32
33
|
},
|
|
33
34
|
"scripts": {
|
|
34
|
-
"build": "
|
|
35
|
+
"build": "tsc",
|
|
35
36
|
"typecheck": "tsc --noEmit",
|
|
36
|
-
"clean": "rimraf dist",
|
|
37
|
+
"clean": "rimraf dist && rimraf node_modules",
|
|
37
38
|
"dev": "tsc -w --preserveWatchOutput --declarationMap",
|
|
38
39
|
"lint": "eslint --ext .tsx,.ts ."
|
|
39
40
|
}
|