@wener/utils 1.1.38 → 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/computeIfAbsent.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 +6 -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/computeIfAbsent.ts +2 -2
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/asyncs/createAsyncIterator.ts"],"sourcesContent":["import { type
|
|
1
|
+
{"version":3,"sources":["../../src/asyncs/createAsyncIterator.ts"],"sourcesContent":["import { createLazyPromise, type LazyPromise } from './createLazyPromise';\nimport { type MaybePromise } from './MaybePromise';\n\ntype Val<T> = [val: MaybePromise<T> | undefined, done: boolean, err?: any];\n\nexport function createAsyncIterator<T>(\n fn: (next: (val: [MaybePromise<T> | undefined, boolean] | undefined, err?: any) => void) => void,\n): AsyncGenerator<T, void, unknown> {\n const values: Array<Promise<Val<T>>> = [];\n let recv: (val: [MaybePromise<T> | undefined, boolean] | undefined, err?: any) => void;\n {\n let next: LazyPromise<Val<T>>;\n values.push((next = createLazyPromise()));\n recv = (val, err) => {\n if (err !== undefined) {\n next.resolve([undefined, true, err]);\n } else if (val !== undefined) {\n next.resolve(val);\n } else {\n return;\n }\n values.push((next = createLazyPromise()));\n };\n }\n\n fn(recv);\n\n return (async function* () {\n let value: Val<T>[0];\n let err: any;\n for (let i = 0, done = false; !done; i++) {\n let result = await values[i];\n delete values[i];\n [value, done, err] = result;\n if (err) {\n throw err;\n }\n if (value !== undefined) {\n yield value;\n }\n }\n })();\n}\n"],"names":["createLazyPromise","createAsyncIterator","fn","values","recv","next","push","val","err","undefined","resolve","value","i","done","result"],"mappings":"AAAA,SAASA,iBAAiB,QAA0B,sBAAsB;AAK1E,OAAO,SAASC,oBACdC,EAAgG;IAEhG,MAAMC,SAAiC,EAAE;IACzC,IAAIC;IACJ;QACE,IAAIC;QACJF,OAAOG,IAAI,CAAED,OAAOL;QACpBI,OAAO,CAACG,KAAKC;YACX,IAAIA,QAAQC,WAAW;gBACrBJ,KAAKK,OAAO,CAAC;oBAACD;oBAAW;oBAAMD;iBAAI;YACrC,OAAO,IAAID,QAAQE,WAAW;gBAC5BJ,KAAKK,OAAO,CAACH;YACf,OAAO;gBACL;YACF;YACAJ,OAAOG,IAAI,CAAED,OAAOL;QACtB;IACF;IAEAE,GAAGE;IAEH,OAAO,AAAC;QACN,IAAIO;QACJ,IAAIH;QACJ,IAAK,IAAII,IAAI,GAAGC,OAAO,OAAO,CAACA,MAAMD,IAAK;YACxC,IAAIE,SAAS,MAAMX,MAAM,CAACS,EAAE;YAC5B,OAAOT,MAAM,CAACS,EAAE;YAChB,CAACD,OAAOE,MAAML,IAAI,GAAGM;YACrB,IAAIN,KAAK;gBACP,MAAMA;YACR;YACA,IAAIG,UAAUF,WAAW;gBACvB,MAAME;YACR;QACF;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/asyncs/createLazyPromise.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../src/asyncs/createLazyPromise.ts"],"sourcesContent":["import { isPromise } from './isPromise';\nimport type { MaybePromise } from './MaybePromise';\n\nexport type LazyPromise<T> = Promise<T> & {\n reject(reason?: any): void;\n resolve(v?: MaybePromise<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 if (!executor && 'withResolvers' in Promise) {\n const { promise, resolve, reject } = (Promise as any).withResolvers();\n return Object.assign(promise, {\n resolve,\n reject,\n }) as LazyPromise<T>;\n }\n\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":["isPromise","createLazyPromise","executor","Promise","promise","resolve","reject","withResolvers","Object","assign","holder","_","Error","future","v","r","shouldExec","then","bind","args","result","undefined","e","like","catch","finally","defineProperty","Symbol","species","get"],"mappings":"AAAA,SAASA,SAAS,QAAQ,cAAc;AAQxC;;;CAGC,GACD,OAAO,SAASC,kBACdC,QAE+F;IAE/F,IAAI,CAACA,YAAY,mBAAmBC,SAAS;QAC3C,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAEC,MAAM,EAAE,GAAG,AAACH,QAAgBI,aAAa;QACnE,OAAOC,OAAOC,MAAM,CAACL,SAAS;YAC5BC;YACAC;QACF;IACF;IAEA,MAAMI,SAAS;QACbL,SAAQM,CAAM;YACZ,MAAM,IAAIC,MAAM;QAClB;QACAN,QAAOK,CAAM;YACX,MAAM,IAAIC,MAAM;QAClB;IACF;IACA,MAAMC,SAASL,OAAOC,MAAM,CAC1B,IAAIN,QAAW,CAACE,SAASC;QACvBI,OAAOJ,MAAM,GAAGA;QAChBI,OAAOL,OAAO,GAAGA;IACnB,IACA;QACEA,SAAQS,CAAM;YACZJ,OAAOL,OAAO,CAACS;QACjB;QACAR,QAAOQ,CAAM;YACXJ,OAAOL,OAAO,CAACS;QACjB;IACF;IAEF,IAAIZ,UAAU;QACZ,MAAMa,IAAIL,OAAOL,OAAO;QACxB,IAAIW,aAAa;QACjBN,OAAOL,OAAO,GAAG,CAACS;YAChBE,aAAa;YACbD,EAAED;QACJ;QACA,MAAMG,OAAOJ,OAAOI,IAAI,CAACC,IAAI,CAACL;QAC9BA,OAAOI,IAAI,GAAG,CAAC,GAAGE;YAChB,IAAIH,YAAY;gBACdA,aAAa;gBACb,IAAI;oBACF,cAAc;oBACd,MAAMI,SAASlB,SAASQ,OAAOL,OAAO,EAAEK,OAAOJ,MAAM;oBACrD,kCAAkC;oBAClC,IAAIN,UAAUoB,SAAS;wBACrBA,OAAOH,IAAI,CAACP,OAAOL,OAAO,EAAEK,OAAOJ,MAAM;oBAC3C,OAAO,IAAIc,WAAWC,WAAW;wBAC/BX,OAAOL,OAAO,CAACe;oBACjB;gBACF,EAAE,OAAOE,GAAG;oBACVZ,OAAOJ,MAAM,CAACgB;gBAChB;YACF;YACA,OAAOL,QAAQE;QACjB;QACA,MAAMI,OAAOb;QACba,KAAKN,IAAI,GAAGJ,OAAOI,IAAI;QACvBM,KAAKC,KAAK,GAAGX,OAAOW,KAAK,CAACN,IAAI,CAACL;QAC/B,IAAIA,OAAOY,OAAO,EAAEF,KAAKE,OAAO,GAAGZ,OAAOY,OAAO;QAEjD,KAAKjB,OAAOkB,cAAc,CAACH,MAAMI,OAAOC,OAAO,EAAE;YAC/CC;gBACE,OAAO1B;YACT;QACF;QACA,OAAOoB;IACT;IACA,OAAOV;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/asyncs/firstOfAsyncIterator.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../src/asyncs/firstOfAsyncIterator.ts"],"sourcesContent":["import { isPromise } from './isPromise';\nimport { MaybePromise } from './MaybePromise';\nimport { nextOfAsyncIterator } from './nextOfAsyncIterator';\n\nexport function firstOfAsyncIterator<T>(it: MaybePromise<AsyncIterator<T> | Iterator<T> | T>): MaybePromise<T> {\n const next = nextOfAsyncIterator(it);\n if (isPromise(next)) {\n return next.then((v) => v[0]);\n }\n return next[0];\n}\n"],"names":["isPromise","nextOfAsyncIterator","firstOfAsyncIterator","it","next","then","v"],"mappings":"AAAA,SAASA,SAAS,QAAQ,cAAc;AAExC,SAASC,mBAAmB,QAAQ,wBAAwB;AAE5D,OAAO,SAASC,qBAAwBC,EAAoD;IAC1F,MAAMC,OAAOH,oBAAoBE;IACjC,IAAIH,UAAUI,OAAO;QACnB,OAAOA,KAAKC,IAAI,CAAC,CAACC,IAAMA,CAAC,CAAC,EAAE;IAC9B;IACA,OAAOF,IAAI,CAAC,EAAE;AAChB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/asyncs/nextOfAsyncIterator.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../src/asyncs/nextOfAsyncIterator.ts"],"sourcesContent":["import { isIterator } from './isIterator';\nimport { isPromise } from './isPromise';\nimport { MaybePromise } from './MaybePromise';\n\ntype IteratorLike<T> = Iterable<T> | Iterator<T>;\ntype AsyncIteratorLike<T> = AsyncIterable<T> | AsyncIterator<T> | AsyncIterableIterator<T> | IteratorLike<T>;\n\nexport function nextOfAsyncIterator<T>(\n it: MaybePromise<AsyncIterable<T> | Iterable<T> | AsyncIterator<T> | Iterator<T> | T>,\n): MaybePromise<[value: T, done?: boolean]> {\n if (isPromise(it)) {\n return it.then((v) => nextOfAsyncIterator(v));\n }\n\n if (isIterator(it)) {\n let next = it.next();\n if (isPromise(next)) {\n return next.then((v) => [v.value, v.done]);\n }\n return [next.value, next.done];\n }\n if (it && typeof it === 'object') {\n if (Symbol.iterator in it) {\n return nextOfAsyncIterator(it[Symbol.iterator]());\n }\n if (Symbol.asyncIterator in it) {\n return nextOfAsyncIterator(it[Symbol.asyncIterator]());\n }\n }\n return [it];\n}\n"],"names":["isIterator","isPromise","nextOfAsyncIterator","it","then","v","next","value","done","Symbol","iterator","asyncIterator"],"mappings":"AAAA,SAASA,UAAU,QAAQ,eAAe;AAC1C,SAASC,SAAS,QAAQ,cAAc;AAMxC,OAAO,SAASC,oBACdC,EAAqF;IAErF,IAAIF,UAAUE,KAAK;QACjB,OAAOA,GAAGC,IAAI,CAAC,CAACC,IAAMH,oBAAoBG;IAC5C;IAEA,IAAIL,WAAWG,KAAK;QAClB,IAAIG,OAAOH,GAAGG,IAAI;QAClB,IAAIL,UAAUK,OAAO;YACnB,OAAOA,KAAKF,IAAI,CAAC,CAACC,IAAM;oBAACA,EAAEE,KAAK;oBAAEF,EAAEG,IAAI;iBAAC;QAC3C;QACA,OAAO;YAACF,KAAKC,KAAK;YAAED,KAAKE,IAAI;SAAC;IAChC;IACA,IAAIL,MAAM,OAAOA,OAAO,UAAU;QAChC,IAAIM,OAAOC,QAAQ,IAAIP,IAAI;YACzB,OAAOD,oBAAoBC,EAAE,CAACM,OAAOC,QAAQ,CAAC;QAChD;QACA,IAAID,OAAOE,aAAa,IAAIR,IAAI;YAC9B,OAAOD,oBAAoBC,EAAE,CAACM,OAAOE,aAAa,CAAC;QACrD;IACF;IACA,OAAO;QAACR;KAAG;AACb"}
|
|
@@ -1,35 +1,43 @@
|
|
|
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
|
+
];
|
|
33
|
+
// String(Number.MAX_SAFE_INTEGER).length=16
|
|
34
|
+
// 12 is safe int
|
|
1
35
|
/**
|
|
2
36
|
* Codes for the administrative divisions of the People's Republic of China
|
|
3
37
|
*
|
|
4
38
|
* @see https://zh.wikipedia.org/wiki/GB/T_2260 中华人民共和国行政区划代码
|
|
5
39
|
*/ export class DivisionCode {
|
|
6
|
-
static Levels =
|
|
7
|
-
Province: {
|
|
8
|
-
level: 1,
|
|
9
|
-
code: 'Province',
|
|
10
|
-
length: 2
|
|
11
|
-
},
|
|
12
|
-
City: {
|
|
13
|
-
level: 2,
|
|
14
|
-
code: 'City',
|
|
15
|
-
length: 4
|
|
16
|
-
},
|
|
17
|
-
County: {
|
|
18
|
-
level: 3,
|
|
19
|
-
code: 'County',
|
|
20
|
-
length: 6
|
|
21
|
-
},
|
|
22
|
-
Town: {
|
|
23
|
-
level: 4,
|
|
24
|
-
code: 'Town',
|
|
25
|
-
length: 9
|
|
26
|
-
},
|
|
27
|
-
Village: {
|
|
28
|
-
level: 5,
|
|
29
|
-
code: 'Village',
|
|
30
|
-
length: 12
|
|
31
|
-
}
|
|
32
|
-
};
|
|
40
|
+
static Levels = DivisionCodeLevels;
|
|
33
41
|
static instance;
|
|
34
42
|
static get() {
|
|
35
43
|
return this.instance || (this.instance = new DivisionCode());
|
|
@@ -173,22 +181,6 @@
|
|
|
173
181
|
'澳门特别行政区'
|
|
174
182
|
]
|
|
175
183
|
];
|
|
176
|
-
}
|
|
177
|
-
export function binarySearch(arr, value, compare) {
|
|
178
|
-
let low = 0;
|
|
179
|
-
let high = arr.length - 1;
|
|
180
|
-
while(low <= high){
|
|
181
|
-
const mid = low + high >> 1;
|
|
182
|
-
const cmp = compare(arr[mid], value);
|
|
183
|
-
if (cmp < 0) {
|
|
184
|
-
low = mid + 1;
|
|
185
|
-
} else if (cmp > 0) {
|
|
186
|
-
high = mid - 1;
|
|
187
|
-
} else {
|
|
188
|
-
return mid;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
return -1;
|
|
192
184
|
} // export function getSimpleProvinceLabel(value: string) {
|
|
193
185
|
// if (!value) {
|
|
194
186
|
// return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cn/division/DivisionCode.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cn/division/DivisionCode.ts"],"sourcesContent":["const DivisionCodeLevels = [\n {\n level: 1,\n code: 'Province',\n length: 2,\n label: '省',\n },\n {\n level: 2,\n code: 'City',\n length: 4,\n label: '市',\n },\n {\n level: 3,\n code: 'County',\n length: 6,\n label: '区县',\n },\n {\n level: 4,\n code: 'Town',\n length: 9,\n label: '乡镇',\n },\n {\n level: 5,\n code: 'Village',\n length: 12,\n label: '村',\n },\n] as const;\n\n// String(Number.MAX_SAFE_INTEGER).length=16\n// 12 is safe int\n\n/**\n * Codes for the administrative divisions of the People's Republic of China\n *\n * @see https://zh.wikipedia.org/wiki/GB/T_2260 中华人民共和国行政区划代码\n */\nexport class DivisionCode {\n static Levels = DivisionCodeLevels;\n\n private static instance: DivisionCode;\n\n static get() {\n return this.instance || (this.instance = new DivisionCode());\n }\n\n regex = /^(?<province>\\d{2})(?<city>\\d{2})?(?<county>\\d{2})?(?<town>\\d{3})?(?<village>\\d{3})?$/;\n\n provinces: Array<[number, string]> = [\n [11, '北京市'],\n [12, '天津市'],\n [13, '河北省'],\n [14, '山西省'],\n [15, '内蒙古自治区'],\n [21, '辽宁省'],\n [22, '吉林省'],\n [23, '黑龙江省'],\n [31, '上海市'],\n [32, '江苏省'],\n [33, '浙江省'],\n [34, '安徽省'],\n [35, '福建省'],\n [36, '江西省'],\n [37, '山东省'],\n [41, '河南省'],\n [42, '湖北省'],\n [43, '湖南省'],\n [44, '广东省'],\n [45, '广西壮族自治区'],\n [46, '海南省'],\n [50, '重庆市'],\n [51, '四川省'],\n [52, '贵州省'],\n [53, '云南省'],\n [54, '西藏自治区'],\n [61, '陕西省'],\n [62, '甘肃省'],\n [63, '青海省'],\n [64, '宁夏回族自治区'],\n [65, '新疆维吾尔自治区'],\n [71, '台湾省'],\n [81, '香港特别行政区'],\n [82, '澳门特别行政区'],\n // 9 国外\n ];\n}\n\n// export function getSimpleProvinceLabel(value: string) {\n// if (!value) {\n// return;\n// }\n// let label = value;\n// if (/[0-9]/.test(label)) {\n// label = label.slice(0, 2);\n// label = options.find((v) => v.value === label)?.label || label;\n// }\n// return label.replace(/省|市|(回族|维吾尔|壮族)?自治区|特别行政区$/, '');\n// }\n"],"names":["DivisionCodeLevels","level","code","length","label","DivisionCode","Levels","instance","get","regex","provinces"],"mappings":"AAAA,MAAMA,qBAAqB;IACzB;QACEC,OAAO;QACPC,MAAM;QACNC,QAAQ;QACRC,OAAO;IACT;IACA;QACEH,OAAO;QACPC,MAAM;QACNC,QAAQ;QACRC,OAAO;IACT;IACA;QACEH,OAAO;QACPC,MAAM;QACNC,QAAQ;QACRC,OAAO;IACT;IACA;QACEH,OAAO;QACPC,MAAM;QACNC,QAAQ;QACRC,OAAO;IACT;IACA;QACEH,OAAO;QACPC,MAAM;QACNC,QAAQ;QACRC,OAAO;IACT;CACD;AAED,4CAA4C;AAC5C,iBAAiB;AAEjB;;;;CAIC,GACD,OAAO,MAAMC;IACX,OAAOC,SAASN,mBAAmB;IAEnC,OAAeO,SAAuB;IAEtC,OAAOC,MAAM;QACX,OAAO,IAAI,CAACD,QAAQ,IAAK,CAAA,IAAI,CAACA,QAAQ,GAAG,IAAIF,cAAa;IAC5D;IAEAI,QAAQ,wFAAwF;IAEhGC,YAAqC;QACnC;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAS;QACd;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAO;QACZ;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAU;QACf;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAQ;QACb;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAU;QACf;YAAC;YAAI;SAAW;QAChB;YAAC;YAAI;SAAM;QACX;YAAC;YAAI;SAAU;QACf;YAAC;YAAI;SAAU;KAEhB,CAAC;AACJ,EAEA,0DAA0D;CAC1D,kBAAkB;CAClB,cAAc;CACd,MAAM;CACN,uBAAuB;CACvB,+BAA+B;CAC/B,iCAAiC;CACjC,sEAAsE;CACtE,MAAM;CACN,4DAA4D;CAC5D,IAAI"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export function binarySearch(arr, value, compare) {
|
|
2
|
+
let low = 0;
|
|
3
|
+
let high = arr.length - 1;
|
|
4
|
+
while(low <= high){
|
|
5
|
+
const mid = low + high >> 1;
|
|
6
|
+
const cmp = compare(arr[mid], value);
|
|
7
|
+
if (cmp < 0) {
|
|
8
|
+
low = mid + 1;
|
|
9
|
+
} else if (cmp > 0) {
|
|
10
|
+
high = mid - 1;
|
|
11
|
+
} else {
|
|
12
|
+
return {
|
|
13
|
+
match: true,
|
|
14
|
+
index: mid,
|
|
15
|
+
value: arr[mid]
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
// When no match is found, `low` will be the correct insertIndex.
|
|
20
|
+
return {
|
|
21
|
+
match: false,
|
|
22
|
+
index: low,
|
|
23
|
+
value: null
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=binarySearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cn/division/binarySearch.ts"],"sourcesContent":["export function binarySearch<T, S = number>(\n arr: T[],\n value: S,\n compare: (a: T, b: S) => number,\n): {\n match: boolean;\n index: number;\n value: T | null;\n} {\n let low = 0;\n let high = arr.length - 1;\n while (low <= high) {\n const mid = (low + high) >> 1;\n const cmp = compare(arr[mid], value);\n if (cmp < 0) {\n low = mid + 1;\n } else if (cmp > 0) {\n high = mid - 1;\n } else {\n return { match: true, index: mid, value: arr[mid] };\n }\n }\n // When no match is found, `low` will be the correct insertIndex.\n return { match: false, index: low, value: null };\n}\n"],"names":["binarySearch","arr","value","compare","low","high","length","mid","cmp","match","index"],"mappings":"AAAA,OAAO,SAASA,aACdC,GAAQ,EACRC,KAAQ,EACRC,OAA+B;IAM/B,IAAIC,MAAM;IACV,IAAIC,OAAOJ,IAAIK,MAAM,GAAG;IACxB,MAAOF,OAAOC,KAAM;QAClB,MAAME,MAAM,AAACH,MAAMC,QAAS;QAC5B,MAAMG,MAAML,QAAQF,GAAG,CAACM,IAAI,EAAEL;QAC9B,IAAIM,MAAM,GAAG;YACXJ,MAAMG,MAAM;QACd,OAAO,IAAIC,MAAM,GAAG;YAClBH,OAAOE,MAAM;QACf,OAAO;YACL,OAAO;gBAAEE,OAAO;gBAAMC,OAAOH;gBAAKL,OAAOD,GAAG,CAACM,IAAI;YAAC;QACpD;IACF;IACA,iEAAiE;IACjE,OAAO;QAAEE,OAAO;QAAOC,OAAON;QAAKF,OAAO;IAAK;AACjD"}
|
|
@@ -22,36 +22,44 @@ export class ResidentIdNumber {
|
|
|
22
22
|
let y = parseInt(date.slice(0, 4));
|
|
23
23
|
let m = parseInt(date.slice(4, 6));
|
|
24
24
|
let d = parseInt(date.slice(6));
|
|
25
|
-
return new IdNumber(s.slice(0, 6), new Date(`${y}-${m}-${d}`), //
|
|
26
|
-
parseInt(s.slice(14, 17)), s.slice(17, 18).toUpperCase());
|
|
25
|
+
return new IdNumber(s.slice(0, 6), // new Date(`${y}-${m}-${d}`), // YYYYMMDD
|
|
26
|
+
new Date(Date.UTC(y, m - 1, d)), parseInt(s.slice(14, 17)), s.slice(17, 18).toUpperCase());
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
let IdNumber = class IdNumber {
|
|
30
30
|
division;
|
|
31
|
-
|
|
31
|
+
birthDate;
|
|
32
32
|
sequence;
|
|
33
33
|
checksum;
|
|
34
|
-
constructor(division,
|
|
34
|
+
constructor(division, birthDate, sequence, checksum){
|
|
35
35
|
this.division = division;
|
|
36
|
-
this.
|
|
36
|
+
this.birthDate = birthDate;
|
|
37
37
|
this.sequence = sequence;
|
|
38
38
|
this.checksum = checksum;
|
|
39
39
|
}
|
|
40
40
|
toString() {
|
|
41
|
-
return this.
|
|
41
|
+
return this.base + this.checksum;
|
|
42
42
|
}
|
|
43
43
|
toJSON() {
|
|
44
44
|
return this.toString();
|
|
45
45
|
}
|
|
46
46
|
toObject() {
|
|
47
|
-
const { division,
|
|
47
|
+
const { division, birthDate, sequence, checksum, age, valid, male, female, sex } = this;
|
|
48
48
|
return {
|
|
49
49
|
division,
|
|
50
|
-
|
|
50
|
+
birthDate,
|
|
51
51
|
sequence,
|
|
52
|
-
checksum
|
|
52
|
+
checksum,
|
|
53
|
+
age,
|
|
54
|
+
valid,
|
|
55
|
+
male,
|
|
56
|
+
female,
|
|
57
|
+
sex
|
|
53
58
|
};
|
|
54
59
|
}
|
|
60
|
+
get valid() {
|
|
61
|
+
return ResidentIdNumber.get().verify(this.toString());
|
|
62
|
+
}
|
|
55
63
|
get male() {
|
|
56
64
|
return this.sequence % 2 === 1;
|
|
57
65
|
}
|
|
@@ -59,15 +67,18 @@ let IdNumber = class IdNumber {
|
|
|
59
67
|
return this.sequence % 2 === 0;
|
|
60
68
|
}
|
|
61
69
|
get age() {
|
|
62
|
-
return new Date().getFullYear() - this.
|
|
70
|
+
return new Date().getFullYear() - this.birthDate.getFullYear();
|
|
63
71
|
}
|
|
64
|
-
get
|
|
65
|
-
return this.sequence % 2 === 1 ? '
|
|
72
|
+
get sex() {
|
|
73
|
+
return this.sequence % 2 === 1 ? 'Male' : 'Female';
|
|
66
74
|
}
|
|
67
|
-
|
|
75
|
+
/**
|
|
76
|
+
* base for checksum
|
|
77
|
+
* @private
|
|
78
|
+
*/ get base() {
|
|
68
79
|
return [
|
|
69
80
|
this.division,
|
|
70
|
-
formatDate(this.
|
|
81
|
+
formatDate(this.birthDate, 'YYYYMMDD'),
|
|
71
82
|
this.sequence.toString().padStart(3, '0')
|
|
72
83
|
].join('');
|
|
73
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cn/id/ResidentIdNumber.ts"],"sourcesContent":["import { Mod11Checksum } from './Mod11Checksum';\n\nexport class ResidentIdNumber {\n checksum = Mod11Checksum.get();\n\n // 9 https://zh.wikipedia.org/wiki/中华人民共和国外国人永久居留身份证\n // 9 标识码\n // 申领地代码 - 2 位行政区划\n // 国籍国代码 - 3 位数字 https://zh.wikipedia.org/wiki/ISO_3166-1数字代码\n\n regex =\n /^(?<division>[1-9]\\d{5})(?<year>18|19|20)\\d{2}(?<month>0[1-9]|1[0-2])(?<day>0[1-9]|[12]\\d|3[01])(?<sequence>\\d{3})(?<checksum>[0-9Xx])$/;\n\n private static instance: ResidentIdNumber;\n\n static get() {\n return (this.instance ||= new ResidentIdNumber());\n }\n\n verify(s: string) {\n if (!s) return false;\n return this.regex.test(s) && this.checksum.verify(s.toUpperCase());\n }\n\n parse(s: string): IdNumber | undefined {\n if (!this.verify(s)) {\n return;\n }\n\n let date = s.slice(6, 14);\n let y = parseInt(date.slice(0, 4));\n let m = parseInt(date.slice(4, 6));\n let d = parseInt(date.slice(6));\n return new IdNumber(\n s.slice(0, 6),\n new Date(`${y}-${m}-${d}`), // YYYYMMDD\n
|
|
1
|
+
{"version":3,"sources":["../../../src/cn/id/ResidentIdNumber.ts"],"sourcesContent":["import { Mod11Checksum } from './Mod11Checksum';\n\nexport class ResidentIdNumber {\n checksum = Mod11Checksum.get();\n\n // 9 https://zh.wikipedia.org/wiki/中华人民共和国外国人永久居留身份证\n // 9 标识码\n // 申领地代码 - 2 位行政区划\n // 国籍国代码 - 3 位数字 https://zh.wikipedia.org/wiki/ISO_3166-1数字代码\n\n regex =\n /^(?<division>[1-9]\\d{5})(?<year>18|19|20)\\d{2}(?<month>0[1-9]|1[0-2])(?<day>0[1-9]|[12]\\d|3[01])(?<sequence>\\d{3})(?<checksum>[0-9Xx])$/;\n\n private static instance: ResidentIdNumber;\n\n static get() {\n return (this.instance ||= new ResidentIdNumber());\n }\n\n verify(s: string) {\n if (!s) return false;\n return this.regex.test(s) && this.checksum.verify(s.toUpperCase());\n }\n\n parse(s: string): IdNumber | undefined {\n if (!this.verify(s)) {\n return;\n }\n\n let date = s.slice(6, 14);\n let y = parseInt(date.slice(0, 4));\n let m = parseInt(date.slice(4, 6));\n let d = parseInt(date.slice(6));\n return new IdNumber(\n s.slice(0, 6),\n // new Date(`${y}-${m}-${d}`), // YYYYMMDD\n new Date(Date.UTC(y, m - 1, d)), // 避免时区问题\n parseInt(s.slice(14, 17)),\n s.slice(17, 18).toUpperCase(),\n );\n }\n}\n\ninterface ParseResidentIdNumberResult {\n division: string;\n birthDate: Date;\n sequence: number;\n checksum: string;\n\n valid: boolean;\n male: boolean;\n female: boolean;\n sex: 'Male' | 'Female';\n age: number;\n}\n\nclass IdNumber {\n constructor(\n public division: string,\n public birthDate: Date,\n public sequence: number,\n public checksum: string,\n ) {}\n\n toString() {\n return this.base + this.checksum;\n }\n\n toJSON() {\n return this.toString();\n }\n\n toObject(): ParseResidentIdNumberResult {\n const { division, birthDate, sequence, checksum, age, valid, male, female, sex } = this;\n return {\n division,\n birthDate,\n sequence,\n checksum,\n age,\n valid,\n male,\n female,\n sex,\n };\n }\n\n get valid() {\n return ResidentIdNumber.get().verify(this.toString());\n }\n\n get male() {\n return this.sequence % 2 === 1;\n }\n\n get female() {\n return this.sequence % 2 === 0;\n }\n\n get age() {\n return new Date().getFullYear() - this.birthDate.getFullYear();\n }\n\n get sex(): 'Male' | 'Female' {\n return this.sequence % 2 === 1 ? 'Male' : 'Female';\n }\n\n /**\n * base for checksum\n * @private\n */\n private get base() {\n return [this.division, formatDate(this.birthDate, 'YYYYMMDD'), this.sequence.toString().padStart(3, '0')].join('');\n }\n}\n\nfunction formatDate(date: Date, format = 'YYYYMMDD') {\n switch (format) {\n case 'YYYYMMDD': {\n const year = date.getFullYear();\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n return `${year}${month}${day}`;\n }\n default:\n throw new Error(`Invalid format`);\n }\n}\n"],"names":["Mod11Checksum","ResidentIdNumber","checksum","get","regex","instance","verify","s","test","toUpperCase","parse","date","slice","y","parseInt","m","d","IdNumber","Date","UTC","constructor","division","birthDate","sequence","toString","base","toJSON","toObject","age","valid","male","female","sex","getFullYear","formatDate","padStart","join","format","year","month","getMonth","day","getDate","Error"],"mappings":"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"}
|
package/lib/cn/index.js
CHANGED
|
@@ -7,5 +7,6 @@ export { isUSCC } from './uscc/isUSCC.js';
|
|
|
7
7
|
export { USCC } from './uscc/USCC.js';
|
|
8
8
|
export { ResidentIdNumber } from './id/ResidentIdNumber.js';
|
|
9
9
|
export { DivisionCode } from './division/DivisionCode.js';
|
|
10
|
+
export { toPinyinPure, toPinyinPureFirst, getCharToPinyinTable } from './pinyin/toPinyinPure.js';
|
|
10
11
|
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
package/lib/cn/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cn/index.ts"],"sourcesContent":["/**\n * China related utilities.\n *\n * @packageDocumentation\n */\n\nexport { parseChineseNumber } from './parseChineseNumber';\n\nexport { isUSCC } from './uscc/isUSCC';\nexport { USCC } from './uscc/USCC';\n\nexport { ResidentIdNumber } from './id/ResidentIdNumber';\n\nexport { DivisionCode } from './division/DivisionCode';\n"],"names":["parseChineseNumber","isUSCC","USCC","ResidentIdNumber","DivisionCode"],"mappings":"AAAA;;;;CAIC,GAED,SAASA,kBAAkB,QAAQ,uBAAuB;AAE1D,SAASC,MAAM,QAAQ,gBAAgB;AACvC,SAASC,IAAI,QAAQ,cAAc;AAEnC,SAASC,gBAAgB,QAAQ,wBAAwB;AAEzD,SAASC,YAAY,QAAQ,0BAA0B"}
|
|
1
|
+
{"version":3,"sources":["../../src/cn/index.ts"],"sourcesContent":["/**\n * China related utilities.\n *\n * @packageDocumentation\n */\n\nexport { parseChineseNumber } from './parseChineseNumber';\n\nexport { isUSCC } from './uscc/isUSCC';\nexport { USCC } from './uscc/USCC';\n\nexport { ResidentIdNumber } from './id/ResidentIdNumber';\n\nexport { DivisionCode } from './division/DivisionCode';\n\nexport { toPinyinPure, toPinyinPureFirst, getCharToPinyinTable } from './pinyin/toPinyinPure';\n"],"names":["parseChineseNumber","isUSCC","USCC","ResidentIdNumber","DivisionCode","toPinyinPure","toPinyinPureFirst","getCharToPinyinTable"],"mappings":"AAAA;;;;CAIC,GAED,SAASA,kBAAkB,QAAQ,uBAAuB;AAE1D,SAASC,MAAM,QAAQ,gBAAgB;AACvC,SAASC,IAAI,QAAQ,cAAc;AAEnC,SAASC,gBAAgB,QAAQ,wBAAwB;AAEzD,SAASC,YAAY,QAAQ,0BAA0B;AAEvD,SAASC,YAAY,EAAEC,iBAAiB,EAAEC,oBAAoB,QAAQ,wBAAwB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function cartesianProduct(args) {
|
|
2
|
+
if (args.length === 0) return [];
|
|
3
|
+
const product = [];
|
|
4
|
+
const counts = args.map((arr)=>arr.length);
|
|
5
|
+
const counter = new Array(args.length).fill(0);
|
|
6
|
+
const total = counts.reduce((acc, val)=>acc * val, 1);
|
|
7
|
+
for(let i = 0; i < total; i++){
|
|
8
|
+
product.push(counter.map((count, index)=>args[index][count]));
|
|
9
|
+
// Update the counter for the next row in the Cartesian product.
|
|
10
|
+
for(let j = args.length - 1; j >= 0; j--){
|
|
11
|
+
if (counter[j] + 1 < counts[j]) {
|
|
12
|
+
counter[j]++;
|
|
13
|
+
break; // Stop as we've found a digit that can be incremented.
|
|
14
|
+
} else {
|
|
15
|
+
counter[j] = 0; // Reset this digit and increment the next digit in the next iteration.
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return product;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=cartesianProduct.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cn/pinyin/cartesianProduct.ts"],"sourcesContent":["export function cartesianProduct<T>(args: T[][]): T[][] {\n if (args.length === 0) return [];\n\n const product: T[][] = [];\n const counts = args.map((arr) => arr.length);\n const counter = new Array(args.length).fill(0);\n const total = counts.reduce((acc, val) => acc * val, 1);\n\n for (let i = 0; i < total; i++) {\n product.push(counter.map((count, index) => args[index][count]));\n\n // Update the counter for the next row in the Cartesian product.\n for (let j = args.length - 1; j >= 0; j--) {\n if (counter[j] + 1 < counts[j]) {\n counter[j]++;\n break; // Stop as we've found a digit that can be incremented.\n } else {\n counter[j] = 0; // Reset this digit and increment the next digit in the next iteration.\n }\n }\n }\n\n return product;\n}\n"],"names":["cartesianProduct","args","length","product","counts","map","arr","counter","Array","fill","total","reduce","acc","val","i","push","count","index","j"],"mappings":"AAAA,OAAO,SAASA,iBAAoBC,IAAW;IAC7C,IAAIA,KAAKC,MAAM,KAAK,GAAG,OAAO,EAAE;IAEhC,MAAMC,UAAiB,EAAE;IACzB,MAAMC,SAASH,KAAKI,GAAG,CAAC,CAACC,MAAQA,IAAIJ,MAAM;IAC3C,MAAMK,UAAU,IAAIC,MAAMP,KAAKC,MAAM,EAAEO,IAAI,CAAC;IAC5C,MAAMC,QAAQN,OAAOO,MAAM,CAAC,CAACC,KAAKC,MAAQD,MAAMC,KAAK;IAErD,IAAK,IAAIC,IAAI,GAAGA,IAAIJ,OAAOI,IAAK;QAC9BX,QAAQY,IAAI,CAACR,QAAQF,GAAG,CAAC,CAACW,OAAOC,QAAUhB,IAAI,CAACgB,MAAM,CAACD,MAAM;QAE7D,gEAAgE;QAChE,IAAK,IAAIE,IAAIjB,KAAKC,MAAM,GAAG,GAAGgB,KAAK,GAAGA,IAAK;YACzC,IAAIX,OAAO,CAACW,EAAE,GAAG,IAAId,MAAM,CAACc,EAAE,EAAE;gBAC9BX,OAAO,CAACW,EAAE;gBACV,OAAO,uDAAuD;YAChE,OAAO;gBACLX,OAAO,CAACW,EAAE,GAAG,GAAG,uEAAuE;YACzF;QACF;IACF;IAEA,OAAOf;AACT"}
|