@workwell-global/toolkit 1.1.44 → 1.1.46
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 +4 -2
- package/dist/models/schemas/api/batch/SBatchAPI.d.ts +26 -5
- package/dist/models/schemas/api/batch/SBatchAPI.d.ts.map +1 -1
- package/dist/models/schemas/api/batch/SBatchAPI.js +11 -2
- package/dist/models/schemas/api/batch/SBatchAPI.js.map +1 -1
- package/dist/models/schemas/api/note/DNoteAPI.d.ts +64 -0
- package/dist/models/schemas/api/note/DNoteAPI.d.ts.map +1 -0
- package/dist/models/schemas/api/note/DNoteAPI.js +43 -0
- package/dist/models/schemas/api/note/DNoteAPI.js.map +1 -0
- package/dist/utils/strings/manipulate.d.ts +11 -1
- package/dist/utils/strings/manipulate.d.ts.map +1 -1
- package/dist/utils/strings/manipulate.js +47 -42
- package/dist/utils/strings/manipulate.js.map +1 -1
- package/dist/utils/strings/manipulate.test.js +42 -0
- package/dist/utils/strings/manipulate.test.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ Shared utilities, types, and helpers for Workwell Global projects.
|
|
|
7
7
|
For complete documentation, please see the [docs](./docs) folder:
|
|
8
8
|
|
|
9
9
|
- **[Quick Start Guide](./docs/QUICK-START.md)** - Complete publishing and usage instructions
|
|
10
|
-
- **[Next.js Troubleshooting](./docs/NEXTJS-TROUBLESHOOTING.md)** - Comprehensive solutions for Next.js projects
|
|
10
|
+
- **[Next.js Troubleshooting](./docs/NEXTJS-TROUBLESHOOTING.md)** - Comprehensive solutions for Next.js projects
|
|
11
11
|
- **[Consuming Project Setup](./docs/CONSUMING-PROJECT-SETUP.md)** - General setup guide for any TypeScript project
|
|
12
12
|
- **[Publishing Checklist](./docs/PUBLISHING-CHECKLIST.md)** - Step-by-step publishing guide
|
|
13
13
|
|
|
@@ -55,6 +55,7 @@ See [docs/QUICK-START.md](./docs/QUICK-START.md) for complete instructions.
|
|
|
55
55
|
## 🔧 Troubleshooting
|
|
56
56
|
|
|
57
57
|
Having issues? Check:
|
|
58
|
+
|
|
58
59
|
1. **[Next.js Troubleshooting Guide](./docs/NEXTJS-TROUBLESHOOTING.md)** - For Next.js specific issues
|
|
59
60
|
2. **[Consuming Project Setup](./docs/CONSUMING-PROJECT-SETUP.md)** - For general TypeScript setup
|
|
60
61
|
|
|
@@ -74,10 +75,12 @@ app/mappings/userPermissionsMapper.ts uses enums/LinkedRoles: Status
|
|
|
74
75
|
## IMPLEMENTATION PROGRESS - SERVICES
|
|
75
76
|
|
|
76
77
|
app/mappings/webPortalLoginMapper.ts uses
|
|
78
|
+
|
|
77
79
|
- models/crm-dynamics: I365WebPortalLogin
|
|
78
80
|
- models/objects: IWebPortalLogin
|
|
79
81
|
|
|
80
82
|
app/mappings/bankAccountMapper.ts uses
|
|
83
|
+
|
|
81
84
|
- models/crm-dynamics: I365WebBackAccount
|
|
82
85
|
- models/objects: IBankAccount
|
|
83
86
|
|
|
@@ -85,4 +88,3 @@ uses models/objects/
|
|
|
85
88
|
uses models/objects/
|
|
86
89
|
uses models/objects/
|
|
87
90
|
uses models/objects/
|
|
88
|
-
|
|
@@ -1,21 +1,42 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export declare const SBatchAPI: z.ZodObject<{
|
|
2
|
+
export declare const SBatchAPI: z.ZodUnion<[z.ZodObject<{
|
|
3
3
|
method: z.ZodEnum<["POST", "PATCH", "DELETE"]>;
|
|
4
4
|
type: z.ZodString;
|
|
5
|
-
data: z.ZodRecord<z.ZodString, z.
|
|
5
|
+
data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
6
6
|
id: z.ZodOptional<z.ZodString>;
|
|
7
7
|
refId: z.ZodOptional<z.ZodNumber>;
|
|
8
8
|
}, "strip", z.ZodTypeAny, {
|
|
9
9
|
type: string;
|
|
10
|
-
data: Record<string,
|
|
10
|
+
data: Record<string, unknown>;
|
|
11
11
|
method: "POST" | "PATCH" | "DELETE";
|
|
12
12
|
id?: string | undefined;
|
|
13
13
|
refId?: number | undefined;
|
|
14
14
|
}, {
|
|
15
15
|
type: string;
|
|
16
|
-
data: Record<string,
|
|
16
|
+
data: Record<string, unknown>;
|
|
17
17
|
method: "POST" | "PATCH" | "DELETE";
|
|
18
18
|
id?: string | undefined;
|
|
19
19
|
refId?: number | undefined;
|
|
20
|
-
}
|
|
20
|
+
}>, z.ZodObject<{
|
|
21
|
+
method: z.ZodLiteral<"GET">;
|
|
22
|
+
type: z.ZodString;
|
|
23
|
+
data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
24
|
+
id: z.ZodOptional<z.ZodString>;
|
|
25
|
+
query: z.ZodOptional<z.ZodString>;
|
|
26
|
+
key: z.ZodOptional<z.ZodString>;
|
|
27
|
+
}, "strip", z.ZodTypeAny, {
|
|
28
|
+
type: string;
|
|
29
|
+
method: "GET";
|
|
30
|
+
id?: string | undefined;
|
|
31
|
+
data?: Record<string, unknown> | undefined;
|
|
32
|
+
key?: string | undefined;
|
|
33
|
+
query?: string | undefined;
|
|
34
|
+
}, {
|
|
35
|
+
type: string;
|
|
36
|
+
method: "GET";
|
|
37
|
+
id?: string | undefined;
|
|
38
|
+
data?: Record<string, unknown> | undefined;
|
|
39
|
+
key?: string | undefined;
|
|
40
|
+
query?: string | undefined;
|
|
41
|
+
}>]>;
|
|
21
42
|
//# sourceMappingURL=SBatchAPI.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SBatchAPI.d.ts","sourceRoot":"","sources":["../../../../../src/models/schemas/api/batch/SBatchAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"SBatchAPI.d.ts","sourceRoot":"","sources":["../../../../../src/models/schemas/api/batch/SBatchAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAmBvB,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAA8C,CAAA"}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
|
|
2
|
+
const SBatchMutationAPI = z.object({
|
|
3
3
|
method: z.enum(['POST', 'PATCH', 'DELETE']),
|
|
4
4
|
type: z.string(),
|
|
5
|
-
data: z.record(z.
|
|
5
|
+
data: z.record(z.unknown()),
|
|
6
6
|
id: z.string().optional(),
|
|
7
7
|
refId: z.number().optional(),
|
|
8
8
|
});
|
|
9
|
+
const SBatchReadAPI = z.object({
|
|
10
|
+
method: z.literal('GET'),
|
|
11
|
+
type: z.string(),
|
|
12
|
+
data: z.record(z.unknown()).optional(),
|
|
13
|
+
id: z.string().optional(),
|
|
14
|
+
query: z.string().optional(),
|
|
15
|
+
key: z.string().optional(),
|
|
16
|
+
});
|
|
17
|
+
export const SBatchAPI = z.union([SBatchMutationAPI, SBatchReadAPI]);
|
|
9
18
|
//# sourceMappingURL=SBatchAPI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SBatchAPI.js","sourceRoot":"","sources":["../../../../../src/models/schemas/api/batch/SBatchAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,
|
|
1
|
+
{"version":3,"file":"SBatchAPI.js","sourceRoot":"","sources":["../../../../../src/models/schemas/api/batch/SBatchAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAA;AAEF,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IACtC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3B,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const noteOptions: {
|
|
3
|
+
readonly DocumentAttached: {
|
|
4
|
+
readonly no: 0;
|
|
5
|
+
readonly yes: 1;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
export declare const noteRelationships: {
|
|
9
|
+
regardingAssignment: {
|
|
10
|
+
relationshipName: string;
|
|
11
|
+
entity: "ww_assignments";
|
|
12
|
+
};
|
|
13
|
+
regardingReferral: {
|
|
14
|
+
relationshipName: string;
|
|
15
|
+
entity: "ww_saleschecklists";
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export declare const noteFields: {
|
|
19
|
+
readonly annotationid: {
|
|
20
|
+
readonly pretty: "noteId";
|
|
21
|
+
readonly type: z.ZodString;
|
|
22
|
+
};
|
|
23
|
+
readonly regardingobject: {
|
|
24
|
+
readonly pretty: "regarding";
|
|
25
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
26
|
+
};
|
|
27
|
+
readonly isdocument: {
|
|
28
|
+
readonly pretty: "documentAttached";
|
|
29
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
30
|
+
};
|
|
31
|
+
readonly filenameattachment: {
|
|
32
|
+
readonly pretty: "fileName";
|
|
33
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
34
|
+
};
|
|
35
|
+
readonly filesize: {
|
|
36
|
+
readonly pretty: "fileSizeBytes";
|
|
37
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
38
|
+
};
|
|
39
|
+
readonly notetext: {
|
|
40
|
+
readonly pretty: "noteText";
|
|
41
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
42
|
+
};
|
|
43
|
+
readonly egg: {
|
|
44
|
+
readonly pretty: "avocado";
|
|
45
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
46
|
+
};
|
|
47
|
+
readonly _objectid_value: {
|
|
48
|
+
readonly pretty: "inRelationTo";
|
|
49
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
50
|
+
};
|
|
51
|
+
readonly objectid_ww_assignment: {
|
|
52
|
+
readonly relationshipName: string;
|
|
53
|
+
readonly entity: "ww_assignments";
|
|
54
|
+
readonly pretty: "regardingAssignment";
|
|
55
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
56
|
+
};
|
|
57
|
+
readonly objectid_ww_saleschecklist: {
|
|
58
|
+
readonly relationshipName: string;
|
|
59
|
+
readonly entity: "ww_saleschecklists";
|
|
60
|
+
readonly pretty: "regardingReferral";
|
|
61
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=DNoteAPI.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DNoteAPI.d.ts","sourceRoot":"","sources":["../../../../../src/models/schemas/api/note/DNoteAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,WAAW;;;;;CAKd,CAAA;AAEV,eAAO,MAAM,iBAAiB;;;;;;;;;CAS7B,CAAA;AAED,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuBb,CAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { EntityNames } from '../../../../enums/EntityNames.js';
|
|
3
|
+
export const noteOptions = {
|
|
4
|
+
DocumentAttached: {
|
|
5
|
+
no: 0,
|
|
6
|
+
yes: 1,
|
|
7
|
+
},
|
|
8
|
+
};
|
|
9
|
+
export const noteRelationships = {
|
|
10
|
+
regardingAssignment: {
|
|
11
|
+
relationshipName: 'objectid_ww_assignment',
|
|
12
|
+
entity: EntityNames.assignment.entitySetName,
|
|
13
|
+
},
|
|
14
|
+
regardingReferral: {
|
|
15
|
+
relationshipName: 'objectid_ww_saleschecklist',
|
|
16
|
+
entity: EntityNames.referral.entitySetName,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
export const noteFields = {
|
|
20
|
+
annotationid: { pretty: 'noteId', type: z.string().uuid() },
|
|
21
|
+
regardingobject: { pretty: 'regarding', type: z.string().nullish() },
|
|
22
|
+
isdocument: { pretty: 'documentAttached', type: z.boolean().nullish() },
|
|
23
|
+
filenameattachment: { pretty: 'fileName', type: z.string().nullish() },
|
|
24
|
+
filesize: { pretty: 'fileSizeBytes', type: z.number().nullish() },
|
|
25
|
+
notetext: { pretty: 'noteText', type: z.string().nullish() },
|
|
26
|
+
egg: { pretty: 'avocado', type: z.string().nullish() },
|
|
27
|
+
_objectid_value: {
|
|
28
|
+
pretty: 'inRelationTo',
|
|
29
|
+
type: z.string().uuid().nullish(),
|
|
30
|
+
},
|
|
31
|
+
//polymorphic POST stuff
|
|
32
|
+
objectid_ww_assignment: {
|
|
33
|
+
pretty: 'regardingAssignment',
|
|
34
|
+
type: z.string().uuid().nullish(),
|
|
35
|
+
...noteRelationships.regardingAssignment,
|
|
36
|
+
},
|
|
37
|
+
objectid_ww_saleschecklist: {
|
|
38
|
+
pretty: 'regardingReferral',
|
|
39
|
+
type: z.string().uuid().nullish(),
|
|
40
|
+
...noteRelationships.regardingReferral,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=DNoteAPI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DNoteAPI.js","sourceRoot":"","sources":["../../../../../src/models/schemas/api/note/DNoteAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAE9D,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,gBAAgB,EAAE;QAChB,EAAE,EAAE,CAAC;QACL,GAAG,EAAE,CAAC;KACP;CACO,CAAA;AAEV,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,mBAAmB,EAAE;QACnB,gBAAgB,EAAE,wBAAwB;QAC1C,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,aAAa;KAC7C;IACD,iBAAiB,EAAE;QACjB,gBAAgB,EAAE,4BAA4B;QAC9C,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,aAAa;KAC3C;CACF,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,YAAY,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;IAC3D,eAAe,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;IACpE,UAAU,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;IACvE,kBAAkB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;IACtE,QAAQ,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;IACjE,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;IAC5D,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;IACtD,eAAe,EAAE;QACf,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE;KAClC;IACD,wBAAwB;IACxB,sBAAsB,EAAE;QACtB,MAAM,EAAE,qBAAqB;QAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE;QACjC,GAAG,iBAAiB,CAAC,mBAAmB;KACzC;IACD,0BAA0B,EAAE;QAC1B,MAAM,EAAE,mBAAmB;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE;QACjC,GAAG,iBAAiB,CAAC,iBAAiB;KACvC;CACO,CAAA"}
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Upper-cases the first character of every word and lower-cases the rest.
|
|
3
|
+
* Separators are preserved and each starts a new word, so hyphenated and
|
|
4
|
+
* apostrophised names keep their inner capital:
|
|
5
|
+
* "KERRI-ANNE O'BRIEN" -> "Kerri-Anne O'Brien", "TÄNZER" -> "Tänzer".
|
|
6
|
+
*/
|
|
2
7
|
export declare const wordsToTitleCase: (str: string) => string;
|
|
8
|
+
/**
|
|
9
|
+
* Lower-cases the first word, title-cases every later word, and preserves
|
|
10
|
+
* separators: "V2-API.js" -> "v2-Api.Js".
|
|
11
|
+
*/
|
|
12
|
+
export declare const wordsToCamelCase: (str: string) => string;
|
|
3
13
|
//# sourceMappingURL=manipulate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manipulate.d.ts","sourceRoot":"","sources":["../../../src/utils/strings/manipulate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manipulate.d.ts","sourceRoot":"","sources":["../../../src/utils/strings/manipulate.ts"],"names":[],"mappings":"AAWA;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,KAAG,MAmB9C,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,KAAG,MAuB9C,CAAA"}
|
|
@@ -1,57 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
/**
|
|
2
|
+
* A "word" character is any Unicode letter, number, or combining mark.
|
|
3
|
+
* Combining marks (e.g. U+0308 in the decomposed form of "ä") must stay
|
|
4
|
+
* attached to the letter before them, otherwise they split a word in two.
|
|
5
|
+
* Anything else (space, hyphen, apostrophe, punctuation) is a separator and
|
|
6
|
+
* is emitted unchanged.
|
|
7
|
+
*/
|
|
8
|
+
const WORD_CHAR = /^[\p{L}\p{N}\p{M}]$/u;
|
|
9
|
+
const isWordChar = (ch) => WORD_CHAR.test(ch);
|
|
10
|
+
/**
|
|
11
|
+
* Upper-cases the first character of every word and lower-cases the rest.
|
|
12
|
+
* Separators are preserved and each starts a new word, so hyphenated and
|
|
13
|
+
* apostrophised names keep their inner capital:
|
|
14
|
+
* "KERRI-ANNE O'BRIEN" -> "Kerri-Anne O'Brien", "TÄNZER" -> "Tänzer".
|
|
15
|
+
*/
|
|
16
|
+
export const wordsToTitleCase = (str) => {
|
|
6
17
|
if (str.length === 0)
|
|
7
18
|
return '';
|
|
8
|
-
|
|
19
|
+
// Lower-case the whole string first so context-sensitive rules
|
|
20
|
+
// (e.g. Greek final sigma) are applied correctly.
|
|
9
21
|
let output = '';
|
|
10
|
-
let
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
output += lowercase.charAt(i);
|
|
16
|
-
i++;
|
|
17
|
-
continue;
|
|
22
|
+
let atWordStart = true;
|
|
23
|
+
for (const ch of str.toLowerCase()) {
|
|
24
|
+
if (isWordChar(ch)) {
|
|
25
|
+
output += atWordStart ? ch.toUpperCase() : ch;
|
|
26
|
+
atWordStart = false;
|
|
18
27
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
j++;
|
|
23
|
-
const token = lowercase.slice(i, j);
|
|
24
|
-
if (token.length > 0) {
|
|
25
|
-
output +=
|
|
26
|
-
tokenIndex === 0
|
|
27
|
-
? token
|
|
28
|
-
: token.charAt(0).toUpperCase() + token.slice(1);
|
|
29
|
-
tokenIndex++;
|
|
28
|
+
else {
|
|
29
|
+
output += ch;
|
|
30
|
+
atWordStart = true;
|
|
30
31
|
}
|
|
31
|
-
i = j;
|
|
32
32
|
}
|
|
33
33
|
return output;
|
|
34
34
|
};
|
|
35
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Lower-cases the first word, title-cases every later word, and preserves
|
|
37
|
+
* separators: "V2-API.js" -> "v2-Api.Js".
|
|
38
|
+
*/
|
|
39
|
+
export const wordsToCamelCase = (str) => {
|
|
36
40
|
if (str.length === 0)
|
|
37
41
|
return '';
|
|
38
|
-
const lowercase = str.toLowerCase();
|
|
39
42
|
let output = '';
|
|
40
|
-
let
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
let atWordStart = true;
|
|
44
|
+
let wordIndex = 0;
|
|
45
|
+
for (const ch of str.toLowerCase()) {
|
|
46
|
+
if (isWordChar(ch)) {
|
|
47
|
+
if (atWordStart) {
|
|
48
|
+
output += wordIndex === 0 ? ch : ch.toUpperCase();
|
|
49
|
+
wordIndex++;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
output += ch;
|
|
53
|
+
}
|
|
54
|
+
atWordStart = false;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
output += ch;
|
|
58
|
+
atWordStart = true;
|
|
47
59
|
}
|
|
48
|
-
let j = i;
|
|
49
|
-
while (j < lowercase.length &&
|
|
50
|
-
isAsciiAlphaNumericCode(lowercase.charCodeAt(j)))
|
|
51
|
-
j++;
|
|
52
|
-
const token = lowercase.slice(i, j);
|
|
53
|
-
output += token.charAt(0).toUpperCase() + token.slice(1);
|
|
54
|
-
i = j;
|
|
55
60
|
}
|
|
56
61
|
return output;
|
|
57
62
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manipulate.js","sourceRoot":"","sources":["../../../src/utils/strings/manipulate.ts"],"names":[],"mappings":"AAAA,MAAM,
|
|
1
|
+
{"version":3,"file":"manipulate.js","sourceRoot":"","sources":["../../../src/utils/strings/manipulate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,SAAS,GAAG,sBAAsB,CAAA;AAExC,MAAM,UAAU,GAAG,CAAC,EAAU,EAAW,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAE9D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAU,EAAE;IACtD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAE/B,+DAA+D;IAC/D,kDAAkD;IAClD,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,IAAI,WAAW,GAAG,IAAI,CAAA;IAEtB,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;YAC7C,WAAW,GAAG,KAAK,CAAA;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,EAAE,CAAA;YACZ,WAAW,GAAG,IAAI,CAAA;QACpB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAU,EAAE;IACtD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAE/B,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,IAAI,WAAW,GAAG,IAAI,CAAA;IACtB,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;YACnB,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAA;gBACjD,SAAS,EAAE,CAAA;YACb,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,EAAE,CAAA;YACd,CAAC;YACD,WAAW,GAAG,KAAK,CAAA;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,EAAE,CAAA;YACZ,WAAW,GAAG,IAAI,CAAA;QACpB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
|
|
@@ -21,6 +21,44 @@ describe('wordsToTitleCase', () => {
|
|
|
21
21
|
expect(wordsToTitleCase('hELLo')).toBe('Hello');
|
|
22
22
|
expect(wordsToTitleCase('')).toBe('');
|
|
23
23
|
});
|
|
24
|
+
it('keeps accented letters inside a word', () => {
|
|
25
|
+
expect(wordsToTitleCase('TÄNZER')).toBe('Tänzer');
|
|
26
|
+
expect(wordsToTitleCase('MÜLLER')).toBe('Müller');
|
|
27
|
+
expect(wordsToTitleCase('FRANÇOIS')).toBe('François');
|
|
28
|
+
expect(wordsToTitleCase('NUÑEZ')).toBe('Nuñez');
|
|
29
|
+
expect(wordsToTitleCase('GROß')).toBe('Groß');
|
|
30
|
+
expect(wordsToTitleCase('SØRENSEN')).toBe('Sørensen');
|
|
31
|
+
expect(wordsToTitleCase('ŁUKASZ')).toBe('Łukasz');
|
|
32
|
+
});
|
|
33
|
+
it('upper-cases an accented first letter', () => {
|
|
34
|
+
expect(wordsToTitleCase('ÉMILE ZOLA')).toBe('Émile Zola');
|
|
35
|
+
expect(wordsToTitleCase('émile')).toBe('Émile');
|
|
36
|
+
expect(wordsToTitleCase('ÅSA ÖSTLUND')).toBe('Åsa Östlund');
|
|
37
|
+
});
|
|
38
|
+
it('keeps combining marks attached to the preceding letter', () => {
|
|
39
|
+
// "TÄNZER" in decomposed (NFD) form: the diaeresis is a separate code point
|
|
40
|
+
const decomposed = 'TÄNZER'.normalize('NFD');
|
|
41
|
+
expect(wordsToTitleCase(decomposed)).toBe('Tänzer'.normalize('NFD'));
|
|
42
|
+
});
|
|
43
|
+
it('handles non-Latin scripts', () => {
|
|
44
|
+
expect(wordsToTitleCase('ИВАН ПЕТРОВ')).toBe('Иван Петров');
|
|
45
|
+
expect(wordsToTitleCase('ΓΙΩΡΓΟΣ')).toBe('Γιωργος');
|
|
46
|
+
// scripts without case are returned unchanged
|
|
47
|
+
expect(wordsToTitleCase('田中 太郎')).toBe('田中 太郎');
|
|
48
|
+
expect(wordsToTitleCase('محمد')).toBe('محمد');
|
|
49
|
+
});
|
|
50
|
+
it('title-cases each part of hyphenated and apostrophised names', () => {
|
|
51
|
+
expect(wordsToTitleCase("O'BRIEN")).toBe("O'Brien");
|
|
52
|
+
expect(wordsToTitleCase('O’BRIEN')).toBe('O’Brien');
|
|
53
|
+
expect(wordsToTitleCase("D'ANGELO")).toBe("D'Angelo");
|
|
54
|
+
expect(wordsToTitleCase('KERRI-ANNE')).toBe('Kerri-Anne');
|
|
55
|
+
expect(wordsToTitleCase('JEAN-LUC PICARD')).toBe('Jean-Luc Picard');
|
|
56
|
+
expect(wordsToTitleCase('MARY‑KATE')).toBe('Mary‑Kate'); // non-breaking hyphen
|
|
57
|
+
});
|
|
58
|
+
it('preserves surrounding and repeated whitespace', () => {
|
|
59
|
+
expect(wordsToTitleCase(' JOHN DOE ')).toBe(' John Doe ');
|
|
60
|
+
expect(wordsToTitleCase('JOHN\tDOE')).toBe('John\tDoe');
|
|
61
|
+
});
|
|
24
62
|
});
|
|
25
63
|
describe('wordsToCamelCase', () => {
|
|
26
64
|
it('keeps first token lowercase and title-cases later tokens', () => {
|
|
@@ -42,5 +80,9 @@ describe('wordsToCamelCase', () => {
|
|
|
42
80
|
expect(wordsToCamelCase('hELLo')).toBe('hello');
|
|
43
81
|
expect(wordsToCamelCase('')).toBe('');
|
|
44
82
|
});
|
|
83
|
+
it('keeps accented letters inside a word', () => {
|
|
84
|
+
expect(wordsToCamelCase('ÉMILE TÄNZER')).toBe('émile Tänzer');
|
|
85
|
+
expect(wordsToCamelCase('MÜLLER-LÜDENSCHEIDT')).toBe('müller-Lüdenscheidt');
|
|
86
|
+
});
|
|
45
87
|
});
|
|
46
88
|
//# sourceMappingURL=manipulate.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manipulate.test.js","sourceRoot":"","sources":["../../../src/utils/strings/manipulate.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manipulate.test.js","sourceRoot":"","sources":["../../../src/utils/strings/manipulate.test.ts"],"names":[],"mappings":"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"}
|