@ouestfrance/sipa-bms-ui 8.46.0 → 8.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/form/bms-input-code.linters.d.ts +14 -0
- package/dist/sipa-bms-ui.es.js +28 -8
- package/dist/sipa-bms-ui.es.js.map +1 -1
- package/dist/sipa-bms-ui.umd.js +28 -7
- package/dist/sipa-bms-ui.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/components/form/bms-input-code.linters.spec.ts +33 -0
- package/src/components/form/bms-input-code.linters.ts +50 -7
|
@@ -70,5 +70,19 @@ export declare const jsSyntaxLinter: () => Extension;
|
|
|
70
70
|
* const sourceValid = ref(true);
|
|
71
71
|
* const extensions = [lintGutter(), htmlSyntaxLinter(), lintValidationListener((v) => { sourceValid.value = v; })];
|
|
72
72
|
*/
|
|
73
|
+
/**
|
|
74
|
+
* Crée un linter qui exécute `fn` et appelle `onHasErrors` lorsque la présence
|
|
75
|
+
* de diagnostics de la sévérité donnée change. À utiliser pour les linters bloquants
|
|
76
|
+
* (désactiver le bouton de soumission sur `error`, ou avertir sur `warning`).
|
|
77
|
+
* Pour les linters purement informatifs, utiliser `linter()` directement.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* const htmlValid = ref(true);
|
|
81
|
+
* const extensions = [
|
|
82
|
+
* lintGutter(),
|
|
83
|
+
* createLinterWithCallback(htmlDiagnostics, (hasErrors) => { htmlValid.value = !hasErrors; }, 'error'),
|
|
84
|
+
* ];
|
|
85
|
+
*/
|
|
86
|
+
export declare const createLinterWithCallback: (fn: (code: string) => Diagnostic[], onHasDiagnostics: (hasDiagnostics: boolean) => void, severity?: Diagnostic['severity']) => Extension;
|
|
73
87
|
export declare const lintValidationListener: (onValidation: (valid: boolean) => void) => Extension;
|
|
74
88
|
export { linter, lintGutter } from '@codemirror/lint';
|
package/dist/sipa-bms-ui.es.js
CHANGED
|
@@ -112751,19 +112751,20 @@ var useDarkMode = () => {
|
|
|
112751
112751
|
//#region src/components/form/bms-input-code.linters.ts
|
|
112752
112752
|
/**
|
|
112753
112753
|
* Retourne les diagnostics HTML pour un code donné.
|
|
112754
|
-
* Parse le contenu comme du XML strict pour détecter les erreurs de structure
|
|
112754
|
+
* Parse le contenu comme du XML strict pour détecter les erreurs de structure,
|
|
112755
|
+
* après normalisation des balises void HTML5 (accepte `<br>` comme `<br/>`).
|
|
112755
112756
|
*
|
|
112756
112757
|
* Comportement attendu :
|
|
112757
112758
|
* - Chaîne vide → aucun diagnostic
|
|
112758
112759
|
* - HTML bien formé (`<div><p>Hello</p></div>`) → aucun diagnostic
|
|
112759
|
-
* - Balises
|
|
112760
|
+
* - Balises void HTML5 (`<br>`, `<meta>`, `<link>`, `<img>`…) → aucun diagnostic
|
|
112760
112761
|
* - Balise non fermée (`<div><p>Hello</div>`) → diagnostic « HTML invalide »
|
|
112761
112762
|
* - Attribut mal formé (`<div class=>`) → diagnostic « HTML invalide »
|
|
112762
|
-
*
|
|
112763
|
-
* Limitation : le parser XML est plus strict que le parser HTML du navigateur.
|
|
112764
|
-
* Les balises void HTML5 non fermées (`<br>`, `<img>`) sont considérées invalides.
|
|
112765
112763
|
*/
|
|
112766
112764
|
var ROOT_TAG = "<root>";
|
|
112765
|
+
var VOID_ELEMENTS = "area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr";
|
|
112766
|
+
var normalizeBooleanAttributes = (code) => code.replace(/<[a-zA-Z][^>]*>/g, (tag) => tag.replace(/("(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')|(\s+)([a-zA-Z][a-zA-Z0-9-:]*)(?!\s*=)(?=[\s/>]|$)/g, (match, quoted, spaces, attrName) => quoted !== void 0 ? match : `${spaces}${attrName}=""`));
|
|
112767
|
+
var normalizeVoidElements = (code) => code.replace(new RegExp(`<(${VOID_ELEMENTS})(\\s[^>]*)?(?<!/)>`, "gi"), (_, tag, attrs) => `<${tag}${attrs ?? ""}/>`);
|
|
112767
112768
|
var htmlErrorOffset = (errorText, code) => {
|
|
112768
112769
|
const match = errorText.match(/error on line (\d+) at column (\d+)/i);
|
|
112769
112770
|
if (!match) return 0;
|
|
@@ -112776,14 +112777,15 @@ var htmlErrorOffset = (errorText, code) => {
|
|
|
112776
112777
|
};
|
|
112777
112778
|
var htmlDiagnostics = (code) => {
|
|
112778
112779
|
if (!code.trim()) return [];
|
|
112779
|
-
const
|
|
112780
|
+
const normalized = normalizeVoidElements(normalizeBooleanAttributes(code));
|
|
112781
|
+
const parserError = new DOMParser().parseFromString(`${ROOT_TAG}${normalized}</root>`, "text/xml").querySelector("parsererror");
|
|
112780
112782
|
if (!parserError) return [];
|
|
112781
112783
|
const from = htmlErrorOffset(parserError.textContent ?? "", code);
|
|
112782
112784
|
return [{
|
|
112783
112785
|
from,
|
|
112784
112786
|
to: Math.min(from + 1, code.length),
|
|
112785
112787
|
severity: "error",
|
|
112786
|
-
message:
|
|
112788
|
+
message: `HTML invalide : ${parserError.textContent?.split("\n")[0] ?? "balise mal formée ou non fermée"}`
|
|
112787
112789
|
}];
|
|
112788
112790
|
};
|
|
112789
112791
|
/**
|
|
@@ -112883,6 +112885,24 @@ var jsSyntaxLinter = () => linter((view) => jsDiagnostics(view.state.doc.toStrin
|
|
|
112883
112885
|
* const sourceValid = ref(true);
|
|
112884
112886
|
* const extensions = [lintGutter(), htmlSyntaxLinter(), lintValidationListener((v) => { sourceValid.value = v; })];
|
|
112885
112887
|
*/
|
|
112888
|
+
/**
|
|
112889
|
+
* Crée un linter qui exécute `fn` et appelle `onHasErrors` lorsque la présence
|
|
112890
|
+
* de diagnostics de la sévérité donnée change. À utiliser pour les linters bloquants
|
|
112891
|
+
* (désactiver le bouton de soumission sur `error`, ou avertir sur `warning`).
|
|
112892
|
+
* Pour les linters purement informatifs, utiliser `linter()` directement.
|
|
112893
|
+
*
|
|
112894
|
+
* @example
|
|
112895
|
+
* const htmlValid = ref(true);
|
|
112896
|
+
* const extensions = [
|
|
112897
|
+
* lintGutter(),
|
|
112898
|
+
* createLinterWithCallback(htmlDiagnostics, (hasErrors) => { htmlValid.value = !hasErrors; }, 'error'),
|
|
112899
|
+
* ];
|
|
112900
|
+
*/
|
|
112901
|
+
var createLinterWithCallback = (fn, onHasDiagnostics, severity = "error") => linter((view) => {
|
|
112902
|
+
const diagnostics = fn(view.state.doc.toString());
|
|
112903
|
+
onHasDiagnostics(diagnostics.some((d) => d.severity === severity));
|
|
112904
|
+
return diagnostics;
|
|
112905
|
+
});
|
|
112886
112906
|
var lintValidationListener = (onValidation) => EditorView.updateListener.of((update) => {
|
|
112887
112907
|
if (update.transactions.some((t) => t.effects.length > 0) || update.docChanged) onValidation(diagnosticCount(update.state) === 0);
|
|
112888
112908
|
});
|
|
@@ -114673,6 +114693,6 @@ var createBmsUi = () => ({ install: (app) => {
|
|
|
114673
114693
|
app.component("BmsRelativeTime", BmsRelativeTime_default);
|
|
114674
114694
|
} });
|
|
114675
114695
|
//#endregion
|
|
114676
|
-
export { BMS_FORM_VALID_URL_REGEX, BmsAlert_default as BmsAlert, BmsAutocomplete_default as BmsAutocomplete, BmsBackButton_default as BmsBackButton, BmsBadge_default as BmsBadge, BmsBetweenInput_default as BmsBetweenInput, BmsBreadcrumb_default as BmsBreadcrumb, BmsButton_default as BmsButton, BmsCaption_default as BmsCaption, BmsCard_default as BmsCard, BmsChip_default as BmsChip, BmsCircularProgress_default as BmsCircularProgress, BmsCocarde_default as BmsCocarde, BmsCombobox_default as BmsCombobox, BmsContentPageLayout_default as BmsContentPageLayout, DraggableList_default as BmsDraggableList, BmsEmptyScreen_default as BmsEmptyScreen, BmsFilePicker_default as BmsFilePicker, BmsFixedMenu_default as BmsFixedMenu, BmsFloatingWindow_default as BmsFloatingWindow, BmsForm_default as BmsForm, BmsGhost_default as BmsGhost, BmsHeader_default as BmsHeader, BmsHeaderTitle_default as BmsHeaderTitle, BmsIconButton_default as BmsIconButton, BmsInputBooleanCheckbox_default as BmsInputBooleanCheckbox, BmsInputCheckboxCaption_default as BmsInputCheckboxCaption, BmsInputCheckboxCaptionGroup_default as BmsInputCheckboxCaptionGroup, BmsInputCheckboxGroup_default as BmsInputCheckboxGroup, BmsInputCode_default as BmsInputCode, BmsInputDateTime_default as BmsInputDateTime, BmsInputFile_default as BmsInputFile, BmsInputNumber_default as BmsInputNumber, BmsInputRadio_default as BmsInputRadio, BmsInputRadioCaption_default as BmsInputRadioCaption, BmsInputRadioCaptionGroup_default as BmsInputRadioCaptionGroup, BmsInputRadioGroup_default as BmsInputRadioGroup, BmsInputText_default as BmsInputText, BmsInputTime_default as BmsInputTime, BmsInputToggle_default as BmsInputToggle, BmsLink_default as BmsLink, BmsLoader_default as BmsLoader, BmsMenu_default as BmsMenu, BmsMenuNav_default as BmsMenuNav, BmsModal_default as BmsModal, BmsMultiSelect_default as BmsMultiSelect, BmsNotificationsInstance, BmsOverlay_default as BmsOverlay, BmsPagination_default as BmsPagination, BmsProblem_default as BmsProblem, BmsRelativeTime_default as BmsRelativeTime, BmsSearch_default as BmsSearch, BmsSection_default as BmsSection, BmsSelect_default as BmsSelect, BmsServerAutocomplete_default as BmsServerAutocomplete, BmsServerTable_default as BmsServerTable, BmsShortLinkMenu_default as BmsShortLinkMenu, BmsSidePanel_default as BmsSidePanel, BmsSlidingPanelShell_default as BmsSlidingPanelShell, BmsSplitWindow_default as BmsSplitWindow, BmsStep_default as BmsStep, BmsStepper_default as BmsStepper, BmsTable_default as BmsTable, BmsTabs_default as BmsTabs, BmsTag_default as BmsTag, BmsTenantSwitcher_default as BmsTenantSwitcher, BmsTextArea_default as BmsTextArea, BmsToggleIcon_default as BmsToggleIcon, BmsTooltip_default as BmsTooltip, ChipColor, CocardeBorder, ColumnType, ConfirmInstance, InputType, KeycloakAuthAdapterInstance, RuntimeEnv, SelectMode, SortValue, StatusType, TableMode, TooltipDirection, bmsDefaultSearchFilterFunction, confirmPlugin, convertStringToCaption, createBmsUi, createRuntimeEnv, cssDiagnostics, cssSyntaxLinter, defaultSortFunction, enforceActionsColumnHeader, featureFlipperPlugin, fetchRuntimeEnv, field, getCurrentHistory, getCurrentLocation, getFiltersAsQueryParams, getHeaderClasses, getImageFromFile, getNumberFromPathQuery, getStringFromPathQuery, getUserPrefFromLocalStorage, getValueByPath, handleValueInSearchParams, htmlDiagnostics, htmlSyntaxLinter, isEmptyStringOrNotDefined, isExternalLink, isFileImage, isProblem, jsDiagnostics, jsSyntaxLinter, keycloakAuthAdapter, keycloakAuthAdapterInit, lintGutter, lintValidationListener, linter, notifications, readableDate, reflectFiltersToPath, reflectSearchToPath, relativeDate, relativeDateDefaultFormatFunction, routerHistoryPlugin, sanitizeHtml, sanitizeString, saveValuesToPathQuery, searchString, setUserPrefFromLocalStorage, useClipboard, useConfirm, useDarkMode, useFeatureFlipper, useKeycloakAuthAdapter, useNotifications, usePagination, useRouterHistory, useRuntimeEnv, useSearch, useSort, useUserPref, writeLocation };
|
|
114696
|
+
export { BMS_FORM_VALID_URL_REGEX, BmsAlert_default as BmsAlert, BmsAutocomplete_default as BmsAutocomplete, BmsBackButton_default as BmsBackButton, BmsBadge_default as BmsBadge, BmsBetweenInput_default as BmsBetweenInput, BmsBreadcrumb_default as BmsBreadcrumb, BmsButton_default as BmsButton, BmsCaption_default as BmsCaption, BmsCard_default as BmsCard, BmsChip_default as BmsChip, BmsCircularProgress_default as BmsCircularProgress, BmsCocarde_default as BmsCocarde, BmsCombobox_default as BmsCombobox, BmsContentPageLayout_default as BmsContentPageLayout, DraggableList_default as BmsDraggableList, BmsEmptyScreen_default as BmsEmptyScreen, BmsFilePicker_default as BmsFilePicker, BmsFixedMenu_default as BmsFixedMenu, BmsFloatingWindow_default as BmsFloatingWindow, BmsForm_default as BmsForm, BmsGhost_default as BmsGhost, BmsHeader_default as BmsHeader, BmsHeaderTitle_default as BmsHeaderTitle, BmsIconButton_default as BmsIconButton, BmsInputBooleanCheckbox_default as BmsInputBooleanCheckbox, BmsInputCheckboxCaption_default as BmsInputCheckboxCaption, BmsInputCheckboxCaptionGroup_default as BmsInputCheckboxCaptionGroup, BmsInputCheckboxGroup_default as BmsInputCheckboxGroup, BmsInputCode_default as BmsInputCode, BmsInputDateTime_default as BmsInputDateTime, BmsInputFile_default as BmsInputFile, BmsInputNumber_default as BmsInputNumber, BmsInputRadio_default as BmsInputRadio, BmsInputRadioCaption_default as BmsInputRadioCaption, BmsInputRadioCaptionGroup_default as BmsInputRadioCaptionGroup, BmsInputRadioGroup_default as BmsInputRadioGroup, BmsInputText_default as BmsInputText, BmsInputTime_default as BmsInputTime, BmsInputToggle_default as BmsInputToggle, BmsLink_default as BmsLink, BmsLoader_default as BmsLoader, BmsMenu_default as BmsMenu, BmsMenuNav_default as BmsMenuNav, BmsModal_default as BmsModal, BmsMultiSelect_default as BmsMultiSelect, BmsNotificationsInstance, BmsOverlay_default as BmsOverlay, BmsPagination_default as BmsPagination, BmsProblem_default as BmsProblem, BmsRelativeTime_default as BmsRelativeTime, BmsSearch_default as BmsSearch, BmsSection_default as BmsSection, BmsSelect_default as BmsSelect, BmsServerAutocomplete_default as BmsServerAutocomplete, BmsServerTable_default as BmsServerTable, BmsShortLinkMenu_default as BmsShortLinkMenu, BmsSidePanel_default as BmsSidePanel, BmsSlidingPanelShell_default as BmsSlidingPanelShell, BmsSplitWindow_default as BmsSplitWindow, BmsStep_default as BmsStep, BmsStepper_default as BmsStepper, BmsTable_default as BmsTable, BmsTabs_default as BmsTabs, BmsTag_default as BmsTag, BmsTenantSwitcher_default as BmsTenantSwitcher, BmsTextArea_default as BmsTextArea, BmsToggleIcon_default as BmsToggleIcon, BmsTooltip_default as BmsTooltip, ChipColor, CocardeBorder, ColumnType, ConfirmInstance, InputType, KeycloakAuthAdapterInstance, RuntimeEnv, SelectMode, SortValue, StatusType, TableMode, TooltipDirection, bmsDefaultSearchFilterFunction, confirmPlugin, convertStringToCaption, createBmsUi, createLinterWithCallback, createRuntimeEnv, cssDiagnostics, cssSyntaxLinter, defaultSortFunction, enforceActionsColumnHeader, featureFlipperPlugin, fetchRuntimeEnv, field, getCurrentHistory, getCurrentLocation, getFiltersAsQueryParams, getHeaderClasses, getImageFromFile, getNumberFromPathQuery, getStringFromPathQuery, getUserPrefFromLocalStorage, getValueByPath, handleValueInSearchParams, htmlDiagnostics, htmlSyntaxLinter, isEmptyStringOrNotDefined, isExternalLink, isFileImage, isProblem, jsDiagnostics, jsSyntaxLinter, keycloakAuthAdapter, keycloakAuthAdapterInit, lintGutter, lintValidationListener, linter, notifications, readableDate, reflectFiltersToPath, reflectSearchToPath, relativeDate, relativeDateDefaultFormatFunction, routerHistoryPlugin, sanitizeHtml, sanitizeString, saveValuesToPathQuery, searchString, setUserPrefFromLocalStorage, useClipboard, useConfirm, useDarkMode, useFeatureFlipper, useKeycloakAuthAdapter, useNotifications, usePagination, useRouterHistory, useRuntimeEnv, useSearch, useSort, useUserPref, writeLocation };
|
|
114677
114697
|
|
|
114678
114698
|
//# sourceMappingURL=sipa-bms-ui.es.js.map
|