@aidc-toolkit/core 1.0.23-beta → 1.0.25-beta

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.
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Create an object with omitted or picked entries.
3
+ *
4
+ * @template Omitting
5
+ * Type representation of `omitting` parameter for return type determination.
6
+ *
7
+ * @template T
8
+ * Object type.
9
+ *
10
+ * @template K
11
+ * Object key type.
12
+ *
13
+ * @param omitting
14
+ * True if omitting.
15
+ *
16
+ * @param o
17
+ * Object.
18
+ *
19
+ * @param keys
20
+ * Keys to omit or pick.
21
+ *
22
+ * @returns
23
+ * Edited object.
24
+ */
25
+ function omitOrPick<Omitting extends boolean, T extends object, K extends keyof T>(omitting: Omitting, o: T, ...keys: K[]): Omitting extends true ? Omit<T, K> : Pick<T, K> {
26
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Key and value types are known.
27
+ return Object.fromEntries(Object.entries(o).filter(([key]) => keys.includes(key as K) !== omitting)) as ReturnType<typeof omitOrPick<Omitting, T, K>>;
28
+ }
29
+
30
+ /**
31
+ * Create an object with omitted entries.
32
+ *
33
+ * @template T
34
+ * Object type.
35
+ *
36
+ * @template K
37
+ * Object key type.
38
+ *
39
+ * @param o
40
+ * Object.
41
+ *
42
+ * @param keys
43
+ * Keys to omit.
44
+ *
45
+ * @returns
46
+ * Edited object.
47
+ */
48
+ export function omit<T extends object, K extends keyof T>(o: T, ...keys: K[]): Omit<T, K> {
49
+ return omitOrPick(true, o, ...keys);
50
+ }
51
+
52
+ /**
53
+ * Create an object with picked entries.
54
+ *
55
+ * @template T
56
+ * Object type.
57
+ *
58
+ * @template K
59
+ * Object key type.
60
+ *
61
+ * @param o
62
+ * Object.
63
+ *
64
+ * @param keys
65
+ * Keys to pick.
66
+ *
67
+ * @returns
68
+ * Edited object.
69
+ */
70
+ export function pick<T extends object, K extends keyof T>(o: T, ...keys: K[]): Pick<T, K> {
71
+ return omitOrPick(false, o, ...keys);
72
+ }
73
+
74
+ /**
75
+ * Cast a property as a more narrow type.
76
+ *
77
+ * @template T
78
+ * Object type.
79
+ *
80
+ * @template K
81
+ * Object key type.
82
+ *
83
+ * @template TAsType
84
+ * Desired type.
85
+ *
86
+ * @param o
87
+ * Object.
88
+ *
89
+ * @param key
90
+ * Key of property to cast.
91
+ *
92
+ * @returns
93
+ * Single-key object with property cast as desired type.
94
+ */
95
+ export function propertyAs<T extends object, K extends keyof T, TAsType extends T[K]>(o: T, key: K): Readonly<Omit<T, K> extends T ? Partial<Record<K, TAsType>> : Record<K, TAsType>> {
96
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Type is determined by condition.
97
+ return (key in o ?
98
+ {
99
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Force cast.
100
+ [key]: o[key] as TAsType
101
+ } :
102
+ {}
103
+ ) as ReturnType<typeof propertyAs<T, K, TAsType>>;
104
+ }
105
+
106
+ /**
107
+ * Determine if argument is nullish. Application extension may pass `null` or `undefined` to missing parameters.
108
+ *
109
+ * @param argument
110
+ * Argument.
111
+ *
112
+ * @returns
113
+ * True if argument is undefined or null.
114
+ */
115
+ export function isNullish(argument: unknown): argument is null | undefined {
116
+ return argument === null || argument === undefined;
117
+ }
package/src/type.ts ADDED
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Typed function, applicable to any function, stricter than {@linkcode Function}.
3
+ *
4
+ * @template TFunction
5
+ * Function type.
6
+ */
7
+ export type TypedFunction<TFunction extends (...args: Parameters<TFunction>) => ReturnType<TFunction>> = (...args: Parameters<TFunction>) => ReturnType<TFunction>;
8
+
9
+ /**
10
+ * Typed synchronous function, applicable to any function that doesn't return a {@linkcode Promise}.
11
+ *
12
+ * @template TFunction
13
+ * Function type.
14
+ */
15
+ export type TypedSyncFunction<TFunction extends TypedFunction<TFunction>> = [ReturnType<TFunction>] extends [PromiseLike<unknown>] ? never : TypedFunction<TFunction>;
16
+
17
+ /**
18
+ * Determine the fundamental promised type. This is stricter than `Awaited<Type>` in that it requires a {@linkcode
19
+ * Promise}.
20
+ *
21
+ * @template T
22
+ * Promised type.
23
+ */
24
+ export type PromisedType<T> = [T] extends [PromiseLike<infer TPromised>] ? TPromised : never;
25
+
26
+ /**
27
+ * Typed asynchronous function, applicable to any function that returns a {@linkcode Promise}.
28
+ *
29
+ * @template TFunction
30
+ * Function type.
31
+ */
32
+ export type TypedAsyncFunction<TMethod extends (...args: Parameters<TMethod>) => PromiseLike<PromisedType<ReturnType<TMethod>>>> = (...args: Parameters<TMethod>) => Promise<PromisedType<ReturnType<TMethod>>>;
33
+
34
+ /**
35
+ * Nullishable type. Extends a type by allowing `null` and `undefined`.
36
+ *
37
+ * @template T
38
+ * Type.
39
+ */
40
+ export type Nullishable<T> = T | null | undefined;
41
+
42
+ /**
43
+ * Non-nullishable type. If T is an object type, it is spread and attributes within it are made non-nullishable.
44
+ * Equivalent to a deep `Required<T>` for an object and `NonNullable<T>` for any other type.
45
+ *
46
+ * @template T
47
+ * Type.
48
+ */
49
+ export type NonNullishable<T> = T extends object ? {
50
+ [P in keyof T]-?: NonNullishable<T[P]>
51
+ } : NonNullable<T>;
52
+
53
+ /**
54
+ * Make some keys within a type optional.
55
+ *
56
+ * @template T
57
+ * Object type.
58
+ *
59
+ * @template K
60
+ * Object key type.
61
+ */
62
+ export type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
63
+
64
+ /**
65
+ * Type to restrict property keys to those that are strings and that support a specified type.
66
+ *
67
+ * @template T
68
+ * Object type.
69
+ *
70
+ * @template P
71
+ * Object property type.
72
+ */
73
+ export type PropertyKeys<T, P> = {
74
+ [K in keyof T]: K extends string ? T[K] extends P ? K : never : never;
75
+ }[keyof T];
package/tsup.config.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { tsupConfigAIDCToolkit } from "@aidc-toolkit/dev";
2
+
3
+ export default tsupConfigAIDCToolkit;
package/typedoc.json CHANGED
@@ -3,7 +3,5 @@
3
3
  "extends": [
4
4
  "@aidc-toolkit/dev/typedoc.json"
5
5
  ],
6
- "name": "Core",
7
- "tsconfig": "node_modules/@aidc-toolkit/dev/tsconfig-build-dev.json",
8
- "gitRevision": "main"
6
+ "name": "Core"
9
7
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,cAAc,kBAAkB,CAAC"}
@@ -1,68 +0,0 @@
1
- import type { i18n, Resource } from "i18next";
2
- /**
3
- * Locale strings type for generic manipulation.
4
- */
5
- export interface LocaleResources {
6
- [key: string]: LocaleResources | string;
7
- }
8
- /**
9
- * Internationalization operating environments.
10
- */
11
- export declare const I18nEnvironments: {
12
- /**
13
- * Command-line interface (e.g., unit tests).
14
- */
15
- readonly CLI: 0;
16
- /**
17
- * Web server.
18
- */
19
- readonly Server: 1;
20
- /**
21
- * Web browser.
22
- */
23
- readonly Browser: 2;
24
- };
25
- /**
26
- * Internationalization operating environment.
27
- */
28
- export type I18nEnvironment = typeof I18nEnvironments[keyof typeof I18nEnvironments];
29
- /**
30
- * Assert that language resources are a type match for English (default) resources.
31
- *
32
- * @param enResources
33
- * English resources.
34
- *
35
- * @param lng
36
- * Language.
37
- *
38
- * @param lngResources
39
- * Language resources.
40
- *
41
- * @param parent
42
- * Parent key name (set recursively).
43
- */
44
- export declare function i18nAssertValidResources(enResources: object, lng: string, lngResources: object, parent?: string): void;
45
- /**
46
- * Initialize internationalization.
47
- *
48
- * @param i18next
49
- * Internationalization object. As multiple objects exists, this parameter represents the one for the module for which
50
- * internationalization is being initialized.
51
- *
52
- * @param environment
53
- * Environment in which the application is running.
54
- *
55
- * @param debug
56
- * Debug setting.
57
- *
58
- * @param defaultNS
59
- * Default namespace.
60
- *
61
- * @param resources
62
- * Resources.
63
- *
64
- * @returns
65
- * Void promise.
66
- */
67
- export declare function i18nCoreInit(i18next: i18n, environment: I18nEnvironment, debug: boolean, defaultNS: string, ...resources: Resource[]): Promise<void>;
68
- //# sourceMappingURL=i18n.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/locale/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA0B,QAAQ,EAAE,MAAM,SAAS,CAAC;AAItE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,MAAM,CAAC;CAC3C;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB;IACzB;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;CAEG,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,gBAAgB,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAyBrF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAmDtH;AAgBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD1J"}
@@ -1,174 +0,0 @@
1
- import I18nextBrowserLanguageDetector from "i18next-browser-languagedetector";
2
- import I18nextCLILanguageDetector from "i18next-cli-language-detector";
3
- /**
4
- * Internationalization operating environments.
5
- */
6
- export const I18nEnvironments = {
7
- /**
8
- * Command-line interface (e.g., unit tests).
9
- */
10
- CLI: 0,
11
- /**
12
- * Web server.
13
- */
14
- Server: 1,
15
- /**
16
- * Web browser.
17
- */
18
- Browser: 2
19
- };
20
- /**
21
- * Parse parameter names in a resource string.
22
- *
23
- * @param s
24
- * Resource string.
25
- *
26
- * @returns
27
- * Array of parameter names.
28
- */
29
- function parseParameterNames(s) {
30
- const parameterRegExp = /\{\{.+?}}/g;
31
- const parameterNames = [];
32
- let match;
33
- while ((match = parameterRegExp.exec(s)) !== null) {
34
- parameterNames.push(match[1]);
35
- }
36
- return parameterNames;
37
- }
38
- /**
39
- * Assert that language resources are a type match for English (default) resources.
40
- *
41
- * @param enResources
42
- * English resources.
43
- *
44
- * @param lng
45
- * Language.
46
- *
47
- * @param lngResources
48
- * Language resources.
49
- *
50
- * @param parent
51
- * Parent key name (set recursively).
52
- */
53
- export function i18nAssertValidResources(enResources, lng, lngResources, parent) {
54
- const enResourcesMap = new Map(Object.entries(enResources));
55
- const lngResourcesMap = new Map(Object.entries(lngResources));
56
- const isLocale = lng.includes("-");
57
- for (const [enKey, enValue] of enResourcesMap) {
58
- const enFullKey = `${parent === undefined ? "" : `${parent}.`}${enKey}`;
59
- const lngValue = lngResourcesMap.get(enKey);
60
- if (lngValue !== undefined) {
61
- const enValueType = typeof enValue;
62
- const lngValueType = typeof lngValue;
63
- if (lngValueType !== enValueType) {
64
- throw new Error(`Mismatched value type ${lngValueType} for key ${enFullKey} in ${lng} resources (expected ${enValueType})`);
65
- }
66
- if (enValueType === "string") {
67
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Value is known to be string.
68
- const enParameterNames = parseParameterNames(enValue);
69
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Value is known to be string.
70
- const lngParameterNames = parseParameterNames(lngValue);
71
- for (const enParameterName of enParameterNames) {
72
- if (!lngParameterNames.includes(enParameterName)) {
73
- throw new Error(`Missing parameter ${enParameterName} for key ${enFullKey} in ${lng} resources`);
74
- }
75
- }
76
- for (const lngParameterName of lngParameterNames) {
77
- if (!enParameterNames.includes(lngParameterName)) {
78
- throw new Error(`Extraneous parameter ${lngParameterName} for key ${enFullKey} in ${lng} resources`);
79
- }
80
- }
81
- }
82
- else if (enValueType === "object") {
83
- i18nAssertValidResources(enValue, lng, lngValue, `${parent === undefined ? "" : `${parent}.`}${enKey}`);
84
- }
85
- // Locale falls back to raw language so ignore if missing.
86
- }
87
- else if (!isLocale) {
88
- throw new Error(`Missing key ${enFullKey} in ${lng} resources`);
89
- }
90
- }
91
- for (const [lngKey] of lngResourcesMap) {
92
- if (!enResourcesMap.has(lngKey)) {
93
- throw new Error(`Extraneous key ${parent === undefined ? "" : `${parent}.`}${lngKey} in ${lng} resources`);
94
- }
95
- }
96
- }
97
- /**
98
- * Convert a string to lower case, skipping words that are all upper case.
99
- *
100
- * @param s
101
- * String.
102
- *
103
- * @returns
104
- * Lower case string.
105
- */
106
- function toLowerCase(s) {
107
- // Words with no lower case letters are preserved as they are likely mnemonics.
108
- return s.split(" ").map(word => /[a-z]/.test(word) ? word.toLowerCase() : word).join(" ");
109
- }
110
- /**
111
- * Initialize internationalization.
112
- *
113
- * @param i18next
114
- * Internationalization object. As multiple objects exists, this parameter represents the one for the module for which
115
- * internationalization is being initialized.
116
- *
117
- * @param environment
118
- * Environment in which the application is running.
119
- *
120
- * @param debug
121
- * Debug setting.
122
- *
123
- * @param defaultNS
124
- * Default namespace.
125
- *
126
- * @param resources
127
- * Resources.
128
- *
129
- * @returns
130
- * Void promise.
131
- */
132
- export async function i18nCoreInit(i18next, environment, debug, defaultNS, ...resources) {
133
- // Initialization may be called more than once.
134
- if (!i18next.isInitialized) {
135
- const mergedResource = {};
136
- // Merge resources.
137
- for (const resource of resources) {
138
- // Merge languages.
139
- for (const [language, resourceLanguage] of Object.entries(resource)) {
140
- if (!(language in mergedResource)) {
141
- mergedResource[language] = {};
142
- }
143
- const mergedResourceLanguage = mergedResource[language];
144
- // Merge namespaces.
145
- for (const [namespace, resourceKey] of Object.entries(resourceLanguage)) {
146
- mergedResourceLanguage[namespace] = resourceKey;
147
- }
148
- }
149
- }
150
- let module;
151
- switch (environment) {
152
- case I18nEnvironments.CLI:
153
- // TODO Refactor when https://github.com/neet/i18next-cli-language-detector/issues/281 resolved.
154
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Per above.
155
- module = I18nextCLILanguageDetector;
156
- break;
157
- case I18nEnvironments.Browser:
158
- module = I18nextBrowserLanguageDetector;
159
- break;
160
- default:
161
- throw new Error("Not supported");
162
- }
163
- await i18next.use(module).init({
164
- debug,
165
- resources: mergedResource,
166
- fallbackLng: "en",
167
- defaultNS
168
- }).then(() => {
169
- // Add toLowerCase function.
170
- i18next.services.formatter?.add("toLowerCase", value => typeof value === "string" ? toLowerCase(value) : String(value));
171
- });
172
- }
173
- }
174
- //# sourceMappingURL=i18n.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/locale/i18n.ts"],"names":[],"mappings":"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"}