@etsoo/shared 1.2.79 → 1.2.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -324,6 +324,7 @@ String and other related utilities
324
324
  | objectKeys | Get two object's unqiue properties |
325
325
  | objectUpdated | Get the new object's updated fields contrast to the previous object |
326
326
  | parseJsonArray | Try to parse JSON input to array |
327
+ | parseName | Parse name data |
327
328
  | parsePath | Parse path similar with node.js path.parse |
328
329
  | parseString | Parse string (JSON) to specific type |
329
330
  | removeEmptyValues | Remove empty values (null, undefined, '') from the input object |
@@ -356,6 +356,20 @@ test("Tests for getResult", () => {
356
356
  expect(valueResult).toBe(5);
357
357
  });
358
358
 
359
+ test("Tests for parseName", () => {
360
+ const nd = Utils.parseName("王小明");
361
+ expect(nd.familyName).toBe("王");
362
+ expect(nd.givenName).toBe("小明");
363
+
364
+ const nd2 = Utils.parseName("John Smith");
365
+ expect(nd2.familyName).toBe("Smith");
366
+ expect(nd2.givenName).toBe("John");
367
+
368
+ const nd3 = Utils.parseName("单 名");
369
+ expect(nd3.familyName).toBe("单");
370
+ expect(nd3.givenName).toBe("名");
371
+ });
372
+
359
373
  test("Tests for parsePath, file only", () => {
360
374
  const result = Utils.parsePath("a.jpg");
361
375
  expect(result.root).toBe("");
@@ -306,6 +306,15 @@ export declare namespace Utils {
306
306
  * @param keepNull Keep null value or not
307
307
  */
308
308
  export function setNestedValue(data: object, name: string, value: unknown, keepNull?: boolean): void;
309
+ /**
310
+ * Parse name
311
+ * @param name Name
312
+ * @returns Result
313
+ */
314
+ export function parseName(name: string): {
315
+ familyName: string | undefined;
316
+ givenName: string | undefined;
317
+ };
309
318
  /**
310
319
  * Parse path similar with node.js path.parse
311
320
  * @param path Input path
package/lib/cjs/Utils.js CHANGED
@@ -647,6 +647,42 @@ var Utils;
647
647
  }
648
648
  }
649
649
  Utils.setNestedValue = setNestedValue;
650
+ /**
651
+ * Parse name
652
+ * @param name Name
653
+ * @returns Result
654
+ */
655
+ function parseName(name) {
656
+ // Trim
657
+ name = name.trim();
658
+ let familyName;
659
+ let givenName;
660
+ if (name.containChinese() ||
661
+ name.containJapanese() ||
662
+ name.containKorean()) {
663
+ // CJK characters
664
+ if (name.length >= 2) {
665
+ familyName = name[0];
666
+ givenName = name.substring(1).trim();
667
+ }
668
+ else {
669
+ familyName = name;
670
+ }
671
+ }
672
+ else {
673
+ const parts = name.split(/\s+/);
674
+ const len = parts.length;
675
+ if (len >= 2) {
676
+ familyName = parts[len - 1];
677
+ givenName = parts[0];
678
+ }
679
+ else {
680
+ givenName = name;
681
+ }
682
+ }
683
+ return { familyName, givenName };
684
+ }
685
+ Utils.parseName = parseName;
650
686
  /**
651
687
  * Parse path similar with node.js path.parse
652
688
  * @param path Input path
@@ -306,6 +306,15 @@ export declare namespace Utils {
306
306
  * @param keepNull Keep null value or not
307
307
  */
308
308
  export function setNestedValue(data: object, name: string, value: unknown, keepNull?: boolean): void;
309
+ /**
310
+ * Parse name
311
+ * @param name Name
312
+ * @returns Result
313
+ */
314
+ export function parseName(name: string): {
315
+ familyName: string | undefined;
316
+ givenName: string | undefined;
317
+ };
309
318
  /**
310
319
  * Parse path similar with node.js path.parse
311
320
  * @param path Input path
package/lib/mjs/Utils.js CHANGED
@@ -644,6 +644,42 @@ export var Utils;
644
644
  }
645
645
  }
646
646
  Utils.setNestedValue = setNestedValue;
647
+ /**
648
+ * Parse name
649
+ * @param name Name
650
+ * @returns Result
651
+ */
652
+ function parseName(name) {
653
+ // Trim
654
+ name = name.trim();
655
+ let familyName;
656
+ let givenName;
657
+ if (name.containChinese() ||
658
+ name.containJapanese() ||
659
+ name.containKorean()) {
660
+ // CJK characters
661
+ if (name.length >= 2) {
662
+ familyName = name[0];
663
+ givenName = name.substring(1).trim();
664
+ }
665
+ else {
666
+ familyName = name;
667
+ }
668
+ }
669
+ else {
670
+ const parts = name.split(/\s+/);
671
+ const len = parts.length;
672
+ if (len >= 2) {
673
+ familyName = parts[len - 1];
674
+ givenName = parts[0];
675
+ }
676
+ else {
677
+ givenName = name;
678
+ }
679
+ }
680
+ return { familyName, givenName };
681
+ }
682
+ Utils.parseName = parseName;
647
683
  /**
648
684
  * Parse path similar with node.js path.parse
649
685
  * @param path Input path
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@etsoo/shared",
3
- "version": "1.2.79",
3
+ "version": "1.2.80",
4
4
  "description": "TypeScript shared utilities and functions",
5
5
  "main": "lib/cjs/index.js",
6
6
  "module": "lib/mjs/index.js",
@@ -36,10 +36,10 @@
36
36
  },
37
37
  "homepage": "https://github.com/ETSOO/Shared#readme",
38
38
  "devDependencies": {
39
- "@types/node": "^24.10.0",
40
- "@vitejs/plugin-react": "^5.1.0",
41
- "jsdom": "^27.1.0",
39
+ "@types/node": "^24.10.1",
40
+ "@vitejs/plugin-react": "^5.1.1",
41
+ "jsdom": "^27.2.0",
42
42
  "typescript": "^5.9.3",
43
- "vitest": "^4.0.7"
43
+ "vitest": "^4.0.10"
44
44
  }
45
45
  }
package/src/Utils.ts CHANGED
@@ -899,6 +899,44 @@ export namespace Utils {
899
899
  }
900
900
  }
901
901
 
902
+ /**
903
+ * Parse name
904
+ * @param name Name
905
+ * @returns Result
906
+ */
907
+ export function parseName(name: string) {
908
+ // Trim
909
+ name = name.trim();
910
+
911
+ let familyName: string | undefined;
912
+ let givenName: string | undefined;
913
+
914
+ if (
915
+ name.containChinese() ||
916
+ name.containJapanese() ||
917
+ name.containKorean()
918
+ ) {
919
+ // CJK characters
920
+ if (name.length >= 2) {
921
+ familyName = name[0];
922
+ givenName = name.substring(1).trim();
923
+ } else {
924
+ familyName = name;
925
+ }
926
+ } else {
927
+ const parts = name.split(/\s+/);
928
+ const len = parts.length;
929
+ if (len >= 2) {
930
+ familyName = parts[len - 1];
931
+ givenName = parts[0];
932
+ } else {
933
+ givenName = name;
934
+ }
935
+ }
936
+
937
+ return { familyName, givenName };
938
+ }
939
+
902
940
  /**
903
941
  * Parse path similar with node.js path.parse
904
942
  * @param path Input path