@wener/utils 1.1.47 → 1.1.48

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 (64) hide show
  1. package/README.md +9 -1
  2. package/lib/asyncs/Promises.js +46 -0
  3. package/lib/asyncs/Promises.js.map +1 -0
  4. package/lib/asyncs/isPromise.js +2 -3
  5. package/lib/asyncs/isPromise.js.map +1 -1
  6. package/lib/cn/division/DivisionCode.js +30 -17
  7. package/lib/cn/division/DivisionCode.js.map +1 -1
  8. package/lib/cn/id/{Mod11Checksum.js → Mod11.js} +3 -6
  9. package/lib/cn/id/Mod11.js.map +1 -0
  10. package/lib/cn/id/ResidentIdNumber.js +10 -12
  11. package/lib/cn/id/ResidentIdNumber.js.map +1 -1
  12. package/lib/cn/uscc/{Mod31Checksum.js → Mod31.js} +3 -6
  13. package/lib/cn/uscc/Mod31.js.map +1 -0
  14. package/lib/cn/uscc/USCC.js +6 -9
  15. package/lib/cn/uscc/USCC.js.map +1 -1
  16. package/lib/cn/uscc/isUSCC.js +1 -1
  17. package/lib/cn/uscc/isUSCC.js.map +1 -1
  18. package/lib/crypto/getNodeCrypto.js +13 -10
  19. package/lib/crypto/getNodeCrypto.js.map +1 -1
  20. package/lib/crypto/getRandomValues.js +5 -1
  21. package/lib/crypto/getRandomValues.js.map +1 -1
  22. package/lib/emitter/types.js +3 -0
  23. package/lib/emitter/types.js.map +1 -0
  24. package/lib/fetch/http.types.js +4 -0
  25. package/lib/fetch/http.types.js.map +1 -0
  26. package/lib/index.js +4 -3
  27. package/lib/index.js.map +1 -1
  28. package/lib/io/ByteBuffer.js +3 -3
  29. package/lib/io/ByteBuffer.js.map +1 -1
  30. package/lib/maths/random.js.map +1 -1
  31. package/lib/mitt/index.js +77 -0
  32. package/lib/mitt/index.js.map +1 -0
  33. package/lib/objects/computeIfAbsent.js +1 -1
  34. package/lib/objects/computeIfAbsent.js.map +1 -1
  35. package/package.json +6 -14
  36. package/src/asyncs/Promises.ts +52 -0
  37. package/src/asyncs/isPromise.ts +3 -3
  38. package/src/cn/division/DivisionCode.ts +61 -8
  39. package/src/cn/division/division.test.ts +6 -0
  40. package/src/cn/id/{Mod11Checksum.ts → Mod11.ts} +3 -6
  41. package/src/cn/id/ResidentIdNumber.ts +11 -13
  42. package/src/cn/id/id.test.ts +5 -5
  43. package/src/cn/scripts/gen.test.ts +2 -1
  44. package/src/cn/uscc/{Mod31Checksum.ts → Mod31.ts} +3 -7
  45. package/src/cn/uscc/USCC.ts +7 -11
  46. package/src/cn/uscc/isUSCC.ts +1 -1
  47. package/src/cn/uscc/uscc.test.ts +4 -4
  48. package/src/crypto/getNodeCrypto.ts +15 -11
  49. package/src/crypto/getRandomValues.ts +6 -1
  50. package/src/emitter/types.ts +18 -0
  51. package/src/fetch/http.types.ts +46 -0
  52. package/src/index.ts +5 -3
  53. package/src/io/ByteBuffer.test.ts +15 -0
  54. package/src/io/ByteBuffer.ts +3 -4
  55. package/src/langs/mixin.test.ts +39 -0
  56. package/src/maths/random.ts +1 -1
  57. package/src/mitt/README.md +1 -0
  58. package/src/mitt/index.ts +114 -0
  59. package/src/objects/computeIfAbsent.ts +3 -2
  60. package/lib/asyncs/sleep.js +0 -3
  61. package/lib/asyncs/sleep.js.map +0 -1
  62. package/lib/cn/id/Mod11Checksum.js.map +0 -1
  63. package/lib/cn/uscc/Mod31Checksum.js.map +0 -1
  64. package/src/asyncs/sleep.ts +0 -1
@@ -59,7 +59,7 @@ function asBuffer(o) {
59
59
  }
60
60
  willWrite(length) {
61
61
  if (this.remaining() < length) {
62
- this.resize(this.length + length);
62
+ this.resize(this.position + length);
63
63
  }
64
64
  }
65
65
  resize(newLength) {
@@ -73,7 +73,7 @@ function asBuffer(o) {
73
73
  this.willWrite(len);
74
74
  if (len !== bytes.byteLength) bytes = bytes.slice(0, len);
75
75
  new Uint8Array(this.buffer).set(new Uint8Array(bytes), this.position);
76
- this.position += bytes.byteLength;
76
+ this.position += len;
77
77
  }
78
78
  writeInt8(value) {
79
79
  this.willWrite(1);
@@ -273,7 +273,7 @@ function asBuffer(o) {
273
273
  return this.readFloat64();
274
274
  }
275
275
  remaining() {
276
- return this.view.byteLength - this.position;
276
+ return this.length - this.position;
277
277
  }
278
278
  toUint8Array() {
279
279
  return new Uint8Array(this.buffer);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/io/ByteBuffer.ts"],"sourcesContent":["import { isDefined } from '../langs/isDefined';\nimport { ArrayBuffers } from './ArrayBuffers';\n\ntype AnyBuffer = BufferSource | ArrayBufferLike;\n\nfunction asBuffer(o: AnyBuffer) {\n if (o instanceof ArrayBuffer) {\n return o;\n }\n if (ArrayBuffer.isView(o)) {\n // 保留 offset&length\n if (o.byteLength !== o.buffer.byteLength) {\n // ArrayBuffer 没有 subarray\n // if ('subarray' in o.buffer) {\n // return (o.buffer as any).subarray(o.byteOffset, o.byteOffset + o.byteLength);\n // }\n return o.buffer.slice(o.byteOffset, o.byteOffset + o.byteLength);\n }\n return o.buffer;\n }\n return o;\n}\n\n// function asView(o: AnyBuffer) {\n// if (o instanceof DataView) {\n// return o;\n// }\n// if (ArrayBuffer.isView(o)) {\n// // 不 clone 也能保留 offset&length\n// return new DataView(o.buffer, o.byteOffset, o.byteLength);\n// }\n// return new DataView(o);\n// }\n\n/**\n * @see {@link https://www.egret.uk/docs/egretengine/engine/egret.ByteArray egret.ByteArray}\n * @see {@link https://github.com/protobufjs/bytebuffer.js protobufjs/bytebuffer.js}\n * @see {@link https://netty.io/4.1/api/io/netty/buffer/ByteBuf.html ByteBuf}\n */\nexport class ByteBuffer {\n position = 0;\n\n #buffer: ArrayBufferLike;\n #view: DataView;\n\n constructor(buffer: AnyBuffer = new ArrayBuffer(0, { maxByteLength: 1024 })) {\n this.#buffer = asBuffer(buffer);\n // NOTE prefer view over buffer, avoid the slice overhead ?\n this.#view = new DataView(this.#buffer);\n }\n\n get view() {\n return this.#view;\n }\n\n get buffer(): ArrayBufferLike {\n return this.#buffer;\n }\n\n set buffer(buffer: AnyBuffer) {\n this.#buffer = asBuffer(buffer);\n this.#view = new DataView(this.#buffer);\n }\n\n get length() {\n return this.view.byteLength;\n }\n\n set length(length: number) {\n this.resize(length);\n }\n\n private willWrite(length: number) {\n if (this.remaining() < length) {\n this.resize(this.length + length);\n }\n }\n\n resize(newLength: number) {\n this.buffer = ArrayBuffers.resize(this.buffer, newLength, Math.ceil(newLength * 1.2));\n }\n\n writeByte(value: number) {\n this.willWrite(1);\n this.view.setUint8(this.position++, value);\n }\n\n writeBytes(bytes: ArrayBufferLike, len: number = bytes.byteLength) {\n this.willWrite(len);\n if (len !== bytes.byteLength) bytes = bytes.slice(0, len);\n new Uint8Array(this.buffer).set(new Uint8Array(bytes), this.position);\n this.position += bytes.byteLength;\n }\n\n writeInt8(value: number) {\n this.willWrite(1);\n this.view.setInt8(this.position, value);\n this.position += 1;\n }\n\n writeUint8(value: number) {\n this.willWrite(1);\n this.view.setUint8(this.position, value);\n this.position += 1;\n }\n\n writeInt16(value: number) {\n this.willWrite(2);\n this.view.setInt16(this.position, value);\n this.position += 2;\n }\n\n writeUint16(value: number) {\n this.willWrite(2);\n this.view.setUint16(this.position, value);\n this.position += 2;\n }\n\n writeInt32(value: number) {\n this.willWrite(4);\n this.view.setInt32(this.position, value);\n this.position += 4;\n }\n\n writeUint32(value: number) {\n this.willWrite(4);\n this.view.setUint32(this.position, value);\n this.position += 4;\n }\n\n writeInt64(value: bigint) {\n this.willWrite(8);\n this.view.setBigInt64(this.position, value);\n this.position += 8;\n }\n\n writeUint64(value: bigint) {\n this.willWrite(8);\n this.view.setBigUint64(this.position, value);\n this.position += 8;\n }\n\n writeFloat32(value: number) {\n this.willWrite(4);\n this.view.setFloat32(this.position, value);\n this.position += 4;\n }\n\n writeFloat64(value: number) {\n this.willWrite(8);\n this.view.setFloat64(this.position, value);\n this.position += 8;\n }\n\n writeBoolean(value: boolean) {\n this.writeByte(value ? 1 : 0);\n }\n\n writeString(value: string): void;\n writeString(value: string, len?: number): void;\n writeString(value: string, len?: number) {\n let encoder = new TextEncoder();\n let bytes = encoder.encode(value);\n this.writeBytes(bytes, len);\n }\n\n readByte() {\n return this.view.getUint8(this.position++);\n }\n\n readBytes(length: number) {\n let bytes = this.buffer.slice(this.position, this.position + length);\n this.position += length;\n return bytes;\n }\n\n readInt8() {\n let value = this.view.getInt8(this.position);\n this.position += 1;\n return value;\n }\n\n readUint8() {\n let value = this.view.getUint8(this.position);\n this.position += 1;\n return value;\n }\n\n readInt16() {\n let value = this.view.getInt16(this.position);\n this.position += 2;\n return value;\n }\n\n readUint16() {\n let value = this.view.getUint16(this.position);\n this.position += 2;\n return value;\n }\n\n readInt32() {\n let value = this.view.getInt32(this.position);\n this.position += 4;\n return value;\n }\n\n readUint32() {\n let value = this.view.getUint32(this.position);\n this.position += 4;\n return value;\n }\n\n readInt64() {\n let value = this.view.getBigInt64(this.position);\n this.position += 8;\n return safeNumber(value);\n }\n\n readUint64() {\n let value = this.view.getBigUint64(this.position);\n this.position += 8;\n return safeNumber(value);\n }\n\n readFloat32() {\n let value = this.view.getFloat32(this.position);\n this.position += 4;\n return value;\n }\n\n readFloat64() {\n let value = this.view.getFloat64(this.position);\n this.position += 8;\n return value;\n }\n\n readBoolean() {\n return this.readByte() === 1;\n }\n\n readString(length: number) {\n let bytes = this.readBytes(length);\n let decoder = new TextDecoder();\n let a = new Uint8Array(bytes);\n let idx = a.indexOf(0);\n if (idx !== -1) {\n bytes = bytes.slice(0, idx);\n }\n return decoder.decode(bytes);\n }\n\n readHexString(length: number) {\n let bytes = this.readBytes(length);\n return ArrayBuffers.toHex(bytes);\n }\n\n writeInt24(value: number) {\n this.writeUint8(value & 0xff);\n this.writeUint16(value >> 8);\n }\n\n readInt24() {\n return this.readUint8() | (this.readUint16() << 8);\n }\n\n writeZero(length: number) {\n this.writeBytes(new Uint8Array(length).buffer);\n }\n\n writeValue(typ: TypedValue['type'], val: TypedValue['value']): void;\n writeValue(tv: TypedValue): void;\n writeValue(a: any, b?: any) {\n const tv: TypedValue = typeof a === 'string' ? { type: a, value: b } : a;\n const { type, value, length } = tv;\n switch (type) {\n case 'uint8':\n this.writeUint8(value);\n break;\n case 'byte':\n case 'int8':\n this.writeInt8(value);\n break;\n case 'uint16':\n this.writeUint16(value);\n break;\n case 'int16':\n this.writeInt16(value);\n break;\n case 'uint32':\n this.writeUint32(value);\n break;\n case 'int32':\n this.writeInt32(value);\n break;\n case 'float32':\n this.writeFloat32(value);\n break;\n case 'float64':\n this.writeFloat64(value);\n break;\n case 'string':\n this.writeString(value, length);\n break;\n case 'boolean':\n this.writeBoolean(value);\n break;\n case 'bytes':\n this.writeBytes(value);\n break;\n default:\n throw new Error(`Unknown type ${type}`);\n }\n }\n\n readInt() {\n return this.readInt32();\n }\n\n readFloat() {\n return this.readFloat32();\n }\n\n readDouble() {\n return this.readFloat64();\n }\n\n remaining() {\n return this.view.byteLength - this.position;\n }\n\n toUint8Array() {\n return new Uint8Array(this.buffer);\n }\n\n toHex() {\n return ArrayBuffers.toHex(this.buffer);\n }\n\n toBase64() {\n return ArrayBuffers.toBase64(this.buffer);\n }\n}\n\nexport interface TypedValue {\n type:\n | 'byte'\n | 'bytes'\n | 'uint8'\n | 'int8'\n | 'uint16'\n | 'int16'\n | 'uint32'\n | 'int32'\n | 'float32'\n | 'float64'\n | 'string'\n | 'boolean';\n value: any;\n length?: number;\n}\n\nfunction safeNumber(n: bigint) {\n if (n > Number.MAX_SAFE_INTEGER) {\n return n;\n }\n return Number(n);\n}\n"],"names":["ArrayBuffers","asBuffer","o","ArrayBuffer","isView","byteLength","buffer","slice","byteOffset","ByteBuffer","position","view","constructor","maxByteLength","DataView","length","resize","willWrite","remaining","newLength","Math","ceil","writeByte","value","setUint8","writeBytes","bytes","len","Uint8Array","set","writeInt8","setInt8","writeUint8","writeInt16","setInt16","writeUint16","setUint16","writeInt32","setInt32","writeUint32","setUint32","writeInt64","setBigInt64","writeUint64","setBigUint64","writeFloat32","setFloat32","writeFloat64","setFloat64","writeBoolean","writeString","encoder","TextEncoder","encode","readByte","getUint8","readBytes","readInt8","getInt8","readUint8","readInt16","getInt16","readUint16","getUint16","readInt32","getInt32","readUint32","getUint32","readInt64","getBigInt64","safeNumber","readUint64","getBigUint64","readFloat32","getFloat32","readFloat64","getFloat64","readBoolean","readString","decoder","TextDecoder","a","idx","indexOf","decode","readHexString","toHex","writeInt24","readInt24","writeZero","writeValue","b","tv","type","Error","readInt","readFloat","readDouble","toUint8Array","toBase64","n","Number","MAX_SAFE_INTEGER"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../src/io/ByteBuffer.ts"],"sourcesContent":["import { ArrayBuffers } from './ArrayBuffers';\n\ntype AnyBuffer = BufferSource | ArrayBufferLike;\n\nfunction asBuffer(o: AnyBuffer) {\n if (o instanceof ArrayBuffer) {\n return o;\n }\n if (ArrayBuffer.isView(o)) {\n // 保留 offset&length\n if (o.byteLength !== o.buffer.byteLength) {\n // ArrayBuffer 没有 subarray\n // if ('subarray' in o.buffer) {\n // return (o.buffer as any).subarray(o.byteOffset, o.byteOffset + o.byteLength);\n // }\n return o.buffer.slice(o.byteOffset, o.byteOffset + o.byteLength);\n }\n return o.buffer;\n }\n return o;\n}\n\n// function asView(o: AnyBuffer) {\n// if (o instanceof DataView) {\n// return o;\n// }\n// if (ArrayBuffer.isView(o)) {\n// // 不 clone 也能保留 offset&length\n// return new DataView(o.buffer, o.byteOffset, o.byteLength);\n// }\n// return new DataView(o);\n// }\n\n/**\n * @see {@link https://www.egret.uk/docs/egretengine/engine/egret.ByteArray egret.ByteArray}\n * @see {@link https://github.com/protobufjs/bytebuffer.js protobufjs/bytebuffer.js}\n * @see {@link https://netty.io/4.1/api/io/netty/buffer/ByteBuf.html ByteBuf}\n */\nexport class ByteBuffer {\n position = 0;\n\n #buffer: ArrayBufferLike;\n #view: DataView;\n\n constructor(buffer: AnyBuffer = new ArrayBuffer(0, { maxByteLength: 1024 })) {\n this.#buffer = asBuffer(buffer);\n // NOTE prefer view over buffer, avoid the slice overhead ?\n this.#view = new DataView(this.#buffer);\n }\n\n get view() {\n return this.#view;\n }\n\n get buffer(): ArrayBufferLike {\n return this.#buffer;\n }\n\n set buffer(buffer: AnyBuffer) {\n this.#buffer = asBuffer(buffer);\n this.#view = new DataView(this.#buffer);\n }\n\n get length() {\n return this.view.byteLength;\n }\n\n set length(length: number) {\n this.resize(length);\n }\n\n private willWrite(length: number) {\n if (this.remaining() < length) {\n this.resize(this.position + length);\n }\n }\n\n resize(newLength: number) {\n this.buffer = ArrayBuffers.resize(this.buffer, newLength, Math.ceil(newLength * 1.2));\n }\n\n writeByte(value: number) {\n this.willWrite(1);\n this.view.setUint8(this.position++, value);\n }\n\n writeBytes(bytes: ArrayBufferLike, len: number = bytes.byteLength) {\n this.willWrite(len);\n if (len !== bytes.byteLength) bytes = bytes.slice(0, len);\n new Uint8Array(this.buffer).set(new Uint8Array(bytes), this.position);\n this.position += len;\n }\n\n writeInt8(value: number) {\n this.willWrite(1);\n this.view.setInt8(this.position, value);\n this.position += 1;\n }\n\n writeUint8(value: number) {\n this.willWrite(1);\n this.view.setUint8(this.position, value);\n this.position += 1;\n }\n\n writeInt16(value: number) {\n this.willWrite(2);\n this.view.setInt16(this.position, value);\n this.position += 2;\n }\n\n writeUint16(value: number) {\n this.willWrite(2);\n this.view.setUint16(this.position, value);\n this.position += 2;\n }\n\n writeInt32(value: number) {\n this.willWrite(4);\n this.view.setInt32(this.position, value);\n this.position += 4;\n }\n\n writeUint32(value: number) {\n this.willWrite(4);\n this.view.setUint32(this.position, value);\n this.position += 4;\n }\n\n writeInt64(value: bigint) {\n this.willWrite(8);\n this.view.setBigInt64(this.position, value);\n this.position += 8;\n }\n\n writeUint64(value: bigint) {\n this.willWrite(8);\n this.view.setBigUint64(this.position, value);\n this.position += 8;\n }\n\n writeFloat32(value: number) {\n this.willWrite(4);\n this.view.setFloat32(this.position, value);\n this.position += 4;\n }\n\n writeFloat64(value: number) {\n this.willWrite(8);\n this.view.setFloat64(this.position, value);\n this.position += 8;\n }\n\n writeBoolean(value: boolean) {\n this.writeByte(value ? 1 : 0);\n }\n\n writeString(value: string): void;\n writeString(value: string, len?: number): void;\n writeString(value: string, len?: number) {\n let encoder = new TextEncoder();\n let bytes = encoder.encode(value);\n this.writeBytes(bytes, len);\n }\n\n readByte() {\n return this.view.getUint8(this.position++);\n }\n\n readBytes(length: number) {\n let bytes = this.buffer.slice(this.position, this.position + length);\n this.position += length;\n return bytes;\n }\n\n readInt8() {\n let value = this.view.getInt8(this.position);\n this.position += 1;\n return value;\n }\n\n readUint8() {\n let value = this.view.getUint8(this.position);\n this.position += 1;\n return value;\n }\n\n readInt16() {\n let value = this.view.getInt16(this.position);\n this.position += 2;\n return value;\n }\n\n readUint16() {\n let value = this.view.getUint16(this.position);\n this.position += 2;\n return value;\n }\n\n readInt32() {\n let value = this.view.getInt32(this.position);\n this.position += 4;\n return value;\n }\n\n readUint32() {\n let value = this.view.getUint32(this.position);\n this.position += 4;\n return value;\n }\n\n readInt64() {\n let value = this.view.getBigInt64(this.position);\n this.position += 8;\n return safeNumber(value);\n }\n\n readUint64() {\n let value = this.view.getBigUint64(this.position);\n this.position += 8;\n return safeNumber(value);\n }\n\n readFloat32() {\n let value = this.view.getFloat32(this.position);\n this.position += 4;\n return value;\n }\n\n readFloat64() {\n let value = this.view.getFloat64(this.position);\n this.position += 8;\n return value;\n }\n\n readBoolean() {\n return this.readByte() === 1;\n }\n\n readString(length: number) {\n let bytes = this.readBytes(length);\n let decoder = new TextDecoder();\n let a = new Uint8Array(bytes);\n let idx = a.indexOf(0);\n if (idx !== -1) {\n bytes = bytes.slice(0, idx);\n }\n return decoder.decode(bytes);\n }\n\n readHexString(length: number) {\n let bytes = this.readBytes(length);\n return ArrayBuffers.toHex(bytes);\n }\n\n writeInt24(value: number) {\n this.writeUint8(value & 0xff);\n this.writeUint16(value >> 8);\n }\n\n readInt24() {\n return this.readUint8() | (this.readUint16() << 8);\n }\n\n writeZero(length: number) {\n this.writeBytes(new Uint8Array(length).buffer);\n }\n\n writeValue(typ: TypedValue['type'], val: TypedValue['value']): void;\n writeValue(tv: TypedValue): void;\n writeValue(a: any, b?: any) {\n const tv: TypedValue = typeof a === 'string' ? { type: a, value: b } : a;\n const { type, value, length } = tv;\n switch (type) {\n case 'uint8':\n this.writeUint8(value);\n break;\n case 'byte':\n case 'int8':\n this.writeInt8(value);\n break;\n case 'uint16':\n this.writeUint16(value);\n break;\n case 'int16':\n this.writeInt16(value);\n break;\n case 'uint32':\n this.writeUint32(value);\n break;\n case 'int32':\n this.writeInt32(value);\n break;\n case 'float32':\n this.writeFloat32(value);\n break;\n case 'float64':\n this.writeFloat64(value);\n break;\n case 'string':\n this.writeString(value, length);\n break;\n case 'boolean':\n this.writeBoolean(value);\n break;\n case 'bytes':\n this.writeBytes(value);\n break;\n default:\n throw new Error(`Unknown type ${type}`);\n }\n }\n\n readInt() {\n return this.readInt32();\n }\n\n readFloat() {\n return this.readFloat32();\n }\n\n readDouble() {\n return this.readFloat64();\n }\n\n remaining() {\n return this.length - this.position;\n }\n\n toUint8Array() {\n return new Uint8Array(this.buffer);\n }\n\n toHex() {\n return ArrayBuffers.toHex(this.buffer);\n }\n\n toBase64() {\n return ArrayBuffers.toBase64(this.buffer);\n }\n}\n\nexport interface TypedValue {\n type:\n | 'byte'\n | 'bytes'\n | 'uint8'\n | 'int8'\n | 'uint16'\n | 'int16'\n | 'uint32'\n | 'int32'\n | 'float32'\n | 'float64'\n | 'string'\n | 'boolean';\n value: any;\n length?: number;\n}\n\nfunction safeNumber(n: bigint) {\n if (n > Number.MAX_SAFE_INTEGER) {\n return n;\n }\n return Number(n);\n}\n"],"names":["ArrayBuffers","asBuffer","o","ArrayBuffer","isView","byteLength","buffer","slice","byteOffset","ByteBuffer","position","view","constructor","maxByteLength","DataView","length","resize","willWrite","remaining","newLength","Math","ceil","writeByte","value","setUint8","writeBytes","bytes","len","Uint8Array","set","writeInt8","setInt8","writeUint8","writeInt16","setInt16","writeUint16","setUint16","writeInt32","setInt32","writeUint32","setUint32","writeInt64","setBigInt64","writeUint64","setBigUint64","writeFloat32","setFloat32","writeFloat64","setFloat64","writeBoolean","writeString","encoder","TextEncoder","encode","readByte","getUint8","readBytes","readInt8","getInt8","readUint8","readInt16","getInt16","readUint16","getUint16","readInt32","getInt32","readUint32","getUint32","readInt64","getBigInt64","safeNumber","readUint64","getBigUint64","readFloat32","getFloat32","readFloat64","getFloat64","readBoolean","readString","decoder","TextDecoder","a","idx","indexOf","decode","readHexString","toHex","writeInt24","readInt24","writeZero","writeValue","b","tv","type","Error","readInt","readFloat","readDouble","toUint8Array","toBase64","n","Number","MAX_SAFE_INTEGER"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/maths/random.ts"],"sourcesContent":["/// javascript pseudo random\nexport function createRandom(o: { seed?: string | number } = {}) {\n let seed = typeof o.seed === 'string' ? 0 : o.seed ?? 0;\n if (typeof o.seed === 'string') {\n let sum = 0;\n for (let i = 0; i < o.seed.length; i++) {\n sum += o.seed.charCodeAt(i);\n }\n seed = sum;\n }\n\n return () => {\n const x = Math.sin(seed++) * 10000;\n return x - Math.floor(x);\n };\n}\n"],"names":["createRandom","o","seed","sum","i","length","charCodeAt","x","Math","sin","floor"],"rangeMappings":";;;;;;;;;;;;;;","mappings":"AAAA,4BAA4B;AAC5B,OAAO,SAASA,aAAaC,IAAgC,CAAC,CAAC;IAC7D,IAAIC,OAAO,OAAOD,EAAEC,IAAI,KAAK,WAAW,IAAID,EAAEC,IAAI,IAAI;IACtD,IAAI,OAAOD,EAAEC,IAAI,KAAK,UAAU;QAC9B,IAAIC,MAAM;QACV,IAAK,IAAIC,IAAI,GAAGA,IAAIH,EAAEC,IAAI,CAACG,MAAM,EAAED,IAAK;YACtCD,OAAOF,EAAEC,IAAI,CAACI,UAAU,CAACF;QAC3B;QACAF,OAAOC;IACT;IAEA,OAAO;QACL,MAAMI,IAAIC,KAAKC,GAAG,CAACP,UAAU;QAC7B,OAAOK,IAAIC,KAAKE,KAAK,CAACH;IACxB;AACF"}
1
+ {"version":3,"sources":["../../src/maths/random.ts"],"sourcesContent":["/// javascript pseudo random\nexport function createRandom(o: { seed?: string | number } = {}) {\n let seed = typeof o.seed === 'string' ? 0 : (o.seed ?? 0);\n if (typeof o.seed === 'string') {\n let sum = 0;\n for (let i = 0; i < o.seed.length; i++) {\n sum += o.seed.charCodeAt(i);\n }\n seed = sum;\n }\n\n return () => {\n const x = Math.sin(seed++) * 10000;\n return x - Math.floor(x);\n };\n}\n"],"names":["createRandom","o","seed","sum","i","length","charCodeAt","x","Math","sin","floor"],"rangeMappings":";;;;;;;;;;;;;;","mappings":"AAAA,4BAA4B;AAC5B,OAAO,SAASA,aAAaC,IAAgC,CAAC,CAAC;IAC7D,IAAIC,OAAO,OAAOD,EAAEC,IAAI,KAAK,WAAW,IAAKD,EAAEC,IAAI,IAAI;IACvD,IAAI,OAAOD,EAAEC,IAAI,KAAK,UAAU;QAC9B,IAAIC,MAAM;QACV,IAAK,IAAIC,IAAI,GAAGA,IAAIH,EAAEC,IAAI,CAACG,MAAM,EAAED,IAAK;YACtCD,OAAOF,EAAEC,IAAI,CAACI,UAAU,CAACF;QAC3B;QACAF,OAAOC;IACT;IAEA,OAAO;QACL,MAAMI,IAAIC,KAAKC,GAAG,CAACP,UAAU;QAC7B,OAAOK,IAAIC,KAAKE,KAAK,CAACH;IACxB;AACF"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Mitt: Tiny (~200b) functional event emitter / pubsub.
3
+ * @name createEmitter
4
+ * @returns {Emitter}
5
+ */ export default function createEmitter(all) {
6
+ all = all || new Map();
7
+ let evt;
8
+ return evt = {
9
+ /**
10
+ * A Map of event names to registered handler functions.
11
+ */ all,
12
+ on (type, handler) {
13
+ const handlers = all.get(type);
14
+ if (handlers) {
15
+ handlers.push(handler);
16
+ } else {
17
+ all.set(type, [
18
+ handler
19
+ ]);
20
+ }
21
+ },
22
+ once (type, handler) {
23
+ let fn = handler;
24
+ handler = (...args)=>{
25
+ evt.off(type, fn);
26
+ fn(...args);
27
+ };
28
+ const handlers = all.get(type);
29
+ if (handlers) {
30
+ handlers.push(handler);
31
+ } else {
32
+ all.set(type, [
33
+ handler
34
+ ]);
35
+ }
36
+ },
37
+ off (type, handler) {
38
+ const handlers = all.get(type);
39
+ if (handlers) {
40
+ if (handler) {
41
+ handlers.splice(handlers.indexOf(handler) >>> 0, 1);
42
+ } else {
43
+ all.set(type, []);
44
+ }
45
+ }
46
+ },
47
+ /**
48
+ * Invoke all handlers for the given type.
49
+ * If present, `'*'` handlers are invoked after type-matched handlers.
50
+ *
51
+ * Note: Manually firing '*' handlers is not supported.
52
+ *
53
+ * @param {string|symbol} type The event type to invoke
54
+ * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler
55
+ * @memberOf createEmitter
56
+ */ emit (type, evt) {
57
+ let handlers = all.get(type);
58
+ let ctx = {
59
+ type,
60
+ event: evt
61
+ };
62
+ if (handlers) {
63
+ handlers.slice().map((handler)=>{
64
+ handler(ctx);
65
+ });
66
+ }
67
+ handlers = all.get('*');
68
+ if (handlers) {
69
+ handlers.slice().map((handler)=>{
70
+ handler(ctx);
71
+ });
72
+ }
73
+ }
74
+ };
75
+ }
76
+
77
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/mitt/index.ts"],"sourcesContent":["export type EventType = string | symbol;\n\ntype EventPayload<T = EventType, E = unknown> = { type: T; event: E };\n\nexport type Handler<T = EventType, E = unknown> = (evt: { type: T; event: E }) => void;\n\n// An array of all currently registered event handlers for a type\nexport type EventHandlerList<T = unknown> = Array<Handler<EventType, T>>;\n\n// A map of event types and their corresponding event handlers.\nexport type EventHandlerMap<Events extends Record<EventType, unknown>> = Map<\n keyof Events | '*',\n EventHandlerList<Events[keyof Events]>\n>;\n\nexport interface Emitter<Events extends Record<EventType, unknown>> {\n all: EventHandlerMap<Events>;\n\n on<Key extends keyof Events>(type: Key, handler: Handler<Key, Events[Key]>): void;\n\n on(type: '*', handler: Handler<Events>): void;\n\n once<Key extends keyof Events>(type: Key, handler: Handler<Key, Events[Key]>): void;\n\n once(type: '*', handler: Handler<Events>): void;\n\n off<Key extends keyof Events>(type: Key, handler?: Handler<Key, Events[Key]>): void;\n\n off(type: '*', handler: Handler<Events>): void;\n\n emit<Key extends keyof Events>(type: Key, event: Events[Key]): void;\n\n emit<Key extends keyof Events>(type: undefined extends Events[Key] ? Key : never): void;\n}\n\n/**\n * Mitt: Tiny (~200b) functional event emitter / pubsub.\n * @name createEmitter\n * @returns {Emitter}\n */\nexport default function createEmitter<Events extends Record<EventType, unknown>>(\n all?: EventHandlerMap<Events>,\n): Emitter<Events> {\n type GenericEventHandler = Handler<EventType, Events[keyof Events]>;\n all = all || new Map();\n let evt: Emitter<Events>;\n return (evt = {\n /**\n * A Map of event names to registered handler functions.\n */\n all,\n\n on(type: EventType, handler: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n if (handlers) {\n handlers.push(handler);\n } else {\n all!.set(type, [handler]);\n }\n },\n\n once(type: EventType, handler: GenericEventHandler) {\n let fn = handler;\n handler = (...args) => {\n evt.off(type, fn);\n fn(...args);\n };\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n if (handlers) {\n handlers.push(handler);\n } else {\n all!.set(type, [handler]);\n }\n },\n\n off(type: EventType, handler?: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n if (handlers) {\n if (handler) {\n handlers.splice(handlers.indexOf(handler) >>> 0, 1);\n } else {\n all!.set(type, []);\n }\n }\n },\n\n /**\n * Invoke all handlers for the given type.\n * If present, `'*'` handlers are invoked after type-matched handlers.\n *\n * Note: Manually firing '*' handlers is not supported.\n *\n * @param {string|symbol} type The event type to invoke\n * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler\n * @memberOf createEmitter\n */\n emit(type: EventType, evt?: any) {\n let handlers = all!.get(type);\n let ctx: EventPayload = { type, event: evt };\n if (handlers) {\n (handlers as EventHandlerList).slice().map((handler) => {\n handler(ctx);\n });\n }\n\n handlers = all!.get('*');\n if (handlers) {\n (handlers as EventHandlerList).slice().map((handler) => {\n handler(ctx);\n });\n }\n },\n } as Emitter<Events>);\n}\n"],"names":["createEmitter","all","Map","evt","on","type","handler","handlers","get","push","set","once","fn","args","off","splice","indexOf","emit","ctx","event","slice","map"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAmCA;;;;CAIC,GACD,eAAe,SAASA,cACtBC,GAA6B;IAG7BA,MAAMA,OAAO,IAAIC;IACjB,IAAIC;IACJ,OAAQA,MAAM;QACZ;;KAEC,GACDF;QAEAG,IAAGC,IAAe,EAAEC,OAA4B;YAC9C,MAAMC,WAAmDN,IAAKO,GAAG,CAACH;YAClE,IAAIE,UAAU;gBACZA,SAASE,IAAI,CAACH;YAChB,OAAO;gBACLL,IAAKS,GAAG,CAACL,MAAM;oBAACC;iBAAQ;YAC1B;QACF;QAEAK,MAAKN,IAAe,EAAEC,OAA4B;YAChD,IAAIM,KAAKN;YACTA,UAAU,CAAC,GAAGO;gBACZV,IAAIW,GAAG,CAACT,MAAMO;gBACdA,MAAMC;YACR;YACA,MAAMN,WAAmDN,IAAKO,GAAG,CAACH;YAClE,IAAIE,UAAU;gBACZA,SAASE,IAAI,CAACH;YAChB,OAAO;gBACLL,IAAKS,GAAG,CAACL,MAAM;oBAACC;iBAAQ;YAC1B;QACF;QAEAQ,KAAIT,IAAe,EAAEC,OAA6B;YAChD,MAAMC,WAAmDN,IAAKO,GAAG,CAACH;YAClE,IAAIE,UAAU;gBACZ,IAAID,SAAS;oBACXC,SAASQ,MAAM,CAACR,SAASS,OAAO,CAACV,aAAa,GAAG;gBACnD,OAAO;oBACLL,IAAKS,GAAG,CAACL,MAAM,EAAE;gBACnB;YACF;QACF;QAEA;;;;;;;;;KASC,GACDY,MAAKZ,IAAe,EAAEF,GAAS;YAC7B,IAAII,WAAWN,IAAKO,GAAG,CAACH;YACxB,IAAIa,MAAoB;gBAAEb;gBAAMc,OAAOhB;YAAI;YAC3C,IAAII,UAAU;gBACXA,SAA8Ba,KAAK,GAAGC,GAAG,CAAC,CAACf;oBAC1CA,QAAQY;gBACV;YACF;YAEAX,WAAWN,IAAKO,GAAG,CAAC;YACpB,IAAID,UAAU;gBACXA,SAA8Ba,KAAK,GAAGC,GAAG,CAAC,CAACf;oBAC1CA,QAAQY;gBACV;YACF;QACF;IACF;AACF"}
@@ -1,5 +1,5 @@
1
1
  export function computeIfAbsent(map, key, fn) {
2
- if (map instanceof Map) {
2
+ if (map instanceof Map || map instanceof WeakMap) {
3
3
  if (!map.has(key)) {
4
4
  map.set(key, fn());
5
5
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/objects/computeIfAbsent.ts"],"sourcesContent":["export function computeIfAbsent<K, V>(map: Map<K, V>, key: K, fn: () => V): V;\nexport function computeIfAbsent<K extends string | symbol | number, V>(map: Record<K, V>, key: K, fn: () => V): V;\nexport function computeIfAbsent<K, V>(map: any, key: K, fn: () => V): V {\n if (map instanceof Map) {\n if (!map.has(key)) {\n map.set(key, fn());\n }\n return map.get(key)!;\n }\n\n if (!map[key]) {\n map[key] = fn();\n }\n return map[key];\n}\n"],"names":["computeIfAbsent","map","key","fn","Map","has","set","get"],"rangeMappings":";;;;;;;;;;;","mappings":"AAEA,OAAO,SAASA,gBAAsBC,GAAQ,EAAEC,GAAM,EAAEC,EAAW;IACjE,IAAIF,eAAeG,KAAK;QACtB,IAAI,CAACH,IAAII,GAAG,CAACH,MAAM;YACjBD,IAAIK,GAAG,CAACJ,KAAKC;QACf;QACA,OAAOF,IAAIM,GAAG,CAACL;IACjB;IAEA,IAAI,CAACD,GAAG,CAACC,IAAI,EAAE;QACbD,GAAG,CAACC,IAAI,GAAGC;IACb;IACA,OAAOF,GAAG,CAACC,IAAI;AACjB"}
1
+ {"version":3,"sources":["../../src/objects/computeIfAbsent.ts"],"sourcesContent":["export function computeIfAbsent<K extends WeakKey, V>(map: WeakMap<K, V>, key: K, fn: () => V): V;\nexport function computeIfAbsent<K, V>(map: Map<K, V>, key: K, fn: () => V): V;\nexport function computeIfAbsent<K extends string | symbol | number, V>(map: Record<K, V>, key: K, fn: () => V): V;\nexport function computeIfAbsent(map: any, key: any, fn: () => any): any {\n if (map instanceof Map || map instanceof WeakMap) {\n if (!map.has(key)) {\n map.set(key, fn());\n }\n return map.get(key)!;\n }\n\n if (!map[key]) {\n map[key] = fn();\n }\n return map[key];\n}\n"],"names":["computeIfAbsent","map","key","fn","Map","WeakMap","has","set","get"],"rangeMappings":";;;;;;;;;;;","mappings":"AAGA,OAAO,SAASA,gBAAgBC,GAAQ,EAAEC,GAAQ,EAAEC,EAAa;IAC/D,IAAIF,eAAeG,OAAOH,eAAeI,SAAS;QAChD,IAAI,CAACJ,IAAIK,GAAG,CAACJ,MAAM;YACjBD,IAAIM,GAAG,CAACL,KAAKC;QACf;QACA,OAAOF,IAAIO,GAAG,CAACN;IACjB;IAEA,IAAI,CAACD,GAAG,CAACC,IAAI,EAAE;QACbD,GAAG,CAACC,IAAI,GAAGC;IACb;IACA,OAAOF,GAAG,CAACC,IAAI;AACjB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wener/utils",
3
- "version": "1.1.47",
3
+ "version": "1.1.48",
4
4
  "type": "module",
5
5
  "description": "Utils for daily use",
6
6
  "repository": {
@@ -69,23 +69,15 @@
69
69
  "template",
70
70
  "lodash"
71
71
  ],
72
- "peerDependencies": {
73
- "undici": "*"
74
- },
75
- "peerDependenciesMeta": {
76
- "undici": {
77
- "optional": true
78
- }
79
- },
80
72
  "devDependencies": {
81
- "@sinclair/typebox": "^0.32.29",
82
- "@types/lodash": "^4.17.1",
83
- "@types/ws": "^8.5.10",
73
+ "@sinclair/typebox": "^0.32.35",
74
+ "@types/lodash": "^4.17.7",
75
+ "@types/ws": "^8.5.12",
84
76
  "@wener/utils": "link:",
85
- "https-proxy-agent": "^7.0.4",
77
+ "https-proxy-agent": "^7.0.5",
86
78
  "lodash": "^4.17.21",
87
79
  "node-fetch": "^3.3.2",
88
- "undici": "^6.16.0",
80
+ "undici": "^6.19.5",
89
81
  "zod": "^3.23.8"
90
82
  },
91
83
  "publishConfig": {
@@ -0,0 +1,52 @@
1
+ /**
2
+ * A collection of utility functions for working with Promises.
3
+ */
4
+ export class Promises {
5
+ /**
6
+ * Creates a new Promise and returns it in an object, along with its resolve and reject functions.
7
+ * @returns An object with the properties `promise`, `resolve`, and `reject`.
8
+ *
9
+ * ```ts
10
+ * const { promise, resolve, reject } = Promise.withResolvers<T>();
11
+ * ```
12
+ *
13
+ * - Chrome 119, Safari 17.4
14
+ *
15
+ * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers
16
+ */
17
+ static withResolvers<T>(): PromiseWithResolvers<T> {
18
+ if ('withResolvers' in Promise) {
19
+ return Promise['withResolvers']() as any;
20
+ }
21
+ let resolve: (value: T | PromiseLike<T>) => void;
22
+ let reject: (reason?: any) => void;
23
+ // @ts-ignore
24
+ const promise = new Promise<T>((res, rej) => {
25
+ resolve = res;
26
+ reject = rej;
27
+ });
28
+ return { promise, resolve: resolve!, reject: reject! };
29
+ }
30
+
31
+ /**
32
+ * Creates a new Promise and returns it in an object, along with its resolve and reject functions.
33
+ * @param ms The number of milliseconds to wait before rejecting the promise.
34
+ */
35
+ static sleep(ms: number): Promise<void> {
36
+ return new Promise((resolve) => setTimeout(resolve, ms));
37
+ }
38
+
39
+ /**
40
+ * Returns `true` if the given value is a Promise.
41
+ * @param v The value to check.
42
+ */
43
+ static isPromise<T>(v: any): v is Promise<T> {
44
+ return v && (v instanceof Promise || (v.then && v.catch));
45
+ }
46
+ }
47
+
48
+ interface PromiseWithResolvers<T> {
49
+ promise: Promise<T>;
50
+ resolve: (value: T | PromiseLike<T>) => void;
51
+ reject: (reason?: any) => void;
52
+ }
@@ -1,3 +1,3 @@
1
- export function isPromise<T>(v: any): v is Promise<T> {
2
- return v && (v instanceof Promise || (v.then && v.catch));
3
- }
1
+ import { Promises } from './Promises';
2
+
3
+ export const isPromise = Promises.isPromise;
@@ -39,14 +39,8 @@ const DivisionCodeLevels = [
39
39
  *
40
40
  * @see https://zh.wikipedia.org/wiki/GB/T_2260 中华人民共和国行政区划代码
41
41
  */
42
- export class DivisionCode {
43
- static Levels = DivisionCodeLevels;
44
-
45
- private static instance: DivisionCode;
46
-
47
- static get() {
48
- return this.instance || (this.instance = new DivisionCode());
49
- }
42
+ export class DivisionCodeFormat {
43
+ static levels = DivisionCodeLevels;
50
44
 
51
45
  regex = /^(?<province>\d{2})(?<city>\d{2})?(?<county>\d{2})?(?<town>\d{3})?(?<village>\d{3})?$/;
52
46
 
@@ -87,6 +81,63 @@ export class DivisionCode {
87
81
  [82, '澳门特别行政区'],
88
82
  // 9 国外
89
83
  ];
84
+
85
+ parse(code: string) {
86
+ if (!code) return;
87
+ const { regex } = this;
88
+ const match = regex.exec(code);
89
+ if (!match) return;
90
+ const { province, city, county, town, village } = match.groups ?? {};
91
+ if (!province) return;
92
+
93
+ return {
94
+ province,
95
+ city,
96
+ county,
97
+ town,
98
+ village,
99
+ };
100
+ }
101
+ }
102
+
103
+ interface DivisionTreeNode {
104
+ sub: string; // sub code
105
+ children?: Record<string, DivisionTreeNode>;
106
+
107
+ code: string; // full code
108
+ name?: string; // name of division
109
+ }
110
+
111
+ export type DivisionCodeLevel = 'Village' | 'Town' | 'County' | 'City' | 'Province';
112
+
113
+ export interface ParsedDivisionCode {
114
+ level: DivisionCodeLevel;
115
+ code: string;
116
+ name?: string;
117
+ fullName?: string;
118
+ names: string[];
119
+ // 村级(村委会、居委会)
120
+ // 12 位
121
+ village?: CodeName;
122
+ // 乡级(乡镇、街道)
123
+ // 9 位
124
+ town?: CodeName;
125
+ // 县级(区县)
126
+ // 6 位 - 常用 - 2985 个
127
+ county?: CodeName;
128
+ // 地级(城市)
129
+ // 4 位 - 343 个
130
+ city?: CodeName;
131
+ // 省级(省份、直辖市、自治区)
132
+ // 2 位 - 32 个
133
+ province: CodeName;
134
+
135
+ children?: Array<{ code: string; name?: string }>;
136
+ }
137
+
138
+ export interface CodeName {
139
+ code: string;
140
+ name: string;
90
141
  }
91
142
 
92
143
  // export function getSimpleProvinceLabel(value: string) {
@@ -100,3 +151,5 @@ export class DivisionCode {
100
151
  // }
101
152
  // return label.replace(/省|市|(回族|维吾尔|壮族)?自治区|特别行政区$/, '');
102
153
  // }
154
+
155
+ export const DivisionCode = new DivisionCodeFormat();
@@ -0,0 +1,6 @@
1
+ import { test } from 'vitest';
2
+ import { DivisionCode } from './DivisionCode';
3
+
4
+ test('division', () => {
5
+ console.log(DivisionCode.parse('441900003001'));
6
+ });
@@ -3,13 +3,8 @@
3
3
  */
4
4
  export class Mod11Checksum {
5
5
  weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];
6
- private static instance: Mod11Checksum;
7
6
 
8
- static get() {
9
- return this.instance || (this.instance = new Mod11Checksum());
10
- }
11
-
12
- verify(s: string) {
7
+ validate(s: string) {
13
8
  return s.at(-1) === this.generate(s.slice(0, s.length - 1));
14
9
  }
15
10
 
@@ -27,3 +22,5 @@ export class Mod11Checksum {
27
22
  }
28
23
  }
29
24
  }
25
+
26
+ export const Mod11 = new Mod11Checksum();
@@ -1,7 +1,7 @@
1
- import { Mod11Checksum } from './Mod11Checksum';
1
+ import { Mod11 } from './Mod11';
2
2
 
3
- export class ResidentIdNumber {
4
- checksum = Mod11Checksum.get();
3
+ class ResidentIdNumberFormat {
4
+ checksum = Mod11;
5
5
 
6
6
  // 9 https://zh.wikipedia.org/wiki/中华人民共和国外国人永久居留身份证
7
7
  // 9 标识码
@@ -11,19 +11,15 @@ export class ResidentIdNumber {
11
11
  regex =
12
12
  /^(?<division>[1-9]\d{5})(?<year>18|19|20)\d{2}(?<month>0[1-9]|1[0-2])(?<day>0[1-9]|[12]\d|3[01])(?<sequence>\d{3})(?<checksum>[0-9Xx])$/;
13
13
 
14
- private static instance: ResidentIdNumber;
15
-
16
- static get() {
17
- return (this.instance ||= new ResidentIdNumber());
18
- }
19
-
20
- verify(s: string) {
14
+ validate(s: string) {
21
15
  if (!s) return false;
22
- return this.regex.test(s) && this.checksum.verify(s.toUpperCase());
16
+ return this.regex.test(s) && this.checksum.validate(s.toUpperCase());
23
17
  }
24
18
 
19
+ generate(opts: { sex?: 'Male' | 'Female'; age?: number; birthDate?: Date; division?: string }) {}
20
+
25
21
  parse(s: string): IdNumber | undefined {
26
- if (!this.verify(s)) {
22
+ if (!this.validate(s)) {
27
23
  return;
28
24
  }
29
25
 
@@ -86,7 +82,7 @@ class IdNumber {
86
82
  }
87
83
 
88
84
  get valid() {
89
- return ResidentIdNumber.get().verify(this.toString());
85
+ return ResidentIdNumber.validate(this.toString());
90
86
  }
91
87
 
92
88
  get male() {
@@ -126,3 +122,5 @@ function formatDate(date: Date, format = 'YYYYMMDD') {
126
122
  throw new Error(`Invalid format`);
127
123
  }
128
124
  }
125
+
126
+ export const ResidentIdNumber = new ResidentIdNumberFormat();
@@ -1,19 +1,19 @@
1
1
  import { assert, expect, test } from 'vitest';
2
- import { Mod11Checksum } from './Mod11Checksum';
2
+ import { Mod11 } from './Mod11';
3
3
  import { ResidentIdNumber } from './ResidentIdNumber';
4
4
 
5
5
  test('id', (t) => {
6
6
  const ids = ['11010519491231002X', '11010219840406970X'];
7
7
 
8
- let cs = Mod11Checksum.get();
8
+ let cs = Mod11;
9
9
  for (const id of ids) {
10
10
  assert.equal(cs.generate(id.slice(0, -1)), id.at(-1));
11
11
  }
12
12
 
13
- let parse = ResidentIdNumber.get().parse(ids[0]);
14
- expect(parse?.toObject()).toEqual({
13
+ let parse = ResidentIdNumber.parse(ids[0]);
14
+ expect(parse?.toObject()).toMatchObject({
15
15
  division: '110105',
16
- date: new Date('1949-12-31'),
16
+ birthDate: new Date('1949-12-31'),
17
17
  sequence: 2,
18
18
  checksum: 'X',
19
19
  });
@@ -15,7 +15,8 @@ test(
15
15
  timeout: 1000 * 60 * 30,
16
16
  },
17
17
  async () => {
18
- await generate();
18
+ // missing parent 4419003 for 441900003001
19
+ // await generate();
19
20
  },
20
21
  );
21
22
 
@@ -14,12 +14,6 @@ export class Mod31Checksum {
14
14
  {} as Record<string, number>,
15
15
  );
16
16
 
17
- private static instance: Mod31Checksum;
18
-
19
- static get() {
20
- return this.instance || (this.instance = new Mod31Checksum());
21
- }
22
-
23
17
  toChar(n: number) {
24
18
  return this.chars[n];
25
19
  }
@@ -28,7 +22,7 @@ export class Mod31Checksum {
28
22
  return this.numbers[c];
29
23
  }
30
24
 
31
- verify(s: string) {
25
+ validate(s: string) {
32
26
  return s.at(-1) === this.generate(s.slice(0, s.length - 1));
33
27
  }
34
28
 
@@ -40,3 +34,5 @@ export class Mod31Checksum {
40
34
  return this.toChar(31 - (sum % 31));
41
35
  }
42
36
  }
37
+
38
+ export const Mod31 = new Mod31Checksum();
@@ -1,4 +1,4 @@
1
- import { Mod31Checksum } from './Mod31Checksum';
1
+ import { Mod31 } from './Mod31';
2
2
 
3
3
  /**
4
4
  * - GB 32100-2015 法人和其他组织统一社会信用代码编码规则
@@ -8,7 +8,7 @@ import { Mod31Checksum } from './Mod31Checksum';
8
8
  *
9
9
  * @see https://en.wikipedia.org/wiki/Unified_Social_Credit_Identifier
10
10
  */
11
- export class USCC {
11
+ export class UnifiedSocialCreditCodeFormat {
12
12
  registryCodeLabels: Record<string, Code> = {
13
13
  1: {
14
14
  label: '机构编制',
@@ -47,13 +47,7 @@ export class USCC {
47
47
 
48
48
  /* 16 位 */
49
49
  regex = /^([159][1239]|Y1)[0-9]{6}[0-9A-HJ-NP-RTUWXY]{10}$/; // 无 I O Z S V
50
- checksum = Mod31Checksum.get();
51
-
52
- static instance: USCC;
53
-
54
- static get() {
55
- return (this.instance ||= new USCC());
56
- }
50
+ checksum = Mod31;
57
51
 
58
52
  parse(s: string): ParsedUSCC {
59
53
  let registryCode = s[0];
@@ -71,8 +65,8 @@ export class USCC {
71
65
  };
72
66
  }
73
67
 
74
- verify(s: string) {
75
- return this.regex.test(s) && this.checksum.verify(s);
68
+ validate(s: string) {
69
+ return this.regex.test(s) && this.checksum.validate(s);
76
70
  }
77
71
  }
78
72
 
@@ -96,3 +90,5 @@ interface ParsedUSCC {
96
90
  // 校验码
97
91
  checksum: string;
98
92
  }
93
+
94
+ export const USCC = new UnifiedSocialCreditCodeFormat();
@@ -4,5 +4,5 @@ import { USCC } from './USCC';
4
4
  * USCC - 统一社会信用代码
5
5
  */
6
6
  export function isUSCC(s: string) {
7
- return USCC.get().verify(s);
7
+ return USCC.validate(s);
8
8
  }
@@ -1,16 +1,16 @@
1
1
  import { expect, test } from 'vitest';
2
2
  import { isUSCC } from './isUSCC';
3
- import { Mod31Checksum } from './Mod31Checksum';
3
+ import { Mod31 } from './Mod31';
4
4
  import { USCC } from './USCC';
5
5
 
6
6
  test('uscc', () => {
7
- let cs = Mod31Checksum.get();
7
+ let cs = Mod31;
8
8
 
9
9
  // 阿里云计算
10
- expect(cs.verify('91330106673959654P')).toBeTruthy();
10
+ expect(cs.validate('91330106673959654P')).toBeTruthy();
11
11
  expect(cs.generate('91330106673959654')).toBe('P');
12
12
 
13
13
  expect(isUSCC('91330106673959654P')).toBeTruthy();
14
14
 
15
- console.log(USCC.get().parse('91330106673959654P'));
15
+ console.log(USCC.parse('91330106673959654P'));
16
16
  });