@typed/id 0.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 +21 -0
- package/README.md +5 -0
- package/dist/cjs/GetRandomValues.js +59 -0
- package/dist/cjs/GetRandomValues.js.map +1 -0
- package/dist/cjs/NanoId.js +55 -0
- package/dist/cjs/NanoId.js.map +1 -0
- package/dist/cjs/Schema.js +24 -0
- package/dist/cjs/Schema.js.map +1 -0
- package/dist/cjs/Uuid.js +55 -0
- package/dist/cjs/Uuid.js.map +1 -0
- package/dist/cjs/index.js +39 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/dts/GetRandomValues.d.ts +33 -0
- package/dist/dts/GetRandomValues.d.ts.map +1 -0
- package/dist/dts/NanoId.d.ts +56 -0
- package/dist/dts/NanoId.d.ts.map +1 -0
- package/dist/dts/Schema.d.ts +15 -0
- package/dist/dts/Schema.d.ts.map +1 -0
- package/dist/dts/Uuid.d.ts +53 -0
- package/dist/dts/Uuid.d.ts.map +1 -0
- package/dist/dts/index.d.ts +16 -0
- package/dist/dts/index.d.ts.map +1 -0
- package/dist/esm/GetRandomValues.js +52 -0
- package/dist/esm/GetRandomValues.js.map +1 -0
- package/dist/esm/NanoId.js +47 -0
- package/dist/esm/NanoId.js.map +1 -0
- package/dist/esm/Schema.js +15 -0
- package/dist/esm/Schema.js.map +1 -0
- package/dist/esm/Uuid.js +63 -0
- package/dist/esm/Uuid.js.map +1 -0
- package/dist/esm/index.js +16 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +4 -0
- package/package.json +64 -0
- package/src/GetRandomValues.ts +73 -0
- package/src/NanoId.ts +87 -0
- package/src/Schema.ts +21 -0
- package/src/Uuid.ts +99 -0
- package/src/index.ts +16 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023-present The Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.webCrypto = exports.pseudoRandom = exports.nodeCrypto = exports.getRandomValues = exports.GetRandomValues = void 0;
|
|
7
|
+
var Context = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@typed/context"));
|
|
8
|
+
var _effect = /*#__PURE__*/require("effect");
|
|
9
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
10
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /**
|
|
11
|
+
* @since 1.0.0
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
*/
|
|
16
|
+
const GetRandomValues = exports.GetRandomValues = /*#__PURE__*/Context.Fn()(_ => class GetRandomValues extends _("@typed/id/GetRandomValues") {});
|
|
17
|
+
const getRandomValuesWeb = (crypto, length) => crypto.getRandomValues(new Uint8Array(length));
|
|
18
|
+
/**
|
|
19
|
+
* @since 1.0.0
|
|
20
|
+
*/
|
|
21
|
+
const webCrypto = crypto => GetRandomValues.implement(length => _effect.Effect.sync(() => getRandomValuesWeb(crypto, length)));
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
|
|
23
|
+
exports.webCrypto = webCrypto;
|
|
24
|
+
const getRandomValuesNode = (crypto, length) => {
|
|
25
|
+
const bytes = crypto.randomBytes(length);
|
|
26
|
+
const view = new Uint8Array(length);
|
|
27
|
+
for (let i = 0; i < bytes.length; ++i) {
|
|
28
|
+
view[i] = bytes[i];
|
|
29
|
+
}
|
|
30
|
+
return view;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* @since 1.0.0
|
|
34
|
+
*/
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
|
|
36
|
+
const nodeCrypto = crypto => GetRandomValues.implement(length => _effect.Effect.sync(() => getRandomValuesNode(crypto, length)));
|
|
37
|
+
/**
|
|
38
|
+
* @since 1.0.0
|
|
39
|
+
*/
|
|
40
|
+
exports.nodeCrypto = nodeCrypto;
|
|
41
|
+
const pseudoRandom = exports.pseudoRandom = /*#__PURE__*/GetRandomValues.implement(length => _effect.Effect.gen(function* (_) {
|
|
42
|
+
const view = new Uint8Array(length);
|
|
43
|
+
for (let i = 0; i < length; ++i) {
|
|
44
|
+
view[i] = yield* _(_effect.Random.nextInt);
|
|
45
|
+
}
|
|
46
|
+
return view;
|
|
47
|
+
}));
|
|
48
|
+
/**
|
|
49
|
+
* @since 1.0.0
|
|
50
|
+
*/
|
|
51
|
+
const getRandomValues = exports.getRandomValues = /*#__PURE__*/GetRandomValues.layer( /*#__PURE__*/_effect.Effect.gen(function* (_) {
|
|
52
|
+
if (typeof crypto === "undefined") {
|
|
53
|
+
const crypto = yield* _(_effect.Effect.promise(() => Promise.resolve().then(() => _interopRequireWildcard(require("node:crypto")))));
|
|
54
|
+
return length => _effect.Effect.sync(() => getRandomValuesNode(crypto, length));
|
|
55
|
+
} else {
|
|
56
|
+
return length => _effect.Effect.sync(() => getRandomValuesWeb(crypto, length));
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
//# sourceMappingURL=GetRandomValues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GetRandomValues.js","names":["Context","_interopRequireWildcard","require","_effect","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","GetRandomValues","exports","Fn","_","getRandomValuesWeb","crypto","length","getRandomValues","Uint8Array","webCrypto","implement","Effect","sync","getRandomValuesNode","bytes","randomBytes","view","nodeCrypto","pseudoRandom","gen","Random","nextInt","layer","promise","Promise","resolve","then"],"sources":["../../src/GetRandomValues.ts"],"sourcesContent":[null],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.nanoId = exports.makeNanoIdSeed = exports.makeNanoId = exports.isNanoId = exports.NanoId = void 0;
|
|
7
|
+
var _effect = /*#__PURE__*/require("effect");
|
|
8
|
+
var _GetRandomValues = /*#__PURE__*/require("./GetRandomValues");
|
|
9
|
+
/**
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const nanoIdPattern = /[0-9a-zA-Z_-]/;
|
|
14
|
+
/**
|
|
15
|
+
* @since 1.0.0
|
|
16
|
+
*/
|
|
17
|
+
const isNanoId = id => nanoIdPattern.test(id);
|
|
18
|
+
/**
|
|
19
|
+
* @since 1.0.0
|
|
20
|
+
*/
|
|
21
|
+
exports.isNanoId = isNanoId;
|
|
22
|
+
const NanoId = exports.NanoId = /*#__PURE__*/_effect.Brand.refined(isNanoId, input => _effect.Brand.error(`Expected a NanoID but received ${input}.`));
|
|
23
|
+
const numToCharacter = byte => {
|
|
24
|
+
byte &= 63;
|
|
25
|
+
if (byte < 36) {
|
|
26
|
+
// `0-9a-z`
|
|
27
|
+
return byte.toString(36);
|
|
28
|
+
} else if (byte < 62) {
|
|
29
|
+
// `A-Z`
|
|
30
|
+
return (byte - 26).toString(36).toUpperCase();
|
|
31
|
+
} else if (byte > 62) {
|
|
32
|
+
return "-";
|
|
33
|
+
} else {
|
|
34
|
+
return "_";
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const characters = /*#__PURE__*/Array.from({
|
|
38
|
+
length: 64
|
|
39
|
+
}, (_, i) => {
|
|
40
|
+
return numToCharacter(i);
|
|
41
|
+
});
|
|
42
|
+
/**
|
|
43
|
+
* @since 1.0.0
|
|
44
|
+
*/
|
|
45
|
+
const nanoId = seed => NanoId(seed.reduce((id, x) => id + characters[x], ""));
|
|
46
|
+
/**
|
|
47
|
+
* @since 1.0.0
|
|
48
|
+
*/
|
|
49
|
+
exports.nanoId = nanoId;
|
|
50
|
+
const makeNanoIdSeed = exports.makeNanoIdSeed = /*#__PURE__*/_GetRandomValues.GetRandomValues.apply(21);
|
|
51
|
+
/**
|
|
52
|
+
* @since 1.0.0
|
|
53
|
+
*/
|
|
54
|
+
const makeNanoId = exports.makeNanoId = /*#__PURE__*/_effect.Effect.map(makeNanoIdSeed, nanoId);
|
|
55
|
+
//# sourceMappingURL=NanoId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NanoId.js","names":["_effect","require","_GetRandomValues","nanoIdPattern","isNanoId","id","test","exports","NanoId","Brand","refined","input","error","numToCharacter","byte","toString","toUpperCase","characters","Array","from","length","_","i","nanoId","seed","reduce","x","makeNanoIdSeed","GetRandomValues","apply","makeNanoId","Effect","map"],"sources":["../../src/NanoId.ts"],"sourcesContent":[null],"mappings":";;;;;;AAIA,IAAAA,OAAA,gBAAAC,OAAA;AACA,IAAAC,gBAAA,gBAAAD,OAAA;AALA;;;;AAOA,MAAME,aAAa,GAAG,eAAe;AAErC;;;AAGO,MAAMC,QAAQ,GAAIC,EAAU,IAAmBF,aAAa,CAACG,IAAI,CAACD,EAAE,CAAC;AAO5E;;;AAAAE,OAAA,CAAAH,QAAA,GAAAA,QAAA;AAGO,MAAMI,MAAM,GAAAD,OAAA,CAAAC,MAAA,gBAAGC,aAAK,CAACC,OAAO,CACjCN,QAAQ,EACPO,KAAK,IAAKF,aAAK,CAACG,KAAK,CAAC,kCAAkCD,KAAK,GAAG,CAAC,CACnE;AA6BD,MAAME,cAAc,GAAIC,IAAY,IAAY;EAC9CA,IAAI,IAAI,EAAE;EACV,IAAIA,IAAI,GAAG,EAAE,EAAE;IACb;IACA,OAAOA,IAAI,CAACC,QAAQ,CAAC,EAAE,CAAC;EAC1B,CAAC,MAAM,IAAID,IAAI,GAAG,EAAE,EAAE;IACpB;IACA,OAAO,CAACA,IAAI,GAAG,EAAE,EAAEC,QAAQ,CAAC,EAAE,CAAC,CAACC,WAAW,EAAE;EAC/C,CAAC,MAAM,IAAIF,IAAI,GAAG,EAAE,EAAE;IACpB,OAAO,GAAG;EACZ,CAAC,MAAM;IACL,OAAO,GAAG;EACZ;AACF,CAAC;AAED,MAAMG,UAAU,gBAAGC,KAAK,CAACC,IAAI,CAAC;EAAEC,MAAM,EAAE;AAAE,CAAE,EAAE,CAACC,CAAC,EAAEC,CAAC,KAAI;EACrD,OAAOT,cAAc,CAACS,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF;;;AAGO,MAAMC,MAAM,GAAIC,IAAgB,IAAahB,MAAM,CAACgB,IAAI,CAACC,MAAM,CAAC,CAACpB,EAAE,EAAEqB,CAAC,KAAKrB,EAAE,GAAGY,UAAU,CAACS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAE1G;;;AAAAnB,OAAA,CAAAgB,MAAA,GAAAA,MAAA;AAGO,MAAMI,cAAc,GAAApB,OAAA,CAAAoB,cAAA,gBAAsDC,gCAAe,CAACC,KAAK,CAAC,EAAE,CAAQ;AAEjH;;;AAGO,MAAMC,UAAU,GAAAvB,OAAA,CAAAuB,UAAA,gBAAkDC,cAAM,CAACC,GAAG,CAACL,cAAc,EAAEJ,MAAM,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.uuid = exports.nanoId = void 0;
|
|
7
|
+
var Schema = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/schema/Schema"));
|
|
8
|
+
var NanoId = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("./NanoId"));
|
|
9
|
+
var Uuid = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("./Uuid"));
|
|
10
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
11
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
12
|
+
/**
|
|
13
|
+
* @since 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @since 1.0.0
|
|
18
|
+
*/
|
|
19
|
+
const uuid = exports.uuid = /*#__PURE__*/Schema.string.pipe( /*#__PURE__*/Schema.fromBrand(Uuid.Uuid));
|
|
20
|
+
/**
|
|
21
|
+
* @since 1.0.0
|
|
22
|
+
*/
|
|
23
|
+
const nanoId = exports.nanoId = /*#__PURE__*/Schema.string.pipe( /*#__PURE__*/Schema.fromBrand(NanoId.NanoId));
|
|
24
|
+
//# sourceMappingURL=Schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Schema.js","names":["Schema","_interopRequireWildcard","require","NanoId","Uuid","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","uuid","exports","string","pipe","fromBrand","nanoId"],"sources":["../../src/Schema.ts"],"sourcesContent":[null],"mappings":";;;;;;AAIA,IAAAA,MAAA,gBAAAC,uBAAA,eAAAC,OAAA;AACA,IAAAC,MAAA,gBAAAF,uBAAA,eAAAC,OAAA;AACA,IAAAE,IAAA,gBAAAH,uBAAA,eAAAC,OAAA;AAA8B,SAAAG,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAL,wBAAAK,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAc,CAAA,SAAAI,CAAA,GAAAR,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAI,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAI,CAAA,IAAAV,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAgB,GAAA,CAAAnB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAN9B;;;;AAQA;;;AAGO,MAAMY,IAAI,GAAAC,OAAA,CAAAD,IAAA,gBAAqC1B,MAAM,CAAC4B,MAAM,CAACC,IAAI,eACtE7B,MAAM,CAAC8B,SAAS,CAAC1B,IAAI,CAACA,IAAI,CAAC,CAC5B;AAED;;;AAGO,MAAM2B,MAAM,GAAAJ,OAAA,CAAAI,MAAA,gBAAyC/B,MAAM,CAAC4B,MAAM,CAACC,IAAI,eAC5E7B,MAAM,CAAC8B,SAAS,CAAC3B,MAAM,CAACA,MAAM,CAAC,CAChC"}
|
package/dist/cjs/Uuid.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.makeUuidSeed = exports.makeUuid = exports.isUuid = exports.Uuid = void 0;
|
|
7
|
+
exports.uuid4 = uuid4;
|
|
8
|
+
var Brand = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Brand"));
|
|
9
|
+
var Effect = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Effect"));
|
|
10
|
+
var _GetRandomValues = /*#__PURE__*/require("./GetRandomValues");
|
|
11
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
12
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
13
|
+
/**
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
18
|
+
/**
|
|
19
|
+
* Returns `true` if a string is a UUID.
|
|
20
|
+
* @since 1.0.0
|
|
21
|
+
*/
|
|
22
|
+
const isUuid = value => uuidPattern.test(value);
|
|
23
|
+
/**
|
|
24
|
+
* @since 1.0.0
|
|
25
|
+
*/
|
|
26
|
+
exports.isUuid = isUuid;
|
|
27
|
+
const Uuid = exports.Uuid = /*#__PURE__*/Brand.refined(isUuid, input => Brand.error(`Expected a UUID but received ${input}.`));
|
|
28
|
+
/**
|
|
29
|
+
* @since 1.0.0
|
|
30
|
+
*/
|
|
31
|
+
const makeUuidSeed = exports.makeUuidSeed = /*#__PURE__*/_GetRandomValues.GetRandomValues.apply(32);
|
|
32
|
+
/**
|
|
33
|
+
* @since 1.0.0
|
|
34
|
+
*/
|
|
35
|
+
const makeUuid = exports.makeUuid = /*#__PURE__*/Effect.map(makeUuidSeed, uuid4);
|
|
36
|
+
/**
|
|
37
|
+
* Convert array of 16 byte values to UUID string format of the form:
|
|
38
|
+
* XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
|
|
39
|
+
*/
|
|
40
|
+
const byteToHex = [];
|
|
41
|
+
for (let i = 0; i < 256; ++i) {
|
|
42
|
+
byteToHex.push((i + 0x100).toString(16).slice(1));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* @since 1.0.0
|
|
46
|
+
*/
|
|
47
|
+
function uuid4(seed) {
|
|
48
|
+
// Note: Be careful editing this code! It's been tuned for performance
|
|
49
|
+
// and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
|
|
50
|
+
//
|
|
51
|
+
// Note to future-self: No, you can't remove the `toLowerCase()` call.
|
|
52
|
+
// REF: https://github.com/uuidjs/uuid/pull/677#issuecomment-1757351351
|
|
53
|
+
return (byteToHex[seed[0]] + byteToHex[seed[1]] + byteToHex[seed[2]] + byteToHex[seed[3]] + "-" + byteToHex[seed[4]] + byteToHex[seed[5]] + "-" + byteToHex[seed[6]] + byteToHex[seed[7]] + "-" + byteToHex[seed[8]] + byteToHex[seed[9]] + "-" + byteToHex[seed[10]] + byteToHex[seed[11]] + byteToHex[seed[12]] + byteToHex[seed[13]] + byteToHex[seed[14]] + byteToHex[seed[15]]).toLowerCase();
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=Uuid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Uuid.js","names":["Brand","_interopRequireWildcard","require","Effect","_GetRandomValues","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","uuidPattern","isUuid","value","test","exports","Uuid","refined","input","error","makeUuidSeed","GetRandomValues","apply","makeUuid","map","uuid4","byteToHex","push","toString","slice","seed","toLowerCase"],"sources":["../../src/Uuid.ts"],"sourcesContent":[null],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _GetRandomValues = /*#__PURE__*/require("./GetRandomValues");
|
|
7
|
+
Object.keys(_GetRandomValues).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _GetRandomValues[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return _GetRandomValues[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
var _NanoId = /*#__PURE__*/require("./NanoId");
|
|
18
|
+
Object.keys(_NanoId).forEach(function (key) {
|
|
19
|
+
if (key === "default" || key === "__esModule") return;
|
|
20
|
+
if (key in exports && exports[key] === _NanoId[key]) return;
|
|
21
|
+
Object.defineProperty(exports, key, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return _NanoId[key];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
var _Uuid = /*#__PURE__*/require("./Uuid");
|
|
29
|
+
Object.keys(_Uuid).forEach(function (key) {
|
|
30
|
+
if (key === "default" || key === "__esModule") return;
|
|
31
|
+
if (key in exports && exports[key] === _Uuid[key]) return;
|
|
32
|
+
Object.defineProperty(exports, key, {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
get: function () {
|
|
35
|
+
return _Uuid[key];
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_GetRandomValues","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_NanoId","_Uuid"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":";;;;;AAOA,IAAAA,gBAAA,gBAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,gBAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,gBAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,gBAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AAIA,IAAAK,OAAA,gBAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,OAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,OAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,OAAA,CAAAL,GAAA;IAAA;EAAA;AAAA;AAIA,IAAAM,KAAA,gBAAAV,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAQ,KAAA,EAAAP,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAM,KAAA,CAAAN,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,KAAA,CAAAN,GAAA;IAAA;EAAA;AAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Context from "@typed/context";
|
|
5
|
+
import type { Layer } from "effect";
|
|
6
|
+
import { Effect } from "effect";
|
|
7
|
+
/**
|
|
8
|
+
* @since 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
export declare const GetRandomValues: Context.Fn<{
|
|
11
|
+
readonly __identifier__: "@typed/id/GetRandomValues";
|
|
12
|
+
}, (length: number) => Effect.Effect<never, never, Uint8Array>>;
|
|
13
|
+
/**
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
*/
|
|
16
|
+
export type GetRandomValues = Context.Fn.Identifier<typeof GetRandomValues>;
|
|
17
|
+
/**
|
|
18
|
+
* @since 1.0.0
|
|
19
|
+
*/
|
|
20
|
+
export declare const webCrypto: (crypto: Crypto) => Layer.Layer<never, never, GetRandomValues>;
|
|
21
|
+
/**
|
|
22
|
+
* @since 1.0.0
|
|
23
|
+
*/
|
|
24
|
+
export declare const nodeCrypto: (crypto: typeof import("node:crypto")) => Layer.Layer<never, never, GetRandomValues>;
|
|
25
|
+
/**
|
|
26
|
+
* @since 1.0.0
|
|
27
|
+
*/
|
|
28
|
+
export declare const pseudoRandom: Layer.Layer<never, never, GetRandomValues>;
|
|
29
|
+
/**
|
|
30
|
+
* @since 1.0.0
|
|
31
|
+
*/
|
|
32
|
+
export declare const getRandomValues: Layer.Layer<never, never, GetRandomValues>;
|
|
33
|
+
//# sourceMappingURL=GetRandomValues.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GetRandomValues.d.ts","sourceRoot":"","sources":["../../src/GetRandomValues.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAA;AAEvC;;GAEG;AACH,eAAO,MAAM,eAAe;;YAAuB,MAAM,KAAK,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAEpG,CAAA;AACD;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;AAI3E;;GAEG;AACH,eAAO,MAAM,SAAS,WAAY,MAAM,KAAG,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,CACU,CAAA;AAY9F;;GAEG;AAEH,eAAO,MAAM,UAAU,WAAY,cAAc,aAAa,CAAC,KAAG,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,CACZ,CAAA;AAE/F;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,CAUnE,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,CAUtE,CAAA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import { Brand, Effect } from "effect";
|
|
5
|
+
import { GetRandomValues } from "./GetRandomValues";
|
|
6
|
+
/**
|
|
7
|
+
* @since 1.0.0
|
|
8
|
+
*/
|
|
9
|
+
export declare const isNanoId: (id: string) => id is NanoId;
|
|
10
|
+
/**
|
|
11
|
+
* @since 1.0.0
|
|
12
|
+
*/
|
|
13
|
+
export type NanoId = string & Brand.Brand<"@typed/id/NanoId">;
|
|
14
|
+
/**
|
|
15
|
+
* @since 1.0.0
|
|
16
|
+
*/
|
|
17
|
+
export declare const NanoId: Brand.Brand.Constructor<NanoId>;
|
|
18
|
+
/**
|
|
19
|
+
* @since 1.0.0
|
|
20
|
+
*/
|
|
21
|
+
export type NanoIdSeed = readonly [
|
|
22
|
+
zero: number,
|
|
23
|
+
one: number,
|
|
24
|
+
two: number,
|
|
25
|
+
three: number,
|
|
26
|
+
four: number,
|
|
27
|
+
five: number,
|
|
28
|
+
six: number,
|
|
29
|
+
seven: number,
|
|
30
|
+
eight: number,
|
|
31
|
+
nine: number,
|
|
32
|
+
ten: number,
|
|
33
|
+
eleven: number,
|
|
34
|
+
twelve: number,
|
|
35
|
+
thirteen: number,
|
|
36
|
+
fourteen: number,
|
|
37
|
+
fifteen: number,
|
|
38
|
+
sixteen: number,
|
|
39
|
+
seventeen: number,
|
|
40
|
+
eighteen: number,
|
|
41
|
+
nineteen: number,
|
|
42
|
+
twenty: number
|
|
43
|
+
];
|
|
44
|
+
/**
|
|
45
|
+
* @since 1.0.0
|
|
46
|
+
*/
|
|
47
|
+
export declare const nanoId: (seed: NanoIdSeed) => NanoId;
|
|
48
|
+
/**
|
|
49
|
+
* @since 1.0.0
|
|
50
|
+
*/
|
|
51
|
+
export declare const makeNanoIdSeed: Effect.Effect<GetRandomValues, never, NanoIdSeed>;
|
|
52
|
+
/**
|
|
53
|
+
* @since 1.0.0
|
|
54
|
+
*/
|
|
55
|
+
export declare const makeNanoId: Effect.Effect<GetRandomValues, never, NanoId>;
|
|
56
|
+
//# sourceMappingURL=NanoId.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NanoId.d.ts","sourceRoot":"","sources":["../../src/NanoId.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAInD;;GAEG;AACH,eAAO,MAAM,QAAQ,OAAQ,MAAM,iBAAyC,CAAA;AAE5E;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;AAE7D;;GAEG;AACH,eAAO,MAAM,MAAM,iCAGlB,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS;IAChC,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,MAAM;IACf,SAAS,EAAE,MAAM;IACjB,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,MAAM;CACf,CAAA;AAqBD;;GAEG;AACH,eAAO,MAAM,MAAM,wBAAuB,MAAgE,CAAA;AAE1G;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,UAAU,CAAoC,CAAA;AAEjH;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,CAAsC,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Schema from "@effect/schema/Schema";
|
|
5
|
+
import * as NanoId from "./NanoId";
|
|
6
|
+
import * as Uuid from "./Uuid";
|
|
7
|
+
/**
|
|
8
|
+
* @since 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
export declare const uuid: Schema.Schema<string, Uuid.Uuid>;
|
|
11
|
+
/**
|
|
12
|
+
* @since 1.0.0
|
|
13
|
+
*/
|
|
14
|
+
export declare const nanoId: Schema.Schema<string, NanoId.NanoId>;
|
|
15
|
+
//# sourceMappingURL=Schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../src/Schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAA;AAC/C,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAClC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAA;AAE9B;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAEjD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAEvD,CAAA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Brand from "effect/Brand";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import { GetRandomValues } from "./GetRandomValues";
|
|
7
|
+
/**
|
|
8
|
+
* Returns `true` if a string is a UUID.
|
|
9
|
+
* @since 1.0.0
|
|
10
|
+
*/
|
|
11
|
+
export declare const isUuid: (value: string) => value is Uuid;
|
|
12
|
+
/**
|
|
13
|
+
* @since 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
export type Uuid = string & Brand.Brand<"@typed/id/UUID">;
|
|
16
|
+
/**
|
|
17
|
+
* @since 1.0.0
|
|
18
|
+
*/
|
|
19
|
+
export declare const Uuid: Brand.Brand.Constructor<Uuid>;
|
|
20
|
+
/**
|
|
21
|
+
* @since 1.0.0
|
|
22
|
+
*/
|
|
23
|
+
export type UuidSeed = readonly [
|
|
24
|
+
zero: number,
|
|
25
|
+
one: number,
|
|
26
|
+
two: number,
|
|
27
|
+
three: number,
|
|
28
|
+
four: number,
|
|
29
|
+
five: number,
|
|
30
|
+
six: number,
|
|
31
|
+
seven: number,
|
|
32
|
+
eight: number,
|
|
33
|
+
nine: number,
|
|
34
|
+
ten: number,
|
|
35
|
+
eleven: number,
|
|
36
|
+
twelve: number,
|
|
37
|
+
thirteen: number,
|
|
38
|
+
fourteen: number,
|
|
39
|
+
fifteen: number
|
|
40
|
+
];
|
|
41
|
+
/**
|
|
42
|
+
* @since 1.0.0
|
|
43
|
+
*/
|
|
44
|
+
export declare const makeUuidSeed: Effect.Effect<GetRandomValues, never, UuidSeed>;
|
|
45
|
+
/**
|
|
46
|
+
* @since 1.0.0
|
|
47
|
+
*/
|
|
48
|
+
export declare const makeUuid: Effect.Effect<GetRandomValues, never, Uuid>;
|
|
49
|
+
/**
|
|
50
|
+
* @since 1.0.0
|
|
51
|
+
*/
|
|
52
|
+
export declare function uuid4(seed: UuidSeed): Uuid;
|
|
53
|
+
//# sourceMappingURL=Uuid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Uuid.d.ts","sourceRoot":"","sources":["../../src/Uuid.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAInD;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,IAAI,IAAgE,CAAA;AAEjH;;GAEG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;AACzD;;GAEG;AACH,eAAO,MAAM,IAAI,+BAAgG,CAAA;AAEjH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS;IAC9B,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,MAAM;CAChB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,QAAQ,CAAoC,CAAA;AAE7G;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,IAAI,CAAmC,CAAA;AAYpG;;GAEG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CA4B1C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.18.0
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* @since 1.18.0
|
|
6
|
+
*/
|
|
7
|
+
export * from "./GetRandomValues";
|
|
8
|
+
/**
|
|
9
|
+
* @since 1.18.0
|
|
10
|
+
*/
|
|
11
|
+
export * from "./NanoId";
|
|
12
|
+
/**
|
|
13
|
+
* @since 1.18.0
|
|
14
|
+
*/
|
|
15
|
+
export * from "./Uuid";
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,cAAc,mBAAmB,CAAA;AACjC;;GAEG;AACH,cAAc,UAAU,CAAA;AACxB;;GAEG;AACH,cAAc,QAAQ,CAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Context from "@typed/context";
|
|
5
|
+
import { Effect, Random } from "effect";
|
|
6
|
+
/**
|
|
7
|
+
* @since 1.0.0
|
|
8
|
+
*/
|
|
9
|
+
export const GetRandomValues = Context.Fn()((_) => class GetRandomValues extends _("@typed/id/GetRandomValues") {
|
|
10
|
+
});
|
|
11
|
+
const getRandomValuesWeb = (crypto, length) => crypto.getRandomValues(new Uint8Array(length));
|
|
12
|
+
/**
|
|
13
|
+
* @since 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
export const webCrypto = (crypto) => GetRandomValues.implement((length) => Effect.sync(() => getRandomValuesWeb(crypto, length)));
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
|
|
17
|
+
const getRandomValuesNode = (crypto, length) => {
|
|
18
|
+
const bytes = crypto.randomBytes(length);
|
|
19
|
+
const view = new Uint8Array(length);
|
|
20
|
+
for (let i = 0; i < bytes.length; ++i) {
|
|
21
|
+
view[i] = bytes[i];
|
|
22
|
+
}
|
|
23
|
+
return view;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* @since 1.0.0
|
|
27
|
+
*/
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
|
|
29
|
+
export const nodeCrypto = (crypto) => GetRandomValues.implement((length) => Effect.sync(() => getRandomValuesNode(crypto, length)));
|
|
30
|
+
/**
|
|
31
|
+
* @since 1.0.0
|
|
32
|
+
*/
|
|
33
|
+
export const pseudoRandom = GetRandomValues.implement((length) => Effect.gen(function* (_) {
|
|
34
|
+
const view = new Uint8Array(length);
|
|
35
|
+
for (let i = 0; i < length; ++i) {
|
|
36
|
+
view[i] = yield* _(Random.nextInt);
|
|
37
|
+
}
|
|
38
|
+
return view;
|
|
39
|
+
}));
|
|
40
|
+
/**
|
|
41
|
+
* @since 1.0.0
|
|
42
|
+
*/
|
|
43
|
+
export const getRandomValues = GetRandomValues.layer(Effect.gen(function* (_) {
|
|
44
|
+
if (typeof crypto === "undefined") {
|
|
45
|
+
const crypto = yield* _(Effect.promise(() => import("node:crypto")));
|
|
46
|
+
return (length) => Effect.sync(() => getRandomValuesNode(crypto, length));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
return (length) => Effect.sync(() => getRandomValuesWeb(crypto, length));
|
|
50
|
+
}
|
|
51
|
+
}));
|
|
52
|
+
//# sourceMappingURL=GetRandomValues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GetRandomValues.js","sourceRoot":"","sources":["../../src/GetRandomValues.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import { Brand, Effect } from "effect";
|
|
5
|
+
import { GetRandomValues } from "./GetRandomValues";
|
|
6
|
+
const nanoIdPattern = /[0-9a-zA-Z_-]/;
|
|
7
|
+
/**
|
|
8
|
+
* @since 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
export const isNanoId = (id) => nanoIdPattern.test(id);
|
|
11
|
+
/**
|
|
12
|
+
* @since 1.0.0
|
|
13
|
+
*/
|
|
14
|
+
export const NanoId = Brand.refined(isNanoId, (input) => Brand.error(`Expected a NanoID but received ${input}.`));
|
|
15
|
+
const numToCharacter = (byte) => {
|
|
16
|
+
byte &= 63;
|
|
17
|
+
if (byte < 36) {
|
|
18
|
+
// `0-9a-z`
|
|
19
|
+
return byte.toString(36);
|
|
20
|
+
}
|
|
21
|
+
else if (byte < 62) {
|
|
22
|
+
// `A-Z`
|
|
23
|
+
return (byte - 26).toString(36).toUpperCase();
|
|
24
|
+
}
|
|
25
|
+
else if (byte > 62) {
|
|
26
|
+
return "-";
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return "_";
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const characters = Array.from({ length: 64 }, (_, i) => {
|
|
33
|
+
return numToCharacter(i);
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* @since 1.0.0
|
|
37
|
+
*/
|
|
38
|
+
export const nanoId = (seed) => NanoId(seed.reduce((id, x) => id + characters[x], ""));
|
|
39
|
+
/**
|
|
40
|
+
* @since 1.0.0
|
|
41
|
+
*/
|
|
42
|
+
export const makeNanoIdSeed = GetRandomValues.apply(21);
|
|
43
|
+
/**
|
|
44
|
+
* @since 1.0.0
|
|
45
|
+
*/
|
|
46
|
+
export const makeNanoId = Effect.map(makeNanoIdSeed, nanoId);
|
|
47
|
+
//# sourceMappingURL=NanoId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NanoId.js","sourceRoot":"","sources":["../../src/NanoId.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,aAAa,GAAG,eAAe,CAAA;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAgB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAO5E;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CACjC,QAAQ,EACR,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,kCAAkC,KAAK,GAAG,CAAC,CACnE,CAAA;AA6BD,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE;IAC9C,IAAI,IAAI,EAAE,CAAA;IACV,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC;QACd,WAAW;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC1B,CAAC;SAAM,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC;QACrB,QAAQ;QACR,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAC/C,CAAC;SAAM,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC;QACrB,OAAO,GAAG,CAAA;IACZ,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;IACrD,OAAO,cAAc,CAAC,CAAC,CAAC,CAAA;AAC1B,CAAC,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAgB,EAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AAE1G;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsD,eAAe,CAAC,KAAK,CAAC,EAAE,CAAQ,CAAA;AAEjH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAkD,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Schema from "@effect/schema/Schema";
|
|
5
|
+
import * as NanoId from "./NanoId";
|
|
6
|
+
import * as Uuid from "./Uuid";
|
|
7
|
+
/**
|
|
8
|
+
* @since 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
export const uuid = Schema.string.pipe(Schema.fromBrand(Uuid.Uuid));
|
|
11
|
+
/**
|
|
12
|
+
* @since 1.0.0
|
|
13
|
+
*/
|
|
14
|
+
export const nanoId = Schema.string.pipe(Schema.fromBrand(NanoId.NanoId));
|
|
15
|
+
//# sourceMappingURL=Schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Schema.js","sourceRoot":"","sources":["../../src/Schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAA;AAC/C,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAClC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAA;AAE9B;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAqC,MAAM,CAAC,MAAM,CAAC,IAAI,CACtE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5B,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAyC,MAAM,CAAC,MAAM,CAAC,IAAI,CAC5E,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAChC,CAAA"}
|
package/dist/esm/Uuid.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Brand from "effect/Brand";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import { GetRandomValues } from "./GetRandomValues";
|
|
7
|
+
const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
8
|
+
/**
|
|
9
|
+
* Returns `true` if a string is a UUID.
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
export const isUuid = (value) => uuidPattern.test(value);
|
|
13
|
+
/**
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
*/
|
|
16
|
+
export const Uuid = Brand.refined(isUuid, (input) => Brand.error(`Expected a UUID but received ${input}.`));
|
|
17
|
+
/**
|
|
18
|
+
* @since 1.0.0
|
|
19
|
+
*/
|
|
20
|
+
export const makeUuidSeed = GetRandomValues.apply(32);
|
|
21
|
+
/**
|
|
22
|
+
* @since 1.0.0
|
|
23
|
+
*/
|
|
24
|
+
export const makeUuid = Effect.map(makeUuidSeed, uuid4);
|
|
25
|
+
/**
|
|
26
|
+
* Convert array of 16 byte values to UUID string format of the form:
|
|
27
|
+
* XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
|
|
28
|
+
*/
|
|
29
|
+
const byteToHex = [];
|
|
30
|
+
for (let i = 0; i < 256; ++i) {
|
|
31
|
+
byteToHex.push((i + 0x100).toString(16).slice(1));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* @since 1.0.0
|
|
35
|
+
*/
|
|
36
|
+
export function uuid4(seed) {
|
|
37
|
+
// Note: Be careful editing this code! It's been tuned for performance
|
|
38
|
+
// and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
|
|
39
|
+
//
|
|
40
|
+
// Note to future-self: No, you can't remove the `toLowerCase()` call.
|
|
41
|
+
// REF: https://github.com/uuidjs/uuid/pull/677#issuecomment-1757351351
|
|
42
|
+
return (byteToHex[seed[0]] +
|
|
43
|
+
byteToHex[seed[1]] +
|
|
44
|
+
byteToHex[seed[2]] +
|
|
45
|
+
byteToHex[seed[3]] +
|
|
46
|
+
"-" +
|
|
47
|
+
byteToHex[seed[4]] +
|
|
48
|
+
byteToHex[seed[5]] +
|
|
49
|
+
"-" +
|
|
50
|
+
byteToHex[seed[6]] +
|
|
51
|
+
byteToHex[seed[7]] +
|
|
52
|
+
"-" +
|
|
53
|
+
byteToHex[seed[8]] +
|
|
54
|
+
byteToHex[seed[9]] +
|
|
55
|
+
"-" +
|
|
56
|
+
byteToHex[seed[10]] +
|
|
57
|
+
byteToHex[seed[11]] +
|
|
58
|
+
byteToHex[seed[12]] +
|
|
59
|
+
byteToHex[seed[13]] +
|
|
60
|
+
byteToHex[seed[14]] +
|
|
61
|
+
byteToHex[seed[15]]).toLowerCase();
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=Uuid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Uuid.js","sourceRoot":"","sources":["../../src/Uuid.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,WAAW,GAAG,iEAAiE,CAAA;AAErF;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAqC,CAAC,KAAa,EAAiB,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAMjH;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAO,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,gCAAgC,KAAK,GAAG,CAAC,CAAC,CAAA;AAwBjH;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAoD,eAAe,CAAC,KAAK,CAAC,EAAE,CAAQ,CAAA;AAE7G;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAgD,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;AAEpG;;;GAGG;AACH,MAAM,SAAS,GAAkB,EAAE,CAAA;AAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;IAC7B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,IAAc;IAClC,uEAAuE;IACvE,oFAAoF;IACpF,EAAE;IACF,sEAAsE;IACtE,uEAAuE;IACvE,OAAO,CACL,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,GAAG;QACH,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,GAAG;QACH,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,GAAG;QACH,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,GAAG;QACH,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CACpB,CAAC,WAAW,EAAU,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,cAAc,mBAAmB,CAAA;AACjC;;GAEG;AACH,cAAc,UAAU,CAAA;AACxB;;GAEG;AACH,cAAc,QAAQ,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@typed/id",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/tylors/typed.git"
|
|
9
|
+
},
|
|
10
|
+
"sideEffects": [],
|
|
11
|
+
"author": "Typed contributors",
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@effect/schema": "0.49.4",
|
|
14
|
+
"effect": "2.0.0-next.56",
|
|
15
|
+
"@typed/context": "0.1.0"
|
|
16
|
+
},
|
|
17
|
+
"main": "./dist/cjs/index.js",
|
|
18
|
+
"module": "./dist/esm/index.js",
|
|
19
|
+
"types": "./dist/dts/index.d.ts",
|
|
20
|
+
"exports": {
|
|
21
|
+
"./package.json": "./package.json",
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/dts/index.d.ts",
|
|
24
|
+
"import": "./dist/esm/index.js",
|
|
25
|
+
"default": "./dist/cjs/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./GetRandomValues": {
|
|
28
|
+
"types": "./dist/dts/GetRandomValues.d.ts",
|
|
29
|
+
"import": "./dist/esm/GetRandomValues.js",
|
|
30
|
+
"default": "./dist/cjs/GetRandomValues.js"
|
|
31
|
+
},
|
|
32
|
+
"./NanoId": {
|
|
33
|
+
"types": "./dist/dts/NanoId.d.ts",
|
|
34
|
+
"import": "./dist/esm/NanoId.js",
|
|
35
|
+
"default": "./dist/cjs/NanoId.js"
|
|
36
|
+
},
|
|
37
|
+
"./Schema": {
|
|
38
|
+
"types": "./dist/dts/Schema.d.ts",
|
|
39
|
+
"import": "./dist/esm/Schema.js",
|
|
40
|
+
"default": "./dist/cjs/Schema.js"
|
|
41
|
+
},
|
|
42
|
+
"./Uuid": {
|
|
43
|
+
"types": "./dist/dts/Uuid.d.ts",
|
|
44
|
+
"import": "./dist/esm/Uuid.js",
|
|
45
|
+
"default": "./dist/cjs/Uuid.js"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"typesVersions": {
|
|
49
|
+
"*": {
|
|
50
|
+
"GetRandomValues": [
|
|
51
|
+
"./dist/dts/GetRandomValues.d.ts"
|
|
52
|
+
],
|
|
53
|
+
"NanoId": [
|
|
54
|
+
"./dist/dts/NanoId.d.ts"
|
|
55
|
+
],
|
|
56
|
+
"Schema": [
|
|
57
|
+
"./dist/dts/Schema.d.ts"
|
|
58
|
+
],
|
|
59
|
+
"Uuid": [
|
|
60
|
+
"./dist/dts/Uuid.d.ts"
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import * as Context from "@typed/context"
|
|
6
|
+
import type { Layer } from "effect"
|
|
7
|
+
import { Effect, Random } from "effect"
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
export const GetRandomValues = Context.Fn<(length: number) => Effect.Effect<never, never, Uint8Array>>()(
|
|
13
|
+
(_) => class GetRandomValues extends _("@typed/id/GetRandomValues") {}
|
|
14
|
+
)
|
|
15
|
+
/**
|
|
16
|
+
* @since 1.0.0
|
|
17
|
+
*/
|
|
18
|
+
export type GetRandomValues = Context.Fn.Identifier<typeof GetRandomValues>
|
|
19
|
+
|
|
20
|
+
const getRandomValuesWeb = (crypto: Crypto, length: number) => crypto.getRandomValues(new Uint8Array(length))
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @since 1.0.0
|
|
24
|
+
*/
|
|
25
|
+
export const webCrypto = (crypto: Crypto): Layer.Layer<never, never, GetRandomValues> =>
|
|
26
|
+
GetRandomValues.implement((length) => Effect.sync(() => getRandomValuesWeb(crypto, length)))
|
|
27
|
+
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
|
|
29
|
+
const getRandomValuesNode = (crypto: typeof import("node:crypto"), length: number) => {
|
|
30
|
+
const bytes = crypto.randomBytes(length)
|
|
31
|
+
const view = new Uint8Array(length)
|
|
32
|
+
for (let i = 0; i < bytes.length; ++i) {
|
|
33
|
+
view[i] = bytes[i]
|
|
34
|
+
}
|
|
35
|
+
return view
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @since 1.0.0
|
|
40
|
+
*/
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
|
|
42
|
+
export const nodeCrypto = (crypto: typeof import("node:crypto")): Layer.Layer<never, never, GetRandomValues> =>
|
|
43
|
+
GetRandomValues.implement((length) => Effect.sync(() => getRandomValuesNode(crypto, length)))
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @since 1.0.0
|
|
47
|
+
*/
|
|
48
|
+
export const pseudoRandom: Layer.Layer<never, never, GetRandomValues> = GetRandomValues.implement((length) =>
|
|
49
|
+
Effect.gen(function*(_) {
|
|
50
|
+
const view = new Uint8Array(length)
|
|
51
|
+
|
|
52
|
+
for (let i = 0; i < length; ++i) {
|
|
53
|
+
view[i] = yield* _(Random.nextInt)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return view
|
|
57
|
+
})
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @since 1.0.0
|
|
62
|
+
*/
|
|
63
|
+
export const getRandomValues: Layer.Layer<never, never, GetRandomValues> = GetRandomValues.layer(
|
|
64
|
+
Effect.gen(function*(_) {
|
|
65
|
+
if (typeof crypto === "undefined") {
|
|
66
|
+
const crypto = yield* _(Effect.promise(() => import("node:crypto")))
|
|
67
|
+
|
|
68
|
+
return (length: number) => Effect.sync(() => getRandomValuesNode(crypto, length))
|
|
69
|
+
} else {
|
|
70
|
+
return (length: number) => Effect.sync(() => getRandomValuesWeb(crypto, length))
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
)
|
package/src/NanoId.ts
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Brand, Effect } from "effect"
|
|
6
|
+
import { GetRandomValues } from "./GetRandomValues"
|
|
7
|
+
|
|
8
|
+
const nanoIdPattern = /[0-9a-zA-Z_-]/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @since 1.0.0
|
|
12
|
+
*/
|
|
13
|
+
export const isNanoId = (id: string): id is NanoId => nanoIdPattern.test(id)
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @since 1.0.0
|
|
17
|
+
*/
|
|
18
|
+
export type NanoId = string & Brand.Brand<"@typed/id/NanoId">
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @since 1.0.0
|
|
22
|
+
*/
|
|
23
|
+
export const NanoId = Brand.refined<NanoId>(
|
|
24
|
+
isNanoId,
|
|
25
|
+
(input) => Brand.error(`Expected a NanoID but received ${input}.`)
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @since 1.0.0
|
|
30
|
+
*/
|
|
31
|
+
export type NanoIdSeed = readonly [
|
|
32
|
+
zero: number,
|
|
33
|
+
one: number,
|
|
34
|
+
two: number,
|
|
35
|
+
three: number,
|
|
36
|
+
four: number,
|
|
37
|
+
five: number,
|
|
38
|
+
six: number,
|
|
39
|
+
seven: number,
|
|
40
|
+
eight: number,
|
|
41
|
+
nine: number,
|
|
42
|
+
ten: number,
|
|
43
|
+
eleven: number,
|
|
44
|
+
twelve: number,
|
|
45
|
+
thirteen: number,
|
|
46
|
+
fourteen: number,
|
|
47
|
+
fifteen: number,
|
|
48
|
+
sixteen: number,
|
|
49
|
+
seventeen: number,
|
|
50
|
+
eighteen: number,
|
|
51
|
+
nineteen: number,
|
|
52
|
+
twenty: number
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
const numToCharacter = (byte: number): string => {
|
|
56
|
+
byte &= 63
|
|
57
|
+
if (byte < 36) {
|
|
58
|
+
// `0-9a-z`
|
|
59
|
+
return byte.toString(36)
|
|
60
|
+
} else if (byte < 62) {
|
|
61
|
+
// `A-Z`
|
|
62
|
+
return (byte - 26).toString(36).toUpperCase()
|
|
63
|
+
} else if (byte > 62) {
|
|
64
|
+
return "-"
|
|
65
|
+
} else {
|
|
66
|
+
return "_"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const characters = Array.from({ length: 64 }, (_, i) => {
|
|
71
|
+
return numToCharacter(i)
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @since 1.0.0
|
|
76
|
+
*/
|
|
77
|
+
export const nanoId = (seed: NanoIdSeed): NanoId => NanoId(seed.reduce((id, x) => id + characters[x], ""))
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* @since 1.0.0
|
|
81
|
+
*/
|
|
82
|
+
export const makeNanoIdSeed: Effect.Effect<GetRandomValues, never, NanoIdSeed> = GetRandomValues.apply(21) as any
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @since 1.0.0
|
|
86
|
+
*/
|
|
87
|
+
export const makeNanoId: Effect.Effect<GetRandomValues, never, NanoId> = Effect.map(makeNanoIdSeed, nanoId)
|
package/src/Schema.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import * as Schema from "@effect/schema/Schema"
|
|
6
|
+
import * as NanoId from "./NanoId"
|
|
7
|
+
import * as Uuid from "./Uuid"
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
export const uuid: Schema.Schema<string, Uuid.Uuid> = Schema.string.pipe(
|
|
13
|
+
Schema.fromBrand(Uuid.Uuid)
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @since 1.0.0
|
|
18
|
+
*/
|
|
19
|
+
export const nanoId: Schema.Schema<string, NanoId.NanoId> = Schema.string.pipe(
|
|
20
|
+
Schema.fromBrand(NanoId.NanoId)
|
|
21
|
+
)
|
package/src/Uuid.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import * as Brand from "effect/Brand"
|
|
6
|
+
import * as Effect from "effect/Effect"
|
|
7
|
+
import { GetRandomValues } from "./GetRandomValues"
|
|
8
|
+
|
|
9
|
+
const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Returns `true` if a string is a UUID.
|
|
13
|
+
* @since 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
export const isUuid: (value: string) => value is Uuid = (value: string): value is Uuid => uuidPattern.test(value)
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @since 1.0.0
|
|
19
|
+
*/
|
|
20
|
+
export type Uuid = string & Brand.Brand<"@typed/id/UUID">
|
|
21
|
+
/**
|
|
22
|
+
* @since 1.0.0
|
|
23
|
+
*/
|
|
24
|
+
export const Uuid = Brand.refined<Uuid>(isUuid, (input) => Brand.error(`Expected a UUID but received ${input}.`))
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @since 1.0.0
|
|
28
|
+
*/
|
|
29
|
+
export type UuidSeed = readonly [
|
|
30
|
+
zero: number,
|
|
31
|
+
one: number,
|
|
32
|
+
two: number,
|
|
33
|
+
three: number,
|
|
34
|
+
four: number,
|
|
35
|
+
five: number,
|
|
36
|
+
six: number,
|
|
37
|
+
seven: number,
|
|
38
|
+
eight: number,
|
|
39
|
+
nine: number,
|
|
40
|
+
ten: number,
|
|
41
|
+
eleven: number,
|
|
42
|
+
twelve: number,
|
|
43
|
+
thirteen: number,
|
|
44
|
+
fourteen: number,
|
|
45
|
+
fifteen: number
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @since 1.0.0
|
|
50
|
+
*/
|
|
51
|
+
export const makeUuidSeed: Effect.Effect<GetRandomValues, never, UuidSeed> = GetRandomValues.apply(32) as any
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @since 1.0.0
|
|
55
|
+
*/
|
|
56
|
+
export const makeUuid: Effect.Effect<GetRandomValues, never, Uuid> = Effect.map(makeUuidSeed, uuid4)
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Convert array of 16 byte values to UUID string format of the form:
|
|
60
|
+
* XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
|
|
61
|
+
*/
|
|
62
|
+
const byteToHex: Array<string> = []
|
|
63
|
+
|
|
64
|
+
for (let i = 0; i < 256; ++i) {
|
|
65
|
+
byteToHex.push((i + 0x100).toString(16).slice(1))
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @since 1.0.0
|
|
70
|
+
*/
|
|
71
|
+
export function uuid4(seed: UuidSeed): Uuid {
|
|
72
|
+
// Note: Be careful editing this code! It's been tuned for performance
|
|
73
|
+
// and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
|
|
74
|
+
//
|
|
75
|
+
// Note to future-self: No, you can't remove the `toLowerCase()` call.
|
|
76
|
+
// REF: https://github.com/uuidjs/uuid/pull/677#issuecomment-1757351351
|
|
77
|
+
return (
|
|
78
|
+
byteToHex[seed[0]] +
|
|
79
|
+
byteToHex[seed[1]] +
|
|
80
|
+
byteToHex[seed[2]] +
|
|
81
|
+
byteToHex[seed[3]] +
|
|
82
|
+
"-" +
|
|
83
|
+
byteToHex[seed[4]] +
|
|
84
|
+
byteToHex[seed[5]] +
|
|
85
|
+
"-" +
|
|
86
|
+
byteToHex[seed[6]] +
|
|
87
|
+
byteToHex[seed[7]] +
|
|
88
|
+
"-" +
|
|
89
|
+
byteToHex[seed[8]] +
|
|
90
|
+
byteToHex[seed[9]] +
|
|
91
|
+
"-" +
|
|
92
|
+
byteToHex[seed[10]] +
|
|
93
|
+
byteToHex[seed[11]] +
|
|
94
|
+
byteToHex[seed[12]] +
|
|
95
|
+
byteToHex[seed[13]] +
|
|
96
|
+
byteToHex[seed[14]] +
|
|
97
|
+
byteToHex[seed[15]]
|
|
98
|
+
).toLowerCase() as Uuid
|
|
99
|
+
}
|