@wener/utils 1.1.39 → 1.1.40
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/lib/asyncs/createAsyncIterator.js.map +1 -1
- package/lib/asyncs/createLazyPromise.js.map +1 -1
- package/lib/asyncs/firstOfAsyncIterator.js.map +1 -1
- package/lib/asyncs/nextOfAsyncIterator.js.map +1 -1
- package/lib/cn/division/DivisionCode.js +35 -43
- package/lib/cn/division/DivisionCode.js.map +1 -1
- package/lib/cn/division/binarySearch.js +27 -0
- package/lib/cn/division/binarySearch.js.map +1 -0
- package/lib/cn/id/ResidentIdNumber.js +25 -14
- package/lib/cn/id/ResidentIdNumber.js.map +1 -1
- package/lib/cn/index.js +1 -0
- package/lib/cn/index.js.map +1 -1
- package/lib/cn/pinyin/cartesianProduct.js +22 -0
- package/lib/cn/pinyin/cartesianProduct.js.map +1 -0
- package/lib/cn/pinyin/data.json +413 -0
- package/lib/cn/pinyin/toPinyinPure.js +39 -0
- package/lib/cn/pinyin/toPinyinPure.js.map +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/langs/mixin.js +22 -0
- package/lib/langs/mixin.js.map +1 -0
- package/lib/logging/createChildLogger.js.map +1 -1
- package/lib/objects/get.js.map +1 -1
- package/lib/objects/set.js.map +1 -1
- package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js +1 -1
- package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js.map +1 -1
- package/lib/scripts/getGenerateContext.js +86 -0
- package/lib/scripts/getGenerateContext.js.map +1 -0
- package/lib/types.d.js.map +1 -1
- package/package.json +2 -1
- package/src/asyncs/createAsyncIterator.ts +1 -1
- package/src/asyncs/createLazyPromise.ts +1 -1
- package/src/asyncs/firstOfAsyncIterator.ts +1 -1
- package/src/asyncs/nextOfAsyncIterator.ts +1 -1
- package/src/cn/division/DivisionCode.ts +37 -44
- package/src/cn/division/binarySearch.test.ts +64 -0
- package/src/cn/division/binarySearch.ts +25 -0
- package/src/cn/id/ResidentIdNumber.ts +38 -12
- package/src/cn/id/id.test.ts +1 -1
- package/src/cn/index.ts +2 -0
- package/src/cn/pinyin/cartesianProduct.test.ts +64 -0
- package/src/cn/pinyin/cartesianProduct.ts +24 -0
- package/src/cn/pinyin/data.json +413 -0
- package/src/cn/pinyin/toPinyin.test.ts +10 -0
- package/src/cn/pinyin/toPinyinPure.ts +52 -0
- package/src/cn/scripts/gen.test.ts +130 -0
- package/src/cn/uscc/uscc.test.ts +2 -2
- package/src/index.ts +3 -0
- package/src/io/ArrayBuffers.base64.test.ts +1 -1
- package/src/io/ArrayBuffers.test.ts +1 -1
- package/src/io/Buffer.test.ts +1 -1
- package/src/langs/README.md +4 -0
- package/src/langs/mixin.ts +82 -0
- package/src/logging/createChildLogger.ts +1 -1
- package/src/logging/logger.test.ts +1 -1
- package/src/modules/parseModuleId.test.ts +1 -1
- package/src/objects/get.ts +1 -2
- package/src/objects/parseObjectPath.test.ts +1 -1
- package/src/objects/set.test.ts +1 -1
- package/src/objects/set.ts +1 -2
- package/src/schema/typebox/gen/codegen/typescript/typescript-to-model.ts +1 -1
- package/src/scripts/getGenerateContext.ts +97 -0
- package/src/server/polyfill/polyfillBrowser.test.ts +1 -1
- package/src/types.d.ts +2 -2
- package/lib/langs/hashCode.ignored.js +0 -112
- package/lib/langs/hashCode.ignored.js.map +0 -1
- package/src/langs/hashCode.ignored.ts +0 -125
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { cartesianProduct } from './cartesianProduct.js';
|
|
2
|
+
// import CharToPinyins from './pinyin.json' with { type: 'json' };
|
|
3
|
+
import PyToChar from './data.json';
|
|
4
|
+
let CharToPinyinTable;
|
|
5
|
+
export function getCharToPinyinTable() {
|
|
6
|
+
if (!CharToPinyinTable) {
|
|
7
|
+
CharToPinyinTable = {};
|
|
8
|
+
for (let [py, chars] of Object.entries(PyToChar)){
|
|
9
|
+
for (let c of chars){
|
|
10
|
+
if (!CharToPinyinTable[c]) {
|
|
11
|
+
CharToPinyinTable[c] = [];
|
|
12
|
+
}
|
|
13
|
+
CharToPinyinTable[c].push(py);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return CharToPinyinTable;
|
|
18
|
+
}
|
|
19
|
+
export function toPinyinPureFirst(s, sep = ',') {
|
|
20
|
+
let tab = getCharToPinyinTable();
|
|
21
|
+
return s.split('').map((c)=>tab[c]?.[0]).filter(Boolean).join(sep);
|
|
22
|
+
}
|
|
23
|
+
export function toPinyinPure(s, sep = ',') {
|
|
24
|
+
let tab = getCharToPinyinTable();
|
|
25
|
+
// ensure order
|
|
26
|
+
return cartesianProduct(s.split('').map((c)=>tab[c] || '')).sort((a, b)=>{
|
|
27
|
+
for(let i = 0; i < a.length; i++){
|
|
28
|
+
let x = a[i];
|
|
29
|
+
let y = b[i];
|
|
30
|
+
if (x < y) return -1;
|
|
31
|
+
if (x > y) return 1;
|
|
32
|
+
}
|
|
33
|
+
return 0;
|
|
34
|
+
}).map((v)=>v.filter(Boolean).join(sep));
|
|
35
|
+
} // export function lookupPinyinPure(s: string): Array<Array<string>> {
|
|
36
|
+
// return cartesianProductOfArray(s.split('').map(c => Lookup[c]));
|
|
37
|
+
// }
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=toPinyinPure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cn/pinyin/toPinyinPure.ts"],"sourcesContent":["import { cartesianProduct } from './cartesianProduct';\n// import CharToPinyins from './pinyin.json' with { type: 'json' };\nimport PyToChar from './data.json' with { type: 'json' };\n\nlet CharToPinyinTable: Record<string, string[]>;\n\nexport function getCharToPinyinTable() {\n if (!CharToPinyinTable) {\n CharToPinyinTable = {};\n for (let [py, chars] of Object.entries(PyToChar)) {\n for (let c of chars) {\n if (!CharToPinyinTable[c]) {\n CharToPinyinTable[c] = [];\n }\n CharToPinyinTable[c].push(py);\n }\n }\n }\n return CharToPinyinTable;\n}\n\nexport function toPinyinPureFirst(s: string, sep = ','): string {\n let tab = getCharToPinyinTable();\n return s\n .split('')\n .map((c) => tab[c]?.[0])\n .filter(Boolean)\n .join(sep);\n}\n\n\nexport function toPinyinPure(s: string, sep = ','): string[] {\n let tab = getCharToPinyinTable();\n // ensure order\n return cartesianProduct(s.split('')\n .map((c) => tab[c] || ''))\n .sort((a, b) => {\n for (let i = 0; i < a.length; i++) {\n let x = a[i];\n let y = b[i];\n if (x < y) return -1;\n if (x > y) return 1;\n }\n return 0;\n })\n .map((v) => v.filter(Boolean).join(sep));\n}\n\n// export function lookupPinyinPure(s: string): Array<Array<string>> {\n// return cartesianProductOfArray(s.split('').map(c => Lookup[c]));\n// }\n\n"],"names":["cartesianProduct","PyToChar","CharToPinyinTable","getCharToPinyinTable","py","chars","Object","entries","c","push","toPinyinPureFirst","s","sep","tab","split","map","filter","Boolean","join","toPinyinPure","sort","a","b","i","length","x","y","v"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,qBAAqB;AACtD,mEAAmE;AACnE,OAAOC,cAAc,cAAoC;AAEzD,IAAIC;AAEJ,OAAO,SAASC;IACd,IAAI,CAACD,mBAAmB;QACtBA,oBAAoB,CAAC;QACrB,KAAK,IAAI,CAACE,IAAIC,MAAM,IAAIC,OAAOC,OAAO,CAACN,UAAW;YAChD,KAAK,IAAIO,KAAKH,MAAO;gBACnB,IAAI,CAACH,iBAAiB,CAACM,EAAE,EAAE;oBACzBN,iBAAiB,CAACM,EAAE,GAAG,EAAE;gBAC3B;gBACAN,iBAAiB,CAACM,EAAE,CAACC,IAAI,CAACL;YAC5B;QACF;IACF;IACA,OAAOF;AACT;AAEA,OAAO,SAASQ,kBAAkBC,CAAS,EAAEC,MAAM,GAAG;IACpD,IAAIC,MAAMV;IACV,OAAOQ,EACJG,KAAK,CAAC,IACNC,GAAG,CAAC,CAACP,IAAMK,GAAG,CAACL,EAAE,EAAE,CAAC,EAAE,EACtBQ,MAAM,CAACC,SACPC,IAAI,CAACN;AACV;AAGA,OAAO,SAASO,aAAaR,CAAS,EAAEC,MAAM,GAAG;IAC/C,IAAIC,MAAMV;IACV,eAAe;IACf,OAAOH,iBAAiBW,EAAEG,KAAK,CAAC,IAC7BC,GAAG,CAAC,CAACP,IAAMK,GAAG,CAACL,EAAE,IAAI,KACrBY,IAAI,CAAC,CAACC,GAAGC;QACR,IAAK,IAAIC,IAAI,GAAGA,IAAIF,EAAEG,MAAM,EAAED,IAAK;YACjC,IAAIE,IAAIJ,CAAC,CAACE,EAAE;YACZ,IAAIG,IAAIJ,CAAC,CAACC,EAAE;YACZ,IAAIE,IAAIC,GAAG,OAAO,CAAC;YACnB,IAAID,IAAIC,GAAG,OAAO;QACpB;QACA,OAAO;IACT,GACCX,GAAG,CAAC,CAACY,IAAMA,EAAEX,MAAM,CAACC,SAASC,IAAI,CAACN;AACvC,EAEA,sEAAsE;CACtE,qEAAqE;CACrE,IAAI"}
|
package/lib/index.js
CHANGED
|
@@ -32,6 +32,7 @@ export { isPlainObject } from './langs/isPlainObject.js';
|
|
|
32
32
|
export { parseBoolean } from './langs/parseBoolean.js';
|
|
33
33
|
export { maybeFunction } from './langs/MaybeFunction.js';
|
|
34
34
|
export { memoize } from './langs/memoize.js';
|
|
35
|
+
export { mixin } from './langs/mixin.js';
|
|
35
36
|
export { AsyncCloser } from './runtime/AsyncCloser.js';
|
|
36
37
|
export { Closer } from './runtime/Closer.js';
|
|
37
38
|
export { isUUID } from './validations/isUUID.js';
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// arrays\nexport {\n firstOfMaybeArray,\n lastOfMaybeArray,\n arrayOfMaybeArray,\n objectOfMaybeArray,\n type MaybeArray,\n} from './arrays/MaybeArray';\nexport { arrayFromAsync } from './arrays/arrayFromAsync';\n\n// object\nexport { get } from './objects/get';\nexport { set } from './objects/set';\nexport { parseObjectPath } from './objects/parseObjectPath';\nexport { computeIfAbsent } from './objects/computeIfAbsent';\nexport { merge, type MergeOptions } from './objects/merge';\n\n// async\nexport { createLazyPromise, type LazyPromise } from './asyncs/createLazyPromise';\nexport { setAsyncInterval, clearAsyncInterval } from './asyncs/AsyncInterval';\nexport { type MaybePromise } from './asyncs/MaybePromise';\n// async - iterator\nexport { createAsyncIterator } from './asyncs/createAsyncIterator';\nexport { firstOfAsyncIterator } from './asyncs/firstOfAsyncIterator';\nexport { nextOfAsyncIterator } from './asyncs/nextOfAsyncIterator';\nexport { isIterator } from './asyncs/isIterator';\n\nexport { sleep } from './asyncs/sleep';\nexport { timeout, TimeoutError } from './asyncs/timeout';\nexport { isPromise } from './asyncs/isPromise';\n// export * from './async/promiseOfCallback';\n\n// langs\nexport { shallowEqual } from './langs/shallowEqual';\nexport { deepEqual } from './langs/deepEqual';\nexport { deepFreeze } from './langs/deepFreeze';\nexport { classOf } from './langs/classOf';\nexport { shallowClone } from './langs/shallowClone';\nexport { isClass } from './langs/isClass';\nexport { isDefined } from './langs/isDefined';\nexport { isEmptyObject } from './langs/isEmptyObject';\nexport { isPlainObject } from './langs/isPlainObject';\nexport { parseBoolean } from './langs/parseBoolean';\nexport { maybeFunction, type MaybeFunction } from './langs/MaybeFunction';\nexport { memoize } from './langs/memoize';\nexport { AsyncCloser } from './runtime/AsyncCloser';\nexport { Closer } from './runtime/Closer';\n\nexport { isUUID } from './validations/isUUID';\nexport { parseTimestamp } from './validations/parseTimestamp';\n\n// modules\nexport { parseModuleId, type ParsedModuleId } from './modules/parseModuleId';\nexport { isModule, type Module } from './modules/isModule';\n\n// logging\nexport { type Logger, type LogLevel } from './logging/Logger';\nexport { createLogger } from './logging/createLogger';\nexport { createNoopLogger } from './logging/createNoopLogger';\nexport { createChildLogger } from './logging/createChildLogger';\n\n// strings\nexport { pascalCase, camelCase } from './strings/camelCase';\nexport { renderTemplate } from './strings/renderTemplate';\nexport { formatBytes } from './strings/formatBytes';\n\n// i18n\nexport { createTranslate } from './i18n/createTranslate';\n\n// io\nexport { isBuffer } from './io/isBuffer';\nexport { isTransferable } from './io/isTransferable';\nexport { ArrayBuffers } from './io/ArrayBuffers';\nexport { Buffer } from './io/Buffer';\nexport { parseDataUri, type ParsedDataUri } from './io/parseDataUri';\nexport type { AbstractEncoding } from './io/AbstractEncoding';\n\n// browser\nexport { copy } from './browsers/copy';\nexport { download } from './browsers/download';\nexport { loadScripts, loadStyles } from './browsers/loaders';\nexport { getFileFromDataTransfer } from './browsers/getFileFromDataTransfer';\n\n// polyfills\nexport { getGlobalThis } from './runtime/getGlobalThis';\nexport { structuredClone } from './runtime/structuredClone';\n\n// crypto\nexport { randomUUID } from './crypto/randomUUID';\nexport { getRandomValues } from './crypto/getRandomValues';\nexport { sha1, sha256, sha384, sha512, hmac, type DigestOptions } from './crypto/hashing';\nexport { md5 } from './crypto/md5';\nexport { hex } from './crypto/base';\nexport { isULID, createULID, ulid, parseULID } from './crypto/ulid';\nexport { PEM } from './crypto/pem/pem';\n\n// math\nexport { createRandom } from './maths/random';\nexport { clamp } from './maths/clamp';\n\n// network\nexport {\n type FetchLike,\n createFetchWith,\n createFetchWithLogging,\n dumpResponse,\n dumpRequest,\n createFetchWithRetry,\n type FetchWithRetryOptions,\n} from './fetch';\n\n// bundled\nexport { default as ms } from './libs/ms';\n\n// error\nexport { Errors, DetailError, type ErrorDetail, type ErrorDetailInit } from './errors/Errors';\n// http\nexport { getHttpStatusText, isRetryableHttpStatus } from './fetch/HttpStatus';\n\nexport type * from './types';\n"],"names":["firstOfMaybeArray","lastOfMaybeArray","arrayOfMaybeArray","objectOfMaybeArray","arrayFromAsync","get","set","parseObjectPath","computeIfAbsent","merge","createLazyPromise","setAsyncInterval","clearAsyncInterval","createAsyncIterator","firstOfAsyncIterator","nextOfAsyncIterator","isIterator","sleep","timeout","TimeoutError","isPromise","shallowEqual","deepEqual","deepFreeze","classOf","shallowClone","isClass","isDefined","isEmptyObject","isPlainObject","parseBoolean","maybeFunction","memoize","AsyncCloser","Closer","isUUID","parseTimestamp","parseModuleId","isModule","createLogger","createNoopLogger","createChildLogger","pascalCase","camelCase","renderTemplate","formatBytes","createTranslate","isBuffer","isTransferable","ArrayBuffers","Buffer","parseDataUri","copy","download","loadScripts","loadStyles","getFileFromDataTransfer","getGlobalThis","structuredClone","randomUUID","getRandomValues","sha1","sha256","sha384","sha512","hmac","md5","hex","isULID","createULID","ulid","parseULID","PEM","createRandom","clamp","createFetchWith","createFetchWithLogging","dumpResponse","dumpRequest","createFetchWithRetry","default","ms","Errors","DetailError","getHttpStatusText","isRetryableHttpStatus"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// arrays\nexport {\n firstOfMaybeArray,\n lastOfMaybeArray,\n arrayOfMaybeArray,\n objectOfMaybeArray,\n type MaybeArray,\n} from './arrays/MaybeArray';\nexport { arrayFromAsync } from './arrays/arrayFromAsync';\n\n// object\nexport { get } from './objects/get';\nexport { set } from './objects/set';\nexport { parseObjectPath } from './objects/parseObjectPath';\nexport { computeIfAbsent } from './objects/computeIfAbsent';\nexport { merge, type MergeOptions } from './objects/merge';\n\n// async\nexport { createLazyPromise, type LazyPromise } from './asyncs/createLazyPromise';\nexport { setAsyncInterval, clearAsyncInterval } from './asyncs/AsyncInterval';\nexport { type MaybePromise } from './asyncs/MaybePromise';\n// async - iterator\nexport { createAsyncIterator } from './asyncs/createAsyncIterator';\nexport { firstOfAsyncIterator } from './asyncs/firstOfAsyncIterator';\nexport { nextOfAsyncIterator } from './asyncs/nextOfAsyncIterator';\nexport { isIterator } from './asyncs/isIterator';\n\nexport { sleep } from './asyncs/sleep';\nexport { timeout, TimeoutError } from './asyncs/timeout';\nexport { isPromise } from './asyncs/isPromise';\n// export * from './async/promiseOfCallback';\n\n// langs\nexport { shallowEqual } from './langs/shallowEqual';\nexport { deepEqual } from './langs/deepEqual';\nexport { deepFreeze } from './langs/deepFreeze';\nexport { classOf } from './langs/classOf';\nexport { shallowClone } from './langs/shallowClone';\nexport { isClass } from './langs/isClass';\nexport { isDefined } from './langs/isDefined';\nexport { isEmptyObject } from './langs/isEmptyObject';\nexport { isPlainObject } from './langs/isPlainObject';\nexport { parseBoolean } from './langs/parseBoolean';\nexport { maybeFunction, type MaybeFunction } from './langs/MaybeFunction';\nexport { memoize } from './langs/memoize';\nexport { mixin } from './langs/mixin';\nexport type { MixinFunction, MixinInstance, MixinReturnValue } from './langs/mixin';\n\nexport { AsyncCloser } from './runtime/AsyncCloser';\nexport { Closer } from './runtime/Closer';\n\nexport { isUUID } from './validations/isUUID';\nexport { parseTimestamp } from './validations/parseTimestamp';\n\n// modules\nexport { parseModuleId, type ParsedModuleId } from './modules/parseModuleId';\nexport { isModule, type Module } from './modules/isModule';\n\n// logging\nexport { type Logger, type LogLevel } from './logging/Logger';\nexport { createLogger } from './logging/createLogger';\nexport { createNoopLogger } from './logging/createNoopLogger';\nexport { createChildLogger } from './logging/createChildLogger';\n\n// strings\nexport { pascalCase, camelCase } from './strings/camelCase';\nexport { renderTemplate } from './strings/renderTemplate';\nexport { formatBytes } from './strings/formatBytes';\n\n// i18n\nexport { createTranslate } from './i18n/createTranslate';\n\n// io\nexport { isBuffer } from './io/isBuffer';\nexport { isTransferable } from './io/isTransferable';\nexport { ArrayBuffers } from './io/ArrayBuffers';\nexport { Buffer } from './io/Buffer';\nexport { parseDataUri, type ParsedDataUri } from './io/parseDataUri';\nexport type { AbstractEncoding } from './io/AbstractEncoding';\n\n// browser\nexport { copy } from './browsers/copy';\nexport { download } from './browsers/download';\nexport { loadScripts, loadStyles } from './browsers/loaders';\nexport { getFileFromDataTransfer } from './browsers/getFileFromDataTransfer';\n\n// polyfills\nexport { getGlobalThis } from './runtime/getGlobalThis';\nexport { structuredClone } from './runtime/structuredClone';\n\n// crypto\nexport { randomUUID } from './crypto/randomUUID';\nexport { getRandomValues } from './crypto/getRandomValues';\nexport { sha1, sha256, sha384, sha512, hmac, type DigestOptions } from './crypto/hashing';\nexport { md5 } from './crypto/md5';\nexport { hex } from './crypto/base';\nexport { isULID, createULID, ulid, parseULID } from './crypto/ulid';\nexport { PEM } from './crypto/pem/pem';\n\n// math\nexport { createRandom } from './maths/random';\nexport { clamp } from './maths/clamp';\n\n// network\nexport {\n type FetchLike,\n createFetchWith,\n createFetchWithLogging,\n dumpResponse,\n dumpRequest,\n createFetchWithRetry,\n type FetchWithRetryOptions,\n} from './fetch';\n\n// bundled\nexport { default as ms } from './libs/ms';\n\n// error\nexport { Errors, DetailError, type ErrorDetail, type ErrorDetailInit } from './errors/Errors';\n// http\nexport { getHttpStatusText, isRetryableHttpStatus } from './fetch/HttpStatus';\n\nexport type * from './types';\n"],"names":["firstOfMaybeArray","lastOfMaybeArray","arrayOfMaybeArray","objectOfMaybeArray","arrayFromAsync","get","set","parseObjectPath","computeIfAbsent","merge","createLazyPromise","setAsyncInterval","clearAsyncInterval","createAsyncIterator","firstOfAsyncIterator","nextOfAsyncIterator","isIterator","sleep","timeout","TimeoutError","isPromise","shallowEqual","deepEqual","deepFreeze","classOf","shallowClone","isClass","isDefined","isEmptyObject","isPlainObject","parseBoolean","maybeFunction","memoize","mixin","AsyncCloser","Closer","isUUID","parseTimestamp","parseModuleId","isModule","createLogger","createNoopLogger","createChildLogger","pascalCase","camelCase","renderTemplate","formatBytes","createTranslate","isBuffer","isTransferable","ArrayBuffers","Buffer","parseDataUri","copy","download","loadScripts","loadStyles","getFileFromDataTransfer","getGlobalThis","structuredClone","randomUUID","getRandomValues","sha1","sha256","sha384","sha512","hmac","md5","hex","isULID","createULID","ulid","parseULID","PEM","createRandom","clamp","createFetchWith","createFetchWithLogging","dumpResponse","dumpRequest","createFetchWithRetry","default","ms","Errors","DetailError","getHttpStatusText","isRetryableHttpStatus"],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper type to convert a union to an intersection.
|
|
3
|
+
*
|
|
4
|
+
* @internal
|
|
5
|
+
*/ /**
|
|
6
|
+
* Applies the given mixins to the a common base class.
|
|
7
|
+
*
|
|
8
|
+
* @param Base The base class to apply the mixins to.
|
|
9
|
+
* @param mixins The mixins to apply. All mixins must extend a common base class or an empty class.
|
|
10
|
+
* @returns A class constructor with all mixins applied.
|
|
11
|
+
*
|
|
12
|
+
* @typeParam T The type of the base class.
|
|
13
|
+
* @typeParam M The type of the mixin functions.
|
|
14
|
+
*
|
|
15
|
+
* @example ```ts
|
|
16
|
+
* class Dog extends mixin(Animal, FourLegged, Carnivore, PackHunting, Barking, Domesticated) {}
|
|
17
|
+
* ```
|
|
18
|
+
*/ export function mixin(Base, ...mixins) {
|
|
19
|
+
return mixins.reduce((mix, applyMixin)=>applyMixin(mix), Base);
|
|
20
|
+
} // https://github.com/1nVitr0/lib-ts-mixin-extended
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=mixin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/langs/mixin.ts"],"sourcesContent":["/**\n * Helper type to convert a union to an intersection.\n *\n * @internal\n */\ntype UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never;\n\n/**\n * Constructor function, that creates a new instance of the given type.\n *\n * @typeParam T The type of the instance to create.\n * @example ```ts\n * function Walkable<TBase extends MixinConstructor<Positionable>>(Base: TBase) {\n * ··return class Walkable extends Base {\n * ····public forward() { this.x++; }\n * ····public backward() { this.x--; }\n * ··};\n * }\n * ```\n * @example ```ts\n * function Loggable(Base: MixinConstructor) {\n * ··return class Loggable extends Base {\n * ····public log(message: string) { throw new Error(404); }\n * ··};\n * }\n * ```\n */\nexport type MixinConstructor<T = {}> = new (...args: any[]) => T;\n\n/**\n * Function that applies a mixin to a given base class.\n *\n * @typeParam T The type of the base class.\n * @typeParam R The type of the returned class.\n */\nexport type MixinFunction<T extends MixinConstructor = MixinConstructor, R extends T = T & MixinConstructor> = (\n Base: T,\n) => R;\n\n/**\n * The return type of the mixin function.\n *\n * @typeParam T The type of the base class.\n * @typeParam M The type of the mixin functions.\n */\nexport type MixinReturnValue<T extends MixinConstructor, M extends MixinFunction<T, any>[]> = UnionToIntersection<\n | T\n | {\n [K in keyof M]: M[K] extends MixinFunction<any, infer U> ? U : never;\n }[number]\n>;\n\n/**\n * The instance created by a mixin function.\n *\n * @typeParam F The type of the mixin function.\n */\nexport type MixinInstance<F extends MixinFunction<any>> =\n F extends MixinFunction<MixinConstructor<any>, infer R> ? InstanceType<R> : never;\n\n/**\n * Applies the given mixins to the a common base class.\n *\n * @param Base The base class to apply the mixins to.\n * @param mixins The mixins to apply. All mixins must extend a common base class or an empty class.\n * @returns A class constructor with all mixins applied.\n *\n * @typeParam T The type of the base class.\n * @typeParam M The type of the mixin functions.\n *\n * @example ```ts\n * class Dog extends mixin(Animal, FourLegged, Carnivore, PackHunting, Barking, Domesticated) {}\n * ```\n */\nexport function mixin<T extends MixinConstructor, M extends MixinFunction<T, any>[]>(\n Base: T,\n ...mixins: M\n): MixinReturnValue<T, M> {\n return mixins.reduce((mix, applyMixin) => applyMixin(mix), Base) as MixinReturnValue<T, M>;\n}\n\n// https://github.com/1nVitr0/lib-ts-mixin-extended\n"],"names":["mixin","Base","mixins","reduce","mix","applyMixin"],"mappings":"AAAA;;;;CAIC,GAwDD;;;;;;;;;;;;;CAaC,GACD,OAAO,SAASA,MACdC,IAAO,EACP,GAAGC,MAAS;IAEZ,OAAOA,OAAOC,MAAM,CAAC,CAACC,KAAKC,aAAeA,WAAWD,MAAMH;AAC7D,EAEA,mDAAmD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/logging/createChildLogger.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../src/logging/createChildLogger.ts"],"sourcesContent":["import { createLogger } from './createLogger';\nimport type { Logger, LoggerWithChild } from './Logger';\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":["createLogger","createChildLogger","l","ctx","child","o","level","values","c","Object","keys","length"],"mappings":"AAAA,SAASA,YAAY,QAAQ,iBAAiB;AAG9C,OAAO,SAASC,kBAAkBC,CAAS,EAAEC,GAAW;IACtD,IAAID,EAAEE,KAAK,EAAE;QACX,OAAOF,EAAEE,KAAK,CAACD;IACjB;IACA,OAAOH,aAAa,CAACK;QACnB,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAE,GAAGC,GAAG,GAAGH;QAChC,IAAII,OAAOC,IAAI,CAACF,GAAGG,MAAM,EAAE;YACzBT,CAAC,CAACI,MAAM,CAACE,MAAMD;QACjB,OAAO;YACLL,CAAC,CAACI,MAAM,IAAIC;QACd;IACF,GAAGJ;AACL"}
|
package/lib/objects/get.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/objects/get.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../src/objects/get.ts"],"sourcesContent":["import { parseObjectPath, type ObjectKey } from './parseObjectPath';\n\n/**\n * get by path\n *\n * {@link https://github.com/developit/dlv dlv}\n */\nexport function get<O extends object, P extends ObjectKey, OrElse extends unknown>(\n obj: O,\n key: P | P[],\n def?: OrElse,\n): ResolveObjectPathType<O, P, OrElse> {\n const undef = undefined;\n const path = parseObjectPath(key);\n let out: any = obj;\n for (const i of path) {\n out = out ? out[i] : undef;\n }\n return out === undef ? def : out;\n}\n\n/**\n * It tries to resolve the path of the given object, otherwise it will return OrElse\n *\n * {@link https://github.com/Pouja/typescript-deep-path-safe typescript-deep-path-safe}\n */\nexport type ResolveObjectPathType<\n ObjectType,\n Path extends string | symbol | number,\n OrElse,\n> = Path extends keyof ObjectType\n ? ObjectType[Path]\n : Path extends `${infer LeftSide}.${infer RightSide}`\n ? LeftSide extends keyof ObjectType\n ? ResolveObjectPathType<ObjectType[LeftSide], RightSide, OrElse>\n : Path extends `${infer LeftSide}[${number}].${infer RightSide}`\n ? LeftSide extends keyof ObjectType\n ? ObjectType[LeftSide] extends Array<infer U>\n ? ResolveObjectPathType<U, RightSide, OrElse>\n : OrElse\n : OrElse\n : OrElse\n : Path extends `${infer LeftSide}[${number}]`\n ? LeftSide extends keyof ObjectType\n ? ObjectType[LeftSide] extends Array<infer U>\n ? U\n : OrElse\n : OrElse\n : OrElse;\n"],"names":["parseObjectPath","get","obj","key","def","undef","undefined","path","out","i"],"mappings":"AAAA,SAASA,eAAe,QAAwB,oBAAoB;AAEpE;;;;CAIC,GACD,OAAO,SAASC,IACdC,GAAM,EACNC,GAAY,EACZC,GAAY;IAEZ,MAAMC,QAAQC;IACd,MAAMC,OAAOP,gBAAgBG;IAC7B,IAAIK,MAAWN;IACf,KAAK,MAAMO,KAAKF,KAAM;QACpBC,MAAMA,MAAMA,GAAG,CAACC,EAAE,GAAGJ;IACvB;IACA,OAAOG,QAAQH,QAAQD,MAAMI;AAC/B"}
|
package/lib/objects/set.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/objects/set.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../src/objects/set.ts"],"sourcesContent":["import { parseObjectPath, type ObjectKey, type ObjectPath } from './parseObjectPath';\n\n/**\n * Deep set\n *\n * {@link https://github.com/lukeed/dset dset}\n */\nexport function set<T extends object, V>(obj: T, key: ObjectKey | ObjectPath, val: V, merging = true) {\n const path = parseObjectPath(key);\n let i = 0;\n const len = path.length;\n let current: any = obj;\n let x, k;\n while (i < len) {\n k = path[i++];\n if (k === '__proto__' || k === 'constructor' || k === 'prototype') break;\n // noinspection PointlessArithmeticExpressionJS\n current = current[k] =\n i === len\n ? merging\n ? merge(current[k], val)\n : val\n : typeof (x = current[k]) === typeof path\n ? x\n : // @ts-expect-error hacky type check\n path[i] * 0 !== 0 || !!~('' + path[i]).indexOf('.') // eslint-disable-line\n ? {}\n : [];\n }\n}\n\nexport function merge(a: any, b: any) {\n let k;\n if (typeof a === 'object' && typeof b === 'object') {\n if (Array.isArray(a) && Array.isArray(b)) {\n for (k = 0; k < b.length; k++) {\n a[k] = merge(a[k], b[k]);\n }\n } else {\n for (k in b) {\n if (k === '__proto__' || k === 'constructor' || k === 'prototype') break;\n a[k] = merge(a[k], b[k]);\n }\n }\n return a;\n }\n return b;\n}\n"],"names":["parseObjectPath","set","obj","key","val","merging","path","i","len","length","current","x","k","merge","indexOf","a","b","Array","isArray"],"mappings":"AAAA,SAASA,eAAe,QAAyC,oBAAoB;AAErF;;;;CAIC,GACD,OAAO,SAASC,IAAyBC,GAAM,EAAEC,GAA2B,EAAEC,GAAM,EAAEC,UAAU,IAAI;IAClG,MAAMC,OAAON,gBAAgBG;IAC7B,IAAII,IAAI;IACR,MAAMC,MAAMF,KAAKG,MAAM;IACvB,IAAIC,UAAeR;IACnB,IAAIS,GAAGC;IACP,MAAOL,IAAIC,IAAK;QACdI,IAAIN,IAAI,CAACC,IAAI;QACb,IAAIK,MAAM,eAAeA,MAAM,iBAAiBA,MAAM,aAAa;QACnE,+CAA+C;QAC/CF,UAAUA,OAAO,CAACE,EAAE,GAClBL,MAAMC,MACFH,UACEQ,MAAMH,OAAO,CAACE,EAAE,EAAER,OAClBA,MACF,OAAQO,CAAAA,IAAID,OAAO,CAACE,EAAE,AAAD,MAAO,OAAON,OACjCK,IAEAL,IAAI,CAACC,EAAE,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,AAAC,CAAA,KAAKD,IAAI,CAACC,EAAE,AAAD,EAAGO,OAAO,CAAC,KAAK,sBAAsB;WACxE,CAAC,IACD,EAAE;IACd;AACF;AAEA,OAAO,SAASD,MAAME,CAAM,EAAEC,CAAM;IAClC,IAAIJ;IACJ,IAAI,OAAOG,MAAM,YAAY,OAAOC,MAAM,UAAU;QAClD,IAAIC,MAAMC,OAAO,CAACH,MAAME,MAAMC,OAAO,CAACF,IAAI;YACxC,IAAKJ,IAAI,GAAGA,IAAII,EAAEP,MAAM,EAAEG,IAAK;gBAC7BG,CAAC,CAACH,EAAE,GAAGC,MAAME,CAAC,CAACH,EAAE,EAAEI,CAAC,CAACJ,EAAE;YACzB;QACF,OAAO;YACL,IAAKA,KAAKI,EAAG;gBACX,IAAIJ,MAAM,eAAeA,MAAM,iBAAiBA,MAAM,aAAa;gBACnEG,CAAC,CAACH,EAAE,GAAGC,MAAME,CAAC,CAACH,EAAE,EAAEI,CAAC,CAACJ,EAAE;YACzB;QACF;QACA,OAAOG;IACT;IACA,OAAOC;AACT"}
|
|
@@ -22,7 +22,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
22
22
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
23
23
|
THE SOFTWARE.
|
|
24
24
|
|
|
25
|
-
---------------------------------------------------------------------------*/ import {
|
|
25
|
+
---------------------------------------------------------------------------*/ import { CloneType, Kind, Type } from '@sinclair/typebox';
|
|
26
26
|
import * as ts from 'typescript';
|
|
27
27
|
import { TypeScriptToTypeBox } from './typescript-to-typebox.js';
|
|
28
28
|
export var TypeScriptToModel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/schema/typebox/gen/codegen/typescript/typescript-to-model.ts"],"sourcesContent":["/*--------------------------------------------------------------------------\n\n@sinclair/typebox-codegen\n\nThe MIT License (MIT)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------------------------*/\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/schema/typebox/gen/codegen/typescript/typescript-to-model.ts"],"sourcesContent":["/*--------------------------------------------------------------------------\n\n@sinclair/typebox-codegen\n\nThe MIT License (MIT)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------------------------*/\nimport { CloneType, Kind, Type, type TSchema } from '@sinclair/typebox';\nimport * as ts from 'typescript';\nimport { TypeBoxModel } from '../model/model';\nimport { TypeScriptToTypeBox } from './typescript-to-typebox';\n\nexport namespace TypeScriptToModel {\n const compilerOptions: ts.CompilerOptions = {\n module: ts.ModuleKind.CommonJS, // used for exports\n target: ts.ScriptTarget.ES2015, // evaluation target\n };\n export function Exports(code: string): Map<string, TSchema | Function> {\n const exports = {};\n const evaluate = new Function('exports', 'Type', 'Kind', 'CloneType', code);\n evaluate(exports, Type, Kind, CloneType);\n return new Map(globalThis.Object.entries(exports));\n }\n export function Types(exports: Map<string, TSchema | Function>): TSchema[] {\n const types: TSchema[] = [];\n for (const [key, schema] of exports) {\n if (typeof schema === 'function') continue;\n types.push({ ...schema, $id: key });\n }\n return types;\n }\n export function Generate(typescriptCode: string): TypeBoxModel {\n const typescript = TypeScriptToTypeBox.Generate(typescriptCode, {\n useExportEverything: false,\n useTypeBoxImport: false,\n useIdentifiers: true,\n });\n const javascript = ts.transpileModule(typescript, { compilerOptions });\n const exports = Exports(javascript.outputText);\n const types = Types(exports);\n return { exports, types };\n }\n}\n"],"names":["CloneType","Kind","Type","ts","TypeScriptToTypeBox","TypeScriptToModel","compilerOptions","module","ModuleKind","CommonJS","target","ScriptTarget","ES2015","Exports","code","exports","evaluate","Function","Map","globalThis","Object","entries","Types","types","key","schema","push","$id","Generate","typescriptCode","typescript","useExportEverything","useTypeBoxImport","useIdentifiers","javascript","transpileModule","outputText"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;2EAwB2E,GAC3E,SAASA,SAAS,EAAEC,IAAI,EAAEC,IAAI,QAAsB,oBAAoB;AACxE,YAAYC,QAAQ,aAAa;AAEjC,SAASC,mBAAmB,QAAQ,0BAA0B;;UAE7CC;IACf,MAAMC,kBAAsC;QAC1CC,QAAQJ,GAAGK,UAAU,CAACC,QAAQ;QAC9BC,QAAQP,GAAGQ,YAAY,CAACC,MAAM;IAChC;IACO,SAASC,QAAQC,IAAY;QAClC,MAAMC,UAAU,CAAC;QACjB,MAAMC,WAAW,IAAIC,SAAS,WAAW,QAAQ,QAAQ,aAAaH;QACtEE,SAASD,SAASb,MAAMD,MAAMD;QAC9B,OAAO,IAAIkB,IAAIC,WAAWC,MAAM,CAACC,OAAO,CAACN;IAC3C;sBALgBF,UAAAA;IAMT,SAASS,MAAMP,OAAwC;QAC5D,MAAMQ,QAAmB,EAAE;QAC3B,KAAK,MAAM,CAACC,KAAKC,OAAO,IAAIV,QAAS;YACnC,IAAI,OAAOU,WAAW,YAAY;YAClCF,MAAMG,IAAI,CAAC;gBAAE,GAAGD,MAAM;gBAAEE,KAAKH;YAAI;QACnC;QACA,OAAOD;IACT;sBAPgBD,QAAAA;IAQT,SAASM,SAASC,cAAsB;QAC7C,MAAMC,aAAa1B,oBAAoBwB,QAAQ,CAACC,gBAAgB;YAC9DE,qBAAqB;YACrBC,kBAAkB;YAClBC,gBAAgB;QAClB;QACA,MAAMC,aAAa/B,GAAGgC,eAAe,CAACL,YAAY;YAAExB;QAAgB;QACpE,MAAMS,UAAUF,QAAQqB,WAAWE,UAAU;QAC7C,MAAMb,QAAQD,MAAMP;QACpB,OAAO;YAAEA;YAASQ;QAAM;IAC1B;sBAVgBK,WAAAA;AAWlB,GA9BiBvB,sBAAAA"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { Errors, formatBytes } from '@wener/utils';
|
|
4
|
+
import { getPackageDir } from '../server/index.js';
|
|
5
|
+
let _root;
|
|
6
|
+
async function cache(dir, url) {
|
|
7
|
+
const key = path.basename(url);
|
|
8
|
+
await fs.mkdir(path.join(dir), {
|
|
9
|
+
recursive: true
|
|
10
|
+
});
|
|
11
|
+
const file = path.join(dir, key);
|
|
12
|
+
try {
|
|
13
|
+
await fs.stat(file);
|
|
14
|
+
console.info('[cache] hit', url);
|
|
15
|
+
return await fs.readFile(file, 'utf-8');
|
|
16
|
+
} catch (e) {}
|
|
17
|
+
console.info('[cache] miss', url);
|
|
18
|
+
const text = await fetch(url).then((v)=>{
|
|
19
|
+
if (v.status >= 300) {
|
|
20
|
+
throw new Error(`[cache] fetch ${url} ${v.status} ${v.statusText}`);
|
|
21
|
+
}
|
|
22
|
+
return v.text();
|
|
23
|
+
});
|
|
24
|
+
const size = new Blob([
|
|
25
|
+
text
|
|
26
|
+
]).size;
|
|
27
|
+
console.info(`[cache] write ${file} ${formatBytes(size)} (${size})`);
|
|
28
|
+
await fs.writeFile(file, text);
|
|
29
|
+
return text;
|
|
30
|
+
}
|
|
31
|
+
export function getGenerateContext(prefix) {
|
|
32
|
+
if (prefix) {
|
|
33
|
+
return Promise.resolve(getGenerateContext()).then((c)=>{
|
|
34
|
+
const cacheDir = path.resolve(c.cacheDir, prefix);
|
|
35
|
+
const dataDir = path.resolve(c.dataDir, prefix);
|
|
36
|
+
const srcDir = path.resolve(c.srcDir, prefix);
|
|
37
|
+
return {
|
|
38
|
+
...c,
|
|
39
|
+
dataDir,
|
|
40
|
+
cacheDir,
|
|
41
|
+
srcDir,
|
|
42
|
+
cache: (url)=>cache(cacheDir, url),
|
|
43
|
+
writeData: (file, content)=>write(dataDir, file, content),
|
|
44
|
+
writeSrc: (file, content)=>write(srcDir, file, content)
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return _root || Promise.resolve().then(async ()=>{
|
|
49
|
+
const pkgDir = await getPackageDir();
|
|
50
|
+
Errors.BadRequest.check(pkgDir, 'pkgDir not found');
|
|
51
|
+
const dataDir = path.resolve(pkgDir, 'data');
|
|
52
|
+
const cacheDir = path.resolve(pkgDir, 'cache');
|
|
53
|
+
const srcDir = path.resolve(pkgDir, 'src');
|
|
54
|
+
await fs.mkdir(cacheDir, {
|
|
55
|
+
recursive: true
|
|
56
|
+
});
|
|
57
|
+
await fs.mkdir(dataDir, {
|
|
58
|
+
recursive: true
|
|
59
|
+
});
|
|
60
|
+
return _root = Object.freeze({
|
|
61
|
+
pkgDir,
|
|
62
|
+
dataDir,
|
|
63
|
+
cacheDir,
|
|
64
|
+
srcDir,
|
|
65
|
+
rootCacheDir: cacheDir,
|
|
66
|
+
rootDataDir: dataDir,
|
|
67
|
+
cache: (url)=>cache(cacheDir, url),
|
|
68
|
+
writeData: (file, content)=>write(dataDir, file, content),
|
|
69
|
+
writeSrc: (file, content)=>write(srcDir, file, content)
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
async function write(dir, file, content) {
|
|
74
|
+
const size = new Blob([
|
|
75
|
+
content
|
|
76
|
+
]).size;
|
|
77
|
+
const dst = path.join(dir, file);
|
|
78
|
+
let last;
|
|
79
|
+
try {
|
|
80
|
+
last = (await fs.stat(dst)).size;
|
|
81
|
+
} catch {}
|
|
82
|
+
console.info(`[write] ${path.relative(_root.pkgDir, dir)} ${file} ${last ? last !== size ? `${formatBytes(last)} (${last}) -> ` : 'SAME SIZE ' : ''}${formatBytes(size)} (${size})`);
|
|
83
|
+
await fs.writeFile(dst, content);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
//# sourceMappingURL=getGenerateContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/scripts/getGenerateContext.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { Errors, formatBytes, type MaybePromise } from '@wener/utils';\nimport { getPackageDir } from '../server';\n\nlet _root: GenerateContext;\n\nexport interface GenerateContext {\n pkgDir: string;\n rootDataDir: string;\n rootCacheDir: string;\n dataDir: string;\n cacheDir: string;\n srcDir: string;\n cache: (url: string) => Promise<string>;\n writeData: (path: string, content: string) => Promise<void>;\n writeSrc: (path: string, content: string) => Promise<void>;\n}\n\nasync function cache(dir: string, url: string): Promise<string> {\n const key = path.basename(url);\n await fs.mkdir(path.join(dir), { recursive: true });\n const file = path.join(dir, key);\n try {\n await fs.stat(file);\n console.info('[cache] hit', url);\n return await fs.readFile(file, 'utf-8');\n } catch (e) {}\n console.info('[cache] miss', url);\n const text = await fetch(url).then((v) => {\n if (v.status >= 300) {\n throw new Error(`[cache] fetch ${url} ${v.status} ${v.statusText}`);\n }\n return v.text();\n });\n const size = new Blob([text]).size;\n console.info(`[cache] write ${file} ${formatBytes(size)} (${size})`);\n await fs.writeFile(file, text);\n return text;\n}\n\nexport function getGenerateContext(prefix?: string): MaybePromise<GenerateContext> {\n if (prefix) {\n return Promise.resolve(getGenerateContext()).then((c) => {\n const cacheDir = path.resolve(c.cacheDir, prefix);\n const dataDir = path.resolve(c.dataDir, prefix);\n const srcDir = path.resolve(c.srcDir, prefix);\n return {\n ...c,\n dataDir,\n cacheDir,\n srcDir,\n cache: (url: string) => cache(cacheDir, url),\n writeData: (file: string, content: string) => write(dataDir, file, content),\n writeSrc: (file: string, content: string) => write(srcDir, file, content),\n };\n });\n }\n return (\n _root ||\n Promise.resolve().then(async () => {\n const pkgDir = await getPackageDir();\n Errors.BadRequest.check(pkgDir, 'pkgDir not found');\n const dataDir = path.resolve(pkgDir, 'data');\n const cacheDir = path.resolve(pkgDir, 'cache');\n const srcDir = path.resolve(pkgDir, 'src');\n await fs.mkdir(cacheDir, { recursive: true });\n await fs.mkdir(dataDir, { recursive: true });\n return (_root = Object.freeze({\n pkgDir,\n dataDir,\n cacheDir,\n srcDir,\n rootCacheDir: cacheDir,\n rootDataDir: dataDir,\n cache: (url: string) => cache(cacheDir, url),\n writeData: (file: string, content: string) => write(dataDir, file, content),\n writeSrc: (file: string, content: string) => write(srcDir, file, content),\n }));\n })\n );\n}\n\nasync function write(dir: string, file: string, content: string) {\n const size = new Blob([content]).size;\n const dst = path.join(dir, file);\n let last;\n try {\n last = (await fs.stat(dst)).size;\n } catch {}\n console.info(\n `[write] ${path.relative(_root.pkgDir, dir)} ${file} ${\n last ? (last !== size ? `${formatBytes(last)} (${last}) -> ` : 'SAME SIZE ') : ''\n }${formatBytes(size)} (${size})`,\n );\n await fs.writeFile(dst, content);\n}\n"],"names":["fs","path","Errors","formatBytes","getPackageDir","_root","cache","dir","url","key","basename","mkdir","join","recursive","file","stat","console","info","readFile","e","text","fetch","then","v","status","Error","statusText","size","Blob","writeFile","getGenerateContext","prefix","Promise","resolve","c","cacheDir","dataDir","srcDir","writeData","content","write","writeSrc","pkgDir","BadRequest","check","Object","freeze","rootCacheDir","rootDataDir","dst","last","relative"],"mappings":"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"}
|
package/lib/types.d.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.d.ts"],"sourcesContent":["declare var __DEV__: boolean;\n\nnamespace NodeJS {\n interface Process {\n // webpack check\n readonly browser?: boolean;\n }\n interface ProcessEnv {\n readonly NODE_ENV: 'development' | 'production' | 'test';\n }\n}\n\nexport type AbstractConstructor<T =
|
|
1
|
+
{"version":3,"sources":["../src/types.d.ts"],"sourcesContent":["declare var __DEV__: boolean;\n\nnamespace NodeJS {\n interface Process {\n // webpack check\n readonly browser?: boolean;\n }\n interface ProcessEnv {\n readonly NODE_ENV: 'development' | 'production' | 'test';\n }\n}\n\nexport type AbstractConstructor<T = {}> = abstract new (...args: any[]) => T;\nexport type Constructor<T = {}> = new (...args: any[]) => T;\nexport type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\nexport type PartialRequired<T, K extends keyof T> = Partial<Omit<T, K>> & Required<Pick<T, K>>;\n\n/*\nhttps://github.com/total-typescript/ts-reset/blob/main/src/entrypoints/filter-boolean.d.ts\nhttps://github.com/sindresorhus/type-fest\n */\n"],"names":[],"mappings":"AAeA,WAA+F,CAE/F;;;CAGC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wener/utils",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.40",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Utils for daily use",
|
|
6
6
|
"repository": {
|
|
@@ -76,6 +76,7 @@
|
|
|
76
76
|
"@sinclair/typebox": "^0.32.15",
|
|
77
77
|
"@types/lodash": "^4.17.0",
|
|
78
78
|
"@types/ws": "^8.5.10",
|
|
79
|
+
"@wener/utils": "link:.",
|
|
79
80
|
"https-proxy-agent": "^7.0.4",
|
|
80
81
|
"lodash": "^4.17.21",
|
|
81
82
|
"node-fetch": "^3.3.2",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { MaybePromise } from './MaybePromise';
|
|
2
1
|
import { isPromise } from './isPromise';
|
|
2
|
+
import { MaybePromise } from './MaybePromise';
|
|
3
3
|
import { nextOfAsyncIterator } from './nextOfAsyncIterator';
|
|
4
4
|
|
|
5
5
|
export function firstOfAsyncIterator<T>(it: MaybePromise<AsyncIterator<T> | Iterator<T> | T>): MaybePromise<T> {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { MaybePromise } from './MaybePromise';
|
|
2
1
|
import { isIterator } from './isIterator';
|
|
3
2
|
import { isPromise } from './isPromise';
|
|
3
|
+
import { MaybePromise } from './MaybePromise';
|
|
4
4
|
|
|
5
5
|
type IteratorLike<T> = Iterable<T> | Iterator<T>;
|
|
6
6
|
type AsyncIteratorLike<T> = AsyncIterable<T> | AsyncIterator<T> | AsyncIterableIterator<T> | IteratorLike<T>;
|
|
@@ -1,36 +1,46 @@
|
|
|
1
|
+
const DivisionCodeLevels = [
|
|
2
|
+
{
|
|
3
|
+
level: 1,
|
|
4
|
+
code: 'Province',
|
|
5
|
+
length: 2,
|
|
6
|
+
label: '省',
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
level: 2,
|
|
10
|
+
code: 'City',
|
|
11
|
+
length: 4,
|
|
12
|
+
label: '市',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
level: 3,
|
|
16
|
+
code: 'County',
|
|
17
|
+
length: 6,
|
|
18
|
+
label: '区县',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
level: 4,
|
|
22
|
+
code: 'Town',
|
|
23
|
+
length: 9,
|
|
24
|
+
label: '乡镇',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
level: 5,
|
|
28
|
+
code: 'Village',
|
|
29
|
+
length: 12,
|
|
30
|
+
label: '村',
|
|
31
|
+
},
|
|
32
|
+
] as const;
|
|
33
|
+
|
|
34
|
+
// String(Number.MAX_SAFE_INTEGER).length=16
|
|
35
|
+
// 12 is safe int
|
|
36
|
+
|
|
1
37
|
/**
|
|
2
38
|
* Codes for the administrative divisions of the People's Republic of China
|
|
3
39
|
*
|
|
4
40
|
* @see https://zh.wikipedia.org/wiki/GB/T_2260 中华人民共和国行政区划代码
|
|
5
41
|
*/
|
|
6
42
|
export class DivisionCode {
|
|
7
|
-
static Levels =
|
|
8
|
-
Province: {
|
|
9
|
-
level: 1,
|
|
10
|
-
code: 'Province',
|
|
11
|
-
length: 2,
|
|
12
|
-
},
|
|
13
|
-
City: {
|
|
14
|
-
level: 2,
|
|
15
|
-
code: 'City',
|
|
16
|
-
length: 4,
|
|
17
|
-
},
|
|
18
|
-
County: {
|
|
19
|
-
level: 3,
|
|
20
|
-
code: 'County',
|
|
21
|
-
length: 6,
|
|
22
|
-
},
|
|
23
|
-
Town: {
|
|
24
|
-
level: 4,
|
|
25
|
-
code: 'Town',
|
|
26
|
-
length: 9,
|
|
27
|
-
},
|
|
28
|
-
Village: {
|
|
29
|
-
level: 5,
|
|
30
|
-
code: 'Village',
|
|
31
|
-
length: 12,
|
|
32
|
-
},
|
|
33
|
-
} as const;
|
|
43
|
+
static Levels = DivisionCodeLevels;
|
|
34
44
|
|
|
35
45
|
private static instance: DivisionCode;
|
|
36
46
|
|
|
@@ -79,23 +89,6 @@ export class DivisionCode {
|
|
|
79
89
|
];
|
|
80
90
|
}
|
|
81
91
|
|
|
82
|
-
export function binarySearch<T, S = number>(arr: T[], value: S, compare: (a: T, b: S) => number) {
|
|
83
|
-
let low = 0;
|
|
84
|
-
let high = arr.length - 1;
|
|
85
|
-
while (low <= high) {
|
|
86
|
-
const mid = (low + high) >> 1;
|
|
87
|
-
const cmp = compare(arr[mid], value);
|
|
88
|
-
if (cmp < 0) {
|
|
89
|
-
low = mid + 1;
|
|
90
|
-
} else if (cmp > 0) {
|
|
91
|
-
high = mid - 1;
|
|
92
|
-
} else {
|
|
93
|
-
return mid;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return -1;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
92
|
// export function getSimpleProvinceLabel(value: string) {
|
|
100
93
|
// if (!value) {
|
|
101
94
|
// return;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest';
|
|
2
|
+
import { binarySearch } from './binarySearch';
|
|
3
|
+
|
|
4
|
+
describe('binarySearch', () => {
|
|
5
|
+
test('finds an existing element in the middle of the array', () => {
|
|
6
|
+
const arr = [1, 3, 5, 7, 9];
|
|
7
|
+
const result = binarySearch(arr, 5, (a, b) => a - b);
|
|
8
|
+
expect(result).toEqual({ match: true, index: 2, value: 5 });
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
test('finds an existing element at the start of the array', () => {
|
|
12
|
+
const arr = [1, 3, 5, 7, 9];
|
|
13
|
+
const result = binarySearch(arr, 1, (a, b) => a - b);
|
|
14
|
+
expect(result).toEqual({ match: true, index: 0, value: 1 });
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('finds an existing element at the end of the array', () => {
|
|
18
|
+
const arr = [1, 3, 5, 7, 9];
|
|
19
|
+
const result = binarySearch(arr, 9, (a, b) => a - b);
|
|
20
|
+
expect(result).toEqual({ match: true, index: 4, value: 9 });
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('searches for a value not in the array, insert in the middle', () => {
|
|
24
|
+
const arr = [1, 3, 7, 9];
|
|
25
|
+
const result = binarySearch(arr, 5, (a, b) => a - b);
|
|
26
|
+
expect(result).toEqual({ match: false, index: 2, value: null });
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('searches for a value not in the array, insert at the start', () => {
|
|
30
|
+
const arr = [3, 5, 7, 9];
|
|
31
|
+
const result = binarySearch(arr, 1, (a, b) => a - b);
|
|
32
|
+
expect(result).toEqual({ match: false, index: 0, value: null });
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('searches for a value not in the array, insert at the end', () => {
|
|
36
|
+
const arr = [1, 3, 5, 7];
|
|
37
|
+
const result = binarySearch(arr, 9, (a, b) => a - b);
|
|
38
|
+
expect(result).toEqual({ match: false, index: 4, value: null });
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('searches in an empty array', () => {
|
|
42
|
+
const arr: number[] = [];
|
|
43
|
+
const result = binarySearch(arr, 1, (a, b) => a - b);
|
|
44
|
+
expect(result).toEqual({ match: false, index: 0, value: null });
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('searches in a single-element array, element matches', () => {
|
|
48
|
+
const arr = [5];
|
|
49
|
+
const result = binarySearch(arr, 5, (a, b) => a - b);
|
|
50
|
+
expect(result).toEqual({ match: true, index: 0, value: 5 });
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('searches in a single-element array, insert at the start', () => {
|
|
54
|
+
const arr = [3];
|
|
55
|
+
const result = binarySearch(arr, 1, (a, b) => a - b);
|
|
56
|
+
expect(result).toEqual({ match: false, index: 0, value: null });
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test('searches in a single-element array, insert at the end', () => {
|
|
60
|
+
const arr = [1];
|
|
61
|
+
const result = binarySearch(arr, 3, (a, b) => a - b);
|
|
62
|
+
expect(result).toEqual({ match: false, index: 1, value: null });
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function binarySearch<T, S = number>(
|
|
2
|
+
arr: T[],
|
|
3
|
+
value: S,
|
|
4
|
+
compare: (a: T, b: S) => number,
|
|
5
|
+
): {
|
|
6
|
+
match: boolean;
|
|
7
|
+
index: number;
|
|
8
|
+
value: T | null;
|
|
9
|
+
} {
|
|
10
|
+
let low = 0;
|
|
11
|
+
let high = arr.length - 1;
|
|
12
|
+
while (low <= high) {
|
|
13
|
+
const mid = (low + high) >> 1;
|
|
14
|
+
const cmp = compare(arr[mid], value);
|
|
15
|
+
if (cmp < 0) {
|
|
16
|
+
low = mid + 1;
|
|
17
|
+
} else if (cmp > 0) {
|
|
18
|
+
high = mid - 1;
|
|
19
|
+
} else {
|
|
20
|
+
return { match: true, index: mid, value: arr[mid] };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// When no match is found, `low` will be the correct insertIndex.
|
|
24
|
+
return { match: false, index: low, value: null };
|
|
25
|
+
}
|