@lichens-innovation/ts-common 1.15.3 → 1.15.5
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/dist/rjsf.cjs +8 -9
- package/dist/rjsf.cjs.map +1 -1
- package/dist/rjsf.d.cts +2 -2
- package/dist/rjsf.d.ts +2 -2
- package/dist/rjsf.js +8 -9
- package/dist/rjsf.js.map +1 -1
- package/package.json +1 -1
package/dist/rjsf.cjs
CHANGED
|
@@ -48,16 +48,16 @@ var rjsf_default2 = {
|
|
|
48
48
|
};
|
|
49
49
|
|
|
50
50
|
// src/rjsf/i18n/i18n.ts
|
|
51
|
-
var
|
|
52
|
-
var addResourceBundleForRjsf = (
|
|
53
|
-
if (!
|
|
51
|
+
var RJSF_NAMESPACE = "rjsf";
|
|
52
|
+
var addResourceBundleForRjsf = (instance) => {
|
|
53
|
+
if (!instance?.isInitialized) {
|
|
54
54
|
throw new Error("[addResourceBundleForRjsf] i18next must be initialized prior to calling this method. Call initI18N() or i18next.init() first.");
|
|
55
55
|
}
|
|
56
|
-
if (
|
|
56
|
+
if (instance.hasResourceBundle("en", RJSF_NAMESPACE)) return;
|
|
57
57
|
const isDeep = true;
|
|
58
58
|
const isOverwrite = true;
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
instance.addResourceBundle("en", RJSF_NAMESPACE, rjsf_default.rjsf, isDeep, isOverwrite);
|
|
60
|
+
instance.addResourceBundle("fr", RJSF_NAMESPACE, rjsf_default2.rjsf, isDeep, isOverwrite);
|
|
61
61
|
console.info("[addResourceBundleForRjsf] RJSF i18n initialized");
|
|
62
62
|
};
|
|
63
63
|
|
|
@@ -184,9 +184,8 @@ var useLocalizedForm = (metaFormSchema) => {
|
|
|
184
184
|
var customFormats = {
|
|
185
185
|
"phone-america": /^\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{4}$/
|
|
186
186
|
};
|
|
187
|
-
var useRjsfValidator = () => {
|
|
188
|
-
const
|
|
189
|
-
const appLanguage = i18n.language;
|
|
187
|
+
var useRjsfValidator = (language) => {
|
|
188
|
+
const appLanguage = language;
|
|
190
189
|
const localizerFn = localizer__default.default[appLanguage] ?? localizer__default.default.en;
|
|
191
190
|
return validatorAjv8.customizeValidator({ customFormats }, localizerFn);
|
|
192
191
|
};
|
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","replaceStringParameters","useTranslation","localizer","customizeValidator"],"mappings":";;;;;;;;;;;;AAAA,IAAA,YAAA,GAAA;AAAA,EACE,IAAA,EAAQ;AAAA,IACN,GAAA,EAAO,KAAA;AAAA,IACP,kBAAA,EAAsB,WAAA;AAAA,IACtB,OAAA,EAAW,UAAA;AAAA,IACX,KAAA,EAAS,OAAA;AAAA,IACT,MAAA,EAAU,6BAAA;AAAA,IACV,IAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAY,QAAA;AAAA,IACZ,QAAA,EAAY,WAAA;AAAA,IACZ,MAAA,EAAU,SAAA;AAAA,IACV,EAAA,EAAM,IAAA;AAAA,IACN,MAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAU,QAAA;AAAA,IACV,GAAA,EAAO;AAAA;AAEX,CAAA;;;AChBA,IAAAA,aAAAA,GAAA;AAAA,EACE,IAAA,EAAQ;AAAA,IACN,GAAA,EAAO,SAAA;AAAA,IACP,kBAAA,EAAsB,iBAAA;AAAA,IACtB,OAAA,EAAW,0BAAA;AAAA,IACX,KAAA,EAAS,SAAA;AAAA,IACT,MAAA,EAAU,4CAAA;AAAA,IACV,IAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAY,WAAA;AAAA,IACZ,QAAA,EAAY,yBAAA;AAAA,IACZ,MAAA,EAAU,0BAAA;AAAA,IACV,EAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAU,WAAA;AAAA,IACV,MAAA,EAAU,SAAA;AAAA,IACV,GAAA,EAAO;AAAA;AAEX,CAAA;;;ACXA,IAAM,SAAA,GAAY,MAAA;AAEX,IAAM,wBAAA,GAA2B,CAAC,OAAA,KAAwB;AAC/D,EAAA,IAAI,CAAC,SAAS,aAAA,EAAe;AAC3B,IAAA,MAAM,IAAI,MAAM,+HAA+H,CAAA;AAAA,EACjJ;AAEA,EAAA,IAAI,OAAA,CAAQ,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA,EAAG;AAEhD,EAAA,MAAM,MAAA,GAAS,IAAA;AACf,EAAA,MAAM,WAAA,GAAc,IAAA;AAEpB,EAAA,OAAA,CAAQ,kBAAkB,IAAA,EAAM,SAAA,EAAW,YAAA,CAAG,IAAA,EAAM,QAAQ,WAAW,CAAA;AACvE,EAAA,OAAA,CAAQ,kBAAkB,IAAA,EAAM,SAAA,EAAWA,aAAAA,CAAG,IAAA,EAAM,QAAQ,WAAW,CAAA;AAGvE,EAAA,OAAA,CAAQ,KAAK,kDAAkD,CAAA;AACjE;;;ACpBO,IAAM,SAAA,GAAY,CAAC,KAAA,KAA8C,KAAA,KAAU,QAAQ,KAAA,KAAU,MAAA;;;ACC7F,IAAM,OAAA,GAAU,CAAC,GAAA,KAAsD;AAC5E,EAAA,OAAO,SAAA,CAAU,GAAG,CAAA,IAAK,GAAA,EAAK,MAAK,KAAM,EAAA;AAC3C,CAAA;;;ACAO,IAAM,uBAAA,GAAkD;AAAA,EAC7D,UAAA,EAAY,cAAA;AAAA,EACZ,GAAA,EAAK,UAAA;AAAA,EACL,IAAA,EAAM,WAAA;AAAA,EACN,WAAA,EAAa,eAAA;AAAA,EACb,SAAA,EAAW,aAAA;AAAA,EACX,MAAA,EAAQ,aAAA;AAAA,EACR,aAAA,EAAe,YAAA;AAAA,EACf,QAAA,EAAU,eAAA;AAAA;AAAA,EACV,GAAA,EAAK,UAAA;AAAA,EACL,EAAA,EAAI,SAAA;AAAA,EACJ,MAAA,EAAQ;AACV;AAQO,IAAM,sBAAsB,CAAC,EAAE,iBAAA,EAAmB,MAAA,EAAQ,MAAK,KAAmC;AACvG,EAAA,MAAM,OAAA,GAAU,wBAAwB,iBAAiB,CAAA;AACzD,EAAA,IAAI,OAAA,CAAQ,OAAO,CAAA,EAAG;AAEpB,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+CAAA,EAAkD,iBAAiB,CAAA,CAAA,CAAG,CAAA;AAAA,EACrF;AAEA,EAAA,MAAM,UAAA,GAAa,OAAA,GAAU,IAAA,CAAK,CAAA,CAAE,OAAO,CAAA,GAAI,iBAAA;AAC/C,EAAA,OAAOC,6BAAA,CAAwB,YAAY,MAAM,CAAA;AACnD;;;ACxBO,IAAM,aAAA,GAAgB,CAAC,SAAA,KAAgC,KAAA,CAAM,QAAQ,SAAS,CAAA,IAAK,UAAU,MAAA,GAAS;AAkBtG,IAAM,sBAAsB,CAAC,EAAE,KAAA,EAAO,QAAA,EAAU,WAAU,KAAmD;AAClH,EAAA,IAAI,WAAW,OAAO,MAAA;AACtB,EAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,MAAA;AAE3B,EAAA,MAAM,cAAA,GAAiB,WAAW,IAAA,GAAO,EAAA;AACzC,EAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAG,cAAc,CAAA,CAAA;AAClC;AASA,IAAM,mBAAA,GAAsB,CAAC,CAAA,MAAsC;AAAA,EACjE,OAAO,CAAA,EAAG,KAAA,IAAS,MAAA,CAAO,CAAA,EAAG,SAAS,EAAE,CAAA;AAAA,EACxC,KAAA,EAAO,MAAA,CAAO,CAAA,EAAG,KAAA,IAAS,EAAE;AAC9B,CAAA,CAAA;AAEO,IAAM,cAAA,GAAiB,CAAC,OAAA,KAAyD;AACtF,EAAA,MAAM,cAAc,OAAA,EAAS,WAAA;AAC7B,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,SAAU,EAAC;AACzC,EAAA,OAAO,WAAA,CAAY,IAAI,mBAAmB,CAAA;AAC5C;AAKO,IAAM,eAAA,GAAkB,CAAC,KAAA,KAA4B,SAAA,CAAU,KAAK,CAAA,GAAI,EAAA,GAAK,OAAO,KAAK;AAKzF,IAAM,mBAAA,GAAsB,CAAC,KAAA,KAClC,SAAA,CAAU,KAAK,CAAA,GAAI,MAAA,GAAY,OAAO,KAAK;AActC,IAAM,sBAAA,GAAyB,CAAC,EAAE,IAAA,EAAM,YAAW,KAA2C;AACnG,EAAA,IAAI,IAAA,KAAS,IAAI,OAAO,UAAA;AACxB,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,eAAA,GAAkB,CAAC,KAAA,KAAgC;AAC9D,EAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,IAAA;AAE3B,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,KAAK,CAAA;AAC3B,EAAA,MAAM,UAAU,CAAC,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AAC5C,EAAA,OAAO,UAAU,IAAA,GAAO,IAAA;AAC1B;AAGO,IAAM,oBAAA,GAAuB,CAAC,IAAA,KAAuB;AAC1D,EAAA,MAAM,CAAA,GAAI,KAAK,WAAA,EAAY;AAC3B,EAAA,MAAM,CAAA,GAAI,OAAO,IAAA,CAAK,QAAA,KAAa,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACrD,EAAA,MAAM,CAAA,GAAI,OAAO,IAAA,CAAK,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAChD,EAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,CAAA;AACvB;AAEA,IAAM,eAAA,GAAkB,qBAAA;AAGjB,IAAM,wBAAA,GAA2B,CAAC,KAAA,KAAgC;AACvE,EAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,IAAA;AAE3B,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,EAAK;AACnC,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACpC,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,QAAQ,GAAG,OAAO,IAAA;AAE5C,EAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,SAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAChD,EAAA,OAAO,IAAI,IAAA,CAAK,CAAA,EAAG,CAAA,GAAI,GAAG,CAAC,CAAA;AAC7B;AAGO,IAAM,wBAAA,GAA2B,CAAC,KAAA,KAA2B;AAClE,EAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,EAAA;AAE3B,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,EAAK;AACnC,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACpC,EAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA,GAAI,QAAA,GAAW,EAAA;AACrD;AAGO,IAAM,wBAAA,GAA2B,CAAC,KAAA,KAA2B;AAClE,EAAA,MAAM,IAAA,GAAO,gBAAgB,KAAK,CAAA;AAClC,EAAA,OAAO,IAAA,GAAO,IAAA,CAAK,cAAA,EAAe,GAAI,EAAA;AACxC;AAOA,IAAM,YAAA,GAAe,EAAA;AAEd,IAAM,iBAAA,GAAoB,CAAC,WAAA,KAA6C;AAC7E,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,EAAE,IAAA,EAAM,YAAA,EAAa;AAAA,MAC/B,UAAA,EAAY,EAAE,IAAA,EAAM,YAAA;AAAa,KACnC;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,WAAA;AACjC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,QAAA,IAAY,EAAE,IAAA,EAAM,YAAA,EAAa;AAAA,IAC3C,UAAA,EAAY,UAAA,IAAc,EAAE,IAAA,EAAM,YAAA;AAAa,GACjD;AACF;AC/IA,IAAM,gBAAA,GAAmB,IAAA;AAGzB,IAAM,uBAAA,GAA0B,CAAC,QAAA,KAA8B;AAC7D,EAAA,IAAI,OAAA,CAAQ,QAAQ,CAAA,EAAG,OAAO,gBAAA;AAC9B,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAC9B,CAAA;AAEA,IAAM,mBAAA,GAAsB,CAAC,cAAA,KAA2C;AACtE,EAAA,OAAO,OAAO,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,gBAAA;AAChD,CAAA;AAEO,IAAM,gBAAA,GAAmB,CAAC,cAAA,KAAwD;AACvF,EAAA,MAAM,EAAE,IAAA,EAAK,GAAIC,2BAAA,EAAe;AAChC,EAAA,MAAM,QAAA,GAAW,uBAAA,CAAwB,IAAA,CAAK,QAAQ,CAAA;AAEtD,EAAA,IAAI,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,EAAG;AACjC,IAAA,OAAO,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,gBAAA,GAAmB,oBAAoB,cAAc,CAAA;AAE3D,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN,YAAY,QAAQ,CAAA,6BAAA,EAAgC,cAAA,CAAe,EAAE,qBAAqB,gBAAgB,CAAA,CAAA;AAAA,GAC5G;AAEA,EAAA,OAAO,cAAA,CAAe,KAAK,gBAAgB,CAAA;AAC7C;AC3BA,IAAM,aAAA,GAAgB;AAAA,EACpB,eAAA,EAAiB;AACnB,CAAA;AAIO,IAAM,mBAAmB,MAAM;AACpC,EAAA,MAAM,EAAE,IAAA,EAAK,GAAIA,2BAAAA,EAAe;AAChC,EAAA,MAAM,cAAc,IAAA,CAAK,QAAA;AACzB,EAAA,MAAM,WAAA,GAAyBC,0BAAA,CAAU,WAAW,CAAA,IAAKA,0BAAA,CAAU,EAAA;AAEnE,EAAA,OAAOC,gCAAA,CAAmB,EAAE,aAAA,EAAc,EAAG,WAAW,CAAA;AAC1D","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 { i18n } 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 i18n: i18n;\n stringToTranslate: string;\n params?: string[];\n}\n\nexport const translateRjsfString = ({ stringToTranslate, params, i18n }: 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 ? i18n.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","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 RJSF_NAMESPACE = \"rjsf\";\n\nexport const addResourceBundleForRjsf = (instance: i18n): void => {\n if (!instance?.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 (instance.hasResourceBundle(\"en\", RJSF_NAMESPACE)) return;\n\n const isDeep = true;\n const isOverwrite = true;\n\n instance.addResourceBundle(\"en\", RJSF_NAMESPACE, en.rjsf, isDeep, isOverwrite);\n instance.addResourceBundle(\"fr\", RJSF_NAMESPACE, fr.rjsf, isDeep, isOverwrite);\n\n // Note: if ever we get duplicated instances of react-i18next, we will need to register the\n // instance provided by this ts-common package like so:\n // import { initReactI18next } from 'react-i18next'\n // instance.use(initReactI18next);\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 { i18n } 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 i18n: i18n;\n stringToTranslate: string;\n params?: string[];\n}\n\nexport const translateRjsfString = ({ stringToTranslate, params, i18n }: 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 ? i18n.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\";\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 = (language: string) => {\n const appLanguage = 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 addResourceBundleForRjsf: (
|
|
6
|
+
declare const addResourceBundleForRjsf: (instance: i18n) => void;
|
|
7
7
|
|
|
8
8
|
type Language = string;
|
|
9
9
|
/** Registry shape with translation used by RJSF template buttons. */
|
|
@@ -98,6 +98,6 @@ declare const getFormLayoutCols: (formContext?: unknown) => FormLayoutContext;
|
|
|
98
98
|
|
|
99
99
|
declare const useLocalizedForm: (metaFormSchema: MetaFormSchema) => LocalizedFormSchema;
|
|
100
100
|
|
|
101
|
-
declare const useRjsfValidator: () => _rjsf_validator_ajv8_lib_validator_js.default<any, _rjsf_utils.RJSFSchema, any>;
|
|
101
|
+
declare const useRjsfValidator: (language: string) => _rjsf_validator_ajv8_lib_validator_js.default<any, _rjsf_utils.RJSFSchema, any>;
|
|
102
102
|
|
|
103
103
|
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 addResourceBundleForRjsf: (
|
|
6
|
+
declare const addResourceBundleForRjsf: (instance: i18n) => void;
|
|
7
7
|
|
|
8
8
|
type Language = string;
|
|
9
9
|
/** Registry shape with translation used by RJSF template buttons. */
|
|
@@ -98,6 +98,6 @@ declare const getFormLayoutCols: (formContext?: unknown) => FormLayoutContext;
|
|
|
98
98
|
|
|
99
99
|
declare const useLocalizedForm: (metaFormSchema: MetaFormSchema) => LocalizedFormSchema;
|
|
100
100
|
|
|
101
|
-
declare const useRjsfValidator: () => _rjsf_validator_ajv8_lib_validator_js.default<any, _rjsf_utils.RJSFSchema, any>;
|
|
101
|
+
declare const useRjsfValidator: (language: string) => _rjsf_validator_ajv8_lib_validator_js.default<any, _rjsf_utils.RJSFSchema, any>;
|
|
102
102
|
|
|
103
103
|
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
|
@@ -42,16 +42,16 @@ var rjsf_default2 = {
|
|
|
42
42
|
};
|
|
43
43
|
|
|
44
44
|
// src/rjsf/i18n/i18n.ts
|
|
45
|
-
var
|
|
46
|
-
var addResourceBundleForRjsf = (
|
|
47
|
-
if (!
|
|
45
|
+
var RJSF_NAMESPACE = "rjsf";
|
|
46
|
+
var addResourceBundleForRjsf = (instance) => {
|
|
47
|
+
if (!instance?.isInitialized) {
|
|
48
48
|
throw new Error("[addResourceBundleForRjsf] i18next must be initialized prior to calling this method. Call initI18N() or i18next.init() first.");
|
|
49
49
|
}
|
|
50
|
-
if (
|
|
50
|
+
if (instance.hasResourceBundle("en", RJSF_NAMESPACE)) return;
|
|
51
51
|
const isDeep = true;
|
|
52
52
|
const isOverwrite = true;
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
instance.addResourceBundle("en", RJSF_NAMESPACE, rjsf_default.rjsf, isDeep, isOverwrite);
|
|
54
|
+
instance.addResourceBundle("fr", RJSF_NAMESPACE, rjsf_default2.rjsf, isDeep, isOverwrite);
|
|
55
55
|
console.info("[addResourceBundleForRjsf] RJSF i18n initialized");
|
|
56
56
|
};
|
|
57
57
|
|
|
@@ -178,9 +178,8 @@ var useLocalizedForm = (metaFormSchema) => {
|
|
|
178
178
|
var customFormats = {
|
|
179
179
|
"phone-america": /^\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{4}$/
|
|
180
180
|
};
|
|
181
|
-
var useRjsfValidator = () => {
|
|
182
|
-
const
|
|
183
|
-
const appLanguage = i18n.language;
|
|
181
|
+
var useRjsfValidator = (language) => {
|
|
182
|
+
const appLanguage = language;
|
|
184
183
|
const localizerFn = localizer[appLanguage] ?? localizer.en;
|
|
185
184
|
return customizeValidator({ customFormats }, localizerFn);
|
|
186
185
|
};
|
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","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 { i18n } 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 i18n: i18n;\n stringToTranslate: string;\n params?: string[];\n}\n\nexport const translateRjsfString = ({ stringToTranslate, params, i18n }: 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 ? i18n.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"],"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 RJSF_NAMESPACE = \"rjsf\";\n\nexport const addResourceBundleForRjsf = (instance: i18n): void => {\n if (!instance?.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 (instance.hasResourceBundle(\"en\", RJSF_NAMESPACE)) return;\n\n const isDeep = true;\n const isOverwrite = true;\n\n instance.addResourceBundle(\"en\", RJSF_NAMESPACE, en.rjsf, isDeep, isOverwrite);\n instance.addResourceBundle(\"fr\", RJSF_NAMESPACE, fr.rjsf, isDeep, isOverwrite);\n\n // Note: if ever we get duplicated instances of react-i18next, we will need to register the\n // instance provided by this ts-common package like so:\n // import { initReactI18next } from 'react-i18next'\n // instance.use(initReactI18next);\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 { i18n } 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 i18n: i18n;\n stringToTranslate: string;\n params?: string[];\n}\n\nexport const translateRjsfString = ({ stringToTranslate, params, i18n }: 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 ? i18n.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\";\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 = (language: string) => {\n const appLanguage = language as ValidationLanguages;\n const localizerFn: Localizer = localizer[appLanguage] ?? localizer.en;\n\n return customizeValidator({ customFormats }, localizerFn);\n};\n"]}
|