@wener/utils 1.1.8 → 1.1.9

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.
Files changed (51) hide show
  1. package/dist/LICENSE.txt +1 -0
  2. package/dist/cjs/index.cjs +1 -1
  3. package/dist/cjs/index.cjs.map +1 -1
  4. package/dist/cjs/server.cjs +1 -1
  5. package/dist/cjs/server.cjs.map +1 -1
  6. package/dist/esm/index.js +1 -1
  7. package/dist/esm/index.js.map +1 -1
  8. package/dist/esm/server.js +1 -1
  9. package/dist/esm/server.js.map +1 -1
  10. package/dist/system/index.js +1 -1
  11. package/dist/system/index.js.map +1 -1
  12. package/dist/system/server.js +1 -1
  13. package/dist/system/server.js.map +1 -1
  14. package/lib/asyncs/createLazyPromise.js +3 -1
  15. package/lib/asyncs/createLazyPromise.js.map +1 -1
  16. package/lib/crypto/getRandomValues.js +2 -12
  17. package/lib/crypto/getRandomValues.js.map +1 -1
  18. package/lib/crypto/randomUUID.js +1 -1
  19. package/lib/crypto/randomUUID.js.map +1 -1
  20. package/lib/crypto/ulid.js +3 -3
  21. package/lib/crypto/ulid.js.map +1 -1
  22. package/lib/index.js +3 -1
  23. package/lib/index.js.map +1 -1
  24. package/lib/logging/createChildLogger.js +2 -2
  25. package/lib/logging/createChildLogger.js.map +1 -1
  26. package/lib/logging/createLogger.js +26 -0
  27. package/lib/logging/createLogger.js.map +1 -0
  28. package/lib/server/polyfillFetch.js +17 -24
  29. package/lib/server/polyfillFetch.js.map +1 -1
  30. package/lib/validations/parseBoolean.js +31 -0
  31. package/lib/validations/parseBoolean.js.map +1 -0
  32. package/lib/validations/parseTimestamp.js +25 -0
  33. package/lib/validations/parseTimestamp.js.map +1 -0
  34. package/package.json +5 -8
  35. package/src/asyncs/createLazyPromise.ts +2 -1
  36. package/src/asyncs/isThenable.ts +4 -0
  37. package/src/crypto/getRandomValues.ts +13 -11
  38. package/src/crypto/randomUUID.ts +1 -1
  39. package/src/crypto/ulid.test.ts +11 -3
  40. package/src/crypto/ulid.ts +5 -4
  41. package/src/index.ts +5 -1
  42. package/src/logging/createChildLogger.ts +2 -2
  43. package/src/logging/{createWriteLogger.ts → createLogger.ts} +19 -3
  44. package/src/logging/logger.test.ts +5 -3
  45. package/src/server/polyfillBrowser.test.ts +5 -1
  46. package/src/server/polyfillFetch.ts +22 -24
  47. package/src/validations/parseBoolean.ts +30 -0
  48. package/src/validations/parseTimestamp.test.ts +7 -0
  49. package/src/validations/parseTimestamp.ts +29 -0
  50. package/lib/logging/createWriteLogger.js +0 -13
  51. package/lib/logging/createWriteLogger.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sources":["../../src/server/polyfillCrypto.ts","../../src/server/polyfillFetch.ts","../../src/server/polyfillJsDom.ts","../../src/server/polyfillBrowser.ts"],"sourcesContent":["export async function polyfillCrypto() {\n if ('crypto' in globalThis) {\n return false;\n }\n globalThis.crypto = (await import('node:crypto')).webcrypto as Crypto;\n return true;\n}\n","export async function polyfillFetch() {\n if ('fetch' in globalThis) {\n return false;\n }\n const {\n default: fetch,\n Response,\n Headers,\n Request,\n AbortError,\n FetchError,\n FormData,\n Blob,\n File,\n } = await import('node-fetch');\n Object.assign(globalThis, {\n fetch,\n Response,\n Headers,\n Request,\n AbortError,\n FetchError,\n FormData,\n Blob,\n File,\n });\n return true;\n}\n","import type { ConstructorOptions, ResourceLoaderConstructorOptions } from 'jsdom';\n\nexport async function polyfillJsDom() {\n if (typeof window !== 'undefined') {\n return false;\n }\n\n const { ResourceLoader, JSDOM } = await import('jsdom');\n\n // https://github.com/lukechilds/window/blob/master/src/index.js\n // eslint-disable-next-line @typescript-eslint/no-extraneous-class\n class Window {\n constructor(opts: ResourceLoaderConstructorOptions & ConstructorOptions = {}) {\n const { proxy, strictSSL, userAgent, ...jsdomOpts } = opts;\n const resources = new ResourceLoader({\n proxy,\n strictSSL,\n userAgent,\n });\n return new JSDOM(\n '',\n Object.assign(jsdomOpts, {\n resources,\n }),\n ).window;\n }\n }\n\n // https://github.com/lukechilds/browser-env/blob/master/src/index.js\n // Default jsdom config.\n // These settings must override any custom settings to make sure we can iterate\n // over the window object.\n const defaultJsdomConfig = {\n // features: {\n // FetchExternalResources: false,\n // ProcessExternalResources: false,\n // },\n };\n // IIFE executed on import to return an array of global Node.js properties that\n // conflict with global browser properties.\n const protectedProperties = (() =>\n Object.getOwnPropertyNames(new Window(defaultJsdomConfig)).filter(\n (prop) => typeof globalThis[prop as keyof typeof globalThis] !== 'undefined',\n ))();\n\n function installEnv(...args: any[]) {\n // Sets up global browser environment\n // Extract options from args\n const properties = args.filter((arg: any) => Array.isArray(arg))[0];\n const userJsdomConfig = args.filter((arg: any) => !Array.isArray(arg))[0];\n\n // Create window object\n const window = new Window(Object.assign({}, userJsdomConfig, defaultJsdomConfig));\n\n // Get all global browser properties\n Object.getOwnPropertyNames(window)\n\n // Remove protected properties\n .filter((prop) => !protectedProperties.includes(prop))\n\n // If we're only applying specific required properties remove everything else\n .filter((prop) => !(properties && properties.indexOf(prop) === -1))\n .filter((prop) => {\n switch (prop) {\n case 'undefined':\n return false;\n }\n return true;\n })\n\n // Copy what's left to the Node.js global scope\n .forEach((prop) => {\n // console.debug(`define globalThis.${prop}`);\n Object.defineProperty(globalThis, prop, {\n configurable: true,\n get: () => window[prop as keyof Window] as any,\n });\n });\n\n return window;\n }\n\n installEnv({ url: 'http://localhost' });\n return true;\n}\n","import { polyfillCrypto } from './polyfillCrypto';\nimport { polyfillFetch } from './polyfillFetch';\nimport { polyfillJsDom } from './polyfillJsDom';\n\n/**\n * Polyfills the browser environment with the necessary APIs for the server.\n * Currently, this includes:\n * - `window`\n * - `document`\n * - `fetch`\n * - `crypto`\n */\nexport async function polyfillBrowser() {\n await polyfillCrypto();\n await polyfillFetch();\n await polyfillJsDom();\n}\n"],"names":["polyfillCrypto","module","polyfillFetch","fetch","Response","Headers","Request","AbortError","FetchError","FormData","Blob","File","polyfillJsDom","ResourceLoader","JSDOM","Window","opts","proxy","strictSSL","userAgent","jsdomOpts","resources","defaultJsdomConfig","protectedProperties","prop","installEnv","args","properties","arg","userJsdomConfig","window","polyfillBrowser"],"mappings":"gJAAA,eAAsBA,GAAiB,CACrC,MAAI,WAAY,WACP,IAET,WAAW,QAAU,MAAMC,EAAO,OAAA,aAAgB,GAAA,UAC3C,GACT,CCNsB,eAAAC,GAAgB,CACpC,GAAI,UAAW,WACb,MAAO,GAET,KAAM,CACJ,QAASC,EACT,SAAAC,EACA,QAAAC,EACA,QAAAC,EACA,WAAAC,EACA,WAAAC,EACA,SAAAC,EACA,KAAAC,EACA,KAAAC,CACF,EAAI,MAAMV,EAAO,OAAA,YACjB,EAAA,OAAA,OAAO,OAAO,WAAY,CACxB,MAAAE,EACA,SAAAC,EACA,QAAAC,EACA,QAAAC,EACA,WAAAC,EACA,WAAAC,EACA,SAAAC,EACA,KAAAC,EACA,KAAAC,CACF,CAAC,EACM,EACT,CCzBA,eAAsBC,GAAgB,CACpC,GAAI,OAAO,OAAW,IACpB,MAAO,GAGT,KAAM,CAAE,eAAAC,EAAgB,MAAAC,CAAM,EAAI,MAAab,EAAA,OAAA,OAAA,EAI/C,MAAMc,CAAO,CACX,YAAYC,EAA8D,GAAI,CAC5E,KAAM,CAAE,MAAAC,EAAO,UAAAC,EAAW,UAAAC,KAAcC,CAAU,EAAIJ,EAChDK,EAAY,IAAIR,EAAe,CACnC,MAAAI,EACA,UAAAC,EACA,UAAAC,CACF,CAAC,EACD,OAAO,IAAIL,EACT,GACA,OAAO,OAAOM,EAAW,CACvB,UAAAC,CACF,CAAC,CACH,EAAE,MACJ,CACF,CAMA,MAAMC,EAAqB,GAQrBC,GAAuB,IAC3B,OAAO,oBAAoB,IAAIR,EAAOO,CAAkB,CAAC,EAAE,OACxDE,GAAS,OAAO,WAAWA,GAAqC,GACnE,KAEF,SAASC,KAAcC,EAAa,CAGlC,MAAMC,EAAaD,EAAK,OAAQE,GAAa,MAAM,QAAQA,CAAG,CAAC,EAAE,GAC3DC,EAAkBH,EAAK,OAAQE,GAAa,CAAC,MAAM,QAAQA,CAAG,CAAC,EAAE,GAGjEE,EAAS,IAAIf,EAAO,OAAO,OAAO,CAAIc,EAAAA,EAAiBP,CAAkB,CAAC,EAGhF,cAAO,oBAAoBQ,CAAM,EAG9B,OAAQN,GAAS,CAACD,EAAoB,SAASC,CAAI,CAAC,EAGpD,OAAQA,GAAS,EAAEG,GAAcA,EAAW,QAAQH,CAAI,IAAM,GAAG,EACjE,OAAQA,GAAS,CAChB,OAAQA,EAAAA,CACN,IAAK,YACH,MAAO,EACX,CACA,MAAO,EACT,CAAC,EAGA,QAASA,GAAS,CAEjB,OAAO,eAAe,WAAYA,EAAM,CACtC,aAAc,GACd,IAAK,IAAMM,EAAON,EACpB,CAAC,CACH,CAAC,EAEIM,CACT,CAEA,OAAAL,EAAW,CAAE,IAAK,kBAAmB,CAAC,EAC/B,EACT,gBCxEsBM,GAAkB,CACtC,MAAM/B,EAAe,EACrB,MAAME,EAAc,EACpB,MAAMU,EACR,CAAA"}
1
+ {"version":3,"file":"server.js","sources":["../../src/server/polyfillCrypto.ts","../../src/server/polyfillFetch.ts","../../src/server/polyfillJsDom.ts","../../src/server/polyfillBrowser.ts"],"sourcesContent":["export async function polyfillCrypto() {\n if ('crypto' in globalThis) {\n return false;\n }\n globalThis.crypto = (await import('node:crypto')).webcrypto as Crypto;\n return true;\n}\n","import type { MaybePromise } from '../asyncs/MaybePromise';\n\nexport function polyfillFetch(nodeFetch: typeof import('node-fetch')): boolean;\nexport function polyfillFetch(nodeFetch?: undefined): Promise<boolean>;\nexport function polyfillFetch(nodeFetch?: typeof import('node-fetch')): MaybePromise<boolean> {\n if ('fetch' in globalThis) {\n return false;\n }\n // sync mode\n if (nodeFetch) {\n const { default: fetch, Response, Headers, Request, AbortError, FetchError, FormData, Blob, File } = nodeFetch;\n Object.assign(globalThis, {\n fetch,\n Response,\n Headers,\n Request,\n AbortError,\n FetchError,\n FormData,\n Blob,\n File,\n });\n return true;\n }\n return import('node-fetch').then((v) => polyfillFetch(v));\n}\n","import type { ConstructorOptions, ResourceLoaderConstructorOptions } from 'jsdom';\n\nexport async function polyfillJsDom() {\n if (typeof window !== 'undefined') {\n return false;\n }\n\n const { ResourceLoader, JSDOM } = await import('jsdom');\n\n // https://github.com/lukechilds/window/blob/master/src/index.js\n // eslint-disable-next-line @typescript-eslint/no-extraneous-class\n class Window {\n constructor(opts: ResourceLoaderConstructorOptions & ConstructorOptions = {}) {\n const { proxy, strictSSL, userAgent, ...jsdomOpts } = opts;\n const resources = new ResourceLoader({\n proxy,\n strictSSL,\n userAgent,\n });\n return new JSDOM(\n '',\n Object.assign(jsdomOpts, {\n resources,\n }),\n ).window;\n }\n }\n\n // https://github.com/lukechilds/browser-env/blob/master/src/index.js\n // Default jsdom config.\n // These settings must override any custom settings to make sure we can iterate\n // over the window object.\n const defaultJsdomConfig = {\n // features: {\n // FetchExternalResources: false,\n // ProcessExternalResources: false,\n // },\n };\n // IIFE executed on import to return an array of global Node.js properties that\n // conflict with global browser properties.\n const protectedProperties = (() =>\n Object.getOwnPropertyNames(new Window(defaultJsdomConfig)).filter(\n (prop) => typeof globalThis[prop as keyof typeof globalThis] !== 'undefined',\n ))();\n\n function installEnv(...args: any[]) {\n // Sets up global browser environment\n // Extract options from args\n const properties = args.filter((arg: any) => Array.isArray(arg))[0];\n const userJsdomConfig = args.filter((arg: any) => !Array.isArray(arg))[0];\n\n // Create window object\n const window = new Window(Object.assign({}, userJsdomConfig, defaultJsdomConfig));\n\n // Get all global browser properties\n Object.getOwnPropertyNames(window)\n\n // Remove protected properties\n .filter((prop) => !protectedProperties.includes(prop))\n\n // If we're only applying specific required properties remove everything else\n .filter((prop) => !(properties && properties.indexOf(prop) === -1))\n .filter((prop) => {\n switch (prop) {\n case 'undefined':\n return false;\n }\n return true;\n })\n\n // Copy what's left to the Node.js global scope\n .forEach((prop) => {\n // console.debug(`define globalThis.${prop}`);\n Object.defineProperty(globalThis, prop, {\n configurable: true,\n get: () => window[prop as keyof Window] as any,\n });\n });\n\n return window;\n }\n\n installEnv({ url: 'http://localhost' });\n return true;\n}\n","import { polyfillCrypto } from './polyfillCrypto';\nimport { polyfillFetch } from './polyfillFetch';\nimport { polyfillJsDom } from './polyfillJsDom';\n\n/**\n * Polyfills the browser environment with the necessary APIs for the server.\n * Currently, this includes:\n * - `window`\n * - `document`\n * - `fetch`\n * - `crypto`\n */\nexport async function polyfillBrowser() {\n await polyfillCrypto();\n await polyfillFetch();\n await polyfillJsDom();\n}\n"],"names":["polyfillCrypto","module","polyfillFetch","nodeFetch","fetch","Response","Headers","Request","AbortError","FetchError","FormData","Blob","File","v","polyfillJsDom","ResourceLoader","JSDOM","Window","opts","proxy","strictSSL","userAgent","jsdomOpts","resources","defaultJsdomConfig","protectedProperties","prop","installEnv","args","properties","arg","userJsdomConfig","window","polyfillBrowser"],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { isPromise } from './isPromise.js';
2
+
1
3
  function createLazyPromise(executor) {
2
4
  const holder = {
3
5
  resolve(_) {
@@ -34,7 +36,7 @@ function createLazyPromise(executor) {
34
36
  shouldExec = false;
35
37
  try {
36
38
  const result = executor(holder.resolve, holder.reject);
37
- if (result && "then" in result) {
39
+ if (isPromise(result)) {
38
40
  result.then(holder.resolve, holder.reject);
39
41
  } else if (result !== void 0) {
40
42
  holder.resolve(result);
@@ -1 +1 @@
1
- {"version":3,"file":"createLazyPromise.js","sources":["../../src/asyncs/createLazyPromise.ts"],"sourcesContent":["import type { MaybePromise } from './MaybePromise';\n\nexport type LazyPromise<T> = Promise<T> & {\n reject(reason?: any): void;\n resolve(v?: T | PromiseLike<T>): void;\n};\n\n/**\n * createLazyPromise return a promise that can be resolved or rejected manually.\n * if you pass a function to it, it will be executed when the promise try to resolve.\n */\nexport function createLazyPromise<T = any>(\n executor?:\n | ((resolve: LazyPromise<T>['resolve'], reject: LazyPromise<T>['reject']) => void)\n | ((resolve: LazyPromise<T>['resolve'], reject: LazyPromise<T>['reject']) => MaybePromise<T>),\n): LazyPromise<T> {\n const holder = {\n resolve(_: any): void {\n throw new Error('pending resolve');\n },\n reject(_: any): void {\n throw new Error('pending reject');\n },\n };\n const future = Object.assign(\n new Promise<T>((resolve, reject) => {\n holder.reject = reject;\n holder.resolve = resolve;\n }),\n {\n resolve(v: any) {\n holder.resolve(v);\n },\n reject(v: any) {\n holder.resolve(v);\n },\n },\n );\n if (executor) {\n const r = holder.resolve;\n let shouldExec = true;\n holder.resolve = (v: any) => {\n shouldExec = false;\n r(v);\n };\n const then = future.then.bind(future);\n future.then = (...args) => {\n if (shouldExec) {\n shouldExec = false;\n try {\n // kind of bad\n const result = executor(holder.resolve, holder.reject);\n // ensure resolve/reject is called\n if (result && 'then' in result) {\n result.then(holder.resolve, holder.reject);\n } else if (result !== undefined) {\n holder.resolve(result);\n }\n } catch (e) {\n holder.reject(e);\n }\n }\n return then(...args);\n };\n const like = holder as LazyPromise<T>;\n like.then = future.then;\n like.catch = future.catch.bind(future);\n if (future.finally) like.finally = future.finally;\n\n void Object.defineProperty(like, Symbol.species, {\n get() {\n return Promise;\n },\n });\n return like;\n }\n return future;\n}\n"],"names":[],"mappings":"AAWO,SAAS,kBACd,QAGgB,EAAA;AAChB,EAAA,MAAM,MAAS,GAAA;AAAA,IACb,QAAQ,CAAc,EAAA;AACpB,MAAM,MAAA,IAAI,MAAM,iBAAiB,CAAA,CAAA;AAAA,KACnC;AAAA,IACA,OAAO,CAAc,EAAA;AACnB,MAAM,MAAA,IAAI,MAAM,gBAAgB,CAAA,CAAA;AAAA,KAClC;AAAA,GACF,CAAA;AACA,EAAA,MAAM,SAAS,MAAO,CAAA,MAAA;AAAA,IACpB,IAAI,OAAA,CAAW,CAAC,OAAA,EAAS,MAAW,KAAA;AAClC,MAAA,MAAA,CAAO,MAAS,GAAA,MAAA,CAAA;AAChB,MAAA,MAAA,CAAO,OAAU,GAAA,OAAA,CAAA;AAAA,KAClB,CAAA;AAAA,IACD;AAAA,MACE,QAAQ,CAAQ,EAAA;AACd,QAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAAA,OAClB;AAAA,MACA,OAAO,CAAQ,EAAA;AACb,QAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAAA,OAClB;AAAA,KACF;AAAA,GACF,CAAA;AACA,EAAA,IAAI,QAAU,EAAA;AACZ,IAAA,MAAM,IAAI,MAAO,CAAA,OAAA,CAAA;AACjB,IAAA,IAAI,UAAa,GAAA,IAAA,CAAA;AACjB,IAAO,MAAA,CAAA,OAAA,GAAU,CAAC,CAAW,KAAA;AAC3B,MAAa,UAAA,GAAA,KAAA,CAAA;AACb,MAAA,CAAA,CAAE,CAAC,CAAA,CAAA;AAAA,KACL,CAAA;AACA,IAAA,MAAM,IAAO,GAAA,MAAA,CAAO,IAAK,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AACpC,IAAO,MAAA,CAAA,IAAA,GAAO,IAAI,IAAS,KAAA;AACzB,MAAA,IAAI,UAAY,EAAA;AACd,QAAa,UAAA,GAAA,KAAA,CAAA;AACb,QAAI,IAAA;AAEF,UAAA,MAAM,MAAS,GAAA,QAAA,CAAS,MAAO,CAAA,OAAA,EAAS,OAAO,MAAM,CAAA,CAAA;AAErD,UAAI,IAAA,MAAA,IAAU,UAAU,MAAQ,EAAA;AAC9B,YAAA,MAAA,CAAO,IAAK,CAAA,MAAA,CAAO,OAAS,EAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,WAC3C,MAAA,IAAW,WAAW,KAAW,CAAA,EAAA;AAC/B,YAAA,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAA;AAAA,WACvB;AAAA,iBACO,CAAP,EAAA;AACA,UAAA,MAAA,CAAO,OAAO,CAAC,CAAA,CAAA;AAAA,SACjB;AAAA,OACF;AACA,MAAO,OAAA,IAAA,CAAK,GAAG,IAAI,CAAA,CAAA;AAAA,KACrB,CAAA;AACA,IAAA,MAAM,IAAO,GAAA,MAAA,CAAA;AACb,IAAA,IAAA,CAAK,OAAO,MAAO,CAAA,IAAA,CAAA;AACnB,IAAA,IAAA,CAAK,KAAQ,GAAA,MAAA,CAAO,KAAM,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AACrC,IAAA,IAAI,MAAO,CAAA,OAAA;AAAS,MAAA,IAAA,CAAK,UAAU,MAAO,CAAA,OAAA,CAAA;AAE1C,IAAA,KAAK,MAAO,CAAA,cAAA,CAAe,IAAM,EAAA,MAAA,CAAO,OAAS,EAAA;AAAA,MAC/C,GAAM,GAAA;AACJ,QAAO,OAAA,OAAA,CAAA;AAAA,OACT;AAAA,KACD,CAAA,CAAA;AACD,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,MAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"createLazyPromise.js","sources":["../../src/asyncs/createLazyPromise.ts"],"sourcesContent":["import type { MaybePromise } from './MaybePromise';\nimport { isPromise } from './isPromise';\n\nexport type LazyPromise<T> = Promise<T> & {\n reject(reason?: any): void;\n resolve(v?: T | PromiseLike<T>): void;\n};\n\n/**\n * createLazyPromise return a promise that can be resolved or rejected manually.\n * if you pass a function to it, it will be executed when the promise try to resolve.\n */\nexport function createLazyPromise<T = any>(\n executor?:\n | ((resolve: LazyPromise<T>['resolve'], reject: LazyPromise<T>['reject']) => void)\n | ((resolve: LazyPromise<T>['resolve'], reject: LazyPromise<T>['reject']) => MaybePromise<T>),\n): LazyPromise<T> {\n const holder = {\n resolve(_: any): void {\n throw new Error('pending resolve');\n },\n reject(_: any): void {\n throw new Error('pending reject');\n },\n };\n const future = Object.assign(\n new Promise<T>((resolve, reject) => {\n holder.reject = reject;\n holder.resolve = resolve;\n }),\n {\n resolve(v: any) {\n holder.resolve(v);\n },\n reject(v: any) {\n holder.resolve(v);\n },\n },\n );\n if (executor) {\n const r = holder.resolve;\n let shouldExec = true;\n holder.resolve = (v: any) => {\n shouldExec = false;\n r(v);\n };\n const then = future.then.bind(future);\n future.then = (...args) => {\n if (shouldExec) {\n shouldExec = false;\n try {\n // kind of bad\n const result = executor(holder.resolve, holder.reject);\n // ensure resolve/reject is called\n if (isPromise(result)) {\n result.then(holder.resolve, holder.reject);\n } else if (result !== undefined) {\n holder.resolve(result);\n }\n } catch (e) {\n holder.reject(e);\n }\n }\n return then(...args);\n };\n const like = holder as LazyPromise<T>;\n like.then = future.then;\n like.catch = future.catch.bind(future);\n if (future.finally) like.finally = future.finally;\n\n void Object.defineProperty(like, Symbol.species, {\n get() {\n return Promise;\n },\n });\n return like;\n }\n return future;\n}\n"],"names":[],"mappings":";;AAYO,SAAS,kBACd,QAGgB,EAAA;AAChB,EAAA,MAAM,MAAS,GAAA;AAAA,IACb,QAAQ,CAAc,EAAA;AACpB,MAAM,MAAA,IAAI,MAAM,iBAAiB,CAAA,CAAA;AAAA,KACnC;AAAA,IACA,OAAO,CAAc,EAAA;AACnB,MAAM,MAAA,IAAI,MAAM,gBAAgB,CAAA,CAAA;AAAA,KAClC;AAAA,GACF,CAAA;AACA,EAAA,MAAM,SAAS,MAAO,CAAA,MAAA;AAAA,IACpB,IAAI,OAAA,CAAW,CAAC,OAAA,EAAS,MAAW,KAAA;AAClC,MAAA,MAAA,CAAO,MAAS,GAAA,MAAA,CAAA;AAChB,MAAA,MAAA,CAAO,OAAU,GAAA,OAAA,CAAA;AAAA,KAClB,CAAA;AAAA,IACD;AAAA,MACE,QAAQ,CAAQ,EAAA;AACd,QAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAAA,OAClB;AAAA,MACA,OAAO,CAAQ,EAAA;AACb,QAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAAA,OAClB;AAAA,KACF;AAAA,GACF,CAAA;AACA,EAAA,IAAI,QAAU,EAAA;AACZ,IAAA,MAAM,IAAI,MAAO,CAAA,OAAA,CAAA;AACjB,IAAA,IAAI,UAAa,GAAA,IAAA,CAAA;AACjB,IAAO,MAAA,CAAA,OAAA,GAAU,CAAC,CAAW,KAAA;AAC3B,MAAa,UAAA,GAAA,KAAA,CAAA;AACb,MAAA,CAAA,CAAE,CAAC,CAAA,CAAA;AAAA,KACL,CAAA;AACA,IAAA,MAAM,IAAO,GAAA,MAAA,CAAO,IAAK,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AACpC,IAAO,MAAA,CAAA,IAAA,GAAO,IAAI,IAAS,KAAA;AACzB,MAAA,IAAI,UAAY,EAAA;AACd,QAAa,UAAA,GAAA,KAAA,CAAA;AACb,QAAI,IAAA;AAEF,UAAA,MAAM,MAAS,GAAA,QAAA,CAAS,MAAO,CAAA,OAAA,EAAS,OAAO,MAAM,CAAA,CAAA;AAErD,UAAI,IAAA,SAAA,CAAU,MAAM,CAAG,EAAA;AACrB,YAAA,MAAA,CAAO,IAAK,CAAA,MAAA,CAAO,OAAS,EAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,WAC3C,MAAA,IAAW,WAAW,KAAW,CAAA,EAAA;AAC/B,YAAA,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAA;AAAA,WACvB;AAAA,iBACO,CAAP,EAAA;AACA,UAAA,MAAA,CAAO,OAAO,CAAC,CAAA,CAAA;AAAA,SACjB;AAAA,OACF;AACA,MAAO,OAAA,IAAA,CAAK,GAAG,IAAI,CAAA,CAAA;AAAA,KACrB,CAAA;AACA,IAAA,MAAM,IAAO,GAAA,MAAA,CAAA;AACb,IAAA,IAAA,CAAK,OAAO,MAAO,CAAA,IAAA,CAAA;AACnB,IAAA,IAAA,CAAK,KAAQ,GAAA,MAAA,CAAO,KAAM,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AACrC,IAAA,IAAI,MAAO,CAAA,OAAA;AAAS,MAAA,IAAA,CAAK,UAAU,MAAO,CAAA,OAAA,CAAA;AAE1C,IAAA,KAAK,MAAO,CAAA,cAAA,CAAe,IAAM,EAAA,MAAA,CAAO,OAAS,EAAA;AAAA,MAC/C,GAAM,GAAA;AACJ,QAAO,OAAA,OAAA,CAAA;AAAA,OACT;AAAA,KACD,CAAA,CAAA;AACD,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,MAAA,CAAA;AACT;;;;"}
@@ -1,18 +1,8 @@
1
1
  let nodeCrypto;
2
- if (!process.browser) {
3
- try {
4
- if (typeof require === "undefined") {
5
- void import('node:crypto').then((v) => nodeCrypto = v.default);
6
- } else {
7
- nodeCrypto = require("node:crypto");
8
- }
9
- } catch (e) {
10
- }
11
- }
12
- let getRandomValues = globalThis.crypto?.getRandomValues || globalThis.msCrypto?.getRandomValues || _getRandomValues;
2
+ let getRandomValues = globalThis.crypto?.getRandomValues?.bind(globalThis.crypto) || globalThis.msCrypto?.getRandomValues?.bind(globalThis.msCrypto) || _getRandomValues;
13
3
  function _getRandomValues(buf) {
14
4
  if (nodeCrypto?.webcrypto?.getRandomValues) {
15
- getRandomValues = nodeCrypto?.webcrypto?.getRandomValues;
5
+ getRandomValues = nodeCrypto?.webcrypto?.getRandomValues?.bind(nodeCrypto?.webcrypto);
16
6
  return nodeCrypto.webcrypto.getRandomValues(buf);
17
7
  }
18
8
  if (nodeCrypto?.randomBytes) {
@@ -1 +1 @@
1
- {"version":3,"file":"getRandomValues.js","sources":["../../src/crypto/getRandomValues.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/consistent-type-imports\nlet nodeCrypto: Awaited<typeof import('node:crypto')>;\n// globalThis.process?.release?.name\n\n// typedoc error\nif (!(process as any).browser) {\n try {\n if (typeof require === 'undefined') {\n void import('node:crypto').then((v) => (nodeCrypto = v.default));\n } else {\n nodeCrypto = require('node:crypto');\n }\n } catch (e) {}\n}\n\nexport let getRandomValues: <T extends Exclude<NodeJS.TypedArray, Float32Array | Float64Array>>(typedArray: T) => T =\n globalThis.crypto?.getRandomValues || (globalThis as any).msCrypto?.getRandomValues || _getRandomValues;\n\nfunction _getRandomValues<T extends Exclude<NodeJS.TypedArray, Float32Array | Float64Array>>(buf: T) {\n if (nodeCrypto?.webcrypto?.getRandomValues) {\n getRandomValues = nodeCrypto?.webcrypto?.getRandomValues;\n return nodeCrypto.webcrypto.getRandomValues(buf);\n }\n if (nodeCrypto?.randomBytes) {\n if (!(buf instanceof Uint8Array)) {\n throw new TypeError('expected Uint8Array');\n }\n if (buf.length > 65536) {\n const e: any = new Error();\n e.code = 22;\n e.message = `Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (${buf.length}) exceeds the number of bytes of entropy available via this API (65536).`;\n e.name = 'QuotaExceededError';\n throw e;\n }\n const bytes = nodeCrypto.randomBytes(buf.length);\n buf.set(bytes);\n return buf;\n }\n throw new Error('No secure random number generator available.');\n}\n"],"names":[],"mappings":"AACA,IAAI,UAAA,CAAA;AAIJ,IAAI,CAAE,QAAgB,OAAS,EAAA;AAC7B,EAAI,IAAA;AACF,IAAI,IAAA,OAAO,YAAY,WAAa,EAAA;AAClC,MAAA,KAAK,OAAO,aAAe,CAAA,CAAA,IAAA,CAAK,CAAC,CAAO,KAAA,UAAA,GAAa,EAAE,OAAQ,CAAA,CAAA;AAAA,KAC1D,MAAA;AACL,MAAA,UAAA,GAAa,QAAQ,aAAa,CAAA,CAAA;AAAA,KACpC;AAAA,WACO,CAAP,EAAA;AAAA,GAAW;AACf,CAAA;AAEO,IAAI,kBACT,UAAW,CAAA,MAAA,EAAQ,eAAoB,IAAA,UAAA,CAAmB,UAAU,eAAmB,IAAA,iBAAA;AAEzF,SAAS,iBAAoF,GAAQ,EAAA;AACnG,EAAI,IAAA,UAAA,EAAY,WAAW,eAAiB,EAAA;AAC1C,IAAA,eAAA,GAAkB,YAAY,SAAW,EAAA,eAAA,CAAA;AACzC,IAAO,OAAA,UAAA,CAAW,SAAU,CAAA,eAAA,CAAgB,GAAG,CAAA,CAAA;AAAA,GACjD;AACA,EAAA,IAAI,YAAY,WAAa,EAAA;AAC3B,IAAI,IAAA,EAAE,eAAe,UAAa,CAAA,EAAA;AAChC,MAAM,MAAA,IAAI,UAAU,qBAAqB,CAAA,CAAA;AAAA,KAC3C;AACA,IAAI,IAAA,GAAA,CAAI,SAAS,KAAO,EAAA;AACtB,MAAM,MAAA,CAAA,GAAS,IAAI,KAAM,EAAA,CAAA;AACzB,MAAA,CAAA,CAAE,IAAO,GAAA,EAAA,CAAA;AACT,MAAE,CAAA,CAAA,OAAA,GAAU,uFAAuF,GAAI,CAAA,MAAA,CAAA,wEAAA,CAAA,CAAA;AACvG,MAAA,CAAA,CAAE,IAAO,GAAA,oBAAA,CAAA;AACT,MAAM,MAAA,CAAA,CAAA;AAAA,KACR;AACA,IAAA,MAAM,KAAQ,GAAA,UAAA,CAAW,WAAY,CAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AAC/C,IAAA,GAAA,CAAI,IAAI,KAAK,CAAA,CAAA;AACb,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AACA,EAAM,MAAA,IAAI,MAAM,8CAA8C,CAAA,CAAA;AAChE;;;;"}
1
+ {"version":3,"file":"getRandomValues.js","sources":["../../src/crypto/getRandomValues.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/consistent-type-imports\nlet nodeCrypto: Awaited<typeof import('node:crypto')>;\n// globalThis.process?.release?.name\n\n// typedoc error\n// if (!(process as any).browser) {\n// try {\n// if (typeof require === 'undefined') {\n// void import('node:crypto').then((v) => (nodeCrypto = v.default));\n// } else {\n// nodeCrypto = require('node:crypto');\n// }\n// } catch (e) {}\n// }\n\nexport let getRandomValues: <T extends Exclude<NodeJS.TypedArray, Float32Array | Float64Array>>(typedArray: T) => T =\n globalThis.crypto?.getRandomValues?.bind(globalThis.crypto) ||\n (globalThis as any).msCrypto?.getRandomValues?.bind((globalThis as any).msCrypto) ||\n _getRandomValues;\n\nfunction _getRandomValues<T extends Exclude<NodeJS.TypedArray, Float32Array | Float64Array>>(buf: T) {\n if (nodeCrypto?.webcrypto?.getRandomValues) {\n getRandomValues = nodeCrypto?.webcrypto?.getRandomValues?.bind(nodeCrypto?.webcrypto);\n return nodeCrypto.webcrypto.getRandomValues(buf);\n }\n if (nodeCrypto?.randomBytes) {\n if (!(buf instanceof Uint8Array)) {\n throw new TypeError('expected Uint8Array');\n }\n if (buf.length > 65536) {\n const e: any = new Error();\n e.code = 22;\n e.message = `Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (${buf.length}) exceeds the number of bytes of entropy available via this API (65536).`;\n e.name = 'QuotaExceededError';\n throw e;\n }\n const bytes = nodeCrypto.randomBytes(buf.length);\n buf.set(bytes);\n return buf;\n }\n throw new Error('No secure random number generator available.');\n}\n"],"names":[],"mappings":"AACA,IAAI,UAAA,CAAA;AAcG,IAAI,eACT,GAAA,UAAA,CAAW,MAAQ,EAAA,eAAA,EAAiB,KAAK,UAAW,CAAA,MAAM,CACzD,IAAA,UAAA,CAAmB,QAAU,EAAA,eAAA,EAAiB,IAAM,CAAA,UAAA,CAAmB,QAAQ,CAChF,IAAA,iBAAA;AAEF,SAAS,iBAAoF,GAAQ,EAAA;AACnG,EAAI,IAAA,UAAA,EAAY,WAAW,eAAiB,EAAA;AAC1C,IAAA,eAAA,GAAkB,UAAY,EAAA,SAAA,EAAW,eAAiB,EAAA,IAAA,CAAK,YAAY,SAAS,CAAA,CAAA;AACpF,IAAO,OAAA,UAAA,CAAW,SAAU,CAAA,eAAA,CAAgB,GAAG,CAAA,CAAA;AAAA,GACjD;AACA,EAAA,IAAI,YAAY,WAAa,EAAA;AAC3B,IAAI,IAAA,EAAE,eAAe,UAAa,CAAA,EAAA;AAChC,MAAM,MAAA,IAAI,UAAU,qBAAqB,CAAA,CAAA;AAAA,KAC3C;AACA,IAAI,IAAA,GAAA,CAAI,SAAS,KAAO,EAAA;AACtB,MAAM,MAAA,CAAA,GAAS,IAAI,KAAM,EAAA,CAAA;AACzB,MAAA,CAAA,CAAE,IAAO,GAAA,EAAA,CAAA;AACT,MAAE,CAAA,CAAA,OAAA,GAAU,uFAAuF,GAAI,CAAA,MAAA,CAAA,wEAAA,CAAA,CAAA;AACvG,MAAA,CAAA,CAAE,IAAO,GAAA,oBAAA,CAAA;AACT,MAAM,MAAA,CAAA,CAAA;AAAA,KACR;AACA,IAAA,MAAM,KAAQ,GAAA,UAAA,CAAW,WAAY,CAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AAC/C,IAAA,GAAA,CAAI,IAAI,KAAK,CAAA,CAAA;AACb,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AACA,EAAM,MAAA,IAAI,MAAM,8CAA8C,CAAA,CAAA;AAChE;;;;"}
@@ -1,4 +1,4 @@
1
- const randomUUID = globalThis.crypto?.randomUUID || _randomUUID;
1
+ const randomUUID = globalThis.crypto?.randomUUID.bind(globalThis.crypto) || _randomUUID;
2
2
  function _randomUUID() {
3
3
  return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
4
4
  const r = Math.random() * 16 | 0;
@@ -1 +1 @@
1
- {"version":3,"file":"randomUUID.js","sources":["../../src/crypto/randomUUID.ts"],"sourcesContent":["/**\n * generate random UUIDv4\n */\nexport const randomUUID: () => string = globalThis.crypto?.randomUUID || _randomUUID;\n\n/**\n * @internal\n */\nexport function _randomUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n"],"names":[],"mappings":"AAGa,MAAA,UAAA,GAA2B,UAAW,CAAA,MAAA,EAAQ,UAAc,IAAA,YAAA;AAKlE,SAAS,WAAc,GAAA;AAC5B,EAAA,OAAO,sCAAuC,CAAA,OAAA,CAAQ,OAAS,EAAA,CAAC,CAAM,KAAA;AACpE,IAAA,MAAM,CAAK,GAAA,IAAA,CAAK,MAAO,EAAA,GAAI,EAAM,GAAA,CAAA,CAAA;AACjC,IAAA,MAAM,CAAI,GAAA,CAAA,KAAM,GAAM,GAAA,CAAA,GAAK,IAAI,CAAO,GAAA,CAAA,CAAA;AACtC,IAAO,OAAA,CAAA,CAAE,SAAS,EAAE,CAAA,CAAA;AAAA,GACrB,CAAA,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"randomUUID.js","sources":["../../src/crypto/randomUUID.ts"],"sourcesContent":["/**\n * generate random UUIDv4\n */\nexport const randomUUID: () => string = globalThis.crypto?.randomUUID.bind(globalThis.crypto) || _randomUUID;\n\n/**\n * @internal\n */\nexport function _randomUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n"],"names":[],"mappings":"AAGO,MAAM,aAA2B,UAAW,CAAA,MAAA,EAAQ,WAAW,IAAK,CAAA,UAAA,CAAW,MAAM,CAAK,IAAA,YAAA;AAK1F,SAAS,WAAc,GAAA;AAC5B,EAAA,OAAO,sCAAuC,CAAA,OAAA,CAAQ,OAAS,EAAA,CAAC,CAAM,KAAA;AACpE,IAAA,MAAM,CAAK,GAAA,IAAA,CAAK,MAAO,EAAA,GAAI,EAAM,GAAA,CAAA,CAAA;AACjC,IAAA,MAAM,CAAI,GAAA,CAAA,KAAM,GAAM,GAAA,CAAA,GAAK,IAAI,CAAO,GAAA,CAAA,CAAA;AACtC,IAAO,OAAA,CAAA,CAAE,SAAS,EAAE,CAAA,CAAA;AAAA,GACrB,CAAA,CAAA;AACH;;;;"}
@@ -11,7 +11,7 @@ const TIME_MAX = Math.pow(2, 48) - 1;
11
11
  const TIME_LEN = 10;
12
12
  const RANDOM_LEN = 16;
13
13
  function isULID(str) {
14
- return str?.length === 26 && /^[0-9A-HJKMNP-TV-Z]{26}$/.test(str);
14
+ return str?.length === 26 && /^[0-9A-HJKMNP-TV-Z]{26}$/i.test(str);
15
15
  }
16
16
  function replaceCharAt(str, index, char) {
17
17
  if (index > str.length - 1) {
@@ -92,7 +92,7 @@ function parseULID(id) {
92
92
  if (time > TIME_MAX) {
93
93
  throw createError("malformed ulid, timestamp too large");
94
94
  }
95
- return { time, random: id.substring(TIME_LEN) };
95
+ return { timestamp: time, random: id.substring(TIME_LEN) };
96
96
  }
97
97
  function createPrng() {
98
98
  return () => {
@@ -116,7 +116,7 @@ function createULID({
116
116
  let lastRandom;
117
117
  return function ulid2(seedTime) {
118
118
  seedTime ||= now();
119
- if (seedTime <= lastTime) {
119
+ if (seedTime <= lastTime && lastRandom) {
120
120
  const incrementedRandom = lastRandom = incrementBase32(lastRandom);
121
121
  return encodeTime(lastTime, TIME_LEN) + incrementedRandom;
122
122
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ulid.js","sources":["../../src/crypto/ulid.ts"],"sourcesContent":["import { getRandomValues } from './getRandomValues';\n\ntype PRNG = () => number;\n\n/**\n * Universally Unique Lexicographically Sortable Identifier\n *\n * @see https://github.com/ulid/spec ulid/spec\n */\nexport type ULID = (seedTime?: number) => string;\n\nexport interface ULIDError extends Error {\n source: string;\n}\n\nfunction createError(message: string): ULIDError {\n const err = new Error(message) as ULIDError;\n err.source = 'ulid';\n return err;\n}\n\n// These values should NEVER change. If\n// they do, we're no longer making ulids!\nconst ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'; // Crockford's Base32\nconst ENCODING_LEN = ENCODING.length;\nconst TIME_MAX = Math.pow(2, 48) - 1;\nconst TIME_LEN = 10;\nconst RANDOM_LEN = 16;\n\n/**\n * check give {@link str} is a valid ulid\n */\nexport function isULID(str: string): boolean {\n return str?.length === 26 && /^[0-9A-HJKMNP-TV-Z]{26}$/.test(str);\n}\n\nfunction replaceCharAt(str: string, index: number, char: string) {\n if (index > str.length - 1) {\n return str;\n }\n return str.substr(0, index) + char + str.substr(index + 1);\n}\n\nfunction incrementBase32(str: string): string {\n let done;\n let index = str.length;\n let char;\n let charIndex;\n const maxCharIndex = ENCODING_LEN - 1;\n while (!done && index-- >= 0) {\n char = str[index];\n charIndex = ENCODING.indexOf(char);\n if (charIndex === -1) {\n throw createError('incorrectly encoded string');\n }\n if (charIndex === maxCharIndex) {\n str = replaceCharAt(str, index, ENCODING[0]);\n continue;\n }\n done = replaceCharAt(str, index, ENCODING[charIndex + 1]);\n }\n if (typeof done === 'string') {\n return done;\n }\n throw createError('cannot increment this string');\n}\n\nfunction randomChar(prng: PRNG): string {\n let rand = Math.floor(prng() * ENCODING_LEN);\n if (rand === ENCODING_LEN) {\n rand = ENCODING_LEN - 1;\n }\n return ENCODING.charAt(rand);\n}\n\nfunction encodeTime(now: number, len: number): string {\n if (isNaN(now)) {\n throw new Error(`${now} must be a number`);\n }\n if (now > TIME_MAX) {\n throw createError(`cannot encode time greater than ${TIME_MAX}`);\n }\n if (now < 0) {\n throw createError('time must be positive');\n }\n if (!Number.isInteger(now)) {\n throw createError('time must be an integer');\n }\n let mod;\n let str = '';\n for (; len > 0; len--) {\n mod = now % ENCODING_LEN;\n str = ENCODING.charAt(mod) + str;\n now = (now - mod) / ENCODING_LEN;\n }\n return str;\n}\n\nfunction encodeRandom(len: number, prng: PRNG): string {\n let str = '';\n for (; len > 0; len--) {\n str = randomChar(prng) + str;\n }\n return str;\n}\n\n/**\n * extract time & random from ulid\n *\n * @throws ULIDError\n */\nexport function parseULID(id: string): { time: number; random: string } {\n if (id.length !== TIME_LEN + RANDOM_LEN) {\n throw createError('malformed ulid');\n }\n const time = id\n .substr(0, TIME_LEN)\n .split('')\n .reverse()\n .reduce((carry, char, index) => {\n const encodingIndex = ENCODING.indexOf(char);\n if (encodingIndex === -1) {\n throw createError('invalid character found: ' + char);\n }\n return (carry += encodingIndex * Math.pow(ENCODING_LEN, index));\n }, 0);\n if (time > TIME_MAX) {\n throw createError('malformed ulid, timestamp too large');\n }\n return { time, random: id.substring(TIME_LEN) };\n}\n\nfunction createPrng(): PRNG {\n return () => {\n const buffer = new Uint8Array(1);\n getRandomValues(buffer);\n return buffer[0] / 0xff;\n };\n}\n\n/**\n * create a ulid generator\n */\nexport function createULID({\n monotonic = true,\n random = createPrng(),\n now = Date.now,\n}: { monotonic?: boolean; now?: () => number; random?: () => number } = {}) {\n if (!monotonic) {\n return function ulid(seedTime?: number): string {\n seedTime ||= now();\n return encodeTime(seedTime, TIME_LEN) + encodeRandom(RANDOM_LEN, random);\n };\n }\n\n let lastTime: number = 0;\n let lastRandom: string;\n return function ulid(seedTime?: number): string {\n seedTime ||= now();\n if (seedTime <= lastTime) {\n const incrementedRandom = (lastRandom = incrementBase32(lastRandom));\n return encodeTime(lastTime, TIME_LEN) + incrementedRandom;\n }\n lastTime = seedTime;\n const newRandom = (lastRandom = encodeRandom(RANDOM_LEN, random));\n return encodeTime(seedTime, TIME_LEN) + newRandom;\n };\n}\n\n/**\n * default monotonic ulid generator\n */\nexport let ulid: ULID = (...args) => {\n if (_real) {\n return _real(...args);\n }\n // delay initialize crypto\n _real = createULID();\n ulid = _real;\n return _real(...args);\n};\nlet _real: ULID;\n"],"names":["ulid"],"mappings":"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"}
1
+ {"version":3,"file":"ulid.js","sources":["../../src/crypto/ulid.ts"],"sourcesContent":["import { getRandomValues } from './getRandomValues';\n\ntype PRNG = () => number;\n\n/**\n * Universally Unique Lexicographically Sortable Identifier\n *\n * @see https://github.com/ulid/spec ulid/spec\n */\nexport type ULID = (seedTime?: number) => string;\n\nexport interface ULIDError extends Error {\n source: string;\n}\n\nfunction createError(message: string): ULIDError {\n const err = new Error(message) as ULIDError;\n err.source = 'ulid';\n return err;\n}\n\n// These values should NEVER change. If\n// they do, we're no longer making ulids!\nconst ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'; // Crockford's Base32\nconst ENCODING_LEN = ENCODING.length;\nconst TIME_MAX = Math.pow(2, 48) - 1;\nconst TIME_LEN = 10;\nconst RANDOM_LEN = 16;\n\n/**\n * check give {@link str} is a valid ulid\n */\nexport function isULID(str: string): boolean {\n // ttttttttttrrrrrrrrrrrrrrrr\n return str?.length === 26 && /^[0-9A-HJKMNP-TV-Z]{26}$/i.test(str);\n}\n\nfunction replaceCharAt(str: string, index: number, char: string) {\n if (index > str.length - 1) {\n return str;\n }\n return str.substr(0, index) + char + str.substr(index + 1);\n}\n\nfunction incrementBase32(str: string): string {\n let done;\n let index = str.length;\n let char;\n let charIndex;\n const maxCharIndex = ENCODING_LEN - 1;\n while (!done && index-- >= 0) {\n char = str[index];\n charIndex = ENCODING.indexOf(char);\n if (charIndex === -1) {\n throw createError('incorrectly encoded string');\n }\n if (charIndex === maxCharIndex) {\n str = replaceCharAt(str, index, ENCODING[0]);\n continue;\n }\n done = replaceCharAt(str, index, ENCODING[charIndex + 1]);\n }\n if (typeof done === 'string') {\n return done;\n }\n throw createError('cannot increment this string');\n}\n\nfunction randomChar(prng: PRNG): string {\n let rand = Math.floor(prng() * ENCODING_LEN);\n if (rand === ENCODING_LEN) {\n rand = ENCODING_LEN - 1;\n }\n return ENCODING.charAt(rand);\n}\n\nfunction encodeTime(now: number, len: number): string {\n if (isNaN(now)) {\n throw new Error(`${now} must be a number`);\n }\n if (now > TIME_MAX) {\n throw createError(`cannot encode time greater than ${TIME_MAX}`);\n }\n if (now < 0) {\n throw createError('time must be positive');\n }\n if (!Number.isInteger(now)) {\n throw createError('time must be an integer');\n }\n let mod;\n let str = '';\n for (; len > 0; len--) {\n mod = now % ENCODING_LEN;\n str = ENCODING.charAt(mod) + str;\n now = (now - mod) / ENCODING_LEN;\n }\n return str;\n}\n\nfunction encodeRandom(len: number, prng: PRNG): string {\n let str = '';\n for (; len > 0; len--) {\n str = randomChar(prng) + str;\n }\n return str;\n}\n\n/**\n * extract time & random from ulid\n *\n * @throws ULIDError\n */\nexport function parseULID(id: string): { timestamp: number; random: string } {\n if (id.length !== TIME_LEN + RANDOM_LEN) {\n throw createError('malformed ulid');\n }\n const time = id\n .substr(0, TIME_LEN)\n .split('')\n .reverse()\n .reduce((carry, char, index) => {\n const encodingIndex = ENCODING.indexOf(char);\n if (encodingIndex === -1) {\n throw createError('invalid character found: ' + char);\n }\n return (carry += encodingIndex * Math.pow(ENCODING_LEN, index));\n }, 0);\n if (time > TIME_MAX) {\n throw createError('malformed ulid, timestamp too large');\n }\n return { timestamp: time, random: id.substring(TIME_LEN) };\n}\n\nfunction createPrng(): PRNG {\n return () => {\n const buffer = new Uint8Array(1);\n getRandomValues(buffer);\n return buffer[0] / 0xff;\n };\n}\n\n/**\n * create a ulid generator\n */\nexport function createULID({\n monotonic = true,\n random = createPrng(),\n now = Date.now,\n}: { monotonic?: boolean; now?: () => number; random?: () => number } = {}) {\n if (!monotonic) {\n return function ulid(seedTime?: number): string {\n seedTime ||= now();\n return encodeTime(seedTime, TIME_LEN) + encodeRandom(RANDOM_LEN, random);\n };\n }\n\n let lastTime: number = 0;\n let lastRandom: string;\n return function ulid(seedTime?: number): string {\n seedTime ||= now();\n if (seedTime <= lastTime && lastRandom) {\n const incrementedRandom = (lastRandom = incrementBase32(lastRandom));\n return encodeTime(lastTime, TIME_LEN) + incrementedRandom;\n }\n lastTime = seedTime;\n const newRandom = (lastRandom = encodeRandom(RANDOM_LEN, random));\n return encodeTime(seedTime, TIME_LEN) + newRandom;\n };\n}\n\n/**\n * default monotonic ulid generator\n */\nexport let ulid: ULID = (...args) => {\n if (_real) {\n return _real(...args);\n }\n // delay initialize crypto\n _real = createULID();\n ulid = _real;\n return _real(...args);\n};\nlet _real: ULID;\n"],"names":["ulid"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -16,9 +16,11 @@ export { isDefined } from './validations/isDefined.js';
16
16
  export { isEmptyObject } from './validations/isEmptyObject.js';
17
17
  export { isUUID } from './validations/isUUID.js';
18
18
  export { isPlainObject } from './validations/isPlainObject.js';
19
+ export { parseTimestamp } from './validations/parseTimestamp.js';
20
+ export { parseBoolean } from './validations/parseBoolean.js';
19
21
  export { parseModuleId } from './modules/parseModuleId.js';
20
22
  export { isModule } from './modules/isModule.js';
21
- export { createWriteLogger } from './logging/createWriteLogger.js';
23
+ export { createLogger } from './logging/createLogger.js';
22
24
  export { createNoopLogger } from './logging/createNoopLogger.js';
23
25
  export { createChildLogger } from './logging/createChildLogger.js';
24
26
  export { camelCase, pascalCase } from './strings/camelCase.js';
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,10 +1,10 @@
1
- import { createWriteLogger } from './createWriteLogger.js';
1
+ import { createLogger } from './createLogger.js';
2
2
 
3
3
  function createChildLogger(l, ctx) {
4
4
  if (l.child) {
5
5
  return l.child(ctx);
6
6
  }
7
- return createWriteLogger((o) => {
7
+ return createLogger((o) => {
8
8
  const { level, values, ...c } = o;
9
9
  if (Object.keys(c).length) {
10
10
  l[level](c, ...values);
@@ -1 +1 @@
1
- {"version":3,"file":"createChildLogger.js","sources":["../../src/logging/createChildLogger.ts"],"sourcesContent":["import type { Logger, LoggerWithChild } from './Logger';\nimport { createWriteLogger } from './createWriteLogger';\n\nexport function createChildLogger(l: Logger, ctx: object): LoggerWithChild {\n if (l.child) {\n return l.child(ctx) as LoggerWithChild;\n }\n return createWriteLogger((o) => {\n const { level, values, ...c } = o;\n if (Object.keys(c).length) {\n l[level](c, ...values);\n } else {\n l[level](...values);\n }\n }, ctx);\n}\n"],"names":[],"mappings":";;AAGgB,SAAA,iBAAA,CAAkB,GAAW,GAA8B,EAAA;AACzE,EAAA,IAAI,EAAE,KAAO,EAAA;AACX,IAAO,OAAA,CAAA,CAAE,MAAM,GAAG,CAAA,CAAA;AAAA,GACpB;AACA,EAAO,OAAA,iBAAA,CAAkB,CAAC,CAAM,KAAA;AAC9B,IAAA,MAAM,EAAE,KAAA,EAAO,MAAW,EAAA,GAAA,CAAA,EAAM,GAAA,CAAA,CAAA;AAChC,IAAA,IAAI,MAAO,CAAA,IAAA,CAAK,CAAC,CAAA,CAAE,MAAQ,EAAA;AACzB,MAAE,CAAA,CAAA,KAAA,CAAA,CAAO,CAAG,EAAA,GAAG,MAAM,CAAA,CAAA;AAAA,KAChB,MAAA;AACL,MAAE,CAAA,CAAA,KAAA,CAAA,CAAO,GAAG,MAAM,CAAA,CAAA;AAAA,KACpB;AAAA,KACC,GAAG,CAAA,CAAA;AACR;;;;"}
1
+ {"version":3,"file":"createChildLogger.js","sources":["../../src/logging/createChildLogger.ts"],"sourcesContent":["import type { Logger, LoggerWithChild } from './Logger';\nimport { createLogger } from './createLogger';\n\nexport function createChildLogger(l: Logger, ctx: object): LoggerWithChild {\n if (l.child) {\n return l.child(ctx) as LoggerWithChild;\n }\n return createLogger((o) => {\n const { level, values, ...c } = o;\n if (Object.keys(c).length) {\n l[level](c, ...values);\n } else {\n l[level](...values);\n }\n }, ctx);\n}\n"],"names":[],"mappings":";;AAGgB,SAAA,iBAAA,CAAkB,GAAW,GAA8B,EAAA;AACzE,EAAA,IAAI,EAAE,KAAO,EAAA;AACX,IAAO,OAAA,CAAA,CAAE,MAAM,GAAG,CAAA,CAAA;AAAA,GACpB;AACA,EAAO,OAAA,YAAA,CAAa,CAAC,CAAM,KAAA;AACzB,IAAA,MAAM,EAAE,KAAA,EAAO,MAAW,EAAA,GAAA,CAAA,EAAM,GAAA,CAAA,CAAA;AAChC,IAAA,IAAI,MAAO,CAAA,IAAA,CAAK,CAAC,CAAA,CAAE,MAAQ,EAAA;AACzB,MAAE,CAAA,CAAA,KAAA,CAAA,CAAO,CAAG,EAAA,GAAG,MAAM,CAAA,CAAA;AAAA,KAChB,MAAA;AACL,MAAE,CAAA,CAAA,KAAA,CAAA,CAAO,GAAG,MAAM,CAAA,CAAA;AAAA,KACpB;AAAA,KACC,GAAG,CAAA,CAAA;AACR;;;;"}
@@ -0,0 +1,26 @@
1
+ function createLogger(write = ({
2
+ level,
3
+ values,
4
+ ...ctx
5
+ }) => {
6
+ ({ values, ...ctx } = merge(ctx, values));
7
+ console[level]?.(...values, ctx);
8
+ }, context = {}) {
9
+ return {
10
+ trace: (...values) => write({ ...context, level: "trace", values }),
11
+ debug: (...values) => write({ ...context, level: "debug", values }),
12
+ info: (...values) => write({ ...context, level: "info", values }),
13
+ warn: (...values) => write({ ...context, level: "warn", values }),
14
+ error: (...values) => write({ ...context, level: "error", values }),
15
+ child: (ctx) => createLogger(write, { ...context, ...ctx })
16
+ };
17
+ }
18
+ function merge(ctx, values) {
19
+ if (values[0] && typeof values[0] === "object") {
20
+ return { ...ctx, ...values[0], values: values.slice(1) };
21
+ }
22
+ return { ...ctx, values };
23
+ }
24
+
25
+ export { createLogger };
26
+ //# sourceMappingURL=createLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createLogger.js","sources":["../../src/logging/createLogger.ts"],"sourcesContent":["import type { LoggerWithChild, LogLevel } from './Logger';\n\nexport function createLogger(\n write: (o: { level: LogLevel; values: any[] } & Record<string | symbol, any>) => void = ({\n level,\n values,\n ...ctx\n }) => {\n ({ values, ...ctx } = merge(ctx, values));\n console[level]?.(...values, ctx);\n },\n context: object = {},\n): LoggerWithChild {\n return {\n trace: (...values) => write({ ...context, level: 'trace', values }),\n debug: (...values) => write({ ...context, level: 'debug', values }),\n info: (...values) => write({ ...context, level: 'info', values }),\n warn: (...values) => write({ ...context, level: 'warn', values }),\n error: (...values) => write({ ...context, level: 'error', values }),\n child: (ctx) => createLogger(write, { ...context, ...ctx }),\n };\n}\n\n// logger.info({name:'wener'},'message')\n// merge initial context with message object\nfunction merge(ctx: any, values: any[]) {\n if (values[0] && typeof values[0] === 'object') {\n return { ...ctx, ...values[0], values: values.slice(1) };\n }\n return { ...ctx, values };\n}\n"],"names":[],"mappings":"AAEgB,SAAA,YAAA,CACd,QAAwF,CAAC;AAAA,EACvF,KAAA;AAAA,EACA,MAAA;AAAA,EACG,GAAA,GAAA;AACL,CAAM,KAAA;AACJ,EAAA,CAAC,EAAE,MAAQ,EAAA,GAAG,KAAQ,GAAA,KAAA,CAAM,KAAK,MAAM,CAAA,EAAA;AACvC,EAAQ,OAAA,CAAA,KAAA,CAAA,GAAS,GAAG,MAAA,EAAQ,GAAG,CAAA,CAAA;AACjC,CACA,EAAA,OAAA,GAAkB,EACD,EAAA;AACjB,EAAO,OAAA;AAAA,IACL,KAAA,EAAO,CAAI,GAAA,MAAA,KAAW,KAAM,CAAA,EAAE,GAAG,OAAS,EAAA,KAAA,EAAO,OAAS,EAAA,MAAA,EAAQ,CAAA;AAAA,IAClE,KAAA,EAAO,CAAI,GAAA,MAAA,KAAW,KAAM,CAAA,EAAE,GAAG,OAAS,EAAA,KAAA,EAAO,OAAS,EAAA,MAAA,EAAQ,CAAA;AAAA,IAClE,IAAA,EAAM,CAAI,GAAA,MAAA,KAAW,KAAM,CAAA,EAAE,GAAG,OAAS,EAAA,KAAA,EAAO,MAAQ,EAAA,MAAA,EAAQ,CAAA;AAAA,IAChE,IAAA,EAAM,CAAI,GAAA,MAAA,KAAW,KAAM,CAAA,EAAE,GAAG,OAAS,EAAA,KAAA,EAAO,MAAQ,EAAA,MAAA,EAAQ,CAAA;AAAA,IAChE,KAAA,EAAO,CAAI,GAAA,MAAA,KAAW,KAAM,CAAA,EAAE,GAAG,OAAS,EAAA,KAAA,EAAO,OAAS,EAAA,MAAA,EAAQ,CAAA;AAAA,IAClE,KAAA,EAAO,CAAC,GAAA,KAAQ,YAAa,CAAA,KAAA,EAAO,EAAE,GAAG,OAAA,EAAS,GAAG,GAAA,EAAK,CAAA;AAAA,GAC5D,CAAA;AACF,CAAA;AAIA,SAAS,KAAA,CAAM,KAAU,MAAe,EAAA;AACtC,EAAA,IAAI,MAAO,CAAA,CAAA,CAAA,IAAM,OAAO,MAAA,CAAO,OAAO,QAAU,EAAA;AAC9C,IAAO,OAAA,EAAE,GAAG,GAAA,EAAK,GAAG,MAAA,CAAO,IAAI,MAAQ,EAAA,MAAA,CAAO,KAAM,CAAA,CAAC,CAAE,EAAA,CAAA;AAAA,GACzD;AACA,EAAO,OAAA,EAAE,GAAG,GAAA,EAAK,MAAO,EAAA,CAAA;AAC1B;;;;"}
@@ -1,30 +1,23 @@
1
- async function polyfillFetch() {
1
+ function polyfillFetch(nodeFetch) {
2
2
  if ("fetch" in globalThis) {
3
3
  return false;
4
4
  }
5
- const {
6
- default: fetch,
7
- Response,
8
- Headers,
9
- Request,
10
- AbortError,
11
- FetchError,
12
- FormData,
13
- Blob,
14
- File
15
- } = await import('node-fetch');
16
- Object.assign(globalThis, {
17
- fetch,
18
- Response,
19
- Headers,
20
- Request,
21
- AbortError,
22
- FetchError,
23
- FormData,
24
- Blob,
25
- File
26
- });
27
- return true;
5
+ if (nodeFetch) {
6
+ const { default: fetch, Response, Headers, Request, AbortError, FetchError, FormData, Blob, File } = nodeFetch;
7
+ Object.assign(globalThis, {
8
+ fetch,
9
+ Response,
10
+ Headers,
11
+ Request,
12
+ AbortError,
13
+ FetchError,
14
+ FormData,
15
+ Blob,
16
+ File
17
+ });
18
+ return true;
19
+ }
20
+ return import('node-fetch').then((v) => polyfillFetch(v));
28
21
  }
29
22
 
30
23
  export { polyfillFetch };
@@ -1 +1 @@
1
- {"version":3,"file":"polyfillFetch.js","sources":["../../src/server/polyfillFetch.ts"],"sourcesContent":["export async function polyfillFetch() {\n if ('fetch' in globalThis) {\n return false;\n }\n const {\n default: fetch,\n Response,\n Headers,\n Request,\n AbortError,\n FetchError,\n FormData,\n Blob,\n File,\n } = await import('node-fetch');\n Object.assign(globalThis, {\n fetch,\n Response,\n Headers,\n Request,\n AbortError,\n FetchError,\n FormData,\n Blob,\n File,\n });\n return true;\n}\n"],"names":[],"mappings":"AAAA,eAAsB,aAAgB,GAAA;AACpC,EAAA,IAAI,WAAW,UAAY,EAAA;AACzB,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AACA,EAAM,MAAA;AAAA,IACJ,OAAS,EAAA,KAAA;AAAA,IACT,QAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,GACF,GAAI,MAAM,OAAO,YAAA,CAAA,CAAA;AACjB,EAAA,MAAA,CAAO,OAAO,UAAY,EAAA;AAAA,IACxB,KAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,GACD,CAAA,CAAA;AACD,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"polyfillFetch.js","sources":["../../src/server/polyfillFetch.ts"],"sourcesContent":["import type { MaybePromise } from '../asyncs/MaybePromise';\n\nexport function polyfillFetch(nodeFetch: typeof import('node-fetch')): boolean;\nexport function polyfillFetch(nodeFetch?: undefined): Promise<boolean>;\nexport function polyfillFetch(nodeFetch?: typeof import('node-fetch')): MaybePromise<boolean> {\n if ('fetch' in globalThis) {\n return false;\n }\n // sync mode\n if (nodeFetch) {\n const { default: fetch, Response, Headers, Request, AbortError, FetchError, FormData, Blob, File } = nodeFetch;\n Object.assign(globalThis, {\n fetch,\n Response,\n Headers,\n Request,\n AbortError,\n FetchError,\n FormData,\n Blob,\n File,\n });\n return true;\n }\n return import('node-fetch').then((v) => polyfillFetch(v));\n}\n"],"names":[],"mappings":"AAIO,SAAS,cAAc,SAAgE,EAAA;AAC5F,EAAA,IAAI,WAAW,UAAY,EAAA;AACzB,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,IAAI,SAAW,EAAA;AACb,IAAM,MAAA,EAAE,OAAS,EAAA,KAAA,EAAO,QAAU,EAAA,OAAA,EAAS,OAAS,EAAA,UAAA,EAAY,UAAY,EAAA,QAAA,EAAU,IAAM,EAAA,IAAA,EAAS,GAAA,SAAA,CAAA;AACrG,IAAA,MAAA,CAAO,OAAO,UAAY,EAAA;AAAA,MACxB,KAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA;AAAA,KACD,CAAA,CAAA;AACD,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAA,OAAO,OAAO,YAAc,CAAA,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,aAAA,CAAc,CAAC,CAAC,CAAA,CAAA;AAC1D;;;;"}
@@ -0,0 +1,31 @@
1
+ function parseBoolean(s, strict = false) {
2
+ if (typeof s === "boolean") {
3
+ return s;
4
+ }
5
+ if (typeof s === "string") {
6
+ switch (s.toLowerCase()) {
7
+ case "f":
8
+ case "false":
9
+ case "0":
10
+ return false;
11
+ case "1":
12
+ case "t":
13
+ case "true":
14
+ return true;
15
+ }
16
+ } else if (typeof s === "number") {
17
+ switch (s) {
18
+ case 0:
19
+ return false;
20
+ case 1:
21
+ return true;
22
+ }
23
+ }
24
+ if (strict) {
25
+ return void 0;
26
+ }
27
+ return Boolean(s);
28
+ }
29
+
30
+ export { parseBoolean };
31
+ //# sourceMappingURL=parseBoolean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseBoolean.js","sources":["../../src/validations/parseBoolean.ts"],"sourcesContent":["export function parseBoolean(s: string | boolean | number | null | undefined, strict: true): boolean | undefined;\nexport function parseBoolean(s: string | boolean | number | null | undefined): boolean;\nexport function parseBoolean(s?: string | boolean | number | null, strict = false): boolean | undefined {\n if (typeof s === 'boolean') {\n return s;\n }\n if (typeof s === 'string') {\n switch (s.toLowerCase()) {\n case 'f':\n case 'false':\n case '0':\n return false;\n case '1':\n case 't':\n case 'true':\n return true;\n }\n } else if (typeof s === 'number') {\n switch (s) {\n case 0:\n return false;\n case 1:\n return true;\n }\n }\n if (strict) {\n return undefined;\n }\n return Boolean(s);\n}\n"],"names":[],"mappings":"AAEgB,SAAA,YAAA,CAAa,CAAsC,EAAA,MAAA,GAAS,KAA4B,EAAA;AACtG,EAAI,IAAA,OAAO,MAAM,SAAW,EAAA;AAC1B,IAAO,OAAA,CAAA,CAAA;AAAA,GACT;AACA,EAAI,IAAA,OAAO,MAAM,QAAU,EAAA;AACzB,IAAQ,QAAA,CAAA,CAAE,aAAe;AAAA,MACvB,KAAK,GAAA,CAAA;AAAA,MACL,KAAK,OAAA,CAAA;AAAA,MACL,KAAK,GAAA;AACH,QAAO,OAAA,KAAA,CAAA;AAAA,MACT,KAAK,GAAA,CAAA;AAAA,MACL,KAAK,GAAA,CAAA;AAAA,MACL,KAAK,MAAA;AACH,QAAO,OAAA,IAAA,CAAA;AAAA,KACX;AAAA,GACF,MAAA,IAAW,OAAO,CAAA,KAAM,QAAU,EAAA;AAChC,IAAA,QAAQ,CAAG;AAAA,MACT,KAAK,CAAA;AACH,QAAO,OAAA,KAAA,CAAA;AAAA,MACT,KAAK,CAAA;AACH,QAAO,OAAA,IAAA,CAAA;AAAA,KACX;AAAA,GACF;AACA,EAAA,IAAI,MAAQ,EAAA;AACV,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACA,EAAA,OAAO,QAAQ,CAAC,CAAA,CAAA;AAClB;;;;"}
@@ -0,0 +1,25 @@
1
+ function parseTimestamp(raw) {
2
+ if (!raw) {
3
+ return void 0;
4
+ }
5
+ if (raw instanceof Date) {
6
+ return raw;
7
+ }
8
+ if (typeof raw === "string" && /^[0-9.]+$/.test(raw)) {
9
+ let n = parseFloat(raw);
10
+ const len = Math.floor(n).toString().length;
11
+ if (len <= 11) {
12
+ n *= 1e3;
13
+ }
14
+ return new Date(n);
15
+ } else if (typeof raw === "string") {
16
+ const date = new Date(raw);
17
+ if (!isNaN(+date)) {
18
+ return date;
19
+ }
20
+ }
21
+ throw new Error(`parseTimestamp: invalid "${raw}"`);
22
+ }
23
+
24
+ export { parseTimestamp };
25
+ //# sourceMappingURL=parseTimestamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseTimestamp.js","sources":["../../src/validations/parseTimestamp.ts"],"sourcesContent":["export function parseTimestamp(raw?: string | number | Date): Date | undefined {\n if (!raw) {\n return undefined;\n }\n if (raw instanceof Date) {\n return raw;\n }\n\n if (typeof raw === 'string' && /^[0-9.]+$/.test(raw)) {\n let n = parseFloat(raw);\n const len = Math.floor(n).toString().length;\n /*\n 最常见的是 10 位和 13 位\n 9999999999 - 10*9 - 1970-04-26\n 99999999999 - 11*9 - 1973\n 999999999999 - 12*9 - 2001\n */\n if (len <= 11) {\n n *= 1000;\n }\n return new Date(n);\n } else if (typeof raw === 'string') {\n const date = new Date(raw);\n if (!isNaN(+date)) {\n return date;\n }\n }\n throw new Error(`parseTimestamp: invalid \"${raw}\"`);\n}\n"],"names":[],"mappings":"AAAO,SAAS,eAAe,GAAgD,EAAA;AAC7E,EAAA,IAAI,CAAC,GAAK,EAAA;AACR,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACA,EAAA,IAAI,eAAe,IAAM,EAAA;AACvB,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AAEA,EAAA,IAAI,OAAO,GAAQ,KAAA,QAAA,IAAY,WAAY,CAAA,IAAA,CAAK,GAAG,CAAG,EAAA;AACpD,IAAI,IAAA,CAAA,GAAI,WAAW,GAAG,CAAA,CAAA;AACtB,IAAA,MAAM,MAAM,IAAK,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,UAAW,CAAA,MAAA,CAAA;AAOrC,IAAA,IAAI,OAAO,EAAI,EAAA;AACb,MAAK,CAAA,IAAA,GAAA,CAAA;AAAA,KACP;AACA,IAAO,OAAA,IAAI,KAAK,CAAC,CAAA,CAAA;AAAA,GACnB,MAAA,IAAW,OAAO,GAAA,KAAQ,QAAU,EAAA;AAClC,IAAM,MAAA,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA,CAAA;AACzB,IAAA,IAAI,CAAC,KAAA,CAAM,CAAC,IAAI,CAAG,EAAA;AACjB,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,GACF;AACA,EAAM,MAAA,IAAI,KAAM,CAAA,CAAA,yBAAA,EAA4B,GAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACpD;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wener/utils",
3
- "version": "1.1.8",
3
+ "version": "1.1.9",
4
4
  "type": "module",
5
5
  "description": "Utils for daily use",
6
6
  "repository": {
@@ -10,10 +10,6 @@
10
10
  "homepage": "https://github.com/wenerme/wode#readme",
11
11
  "author": "wener",
12
12
  "license": "MIT",
13
- "engines": {
14
- "node": "16",
15
- "npm": "8"
16
- },
17
13
  "main": "dist/cjs/index.cjs",
18
14
  "module": "lib/index.js",
19
15
  "exports": {
@@ -61,9 +57,9 @@
61
57
  "lodash"
62
58
  ],
63
59
  "devDependencies": {
64
- "@types/lodash": "^4.14.186",
65
- "ava": "^5.0.1",
66
- "lodash": "^4",
60
+ "@types/lodash": "^4.14.189",
61
+ "ava": "^5.1.0",
62
+ "lodash": "^4.17.21",
67
63
  "tsd": "^0.24.1"
68
64
  },
69
65
  "publishConfig": {
@@ -77,6 +73,7 @@
77
73
  },
78
74
  "nodeArguments": [
79
75
  "--conditions=typescript",
76
+ "--experimental-import-meta-resolve",
80
77
  "--require=@wener/wode/suppress-experimental.cjs",
81
78
  "--loader=tsx"
82
79
  ]
@@ -1,4 +1,5 @@
1
1
  import type { MaybePromise } from './MaybePromise';
2
+ import { isPromise } from './isPromise';
2
3
 
3
4
  export type LazyPromise<T> = Promise<T> & {
4
5
  reject(reason?: any): void;
@@ -51,7 +52,7 @@ export function createLazyPromise<T = any>(
51
52
  // kind of bad
52
53
  const result = executor(holder.resolve, holder.reject);
53
54
  // ensure resolve/reject is called
54
- if (result && 'then' in result) {
55
+ if (isPromise(result)) {
55
56
  result.then(holder.resolve, holder.reject);
56
57
  } else if (result !== undefined) {
57
58
  holder.resolve(result);
@@ -0,0 +1,4 @@
1
+ export function isThenable(v: any): v is PromiseLike<any> {
2
+ // we are at Promise era now, so we can use Promise instead of PromiseLike
3
+ return v && typeof v.then === 'function';
4
+ }
@@ -3,22 +3,24 @@ let nodeCrypto: Awaited<typeof import('node:crypto')>;
3
3
  // globalThis.process?.release?.name
4
4
 
5
5
  // typedoc error
6
- if (!(process as any).browser) {
7
- try {
8
- if (typeof require === 'undefined') {
9
- void import('node:crypto').then((v) => (nodeCrypto = v.default));
10
- } else {
11
- nodeCrypto = require('node:crypto');
12
- }
13
- } catch (e) {}
14
- }
6
+ // if (!(process as any).browser) {
7
+ // try {
8
+ // if (typeof require === 'undefined') {
9
+ // void import('node:crypto').then((v) => (nodeCrypto = v.default));
10
+ // } else {
11
+ // nodeCrypto = require('node:crypto');
12
+ // }
13
+ // } catch (e) {}
14
+ // }
15
15
 
16
16
  export let getRandomValues: <T extends Exclude<NodeJS.TypedArray, Float32Array | Float64Array>>(typedArray: T) => T =
17
- globalThis.crypto?.getRandomValues || (globalThis as any).msCrypto?.getRandomValues || _getRandomValues;
17
+ globalThis.crypto?.getRandomValues?.bind(globalThis.crypto) ||
18
+ (globalThis as any).msCrypto?.getRandomValues?.bind((globalThis as any).msCrypto) ||
19
+ _getRandomValues;
18
20
 
19
21
  function _getRandomValues<T extends Exclude<NodeJS.TypedArray, Float32Array | Float64Array>>(buf: T) {
20
22
  if (nodeCrypto?.webcrypto?.getRandomValues) {
21
- getRandomValues = nodeCrypto?.webcrypto?.getRandomValues;
23
+ getRandomValues = nodeCrypto?.webcrypto?.getRandomValues?.bind(nodeCrypto?.webcrypto);
22
24
  return nodeCrypto.webcrypto.getRandomValues(buf);
23
25
  }
24
26
  if (nodeCrypto?.randomBytes) {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * generate random UUIDv4
3
3
  */
4
- export const randomUUID: () => string = globalThis.crypto?.randomUUID || _randomUUID;
4
+ export const randomUUID: () => string = globalThis.crypto?.randomUUID.bind(globalThis.crypto) || _randomUUID;
5
5
 
6
6
  /**
7
7
  * @internal
@@ -1,5 +1,5 @@
1
1
  import test from 'ava';
2
- import { createULID, parseULID } from './ulid';
2
+ import { createULID, isULID, parseULID } from './ulid';
3
3
 
4
4
  test('ulid', (t) => {
5
5
  // monotonic
@@ -13,10 +13,18 @@ test('ulid', (t) => {
13
13
  });
14
14
 
15
15
  const ulid1 = ulid();
16
- t.is(parseULID(ulid1).time, lastTime);
16
+ t.is(parseULID(ulid1).timestamp, lastTime);
17
+ t.true(isULID(ulid1), ulid1);
17
18
 
18
19
  const ulid2 = ulid();
19
20
  t.true(ulid1 < ulid2);
20
- t.is(parseULID(ulid2).time, lastTime);
21
+ t.true(isULID(ulid2), ulid2);
22
+ t.is(parseULID(ulid2).timestamp, lastTime);
23
+ }
24
+
25
+ {
26
+ const next = createULID();
27
+ t.true(isULID(next().toLowerCase()));
28
+ t.true(isULID('ttttttttttrrrrrrrrrrrrrrrr'));
21
29
  }
22
30
  });
@@ -31,7 +31,8 @@ const RANDOM_LEN = 16;
31
31
  * check give {@link str} is a valid ulid
32
32
  */
33
33
  export function isULID(str: string): boolean {
34
- return str?.length === 26 && /^[0-9A-HJKMNP-TV-Z]{26}$/.test(str);
34
+ // ttttttttttrrrrrrrrrrrrrrrr
35
+ return str?.length === 26 && /^[0-9A-HJKMNP-TV-Z]{26}$/i.test(str);
35
36
  }
36
37
 
37
38
  function replaceCharAt(str: string, index: number, char: string) {
@@ -109,7 +110,7 @@ function encodeRandom(len: number, prng: PRNG): string {
109
110
  *
110
111
  * @throws ULIDError
111
112
  */
112
- export function parseULID(id: string): { time: number; random: string } {
113
+ export function parseULID(id: string): { timestamp: number; random: string } {
113
114
  if (id.length !== TIME_LEN + RANDOM_LEN) {
114
115
  throw createError('malformed ulid');
115
116
  }
@@ -127,7 +128,7 @@ export function parseULID(id: string): { time: number; random: string } {
127
128
  if (time > TIME_MAX) {
128
129
  throw createError('malformed ulid, timestamp too large');
129
130
  }
130
- return { time, random: id.substring(TIME_LEN) };
131
+ return { timestamp: time, random: id.substring(TIME_LEN) };
131
132
  }
132
133
 
133
134
  function createPrng(): PRNG {
@@ -157,7 +158,7 @@ export function createULID({
157
158
  let lastRandom: string;
158
159
  return function ulid(seedTime?: number): string {
159
160
  seedTime ||= now();
160
- if (seedTime <= lastTime) {
161
+ if (seedTime <= lastTime && lastRandom) {
161
162
  const incrementedRandom = (lastRandom = incrementBase32(lastRandom));
162
163
  return encodeTime(lastTime, TIME_LEN) + incrementedRandom;
163
164
  }