better-uuid 0.0.2 → 0.0.4
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/compat/index.d.ts +9 -0
- package/dist/compat/index.d.ts.map +1 -0
- package/dist/compat/index.js +21 -0
- package/dist/compat/index.js.map +1 -0
- package/dist/compat/nanoid.d.ts +23 -0
- package/dist/compat/nanoid.d.ts.map +1 -0
- package/dist/compat/nanoid.js +71 -0
- package/dist/compat/nanoid.js.map +1 -0
- package/dist/compat/nanoid.test.d.ts +2 -0
- package/dist/compat/nanoid.test.d.ts.map +1 -0
- package/dist/compat/nanoid.test.js +27 -0
- package/dist/compat/nanoid.test.js.map +1 -0
- package/dist/compat/uuid.d.ts +30 -0
- package/dist/compat/uuid.d.ts.map +1 -0
- package/dist/compat/uuid.js +77 -0
- package/dist/compat/uuid.js.map +1 -0
- package/dist/compat/uuid.test.d.ts +2 -0
- package/dist/compat/uuid.test.d.ts.map +1 -0
- package/dist/compat/uuid.test.js +24 -0
- package/dist/compat/uuid.test.js.map +1 -0
- package/dist/engine/js-engine.d.ts +15 -0
- package/dist/engine/js-engine.d.ts.map +1 -0
- package/dist/engine/js-engine.js +222 -0
- package/dist/engine/js-engine.js.map +1 -0
- package/dist/engine/js-engine.test.d.ts +2 -0
- package/dist/engine/js-engine.test.d.ts.map +1 -0
- package/dist/engine/js-engine.test.js +179 -0
- package/dist/engine/js-engine.test.js.map +1 -0
- package/dist/engine/wasm-loader.d.ts +7 -0
- package/dist/engine/wasm-loader.d.ts.map +1 -0
- package/dist/engine/wasm-loader.js +89 -0
- package/dist/engine/wasm-loader.js.map +1 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +35 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +84 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +154 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +270 -0
- package/dist/index.test.js.map +1 -0
- package/dist/integration.test.d.ts +2 -0
- package/dist/integration.test.d.ts.map +1 -0
- package/dist/integration.test.js +149 -0
- package/dist/integration.test.js.map +1 -0
- package/dist/patch.d.ts +2 -0
- package/dist/patch.d.ts.map +1 -0
- package/dist/patch.js +41 -0
- package/dist/patch.js.map +1 -0
- package/dist/types.d.ts +73 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +38 -0
- package/dist/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opinionated default ID generation.
|
|
3
|
+
*
|
|
4
|
+
* Time-ordered strategy with no prefix — the safest starting point for
|
|
5
|
+
* teams migrating from `uuid`/`nanoid` who want sortable IDs immediately.
|
|
6
|
+
*/
|
|
7
|
+
export declare function id(): string;
|
|
8
|
+
export { id as default };
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compat/index.ts"],"names":[],"mappings":"AAYA;;;;;GAKG;AACH,wBAAgB,EAAE,IAAI,MAAM,CAE3B;AAED,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// better-uuid/compat — Opinionated default
|
|
3
|
+
//
|
|
4
|
+
// Smart default: time-ordered, future-proof.
|
|
5
|
+
// ```ts
|
|
6
|
+
// import { id } from "better-uuid/compat";
|
|
7
|
+
// const newId = id();
|
|
8
|
+
// ```
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
import { createId } from "../index";
|
|
11
|
+
/**
|
|
12
|
+
* Opinionated default ID generation.
|
|
13
|
+
*
|
|
14
|
+
* Time-ordered strategy with no prefix — the safest starting point for
|
|
15
|
+
* teams migrating from `uuid`/`nanoid` who want sortable IDs immediately.
|
|
16
|
+
*/
|
|
17
|
+
export function id() {
|
|
18
|
+
return createId({ strategy: "time" });
|
|
19
|
+
}
|
|
20
|
+
export { id as default };
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compat/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2CAA2C;AAC3C,EAAE;AACF,6CAA6C;AAC7C,QAAQ;AACR,2CAA2C;AAC3C,sBAAsB;AACtB,MAAM;AACN,8EAA8E;AAE9E,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,UAAU,EAAE;IAChB,OAAO,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAW,CAAC;AAClD,CAAC;AAED,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a URL-safe random ID.
|
|
3
|
+
*
|
|
4
|
+
* Same default behavior as `nanoid`: 21-char, URL-safe alphabet.
|
|
5
|
+
*
|
|
6
|
+
* ```diff
|
|
7
|
+
* - import { nanoid } from "nanoid";
|
|
8
|
+
* + import { nanoid } from "better-uuid/compat/nanoid";
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export declare function nanoid(size?: number): string;
|
|
12
|
+
/**
|
|
13
|
+
* Generate a URL-safe ID with custom alphabet.
|
|
14
|
+
*
|
|
15
|
+
* Matches `nanoid/custom` API surface.
|
|
16
|
+
*/
|
|
17
|
+
export declare function customAlphabet(alphabet: string, defaultSize?: number): (size?: number) => string;
|
|
18
|
+
/**
|
|
19
|
+
* Generate an ID using the default alphabet.
|
|
20
|
+
* Convenience re-export matching `nanoid/nanoid.js`.
|
|
21
|
+
*/
|
|
22
|
+
export { nanoid as default };
|
|
23
|
+
//# sourceMappingURL=nanoid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nanoid.d.ts","sourceRoot":"","sources":["../../src/compat/nanoid.ts"],"names":[],"mappings":"AAUA;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,IAAI,GAAE,MAA8B,GAAG,MAAM,CAuBnE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAA8B,GAC1C,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,CAuB3B;AAED;;;GAGG;AACH,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// better-uuid/compat/nanoid — Drop-in replacement for the `nanoid` package
|
|
3
|
+
//
|
|
4
|
+
// Layer 1: Same API surface as `nanoid` v5+.
|
|
5
|
+
// Same default length (21), same alphabet (URL-safe: A-Za-z0-9_-).
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
const NANOID_ALPHABET = "UseRandomStr1ngs0123456789-_";
|
|
8
|
+
const NANOID_DEFAULT_LENGTH = 21;
|
|
9
|
+
/**
|
|
10
|
+
* Generate a URL-safe random ID.
|
|
11
|
+
*
|
|
12
|
+
* Same default behavior as `nanoid`: 21-char, URL-safe alphabet.
|
|
13
|
+
*
|
|
14
|
+
* ```diff
|
|
15
|
+
* - import { nanoid } from "nanoid";
|
|
16
|
+
* + import { nanoid } from "better-uuid/compat/nanoid";
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export function nanoid(size = NANOID_DEFAULT_LENGTH) {
|
|
20
|
+
const alphabet = NANOID_ALPHABET;
|
|
21
|
+
const mask = (2 << (31 - Math.clz32(alphabet.length - 1))) - 1;
|
|
22
|
+
const step = Math.ceil((1.6 * mask * size) / alphabet.length);
|
|
23
|
+
let result = "";
|
|
24
|
+
const bytes = globalThis.crypto.getRandomValues(new Uint8Array(step));
|
|
25
|
+
let i = 0;
|
|
26
|
+
while (result.length < size) {
|
|
27
|
+
const byte = bytes[i] ?? 0;
|
|
28
|
+
if (byte < alphabet.length) {
|
|
29
|
+
result += alphabet[byte];
|
|
30
|
+
}
|
|
31
|
+
i++;
|
|
32
|
+
if (i >= bytes.length) {
|
|
33
|
+
// Replenish entropy
|
|
34
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
35
|
+
i = 0;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Generate a URL-safe ID with custom alphabet.
|
|
42
|
+
*
|
|
43
|
+
* Matches `nanoid/custom` API surface.
|
|
44
|
+
*/
|
|
45
|
+
export function customAlphabet(alphabet, defaultSize = NANOID_DEFAULT_LENGTH) {
|
|
46
|
+
const mask = (2 << (31 - Math.clz32(alphabet.length - 1))) - 1;
|
|
47
|
+
return (size = defaultSize) => {
|
|
48
|
+
const step = Math.ceil((1.6 * mask * size) / alphabet.length);
|
|
49
|
+
let result = "";
|
|
50
|
+
const bytes = globalThis.crypto.getRandomValues(new Uint8Array(step));
|
|
51
|
+
let i = 0;
|
|
52
|
+
while (result.length < size) {
|
|
53
|
+
const byte = bytes[i] ?? 0;
|
|
54
|
+
if (byte < alphabet.length) {
|
|
55
|
+
result += alphabet[byte];
|
|
56
|
+
}
|
|
57
|
+
i++;
|
|
58
|
+
if (i >= bytes.length) {
|
|
59
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
60
|
+
i = 0;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return result;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Generate an ID using the default alphabet.
|
|
68
|
+
* Convenience re-export matching `nanoid/nanoid.js`.
|
|
69
|
+
*/
|
|
70
|
+
export { nanoid as default };
|
|
71
|
+
//# sourceMappingURL=nanoid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nanoid.js","sourceRoot":"","sources":["../../src/compat/nanoid.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2EAA2E;AAC3E,EAAE;AACF,6CAA6C;AAC7C,mEAAmE;AACnE,8EAA8E;AAE9E,MAAM,eAAe,GAAG,8BAA8B,CAAC;AACvD,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAEjC;;;;;;;;;GASG;AACH,MAAM,UAAU,MAAM,CAAC,OAAe,qBAAqB;IACzD,MAAM,QAAQ,GAAG,eAAe,CAAC;IACjC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE9D,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,CAAC,EAAE,CAAC;QACJ,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACtB,oBAAoB;YACpB,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC,GAAG,CAAC,CAAC;QACR,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,cAAsB,qBAAqB;IAE3C,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAE/D,OAAO,CAAC,OAAe,WAAW,EAAU,EAAE;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC3B,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YACD,CAAC,EAAE,CAAC;YACJ,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACtB,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;gBACzC,CAAC,GAAG,CAAC,CAAC;YACR,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nanoid.test.d.ts","sourceRoot":"","sources":["../../src/compat/nanoid.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { nanoid, customAlphabet } from "../compat/nanoid";
|
|
3
|
+
describe("compat/nanoid", () => {
|
|
4
|
+
it("nanoid() returns 21-char URL-safe string by default", () => {
|
|
5
|
+
const id = nanoid();
|
|
6
|
+
expect(id.length).toBe(21);
|
|
7
|
+
expect(id).toMatch(/^[A-Za-z0-9_-]{21}$/);
|
|
8
|
+
});
|
|
9
|
+
it("nanoid(size) returns correct length", () => {
|
|
10
|
+
expect(nanoid(10).length).toBe(10);
|
|
11
|
+
expect(nanoid(32).length).toBe(32);
|
|
12
|
+
});
|
|
13
|
+
it("nanoid() generates unique values", () => {
|
|
14
|
+
const ids = new Set();
|
|
15
|
+
for (let i = 0; i < 1000; i++) {
|
|
16
|
+
ids.add(nanoid());
|
|
17
|
+
}
|
|
18
|
+
expect(ids.size).toBe(1000);
|
|
19
|
+
});
|
|
20
|
+
it("customAlphabet uses provided alphabet", () => {
|
|
21
|
+
const gen = customAlphabet("abc", 10);
|
|
22
|
+
const id = gen();
|
|
23
|
+
expect(id.length).toBe(10);
|
|
24
|
+
expect(id).toMatch(/^[abc]{10}$/);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=nanoid.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nanoid.test.js","sourceRoot":"","sources":["../../src/compat/nanoid.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE1D,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACpB,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC;QACjB,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a UUID v4 (random).
|
|
3
|
+
*
|
|
4
|
+
* Same output shape as `uuid` package `v4()`: `8-4-4-4-12` hex.
|
|
5
|
+
*
|
|
6
|
+
* ```diff
|
|
7
|
+
* - import { v4 as uuidv4 } from "uuid";
|
|
8
|
+
* + import { v4 as uuidv4 } from "better-uuid/compat/uuid";
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export declare function v4(): string;
|
|
12
|
+
/**
|
|
13
|
+
* Generate a UUID v7 (time-ordered).
|
|
14
|
+
*
|
|
15
|
+
* Same output shape as `uuid` package `v7()`: `8-4-4-4-12` hex.
|
|
16
|
+
*/
|
|
17
|
+
export declare function v7(): string;
|
|
18
|
+
/** Validate an ID string. Returns true for valid UUID v4/v7-shaped strings. */
|
|
19
|
+
export declare function validate(id: string): boolean;
|
|
20
|
+
/** No-op for compat — the `uuid` package exports this. */
|
|
21
|
+
export declare const NIL = "00000000-0000-0000-0000-000000000000";
|
|
22
|
+
/** Parse UUID string to byte array (16 bytes). */
|
|
23
|
+
export declare function parse(id: string): Uint8Array;
|
|
24
|
+
/** Convert byte array (16 bytes) to UUID string. */
|
|
25
|
+
export declare function stringify(bytes: Uint8Array): string;
|
|
26
|
+
/** v1 (not implemented) — delegates to v4 for compat. */
|
|
27
|
+
export declare const v1: typeof v4;
|
|
28
|
+
/** Default export matches the `uuid` package's default (v4). */
|
|
29
|
+
export default v4;
|
|
30
|
+
//# sourceMappingURL=uuid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../../src/compat/uuid.ts"],"names":[],"mappings":"AASA;;;;;;;;;GASG;AACH,wBAAgB,EAAE,IAAI,MAAM,CAE3B;AAED;;;;GAIG;AACH,wBAAgB,EAAE,IAAI,MAAM,CAS3B;AAED,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAU5C;AAED,0DAA0D;AAC1D,eAAO,MAAM,GAAG,yCAAyC,CAAC;AAE1D,kDAAkD;AAClD,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,CAU5C;AAED,oDAAoD;AACpD,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAYnD;AAED,yDAAyD;AACzD,eAAO,MAAM,EAAE,WAAK,CAAC;AAErB,gEAAgE;AAChE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// better-uuid/compat/uuid — Drop-in replacement for the `uuid` package
|
|
3
|
+
//
|
|
4
|
+
// Layer 1: Same API surface as `uuid` v9+.
|
|
5
|
+
// Teams replace the import; behavior is unchanged until they flip strategy.
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
import { createId, parseId } from "../index";
|
|
8
|
+
/**
|
|
9
|
+
* Generate a UUID v4 (random).
|
|
10
|
+
*
|
|
11
|
+
* Same output shape as `uuid` package `v4()`: `8-4-4-4-12` hex.
|
|
12
|
+
*
|
|
13
|
+
* ```diff
|
|
14
|
+
* - import { v4 as uuidv4 } from "uuid";
|
|
15
|
+
* + import { v4 as uuidv4 } from "better-uuid/compat/uuid";
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function v4() {
|
|
19
|
+
return createId({ strategy: "uuidv4", mode: "safe" });
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Generate a UUID v7 (time-ordered).
|
|
23
|
+
*
|
|
24
|
+
* Same output shape as `uuid` package `v7()`: `8-4-4-4-12` hex.
|
|
25
|
+
*/
|
|
26
|
+
export function v7() {
|
|
27
|
+
// v7 via the engine — returns UUID-shaped (safe mode strips prefix)
|
|
28
|
+
const id = createId({ strategy: "time" });
|
|
29
|
+
// If engine returns native with prefix, we need RFC shape
|
|
30
|
+
// For Phase 2: time strategy returns UUID v7 format without prefix
|
|
31
|
+
if (id.includes("_")) {
|
|
32
|
+
return id.split("_")[1];
|
|
33
|
+
}
|
|
34
|
+
return id;
|
|
35
|
+
}
|
|
36
|
+
/** Validate an ID string. Returns true for valid UUID v4/v7-shaped strings. */
|
|
37
|
+
export function validate(id) {
|
|
38
|
+
try {
|
|
39
|
+
const parsed = parseId(id);
|
|
40
|
+
return (parsed.legacy &&
|
|
41
|
+
(parsed.strategy === "uuidv4" || parsed.strategy === "time"));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** No-op for compat — the `uuid` package exports this. */
|
|
48
|
+
export const NIL = "00000000-0000-0000-0000-000000000000";
|
|
49
|
+
/** Parse UUID string to byte array (16 bytes). */
|
|
50
|
+
export function parse(id) {
|
|
51
|
+
const hex = id.replace(/-/g, "");
|
|
52
|
+
if (hex.length !== 32) {
|
|
53
|
+
throw new Error("Invalid UUID");
|
|
54
|
+
}
|
|
55
|
+
const bytes = new Uint8Array(16);
|
|
56
|
+
for (let i = 0; i < 16; i++) {
|
|
57
|
+
bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
58
|
+
}
|
|
59
|
+
return bytes;
|
|
60
|
+
}
|
|
61
|
+
/** Convert byte array (16 bytes) to UUID string. */
|
|
62
|
+
export function stringify(bytes) {
|
|
63
|
+
if (bytes.length !== 16) {
|
|
64
|
+
throw new Error("Invalid byte array length, expected 16");
|
|
65
|
+
}
|
|
66
|
+
const h = (n) => n.toString(16).padStart(2, "0");
|
|
67
|
+
return (h(bytes[0]) + h(bytes[1]) + h(bytes[2]) + h(bytes[3]) + "-" +
|
|
68
|
+
h(bytes[4]) + h(bytes[5]) + "-" +
|
|
69
|
+
h(bytes[6]) + h(bytes[7]) + "-" +
|
|
70
|
+
h(bytes[8]) + h(bytes[9]) + "-" +
|
|
71
|
+
h(bytes[10]) + h(bytes[11]) + h(bytes[12]) + h(bytes[13]) + h(bytes[14]) + h(bytes[15]));
|
|
72
|
+
}
|
|
73
|
+
/** v1 (not implemented) — delegates to v4 for compat. */
|
|
74
|
+
export const v1 = v4;
|
|
75
|
+
/** Default export matches the `uuid` package's default (v4). */
|
|
76
|
+
export default v4;
|
|
77
|
+
//# sourceMappingURL=uuid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.js","sourceRoot":"","sources":["../../src/compat/uuid.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.test.d.ts","sourceRoot":"","sources":["../../src/compat/uuid.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { v4, v7, validate, NIL } from "../compat/uuid";
|
|
3
|
+
describe("compat/uuid", () => {
|
|
4
|
+
it("v4 returns UUID-shaped string", () => {
|
|
5
|
+
const id = v4();
|
|
6
|
+
expect(id).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$/);
|
|
7
|
+
});
|
|
8
|
+
it("v7 returns UUID-shaped string (v4 placeholder in Phase 0)", () => {
|
|
9
|
+
// Phase 0: v7 not yet implemented; delegates to crypto.randomUUID() (v4)
|
|
10
|
+
// Phase 1: will implement true UUID v7 generation
|
|
11
|
+
const id = v7();
|
|
12
|
+
expect(id).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
|
|
13
|
+
});
|
|
14
|
+
it("validate returns true for valid UUIDs", () => {
|
|
15
|
+
expect(validate("550e8400-e29b-41d4-a716-446655440000")).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
it("validate returns false for invalid strings", () => {
|
|
18
|
+
expect(validate("not-a-uuid")).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
it("NIL is the zero UUID", () => {
|
|
21
|
+
expect(NIL).toBe("00000000-0000-0000-0000-000000000000");
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=uuid.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.test.js","sourceRoot":"","sources":["../../src/compat/uuid.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAEvD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,yEAAyE;QACzE,kDAAkD;QAClD,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,QAAQ,CAAC,sCAAsC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ParsedId } from "../types";
|
|
2
|
+
export interface JsEngine {
|
|
3
|
+
generate(options: {
|
|
4
|
+
strategy?: string;
|
|
5
|
+
prefix?: string;
|
|
6
|
+
mode?: string;
|
|
7
|
+
count?: number;
|
|
8
|
+
}): string | string[];
|
|
9
|
+
parse(id: string): ParsedId;
|
|
10
|
+
isLegacy(id: string): boolean;
|
|
11
|
+
schemaVersion(): number;
|
|
12
|
+
isWasm(): boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function createJsEngine(): JsEngine;
|
|
15
|
+
//# sourceMappingURL=js-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js-engine.d.ts","sourceRoot":"","sources":["../../src/engine/js-engine.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,UAAU,CAAC;AA+HvD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,aAAa,IAAI,MAAM,CAAC;IACxB,MAAM,IAAI,OAAO,CAAC;CACnB;AAED,wBAAgB,cAAc,IAAI,QAAQ,CAkIzC"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// better-uuid — Pure JavaScript engine (WASM fallback)
|
|
3
|
+
//
|
|
4
|
+
// Real implementation using crypto.getRandomValues() — NO Math.random().
|
|
5
|
+
// Provides identical API to the WASM engine for seamless fallback.
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
import { BetterUuidError, GenerateError, ParseError } from "../errors";
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// UUID v4 generation (122 CSPRNG bits)
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
function generateV4() {
|
|
12
|
+
const bytes = cryptoGetRandom(16);
|
|
13
|
+
// Version 4
|
|
14
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
15
|
+
// Variant 10
|
|
16
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
17
|
+
return formatUuid(bytes);
|
|
18
|
+
}
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// UUID v7 generation (RFC 9562)
|
|
21
|
+
//
|
|
22
|
+
// 48-bit timestamp + 4-bit version + 12-bit counter + 2-bit variant + 62-bit random
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
let _v7LastTs = 0;
|
|
25
|
+
let _v7Counter = 0;
|
|
26
|
+
function generateV7(nowMs) {
|
|
27
|
+
if (nowMs < _v7LastTs) {
|
|
28
|
+
// Clock regression — emit v4 fallback to avoid duplicates
|
|
29
|
+
return generateV4();
|
|
30
|
+
}
|
|
31
|
+
let counter;
|
|
32
|
+
if (nowMs > _v7LastTs) {
|
|
33
|
+
// New millisecond — random counter start (11 bits = 0-2047)
|
|
34
|
+
const rand = cryptoGetRandom(2);
|
|
35
|
+
counter = ((rand[0] << 3) | (rand[1] >> 5)) & 0x7ff;
|
|
36
|
+
_v7LastTs = nowMs;
|
|
37
|
+
_v7Counter = counter;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
counter = _v7Counter + 1;
|
|
41
|
+
if (counter > 0x7ff) {
|
|
42
|
+
// Counter overflow — emit v4 to avoid duplicates
|
|
43
|
+
return generateV4();
|
|
44
|
+
}
|
|
45
|
+
_v7Counter = counter;
|
|
46
|
+
}
|
|
47
|
+
const bytes = cryptoGetRandom(16);
|
|
48
|
+
// Bytes 0-5: 48-bit timestamp (big-endian)
|
|
49
|
+
bytes[0] = (nowMs / 2 ** 40) & 0xff;
|
|
50
|
+
bytes[1] = (nowMs / 2 ** 32) & 0xff;
|
|
51
|
+
bytes[2] = (nowMs / 2 ** 24) & 0xff;
|
|
52
|
+
bytes[3] = (nowMs / 2 ** 16) & 0xff;
|
|
53
|
+
bytes[4] = (nowMs / 2 ** 8) & 0xff;
|
|
54
|
+
bytes[5] = nowMs & 0xff;
|
|
55
|
+
// Byte 6: version 7 (top nibble) + counter top 4 bits
|
|
56
|
+
bytes[6] = 0x70 | ((counter >> 8) & 0x0f);
|
|
57
|
+
// Byte 7: counter bottom 8 bits
|
|
58
|
+
bytes[7] = counter & 0xff;
|
|
59
|
+
// Byte 8: variant 10 (top 2 bits) + random
|
|
60
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
61
|
+
return formatUuid(bytes);
|
|
62
|
+
}
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// Formatting / parsing
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
function formatUuid(bytes) {
|
|
67
|
+
const h = (n) => n.toString(16).padStart(2, "0");
|
|
68
|
+
return (h(bytes[0]) + h(bytes[1]) + h(bytes[2]) + h(bytes[3]) + "-" +
|
|
69
|
+
h(bytes[4]) + h(bytes[5]) + "-" +
|
|
70
|
+
h(bytes[6]) + h(bytes[7]) + "-" +
|
|
71
|
+
h(bytes[8]) + h(bytes[9]) + "-" +
|
|
72
|
+
h(bytes[10]) + h(bytes[11]) + h(bytes[12]) + h(bytes[13]) + h(bytes[14]) + h(bytes[15]));
|
|
73
|
+
}
|
|
74
|
+
function parseUuidHex(s) {
|
|
75
|
+
if (s.length !== 36)
|
|
76
|
+
return null;
|
|
77
|
+
const b = new Uint8Array(16);
|
|
78
|
+
const hex = s.replace(/-/g, "");
|
|
79
|
+
if (hex.length !== 32)
|
|
80
|
+
return null;
|
|
81
|
+
for (let i = 0; i < 16; i++) {
|
|
82
|
+
const v = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
83
|
+
if (Number.isNaN(v))
|
|
84
|
+
return null;
|
|
85
|
+
b[i] = v;
|
|
86
|
+
}
|
|
87
|
+
return b;
|
|
88
|
+
}
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
// CSPRNG
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
function cryptoGetRandom(len) {
|
|
93
|
+
if (typeof globalThis.crypto?.getRandomValues !== "function") {
|
|
94
|
+
throw new BetterUuidError("ENTROPY_UNAVAILABLE", "crypto.getRandomValues is not available — cannot generate secure IDs");
|
|
95
|
+
}
|
|
96
|
+
const buf = new Uint8Array(len);
|
|
97
|
+
globalThis.crypto.getRandomValues(buf);
|
|
98
|
+
return buf;
|
|
99
|
+
}
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// Legacy detection
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
const LEGACY_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-([0-9a-f])[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
104
|
+
function isLegacyUuid(s) {
|
|
105
|
+
return LEGACY_UUID_RE.test(s);
|
|
106
|
+
}
|
|
107
|
+
export function createJsEngine() {
|
|
108
|
+
return {
|
|
109
|
+
generate(opts) {
|
|
110
|
+
const strategy = opts.strategy ?? "time";
|
|
111
|
+
const prefix = opts.prefix;
|
|
112
|
+
const mode = opts.mode;
|
|
113
|
+
const count = opts.count ?? 1;
|
|
114
|
+
// Safe mode: force UUID v4, no prefix
|
|
115
|
+
if (mode === "safe") {
|
|
116
|
+
if (count > 1)
|
|
117
|
+
return Array.from({ length: count }, () => generateV4());
|
|
118
|
+
return generateV4();
|
|
119
|
+
}
|
|
120
|
+
const gen = () => {
|
|
121
|
+
const nowMs = Date.now();
|
|
122
|
+
let id;
|
|
123
|
+
if (strategy === "uuidv4" || strategy === "v4") {
|
|
124
|
+
id = generateV4();
|
|
125
|
+
}
|
|
126
|
+
else if (strategy === "time" || strategy === "v7" || strategy === "uuidv7") {
|
|
127
|
+
id = generateV7(nowMs);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
throw new GenerateError(`Unsupported strategy: "${strategy}"`, strategy);
|
|
131
|
+
}
|
|
132
|
+
return prefix ? `${prefix}_${id}` : id;
|
|
133
|
+
};
|
|
134
|
+
if (count > 1)
|
|
135
|
+
return Array.from({ length: count }, gen);
|
|
136
|
+
return gen();
|
|
137
|
+
},
|
|
138
|
+
parse(id) {
|
|
139
|
+
// Native ID: has prefix separator
|
|
140
|
+
if (id.includes("_")) {
|
|
141
|
+
const sepPos = id.indexOf("_");
|
|
142
|
+
const prefix = id.slice(0, sepPos);
|
|
143
|
+
const body = id.slice(sepPos + 1);
|
|
144
|
+
// Validate prefix
|
|
145
|
+
if (!/^[a-z0-9]{1,12}$/.test(prefix)) {
|
|
146
|
+
throw new ParseError(`Invalid prefix: "${prefix}"`, 0, prefix);
|
|
147
|
+
}
|
|
148
|
+
const bytes = parseUuidHex(body);
|
|
149
|
+
if (!bytes) {
|
|
150
|
+
throw new ParseError(`Invalid format: "${id.slice(0, 20)}"`, 0, id.slice(0, 20));
|
|
151
|
+
}
|
|
152
|
+
const versionNibble = (body[14] ?? "").toUpperCase();
|
|
153
|
+
const variantNibble = (body[19] ?? "").toUpperCase();
|
|
154
|
+
if (!["8", "9", "A", "B"].includes(variantNibble)) {
|
|
155
|
+
throw new ParseError(`Invalid format: "${id.slice(0, 20)}"`, 0, id.slice(0, 20));
|
|
156
|
+
}
|
|
157
|
+
let strategy = "uuidv4";
|
|
158
|
+
let timestampMs;
|
|
159
|
+
if (versionNibble === "7") {
|
|
160
|
+
strategy = "time";
|
|
161
|
+
// Extract 48-bit timestamp from first 6 bytes
|
|
162
|
+
const hex = body.slice(0, 8) + body.slice(9, 13);
|
|
163
|
+
timestampMs = BigInt(Number.parseInt(hex, 16));
|
|
164
|
+
}
|
|
165
|
+
else if (versionNibble === "4") {
|
|
166
|
+
strategy = "uuidv4";
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
strategy = `unknown(${versionNibble})`;
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
legacy: false,
|
|
173
|
+
prefix,
|
|
174
|
+
strategy,
|
|
175
|
+
schemaVersion: 1,
|
|
176
|
+
timestampMs,
|
|
177
|
+
entropy: body.replace(/-/g, ""),
|
|
178
|
+
nodeId: undefined,
|
|
179
|
+
region: undefined,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
// Legacy UUID
|
|
183
|
+
if (isLegacyUuid(id)) {
|
|
184
|
+
const version = (id[14] ?? "").toLowerCase();
|
|
185
|
+
let strategy = "uuidv4";
|
|
186
|
+
let timestampMs;
|
|
187
|
+
if (version === "7") {
|
|
188
|
+
strategy = "time";
|
|
189
|
+
const hex = id.slice(0, 8) + id.slice(9, 13);
|
|
190
|
+
timestampMs = BigInt(Number.parseInt(hex, 16));
|
|
191
|
+
}
|
|
192
|
+
else if (version === "4") {
|
|
193
|
+
strategy = "uuidv4";
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
strategy = `unknown(${version})`;
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
legacy: true,
|
|
200
|
+
prefix: undefined,
|
|
201
|
+
strategy,
|
|
202
|
+
schemaVersion: undefined,
|
|
203
|
+
timestampMs,
|
|
204
|
+
entropy: id.replace(/-/g, ""),
|
|
205
|
+
nodeId: undefined,
|
|
206
|
+
region: undefined,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
throw new ParseError(`Invalid format: "${id.slice(0, 20)}"`, 0, id.slice(0, 20));
|
|
210
|
+
},
|
|
211
|
+
isLegacy(id) {
|
|
212
|
+
return isLegacyUuid(id);
|
|
213
|
+
},
|
|
214
|
+
schemaVersion() {
|
|
215
|
+
return 1;
|
|
216
|
+
},
|
|
217
|
+
isWasm() {
|
|
218
|
+
return false;
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=js-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js-engine.js","sourceRoot":"","sources":["../../src/engine/js-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js-engine.test.d.ts","sourceRoot":"","sources":["../../src/engine/js-engine.test.ts"],"names":[],"mappings":""}
|