@kyndryl-design-system/shidoka-applications 2.98.0 → 2.98.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/common/helpers/flatpickr/index.d.ts +1 -1
- package/common/helpers/flatpickr/index.d.ts.map +1 -1
- package/common/helpers/flatpickr/index.js +1 -1
- package/common/helpers/flatpickr/utils.d.ts +11 -0
- package/common/helpers/flatpickr/utils.d.ts.map +1 -1
- package/common/helpers/flatpickr/utils.js +1 -1
- package/common/helpers/flatpickr/utils.js.map +1 -1
- package/common/helpers/flatpickr/utils.test.js +1 -1
- package/common/helpers/flatpickr/utils.test.js.map +1 -1
- package/components/global/header/headerCategories.d.ts +3 -0
- package/components/global/header/headerCategories.d.ts.map +1 -1
- package/components/global/header/headerCategories.js +3 -3
- package/components/global/header/headerCategories.js.map +1 -1
- package/components/global/header/headerCategory.d.ts +6 -0
- package/components/global/header/headerCategory.d.ts.map +1 -1
- package/components/global/header/headerCategory.js +2 -2
- package/components/global/header/headerCategory.js.map +1 -1
- package/components/global/header/headerLink.js +4 -0
- package/components/global/header/headerLink.js.map +1 -1
- package/components/global/localNav/localNav.d.ts +13 -0
- package/components/global/localNav/localNav.d.ts.map +1 -1
- package/components/global/localNav/localNav.js +7 -7
- package/components/global/localNav/localNav.js.map +1 -1
- package/components/global/localNav/localNavLink.d.ts.map +1 -1
- package/components/global/localNav/localNavLink.js +2 -2
- package/components/global/localNav/localNavLink.js.map +1 -1
- package/components/reusable/datePicker/datepicker.d.ts +4 -0
- package/components/reusable/datePicker/datepicker.d.ts.map +1 -1
- package/components/reusable/datePicker/datepicker.js +5 -5
- package/components/reusable/datePicker/datepicker.js.map +1 -1
- package/components/reusable/daterangepicker/daterangepicker.d.ts.map +1 -1
- package/components/reusable/daterangepicker/daterangepicker.js +6 -6
- package/components/reusable/daterangepicker/daterangepicker.js.map +1 -1
- package/components/reusable/sideDrawer/sideDrawer.js +6 -0
- package/components/reusable/sideDrawer/sideDrawer.js.map +1 -1
- package/components/reusable/tag/tagGroup.d.ts +2 -1
- package/components/reusable/tag/tagGroup.d.ts.map +1 -1
- package/components/reusable/tag/tagGroup.js +5 -5
- package/components/reusable/tag/tagGroup.js.map +1 -1
- package/components/reusable/timepicker/timepicker.d.ts +1 -0
- package/components/reusable/timepicker/timepicker.d.ts.map +1 -1
- package/components/reusable/timepicker/timepicker.js +6 -6
- package/components/reusable/timepicker/timepicker.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
export { _defaultCalendarTooltipStrings, type FlatpickrTextStrings, setTooltipStrings, getTextStrings, preventFlatpickrOpen, handleInputClick, handleInputFocus, modifyWeekdayShorthands, injectFlatpickrStyles, initializeMultiAnchorFlatpickr, initializeSingleAnchorFlatpickr, isValidDateFormat, getPlaceholder, loadLocale, getModalContainer, getFlatpickrOptions, updateEnableTime, setCalendarAttributes, hideEmptyYear, emitValue, clearFlatpickrInput, DateRangeEditableMode, createDateRangeDayLockHandler, createDateRangeChangeLockHandler, applyDateRangeEditingRestrictions, } from './flatpickr';
|
|
5
5
|
export { langsArray, type SupportedLocale, isSupportedLocale, loadLocale as loadLocaleFromLangs, preloadAllLocales, } from './langs';
|
|
6
6
|
export { fixedOverlayPositionPlugin } from './overlay';
|
|
7
|
-
export { debounce, generateRandomId, parseDateOnly, parseDateTime, parseTimeString, normalizeToDate, isValidDate, filterValidDates, isEmptyValue, timesEqual, datesEqual, cleanupFlatpickrInstance, type AnchorClickHandler, updateFormValue, createFormSubmitListener, type ValidationResult, type ValidationOptions, validatePickerInput, mergeTextStrings, CONFIG_DEBOUNCE_DELAY, RESIZE_DEBOUNCE_DELAY, VISIBILITY_CHECK_INTERVAL, } from './utils';
|
|
7
|
+
export { debounce, generateRandomId, parseDateOnly, parseDateTime, parseTimeString, normalizeToDate, isValidDate, filterValidDates, isEmptyValue, shouldSkipManualInputSync, timesEqual, datesEqual, cleanupFlatpickrInstance, type AnchorClickHandler, updateFormValue, createFormSubmitListener, type ValidationResult, type ValidationOptions, validatePickerInput, mergeTextStrings, CONFIG_DEBOUNCE_DELAY, RESIZE_DEBOUNCE_DELAY, VISIBILITY_CHECK_INTERVAL, } from './utils';
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/common/helpers/flatpickr/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,8BAA8B,EAC9B,KAAK,oBAAoB,EACzB,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,EACrB,8BAA8B,EAC9B,+BAA+B,EAC/B,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,EACb,SAAS,EACT,mBAAmB,EACnB,qBAAqB,EACrB,6BAA6B,EAC7B,gCAAgC,EAChC,iCAAiC,GAClC,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,iBAAiB,EACjB,UAAU,IAAI,mBAAmB,EACjC,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAGvD,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,UAAU,EACV,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,eAAe,EACf,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/common/helpers/flatpickr/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,8BAA8B,EAC9B,KAAK,oBAAoB,EACzB,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,EACrB,8BAA8B,EAC9B,+BAA+B,EAC/B,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,EACb,SAAS,EACT,mBAAmB,EACnB,qBAAqB,EACrB,6BAA6B,EAC7B,gCAAgC,EAChC,iCAAiC,GAClC,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,iBAAiB,EACjB,UAAU,IAAI,mBAAmB,EACjC,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAGvD,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,yBAAyB,EACzB,UAAU,EACV,UAAU,EACV,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,eAAe,EACf,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,SAAS,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{DateRangeEditableMode,_defaultCalendarTooltipStrings,applyDateRangeEditingRestrictions,clearFlatpickrInput,createDateRangeChangeLockHandler,createDateRangeDayLockHandler,emitValue,getFlatpickrOptions,getModalContainer,getPlaceholder,getTextStrings,handleInputClick,handleInputFocus,hideEmptyYear,initializeMultiAnchorFlatpickr,initializeSingleAnchorFlatpickr,injectFlatpickrStyles,isValidDateFormat,loadLocale,modifyWeekdayShorthands,preventFlatpickrOpen,setCalendarAttributes,setTooltipStrings,updateEnableTime}from"./flatpickr.js";export{isSupportedLocale,langsArray,loadLocale as loadLocaleFromLangs,preloadAllLocales}from"./langs.js";export{fixedOverlayPositionPlugin}from"./overlay.js";export{CONFIG_DEBOUNCE_DELAY,RESIZE_DEBOUNCE_DELAY,VISIBILITY_CHECK_INTERVAL,cleanupFlatpickrInstance,createFormSubmitListener,datesEqual,debounce,filterValidDates,generateRandomId,isEmptyValue,isValidDate,mergeTextStrings,normalizeToDate,parseDateOnly,parseDateTime,parseTimeString,timesEqual,updateFormValue,validatePickerInput}from"./utils.js";import"flatpickr";import"flatpickr/dist/esm/plugins/rangePlugin.js";import"flatpickr/dist/esm/l10n/default.js";
|
|
1
|
+
export{DateRangeEditableMode,_defaultCalendarTooltipStrings,applyDateRangeEditingRestrictions,clearFlatpickrInput,createDateRangeChangeLockHandler,createDateRangeDayLockHandler,emitValue,getFlatpickrOptions,getModalContainer,getPlaceholder,getTextStrings,handleInputClick,handleInputFocus,hideEmptyYear,initializeMultiAnchorFlatpickr,initializeSingleAnchorFlatpickr,injectFlatpickrStyles,isValidDateFormat,loadLocale,modifyWeekdayShorthands,preventFlatpickrOpen,setCalendarAttributes,setTooltipStrings,updateEnableTime}from"./flatpickr.js";export{isSupportedLocale,langsArray,loadLocale as loadLocaleFromLangs,preloadAllLocales}from"./langs.js";export{fixedOverlayPositionPlugin}from"./overlay.js";export{CONFIG_DEBOUNCE_DELAY,RESIZE_DEBOUNCE_DELAY,VISIBILITY_CHECK_INTERVAL,cleanupFlatpickrInstance,createFormSubmitListener,datesEqual,debounce,filterValidDates,generateRandomId,isEmptyValue,isValidDate,mergeTextStrings,normalizeToDate,parseDateOnly,parseDateTime,parseTimeString,shouldSkipManualInputSync,timesEqual,updateFormValue,validatePickerInput}from"./utils.js";import"flatpickr";import"flatpickr/dist/esm/plugins/rangePlugin.js";import"flatpickr/dist/esm/l10n/default.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -47,6 +47,17 @@ export declare function filterValidDates(dates: unknown[]): Date[];
|
|
|
47
47
|
* Checks if a value is empty (null, undefined, empty string, or empty array).
|
|
48
48
|
*/
|
|
49
49
|
export declare function isEmptyValue(value: unknown): value is null | undefined | '' | [];
|
|
50
|
+
/**
|
|
51
|
+
* Returns true when a manual-input commit should be skipped because it would
|
|
52
|
+
* either be ignored by configuration or would re-enter a Flatpickr-triggered
|
|
53
|
+
* change cycle.
|
|
54
|
+
*/
|
|
55
|
+
export declare function shouldSkipManualInputSync({ allowManualInput, isClearing, isFromFlatpickr, isSyncingFromHost, }: {
|
|
56
|
+
allowManualInput: boolean;
|
|
57
|
+
isClearing?: boolean;
|
|
58
|
+
isFromFlatpickr?: boolean;
|
|
59
|
+
isSyncingFromHost?: boolean;
|
|
60
|
+
}): boolean;
|
|
50
61
|
/**
|
|
51
62
|
* Checks if two Date objects represent the same time (hours, minutes, seconds).
|
|
52
63
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/common/helpers/flatpickr/utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/common/helpers/flatpickr/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function e(e,t){let n=null;return(...r)=>{null!==n&&window.clearTimeout(n),n=window.setTimeout((()=>{e(...r),n=null}),t)}}function t(e){return`${e}-${Math.random().toString(36).slice(2,11)}`}function n(e){const t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!t)return null;const n=Number(t[1]),r=Number(t[2]),u=Number(t[3]);if(r<1||r>12||u<1||u>31)return null;const i=new Date(n,r-1,u);return i.getFullYear()!==n||i.getMonth()!==r-1||i.getDate()!==u||isNaN(i.getTime())?null:i}function r(e){const t=/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})(?::(\d{2}))?$/.exec(e);if(!t)return null;const n=Number(t[1]),r=Number(t[2]),u=Number(t[3]),i=Number(t[4]),l=Number(t[5]),o=void 0!==t[6]?Number(t[6]):0;if(r<1||r>12||u<1||u>31)return null;if(i<0||i>23||l<0||l>59||o<0||o>59)return null;const s=new Date(n,r-1,u,i,l,o);return s.getFullYear()!==n||s.getMonth()!==r-1||s.getDate()!==u||isNaN(s.getTime())?null:s}function u(e){if(e instanceof Date)return e;if("number"==typeof e){const t=new Date(e);return Number.isNaN(t.getTime())?null:t}if("string"==typeof e){const t=e.trim(),n=/^(\d{1,2}):(\d{2})(?::(\d{2}))?\s*([ap]m)?$/i.exec(t);if(!n)return null;let r=Number(n[1]);const u=Number(n[2]),i=void 0!==n[3]?Number(n[3]):0,l=n[4];if(Number.isNaN(r)||Number.isNaN(u)||Number.isNaN(i))return null;if(l){const e=l.toLowerCase();"pm"===e&&r<12&&(r+=12),"am"===e&&12===r&&(r=0)}if(r<0||r>23||u<0||u>59||i<0||i>59)return null;const o=new Date;return o.setHours(r,u,i,0),o}return null}function i(e,t){if(!e)return null;if(e instanceof Date)return isNaN(e.getTime())?null:e;if("number"==typeof e){const t=new Date(e);return isNaN(t.getTime())?null:t}if("string"==typeof e){if(t)return t(e);if(e.includes("T")){const t=new Date(e);return isNaN(t.getTime())?null:t}const u=r(e);return u||n(e)}return null}function l(e){return e instanceof Date&&!isNaN(e.getTime())}function o(e){return e.filter((e=>l(e)))}function s(e){return null==e||("string"==typeof e?""===e.trim():!!Array.isArray(e)&&(0===e.length||e.every((e=>null==e||"string"==typeof e&&""===e.trim()))))}function a(e,t){return!e&&!t||!(!e||!t)&&(e.getHours()===t.getHours()&&e.getMinutes()===t.getMinutes()&&e.getSeconds()===t.getSeconds())}function
|
|
1
|
+
function e(e,t){let n=null;return(...r)=>{null!==n&&window.clearTimeout(n),n=window.setTimeout((()=>{e(...r),n=null}),t)}}function t(e){return`${e}-${Math.random().toString(36).slice(2,11)}`}function n(e){const t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!t)return null;const n=Number(t[1]),r=Number(t[2]),u=Number(t[3]);if(r<1||r>12||u<1||u>31)return null;const i=new Date(n,r-1,u);return i.getFullYear()!==n||i.getMonth()!==r-1||i.getDate()!==u||isNaN(i.getTime())?null:i}function r(e){const t=/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})(?::(\d{2}))?$/.exec(e);if(!t)return null;const n=Number(t[1]),r=Number(t[2]),u=Number(t[3]),i=Number(t[4]),l=Number(t[5]),o=void 0!==t[6]?Number(t[6]):0;if(r<1||r>12||u<1||u>31)return null;if(i<0||i>23||l<0||l>59||o<0||o>59)return null;const s=new Date(n,r-1,u,i,l,o);return s.getFullYear()!==n||s.getMonth()!==r-1||s.getDate()!==u||isNaN(s.getTime())?null:s}function u(e){if(e instanceof Date)return e;if("number"==typeof e){const t=new Date(e);return Number.isNaN(t.getTime())?null:t}if("string"==typeof e){const t=e.trim(),n=/^(\d{1,2}):(\d{2})(?::(\d{2}))?\s*([ap]m)?$/i.exec(t);if(!n)return null;let r=Number(n[1]);const u=Number(n[2]),i=void 0!==n[3]?Number(n[3]):0,l=n[4];if(Number.isNaN(r)||Number.isNaN(u)||Number.isNaN(i))return null;if(l){const e=l.toLowerCase();"pm"===e&&r<12&&(r+=12),"am"===e&&12===r&&(r=0)}if(r<0||r>23||u<0||u>59||i<0||i>59)return null;const o=new Date;return o.setHours(r,u,i,0),o}return null}function i(e,t){if(!e)return null;if(e instanceof Date)return isNaN(e.getTime())?null:e;if("number"==typeof e){const t=new Date(e);return isNaN(t.getTime())?null:t}if("string"==typeof e){if(t)return t(e);if(e.includes("T")){const t=new Date(e);return isNaN(t.getTime())?null:t}const u=r(e);return u||n(e)}return null}function l(e){return e instanceof Date&&!isNaN(e.getTime())}function o(e){return e.filter((e=>l(e)))}function s(e){return null==e||("string"==typeof e?""===e.trim():!!Array.isArray(e)&&(0===e.length||e.every((e=>null==e||"string"==typeof e&&""===e.trim()))))}function a({allowManualInput:e,isClearing:t=!1,isFromFlatpickr:n=!1,isSyncingFromHost:r=!1}){return!e||t||n||r}function c(e,t){return!e&&!t||!(!e||!t)&&(e.getHours()===t.getHours()&&e.getMinutes()===t.getMinutes()&&e.getSeconds()===t.getSeconds())}function f(e,t){return!e&&!t||!(!e||!t)&&(e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate())}function m(e){if(!e)return;const t=e.__anchorClickHandlers;Array.isArray(t)&&t.forEach((e=>{try{e.el.removeEventListener("click",e.fn)}catch{}})),e.destroy()}function g(e,t){e&&t&&e.setFormValue(t.value)}function N(e,t,n){return r=>{e(!0,!0),t()&&!n()||r.preventDefault()}}function d(e){const{inputEl:t,required:n,isEmpty:r,invalidText:u,defaultErrorMessage:i,customValidation:l}=e;let o=t.validity,s=t.validationMessage;if(n&&r&&(o={...o,valueMissing:!0},s=i||"This field is required"),l){const{valid:e,message:t}=l();e||(o={...o,customError:!0},t&&(s=t))}u&&(o={...o,customError:!0},s=u);return{isValid:!o.valueMissing&&!o.customError,validity:o,validationMessage:s}}function b(e,t){return{...e,...t}}const y=100,v=250,p=250;export{y as CONFIG_DEBOUNCE_DELAY,v as RESIZE_DEBOUNCE_DELAY,p as VISIBILITY_CHECK_INTERVAL,m as cleanupFlatpickrInstance,N as createFormSubmitListener,f as datesEqual,e as debounce,o as filterValidDates,t as generateRandomId,s as isEmptyValue,l as isValidDate,b as mergeTextStrings,i as normalizeToDate,n as parseDateOnly,r as parseDateTime,u as parseTimeString,a as shouldSkipManualInputSync,c as timesEqual,g as updateFormValue,d as validatePickerInput};
|
|
2
2
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../src/common/helpers/flatpickr/utils.ts"],"sourcesContent":["/**\n * Shared utilities for flatpickr-based date/time picker components.\n * Extracts common patterns used across datepicker, daterangepicker, and timepicker.\n */\n\nimport type { Instance } from 'flatpickr/dist/types/instance';\n\n// ============================================================================\n// DEBOUNCE UTILITY\n// ============================================================================\n\n/**\n * Creates a debounced version of a function that delays execution until\n * after `wait` milliseconds have elapsed since the last call.\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: number | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(() => {\n void func(...args);\n timeout = null;\n }, wait);\n };\n}\n\n// ============================================================================\n// ID GENERATION\n// ============================================================================\n\n/**\n * Generates a random ID with a given prefix.\n * Used for creating unique IDs for inputs and their associated elements.\n */\nexport function generateRandomId(prefix: string): string {\n return `${prefix}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n// ============================================================================\n// DATE PARSING UTILITIES\n// ============================================================================\n\n/**\n * Parses a date string in Y-m-d format, validating month/day ranges\n * and rejecting rollover dates (e.g., 2024-02-31 becoming Mar 2).\n */\nexport function parseDateOnly(dateStr: string): Date | null {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(dateStr);\n if (!match) return null;\n\n const y = Number(match[1]);\n const m = Number(match[2]);\n const d = Number(match[3]);\n\n // Reject impossible month/day values\n if (m < 1 || m > 12 || d < 1 || d > 31) return null;\n\n const date = new Date(y, m - 1, d);\n\n // Reject rollover dates\n if (\n date.getFullYear() !== y ||\n date.getMonth() !== m - 1 ||\n date.getDate() !== d\n ) {\n return null;\n }\n\n return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Parses a datetime string in Y-m-d H:i or Y-m-d H:i:s format.\n */\nexport function parseDateTime(dateStr: string): Date | null {\n const dtMatch =\n /^(\\d{4})-(\\d{2})-(\\d{2})[ T](\\d{2}):(\\d{2})(?::(\\d{2}))?$/.exec(dateStr);\n if (!dtMatch) return null;\n\n const y = Number(dtMatch[1]);\n const mo = Number(dtMatch[2]);\n const da = Number(dtMatch[3]);\n const hh = Number(dtMatch[4]);\n const mm = Number(dtMatch[5]);\n const ss = dtMatch[6] !== undefined ? Number(dtMatch[6]) : 0;\n\n if (mo < 1 || mo > 12 || da < 1 || da > 31) return null;\n if (hh < 0 || hh > 23 || mm < 0 || mm > 59 || ss < 0 || ss > 59) return null;\n\n const dt = new Date(y, mo - 1, da, hh, mm, ss);\n\n if (\n dt.getFullYear() !== y ||\n dt.getMonth() !== mo - 1 ||\n dt.getDate() !== da\n ) {\n return null;\n }\n\n return isNaN(dt.getTime()) ? null : dt;\n}\n\n/**\n * Parses a time string (e.g., \"14:30\", \"2:30 PM\", \"02:30:45\") into a Date\n * object anchored to today.\n */\nexport function parseTimeString(time: string | number | Date): Date | null {\n if (time instanceof Date) return time;\n\n if (typeof time === 'number') {\n const d = new Date(time);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n\n if (typeof time === 'string') {\n const str = time.trim();\n\n // Accept formats like '14:30', '2:30 PM', '02:30:45', etc.\n const ampmMatch = /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*([ap]m)?$/i.exec(str);\n if (!ampmMatch) return null;\n\n let hours = Number(ampmMatch[1]);\n const minutes = Number(ampmMatch[2]);\n const seconds = ampmMatch[3] !== undefined ? Number(ampmMatch[3]) : 0;\n const ampm = ampmMatch[4];\n\n if (Number.isNaN(hours) || Number.isNaN(minutes) || Number.isNaN(seconds)) {\n return null;\n }\n\n if (ampm) {\n const a = ampm.toLowerCase();\n if (a === 'pm' && hours < 12) hours += 12;\n if (a === 'am' && hours === 12) hours = 0;\n }\n\n if (\n hours < 0 ||\n hours > 23 ||\n minutes < 0 ||\n minutes > 59 ||\n seconds < 0 ||\n seconds > 59\n ) {\n return null;\n }\n\n const d = new Date();\n d.setHours(hours, minutes, seconds, 0);\n return d;\n }\n\n return null;\n}\n\n/**\n * Normalizes a value to a Date object.\n * Handles Date objects, timestamps, and strings.\n */\nexport function normalizeToDate(\n value: string | number | Date | '' | null | undefined,\n parseDateString?: (str: string) => Date | null\n): Date | null {\n if (!value) return null;\n\n if (value instanceof Date) {\n return isNaN(value.getTime()) ? null : value;\n }\n\n if (typeof value === 'number') {\n const d = new Date(value);\n return isNaN(d.getTime()) ? null : d;\n }\n\n if (typeof value === 'string') {\n // Use provided parser or fall back to basic parsing\n if (parseDateString) {\n return parseDateString(value);\n }\n\n // Try ISO format first\n if (value.includes('T')) {\n const d = new Date(value);\n return isNaN(d.getTime()) ? null : d;\n }\n\n // Try datetime format\n const dt = parseDateTime(value);\n if (dt) return dt;\n\n // Try date-only format\n return parseDateOnly(value);\n }\n\n return null;\n}\n\n// ============================================================================\n// VALUE CHECKING UTILITIES\n// ============================================================================\n\n/**\n * Type guard that checks if a value is a valid Date object.\n * Returns true only if the value is a Date instance with a valid time value.\n */\nexport function isValidDate(value: unknown): value is Date {\n return value instanceof Date && !isNaN(value.getTime());\n}\n\n/**\n * Filters an array to only include valid Date objects.\n * Useful for defensive handling of flatpickr callbacks which may occasionally\n * pass non-Date values during certain interactions (e.g., time input changes).\n */\nexport function filterValidDates(dates: unknown[]): Date[] {\n return dates.filter((d): d is Date => isValidDate(d));\n}\n\n/**\n * Checks if a value is empty (null, undefined, empty string, or empty array).\n */\nexport function isEmptyValue(\n value: unknown\n): value is null | undefined | '' | [] {\n if (value == null) return true;\n\n if (typeof value === 'string') return value.trim() === '';\n\n if (Array.isArray(value)) {\n return (\n value.length === 0 ||\n value.every((v) => {\n if (v == null) return true;\n return typeof v === 'string' ? v.trim() === '' : false;\n })\n );\n }\n\n return false;\n}\n\n/**\n * Checks if two Date objects represent the same time (hours, minutes, seconds).\n */\nexport function timesEqual(\n a: Date | null | undefined,\n b: Date | null | undefined\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return (\n a.getHours() === b.getHours() &&\n a.getMinutes() === b.getMinutes() &&\n a.getSeconds() === b.getSeconds()\n );\n}\n\n/**\n * Checks if two Date objects represent the same date (year, month, day).\n */\nexport function datesEqual(\n a: Date | null | undefined,\n b: Date | null | undefined\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\n// ============================================================================\n// FLATPICKR INSTANCE UTILITIES\n// ============================================================================\n\n/**\n * Cleans up a flatpickr instance, removing event handlers and destroying it.\n */\nexport function cleanupFlatpickrInstance(instance: Instance | undefined): void {\n if (!instance) return;\n\n // Remove any anchor click handlers that were attached\n const __handlers = (instance as any).__anchorClickHandlers;\n if (Array.isArray(__handlers)) {\n __handlers.forEach((h: { el: HTMLElement; fn: EventListener }) => {\n try {\n h.el.removeEventListener('click', h.fn as EventListener);\n } catch {\n // ignore cleanup errors\n }\n });\n }\n\n instance.destroy();\n}\n\n/**\n * Type for anchor click handlers stored on flatpickr instance.\n */\nexport type AnchorClickHandler = {\n el: HTMLElement;\n fn: EventListener;\n};\n\n// ============================================================================\n// FORM INTEGRATION UTILITIES\n// ============================================================================\n\n/**\n * Updates the form value for a picker component.\n */\nexport function updateFormValue(\n internals: ElementInternals | undefined,\n inputEl: HTMLInputElement | null\n): void {\n if (internals && inputEl) {\n internals.setFormValue(inputEl.value);\n }\n}\n\n/**\n * Creates a submit listener for form validation.\n */\nexport function createFormSubmitListener(\n validateFn: (interacted: boolean, report: boolean) => void,\n checkValidityFn: () => boolean,\n requiredCheck: () => boolean\n): (e: SubmitEvent) => void {\n return (e: SubmitEvent) => {\n validateFn(true, true);\n if (!checkValidityFn() || requiredCheck()) {\n e.preventDefault();\n }\n };\n}\n\n// ============================================================================\n// VALIDATION UTILITIES\n// ============================================================================\n\nexport interface ValidationResult {\n isValid: boolean;\n validity: ValidityState;\n validationMessage: string;\n}\n\nexport interface ValidationOptions {\n inputEl: HTMLInputElement;\n required: boolean;\n isEmpty: boolean;\n invalidText: string;\n defaultErrorMessage: string;\n hasInteracted: boolean;\n customValidation?: () => { valid: boolean; message?: string };\n}\n\n/**\n * Performs validation for a picker input.\n * Returns validation state without modifying component state.\n */\nexport function validatePickerInput(\n options: ValidationOptions\n): ValidationResult {\n const {\n inputEl,\n required,\n isEmpty,\n invalidText,\n defaultErrorMessage,\n customValidation,\n } = options;\n\n let validity = inputEl.validity;\n let validationMessage = inputEl.validationMessage;\n\n // Check required\n if (required && isEmpty) {\n validity = { ...validity, valueMissing: true };\n validationMessage = defaultErrorMessage || 'This field is required';\n }\n\n // Check custom validation\n if (customValidation) {\n const { valid, message } = customValidation();\n if (!valid) {\n validity = { ...validity, customError: true };\n if (message) validationMessage = message;\n }\n }\n\n // Check invalidText (external validation)\n if (invalidText) {\n validity = { ...validity, customError: true };\n validationMessage = invalidText;\n }\n\n const isValid = !validity.valueMissing && !validity.customError;\n\n return { isValid, validity, validationMessage };\n}\n\n// ============================================================================\n// TEXT STRINGS UTILITIES\n// ============================================================================\n\n/**\n * Merges default text strings with custom overrides.\n */\nexport function mergeTextStrings<T extends Record<string, string>>(\n defaults: T,\n custom?: Partial<T>\n): T {\n return { ...defaults, ...custom };\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/** Delay before re-initializing flatpickr after config changes (ms) */\nexport const CONFIG_DEBOUNCE_DELAY = 100;\n\n/** Delay before re-initializing flatpickr after window resize (ms) */\nexport const RESIZE_DEBOUNCE_DELAY = 250;\n\n/** Interval for checking if a hidden picker becomes visible (ms) */\nexport const VISIBILITY_CHECK_INTERVAL = 250;\n"],"names":["debounce","func","wait","timeout","args","window","clearTimeout","setTimeout","generateRandomId","prefix","Math","random","toString","slice","parseDateOnly","dateStr","match","exec","y","Number","m","d","date","Date","getFullYear","getMonth","getDate","isNaN","getTime","parseDateTime","dtMatch","mo","da","hh","mm","ss","undefined","dt","parseTimeString","time","str","trim","ampmMatch","hours","minutes","seconds","ampm","a","toLowerCase","setHours","normalizeToDate","value","parseDateString","includes","isValidDate","filterValidDates","dates","filter","isEmptyValue","Array","isArray","length","every","v","timesEqual","b","getHours","getMinutes","getSeconds","datesEqual","cleanupFlatpickrInstance","instance","__handlers","__anchorClickHandlers","forEach","h","el","removeEventListener","fn","destroy","updateFormValue","internals","inputEl","setFormValue","createFormSubmitListener","validateFn","checkValidityFn","requiredCheck","e","preventDefault","validatePickerInput","options","required","isEmpty","invalidText","defaultErrorMessage","customValidation","validity","validationMessage","valueMissing","valid","message","customError","isValid","mergeTextStrings","defaults","custom","CONFIG_DEBOUNCE_DELAY","RESIZE_DEBOUNCE_DELAY","VISIBILITY_CHECK_INTERVAL"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/common/helpers/flatpickr/utils.ts"],"sourcesContent":["/**\n * Shared utilities for flatpickr-based date/time picker components.\n * Extracts common patterns used across datepicker, daterangepicker, and timepicker.\n */\n\nimport type { Instance } from 'flatpickr/dist/types/instance';\n\n// ============================================================================\n// DEBOUNCE UTILITY\n// ============================================================================\n\n/**\n * Creates a debounced version of a function that delays execution until\n * after `wait` milliseconds have elapsed since the last call.\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: number | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(() => {\n void func(...args);\n timeout = null;\n }, wait);\n };\n}\n\n// ============================================================================\n// ID GENERATION\n// ============================================================================\n\n/**\n * Generates a random ID with a given prefix.\n * Used for creating unique IDs for inputs and their associated elements.\n */\nexport function generateRandomId(prefix: string): string {\n return `${prefix}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n// ============================================================================\n// DATE PARSING UTILITIES\n// ============================================================================\n\n/**\n * Parses a date string in Y-m-d format, validating month/day ranges\n * and rejecting rollover dates (e.g., 2024-02-31 becoming Mar 2).\n */\nexport function parseDateOnly(dateStr: string): Date | null {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(dateStr);\n if (!match) return null;\n\n const y = Number(match[1]);\n const m = Number(match[2]);\n const d = Number(match[3]);\n\n // Reject impossible month/day values\n if (m < 1 || m > 12 || d < 1 || d > 31) return null;\n\n const date = new Date(y, m - 1, d);\n\n // Reject rollover dates\n if (\n date.getFullYear() !== y ||\n date.getMonth() !== m - 1 ||\n date.getDate() !== d\n ) {\n return null;\n }\n\n return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Parses a datetime string in Y-m-d H:i or Y-m-d H:i:s format.\n */\nexport function parseDateTime(dateStr: string): Date | null {\n const dtMatch =\n /^(\\d{4})-(\\d{2})-(\\d{2})[ T](\\d{2}):(\\d{2})(?::(\\d{2}))?$/.exec(dateStr);\n if (!dtMatch) return null;\n\n const y = Number(dtMatch[1]);\n const mo = Number(dtMatch[2]);\n const da = Number(dtMatch[3]);\n const hh = Number(dtMatch[4]);\n const mm = Number(dtMatch[5]);\n const ss = dtMatch[6] !== undefined ? Number(dtMatch[6]) : 0;\n\n if (mo < 1 || mo > 12 || da < 1 || da > 31) return null;\n if (hh < 0 || hh > 23 || mm < 0 || mm > 59 || ss < 0 || ss > 59) return null;\n\n const dt = new Date(y, mo - 1, da, hh, mm, ss);\n\n if (\n dt.getFullYear() !== y ||\n dt.getMonth() !== mo - 1 ||\n dt.getDate() !== da\n ) {\n return null;\n }\n\n return isNaN(dt.getTime()) ? null : dt;\n}\n\n/**\n * Parses a time string (e.g., \"14:30\", \"2:30 PM\", \"02:30:45\") into a Date\n * object anchored to today.\n */\nexport function parseTimeString(time: string | number | Date): Date | null {\n if (time instanceof Date) return time;\n\n if (typeof time === 'number') {\n const d = new Date(time);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n\n if (typeof time === 'string') {\n const str = time.trim();\n\n // Accept formats like '14:30', '2:30 PM', '02:30:45', etc.\n const ampmMatch = /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*([ap]m)?$/i.exec(str);\n if (!ampmMatch) return null;\n\n let hours = Number(ampmMatch[1]);\n const minutes = Number(ampmMatch[2]);\n const seconds = ampmMatch[3] !== undefined ? Number(ampmMatch[3]) : 0;\n const ampm = ampmMatch[4];\n\n if (Number.isNaN(hours) || Number.isNaN(minutes) || Number.isNaN(seconds)) {\n return null;\n }\n\n if (ampm) {\n const a = ampm.toLowerCase();\n if (a === 'pm' && hours < 12) hours += 12;\n if (a === 'am' && hours === 12) hours = 0;\n }\n\n if (\n hours < 0 ||\n hours > 23 ||\n minutes < 0 ||\n minutes > 59 ||\n seconds < 0 ||\n seconds > 59\n ) {\n return null;\n }\n\n const d = new Date();\n d.setHours(hours, minutes, seconds, 0);\n return d;\n }\n\n return null;\n}\n\n/**\n * Normalizes a value to a Date object.\n * Handles Date objects, timestamps, and strings.\n */\nexport function normalizeToDate(\n value: string | number | Date | '' | null | undefined,\n parseDateString?: (str: string) => Date | null\n): Date | null {\n if (!value) return null;\n\n if (value instanceof Date) {\n return isNaN(value.getTime()) ? null : value;\n }\n\n if (typeof value === 'number') {\n const d = new Date(value);\n return isNaN(d.getTime()) ? null : d;\n }\n\n if (typeof value === 'string') {\n // Use provided parser or fall back to basic parsing\n if (parseDateString) {\n return parseDateString(value);\n }\n\n // Try ISO format first\n if (value.includes('T')) {\n const d = new Date(value);\n return isNaN(d.getTime()) ? null : d;\n }\n\n // Try datetime format\n const dt = parseDateTime(value);\n if (dt) return dt;\n\n // Try date-only format\n return parseDateOnly(value);\n }\n\n return null;\n}\n\n// ============================================================================\n// VALUE CHECKING UTILITIES\n// ============================================================================\n\n/**\n * Type guard that checks if a value is a valid Date object.\n * Returns true only if the value is a Date instance with a valid time value.\n */\nexport function isValidDate(value: unknown): value is Date {\n return value instanceof Date && !isNaN(value.getTime());\n}\n\n/**\n * Filters an array to only include valid Date objects.\n * Useful for defensive handling of flatpickr callbacks which may occasionally\n * pass non-Date values during certain interactions (e.g., time input changes).\n */\nexport function filterValidDates(dates: unknown[]): Date[] {\n return dates.filter((d): d is Date => isValidDate(d));\n}\n\n/**\n * Checks if a value is empty (null, undefined, empty string, or empty array).\n */\nexport function isEmptyValue(\n value: unknown\n): value is null | undefined | '' | [] {\n if (value == null) return true;\n\n if (typeof value === 'string') return value.trim() === '';\n\n if (Array.isArray(value)) {\n return (\n value.length === 0 ||\n value.every((v) => {\n if (v == null) return true;\n return typeof v === 'string' ? v.trim() === '' : false;\n })\n );\n }\n\n return false;\n}\n\n/**\n * Returns true when a manual-input commit should be skipped because it would\n * either be ignored by configuration or would re-enter a Flatpickr-triggered\n * change cycle.\n */\nexport function shouldSkipManualInputSync({\n allowManualInput,\n isClearing = false,\n isFromFlatpickr = false,\n isSyncingFromHost = false,\n}: {\n allowManualInput: boolean;\n isClearing?: boolean;\n isFromFlatpickr?: boolean;\n isSyncingFromHost?: boolean;\n}): boolean {\n return (\n !allowManualInput || isClearing || isFromFlatpickr || isSyncingFromHost\n );\n}\n\n/**\n * Checks if two Date objects represent the same time (hours, minutes, seconds).\n */\nexport function timesEqual(\n a: Date | null | undefined,\n b: Date | null | undefined\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return (\n a.getHours() === b.getHours() &&\n a.getMinutes() === b.getMinutes() &&\n a.getSeconds() === b.getSeconds()\n );\n}\n\n/**\n * Checks if two Date objects represent the same date (year, month, day).\n */\nexport function datesEqual(\n a: Date | null | undefined,\n b: Date | null | undefined\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\n// ============================================================================\n// FLATPICKR INSTANCE UTILITIES\n// ============================================================================\n\n/**\n * Cleans up a flatpickr instance, removing event handlers and destroying it.\n */\nexport function cleanupFlatpickrInstance(instance: Instance | undefined): void {\n if (!instance) return;\n\n // Remove any anchor click handlers that were attached\n const __handlers = (instance as any).__anchorClickHandlers;\n if (Array.isArray(__handlers)) {\n __handlers.forEach((h: { el: HTMLElement; fn: EventListener }) => {\n try {\n h.el.removeEventListener('click', h.fn as EventListener);\n } catch {\n // ignore cleanup errors\n }\n });\n }\n\n instance.destroy();\n}\n\n/**\n * Type for anchor click handlers stored on flatpickr instance.\n */\nexport type AnchorClickHandler = {\n el: HTMLElement;\n fn: EventListener;\n};\n\n// ============================================================================\n// FORM INTEGRATION UTILITIES\n// ============================================================================\n\n/**\n * Updates the form value for a picker component.\n */\nexport function updateFormValue(\n internals: ElementInternals | undefined,\n inputEl: HTMLInputElement | null\n): void {\n if (internals && inputEl) {\n internals.setFormValue(inputEl.value);\n }\n}\n\n/**\n * Creates a submit listener for form validation.\n */\nexport function createFormSubmitListener(\n validateFn: (interacted: boolean, report: boolean) => void,\n checkValidityFn: () => boolean,\n requiredCheck: () => boolean\n): (e: SubmitEvent) => void {\n return (e: SubmitEvent) => {\n validateFn(true, true);\n if (!checkValidityFn() || requiredCheck()) {\n e.preventDefault();\n }\n };\n}\n\n// ============================================================================\n// VALIDATION UTILITIES\n// ============================================================================\n\nexport interface ValidationResult {\n isValid: boolean;\n validity: ValidityState;\n validationMessage: string;\n}\n\nexport interface ValidationOptions {\n inputEl: HTMLInputElement;\n required: boolean;\n isEmpty: boolean;\n invalidText: string;\n defaultErrorMessage: string;\n hasInteracted: boolean;\n customValidation?: () => { valid: boolean; message?: string };\n}\n\n/**\n * Performs validation for a picker input.\n * Returns validation state without modifying component state.\n */\nexport function validatePickerInput(\n options: ValidationOptions\n): ValidationResult {\n const {\n inputEl,\n required,\n isEmpty,\n invalidText,\n defaultErrorMessage,\n customValidation,\n } = options;\n\n let validity = inputEl.validity;\n let validationMessage = inputEl.validationMessage;\n\n // Check required\n if (required && isEmpty) {\n validity = { ...validity, valueMissing: true };\n validationMessage = defaultErrorMessage || 'This field is required';\n }\n\n // Check custom validation\n if (customValidation) {\n const { valid, message } = customValidation();\n if (!valid) {\n validity = { ...validity, customError: true };\n if (message) validationMessage = message;\n }\n }\n\n // Check invalidText (external validation)\n if (invalidText) {\n validity = { ...validity, customError: true };\n validationMessage = invalidText;\n }\n\n const isValid = !validity.valueMissing && !validity.customError;\n\n return { isValid, validity, validationMessage };\n}\n\n// ============================================================================\n// TEXT STRINGS UTILITIES\n// ============================================================================\n\n/**\n * Merges default text strings with custom overrides.\n */\nexport function mergeTextStrings<T extends Record<string, string>>(\n defaults: T,\n custom?: Partial<T>\n): T {\n return { ...defaults, ...custom };\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/** Delay before re-initializing flatpickr after config changes (ms) */\nexport const CONFIG_DEBOUNCE_DELAY = 100;\n\n/** Delay before re-initializing flatpickr after window resize (ms) */\nexport const RESIZE_DEBOUNCE_DELAY = 250;\n\n/** Interval for checking if a hidden picker becomes visible (ms) */\nexport const VISIBILITY_CHECK_INTERVAL = 250;\n"],"names":["debounce","func","wait","timeout","args","window","clearTimeout","setTimeout","generateRandomId","prefix","Math","random","toString","slice","parseDateOnly","dateStr","match","exec","y","Number","m","d","date","Date","getFullYear","getMonth","getDate","isNaN","getTime","parseDateTime","dtMatch","mo","da","hh","mm","ss","undefined","dt","parseTimeString","time","str","trim","ampmMatch","hours","minutes","seconds","ampm","a","toLowerCase","setHours","normalizeToDate","value","parseDateString","includes","isValidDate","filterValidDates","dates","filter","isEmptyValue","Array","isArray","length","every","v","shouldSkipManualInputSync","allowManualInput","isClearing","isFromFlatpickr","isSyncingFromHost","timesEqual","b","getHours","getMinutes","getSeconds","datesEqual","cleanupFlatpickrInstance","instance","__handlers","__anchorClickHandlers","forEach","h","el","removeEventListener","fn","destroy","updateFormValue","internals","inputEl","setFormValue","createFormSubmitListener","validateFn","checkValidityFn","requiredCheck","e","preventDefault","validatePickerInput","options","required","isEmpty","invalidText","defaultErrorMessage","customValidation","validity","validationMessage","valueMissing","valid","message","customError","isValid","mergeTextStrings","defaults","custom","CONFIG_DEBOUNCE_DELAY","RESIZE_DEBOUNCE_DELAY","VISIBILITY_CHECK_INTERVAL"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{describe as e,beforeEach as t,vi as o,afterEach as l,it as n,expect as a}from"vitest";import{generateRandomId as r,parseDateOnly as u,parseDateTime as s,parseTimeString as i,normalizeToDate as d,isValidDate as f,filterValidDates as h,isEmptyValue as B,timesEqual as c,datesEqual as m,cleanupFlatpickrInstance as v,updateFormValue as g,validatePickerInput as p,mergeTextStrings as w,CONFIG_DEBOUNCE_DELAY as D,RESIZE_DEBOUNCE_DELAY as y,VISIBILITY_CHECK_INTERVAL as N,debounce as T,createFormSubmitListener as E}from"./utils.js";void 0===globalThis.window&&Object.defineProperty(globalThis,"window",{value:{get setTimeout(){return globalThis.setTimeout},get clearTimeout(){return globalThis.clearTimeout}},writable:!0,configurable:!0}),e("debounce",(()=>{t((()=>{o.useFakeTimers()})),l((()=>{o.useRealTimers()})),n("should delay function execution",(()=>{const e=o.fn();T(e,100)(),a(e).not.toHaveBeenCalled(),o.advanceTimersByTime(99),a(e).not.toHaveBeenCalled(),o.advanceTimersByTime(1),a(e).toHaveBeenCalledTimes(1)})),n("should cancel previous calls when called again within wait time",(()=>{const e=o.fn(),t=T(e,100);t(),o.advanceTimersByTime(50),t(),o.advanceTimersByTime(50),a(e).not.toHaveBeenCalled(),o.advanceTimersByTime(50),a(e).toHaveBeenCalledTimes(1)})),n("should pass arguments to the debounced function",(()=>{const e=o.fn();T(e,100)("arg1","arg2"),o.advanceTimersByTime(100),a(e).toHaveBeenCalledWith("arg1","arg2")})),n("should use the latest arguments when called multiple times",(()=>{const e=o.fn(),t=T(e,100);t("first"),t("second"),t("third"),o.advanceTimersByTime(100),a(e).toHaveBeenCalledTimes(1),a(e).toHaveBeenCalledWith("third")}))})),e("generateRandomId",(()=>{n("should generate an ID with the given prefix",(()=>{const e=r("test");a(e).toMatch(/^test-[a-z0-9]+$/)})),n("should generate unique IDs",(()=>{const e=new Set;for(let t=0;t<100;t++)e.add(r("prefix"));a(e.size).toBe(100)})),n("should handle empty prefix",(()=>{const e=r("");a(e).toMatch(/^-[a-z0-9]+$/)})),n("should handle special characters in prefix",(()=>{const e=r("my-picker");a(e).toMatch(/^my-picker-[a-z0-9]+$/)}))})),e("parseDateOnly",(()=>{n("should parse valid Y-m-d format",(()=>{const e=u("2024-03-15");a(e).not.toBeNull(),a(e.getFullYear()).toBe(2024),a(e.getMonth()).toBe(2),a(e.getDate()).toBe(15)})),n("should return null for invalid format",(()=>{a(u("03-15-2024")).toBeNull(),a(u("2024/03/15")).toBeNull(),a(u("2024-3-15")).toBeNull(),a(u("not a date")).toBeNull()})),n("should return null for invalid month",(()=>{a(u("2024-00-15")).toBeNull(),a(u("2024-13-15")).toBeNull()})),n("should return null for invalid day",(()=>{a(u("2024-03-00")).toBeNull(),a(u("2024-03-32")).toBeNull()})),n("should return null for rollover dates",(()=>{a(u("2024-02-31")).toBeNull(),a(u("2024-04-31")).toBeNull()})),n("should handle leap year correctly",(()=>{const e=u("2024-02-29");a(e).not.toBeNull(),a(e.getDate()).toBe(29),a(u("2023-02-29")).toBeNull()}))})),e("parseDateTime",(()=>{n("should parse Y-m-d H:i format",(()=>{const e=s("2024-03-15 14:30");a(e).not.toBeNull(),a(e.getFullYear()).toBe(2024),a(e.getMonth()).toBe(2),a(e.getDate()).toBe(15),a(e.getHours()).toBe(14),a(e.getMinutes()).toBe(30),a(e.getSeconds()).toBe(0)})),n("should parse Y-m-d H:i:s format",(()=>{const e=s("2024-03-15 14:30:45");a(e).not.toBeNull(),a(e.getHours()).toBe(14),a(e.getMinutes()).toBe(30),a(e.getSeconds()).toBe(45)})),n("should parse ISO-like format with T separator",(()=>{const e=s("2024-03-15T14:30");a(e).not.toBeNull(),a(e.getHours()).toBe(14),a(e.getMinutes()).toBe(30)})),n("should return null for invalid time values",(()=>{a(s("2024-03-15 24:00")).toBeNull(),a(s("2024-03-15 14:60")).toBeNull(),a(s("2024-03-15 14:30:60")).toBeNull()})),n("should return null for invalid date portion",(()=>{a(s("2024-13-15 14:30")).toBeNull(),a(s("2024-02-31 14:30")).toBeNull()})),n("should return null for invalid format",(()=>{a(s("2024-03-15")).toBeNull(),a(s("14:30")).toBeNull(),a(s("not a datetime")).toBeNull()}))})),e("parseTimeString",(()=>{n("should return Date objects as-is",(()=>{const e=new Date(2024,2,15,14,30,0),t=i(e);a(t).toBe(e)})),n("should convert timestamps to Date",(()=>{const e=Date.now(),t=i(e);a(t).not.toBeNull(),a(t.getTime()).toBe(e)})),n("should parse 24-hour format (HH:mm)",(()=>{const e=i("14:30");a(e).not.toBeNull(),a(e.getHours()).toBe(14),a(e.getMinutes()).toBe(30)})),n("should parse 24-hour format with seconds (HH:mm:ss)",(()=>{const e=i("14:30:45");a(e).not.toBeNull(),a(e.getHours()).toBe(14),a(e.getMinutes()).toBe(30),a(e.getSeconds()).toBe(45)})),n("should parse 12-hour format with AM",(()=>{const e=i("9:30 AM");a(e).not.toBeNull(),a(e.getHours()).toBe(9),a(e.getMinutes()).toBe(30)})),n("should parse 12-hour format with PM",(()=>{const e=i("2:30 PM");a(e).not.toBeNull(),a(e.getHours()).toBe(14),a(e.getMinutes()).toBe(30)})),n("should handle 12 AM as midnight",(()=>{const e=i("12:00 AM");a(e).not.toBeNull(),a(e.getHours()).toBe(0)})),n("should handle 12 PM as noon",(()=>{const e=i("12:00 PM");a(e).not.toBeNull(),a(e.getHours()).toBe(12)})),n("should be case-insensitive for AM/PM",(()=>{a(i("2:30 pm").getHours()).toBe(14),a(i("2:30 PM").getHours()).toBe(14),a(i("9:30 am").getHours()).toBe(9),a(i("9:30 AM").getHours()).toBe(9)})),n("should return null for invalid time values",(()=>{a(i("25:00")).toBeNull(),a(i("14:60")).toBeNull(),a(i("14:30:60")).toBeNull()})),n("should return null for invalid format",(()=>{a(i("not a time")).toBeNull(),a(i("")).toBeNull()})),n("should return null for invalid number timestamps",(()=>{a(i(NaN)).toBeNull()}))})),e("normalizeToDate",(()=>{n("should return null for falsy values",(()=>{a(d(null)).toBeNull(),a(d(void 0)).toBeNull(),a(d("")).toBeNull()})),n("should return valid Date objects as-is",(()=>{const e=new Date(2024,2,15),t=d(e);a(t).toBe(e)})),n("should return null for invalid Date objects",(()=>{const e=new Date("invalid");a(d(e)).toBeNull()})),n("should convert timestamps to Date",(()=>{const e=Date.now(),t=d(e);a(t.getTime()).toBe(e)})),n("should return null for invalid timestamps",(()=>{a(d(NaN)).toBeNull()})),n("should parse ISO strings",(()=>{const e=d("2024-03-15T14:30:00.000Z");a(e).not.toBeNull(),a(e.getFullYear()).toBe(2024)})),n("should parse date-only strings",(()=>{const e=d("2024-03-15");a(e).not.toBeNull(),a(e.getFullYear()).toBe(2024),a(e.getMonth()).toBe(2),a(e.getDate()).toBe(15)})),n("should parse datetime strings",(()=>{const e=d("2024-03-15 14:30");a(e).not.toBeNull(),a(e.getHours()).toBe(14),a(e.getMinutes()).toBe(30)})),n("should use custom parser when provided",(()=>{const e=o.fn().mockReturnValue(new Date(2024,0,1)),t=d("custom-format",e);a(e).toHaveBeenCalledWith("custom-format"),a(t.getFullYear()).toBe(2024),a(t.getMonth()).toBe(0),a(t.getDate()).toBe(1)}))})),e("isValidDate",(()=>{n("should return true for valid Date objects",(()=>{a(f(new Date)).toBe(!0),a(f(new Date(2024,2,15))).toBe(!0),a(f(new Date("2024-03-15T14:30:00"))).toBe(!0)})),n("should return false for invalid Date objects",(()=>{a(f(new Date("invalid"))).toBe(!1),a(f(new Date(NaN))).toBe(!1)})),n("should return false for null and undefined",(()=>{a(f(null)).toBe(!1),a(f(void 0)).toBe(!1)})),n("should return false for non-Date values",(()=>{a(f("2024-03-15")).toBe(!1),a(f(17104896e5)).toBe(!1),a(f({})).toBe(!1),a(f([])).toBe(!1),a(f(42)).toBe(!1),a(f("")).toBe(!1)})),n("should return false for objects with getTime method that are not Dates",(()=>{a(f({getTime:()=>17104896e5})).toBe(!1)}))})),e("filterValidDates",(()=>{n("should return empty array for empty input",(()=>{a(h([])).toEqual([])})),n("should return all valid Dates from array",(()=>{const e=new Date(2024,2,15),t=new Date(2024,2,16),o=h([e,t]);a(o).toEqual([e,t])})),n("should filter out invalid Dates",(()=>{const e=new Date(2024,2,15),t=new Date("invalid"),o=h([e,t]);a(o).toEqual([e])})),n("should filter out non-Date values",(()=>{const e=new Date(2024,2,15),t=h([e,null,void 0,"2024-03-15",17104896e5,{}]);a(t).toEqual([e])})),n("should return empty array when all values are invalid",(()=>{const e=h([null,void 0,"not a date",new Date("invalid")]);a(e).toEqual([])})),n("should preserve order of valid dates",(()=>{const e=new Date(2024,0,1),t=new Date(2024,5,15),o=new Date(2024,11,31),l=h([e,null,t,"invalid",o]);a(l).toEqual([e,t,o])}))})),e("isEmptyValue",(()=>{n("should return true for null",(()=>{a(B(null)).toBe(!0)})),n("should return true for undefined",(()=>{a(B(void 0)).toBe(!0)})),n("should return true for empty string",(()=>{a(B("")).toBe(!0)})),n("should return true for whitespace-only string",(()=>{a(B(" ")).toBe(!0),a(B("\t\n")).toBe(!0)})),n("should return false for non-empty string",(()=>{a(B("hello")).toBe(!1),a(B(" hello ")).toBe(!1)})),n("should return true for empty array",(()=>{a(B([])).toBe(!0)})),n("should return true for array of null/undefined",(()=>{a(B([null])).toBe(!0),a(B([void 0])).toBe(!0),a(B([null,void 0])).toBe(!0)})),n("should return true for array of empty strings",(()=>{a(B([""])).toBe(!0),a(B([""," "])).toBe(!0)})),n("should return false for array with non-empty values",(()=>{a(B(["value"])).toBe(!1),a(B([null,"value"])).toBe(!1)})),n("should return false for array with Date objects",(()=>{a(B([new Date])).toBe(!1)})),n("should return false for non-empty objects",(()=>{a(B({key:"value"})).toBe(!1)})),n("should return false for numbers",(()=>{a(B(0)).toBe(!1),a(B(42)).toBe(!1)})),n("should return false for Date objects",(()=>{a(B(new Date)).toBe(!1)}))})),e("timesEqual",(()=>{n("should return true for two null/undefined values",(()=>{a(c(null,null)).toBe(!0),a(c(void 0,void 0)).toBe(!0),a(c(null,void 0)).toBe(!0)})),n("should return false when one is null/undefined",(()=>{a(c(new Date,null)).toBe(!1),a(c(null,new Date)).toBe(!1)})),n("should return true for same time",(()=>{const e=new Date(2024,2,15,14,30,45),t=new Date(2024,5,20,14,30,45);a(c(e,t)).toBe(!0)})),n("should return false for different hours",(()=>{const e=new Date(2024,2,15,14,30,45),t=new Date(2024,2,15,15,30,45);a(c(e,t)).toBe(!1)})),n("should return false for different minutes",(()=>{const e=new Date(2024,2,15,14,30,45),t=new Date(2024,2,15,14,31,45);a(c(e,t)).toBe(!1)})),n("should return false for different seconds",(()=>{const e=new Date(2024,2,15,14,30,45),t=new Date(2024,2,15,14,30,46);a(c(e,t)).toBe(!1)}))})),e("datesEqual",(()=>{n("should return true for two null/undefined values",(()=>{a(m(null,null)).toBe(!0),a(m(void 0,void 0)).toBe(!0),a(m(null,void 0)).toBe(!0)})),n("should return false when one is null/undefined",(()=>{a(m(new Date,null)).toBe(!1),a(m(null,new Date)).toBe(!1)})),n("should return true for same date",(()=>{const e=new Date(2024,2,15,10,0,0),t=new Date(2024,2,15,20,30,45);a(m(e,t)).toBe(!0)})),n("should return false for different year",(()=>{const e=new Date(2024,2,15),t=new Date(2025,2,15);a(m(e,t)).toBe(!1)})),n("should return false for different month",(()=>{const e=new Date(2024,2,15),t=new Date(2024,3,15);a(m(e,t)).toBe(!1)})),n("should return false for different day",(()=>{const e=new Date(2024,2,15),t=new Date(2024,2,16);a(m(e,t)).toBe(!1)}))})),e("cleanupFlatpickrInstance",(()=>{n("should handle undefined instance",(()=>{a((()=>v(void 0))).not.toThrow()})),n("should call destroy on instance",(()=>{const e={destroy:o.fn()};v(e),a(e.destroy).toHaveBeenCalled()})),n("should remove anchor click handlers",(()=>{const e={el:{removeEventListener:o.fn()},fn:o.fn()},t={el:{removeEventListener:o.fn()},fn:o.fn()},l={destroy:o.fn(),__anchorClickHandlers:[e,t]};v(l),a(e.el.removeEventListener).toHaveBeenCalledWith("click",e.fn),a(t.el.removeEventListener).toHaveBeenCalledWith("click",t.fn)})),n("should handle missing anchor click handlers",(()=>{const e={destroy:o.fn()};a((()=>v(e))).not.toThrow()})),n("should handle errors during handler removal",(()=>{const e={el:{removeEventListener:o.fn().mockImplementation((()=>{throw new Error("Test error")}))},fn:o.fn()},t={destroy:o.fn(),__anchorClickHandlers:[e]};a((()=>v(t))).not.toThrow(),a(t.destroy).toHaveBeenCalled()}))})),e("updateFormValue",(()=>{n("should set form value when both internals and input exist",(()=>{const e={setFormValue:o.fn()};g(e,{value:"test-value"}),a(e.setFormValue).toHaveBeenCalledWith("test-value")})),n("should do nothing when internals is undefined",(()=>{const e={value:"test-value"};a((()=>g(void 0,e))).not.toThrow()})),n("should do nothing when input is null",(()=>{const e={setFormValue:o.fn()};a((()=>g(e,null))).not.toThrow(),a(e.setFormValue).not.toHaveBeenCalled()}))})),e("createFormSubmitListener",(()=>{n("should call validate function with interacted=true and report=true",(()=>{const e=o.fn(),t=o.fn().mockReturnValue(!0),l=o.fn().mockReturnValue(!1);E(e,t,l)({preventDefault:o.fn()}),a(e).toHaveBeenCalledWith(!0,!0)})),n("should prevent default when validity check fails",(()=>{const e=o.fn(),t=o.fn().mockReturnValue(!1),l=o.fn().mockReturnValue(!1),n=E(e,t,l),r={preventDefault:o.fn()};n(r),a(r.preventDefault).toHaveBeenCalled()})),n("should prevent default when required check fails",(()=>{const e=o.fn(),t=o.fn().mockReturnValue(!0),l=o.fn().mockReturnValue(!0),n=E(e,t,l),r={preventDefault:o.fn()};n(r),a(r.preventDefault).toHaveBeenCalled()})),n("should not prevent default when valid",(()=>{const e=o.fn(),t=o.fn().mockReturnValue(!0),l=o.fn().mockReturnValue(!1),n=E(e,t,l),r={preventDefault:o.fn()};n(r),a(r.preventDefault).not.toHaveBeenCalled()}))})),e("validatePickerInput",(()=>{const e=(e={})=>({validity:{valueMissing:!1,customError:!1,...e},validationMessage:""});n("should return valid result for non-required empty field",(()=>{const t=p({inputEl:e(),required:!1,isEmpty:!0,invalidText:"",defaultErrorMessage:""});a(t.isValid).toBe(!0)})),n("should return invalid for required empty field",(()=>{const t=p({inputEl:e(),required:!0,isEmpty:!0,invalidText:"",defaultErrorMessage:"Field is required"});a(t.isValid).toBe(!1),a(t.validity.valueMissing).toBe(!0),a(t.validationMessage).toBe("Field is required")})),n("should use default message when no custom message provided",(()=>{const t=p({inputEl:e(),required:!0,isEmpty:!0,invalidText:"",defaultErrorMessage:""});a(t.validationMessage).toBe("This field is required")})),n("should return invalid when invalidText is set",(()=>{const t=p({inputEl:e(),required:!1,isEmpty:!1,invalidText:"Custom error message",defaultErrorMessage:""});a(t.isValid).toBe(!1),a(t.validity.customError).toBe(!0),a(t.validationMessage).toBe("Custom error message")})),n("should apply custom validation",(()=>{const t=o.fn().mockReturnValue({valid:!1,message:"Custom validation failed"}),l=p({inputEl:e(),required:!1,isEmpty:!1,invalidText:"",defaultErrorMessage:"",customValidation:t});a(l.isValid).toBe(!1),a(l.validity.customError).toBe(!0),a(l.validationMessage).toBe("Custom validation failed")})),n("should pass when custom validation succeeds",(()=>{const t=o.fn().mockReturnValue({valid:!0}),l=p({inputEl:e(),required:!1,isEmpty:!1,invalidText:"",defaultErrorMessage:"",customValidation:t});a(l.isValid).toBe(!0)}))})),e("mergeTextStrings",(()=>{n("should return defaults when no custom provided",(()=>{const e={a:"default-a",b:"default-b"},t=w(e);a(t).toEqual(e)})),n("should merge custom strings over defaults",(()=>{const e=w({a:"default-a",b:"default-b"},{a:"custom-a"});a(e).toEqual({a:"custom-a",b:"default-b"})})),n("should handle empty custom object",(()=>{const e={a:"default-a",b:"default-b"},t=w(e,{});a(t).toEqual(e)})),n("should not modify original objects",(()=>{const e={a:"default-a",b:"default-b"},t={a:"custom-a"};w(e,t),a(e.a).toBe("default-a"),a(t.a).toBe("custom-a")}))})),e("constants",(()=>{n("should export CONFIG_DEBOUNCE_DELAY",(()=>{a(typeof D).toBe("number"),a(D).toBe(100)})),n("should export RESIZE_DEBOUNCE_DELAY",(()=>{a(typeof y).toBe("number"),a(y).toBe(250)})),n("should export VISIBILITY_CHECK_INTERVAL",(()=>{a(typeof N).toBe("number"),a(N).toBe(250)}))}));
|
|
1
|
+
import{describe as e,beforeEach as t,vi as o,afterEach as l,it as n,expect as a}from"vitest";import{generateRandomId as u,parseDateOnly as s,parseDateTime as r,parseTimeString as i,normalizeToDate as d,isValidDate as h,filterValidDates as f,isEmptyValue as B,shouldSkipManualInputSync as c,timesEqual as m,datesEqual as v,cleanupFlatpickrInstance as p,updateFormValue as g,validatePickerInput as w,mergeTextStrings as D,CONFIG_DEBOUNCE_DELAY as y,RESIZE_DEBOUNCE_DELAY as N,VISIBILITY_CHECK_INTERVAL as T,debounce as E,createFormSubmitListener as M}from"./utils.js";void 0===globalThis.window&&Object.defineProperty(globalThis,"window",{value:{get setTimeout(){return globalThis.setTimeout},get clearTimeout(){return globalThis.clearTimeout}},writable:!0,configurable:!0}),e("debounce",(()=>{t((()=>{o.useFakeTimers()})),l((()=>{o.useRealTimers()})),n("should delay function execution",(()=>{const e=o.fn();E(e,100)(),a(e).not.toHaveBeenCalled(),o.advanceTimersByTime(99),a(e).not.toHaveBeenCalled(),o.advanceTimersByTime(1),a(e).toHaveBeenCalledTimes(1)})),n("should cancel previous calls when called again within wait time",(()=>{const e=o.fn(),t=E(e,100);t(),o.advanceTimersByTime(50),t(),o.advanceTimersByTime(50),a(e).not.toHaveBeenCalled(),o.advanceTimersByTime(50),a(e).toHaveBeenCalledTimes(1)})),n("should pass arguments to the debounced function",(()=>{const e=o.fn();E(e,100)("arg1","arg2"),o.advanceTimersByTime(100),a(e).toHaveBeenCalledWith("arg1","arg2")})),n("should use the latest arguments when called multiple times",(()=>{const e=o.fn(),t=E(e,100);t("first"),t("second"),t("third"),o.advanceTimersByTime(100),a(e).toHaveBeenCalledTimes(1),a(e).toHaveBeenCalledWith("third")}))})),e("generateRandomId",(()=>{n("should generate an ID with the given prefix",(()=>{const e=u("test");a(e).toMatch(/^test-[a-z0-9]+$/)})),n("should generate unique IDs",(()=>{const e=new Set;for(let t=0;t<100;t++)e.add(u("prefix"));a(e.size).toBe(100)})),n("should handle empty prefix",(()=>{const e=u("");a(e).toMatch(/^-[a-z0-9]+$/)})),n("should handle special characters in prefix",(()=>{const e=u("my-picker");a(e).toMatch(/^my-picker-[a-z0-9]+$/)}))})),e("parseDateOnly",(()=>{n("should parse valid Y-m-d format",(()=>{const e=s("2024-03-15");a(e).not.toBeNull(),a(e.getFullYear()).toBe(2024),a(e.getMonth()).toBe(2),a(e.getDate()).toBe(15)})),n("should return null for invalid format",(()=>{a(s("03-15-2024")).toBeNull(),a(s("2024/03/15")).toBeNull(),a(s("2024-3-15")).toBeNull(),a(s("not a date")).toBeNull()})),n("should return null for invalid month",(()=>{a(s("2024-00-15")).toBeNull(),a(s("2024-13-15")).toBeNull()})),n("should return null for invalid day",(()=>{a(s("2024-03-00")).toBeNull(),a(s("2024-03-32")).toBeNull()})),n("should return null for rollover dates",(()=>{a(s("2024-02-31")).toBeNull(),a(s("2024-04-31")).toBeNull()})),n("should handle leap year correctly",(()=>{const e=s("2024-02-29");a(e).not.toBeNull(),a(e.getDate()).toBe(29),a(s("2023-02-29")).toBeNull()}))})),e("parseDateTime",(()=>{n("should parse Y-m-d H:i format",(()=>{const e=r("2024-03-15 14:30");a(e).not.toBeNull(),a(e.getFullYear()).toBe(2024),a(e.getMonth()).toBe(2),a(e.getDate()).toBe(15),a(e.getHours()).toBe(14),a(e.getMinutes()).toBe(30),a(e.getSeconds()).toBe(0)})),n("should parse Y-m-d H:i:s format",(()=>{const e=r("2024-03-15 14:30:45");a(e).not.toBeNull(),a(e.getHours()).toBe(14),a(e.getMinutes()).toBe(30),a(e.getSeconds()).toBe(45)})),n("should parse ISO-like format with T separator",(()=>{const e=r("2024-03-15T14:30");a(e).not.toBeNull(),a(e.getHours()).toBe(14),a(e.getMinutes()).toBe(30)})),n("should return null for invalid time values",(()=>{a(r("2024-03-15 24:00")).toBeNull(),a(r("2024-03-15 14:60")).toBeNull(),a(r("2024-03-15 14:30:60")).toBeNull()})),n("should return null for invalid date portion",(()=>{a(r("2024-13-15 14:30")).toBeNull(),a(r("2024-02-31 14:30")).toBeNull()})),n("should return null for invalid format",(()=>{a(r("2024-03-15")).toBeNull(),a(r("14:30")).toBeNull(),a(r("not a datetime")).toBeNull()}))})),e("parseTimeString",(()=>{n("should return Date objects as-is",(()=>{const e=new Date(2024,2,15,14,30,0),t=i(e);a(t).toBe(e)})),n("should convert timestamps to Date",(()=>{const e=Date.now(),t=i(e);a(t).not.toBeNull(),a(t.getTime()).toBe(e)})),n("should parse 24-hour format (HH:mm)",(()=>{const e=i("14:30");a(e).not.toBeNull(),a(e.getHours()).toBe(14),a(e.getMinutes()).toBe(30)})),n("should parse 24-hour format with seconds (HH:mm:ss)",(()=>{const e=i("14:30:45");a(e).not.toBeNull(),a(e.getHours()).toBe(14),a(e.getMinutes()).toBe(30),a(e.getSeconds()).toBe(45)})),n("should parse 12-hour format with AM",(()=>{const e=i("9:30 AM");a(e).not.toBeNull(),a(e.getHours()).toBe(9),a(e.getMinutes()).toBe(30)})),n("should parse 12-hour format with PM",(()=>{const e=i("2:30 PM");a(e).not.toBeNull(),a(e.getHours()).toBe(14),a(e.getMinutes()).toBe(30)})),n("should handle 12 AM as midnight",(()=>{const e=i("12:00 AM");a(e).not.toBeNull(),a(e.getHours()).toBe(0)})),n("should handle 12 PM as noon",(()=>{const e=i("12:00 PM");a(e).not.toBeNull(),a(e.getHours()).toBe(12)})),n("should be case-insensitive for AM/PM",(()=>{a(i("2:30 pm").getHours()).toBe(14),a(i("2:30 PM").getHours()).toBe(14),a(i("9:30 am").getHours()).toBe(9),a(i("9:30 AM").getHours()).toBe(9)})),n("should return null for invalid time values",(()=>{a(i("25:00")).toBeNull(),a(i("14:60")).toBeNull(),a(i("14:30:60")).toBeNull()})),n("should return null for invalid format",(()=>{a(i("not a time")).toBeNull(),a(i("")).toBeNull()})),n("should return null for invalid number timestamps",(()=>{a(i(NaN)).toBeNull()}))})),e("normalizeToDate",(()=>{n("should return null for falsy values",(()=>{a(d(null)).toBeNull(),a(d(void 0)).toBeNull(),a(d("")).toBeNull()})),n("should return valid Date objects as-is",(()=>{const e=new Date(2024,2,15),t=d(e);a(t).toBe(e)})),n("should return null for invalid Date objects",(()=>{const e=new Date("invalid");a(d(e)).toBeNull()})),n("should convert timestamps to Date",(()=>{const e=Date.now(),t=d(e);a(t.getTime()).toBe(e)})),n("should return null for invalid timestamps",(()=>{a(d(NaN)).toBeNull()})),n("should parse ISO strings",(()=>{const e=d("2024-03-15T14:30:00.000Z");a(e).not.toBeNull(),a(e.getFullYear()).toBe(2024)})),n("should parse date-only strings",(()=>{const e=d("2024-03-15");a(e).not.toBeNull(),a(e.getFullYear()).toBe(2024),a(e.getMonth()).toBe(2),a(e.getDate()).toBe(15)})),n("should parse datetime strings",(()=>{const e=d("2024-03-15 14:30");a(e).not.toBeNull(),a(e.getHours()).toBe(14),a(e.getMinutes()).toBe(30)})),n("should use custom parser when provided",(()=>{const e=o.fn().mockReturnValue(new Date(2024,0,1)),t=d("custom-format",e);a(e).toHaveBeenCalledWith("custom-format"),a(t.getFullYear()).toBe(2024),a(t.getMonth()).toBe(0),a(t.getDate()).toBe(1)}))})),e("isValidDate",(()=>{n("should return true for valid Date objects",(()=>{a(h(new Date)).toBe(!0),a(h(new Date(2024,2,15))).toBe(!0),a(h(new Date("2024-03-15T14:30:00"))).toBe(!0)})),n("should return false for invalid Date objects",(()=>{a(h(new Date("invalid"))).toBe(!1),a(h(new Date(NaN))).toBe(!1)})),n("should return false for null and undefined",(()=>{a(h(null)).toBe(!1),a(h(void 0)).toBe(!1)})),n("should return false for non-Date values",(()=>{a(h("2024-03-15")).toBe(!1),a(h(17104896e5)).toBe(!1),a(h({})).toBe(!1),a(h([])).toBe(!1),a(h(42)).toBe(!1),a(h("")).toBe(!1)})),n("should return false for objects with getTime method that are not Dates",(()=>{a(h({getTime:()=>17104896e5})).toBe(!1)}))})),e("filterValidDates",(()=>{n("should return empty array for empty input",(()=>{a(f([])).toEqual([])})),n("should return all valid Dates from array",(()=>{const e=new Date(2024,2,15),t=new Date(2024,2,16),o=f([e,t]);a(o).toEqual([e,t])})),n("should filter out invalid Dates",(()=>{const e=new Date(2024,2,15),t=new Date("invalid"),o=f([e,t]);a(o).toEqual([e])})),n("should filter out non-Date values",(()=>{const e=new Date(2024,2,15),t=f([e,null,void 0,"2024-03-15",17104896e5,{}]);a(t).toEqual([e])})),n("should return empty array when all values are invalid",(()=>{const e=f([null,void 0,"not a date",new Date("invalid")]);a(e).toEqual([])})),n("should preserve order of valid dates",(()=>{const e=new Date(2024,0,1),t=new Date(2024,5,15),o=new Date(2024,11,31),l=f([e,null,t,"invalid",o]);a(l).toEqual([e,t,o])}))})),e("isEmptyValue",(()=>{n("should return true for null",(()=>{a(B(null)).toBe(!0)})),n("should return true for undefined",(()=>{a(B(void 0)).toBe(!0)})),n("should return true for empty string",(()=>{a(B("")).toBe(!0)})),n("should return true for whitespace-only string",(()=>{a(B(" ")).toBe(!0),a(B("\t\n")).toBe(!0)})),n("should return false for non-empty string",(()=>{a(B("hello")).toBe(!1),a(B(" hello ")).toBe(!1)})),n("should return true for empty array",(()=>{a(B([])).toBe(!0)})),n("should return true for array of null/undefined",(()=>{a(B([null])).toBe(!0),a(B([void 0])).toBe(!0),a(B([null,void 0])).toBe(!0)})),n("should return true for array of empty strings",(()=>{a(B([""])).toBe(!0),a(B([""," "])).toBe(!0)})),n("should return false for array with non-empty values",(()=>{a(B(["value"])).toBe(!1),a(B([null,"value"])).toBe(!1)})),n("should return false for array with Date objects",(()=>{a(B([new Date])).toBe(!1)})),n("should return false for non-empty objects",(()=>{a(B({key:"value"})).toBe(!1)})),n("should return false for numbers",(()=>{a(B(0)).toBe(!1),a(B(42)).toBe(!1)})),n("should return false for Date objects",(()=>{a(B(new Date)).toBe(!1)}))})),e("shouldSkipManualInputSync",(()=>{n("should skip when manual input is disabled",(()=>{a(c({allowManualInput:!1})).toBe(!0)})),n("should skip when clearing is already in progress",(()=>{a(c({allowManualInput:!0,isClearing:!0})).toBe(!0)})),n("should skip when the change originated from flatpickr",(()=>{a(c({allowManualInput:!0,isFromFlatpickr:!0})).toBe(!0)})),n("should skip when syncing a host-controlled value",(()=>{a(c({allowManualInput:!0,isSyncingFromHost:!0})).toBe(!0)})),n("should allow manual sync when no guard is active",(()=>{a(c({allowManualInput:!0})).toBe(!1)}))})),e("timesEqual",(()=>{n("should return true for two null/undefined values",(()=>{a(m(null,null)).toBe(!0),a(m(void 0,void 0)).toBe(!0),a(m(null,void 0)).toBe(!0)})),n("should return false when one is null/undefined",(()=>{a(m(new Date,null)).toBe(!1),a(m(null,new Date)).toBe(!1)})),n("should return true for same time",(()=>{const e=new Date(2024,2,15,14,30,45),t=new Date(2024,5,20,14,30,45);a(m(e,t)).toBe(!0)})),n("should return false for different hours",(()=>{const e=new Date(2024,2,15,14,30,45),t=new Date(2024,2,15,15,30,45);a(m(e,t)).toBe(!1)})),n("should return false for different minutes",(()=>{const e=new Date(2024,2,15,14,30,45),t=new Date(2024,2,15,14,31,45);a(m(e,t)).toBe(!1)})),n("should return false for different seconds",(()=>{const e=new Date(2024,2,15,14,30,45),t=new Date(2024,2,15,14,30,46);a(m(e,t)).toBe(!1)}))})),e("datesEqual",(()=>{n("should return true for two null/undefined values",(()=>{a(v(null,null)).toBe(!0),a(v(void 0,void 0)).toBe(!0),a(v(null,void 0)).toBe(!0)})),n("should return false when one is null/undefined",(()=>{a(v(new Date,null)).toBe(!1),a(v(null,new Date)).toBe(!1)})),n("should return true for same date",(()=>{const e=new Date(2024,2,15,10,0,0),t=new Date(2024,2,15,20,30,45);a(v(e,t)).toBe(!0)})),n("should return false for different year",(()=>{const e=new Date(2024,2,15),t=new Date(2025,2,15);a(v(e,t)).toBe(!1)})),n("should return false for different month",(()=>{const e=new Date(2024,2,15),t=new Date(2024,3,15);a(v(e,t)).toBe(!1)})),n("should return false for different day",(()=>{const e=new Date(2024,2,15),t=new Date(2024,2,16);a(v(e,t)).toBe(!1)}))})),e("cleanupFlatpickrInstance",(()=>{n("should handle undefined instance",(()=>{a((()=>p(void 0))).not.toThrow()})),n("should call destroy on instance",(()=>{const e={destroy:o.fn()};p(e),a(e.destroy).toHaveBeenCalled()})),n("should remove anchor click handlers",(()=>{const e={el:{removeEventListener:o.fn()},fn:o.fn()},t={el:{removeEventListener:o.fn()},fn:o.fn()},l={destroy:o.fn(),__anchorClickHandlers:[e,t]};p(l),a(e.el.removeEventListener).toHaveBeenCalledWith("click",e.fn),a(t.el.removeEventListener).toHaveBeenCalledWith("click",t.fn)})),n("should handle missing anchor click handlers",(()=>{const e={destroy:o.fn()};a((()=>p(e))).not.toThrow()})),n("should handle errors during handler removal",(()=>{const e={el:{removeEventListener:o.fn().mockImplementation((()=>{throw new Error("Test error")}))},fn:o.fn()},t={destroy:o.fn(),__anchorClickHandlers:[e]};a((()=>p(t))).not.toThrow(),a(t.destroy).toHaveBeenCalled()}))})),e("updateFormValue",(()=>{n("should set form value when both internals and input exist",(()=>{const e={setFormValue:o.fn()};g(e,{value:"test-value"}),a(e.setFormValue).toHaveBeenCalledWith("test-value")})),n("should do nothing when internals is undefined",(()=>{const e={value:"test-value"};a((()=>g(void 0,e))).not.toThrow()})),n("should do nothing when input is null",(()=>{const e={setFormValue:o.fn()};a((()=>g(e,null))).not.toThrow(),a(e.setFormValue).not.toHaveBeenCalled()}))})),e("createFormSubmitListener",(()=>{n("should call validate function with interacted=true and report=true",(()=>{const e=o.fn(),t=o.fn().mockReturnValue(!0),l=o.fn().mockReturnValue(!1);M(e,t,l)({preventDefault:o.fn()}),a(e).toHaveBeenCalledWith(!0,!0)})),n("should prevent default when validity check fails",(()=>{const e=o.fn(),t=o.fn().mockReturnValue(!1),l=o.fn().mockReturnValue(!1),n=M(e,t,l),u={preventDefault:o.fn()};n(u),a(u.preventDefault).toHaveBeenCalled()})),n("should prevent default when required check fails",(()=>{const e=o.fn(),t=o.fn().mockReturnValue(!0),l=o.fn().mockReturnValue(!0),n=M(e,t,l),u={preventDefault:o.fn()};n(u),a(u.preventDefault).toHaveBeenCalled()})),n("should not prevent default when valid",(()=>{const e=o.fn(),t=o.fn().mockReturnValue(!0),l=o.fn().mockReturnValue(!1),n=M(e,t,l),u={preventDefault:o.fn()};n(u),a(u.preventDefault).not.toHaveBeenCalled()}))})),e("validatePickerInput",(()=>{const e=(e={})=>({validity:{valueMissing:!1,customError:!1,...e},validationMessage:""});n("should return valid result for non-required empty field",(()=>{const t=w({inputEl:e(),required:!1,isEmpty:!0,invalidText:"",defaultErrorMessage:""});a(t.isValid).toBe(!0)})),n("should return invalid for required empty field",(()=>{const t=w({inputEl:e(),required:!0,isEmpty:!0,invalidText:"",defaultErrorMessage:"Field is required"});a(t.isValid).toBe(!1),a(t.validity.valueMissing).toBe(!0),a(t.validationMessage).toBe("Field is required")})),n("should use default message when no custom message provided",(()=>{const t=w({inputEl:e(),required:!0,isEmpty:!0,invalidText:"",defaultErrorMessage:""});a(t.validationMessage).toBe("This field is required")})),n("should return invalid when invalidText is set",(()=>{const t=w({inputEl:e(),required:!1,isEmpty:!1,invalidText:"Custom error message",defaultErrorMessage:""});a(t.isValid).toBe(!1),a(t.validity.customError).toBe(!0),a(t.validationMessage).toBe("Custom error message")})),n("should apply custom validation",(()=>{const t=o.fn().mockReturnValue({valid:!1,message:"Custom validation failed"}),l=w({inputEl:e(),required:!1,isEmpty:!1,invalidText:"",defaultErrorMessage:"",customValidation:t});a(l.isValid).toBe(!1),a(l.validity.customError).toBe(!0),a(l.validationMessage).toBe("Custom validation failed")})),n("should pass when custom validation succeeds",(()=>{const t=o.fn().mockReturnValue({valid:!0}),l=w({inputEl:e(),required:!1,isEmpty:!1,invalidText:"",defaultErrorMessage:"",customValidation:t});a(l.isValid).toBe(!0)}))})),e("mergeTextStrings",(()=>{n("should return defaults when no custom provided",(()=>{const e={a:"default-a",b:"default-b"},t=D(e);a(t).toEqual(e)})),n("should merge custom strings over defaults",(()=>{const e=D({a:"default-a",b:"default-b"},{a:"custom-a"});a(e).toEqual({a:"custom-a",b:"default-b"})})),n("should handle empty custom object",(()=>{const e={a:"default-a",b:"default-b"},t=D(e,{});a(t).toEqual(e)})),n("should not modify original objects",(()=>{const e={a:"default-a",b:"default-b"},t={a:"custom-a"};D(e,t),a(e.a).toBe("default-a"),a(t.a).toBe("custom-a")}))})),e("constants",(()=>{n("should export CONFIG_DEBOUNCE_DELAY",(()=>{a(typeof y).toBe("number"),a(y).toBe(100)})),n("should export RESIZE_DEBOUNCE_DELAY",(()=>{a(typeof N).toBe("number"),a(N).toBe(250)})),n("should export VISIBILITY_CHECK_INTERVAL",(()=>{a(typeof T).toBe("number"),a(T).toBe(250)}))}));
|
|
2
2
|
//# sourceMappingURL=utils.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.test.js","sources":["../../../../src/common/helpers/flatpickr/utils.test.ts"],"sourcesContent":["/**\n * Unit tests for flatpickr utility functions.\n * Tests cover debounce, ID generation, date parsing, value checking,\n * flatpickr instance cleanup, form integration, and validation utilities.\n */\n\nimport { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';\n\n// Mock window for node environment (debounce uses window.setTimeout/clearTimeout)\n// We need to set this up before importing utils, so use a getter that always\n// returns the current global timer functions (which vitest will mock)\nif (typeof globalThis.window === 'undefined') {\n Object.defineProperty(globalThis, 'window', {\n value: {\n get setTimeout() {\n return globalThis.setTimeout;\n },\n get clearTimeout() {\n return globalThis.clearTimeout;\n },\n },\n writable: true,\n configurable: true,\n });\n}\n\nimport {\n debounce,\n generateRandomId,\n parseDateOnly,\n parseDateTime,\n parseTimeString,\n normalizeToDate,\n isValidDate,\n filterValidDates,\n isEmptyValue,\n timesEqual,\n datesEqual,\n cleanupFlatpickrInstance,\n updateFormValue,\n createFormSubmitListener,\n validatePickerInput,\n mergeTextStrings,\n CONFIG_DEBOUNCE_DELAY,\n RESIZE_DEBOUNCE_DELAY,\n VISIBILITY_CHECK_INTERVAL,\n} from './utils';\n\n// ============================================================================\n// DEBOUNCE TESTS\n// ============================================================================\n\ndescribe('debounce', () => {\n beforeEach(() => {\n vi.useFakeTimers();\n });\n\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it('should delay function execution', () => {\n const fn = vi.fn();\n const debounced = debounce(fn, 100);\n\n debounced();\n expect(fn).not.toHaveBeenCalled();\n\n vi.advanceTimersByTime(99);\n expect(fn).not.toHaveBeenCalled();\n\n vi.advanceTimersByTime(1);\n expect(fn).toHaveBeenCalledTimes(1);\n });\n\n it('should cancel previous calls when called again within wait time', () => {\n const fn = vi.fn();\n const debounced = debounce(fn, 100);\n\n debounced();\n vi.advanceTimersByTime(50);\n debounced();\n vi.advanceTimersByTime(50);\n\n expect(fn).not.toHaveBeenCalled();\n\n vi.advanceTimersByTime(50);\n expect(fn).toHaveBeenCalledTimes(1);\n });\n\n it('should pass arguments to the debounced function', () => {\n const fn = vi.fn();\n const debounced = debounce(fn, 100);\n\n debounced('arg1', 'arg2');\n vi.advanceTimersByTime(100);\n\n expect(fn).toHaveBeenCalledWith('arg1', 'arg2');\n });\n\n it('should use the latest arguments when called multiple times', () => {\n const fn = vi.fn();\n const debounced = debounce(fn, 100);\n\n debounced('first');\n debounced('second');\n debounced('third');\n\n vi.advanceTimersByTime(100);\n expect(fn).toHaveBeenCalledTimes(1);\n expect(fn).toHaveBeenCalledWith('third');\n });\n});\n\n// ============================================================================\n// ID GENERATION TESTS\n// ============================================================================\n\ndescribe('generateRandomId', () => {\n it('should generate an ID with the given prefix', () => {\n const id = generateRandomId('test');\n expect(id).toMatch(/^test-[a-z0-9]+$/);\n });\n\n it('should generate unique IDs', () => {\n const ids = new Set();\n for (let i = 0; i < 100; i++) {\n ids.add(generateRandomId('prefix'));\n }\n expect(ids.size).toBe(100);\n });\n\n it('should handle empty prefix', () => {\n const id = generateRandomId('');\n expect(id).toMatch(/^-[a-z0-9]+$/);\n });\n\n it('should handle special characters in prefix', () => {\n const id = generateRandomId('my-picker');\n expect(id).toMatch(/^my-picker-[a-z0-9]+$/);\n });\n});\n\n// ============================================================================\n// DATE PARSING TESTS\n// ============================================================================\n\ndescribe('parseDateOnly', () => {\n it('should parse valid Y-m-d format', () => {\n const date = parseDateOnly('2024-03-15');\n expect(date).not.toBeNull();\n expect(date!.getFullYear()).toBe(2024);\n expect(date!.getMonth()).toBe(2); // 0-indexed\n expect(date!.getDate()).toBe(15);\n });\n\n it('should return null for invalid format', () => {\n expect(parseDateOnly('03-15-2024')).toBeNull();\n expect(parseDateOnly('2024/03/15')).toBeNull();\n expect(parseDateOnly('2024-3-15')).toBeNull();\n expect(parseDateOnly('not a date')).toBeNull();\n });\n\n it('should return null for invalid month', () => {\n expect(parseDateOnly('2024-00-15')).toBeNull();\n expect(parseDateOnly('2024-13-15')).toBeNull();\n });\n\n it('should return null for invalid day', () => {\n expect(parseDateOnly('2024-03-00')).toBeNull();\n expect(parseDateOnly('2024-03-32')).toBeNull();\n });\n\n it('should return null for rollover dates', () => {\n // Feb 31 would roll over to Mar 2 or 3\n expect(parseDateOnly('2024-02-31')).toBeNull();\n // Apr 31 would roll over to May 1\n expect(parseDateOnly('2024-04-31')).toBeNull();\n });\n\n it('should handle leap year correctly', () => {\n // 2024 is a leap year\n const leapDate = parseDateOnly('2024-02-29');\n expect(leapDate).not.toBeNull();\n expect(leapDate!.getDate()).toBe(29);\n\n // 2023 is not a leap year\n expect(parseDateOnly('2023-02-29')).toBeNull();\n });\n});\n\ndescribe('parseDateTime', () => {\n it('should parse Y-m-d H:i format', () => {\n const dt = parseDateTime('2024-03-15 14:30');\n expect(dt).not.toBeNull();\n expect(dt!.getFullYear()).toBe(2024);\n expect(dt!.getMonth()).toBe(2);\n expect(dt!.getDate()).toBe(15);\n expect(dt!.getHours()).toBe(14);\n expect(dt!.getMinutes()).toBe(30);\n expect(dt!.getSeconds()).toBe(0);\n });\n\n it('should parse Y-m-d H:i:s format', () => {\n const dt = parseDateTime('2024-03-15 14:30:45');\n expect(dt).not.toBeNull();\n expect(dt!.getHours()).toBe(14);\n expect(dt!.getMinutes()).toBe(30);\n expect(dt!.getSeconds()).toBe(45);\n });\n\n it('should parse ISO-like format with T separator', () => {\n const dt = parseDateTime('2024-03-15T14:30');\n expect(dt).not.toBeNull();\n expect(dt!.getHours()).toBe(14);\n expect(dt!.getMinutes()).toBe(30);\n });\n\n it('should return null for invalid time values', () => {\n expect(parseDateTime('2024-03-15 24:00')).toBeNull();\n expect(parseDateTime('2024-03-15 14:60')).toBeNull();\n expect(parseDateTime('2024-03-15 14:30:60')).toBeNull();\n });\n\n it('should return null for invalid date portion', () => {\n expect(parseDateTime('2024-13-15 14:30')).toBeNull();\n expect(parseDateTime('2024-02-31 14:30')).toBeNull();\n });\n\n it('should return null for invalid format', () => {\n expect(parseDateTime('2024-03-15')).toBeNull();\n expect(parseDateTime('14:30')).toBeNull();\n expect(parseDateTime('not a datetime')).toBeNull();\n });\n});\n\ndescribe('parseTimeString', () => {\n it('should return Date objects as-is', () => {\n const date = new Date(2024, 2, 15, 14, 30, 0);\n const result = parseTimeString(date);\n expect(result).toBe(date);\n });\n\n it('should convert timestamps to Date', () => {\n const timestamp = Date.now();\n const result = parseTimeString(timestamp);\n expect(result).not.toBeNull();\n expect(result!.getTime()).toBe(timestamp);\n });\n\n it('should parse 24-hour format (HH:mm)', () => {\n const result = parseTimeString('14:30');\n expect(result).not.toBeNull();\n expect(result!.getHours()).toBe(14);\n expect(result!.getMinutes()).toBe(30);\n });\n\n it('should parse 24-hour format with seconds (HH:mm:ss)', () => {\n const result = parseTimeString('14:30:45');\n expect(result).not.toBeNull();\n expect(result!.getHours()).toBe(14);\n expect(result!.getMinutes()).toBe(30);\n expect(result!.getSeconds()).toBe(45);\n });\n\n it('should parse 12-hour format with AM', () => {\n const result = parseTimeString('9:30 AM');\n expect(result).not.toBeNull();\n expect(result!.getHours()).toBe(9);\n expect(result!.getMinutes()).toBe(30);\n });\n\n it('should parse 12-hour format with PM', () => {\n const result = parseTimeString('2:30 PM');\n expect(result).not.toBeNull();\n expect(result!.getHours()).toBe(14);\n expect(result!.getMinutes()).toBe(30);\n });\n\n it('should handle 12 AM as midnight', () => {\n const result = parseTimeString('12:00 AM');\n expect(result).not.toBeNull();\n expect(result!.getHours()).toBe(0);\n });\n\n it('should handle 12 PM as noon', () => {\n const result = parseTimeString('12:00 PM');\n expect(result).not.toBeNull();\n expect(result!.getHours()).toBe(12);\n });\n\n it('should be case-insensitive for AM/PM', () => {\n expect(parseTimeString('2:30 pm')!.getHours()).toBe(14);\n expect(parseTimeString('2:30 PM')!.getHours()).toBe(14);\n expect(parseTimeString('9:30 am')!.getHours()).toBe(9);\n expect(parseTimeString('9:30 AM')!.getHours()).toBe(9);\n });\n\n it('should return null for invalid time values', () => {\n expect(parseTimeString('25:00')).toBeNull();\n expect(parseTimeString('14:60')).toBeNull();\n expect(parseTimeString('14:30:60')).toBeNull();\n });\n\n it('should return null for invalid format', () => {\n expect(parseTimeString('not a time')).toBeNull();\n expect(parseTimeString('')).toBeNull();\n });\n\n it('should return null for invalid number timestamps', () => {\n expect(parseTimeString(NaN)).toBeNull();\n });\n});\n\ndescribe('normalizeToDate', () => {\n it('should return null for falsy values', () => {\n expect(normalizeToDate(null)).toBeNull();\n expect(normalizeToDate(undefined)).toBeNull();\n expect(normalizeToDate('')).toBeNull();\n });\n\n it('should return valid Date objects as-is', () => {\n const date = new Date(2024, 2, 15);\n const result = normalizeToDate(date);\n expect(result).toBe(date);\n });\n\n it('should return null for invalid Date objects', () => {\n const invalidDate = new Date('invalid');\n expect(normalizeToDate(invalidDate)).toBeNull();\n });\n\n it('should convert timestamps to Date', () => {\n const timestamp = Date.now();\n const result = normalizeToDate(timestamp);\n expect(result!.getTime()).toBe(timestamp);\n });\n\n it('should return null for invalid timestamps', () => {\n expect(normalizeToDate(NaN)).toBeNull();\n });\n\n it('should parse ISO strings', () => {\n const result = normalizeToDate('2024-03-15T14:30:00.000Z');\n expect(result).not.toBeNull();\n expect(result!.getFullYear()).toBe(2024);\n });\n\n it('should parse date-only strings', () => {\n const result = normalizeToDate('2024-03-15');\n expect(result).not.toBeNull();\n expect(result!.getFullYear()).toBe(2024);\n expect(result!.getMonth()).toBe(2);\n expect(result!.getDate()).toBe(15);\n });\n\n it('should parse datetime strings', () => {\n const result = normalizeToDate('2024-03-15 14:30');\n expect(result).not.toBeNull();\n expect(result!.getHours()).toBe(14);\n expect(result!.getMinutes()).toBe(30);\n });\n\n it('should use custom parser when provided', () => {\n const customParser = vi.fn().mockReturnValue(new Date(2024, 0, 1));\n const result = normalizeToDate('custom-format', customParser);\n\n expect(customParser).toHaveBeenCalledWith('custom-format');\n expect(result!.getFullYear()).toBe(2024);\n expect(result!.getMonth()).toBe(0);\n expect(result!.getDate()).toBe(1);\n });\n});\n\n// ============================================================================\n// VALUE CHECKING TESTS\n// ============================================================================\n\ndescribe('isValidDate', () => {\n it('should return true for valid Date objects', () => {\n expect(isValidDate(new Date())).toBe(true);\n expect(isValidDate(new Date(2024, 2, 15))).toBe(true);\n expect(isValidDate(new Date('2024-03-15T14:30:00'))).toBe(true);\n });\n\n it('should return false for invalid Date objects', () => {\n expect(isValidDate(new Date('invalid'))).toBe(false);\n expect(isValidDate(new Date(NaN))).toBe(false);\n });\n\n it('should return false for null and undefined', () => {\n expect(isValidDate(null)).toBe(false);\n expect(isValidDate(undefined)).toBe(false);\n });\n\n it('should return false for non-Date values', () => {\n expect(isValidDate('2024-03-15')).toBe(false);\n expect(isValidDate(1710489600000)).toBe(false);\n expect(isValidDate({})).toBe(false);\n expect(isValidDate([])).toBe(false);\n expect(isValidDate(42)).toBe(false);\n expect(isValidDate('')).toBe(false);\n });\n\n it('should return false for objects with getTime method that are not Dates', () => {\n const fakeDateLike = { getTime: () => 1710489600000 };\n expect(isValidDate(fakeDateLike)).toBe(false);\n });\n});\n\ndescribe('filterValidDates', () => {\n it('should return empty array for empty input', () => {\n expect(filterValidDates([])).toEqual([]);\n });\n\n it('should return all valid Dates from array', () => {\n const date1 = new Date(2024, 2, 15);\n const date2 = new Date(2024, 2, 16);\n const result = filterValidDates([date1, date2]);\n expect(result).toEqual([date1, date2]);\n });\n\n it('should filter out invalid Dates', () => {\n const validDate = new Date(2024, 2, 15);\n const invalidDate = new Date('invalid');\n const result = filterValidDates([validDate, invalidDate]);\n expect(result).toEqual([validDate]);\n });\n\n it('should filter out non-Date values', () => {\n const validDate = new Date(2024, 2, 15);\n const result = filterValidDates([\n validDate,\n null,\n undefined,\n '2024-03-15',\n 1710489600000,\n {},\n ]);\n expect(result).toEqual([validDate]);\n });\n\n it('should return empty array when all values are invalid', () => {\n const result = filterValidDates([\n null,\n undefined,\n 'not a date',\n new Date('invalid'),\n ]);\n expect(result).toEqual([]);\n });\n\n it('should preserve order of valid dates', () => {\n const date1 = new Date(2024, 0, 1);\n const date2 = new Date(2024, 5, 15);\n const date3 = new Date(2024, 11, 31);\n const result = filterValidDates([date1, null, date2, 'invalid', date3]);\n expect(result).toEqual([date1, date2, date3]);\n });\n});\n\ndescribe('isEmptyValue', () => {\n it('should return true for null', () => {\n expect(isEmptyValue(null)).toBe(true);\n });\n\n it('should return true for undefined', () => {\n expect(isEmptyValue(undefined)).toBe(true);\n });\n\n it('should return true for empty string', () => {\n expect(isEmptyValue('')).toBe(true);\n });\n\n it('should return true for whitespace-only string', () => {\n expect(isEmptyValue(' ')).toBe(true);\n expect(isEmptyValue('\\t\\n')).toBe(true);\n });\n\n it('should return false for non-empty string', () => {\n expect(isEmptyValue('hello')).toBe(false);\n expect(isEmptyValue(' hello ')).toBe(false);\n });\n\n it('should return true for empty array', () => {\n expect(isEmptyValue([])).toBe(true);\n });\n\n it('should return true for array of null/undefined', () => {\n expect(isEmptyValue([null])).toBe(true);\n expect(isEmptyValue([undefined])).toBe(true);\n expect(isEmptyValue([null, undefined])).toBe(true);\n });\n\n it('should return true for array of empty strings', () => {\n expect(isEmptyValue([''])).toBe(true);\n expect(isEmptyValue(['', ' '])).toBe(true);\n });\n\n it('should return false for array with non-empty values', () => {\n expect(isEmptyValue(['value'])).toBe(false);\n expect(isEmptyValue([null, 'value'])).toBe(false);\n });\n\n it('should return false for array with Date objects', () => {\n expect(isEmptyValue([new Date()])).toBe(false);\n });\n\n it('should return false for non-empty objects', () => {\n expect(isEmptyValue({ key: 'value' })).toBe(false);\n });\n\n it('should return false for numbers', () => {\n expect(isEmptyValue(0)).toBe(false);\n expect(isEmptyValue(42)).toBe(false);\n });\n\n it('should return false for Date objects', () => {\n expect(isEmptyValue(new Date())).toBe(false);\n });\n});\n\ndescribe('timesEqual', () => {\n it('should return true for two null/undefined values', () => {\n expect(timesEqual(null, null)).toBe(true);\n expect(timesEqual(undefined, undefined)).toBe(true);\n expect(timesEqual(null, undefined)).toBe(true);\n });\n\n it('should return false when one is null/undefined', () => {\n expect(timesEqual(new Date(), null)).toBe(false);\n expect(timesEqual(null, new Date())).toBe(false);\n });\n\n it('should return true for same time', () => {\n const a = new Date(2024, 2, 15, 14, 30, 45);\n const b = new Date(2024, 5, 20, 14, 30, 45); // Different date, same time\n expect(timesEqual(a, b)).toBe(true);\n });\n\n it('should return false for different hours', () => {\n const a = new Date(2024, 2, 15, 14, 30, 45);\n const b = new Date(2024, 2, 15, 15, 30, 45);\n expect(timesEqual(a, b)).toBe(false);\n });\n\n it('should return false for different minutes', () => {\n const a = new Date(2024, 2, 15, 14, 30, 45);\n const b = new Date(2024, 2, 15, 14, 31, 45);\n expect(timesEqual(a, b)).toBe(false);\n });\n\n it('should return false for different seconds', () => {\n const a = new Date(2024, 2, 15, 14, 30, 45);\n const b = new Date(2024, 2, 15, 14, 30, 46);\n expect(timesEqual(a, b)).toBe(false);\n });\n});\n\ndescribe('datesEqual', () => {\n it('should return true for two null/undefined values', () => {\n expect(datesEqual(null, null)).toBe(true);\n expect(datesEqual(undefined, undefined)).toBe(true);\n expect(datesEqual(null, undefined)).toBe(true);\n });\n\n it('should return false when one is null/undefined', () => {\n expect(datesEqual(new Date(), null)).toBe(false);\n expect(datesEqual(null, new Date())).toBe(false);\n });\n\n it('should return true for same date', () => {\n const a = new Date(2024, 2, 15, 10, 0, 0);\n const b = new Date(2024, 2, 15, 20, 30, 45); // Different time, same date\n expect(datesEqual(a, b)).toBe(true);\n });\n\n it('should return false for different year', () => {\n const a = new Date(2024, 2, 15);\n const b = new Date(2025, 2, 15);\n expect(datesEqual(a, b)).toBe(false);\n });\n\n it('should return false for different month', () => {\n const a = new Date(2024, 2, 15);\n const b = new Date(2024, 3, 15);\n expect(datesEqual(a, b)).toBe(false);\n });\n\n it('should return false for different day', () => {\n const a = new Date(2024, 2, 15);\n const b = new Date(2024, 2, 16);\n expect(datesEqual(a, b)).toBe(false);\n });\n});\n\n// ============================================================================\n// FLATPICKR INSTANCE TESTS\n// ============================================================================\n\ndescribe('cleanupFlatpickrInstance', () => {\n it('should handle undefined instance', () => {\n expect(() => cleanupFlatpickrInstance(undefined)).not.toThrow();\n });\n\n it('should call destroy on instance', () => {\n const mockInstance = {\n destroy: vi.fn(),\n };\n cleanupFlatpickrInstance(mockInstance as any);\n expect(mockInstance.destroy).toHaveBeenCalled();\n });\n\n it('should remove anchor click handlers', () => {\n const mockHandler1 = { el: { removeEventListener: vi.fn() }, fn: vi.fn() };\n const mockHandler2 = { el: { removeEventListener: vi.fn() }, fn: vi.fn() };\n\n const mockInstance = {\n destroy: vi.fn(),\n __anchorClickHandlers: [mockHandler1, mockHandler2],\n };\n\n cleanupFlatpickrInstance(mockInstance as any);\n\n expect(mockHandler1.el.removeEventListener).toHaveBeenCalledWith(\n 'click',\n mockHandler1.fn\n );\n expect(mockHandler2.el.removeEventListener).toHaveBeenCalledWith(\n 'click',\n mockHandler2.fn\n );\n });\n\n it('should handle missing anchor click handlers', () => {\n const mockInstance = {\n destroy: vi.fn(),\n };\n expect(() => cleanupFlatpickrInstance(mockInstance as any)).not.toThrow();\n });\n\n it('should handle errors during handler removal', () => {\n const mockHandler = {\n el: {\n removeEventListener: vi.fn().mockImplementation(() => {\n throw new Error('Test error');\n }),\n },\n fn: vi.fn(),\n };\n\n const mockInstance = {\n destroy: vi.fn(),\n __anchorClickHandlers: [mockHandler],\n };\n\n expect(() => cleanupFlatpickrInstance(mockInstance as any)).not.toThrow();\n expect(mockInstance.destroy).toHaveBeenCalled();\n });\n});\n\n// ============================================================================\n// FORM INTEGRATION TESTS\n// ============================================================================\n\ndescribe('updateFormValue', () => {\n it('should set form value when both internals and input exist', () => {\n const mockInternals = {\n setFormValue: vi.fn(),\n };\n const mockInput = {\n value: 'test-value',\n };\n\n updateFormValue(mockInternals as any, mockInput as any);\n expect(mockInternals.setFormValue).toHaveBeenCalledWith('test-value');\n });\n\n it('should do nothing when internals is undefined', () => {\n const mockInput = { value: 'test-value' };\n expect(() => updateFormValue(undefined, mockInput as any)).not.toThrow();\n });\n\n it('should do nothing when input is null', () => {\n const mockInternals = { setFormValue: vi.fn() };\n expect(() => updateFormValue(mockInternals as any, null)).not.toThrow();\n expect(mockInternals.setFormValue).not.toHaveBeenCalled();\n });\n});\n\ndescribe('createFormSubmitListener', () => {\n it('should call validate function with interacted=true and report=true', () => {\n const validateFn = vi.fn();\n const checkValidityFn = vi.fn().mockReturnValue(true);\n const requiredCheck = vi.fn().mockReturnValue(false);\n\n const listener = createFormSubmitListener(\n validateFn,\n checkValidityFn,\n requiredCheck\n );\n const mockEvent = { preventDefault: vi.fn() } as any;\n\n listener(mockEvent);\n\n expect(validateFn).toHaveBeenCalledWith(true, true);\n });\n\n it('should prevent default when validity check fails', () => {\n const validateFn = vi.fn();\n const checkValidityFn = vi.fn().mockReturnValue(false);\n const requiredCheck = vi.fn().mockReturnValue(false);\n\n const listener = createFormSubmitListener(\n validateFn,\n checkValidityFn,\n requiredCheck\n );\n const mockEvent = { preventDefault: vi.fn() } as any;\n\n listener(mockEvent);\n\n expect(mockEvent.preventDefault).toHaveBeenCalled();\n });\n\n it('should prevent default when required check fails', () => {\n const validateFn = vi.fn();\n const checkValidityFn = vi.fn().mockReturnValue(true);\n const requiredCheck = vi.fn().mockReturnValue(true);\n\n const listener = createFormSubmitListener(\n validateFn,\n checkValidityFn,\n requiredCheck\n );\n const mockEvent = { preventDefault: vi.fn() } as any;\n\n listener(mockEvent);\n\n expect(mockEvent.preventDefault).toHaveBeenCalled();\n });\n\n it('should not prevent default when valid', () => {\n const validateFn = vi.fn();\n const checkValidityFn = vi.fn().mockReturnValue(true);\n const requiredCheck = vi.fn().mockReturnValue(false);\n\n const listener = createFormSubmitListener(\n validateFn,\n checkValidityFn,\n requiredCheck\n );\n const mockEvent = { preventDefault: vi.fn() } as any;\n\n listener(mockEvent);\n\n expect(mockEvent.preventDefault).not.toHaveBeenCalled();\n });\n});\n\n// ============================================================================\n// VALIDATION TESTS\n// ============================================================================\n\ndescribe('validatePickerInput', () => {\n const createMockInput = (validity: Partial<ValidityState> = {}) => {\n return {\n validity: {\n valueMissing: false,\n customError: false,\n ...validity,\n } as ValidityState,\n validationMessage: '',\n } as HTMLInputElement;\n };\n\n it('should return valid result for non-required empty field', () => {\n const result = validatePickerInput({\n inputEl: createMockInput(),\n required: false,\n isEmpty: true,\n invalidText: '',\n defaultErrorMessage: '',\n hasInteracted: false,\n });\n\n expect(result.isValid).toBe(true);\n });\n\n it('should return invalid for required empty field', () => {\n const result = validatePickerInput({\n inputEl: createMockInput(),\n required: true,\n isEmpty: true,\n invalidText: '',\n defaultErrorMessage: 'Field is required',\n hasInteracted: true,\n });\n\n expect(result.isValid).toBe(false);\n expect(result.validity.valueMissing).toBe(true);\n expect(result.validationMessage).toBe('Field is required');\n });\n\n it('should use default message when no custom message provided', () => {\n const result = validatePickerInput({\n inputEl: createMockInput(),\n required: true,\n isEmpty: true,\n invalidText: '',\n defaultErrorMessage: '',\n hasInteracted: true,\n });\n\n expect(result.validationMessage).toBe('This field is required');\n });\n\n it('should return invalid when invalidText is set', () => {\n const result = validatePickerInput({\n inputEl: createMockInput(),\n required: false,\n isEmpty: false,\n invalidText: 'Custom error message',\n defaultErrorMessage: '',\n hasInteracted: true,\n });\n\n expect(result.isValid).toBe(false);\n expect(result.validity.customError).toBe(true);\n expect(result.validationMessage).toBe('Custom error message');\n });\n\n it('should apply custom validation', () => {\n const customValidation = vi\n .fn()\n .mockReturnValue({ valid: false, message: 'Custom validation failed' });\n\n const result = validatePickerInput({\n inputEl: createMockInput(),\n required: false,\n isEmpty: false,\n invalidText: '',\n defaultErrorMessage: '',\n hasInteracted: true,\n customValidation,\n });\n\n expect(result.isValid).toBe(false);\n expect(result.validity.customError).toBe(true);\n expect(result.validationMessage).toBe('Custom validation failed');\n });\n\n it('should pass when custom validation succeeds', () => {\n const customValidation = vi.fn().mockReturnValue({ valid: true });\n\n const result = validatePickerInput({\n inputEl: createMockInput(),\n required: false,\n isEmpty: false,\n invalidText: '',\n defaultErrorMessage: '',\n hasInteracted: true,\n customValidation,\n });\n\n expect(result.isValid).toBe(true);\n });\n});\n\n// ============================================================================\n// TEXT STRINGS TESTS\n// ============================================================================\n\ndescribe('mergeTextStrings', () => {\n it('should return defaults when no custom provided', () => {\n const defaults = { a: 'default-a', b: 'default-b' };\n const result = mergeTextStrings(defaults);\n expect(result).toEqual(defaults);\n });\n\n it('should merge custom strings over defaults', () => {\n const defaults = { a: 'default-a', b: 'default-b' };\n const custom = { a: 'custom-a' };\n const result = mergeTextStrings(defaults, custom);\n expect(result).toEqual({ a: 'custom-a', b: 'default-b' });\n });\n\n it('should handle empty custom object', () => {\n const defaults = { a: 'default-a', b: 'default-b' };\n const result = mergeTextStrings(defaults, {});\n expect(result).toEqual(defaults);\n });\n\n it('should not modify original objects', () => {\n const defaults = { a: 'default-a', b: 'default-b' };\n const custom = { a: 'custom-a' };\n mergeTextStrings(defaults, custom);\n expect(defaults.a).toBe('default-a');\n expect(custom.a).toBe('custom-a');\n });\n});\n\n// ============================================================================\n// CONSTANTS TESTS\n// ============================================================================\n\ndescribe('constants', () => {\n it('should export CONFIG_DEBOUNCE_DELAY', () => {\n expect(typeof CONFIG_DEBOUNCE_DELAY).toBe('number');\n expect(CONFIG_DEBOUNCE_DELAY).toBe(100);\n });\n\n it('should export RESIZE_DEBOUNCE_DELAY', () => {\n expect(typeof RESIZE_DEBOUNCE_DELAY).toBe('number');\n expect(RESIZE_DEBOUNCE_DELAY).toBe(250);\n });\n\n it('should export VISIBILITY_CHECK_INTERVAL', () => {\n expect(typeof VISIBILITY_CHECK_INTERVAL).toBe('number');\n expect(VISIBILITY_CHECK_INTERVAL).toBe(250);\n });\n});\n"],"names":["globalThis","window","Object","defineProperty","value","setTimeout","clearTimeout","writable","configurable","describe","beforeEach","vi","useFakeTimers","afterEach","useRealTimers","it","fn","debounce","debounced","expect","not","toHaveBeenCalled","advanceTimersByTime","toHaveBeenCalledTimes","toHaveBeenCalledWith","id","generateRandomId","toMatch","ids","Set","i","add","size","toBe","date","parseDateOnly","toBeNull","getFullYear","getMonth","getDate","leapDate","dt","parseDateTime","getHours","getMinutes","getSeconds","Date","result","parseTimeString","timestamp","now","getTime","NaN","normalizeToDate","undefined","invalidDate","customParser","mockReturnValue","isValidDate","filterValidDates","toEqual","date1","date2","validDate","date3","isEmptyValue","key","timesEqual","a","b","datesEqual","cleanupFlatpickrInstance","toThrow","mockInstance","destroy","mockHandler1","el","removeEventListener","mockHandler2","__anchorClickHandlers","mockHandler","mockImplementation","Error","mockInternals","setFormValue","updateFormValue","mockInput","validateFn","checkValidityFn","requiredCheck","createFormSubmitListener","listener","preventDefault","mockEvent","createMockInput","validity","valueMissing","customError","validationMessage","validatePickerInput","inputEl","required","isEmpty","invalidText","defaultErrorMessage","isValid","customValidation","valid","message","defaults","mergeTextStrings","custom","CONFIG_DEBOUNCE_DELAY","RESIZE_DEBOUNCE_DELAY","VISIBILITY_CHECK_INTERVAL"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.test.js","sources":["../../../../src/common/helpers/flatpickr/utils.test.ts"],"sourcesContent":["/**\n * Unit tests for flatpickr utility functions.\n * Tests cover debounce, ID generation, date parsing, value checking,\n * flatpickr instance cleanup, form integration, and validation utilities.\n */\n\nimport { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';\n\n// Mock window for node environment (debounce uses window.setTimeout/clearTimeout)\n// We need to set this up before importing utils, so use a getter that always\n// returns the current global timer functions (which vitest will mock)\nif (typeof globalThis.window === 'undefined') {\n Object.defineProperty(globalThis, 'window', {\n value: {\n get setTimeout() {\n return globalThis.setTimeout;\n },\n get clearTimeout() {\n return globalThis.clearTimeout;\n },\n },\n writable: true,\n configurable: true,\n });\n}\n\nimport {\n debounce,\n generateRandomId,\n parseDateOnly,\n parseDateTime,\n parseTimeString,\n normalizeToDate,\n isValidDate,\n filterValidDates,\n isEmptyValue,\n shouldSkipManualInputSync,\n timesEqual,\n datesEqual,\n cleanupFlatpickrInstance,\n updateFormValue,\n createFormSubmitListener,\n validatePickerInput,\n mergeTextStrings,\n CONFIG_DEBOUNCE_DELAY,\n RESIZE_DEBOUNCE_DELAY,\n VISIBILITY_CHECK_INTERVAL,\n} from './utils';\n\n// ============================================================================\n// DEBOUNCE TESTS\n// ============================================================================\n\ndescribe('debounce', () => {\n beforeEach(() => {\n vi.useFakeTimers();\n });\n\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it('should delay function execution', () => {\n const fn = vi.fn();\n const debounced = debounce(fn, 100);\n\n debounced();\n expect(fn).not.toHaveBeenCalled();\n\n vi.advanceTimersByTime(99);\n expect(fn).not.toHaveBeenCalled();\n\n vi.advanceTimersByTime(1);\n expect(fn).toHaveBeenCalledTimes(1);\n });\n\n it('should cancel previous calls when called again within wait time', () => {\n const fn = vi.fn();\n const debounced = debounce(fn, 100);\n\n debounced();\n vi.advanceTimersByTime(50);\n debounced();\n vi.advanceTimersByTime(50);\n\n expect(fn).not.toHaveBeenCalled();\n\n vi.advanceTimersByTime(50);\n expect(fn).toHaveBeenCalledTimes(1);\n });\n\n it('should pass arguments to the debounced function', () => {\n const fn = vi.fn();\n const debounced = debounce(fn, 100);\n\n debounced('arg1', 'arg2');\n vi.advanceTimersByTime(100);\n\n expect(fn).toHaveBeenCalledWith('arg1', 'arg2');\n });\n\n it('should use the latest arguments when called multiple times', () => {\n const fn = vi.fn();\n const debounced = debounce(fn, 100);\n\n debounced('first');\n debounced('second');\n debounced('third');\n\n vi.advanceTimersByTime(100);\n expect(fn).toHaveBeenCalledTimes(1);\n expect(fn).toHaveBeenCalledWith('third');\n });\n});\n\n// ============================================================================\n// ID GENERATION TESTS\n// ============================================================================\n\ndescribe('generateRandomId', () => {\n it('should generate an ID with the given prefix', () => {\n const id = generateRandomId('test');\n expect(id).toMatch(/^test-[a-z0-9]+$/);\n });\n\n it('should generate unique IDs', () => {\n const ids = new Set();\n for (let i = 0; i < 100; i++) {\n ids.add(generateRandomId('prefix'));\n }\n expect(ids.size).toBe(100);\n });\n\n it('should handle empty prefix', () => {\n const id = generateRandomId('');\n expect(id).toMatch(/^-[a-z0-9]+$/);\n });\n\n it('should handle special characters in prefix', () => {\n const id = generateRandomId('my-picker');\n expect(id).toMatch(/^my-picker-[a-z0-9]+$/);\n });\n});\n\n// ============================================================================\n// DATE PARSING TESTS\n// ============================================================================\n\ndescribe('parseDateOnly', () => {\n it('should parse valid Y-m-d format', () => {\n const date = parseDateOnly('2024-03-15');\n expect(date).not.toBeNull();\n expect(date!.getFullYear()).toBe(2024);\n expect(date!.getMonth()).toBe(2); // 0-indexed\n expect(date!.getDate()).toBe(15);\n });\n\n it('should return null for invalid format', () => {\n expect(parseDateOnly('03-15-2024')).toBeNull();\n expect(parseDateOnly('2024/03/15')).toBeNull();\n expect(parseDateOnly('2024-3-15')).toBeNull();\n expect(parseDateOnly('not a date')).toBeNull();\n });\n\n it('should return null for invalid month', () => {\n expect(parseDateOnly('2024-00-15')).toBeNull();\n expect(parseDateOnly('2024-13-15')).toBeNull();\n });\n\n it('should return null for invalid day', () => {\n expect(parseDateOnly('2024-03-00')).toBeNull();\n expect(parseDateOnly('2024-03-32')).toBeNull();\n });\n\n it('should return null for rollover dates', () => {\n // Feb 31 would roll over to Mar 2 or 3\n expect(parseDateOnly('2024-02-31')).toBeNull();\n // Apr 31 would roll over to May 1\n expect(parseDateOnly('2024-04-31')).toBeNull();\n });\n\n it('should handle leap year correctly', () => {\n // 2024 is a leap year\n const leapDate = parseDateOnly('2024-02-29');\n expect(leapDate).not.toBeNull();\n expect(leapDate!.getDate()).toBe(29);\n\n // 2023 is not a leap year\n expect(parseDateOnly('2023-02-29')).toBeNull();\n });\n});\n\ndescribe('parseDateTime', () => {\n it('should parse Y-m-d H:i format', () => {\n const dt = parseDateTime('2024-03-15 14:30');\n expect(dt).not.toBeNull();\n expect(dt!.getFullYear()).toBe(2024);\n expect(dt!.getMonth()).toBe(2);\n expect(dt!.getDate()).toBe(15);\n expect(dt!.getHours()).toBe(14);\n expect(dt!.getMinutes()).toBe(30);\n expect(dt!.getSeconds()).toBe(0);\n });\n\n it('should parse Y-m-d H:i:s format', () => {\n const dt = parseDateTime('2024-03-15 14:30:45');\n expect(dt).not.toBeNull();\n expect(dt!.getHours()).toBe(14);\n expect(dt!.getMinutes()).toBe(30);\n expect(dt!.getSeconds()).toBe(45);\n });\n\n it('should parse ISO-like format with T separator', () => {\n const dt = parseDateTime('2024-03-15T14:30');\n expect(dt).not.toBeNull();\n expect(dt!.getHours()).toBe(14);\n expect(dt!.getMinutes()).toBe(30);\n });\n\n it('should return null for invalid time values', () => {\n expect(parseDateTime('2024-03-15 24:00')).toBeNull();\n expect(parseDateTime('2024-03-15 14:60')).toBeNull();\n expect(parseDateTime('2024-03-15 14:30:60')).toBeNull();\n });\n\n it('should return null for invalid date portion', () => {\n expect(parseDateTime('2024-13-15 14:30')).toBeNull();\n expect(parseDateTime('2024-02-31 14:30')).toBeNull();\n });\n\n it('should return null for invalid format', () => {\n expect(parseDateTime('2024-03-15')).toBeNull();\n expect(parseDateTime('14:30')).toBeNull();\n expect(parseDateTime('not a datetime')).toBeNull();\n });\n});\n\ndescribe('parseTimeString', () => {\n it('should return Date objects as-is', () => {\n const date = new Date(2024, 2, 15, 14, 30, 0);\n const result = parseTimeString(date);\n expect(result).toBe(date);\n });\n\n it('should convert timestamps to Date', () => {\n const timestamp = Date.now();\n const result = parseTimeString(timestamp);\n expect(result).not.toBeNull();\n expect(result!.getTime()).toBe(timestamp);\n });\n\n it('should parse 24-hour format (HH:mm)', () => {\n const result = parseTimeString('14:30');\n expect(result).not.toBeNull();\n expect(result!.getHours()).toBe(14);\n expect(result!.getMinutes()).toBe(30);\n });\n\n it('should parse 24-hour format with seconds (HH:mm:ss)', () => {\n const result = parseTimeString('14:30:45');\n expect(result).not.toBeNull();\n expect(result!.getHours()).toBe(14);\n expect(result!.getMinutes()).toBe(30);\n expect(result!.getSeconds()).toBe(45);\n });\n\n it('should parse 12-hour format with AM', () => {\n const result = parseTimeString('9:30 AM');\n expect(result).not.toBeNull();\n expect(result!.getHours()).toBe(9);\n expect(result!.getMinutes()).toBe(30);\n });\n\n it('should parse 12-hour format with PM', () => {\n const result = parseTimeString('2:30 PM');\n expect(result).not.toBeNull();\n expect(result!.getHours()).toBe(14);\n expect(result!.getMinutes()).toBe(30);\n });\n\n it('should handle 12 AM as midnight', () => {\n const result = parseTimeString('12:00 AM');\n expect(result).not.toBeNull();\n expect(result!.getHours()).toBe(0);\n });\n\n it('should handle 12 PM as noon', () => {\n const result = parseTimeString('12:00 PM');\n expect(result).not.toBeNull();\n expect(result!.getHours()).toBe(12);\n });\n\n it('should be case-insensitive for AM/PM', () => {\n expect(parseTimeString('2:30 pm')!.getHours()).toBe(14);\n expect(parseTimeString('2:30 PM')!.getHours()).toBe(14);\n expect(parseTimeString('9:30 am')!.getHours()).toBe(9);\n expect(parseTimeString('9:30 AM')!.getHours()).toBe(9);\n });\n\n it('should return null for invalid time values', () => {\n expect(parseTimeString('25:00')).toBeNull();\n expect(parseTimeString('14:60')).toBeNull();\n expect(parseTimeString('14:30:60')).toBeNull();\n });\n\n it('should return null for invalid format', () => {\n expect(parseTimeString('not a time')).toBeNull();\n expect(parseTimeString('')).toBeNull();\n });\n\n it('should return null for invalid number timestamps', () => {\n expect(parseTimeString(NaN)).toBeNull();\n });\n});\n\ndescribe('normalizeToDate', () => {\n it('should return null for falsy values', () => {\n expect(normalizeToDate(null)).toBeNull();\n expect(normalizeToDate(undefined)).toBeNull();\n expect(normalizeToDate('')).toBeNull();\n });\n\n it('should return valid Date objects as-is', () => {\n const date = new Date(2024, 2, 15);\n const result = normalizeToDate(date);\n expect(result).toBe(date);\n });\n\n it('should return null for invalid Date objects', () => {\n const invalidDate = new Date('invalid');\n expect(normalizeToDate(invalidDate)).toBeNull();\n });\n\n it('should convert timestamps to Date', () => {\n const timestamp = Date.now();\n const result = normalizeToDate(timestamp);\n expect(result!.getTime()).toBe(timestamp);\n });\n\n it('should return null for invalid timestamps', () => {\n expect(normalizeToDate(NaN)).toBeNull();\n });\n\n it('should parse ISO strings', () => {\n const result = normalizeToDate('2024-03-15T14:30:00.000Z');\n expect(result).not.toBeNull();\n expect(result!.getFullYear()).toBe(2024);\n });\n\n it('should parse date-only strings', () => {\n const result = normalizeToDate('2024-03-15');\n expect(result).not.toBeNull();\n expect(result!.getFullYear()).toBe(2024);\n expect(result!.getMonth()).toBe(2);\n expect(result!.getDate()).toBe(15);\n });\n\n it('should parse datetime strings', () => {\n const result = normalizeToDate('2024-03-15 14:30');\n expect(result).not.toBeNull();\n expect(result!.getHours()).toBe(14);\n expect(result!.getMinutes()).toBe(30);\n });\n\n it('should use custom parser when provided', () => {\n const customParser = vi.fn().mockReturnValue(new Date(2024, 0, 1));\n const result = normalizeToDate('custom-format', customParser);\n\n expect(customParser).toHaveBeenCalledWith('custom-format');\n expect(result!.getFullYear()).toBe(2024);\n expect(result!.getMonth()).toBe(0);\n expect(result!.getDate()).toBe(1);\n });\n});\n\n// ============================================================================\n// VALUE CHECKING TESTS\n// ============================================================================\n\ndescribe('isValidDate', () => {\n it('should return true for valid Date objects', () => {\n expect(isValidDate(new Date())).toBe(true);\n expect(isValidDate(new Date(2024, 2, 15))).toBe(true);\n expect(isValidDate(new Date('2024-03-15T14:30:00'))).toBe(true);\n });\n\n it('should return false for invalid Date objects', () => {\n expect(isValidDate(new Date('invalid'))).toBe(false);\n expect(isValidDate(new Date(NaN))).toBe(false);\n });\n\n it('should return false for null and undefined', () => {\n expect(isValidDate(null)).toBe(false);\n expect(isValidDate(undefined)).toBe(false);\n });\n\n it('should return false for non-Date values', () => {\n expect(isValidDate('2024-03-15')).toBe(false);\n expect(isValidDate(1710489600000)).toBe(false);\n expect(isValidDate({})).toBe(false);\n expect(isValidDate([])).toBe(false);\n expect(isValidDate(42)).toBe(false);\n expect(isValidDate('')).toBe(false);\n });\n\n it('should return false for objects with getTime method that are not Dates', () => {\n const fakeDateLike = { getTime: () => 1710489600000 };\n expect(isValidDate(fakeDateLike)).toBe(false);\n });\n});\n\ndescribe('filterValidDates', () => {\n it('should return empty array for empty input', () => {\n expect(filterValidDates([])).toEqual([]);\n });\n\n it('should return all valid Dates from array', () => {\n const date1 = new Date(2024, 2, 15);\n const date2 = new Date(2024, 2, 16);\n const result = filterValidDates([date1, date2]);\n expect(result).toEqual([date1, date2]);\n });\n\n it('should filter out invalid Dates', () => {\n const validDate = new Date(2024, 2, 15);\n const invalidDate = new Date('invalid');\n const result = filterValidDates([validDate, invalidDate]);\n expect(result).toEqual([validDate]);\n });\n\n it('should filter out non-Date values', () => {\n const validDate = new Date(2024, 2, 15);\n const result = filterValidDates([\n validDate,\n null,\n undefined,\n '2024-03-15',\n 1710489600000,\n {},\n ]);\n expect(result).toEqual([validDate]);\n });\n\n it('should return empty array when all values are invalid', () => {\n const result = filterValidDates([\n null,\n undefined,\n 'not a date',\n new Date('invalid'),\n ]);\n expect(result).toEqual([]);\n });\n\n it('should preserve order of valid dates', () => {\n const date1 = new Date(2024, 0, 1);\n const date2 = new Date(2024, 5, 15);\n const date3 = new Date(2024, 11, 31);\n const result = filterValidDates([date1, null, date2, 'invalid', date3]);\n expect(result).toEqual([date1, date2, date3]);\n });\n});\n\ndescribe('isEmptyValue', () => {\n it('should return true for null', () => {\n expect(isEmptyValue(null)).toBe(true);\n });\n\n it('should return true for undefined', () => {\n expect(isEmptyValue(undefined)).toBe(true);\n });\n\n it('should return true for empty string', () => {\n expect(isEmptyValue('')).toBe(true);\n });\n\n it('should return true for whitespace-only string', () => {\n expect(isEmptyValue(' ')).toBe(true);\n expect(isEmptyValue('\\t\\n')).toBe(true);\n });\n\n it('should return false for non-empty string', () => {\n expect(isEmptyValue('hello')).toBe(false);\n expect(isEmptyValue(' hello ')).toBe(false);\n });\n\n it('should return true for empty array', () => {\n expect(isEmptyValue([])).toBe(true);\n });\n\n it('should return true for array of null/undefined', () => {\n expect(isEmptyValue([null])).toBe(true);\n expect(isEmptyValue([undefined])).toBe(true);\n expect(isEmptyValue([null, undefined])).toBe(true);\n });\n\n it('should return true for array of empty strings', () => {\n expect(isEmptyValue([''])).toBe(true);\n expect(isEmptyValue(['', ' '])).toBe(true);\n });\n\n it('should return false for array with non-empty values', () => {\n expect(isEmptyValue(['value'])).toBe(false);\n expect(isEmptyValue([null, 'value'])).toBe(false);\n });\n\n it('should return false for array with Date objects', () => {\n expect(isEmptyValue([new Date()])).toBe(false);\n });\n\n it('should return false for non-empty objects', () => {\n expect(isEmptyValue({ key: 'value' })).toBe(false);\n });\n\n it('should return false for numbers', () => {\n expect(isEmptyValue(0)).toBe(false);\n expect(isEmptyValue(42)).toBe(false);\n });\n\n it('should return false for Date objects', () => {\n expect(isEmptyValue(new Date())).toBe(false);\n });\n});\n\ndescribe('shouldSkipManualInputSync', () => {\n it('should skip when manual input is disabled', () => {\n expect(\n shouldSkipManualInputSync({\n allowManualInput: false,\n })\n ).toBe(true);\n });\n\n it('should skip when clearing is already in progress', () => {\n expect(\n shouldSkipManualInputSync({\n allowManualInput: true,\n isClearing: true,\n })\n ).toBe(true);\n });\n\n it('should skip when the change originated from flatpickr', () => {\n expect(\n shouldSkipManualInputSync({\n allowManualInput: true,\n isFromFlatpickr: true,\n })\n ).toBe(true);\n });\n\n it('should skip when syncing a host-controlled value', () => {\n expect(\n shouldSkipManualInputSync({\n allowManualInput: true,\n isSyncingFromHost: true,\n })\n ).toBe(true);\n });\n\n it('should allow manual sync when no guard is active', () => {\n expect(\n shouldSkipManualInputSync({\n allowManualInput: true,\n })\n ).toBe(false);\n });\n});\n\ndescribe('timesEqual', () => {\n it('should return true for two null/undefined values', () => {\n expect(timesEqual(null, null)).toBe(true);\n expect(timesEqual(undefined, undefined)).toBe(true);\n expect(timesEqual(null, undefined)).toBe(true);\n });\n\n it('should return false when one is null/undefined', () => {\n expect(timesEqual(new Date(), null)).toBe(false);\n expect(timesEqual(null, new Date())).toBe(false);\n });\n\n it('should return true for same time', () => {\n const a = new Date(2024, 2, 15, 14, 30, 45);\n const b = new Date(2024, 5, 20, 14, 30, 45); // Different date, same time\n expect(timesEqual(a, b)).toBe(true);\n });\n\n it('should return false for different hours', () => {\n const a = new Date(2024, 2, 15, 14, 30, 45);\n const b = new Date(2024, 2, 15, 15, 30, 45);\n expect(timesEqual(a, b)).toBe(false);\n });\n\n it('should return false for different minutes', () => {\n const a = new Date(2024, 2, 15, 14, 30, 45);\n const b = new Date(2024, 2, 15, 14, 31, 45);\n expect(timesEqual(a, b)).toBe(false);\n });\n\n it('should return false for different seconds', () => {\n const a = new Date(2024, 2, 15, 14, 30, 45);\n const b = new Date(2024, 2, 15, 14, 30, 46);\n expect(timesEqual(a, b)).toBe(false);\n });\n});\n\ndescribe('datesEqual', () => {\n it('should return true for two null/undefined values', () => {\n expect(datesEqual(null, null)).toBe(true);\n expect(datesEqual(undefined, undefined)).toBe(true);\n expect(datesEqual(null, undefined)).toBe(true);\n });\n\n it('should return false when one is null/undefined', () => {\n expect(datesEqual(new Date(), null)).toBe(false);\n expect(datesEqual(null, new Date())).toBe(false);\n });\n\n it('should return true for same date', () => {\n const a = new Date(2024, 2, 15, 10, 0, 0);\n const b = new Date(2024, 2, 15, 20, 30, 45); // Different time, same date\n expect(datesEqual(a, b)).toBe(true);\n });\n\n it('should return false for different year', () => {\n const a = new Date(2024, 2, 15);\n const b = new Date(2025, 2, 15);\n expect(datesEqual(a, b)).toBe(false);\n });\n\n it('should return false for different month', () => {\n const a = new Date(2024, 2, 15);\n const b = new Date(2024, 3, 15);\n expect(datesEqual(a, b)).toBe(false);\n });\n\n it('should return false for different day', () => {\n const a = new Date(2024, 2, 15);\n const b = new Date(2024, 2, 16);\n expect(datesEqual(a, b)).toBe(false);\n });\n});\n\n// ============================================================================\n// FLATPICKR INSTANCE TESTS\n// ============================================================================\n\ndescribe('cleanupFlatpickrInstance', () => {\n it('should handle undefined instance', () => {\n expect(() => cleanupFlatpickrInstance(undefined)).not.toThrow();\n });\n\n it('should call destroy on instance', () => {\n const mockInstance = {\n destroy: vi.fn(),\n };\n cleanupFlatpickrInstance(mockInstance as any);\n expect(mockInstance.destroy).toHaveBeenCalled();\n });\n\n it('should remove anchor click handlers', () => {\n const mockHandler1 = { el: { removeEventListener: vi.fn() }, fn: vi.fn() };\n const mockHandler2 = { el: { removeEventListener: vi.fn() }, fn: vi.fn() };\n\n const mockInstance = {\n destroy: vi.fn(),\n __anchorClickHandlers: [mockHandler1, mockHandler2],\n };\n\n cleanupFlatpickrInstance(mockInstance as any);\n\n expect(mockHandler1.el.removeEventListener).toHaveBeenCalledWith(\n 'click',\n mockHandler1.fn\n );\n expect(mockHandler2.el.removeEventListener).toHaveBeenCalledWith(\n 'click',\n mockHandler2.fn\n );\n });\n\n it('should handle missing anchor click handlers', () => {\n const mockInstance = {\n destroy: vi.fn(),\n };\n expect(() => cleanupFlatpickrInstance(mockInstance as any)).not.toThrow();\n });\n\n it('should handle errors during handler removal', () => {\n const mockHandler = {\n el: {\n removeEventListener: vi.fn().mockImplementation(() => {\n throw new Error('Test error');\n }),\n },\n fn: vi.fn(),\n };\n\n const mockInstance = {\n destroy: vi.fn(),\n __anchorClickHandlers: [mockHandler],\n };\n\n expect(() => cleanupFlatpickrInstance(mockInstance as any)).not.toThrow();\n expect(mockInstance.destroy).toHaveBeenCalled();\n });\n});\n\n// ============================================================================\n// FORM INTEGRATION TESTS\n// ============================================================================\n\ndescribe('updateFormValue', () => {\n it('should set form value when both internals and input exist', () => {\n const mockInternals = {\n setFormValue: vi.fn(),\n };\n const mockInput = {\n value: 'test-value',\n };\n\n updateFormValue(mockInternals as any, mockInput as any);\n expect(mockInternals.setFormValue).toHaveBeenCalledWith('test-value');\n });\n\n it('should do nothing when internals is undefined', () => {\n const mockInput = { value: 'test-value' };\n expect(() => updateFormValue(undefined, mockInput as any)).not.toThrow();\n });\n\n it('should do nothing when input is null', () => {\n const mockInternals = { setFormValue: vi.fn() };\n expect(() => updateFormValue(mockInternals as any, null)).not.toThrow();\n expect(mockInternals.setFormValue).not.toHaveBeenCalled();\n });\n});\n\ndescribe('createFormSubmitListener', () => {\n it('should call validate function with interacted=true and report=true', () => {\n const validateFn = vi.fn();\n const checkValidityFn = vi.fn().mockReturnValue(true);\n const requiredCheck = vi.fn().mockReturnValue(false);\n\n const listener = createFormSubmitListener(\n validateFn,\n checkValidityFn,\n requiredCheck\n );\n const mockEvent = { preventDefault: vi.fn() } as any;\n\n listener(mockEvent);\n\n expect(validateFn).toHaveBeenCalledWith(true, true);\n });\n\n it('should prevent default when validity check fails', () => {\n const validateFn = vi.fn();\n const checkValidityFn = vi.fn().mockReturnValue(false);\n const requiredCheck = vi.fn().mockReturnValue(false);\n\n const listener = createFormSubmitListener(\n validateFn,\n checkValidityFn,\n requiredCheck\n );\n const mockEvent = { preventDefault: vi.fn() } as any;\n\n listener(mockEvent);\n\n expect(mockEvent.preventDefault).toHaveBeenCalled();\n });\n\n it('should prevent default when required check fails', () => {\n const validateFn = vi.fn();\n const checkValidityFn = vi.fn().mockReturnValue(true);\n const requiredCheck = vi.fn().mockReturnValue(true);\n\n const listener = createFormSubmitListener(\n validateFn,\n checkValidityFn,\n requiredCheck\n );\n const mockEvent = { preventDefault: vi.fn() } as any;\n\n listener(mockEvent);\n\n expect(mockEvent.preventDefault).toHaveBeenCalled();\n });\n\n it('should not prevent default when valid', () => {\n const validateFn = vi.fn();\n const checkValidityFn = vi.fn().mockReturnValue(true);\n const requiredCheck = vi.fn().mockReturnValue(false);\n\n const listener = createFormSubmitListener(\n validateFn,\n checkValidityFn,\n requiredCheck\n );\n const mockEvent = { preventDefault: vi.fn() } as any;\n\n listener(mockEvent);\n\n expect(mockEvent.preventDefault).not.toHaveBeenCalled();\n });\n});\n\n// ============================================================================\n// VALIDATION TESTS\n// ============================================================================\n\ndescribe('validatePickerInput', () => {\n const createMockInput = (validity: Partial<ValidityState> = {}) => {\n return {\n validity: {\n valueMissing: false,\n customError: false,\n ...validity,\n } as ValidityState,\n validationMessage: '',\n } as HTMLInputElement;\n };\n\n it('should return valid result for non-required empty field', () => {\n const result = validatePickerInput({\n inputEl: createMockInput(),\n required: false,\n isEmpty: true,\n invalidText: '',\n defaultErrorMessage: '',\n hasInteracted: false,\n });\n\n expect(result.isValid).toBe(true);\n });\n\n it('should return invalid for required empty field', () => {\n const result = validatePickerInput({\n inputEl: createMockInput(),\n required: true,\n isEmpty: true,\n invalidText: '',\n defaultErrorMessage: 'Field is required',\n hasInteracted: true,\n });\n\n expect(result.isValid).toBe(false);\n expect(result.validity.valueMissing).toBe(true);\n expect(result.validationMessage).toBe('Field is required');\n });\n\n it('should use default message when no custom message provided', () => {\n const result = validatePickerInput({\n inputEl: createMockInput(),\n required: true,\n isEmpty: true,\n invalidText: '',\n defaultErrorMessage: '',\n hasInteracted: true,\n });\n\n expect(result.validationMessage).toBe('This field is required');\n });\n\n it('should return invalid when invalidText is set', () => {\n const result = validatePickerInput({\n inputEl: createMockInput(),\n required: false,\n isEmpty: false,\n invalidText: 'Custom error message',\n defaultErrorMessage: '',\n hasInteracted: true,\n });\n\n expect(result.isValid).toBe(false);\n expect(result.validity.customError).toBe(true);\n expect(result.validationMessage).toBe('Custom error message');\n });\n\n it('should apply custom validation', () => {\n const customValidation = vi\n .fn()\n .mockReturnValue({ valid: false, message: 'Custom validation failed' });\n\n const result = validatePickerInput({\n inputEl: createMockInput(),\n required: false,\n isEmpty: false,\n invalidText: '',\n defaultErrorMessage: '',\n hasInteracted: true,\n customValidation,\n });\n\n expect(result.isValid).toBe(false);\n expect(result.validity.customError).toBe(true);\n expect(result.validationMessage).toBe('Custom validation failed');\n });\n\n it('should pass when custom validation succeeds', () => {\n const customValidation = vi.fn().mockReturnValue({ valid: true });\n\n const result = validatePickerInput({\n inputEl: createMockInput(),\n required: false,\n isEmpty: false,\n invalidText: '',\n defaultErrorMessage: '',\n hasInteracted: true,\n customValidation,\n });\n\n expect(result.isValid).toBe(true);\n });\n});\n\n// ============================================================================\n// TEXT STRINGS TESTS\n// ============================================================================\n\ndescribe('mergeTextStrings', () => {\n it('should return defaults when no custom provided', () => {\n const defaults = { a: 'default-a', b: 'default-b' };\n const result = mergeTextStrings(defaults);\n expect(result).toEqual(defaults);\n });\n\n it('should merge custom strings over defaults', () => {\n const defaults = { a: 'default-a', b: 'default-b' };\n const custom = { a: 'custom-a' };\n const result = mergeTextStrings(defaults, custom);\n expect(result).toEqual({ a: 'custom-a', b: 'default-b' });\n });\n\n it('should handle empty custom object', () => {\n const defaults = { a: 'default-a', b: 'default-b' };\n const result = mergeTextStrings(defaults, {});\n expect(result).toEqual(defaults);\n });\n\n it('should not modify original objects', () => {\n const defaults = { a: 'default-a', b: 'default-b' };\n const custom = { a: 'custom-a' };\n mergeTextStrings(defaults, custom);\n expect(defaults.a).toBe('default-a');\n expect(custom.a).toBe('custom-a');\n });\n});\n\n// ============================================================================\n// CONSTANTS TESTS\n// ============================================================================\n\ndescribe('constants', () => {\n it('should export CONFIG_DEBOUNCE_DELAY', () => {\n expect(typeof CONFIG_DEBOUNCE_DELAY).toBe('number');\n expect(CONFIG_DEBOUNCE_DELAY).toBe(100);\n });\n\n it('should export RESIZE_DEBOUNCE_DELAY', () => {\n expect(typeof RESIZE_DEBOUNCE_DELAY).toBe('number');\n expect(RESIZE_DEBOUNCE_DELAY).toBe(250);\n });\n\n it('should export VISIBILITY_CHECK_INTERVAL', () => {\n expect(typeof VISIBILITY_CHECK_INTERVAL).toBe('number');\n expect(VISIBILITY_CHECK_INTERVAL).toBe(250);\n });\n});\n"],"names":["globalThis","window","Object","defineProperty","value","setTimeout","clearTimeout","writable","configurable","describe","beforeEach","vi","useFakeTimers","afterEach","useRealTimers","it","fn","debounce","debounced","expect","not","toHaveBeenCalled","advanceTimersByTime","toHaveBeenCalledTimes","toHaveBeenCalledWith","id","generateRandomId","toMatch","ids","Set","i","add","size","toBe","date","parseDateOnly","toBeNull","getFullYear","getMonth","getDate","leapDate","dt","parseDateTime","getHours","getMinutes","getSeconds","Date","result","parseTimeString","timestamp","now","getTime","NaN","normalizeToDate","undefined","invalidDate","customParser","mockReturnValue","isValidDate","filterValidDates","toEqual","date1","date2","validDate","date3","isEmptyValue","key","shouldSkipManualInputSync","allowManualInput","isClearing","isFromFlatpickr","isSyncingFromHost","timesEqual","a","b","datesEqual","cleanupFlatpickrInstance","toThrow","mockInstance","destroy","mockHandler1","el","removeEventListener","mockHandler2","__anchorClickHandlers","mockHandler","mockImplementation","Error","mockInternals","setFormValue","updateFormValue","mockInput","validateFn","checkValidityFn","requiredCheck","createFormSubmitListener","listener","preventDefault","mockEvent","createMockInput","validity","valueMissing","customError","validationMessage","validatePickerInput","inputEl","required","isEmpty","invalidText","defaultErrorMessage","isValid","customValidation","valid","message","defaults","mergeTextStrings","custom","CONFIG_DEBOUNCE_DELAY","RESIZE_DEBOUNCE_DELAY","VISIBILITY_CHECK_INTERVAL"],"mappings":"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"}
|
|
@@ -183,9 +183,12 @@ export declare class HeaderCategories extends LitElement {
|
|
|
183
183
|
/** Resolve max root links. Disabling limiting, or using non-positive values, means "no limit". */
|
|
184
184
|
private get _rootLinksLimit();
|
|
185
185
|
private _sanitizeSlotKey;
|
|
186
|
+
private _resolveCategoryId;
|
|
186
187
|
private _getRootSlotName;
|
|
187
188
|
private _getDetailSlotName;
|
|
188
189
|
private _getActiveSlottedCategory;
|
|
190
|
+
private _findSlottedCategoryFromEvent;
|
|
191
|
+
private _resolveSlottedMoreCategoryId;
|
|
189
192
|
private _syncSlottedCategoryPresentation;
|
|
190
193
|
private _resetSlottedCategoryPresentation;
|
|
191
194
|
private _handleSlottedMoreClick;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headerCategories.d.ts","sourceRoot":"","sources":["../../../../src/components/global/header/headerCategories.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"headerCategories.d.ts","sourceRoot":"","sources":["../../../../src/components/global/header/headerCategories.ts"],"names":[],"mappings":"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"}
|