@lichens-innovation/ts-common 1.15.1 → 1.15.2

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
@@ -140,23 +140,6 @@ Utilities and hooks for [React JSON Schema Form (RJSF)](https://rjsf-team.github
140
140
  npm install @rjsf/core @rjsf/utils @rjsf/validator-ajv8 ajv-i18n i18next react-i18next
141
141
  ```
142
142
 
143
- **Exports:** `initRjsf`, `useLocalizedForm`, `useRjsfValidator`, `useFormLayoutCols`, `translateRjsfString`, `RJSF_STRING_TO_I18N_KEY`, types (`LocalizedFormSchema`, `MetaFormSchema`, etc.).
144
-
145
- **Usage example:**
146
-
147
- ```ts
148
- import { initRjsf, useLocalizedForm, useRjsfValidator } from "@lichens-innovation/ts-common/rjsf";
149
-
150
- // After i18next is initialized (e.g. initI18N())
151
- initRjsf();
152
-
153
- // In a form component: localized schema from meta schema
154
- const localizedSchema = useLocalizedForm(metaFormSchema);
155
-
156
- // Validator with localized AJV messages (e.g. fr, en)
157
- const validator = useRjsfValidator();
158
- ```
159
-
160
143
  ## Contributions
161
144
 
162
145
  Contributions to the project are made by simply improving the current codebase and then creating a Pull Request. If the version field in `package.json` is incremented, the build will be automatically triggered when the PR is merged into the `main` branch, and the new version will be published to our enterprise Git repository.
package/dist/rjsf.cjs CHANGED
@@ -51,16 +51,16 @@ var rjsf_default2 = {
51
51
 
52
52
  // src/rjsf/i18n/i18n.ts
53
53
  var NAMESPACE = "rjsf";
54
- var initRjsf = (i18next2) => {
55
- if (!i18next2.isInitialized) {
56
- throw new Error("[initRjsf] i18next must be initialized before calling initRjsf. Call initI18N() or i18next.init() first.");
54
+ var addResourceBundleForRjsf = (i18next2) => {
55
+ if (!i18next2?.isInitialized) {
56
+ throw new Error("[addResourceBundleForRjsf] i18next must be initialized prior to calling this method. Call initI18N() or i18next.init() first.");
57
57
  }
58
58
  if (i18next2.hasResourceBundle("en", NAMESPACE)) return;
59
59
  const isDeep = true;
60
60
  const isOverwrite = true;
61
61
  i18next2.addResourceBundle("en", NAMESPACE, rjsf_default.rjsf, isDeep, isOverwrite);
62
62
  i18next2.addResourceBundle("fr", NAMESPACE, rjsf_default2.rjsf, isDeep, isOverwrite);
63
- console.info("[initRjsf] RJSF i18n initialized");
63
+ console.info("[addResourceBundleForRjsf] RJSF i18n initialized");
64
64
  };
65
65
 
66
66
  // src/utils/types.utils.ts
@@ -194,6 +194,7 @@ var useRjsfValidator = () => {
194
194
  };
195
195
 
196
196
  exports.RJSF_STRING_TO_I18N_KEY = RJSF_STRING_TO_I18N_KEY;
197
+ exports.addResourceBundleForRjsf = addResourceBundleForRjsf;
197
198
  exports.dateToDateOnlyString = dateToDateOnlyString;
198
199
  exports.formatDateOnlyForDisplay = formatDateOnlyForDisplay;
199
200
  exports.formatDateTimeForDisplay = formatDateTimeForDisplay;
@@ -201,7 +202,6 @@ exports.getFormLayoutCols = getFormLayoutCols;
201
202
  exports.getRjsfDisplayLabel = getRjsfDisplayLabel;
202
203
  exports.getRjsfTextChangeValue = getRjsfTextChangeValue;
203
204
  exports.hasRjsfErrors = hasRjsfErrors;
204
- exports.initRjsf = initRjsf;
205
205
  exports.mapEnumOptions = mapEnumOptions;
206
206
  exports.parseDateOnlyToLocalDate = parseDateOnlyToLocalDate;
207
207
  exports.parseDateOrNull = parseDateOrNull;
package/dist/rjsf.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/rjsf/i18n/en/rjsf.json","../src/rjsf/i18n/fr/rjsf.json","../src/rjsf/i18n/i18n.ts","../src/utils/types.utils.ts","../src/utils/string.utils.ts","../src/rjsf/utils/rjsf-i18n.utils.ts","../src/rjsf/utils/rjsf-widgets.utils.ts","../src/rjsf/utils/use-localized-form.ts","../src/rjsf/utils/use-rjsf-validator.ts"],"names":["rjsf_default","i18next","replaceStringParameters","useTranslation","localizer","customizeValidator"],"mappings":"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","file":"rjsf.cjs","sourcesContent":["{\n \"rjsf\": {\n \"add\": \"Add\",\n \"debugFormDataTitle\": \"JSON data\",\n \"addItem\": \"Add Item\",\n \"clear\": \"Clear\",\n \"errors\": \"Errors detected in the form\",\n \"copy\": \"Copy\",\n \"keyLabel\": \"%1 Key\",\n \"moveDown\": \"Move down\",\n \"moveUp\": \"Move up\",\n \"no\": \"No\",\n \"remove\": \"Remove\",\n \"submit\": \"Submit\",\n \"yes\": \"Yes\"\n }\n}\n","{\n \"rjsf\": {\n \"add\": \"Ajouter\",\n \"debugFormDataTitle\": \"Données JSON\",\n \"addItem\": \"Ajouter un élément\",\n \"clear\": \"Effacer\",\n \"errors\": \"Erreurs détectées dans le formulaire\",\n \"copy\": \"Copier\",\n \"keyLabel\": \"Clé %1\",\n \"moveDown\": \"Déplacer vers le bas\",\n \"moveUp\": \"Déplacer vers le haut\",\n \"no\": \"Non\",\n \"remove\": \"Supprimer\",\n \"submit\": \"Envoyer\",\n \"yes\": \"Oui\"\n }\n}\n","import type { i18n } from \"i18next\";\n\nimport en from \"./en/rjsf.json\";\nimport fr from \"./fr/rjsf.json\";\n\nconst NAMESPACE = \"rjsf\";\n\nexport const initRjsf = (i18next: i18n): void => {\n if (!i18next.isInitialized) {\n throw new Error(\"[initRjsf] i18next must be initialized before calling initRjsf. Call initI18N() or i18next.init() first.\");\n }\n\n if (i18next.hasResourceBundle(\"en\", NAMESPACE)) return;\n\n const isDeep = true;\n const isOverwrite = true;\n\n i18next.addResourceBundle(\"en\", NAMESPACE, en.rjsf, isDeep, isOverwrite);\n i18next.addResourceBundle(\"fr\", NAMESPACE, fr.rjsf, isDeep, isOverwrite);\n\n // eslint-disable-next-line no-console\n console.info('[initRjsf] RJSF i18n initialized'); \n};\n","export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = \"...\"): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(\",\")\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { replaceStringParameters } from \"@rjsf/utils\";\nimport i18next from \"i18next\";\nimport { isBlank } from \"~/utils/string.utils\";\n\n/** Maps RJSF TranslatableString values to our i18n keys (rjsf namespace). */\nexport const RJSF_STRING_TO_I18N_KEY: Record<string, string> = {\n \"Add Item\": \"rjsf:addItem\",\n Add: \"rjsf:add\",\n Copy: \"rjsf:copy\",\n \"Move down\": \"rjsf:moveDown\",\n \"Move up\": \"rjsf:moveUp\",\n Remove: \"rjsf:remove\",\n \"clear input\": \"rjsf:clear\",\n \"%1 Key\": \"rjsf:keyLabel\", // TODO: RJSF-001 find a way to dynamicaly resolve the rjsf-i18n.utils \"%1 Key\" pattern\n Yes: \"rjsf:yes\",\n No: \"rjsf:no\",\n Errors: \"rjsf:errors\",\n};\n\ninterface TranslateStringArgs {\n stringToTranslate: string;\n params?: string[];\n}\n\nexport const translateRjsfString = ({ stringToTranslate, params }: TranslateStringArgs): string => {\n const i18nKey = RJSF_STRING_TO_I18N_KEY[stringToTranslate];\n if (isBlank(i18nKey)) {\n // eslint-disable-next-line no-console\n console.warn(`[translateRjsfString] RJSF i18n: missing key: \"${stringToTranslate}\"`);\n }\n\n const translated = i18nKey ? i18next.t(i18nKey) : stringToTranslate;\n return replaceStringParameters(translated, params);\n};\n","import type { WidgetProps } from \"@rjsf/utils\";\nimport { isBlank } from \"~/utils/string.utils\";\nimport { isNullish } from \"~/utils/types.utils\";\n\n/**\n * Returns true when the widget has at least one validation error from RJSF.\n *\n * @param rawErrors - The rawErrors from WidgetProps (often `unknown`).\n * @returns true if rawErrors is a non-empty array.\n */\nexport const hasRjsfErrors = (rawErrors: unknown): boolean => Array.isArray(rawErrors) && rawErrors.length > 0;\n\nexport interface GetRjsfDisplayLabelArgs {\n label?: string;\n required?: boolean;\n hideLabel?: boolean;\n}\n\n/**\n * Returns the label to display for an RJSF widget, with optional required asterisk and\n * hideLabel support.\n *\n * @param label - The label to display for the widget.\n * @param required - Whether the field is required.\n * @param hideLabel - Whether to hide the label.\n *\n * @returns The label to display for the widget.\n */\nexport const getRjsfDisplayLabel = ({ label, required, hideLabel }: GetRjsfDisplayLabelArgs): string | undefined => {\n if (hideLabel) return undefined;\n if (isBlank(label)) return undefined;\n\n const requiredSuffix = required ? \" *\" : \"\";\n return `${label}${requiredSuffix}`;\n};\n\ninterface EnumOption {\n value: string;\n label: string;\n}\n\nexport type EnumOptionDisplay = { label: string; value: string };\n\nconst toEnumOptionDisplay = (o: EnumOption): EnumOptionDisplay => ({\n label: o?.label ?? String(o?.value ?? \"\"),\n value: String(o?.value ?? \"\"),\n});\n\nexport const mapEnumOptions = (options: WidgetProps[\"options\"]): EnumOptionDisplay[] => {\n const enumOptions = options?.enumOptions as EnumOption[] | undefined;\n if (!Array.isArray(enumOptions)) return [];\n return enumOptions.map(toEnumOptionDisplay);\n};\n\n/**\n * Converts a value to display string, or empty string when null/undefined.\n */\nexport const toStringOrEmpty = (value: unknown): string => (isNullish(value) ? \"\" : String(value));\n\n/**\n * Converts a value to display string, or undefined when null/undefined (e.g. for select placeholder).\n */\nexport const toStringOrUndefined = (value: unknown): string | undefined =>\n isNullish(value) ? undefined : String(value);\n\nexport interface GetRjsfTextChangeValueArgs {\n text: string;\n emptyValue?: unknown;\n}\n\n/**\n * Returns the value to pass to onChange for a text input.\n *\n * @param args.text - The current text input value.\n * @param args.emptyValue - The value to use when text is empty (e.g. options.emptyValue from WidgetProps).\n * @returns emptyValue when text is empty, otherwise text.\n */\nexport const getRjsfTextChangeValue = ({ text, emptyValue }: GetRjsfTextChangeValueArgs): unknown => {\n if (text === \"\") return emptyValue;\n return text;\n};\n\nexport const parseDateOrNull = (value?: string): Date | null => {\n if (isBlank(value)) return null;\n\n const date = new Date(value);\n const isValid = !Number.isNaN(date.getTime());\n return isValid ? date : null;\n};\n\n/** Returns YYYY-MM-DD for JSON Schema \"date\" format (form storage). */\nexport const dateToDateOnlyString = (date: Date): string => {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\n};\n\nconst DATE_ONLY_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/** Parses a date-only or full ISO string into a Date at local midnight (for date picker display). */\nexport const parseDateOnlyToLocalDate = (value?: string): Date | null => {\n if (isBlank(value)) return null;\n\n const trimmed = String(value).trim();\n const dateOnly = trimmed.slice(0, 10);\n if (!DATE_ONLY_REGEX.test(dateOnly)) return null;\n\n const [y, m, d] = dateOnly.split(\"-\").map(Number);\n return new Date(y, m - 1, d);\n};\n\n/** Extracts date-only YYYY-MM-DD for display from a full ISO or date-only string. */\nexport const formatDateOnlyForDisplay = (value?: string): string => {\n if (isBlank(value)) return \"\";\n\n const trimmed = String(value).trim();\n const dateOnly = trimmed.slice(0, 10);\n return DATE_ONLY_REGEX.test(dateOnly) ? dateOnly : \"\";\n};\n\n/** Formats a full ISO or date string for date-time display (locale string). */\nexport const formatDateTimeForDisplay = (value?: string): string => {\n const date = parseDateOrNull(value);\n return date ? date.toLocaleString() : \"\";\n};\n\ntype FormLayoutContext = {\n labelCol?: { span: number };\n wrapperCol?: { span: number };\n};\n\nconst DEFAULT_SPAN = 24;\n\nexport const getFormLayoutCols = (formContext?: unknown): FormLayoutContext => {\n if (isNullish(formContext)) {\n return {\n labelCol: { span: DEFAULT_SPAN },\n wrapperCol: { span: DEFAULT_SPAN },\n };\n }\n\n const { labelCol, wrapperCol } = formContext as FormLayoutContext;\n return {\n labelCol: labelCol ?? { span: DEFAULT_SPAN },\n wrapperCol: wrapperCol ?? { span: DEFAULT_SPAN },\n };\n};\n","import { isBlank } from \"~/utils/string.utils\";\nimport { useTranslation } from \"react-i18next\";\nimport type { LocalizedFormSchema, MetaFormSchema } from \"./rjsf-i18n-types\";\n\nconst DEFAULT_LANGUAGE = \"fr\";\n\n// i18n.language can be 'fr-CA', so we take the first part\nconst parseSimplifiedLangCode = (language?: string): string => {\n if (isBlank(language)) return DEFAULT_LANGUAGE;\n return language.split(\"-\")[0];\n};\n\nconst getFallbackLanguage = (metaFormSchema: MetaFormSchema): string => {\n return Object.keys(metaFormSchema.i18n)[0] ?? DEFAULT_LANGUAGE;\n};\n\nexport const useLocalizedForm = (metaFormSchema: MetaFormSchema): LocalizedFormSchema => {\n const { i18n } = useTranslation();\n const language = parseSimplifiedLangCode(i18n.language);\n\n if (metaFormSchema.i18n[language]) {\n return metaFormSchema.i18n[language];\n }\n\n const fallbackLanguage = getFallbackLanguage(metaFormSchema);\n // eslint-disable-next-line no-console\n console.warn(\n `Language ${language} not found in metaFormSchema ${metaFormSchema.id}. Falling back to ${fallbackLanguage}.`\n );\n\n return metaFormSchema.i18n[fallbackLanguage];\n};\n","import { customizeValidator, type Localizer } from \"@rjsf/validator-ajv8\";\nimport localizer from \"ajv-i18n\";\nimport { useTranslation } from \"react-i18next\";\n\nconst customFormats = {\n \"phone-america\": /^\\(?\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{4}$/,\n};\n\ntype ValidationLanguages = keyof typeof localizer;\n\nexport const useRjsfValidator = () => {\n const { i18n } = useTranslation();\n const appLanguage = i18n.language as ValidationLanguages;\n const localizerFn: Localizer = localizer[appLanguage] ?? localizer.en;\n\n return customizeValidator({ customFormats }, localizerFn);\n};\n"]}
1
+ {"version":3,"sources":["../src/rjsf/i18n/en/rjsf.json","../src/rjsf/i18n/fr/rjsf.json","../src/rjsf/i18n/i18n.ts","../src/utils/types.utils.ts","../src/utils/string.utils.ts","../src/rjsf/utils/rjsf-i18n.utils.ts","../src/rjsf/utils/rjsf-widgets.utils.ts","../src/rjsf/utils/use-localized-form.ts","../src/rjsf/utils/use-rjsf-validator.ts"],"names":["rjsf_default","i18next","replaceStringParameters","useTranslation","localizer","customizeValidator"],"mappings":"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","file":"rjsf.cjs","sourcesContent":["{\n \"rjsf\": {\n \"add\": \"Add\",\n \"debugFormDataTitle\": \"JSON data\",\n \"addItem\": \"Add Item\",\n \"clear\": \"Clear\",\n \"errors\": \"Errors detected in the form\",\n \"copy\": \"Copy\",\n \"keyLabel\": \"%1 Key\",\n \"moveDown\": \"Move down\",\n \"moveUp\": \"Move up\",\n \"no\": \"No\",\n \"remove\": \"Remove\",\n \"submit\": \"Submit\",\n \"yes\": \"Yes\"\n }\n}\n","{\n \"rjsf\": {\n \"add\": \"Ajouter\",\n \"debugFormDataTitle\": \"Données JSON\",\n \"addItem\": \"Ajouter un élément\",\n \"clear\": \"Effacer\",\n \"errors\": \"Erreurs détectées dans le formulaire\",\n \"copy\": \"Copier\",\n \"keyLabel\": \"Clé %1\",\n \"moveDown\": \"Déplacer vers le bas\",\n \"moveUp\": \"Déplacer vers le haut\",\n \"no\": \"Non\",\n \"remove\": \"Supprimer\",\n \"submit\": \"Envoyer\",\n \"yes\": \"Oui\"\n }\n}\n","import type { i18n } from \"i18next\";\n\nimport en from \"./en/rjsf.json\";\nimport fr from \"./fr/rjsf.json\";\n\nconst NAMESPACE = \"rjsf\";\n\nexport const addResourceBundleForRjsf = (i18next: i18n): void => {\n if (!i18next?.isInitialized) {\n throw new Error(\"[addResourceBundleForRjsf] i18next must be initialized prior to calling this method. Call initI18N() or i18next.init() first.\");\n }\n\n if (i18next.hasResourceBundle(\"en\", NAMESPACE)) return;\n\n const isDeep = true;\n const isOverwrite = true;\n\n i18next.addResourceBundle(\"en\", NAMESPACE, en.rjsf, isDeep, isOverwrite);\n i18next.addResourceBundle(\"fr\", NAMESPACE, fr.rjsf, isDeep, isOverwrite);\n\n // eslint-disable-next-line no-console\n console.info('[addResourceBundleForRjsf] RJSF i18n initialized'); \n};\n","export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = \"...\"): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(\",\")\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { replaceStringParameters } from \"@rjsf/utils\";\nimport i18next from \"i18next\";\nimport { isBlank } from \"~/utils/string.utils\";\n\n/** Maps RJSF TranslatableString values to our i18n keys (rjsf namespace). */\nexport const RJSF_STRING_TO_I18N_KEY: Record<string, string> = {\n \"Add Item\": \"rjsf:addItem\",\n Add: \"rjsf:add\",\n Copy: \"rjsf:copy\",\n \"Move down\": \"rjsf:moveDown\",\n \"Move up\": \"rjsf:moveUp\",\n Remove: \"rjsf:remove\",\n \"clear input\": \"rjsf:clear\",\n \"%1 Key\": \"rjsf:keyLabel\", // TODO: RJSF-001 find a way to dynamicaly resolve the rjsf-i18n.utils \"%1 Key\" pattern\n Yes: \"rjsf:yes\",\n No: \"rjsf:no\",\n Errors: \"rjsf:errors\",\n};\n\ninterface TranslateStringArgs {\n stringToTranslate: string;\n params?: string[];\n}\n\nexport const translateRjsfString = ({ stringToTranslate, params }: TranslateStringArgs): string => {\n const i18nKey = RJSF_STRING_TO_I18N_KEY[stringToTranslate];\n if (isBlank(i18nKey)) {\n // eslint-disable-next-line no-console\n console.warn(`[translateRjsfString] RJSF i18n: missing key: \"${stringToTranslate}\"`);\n }\n\n const translated = i18nKey ? i18next.t(i18nKey) : stringToTranslate;\n return replaceStringParameters(translated, params);\n};\n","import type { WidgetProps } from \"@rjsf/utils\";\nimport { isBlank } from \"~/utils/string.utils\";\nimport { isNullish } from \"~/utils/types.utils\";\n\n/**\n * Returns true when the widget has at least one validation error from RJSF.\n *\n * @param rawErrors - The rawErrors from WidgetProps (often `unknown`).\n * @returns true if rawErrors is a non-empty array.\n */\nexport const hasRjsfErrors = (rawErrors: unknown): boolean => Array.isArray(rawErrors) && rawErrors.length > 0;\n\nexport interface GetRjsfDisplayLabelArgs {\n label?: string;\n required?: boolean;\n hideLabel?: boolean;\n}\n\n/**\n * Returns the label to display for an RJSF widget, with optional required asterisk and\n * hideLabel support.\n *\n * @param label - The label to display for the widget.\n * @param required - Whether the field is required.\n * @param hideLabel - Whether to hide the label.\n *\n * @returns The label to display for the widget.\n */\nexport const getRjsfDisplayLabel = ({ label, required, hideLabel }: GetRjsfDisplayLabelArgs): string | undefined => {\n if (hideLabel) return undefined;\n if (isBlank(label)) return undefined;\n\n const requiredSuffix = required ? \" *\" : \"\";\n return `${label}${requiredSuffix}`;\n};\n\ninterface EnumOption {\n value: string;\n label: string;\n}\n\nexport type EnumOptionDisplay = { label: string; value: string };\n\nconst toEnumOptionDisplay = (o: EnumOption): EnumOptionDisplay => ({\n label: o?.label ?? String(o?.value ?? \"\"),\n value: String(o?.value ?? \"\"),\n});\n\nexport const mapEnumOptions = (options: WidgetProps[\"options\"]): EnumOptionDisplay[] => {\n const enumOptions = options?.enumOptions as EnumOption[] | undefined;\n if (!Array.isArray(enumOptions)) return [];\n return enumOptions.map(toEnumOptionDisplay);\n};\n\n/**\n * Converts a value to display string, or empty string when null/undefined.\n */\nexport const toStringOrEmpty = (value: unknown): string => (isNullish(value) ? \"\" : String(value));\n\n/**\n * Converts a value to display string, or undefined when null/undefined (e.g. for select placeholder).\n */\nexport const toStringOrUndefined = (value: unknown): string | undefined =>\n isNullish(value) ? undefined : String(value);\n\nexport interface GetRjsfTextChangeValueArgs {\n text: string;\n emptyValue?: unknown;\n}\n\n/**\n * Returns the value to pass to onChange for a text input.\n *\n * @param args.text - The current text input value.\n * @param args.emptyValue - The value to use when text is empty (e.g. options.emptyValue from WidgetProps).\n * @returns emptyValue when text is empty, otherwise text.\n */\nexport const getRjsfTextChangeValue = ({ text, emptyValue }: GetRjsfTextChangeValueArgs): unknown => {\n if (text === \"\") return emptyValue;\n return text;\n};\n\nexport const parseDateOrNull = (value?: string): Date | null => {\n if (isBlank(value)) return null;\n\n const date = new Date(value);\n const isValid = !Number.isNaN(date.getTime());\n return isValid ? date : null;\n};\n\n/** Returns YYYY-MM-DD for JSON Schema \"date\" format (form storage). */\nexport const dateToDateOnlyString = (date: Date): string => {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\n};\n\nconst DATE_ONLY_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/** Parses a date-only or full ISO string into a Date at local midnight (for date picker display). */\nexport const parseDateOnlyToLocalDate = (value?: string): Date | null => {\n if (isBlank(value)) return null;\n\n const trimmed = String(value).trim();\n const dateOnly = trimmed.slice(0, 10);\n if (!DATE_ONLY_REGEX.test(dateOnly)) return null;\n\n const [y, m, d] = dateOnly.split(\"-\").map(Number);\n return new Date(y, m - 1, d);\n};\n\n/** Extracts date-only YYYY-MM-DD for display from a full ISO or date-only string. */\nexport const formatDateOnlyForDisplay = (value?: string): string => {\n if (isBlank(value)) return \"\";\n\n const trimmed = String(value).trim();\n const dateOnly = trimmed.slice(0, 10);\n return DATE_ONLY_REGEX.test(dateOnly) ? dateOnly : \"\";\n};\n\n/** Formats a full ISO or date string for date-time display (locale string). */\nexport const formatDateTimeForDisplay = (value?: string): string => {\n const date = parseDateOrNull(value);\n return date ? date.toLocaleString() : \"\";\n};\n\ntype FormLayoutContext = {\n labelCol?: { span: number };\n wrapperCol?: { span: number };\n};\n\nconst DEFAULT_SPAN = 24;\n\nexport const getFormLayoutCols = (formContext?: unknown): FormLayoutContext => {\n if (isNullish(formContext)) {\n return {\n labelCol: { span: DEFAULT_SPAN },\n wrapperCol: { span: DEFAULT_SPAN },\n };\n }\n\n const { labelCol, wrapperCol } = formContext as FormLayoutContext;\n return {\n labelCol: labelCol ?? { span: DEFAULT_SPAN },\n wrapperCol: wrapperCol ?? { span: DEFAULT_SPAN },\n };\n};\n","import { isBlank } from \"~/utils/string.utils\";\nimport { useTranslation } from \"react-i18next\";\nimport type { LocalizedFormSchema, MetaFormSchema } from \"./rjsf-i18n-types\";\n\nconst DEFAULT_LANGUAGE = \"fr\";\n\n// i18n.language can be 'fr-CA', so we take the first part\nconst parseSimplifiedLangCode = (language?: string): string => {\n if (isBlank(language)) return DEFAULT_LANGUAGE;\n return language.split(\"-\")[0];\n};\n\nconst getFallbackLanguage = (metaFormSchema: MetaFormSchema): string => {\n return Object.keys(metaFormSchema.i18n)[0] ?? DEFAULT_LANGUAGE;\n};\n\nexport const useLocalizedForm = (metaFormSchema: MetaFormSchema): LocalizedFormSchema => {\n const { i18n } = useTranslation();\n const language = parseSimplifiedLangCode(i18n.language);\n\n if (metaFormSchema.i18n[language]) {\n return metaFormSchema.i18n[language];\n }\n\n const fallbackLanguage = getFallbackLanguage(metaFormSchema);\n // eslint-disable-next-line no-console\n console.warn(\n `Language ${language} not found in metaFormSchema ${metaFormSchema.id}. Falling back to ${fallbackLanguage}.`\n );\n\n return metaFormSchema.i18n[fallbackLanguage];\n};\n","import { customizeValidator, type Localizer } from \"@rjsf/validator-ajv8\";\nimport localizer from \"ajv-i18n\";\nimport { useTranslation } from \"react-i18next\";\n\nconst customFormats = {\n \"phone-america\": /^\\(?\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{4}$/,\n};\n\ntype ValidationLanguages = keyof typeof localizer;\n\nexport const useRjsfValidator = () => {\n const { i18n } = useTranslation();\n const appLanguage = i18n.language as ValidationLanguages;\n const localizerFn: Localizer = localizer[appLanguage] ?? localizer.en;\n\n return customizeValidator({ customFormats }, localizerFn);\n};\n"]}
package/dist/rjsf.d.cts CHANGED
@@ -3,7 +3,7 @@ import * as _rjsf_utils from '@rjsf/utils';
3
3
  import { TranslatableString, RJSFSchema, UiSchema, WidgetProps } from '@rjsf/utils';
4
4
  import * as _rjsf_validator_ajv8_lib_validator_js from '@rjsf/validator-ajv8/lib/validator.js';
5
5
 
6
- declare const initRjsf: (i18next: i18n) => void;
6
+ declare const addResourceBundleForRjsf: (i18next: i18n) => void;
7
7
 
8
8
  type Language = string;
9
9
  /** Registry shape with translation used by RJSF template buttons. */
@@ -99,4 +99,4 @@ declare const useLocalizedForm: (metaFormSchema: MetaFormSchema) => LocalizedFor
99
99
 
100
100
  declare const useRjsfValidator: () => _rjsf_validator_ajv8_lib_validator_js.default<any, _rjsf_utils.RJSFSchema, any>;
101
101
 
102
- export { type EnumOptionDisplay, type GetRjsfDisplayLabelArgs, type GetRjsfTextChangeValueArgs, type Language, type LocalizedFormSchema, type MetaFormSchema, RJSF_STRING_TO_I18N_KEY, type RjsfRegistryWithTranslate, dateToDateOnlyString, formatDateOnlyForDisplay, formatDateTimeForDisplay, getFormLayoutCols, getRjsfDisplayLabel, getRjsfTextChangeValue, hasRjsfErrors, initRjsf, mapEnumOptions, parseDateOnlyToLocalDate, parseDateOrNull, toStringOrEmpty, toStringOrUndefined, translateRjsfString, useLocalizedForm, useRjsfValidator };
102
+ export { type EnumOptionDisplay, type GetRjsfDisplayLabelArgs, type GetRjsfTextChangeValueArgs, type Language, type LocalizedFormSchema, type MetaFormSchema, RJSF_STRING_TO_I18N_KEY, type RjsfRegistryWithTranslate, addResourceBundleForRjsf, dateToDateOnlyString, formatDateOnlyForDisplay, formatDateTimeForDisplay, getFormLayoutCols, getRjsfDisplayLabel, getRjsfTextChangeValue, hasRjsfErrors, mapEnumOptions, parseDateOnlyToLocalDate, parseDateOrNull, toStringOrEmpty, toStringOrUndefined, translateRjsfString, useLocalizedForm, useRjsfValidator };
package/dist/rjsf.d.ts CHANGED
@@ -3,7 +3,7 @@ import * as _rjsf_utils from '@rjsf/utils';
3
3
  import { TranslatableString, RJSFSchema, UiSchema, WidgetProps } from '@rjsf/utils';
4
4
  import * as _rjsf_validator_ajv8_lib_validator_js from '@rjsf/validator-ajv8/lib/validator.js';
5
5
 
6
- declare const initRjsf: (i18next: i18n) => void;
6
+ declare const addResourceBundleForRjsf: (i18next: i18n) => void;
7
7
 
8
8
  type Language = string;
9
9
  /** Registry shape with translation used by RJSF template buttons. */
@@ -99,4 +99,4 @@ declare const useLocalizedForm: (metaFormSchema: MetaFormSchema) => LocalizedFor
99
99
 
100
100
  declare const useRjsfValidator: () => _rjsf_validator_ajv8_lib_validator_js.default<any, _rjsf_utils.RJSFSchema, any>;
101
101
 
102
- export { type EnumOptionDisplay, type GetRjsfDisplayLabelArgs, type GetRjsfTextChangeValueArgs, type Language, type LocalizedFormSchema, type MetaFormSchema, RJSF_STRING_TO_I18N_KEY, type RjsfRegistryWithTranslate, dateToDateOnlyString, formatDateOnlyForDisplay, formatDateTimeForDisplay, getFormLayoutCols, getRjsfDisplayLabel, getRjsfTextChangeValue, hasRjsfErrors, initRjsf, mapEnumOptions, parseDateOnlyToLocalDate, parseDateOrNull, toStringOrEmpty, toStringOrUndefined, translateRjsfString, useLocalizedForm, useRjsfValidator };
102
+ export { type EnumOptionDisplay, type GetRjsfDisplayLabelArgs, type GetRjsfTextChangeValueArgs, type Language, type LocalizedFormSchema, type MetaFormSchema, RJSF_STRING_TO_I18N_KEY, type RjsfRegistryWithTranslate, addResourceBundleForRjsf, dateToDateOnlyString, formatDateOnlyForDisplay, formatDateTimeForDisplay, getFormLayoutCols, getRjsfDisplayLabel, getRjsfTextChangeValue, hasRjsfErrors, mapEnumOptions, parseDateOnlyToLocalDate, parseDateOrNull, toStringOrEmpty, toStringOrUndefined, translateRjsfString, useLocalizedForm, useRjsfValidator };
package/dist/rjsf.js CHANGED
@@ -44,16 +44,16 @@ var rjsf_default2 = {
44
44
 
45
45
  // src/rjsf/i18n/i18n.ts
46
46
  var NAMESPACE = "rjsf";
47
- var initRjsf = (i18next2) => {
48
- if (!i18next2.isInitialized) {
49
- throw new Error("[initRjsf] i18next must be initialized before calling initRjsf. Call initI18N() or i18next.init() first.");
47
+ var addResourceBundleForRjsf = (i18next2) => {
48
+ if (!i18next2?.isInitialized) {
49
+ throw new Error("[addResourceBundleForRjsf] i18next must be initialized prior to calling this method. Call initI18N() or i18next.init() first.");
50
50
  }
51
51
  if (i18next2.hasResourceBundle("en", NAMESPACE)) return;
52
52
  const isDeep = true;
53
53
  const isOverwrite = true;
54
54
  i18next2.addResourceBundle("en", NAMESPACE, rjsf_default.rjsf, isDeep, isOverwrite);
55
55
  i18next2.addResourceBundle("fr", NAMESPACE, rjsf_default2.rjsf, isDeep, isOverwrite);
56
- console.info("[initRjsf] RJSF i18n initialized");
56
+ console.info("[addResourceBundleForRjsf] RJSF i18n initialized");
57
57
  };
58
58
 
59
59
  // src/utils/types.utils.ts
@@ -186,6 +186,6 @@ var useRjsfValidator = () => {
186
186
  return customizeValidator({ customFormats }, localizerFn);
187
187
  };
188
188
 
189
- export { RJSF_STRING_TO_I18N_KEY, dateToDateOnlyString, formatDateOnlyForDisplay, formatDateTimeForDisplay, getFormLayoutCols, getRjsfDisplayLabel, getRjsfTextChangeValue, hasRjsfErrors, initRjsf, mapEnumOptions, parseDateOnlyToLocalDate, parseDateOrNull, toStringOrEmpty, toStringOrUndefined, translateRjsfString, useLocalizedForm, useRjsfValidator };
189
+ export { RJSF_STRING_TO_I18N_KEY, addResourceBundleForRjsf, dateToDateOnlyString, formatDateOnlyForDisplay, formatDateTimeForDisplay, getFormLayoutCols, getRjsfDisplayLabel, getRjsfTextChangeValue, hasRjsfErrors, mapEnumOptions, parseDateOnlyToLocalDate, parseDateOrNull, toStringOrEmpty, toStringOrUndefined, translateRjsfString, useLocalizedForm, useRjsfValidator };
190
190
  //# sourceMappingURL=rjsf.js.map
191
191
  //# sourceMappingURL=rjsf.js.map
package/dist/rjsf.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/rjsf/i18n/en/rjsf.json","../src/rjsf/i18n/fr/rjsf.json","../src/rjsf/i18n/i18n.ts","../src/utils/types.utils.ts","../src/utils/string.utils.ts","../src/rjsf/utils/rjsf-i18n.utils.ts","../src/rjsf/utils/rjsf-widgets.utils.ts","../src/rjsf/utils/use-localized-form.ts","../src/rjsf/utils/use-rjsf-validator.ts"],"names":["rjsf_default","i18next","useTranslation"],"mappings":"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","file":"rjsf.js","sourcesContent":["{\n \"rjsf\": {\n \"add\": \"Add\",\n \"debugFormDataTitle\": \"JSON data\",\n \"addItem\": \"Add Item\",\n \"clear\": \"Clear\",\n \"errors\": \"Errors detected in the form\",\n \"copy\": \"Copy\",\n \"keyLabel\": \"%1 Key\",\n \"moveDown\": \"Move down\",\n \"moveUp\": \"Move up\",\n \"no\": \"No\",\n \"remove\": \"Remove\",\n \"submit\": \"Submit\",\n \"yes\": \"Yes\"\n }\n}\n","{\n \"rjsf\": {\n \"add\": \"Ajouter\",\n \"debugFormDataTitle\": \"Données JSON\",\n \"addItem\": \"Ajouter un élément\",\n \"clear\": \"Effacer\",\n \"errors\": \"Erreurs détectées dans le formulaire\",\n \"copy\": \"Copier\",\n \"keyLabel\": \"Clé %1\",\n \"moveDown\": \"Déplacer vers le bas\",\n \"moveUp\": \"Déplacer vers le haut\",\n \"no\": \"Non\",\n \"remove\": \"Supprimer\",\n \"submit\": \"Envoyer\",\n \"yes\": \"Oui\"\n }\n}\n","import type { i18n } from \"i18next\";\n\nimport en from \"./en/rjsf.json\";\nimport fr from \"./fr/rjsf.json\";\n\nconst NAMESPACE = \"rjsf\";\n\nexport const initRjsf = (i18next: i18n): void => {\n if (!i18next.isInitialized) {\n throw new Error(\"[initRjsf] i18next must be initialized before calling initRjsf. Call initI18N() or i18next.init() first.\");\n }\n\n if (i18next.hasResourceBundle(\"en\", NAMESPACE)) return;\n\n const isDeep = true;\n const isOverwrite = true;\n\n i18next.addResourceBundle(\"en\", NAMESPACE, en.rjsf, isDeep, isOverwrite);\n i18next.addResourceBundle(\"fr\", NAMESPACE, fr.rjsf, isDeep, isOverwrite);\n\n // eslint-disable-next-line no-console\n console.info('[initRjsf] RJSF i18n initialized'); \n};\n","export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = \"...\"): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(\",\")\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { replaceStringParameters } from \"@rjsf/utils\";\nimport i18next from \"i18next\";\nimport { isBlank } from \"~/utils/string.utils\";\n\n/** Maps RJSF TranslatableString values to our i18n keys (rjsf namespace). */\nexport const RJSF_STRING_TO_I18N_KEY: Record<string, string> = {\n \"Add Item\": \"rjsf:addItem\",\n Add: \"rjsf:add\",\n Copy: \"rjsf:copy\",\n \"Move down\": \"rjsf:moveDown\",\n \"Move up\": \"rjsf:moveUp\",\n Remove: \"rjsf:remove\",\n \"clear input\": \"rjsf:clear\",\n \"%1 Key\": \"rjsf:keyLabel\", // TODO: RJSF-001 find a way to dynamicaly resolve the rjsf-i18n.utils \"%1 Key\" pattern\n Yes: \"rjsf:yes\",\n No: \"rjsf:no\",\n Errors: \"rjsf:errors\",\n};\n\ninterface TranslateStringArgs {\n stringToTranslate: string;\n params?: string[];\n}\n\nexport const translateRjsfString = ({ stringToTranslate, params }: TranslateStringArgs): string => {\n const i18nKey = RJSF_STRING_TO_I18N_KEY[stringToTranslate];\n if (isBlank(i18nKey)) {\n // eslint-disable-next-line no-console\n console.warn(`[translateRjsfString] RJSF i18n: missing key: \"${stringToTranslate}\"`);\n }\n\n const translated = i18nKey ? i18next.t(i18nKey) : stringToTranslate;\n return replaceStringParameters(translated, params);\n};\n","import type { WidgetProps } from \"@rjsf/utils\";\nimport { isBlank } from \"~/utils/string.utils\";\nimport { isNullish } from \"~/utils/types.utils\";\n\n/**\n * Returns true when the widget has at least one validation error from RJSF.\n *\n * @param rawErrors - The rawErrors from WidgetProps (often `unknown`).\n * @returns true if rawErrors is a non-empty array.\n */\nexport const hasRjsfErrors = (rawErrors: unknown): boolean => Array.isArray(rawErrors) && rawErrors.length > 0;\n\nexport interface GetRjsfDisplayLabelArgs {\n label?: string;\n required?: boolean;\n hideLabel?: boolean;\n}\n\n/**\n * Returns the label to display for an RJSF widget, with optional required asterisk and\n * hideLabel support.\n *\n * @param label - The label to display for the widget.\n * @param required - Whether the field is required.\n * @param hideLabel - Whether to hide the label.\n *\n * @returns The label to display for the widget.\n */\nexport const getRjsfDisplayLabel = ({ label, required, hideLabel }: GetRjsfDisplayLabelArgs): string | undefined => {\n if (hideLabel) return undefined;\n if (isBlank(label)) return undefined;\n\n const requiredSuffix = required ? \" *\" : \"\";\n return `${label}${requiredSuffix}`;\n};\n\ninterface EnumOption {\n value: string;\n label: string;\n}\n\nexport type EnumOptionDisplay = { label: string; value: string };\n\nconst toEnumOptionDisplay = (o: EnumOption): EnumOptionDisplay => ({\n label: o?.label ?? String(o?.value ?? \"\"),\n value: String(o?.value ?? \"\"),\n});\n\nexport const mapEnumOptions = (options: WidgetProps[\"options\"]): EnumOptionDisplay[] => {\n const enumOptions = options?.enumOptions as EnumOption[] | undefined;\n if (!Array.isArray(enumOptions)) return [];\n return enumOptions.map(toEnumOptionDisplay);\n};\n\n/**\n * Converts a value to display string, or empty string when null/undefined.\n */\nexport const toStringOrEmpty = (value: unknown): string => (isNullish(value) ? \"\" : String(value));\n\n/**\n * Converts a value to display string, or undefined when null/undefined (e.g. for select placeholder).\n */\nexport const toStringOrUndefined = (value: unknown): string | undefined =>\n isNullish(value) ? undefined : String(value);\n\nexport interface GetRjsfTextChangeValueArgs {\n text: string;\n emptyValue?: unknown;\n}\n\n/**\n * Returns the value to pass to onChange for a text input.\n *\n * @param args.text - The current text input value.\n * @param args.emptyValue - The value to use when text is empty (e.g. options.emptyValue from WidgetProps).\n * @returns emptyValue when text is empty, otherwise text.\n */\nexport const getRjsfTextChangeValue = ({ text, emptyValue }: GetRjsfTextChangeValueArgs): unknown => {\n if (text === \"\") return emptyValue;\n return text;\n};\n\nexport const parseDateOrNull = (value?: string): Date | null => {\n if (isBlank(value)) return null;\n\n const date = new Date(value);\n const isValid = !Number.isNaN(date.getTime());\n return isValid ? date : null;\n};\n\n/** Returns YYYY-MM-DD for JSON Schema \"date\" format (form storage). */\nexport const dateToDateOnlyString = (date: Date): string => {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\n};\n\nconst DATE_ONLY_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/** Parses a date-only or full ISO string into a Date at local midnight (for date picker display). */\nexport const parseDateOnlyToLocalDate = (value?: string): Date | null => {\n if (isBlank(value)) return null;\n\n const trimmed = String(value).trim();\n const dateOnly = trimmed.slice(0, 10);\n if (!DATE_ONLY_REGEX.test(dateOnly)) return null;\n\n const [y, m, d] = dateOnly.split(\"-\").map(Number);\n return new Date(y, m - 1, d);\n};\n\n/** Extracts date-only YYYY-MM-DD for display from a full ISO or date-only string. */\nexport const formatDateOnlyForDisplay = (value?: string): string => {\n if (isBlank(value)) return \"\";\n\n const trimmed = String(value).trim();\n const dateOnly = trimmed.slice(0, 10);\n return DATE_ONLY_REGEX.test(dateOnly) ? dateOnly : \"\";\n};\n\n/** Formats a full ISO or date string for date-time display (locale string). */\nexport const formatDateTimeForDisplay = (value?: string): string => {\n const date = parseDateOrNull(value);\n return date ? date.toLocaleString() : \"\";\n};\n\ntype FormLayoutContext = {\n labelCol?: { span: number };\n wrapperCol?: { span: number };\n};\n\nconst DEFAULT_SPAN = 24;\n\nexport const getFormLayoutCols = (formContext?: unknown): FormLayoutContext => {\n if (isNullish(formContext)) {\n return {\n labelCol: { span: DEFAULT_SPAN },\n wrapperCol: { span: DEFAULT_SPAN },\n };\n }\n\n const { labelCol, wrapperCol } = formContext as FormLayoutContext;\n return {\n labelCol: labelCol ?? { span: DEFAULT_SPAN },\n wrapperCol: wrapperCol ?? { span: DEFAULT_SPAN },\n };\n};\n","import { isBlank } from \"~/utils/string.utils\";\nimport { useTranslation } from \"react-i18next\";\nimport type { LocalizedFormSchema, MetaFormSchema } from \"./rjsf-i18n-types\";\n\nconst DEFAULT_LANGUAGE = \"fr\";\n\n// i18n.language can be 'fr-CA', so we take the first part\nconst parseSimplifiedLangCode = (language?: string): string => {\n if (isBlank(language)) return DEFAULT_LANGUAGE;\n return language.split(\"-\")[0];\n};\n\nconst getFallbackLanguage = (metaFormSchema: MetaFormSchema): string => {\n return Object.keys(metaFormSchema.i18n)[0] ?? DEFAULT_LANGUAGE;\n};\n\nexport const useLocalizedForm = (metaFormSchema: MetaFormSchema): LocalizedFormSchema => {\n const { i18n } = useTranslation();\n const language = parseSimplifiedLangCode(i18n.language);\n\n if (metaFormSchema.i18n[language]) {\n return metaFormSchema.i18n[language];\n }\n\n const fallbackLanguage = getFallbackLanguage(metaFormSchema);\n // eslint-disable-next-line no-console\n console.warn(\n `Language ${language} not found in metaFormSchema ${metaFormSchema.id}. Falling back to ${fallbackLanguage}.`\n );\n\n return metaFormSchema.i18n[fallbackLanguage];\n};\n","import { customizeValidator, type Localizer } from \"@rjsf/validator-ajv8\";\nimport localizer from \"ajv-i18n\";\nimport { useTranslation } from \"react-i18next\";\n\nconst customFormats = {\n \"phone-america\": /^\\(?\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{4}$/,\n};\n\ntype ValidationLanguages = keyof typeof localizer;\n\nexport const useRjsfValidator = () => {\n const { i18n } = useTranslation();\n const appLanguage = i18n.language as ValidationLanguages;\n const localizerFn: Localizer = localizer[appLanguage] ?? localizer.en;\n\n return customizeValidator({ customFormats }, localizerFn);\n};\n"]}
1
+ {"version":3,"sources":["../src/rjsf/i18n/en/rjsf.json","../src/rjsf/i18n/fr/rjsf.json","../src/rjsf/i18n/i18n.ts","../src/utils/types.utils.ts","../src/utils/string.utils.ts","../src/rjsf/utils/rjsf-i18n.utils.ts","../src/rjsf/utils/rjsf-widgets.utils.ts","../src/rjsf/utils/use-localized-form.ts","../src/rjsf/utils/use-rjsf-validator.ts"],"names":["rjsf_default","i18next","useTranslation"],"mappings":"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","file":"rjsf.js","sourcesContent":["{\n \"rjsf\": {\n \"add\": \"Add\",\n \"debugFormDataTitle\": \"JSON data\",\n \"addItem\": \"Add Item\",\n \"clear\": \"Clear\",\n \"errors\": \"Errors detected in the form\",\n \"copy\": \"Copy\",\n \"keyLabel\": \"%1 Key\",\n \"moveDown\": \"Move down\",\n \"moveUp\": \"Move up\",\n \"no\": \"No\",\n \"remove\": \"Remove\",\n \"submit\": \"Submit\",\n \"yes\": \"Yes\"\n }\n}\n","{\n \"rjsf\": {\n \"add\": \"Ajouter\",\n \"debugFormDataTitle\": \"Données JSON\",\n \"addItem\": \"Ajouter un élément\",\n \"clear\": \"Effacer\",\n \"errors\": \"Erreurs détectées dans le formulaire\",\n \"copy\": \"Copier\",\n \"keyLabel\": \"Clé %1\",\n \"moveDown\": \"Déplacer vers le bas\",\n \"moveUp\": \"Déplacer vers le haut\",\n \"no\": \"Non\",\n \"remove\": \"Supprimer\",\n \"submit\": \"Envoyer\",\n \"yes\": \"Oui\"\n }\n}\n","import type { i18n } from \"i18next\";\n\nimport en from \"./en/rjsf.json\";\nimport fr from \"./fr/rjsf.json\";\n\nconst NAMESPACE = \"rjsf\";\n\nexport const addResourceBundleForRjsf = (i18next: i18n): void => {\n if (!i18next?.isInitialized) {\n throw new Error(\"[addResourceBundleForRjsf] i18next must be initialized prior to calling this method. Call initI18N() or i18next.init() first.\");\n }\n\n if (i18next.hasResourceBundle(\"en\", NAMESPACE)) return;\n\n const isDeep = true;\n const isOverwrite = true;\n\n i18next.addResourceBundle(\"en\", NAMESPACE, en.rjsf, isDeep, isOverwrite);\n i18next.addResourceBundle(\"fr\", NAMESPACE, fr.rjsf, isDeep, isOverwrite);\n\n // eslint-disable-next-line no-console\n console.info('[addResourceBundleForRjsf] RJSF i18n initialized'); \n};\n","export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = \"...\"): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(\",\")\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { replaceStringParameters } from \"@rjsf/utils\";\nimport i18next from \"i18next\";\nimport { isBlank } from \"~/utils/string.utils\";\n\n/** Maps RJSF TranslatableString values to our i18n keys (rjsf namespace). */\nexport const RJSF_STRING_TO_I18N_KEY: Record<string, string> = {\n \"Add Item\": \"rjsf:addItem\",\n Add: \"rjsf:add\",\n Copy: \"rjsf:copy\",\n \"Move down\": \"rjsf:moveDown\",\n \"Move up\": \"rjsf:moveUp\",\n Remove: \"rjsf:remove\",\n \"clear input\": \"rjsf:clear\",\n \"%1 Key\": \"rjsf:keyLabel\", // TODO: RJSF-001 find a way to dynamicaly resolve the rjsf-i18n.utils \"%1 Key\" pattern\n Yes: \"rjsf:yes\",\n No: \"rjsf:no\",\n Errors: \"rjsf:errors\",\n};\n\ninterface TranslateStringArgs {\n stringToTranslate: string;\n params?: string[];\n}\n\nexport const translateRjsfString = ({ stringToTranslate, params }: TranslateStringArgs): string => {\n const i18nKey = RJSF_STRING_TO_I18N_KEY[stringToTranslate];\n if (isBlank(i18nKey)) {\n // eslint-disable-next-line no-console\n console.warn(`[translateRjsfString] RJSF i18n: missing key: \"${stringToTranslate}\"`);\n }\n\n const translated = i18nKey ? i18next.t(i18nKey) : stringToTranslate;\n return replaceStringParameters(translated, params);\n};\n","import type { WidgetProps } from \"@rjsf/utils\";\nimport { isBlank } from \"~/utils/string.utils\";\nimport { isNullish } from \"~/utils/types.utils\";\n\n/**\n * Returns true when the widget has at least one validation error from RJSF.\n *\n * @param rawErrors - The rawErrors from WidgetProps (often `unknown`).\n * @returns true if rawErrors is a non-empty array.\n */\nexport const hasRjsfErrors = (rawErrors: unknown): boolean => Array.isArray(rawErrors) && rawErrors.length > 0;\n\nexport interface GetRjsfDisplayLabelArgs {\n label?: string;\n required?: boolean;\n hideLabel?: boolean;\n}\n\n/**\n * Returns the label to display for an RJSF widget, with optional required asterisk and\n * hideLabel support.\n *\n * @param label - The label to display for the widget.\n * @param required - Whether the field is required.\n * @param hideLabel - Whether to hide the label.\n *\n * @returns The label to display for the widget.\n */\nexport const getRjsfDisplayLabel = ({ label, required, hideLabel }: GetRjsfDisplayLabelArgs): string | undefined => {\n if (hideLabel) return undefined;\n if (isBlank(label)) return undefined;\n\n const requiredSuffix = required ? \" *\" : \"\";\n return `${label}${requiredSuffix}`;\n};\n\ninterface EnumOption {\n value: string;\n label: string;\n}\n\nexport type EnumOptionDisplay = { label: string; value: string };\n\nconst toEnumOptionDisplay = (o: EnumOption): EnumOptionDisplay => ({\n label: o?.label ?? String(o?.value ?? \"\"),\n value: String(o?.value ?? \"\"),\n});\n\nexport const mapEnumOptions = (options: WidgetProps[\"options\"]): EnumOptionDisplay[] => {\n const enumOptions = options?.enumOptions as EnumOption[] | undefined;\n if (!Array.isArray(enumOptions)) return [];\n return enumOptions.map(toEnumOptionDisplay);\n};\n\n/**\n * Converts a value to display string, or empty string when null/undefined.\n */\nexport const toStringOrEmpty = (value: unknown): string => (isNullish(value) ? \"\" : String(value));\n\n/**\n * Converts a value to display string, or undefined when null/undefined (e.g. for select placeholder).\n */\nexport const toStringOrUndefined = (value: unknown): string | undefined =>\n isNullish(value) ? undefined : String(value);\n\nexport interface GetRjsfTextChangeValueArgs {\n text: string;\n emptyValue?: unknown;\n}\n\n/**\n * Returns the value to pass to onChange for a text input.\n *\n * @param args.text - The current text input value.\n * @param args.emptyValue - The value to use when text is empty (e.g. options.emptyValue from WidgetProps).\n * @returns emptyValue when text is empty, otherwise text.\n */\nexport const getRjsfTextChangeValue = ({ text, emptyValue }: GetRjsfTextChangeValueArgs): unknown => {\n if (text === \"\") return emptyValue;\n return text;\n};\n\nexport const parseDateOrNull = (value?: string): Date | null => {\n if (isBlank(value)) return null;\n\n const date = new Date(value);\n const isValid = !Number.isNaN(date.getTime());\n return isValid ? date : null;\n};\n\n/** Returns YYYY-MM-DD for JSON Schema \"date\" format (form storage). */\nexport const dateToDateOnlyString = (date: Date): string => {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\n};\n\nconst DATE_ONLY_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/** Parses a date-only or full ISO string into a Date at local midnight (for date picker display). */\nexport const parseDateOnlyToLocalDate = (value?: string): Date | null => {\n if (isBlank(value)) return null;\n\n const trimmed = String(value).trim();\n const dateOnly = trimmed.slice(0, 10);\n if (!DATE_ONLY_REGEX.test(dateOnly)) return null;\n\n const [y, m, d] = dateOnly.split(\"-\").map(Number);\n return new Date(y, m - 1, d);\n};\n\n/** Extracts date-only YYYY-MM-DD for display from a full ISO or date-only string. */\nexport const formatDateOnlyForDisplay = (value?: string): string => {\n if (isBlank(value)) return \"\";\n\n const trimmed = String(value).trim();\n const dateOnly = trimmed.slice(0, 10);\n return DATE_ONLY_REGEX.test(dateOnly) ? dateOnly : \"\";\n};\n\n/** Formats a full ISO or date string for date-time display (locale string). */\nexport const formatDateTimeForDisplay = (value?: string): string => {\n const date = parseDateOrNull(value);\n return date ? date.toLocaleString() : \"\";\n};\n\ntype FormLayoutContext = {\n labelCol?: { span: number };\n wrapperCol?: { span: number };\n};\n\nconst DEFAULT_SPAN = 24;\n\nexport const getFormLayoutCols = (formContext?: unknown): FormLayoutContext => {\n if (isNullish(formContext)) {\n return {\n labelCol: { span: DEFAULT_SPAN },\n wrapperCol: { span: DEFAULT_SPAN },\n };\n }\n\n const { labelCol, wrapperCol } = formContext as FormLayoutContext;\n return {\n labelCol: labelCol ?? { span: DEFAULT_SPAN },\n wrapperCol: wrapperCol ?? { span: DEFAULT_SPAN },\n };\n};\n","import { isBlank } from \"~/utils/string.utils\";\nimport { useTranslation } from \"react-i18next\";\nimport type { LocalizedFormSchema, MetaFormSchema } from \"./rjsf-i18n-types\";\n\nconst DEFAULT_LANGUAGE = \"fr\";\n\n// i18n.language can be 'fr-CA', so we take the first part\nconst parseSimplifiedLangCode = (language?: string): string => {\n if (isBlank(language)) return DEFAULT_LANGUAGE;\n return language.split(\"-\")[0];\n};\n\nconst getFallbackLanguage = (metaFormSchema: MetaFormSchema): string => {\n return Object.keys(metaFormSchema.i18n)[0] ?? DEFAULT_LANGUAGE;\n};\n\nexport const useLocalizedForm = (metaFormSchema: MetaFormSchema): LocalizedFormSchema => {\n const { i18n } = useTranslation();\n const language = parseSimplifiedLangCode(i18n.language);\n\n if (metaFormSchema.i18n[language]) {\n return metaFormSchema.i18n[language];\n }\n\n const fallbackLanguage = getFallbackLanguage(metaFormSchema);\n // eslint-disable-next-line no-console\n console.warn(\n `Language ${language} not found in metaFormSchema ${metaFormSchema.id}. Falling back to ${fallbackLanguage}.`\n );\n\n return metaFormSchema.i18n[fallbackLanguage];\n};\n","import { customizeValidator, type Localizer } from \"@rjsf/validator-ajv8\";\nimport localizer from \"ajv-i18n\";\nimport { useTranslation } from \"react-i18next\";\n\nconst customFormats = {\n \"phone-america\": /^\\(?\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{4}$/,\n};\n\ntype ValidationLanguages = keyof typeof localizer;\n\nexport const useRjsfValidator = () => {\n const { i18n } = useTranslation();\n const appLanguage = i18n.language as ValidationLanguages;\n const localizerFn: Localizer = localizer[appLanguage] ?? localizer.en;\n\n return customizeValidator({ customFormats }, localizerFn);\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lichens-innovation/ts-common",
3
- "version": "1.15.1",
3
+ "version": "1.15.2",
4
4
  "description": "Reusable generic typescript utilities, types, constants, helpers",
5
5
  "keywords": [
6
6
  "typescript",