@wener/common 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/lib/cn/DivisionCode.js.map +1 -1
  2. package/lib/cn/Mod11Checksum.js.map +1 -1
  3. package/lib/cn/Mod31Checksum.js.map +1 -1
  4. package/lib/cn/ResidentIdentityCardNumber.js.map +1 -1
  5. package/lib/cn/UnifiedSocialCreditCode.js.map +1 -1
  6. package/lib/cn/formatDate.js.map +1 -1
  7. package/lib/cn/parseSex.js.map +1 -1
  8. package/lib/cn/types.d.js.map +1 -1
  9. package/lib/data/formatSort.js +15 -0
  10. package/lib/data/formatSort.js.map +1 -0
  11. package/lib/data/index.js +4 -0
  12. package/lib/data/index.js.map +1 -0
  13. package/lib/data/maybeNumber.js +22 -0
  14. package/lib/data/maybeNumber.js.map +1 -0
  15. package/lib/data/parseSort.js +95 -0
  16. package/lib/data/parseSort.js.map +1 -0
  17. package/lib/data/resolvePagination.js +36 -0
  18. package/lib/data/resolvePagination.js.map +1 -0
  19. package/lib/data/types.d.js +3 -0
  20. package/lib/data/types.d.js.map +1 -0
  21. package/lib/index.js +6 -2
  22. package/lib/index.js.map +1 -1
  23. package/lib/jsonschema/JsonSchema.js +4 -4
  24. package/lib/jsonschema/JsonSchema.js.map +1 -1
  25. package/lib/jsonschema/types.d.js.map +1 -1
  26. package/lib/meta/defineFileType.js.map +1 -1
  27. package/lib/meta/defineInit.js.map +1 -1
  28. package/lib/meta/defineMetadata.js.map +1 -1
  29. package/lib/password/PHC.js +8 -8
  30. package/lib/password/PHC.js.map +1 -1
  31. package/lib/password/Password.js.map +1 -1
  32. package/lib/password/createArgon2PasswordAlgorithm.js.map +1 -1
  33. package/lib/password/createBase64PasswordAlgorithm.js.map +1 -1
  34. package/lib/password/createBcryptPasswordAlgorithm.js.map +1 -1
  35. package/lib/password/createPBKDF2PasswordAlgorithm.js.map +1 -1
  36. package/lib/password/createScryptPasswordAlgorithm.js.map +1 -1
  37. package/lib/search/AdvanceSearch.js.map +1 -1
  38. package/lib/search/formatAdvanceSearch.js.map +1 -1
  39. package/lib/search/optimizeAdvanceSearch.js.map +1 -1
  40. package/lib/search/parseAdvanceSearch.js.map +1 -1
  41. package/lib/search/parser.d.js.map +1 -1
  42. package/lib/search/types.d.js.map +1 -1
  43. package/lib/tools/renderJsonSchemaToMarkdownDoc.js.map +1 -1
  44. package/package.json +10 -5
  45. package/src/cn/DivisionCode.test.ts +38 -45
  46. package/src/cn/DivisionCode.ts +140 -184
  47. package/src/cn/Mod11Checksum.ts +17 -17
  48. package/src/cn/Mod31Checksum.ts +25 -25
  49. package/src/cn/ResidentIdentityCardNumber.test.ts +12 -16
  50. package/src/cn/ResidentIdentityCardNumber.ts +82 -82
  51. package/src/cn/UnifiedSocialCreditCode.test.ts +11 -11
  52. package/src/cn/UnifiedSocialCreditCode.ts +115 -120
  53. package/src/cn/__snapshots__/ResidentIdentityCardNumber.test.ts.snap +1 -1
  54. package/src/cn/formatDate.ts +10 -10
  55. package/src/cn/parseSex.ts +11 -25
  56. package/src/cn/types.d.ts +43 -43
  57. package/src/data/formatSort.test.ts +13 -0
  58. package/src/data/formatSort.ts +18 -0
  59. package/src/data/index.ts +5 -0
  60. package/src/data/maybeNumber.ts +23 -0
  61. package/src/data/parseSort.test.ts +67 -0
  62. package/src/data/parseSort.ts +108 -0
  63. package/src/data/resolvePagination.test.ts +58 -0
  64. package/src/data/resolvePagination.ts +60 -0
  65. package/src/data/types.d.ts +33 -0
  66. package/src/index.ts +8 -2
  67. package/src/jsonschema/JsonSchema.test.ts +13 -22
  68. package/src/jsonschema/JsonSchema.ts +145 -177
  69. package/src/jsonschema/types.d.ts +151 -161
  70. package/src/meta/defineFileType.tsx +54 -54
  71. package/src/meta/defineInit.ts +32 -53
  72. package/src/meta/defineMetadata.test.ts +5 -7
  73. package/src/meta/defineMetadata.ts +28 -46
  74. package/src/password/PHC.test.ts +186 -277
  75. package/src/password/PHC.ts +243 -243
  76. package/src/password/Password.test.ts +38 -50
  77. package/src/password/Password.ts +73 -95
  78. package/src/password/createArgon2PasswordAlgorithm.ts +65 -69
  79. package/src/password/createBase64PasswordAlgorithm.ts +9 -9
  80. package/src/password/createBcryptPasswordAlgorithm.ts +20 -22
  81. package/src/password/createPBKDF2PasswordAlgorithm.ts +49 -61
  82. package/src/password/createScryptPasswordAlgorithm.ts +48 -59
  83. package/src/search/AdvanceSearch.test.ts +136 -143
  84. package/src/search/AdvanceSearch.ts +6 -6
  85. package/src/search/formatAdvanceSearch.ts +44 -53
  86. package/src/search/optimizeAdvanceSearch.ts +70 -83
  87. package/src/search/parseAdvanceSearch.ts +16 -19
  88. package/src/search/parser.d.ts +3 -3
  89. package/src/search/types.d.ts +28 -54
  90. package/src/tools/renderJsonSchemaToMarkdownDoc.ts +69 -69
  91. package/lib/normalizePagination.js +0 -14
  92. package/lib/normalizePagination.js.map +0 -1
  93. package/lib/parseSort.js +0 -106
  94. package/lib/parseSort.js.map +0 -1
  95. package/src/normalizePagination.ts +0 -25
  96. package/src/parseSort.test.ts +0 -42
  97. package/src/parseSort.ts +0 -133
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cn/DivisionCode.ts"],"sourcesContent":["const DivisionCodeLevels: Array<{\n level: number;\n code: string;\n length: number;\n size: number;\n label: string;\n}> = [\n {\n level: 1,\n code: 'Province',\n length: 2,\n size: 2,\n label: '省',\n },\n {\n level: 2,\n code: 'City',\n length: 4,\n size: 2,\n label: '市',\n },\n {\n level: 3,\n code: 'County',\n length: 6,\n size: 2,\n label: '区县',\n },\n {\n level: 4,\n code: 'Town',\n length: 9,\n size: 3,\n label: '乡镇',\n },\n {\n level: 5,\n code: 'Village',\n length: 12,\n size: 3,\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 namespace DivisionCode {\n enum DivisionCodeLevel {\n Province = 1,\n City = 2,\n County = 3,\n Town = 4,\n Village = 5,\n }\n\n export const levels = DivisionCodeLevels;\n\n export const regex = /^(?<province>\\d{2})(?<city>\\d{2})?(?<county>\\d{2})?(?<town>\\d{3})?(?<village>\\d{3})?$/;\n\n const root: CodeValue[] = [\n { value: '11', label: '北京市' },\n { value: '12', label: '天津市' },\n { value: '13', label: '河北省' },\n { value: '14', label: '山西省' },\n { value: '15', label: '内蒙古自治区' },\n { value: '21', label: '辽宁省' },\n { value: '22', label: '吉林省' },\n { value: '23', label: '黑龙江省' },\n { value: '31', label: '上海市' },\n { value: '32', label: '江苏省' },\n { value: '33', label: '浙江省' },\n { value: '34', label: '安徽省' },\n { value: '35', label: '福建省' },\n { value: '36', label: '江西省' },\n { value: '37', label: '山东省' },\n { value: '41', label: '河南省' },\n { value: '42', label: '湖北省' },\n { value: '43', label: '湖南省' },\n { value: '44', label: '广东省' },\n { value: '45', label: '广西壮族自治区' },\n { value: '46', label: '海南省' },\n { value: '50', label: '重庆市' },\n { value: '51', label: '四川省' },\n { value: '52', label: '贵州省' },\n { value: '53', label: '云南省' },\n { value: '54', label: '西藏自治区' },\n { value: '61', label: '陕西省' },\n { value: '62', label: '甘肃省' },\n { value: '63', label: '青海省' },\n { value: '64', label: '宁夏回族自治区' },\n { value: '65', label: '新疆维吾尔自治区' },\n { value: '71', label: '台湾省' },\n { value: '81', label: '香港特别行政区' },\n { value: '82', label: '澳门特别行政区' },\n // 9 国外\n ];\n\n export type ParsedCode = {\n province: string;\n city?: string;\n county?: string;\n town?: string;\n village?: string;\n codes: string[];\n level: DivisionCodeLevel;\n labels: string[];\n };\n\n export function parse(code: string | undefined | null | number): ParsedCode | undefined {\n if (!code) return;\n code = String(code);\n const match = regex.exec(code);\n if (!match) return;\n const { province, city, county, town, village } = match.groups ?? {};\n if (!province) return;\n\n let codes = [province, city, county, town, village].filter(Boolean);\n return {\n province,\n city,\n county,\n town,\n village,\n codes: codes,\n level: codes.length as DivisionCodeLevel,\n };\n }\n\n export function format({\n province,\n city,\n county,\n town,\n village,\n }: {\n province: string | number;\n city?: string | number;\n county?: string | number;\n town?: string | number;\n village?: string | number;\n }): string {\n const codes: string[] = [];\n for (let i = 0; i < [province, city, county, town, village].length; i++) {\n let x = [province, city, county, town, village][i];\n if (x === undefined || x === null || x === '') {\n break;\n }\n let len = levels[i].size;\n codes.push(String(x).padStart(len, '0').slice(0, len));\n }\n return codes.join('');\n }\n\n // export function random(level: DivisionCodeLevel = 'County'): string {\n // const l = DivisionCodeLevels.find((v) => v.code === level) || DivisionCodeLevels[2];\n // const l1 = randomPick(provinces);\n // if (l.level === 1) {\n // return String(l1[0]);\n // }\n // return l1 + String(Math.floor(Math.random() * parseFloat(`1e${l.length - 2}`) - 1));\n // }\n}\n\ninterface DivisionTreeNode {\n sub: string; // sub code\n children?: Record<string, DivisionTreeNode>;\n\n code: string; // full code\n name?: string; // name of division\n}\n\n// export type DivisionCodeLevel = 'Village' | 'Town' | 'County' | 'City' | 'Province';\n\n// export interface ParsedDivisionCode {\n// level: DivisionCodeLevel;\n// code: string;\n// name?: string;\n// fullName?: string;\n// names: string[];\n// // 村级(村委会、居委会)\n// // 12 位\n// village?: CodeName;\n// // 乡级(乡镇、街道)\n// // 9 位\n// town?: CodeName;\n// // 县级(区县)\n// // 6 位 - 常用 - 2985 个\n// county?: CodeName;\n// // 地级(城市)\n// // 4 位 - 343 个\n// city?: CodeName;\n// // 省级(省份、直辖市、自治区)\n// // 2 位 - 32 个\n// province: CodeName;\n//\n// children?: Array<{ code: string; name?: string }>;\n// }\n\n// export interface CodeName {\n// code: string;\n// name: string;\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\nexport function randomPick<T>(s: T[]) {\n return s[Math.floor(Math.random() * s.length)];\n}\n\nfunction lookup(opts: { values: string[]; root: CodeValue[] }): { found: CodeValue[] } {\n const { values, root } = opts;\n const found: CodeValue[] = [];\n let currentLevel = root;\n\n for (const v of values) {\n const node = currentLevel.find((n) => n.value === v);\n if (!node) {\n break;\n }\n\n found.push(node);\n\n if (node.children) {\n currentLevel = node.children;\n } else {\n break;\n }\n }\n\n return { found };\n}\n\ninterface CodeValue {\n value: string;\n label: string;\n children?: Array<CodeValue>;\n}\n"],"names":["DivisionCodeLevels","level","code","length","size","label","DivisionCode","DivisionCodeLevel","levels","regex","root","value","parse","String","match","exec","province","city","county","town","village","groups","codes","filter","Boolean","format","i","x","undefined","len","push","padStart","slice","join","randomPick","s","Math","floor","random","lookup","opts","values","found","currentLevel","v","node","find","n","children"],"mappings":"AAAA,MAAMA,qBAMD;IACH;QACEC,OAAO;QACPC,MAAM;QACNC,QAAQ;QACRC,MAAM;QACNC,OAAO;IACT;IACA;QACEJ,OAAO;QACPC,MAAM;QACNC,QAAQ;QACRC,MAAM;QACNC,OAAO;IACT;IACA;QACEJ,OAAO;QACPC,MAAM;QACNC,QAAQ;QACRC,MAAM;QACNC,OAAO;IACT;IACA;QACEJ,OAAO;QACPC,MAAM;QACNC,QAAQ;QACRC,MAAM;QACNC,OAAO;IACT;IACA;QACEJ,OAAO;QACPC,MAAM;QACNC,QAAQ;QACRC,MAAM;QACNC,OAAO;IACT;CACD;UAUgBC;IACf,IAAA,AAAKC,2CAAAA;;;;;;eAAAA;;iBAQQC,SAASR;iBAETS,QAAQ;IAErB,MAAMC,OAAoB;QACxB;YAAEC,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAS;QAC/B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAO;QAC7B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAU;QAChC;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAQ;QAC9B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAU;QAChC;YAAEM,OAAO;YAAMN,OAAO;QAAW;QACjC;YAAEM,OAAO;YAAMN,OAAO;QAAM;QAC5B;YAAEM,OAAO;YAAMN,OAAO;QAAU;QAChC;YAAEM,OAAO;YAAMN,OAAO;QAAU;KAEjC;IAaM,SAASO,MAAMV,IAAwC;QAC5D,IAAI,CAACA,MAAM;QACXA,OAAOW,OAAOX;QACd,MAAMY,QAAQL,aAAAA,MAAMM,IAAI,CAACb;QACzB,IAAI,CAACY,OAAO;QACZ,MAAM,EAAEE,QAAQ,EAAEC,IAAI,EAAEC,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAE,GAAGN,MAAMO,MAAM,IAAI,CAAC;QACnE,IAAI,CAACL,UAAU;QAEf,IAAIM,QAAQ;YAACN;YAAUC;YAAMC;YAAQC;YAAMC;SAAQ,CAACG,MAAM,CAACC;QAC3D,OAAO;YACLR;YACAC;YACAC;YACAC;YACAC;YACAE,OAAOA;YACPrB,OAAOqB,MAAMnB,MAAM;QACrB;IACF;iBAlBgBS,QAAAA;IAoBT,SAASa,OAAO,EACrBT,QAAQ,EACRC,IAAI,EACJC,MAAM,EACNC,IAAI,EACJC,OAAO,EAOR;QACC,MAAME,QAAkB,EAAE;QAC1B,IAAK,IAAII,IAAI,GAAGA,IAAI;YAACV;YAAUC;YAAMC;YAAQC;YAAMC;SAAQ,CAACjB,MAAM,EAAEuB,IAAK;YACvE,IAAIC,IAAI;gBAACX;gBAAUC;gBAAMC;gBAAQC;gBAAMC;aAAQ,CAACM,EAAE;YAClD,IAAIC,MAAMC,aAAaD,MAAM,QAAQA,MAAM,IAAI;gBAC7C;YACF;YACA,IAAIE,MAAMrB,aAAAA,MAAM,CAACkB,EAAE,CAACtB,IAAI;YACxBkB,MAAMQ,IAAI,CAACjB,OAAOc,GAAGI,QAAQ,CAACF,KAAK,KAAKG,KAAK,CAAC,GAAGH;QACnD;QACA,OAAOP,MAAMW,IAAI,CAAC;IACpB;iBAvBgBR,SAAAA;AAyBhB,wEAAwE;AACxE,yFAAyF;AACzF,sCAAsC;AACtC,yBAAyB;AACzB,4BAA4B;AAC5B,MAAM;AACN,yFAAyF;AACzF,IAAI;AACN,GAnHiBnB,iBAAAA;AA6HjB,uFAAuF;AAEvF,wCAAwC;AACxC,8BAA8B;AAC9B,kBAAkB;AAClB,mBAAmB;AACnB,uBAAuB;AACvB,qBAAqB;AACrB,mBAAmB;AACnB,YAAY;AACZ,wBAAwB;AACxB,iBAAiB;AACjB,WAAW;AACX,qBAAqB;AACrB,cAAc;AACd,yBAAyB;AACzB,uBAAuB;AACvB,cAAc;AACd,mBAAmB;AACnB,qBAAqB;AACrB,sBAAsB;AACtB,kBAAkB;AAClB,wBAAwB;AACxB,EAAE;AACF,uDAAuD;AACvD,IAAI;AAEJ,8BAA8B;AAC9B,kBAAkB;AAClB,kBAAkB;AAClB,IAAI;AAEJ,0DAA0D;AAC1D,kBAAkB;AAClB,cAAc;AACd,MAAM;AACN,uBAAuB;AACvB,+BAA+B;AAC/B,iCAAiC;AACjC,sEAAsE;AACtE,MAAM;AACN,4DAA4D;AAC5D,IAAI;AAEJ,OAAO,SAAS4B,WAAcC,CAAM;IAClC,OAAOA,CAAC,CAACC,KAAKC,KAAK,CAACD,KAAKE,MAAM,KAAKH,EAAEhC,MAAM,EAAE;AAChD;AAEA,SAASoC,OAAOC,IAA6C;IAC3D,MAAM,EAAEC,MAAM,EAAE/B,IAAI,EAAE,GAAG8B;IACzB,MAAME,QAAqB,EAAE;IAC7B,IAAIC,eAAejC;IAEnB,KAAK,MAAMkC,KAAKH,OAAQ;QACtB,MAAMI,OAAOF,aAAaG,IAAI,CAAC,CAACC,IAAMA,EAAEpC,KAAK,KAAKiC;QAClD,IAAI,CAACC,MAAM;YACT;QACF;QAEAH,MAAMZ,IAAI,CAACe;QAEX,IAAIA,KAAKG,QAAQ,EAAE;YACjBL,eAAeE,KAAKG,QAAQ;QAC9B,OAAO;YACL;QACF;IACF;IAEA,OAAO;QAAEN;IAAM;AACjB"}
1
+ {"version":3,"sources":["../../src/cn/DivisionCode.ts"],"sourcesContent":["const DivisionCodeLevels: Array<{ level: number; code: string; length: number; size: number; label: string }> = [\n\t{ level: 1, code: 'Province', length: 2, size: 2, label: '省' },\n\t{ level: 2, code: 'City', length: 4, size: 2, label: '市' },\n\t{ level: 3, code: 'County', length: 6, size: 2, label: '区县' },\n\t{ level: 4, code: 'Town', length: 9, size: 3, label: '乡镇' },\n\t{ level: 5, code: 'Village', length: 12, size: 3, label: '村' },\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 namespace DivisionCode {\n\tenum DivisionCodeLevel {\n\t\tProvince = 1,\n\t\tCity = 2,\n\t\tCounty = 3,\n\t\tTown = 4,\n\t\tVillage = 5,\n\t}\n\n\texport const levels = DivisionCodeLevels;\n\n\texport const regex = /^(?<province>\\d{2})(?<city>\\d{2})?(?<county>\\d{2})?(?<town>\\d{3})?(?<village>\\d{3})?$/;\n\n\tconst root: CodeValue[] = [\n\t\t{ value: '11', label: '北京市' },\n\t\t{ value: '12', label: '天津市' },\n\t\t{ value: '13', label: '河北省' },\n\t\t{ value: '14', label: '山西省' },\n\t\t{ value: '15', label: '内蒙古自治区' },\n\t\t{ value: '21', label: '辽宁省' },\n\t\t{ value: '22', label: '吉林省' },\n\t\t{ value: '23', label: '黑龙江省' },\n\t\t{ value: '31', label: '上海市' },\n\t\t{ value: '32', label: '江苏省' },\n\t\t{ value: '33', label: '浙江省' },\n\t\t{ value: '34', label: '安徽省' },\n\t\t{ value: '35', label: '福建省' },\n\t\t{ value: '36', label: '江西省' },\n\t\t{ value: '37', label: '山东省' },\n\t\t{ value: '41', label: '河南省' },\n\t\t{ value: '42', label: '湖北省' },\n\t\t{ value: '43', label: '湖南省' },\n\t\t{ value: '44', label: '广东省' },\n\t\t{ value: '45', label: '广西壮族自治区' },\n\t\t{ value: '46', label: '海南省' },\n\t\t{ value: '50', label: '重庆市' },\n\t\t{ value: '51', label: '四川省' },\n\t\t{ value: '52', label: '贵州省' },\n\t\t{ value: '53', label: '云南省' },\n\t\t{ value: '54', label: '西藏自治区' },\n\t\t{ value: '61', label: '陕西省' },\n\t\t{ value: '62', label: '甘肃省' },\n\t\t{ value: '63', label: '青海省' },\n\t\t{ value: '64', label: '宁夏回族自治区' },\n\t\t{ value: '65', label: '新疆维吾尔自治区' },\n\t\t{ value: '71', label: '台湾省' },\n\t\t{ value: '81', label: '香港特别行政区' },\n\t\t{ value: '82', label: '澳门特别行政区' },\n\t\t// 9 国外\n\t];\n\n\texport type ParsedCode = {\n\t\tprovince: string;\n\t\tcity?: string;\n\t\tcounty?: string;\n\t\ttown?: string;\n\t\tvillage?: string;\n\t\tcodes: string[];\n\t\tlevel: DivisionCodeLevel;\n\t\tlabels: string[];\n\t};\n\n\texport function parse(code: string | undefined | null | number): ParsedCode | undefined {\n\t\tif (!code) return;\n\t\tcode = String(code);\n\t\tconst match = regex.exec(code);\n\t\tif (!match) return;\n\t\tconst { province, city, county, town, village } = match.groups ?? {};\n\t\tif (!province) return;\n\n\t\tlet codes = [province, city, county, town, village].filter(Boolean);\n\t\treturn { province, city, county, town, village, codes: codes, level: codes.length as DivisionCodeLevel };\n\t}\n\n\texport function format({\n\t\tprovince,\n\t\tcity,\n\t\tcounty,\n\t\ttown,\n\t\tvillage,\n\t}: {\n\t\tprovince: string | number;\n\t\tcity?: string | number;\n\t\tcounty?: string | number;\n\t\ttown?: string | number;\n\t\tvillage?: string | number;\n\t}): string {\n\t\tconst codes: string[] = [];\n\t\tfor (let i = 0; i < [province, city, county, town, village].length; i++) {\n\t\t\tlet x = [province, city, county, town, village][i];\n\t\t\tif (x === undefined || x === null || x === '') {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlet len = levels[i].size;\n\t\t\tcodes.push(String(x).padStart(len, '0').slice(0, len));\n\t\t}\n\t\treturn codes.join('');\n\t}\n\n\t// export function random(level: DivisionCodeLevel = 'County'): string {\n\t// const l = DivisionCodeLevels.find((v) => v.code === level) || DivisionCodeLevels[2];\n\t// const l1 = randomPick(provinces);\n\t// if (l.level === 1) {\n\t// return String(l1[0]);\n\t// }\n\t// return l1 + String(Math.floor(Math.random() * parseFloat(`1e${l.length - 2}`) - 1));\n\t// }\n}\n\ninterface DivisionTreeNode {\n\tsub: string; // sub code\n\tchildren?: Record<string, DivisionTreeNode>;\n\n\tcode: string; // full code\n\tname?: string; // name of division\n}\n\n// export type DivisionCodeLevel = 'Village' | 'Town' | 'County' | 'City' | 'Province';\n\n// export interface ParsedDivisionCode {\n// level: DivisionCodeLevel;\n// code: string;\n// name?: string;\n// fullName?: string;\n// names: string[];\n// // 村级(村委会、居委会)\n// // 12 位\n// village?: CodeName;\n// // 乡级(乡镇、街道)\n// // 9 位\n// town?: CodeName;\n// // 县级(区县)\n// // 6 位 - 常用 - 2985 个\n// county?: CodeName;\n// // 地级(城市)\n// // 4 位 - 343 个\n// city?: CodeName;\n// // 省级(省份、直辖市、自治区)\n// // 2 位 - 32 个\n// province: CodeName;\n//\n// children?: Array<{ code: string; name?: string }>;\n// }\n\n// export interface CodeName {\n// code: string;\n// name: string;\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\nexport function randomPick<T>(s: T[]) {\n\treturn s[Math.floor(Math.random() * s.length)];\n}\n\nfunction lookup(opts: { values: string[]; root: CodeValue[] }): { found: CodeValue[] } {\n\tconst { values, root } = opts;\n\tconst found: CodeValue[] = [];\n\tlet currentLevel = root;\n\n\tfor (const v of values) {\n\t\tconst node = currentLevel.find((n) => n.value === v);\n\t\tif (!node) {\n\t\t\tbreak;\n\t\t}\n\n\t\tfound.push(node);\n\n\t\tif (node.children) {\n\t\t\tcurrentLevel = node.children;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn { found };\n}\n\ninterface CodeValue {\n\tvalue: string;\n\tlabel: string;\n\tchildren?: Array<CodeValue>;\n}\n"],"names":["DivisionCodeLevels","level","code","length","size","label","DivisionCode","DivisionCodeLevel","levels","regex","root","value","parse","String","match","exec","province","city","county","town","village","groups","codes","filter","Boolean","format","i","x","undefined","len","push","padStart","slice","join","randomPick","s","Math","floor","random","lookup","opts","values","found","currentLevel","v","node","find","n","children"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cn/Mod11Checksum.ts"],"sourcesContent":["/**\n * ISO 7064:1983, MOD 11-2.\n */\nexport class Mod11Checksum {\n weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];\n\n validate(s: string) {\n return s.at(-1) === this.compute(s.slice(0, s.length - 1));\n }\n\n compute(s: string) {\n const { weights } = this;\n let sum = 0;\n for (let i = 0; i < s.length; i++) {\n sum += parseInt(s[i]) * weights[i];\n }\n const num = (12 - (sum % 11)) % 11;\n if (num < 10) {\n return num.toString();\n } else {\n return 'X';\n }\n }\n}\n"],"names":["Mod11Checksum","weights","validate","s","at","compute","slice","length","sum","i","parseInt","num","toString"],"mappings":"AAAA;;CAEC,GACD,OAAO,MAAMA;IACXC,UAAU;QAAC;QAAG;QAAG;QAAI;QAAG;QAAG;QAAG;QAAG;QAAG;QAAG;QAAG;QAAG;QAAG;QAAI;QAAG;QAAG;QAAG;QAAG;KAAE,CAAC;IAEnEC,SAASC,CAAS,EAAE;QAClB,OAAOA,EAAEC,EAAE,CAAC,CAAC,OAAO,IAAI,CAACC,OAAO,CAACF,EAAEG,KAAK,CAAC,GAAGH,EAAEI,MAAM,GAAG;IACzD;IAEAF,QAAQF,CAAS,EAAE;QACjB,MAAM,EAAEF,OAAO,EAAE,GAAG,IAAI;QACxB,IAAIO,MAAM;QACV,IAAK,IAAIC,IAAI,GAAGA,IAAIN,EAAEI,MAAM,EAAEE,IAAK;YACjCD,OAAOE,SAASP,CAAC,CAACM,EAAE,IAAIR,OAAO,CAACQ,EAAE;QACpC;QACA,MAAME,MAAM,AAAC,CAAA,KAAMH,MAAM,EAAE,IAAK;QAChC,IAAIG,MAAM,IAAI;YACZ,OAAOA,IAAIC,QAAQ;QACrB,OAAO;YACL,OAAO;QACT;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/cn/Mod11Checksum.ts"],"sourcesContent":["/**\n * ISO 7064:1983, MOD 11-2.\n */\nexport class Mod11Checksum {\n\tweights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];\n\n\tvalidate(s: string) {\n\t\treturn s.at(-1) === this.compute(s.slice(0, s.length - 1));\n\t}\n\n\tcompute(s: string) {\n\t\tconst { weights } = this;\n\t\tlet sum = 0;\n\t\tfor (let i = 0; i < s.length; i++) {\n\t\t\tsum += parseInt(s[i]) * weights[i];\n\t\t}\n\t\tconst num = (12 - (sum % 11)) % 11;\n\t\tif (num < 10) {\n\t\t\treturn num.toString();\n\t\t} else {\n\t\t\treturn 'X';\n\t\t}\n\t}\n}\n"],"names":["Mod11Checksum","weights","validate","s","at","compute","slice","length","sum","i","parseInt","num","toString"],"mappings":"AAAA;;CAEC,GACD,OAAO,MAAMA;IACZC,UAAU;QAAC;QAAG;QAAG;QAAI;QAAG;QAAG;QAAG;QAAG;QAAG;QAAG;QAAG;QAAG;QAAG;QAAI;QAAG;QAAG;QAAG;QAAG;KAAE,CAAC;IAEnEC,SAASC,CAAS,EAAE;QACnB,OAAOA,EAAEC,EAAE,CAAC,CAAC,OAAO,IAAI,CAACC,OAAO,CAACF,EAAEG,KAAK,CAAC,GAAGH,EAAEI,MAAM,GAAG;IACxD;IAEAF,QAAQF,CAAS,EAAE;QAClB,MAAM,EAAEF,OAAO,EAAE,GAAG,IAAI;QACxB,IAAIO,MAAM;QACV,IAAK,IAAIC,IAAI,GAAGA,IAAIN,EAAEI,MAAM,EAAEE,IAAK;YAClCD,OAAOE,SAASP,CAAC,CAACM,EAAE,IAAIR,OAAO,CAACQ,EAAE;QACnC;QACA,MAAME,MAAM,AAAC,CAAA,KAAMH,MAAM,EAAE,IAAK;QAChC,IAAIG,MAAM,IAAI;YACb,OAAOA,IAAIC,QAAQ;QACpB,OAAO;YACN,OAAO;QACR;IACD;AACD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cn/Mod31Checksum.ts"],"sourcesContent":["/**\n * GB/T 17710(采ISO 7064)的模31校验码\n *\n * Mod31-3\n */\nexport class Mod31Checksum {\n weights = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];\n chars = '0123456789ABCDEFGHJKLMNPQRTUWXY';\n numbers: Record<string, number> = this.chars.split('').reduce(\n (acc, cur, i) => {\n acc[cur] = i;\n return acc;\n },\n {} as Record<string, number>,\n );\n\n toChar(n: number) {\n return this.chars[n];\n }\n\n toNumber(c: string) {\n return this.numbers[c];\n }\n\n validate(s: string) {\n return s.at(-1) === this.compute(s.slice(0, s.length - 1));\n }\n\n compute(s: string) {\n let sum = 0;\n for (let i = 0; i < s.length; i++) {\n sum += this.numbers[s[i]] * this.weights[i];\n }\n return this.toChar(31 - (sum % 31));\n }\n}\n"],"names":["Mod31Checksum","weights","chars","numbers","split","reduce","acc","cur","i","toChar","n","toNumber","c","validate","s","at","compute","slice","length","sum"],"mappings":"AAAA;;;;CAIC,GACD,OAAO,MAAMA;IACXC,UAAU;QAAC;QAAG;QAAG;QAAG;QAAI;QAAI;QAAI;QAAI;QAAI;QAAI;QAAI;QAAI;QAAI;QAAG;QAAI;QAAI;QAAI;KAAG,CAAC;IAC3EC,QAAQ,kCAAkC;IAC1CC,UAAkC,IAAI,CAACD,KAAK,CAACE,KAAK,CAAC,IAAIC,MAAM,CAC3D,CAACC,KAAKC,KAAKC;QACTF,GAAG,CAACC,IAAI,GAAGC;QACX,OAAOF;IACT,GACA,CAAC,GACD;IAEFG,OAAOC,CAAS,EAAE;QAChB,OAAO,IAAI,CAACR,KAAK,CAACQ,EAAE;IACtB;IAEAC,SAASC,CAAS,EAAE;QAClB,OAAO,IAAI,CAACT,OAAO,CAACS,EAAE;IACxB;IAEAC,SAASC,CAAS,EAAE;QAClB,OAAOA,EAAEC,EAAE,CAAC,CAAC,OAAO,IAAI,CAACC,OAAO,CAACF,EAAEG,KAAK,CAAC,GAAGH,EAAEI,MAAM,GAAG;IACzD;IAEAF,QAAQF,CAAS,EAAE;QACjB,IAAIK,MAAM;QACV,IAAK,IAAIX,IAAI,GAAGA,IAAIM,EAAEI,MAAM,EAAEV,IAAK;YACjCW,OAAO,IAAI,CAAChB,OAAO,CAACW,CAAC,CAACN,EAAE,CAAC,GAAG,IAAI,CAACP,OAAO,CAACO,EAAE;QAC7C;QACA,OAAO,IAAI,CAACC,MAAM,CAAC,KAAMU,MAAM;IACjC;AACF"}
1
+ {"version":3,"sources":["../../src/cn/Mod31Checksum.ts"],"sourcesContent":["/**\n * GB/T 17710(采ISO 7064)的模31校验码\n *\n * Mod31-3\n */\nexport class Mod31Checksum {\n\tweights = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];\n\tchars = '0123456789ABCDEFGHJKLMNPQRTUWXY';\n\tnumbers: Record<string, number> = this.chars.split('').reduce(\n\t\t(acc, cur, i) => {\n\t\t\tacc[cur] = i;\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<string, number>,\n\t);\n\n\ttoChar(n: number) {\n\t\treturn this.chars[n];\n\t}\n\n\ttoNumber(c: string) {\n\t\treturn this.numbers[c];\n\t}\n\n\tvalidate(s: string) {\n\t\treturn s.at(-1) === this.compute(s.slice(0, s.length - 1));\n\t}\n\n\tcompute(s: string) {\n\t\tlet sum = 0;\n\t\tfor (let i = 0; i < s.length; i++) {\n\t\t\tsum += this.numbers[s[i]] * this.weights[i];\n\t\t}\n\t\treturn this.toChar(31 - (sum % 31));\n\t}\n}\n"],"names":["Mod31Checksum","weights","chars","numbers","split","reduce","acc","cur","i","toChar","n","toNumber","c","validate","s","at","compute","slice","length","sum"],"mappings":"AAAA;;;;CAIC,GACD,OAAO,MAAMA;IACZC,UAAU;QAAC;QAAG;QAAG;QAAG;QAAI;QAAI;QAAI;QAAI;QAAI;QAAI;QAAI;QAAI;QAAI;QAAG;QAAI;QAAI;QAAI;KAAG,CAAC;IAC3EC,QAAQ,kCAAkC;IAC1CC,UAAkC,IAAI,CAACD,KAAK,CAACE,KAAK,CAAC,IAAIC,MAAM,CAC5D,CAACC,KAAKC,KAAKC;QACVF,GAAG,CAACC,IAAI,GAAGC;QACX,OAAOF;IACR,GACA,CAAC,GACA;IAEFG,OAAOC,CAAS,EAAE;QACjB,OAAO,IAAI,CAACR,KAAK,CAACQ,EAAE;IACrB;IAEAC,SAASC,CAAS,EAAE;QACnB,OAAO,IAAI,CAACT,OAAO,CAACS,EAAE;IACvB;IAEAC,SAASC,CAAS,EAAE;QACnB,OAAOA,EAAEC,EAAE,CAAC,CAAC,OAAO,IAAI,CAACC,OAAO,CAACF,EAAEG,KAAK,CAAC,GAAGH,EAAEI,MAAM,GAAG;IACxD;IAEAF,QAAQF,CAAS,EAAE;QAClB,IAAIK,MAAM;QACV,IAAK,IAAIX,IAAI,GAAGA,IAAIM,EAAEI,MAAM,EAAEV,IAAK;YAClCW,OAAO,IAAI,CAAChB,OAAO,CAACW,CAAC,CAACN,EAAE,CAAC,GAAG,IAAI,CAACP,OAAO,CAACO,EAAE;QAC5C;QACA,OAAO,IAAI,CAACC,MAAM,CAAC,KAAMU,MAAM;IAChC;AACD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cn/ResidentIdentityCardNumber.ts"],"sourcesContent":["import { formatDate } from './formatDate';\nimport { Mod11Checksum } from './Mod11Checksum';\n\nexport namespace ResidentIdentityCardNumber {\n export const Checksum = new Mod11Checksum();\n\n /*\n export const length = 18;\n export const pattern = /^\\d{6}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$/;\n */\n\n export function parse(s: string): ParsedResidentIdentityCardNumber {\n const division = s.slice(0, 6);\n const birthDate = s.slice(6, 14);\n const sequence = parseInt(s.slice(14, 17), 10);\n const checksum = s.slice(17, 18);\n const valid = Checksum.validate(s);\n const sex = sequence % 2 === 1 ? 'Male' : 'Female';\n return {\n division,\n birthDate,\n sequence,\n checksum,\n valid,\n sex,\n male: sex === 'Male',\n female: sex === 'Female',\n age: new Date().getFullYear() - parseInt(birthDate.slice(0, 4), 10),\n };\n }\n\n export function format({\n division,\n birthDate,\n sequence,\n checksum,\n }: {\n division: string;\n birthDate: string | Date;\n sequence: number | string;\n checksum?: string;\n }) {\n if (typeof birthDate !== 'string') {\n birthDate = formatDate(birthDate, 'yyyyMMDD');\n }\n if (birthDate.includes('-')) {\n birthDate = birthDate.replace(/-/g, '');\n }\n typeof sequence === 'number' && (sequence = sequence.toString());\n sequence = sequence.padStart(3, '0');\n const base = [division, birthDate, sequence].join('');\n if (base.length !== 17) throw new Error('Invalid params');\n checksum ||= Checksum.compute(base);\n return base + checksum;\n }\n}\nexport interface ParsedResidentIdentityCardNumber {\n /**\n * @title 行政区划代码\n */\n division: string;\n /**\n * @title 出生日期\n * 格式 yyyyMMDD\n */\n birthDate: string;\n /**\n * @title 顺序码\n */\n sequence: number;\n /**\n * @title 校验位\n */\n checksum: string;\n\n /**\n * @title 是否有效\n */\n valid: boolean;\n /**\n * @title 是否男性\n */\n male: boolean;\n /**\n * @title 是否女性\n */\n female: boolean;\n /**\n * @title 性别\n */\n sex: 'Male' | 'Female';\n /**\n * @title 年龄\n */\n age: number;\n}\n"],"names":["formatDate","Mod11Checksum","ResidentIdentityCardNumber","Checksum","parse","s","division","slice","birthDate","sequence","parseInt","checksum","valid","validate","sex","male","female","age","Date","getFullYear","format","includes","replace","toString","padStart","base","join","length","Error","compute"],"mappings":"AAAA,SAASA,UAAU,QAAQ,eAAe;AAC1C,SAASC,aAAa,QAAQ,kBAAkB;UAE/BC;+BACFC,WAAW,IAAIF;IAOrB,SAASG,MAAMC,CAAS;QAC7B,MAAMC,WAAWD,EAAEE,KAAK,CAAC,GAAG;QAC5B,MAAMC,YAAYH,EAAEE,KAAK,CAAC,GAAG;QAC7B,MAAME,WAAWC,SAASL,EAAEE,KAAK,CAAC,IAAI,KAAK;QAC3C,MAAMI,WAAWN,EAAEE,KAAK,CAAC,IAAI;QAC7B,MAAMK,QAAQT,2BAAAA,SAASU,QAAQ,CAACR;QAChC,MAAMS,MAAML,WAAW,MAAM,IAAI,SAAS;QAC1C,OAAO;YACLH;YACAE;YACAC;YACAE;YACAC;YACAE;YACAC,MAAMD,QAAQ;YACdE,QAAQF,QAAQ;YAChBG,KAAK,IAAIC,OAAOC,WAAW,KAAKT,SAASF,UAAUD,KAAK,CAAC,GAAG,IAAI;QAClE;IACF;IAvBA;;;GAGC,8BAEeH,QAAAA;IAoBT,SAASgB,OAAO,EACrBd,QAAQ,EACRE,SAAS,EACTC,QAAQ,EACRE,QAAQ,EAMT;QACC,IAAI,OAAOH,cAAc,UAAU;YACjCA,YAAYR,WAAWQ,WAAW;QACpC;QACA,IAAIA,UAAUa,QAAQ,CAAC,MAAM;YAC3Bb,YAAYA,UAAUc,OAAO,CAAC,MAAM;QACtC;QACA,OAAOb,aAAa,YAAaA,CAAAA,WAAWA,SAASc,QAAQ,EAAC;QAC9Dd,WAAWA,SAASe,QAAQ,CAAC,GAAG;QAChC,MAAMC,OAAO;YAACnB;YAAUE;YAAWC;SAAS,CAACiB,IAAI,CAAC;QAClD,IAAID,KAAKE,MAAM,KAAK,IAAI,MAAM,IAAIC,MAAM;QACxCjB,aAAaR,2BAAAA,SAAS0B,OAAO,CAACJ;QAC9B,OAAOA,OAAOd;IAChB;+BAvBgBS,SAAAA;AAwBlB,GApDiBlB,+BAAAA"}
1
+ {"version":3,"sources":["../../src/cn/ResidentIdentityCardNumber.ts"],"sourcesContent":["import { formatDate } from './formatDate';\nimport { Mod11Checksum } from './Mod11Checksum';\n\nexport namespace ResidentIdentityCardNumber {\n\texport const Checksum = new Mod11Checksum();\n\n\t/*\n export const length = 18;\n export const pattern = /^\\d{6}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$/;\n */\n\n\texport function parse(s: string): ParsedResidentIdentityCardNumber {\n\t\tconst division = s.slice(0, 6);\n\t\tconst birthDate = s.slice(6, 14);\n\t\tconst sequence = parseInt(s.slice(14, 17), 10);\n\t\tconst checksum = s.slice(17, 18);\n\t\tconst valid = Checksum.validate(s);\n\t\tconst sex = sequence % 2 === 1 ? 'Male' : 'Female';\n\t\treturn {\n\t\t\tdivision,\n\t\t\tbirthDate,\n\t\t\tsequence,\n\t\t\tchecksum,\n\t\t\tvalid,\n\t\t\tsex,\n\t\t\tmale: sex === 'Male',\n\t\t\tfemale: sex === 'Female',\n\t\t\tage: new Date().getFullYear() - parseInt(birthDate.slice(0, 4), 10),\n\t\t};\n\t}\n\n\texport function format({\n\t\tdivision,\n\t\tbirthDate,\n\t\tsequence,\n\t\tchecksum,\n\t}: {\n\t\tdivision: string;\n\t\tbirthDate: string | Date;\n\t\tsequence: number | string;\n\t\tchecksum?: string;\n\t}) {\n\t\tif (typeof birthDate !== 'string') {\n\t\t\tbirthDate = formatDate(birthDate, 'yyyyMMDD');\n\t\t}\n\t\tif (birthDate.includes('-')) {\n\t\t\tbirthDate = birthDate.replace(/-/g, '');\n\t\t}\n\t\ttypeof sequence === 'number' && (sequence = sequence.toString());\n\t\tsequence = sequence.padStart(3, '0');\n\t\tconst base = [division, birthDate, sequence].join('');\n\t\tif (base.length !== 17) throw new Error('Invalid params');\n\t\tchecksum ||= Checksum.compute(base);\n\t\treturn base + checksum;\n\t}\n}\nexport interface ParsedResidentIdentityCardNumber {\n\t/**\n\t * @title 行政区划代码\n\t */\n\tdivision: string;\n\t/**\n\t * @title 出生日期\n\t * 格式 yyyyMMDD\n\t */\n\tbirthDate: string;\n\t/**\n\t * @title 顺序码\n\t */\n\tsequence: number;\n\t/**\n\t * @title 校验位\n\t */\n\tchecksum: string;\n\n\t/**\n\t * @title 是否有效\n\t */\n\tvalid: boolean;\n\t/**\n\t * @title 是否男性\n\t */\n\tmale: boolean;\n\t/**\n\t * @title 是否女性\n\t */\n\tfemale: boolean;\n\t/**\n\t * @title 性别\n\t */\n\tsex: 'Male' | 'Female';\n\t/**\n\t * @title 年龄\n\t */\n\tage: number;\n}\n"],"names":["formatDate","Mod11Checksum","ResidentIdentityCardNumber","Checksum","parse","s","division","slice","birthDate","sequence","parseInt","checksum","valid","validate","sex","male","female","age","Date","getFullYear","format","includes","replace","toString","padStart","base","join","length","Error","compute"],"mappings":"AAAA,SAASA,UAAU,QAAQ,eAAe;AAC1C,SAASC,aAAa,QAAQ,kBAAkB;UAE/BC;+BACHC,WAAW,IAAIF;IAOrB,SAASG,MAAMC,CAAS;QAC9B,MAAMC,WAAWD,EAAEE,KAAK,CAAC,GAAG;QAC5B,MAAMC,YAAYH,EAAEE,KAAK,CAAC,GAAG;QAC7B,MAAME,WAAWC,SAASL,EAAEE,KAAK,CAAC,IAAI,KAAK;QAC3C,MAAMI,WAAWN,EAAEE,KAAK,CAAC,IAAI;QAC7B,MAAMK,QAAQT,2BAAAA,SAASU,QAAQ,CAACR;QAChC,MAAMS,MAAML,WAAW,MAAM,IAAI,SAAS;QAC1C,OAAO;YACNH;YACAE;YACAC;YACAE;YACAC;YACAE;YACAC,MAAMD,QAAQ;YACdE,QAAQF,QAAQ;YAChBG,KAAK,IAAIC,OAAOC,WAAW,KAAKT,SAASF,UAAUD,KAAK,CAAC,GAAG,IAAI;QACjE;IACD;IAvBA;;;GAGE,8BAEcH,QAAAA;IAoBT,SAASgB,OAAO,EACtBd,QAAQ,EACRE,SAAS,EACTC,QAAQ,EACRE,QAAQ,EAMR;QACA,IAAI,OAAOH,cAAc,UAAU;YAClCA,YAAYR,WAAWQ,WAAW;QACnC;QACA,IAAIA,UAAUa,QAAQ,CAAC,MAAM;YAC5Bb,YAAYA,UAAUc,OAAO,CAAC,MAAM;QACrC;QACA,OAAOb,aAAa,YAAaA,CAAAA,WAAWA,SAASc,QAAQ,EAAC;QAC9Dd,WAAWA,SAASe,QAAQ,CAAC,GAAG;QAChC,MAAMC,OAAO;YAACnB;YAAUE;YAAWC;SAAS,CAACiB,IAAI,CAAC;QAClD,IAAID,KAAKE,MAAM,KAAK,IAAI,MAAM,IAAIC,MAAM;QACxCjB,aAAaR,2BAAAA,SAAS0B,OAAO,CAACJ;QAC9B,OAAOA,OAAOd;IACf;+BAvBgBS,SAAAA;AAwBjB,GApDiBlB,+BAAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cn/UnifiedSocialCreditCode.ts"],"sourcesContent":["import { Mod31Checksum } from './Mod31Checksum';\n\n/**\n * 统一社会信用代码\n *\n * - GB 11714-1997 全国组织机构代码编制规则\n */\nexport namespace UnifiedSocialCreditCode {\n interface CodeValue {\n label: string;\n children?: Record<string, CodeValue>;\n }\n\n const CodeLabels: Record<string, CodeValue> = {\n 1: {\n label: '机构编制',\n children: {\n 1: { label: '机关' },\n 2: { label: '事业单位' },\n 3: { label: '中央编办直接管理机构编制的群众团体' },\n 9: { label: '其他' },\n },\n },\n 5: {\n label: '民政',\n children: {\n 1: { label: '社会团体' },\n 2: { label: '民办非企业单位' },\n 3: { label: '基金会' },\n 9: { label: '其他' },\n },\n },\n 9: {\n label: '工商',\n children: {\n 1: { label: '企业' },\n 2: { label: '个体工商户' },\n 3: { label: '农民专业合作社' },\n 9: { label: '其他' },\n },\n },\n Y: {\n label: '其他',\n children: {\n 1: { label: '其他' },\n },\n },\n };\n\n export const pattern = /^([159][1239]|Y1)[0-9]{6}[0-9A-HJ-NP-RTUWXY]{10}$/; // 无 I O Z S V\n\n export const Checksum = new Mod31Checksum();\n\n export function parse(s: string): ParsedUnifiedSocialCreditCode {\n let bureau = s[0];\n let subjectType = s[1];\n let division = s.slice(2, 8); // 第3~8位,共6位,正确\n let subject = s.slice(8, 17); // 第9~17位,共9位\n let checksum = s.slice(17, 18); // 第18位,校验码\n\n const labels: string[] = [];\n let l1 = CodeLabels[bureau];\n l1 && labels.push(l1?.label);\n let l2 = l1?.children?.[subjectType];\n l2 && labels.push(l2?.label);\n\n return {\n bureau,\n subjectType,\n division,\n subject,\n checksum,\n codes: [bureau, subjectType, division, subject],\n labels,\n };\n }\n\n export function format({\n bureau,\n subjectType,\n division,\n subject,\n checksum,\n }: {\n bureau: string;\n subjectType: string;\n division: string;\n subject: string;\n checksum?: string;\n }): string {\n const base = `${bureau}${subjectType}${division}${subject}`;\n checksum ||= Checksum.compute(base);\n return `${base}${checksum}`;\n }\n\n export function next(s: string, delta: number = 1) {\n const sp = s.split('').map((v) => Checksum.numbers[v]);\n for (let i = sp.length - 1; i >= 0; i--) {\n if ((delta > 0 && sp[i] < 30) || (delta < 0 && sp[i] > 0)) {\n sp[i] += delta;\n break;\n } else if (delta > 0 && sp[i] === 30) {\n sp[i] = 0;\n } else if (delta < 0 && sp[i] === 0) {\n sp[i] = 30;\n }\n }\n return sp.map((v) => Checksum.chars[v]).join('');\n }\n}\n\n/**\n * 解析后的统一社会信用代码信息\n */\ninterface ParsedUnifiedSocialCreditCode {\n /**\n * @title 登记管理部门代码\n * 对应统一社会信用代码的第1位字符,用于标识发证机构类别(登记管理部门)。\n */\n bureau: string;\n\n /**\n * @title 机构类别代码\n * 对应统一社会信用代码的第2位字符,用于标识被赋码主体的类型(如企业、事业单位、社会组织等)。\n */\n subjectType: string;\n\n /**\n * @title 登记管理机关行政区划代码\n * 对应统一社会信用代码的第3至第8位字符,用于标识该主体登记机关所在的行政区划。\n */\n division: string;\n\n /**\n * @title 主体标识码\n * 对应统一社会信用代码的第9至第17位字符,用于标识特定的市场主体或法人单位。\n */\n subject: string;\n\n /**\n * @title 校验码\n * 对应统一社会信用代码的最后一位字符,用特定算法计算,用于校验代码有效性。\n */\n checksum: string;\n\n codes: string[];\n labels: string[];\n}\n"],"names":["Mod31Checksum","UnifiedSocialCreditCode","CodeLabels","label","children","Y","pattern","Checksum","parse","s","bureau","subjectType","division","slice","subject","checksum","labels","l1","push","l2","codes","format","base","compute","next","delta","sp","split","map","v","numbers","i","length","chars","join"],"mappings":"AAAA,SAASA,aAAa,QAAQ,kBAAkB;UAO/BC;IAMf,MAAMC,aAAwC;QAC5C,GAAG;YACDC,OAAO;YACPC,UAAU;gBACR,GAAG;oBAAED,OAAO;gBAAK;gBACjB,GAAG;oBAAEA,OAAO;gBAAO;gBACnB,GAAG;oBAAEA,OAAO;gBAAoB;gBAChC,GAAG;oBAAEA,OAAO;gBAAK;YACnB;QACF;QACA,GAAG;YACDA,OAAO;YACPC,UAAU;gBACR,GAAG;oBAAED,OAAO;gBAAO;gBACnB,GAAG;oBAAEA,OAAO;gBAAU;gBACtB,GAAG;oBAAEA,OAAO;gBAAM;gBAClB,GAAG;oBAAEA,OAAO;gBAAK;YACnB;QACF;QACA,GAAG;YACDA,OAAO;YACPC,UAAU;gBACR,GAAG;oBAAED,OAAO;gBAAK;gBACjB,GAAG;oBAAEA,OAAO;gBAAQ;gBACpB,GAAG;oBAAEA,OAAO;gBAAU;gBACtB,GAAG;oBAAEA,OAAO;gBAAK;YACnB;QACF;QACAE,GAAG;YACDF,OAAO;YACPC,UAAU;gBACR,GAAG;oBAAED,OAAO;gBAAK;YACnB;QACF;IACF;4BAEaG,UAAU,qDAAqD,cAAc;4BAE7EC,WAAW,IAAIP;IAErB,SAASQ,MAAMC,CAAS;QAC7B,IAAIC,SAASD,CAAC,CAAC,EAAE;QACjB,IAAIE,cAAcF,CAAC,CAAC,EAAE;QACtB,IAAIG,WAAWH,EAAEI,KAAK,CAAC,GAAG,IAAI,eAAe;QAC7C,IAAIC,UAAUL,EAAEI,KAAK,CAAC,GAAG,KAAK,aAAa;QAC3C,IAAIE,WAAWN,EAAEI,KAAK,CAAC,IAAI,KAAK,WAAW;QAE3C,MAAMG,SAAmB,EAAE;QAC3B,IAAIC,KAAKf,UAAU,CAACQ,OAAO;QAC3BO,MAAMD,OAAOE,IAAI,CAACD,IAAId;QACtB,IAAIgB,KAAKF,IAAIb,UAAU,CAACO,YAAY;QACpCQ,MAAMH,OAAOE,IAAI,CAACC,IAAIhB;QAEtB,OAAO;YACLO;YACAC;YACAC;YACAE;YACAC;YACAK,OAAO;gBAACV;gBAAQC;gBAAaC;gBAAUE;aAAQ;YAC/CE;QACF;IACF;4BAtBgBR,QAAAA;IAwBT,SAASa,OAAO,EACrBX,MAAM,EACNC,WAAW,EACXC,QAAQ,EACRE,OAAO,EACPC,QAAQ,EAOT;QACC,MAAMO,OAAO,GAAGZ,SAASC,cAAcC,WAAWE,SAAS;QAC3DC,aAAaR,wBAAAA,SAASgB,OAAO,CAACD;QAC9B,OAAO,GAAGA,OAAOP,UAAU;IAC7B;4BAhBgBM,SAAAA;IAkBT,SAASG,KAAKf,CAAS,EAAEgB,QAAgB,CAAC;QAC/C,MAAMC,KAAKjB,EAAEkB,KAAK,CAAC,IAAIC,GAAG,CAAC,CAACC,IAAMtB,wBAAAA,SAASuB,OAAO,CAACD,EAAE;QACrD,IAAK,IAAIE,IAAIL,GAAGM,MAAM,GAAG,GAAGD,KAAK,GAAGA,IAAK;YACvC,IAAI,AAACN,QAAQ,KAAKC,EAAE,CAACK,EAAE,GAAG,MAAQN,QAAQ,KAAKC,EAAE,CAACK,EAAE,GAAG,GAAI;gBACzDL,EAAE,CAACK,EAAE,IAAIN;gBACT;YACF,OAAO,IAAIA,QAAQ,KAAKC,EAAE,CAACK,EAAE,KAAK,IAAI;gBACpCL,EAAE,CAACK,EAAE,GAAG;YACV,OAAO,IAAIN,QAAQ,KAAKC,EAAE,CAACK,EAAE,KAAK,GAAG;gBACnCL,EAAE,CAACK,EAAE,GAAG;YACV;QACF;QACA,OAAOL,GAAGE,GAAG,CAAC,CAACC,IAAMtB,wBAAAA,SAAS0B,KAAK,CAACJ,EAAE,EAAEK,IAAI,CAAC;IAC/C;4BAbgBV,OAAAA;AAclB,GAtGiBvB,4BAAAA"}
1
+ {"version":3,"sources":["../../src/cn/UnifiedSocialCreditCode.ts"],"sourcesContent":["import { Mod31Checksum } from './Mod31Checksum';\n\n/**\n * 统一社会信用代码\n *\n * - GB 11714-1997 全国组织机构代码编制规则\n */\nexport namespace UnifiedSocialCreditCode {\n\tinterface CodeValue {\n\t\tlabel: string;\n\t\tchildren?: Record<string, CodeValue>;\n\t}\n\n\tconst CodeLabels: Record<string, CodeValue> = {\n\t\t1: {\n\t\t\tlabel: '机构编制',\n\t\t\tchildren: {\n\t\t\t\t1: { label: '机关' },\n\t\t\t\t2: { label: '事业单位' },\n\t\t\t\t3: { label: '中央编办直接管理机构编制的群众团体' },\n\t\t\t\t9: { label: '其他' },\n\t\t\t},\n\t\t},\n\t\t5: {\n\t\t\tlabel: '民政',\n\t\t\tchildren: {\n\t\t\t\t1: { label: '社会团体' },\n\t\t\t\t2: { label: '民办非企业单位' },\n\t\t\t\t3: { label: '基金会' },\n\t\t\t\t9: { label: '其他' },\n\t\t\t},\n\t\t},\n\t\t9: {\n\t\t\tlabel: '工商',\n\t\t\tchildren: {\n\t\t\t\t1: { label: '企业' },\n\t\t\t\t2: { label: '个体工商户' },\n\t\t\t\t3: { label: '农民专业合作社' },\n\t\t\t\t9: { label: '其他' },\n\t\t\t},\n\t\t},\n\t\tY: { label: '其他', children: { 1: { label: '其他' } } },\n\t};\n\n\texport const pattern = /^([159][1239]|Y1)[0-9]{6}[0-9A-HJ-NP-RTUWXY]{10}$/; // 无 I O Z S V\n\n\texport const Checksum = new Mod31Checksum();\n\n\texport function parse(s: string): ParsedUnifiedSocialCreditCode {\n\t\tlet bureau = s[0];\n\t\tlet subjectType = s[1];\n\t\tlet division = s.slice(2, 8); // 第3~8位,共6位,正确\n\t\tlet subject = s.slice(8, 17); // 第9~17位,共9位\n\t\tlet checksum = s.slice(17, 18); // 第18位,校验码\n\n\t\tconst labels: string[] = [];\n\t\tlet l1 = CodeLabels[bureau];\n\t\tl1 && labels.push(l1?.label);\n\t\tlet l2 = l1?.children?.[subjectType];\n\t\tl2 && labels.push(l2?.label);\n\n\t\treturn {\n\t\t\tbureau,\n\t\t\tsubjectType,\n\t\t\tdivision,\n\t\t\tsubject,\n\t\t\tchecksum,\n\t\t\tcodes: [bureau, subjectType, division, subject],\n\t\t\tlabels,\n\t\t};\n\t}\n\n\texport function format({\n\t\tbureau,\n\t\tsubjectType,\n\t\tdivision,\n\t\tsubject,\n\t\tchecksum,\n\t}: {\n\t\tbureau: string;\n\t\tsubjectType: string;\n\t\tdivision: string;\n\t\tsubject: string;\n\t\tchecksum?: string;\n\t}): string {\n\t\tconst base = `${bureau}${subjectType}${division}${subject}`;\n\t\tchecksum ||= Checksum.compute(base);\n\t\treturn `${base}${checksum}`;\n\t}\n\n\texport function next(s: string, delta: number = 1) {\n\t\tconst sp = s.split('').map((v) => Checksum.numbers[v]);\n\t\tfor (let i = sp.length - 1; i >= 0; i--) {\n\t\t\tif ((delta > 0 && sp[i] < 30) || (delta < 0 && sp[i] > 0)) {\n\t\t\t\tsp[i] += delta;\n\t\t\t\tbreak;\n\t\t\t} else if (delta > 0 && sp[i] === 30) {\n\t\t\t\tsp[i] = 0;\n\t\t\t} else if (delta < 0 && sp[i] === 0) {\n\t\t\t\tsp[i] = 30;\n\t\t\t}\n\t\t}\n\t\treturn sp.map((v) => Checksum.chars[v]).join('');\n\t}\n}\n\n/**\n * 解析后的统一社会信用代码信息\n */\ninterface ParsedUnifiedSocialCreditCode {\n\t/**\n\t * @title 登记管理部门代码\n\t * 对应统一社会信用代码的第1位字符,用于标识发证机构类别(登记管理部门)。\n\t */\n\tbureau: string;\n\n\t/**\n\t * @title 机构类别代码\n\t * 对应统一社会信用代码的第2位字符,用于标识被赋码主体的类型(如企业、事业单位、社会组织等)。\n\t */\n\tsubjectType: string;\n\n\t/**\n\t * @title 登记管理机关行政区划代码\n\t * 对应统一社会信用代码的第3至第8位字符,用于标识该主体登记机关所在的行政区划。\n\t */\n\tdivision: string;\n\n\t/**\n\t * @title 主体标识码\n\t * 对应统一社会信用代码的第9至第17位字符,用于标识特定的市场主体或法人单位。\n\t */\n\tsubject: string;\n\n\t/**\n\t * @title 校验码\n\t * 对应统一社会信用代码的最后一位字符,用特定算法计算,用于校验代码有效性。\n\t */\n\tchecksum: string;\n\n\tcodes: string[];\n\tlabels: string[];\n}\n"],"names":["Mod31Checksum","UnifiedSocialCreditCode","CodeLabels","label","children","Y","pattern","Checksum","parse","s","bureau","subjectType","division","slice","subject","checksum","labels","l1","push","l2","codes","format","base","compute","next","delta","sp","split","map","v","numbers","i","length","chars","join"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cn/formatDate.ts"],"sourcesContent":["export function 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":["formatDate","date","format","year","getFullYear","month","getMonth","toString","padStart","day","getDate","Error"],"mappings":"AAAA,OAAO,SAASA,WAAWC,IAAU,EAAEC,MAAkB;IACvD,OAAQA;QACN,KAAK;YAAY;gBACf,MAAMC,OAAOF,KAAKG,WAAW;gBAC7B,MAAMC,QAAQ,AAACJ,CAAAA,KAAKK,QAAQ,KAAK,CAAA,EAAGC,QAAQ,GAAGC,QAAQ,CAAC,GAAG;gBAC3D,MAAMC,MAAMR,KAAKS,OAAO,GAAGH,QAAQ,GAAGC,QAAQ,CAAC,GAAG;gBAClD,OAAO,GAAGL,OAAOE,QAAQI,KAAK;YAChC;QACA;YACE,MAAM,IAAIE,MAAM,CAAC,cAAc,CAAC;IACpC;AACF"}
1
+ {"version":3,"sources":["../../src/cn/formatDate.ts"],"sourcesContent":["export function formatDate(date: Date, format: 'yyyyMMDD') {\n\tswitch (format) {\n\t\tcase 'yyyyMMDD': {\n\t\t\tconst year = date.getFullYear();\n\t\t\tconst month = (date.getMonth() + 1).toString().padStart(2, '0');\n\t\t\tconst day = date.getDate().toString().padStart(2, '0');\n\t\t\treturn `${year}${month}${day}`;\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(`Invalid format`);\n\t}\n}\n"],"names":["formatDate","date","format","year","getFullYear","month","getMonth","toString","padStart","day","getDate","Error"],"mappings":"AAAA,OAAO,SAASA,WAAWC,IAAU,EAAEC,MAAkB;IACxD,OAAQA;QACP,KAAK;YAAY;gBAChB,MAAMC,OAAOF,KAAKG,WAAW;gBAC7B,MAAMC,QAAQ,AAACJ,CAAAA,KAAKK,QAAQ,KAAK,CAAA,EAAGC,QAAQ,GAAGC,QAAQ,CAAC,GAAG;gBAC3D,MAAMC,MAAMR,KAAKS,OAAO,GAAGH,QAAQ,GAAGC,QAAQ,CAAC,GAAG;gBAClD,OAAO,GAAGL,OAAOE,QAAQI,KAAK;YAC/B;QACA;YACC,MAAM,IAAIE,MAAM,CAAC,cAAc,CAAC;IAClC;AACD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cn/parseSex.ts"],"sourcesContent":["export function parseSex(s: string):\n | undefined\n | {\n sex: 'Male' | 'Female';\n male: boolean;\n female: boolean;\n } {\n if (!s) return undefined;\n\n switch (s.toLowerCase()) {\n case '男':\n case 'male':\n return {\n sex: 'Male',\n male: true,\n female: false,\n };\n case '女':\n case 'female':\n return {\n sex: 'Female',\n male: false,\n female: true,\n };\n }\n return undefined;\n}\n"],"names":["parseSex","s","undefined","toLowerCase","sex","male","female"],"mappings":"AAAA,OAAO,SAASA,SAASC,CAAS;IAOhC,IAAI,CAACA,GAAG,OAAOC;IAEf,OAAQD,EAAEE,WAAW;QACnB,KAAK;QACL,KAAK;YACH,OAAO;gBACLC,KAAK;gBACLC,MAAM;gBACNC,QAAQ;YACV;QACF,KAAK;QACL,KAAK;YACH,OAAO;gBACLF,KAAK;gBACLC,MAAM;gBACNC,QAAQ;YACV;IACJ;IACA,OAAOJ;AACT"}
1
+ {"version":3,"sources":["../../src/cn/parseSex.ts"],"sourcesContent":["export function parseSex(s: string): undefined | { sex: 'Male' | 'Female'; male: boolean; female: boolean } {\n\tif (!s) return undefined;\n\n\tswitch (s.toLowerCase()) {\n\t\tcase '男':\n\t\tcase 'male':\n\t\t\treturn { sex: 'Male', male: true, female: false };\n\t\tcase '女':\n\t\tcase 'female':\n\t\t\treturn { sex: 'Female', male: false, female: true };\n\t}\n\treturn undefined;\n}\n"],"names":["parseSex","s","undefined","toLowerCase","sex","male","female"],"mappings":"AAAA,OAAO,SAASA,SAASC,CAAS;IACjC,IAAI,CAACA,GAAG,OAAOC;IAEf,OAAQD,EAAEE,WAAW;QACpB,KAAK;QACL,KAAK;YACJ,OAAO;gBAAEC,KAAK;gBAAQC,MAAM;gBAAMC,QAAQ;YAAM;QACjD,KAAK;QACL,KAAK;YACJ,OAAO;gBAAEF,KAAK;gBAAUC,MAAM;gBAAOC,QAAQ;YAAK;IACpD;IACA,OAAOJ;AACR"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cn/types.d.ts"],"sourcesContent":["/**\n * 居民身份证\n *\n * @see https://en.wikipedia.org/wiki/Resident_Identity_Card\n * @see https://en.wikipedia.org/wiki/Foreign_Permanent_Resident_ID_Card\n */\nexport interface ResidentIdentityCardInfo {\n /**\n * @title 姓名\n */\n name: string;\n /**\n * @title 性别\n */\n sex: 'Male' | 'Female';\n /**\n * @title 民族\n * 例如 '汉'/'满'/'回'\n */\n ethnicity: string;\n /**\n * @title 出生日期\n * @format date\n */\n birthDate: string;\n /**\n * @title 地址\n *\n * - 通常为 domicile/户籍地\n */\n address: string;\n /**\n * @title 身份证号\n */\n identityCardNumber: string;\n /**\n * @title 签发机关\n */\n issuer: string;\n /**\n * @title 有效期开始日期\n * @format date\n */\n validStartDate: string;\n /**\n * @title 有效期结束日期\n * @format date\n * @description 如长期有效则为 空\n */\n validEndDate?: string;\n}\n"],"names":[],"mappings":"AAAA;;;;;CAKC,GACD,WA4CC"}
1
+ {"version":3,"sources":["../../src/cn/types.d.ts"],"sourcesContent":["/**\n * 居民身份证\n *\n * @see https://en.wikipedia.org/wiki/Resident_Identity_Card\n * @see https://en.wikipedia.org/wiki/Foreign_Permanent_Resident_ID_Card\n */\nexport interface ResidentIdentityCardInfo {\n\t/**\n\t * @title 姓名\n\t */\n\tname: string;\n\t/**\n\t * @title 性别\n\t */\n\tsex: 'Male' | 'Female';\n\t/**\n\t * @title 民族\n\t * 例如 '汉'/'满'/'回'\n\t */\n\tethnicity: string;\n\t/**\n\t * @title 出生日期\n\t * @format date\n\t */\n\tbirthDate: string;\n\t/**\n\t * @title 地址\n\t *\n\t * - 通常为 domicile/户籍地\n\t */\n\taddress: string;\n\t/**\n\t * @title 身份证号\n\t */\n\tidentityCardNumber: string;\n\t/**\n\t * @title 签发机关\n\t */\n\tissuer: string;\n\t/**\n\t * @title 有效期开始日期\n\t * @format date\n\t */\n\tvalidStartDate: string;\n\t/**\n\t * @title 有效期结束日期\n\t * @format date\n\t * @description 如长期有效则为 空\n\t */\n\tvalidEndDate?: string;\n}\n"],"names":[],"mappings":"AAAA;;;;;CAKC,GACD,WA4CC"}
@@ -0,0 +1,15 @@
1
+ export function formatSort(s) {
2
+ return s.map(({ field, order, nulls })=>{
3
+ if (!field) return '';
4
+ let r = field;
5
+ if (order) {
6
+ r += ` ${order}`;
7
+ }
8
+ if (nulls) {
9
+ r += ` nulls ${nulls}`;
10
+ }
11
+ return r;
12
+ }).filter(Boolean);
13
+ }
14
+
15
+ //# sourceMappingURL=formatSort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/data/formatSort.ts"],"sourcesContent":["import type { SortRule } from './parseSort';\n\nexport function formatSort(s: SortRule[]): string[] {\n\treturn s\n\t\t.map(({ field, order, nulls }) => {\n\t\t\tif (!field) return '';\n\n\t\t\tlet r = field;\n\t\t\tif (order) {\n\t\t\t\tr += ` ${order}`;\n\t\t\t}\n\t\t\tif (nulls) {\n\t\t\t\tr += ` nulls ${nulls}`;\n\t\t\t}\n\t\t\treturn r;\n\t\t})\n\t\t.filter(Boolean);\n}\n"],"names":["formatSort","s","map","field","order","nulls","r","filter","Boolean"],"mappings":"AAEA,OAAO,SAASA,WAAWC,CAAa;IACvC,OAAOA,EACLC,GAAG,CAAC,CAAC,EAAEC,KAAK,EAAEC,KAAK,EAAEC,KAAK,EAAE;QAC5B,IAAI,CAACF,OAAO,OAAO;QAEnB,IAAIG,IAAIH;QACR,IAAIC,OAAO;YACVE,KAAK,CAAC,CAAC,EAAEF,OAAO;QACjB;QACA,IAAIC,OAAO;YACVC,KAAK,CAAC,OAAO,EAAED,OAAO;QACvB;QACA,OAAOC;IACR,GACCC,MAAM,CAACC;AACV"}
@@ -0,0 +1,4 @@
1
+ export { resolvePagination } from "./resolvePagination.js";
2
+ export { parseSort } from "./parseSort.js";
3
+ export { formatSort } from "./formatSort.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/data/index.ts"],"sourcesContent":["export type * from './types';\n\nexport { resolvePagination, type PaginationInput, type ResolvedPagination } from './resolvePagination';\nexport { parseSort, type SortRule } from './parseSort';\nexport { formatSort } from './formatSort';\n"],"names":["resolvePagination","parseSort","formatSort"],"mappings":"AAEA,SAASA,iBAAiB,QAAuD,sBAAsB;AACvG,SAASC,SAAS,QAAuB,cAAc;AACvD,SAASC,UAAU,QAAQ,eAAe"}
@@ -0,0 +1,22 @@
1
+ export function maybeNumber(v) {
2
+ if (v === null || v === undefined) {
3
+ return undefined;
4
+ }
5
+ switch(typeof v){
6
+ case 'number':
7
+ return v;
8
+ case 'bigint':
9
+ return Number(v);
10
+ case 'string':
11
+ if (v === '') {
12
+ return undefined;
13
+ }
14
+ }
15
+ const n = Number(v);
16
+ if (isNaN(n)) {
17
+ return undefined;
18
+ }
19
+ return n;
20
+ }
21
+
22
+ //# sourceMappingURL=maybeNumber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/data/maybeNumber.ts"],"sourcesContent":["export type MaybeNumber = number | null | string | undefined | bigint;\n\nexport function maybeNumber(v: MaybeNumber) {\n\tif (v === null || v === undefined) {\n\t\treturn undefined;\n\t}\n\n\tswitch (typeof v) {\n\t\tcase 'number':\n\t\t\treturn v;\n\t\tcase 'bigint':\n\t\t\treturn Number(v);\n\t\tcase 'string':\n\t\t\tif (v === '') {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t}\n\tconst n = Number(v);\n\tif (isNaN(n)) {\n\t\treturn undefined;\n\t}\n\treturn n;\n}\n"],"names":["maybeNumber","v","undefined","Number","n","isNaN"],"mappings":"AAEA,OAAO,SAASA,YAAYC,CAAc;IACzC,IAAIA,MAAM,QAAQA,MAAMC,WAAW;QAClC,OAAOA;IACR;IAEA,OAAQ,OAAOD;QACd,KAAK;YACJ,OAAOA;QACR,KAAK;YACJ,OAAOE,OAAOF;QACf,KAAK;YACJ,IAAIA,MAAM,IAAI;gBACb,OAAOC;YACR;IACF;IACA,MAAME,IAAID,OAAOF;IACjB,IAAII,MAAMD,IAAI;QACb,OAAOF;IACR;IACA,OAAOE;AACR"}
@@ -0,0 +1,95 @@
1
+ import { arrayOfMaybeArray } from "@wener/utils";
2
+ /**
3
+ * Parses various format of sort specifications into standardized SortRule objects
4
+ *
5
+ * Supported formats:
6
+ * - "field asc|desc"
7
+ * - "field asc|desc nulls first|last"
8
+ * - "+field" for ascending, "-field" for descending
9
+ * - Object notation: { field: string, order?: string, nulls?: string }
10
+ *
11
+ * @example
12
+ * parseSort('name desc') // [{ field: 'name', order: 'desc' }]
13
+ * parseSort('+name,-age') // [{ field: 'name', order: 'asc' }, { field: 'age', order: 'desc' }]
14
+ * parseSort('name asc nulls last') // [{ field: 'name', order: 'asc', nulls: 'last' }]
15
+ * parseSort([{ field: 'name' }]) // [{ field: 'name', order: 'asc' }]
16
+ */ export function parseSort(order) {
17
+ if (!order) {
18
+ return [];
19
+ }
20
+ return arrayOfMaybeArray(order).flatMap((v)=>{
21
+ if (!v) return [];
22
+ if (typeof v === 'object') {
23
+ if (!v.field) {
24
+ return [];
25
+ }
26
+ const rule = {
27
+ field: v.field,
28
+ order: normalizeOrder(v.order)
29
+ };
30
+ if (v.nulls) {
31
+ rule.nulls = normalizeNulls(v.nulls);
32
+ }
33
+ return rule;
34
+ }
35
+ return v.split(',').map((v)=>v.trim()).filter(Boolean).map(_parse);
36
+ });
37
+ }
38
+ /**
39
+ * Normalizes order values to 'asc' or 'desc'
40
+ */ function normalizeOrder(order) {
41
+ return order?.toLowerCase() === 'asc' ? 'asc' : 'desc';
42
+ }
43
+ /**
44
+ * Normalizes nulls values to 'last' or 'first'
45
+ */ function normalizeNulls(nulls) {
46
+ return nulls?.toLowerCase() === 'last' ? 'last' : 'first';
47
+ }
48
+ function _parse(v) {
49
+ const sp = v.split(/\s+/);
50
+ let field = '';
51
+ let order;
52
+ let nulls;
53
+ // Handle first token which should be the field name (possibly with +/- prefix)
54
+ const f = sp.shift();
55
+ if (!f) return {
56
+ field: '',
57
+ order: 'asc'
58
+ }; // Defensive programming
59
+ if (f.startsWith('-') || f.startsWith('+')) {
60
+ field = f.slice(1).trim();
61
+ order = f.startsWith('-') ? 'desc' : 'asc';
62
+ } else {
63
+ field = f.trim();
64
+ }
65
+ // Process remaining tokens
66
+ while(sp.length > 0){
67
+ const token = sp.shift()?.trim()?.toLowerCase();
68
+ if (!token) continue;
69
+ switch(token){
70
+ case 'asc':
71
+ case 'desc':
72
+ order = token;
73
+ break;
74
+ case 'nulls':
75
+ nulls = sp.shift()?.trim()?.toLowerCase() === 'last' ? 'last' : 'first';
76
+ break;
77
+ case 'last':
78
+ case 'first':
79
+ nulls = token;
80
+ break;
81
+ }
82
+ }
83
+ order ||= 'asc';
84
+ // Only include nulls if specified
85
+ return nulls ? {
86
+ field,
87
+ order,
88
+ nulls
89
+ } : {
90
+ field,
91
+ order
92
+ };
93
+ }
94
+
95
+ //# sourceMappingURL=parseSort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/data/parseSort.ts"],"sourcesContent":["import { arrayOfMaybeArray, type MaybeArray } from '@wener/utils';\n\nexport type SortRule = { field: string; order: 'asc' | 'desc'; nulls?: 'last' | 'first' };\n\n/**\n * Parses various format of sort specifications into standardized SortRule objects\n *\n * Supported formats:\n * - \"field asc|desc\"\n * - \"field asc|desc nulls first|last\"\n * - \"+field\" for ascending, \"-field\" for descending\n * - Object notation: { field: string, order?: string, nulls?: string }\n *\n * @example\n * parseSort('name desc') // [{ field: 'name', order: 'desc' }]\n * parseSort('+name,-age') // [{ field: 'name', order: 'asc' }, { field: 'age', order: 'desc' }]\n * parseSort('name asc nulls last') // [{ field: 'name', order: 'asc', nulls: 'last' }]\n * parseSort([{ field: 'name' }]) // [{ field: 'name', order: 'asc' }]\n */\nexport function parseSort(\n\torder: MaybeArray<{ field?: string; order?: string; nulls?: string } | string> | undefined | null,\n): SortRule[] {\n\tif (!order) {\n\t\treturn [];\n\t}\n\n\treturn arrayOfMaybeArray(order).flatMap((v): MaybeArray<SortRule> => {\n\t\tif (!v) return [];\n\t\tif (typeof v === 'object') {\n\t\t\tif (!v.field) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst rule: SortRule = {\n\t\t\t\tfield: v.field,\n\t\t\t\torder: normalizeOrder(v.order),\n\t\t\t};\n\n\t\t\tif (v.nulls) {\n\t\t\t\trule.nulls = normalizeNulls(v.nulls);\n\t\t\t}\n\t\t\treturn rule;\n\t\t}\n\t\treturn v\n\t\t\t.split(',')\n\t\t\t.map((v) => v.trim())\n\t\t\t.filter(Boolean)\n\t\t\t.map(_parse);\n\t});\n}\n\n/**\n * Normalizes order values to 'asc' or 'desc'\n */\nfunction normalizeOrder(order?: string): SortRule['order'] {\n\treturn order?.toLowerCase() === 'asc' ? 'asc' : 'desc';\n}\n\n/**\n * Normalizes nulls values to 'last' or 'first'\n */\nfunction normalizeNulls(nulls?: string): SortRule['nulls'] {\n\treturn nulls?.toLowerCase() === 'last' ? 'last' : 'first';\n}\n\nfunction _parse(v: string): SortRule {\n\tconst sp = v.split(/\\s+/);\n\tlet field = '';\n\tlet order: SortRule['order'];\n\tlet nulls: SortRule['nulls'];\n\n\t// Handle first token which should be the field name (possibly with +/- prefix)\n\tconst f = sp.shift();\n\tif (!f) return { field: '', order: 'asc' }; // Defensive programming\n\n\tif (f.startsWith('-') || f.startsWith('+')) {\n\t\tfield = f.slice(1).trim();\n\t\torder = f.startsWith('-') ? 'desc' : 'asc';\n\t} else {\n\t\tfield = f.trim();\n\t}\n\n\t// Process remaining tokens\n\twhile (sp.length > 0) {\n\t\tconst token = sp.shift()?.trim()?.toLowerCase();\n\t\tif (!token) continue;\n\n\t\tswitch (token) {\n\t\t\tcase 'asc':\n\t\t\tcase 'desc':\n\t\t\t\torder = token;\n\t\t\t\tbreak;\n\n\t\t\tcase 'nulls':\n\t\t\t\tnulls = sp.shift()?.trim()?.toLowerCase() === 'last' ? 'last' : 'first';\n\t\t\t\tbreak;\n\n\t\t\tcase 'last':\n\t\t\tcase 'first':\n\t\t\t\tnulls = token;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\torder ||= 'asc';\n\n\t// Only include nulls if specified\n\treturn nulls ? { field, order, nulls } : { field, order };\n}\n"],"names":["arrayOfMaybeArray","parseSort","order","flatMap","v","field","rule","normalizeOrder","nulls","normalizeNulls","split","map","trim","filter","Boolean","_parse","toLowerCase","sp","f","shift","startsWith","slice","length","token"],"mappings":"AAAA,SAASA,iBAAiB,QAAyB,eAAe;AAIlE;;;;;;;;;;;;;;CAcC,GACD,OAAO,SAASC,UACfC,KAAiG;IAEjG,IAAI,CAACA,OAAO;QACX,OAAO,EAAE;IACV;IAEA,OAAOF,kBAAkBE,OAAOC,OAAO,CAAC,CAACC;QACxC,IAAI,CAACA,GAAG,OAAO,EAAE;QACjB,IAAI,OAAOA,MAAM,UAAU;YAC1B,IAAI,CAACA,EAAEC,KAAK,EAAE;gBACb,OAAO,EAAE;YACV;YACA,MAAMC,OAAiB;gBACtBD,OAAOD,EAAEC,KAAK;gBACdH,OAAOK,eAAeH,EAAEF,KAAK;YAC9B;YAEA,IAAIE,EAAEI,KAAK,EAAE;gBACZF,KAAKE,KAAK,GAAGC,eAAeL,EAAEI,KAAK;YACpC;YACA,OAAOF;QACR;QACA,OAAOF,EACLM,KAAK,CAAC,KACNC,GAAG,CAAC,CAACP,IAAMA,EAAEQ,IAAI,IACjBC,MAAM,CAACC,SACPH,GAAG,CAACI;IACP;AACD;AAEA;;CAEC,GACD,SAASR,eAAeL,KAAc;IACrC,OAAOA,OAAOc,kBAAkB,QAAQ,QAAQ;AACjD;AAEA;;CAEC,GACD,SAASP,eAAeD,KAAc;IACrC,OAAOA,OAAOQ,kBAAkB,SAAS,SAAS;AACnD;AAEA,SAASD,OAAOX,CAAS;IACxB,MAAMa,KAAKb,EAAEM,KAAK,CAAC;IACnB,IAAIL,QAAQ;IACZ,IAAIH;IACJ,IAAIM;IAEJ,+EAA+E;IAC/E,MAAMU,IAAID,GAAGE,KAAK;IAClB,IAAI,CAACD,GAAG,OAAO;QAAEb,OAAO;QAAIH,OAAO;IAAM,GAAG,wBAAwB;IAEpE,IAAIgB,EAAEE,UAAU,CAAC,QAAQF,EAAEE,UAAU,CAAC,MAAM;QAC3Cf,QAAQa,EAAEG,KAAK,CAAC,GAAGT,IAAI;QACvBV,QAAQgB,EAAEE,UAAU,CAAC,OAAO,SAAS;IACtC,OAAO;QACNf,QAAQa,EAAEN,IAAI;IACf;IAEA,2BAA2B;IAC3B,MAAOK,GAAGK,MAAM,GAAG,EAAG;QACrB,MAAMC,QAAQN,GAAGE,KAAK,IAAIP,QAAQI;QAClC,IAAI,CAACO,OAAO;QAEZ,OAAQA;YACP,KAAK;YACL,KAAK;gBACJrB,QAAQqB;gBACR;YAED,KAAK;gBACJf,QAAQS,GAAGE,KAAK,IAAIP,QAAQI,kBAAkB,SAAS,SAAS;gBAChE;YAED,KAAK;YACL,KAAK;gBACJR,QAAQe;gBACR;QACF;IACD;IAEArB,UAAU;IAEV,kCAAkC;IAClC,OAAOM,QAAQ;QAAEH;QAAOH;QAAOM;IAAM,IAAI;QAAEH;QAAOH;IAAM;AACzD"}
@@ -0,0 +1,36 @@
1
+ import { maybeFunction } from "@wener/utils";
2
+ import { clamp, mapValues, omitBy, pick } from "es-toolkit";
3
+ import { maybeNumber } from "./maybeNumber.js";
4
+ export function resolvePagination(page, options = {}) {
5
+ let out = omitBy(mapValues(//
6
+ pick(page, [
7
+ "limit",
8
+ "offset",
9
+ "pageSize",
10
+ "pageNumber",
11
+ "pageIndex"
12
+ ]), // to Number
13
+ (v) => maybeNumber(v)), (v) => v === undefined || v === null);
14
+ let { pageSize } = out;
15
+ if (options.pageSize) {
16
+ pageSize = maybeFunction(options.pageSize, pageSize);
17
+ }
18
+ pageSize ??= 20;
19
+ pageSize = clamp(pageSize, 1, options.maxPageSize ?? 100);
20
+ let { pageNumber = 1, pageIndex, limit, offset } = out;
21
+ // page index over page number
22
+ pageNumber = Math.max(pageNumber, 1);
23
+ pageIndex = Math.max(pageIndex ?? pageNumber - 1, 0);
24
+ limit = Math.max(1, limit ?? pageSize);
25
+ offset = Math.max(0, offset ?? pageSize * pageIndex);
26
+ pageSize = limit;
27
+ pageIndex = Math.floor(offset / pageSize);
28
+ return {
29
+ limit,
30
+ offset,
31
+ pageSize,
32
+ pageNumber: pageIndex + 1,
33
+ pageIndex
34
+ };
35
+ }
36
+ //# sourceMappingURL=resolvePagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/data/resolvePagination.ts"],"sourcesContent":["import { maybeFunction, type MaybeFunction } from '@wener/utils';\nimport { clamp, mapValues, omitBy, pick } from 'es-toolkit';\nimport { maybeNumber, type MaybeNumber } from './maybeNumber';\n\nexport type PaginationInput = {\n\tlimit?: MaybeNumber;\n\toffset?: MaybeNumber;\n\tpageSize?: MaybeNumber;\n\tpageNumber?: MaybeNumber;\n\tpageIndex?: MaybeNumber;\n};\n\nexport type ResolvedPagination = {\n\tlimit: number;\n\toffset: number;\n\tpageSize: number;\n\tpageNumber: number;\n\tpageIndex: number;\n};\n\nexport function resolvePagination(\n\tpage: PaginationInput,\n\toptions: {\n\t\tpageSize?: MaybeFunction<number, [number | undefined]>;\n\t\tmaxPageSize?: number;\n\t} = {},\n): ResolvedPagination {\n\tlet out = omitBy(\n\t\tmapValues(\n\t\t\t//\n\t\t\tpick(page, ['limit', 'offset', 'pageSize', 'pageNumber', 'pageIndex']),\n\t\t\t// to Number\n\t\t\t(v) => maybeNumber(v),\n\t\t),\n\t\t(v) => v === undefined || v === null,\n\t);\n\tlet { pageSize } = out;\n\tif (options.pageSize) {\n\t\tpageSize = maybeFunction(options.pageSize, pageSize);\n\t}\n\tpageSize ??= 20;\n\tpageSize = clamp(pageSize, 1, options.maxPageSize ?? 100);\n\n\tlet { pageNumber = 1, pageIndex, limit, offset } = out;\n\t// page index over page number\n\tpageNumber = Math.max(pageNumber, 1);\n\tpageIndex = Math.max(pageIndex ?? pageNumber - 1, 0);\n\tlimit = Math.max(1, limit ?? pageSize);\n\toffset = Math.max(0, offset ?? pageSize * pageIndex);\n\n\tpageSize = limit;\n\tpageIndex = Math.floor(offset / pageSize);\n\treturn {\n\t\tlimit,\n\t\toffset,\n\t\tpageSize,\n\t\tpageNumber: pageIndex + 1,\n\t\tpageIndex,\n\t};\n}\n"],"names":["maybeFunction","clamp","mapValues","omitBy","pick","maybeNumber","resolvePagination","page","options","out","v","undefined","pageSize","maxPageSize","pageNumber","pageIndex","limit","offset","Math","max","floor"],"mappings":"AAAA,SAASA,aAAa,QAA4B,eAAe;AACjE,SAASC,KAAK,EAAEC,SAAS,EAAEC,MAAM,EAAEC,IAAI,QAAQ,aAAa;AAC5D,SAASC,WAAW,QAA0B,gBAAgB;AAkB9D,OAAO,SAASC,kBACfC,IAAqB,EACrBC,UAGI,CAAC,CAAC;IAEN,IAAIC,MAAMN,OACTD,UACC,EAAE;IACFE,KAAKG,MAAM;QAAC;QAAS;QAAU;QAAY;QAAc;KAAY,GACrE,YAAY;IACZ,CAACG,IAAML,YAAYK,KAEpB,CAACA,IAAMA,MAAMC,aAAaD,MAAM;IAEjC,IAAI,EAAEE,QAAQ,EAAE,GAAGH;IACnB,IAAID,QAAQI,QAAQ,EAAE;QACrBA,WAAWZ,cAAcQ,QAAQI,QAAQ,EAAEA;IAC5C;IACAA,aAAa;IACbA,WAAWX,MAAMW,UAAU,GAAGJ,QAAQK,WAAW,IAAI;IAErD,IAAI,EAAEC,aAAa,CAAC,EAAEC,SAAS,EAAEC,KAAK,EAAEC,MAAM,EAAE,GAAGR;IACnD,8BAA8B;IAC9BK,aAAaI,KAAKC,GAAG,CAACL,YAAY;IAClCC,YAAYG,KAAKC,GAAG,CAACJ,aAAaD,aAAa,GAAG;IAClDE,QAAQE,KAAKC,GAAG,CAAC,GAAGH,SAASJ;IAC7BK,SAASC,KAAKC,GAAG,CAAC,GAAGF,UAAUL,WAAWG;IAE1CH,WAAWI;IACXD,YAAYG,KAAKE,KAAK,CAACH,SAASL;IAChC,OAAO;QACNI;QACAC;QACAL;QACAE,YAAYC,YAAY;QACxBA;IACD;AACD"}
@@ -0,0 +1,3 @@
1
+ export { };
2
+
3
+ //# sourceMappingURL=types.d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/data/types.d.ts"],"sourcesContent":["export type ListQueryInput = {\n\t/** Filter string */\n\tfilter?: string;\n\t/** Filter array */\n\tfilters?: string[];\n\t/** Filter by IDs */\n\tids?: string[];\n\t/** Search query */\n\tsearch?: string;\n\t/** Items per page */\n\tlimit?: number;\n\t/** Offset for pagination */\n\toffset?: number;\n\t/** Ordering criteria */\n\torder?: string[];\n\t/** Page index (0-based) */\n\tpageIndex?: number;\n\t/** Page number (1-based) */\n\tpageNumber?: number;\n\t/** Items per page */\n\tpageSize?: number;\n\t/** Cursor for pagination */\n\tcursor?: string;\n\t/** Whether to include deleted items */\n\tdeleted?: boolean;\n};\n\ntype ListResult<T = any> = {\n\t/** List of items */\n\tdata: T[];\n\t/** Total number of items */\n\ttotal: number;\n};\n"],"names":[],"mappings":"AAAA,WAyBE"}
package/lib/index.js CHANGED
@@ -1,3 +1,7 @@
1
- export { normalizePagination } from "./normalizePagination.js";
2
- export { parseSort } from "./parseSort.js";
1
+ /**
2
+ * @deprecated
3
+ */ export { parseSort } from "./data/parseSort.js";
4
+ /**
5
+ * @deprecated
6
+ */ export { resolvePagination as normalizePagination } from "./data/resolvePagination.js";
3
7
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { normalizePagination } from './normalizePagination';\nexport { parseSort, type SortRule } from './parseSort';\n"],"names":["normalizePagination","parseSort"],"mappings":"AAAA,SAASA,mBAAmB,QAAQ,wBAAwB;AAC5D,SAASC,SAAS,QAAuB,cAAc"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @deprecated\n */\nexport { parseSort, type SortRule } from './data/parseSort';\n/**\n * @deprecated\n */\nexport { resolvePagination as normalizePagination } from './data/resolvePagination';\n"],"names":["parseSort","resolvePagination","normalizePagination"],"mappings":"AAAA;;CAEC,GACD,SAASA,SAAS,QAAuB,mBAAmB;AAC5D;;CAEC,GACD,SAASC,qBAAqBC,mBAAmB,QAAQ,2BAA2B"}
@@ -77,8 +77,8 @@ function validate({ schema, data, mutate, clone, ajv }) {
77
77
  });
78
78
  }
79
79
  /**
80
- * Check data is valid, will not use default
81
- */ JsonSchema.check = check;
80
+ * Check data is valid, will not use default
81
+ */ JsonSchema.check = check;
82
82
  function safeParse(schema, data) {
83
83
  return validate({
84
84
  schema,
@@ -88,8 +88,8 @@ function validate({ schema, data, mutate, clone, ajv }) {
88
88
  });
89
89
  }
90
90
  /**
91
- * Parse data with default value and coerceTypes
92
- */ JsonSchema.safeParse = safeParse;
91
+ * Parse data with default value and coerceTypes
92
+ */ JsonSchema.safeParse = safeParse;
93
93
  function parse(schema, data) {
94
94
  const { data: out, message, errors } = validate({
95
95
  schema,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/jsonschema/JsonSchema.ts"],"sourcesContent":["import type { Static, TSchema } from '@sinclair/typebox';\nimport Ajv, { type ErrorObject, type Options } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport localize from 'ajv-i18n/localize/zh';\nimport addKeywords from 'ajv-keywords';\nimport { isNil } from 'es-toolkit';\nimport { match, P } from 'ts-pattern';\nimport type { JsonSchemaDef } from './types';\n\nfunction _createAjv(opt: Options) {\n const ajv = new Ajv(opt);\n addKeywords(ajv);\n addFormats(ajv);\n return ajv;\n}\n\ntype ValidateOptions = {\n mutate?: boolean;\n clone?: boolean;\n ajv?: Ajv;\n};\n\ntype ValidateResult<T> =\n | {\n data: T;\n success: true;\n message: undefined;\n }\n | {\n data: undefined;\n success: false;\n message: string;\n errors: ErrorObject[];\n };\n\nfunction validate({\n schema,\n data,\n mutate,\n clone,\n ajv,\n}: ValidateOptions & {\n schema: any;\n data: any;\n}) {\n let opts: Options = {\n // strict: 'log',\n strict: true,\n strictSchema: 'log', // skip unknown keywords in schema\n };\n\n if (mutate) {\n Object.assign(opts, {\n removeAdditional: true,\n useDefaults: true,\n coerceTypes: true,\n allErrors: true,\n });\n }\n\n if (clone) {\n data = structuredClone(data);\n }\n\n if (!ajv) {\n ajv = JsonSchema.createAjv(opts);\n }\n\n const validate = ajv.compile(schema);\n\n // consider reusing validate instance\n\n const valid = validate(data);\n const errors = validate.errors;\n localize(errors);\n\n return {\n data,\n success: valid,\n message: ajv.errorsText(errors),\n errors: errors,\n };\n}\n\ntype TypeOfSchema<S> = S extends TSchema ? Static<S> : any;\n\nexport namespace JsonSchema {\n export let schemas: JsonSchemaDef[] = [];\n\n export const createAjv = _createAjv;\n\n export function addSchema(\n schema: JsonSchemaDef,\n {\n onConflict = 'throw',\n }: {\n onConflict?: 'throw' | 'ignore' | 'replace' | ((old: JsonSchemaDef, neo: JsonSchemaDef) => JsonSchemaDef);\n } = {},\n ) {\n if (!schema.$id) throw new Error('Schema must have $id');\n switch (onConflict) {\n case 'ignore':\n onConflict = (old) => old;\n break;\n case 'replace':\n onConflict = (_, neo) => neo;\n break;\n case 'throw':\n onConflict = (old, neo) => {\n throw new Error(`Schema ${neo.$id} already exists`);\n };\n break;\n }\n let idx = schemas.findIndex((s) => s.$id === schema.$id);\n if (idx >= 0) {\n schemas[idx] = onConflict(schemas[idx], schema);\n } else {\n schemas.push(schema);\n }\n }\n\n /**\n * Check data is valid, will not use default\n */\n export function check<S>(schema: S, data: any): ValidateResult<TypeOfSchema<S>> {\n return validate({ schema, data, mutate: false, clone: true }) as any;\n }\n\n /**\n * Parse data with default value and coerceTypes\n */\n export function safeParse<S>(schema: S, data: any): ValidateResult<TypeOfSchema<S>> {\n return validate({ schema, data, mutate: true, clone: true }) as any;\n }\n\n export function parse<S>(schema: S, data: any): TypeOfSchema<S> {\n const { data: out, message, errors } = validate({ schema, data, mutate: true, clone: true });\n if (errors) {\n throw new Error(message);\n }\n return out;\n }\n\n export function create<S>(schema: S, data?: any): TypeOfSchema<S> {\n // will not ensure value match the rule\n return match(schema as JsonSchemaDef)\n .returnType<any>()\n .with({ const: P.select() }, (v) => v)\n .with({ default: P.select() }, (v) => v)\n .with({ anyOf: P.nonNullable }, (schema) => {\n return create(schema.anyOf[0]);\n })\n .with({ oneOf: P.nonNullable }, (schema) => {\n return create(schema.oneOf[0]);\n })\n .with({ type: 'string' }, (schema) => '')\n .with({ type: P.union('number', 'integer') }, (schema) => 0)\n .with({ type: 'object' }, (schema) => {\n let out = validate({ schema, data: data ?? {}, mutate: true });\n if (!out.success) {\n // fallback\n let obj = data || {};\n schema.required?.forEach((key) => {\n if (!(key in obj)) {\n let last = obj[key];\n let prop = schema.properties?.[key];\n if (prop && isNil(last)) obj[key] = JsonSchema.create(prop, last);\n }\n });\n out = validate({ schema, data: obj, mutate: true });\n if (!out.success) {\n console.warn(`Failed to create object with schema: ${out.message}`);\n }\n }\n return out.data;\n })\n .with({ type: 'null' }, () => null)\n .with({ type: 'boolean' }, (schema) => false)\n .with({ type: 'array' }, (schema) => [])\n .otherwise(() => {\n return undefined;\n });\n }\n\n export function isPrimitiveType(schema: any): boolean {\n return match(schema as JsonSchemaDef)\n .returnType<boolean>()\n .with({ type: P.union('number', 'integer', 'string', 'boolean') }, () => true)\n .with({ anyOf: P.nonNullable }, (schema) => {\n return isPrimitiveType(schema.anyOf[0]);\n })\n .with({ oneOf: P.nonNullable }, (schema) => {\n return isPrimitiveType(schema.oneOf[0]);\n })\n .otherwise(() => false);\n }\n}\n"],"names":["Ajv","addFormats","localize","addKeywords","isNil","match","P","_createAjv","opt","ajv","validate","schema","data","mutate","clone","opts","strict","strictSchema","Object","assign","removeAdditional","useDefaults","coerceTypes","allErrors","structuredClone","JsonSchema","createAjv","compile","valid","errors","success","message","errorsText","schemas","addSchema","onConflict","$id","Error","old","_","neo","idx","findIndex","s","push","check","safeParse","parse","out","create","returnType","with","const","select","v","default","anyOf","nonNullable","oneOf","type","union","obj","required","forEach","key","last","prop","properties","console","warn","otherwise","undefined","isPrimitiveType"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/jsonschema/JsonSchema.ts"],"sourcesContent":["import type { Static, TSchema } from '@sinclair/typebox';\nimport Ajv, { type ErrorObject, type Options } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport localize from 'ajv-i18n/localize/zh';\nimport addKeywords from 'ajv-keywords';\nimport { isNil } from 'es-toolkit';\nimport { match, P } from 'ts-pattern';\nimport type { JsonSchemaDef } from './types';\n\nfunction _createAjv(opt: Options) {\n\tconst ajv = new Ajv(opt);\n\taddKeywords(ajv);\n\taddFormats(ajv);\n\treturn ajv;\n}\n\ntype ValidateOptions = { mutate?: boolean; clone?: boolean; ajv?: Ajv };\n\ntype ValidateResult<T> =\n\t| { data: T; success: true; message: undefined }\n\t| { data: undefined; success: false; message: string; errors: ErrorObject[] };\n\nfunction validate({ schema, data, mutate, clone, ajv }: ValidateOptions & { schema: any; data: any }) {\n\tlet opts: Options = {\n\t\t// strict: 'log',\n\t\tstrict: true,\n\t\tstrictSchema: 'log', // skip unknown keywords in schema\n\t};\n\n\tif (mutate) {\n\t\tObject.assign(opts, { removeAdditional: true, useDefaults: true, coerceTypes: true, allErrors: true });\n\t}\n\n\tif (clone) {\n\t\tdata = structuredClone(data);\n\t}\n\n\tif (!ajv) {\n\t\tajv = JsonSchema.createAjv(opts);\n\t}\n\n\tconst validate = ajv.compile(schema);\n\n\t// consider reusing validate instance\n\n\tconst valid = validate(data);\n\tconst errors = validate.errors;\n\tlocalize(errors);\n\n\treturn { data, success: valid, message: ajv.errorsText(errors), errors: errors };\n}\n\ntype TypeOfSchema<S> = S extends TSchema ? Static<S> : any;\n\nexport namespace JsonSchema {\n\texport let schemas: JsonSchemaDef[] = [];\n\n\texport const createAjv = _createAjv;\n\n\texport function addSchema(\n\t\tschema: JsonSchemaDef,\n\t\t{\n\t\t\tonConflict = 'throw',\n\t\t}: {\n\t\t\tonConflict?: 'throw' | 'ignore' | 'replace' | ((old: JsonSchemaDef, neo: JsonSchemaDef) => JsonSchemaDef);\n\t\t} = {},\n\t) {\n\t\tif (!schema.$id) throw new Error('Schema must have $id');\n\t\tswitch (onConflict) {\n\t\t\tcase 'ignore':\n\t\t\t\tonConflict = (old) => old;\n\t\t\t\tbreak;\n\t\t\tcase 'replace':\n\t\t\t\tonConflict = (_, neo) => neo;\n\t\t\t\tbreak;\n\t\t\tcase 'throw':\n\t\t\t\tonConflict = (old, neo) => {\n\t\t\t\t\tthrow new Error(`Schema ${neo.$id} already exists`);\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t}\n\t\tlet idx = schemas.findIndex((s) => s.$id === schema.$id);\n\t\tif (idx >= 0) {\n\t\t\tschemas[idx] = onConflict(schemas[idx], schema);\n\t\t} else {\n\t\t\tschemas.push(schema);\n\t\t}\n\t}\n\n\t/**\n\t * Check data is valid, will not use default\n\t */\n\texport function check<S>(schema: S, data: any): ValidateResult<TypeOfSchema<S>> {\n\t\treturn validate({ schema, data, mutate: false, clone: true }) as any;\n\t}\n\n\t/**\n\t * Parse data with default value and coerceTypes\n\t */\n\texport function safeParse<S>(schema: S, data: any): ValidateResult<TypeOfSchema<S>> {\n\t\treturn validate({ schema, data, mutate: true, clone: true }) as any;\n\t}\n\n\texport function parse<S>(schema: S, data: any): TypeOfSchema<S> {\n\t\tconst { data: out, message, errors } = validate({ schema, data, mutate: true, clone: true });\n\t\tif (errors) {\n\t\t\tthrow new Error(message);\n\t\t}\n\t\treturn out;\n\t}\n\n\texport function create<S>(schema: S, data?: any): TypeOfSchema<S> {\n\t\t// will not ensure value match the rule\n\t\treturn match(schema as JsonSchemaDef)\n\t\t\t.returnType<any>()\n\t\t\t.with({ const: P.select() }, (v) => v)\n\t\t\t.with({ default: P.select() }, (v) => v)\n\t\t\t.with({ anyOf: P.nonNullable }, (schema) => {\n\t\t\t\treturn create(schema.anyOf[0]);\n\t\t\t})\n\t\t\t.with({ oneOf: P.nonNullable }, (schema) => {\n\t\t\t\treturn create(schema.oneOf[0]);\n\t\t\t})\n\t\t\t.with({ type: 'string' }, (schema) => '')\n\t\t\t.with({ type: P.union('number', 'integer') }, (schema) => 0)\n\t\t\t.with({ type: 'object' }, (schema) => {\n\t\t\t\tlet out = validate({ schema, data: data ?? {}, mutate: true });\n\t\t\t\tif (!out.success) {\n\t\t\t\t\t// fallback\n\t\t\t\t\tlet obj = data || {};\n\t\t\t\t\tschema.required?.forEach((key) => {\n\t\t\t\t\t\tif (!(key in obj)) {\n\t\t\t\t\t\t\tlet last = obj[key];\n\t\t\t\t\t\t\tlet prop = schema.properties?.[key];\n\t\t\t\t\t\t\tif (prop && isNil(last)) obj[key] = JsonSchema.create(prop, last);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tout = validate({ schema, data: obj, mutate: true });\n\t\t\t\t\tif (!out.success) {\n\t\t\t\t\t\tconsole.warn(`Failed to create object with schema: ${out.message}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn out.data;\n\t\t\t})\n\t\t\t.with({ type: 'null' }, () => null)\n\t\t\t.with({ type: 'boolean' }, (schema) => false)\n\t\t\t.with({ type: 'array' }, (schema) => [])\n\t\t\t.otherwise(() => {\n\t\t\t\treturn undefined;\n\t\t\t});\n\t}\n\n\texport function isPrimitiveType(schema: any): boolean {\n\t\treturn match(schema as JsonSchemaDef)\n\t\t\t.returnType<boolean>()\n\t\t\t.with({ type: P.union('number', 'integer', 'string', 'boolean') }, () => true)\n\t\t\t.with({ anyOf: P.nonNullable }, (schema) => {\n\t\t\t\treturn isPrimitiveType(schema.anyOf[0]);\n\t\t\t})\n\t\t\t.with({ oneOf: P.nonNullable }, (schema) => {\n\t\t\t\treturn isPrimitiveType(schema.oneOf[0]);\n\t\t\t})\n\t\t\t.otherwise(() => false);\n\t}\n}\n"],"names":["Ajv","addFormats","localize","addKeywords","isNil","match","P","_createAjv","opt","ajv","validate","schema","data","mutate","clone","opts","strict","strictSchema","Object","assign","removeAdditional","useDefaults","coerceTypes","allErrors","structuredClone","JsonSchema","createAjv","compile","valid","errors","success","message","errorsText","schemas","addSchema","onConflict","$id","Error","old","_","neo","idx","findIndex","s","push","check","safeParse","parse","out","create","returnType","with","const","select","v","default","anyOf","nonNullable","oneOf","type","union","obj","required","forEach","key","last","prop","properties","console","warn","otherwise","undefined","isPrimitiveType"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/jsonschema/types.d.ts"],"sourcesContent":["type JsonSchemaTypeName =\n | 'string' //\n | 'number'\n | 'integer'\n | 'boolean'\n | 'object'\n | 'array'\n | 'null';\n\ntype JsonValue =\n | string //\n | number\n | boolean\n | {\n [key: string]: JsonValue;\n }\n | JsonValue[]\n | null;\n\ntype JsonSchemaVersion =\n | 'http://json-schema.org/schema' // latest\n | 'https://json-schema.org/draft/2020-12/schema'\n // draft-07\n | 'http://json-schema.org/draft-07/schema#' //\n | 'http://json-schema.org/draft-07/hyper-schema#';\n\ntype JsonSchemaFormatName =\n //\n | 'date-time'\n | 'date'\n | 'time'\n | 'duration'\n //\n | 'email'\n | 'idn-email'\n //\n | 'hostname'\n | 'idn-hostname'\n | 'ipv4'\n | 'ipv6'\n //\n | 'uri'\n | 'uri-reference'\n | 'iri'\n | 'iri-reference'\n | 'uuid'\n | 'uri-template'\n | 'regex'\n | 'json-pointer'\n | 'relative-json-pointer';\n\nexport type JsonSchemaDef = {\n $id?: string;\n $ref?: string;\n /**\n * Meta schema\n *\n * Recommended values:\n * - 'http://json-schema.org/schema#'\n * - 'http://json-schema.org/hyper-schema#'\n * - 'http://json-schema.org/draft-07/schema#'\n * - 'http://json-schema.org/draft-07/hyper-schema#'\n *\n * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-5\n */\n $schema?: JsonSchemaVersion | string;\n $comment?: string;\n\n $defs?: {\n [key: string]: JsonSchemaDef;\n };\n\n type?: JsonSchemaTypeName | JsonSchemaTypeName[];\n enum?: JsonValue[];\n const?: JsonValue;\n\n //region Numeric Validation\n\n multipleOf?: number;\n maximum?: number;\n exclusiveMaximum?: number;\n minimum?: number;\n exclusiveMinimum?: number;\n\n //endregion\n\n //region String Validation\n\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n\n //endregion\n\n //region Array Validation\n\n items?: JsonSchemaDef | JsonSchemaDef[];\n additionalItems?: JsonSchemaDef;\n maxItems?: number;\n minItems?: number;\n uniqueItems?: boolean;\n contains?: JsonSchemaDef;\n //endregion\n\n //region Object Validation\n\n maxProperties?: number;\n minProperties?: number;\n required?: string[];\n properties?: {\n [key: string]: JsonSchemaDef;\n };\n patternProperties?: {\n [key: string]: JsonSchemaDef;\n };\n additionalProperties?: JsonSchemaDef;\n dependencies?: {\n [key: string]: JsonSchemaDef | string[];\n };\n propertyNames?: JsonSchemaDef;\n //endregion\n\n //region Conditional\n\n if?: JsonSchemaDef;\n then?: JsonSchemaDef;\n else?: JsonSchemaDef;\n\n //endregion\n\n //region Boolean Logic\n\n allOf?: JsonSchemaDef[];\n anyOf?: JsonSchemaDef[];\n oneOf?: JsonSchemaDef[];\n not?: JsonSchemaDef;\n //endregion\n\n //region Semantic\n\n format?: JsonSchemaFormatName | string;\n\n //endregion\n\n //region String-Encoding Non-JSON Data\n\n contentMediaType?: string;\n contentEncoding?: string;\n contentSchema?: JsonSchemaDef;\n //endregion\n\n /**\n * use {@link $defs} instead\n */\n definitions?: Record<string, JsonSchemaDef>;\n\n //region Meta-Data Annotations\n /**\n * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-10\n */\n\n title?: string;\n description?: string;\n default?: JsonValue;\n readOnly?: boolean;\n writeOnly?: boolean;\n examples?: JsonValue;\n deprecated?: boolean;\n\n //endregion\n\n nullable?: boolean;\n};\n"],"names":[],"mappings":"AAmDA,WAyHE"}
1
+ {"version":3,"sources":["../../src/jsonschema/types.d.ts"],"sourcesContent":["type JsonSchemaTypeName =\n\t| 'string' //\n\t| 'number'\n\t| 'integer'\n\t| 'boolean'\n\t| 'object'\n\t| 'array'\n\t| 'null';\n\ntype JsonValue =\n\t| string //\n\t| number\n\t| boolean\n\t| { [key: string]: JsonValue }\n\t| JsonValue[]\n\t| null;\n\ntype JsonSchemaVersion =\n\t| 'http://json-schema.org/schema' // latest\n\t| 'https://json-schema.org/draft/2020-12/schema'\n\t// draft-07\n\t| 'http://json-schema.org/draft-07/schema#' //\n\t| 'http://json-schema.org/draft-07/hyper-schema#';\n\ntype JsonSchemaFormatName =\n\t//\n\t| 'date-time'\n\t| 'date'\n\t| 'time'\n\t| 'duration'\n\t//\n\t| 'email'\n\t| 'idn-email'\n\t//\n\t| 'hostname'\n\t| 'idn-hostname'\n\t| 'ipv4'\n\t| 'ipv6'\n\t//\n\t| 'uri'\n\t| 'uri-reference'\n\t| 'iri'\n\t| 'iri-reference'\n\t| 'uuid'\n\t| 'uri-template'\n\t| 'regex'\n\t| 'json-pointer'\n\t| 'relative-json-pointer';\n\nexport type JsonSchemaDef = {\n\t$id?: string;\n\t$ref?: string;\n\t/**\n\t * Meta schema\n\t *\n\t * Recommended values:\n\t * - 'http://json-schema.org/schema#'\n\t * - 'http://json-schema.org/hyper-schema#'\n\t * - 'http://json-schema.org/draft-07/schema#'\n\t * - 'http://json-schema.org/draft-07/hyper-schema#'\n\t *\n\t * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-5\n\t */\n\t$schema?: JsonSchemaVersion | string;\n\t$comment?: string;\n\n\t$defs?: { [key: string]: JsonSchemaDef };\n\n\ttype?: JsonSchemaTypeName | JsonSchemaTypeName[];\n\tenum?: JsonValue[];\n\tconst?: JsonValue;\n\n\t//region Numeric Validation\n\n\tmultipleOf?: number;\n\tmaximum?: number;\n\texclusiveMaximum?: number;\n\tminimum?: number;\n\texclusiveMinimum?: number;\n\n\t//endregion\n\n\t//region String Validation\n\n\tmaxLength?: number;\n\tminLength?: number;\n\tpattern?: string;\n\n\t//endregion\n\n\t//region Array Validation\n\n\titems?: JsonSchemaDef | JsonSchemaDef[];\n\tadditionalItems?: JsonSchemaDef;\n\tmaxItems?: number;\n\tminItems?: number;\n\tuniqueItems?: boolean;\n\tcontains?: JsonSchemaDef;\n\t//endregion\n\n\t//region Object Validation\n\n\tmaxProperties?: number;\n\tminProperties?: number;\n\trequired?: string[];\n\tproperties?: { [key: string]: JsonSchemaDef };\n\tpatternProperties?: { [key: string]: JsonSchemaDef };\n\tadditionalProperties?: JsonSchemaDef;\n\tdependencies?: { [key: string]: JsonSchemaDef | string[] };\n\tpropertyNames?: JsonSchemaDef;\n\t//endregion\n\n\t//region Conditional\n\n\tif?: JsonSchemaDef;\n\tthen?: JsonSchemaDef;\n\telse?: JsonSchemaDef;\n\n\t//endregion\n\n\t//region Boolean Logic\n\n\tallOf?: JsonSchemaDef[];\n\tanyOf?: JsonSchemaDef[];\n\toneOf?: JsonSchemaDef[];\n\tnot?: JsonSchemaDef;\n\t//endregion\n\n\t//region Semantic\n\n\tformat?: JsonSchemaFormatName | string;\n\n\t//endregion\n\n\t//region String-Encoding Non-JSON Data\n\n\tcontentMediaType?: string;\n\tcontentEncoding?: string;\n\tcontentSchema?: JsonSchemaDef;\n\t//endregion\n\n\t/**\n\t * use {@link $defs} instead\n\t */\n\tdefinitions?: Record<string, JsonSchemaDef>;\n\n\t//region Meta-Data Annotations\n\t/**\n\t * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-10\n\t */\n\n\ttitle?: string;\n\tdescription?: string;\n\tdefault?: JsonValue;\n\treadOnly?: boolean;\n\twriteOnly?: boolean;\n\texamples?: JsonValue;\n\tdeprecated?: boolean;\n\n\t//endregion\n\n\tnullable?: boolean;\n};\n"],"names":[],"mappings":"AAiDA,WAiHE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/meta/defineFileType.tsx"],"sourcesContent":["type DefineFileTypeOptions = {\n name: string;\n title?: string;\n description?: string;\n type?: string;\n types?: string[];\n extension?: string;\n extensions?: string[];\n tags?: string[];\n metadata?: Record<string, any>;\n};\nexport type FileTypeDef = {\n name: string;\n title: string;\n description?: string;\n type: string; // primary type\n extension: string; // primary extension\n types: string[];\n extensions: string[];\n tags: string[];\n metadata: Record<string, any>;\n};\n\nlet _all: FileTypeDef[] = [];\n\nexport function defineFileType({\n type = '',\n types = [],\n extension = '',\n extensions = [],\n ...opts\n}: DefineFileTypeOptions): FileTypeDef {\n if (!type) {\n type = types[0] || '';\n }\n if (!extension) {\n extension = extensions[0] || '';\n }\n if (!types.includes(type)) {\n types = [type, ...types];\n }\n if (!extensions.includes(extension)) {\n extensions = [extension, ...extensions];\n }\n\n const def: FileTypeDef = {\n title: opts.title || opts.name,\n type,\n extension,\n types,\n extensions,\n tags: [],\n metadata: {},\n ...opts,\n };\n let idx = _all.findIndex((v) => v.name === def.name);\n if (idx >= 0) {\n _all[idx] = def;\n console.warn(`File type ${def.name} is redefined`);\n } else {\n _all.push(def);\n }\n return def;\n}\n\nexport function getFileType(): FileTypeDef[] {\n return _all;\n}\n"],"names":["_all","defineFileType","type","types","extension","extensions","opts","includes","def","title","name","tags","metadata","idx","findIndex","v","console","warn","push","getFileType"],"mappings":"AAuBA,IAAIA,OAAsB,EAAE;AAE5B,OAAO,SAASC,eAAe,EAC7BC,OAAO,EAAE,EACTC,QAAQ,EAAE,EACVC,YAAY,EAAE,EACdC,aAAa,EAAE,EACf,GAAGC,MACmB;IACtB,IAAI,CAACJ,MAAM;QACTA,OAAOC,KAAK,CAAC,EAAE,IAAI;IACrB;IACA,IAAI,CAACC,WAAW;QACdA,YAAYC,UAAU,CAAC,EAAE,IAAI;IAC/B;IACA,IAAI,CAACF,MAAMI,QAAQ,CAACL,OAAO;QACzBC,QAAQ;YAACD;eAASC;SAAM;IAC1B;IACA,IAAI,CAACE,WAAWE,QAAQ,CAACH,YAAY;QACnCC,aAAa;YAACD;eAAcC;SAAW;IACzC;IAEA,MAAMG,MAAmB;QACvBC,OAAOH,KAAKG,KAAK,IAAIH,KAAKI,IAAI;QAC9BR;QACAE;QACAD;QACAE;QACAM,MAAM,EAAE;QACRC,UAAU,CAAC;QACX,GAAGN,IAAI;IACT;IACA,IAAIO,MAAMb,KAAKc,SAAS,CAAC,CAACC,IAAMA,EAAEL,IAAI,KAAKF,IAAIE,IAAI;IACnD,IAAIG,OAAO,GAAG;QACZb,IAAI,CAACa,IAAI,GAAGL;QACZQ,QAAQC,IAAI,CAAC,CAAC,UAAU,EAAET,IAAIE,IAAI,CAAC,aAAa,CAAC;IACnD,OAAO;QACLV,KAAKkB,IAAI,CAACV;IACZ;IACA,OAAOA;AACT;AAEA,OAAO,SAASW;IACd,OAAOnB;AACT"}
1
+ {"version":3,"sources":["../../src/meta/defineFileType.tsx"],"sourcesContent":["type DefineFileTypeOptions = {\n\tname: string;\n\ttitle?: string;\n\tdescription?: string;\n\ttype?: string;\n\ttypes?: string[];\n\textension?: string;\n\textensions?: string[];\n\ttags?: string[];\n\tmetadata?: Record<string, any>;\n};\nexport type FileTypeDef = {\n\tname: string;\n\ttitle: string;\n\tdescription?: string;\n\ttype: string; // primary type\n\textension: string; // primary extension\n\ttypes: string[];\n\textensions: string[];\n\ttags: string[];\n\tmetadata: Record<string, any>;\n};\n\nlet _all: FileTypeDef[] = [];\n\nexport function defineFileType({\n\ttype = '',\n\ttypes = [],\n\textension = '',\n\textensions = [],\n\t...opts\n}: DefineFileTypeOptions): FileTypeDef {\n\tif (!type) {\n\t\ttype = types[0] || '';\n\t}\n\tif (!extension) {\n\t\textension = extensions[0] || '';\n\t}\n\tif (!types.includes(type)) {\n\t\ttypes = [type, ...types];\n\t}\n\tif (!extensions.includes(extension)) {\n\t\textensions = [extension, ...extensions];\n\t}\n\n\tconst def: FileTypeDef = {\n\t\ttitle: opts.title || opts.name,\n\t\ttype,\n\t\textension,\n\t\ttypes,\n\t\textensions,\n\t\ttags: [],\n\t\tmetadata: {},\n\t\t...opts,\n\t};\n\tlet idx = _all.findIndex((v) => v.name === def.name);\n\tif (idx >= 0) {\n\t\t_all[idx] = def;\n\t\tconsole.warn(`File type ${def.name} is redefined`);\n\t} else {\n\t\t_all.push(def);\n\t}\n\treturn def;\n}\n\nexport function getFileType(): FileTypeDef[] {\n\treturn _all;\n}\n"],"names":["_all","defineFileType","type","types","extension","extensions","opts","includes","def","title","name","tags","metadata","idx","findIndex","v","console","warn","push","getFileType"],"mappings":"AAuBA,IAAIA,OAAsB,EAAE;AAE5B,OAAO,SAASC,eAAe,EAC9BC,OAAO,EAAE,EACTC,QAAQ,EAAE,EACVC,YAAY,EAAE,EACdC,aAAa,EAAE,EACf,GAAGC,MACoB;IACvB,IAAI,CAACJ,MAAM;QACVA,OAAOC,KAAK,CAAC,EAAE,IAAI;IACpB;IACA,IAAI,CAACC,WAAW;QACfA,YAAYC,UAAU,CAAC,EAAE,IAAI;IAC9B;IACA,IAAI,CAACF,MAAMI,QAAQ,CAACL,OAAO;QAC1BC,QAAQ;YAACD;eAASC;SAAM;IACzB;IACA,IAAI,CAACE,WAAWE,QAAQ,CAACH,YAAY;QACpCC,aAAa;YAACD;eAAcC;SAAW;IACxC;IAEA,MAAMG,MAAmB;QACxBC,OAAOH,KAAKG,KAAK,IAAIH,KAAKI,IAAI;QAC9BR;QACAE;QACAD;QACAE;QACAM,MAAM,EAAE;QACRC,UAAU,CAAC;QACX,GAAGN,IAAI;IACR;IACA,IAAIO,MAAMb,KAAKc,SAAS,CAAC,CAACC,IAAMA,EAAEL,IAAI,KAAKF,IAAIE,IAAI;IACnD,IAAIG,OAAO,GAAG;QACbb,IAAI,CAACa,IAAI,GAAGL;QACZQ,QAAQC,IAAI,CAAC,CAAC,UAAU,EAAET,IAAIE,IAAI,CAAC,aAAa,CAAC;IAClD,OAAO;QACNV,KAAKkB,IAAI,CAACV;IACX;IACA,OAAOA;AACR;AAEA,OAAO,SAASW;IACf,OAAOnB;AACR"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/meta/defineInit.ts"],"sourcesContent":["import type { MaybePromise } from '@wener/utils';\nimport { startCase } from 'es-toolkit';\n\ntype DefineInitOptions = {\n name: string;\n title?: string;\n onInit?: () => any;\n metadata?: Record<string, any>;\n};\nexport type InitDef = {\n name: string;\n title: string;\n onInit?: () => any;\n metadata: Record<string, any>;\n};\nlet _all: InitDef[] = [];\n\nexport function defineInit(o: DefineInitOptions) {\n const def = {\n title: startCase(o.name),\n metadata: {},\n ...o,\n };\n let idx = _all.findIndex((v) => v.name === def.name);\n if (idx >= 0) {\n console.warn(`skip redefined init: ${def.name}`);\n } else {\n _all.push(def);\n }\n\n return def;\n}\n\nlet result = new Map<any, MaybePromise<InitResult>>();\n\ntype InitResult = {\n name: string;\n success: boolean;\n error?: any;\n};\n\nexport async function runInit(inits = _all) {\n for (let init of inits) {\n if (result.get(init)) {\n return;\n }\n result.set(\n init,\n Promise.resolve().then(async () => {\n let out: InitResult = {\n name: init.name,\n success: true,\n };\n try {\n await init.onInit?.();\n } catch (e) {\n console.error(`Failed to init ${init.name}`, e);\n out.success = false;\n out.error = e;\n }\n result.set(init, out);\n return out;\n }),\n );\n }\n\n return Promise.all(result.values());\n}\n"],"names":["startCase","_all","defineInit","o","def","title","name","metadata","idx","findIndex","v","console","warn","push","result","Map","runInit","inits","init","get","set","Promise","resolve","then","out","success","onInit","e","error","all","values"],"mappings":"AACA,SAASA,SAAS,QAAQ,aAAa;AAcvC,IAAIC,OAAkB,EAAE;AAExB,OAAO,SAASC,WAAWC,CAAoB;IAC7C,MAAMC,MAAM;QACVC,OAAOL,UAAUG,EAAEG,IAAI;QACvBC,UAAU,CAAC;QACX,GAAGJ,CAAC;IACN;IACA,IAAIK,MAAMP,KAAKQ,SAAS,CAAC,CAACC,IAAMA,EAAEJ,IAAI,KAAKF,IAAIE,IAAI;IACnD,IAAIE,OAAO,GAAG;QACZG,QAAQC,IAAI,CAAC,CAAC,qBAAqB,EAAER,IAAIE,IAAI,EAAE;IACjD,OAAO;QACLL,KAAKY,IAAI,CAACT;IACZ;IAEA,OAAOA;AACT;AAEA,IAAIU,SAAS,IAAIC;AAQjB,OAAO,eAAeC,QAAQC,QAAQhB,IAAI;IACxC,KAAK,IAAIiB,QAAQD,MAAO;QACtB,IAAIH,OAAOK,GAAG,CAACD,OAAO;YACpB;QACF;QACAJ,OAAOM,GAAG,CACRF,MACAG,QAAQC,OAAO,GAAGC,IAAI,CAAC;YACrB,IAAIC,MAAkB;gBACpBlB,MAAMY,KAAKZ,IAAI;gBACfmB,SAAS;YACX;YACA,IAAI;gBACF,MAAMP,KAAKQ,MAAM;YACnB,EAAE,OAAOC,GAAG;gBACVhB,QAAQiB,KAAK,CAAC,CAAC,eAAe,EAAEV,KAAKZ,IAAI,EAAE,EAAEqB;gBAC7CH,IAAIC,OAAO,GAAG;gBACdD,IAAII,KAAK,GAAGD;YACd;YACAb,OAAOM,GAAG,CAACF,MAAMM;YACjB,OAAOA;QACT;IAEJ;IAEA,OAAOH,QAAQQ,GAAG,CAACf,OAAOgB,MAAM;AAClC"}
1
+ {"version":3,"sources":["../../src/meta/defineInit.ts"],"sourcesContent":["import type { MaybePromise } from '@wener/utils';\nimport { startCase } from 'es-toolkit';\n\ntype DefineInitOptions = { name: string; title?: string; onInit?: () => any; metadata?: Record<string, any> };\nexport type InitDef = { name: string; title: string; onInit?: () => any; metadata: Record<string, any> };\nlet _all: InitDef[] = [];\n\nexport function defineInit(o: DefineInitOptions) {\n\tconst def = { title: startCase(o.name), metadata: {}, ...o };\n\tlet idx = _all.findIndex((v) => v.name === def.name);\n\tif (idx >= 0) {\n\t\tconsole.warn(`skip redefined init: ${def.name}`);\n\t} else {\n\t\t_all.push(def);\n\t}\n\n\treturn def;\n}\n\nlet result = new Map<any, MaybePromise<InitResult>>();\n\ntype InitResult = { name: string; success: boolean; error?: any };\n\nexport async function runInit(inits = _all) {\n\tfor (let init of inits) {\n\t\tif (result.get(init)) {\n\t\t\treturn;\n\t\t}\n\t\tresult.set(\n\t\t\tinit,\n\t\t\tPromise.resolve().then(async () => {\n\t\t\t\tlet out: InitResult = { name: init.name, success: true };\n\t\t\t\ttry {\n\t\t\t\t\tawait init.onInit?.();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(`Failed to init ${init.name}`, e);\n\t\t\t\t\tout.success = false;\n\t\t\t\t\tout.error = e;\n\t\t\t\t}\n\t\t\t\tresult.set(init, out);\n\t\t\t\treturn out;\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn Promise.all(result.values());\n}\n"],"names":["startCase","_all","defineInit","o","def","title","name","metadata","idx","findIndex","v","console","warn","push","result","Map","runInit","inits","init","get","set","Promise","resolve","then","out","success","onInit","e","error","all","values"],"mappings":"AACA,SAASA,SAAS,QAAQ,aAAa;AAIvC,IAAIC,OAAkB,EAAE;AAExB,OAAO,SAASC,WAAWC,CAAoB;IAC9C,MAAMC,MAAM;QAAEC,OAAOL,UAAUG,EAAEG,IAAI;QAAGC,UAAU,CAAC;QAAG,GAAGJ,CAAC;IAAC;IAC3D,IAAIK,MAAMP,KAAKQ,SAAS,CAAC,CAACC,IAAMA,EAAEJ,IAAI,KAAKF,IAAIE,IAAI;IACnD,IAAIE,OAAO,GAAG;QACbG,QAAQC,IAAI,CAAC,CAAC,qBAAqB,EAAER,IAAIE,IAAI,EAAE;IAChD,OAAO;QACNL,KAAKY,IAAI,CAACT;IACX;IAEA,OAAOA;AACR;AAEA,IAAIU,SAAS,IAAIC;AAIjB,OAAO,eAAeC,QAAQC,QAAQhB,IAAI;IACzC,KAAK,IAAIiB,QAAQD,MAAO;QACvB,IAAIH,OAAOK,GAAG,CAACD,OAAO;YACrB;QACD;QACAJ,OAAOM,GAAG,CACTF,MACAG,QAAQC,OAAO,GAAGC,IAAI,CAAC;YACtB,IAAIC,MAAkB;gBAAElB,MAAMY,KAAKZ,IAAI;gBAAEmB,SAAS;YAAK;YACvD,IAAI;gBACH,MAAMP,KAAKQ,MAAM;YAClB,EAAE,OAAOC,GAAG;gBACXhB,QAAQiB,KAAK,CAAC,CAAC,eAAe,EAAEV,KAAKZ,IAAI,EAAE,EAAEqB;gBAC7CH,IAAIC,OAAO,GAAG;gBACdD,IAAII,KAAK,GAAGD;YACb;YACAb,OAAOM,GAAG,CAACF,MAAMM;YACjB,OAAOA;QACR;IAEF;IAEA,OAAOH,QAAQQ,GAAG,CAACf,OAAOgB,MAAM;AACjC"}