@judo/i18n 0.1.0
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/LICENSE +277 -0
- package/README.md +110 -0
- package/dist/formatters.d.ts +79 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/i18n-provider.d.ts +83 -0
- package/dist/i18n-provider.d.ts.map +1 -0
- package/dist/i18n-service.d.ts +70 -0
- package/dist/i18n-service.d.ts.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2569 -0
- package/dist/index.js.map +1 -0
- package/dist/locale-constants.d.ts +8 -0
- package/dist/locale-constants.d.ts.map +1 -0
- package/dist/system-messages.d.ts +198 -0
- package/dist/system-messages.d.ts.map +1 -0
- package/dist/translation-keys.d.ts +54 -0
- package/dist/translation-keys.d.ts.map +1 -0
- package/dist/use-model-label.d.ts +57 -0
- package/dist/use-model-label.d.ts.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System messages used throughout the application.
|
|
3
|
+
* Keys are organized by category for easy management and translation.
|
|
4
|
+
*/
|
|
5
|
+
export declare const SYSTEM_MESSAGES: {
|
|
6
|
+
readonly action: {
|
|
7
|
+
readonly save: {
|
|
8
|
+
readonly success: "Saved successfully";
|
|
9
|
+
readonly error: "Failed to save";
|
|
10
|
+
readonly loading: "Saving...";
|
|
11
|
+
};
|
|
12
|
+
readonly delete: {
|
|
13
|
+
readonly success: "Deleted successfully";
|
|
14
|
+
readonly error: "Failed to delete";
|
|
15
|
+
readonly confirm: "Are you sure you want to delete this item?";
|
|
16
|
+
readonly confirmTitle: "Confirm Delete";
|
|
17
|
+
};
|
|
18
|
+
readonly create: {
|
|
19
|
+
readonly success: "Created successfully";
|
|
20
|
+
readonly error: "Failed to create";
|
|
21
|
+
};
|
|
22
|
+
readonly update: {
|
|
23
|
+
readonly success: "Updated successfully";
|
|
24
|
+
readonly error: "Failed to update";
|
|
25
|
+
};
|
|
26
|
+
readonly cancel: {
|
|
27
|
+
readonly label: "Cancel";
|
|
28
|
+
};
|
|
29
|
+
readonly confirm: {
|
|
30
|
+
readonly label: "Confirm";
|
|
31
|
+
};
|
|
32
|
+
readonly close: {
|
|
33
|
+
readonly label: "Close";
|
|
34
|
+
};
|
|
35
|
+
readonly back: {
|
|
36
|
+
readonly label: "Back";
|
|
37
|
+
};
|
|
38
|
+
readonly refresh: {
|
|
39
|
+
readonly label: "Refresh";
|
|
40
|
+
readonly success: "Refreshed successfully";
|
|
41
|
+
readonly error: "Failed to refresh";
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
readonly validation: {
|
|
45
|
+
readonly required: "{{field}} is required";
|
|
46
|
+
readonly minLength: "{{field}} must be at least {{min}} characters";
|
|
47
|
+
readonly maxLength: "{{field}} must be at most {{max}} characters";
|
|
48
|
+
readonly min: "{{field}} must be at least {{min}}";
|
|
49
|
+
readonly max: "{{field}} must be at most {{max}}";
|
|
50
|
+
readonly email: "Please enter a valid email address";
|
|
51
|
+
readonly url: "Please enter a valid URL";
|
|
52
|
+
readonly number: "Please enter a valid number";
|
|
53
|
+
readonly integer: "Please enter a whole number";
|
|
54
|
+
readonly pattern: "{{field}} format is invalid";
|
|
55
|
+
readonly unique: "{{field}} must be unique";
|
|
56
|
+
readonly date: "Please enter a valid date";
|
|
57
|
+
readonly dateRange: "End date must be after start date";
|
|
58
|
+
};
|
|
59
|
+
readonly nav: {
|
|
60
|
+
readonly unsavedChanges: {
|
|
61
|
+
readonly title: "Unsaved Changes";
|
|
62
|
+
readonly message: "You have unsaved changes. Are you sure you want to leave?";
|
|
63
|
+
readonly stay: "Stay";
|
|
64
|
+
readonly leave: "Leave";
|
|
65
|
+
};
|
|
66
|
+
readonly breadcrumb: {
|
|
67
|
+
readonly home: "Home";
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
readonly session: {
|
|
71
|
+
readonly timeout: {
|
|
72
|
+
readonly title: "Session Expiring";
|
|
73
|
+
readonly message: "Your session will expire in {{time}}. Would you like to stay logged in?";
|
|
74
|
+
readonly logout: "Logout";
|
|
75
|
+
readonly extend: "Stay Logged In";
|
|
76
|
+
};
|
|
77
|
+
readonly expired: {
|
|
78
|
+
readonly title: "Session Expired";
|
|
79
|
+
readonly message: "Your session has expired. Please log in again.";
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
readonly loading: {
|
|
83
|
+
readonly model: "Loading application...";
|
|
84
|
+
readonly data: "Loading data...";
|
|
85
|
+
readonly saving: "Saving...";
|
|
86
|
+
readonly deleting: "Deleting...";
|
|
87
|
+
readonly processing: "Processing...";
|
|
88
|
+
};
|
|
89
|
+
readonly error: {
|
|
90
|
+
readonly generic: "An error occurred";
|
|
91
|
+
readonly network: "Network error. Please check your connection.";
|
|
92
|
+
readonly notFound: "The requested resource was not found";
|
|
93
|
+
readonly unauthorized: "You are not authorized to perform this action";
|
|
94
|
+
readonly forbidden: "Access denied";
|
|
95
|
+
readonly serverError: "Server error. Please try again later.";
|
|
96
|
+
readonly timeout: "Request timed out. Please try again.";
|
|
97
|
+
readonly validation: "Please correct the errors and try again";
|
|
98
|
+
};
|
|
99
|
+
readonly empty: {
|
|
100
|
+
readonly noData: "No data available";
|
|
101
|
+
readonly noResults: "No results found";
|
|
102
|
+
readonly noItems: "No items to display";
|
|
103
|
+
readonly noSelection: "No item selected";
|
|
104
|
+
};
|
|
105
|
+
readonly pagination: {
|
|
106
|
+
readonly of: "of";
|
|
107
|
+
readonly rowsPerPage: "Rows per page";
|
|
108
|
+
readonly showing: "Showing {{from}}-{{to}} of {{total}}";
|
|
109
|
+
readonly firstPage: "First page";
|
|
110
|
+
readonly lastPage: "Last page";
|
|
111
|
+
readonly previousPage: "Previous page";
|
|
112
|
+
readonly nextPage: "Next page";
|
|
113
|
+
};
|
|
114
|
+
readonly table: {
|
|
115
|
+
readonly selectAll: "Select all";
|
|
116
|
+
readonly deselectAll: "Deselect all";
|
|
117
|
+
readonly selectedCount: "{{count}} selected";
|
|
118
|
+
readonly sortAscending: "Sort ascending";
|
|
119
|
+
readonly sortDescending: "Sort descending";
|
|
120
|
+
readonly filterBy: "Filter by {{column}}";
|
|
121
|
+
readonly clearFilter: "Clear filter";
|
|
122
|
+
readonly noRows: "No rows";
|
|
123
|
+
readonly actions: "Actions";
|
|
124
|
+
};
|
|
125
|
+
readonly dialog: {
|
|
126
|
+
readonly confirm: {
|
|
127
|
+
readonly title: "Confirm";
|
|
128
|
+
readonly yes: "Yes";
|
|
129
|
+
readonly no: "No";
|
|
130
|
+
};
|
|
131
|
+
readonly alert: {
|
|
132
|
+
readonly title: "Alert";
|
|
133
|
+
readonly ok: "OK";
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
readonly auth: {
|
|
137
|
+
readonly login: "Log In";
|
|
138
|
+
readonly logout: "Log Out";
|
|
139
|
+
readonly loggingIn: "Logging in...";
|
|
140
|
+
readonly loggingOut: "Logging out...";
|
|
141
|
+
readonly profile: "Profile";
|
|
142
|
+
};
|
|
143
|
+
readonly common: {
|
|
144
|
+
readonly search: "Search";
|
|
145
|
+
readonly filter: "Filter";
|
|
146
|
+
readonly clear: "Clear";
|
|
147
|
+
readonly reset: "Reset";
|
|
148
|
+
readonly apply: "Apply";
|
|
149
|
+
readonly select: "Select";
|
|
150
|
+
readonly selected: "Selected";
|
|
151
|
+
readonly all: "All";
|
|
152
|
+
readonly none: "None";
|
|
153
|
+
readonly yes: "Yes";
|
|
154
|
+
readonly no: "No";
|
|
155
|
+
readonly true: "True";
|
|
156
|
+
readonly false: "False";
|
|
157
|
+
readonly enabled: "Enabled";
|
|
158
|
+
readonly disabled: "Disabled";
|
|
159
|
+
readonly active: "Active";
|
|
160
|
+
readonly inactive: "Inactive";
|
|
161
|
+
readonly more: "More";
|
|
162
|
+
readonly less: "Less";
|
|
163
|
+
readonly details: "Details";
|
|
164
|
+
readonly options: "Options";
|
|
165
|
+
readonly settings: "Settings";
|
|
166
|
+
readonly help: "Help";
|
|
167
|
+
readonly about: "About";
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* Type for system message keys.
|
|
172
|
+
*/
|
|
173
|
+
export type SystemMessageCategory = keyof typeof SYSTEM_MESSAGES;
|
|
174
|
+
/**
|
|
175
|
+
* Flatten nested object keys into dot-notation strings.
|
|
176
|
+
*/
|
|
177
|
+
type FlattenKeys<T, Prefix extends string = ""> = T extends object ? {
|
|
178
|
+
[K in keyof T]: K extends string ? T[K] extends object ? FlattenKeys<T[K], `${Prefix}${K}.`> : `${Prefix}${K}` : never;
|
|
179
|
+
}[keyof T] : never;
|
|
180
|
+
/**
|
|
181
|
+
* Type for all flattened system message keys.
|
|
182
|
+
*/
|
|
183
|
+
export type SystemMessageKey = FlattenKeys<typeof SYSTEM_MESSAGES>;
|
|
184
|
+
/**
|
|
185
|
+
* Get a system message value by dot-notation path.
|
|
186
|
+
*
|
|
187
|
+
* @param path - Dot-notation path to the message (e.g., 'action.save.success')
|
|
188
|
+
* @returns The message string or undefined if not found
|
|
189
|
+
*/
|
|
190
|
+
export declare function getSystemMessage(path: string): string | undefined;
|
|
191
|
+
/**
|
|
192
|
+
* Get all keys from system messages in flat dot-notation format.
|
|
193
|
+
*
|
|
194
|
+
* @returns Array of all message keys
|
|
195
|
+
*/
|
|
196
|
+
export declare function getAllSystemMessageKeys(): string[];
|
|
197
|
+
export {};
|
|
198
|
+
//# sourceMappingURL=system-messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-messages.d.ts","sourceRoot":"","sources":["../src/system-messages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2LlB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,eAAe,CAAC;AAEjE;;GAEG;AACH,KAAK,WAAW,CAAC,CAAC,EAAE,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,MAAM,GAC/D;KACC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,GAC7B,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAClB,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,GACnC,GAAG,MAAM,GAAG,CAAC,EAAE,GAChB,KAAK;CACR,CAAC,MAAM,CAAC,CAAC,GACT,KAAK,CAAC;AAET;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC,OAAO,eAAe,CAAC,CAAC;AAEnE;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAYjE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,CAkBlD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate translation key from model element.
|
|
3
|
+
* Format: {elementType}.{sourceId|name}.{property}
|
|
4
|
+
*
|
|
5
|
+
* @param element - Model element with sourceId, name, and @type
|
|
6
|
+
* @param property - Property to translate (label, placeholder, tooltip, etc.)
|
|
7
|
+
* @returns Translation key string
|
|
8
|
+
*/
|
|
9
|
+
export declare function getTranslationKey(element: {
|
|
10
|
+
sourceId?: string;
|
|
11
|
+
name: string;
|
|
12
|
+
"@type"?: string;
|
|
13
|
+
}, property?: "label" | "placeholder" | "tooltip" | "confirmationMessage"): string;
|
|
14
|
+
/**
|
|
15
|
+
* Generate translation key for system messages.
|
|
16
|
+
* Format: system.{category}.{key}
|
|
17
|
+
*
|
|
18
|
+
* @param category - Message category (e.g., 'action', 'validation', 'nav')
|
|
19
|
+
* @param key - Specific message key
|
|
20
|
+
* @returns Translation key string
|
|
21
|
+
*/
|
|
22
|
+
export declare function getSystemMessageKey(category: string, key: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Generate translation key for a column in a table.
|
|
25
|
+
* Format: column.{sourceId|name}.label
|
|
26
|
+
*
|
|
27
|
+
* @param column - Column element with sourceId and name
|
|
28
|
+
* @returns Translation key string
|
|
29
|
+
*/
|
|
30
|
+
export declare function getColumnTranslationKey(column: {
|
|
31
|
+
sourceId?: string;
|
|
32
|
+
name: string;
|
|
33
|
+
}): string;
|
|
34
|
+
/**
|
|
35
|
+
* Generate translation key for an enum value.
|
|
36
|
+
* Format: enum.{enumName}.{value}
|
|
37
|
+
*
|
|
38
|
+
* @param enumName - Name of the enumeration
|
|
39
|
+
* @param value - Enum value
|
|
40
|
+
* @returns Translation key string
|
|
41
|
+
*/
|
|
42
|
+
export declare function getEnumTranslationKey(enumName: string, value: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Generate translation key for navigation item.
|
|
45
|
+
* Format: nav.{sourceId|name}.label
|
|
46
|
+
*
|
|
47
|
+
* @param item - Navigation item with sourceId and name
|
|
48
|
+
* @returns Translation key string
|
|
49
|
+
*/
|
|
50
|
+
export declare function getNavItemTranslationKey(item: {
|
|
51
|
+
sourceId?: string;
|
|
52
|
+
name: string;
|
|
53
|
+
}): string;
|
|
54
|
+
//# sourceMappingURL=translation-keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translation-keys.d.ts","sourceRoot":"","sources":["../src/translation-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9D,QAAQ,GAAE,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,qBAA+B,GAC7E,MAAM,CAMR;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAG3F;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAG1F"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook for translating model element labels.
|
|
3
|
+
*
|
|
4
|
+
* Uses react-i18next's `useTranslation()` to look up the translation key
|
|
5
|
+
* generated from the element, falling back to the model-defined label.
|
|
6
|
+
*
|
|
7
|
+
* When a `translationKeyMap` is provided via `I18nProvider`, the hook resolves
|
|
8
|
+
* the element's `xmi:id` to a human-readable tree-path key (e.g.,
|
|
9
|
+
* `"PageName.container.input"`). Without the map, it falls back to the legacy
|
|
10
|
+
* type-based key format (`"textinput.sourceId.label"`).
|
|
11
|
+
*
|
|
12
|
+
* When no locale loader is configured (no translations available), the
|
|
13
|
+
* `defaultValue` path is used, which returns `element.label ?? element.name`.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Resolved label result from the useModelLabel hook.
|
|
17
|
+
*/
|
|
18
|
+
export interface ModelLabelResult {
|
|
19
|
+
/**
|
|
20
|
+
* The translated label string. Falls back to `element.label ?? element.name`
|
|
21
|
+
* when no translation is found.
|
|
22
|
+
*/
|
|
23
|
+
label: string;
|
|
24
|
+
/**
|
|
25
|
+
* The translation key used for lookup.
|
|
26
|
+
* Useful for debugging or for providing in test IDs.
|
|
27
|
+
*/
|
|
28
|
+
translationKey: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Hook to get a translated label for a model element.
|
|
32
|
+
*
|
|
33
|
+
* Resolves the translation key in two ways (in order of preference):
|
|
34
|
+
* 1. If a `translationKeyMap` is configured (via codegen), looks up the element's
|
|
35
|
+
* `xmi:id` to get a human-readable path key (e.g., `"PageName.container.input"`)
|
|
36
|
+
* 2. Falls back to the legacy format: `{elementType}.{sourceId|name}.{property}`
|
|
37
|
+
*
|
|
38
|
+
* @param element - The model element (must have `name`; optionally `xmi:id`, `@type`, `sourceId`, `label`)
|
|
39
|
+
* @param property - The property to translate (defaults to "label")
|
|
40
|
+
* @returns The translated label and the translation key
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```tsx
|
|
44
|
+
* function MyInput({ element }: { element: TextInput }) {
|
|
45
|
+
* const { label } = useModelLabel(element);
|
|
46
|
+
* return <TextField label={label} />;
|
|
47
|
+
* }
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare function useModelLabel(element: {
|
|
51
|
+
"xmi:id"?: string;
|
|
52
|
+
sourceId?: string;
|
|
53
|
+
name: string;
|
|
54
|
+
"@type"?: string;
|
|
55
|
+
label?: string;
|
|
56
|
+
}, property?: "label" | "placeholder" | "tooltip" | "confirmationMessage"): ModelLabelResult;
|
|
57
|
+
//# sourceMappingURL=use-model-label.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-model-label.d.ts","sourceRoot":"","sources":["../src/use-model-label.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAC5B,OAAO,EAAE;IACR,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,EACD,QAAQ,GAAE,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,qBAA+B,GAC7E,gBAAgB,CAqBlB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@judo/i18n",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Internationalization and localization support for JUDO UI Runtime",
|
|
5
|
+
"license": "EPL-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/BlackBeltTechnology/judo-frontend-runtime.git",
|
|
9
|
+
"directory": "packages/i18n"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"LICENSE",
|
|
14
|
+
"README.md"
|
|
15
|
+
],
|
|
16
|
+
"type": "module",
|
|
17
|
+
"sideEffects": false,
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"import": "./dist/index.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@judo/model-api": "0.1.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@testing-library/react": "^16.3.2",
|
|
34
|
+
"@types/node": "^25.2.3",
|
|
35
|
+
"@types/react": "^19.2.14",
|
|
36
|
+
"date-fns": "^4.1.0",
|
|
37
|
+
"i18next": "^25.8.10",
|
|
38
|
+
"react": "^19.2.4",
|
|
39
|
+
"react-dom": "^19.2.4",
|
|
40
|
+
"react-i18next": "^16.5.4",
|
|
41
|
+
"typescript": "^5.9.3",
|
|
42
|
+
"vitest": "^4.0.18",
|
|
43
|
+
"@judo/model-api": "0.1.0"
|
|
44
|
+
},
|
|
45
|
+
"peerDependencies": {
|
|
46
|
+
"date-fns": "^4.0.0",
|
|
47
|
+
"i18next": "^25.8.10",
|
|
48
|
+
"react": "^19.0.0",
|
|
49
|
+
"react-i18next": "^16.0.0",
|
|
50
|
+
"@judo/model-api": "0.1.0"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "vite build",
|
|
54
|
+
"clean": "rm -rf dist",
|
|
55
|
+
"type-check": "tsgo --noEmit",
|
|
56
|
+
"test": "vitest run",
|
|
57
|
+
"test:watch": "vitest"
|
|
58
|
+
}
|
|
59
|
+
}
|