diff --git a/.directory b/.directory deleted file mode 100644 index 90d365e1..00000000 --- a/.directory +++ /dev/null @@ -1,6 +0,0 @@ -[Dolphin] -Timestamp=2018,2,13,12,19,32 -Version=4 - -[Settings] -HiddenFilesShown=true diff --git a/.editorconfig b/.editorconfig index 6e87a003..59d9a3a3 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,4 +1,4 @@ -# Editor configuration, see http://editorconfig.org +# Editor configuration, see https://editorconfig.org root = true [*] @@ -8,6 +8,9 @@ indent_size = 2 insert_final_newline = true trim_trailing_whitespace = true +[*.ts] +quote_type = single + [*.md] max_line_length = off trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore index 6b26218b..53a8849e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,18 @@ # See http://help.github.com/ignore-files/ for more about ignoring files. +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out # dependencies /node_modules -#library packages -dist/angular-bootstrap-md-6.* +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json # IDEs and editors /.idea @@ -22,20 +29,19 @@ dist/angular-bootstrap-md-6.* !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json +.history/* # misc +/.angular/cache /.sass-cache /connect.lock /coverage /libpeerconnection.log npm-debug.log +yarn-error.log testem.log /typings -# e2e -/e2e/*.js -/e2e/*.map - # System Files .DS_Store Thumbs.db diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..29e567ec --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,1037 @@ +## 9.0.0 (21.09.2025) + +This version requires Angular v20. Follow the [Angular Update Guide](https://angular.dev/update-guide) to migrate your project to Angular 20. + +### Breaking changes: + +- Updated Angular to v20, this version is required in MDB Angular v9 + +### Fixes and improvements: + +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) + - Improved blocking of months and years cells in some edge cases + - Resolved problems with errors when parsing invalid date formats +- [File upload](https://mdbootstrap.com/docs/angular/plugins/file-upload/) + - Added error handling for `maxFileQuantity` + - Improved extensions validation logic to handle problems with uploading files with extensions defined in `mimeTypes` input +- [Input fields](https://mdbootstrap.com/docs/angular/forms/input-fields/) - resolved problem with border gap updates for dynamically rendered label +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) - resolved issue where clicking the arrow icon in one Select input would not close the dropdown of another Select component + +### New features: + +- Added new SCSS and CSS variables for plugins styles +- [Autocomplete](https://mdbootstrap.com/docs/angular/forms/autocomplete/) - added new `dropdownWidth` input that allows to set custom width for the dropdown menu +- [Datatables](https://mdbootstrap.com/docs/angular/data/datatables/) - added new `defaultSortDirection` input that allows to set default sort direction for the table header + +--- + +## 8.0.0 (07.04.2025) + +This version requires Angular v19. Follow the [Angular Update Guide](https://angular.dev/update-guide) to migrate your project to Angular 19. + +### Breaking changes: + +- Updated Angular to v19, this version is required in MDB Angular v8 +- Older theming styles are no longer supported, use new [color modes](https://mdbootstrap.com/docs/angular/content-styles/theme/) instead +- Slightly increased cell width in [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) +- The `.navbar-light` class is no longer used in [Navbar](https://mdbootstrap.com/docs/angular/navigation/navbar), use [color modes](https://mdbootstrap.com/docs/angular/content-styles/theme/) instead + +### Design updates: + +Introduced a new theming system that allows setting the theme for the entire page, its parts, or selected elements using data attributes. + +Read [Colors modes](https://mdbootstrap.com/docs/angular/content-styles/theme/) page to learn more about new theming. + +### Fixes and improvements: + +- [Modal](https://mdbootstrap.com/docs/angular/components/modal/) - resolved problem with opening animation +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) - resolved problem with not hiding option groups labels when using filter +- [Popconfirm](https://mdbootstrap.com/docs/angular/components/popconfirm/) - added default offset to the component +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) - fixed date parsing bug for `yy` year format +- [Stepper](https://mdbootstrap.com/docs/angular/components/stepper/) - added 'Optional' text to the steps that use `optional` input +- [Onboarding](https://mdbootstrap.com/docs/angular/plugins/onboarding/) - added gap between the buttons and fixed border styles +- Fixed [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) and [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) toggle button padding in Firefox browser +- Removed unnecessary `BrowserAnimationsModule` imports from [Onboarding](https://mdbootstrap.com/docs/angular/plugins/onboarding/), [Ecommerce gallery](https://mdbootstrap.com/docs/angular/plugins/ecommerce-gallery/) and [Organization chart](https://mdbootstrap.com/docs/angular/plugins/organization-chart/) plugins + +### New features: + +- Added new SCSS and CSS variables for plugins styles +- [File upload](https://mdbootstrap.com/docs/angular/plugins/file-upload/) - added new `mimeTypes` input that allow to define a list of mime types for supported file types +- [Multi item carousel](https://mdbootstrap.com/docs/angular/plugins/multi-item-carousel/) - added new `(slideClick)` event +- [Color picker](https://mdbootstrap.com/docs/angular/plugins/color-picker/) - added new `color-picker-next-format-button`, `color-picker-previous-format-button` and `color-picker-copy-button` classes for the buttons + +--- + +## 7.1.0 (18.11.2024) + +### Fixes and improvements: + +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) + - Resolved problem with `close` method being called twice on component close + - Fixed dark theme styles in inline mode +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) + - Added `aria-disabled` attributes to elements that display disabled dates + - Fixed `aria-label` attribute value in the element used to display day value + - Resolved problem with adding `aria-selected` attribute to the element that display day value +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) + - Fixed disabled options styles in custom theme + - Resolved problem with opening dropdown on `space` key press + - Added `aria-label` and `aria-labelledby` attributes to the component + - Fixed value returned by `(deselect)` event +- [Autocomplete](https://mdbootstrap.com/docs/angular/forms/autocomplete/) + - Fixed `aria-expended` attribute values for opened and closed menu + - Fixed problem where component menu was opening even when input was disbled +- [Transfer](https://mdbootstrap.com/docs/angular/plugins/transfer/) + - Fixed events output for target container + - Fixed checkboxes styles +- [Range](https://mdbootstrap.com/docs/angular/forms/range/) - fixed thumb position on component init +- [Onboarding](https://mdbootstrap.com/docs/angular/plugins/onboarding/) - added fix to prevent memory leak after component destroy +- [Input mask](https://mdbootstrap.com/docs/angular/plugins/input-mask/) - fixed a problem with value formatting when pasting all content into input at once +- [Vector maps](https://mdbootstrap.com/docs/angular/plugins/vector-maps/) - fixed shadow styles in zoom buttons +- [Transfer](https://mdbootstrap.com/docs/angular/plugins/wysiwyg-editor/) - fixed dropdown menu alignment +- [Dropdown](https://mdbootstrap.com/docs/angular/component/dropdowns/) - fixed `aria-expended` attribute values for opened and closed menu +- [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) - fixed problem with focus trap when the last focused element is inside the component content + +### New features: + +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) + - Added new `showClearBtn` input + - Added new `(clear)` event that will be fired after using Clear button +- [File upload](https://mdbootstrap.com/docs/angular/plugins/file-upload/) + - Added `svg` and `webp` extensions to the list of allowed file types for default preview + - Added new `datepickerOptions` that allow to define options for the date pickers used by the plugin +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) - added new `(search)` event that will be fired after using search input +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) - added new `(viewChanged)` event that will be fired on component view change +- [Progress](https://mdbootstrap.com/docs/angular/components/progress/) - added new circular version of the component + +--- + +## 7.0.0 (16.09.2024) + +This version requires Angular v18. Follow the [Angular Update Guide](https://angular.dev/update-guide) to migrate your project to Angular 18. + +### Breaking changes: + +- Updated Angular to v18, this version is required in MDB Angular v7. +- [Checkbox](https://mdbootstrap.com/docs/angular/forms/checkbox/) - changed `margin-right` style from `4px` to `6px` in `.form-check-input` element. +- [Forms](https://mdbootstrap.com/docs/angular/forms/overview/) - added `padding-left: 0.15rem` style to `.form-check-label` element. +- [Switch](https://mdbootstrap.com/docs/angular/forms/switch/) - changed `margin-right` style from `4px` to `8px` in `.form-check-input` element. +- [Progress](https://mdbootstrap.com/docs/angular/components/progress/) - added `box-shadow: none` style to `.progress` element. +- [Input group](https://mdbootstrap.com/docs/angular/forms/input-group/) - added `flex-wrap: nowrap` style to `.input-group` element. +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) - changed SCSS variable `$datepicker-small-cell-content-width` value from `36px` to `40px`. +- [Range](https://mdbootstrap.com/docs/angular/forms/range/): + - Added `box-shadow: none` style to `.form-range ::-webkit-slider-runnable-track` element. + - Added `box-shadow: none` style to `.form-range ::-moz-range-track` element. +- [Captcha](https://mdbootstrap.com/docs/angular/plugins/captcha/): + - Changed `error` event name to `captchaError`. + - Changed `expire` event name to `captchaExpire`. + - Changed `success` event name to `captchaSuccess`. +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/): + - Redesigned clock's page HTML structure and styles. + - Arrow icons are now displayed when hour/minute buttons are hovered in inline mode. +- [Treeview](https://mdbootstrap.com/docs/angular/plugins/tree-view/): + - Redesigned entire HTML structure. + - Replaced `li` element with `mdb-treeview-item`. + - Removed the `
` wrapper element from the entire component. + - Removed the `checkboxesField` input. + - Added a public `MdbTreeviewColor` type for the color input. + - Added a new mechanism for setting the arrow icon with the `collapseIcon` property. + - Added keyboard navigation handling. + +### Fixes and improvements: + +- [Multi range](https://mdbootstrap.com/docs/angular/forms/multi-range-slider/) - resolved the issue with `TouchEvent` in Firefox. +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) - resolved the issue with unhandled `tabindex` input. +- [Onboarding](https://mdbootstrap.com/docs/angular/plugins/onboarding/) - resolved the issue with initializing onboarding with a delay after navigating to another page. +- [Input fields](https://mdbootstrap.com/docs/angular/forms/input-fields/) - resolved the issue with displaying the value after setting it programmatically in all inputs with built-in placeholders (e.g., `datetime-local` or `time`). +- [Datatable](https://mdbootstrap.com/docs/angular/data/datatables/) - resolved the issue with the `showAllEntries` input not working properly with the `entries` input. +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) - resolved the issue with `ArrowUp` and `ArrowDown` key presses not working upon opening the timepicker. +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/): + - Resolved the issue with returned form control values for empty or invalid input values. + - Resolved the issue with closing the datepicker using the input toggle. +- [Calendar](https://mdbootstrap.com/docs/angular/plugins/calendar/): + - Resolved the issue with unpreserved event IDs on edit. + - Resolved the issue with dragging in `readonly` mode. + - Resolved the issue with view selection when non-default captions are used. + - Resolved the issue with rendering the period in the correct format in Month view. + +### New features: + +- [Dropdown](https://mdbootstrap.com/docs/angular/components/dropdown/) - added `MdbDropdownPositionClass` type to the public API. +- [Modal](https://mdbootstrap.com/docs/angular/components/modal/) - added `focusElementSelector` property to the `open` method's options for specifying the element to focus on when the modal opens. +- [Calendar](https://mdbootstrap.com/docs/angular/plugins/calendar/): + - Added `addEventButtonCaption` property to the `options` input for setting a custom caption for the add event button. + - Added `MdbCalendarViews` Enum to the public API. + +--- + +## 6.1.0 (27.05.2024) + +### Fixes and improvements: + +- [Multi range](https://mdbootstrap.com/docs/angular/forms/multi-range-slider/) + - Fixed problem with thumb limiting logic when using custom step + - Fixed problem with updating thumb positions via form controls +- [Popconfirm](https://mdbootstrap.com/docs/angular/components/popconfirm/) - added focus trap +- [Autocomplete](https://mdbootstrap.com/docs/angular/forms/autocomplete/) - restored native `shift + home` and `shift + end` keys behavior (open/close dropdown) +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) - added support for opening and closing dropdown with `alt + arrow-up` and `alt + arrow-down` keys + +### New: + +- [Table pagination](https://mdbootstrap.com/docs/angular/data/datatables/) - added new `page` input that allows to set page number +- [Multi range](https://mdbootstrap.com/docs/angular/forms/multi-range-slider/) - added new `highlightRange` input that allows to highlight range +- [Parallax](https://mdbootstrap.com/docs/angular/plugins/parallax/) - added new `container` input that allows to set wrapper element for parallax effect + +--- + +## 6.0.0 (15.01.2024) + +This version requires Angular v17. Follow the [Angular Update Guide](https://update.angular.io/?l=3&v=16.0-17.0) to migrate your project to Angular 17. + +### Breaking changes: + +- Updated Angular to v17, this version is required in MDB Angular v6 +- [Calendar](https://mdbootstrap.com/docs/angular/plugins/calendar/) - changed type of `defaultView` input from `string` to `MdbCalendarView` +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) - changed type of `options` input from `any` to `MdbDatepickerOptions` +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) + - Changed type of `options` input from `Options` to `MdbTimepickerOptions` and made all parameters optional + - Changed `SelectedTime` type name to `MdbTimepickerSelectedTime` and added this type to public exports +- [Popover](https://mdbootstrap.com/docs/angular/components/popover/) - removed unused `template` input +- [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) + - Changed return type of all events from `MdbSidenavComponent` to `void` + - Removed redundant `li` element from `MdbSidenavItemComponent` template +- [Transfer](https://mdbootstrap.com/docs/angular/plugins/transfer/) + - Changed `onSearchOutput` event name to `searchOutput` + - Changed `selectOutput` event name to `selectOutput` + - Changed `onChange` event name to `listChange` + - Changed `onSearch` event name to `itemSearch` + - Changed `onSelect` event name to `itemSelect` + +### Fixes and improvements: + +- [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) - removed height animation transition +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) - blocked input clearing in disabled component +- [Input fields](https://mdbootstrap.com/docs/angular/forms/input-fields/) - resolved problem with default label position in all inputs with built-in placeholder (like `datetime-local` or `time`) +- [Lightbox](https://mdbootstrap.com/docs/angular/components/lightbox/) - resolved problem with component removal from DOM after using browser's back button +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) - resolved problem with font size in landscape view + +### New fetures: + +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) - added new `inputId` and `inputFilterId` inputs that allow to declare ids for input elements + +--- + +## 5.2.0 (04.12.2023) + +### Fixes and improvements: + +- Resolved problem with components rendering when using Server Side Rendering +- Resolved problem with overlay when using `menuPositionClass` in [Datatable](https://mdbootstrap.com/docs/angular/components/dropdowns/) +- Replaced hardcoded `padding-left` value in [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) link with a value from CSS variable +- Replaced hardcoded `box-shadow`, `border-color` and `background-color` values in [Buttons](https://mdbootstrap.com/docs/angular/components/buttons/) with a values from CSS variables +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) + - Fixed the button press behavior to consider the duration of the press + - Removed the default scroll effect from the arrow keydown events in inline mode +- Fixed events types for `opened` and `closed` events in [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) +- Resolved problem with initial value in [Rating](https://mdbootstrap.com/docs/angular/components/rating) +- [Multi Range Slider](https://mdbootstrap.com/docs/angular/forms/multi-range-slider/) + - Resolved problem with thumbs position updates on `ngModel` or `formControl` value changes + - Added thumbs position constraints so that the position of a given thumb is limited by its counterpart +- Resolved problem with the `Host already has a portal attached` error in [Wysiwyg](https://mdbootstrap.com/docs/angular/plugins/wysiwyg-editor/) + +### New: + +- A new `MdbSidenavMenuDirective` directive has been added to [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) allowing to create multiple menus within one component +- A new `size` input has been added to [Select](https://mdbootstrap.com/docs/angular/orms/select/) allowing to change input size to `sm` or `lg` + +--- + +## 5.1.0 (09.10.2023) + +### Fixes and improvements: + +- [Datatable](https://mdbootstrap.com/docs/angular/data/datatables/) + - Added missing `cursor: pointer` styles to clickable rows + - Resolved problems with pagination width styles + - Resolved problems with page number calculation in pagination +- [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) + - Resolved problems with accessibility + - Removed the need to define template variables in HTML template + - Adjusted padding in slim version to correctly display link icon and arrow +- [Tabs](https://mdbootstrap.com/docs/angular/navigation/tabs/) + - Improved animation smoothness + - Added `MdbTabChange` event type to public exports +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) + - Resolved problem with `disabled` input + - Resolved problem with disabling and enabling component via Reactive Forms methods + - Removed border styles from focused buttons +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) + - Resolved problem with border radius styles + - Resolved problem with disabling and enabling component via Reactive Forms methods +- [Autocomplete](https://mdbootstrap.com/docs/angular/forms/autocomplete/) + - Removed auto highlight from first option + - Resolved problems with input and dropdown keyboard navigation when using `HOME` and `END` keys +- [Multi range](https://mdbootstrap.com/docs/angular/forms/multi-range-slider/) + - Resolved problem with component render in apps using Angular 16 + - Resolved problem with unhandled `endDrag` event +- [Onboarding](https://mdbootstrap.com/docs/angular/plugins/onboarding/) + - Resolved problem with component render in apps using Angular 16 + - Resolved problems with popover styles + - Fixed event types + - Fixed event emitted when jumping to next step +- [Treeview](/docs/angular/plugins/tree-view/) + - Improved animation smoothness + - Added correct types to public events + - Resolved problem with `accordion` option + - Resolved problem with `openOnClick` option + - Improved accessibility +- Resolved problem with styles of anchor elements used as [floating buttons](https://mdbootstrap.com/docs/angular/components/buttons/#section-floating) +- Resolved problem with adding new [Chips](https://mdbootstrap.com/docs/angular/components/chips/) on blur event +- Resolved problem with [Dropdown](https://mdbootstrap.com/docs/angular/components/dropdowns/) menu position +- Fixed focus styles in [Select](https://mdbootstrap.com/docs/angular/forms/select/) with `form-white` class +- Resolved problem with position of bottom frame [non-invasive Modal](https://mdbootstrap.com/docs/angular/components/modal/#section-non-invasive-modal) +- Fixed type of `infiniteScrollCompleted` event in [Infinite scroll](https://mdbootstrap.com/docs/angular/methods/infinite-scroll/) +- Added mechanism to handle dynamic updates in [Input mask](https://mdbootstrap.com/docs/angular/plugins/input-mask/) plugin +- Resolved problems with [Color picker](https://mdbootstrap.com/docs/angular/plugins/color-picker/) plugin styles and slider in Firefox browser +- Resolved problem with [Parallax](https://mdbootstrap.com/docs/angular/plugins/parallax/) plugin render in apps using Angular 16 +- Fixed event types and unhandled events in [Drag and drop](https://mdbootstrap.com/docs/angular/plugins/drag-and-drop/) plugin +- Resolved problem with reverting lists transformation in [WYSIWYG editor](https://mdbootstrap.com/docs/angular/plugins/wysiwyg-editor/) plugin +- Resolved problem with `changeView` method in [Calendar](https://mdbootstrap.com/docs/angular/plugins/calendar/) plugin +- Added types to public exports in [Data parser](https://mdbootstrap.com/docs/angular/plugins/data-parser/) plugin + +### New: + +- Added new [Treetable](https://mdbootstrap.com/docs/angular/plugins/treetable/) plugin +- Added mechanism that allow to add context for `ng-template` template in [Popover](https://mdbootstrap.com/docs/angular/components/popovers/) +- Added new `showAllEntries` option to [Datatable pagination](https://mdbootstrap.com/docs/angular/data/datatables/) +- Added new `filterFn` option to [Select](https://mdbootstrap.com/docs/angular/forms/select/) +- Added new directive that allow to create a custom header in [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) +- Added new `positionClass` and `menuPositionClass` options to [Dropdown](https://mdbootstrap.com/docs/angular/components/dropdowns/) +- Added new `disabled` input that allow to disable [Accordion](https://mdbootstrap.com/docs/angular/components/accordion/)Accordion items +- Added mechanism that allow to define custom icon template with `ng-template` in [Datepicker](/docs/angular/forms/datepicker/) and [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) +- Added mechanism that allow to define custom header template with `ng-template` in [Stepper](https://mdbootstrap.com/docs/angular/components/stepper/) +- Added new `$link-decoration` and `--mdb-link-decoration` variables to make it easier to customize `text-decoration` styles for anchor elements +- Added new inputs for disabling specific features in [Calendar](https://mdbootstrap.com/docs/angular/plugins/calendar/) plugin + +--- + +## 5.0.0 (26.06.2023) + +This version requires Angular v16. Follow the [Angular update guide](https://update.angular.io/?l=3&v=15.0-16.0) to migrate your project to Angular 16. + +### Dependencies: + +- Updated Angular to v16, this version is required in MDB Angular v5 +- Updated Bootstrap to [5.2.3](https://github.com/twbs/bootstrap/releases/tag/v5.2.3) version. + +### Design changes: + +- Changed arrow styles in [Select](https://mdbootstrap.com/docs/angular/forms/select/) input +- Slightly changed hover styles in [outline buttons](https://mdbootstrap.com/docs/angular/components/buttons/#section-outline) to make them more elegant and subtle + +### Fixes and improvements: + +- Fixed problems with schematics installation in MDB Angular Free version +- Fixed problem with display of [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) item when its content is translated with the `translate` pipe from the `@ngx-translate` library +- Fixed position of smaller icons in relation to the text in [Rating](https://mdbootstrap.com/docs/angular/components/rating/) + +### New: + +- Converted MDB components to CSS variables +- Added SCSS and CSS variables for `mdb-option` and `mdb-option-group` components +- Added access to the underlying component instance from ref element in [Modal](https://mdbootstrap.com/docs/angular/components/modal/), [Popconfirm](https://mdbootstrap.com/docs/angular/components/popconfirm/), [Alerts](https://mdbootstrap.com/docs/angular/components/alerts/) and [Toasts](https://mdbootstrap.com/docs/angular/components/toasts/) + +--- + +## 4.1.0 (24.01.2023) + +### Fixes and improvements: + +- Fixed default value display in [Autocomplete](https://mdbootstrap.com/docs/angular/forms/autocomplete/) when the value is an object +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) + - Fixed focus trap + - Fixed keyboard navigation in inline mode + - Fixed the problem with minTime and maxTime range +- Fixed [Ripple effect](https://mdbootstrap.com/docs/angular/methods/ripple/) on inputs styled as buttons +- Fixed background colors of [Toasts](https://mdbootstrap.com/docs/angular/components/toasts/) and [Alerts](https://mdbootstrap.com/docs/angular/components/alerts/) in MDB theme +- [Modal](https://mdbootstrap.com/docs/angular/components/modal/) + - Fixed the problem with scrollbar on bottom frame modal init + - Removed rounded corners from frame modals + - Removed unnecessary body scroll when using `scrollable` modal +- [Datatable](https://mdbootstrap.com/docs/angular/data/datatables/) + - Removed ability to focus disabled buttons in pagination + - Fixed the problem with case-sensitive sorting +- Fixed the problem with hiding buttons in the [Wysiwyg](https://mdbootstrap.com/docs/angular/plugins/wysiwyg-editor/) toolbar +- Fixed problem with event types in [Select](https://mdbootstrap.com/docs/angular/forms/select/) +- Fixed problem with `Rxjs operators` import paths in all the components and plugins + +### New: + +- Added new [Data Parser](https://mdbootstrap.com/docs/angular/plugins/data-parser/) plugin +- Added new [Organization Chart](https://mdbootstrap.com/docs/angular/plugins/organization-chart/) plugin +- Added new [Captcha](https://mdbootstrap.com/docs/angular/plugins/captcha/) plugin +- Added new [Chips](https://mdbootstrap.com/docs/angular/components/chips/) component +- Added new `[collapsible]` input to [Scrollspy](https://mdbootstrap.com/docs/angular/navigation/scrollspy/) +- Added new `[disableWindowScroll]` input to the [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) +- Added new [non-invasive Modal](https://mdbootstrap.com/docs/angular/components/modal/#section-non-invasive-modal) +- [Datatable](https://mdbootstrap.com/docs/angular/data/datatables/) + - Added new `[forceSort]` input that allow to disable sort reset on third click + - Added new `[disableSort]` input that allow to disable a specific sort header + - Added new `[disabled]` input to pagination component +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) +- Added new `[removeOkBtn]`, `[removeCancelBtn]` and `[removeClearBtn]` inputs that allow to remove specific buttons from the component footer +- Addew new `[confirmDateOnSelect]` input that allow to select date without a confirmation by click on `Ok` button + +--- + +## 4.0.0 (09.01.2023) + +### Design updates: + +Our basic color palette has been updated. We toned down our colors to be less flashy and more elegant and subtle. This affects virtually all of our components, so be aware of this before upgrading your project to v4.0.0. + +Read [colors docs](https://mdbootstrap.com/docs/angular/content-styles/colors/) to learn more about new palette. + +### Breaking changes: + +- Added support for Angular 15, this Angular version is now required, +- Improved [buttons](https://mdbootstrap.com/docs/angular/components/buttons/) +- Improved existing [accordion](https://mdbootstrap.com/docs/angular/components/accordion/) and added new examples +- Improved [stepper](https://mdbootstrap.com/docs/angular/components/stepper/) design +- Improved [badges](https://mdbootstrap.com/docs/angular/components/badges/) design and added new examples +- Improved [popovers](https://mdbootstrap.com/docs/angular/components/popovers/) and [popconfirm](https://mdbootstrap.com/docs/angular/components/popconfirm/) design +- Removed default configuration of `chartjs-plugin-datalabels` from [charts](https://mdbootstrap.com/docs/angular/data/charts/), all plugins must be now registered before use + +### Fixes and improvements: + +- Resolved problem with [scrollbar](https://mdbootstrap.com/docs/angular/methods/scrollbar/) initialization on element with a `mdbScrollbar` directive +- Removed unnecessary border animation on initialization of `mdb-form-control` component +- Resolved problem with global registration of controllers and plugins in [charts](https://mdbootstrap.com/docs/angular/data/charts/) +- Improved types in `mdbChart` directive inputs +- Added some fixes to the [transfer plugin](https://mdbootstrap.com/docs/angular/plugins/transfer/) + - Improved 'select all' option implementation + - Resolved problems with value updates in search bar input + - Resolved problems with component view updates when using pagination +- Improved theme styles in the following components: + - List group + - Pagination + - Datepicker + +### New: + +- Addew new [color picker plugin](https://mdbootstrap.com/docs/angular/plugins/color-picker/) plugin +- Addew new [multi item carousel plugin](https://mdbootstrap.com/docs/angular/plugins/multi-item-carousel/) +- Addew new [ecommerce gallery plugin](https://mdbootstrap.com/docs/angular/plugins/ecommerce-gallery/) +- Addew new `[borderless]` input to [accordion](https://mdbootstrap.com/docs/angular/components/accordion/) +- Added new `[withPush]` input to [dropdown](https://mdbootstrap.com/docs/angular/components/dropdown/) +- Added new `[plugins]` input to [charts](https://mdbootstrap.com/docs/angular/data/charts/) +- Added public access to the chart instance in `mdbChart` directive +- Added new `[ofText]` input to [datatables](https://mdbootstrap.com/docs/angular/data/datatables/) +- Added new `[titleSource]` and `[titleTarget]` inputs to [transfer plugin](https://mdbootstrap.com/docs/angular/plugins/transfer/) + +--- + +## 3.0.1 (05.12.2022) + +### Fixes and improvements: + +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) + - Removed border styles displayed on focused elements + - Resolved problems with keyboard navigation +- It will be now possible to jump to any step in [linear stepper](https://mdbootstrap.com/docs/angular/components/stepper/#section-linear-stepper-example/), as long as all previous steps are completed +- Resolved problems with `acceptedExtensions` in [file upload plugin](https://mdbootstrap.com/docs/angular/plugins/file-upload/) +- Select all option will now select/deselect only filtered options when used inside a [select component with filter](https://mdbootstrap.com/docs/angular/forms/select/#section-search/) +- Events `itemShown` and `itemHidden` in [accordion](https://mdbootstrap.com/docs/angular/components/accordion/) will be now correctly emitted after animation end +- Resolved problem with close animation in [popconfirm](https://mdbootstrap.com/docs/angular/components/popconfirm/) +- Resolved problem with value returned to [autocomplete](https://mdbootstrap.com/docs/angular/forms/autocomplete/) form control on option selection +- Resolved problem with wrong page value returned by `(paginationChange)` event in [datatable](https://mdbootstrap.com/docs/angular/data/datatables/) +- Increased backdrop z-index in [onboarding plugin](https://mdbootstrap.com/docs/angular/plugins/onboarding/) +- Resolved problem with `autohide` option in [toast](https://mdbootstrap.com/docs/angular/components/toasts/), notification will be removed only if it is not hovered +- Added default padding to the content container in [WYSIWYG editor plugin](https://mdbootstrap.com/docs/angular/plugins/wysiwyg-editor/) +- Resolved problem with Angular dependencies versions in schematics installation + +### New: + +- Addew new [color picker plugin](https://mdbootstrap.com/docs/angular/plugins/color-picker/) +- Addew new [scroll status plugin](https://mdbootstrap.com/docs/angular/plugins/scroll-status/) + +--- + +## 3.0.0 (10.10.2022) + +This version requires Angular v14 and Node 14.15.0 (or later). Follow the [Angular update guide](https://update.angular.io/?l=3&v=13.0-14.0) to migrate your project to Angular 14: + +### Breaking changes: + +- Added support for Angular 14, this Angular version is now required, +- Removed `~` from styles imports, this syntax is now deprecated +- Updated [calendar](https://mdbootstrap.com/docs/angular/plugins/calendar/) plugin: + - redesigned toolbar, events, views and modals + - replaced view toggle buttons with select + - created an `Add event` button + - added [blur](https://mdbootstrap.com/docs/angular/plugins/calendar/#section-blur/) option to style past events + - improved long events styling + - improved responsiveness +- Design changes: + - Changed shadows for components such as [card](https://mdbootstrap.com/docs/angular/components/cards/), [popover](https://mdbootstrap.com/docs/angular/components/popovers/), [toast](https://mdbootstrap.com/docs/angular/components/toasts/), [modal](https://mdbootstrap.com/docs/angular/components/modal/), [image hoverable](https://mdbootstrap.com/docs/angular/content-styles/images/), [dropdown menu](https://mdbootstrap.com/docs/angular/components/dropdowns/), [popconfirm](https://mdbootstrap.com/docs/angular/components/popconfirm/) + - Changed styling of border for [card](https://mdbootstrap.com/docs/angular/components/cards/), [modal](https://mdbootstrap.com/docs/angular/components/modal/), header and footer + - Changed [table](https://mdbootstrap.com/docs/angular/data/tables/) font weight and text color + - Changed [checkbox](https://mdbootstrap.com/docs/angular/forms/checkbox/) and [radio](https://mdbootstrap.com/docs/angular/forms/radio/) border color + - Changed [switch](https://mdbootstrap.com/docs/angular/forms/switch/) background color + - Changed [checkbox](https://mdbootstrap.com/docs/angular/forms/checkbox/) border radius size + - Changed [list group](https://mdbootstrap.com/docs/angular/components/list-group/), [pagination](https://mdbootstrap.com/docs/angular/navigation/pagination/) and [dropdown](https://mdbootstrap.com/docs/angular/components/dropdowns/) text color as it is in the body + - Changed [toast](https://mdbootstrap.com/docs/angular/components/toasts/) color palette + - Changed [datatables](https://mdbootstrap.com/docs/angular/data/datatables/) striped and hover background color as it is in the usual table + - Changed [select](https://mdbootstrap.com/docs/angular/forms/select/) states background colors + - Changed [sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) icons colors and width of the slim version + - Added new [toast](https://mdbootstrap.com/docs/angular/components/toasts/) color classes that replaced background color classes. Old: `toast bg-primary`. New: `toast toast-primary` + +### Fixes and improvements: + +- [Lightbox](https://mdbootstrap.com/docs/angular/components/lightbox/) + - Resolved problems with zoom + - Resolved problems with swipe on mobile devices + - Resolved problem with display of smaller images + - Fixed image position in fullscreen mode + - Disabled elements will no longer be displayed inside the component modal +- Fixed problems with `rebuild` method in [charts](https://mdbootstrap.com/docs/angular/data/charts/) +- Replaced hardcoded color values with SCSS variables in [autocomplete](https://mdbootstrap.com/docs/angular/forms/autocomplete/) and [select](https://mdbootstrap.com/docs/angular/forms/select/) +- Resolved problem with [carousel](https://mdbootstrap.com/docs/angular/components/carousel/) animations inside a component with OnPush change detection strategy +- Position of dropdown menus in all components will be now correctly updated on scroll event +- Resolved problem with fade animation in [tabs](https://mdbootstrap.com/docs/angular/components/tabs/) +- Label values in [select](https://mdbootstrap.com/docs/angular/forms/select/) will be now dynamically updated on option label change +- All event listeners in the [WYSIWYG](https://mdbootstrap.com/docs/angular/plugins/wysiwyg-editor/) plugin will be now correctly removed when component is destroyed +- Resolved problem with [input](https://mdbootstrap.com/docs/angular/forms/input-fields/) label position when browser autofill is used + +### New: + +- Addew new [countdown plugin](https://mdbootstrap.com/docs/angular/plugins/countdown/) +- Addew new [input mask plugin](https://mdbootstrap.com/docs/angular/plugins/input-mask/) +- Addew new [parallax plugin](https://mdbootstrap.com/docs/angular/plugins/parallax/) +- Addew new [multi range component](https://mdbootstrap.com/docs/angular/components/multi-range-slider/) +- Added new `[fade]` input that allow to toggle fade animations in [tabs](https://mdbootstrap.com/docs/angular/components/tabs/) + +### Design updates: + +- Updated icon colors of basic light navbar and footer with secondary color +- Added new horizontal dividers classes `.hr` and `.hr-blurry` +- Updated styles of vertical divider class `.vr` and add new class `.vr-blurry` +- Added new sidenav with menu categories and class `.sidenav-sm` +- Added new `object-fit` and `object-position` utilities + +### Removed: + +- Deprecated button close classes. Old: `.close`. New: `.btn-close` and `.btn-close-white` +- Deprecated embed classes. Old: `.embed`. New: `.ratio` +- Deprecated flag classes. Check [flags](https://mdbootstrap.com/docs/angular/content-styles/flags/) docs +- Deprecated utils + +### Deprecated: + +- `.divider-horizontal` and `.divider-horizontal-blurry` +- `.divider-vertical` and `.divider-vertical-blurry` + +--- + +## 2.3.0 (27.06.2022) + +### Fixes and improvements + +- [Sidenav](https://mdbootstrap.com/docs/b5/angular/navigation/sidenav/) + - Resolved problems with arrow position updates in slim mode and accordion mode + - Resolved problem with initialization of component with `[right]="true"` and `[hidden]="false"` options + - Fixed problem with long content display in component with `[right]="true"` option +- Fixed problems with long label positioning in [checkbox](https://mdbootstrap.com/docs/b5/angular/forms/checkbox/), [switch](https://mdbootstrap.com/docs/b5/angular/forms/switch/) and [radio](https://mdbootstrap.com/docs/b5/angular/forms/radio/) +- Resolved problem with multiple `paginationChange` events emitted on [datatable](https://mdbootstrap.com/docs/b5/angular/data/datatables/) initialization +- Resolved problems with [pagination](https://mdbootstrap.com/docs/b5/angular/navigation/pagination/) and [accordion](https://mdbootstrap.com/docs/b5/angular/components/accordion/) styles when using [theme](https://mdbootstrap.com/docs/b5/angular/content-styles/theme/) +- Fixed problem with max file quantity in [file upload](https://mdbootstrap.com/docs/b5/angular/plugins/file-upload/) plugin with `multiple` mode +- Resolved problem with first option highlight in [select](https://mdbootstrap.com/docs/b5/angular/forms/select/) with a `[highlightFirst]="false"` option +- Added `type="button"` to the 'insert horizontal line' button in [WYSIWYG](https://mdbootstrap.com/docs/b5/angular/plugins/wysiwyg-editor/) to resolve problem with form submit +- Zero-length [tooltip](https://mdbootstrap.com/docs/b5/angular/components/tooltips/) and [popover](https://mdbootstrap.com/docs/b5/angular/components/popovers/) will no longer be displayed +- Fixed problem with multiple `(selected)` events emitted after click on [autocomplete](https://mdbootstrap.com/docs/b5/angular/forms/autocomplete/) option + +### New + +- Addew new [onboarding plugin](https://mdbootstrap.com/docs/b5/angular/plugins/onboarding/) +- [Stepper](https://mdbootstrap.com/docs/b5/angular/components/stepper/) + - Added possibility to block step navigation on step header click + - Added possibility to edit buttons and header text in mobile mode +- Added new `--mdb-bg-opacity` CSS variable +- Added optional auto select on tab-out in [select](https://mdbootstrap.com/docs/b5/angular/forms/select/) and [autocomplete](https://mdbootstrap.com/docs/b5/angular/forms/autocomplete/) +- Added list group new variant with `.list-group-light` class +- Added `.table-group-divider` and `.table-divider-color` classes to emphasize the separation of thead from tbody +- Added new `.divider-horizontal`, `.divider-vertical`, `.divider-horizontal-blurry` and `.divider-vertical-blurry` classes + +--- + +## 2.2.0 (16.05.2022) + +### Fixes and improvements: + +- Datepicker - resolved problem with returned month value when `m` format is used, +- Treeview - resolved problem with `(selected)` event emit when selecting checkbox, +- Select - resolved problem with keyboard navigation and option highlight after filter input is used. +- Charts - resolved problem with chart options being overriden by options defined for other charts, +- Range - resolved problem with thumb position update after change in `ngModel` or `formControl` + +### New: + +- [Added filter plugin](https://mdbootstrap.com/docs/b5/angular/plugins/filters/) +- Dropdown - added keyboard navigation + +--- + +## 2.1.0 (11.04.2022) + +### Fixes and improvements: + +- Datepicker - resolved problem with validation of date typed into input, +- Sidenav - removed unnecessary transition animation on initialization in slim mode, +- File upload plugin - fixed typo in main error message, +- Carousel/Lightbox - updated icons styles for Font Awesome v6. + +### New: + +- [Cookies management](https://mdbootstrap.com/docs/b5/angular/plugins/cookies-management/) +- [Storage management](https://mdbootstrap.com/docs/b5/angular/plugins/storage-management/) +- [Mention](https://mdbootstrap.com/docs/b5/angular/plugins/mention/) +- [Transfer](https://mdbootstrap.com/docs/b5/angular/plugins/transfer/) + +--- + +## 2.0.0 (28.02.2022) + +### Breaking changes: + +- Added support for Angular 13, this Angular version is now required, +- Sidenav - removed support for automatic item expansion based on an active link ([in our documentation](https://mdbootstrap.com/docs/b5/angular/navigation/sidenav/) you can find information on how to achieve this effect using methods provided by Angular Router). + +### Dependencies: + +- Updated Font Awesome to v6.0.0 + +### Fixes and improvements: + +- Toasts/Alerts - resolved problem with positioning when stacking and position bottom options are used, +- Select/Datepicker - resolved problems with input, label and icons styles when `form-white` class is used on `mdb-form-control` component, +- Select - resolved problem with selection when multiple options have the same label (in some cases component incorrectly displayed option value instead of option label in input), +- Datatable pagination - component will now display correct information when data source is empty. + +### New features: + +- Tabs - added new `[navColumnClass]` and `[contentColumnClass]` inputs that allow to customize width of the navigation and content sections in vertical mode. + +--- + +## 1.6.1 (24.01.2022) + +### Optimization: + +- Documentation migration from Wordpress to Hugo, +- Updated code in snippets in documentation to work properly with tsconfig strict settings. + +### Fixes and improvements: + +- Input - resolved problem with label position in input with type="date", +- Datepicker/Timepicker - improved backdrop animation (removed unnecessary delay), +- Datepicker - resolved problem with navigation using previous/next arrows when min and max date is specified, +- Sidenav - animation of the collapsed item in slim mode will be now in sync with animation of the menu (previously there was unnecessary delay) +- Select - list of filtered options will be now correctly reset after the dropdown menu is closed, +- Treeview plugin - click on checkbox will no longer change collapsed state of the node, +- Treeview plugin - checked state of the checkox in parent node will be now in sync with the checkboxes in child nodes. + +--- + +## 1.6.0 (27.12.2021) + +### Dependencies: + +- Updated Bootstrap to 5.1.3 version. + +### Fixes and improvements: + +- Charts - resolved problem with `chartjs-plugin-datalabels` configuration, +- Carousel - component should now work correctly inside components with `OnPush` change detection strategy, +- Table - updated `dataSource` type to resolve problem with asynchronous data and async pipe, +- File upload plugin - resolved problem with extensions handled by the `acceptedExtensions` input, +- Popconfirm - target element will be now optional in modal display mode, +- Sidenav - resolved problem with `child.querySelector is not a function` error when using `ngFor` directive to render sidenav items, +- Popover - `mdbPopover` input will now correctly accept value with `TemplateRef` type. + +### New: + +- Dropdown - added new `closeOnOutsideClick`, `closeOnItemClick`, `closeOnEsc` inputs that allow to configure menu closing actions, +- File upload plugin - added a new `reset` method that allow to reset component state to default settings. + +--- + +## 1.5.1 (22.11.2021) + +### Fixes and improvements + +- Toast/Alert - resolved problem with stacking and close animation, +- Modal - resolved problem with closing when mouseup event is detected outside the component, +- Sidenav - setting `hidden` input to `false` will no longer trigger component animation, +- Sidenav - resolved problem with arrow rotation update when `[collapsed]="false"` is used, +- Sidenav - removed focus trap in side and push modes, +- Sidenav - default position will be now correctly set to `fixed`, +- Input - resolved problem with border top gap recalculation when used inside a dynamically loaded component (such as tabs), +- Overlay - resolved problem with z-index in components using overlay (e.g. modal, popconfirm, tooltip, components with dropdown menus). The components will be correctly displayed above the elements with sticky/fixed styles, +- Charts - fixed default options and resolved problem with custom options merge. + +### Vector maps 1.1.0: + +- resolved problem with automatic updates of colors defined in `colorMap`, +- resolved problem with tooltip display when `[hover]="false"` is used, +- added possibility to display custom tooltips. + +--- + +## 1.5.0 (02.11.2021) + +### New + +- [File upload](https://mdbootstrap.com/docs/b5/angular/plugins/file-upload) +- [Treeview](https://mdbootstrap.com/docs/b5/angular/plugins/tree-view) + +--- + +## 1.4.0 (18.10.2021) + +### New + +- [Drag and drop](https://mdbootstrap.com/docs/b5/angular/plugins/drag-and-drop) +- [Vector maps](https://mdbootstrap.com/docs/b5/angular/plugins/vector-maps) + +--- + +## 1.3.0 (04.10.2021) + +### New + +- [Wysiwyg](https://mdbootstrap.com/docs/b5/angular/plugins/wysiwyg-editor) + +### Fixes and improvements: + +- Popover/Tooltip - resolved problem with closing component when quickly moving mouse over trigger element + +--- + +## 1.2.0 (20.09.2021) + +### New + +- [Calendar](https://mdbootstrap.com/docs/b5/angular/plugins/calendar) +- [Table Editor](https://mdbootstrap.com/docs/b5/angular/plugins/table-editor) + +--- + +## 1.1.0 (06.09.2021) + +### Fixes and improvements: + +- Table pagination - resolved problem with disabled state of next button, +- Input - resolved problem with disabled state updates using Angular form control methods, +- Table - resolved problem with default filter function, +- Datepicker - resolved problem with disabled state of toggle button, +- Timepicker - resolved problem with setting default value in component with 24h format, +- Sidenav - resolved problem with `Cannot read property destroy of undefined` error, +- Select - resolved problem with disabled state of checkboxes in options, +- Select - resolved problem with closing modal on clear button click, +- Dropdown - menu will be now closed correctly on item click. + +### New components: + +- [Theming](https://mdbootstrap.com/docs/b5/angular/content-styles/theme) + +### New features: + +- Table pagination - added new `rowsPerPageText` input that allow to change default 'Rows per page' text + +--- + +## 1.0.0 (09.08.2021) + +In this version we introduced some breaking changes, please check `Breaking changes` section and update your application accordingly. + +### Breaking changes: + +- Inputs - removed `margin-bottom` styles from inputs with validation classes. + +### Fixes and improvements: + +- Select - dropdown will be correctly removed on component destroy, +- Select - resolved problem with select-all option state on component initialization, +- Select - resolved problem with selection of options with false values, +- Dropdown - resolved problem with opening component on icon click, +- Toasts/Alerts - resolved problem with z-index, +- Popconfirm - resolved problem with `onClose` and `onConfirm` events, +- Loading management - backdrop will be correctly removed on component destroy when fullscreen option is used, +- Timepicker - resolved problem with setting default value using Angular form controls, +- Datepicker - previous/next button disabled state will be now correctly updated on component initialization, +- Datepicker/Timepicker - click on toggle button will no longer submit form, +- Datepicker/Timepicker - resolved problems with `valueChanges` event and validation status updates, +- Datatables - resolved problem with scroll position when component is rendered inside a tab. + +### New components: + +- [Accordion](https://mdbootstrap.com/docs/b5/angular/components/accordion/) +- [Charts advanced](https://mdbootstrap.com/docs/b5/angular/data/charts-advanced/) +- [Lightbox](https://mdbootstrap.com/docs/b5/angular/components/lightbox/) +- [Smooth scroll](https://mdbootstrap.com/docs/b5/angular/methods/smooth-scroll/) + +--- + +## 1.0.0-beta8 (12.07.2021) + +In this version we introduced some breaking changes, please check `Breaking changes` section and update your application accordingly. + +### Breaking changes: + +- Popover - `[template]` input will now accept value of type `TemplateRef` and can be used to display `ng-template` content. + +### Fixes and improvements: + +- Toast - component will no longer throw error after reopening, +- Toast - stacked components will now slide up automatically, +- Sidenav - resolved problem with auto expand when route has route parameters, +- Dropdown - opened menu will be now correctly destroyed on route change, +- Table pagination - resolved problem with data automatic updates after change in `[entryOptions]` input. + +### New components: + +- [Popconfirm](https://mdbootstrap.com/docs/b5/angular/components/popconfirm/) +- [Lazy loading](https://mdbootstrap.com/docs/b5/angular/methods/lazy-loading/) +- [Loading management](https://mdbootstrap.com/docs/b5/angular/methods/loading-management/) + +### New features: + +- Popover - `[template]` input will now accept value of type `TemplateRef` and can be used to display `ng-template` content. + +--- + +## 1.0.0-beta7 (28.06.2021) + +In this version we introduced some breaking changes, please check `Breaking changes` section and update your application accordingly. + +### Breaking changes: + +- Changed `mdb-select-option` selector to `mdb-option`, +- Removed `select-` prefix from option and option group class names, +- Moved option and option group styles to individual file. + +### Fixes and improvements: + +- Sidenav - resolved problem with arrow icons in collapsed items, +- Sidenav - resolved problem with z-index, +- Select - resolved problem with dropdown toggle on arrow icon click, +- Input - resolved problem with label position when setting value dynamically using Angular form controls. + +### New components: + +- [Autcomplete](https://mdbootstrap.com/docs/b5/angular/forms/autocomplete/) +- [Infinite scroll](https://mdbootstrap.com/docs/b5/angular/methods/infinite-scroll/) +- [Touch](https://mdbootstrap.com/docs/b5/angular/methods/touch/) + +### New features: + +- Select - added new `[filterPlaceholder]` input that allow to change filter input placeholder. + +--- + +## 1.0.0-beta6 (14.06.2021) + +In this version we introduced some breaking changes, please check `Breaking changes` section and update your application accordingly. The list of all individual modules and entry points can be found here: + +[MDB Angular UI Kit Free Modules And Imports](https://mdbootstrap.com/docs/b5/angular/getting-started/modules-and-imports/) + +[MDB Angular UI Kit Pro Essential Modules And Imports](https://mdbootstrap.com/docs/b5/angular/pro/modules-and-imports/) + +### Breaking changes: + +- Updated Angular to v12 (this version is now required), +- Components, modules and types can no longer be imported from `mdb-angular-ui-kit` entry point. Use the newly added secondary entry points, such as `mdb-angular-ui-kit/checkbox` to import individual elements, +- Removed main `MdbModule`, import individual modules from its entry points, for example: `import { MdbCheckboxModule } from 'mdb-angular-ui-kit/checkbox'`, +- Renamed `MdbTimePickerComponent` to `MdbTimepickerComponent`, +- Renamed `MdbTimePickerDirective` to `MdbTimepickerDirective`, +- Renamed `MdbTimePickerModule` to `MdbTimepickerModule`, +- Updated Bootstrap styles to the latest stable version. + +### Components redesign: + +- Redesigned shadows for components: Cards, Dropdowns, Modal, Popover, Toasts, Buttons, Button Group, Navbar, Pagination, Pills, Sidenav, +- Redesigned padding for components: Alerts, Cards, List Group, +- Redesigned border radius to 0.5rem for components: Alerts, Cards, Dropdowns, Modal, List group, Popover, Toasts, Dateipcker, Timepicker. + +### Fixes and improvements: + +- Sidenav - resolved problem with height of the element with `.sidenav-menu` class, +- Range - resolved problem with a hardcoded `Example label` text, +- Datepicker - `dateChanged` event will be now correctly emited on date change, +- Datepicker - resolved problem with components updates on Angular form control changes, +- File input - updated styles to Material Design styles, +- Pills - fixed width of pills when they're filled or justified, +- Checkbox/Switch/Radio - fix margin styles and positioning. + +### New components: + +- [Stepper](https://mdbootstrap.com/docs/b5/angular/components/stepper/) +- [Sticky](https://mdbootstrap.com/docs/b5/angular/components/sticky/) + +### New features: + +- Navbar - added a new `.navbar-nav-scroll` class to enable vertical scrolling when a collapsed navbar is opened, +- Navbar - re-added `flex-grow` to the `.navbar-collapse` to restore the flexbox behaviors from v4 and prevent some content from being inadvertently squished, +- List group - added a new `.list-group-numbered` variation to list groups that uses pseudo-elements for numbering list group items, +- Shadows - added a new styles design: shadows soft, shadows standard, shadows strong, +- Added color-scheme mixin. + +--- + +## 1.0.0-beta5 (31.05.2021) + +### New components: + +- [Datatables](https://mdbootstrap.com/docs/b5/angular/data/datatables/) +- [Rating](https://mdbootstrap.com/docs/b5/angular/components/rating/) + +--- + +## 1.0.0-beta4 (04.05.2021) + +### New components: + +- [Charts](https://mdbootstrap.com/docs/b5/angular/data/charts/) + +### Bug fixes: + +- Animations - resolved problem with parameters in HTML template, +- Sidenav - resolved problems with `mode` and `hidden` inputs, +- Sidenav - resolved problem with `show` method. + +--- + +## 1.0.0-beta3 (19.04.2021) + +### New components: + +- [Alerts](https://mdbootstrap.com/docs/b5/angular/components/alerts/) +- [Carousel](https://mdbootstrap.com/docs/b5/angular/components/carousel) +- [Toasts](https://mdbootstrap.com/docs/b5/angular/components/toasts) + +### Bug fixes: + +- Datepicker - resolved problem with keyboard navigation when using `DownArrow` key, +- Datepicker - resolved problem with selecting dates using `Enter/Space` keys in component with date filter, +- Datepicker - added correct aria-labels to the previous/next buttons in the days view. + +--- + +## 1.0.0-beta2 (06.04.2021) + +### New components: + +- [Datepicker](https://mdbootstrap.com/docs/b5/angular/forms/datepicker/) +- [Timepicker](https://mdbootstrap.com/docs/b5/angular/forms/timepicker) + +--- + +## 1.0.0-beta1 (22.03.2021) + +### New components: + +- [Range](https://mdbootstrap.com/docs/b5/angular/forms/range/) +- [File](https://mdbootstrap.com/docs/b5/angular/forms/file) +- [Switch](https://mdbootstrap.com/docs/b5/angular/forms/switch/) +- [Input group](https://mdbootstrap.com/docs/b5/angular/forms-input-group/) +- [Pills](https://mdbootstrap.com/docs/b5/angular/navigation/pills/) +- [Tabs](https://mdbootstrap.com/docs/b5/angular/navigation/tabs/) + +### Bug fixes: + +- Scrollspy - added `cursor: pointer` styles to scrollspy links, +- Sidenav - resolved problem with errors when `RouterModule` is not imported, +- Sidenav - component will be correctly updated on inputs changes, +- Sidenav - resolved problem with scroll position, +- Sidenav - added components and module exports to main library index. + +### New features: + +- Animations - added new animations: `slideLeft`, `slideRight`, `slideUp`, `slideDown`, +- Sidenav - added focus trap, +- Sidenav - escape button will now close the component. + +--- + +## 1.0.0-alpha4 (08.03.2021) + +### New components: + +- [Animations](https://mdbootstrap.com/docs/b5/angular/content-styles/animations/) +- [Ripple](https://mdbootstrap.com/docs/b5/angular/methods/ripple/) +- [Sidenav](https://mdbootstrap.com/docs/b5/angular/navigation/sidenav/) +- [Scrollspy](https://mdbootstrap.com/docs/b5/angular/navigation/scrollbar/) +- [Validation](https://mdbootstrap.com/docs/b5/angular/forms/validation/) + +### Bug fixes: + +- Select - `x options selected` text will be displayed correctly when more than 5 options have been selected, +- Select - fixed clear button focusing issue. + +### New features: + +- Select - added new `displayedLabels` input that allows to change maximum number of comma-separated options labels displayed in the multiselect input, +- Select - added new `optionsSelectedLabel` input that allows to customize x options selected text, +- Select - added new `filterDebounce` input that allows to add delay to the options list updates when using filter input + +--- + +## 1.0.0-alpha3 (22.02.2021) + +### New components: + +- [Dropdown](https://mdbootstrap.com/docs/b5/angular/components/dropdowns/) +- [Modal](https://mdbootstrap.com/docs/b5/angular/components/modal/) +- [Select](https://mdbootstrap.com/docs/b5/angular/forms/select/) +- [Scrollbar](https://mdbootstrap.com/docs/b5/angular/methods/scrollbar/) + +--- + +## 1.0.0-alpha2 (25.01.2021) + +### New components: + +- [Popover](https://mdbootstrap.com/docs/b5/angular/components/popovers/) +- [Tooltip](https://mdbootstrap.com/docs/b5/angular/components/tooltips/) +- [Checkbox](https://mdbootstrap.com/docs/b5/angular/forms/checkbox/) +- [Input](https://mdbootstrap.com/docs/b5/angular/forms/input-fields/) +- [Radio](https://mdbootstrap.com/docs/b5/angular/forms/radio/) + +--- + +## 1.0.0-alpha1 (11.01.2021) + +The initial release of MDB 5 Angular Alpha 1. + +### New components: + +- [Badges](https://mdbootstrap.com/docs/b5/angular/components/badges/) +- [Buttons](https://mdbootstrap.com/docs/b5/angular/components/buttons/) +- [Button Group](https://mdbootstrap.com/docs/b5/angular/components/button-group/) +- [Cards](https://mdbootstrap.com/docs/b5/angular/components/cards/) +- [Collapse](https://mdbootstrap.com/docs/b5/angular/components/collapse/) +- [List Group](https://mdbootstrap.com/docs/b5/angular/components/list-group/) +- [Progress](https://mdbootstrap.com/docs/b5/angular/components/progress/) +- [Spinners](https://mdbootstrap.com/docs/b5/angular/components/spinners/) +- [Tables](https://mdbootstrap.com/docs/b5/angular/data/tables/) +- [Breadcrumb](https://mdbootstrap.com/docs/b5/angular/navigation/breadcrumb/) +- [Footer](https://mdbootstrap.com/docs/b5/angular/navigation/footer/) +- [Headers](https://mdbootstrap.com/docs/b5/angular/navigation/headers/) +- [Navbar](https://mdbootstrap.com/docs/b5/angular/navigation/navbar/) +- [Pagination](https://mdbootstrap.com/docs/b5/angular/navigation/pagination/) + +### New sections: + +- Layout +- Utilities +- Content & styles diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index fdde873d..00000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,39 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at contact@mdbootstrap.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 3ea5fbf8..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,32 +0,0 @@ -# Contributing Guide - -We value your and our time, we created this Guidline to avoid unnecessary diffuculties with pull requests and contribution process. - -Please read the text below **before starting your improvements** in order to help us make cooperation and reviewing experience as pleasent and effective as possible. - -Not following these rules and procedures may entail closing issues or rejection of your work even if it's theoreticly adequate. - -## Issues and Support - -1. **Use Support Forum** - don't use GitHub Issues for personal questions and support requests. We're maintaining a [dedicated Support Forum](https://mdbootstrap.com/support/) for this purpose. This is also a go-to place for every suggestion, opinion, bugs, and issue reports - if you'd like to receive help as soon as possible. Reports posted on Support Forum are **prior to GitHub issues**. - -2. **Check available resources** - always check [current issues](https://github.com/mdbootstrap/Angular-Bootstrap-with-Material-Design/issues) before opening your own. Also check [Support Forum](https://mdbootstrap.com/support/) and [Documentation](https://mdbootstrap.com/angular/) - most likely you'll find your answer there. Unchecked issues and duplicates will be closed immediatelly. - -3. **Examine issue source** - MDB code is depending on other projects, mainly [Bootstrap](https://github.com/twbs/bootstrap). Don't open issues concerning sources we cannot influence. For example - lack of flexbox support for older IE versions is determined by Bootstrap not MDB. - -4. **Check updates** - We resolve most of reported bugs and issues with every new release. Check if your MDB version is the latest. You can take a look at our [changelog](https://mdbootstrap.com/angular/changelog/) to find if your problem wasn't already taken care of. If you want to keep track on updates and bug fixes, the best way is joining our newsletter [here](https://mdbootstrap.com/angular/newsletter/). - -5. **Be specific** - describe your case **in English**, clearly and with details. Attach code examples, screenshots, links and any other relevant resources. - -## Contributing Standards -All improvements, fixes and new elements are welcome and we're deeply grateful for every help attempt. Although we recommend thinking twice before starting. We don't want to waste your time and some changes may be rejected not becouse of their quality but simply as a result of different style, organization or prefifined procedures we maintain. -That's why we came up with standards below, following them will maximize the chance of your contribution beeing included in project. - -1. Make sure that your idea doesn't contradict the concepts of [Bootstrap](https://getbootstrap.com/), [Material Design](https://material.io/guidelines/) and [Angular](https://angular.io/) -2. Verify if it fits the rest of MDB envoirement and style -3. Write and form your code accordingly to [those rules](http://codeguide.co/) -4. Use Gulp to minify your code after finishing -5. Create clear titles and detailed descriptions for your Pull Requests - -## Questions -If you're not sure about your ideas or you'd like to talk about them with our team before starting, write to: contact@mdbootstrap.com, and for every query regarding technical consultance open your case on [Support Forum](https://mdbootstrap.com/support/) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md deleted file mode 100644 index e7871c55..00000000 --- a/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,9 +0,0 @@ -### Expected behavior - -### Actual behavior - -### Your working environment and MDB version information - -### Resources (screenshots, code snippets etc.) - -For every **question of technical nature**, in order to get the most detailed answer as soon as possible, ask on our dedicated [Support Forum](https://mdbootstrap.com/support/) diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..fbaac732 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +MIT license for MDB Free + +Free packages are available under the MIT License. + +-- Highlights + +● Free for personal use + +● Free for commercial use + +● No attribution required + +-- Copyright notice + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions. + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +The software is provided "As is", without warranty of any kind, express or implied, including but not limited To the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall The authors or copyright holders be liable for any claim, damages or other liability, whether in an action of Contract, tort or otherwise, arising from, out of or in connection with the software or the use or other Dealings in the software. diff --git a/README.md b/README.md index d734587d..8c742a74 100644 --- a/README.md +++ b/README.md @@ -1,198 +1,240 @@ -[![Angular-Bootstrap-with-Material-Design](https://mdbootstrap.com/img/Marketing/products/social/angular/mdb-angular-free.jpg)](https://mdbootstrap.com/angular/) - -# Angular Bootstrap with Material Design - -[![npm version](https://badge.fury.io/js/angular-bootstrap-md.svg)](https://badge.fury.io/js/angular-bootstrap-md) - -Built with Angular 5, Bootstrap 4 and TypeScript. CLI version available. Absolutely no jQuery. - -400+ material UI elements, 600+ material icons, 74 CSS animations, TypeScript modules, SASS files and many more. +Bootstrap 5 & Angular 20 UI KIT - 700+ components, MIT license, simple installation. + +MDB is a collection of free Bootstrap templates, themes, design tools & resources. + +--- + +# Get started + +### [>> Get Started in 1 minute](https://mdbootstrap.com/docs/angular/getting-started/installation/) +Simple installation via .zip, npm or cdnjs. + +### [>> Install with MDBGO](https://mdbgo.com/) + Free Hosting, WordPress support, custom domains, SSL support, free database, frontend & backend templates, webpack starter included, git repostiory, FTP & jenkins support. + +### [>> Install with MDBGO + e-commerce shop integration](https://mdbgo.com/wordpress-shop/) +One click setup! MDB GO allows you to create a WordPress page with a single click. +Regardless whether you want to create a Travel Blog or an e-commerce shop to sell your product you can easily do that. You can even combine both into single page. + + +## About Material Design for Bootstrap 5 & Angular 20 + +

Created by + Downloads +License + + + MDBootstrap tutorial +

+ +Trusted by 3 000 000+ developers & designers. Used by companies & institutions like + + + + + + + + + +
+ + + + + + + + +
+ + + + + + + + +
+ + + + +
    +
  • 700+ UI components
  • +
  • Super simple, 1 minute installation
  • +
  • Detailed docs & practical examples
  • +
  • Lots of tutorials
  • +
  • Huge and active community
  • +
  • MIT license - free for personal & commercial use
  • +
+
+ +___ + +# Bootstrap 5 tutorial + +**[>> Learn more about Bootstrap 5](https://mdbootstrap.com/docs/standard/)** + + +**[>> Bootstrap 5 Tutorial](https://mdbootstrap.com/learn/mdb-foundations/basics/introduction/)** + +**[>> Subscribe to our YouTube channel with dozens of Bootstrap tutorials](https://www.youtube.com/c/Mdbootstrap)** + + + + + + + + + + + + +
+ + + + + + + +
+

Start learning from Basics

+ + + +
+

Learn Bootstrap 5 | Crash Course for Beginners in 1.5H

+ + + +
+ +--- + +# Demo + +#### Simplicity and ease of use are key features of MDB 5 Angular UI Kit. You need only one minute to install and run it. + +### Buttons + +

Use MDB custom button styles for actions in forms, dialogs, and more with support for multiple sizes, states, and more.

+ + +

+ +

+
+ + +

+ +

+
+ + +

+ +

+
+ + +

+ +

+
+ +### Spinners + +

Indicate the loading state of a component or page with MDB spinners, built entirely with HTML, CSS, and no JavaScript.

+ + +

+ +

+
+ + +

+ +

+
+ +### Cards + +

A card is a flexible and extensible content container. It includes options for headers and footers, a wide variety of content, contextual background colors, and powerful display options.

+ + +

+ +

+
+ +### Footer + +

A footer is an additional navigation component. It can hold links, buttons, company info, copyrights, forms, and many other elements.

+ + +

+ +

+
+ +### Hover + +

MDB hover effect appears when the user positions the computer cursor over an element without activating it. Hover effects make a website more interactive.

+ + +

+ +

+
+ + +

+ +

+
+ +### Notes + +

Notes are small components very helpful in inserting an additional piece of information.

+ + +

+ +

+
-All fully responsive. All compatible with different browsers. + -__________ +___ -# Demo: -**Main demo**: https://mdbootstrap.com/angular/components/ +# Extended documentation -# Version: -- Angular CLI 1.5.0 - 6.0.2 -- Angular 5.0.0 - 6.0.2 + diff --git a/README.txt b/README.txt index c21ba4ea..d746aa60 100644 --- a/README.txt +++ b/README.txt @@ -1,47 +1,15 @@ -Material Design for Bootstrap - Angular +MDB 5 Angular -Version: MDB - Angular 6.1.1 - -# Available commands - -* npm run build:lib - building library, -* npm run pack - copying assets and packaging /dist directory into .tgz archive -* npm run version - adjusting src/package.json version from main package.json file, -* npm run compile - Executing above commands with correct sequence. - -# Modules list - -* ButtonsModule, -* CarouselModule, -* ChartsModule, -* CollapseModule, -* InputsModule, -* ModalModule, -* NavbarModule, -* PopoverModule, -* TooltipModule, -* WavesModule, -* MDBBootstrapModule - contains every MDB modules. +Version: FREE 9.0.0 Documentation: -http://mdbootstrap.com/angular/ +https://mdbootstrap.com/docs/angular/ -Getting started: -http://mdbootstrap.com/angular/getting-started/ +Installation: +https://mdbootstrap.com/docs/angular/getting-started/installation/ -FAQ -http://mdbootstrap.com/angular/faq/ +CLI & hosting: +https://mdbgo.com/ Support: -http://mdbootstrap.com/forums/forum/support/ - -License: -http://mdbootstrap.com/license/ - -Facebook: https://facebook.com/mdbootstrap -Twitter: https://twitter.com/MDBootstrap -Google+: https://plus.google.com/u/0/+Mdbootstrap/posts -Dribbble: https://dribbble.com/mdbootstrap - -Contact: -office@mdbootstrap.com \ No newline at end of file +https://mdbootstrap.com/support/cat/angular/ diff --git a/angular-bootstrap-md-6.1.0.tgz b/angular-bootstrap-md-6.1.0.tgz deleted file mode 100644 index 91944249..00000000 Binary files a/angular-bootstrap-md-6.1.0.tgz and /dev/null differ diff --git a/angular.json b/angular.json index e3bd8862..4cfda010 100644 --- a/angular.json +++ b/angular.json @@ -1,157 +1,170 @@ { - "$schema": "./node_modules/@angular-devkit/core/src/workspace/workspace-schema.json", + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { - "mdb-test-angular": { - "root": "", + "mdb-angular-ui-kit-free": { "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", "architect": { "build": { - "builder": "@angular-devkit/build-angular:browser", + "builder": "@angular-devkit/build-angular:application", "options": { - "outputPath": "demo/dist", - "index": "demo/src/index.html", - "main": "demo/src/main.ts", - "tsConfig": "demo/src/tsconfig.app.json", - "polyfills": "demo/src/polyfills.ts", - "assets": [{ - "glob": "**/*", - "input": "demo/src/assets", - "output": "/assets" - }, - { - "glob": "favicon.ico", - "input": "demo/src", - "output": "/" - } + "outputPath": { + "base": "dist/mdb-angular-ui-kit-free" + }, + "index": "src/index.html", + "polyfills": [ + "src/polyfills.ts" ], - "styles": [{ - "input": "node_modules/font-awesome/scss/font-awesome.scss" - }, - { - "input": "node_modules/angular-bootstrap-md/scss/bootstrap/bootstrap.scss" - }, - { - "input": "node_modules/angular-bootstrap-md/scss/mdb-free.scss" - }, - { - "input": "demo/src/styles.scss" - } + "tsConfig": "tsconfig.app.json", + "assets": [ + "src/favicon.ico", + "src/assets" ], - "scripts": ["node_modules/chart.js/dist/Chart.js"] + "styles": [ + "src/styles.scss" + ], + "scripts": [], + "extractLicenses": false, + "sourceMap": true, + "optimization": false, + "namedChunks": true, + "browser": "src/main.ts" }, "configurations": { "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], "optimization": true, "outputHashing": "all", "sourceMap": false, - "extractCss": true, "namedChunks": false, - "aot": true, "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "fileReplacements": [{ - "replace": "demo/src/environments/environment.ts", - "with": "demo/src/environments/environment.prod.ts" - }] + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "6kb", + "maximumError": "10kb" + } + ] } - } + }, + "defaultConfiguration": "" }, "serve": { "builder": "@angular-devkit/build-angular:dev-server", "options": { - "browserTarget": "mdb-test-angular:build" + "buildTarget": "mdb-angular-ui-kit-free:build" }, "configurations": { "production": { - "browserTarget": "mdb-test-angular:build:production" + "buildTarget": "mdb-angular-ui-kit-free:build:production" } } }, "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { - "browserTarget": "mdb-test-angular:build" + "buildTarget": "mdb-angular-ui-kit-free:build" } }, "test": { - "builder": "@angular-devkit/build-angular:karma", + "builder": "@angular-builders/jest:run", "options": { - "main": "demo/src/test.ts", - "karmaConfig": "./karma.conf.js", - "polyfills": "demo/src/polyfills.ts", - "tsConfig": "demo/src/tsconfig.spec.json", - "scripts": [], + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "assets": [ + "src/favicon.ico", + "src/assets" + ], "styles": [ - "node_modules/font-awesome/scss/font-awesome.scss", - "node_modules/angular-bootstrap-md/scss/bootstrap/bootstrap.scss", - "node_modules/angular-bootstrap-md/scss/mdb-free.scss", - "demo/src/styles.scss" + "src/styles.scss" ], - "assets": [{ - "glob": "**/*", - "input": "demo/src/assets", - "output": "/assets" - }, - { - "glob": "favicon.ico", - "input": "demo/src", - "output": "/" - } - ] + "scripts": [] } }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", "options": { - "tsConfig": [ - "src/tsconfig.app.json", - "src/tsconfig.spec.json" - ], - "exclude": [ - "**/node_modules/**" - ] + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "mdb-angular-ui-kit-free:serve" + }, + "configurations": { + "production": { + "devServerTarget": "mdb-angular-ui-kit-free:serve:production" + } } } } }, - "mdb-test-angular-e2e": { - "root": "", - "projectType": "application", - "cli": {}, - "schematics": {}, + "mdb-angular-ui-kit": { + "projectType": "library", + "root": "projects/mdb-angular-ui-kit", + "sourceRoot": "projects/mdb-angular-ui-kit/src", + "prefix": "lib", "architect": { - "e2e": { - "builder": "@angular-devkit/build-angular:protractor", + "build": { + "builder": "@angular-devkit/build-angular:ng-packagr", "options": { - "protractorConfig": "./protractor.conf.js", - "devServerTarget": "mdb-test-angular:serve" + "tsConfig": "projects/mdb-angular-ui-kit/tsconfig.lib.json", + "project": "projects/mdb-angular-ui-kit/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "projects/mdb-angular-ui-kit/tsconfig.lib.prod.json" + } } }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", + "test": { + "builder": "@angular-builders/jest:run", "options": { - "tsConfig": [ - "e2e/tsconfig.e2e.json" - ], - "exclude": [ - "**/node_modules/**" - ] + "tsConfig": "projects/mdb-angular-ui-kit/tsconfig.spec.json" } } } } }, - "cli": {}, "schematics": { "@schematics/angular:component": { - "prefix": "app", - "styleext": "scss" + "type": "component" }, "@schematics/angular:directive": { - "prefix": "app" + "type": "directive" + }, + "@schematics/angular:service": { + "type": "service" + }, + "@schematics/angular:guard": { + "typeSeparator": "." + }, + "@schematics/angular:interceptor": { + "typeSeparator": "." + }, + "@schematics/angular:module": { + "typeSeparator": "." + }, + "@schematics/angular:pipe": { + "typeSeparator": "." + }, + "@schematics/angular:resolver": { + "typeSeparator": "." } } -} +} \ No newline at end of file diff --git a/changelog b/changelog deleted file mode 100644 index cffbee68..00000000 --- a/changelog +++ /dev/null @@ -1,207 +0,0 @@ -6.1.1 -*** NOTE: *** -You may need to rename the modules you are using in your application. The list of modified modules is presented below. - -In 6.1.0 we have made it possible to import only those modules that you actually use in your application. -If only individual modules are used, import them but do not import the MDBBootstrapModulesPro main module as this may cause errors. - -*** What's new: *** - Source code delivered to customers is now compilated to .js instead of .ts, - There's now possibility to import only those modules, which you need in your project. Full module list: https://mdbootstrap.com/angular/modules-list - Changed names of few modules: - * MDBChartsModule -> ChartsModule, - * BsDropdownModule -> DropdownModule, - * MDBTooltipModule -> TooltipModule, - * SqueezeBoxModule -> AccordionModule, - * Ng2CompleterModule -> AutocompleteModule, - * MDBDatePickerModule -> DatepickerModule, - * MDBUploaderModule -> FileInputModule, - * MDBPageScrollModule -> SmoothscrollModule, - * MdbStickyModule -> StickyContentModule, - * MaterialRootModule -> PreloadersModule. - -*** Fixes: *** - Fixed missing space in mdb-angular.scss file, - Added close icon to Autocomplete, - Fixed problem with prefilling Char Counter value, - Fixed problem with overlapping label & error / success messages with mdbInputDirective, - Fixed problem with focusing inputs through TAB key. - - -6.0.2 -*** General: *** - Changed Renderer to Renderer2. - -*** Fixes: *** - Unnable to scroll in Sidenav, - Fixed problems with skins, - Fixed mobile view in DatePicker, - Fixed problem with scrolling page to the top edge in DatePicker, - Fixed problem with scrolling page to the top edge in TimePicker. - - -6.0.1 -*** Fixes: *** - Fix for dropdowns, dropup variation, - Fix for fixed button when collapsing (need to pass $event in .toggle() method), - Few fixes in scss - - -6.0.0 -*** NOTE: Most of the components have been rebuilt. Please, check the ones you use in your project. *** - -*** General: *** - - Compatible with MDB 4.5.1, - Compatible with Angular 6.0.0-rc.5, rxjs 6.0.0-uncanny-rc.7 and rxjs-compat 6.0.0-uncanny-rc.7, - Compatible with Angular CLI ^1.7.1. - -*** NOTE 2: For proper using Angular 6 with MDB Angular 6 please check, if you're using rxjs in version at least 6.0.0-uncanny-rc.7 and rxjs-compat in version at least 6.0.0-uncanny-rc.7. Using older versions may produce errors and problems. *** - -*** Marked as deprecated: *** - - mdbActive, - mdbInputValidate, - mdbDeepDirective, - mdbRippleRadius. - -mdbInputDirective has three of the above directives - mdbActive, mdbInputValidate and mdbDeepDirective. - -mdbActive is used by default and we do not anticipate that you will be able to disable it. - -mdbInputValidate is used by default, but the user can disable validation by using the [mdbValidate]="false" control on input which contains mdbInputDirective. - -mdbDeepDirective is used by default when used on a checkbox or radio. It is possible to disable it by using [focusCheckbox]="false" and [focusRadio]="false". - -mdbRippleRadius was changed to mdbWavesEffect. mdbRippleRadius will be deleted after next release. - -*** Fixes: *** - - Fix for z-index in few scenarios (tabs & datePicker), navbar and other, - Fixed clearUnselected in Autocomplete, - Fix for mdbActive in Autocomplete. - -*** Features: *** - - Added feature to close datePicker after selecting an date (closeAfterSelect: true) in datePicker options object. - -*** Docs: *** - - New category Forms, - Autocomplete, Inputs, Input Validation, Forms moved from Components to Forms, - Material Select moved from Advanced to Forms, - Input Groups moved from Extended to Forms, - Added instructions how to update Angular projects: https://mdbootstrap.com/getting-started/update-instructions/ - Added instructions how to create project with Angular Universal: https://mdbootstrap.com/getting-started/universal/ - -*** Changed syntax: *** - - Cards, - Flipping Cards, - Intros, - Sections, - Inputs, - Footers, - Preloaders, - Masks, - Hover Effects, - Accordion, - Modals, - -5.2.3 -*** Compatibility with Angular Universal (Server-Side Rendering) ***. Read tutorial. -Improved dropdown animation in Material Select, -Fixed problem with dropdown transition in Material Select, -"Not Found" message in Material Select will be visible only when filtering does not show results , -Fix for top / bottom arrow in Material Select, -Added possibility to overwrite $image-path variable. - -5.2.2 -Hotfixes not included in 5.2.1 patch - -5.2.1 -Enhanced mdbActive directive - works with data prefilled by browser -Sidenav issue fixed (skin is optional) -Fixed with rounded buttons inside input group -Fixed for dropdown not getting closed after click in other dropdown. -Fix for line breaking label in checkboxes - -5.2.0 -Updated to Bootstrap 4 stable version -Integration with .NET CORE - tutorial here -Compatibility with Angular 5.2.1 and CLI 1.6.5 -noImplicitAny and strictNullChecks compatibility -New validation added (number, tel, submit) + custom validation regex. Read tutorial. -Configurable labels for DatePicker - -5.1.2 -Angular 5.2.1 and CLI 1.6.5 compatibility -Extended docs for modals - auto focus on input -Fixed validation for email and password -Aria attributes added to datepicker -Added filtering options to Material Select -Support for IE+ and Edge for Double Navigation -Extended DatePicker with new functionality: -Important! -By default date picker will load now +- 7 years starting from current year. It can be overwritten using minYear and maxYear parameters: - -import { Component } from '@angular/core'; -import { IMyOptions } from 'your_path_to/date-picker/index'; - -@Component({ - selector: 'date-picker-component-example', - templateUrl: 'toast.component.html' -}) - - export class DatePickerComponentExample { - public myDatePickerOptions: IMyOptions = { - minYear: 2015, - maxYear: 2017 - }; -} - -5.1.1 -Double navigation - support for collapsed sidenav and navbar -Extended documentation for Autocomplete -Auto resize function for collapse added -Mobile gestures carousel support added -Added option to hide next / prev buttons in carousel -Fix for: Module has no exported member 'MDBSpinningPreloader' -Automatically set date in DatePicker using ngModel -Fixed docs for File Upload - -5.1.0 -Angular 5.1.3 and CLI 1.6.3. compatibility -Fixed issue with exceeding text tabs component -Auto-close navbar after click into link (check documentation for more information) -Fixed problem with error/success message on Firefox -Fixed problems with selecting hour on mobile devices in Timepicker -Extended configuration options of easy pie charts (check documentation for more information) -Fixed for relative path in _skins.scss -Fixed issue with date picker for Firefox -Enhanced support for small screen resolution in Datepicker (<575 px) -Fix for issue while using multiple MDB Autocomplete components - -5.0.5 -Added compatibility with noUnusedLocals - -5.0.4 -Added compatibility with noUnusedParameters - -5.0.3 -Fixed missing arrow in popovers - -5.0.2 -Fixed circular dependencies error. - -5.0.1 -Fixed for imgPath in .scss - -5.0.0 -Version 5.0.0 brings brings compatibility with new Angular 5.0 and CLI 1.5. Except for that new update include Bootstrap 4 Beta 2 assets. - -What's new in Bootstrap 4 beta-2: - -Restored `.offset-*` classes -Switched Breadcrumbs from `float` to Flexbox -Dropped support for Bower \ No newline at end of file diff --git a/demo/e2e/app.e2e-spec.ts b/demo/e2e/app.e2e-spec.ts deleted file mode 100644 index 5981c159..00000000 --- a/demo/e2e/app.e2e-spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { MdbTestAngularPage } from './app.po'; - -describe('mdb-test-angular App', () => { - let page: MdbTestAngularPage; - - beforeEach(() => { - page = new MdbTestAngularPage(); - }); - - it('should display welcome message', () => { - page.navigateTo(); - expect(page.getParagraphText()).toEqual('Welcome to app!'); - }); -}); diff --git a/demo/e2e/app.po.ts b/demo/e2e/app.po.ts deleted file mode 100644 index c296eff5..00000000 --- a/demo/e2e/app.po.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { browser, by, element } from 'protractor'; - -export class MdbTestAngularPage { - navigateTo() { - return browser.get('/'); - } - - getParagraphText() { - return element(by.css('app-root h1')).getText(); - } -} diff --git a/demo/src/README.md b/demo/src/README.md deleted file mode 100644 index 2d4b7576..00000000 --- a/demo/src/README.md +++ /dev/null @@ -1,177 +0,0 @@ -[![Angular-Bootstrap-with-Material-Design](https://mdbootstrap.com/img/Mockups/MDB-post/angular-about5.jpg)](https://mdbootstrap.com/angular/) - -# Angular Bootstrap with Material Design - -[![npm version](https://badge.fury.io/js/angular-bootstrap-md.svg)](https://badge.fury.io/js/angular-bootstrap-md) - -Built with Angular 5, Bootstrap 4 and TypeScript. CLI version available. Absolutely no jQuery. - -400+ material UI elements, 600+ material icons, 74 CSS animations, TypeScript modules, SASS files and many more. - -All fully responsive. All compatible with different browsers. - -__________ - -# Demo: -**Main demo**: https://mdbootstrap.com/angular/components/ - -# Version: -- Angular CLI 1.5.0 - 6.0.2 -- Angular 5.0.0 - 6.0.2 - -# Quick start -- Clone following repo: -```javascript -git clone https://github.com/mdbootstrap/Angular-Bootstrap-with-Material-Design.git . -``` -note "." at the end. It will clone files directly into current folder. -- Run `npm i` -- Run `npm start` -- Voilà! Open browser and visit http://localhost:4200 - -Now you can navigate to our documentation (http://mdbootstrap.com/angular/), pick any component and place within your project. - -# How to install MDB via npm: -- create new project `ng new project_name --style=scss` -- `npm i angular-bootstrap-md --save` -- to app.module.ts add -```javascript -import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core'; -import { MDBBootstrapModule } from 'angular-bootstrap-md'; - -@NgModule({ - imports: [ - MDBBootstrapModule.forRoot() - ], - schemas: [ NO_ERRORS_SCHEMA ] -}); -``` -- in angular-cli.json change: - -`"styleExt": "css"` to `"styleExt": "scss"` - -rename /src/styles.css to styles.scss - -- if you want to change styles in exisiting project you can use `ng set defaults.styleExt scss` - -- add below lines to angular-cli.json: -```javascript -"styles": [ - "../node_modules/font-awesome/scss/font-awesome.scss", - "../node_modules/angular-bootstrap-md/scss/bootstrap/bootstrap.scss", - "../node_modules/angular-bootstrap-md/scss/mdb-free.scss", - "./styles.scss" -], -"scripts": [ - "../node_modules/chart.js/dist/Chart.js", - "../node_modules/hammerjs/hammer.min.js" -], -``` -- install external libs -```bash -npm install -–save chart.js@2.5.0 font-awesome hammerjs -``` - -### Run server -```bash -ng serve --open -``` - -## Getting started: - -http://mdbootstrap.com/angular/getting-started/ - -**5min Quick Start**: https://mdbootstrap.com/angular/5min-quickstart/ - -# Additional tutorials: - -**MDB - Bootstrap tutorial**: https://mdbootstrap.com/bootstrap-tutorial/ - -**MDB - Wordpress tutorial**: https://mdbootstrap.com/wordpress-tutorial/ - -# PRO version: - -**Angular Bootstrap with Material Design PRO (from $79)**: https://mdbootstrap.com/product/angular-bootstrap-pro/ - -## Documentation: -**Huge, detailed documentation avilable online on**: http://mdbootstrap.com/angular/ - -# Highlights: -**Bootstrap 4** -Up-to-date with the latest standards of Bootstrap 4 and all the best it has to offer. - -**Angular CLI** -A command line interface handling all the tedious tasks for you out of the box. - -**Detailed documentation** -Intuitive and user-friendly documentation, created with a copy-paste approach. - -**No jQuery** -Writing you code with pure Angular is now quicker, easier, and cleaner. - -**TypeScript** -Superset of JavaScript that compiles to clean JavaScript output. - -**Angular 6** -Create smarter and faster Angular apps with the latest official Angular release. - -**Cross-browser compatibility** -Works perfectly with Chrome, Firefox, IE, Safari, Opera and Microsoft Edge. - -**Frequent updates** -Expect any bugs being fixed in a matter of days. - -**Active community** -MDB is broadly used by professionals on multiple levels, who are ready to aid you. - -**Modularity** -Use TypeScript modules to compile package adjusted yo your needs. - -**Useful helpers** -Reduce the frequency of highly repetitive declarations in your CSS. - -**Technical support** -Every day we help our users with their issues and problems. - -**SASS files** -Thought-out .scss files come in a compile-ready form. - -**Flexbox** -Full support of Flexbox layout system lets you forget about alignment issues. - - -A big **thank you to all our users** who are working with us to improve the software. We wouldn't be where we are without you. - - -# Useful Links: - -Getting started: https://mdbootstrap.com/angular-bootstrap-getting-started/ - -5 min quick start: https://mdbootstrap.com/angular/5min-quickstart/ - -Material Design + Bootstrap Tutorial: https://mdbootstrap.com/bootstrap-tutorial/ - -Material Design + WordPress Tutorial: https://mdbootstrap.com/wordpress-tutorial/ - -Freebies: https://mdbootstrap.com/freebies/ - -Premium Templates: https://mdbootstrap.com/templates/ - -Changelog: https://mdbootstrap.com/angular/changelog/ - -# Social Media: - -Twitter: https://twitter.com/MDBootstrap - -Facebook: https://www.facebook.com/mdbootstrap - -Pinterest: https://pl.pinterest.com/mdbootstrap - -Google+: https://plus.google.com/u/0/b/107863090883699620484/+Mdbootstrap/posts - -Dribbble: https://dribbble.com/mdbootstrap - -LinkedIn: https://www.linkedin.com/company/material-design-for-bootstrap - -## Contact: -office@mdbootstrap.com diff --git a/demo/src/app/app.component.html b/demo/src/app/app.component.html deleted file mode 100644 index b0307a7f..00000000 --- a/demo/src/app/app.component.html +++ /dev/null @@ -1,12 +0,0 @@ - -
-
-

Material Design for Bootstrap (Angular)

- -
Thank you for using our product. We're glad you're with us.
-
Start browsing documentation.
- -

MDB Team

-
-
- \ No newline at end of file diff --git a/demo/src/app/app.component.spec.ts b/demo/src/app/app.component.spec.ts deleted file mode 100644 index 9510495a..00000000 --- a/demo/src/app/app.component.spec.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { TestBed, async } from '@angular/core/testing'; - -import { AppComponent } from './app.component'; - -describe('AppComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ - AppComponent - ], - }).compileComponents(); - })); - - it('should create the app', async(() => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.debugElement.componentInstance; - expect(app).toBeTruthy(); - })); - - it(`should have as title 'app'`, async(() => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.debugElement.componentInstance; - expect(app.title).toEqual('app'); - })); - - it('should render title in a h1 tag', async(() => { - const fixture = TestBed.createComponent(AppComponent); - fixture.detectChanges(); - const compiled = fixture.debugElement.nativeElement; - expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!'); - })); -}); diff --git a/demo/src/app/app.component.ts b/demo/src/app/app.component.ts deleted file mode 100644 index a626a1e6..00000000 --- a/demo/src/app/app.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.css'] -}) -export class AppComponent { - -} diff --git a/demo/src/app/app.module.ts b/demo/src/app/app.module.ts deleted file mode 100644 index 6a8e3fac..00000000 --- a/demo/src/app/app.module.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { BrowserModule } from '@angular/platform-browser'; -import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core'; -import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; -import { MDBBootstrapModule } from 'angular-bootstrap-md'; -@NgModule({ - declarations: [ - AppComponent, - ], - imports: [ - BrowserModule, - RouterModule.forRoot([]), - MDBBootstrapModule.forRoot() - ], - schemas: [ NO_ERRORS_SCHEMA ], - bootstrap: [AppComponent] -}) -export class AppModule { -} diff --git a/demo/src/changelog b/demo/src/changelog deleted file mode 100644 index a6a83c89..00000000 --- a/demo/src/changelog +++ /dev/null @@ -1,207 +0,0 @@ -6.1.0 -*** NOTE: *** -You may need to rename the modules you are using in your application. The list of modified modules is presented below. - -In 6.1.0 we have made it possible to import only those modules that you actually use in your application. -If only individual modules are used, import them but do not import the MDBBootstrapModulesPro main module as this may cause errors. - -*** What's new: *** - Source code delivered to customers is now compilated to .js instead of .ts, - There's now possibility to import only those modules, which you need in your project. Full module list: https://mdbootstrap.com/angular/modules-list - Changed names of few modules: - * MDBChartsModule -> ChartsModule, - * BsDropdownModule -> DropdownModule, - * MDBTooltipModule -> TooltipModule, - * SqueezeBoxModule -> AccordionModule, - * Ng2CompleterModule -> AutocompleteModule, - * MDBDatePickerModule -> DatepickerModule, - * MDBUploaderModule -> FileInputModule, - * MDBPageScrollModule -> SmoothscrollModule, - * MdbStickyModule -> StickyContentModule, - * MaterialRootModule -> PreloadersModule. - -*** Fixes: *** - Fixed missing space in mdb-angular.scss file, - Added close icon to Autocomplete, - Fixed problem with prefilling Char Counter value, - Fixed problem with overlapping label & error / success messages with mdbInputDirective, - Fixed problem with focusing inputs through TAB key. - - -6.0.2 -*** General: *** - Changed Renderer to Renderer2. - -*** Fixes: *** - Unnable to scroll in Sidenav, - Fixed problems with skins, - Fixed mobile view in DatePicker, - Fixed problem with scrolling page to the top edge in DatePicker, - Fixed problem with scrolling page to the top edge in TimePicker. - - -6.0.1 -*** Fixes: *** - Fix for dropdowns, dropup variation, - Fix for fixed button when collapsing (need to pass $event in .toggle() method), - Few fixes in scss - - -6.0.0 -*** NOTE: Most of the components have been rebuilt. Please, check the ones you use in your project. *** - -*** General: *** - - Compatible with MDB 4.5.1, - Compatible with Angular 6.0.0-rc.5, rxjs 6.0.0-uncanny-rc.7 and rxjs-compat 6.0.0-uncanny-rc.7, - Compatible with Angular CLI ^1.7.1. - -*** NOTE 2: For proper using Angular 6 with MDB Angular 6 please check, if you're using rxjs in version at least 6.0.0-uncanny-rc.7 and rxjs-compat in version at least 6.0.0-uncanny-rc.7. Using older versions may produce errors and problems. *** - -*** Marked as deprecated: *** - - mdbActive, - mdbInputValidate, - mdbDeepDirective, - mdbRippleRadius. - -mdbInputDirective has three of the above directives - mdbActive, mdbInputValidate and mdbDeepDirective. - -mdbActive is used by default and we do not anticipate that you will be able to disable it. - -mdbInputValidate is used by default, but the user can disable validation by using the [mdbValidate]="false" control on input which contains mdbInputDirective. - -mdbDeepDirective is used by default when used on a checkbox or radio. It is possible to disable it by using [focusCheckbox]="false" and [focusRadio]="false". - -mdbRippleRadius was changed to mdbWavesEffect. mdbRippleRadius will be deleted after next release. - -*** Fixes: *** - - Fix for z-index in few scenarios (tabs & datePicker), navbar and other, - Fixed clearUnselected in Autocomplete, - Fix for mdbActive in Autocomplete. - -*** Features: *** - - Added feature to close datePicker after selecting an date (closeAfterSelect: true) in datePicker options object. - -*** Docs: *** - - New category Forms, - Autocomplete, Inputs, Input Validation, Forms moved from Components to Forms, - Material Select moved from Advanced to Forms, - Input Groups moved from Extended to Forms, - Added instructions how to update Angular projects: https://mdbootstrap.com/getting-started/update-instructions/ - Added instructions how to create project with Angular Universal: https://mdbootstrap.com/getting-started/universal/ - -*** Changed syntax: *** - - Cards, - Flipping Cards, - Intros, - Sections, - Inputs, - Footers, - Preloaders, - Masks, - Hover Effects, - Accordion, - Modals, - -5.2.3 -*** Compatibility with Angular Universal (Server-Side Rendering) ***. Read tutorial. -Improved dropdown animation in Material Select, -Fixed problem with dropdown transition in Material Select, -"Not Found" message in Material Select will be visible only when filtering does not show results , -Fix for top / bottom arrow in Material Select, -Added possibility to overwrite $image-path variable. - -5.2.2 -Hotfixes not included in 5.2.1 patch - -5.2.1 -Enhanced mdbActive directive - works with data prefilled by browser -Sidenav issue fixed (skin is optional) -Fixed with rounded buttons inside input group -Fixed for dropdown not getting closed after click in other dropdown. -Fix for line breaking label in checkboxes - -5.2.0 -Updated to Bootstrap 4 stable version -Integration with .NET CORE - tutorial here -Compatibility with Angular 5.2.1 and CLI 1.6.5 -noImplicitAny and strictNullChecks compatibility -New validation added (number, tel, submit) + custom validation regex. Read tutorial. -Configurable labels for DatePicker - -5.1.2 -Angular 5.2.1 and CLI 1.6.5 compatibility -Extended docs for modals - auto focus on input -Fixed validation for email and password -Aria attributes added to datepicker -Added filtering options to Material Select -Support for IE+ and Edge for Double Navigation -Extended DatePicker with new functionality: -Important! -By default date picker will load now +- 7 years starting from current year. It can be overwritten using minYear and maxYear parameters: - -import { Component } from '@angular/core'; -import { IMyOptions } from 'your_path_to/date-picker/index'; - -@Component({ - selector: 'date-picker-component-example', - templateUrl: 'toast.component.html' -}) - - export class DatePickerComponentExample { - public myDatePickerOptions: IMyOptions = { - minYear: 2015, - maxYear: 2017 - }; -} - -5.1.1 -Double navigation - support for collapsed sidenav and navbar -Extended documentation for Autocomplete -Auto resize function for collapse added -Mobile gestures carousel support added -Added option to hide next / prev buttons in carousel -Fix for: Module has no exported member 'MDBSpinningPreloader' -Automatically set date in DatePicker using ngModel -Fixed docs for File Upload - -5.1.0 -Angular 5.1.3 and CLI 1.6.3. compatibility -Fixed issue with exceeding text tabs component -Auto-close navbar after click into link (check documentation for more information) -Fixed problem with error/success message on Firefox -Fixed problems with selecting hour on mobile devices in Timepicker -Extended configuration options of easy pie charts (check documentation for more information) -Fixed for relative path in _skins.scss -Fixed issue with date picker for Firefox -Enhanced support for small screen resolution in Datepicker (<575 px) -Fix for issue while using multiple MDB Autocomplete components - -5.0.5 -Added compatibility with noUnusedLocals - -5.0.4 -Added compatibility with noUnusedParameters - -5.0.3 -Fixed missing arrow in popovers - -5.0.2 -Fixed circular dependencies error. - -5.0.1 -Fixed for imgPath in .scss - -5.0.0 -Version 5.0.0 brings brings compatibility with new Angular 5.0 and CLI 1.5. Except for that new update include Bootstrap 4 Beta 2 assets. - -What's new in Bootstrap 4 beta-2: - -Restored `.offset-*` classes -Switched Breadcrumbs from `float` to Flexbox -Dropped support for Bower \ No newline at end of file diff --git a/demo/src/environments/environment.ts b/demo/src/environments/environment.ts deleted file mode 100644 index b7f639ae..00000000 --- a/demo/src/environments/environment.ts +++ /dev/null @@ -1,8 +0,0 @@ -// The file contents for the current environment will overwrite these during build. -// The build system defaults to the dev environment which uses `environment.ts`, but if you do -// `ng build --env=prod` then `environment.prod.ts` will be used instead. -// The list of which env maps to which file can be found in `.angular-cli.json`. - -export const environment = { - production: false -}; diff --git a/demo/src/favicon.ico b/demo/src/favicon.ico deleted file mode 100644 index 8081c7ce..00000000 Binary files a/demo/src/favicon.ico and /dev/null differ diff --git a/demo/src/index.html b/demo/src/index.html deleted file mode 100644 index 26a21d4e..00000000 --- a/demo/src/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - MDB Angular - - - - - - - - - diff --git a/demo/src/polyfills.ts b/demo/src/polyfills.ts deleted file mode 100644 index 7831e97b..00000000 --- a/demo/src/polyfills.ts +++ /dev/null @@ -1,72 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE9, IE10 and IE11 requires all of the following polyfills. **/ -// import 'core-js/es6/symbol'; -// import 'core-js/es6/object'; -// import 'core-js/es6/function'; -// import 'core-js/es6/parse-int'; -// import 'core-js/es6/parse-float'; -// import 'core-js/es6/number'; -// import 'core-js/es6/math'; -// import 'core-js/es6/string'; -// import 'core-js/es6/date'; -// import 'core-js/es6/array'; -// import 'core-js/es6/regexp'; -// import 'core-js/es6/map'; -// import 'core-js/es6/weak-map'; -// import 'core-js/es6/set'; - -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** Evergreen browsers require these. **/ -import 'core-js/es6/reflect'; -import 'core-js/es7/reflect'; - - -/** - * Required to support Web Animations `@angular/animation`. - * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation - **/ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - - - -/*************************************************************************************************** - * Zone JS is required by Angular itself. - */ -import 'zone.js/dist/zone'; // Included with Angular CLI. - - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ - -/** - * Date, currency, decimal and percent pipes. - * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 - */ -// import 'intl'; // Run `npm install --save intl`. -/** - * Need to import at least one locale-data with intl. - */ -// import 'intl/locale-data/jsonp/en'; diff --git a/demo/src/styles.scss b/demo/src/styles.scss deleted file mode 100644 index 90d4ee00..00000000 --- a/demo/src/styles.scss +++ /dev/null @@ -1 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ diff --git a/demo/src/test.ts b/demo/src/test.ts deleted file mode 100644 index cd612eeb..00000000 --- a/demo/src/test.ts +++ /dev/null @@ -1,32 +0,0 @@ -// This file is required by karma.conf.js and loads recursively all the .spec and framework files - -import 'zone.js/dist/long-stack-trace-zone'; -import 'zone.js/dist/proxy.js'; -import 'zone.js/dist/sync-test'; -import 'zone.js/dist/jasmine-patch'; -import 'zone.js/dist/async-test'; -import 'zone.js/dist/fake-async-test'; -import { getTestBed } from '@angular/core/testing'; -import { - BrowserDynamicTestingModule, - platformBrowserDynamicTesting -} from '@angular/platform-browser-dynamic/testing'; - -// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. -declare const __karma__: any; -declare const require: any; - -// Prevent Karma from running prematurely. -__karma__.loaded = function () {}; - -// First, initialize the Angular testing environment. -getTestBed().initTestEnvironment( - BrowserDynamicTestingModule, - platformBrowserDynamicTesting() -); -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().map(context); -// Finally, start Karma to run the tests. -__karma__.start(); diff --git a/demo/src/tsconfig.app.json b/demo/src/tsconfig.app.json deleted file mode 100644 index 69d329f8..00000000 --- a/demo/src/tsconfig.app.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/app", - "baseUrl": "./", - "module": "es2015", - "types": [] - }, - "exclude": [ - "test.ts", - "**/*.spec.ts" - ] -} diff --git a/demo/src/tsconfig.json b/demo/src/tsconfig.json deleted file mode 100644 index 229e106d..00000000 --- a/demo/src/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compileOnSave": false, - "compilerOptions": { - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "moduleResolution": "node", - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "target": "es5", - "typeRoots": [ - "../../node_modules/@types" - ], - "lib": [ - "es2016", - "dom" - ] - } -} diff --git a/demo/src/tsconfig.spec.json b/demo/src/tsconfig.spec.json deleted file mode 100644 index f8b13d70..00000000 --- a/demo/src/tsconfig.spec.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/spec", - "baseUrl": "./", - "module": "commonjs", - "target": "es5", - "types": [ - "jasmine", - "node" - ] - }, - "files": [ - "test.ts", - "polyfills.ts" - ], - "include": [ - "**/*.spec.ts", - "**/*.d.ts" - ] -} \ No newline at end of file diff --git a/demo/src/typings.d.ts b/demo/src/typings.d.ts deleted file mode 100644 index ef5c7bd6..00000000 --- a/demo/src/typings.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/* SystemJS module definition */ -declare var module: NodeModule; -interface NodeModule { - id: string; -} diff --git a/protractor.conf.js b/e2e/protractor.conf.js similarity index 52% rename from protractor.conf.js rename to e2e/protractor.conf.js index 7ee3b5ee..361e7f0c 100644 --- a/protractor.conf.js +++ b/e2e/protractor.conf.js @@ -1,17 +1,22 @@ +// @ts-check // Protractor configuration file, see link for more information // https://github.com/angular/protractor/blob/master/lib/config.ts -const { SpecReporter } = require('jasmine-spec-reporter'); +const { SpecReporter, StacktraceOption } = require('jasmine-spec-reporter'); +/** + * @type { import("protractor").Config } + */ exports.config = { allScriptsTimeout: 11000, specs: [ - './e2e/**/*.e2e-spec.ts' + './src/**/*.e2e-spec.ts' ], capabilities: { - 'browserName': 'chrome' + browserName: 'chrome' }, directConnect: true, + SELENIUM_PROMISE_MANAGER: false, baseUrl: 'http://localhost:4200/', framework: 'jasmine', jasmineNodeOpts: { @@ -21,8 +26,12 @@ exports.config = { }, onPrepare() { require('ts-node').register({ - project: 'e2e/tsconfig.e2e.json' + project: require('path').join(__dirname, './tsconfig.json') }); - jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + jasmine.getEnv().addReporter(new SpecReporter({ + spec: { + displayStacktrace: StacktraceOption.PRETTY + } + })); } -}; +}; \ No newline at end of file diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts new file mode 100644 index 00000000..76959236 --- /dev/null +++ b/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', async () => { + await page.navigateTo(); + expect(await page.getTitleText()).toEqual('mdb-angular-ui-kit-free app is running!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts new file mode 100644 index 00000000..c9c85ab9 --- /dev/null +++ b/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + async navigateTo(): Promise { + return browser.get(browser.baseUrl); + } + + async getTitleText(): Promise { + return element(by.css('app-root .content span')).getText(); + } +} diff --git a/demo/e2e/tsconfig.e2e.json b/e2e/tsconfig.json similarity index 63% rename from demo/e2e/tsconfig.e2e.json rename to e2e/tsconfig.json index 1d9e5edf..0782539c 100644 --- a/demo/e2e/tsconfig.e2e.json +++ b/e2e/tsconfig.json @@ -1,13 +1,12 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ { "extends": "../tsconfig.json", "compilerOptions": { "outDir": "../out-tsc/e2e", - "baseUrl": "./", "module": "commonjs", - "target": "es5", + "target": "es2018", "types": [ "jasmine", - "jasminewd2", "node" ] } diff --git a/gulpfile.lib.js b/gulpfile.lib.js deleted file mode 100644 index b0abfd66..00000000 --- a/gulpfile.lib.js +++ /dev/null @@ -1 +0,0 @@ -require('./src/build-tools/gulpfile'); diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000..7ef195b4 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,7 @@ +module.exports = { + moduleNameMapper: { + '@core/(.*)': '/src/app/core/$1', + }, + preset: 'jest-preset-angular', + setupFilesAfterEnv: ['/setup-jest.ts'], +}; diff --git a/karma.conf.js b/karma.conf.js deleted file mode 100644 index f5b200ca..00000000 --- a/karma.conf.js +++ /dev/null @@ -1,33 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/0.13/config/configuration-file.html - -module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - require('@angular-devkit/build-angular/plugins/karma') - ], - client:{ - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ], - fixWebpackSourcePaths: true - }, - angularCli: { - environment: 'dev' - }, - reporters: ['progress', 'kjhtml'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false - }); -}; diff --git a/license.pdf b/license.pdf deleted file mode 100644 index a5aec954..00000000 Binary files a/license.pdf and /dev/null differ diff --git a/license.txt b/license.txt new file mode 100644 index 00000000..5cb75e94 --- /dev/null +++ b/license.txt @@ -0,0 +1,153 @@ +Free packages are available under the MIT License. + +**Hightlights** + +- Free for personal use +- Free for commercial use +- No attribution required + +**Copyright notice** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions. + +The above copyright notice and this permission notice shall be included in all copies +or substantial portions of the Software. + +The software is provided "As is", without warranty of any kind, express or implied, +including but not limited To the warranties of merchantability, fitness for a particular purpose +and noninfringement. In no event shall The authors or copyright holders be liable for any claim, +damages or other liability, whether in an action of Contract, tort or otherwise, arising from, +out of or in connection with the software or the use or other Dealings in the software. + + +________________________________________ + + +**Commercial license for MDB Pro** + +We offer our clients a business-friendly commercial license tailored to their needs. We also provide +full support in both the purchasing and implementation process. + +**End User License Agreement (EULA)** + +**Hightlights** + +- Lifetime usage of the components included in the UI Kits +- Subscription for Premium Access features (can be canceled at any time) +- You can create an unlimited number of projects +- You have right to personal use +- You have right to commercial use +- No attribution is required + +________________________________________ + + +Paid packages are licensed according to the End User License Agreement (EULA) detailed below. +By using products listed below (Product) from StartupFlow s.c. (MDB / MDBootstrap), you agree that this +is a legally binding and valid contract and agree to be bound by it. You agree to abide by the intellectual +property laws and all of the terms and conditions of this Agreement. + +**Rights** + +**No attribution required** + +You are not required to attribute or link to Material Design for Bootstrap in any projects. + +**Right to personal use** + +The License grants you, the purchaser, an ongoing, non-exclusive, worldwide license to make use of the Product +in personal projects, in accordance with the EULA. + +**Right to commercial use** + +The License grants you, the purchaser, an ongoing, non-exclusive, worldwide license to make use of the Product +in commercial projects, in accordance with the EULA. + +**Right to modification** + +You may modify the resources according to your requirements. + +**Right to create the End Product** + +You may use the Product to create End Products in accordance with the EULA. The End Product is a customised +implementation of the Product requiring an application of skill and effort (f.e. a webiste build with MDB Template +with customized, modified content is an End Product because it requires skill and efort while a webiste which +is literally copy-pasted MDB Template isn't). + +**Lifetime usage** + +You are entitled to use the purchased Product for life. + +**Premium Access features** + +Premium Access features are covered by a reocurring subscription. As long as the subscription is active you have +access to all maintenance and bonus features. The user has a right to cancell the subscription without losing +the right to use the Pro package itself. + +**User limits** + +User limit for a license is specified on the checkout and during the purchase. License holder +(an owner of mdbootstrap account to which the license is assigned) has a right to allow usage for additional users +but not more then the "developer number" specified in the order. + +**Unimited projects** + +The License grants you, the purchaser, an ongoing, non-exclusive right to create unlimited End Products +for yourself or for multiple clients. + +___________________ + +**Restrictions** + +**Unauthorised redistribution** + +You cannot redistribute, resell, lease, license, sub-license or offer the Product directly or non-directly +to any other third party, without an explicit agreement with StartupFlow s.c.. Learn more about the Reseller Terms. + +**Product usage by end-user** + +You cannot permit an end user of the End Product to use the Product separately from the End Product. +(f.e. Your client can use the website X that you've built for him, but he cannot build another website Y himself +using the files installed for the website X. + +**Open source** + +You cannot redistribute any of the software, or products created with MDB software to repositories +like GitHub, where they are publicly available or include into any Open Source projects. + +**Competition** + +You cannot use the Product to create any End Products that would compete with the Product itself. +(f.e. you cannot use MDB 5 Pro to create a framework, library, design system, CMS, template, plugin or a page generator). + +**Premium Access terms:** + +Purchase of MDB Pro comes with Monthly or Annual access to maintenance features. A license holder +has a right to use those features as long as his subscription is active. License value is 85% package +contents with 12 months of updates & Git access; 15% Premium Support. + +"Single Use" licenses don't include any Premium Access features. + +**Premium Access includes:** + +- Premium Support - your tickets are guranteed to be answered by a professional from MDBootstrap Team +- Git repository access - acces to a repositories on git.mdbootstrap.com that enables npm installation +- Unlimited Updates - access to all Product updates released within the maintenance period (f.e. all + new versions of the same product released qithin 12 months after an annual subscription is created) +- Premium Snippets platform access - including community snippets, premium templates, lab projects and design blocks +- Documentation code examples +- Access to drag & drop Builder +- API access +- Access to PRO design generators + +**Premium Support Terms** + +Premium Support is provided only on the official MDB support forum (https://mdbootstrap.com/support/). +Technical code support regarding MDB UI Kits is not provided via email. + +Support is provided from Monday to Friday, Premium Support tickets are usually answered within 1 workday. +Premium Support tickets are guaranteed to be answered by a professional developer from MDB team. Priority Support tickets are answered first. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b2aee36b..aebc3bfe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,10461 +1,18399 @@ { - "name": "angular-bootstrap-md", - "version": "6.1.1", - "lockfileVersion": 1, + "name": "mdb-angular-ui-kit-free", + "version": "9.0.0", + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@angular-devkit/build-optimizer": { - "version": "0.0.36", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.36.tgz", - "integrity": "sha512-EFFF7hBbVoTOzYfXuSlGhcDr8neafmwuBAIkzAekEjzik7OaTLq7LPG7As+ebed9ll+3DAGypnrpdIE1Tp/H/A==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "source-map": "0.5.7", - "typescript": "2.6.2", - "webpack-sources": "1.1.0" + "packages": { + "": { + "name": "mdb-angular-ui-kit-free", + "version": "9.0.0", + "dependencies": { + "@angular/animations": "^20.2.4", + "@angular/cdk": "^20.2.2", + "@angular/common": "^20.2.4", + "@angular/compiler": "^20.2.4", + "@angular/core": "^20.2.4", + "@angular/forms": "^20.2.4", + "@angular/platform-browser": "^20.2.4", + "@angular/platform-browser-dynamic": "^20.2.4", + "@angular/router": "^20.2.4", + "@fortawesome/fontawesome-free": "^6.0.0", + "rxjs": "~7.5.0", + "tslib": "^2.3.0", + "zone.js": "~0.15.0" }, + "devDependencies": { + "@angular-builders/jest": "^20.0.0", + "@angular-devkit/build-angular": "^20.2.2", + "@angular/cli": "^20.2.2", + "@angular/compiler-cli": "^20.2.4", + "@types/jasmine": "~5.1.4", + "@types/jest": "^29.5.12", + "@types/node": "^22.2.0", + "jasmine-core": "~5.2.0", + "jasmine-spec-reporter": "~7.0.0", + "jest": "^29.5.0", + "karma-coverage": "~2.2.0", + "ng-packagr": "^20.2.0", + "ts-node": "~10.9.2", + "tslint": "~6.1.0", + "typescript": "~5.9.2" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", + "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", + "dev": true, + "license": "MIT", "dependencies": { - "typescript": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", - "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", - "dev": true - } + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "@angular-devkit/core": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.22.tgz", - "integrity": "sha512-zxrNtTiv60liye/GGeRMnnGgLgAWoqlMTfPLMW0D1qJ4bbrPHtme010mpxS3QL4edcDtQseyXSFCnEkuo2MrRw==", + "node_modules/@algolia/client-abtesting": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", + "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", "dev": true, - "requires": { - "source-map": "0.5.7" + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "@angular-devkit/schematics": { - "version": "0.0.42", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.42.tgz", - "integrity": "sha512-elTiNL0Nx9oin2pfZTvMBU/d9sgutXaZe8n3xm2p7jfqQZry5MYYFES4hq+WIJjtV/X9gAniafncEpxuF7ikYw==", + "node_modules/@algolia/client-analytics": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", + "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", "dev": true, - "requires": { - "@angular-devkit/core": "0.0.22", - "@ngtools/json-schema": "1.1.0", - "@schematics/schematics": "0.0.11", - "minimist": "1.2.0", - "rxjs": "5.5.6" - } - }, - "@angular/animations": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.1.2.tgz", - "integrity": "sha512-so2i0He4Fh5YuvujC68k2/Hzyy56/vZAUmLTXHE+9f4RatjqV68LISseFXqcS8bhVuT7AD2ZEbHnM7nWhgDaTg==", - "requires": { - "tslib": "1.8.1" - } - }, - "@angular/cli": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.6.2.tgz", - "integrity": "sha512-Qc6AD37ASJjhbYkDgWQOniEl+XDLWDydqPOZ0kPQhbrJk49PoM1HNZfCD1FmIZFTT/eFEVsaexc/rKw0KckvSA==", - "dev": true, - "requires": { - "@angular-devkit/build-optimizer": "0.0.36", - "@angular-devkit/schematics": "0.0.42", - "@ngtools/json-schema": "1.1.0", - "@ngtools/webpack": "1.9.2", - "@schematics/angular": "0.1.11", - "autoprefixer": "6.7.7", - "chalk": "2.2.2", - "circular-dependency-plugin": "4.3.0", - "common-tags": "1.6.0", - "copy-webpack-plugin": "4.3.1", - "core-object": "3.1.5", - "css-loader": "0.28.7", - "cssnano": "3.10.0", - "denodeify": "1.2.1", - "ember-cli-string-utils": "1.1.0", - "exports-loader": "0.6.4", - "extract-text-webpack-plugin": "3.0.2", - "file-loader": "1.1.6", - "fs-extra": "4.0.3", - "glob": "7.1.2", - "html-webpack-plugin": "2.30.1", - "istanbul-instrumenter-loader": "2.0.0", - "karma-source-map-support": "1.2.0", - "less": "2.7.3", - "less-loader": "4.0.5", - "license-webpack-plugin": "1.1.1", - "loader-utils": "1.1.0", - "lodash": "4.17.4", - "memory-fs": "0.4.1", - "minimatch": "3.0.4", - "node-modules-path": "1.0.1", - "node-sass": "4.7.2", - "nopt": "4.0.1", - "opn": "5.1.0", - "portfinder": "1.0.13", - "postcss-custom-properties": "6.2.0", - "postcss-loader": "2.0.10", - "postcss-url": "7.3.0", - "raw-loader": "0.5.1", - "resolve": "1.5.0", - "rxjs": "5.5.6", - "sass-loader": "6.0.6", - "semver": "5.4.1", - "silent-error": "1.1.0", - "source-map-loader": "0.2.3", - "source-map-support": "0.4.18", - "style-loader": "0.13.2", - "stylus": "0.54.5", - "stylus-loader": "3.0.1", - "uglifyjs-webpack-plugin": "1.1.5", - "url-loader": "0.6.2", - "webpack": "3.10.0", - "webpack-dev-middleware": "1.12.2", - "webpack-dev-server": "2.9.7", - "webpack-merge": "4.1.1", - "webpack-sources": "1.1.0", - "webpack-subresource-integrity": "1.0.3", - "zone.js": "0.8.19" - } - }, - "@angular/common": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.1.2.tgz", - "integrity": "sha512-MqgMwsHXxxx8vmQrUFwhNcAg29eqClJdnMJ81DlD7XvEexyXxxoFrxnNea+aB3BUC1AzU0fEy24ngygmhjRmfw==", - "requires": { - "tslib": "1.8.1" - } - }, - "@angular/compiler": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.1.2.tgz", - "integrity": "sha512-asTrlMWRe24EzejBwBFVSfq3ZbYI9Xr9NbNtkHK4DRHutDA1wn5PQE5lHuUTNW2B/dmm9pm+5JTVtcbue0nEug==", - "requires": { - "tslib": "1.8.1" + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "@angular/compiler-cli": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.1.2.tgz", - "integrity": "sha512-dtSVF8RnxYCDSCDbWNv3xg379xAN/1s6odpF5lFyemUi/p2U9mkeXtHo5Y74PX/kdoVnXrTY8bCNnQPm3sHVZA==", + "node_modules/@algolia/client-common": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", + "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", "dev": true, - "requires": { - "chokidar": "1.7.0", - "minimist": "1.2.0", - "reflect-metadata": "0.1.10", - "tsickle": "0.25.6" - } - }, - "@angular/core": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.1.2.tgz", - "integrity": "sha512-nHQWvhdxg7RbhRcfV5EhWURUZBqtcBFajXTBYA2rVHPhm0lGqEUi38VW0ddO8MpPGz0pK2PNpgR3GwXp/egaNw==", - "requires": { - "tslib": "1.8.1" + "license": "MIT", + "engines": { + "node": ">= 14.0.0" } }, - "@angular/forms": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.1.2.tgz", - "integrity": "sha512-IQRZ2KF4303ga9nTzjU223steFLcaRrFyakM/+x8Hu1otzLeIoFiyDaFPBHtUvoRN14JlKusIi9m407mM2oNJQ==", - "requires": { - "tslib": "1.8.1" + "node_modules/@algolia/client-insights": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", + "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "@angular/http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.1.2.tgz", - "integrity": "sha512-LvOgVPCxOii2TH8r8UrXQJjqrbgrt/HTNOtqqT1/CmemsnbGcBiYAnt5yiZ2aYQuop4RZLhQ/UpuSMLur9XPtg==", - "requires": { - "tslib": "1.8.1" + "node_modules/@algolia/client-personalization": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", + "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "@angular/language-service": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.1.2.tgz", - "integrity": "sha512-oFov/UQyvW3CJESJvC1nI0xSsWOc4Mx5N0Tbah9g2cryShT5PoFGDUE8+Pu5Yjl3uu+iNMnQ4F+J2DDRmyJTWQ==", - "dev": true - }, - "@angular/platform-browser": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.1.2.tgz", - "integrity": "sha512-L78ijQ81tEh6nnOq2BqCDtbhqLbARs/2A9QZvEhMTTFu5MOQH0yk0VrjNv58Lch9yOj04EH/Qi7Wep2vFqb57g==", - "requires": { - "tslib": "1.8.1" + "node_modules/@algolia/client-query-suggestions": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", + "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "@angular/platform-browser-dynamic": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.1.2.tgz", - "integrity": "sha512-LMMgG1RRngIMvU19+NFRUe2+2gKgzMpwddBVDondi71EqcfumD6NN343lNcHv5/5oWuJdaAx94A29qpAjyVt5Q==", - "requires": { - "tslib": "1.8.1" + "node_modules/@algolia/client-search": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", + "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "@angular/router": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.1.2.tgz", - "integrity": "sha512-gNP2vPTQLlpiRE6tRdZY9CHYs+XhYsiR6wAfUInMvJAocA6a2mQs4qPILJjus8WbcASDzU51C+sgHF++4gz+Qg==", - "requires": { - "tslib": "1.8.1" + "node_modules/@algolia/ingestion": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", + "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "@ngtools/json-schema": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.1.0.tgz", - "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=", - "dev": true - }, - "@ngtools/webpack": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.9.2.tgz", - "integrity": "sha512-jM5XMwHt94qxIe9kJS3Bmz8EfZgsC2H7fVcTSEd/dgyL5C89uZJfj5ueO9yEERpnXufvALBMfUxfODTcPX01iw==", - "dev": true, - "requires": { - "chalk": "2.2.2", - "enhanced-resolve": "3.4.1", - "loader-utils": "1.1.0", - "magic-string": "0.22.4", - "semver": "5.4.1", - "source-map": "0.5.7", - "tree-kill": "1.2.0" - } - }, - "@schematics/angular": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.11.tgz", - "integrity": "sha512-jYTantZjdYeDjxh9ZLYvGbDI0VeUxgSrcBjHvnHqMNe+YGJenY988ifWCwzjmOowj57maLrQQGrdoO7oUeNdyw==", - "dev": true, - "requires": { - "@angular-devkit/core": "0.0.22" - } - }, - "@schematics/schematics": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@schematics/schematics/-/schematics-0.0.11.tgz", - "integrity": "sha512-HAXgAIuuAGjiIKohGlRUkmUTWYtNmclR12KHlQQxT9pHFdEb2OrpHjUp2YoV32jiU6jIZm4pf3ODwlPA0VbwnA==", - "dev": true - }, - "@types/jasmine": { - "version": "2.5.54", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.54.tgz", - "integrity": "sha512-B9YofFbUljs19g5gBKUYeLIulsh31U5AK70F41BImQRHEZQGm4GcN922UvnYwkduMqbC/NH+9fruWa/zrqvHIg==", - "dev": true - }, - "@types/jasminewd2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", - "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==", + "node_modules/@algolia/monitoring": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", + "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", "dev": true, - "requires": { - "@types/jasmine": "2.5.54" + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "@types/node": { - "version": "6.0.95", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.95.tgz", - "integrity": "sha512-d1Twx1NM49dQ7jbNZfaHTQWuYL9cFVrGxYpbc3BvMf4626lOJOZnp2aJQNB9vP/WX3UOe1TrTUMABrGRu6FZhg==", - "dev": true - }, - "@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", - "dev": true - }, - "@types/selenium-webdriver": { - "version": "2.53.43", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz", - "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "node_modules/@algolia/recommend": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", + "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", "dev": true, - "requires": { - "mime-types": "2.1.17", - "negotiator": "0.6.1" + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", + "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", "dev": true, - "requires": { - "acorn": "4.0.13" - }, + "license": "MIT", "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "adm-zip": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz", - "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=", - "dev": true - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, - "agent-base": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", - "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "node_modules/@algolia/requester-fetch": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", + "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", "dev": true, - "requires": { - "extend": "3.0.1", - "semver": "5.0.3" - }, + "license": "MIT", "dependencies": { - "semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", - "dev": true - } + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "node_modules/@algolia/requester-node-http": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", + "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "node_modules/@angular-builders/common": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@angular-builders/common/-/common-4.0.0.tgz", + "integrity": "sha512-bepZI1KdXUVhDGqHOudZQJwucSbZWxfWzM+EHFXUoExUO0u7XEuHTF5bhtQZ+YU+ZK2Ayl26QbI/26Yj72vcFQ==", "dev": true, - "requires": { - "color-convert": "1.9.1" + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "^20.0.0", + "ts-node": "^10.0.0", + "tsconfig-paths": "^4.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "node_modules/@angular-builders/jest": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@angular-builders/jest/-/jest-20.0.0.tgz", + "integrity": "sha512-3rnobnIdErtjyM3yAAAOdod79lgbkf1QWMFHiRDHW4tw4f+DLFiM2HMFircCoO5WIe/ILEJE9GNxs/vvYa3gvw==", "dev": true, - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "license": "MIT", + "dependencies": { + "@angular-builders/common": "4.0.0", + "@angular-devkit/architect": ">=0.2000.0 < 0.2100.0", + "@angular-devkit/core": "^20.0.0", + "jest-preset-angular": "14.6.0", + "lodash": "^4.17.15" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular-devkit/build-angular": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/platform-browser-dynamic": "^20.0.0", + "jest": ">=29" } }, - "app-root-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", - "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", - "dev": true - }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "node_modules/@angular-devkit/architect": { + "version": "0.2003.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.1.tgz", + "integrity": "sha512-PE/yMVv8RZ7nQzGROi0juZo+yMZE2QwyBXc9yFrHIRozuTzTFaMW/9ifCZDVrpicjyHEk3s+7hUVNCcKO/xIIQ==", "dev": true, - "requires": { - "default-require-extensions": "1.0.0" + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.1", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "node_modules/@angular-devkit/architect/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "node_modules/@angular-devkit/build-angular": { + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.3.1.tgz", + "integrity": "sha512-e08aKi3+0GsfdPQylAvBapR1FUcV/QQWnEgyF6tYFnK/0iMvYaLAfGQhvamJZpqgnMSkq7zWHs6B1M9Is3/yGg==", "dev": true, - "requires": { - "sprintf-js": "1.0.3" + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2003.1", + "@angular-devkit/build-webpack": "0.2003.1", + "@angular-devkit/core": "20.3.1", + "@angular/build": "20.3.1", + "@babel/core": "7.28.3", + "@babel/generator": "7.28.3", + "@babel/helper-annotate-as-pure": "7.27.3", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-transform-async-generator-functions": "7.28.0", + "@babel/plugin-transform-async-to-generator": "7.27.1", + "@babel/plugin-transform-runtime": "7.28.3", + "@babel/preset-env": "7.28.3", + "@babel/runtime": "7.28.3", + "@discoveryjs/json-ext": "0.6.3", + "@ngtools/webpack": "20.3.1", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.21", + "babel-loader": "10.0.0", + "browserslist": "^4.21.5", + "copy-webpack-plugin": "13.0.1", + "css-loader": "7.1.2", + "esbuild-wasm": "0.25.9", + "fast-glob": "3.3.3", + "http-proxy-middleware": "3.0.5", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "karma-source-map-support": "1.4.0", + "less": "4.4.0", + "less-loader": "12.3.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.3.1", + "mini-css-extract-plugin": "2.9.4", + "open": "10.2.0", + "ora": "8.2.0", + "picomatch": "4.0.3", + "piscina": "5.1.3", + "postcss": "8.5.6", + "postcss-loader": "8.1.1", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.2", + "sass": "1.90.0", + "sass-loader": "16.0.5", + "semver": "7.7.2", + "source-map-loader": "5.0.0", + "source-map-support": "0.5.21", + "terser": "5.43.1", + "tree-kill": "1.2.2", + "tslib": "2.8.1", + "webpack": "5.101.2", + "webpack-dev-middleware": "7.4.2", + "webpack-dev-server": "5.2.2", + "webpack-merge": "6.0.1", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.25.9" + }, + "peerDependencies": { + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.3.1", + "@web/test-runner": "^0.20.0", + "browser-sync": "^3.0.2", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "karma": "^6.3.0", + "ng-packagr": "^20.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.8 <6.0" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, + "@angular/localize": { + "optional": true + }, + "@angular/platform-browser": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "@web/test-runner": { + "optional": true + }, + "browser-sync": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } } }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, - "requires": { - "arr-flatten": "1.1.0" + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", - "dev": true - }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "node_modules/@angular-devkit/build-webpack": { + "version": "0.2003.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2003.1.tgz", + "integrity": "sha512-6/RL6ZymNVWdPaVHJ2AOGGaxToyANZ5B65XgNMLHOd7Wp9YH8PVtKbPf+R5b+e8KWiDZThFkEbYRWSS97g7+rg==", "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.10.0" + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.2003.1", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" } }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, - "requires": { - "array-uniq": "1.0.3" + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "node_modules/@angular-devkit/core": { + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.1.tgz", + "integrity": "sha512-TmS69GqBlbTfydn7C4tUKr0mshYSStuCkgruXbvedHFX8+7XBp8wPE+VUzdKnSmKZi6buI4oskDbJ1AdGtNm/g==", "dev": true, - "optional": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } }, - "asn1.js": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", - "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, - "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "node_modules/@angular-devkit/schematics": { + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.1.tgz", + "integrity": "sha512-uzMqcgOfcCBiYb+cbMJmgJL2C2d3uYFp6hU2ClYS8kRPXiA9sNVnvLmv4JrYJVLGQDejJtjPGIQrcmq11OQNLA==", "dev": true, - "requires": { - "util": "0.10.3" + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.1", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "8.2.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, - "requires": { - "lodash": "4.17.4" + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true + "node_modules/@angular/animations": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.3.0.tgz", + "integrity": "sha512-rCojVsJHaReDfSB4lwcWYJAfbkFXQmcdivdN5m1NavuSlKpWoLw4fLkxkcuOXDjUEwNSb45hRI4ixcwrcuQtmw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/core": "20.3.0" + } }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "node_modules/@angular/build": { + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.1.tgz", + "integrity": "sha512-z5n8WnisyPrRvS1WctdDB3Svas0Wql1Eplnwh4O7waZHeJTOcd8zZeFxPbPGp12ybGf3HEEjTeWOigm1kRgW9g==", "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "dev": true, - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000787", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - } - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2003.1", + "@babel/core": "7.28.3", + "@babel/helper-annotate-as-pure": "7.27.3", + "@babel/helper-split-export-declaration": "7.24.7", + "@inquirer/confirm": "5.1.14", + "@vitejs/plugin-basic-ssl": "2.1.0", + "beasties": "0.3.5", + "browserslist": "^4.23.0", + "esbuild": "0.25.9", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "listr2": "9.0.1", + "magic-string": "0.30.17", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "8.0.0", + "picomatch": "4.0.3", + "piscina": "5.1.3", + "rolldown": "1.0.0-beta.32", + "sass": "1.90.0", + "semver": "7.7.2", + "source-map-support": "0.5.21", + "tinyglobby": "0.2.14", + "vite": "7.1.5", + "watchpack": "2.4.4" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.4.2" + }, + "peerDependencies": { + "@angular/compiler": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.3.1", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^20.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.8 <6.0", + "vitest": "^3.1.1" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } + "@angular/localize": { + "optional": true }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "@angular/platform-browser": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "vitest": { + "optional": true } } }, - "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.7", - "trim-right": "1.0.1" - }, + "node_modules/@angular/cdk": { + "version": "20.2.3", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.2.3.tgz", + "integrity": "sha512-gu1zzxxcwobeiH21VpphM+cPFrQX0dxGwlFx1W8eTcLYLWd9YjlTETucBrEUEWcXmRrVTXf/VcqA0rWsxd50Ow==", + "license": "MIT", "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } + "parse5": "^8.0.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^20.0.0 || ^21.0.0", + "@angular/core": "^20.0.0 || ^21.0.0", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "node_modules/@angular/cli": { + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.3.1.tgz", + "integrity": "sha512-TqhuDecbfAQgRDYPfpRQG9ZuTqb1DOeU7oQAYxpz9m/a7A2xqeNFLuCwwz8rqEPZB79/9r5ja0Gs1J4i080U0Q==", "dev": true, - "requires": { - "babel-runtime": "6.26.0" + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.2003.1", + "@angular-devkit/core": "20.3.1", + "@angular-devkit/schematics": "20.3.1", + "@inquirer/prompts": "7.8.2", + "@listr2/prompt-adapter-inquirer": "3.0.1", + "@modelcontextprotocol/sdk": "1.17.3", + "@schematics/angular": "20.3.1", + "@yarnpkg/lockfile": "1.1.0", + "algoliasearch": "5.35.0", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "9.0.1", + "npm-package-arg": "13.0.0", + "pacote": "21.0.0", + "resolve": "1.22.10", + "semver": "7.7.2", + "yargs": "18.0.0", + "zod": "3.25.76" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" + "node_modules/@angular/common": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.0.tgz", + "integrity": "sha512-Il0HqdRdrmI8ufLXd49EYaa/BPqfiSqe5uuKrDxhkAdbRXwCXWsxbO/n8AwilwWn3CKLOCrEXQYKwbcFW0nYQQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/core": "20.3.0", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" + "node_modules/@angular/compiler": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.0.tgz", + "integrity": "sha512-DvGDusjsDhxIX+nDzihSCGo81Fa8y94KB/bh24eyPwJWV6b0OkawFSvVwzxx8prV0UnNkCN1S/UoZXmtVZGJ4A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "node_modules/@angular/compiler-cli": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.0.tgz", + "integrity": "sha512-umnZzzKw9RqDVkotYIyupJiKXQpU8knehMUBT1G3QwdeHppC+d/opxISYTkQtY/4IUAsZFLMukWIr82as0DSmw==", "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "license": "MIT", + "dependencies": { + "@babel/core": "7.28.3", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^4.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^18.0.0" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/compiler": "20.3.0", + "typescript": ">=5.8 <6.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" + "node_modules/@angular/core": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.0.tgz", + "integrity": "sha512-4uH2TAMm1nXqQ9lcZyyNkjcdQ0Fjcf9Hh0HYrhMOEV6GAUHvM2I8Vr2dSQ40p/UKLEfe9+cpZ78EPocqPQCG6A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/compiler": "20.3.0", + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0" + }, + "peerDependenciesMeta": { + "@angular/compiler": { + "optional": true + }, + "zone.js": { + "optional": true + } } }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true + "node_modules/@angular/forms": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.0.tgz", + "integrity": "sha512-/KGCZUskk8imxz2e47CKe5Ykh3eqEDop0b9YUkZTvJ/dY/cdFK89RAK2xUvOlyUr2mkcByzdzyOhHaM9XEaELg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.3.0", + "@angular/core": "20.3.0", + "@angular/platform-browser": "20.3.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.0.tgz", + "integrity": "sha512-/KsgfxDwP7/KXGrLLSyg4+Xd8HxmHi5dVCu+xHfa3QjzVIvvZfWZLxQj7guRlDtg/mz+t0/OSKvSUZzOAfVzGQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/animations": "20.3.0", + "@angular/common": "20.3.0", + "@angular/core": "20.3.0" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", - "dev": true - }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" + "node_modules/@angular/platform-browser-dynamic": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.3.0.tgz", + "integrity": "sha512-8zu4naXyP926+UKTadMM7163sl3JaVY9SVL0qegK5TiB1s0l6vVQ125nzT1BI9HadvCLdtl5ZNZF4P87h7nfwg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.3.0", + "@angular/compiler": "20.3.0", + "@angular/core": "20.3.0", + "@angular/platform-browser": "20.3.0" + } + }, + "node_modules/@angular/router": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.0.tgz", + "integrity": "sha512-JshumajvPCMztz1+7r/l5tRxFL3cn2jCpr5szdc5hESkpytY4050hedd09GogL1UoIyZAjhyYLhSlMnvrgjHBA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.3.0", + "@angular/core": "20.3.0", + "@angular/platform-browser": "20.3.0", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, - "requires": { - "callsite": "1.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true - }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", - "dev": true - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", "dev": true, - "optional": true, - "requires": { - "inherits": "2.0.3" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "blocking-proxy": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-0.0.5.tgz", - "integrity": "sha1-RikF4Nz76pcPQao3Ij3anAexkSs=", + "node_modules/@babel/core": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "dev": true, - "requires": { - "minimist": "1.2.0" + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" }, - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.1", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.15" - }, - "dependencies": { - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - } + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "dev": true, - "requires": { - "array-flatten": "2.1.1", - "deep-equal": "1.0.1", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.2.1", - "multicast-dns-service-types": "1.1.0" + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, - "requires": { - "hoek": "2.16.3" + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" } }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", - "dev": true, - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "requires": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.3" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "dev": true, - "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.5" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, - "requires": { - "pako": "1.0.6" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "dev": true, - "requires": { - "caniuse-db": "1.0.30000787", - "electron-to-chromium": "1.3.30" + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.1.tgz", - "integrity": "sha512-dRHYcs9LvG9cHgdPzjiI+/eS7e1xRhULrcyOx04RZQsszNJXU2SL9CyG60yLnge282Qq5nwTv+ieK2fH+WPZmA==", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "chownr": "1.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.1", - "mississippi": "1.3.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.0.0", - "unique-filename": "1.1.0", - "y18n": "3.2.1" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, - "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000787", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "caniuse-db": { - "version": "1.0.30000787", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000787.tgz", - "integrity": "sha1-ygeigb5Taoi9f6yWuolfPPU/gRs=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dev": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - }, + "license": "MIT", "dependencies": { - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - } + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "chalk": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", - "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - }, + "license": "MIT", "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "circular-dependency-plugin": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.3.0.tgz", - "integrity": "sha512-L3W9L1S0wC64rq+QSaZzmWnJW7cVBgimxI2lNEFEX5biwlRG8EHRM68JFi+CX5ZkCGUWJHIpnhdVs181Zlq3wA==", - "dev": true - }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, - "requires": { - "chalk": "1.1.3" - }, + "license": "MIT", "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "clean-css": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", - "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, - "requires": { - "source-map": "0.5.7" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "clone": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", - "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", - "dev": true - }, - "clone-deep": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.3.0.tgz", - "integrity": "sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg=", + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, - "requires": { - "for-own": "1.0.0", - "is-plain-object": "2.0.4", - "kind-of": "3.2.2", - "shallow-clone": "0.1.2" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", "dev": true, - "requires": { - "q": "1.5.1" + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "codelyzer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-3.0.1.tgz", - "integrity": "sha1-uma3sqpWT+n0XWAEtAA60s8RaCg=", + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, - "requires": { - "app-root-path": "2.0.1", - "css-selector-tokenizer": "0.7.0", - "cssauron": "1.4.0", - "semver-dsl": "1.0.1", - "source-map": "0.5.7", - "sprintf-js": "1.0.3" + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "dev": true, - "requires": { - "clone": "1.0.3", - "color-convert": "1.9.1", - "color-string": "0.3.0" + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", "dev": true, - "requires": { - "color-name": "1.1.3" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, - "requires": { - "color-name": "1.1.3" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, - "requires": { - "color": "0.11.4", - "css-color-names": "0.0.4", - "has": "1.0.1" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "combine-lists": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", - "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, - "requires": { - "lodash": "4.17.4" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", "dev": true, - "requires": { - "delayed-stream": "1.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "commander": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", - "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", - "dev": true - }, - "common-tags": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.6.0.tgz", - "integrity": "sha512-sgmgEodNLbxnSSoR5a2xH23CoDJ9J5MKsJS/tqplfmJLpikG0oWMpAb+tM8ERQCMpp9I+ERf6SYl158G6GwX0w==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "requires": { - "babel-runtime": "6.26.0" + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "compressible": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", - "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", - "dev": true, - "requires": { - "mime-db": "1.30.0" - } - }, - "compression": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", - "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", - "dev": true, - "requires": { - "accepts": "1.3.4", - "bytes": "3.0.0", - "compressible": "2.0.12", - "debug": "2.6.9", - "on-headers": "1.0.1", - "safe-buffer": "5.1.1", - "vary": "1.1.2" + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "connect": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.5.tgz", - "integrity": "sha1-+43ee6B2OHfQ7J352sC0tA5yx9o=", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.0.6", - "parseurl": "1.3.2", - "utils-merge": "1.0.1" - }, - "dependencies": { - "finalhandler": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", - "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" - } - } + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "requires": { - "date-now": "0.1.4" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dev": true, - "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "copy-webpack-plugin": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.3.1.tgz", - "integrity": "sha512-xlcFiW/U7KrpS6dFuWq3r8Wb7koJx7QVc7LDFCosqkikaVSxkaYOnwDLwilbjrszZ0LYZXThDAJKcQCSrvdShQ==", - "dev": true, - "requires": { - "cacache": "10.0.1", - "find-cache-dir": "1.0.0", - "globby": "7.1.1", - "is-glob": "4.0.0", - "loader-utils": "0.2.17", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "p-limit": "1.2.0", - "pify": "3.0.0", - "serialize-javascript": "1.4.0" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - } + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" - }, - "core-object": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz", - "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "requires": { - "chalk": "2.2.2" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.7.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "require-from-string": "1.2.1" - } - }, - "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.9" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "optional": true, - "requires": { - "lru-cache": "4.1.1", - "which": "1.3.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "requires": { - "boom": "2.10.1" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5", - "randomfill": "1.0.3" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-loader": { - "version": "0.28.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", - "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "css-selector-tokenizer": "0.7.0", - "cssnano": "3.10.0", - "icss-utils": "2.1.0", - "loader-utils": "1.1.0", - "lodash.camelcase": "4.3.0", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.0", - "source-list-map": "2.0.0" - } - }, - "css-parse": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", - "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", - "dev": true + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.0", - "domutils": "1.5.1", - "nth-check": "1.0.1" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true - }, - "cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "requires": { - "through": "2.3.8" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "dev": true, - "requires": { - "autoprefixer": "6.7.7", - "decamelize": "1.2.0", - "defined": "1.0.0", - "has": "1.0.1", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-calc": "5.3.1", - "postcss-colormin": "2.2.2", - "postcss-convert-values": "2.6.1", - "postcss-discard-comments": "2.0.4", - "postcss-discard-duplicates": "2.1.0", - "postcss-discard-empty": "2.1.0", - "postcss-discard-overridden": "0.1.1", - "postcss-discard-unused": "2.2.3", - "postcss-filter-plugins": "2.0.2", - "postcss-merge-idents": "2.1.7", - "postcss-merge-longhand": "2.0.2", - "postcss-merge-rules": "2.1.2", - "postcss-minify-font-values": "1.0.5", - "postcss-minify-gradients": "1.0.5", - "postcss-minify-params": "1.2.2", - "postcss-minify-selectors": "2.1.1", - "postcss-normalize-charset": "1.1.1", - "postcss-normalize-url": "3.0.8", - "postcss-ordered-values": "2.2.3", - "postcss-reduce-idents": "2.4.0", - "postcss-reduce-initial": "1.0.1", - "postcss-reduce-transforms": "1.0.4", - "postcss-svgo": "2.1.6", - "postcss-unique-selectors": "2.0.2", - "postcss-value-parser": "3.3.0", - "postcss-zindex": "2.2.0" - } - }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "dev": true, - "requires": { - "clap": "1.2.3", - "source-map": "0.5.7" - } - }, - "cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "requires": { - "array-find-index": "1.0.2" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, - "requires": { - "es5-ext": "0.10.37" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, + "license": "MIT", "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, - "requires": { - "ms": "2.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "dev": true, - "requires": { - "strip-bom": "2.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dev": true, - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, - "requires": { - "globby": "6.1.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "p-map": "1.2.0", - "pify": "3.0.0", - "rimraf": "2.6.2" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - } + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true - }, - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "dev": true, - "requires": { - "repeating": "2.0.1" + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "detect-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", - "dev": true - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, - "diff": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", - "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", "dev": true, - "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.5" + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "dev": true, - "requires": { - "arrify": "1.0.1", - "path-type": "3.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.2.2.tgz", - "integrity": "sha512-kN+DjfGF7dJGUL7nWRktL9Z18t1rWP3aQlyZdY8XlpvU3Nc6GeFTQApftcjtWKxAZfiggZSGrCEoszNgvnpwDg==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "dev": true, - "requires": { - "ip": "1.1.5", - "safe-buffer": "5.1.1" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", "dev": true, - "requires": { - "buffer-indexof": "1.1.1" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "dom-converter": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", - "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "dev": true, - "requires": { - "utila": "0.3.3" - }, + "license": "MIT", "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", - "dev": true - } + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, - "requires": { - "custom-event": "1.0.1", - "ent": "2.2.0", - "extend": "3.0.1", - "void-elements": "2.0.1" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "dev": true, - "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" - }, + "license": "MIT", "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", - "dev": true - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, - "domhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, - "requires": { - "domelementtype": "1.3.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", "dev": true, - "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "duplexify": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", - "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "dev": true, - "requires": { - "end-of-stream": "1.4.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "stream-shift": "1.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "ejs": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", - "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", - "dev": true - }, - "electron-releases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/electron-releases/-/electron-releases-2.1.0.tgz", - "integrity": "sha512-cyKFD1bTE/UgULXfaueIN1k5EPFzs+FRc/rvCY5tIynefAPqopQEgjr0EzY+U3Dqrk/G4m9tXSPuZ77v6dL/Rw==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.30", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.30.tgz", - "integrity": "sha512-zx1Prv7kYLfc4OA60FhxGbSo4qrEjgSzpo1/37i7l9ltXPYOoQBtjQxY9KmsgfHnBxHlBGXwLlsbt/gub1w5lw==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, - "requires": { - "electron-releases": "2.1.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "ember-cli-string-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz", - "integrity": "sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE=", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encodeurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", - "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "dev": true, - "requires": { - "once": "1.4.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "engine.io": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", - "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", - "dev": true, - "requires": { - "accepts": "1.3.3", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "ws": "1.1.2" - }, - "dependencies": { - "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", - "dev": true, - "requires": { - "mime-types": "2.1.17", - "negotiator": "0.6.1" - } - }, - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "engine.io-client": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", - "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parsejson": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "1.1.2", - "xmlhttprequest-ssl": "1.5.3", - "yeast": "0.1.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "engine.io-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", - "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary": "0.1.7", - "wtf-8": "1.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "errno": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", - "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "dev": true, - "requires": { - "prr": "1.0.1" + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", "dev": true, - "requires": { - "is-arrayish": "0.2.1" + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "es-abstract": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", - "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, - "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "dev": true, - "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "es5-ext": { - "version": "0.10.37", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", - "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-symbol": "3.1.1" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "dev": true, - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37" + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "dev": true, - "requires": { - "original": "1.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, - "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - } - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "expand-braces": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", - "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", - "dev": true, - "requires": { - "array-slice": "0.2.3", - "array-unique": "0.2.1", - "braces": "0.1.5" - }, - "dependencies": { - "braces": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", - "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", - "dev": true, - "requires": { - "expand-range": "0.1.1" - } - }, - "expand-range": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", - "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", - "dev": true, - "requires": { - "is-number": "0.1.1", - "repeat-string": "0.2.2" - } - }, - "is-number": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", - "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", - "dev": true - }, - "repeat-string": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", - "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", - "dev": true - } + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", "dev": true, - "requires": { - "fill-range": "2.2.3" + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "exports-loader": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.4.tgz", - "integrity": "sha1-1w/GEhl1s1/BKDDPUnVL4nQPyIY=", + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "requires": { - "loader-utils": "1.1.0", - "source-map": "0.5.7" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "express": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", - "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, - "requires": { - "accepts": "1.3.4", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.1", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.0", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.2", - "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.1", - "serve-static": "1.13.1", - "setprototypeof": "1.1.0", - "statuses": "1.3.1", - "type-is": "1.6.15", - "utils-merge": "1.0.1", - "vary": "1.1.2" - }, + "license": "MIT", "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - } + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, - "requires": { - "is-extglob": "1.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dev": true, + "license": "MIT", "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "extract-text-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, - "requires": { - "async": "2.6.0", - "loader-utils": "1.1.0", - "schema-utils": "0.3.0", - "webpack-sources": "1.1.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", - "dev": true + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "node_modules/@babel/preset-env": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", "dev": true, - "requires": { - "websocket-driver": "0.7.0" + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "file-loader": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.6.tgz", - "integrity": "sha512-873ztuL+/hfvXbLDJ262PGO6XjERnybJu2gW1/5j8HUfxSiFJI9Hj/DhZ50ZGRUxBvuNiazb/cM2rh9pqrxP6Q==", + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "node_modules/@babel/runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", "dev": true, - "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "dev": true, - "requires": { - "commondir": "1.0.1", - "make-dir": "1.1.0", - "pkg-dir": "2.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, - "requires": { - "locate-path": "2.0.0" + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", - "dev": true + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } }, - "flush-write-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", - "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "license": "MIT", + "engines": { + "node": ">=14.17.0" } }, - "font-awesome": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", - "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + "node_modules/@emnapi/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", + "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "node_modules/@emnapi/runtime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", "dev": true, - "requires": { - "for-in": "1.0.2" + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", + "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==", + "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", + "engines": { + "node": ">=6" + } }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "node_modules/@inquirer/ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.0.tgz", + "integrity": "sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==", "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" + "license": "MIT", + "engines": { + "node": ">=18" } }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true + "node_modules/@inquirer/checkbox": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.4.tgz", + "integrity": "sha512-2n9Vgf4HSciFq8ttKXk+qy+GsyTXPV1An6QAwe/8bkbbqvG4VW1I/ZY1pNu2rf+h9bdzMLPbRSfcNxkHBy/Ydw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "node_modules/@inquirer/confirm": { + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz", + "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.15", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "node_modules/@inquirer/core": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.2.tgz", + "integrity": "sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==", "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.0", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "node_modules/@inquirer/editor": { + "version": "4.2.20", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.20.tgz", + "integrity": "sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g==", "dev": true, - "requires": { - "null-check": "1.0.0" + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/external-editor": "^1.0.2", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "node_modules/@inquirer/expand": { + "version": "4.0.20", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.20.tgz", + "integrity": "sha512-Dt9S+6qUg94fEvgn54F2Syf0Z3U8xmnBI9ATq2f5h9xt09fs2IJXSCIXyyVHwvggKWFXEY/7jATRo2K6Dkn6Ow==", "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "node_modules/@inquirer/external-editor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.3" + "license": "MIT", + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "node_modules/@inquirer/figures": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", + "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } }, - "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "node_modules/@inquirer/input": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.4.tgz", + "integrity": "sha512-cwSGpLBMwpwcZZsc6s1gThm0J+it/KIJ+1qFL2euLmSKUMGumJ5TcbMgxEjMjNHRGadouIYbiIgruKoDZk7klw==", "dev": true, - "optional": true, - "requires": { - "nan": "2.8.0", - "node-pre-gyp": "0.6.39" + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.20.tgz", + "integrity": "sha512-bbooay64VD1Z6uMfNehED2A2YOPHSJnQLs9/4WNiV/EK+vXczf/R988itL2XLDGTgmhMF2KkiWZo+iEZmc4jqg==", + "dev": true, + "license": "MIT", "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.20", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.20.tgz", + "integrity": "sha512-nxSaPV2cPvvoOmRygQR+h0B+Av73B01cqYLcr7NXcGXhbmsYfUb8fDdw2Us1bI2YsX+VvY7I7upgFYsyf8+Nug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.2.tgz", + "integrity": "sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.2.1", + "@inquirer/confirm": "^5.1.14", + "@inquirer/editor": "^4.2.17", + "@inquirer/expand": "^4.0.17", + "@inquirer/input": "^4.2.1", + "@inquirer/number": "^3.0.17", + "@inquirer/password": "^4.0.17", + "@inquirer/rawlist": "^4.1.5", + "@inquirer/search": "^3.1.0", + "@inquirer/select": "^4.3.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.8.tgz", + "integrity": "sha512-CQ2VkIASbgI2PxdzlkeeieLRmniaUU1Aoi5ggEdm6BIyqopE9GuDXdDOj9XiwOqK5qm72oI2i6J+Gnjaa26ejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.3.tgz", + "integrity": "sha512-D5T6ioybJJH0IiSUK/JXcoRrrm8sXwzrVMjibuPs+AgxmogKslaafy1oxFiorNI4s3ElSkeQZbhYQgLqiL8h6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.4.tgz", + "integrity": "sha512-Qp20nySRmfbuJBBsgPU7E/cL62Hf250vMZRzYDcBHty2zdD1kKCnoDFWRr0WO2ZzaXp3R7a4esaVGJUx0E6zvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", + "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, + } + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz", + "integrity": "sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.11.0.tgz", + "integrity": "sha512-nLqSTAYwpk+5ZQIoVp7pfd/oSKNWlEdvTq2LzVA4r2wtWZg6v+5u0VgBOaDJuUfNOuw/4Ysq6glN5QKSrOCgrA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.1", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.1.tgz", + "integrity": "sha512-3XFmGwm3u6ioREG+ynAQB7FoxfajgQnMhIu8wC5eo/Lsih4aKDg0VuIMGaOsYn7hJSJagSeaD4K8yfpkEoDEmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/type": "^3.0.7" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 8", + "listr2": "9.0.1" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.2.tgz", + "integrity": "sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.2.tgz", + "integrity": "sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.2.tgz", + "integrity": "sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.2.tgz", + "integrity": "sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.2.tgz", + "integrity": "sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-arm64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.2.tgz", + "integrity": "sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.2.tgz", + "integrity": "sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.3.tgz", + "integrity": "sha512-JPwUKWSsbzx+DLFznf/QZ32Qa+ptfbUlHhRLrBQBAFu9iI1iYvizM4p+zhhRDceSsPutXp4z+R/HPVphlIiclg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", + "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.1.1", + "@napi-rs/nice-android-arm64": "1.1.1", + "@napi-rs/nice-darwin-arm64": "1.1.1", + "@napi-rs/nice-darwin-x64": "1.1.1", + "@napi-rs/nice-freebsd-x64": "1.1.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", + "@napi-rs/nice-linux-arm64-gnu": "1.1.1", + "@napi-rs/nice-linux-arm64-musl": "1.1.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", + "@napi-rs/nice-linux-s390x-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-musl": "1.1.1", + "@napi-rs/nice-openharmony-arm64": "1.1.1", + "@napi-rs/nice-win32-arm64-msvc": "1.1.1", + "@napi-rs/nice-win32-ia32-msvc": "1.1.1", + "@napi-rs/nice-win32-x64-msvc": "1.1.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", + "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", + "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", + "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", + "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", + "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", + "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", + "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", + "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", + "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", + "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", + "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", + "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", + "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-openharmony-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", + "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", + "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", + "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", + "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.5.tgz", + "integrity": "sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" + } + }, + "node_modules/@ngtools/webpack": { + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.3.1.tgz", + "integrity": "sha512-yTI149/K6cCp9Tsb0UuiiFciGXA1NUNP81Q2hepmfWcOuRyeJ/YZvjzDIC0+d7yVsMpkudy6iN8MCbxV6hMQIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^20.0.0", + "typescript": ">=5.8 <6.0", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", + "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", + "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", + "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", + "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/package-json/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz", + "integrity": "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", + "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", + "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@oxc-project/runtime": { + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.81.0.tgz", + "integrity": "sha512-zm/LDVOq9FEmHiuM8zO4DWirv0VP2Tv2VsgaiHby9nvpq+FVrcqNYgv+TysLKOITQXWZj/roluTxFvpkHP0Iuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.81.0.tgz", + "integrity": "sha512-CnOqkybZK8z6Gx7Wb1qF7AEnSzbol1WwcIzxYOr8e91LytGOjo0wCpgoYWZo8sdbpqX+X+TJayIzo4Pv0R/KjA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.32.tgz", + "integrity": "sha512-Gs+313LfR4Ka3hvifdag9r44WrdKQaohya7ZXUXzARF7yx0atzFlVZjsvxtKAw1Vmtr4hB/RjUD1jf73SW7zDw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.32.tgz", + "integrity": "sha512-W8oMqzGcI7wKPXUtS3WJNXzbghHfNiuM1UBAGpVb+XlUCgYRQJd2PRGP7D3WGql3rR3QEhUvSyAuCBAftPQw6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.32.tgz", + "integrity": "sha512-pM4c4sKUk37noJrnnDkJknLhCsfZu7aWyfe67bD0GQHfzAPjV16wPeD9CmQg4/0vv+5IfHYaa4VE536xbA+W0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.32.tgz", + "integrity": "sha512-M8SUgFlYb5kJJWcFC8gUMRiX4WLFxPKMed3SJ2YrxontgIrEcpizPU8nLNVsRYEStoSfKHKExpQw3OP6fm+5bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.32.tgz", + "integrity": "sha512-FuQpbNC/hE//bvv29PFnk0AtpJzdPdYl5CMhlWPovd9g3Kc3lw9TrEPIbL7gRPUdhKAiq6rVaaGvOnXxsa0eww==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.32.tgz", + "integrity": "sha512-hRZygRlaGCjcNTNY9GV7dDI18sG1dK3cc7ujHq72LoDad23zFDUGMQjiSxHWK+/r92iMV+j2MiHbvzayxqynsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.32.tgz", + "integrity": "sha512-HzgT6h+CXLs+GKAU0Wvkt3rvcv0CmDBsDjlPhh4GHysOKbG9NjpKYX2zvjx671E9pGbTvcPpwy7gGsy7xpu+8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.32.tgz", + "integrity": "sha512-Ab/wbf6gdzphDbsg51UaxsC93foQ7wxhtg0SVCXd25BrV4MAJ1HoDtKN/f4h0maFmJobkqYub2DlmoasUzkvBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.32.tgz", + "integrity": "sha512-VoxqGEfh5A1Yx+zBp/FR5QwAbtzbuvky2SVc+ii4g1gLD4zww6mt/hPi5zG+b88zYPFBKHpxMtsz9cWqXU5V5Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.32.tgz", + "integrity": "sha512-qZ1ViyOUDGbiZrSAJ/FIAhYUElDfVxxFW6DLT/w4KeoZN3HsF4jmRP95mXtl51/oGrqzU9l9Q2f7/P4O/o2ZZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.32.tgz", + "integrity": "sha512-hEkG3wD+f3wytV0lqwb/uCrXc4r4Ny/DWJFJPfQR3VeMWplhWGgSHNwZc2Q7k86Yi36f9NNzzWmrIuvHI9lCVw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.0.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.32.tgz", + "integrity": "sha512-k3MvDf8SiA7uP2ikP0unNouJ2YCrnwi7xcVW+RDgMp5YXVr3Xu6svmT3HGn0tkCKUuPmf+uy8I5uiHt5qWQbew==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rolldown/binding-win32-ia32-msvc": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.32.tgz", + "integrity": "sha512-wAi/FxGh7arDOUG45UmnXE1sZUa0hY4cXAO2qWAjFa3f7bTgz/BqwJ7XN5SUezvAJPNkME4fEpInfnBvM25a0w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.32.tgz", + "integrity": "sha512-Ej0i4PZk8ltblZtzVK8ouaGUacUtxRmTm5S9794mdyU/tYxXjAJNseOfxrnHpMWKjMDrOKbqkPqJ52T9NR4LQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.32.tgz", + "integrity": "sha512-QReCdvxiUZAPkvp1xpAg62IeNzykOFA6syH2CnClif4YmALN1XKpB39XneL80008UbtMShthSVDKmrx05N1q/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.2.tgz", + "integrity": "sha512-uLN8NAiFVIRKX9ZQha8wy6UUs06UNSZ32xj6giK/rmMXAgKahwExvK6SsmgU5/brh4w/nSgj8e0k3c1HBQpa0A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.2.tgz", + "integrity": "sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.2.tgz", + "integrity": "sha512-OZuTVTpj3CDSIxmPgGH8en/XtirV5nfljHZ3wrNwvgkT5DQLhIKAeuFSiwtbMto6oVexV0k1F1zqURPKf5rI1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.2.tgz", + "integrity": "sha512-Wa/Wn8RFkIkr1vy1k1PB//VYhLnlnn5eaJkfTQKivirOvzu5uVd2It01ukeQstMursuz7S1bU+8WW+1UPXpa8A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.2.tgz", + "integrity": "sha512-QkzxvH3kYN9J1w7D1A+yIMdI1pPekD+pWx7G5rXgnIlQ1TVYVC6hLl7SOV9pi5q9uIDF9AuIGkuzcbF7+fAhow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.2.tgz", + "integrity": "sha512-dkYXB0c2XAS3a3jmyDkX4Jk0m7gWLFzq1C3qUnJJ38AyxIF5G/dyS4N9B30nvFseCfgtCEdbYFhk0ChoCGxPog==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.2.tgz", + "integrity": "sha512-9VlPY/BN3AgbukfVHAB8zNFWB/lKEuvzRo1NKev0Po8sYFKx0i+AQlCYftgEjcL43F2h9Ui1ZSdVBc4En/sP2w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.2.tgz", + "integrity": "sha512-+GdKWOvsifaYNlIVf07QYan1J5F141+vGm5/Y8b9uCZnG/nxoGqgCmR24mv0koIWWuqvFYnbURRqw1lv7IBINw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.2.tgz", + "integrity": "sha512-df0Eou14ojtUdLQdPFnymEQteENwSJAdLf5KCDrmZNsy1c3YaCNaJvYsEUHnrg+/DLBH612/R0xd3dD03uz2dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.2.tgz", + "integrity": "sha512-iPeouV0UIDtz8j1YFR4OJ/zf7evjauqv7jQ/EFs0ClIyL+by++hiaDAfFipjOgyz6y6xbDvJuiU4HwpVMpRFDQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.50.2.tgz", + "integrity": "sha512-OL6KaNvBopLlj5fTa5D5bau4W82f+1TyTZRr2BdnfsrnQnmdxh4okMxR2DcDkJuh4KeoQZVuvHvzuD/lyLn2Kw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.2.tgz", + "integrity": "sha512-I21VJl1w6z/K5OTRl6aS9DDsqezEZ/yKpbqlvfHbW0CEF5IL8ATBMuUx6/mp683rKTK8thjs/0BaNrZLXetLag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.2.tgz", + "integrity": "sha512-Hq6aQJT/qFFHrYMjS20nV+9SKrXL2lvFBENZoKfoTH2kKDOJqff5OSJr4x72ZaG/uUn+XmBnGhfr4lwMRrmqCQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.2.tgz", + "integrity": "sha512-82rBSEXRv5qtKyr0xZ/YMF531oj2AIpLZkeNYxmKNN6I2sVE9PGegN99tYDLK2fYHJITL1P2Lgb4ZXnv0PjQvw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.2.tgz", + "integrity": "sha512-4Q3S3Hy7pC6uaRo9gtXUTJ+EKo9AKs3BXKc2jYypEcMQ49gDPFU2P1ariX9SEtBzE5egIX6fSUmbmGazwBVF9w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.2.tgz", + "integrity": "sha512-9Jie/At6qk70dNIcopcL4p+1UirusEtznpNtcq/u/C5cC4HBX7qSGsYIcG6bdxj15EYWhHiu02YvmdPzylIZlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.2.tgz", + "integrity": "sha512-HPNJwxPL3EmhzeAnsWQCM3DcoqOz3/IC6de9rWfGR8ZCuEHETi9km66bH/wG3YH0V3nyzyFEGUZeL5PKyy4xvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.2.tgz", + "integrity": "sha512-nMKvq6FRHSzYfKLHZ+cChowlEkR2lj/V0jYj9JnGUVPL2/mIeFGmVM2mLaFeNa5Jev7W7TovXqXIG2d39y1KYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.2.tgz", + "integrity": "sha512-eFUvvnTYEKeTyHEijQKz81bLrUQOXKZqECeiWH6tb8eXXbZk+CXSG2aFrig2BQ/pjiVRj36zysjgILkqarS2YA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.2.tgz", + "integrity": "sha512-cBaWmXqyfRhH8zmUxK3d3sAhEWLrtMjWBRwdMMHJIXSjvjLKvv49adxiEz+FJ8AP90apSDDBx2Tyd/WylV6ikA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.2.tgz", + "integrity": "sha512-APwKy6YUhvZaEoHyM+9xqmTpviEI+9eL7LoCH+aLcvWYHJ663qG5zx7WzWZY+a9qkg5JtzcMyJ9z0WtQBMDmgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/wasm-node": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.50.2.tgz", + "integrity": "sha512-2+Q114BRnYdBL8NNxtcYczJ/5LmTk+nXr2xnKeKnoa6HmuI32xzCae5pXDybHF1u6GP9UxhLjWbkWPEM5K1JcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@schematics/angular": { + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.1.tgz", + "integrity": "sha512-v2SNPaEHuMZyL85tYEQeFJvf7cFxSzXHbotcCrXRBuK3RSAvYXxWlpuBU+jGfZq2FjFZ+G7nHJZLAA/a1UqAvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.1", + "@angular-devkit/schematics": "20.3.1", + "jsonc-parser": "3.3.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.4.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", + "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.3.tgz", + "integrity": "sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.1.tgz", + "integrity": "sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.4.1", + "tuf-js": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz", + "integrity": "sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", + "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.9.tgz", + "integrity": "sha512-8t4HtkW4wxiPVedMpeZ63n3vlWxEIquo/zc1Tm8ElU+SqVV7+D3Na2PWaJUp179AzTragMWVwkMv7mvty0NfyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/jsdom/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@types/jsdom/node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.3.tgz", + "integrity": "sha512-gTVM8js2twdtqM+AE2PdGEe9zGQY4UvmFjan9rZcVb6FGdStfjWoWejdmy4CfWVO9rh5MiYQGZloKAGkJt8lMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", + "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", + "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.1.0", + "@algolia/client-abtesting": "5.35.0", + "@algolia/client-analytics": "5.35.0", + "@algolia/client-common": "5.35.0", + "@algolia/client-insights": "5.35.0", + "@algolia/client-personalization": "5.35.0", + "@algolia/client-query-suggestions": "5.35.0", + "@algolia/client-search": "5.35.0", + "@algolia/ingestion": "1.35.0", + "@algolia/monitoring": "1.35.0", + "@algolia/recommend": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.1.0.tgz", + "integrity": "sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-loader": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", + "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": "^18.20.0 || ^20.10.0 || >=22.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5.61.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.4.tgz", + "integrity": "sha512-L+YvJwGAgwJBV1p6ffpSTa2KRc69EeeYGYjRVWKs0GKrK+LON0GC0gV+rKSNtALEDvMDqkvCFq9r1r94/Gjwxw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/beasties": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.5.tgz", + "integrity": "sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "css-select": "^6.0.0", + "css-what": "^7.0.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^10.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.0.tgz", + "integrity": "sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.2", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001741", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz", + "integrity": "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, - "rc": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", + "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz", + "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true, + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.1.tgz", + "integrity": "sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-parent": "^6.0.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2", + "tinyglobby": "^0.2.12" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true + "webpack": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dedent": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", + "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz", + "integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.218", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.218.tgz", + "integrity": "sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.9.tgz", + "integrity": "sha512-Jpv5tCSwQg18aCqCRD3oHIX/prBhXMDapIoG//A+6+dV0e7KQMGFg85ihJ5T1EeMjbZjON3TqFy0VrGAnIHLDA==", + "dev": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-directory": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/find-cache-directory/-/find-cache-directory-6.0.0.tgz", + "integrity": "sha512-CvFd5ivA6HcSHbD+59P7CyzINHXzwhuQK8RY7CxJZtgDSAtRlHiCaQpZQ2lMR/WRyUIEmzUvL6G2AGurMfegZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^8.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-directory/node_modules/pkg-dir": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-8.0.0.tgz", + "integrity": "sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.0.1.tgz", + "integrity": "sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.0.tgz", + "integrity": "sha512-gEf705MZLrDPkbbhi8PnoO4ZwYgKoNL+ISZ3AjZMht2r3N5tuTwncyDi6Fv2/qDnMmZxgs0yI8WDOyR8q3G+SQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.1.tgz", + "integrity": "sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", + "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore-walk": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", + "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^10.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/injection-js": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.5.0.tgz", + "integrity": "sha512-UpY2ONt4xbht4GhSqQ2zMJ1rBIQq4uOY+DlR6aOeYyqK7xadXt7UQbJIyxmgk288bPMkIZKjViieHm0O0i72Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + } + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jasmine-core": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.2.0.tgz", + "integrity": "sha512-tSAtdrvWybZkQmmaIoDgnvHG8ORUNw5kEVlO5CvrXj02Jjr9TZrmjFq7FUiOUzJiOP2wLGYT6PgrQgQF4R1xiw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jasmine-spec-reporter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", + "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "colors": "1.4.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-cli/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { "optional": true }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-preset-angular": { + "version": "14.6.0", + "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-14.6.0.tgz", + "integrity": "sha512-LGSKLCsUhtrs2dw6f7ega/HOS8/Ni/1gV+oXmxPHmJDLHFpM6cI78Monmz8Z1P87a/A4OwnKilxgPRr+6Pzmgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "esbuild-wasm": ">=0.15.13", + "jest-environment-jsdom": "^29.7.0", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0", + "ts-jest": "^29.3.0" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0" + }, + "optionalDependencies": { + "esbuild": ">=0.15.13" + }, + "peerDependencies": { + "@angular/compiler-cli": ">=15.0.0 <21.0.0", + "@angular/core": ">=15.0.0 <21.0.0", + "@angular/platform-browser-dynamic": ">=15.0.0 <21.0.0", + "jest": "^29.0.0", + "jsdom": ">=20.0.0", + "typescript": ">=4.8" + }, + "peerDependenciesMeta": { + "jsdom": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, + } + } + }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/jsdom/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma-coverage/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/launch-editor": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/less": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.4.0.tgz", + "integrity": "sha512-kdTwsyRuncDfjEs0DlRILWNvxhDG/Zij4YLO4TMJgDLW+8OzpfkdPnRgrsRuY1o+oaxJGWsps5f/RVBgGmmN0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.3.0.tgz", + "integrity": "sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { "optional": true }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, + "webpack": { "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, + } + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "license": "ISC", + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { "optional": true }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, + "webpack-sources": { "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, + } + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.1.tgz", + "integrity": "sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lmdb": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.2.tgz", + "integrity": "sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "msgpackr": "^1.11.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.5.3", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.4.2", + "@lmdb/lmdb-darwin-x64": "3.4.2", + "@lmdb/lmdb-linux-arm": "3.4.2", + "@lmdb/lmdb-linux-arm64": "3.4.2", + "@lmdb/lmdb-linux-x64": "3.4.2", + "@lmdb/lmdb-win32-arm64": "3.4.2", + "@lmdb/lmdb-win32-x64": "3.4.2" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.0.tgz", + "integrity": "sha512-YdhtCd19sKRKfAAUsrcC1wzm4JuzJoiX4pOJqIoW2qmKj5WzG/dL8uUJ0361zaXtHqK7gEhOwtAtz7t3Yq3X5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/memfs": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.39.0.tgz", + "integrity": "sha512-tFRr2IkSXl2B6IAJsxjHIMTOsfLt9W+8+t2uNxCeQcz4tFqgQR8DYk8hlLH2HsucTctLuoHq3U0G08atyBE3yw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/msgpackr": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz", + "integrity": "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==", + "dev": true, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ng-packagr": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-20.3.0.tgz", + "integrity": "sha512-hwPZNeV/6C3pWojK70AHxe6uk1rz2bzoe+WdH+GIWouUcyXrjYQjOFyLfOGD0ia9D+yWVzjsi4CKVK/dQFDQ6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@rollup/plugin-json": "^6.1.0", + "@rollup/wasm-node": "^4.24.0", + "ajv": "^8.17.1", + "ansi-colors": "^4.1.3", + "browserslist": "^4.22.1", + "chokidar": "^4.0.1", + "commander": "^14.0.0", + "dependency-graph": "^1.0.0", + "esbuild": "^0.25.0", + "find-cache-directory": "^6.0.0", + "injection-js": "^2.4.0", + "jsonc-parser": "^3.3.1", + "less": "^4.2.0", + "ora": "^8.2.0", + "piscina": "^5.0.0", + "postcss": "^8.4.47", + "rollup-plugin-dts": "^6.2.0", + "rxjs": "^7.8.1", + "sass": "^1.81.0", + "tinyglobby": "^0.2.12" + }, + "bin": { + "ng-packagr": "src/cli/main.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "optionalDependencies": { + "rollup": "^4.24.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^20.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.8 <6.0" + }, + "peerDependenciesMeta": { + "tailwindcss": { "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true } } }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "node_modules/ng-packagr/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "gaze": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", - "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", "dev": true, - "optional": true, - "requires": { - "globule": "1.2.0" + "license": "MIT", + "optional": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" } }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "node_modules/node-gyp": { + "version": "11.4.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.4.2.tgz", + "integrity": "sha512-3gD+6zsrLQH7DyYOUIutaauuXrcyxeTPyQuZQCQoNPZMHMMS5m4y0xclNpvYzoK3VNzuyxT6eF4mkIL4WSZ1eQ==", "dev": true, - "optional": true + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, + "license": "MIT", "optional": true, - "requires": { - "is-property": "1.0.2" + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" } }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { + "node_modules/node-gyp/node_modules/chownr": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "license": "ISC", + "engines": { + "node": ">=16" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "node_modules/node-gyp/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "node_modules/node-gyp/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, - "requires": { - "is-glob": "2.0.1" - }, + "license": "ISC", "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" } }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "node_modules/node-gyp/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, - "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "glob": "7.1.2", - "ignore": "3.3.7", - "pify": "3.0.0", - "slash": "1.0.0" + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "globule": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", - "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "node_modules/node-gyp/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, - "optional": true, - "requires": { - "glob": "7.1.2", - "lodash": "4.17.4", - "minimatch": "3.0.4" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" }, - "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", - "dev": true + "node_modules/node-releases": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "dev": true, + "license": "MIT" }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - }, + "license": "ISC", "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - } + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, - "requires": { - "function-bind": "1.1.1" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "node_modules/npm-bundled": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", + "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", "dev": true, - "requires": { - "ansi-regex": "2.1.1" + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "has-binary": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "node_modules/npm-install-checks": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.2.tgz", + "integrity": "sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ==", "dev": true, - "requires": { - "isarray": "0.0.1" - }, + "license": "BSD-2-Clause", "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } + "semver": "^7.1.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "node_modules/npm-package-arg": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.0.tgz", + "integrity": "sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^9.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "node_modules/npm-packlist": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.1.tgz", + "integrity": "sha512-vaC03b2PqJA6QqmwHi1jNU8fAPXEnnyv4j/W4PVfgm24C4/zZGSVut3z0YUeN0WIFCo1oGOL02+6LbvFK7JL4Q==", "dev": true, - "requires": { - "inherits": "2.0.3" + "license": "ISC", + "dependencies": { + "ignore-walk": "^8.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "node_modules/npm-pick-manifest": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", + "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "license": "ISC", + "dependencies": { + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "node_modules/npm-pick-manifest/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true + "node_modules/npm-pick-manifest/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", "dev": true, - "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true + "node_modules/npm-registry-fetch": { + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", + "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^3.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^14.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "node_modules/npm-registry-fetch/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", "dev": true, - "requires": { - "inherits": "2.0.3", - "obuf": "1.1.1", - "readable-stream": "2.3.3", - "wbuf": "1.7.2" + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", - "dev": true + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-minifier": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.8.tgz", - "integrity": "sha512-WX7D6PB9PFq05fZ1/CyxPUuyqXed6vh2fGOM80+zJT5wAO93D/cUjLs0CcbBFjQmlwmCgRvl97RurtArIpOnkw==", - "dev": true, - "requires": { - "camel-case": "3.0.0", - "clean-css": "4.1.9", - "commander": "2.12.2", - "he": "1.1.1", - "ncname": "1.0.0", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.3.4" - } - }, - "html-webpack-plugin": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", - "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "html-minifier": "3.5.8", - "loader-utils": "0.2.17", - "lodash": "4.17.4", - "pretty-error": "2.1.1", - "toposort": "1.0.6" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - } + "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "htmlparser2": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", - "dev": true, - "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.1.0", - "domutils": "1.1.6", - "readable-stream": "1.0.34" - }, - "dependencies": { - "domutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", - "dev": true, - "requires": { - "domelementtype": "1.3.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.3.1" - }, + "license": "BSD-2-Clause", "dependencies": { - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "http-parser-js": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", - "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", - "dev": true + "node_modules/nwsapi": { + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", + "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==", + "dev": true, + "license": "MIT" }, - "http-proxy": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", - "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", - "dev": true, - "requires": { - "eventemitter3": "1.2.0", - "requires-port": "1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", - "dev": true, - "requires": { - "http-proxy": "1.16.2", - "is-glob": "3.1.0", - "lodash": "4.17.4", - "micromatch": "2.3.11" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" }, - "https-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, - "requires": { - "agent-base": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1" + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "icss-replace-symbols": { + "node_modules/on-headers": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "6.0.15" - }, - "dependencies": { - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.15.tgz", - "integrity": "sha512-v/SpyMzLbtkmh45zUdaqLAaqXqzPdSrw8p4cQVO0/w6YiYfpj4k+Wkzhn68qk9br+H+0qfddhdPEVnbmBPfXVQ==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "5.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" } }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", - "dev": true + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", - "dev": true + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "optional": true + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "import-local": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", - "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", + "node_modules/ora/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, - "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "node_modules/ordered-binary": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", + "integrity": "sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==", "dev": true, + "license": "MIT", "optional": true }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "requires": { - "repeating": "2.0.1" + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "node_modules/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } }, - "internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "requires": { - "meow": "3.7.0" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pacote": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.0.tgz", + "integrity": "sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^10.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "node_modules/pacote/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", "dev": true, - "requires": { - "loose-envify": "1.3.1" + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ipaddr.js": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", - "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true + "node_modules/pacote/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "node_modules/pacote/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, - "is-binary-path": { + "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "requires": { - "binary-extensions": "1.11.0" + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "requires": { - "builtin-modules": "1.1.1" + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", - "dev": true + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" }, - "is-date-object": { + "node_modules/parse-node-version": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, - "requires": { - "is-primitive": "2.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.10" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "node_modules/parse5-html-rewriting-stream": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz", + "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", "dev": true, - "requires": { - "number-is-nan": "1.0.1" + "license": "MIT", + "dependencies": { + "entities": "^6.0.0", + "parse5": "^8.0.0", + "parse5-sax-parser": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "node_modules/parse5-html-rewriting-stream/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, - "requires": { - "number-is-nan": "1.0.1" + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "node_modules/parse5-sax-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", + "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", "dev": true, - "requires": { - "is-extglob": "2.1.1" + "license": "MIT", + "dependencies": { + "parse5": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "is-my-json-valid": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz", - "integrity": "sha512-Q2khNw+oBlWuaYvEEHtKSw/pCxD2L5Rc1C+UQme9X6JdRDh7m5D7HkozA0qa3DUkQ6VzCnEm8mVIQPyIRkI5sQ==", - "dev": true, - "optional": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, - "requires": { - "kind-of": "3.2.2" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "requires": { - "is-path-inside": "1.0.1" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "is-path-inside": { + "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "requires": { - "path-is-inside": "1.0.2" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "requires": { - "isobject": "3.0.1" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, - "optional": true + "license": "MIT" }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, - "requires": { - "has": "1.0.1" + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "dev": true, - "requires": { - "html-comment-regex": "1.1.1" + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isbinaryfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "istanbul-api": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.1.tgz", - "integrity": "sha512-oFCwXvd65amgaPCzqrR+a2XjanS1MvpXN6l/MlMUTv6uiA1NOgGX+I0uyq8Lg3GDxsxPsaP1049krz3hIJ5+KA==", - "dev": true, - "requires": { - "async": "2.6.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-hook": "1.1.0", - "istanbul-lib-instrument": "1.9.1", - "istanbul-lib-report": "1.1.2", - "istanbul-lib-source-maps": "1.2.2", - "istanbul-reports": "1.1.3", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "once": "1.4.0" - } - }, - "istanbul-instrumenter-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-2.0.0.tgz", - "integrity": "sha1-5UkpAKsLuoNe+oAkywC+mz7qJwA=", - "dev": true, - "requires": { - "convert-source-map": "1.5.1", - "istanbul-lib-instrument": "1.9.1", - "loader-utils": "0.2.17", - "object-assign": "4.1.1" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - } + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" } }, - "istanbul-lib-coverage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", - "dev": true + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } }, - "istanbul-lib-hook": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", - "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", + "node_modules/piscina": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.3.tgz", + "integrity": "sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==", "dev": true, - "requires": { - "append-transform": "0.4.0" + "license": "MIT", + "engines": { + "node": ">=20.x" + }, + "optionalDependencies": { + "@napi-rs/nice": "^1.0.4" } }, - "istanbul-lib-instrument": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", - "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", "dev": true, - "requires": { - "babel-generator": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.1.1", - "semver": "5.4.1" + "license": "MIT", + "engines": { + "node": ">=16.20.0" } }, - "istanbul-lib-report": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz", - "integrity": "sha512-UTv4VGx+HZivJQwAo1wnRwe1KTvFpfi/NYwN7DcsrdzMXwpRT/Yb6r4SBPoHWj4VuQPakR32g4PUUeyKkdDkBA==", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "requires": { - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" - }, + "license": "MIT", "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "istanbul-lib-source-maps": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz", - "integrity": "sha512-8BfdqSfEdtip7/wo1RnrvLpHVEd8zMZEDmOFEnpC6dg0vXflHt9nvoAyQUzig2uMSXfF2OBEYBV3CVjIL9JvaQ==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" - }, + "license": "MIT", "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "istanbul-reports": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.3.tgz", - "integrity": "sha512-ZEelkHh8hrZNI5xDaKwPMFwDsUf5wIEI2bXAFGp1e6deR2mnEKBPhLJEgr4ZBt8Gi6Mj38E/C8kcy9XLggVO2Q==", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "requires": { - "handlebars": "4.0.11" + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "7.1.2", - "jasmine-core": "2.8.0" - }, + "license": "MIT", "dependencies": { - "jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", - "dev": true - } + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "jasmine-core": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.6.4.tgz", - "integrity": "sha1-3skmzQqfoof7bbXHVfpIfnTOysU=", - "dev": true - }, - "jasmine-spec-reporter": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.1.1.tgz", - "integrity": "sha1-Wm1Yq11hvqcwn7wnkjlRF1axtYg=", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "requires": { - "colors": "1.1.2" + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", - "dev": true - }, - "js-base64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.0.tgz", - "integrity": "sha512-Wehd+7Pf9tFvGb+ydPm9TjYjV8X1YHOVyG8QyELZxEMqOhemVwGRmoG8iQ/soqI3n8v4xn59zaLxiCJiaaRzKA==", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "node_modules/postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", "dev": true, - "optional": true - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", - "dev": true + "license": "MIT", + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } }, - "json-schema": { + "node_modules/postcss-media-query-parser": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, - "requires": { - "jsonify": "0.0.0" + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "dev": true, - "requires": { - "graceful-fs": "4.1.11" + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "dev": true, - "optional": true + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, + "license": "ISC", "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "karma": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", - "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "body-parser": "1.18.2", - "chokidar": "1.7.0", - "colors": "1.1.2", - "combine-lists": "1.0.1", - "connect": "3.6.5", - "core-js": "2.5.3", - "di": "0.0.1", - "dom-serialize": "2.2.1", - "expand-braces": "0.1.2", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "http-proxy": "1.16.2", - "isbinaryfile": "3.0.2", - "lodash": "3.10.1", - "log4js": "0.6.38", - "mime": "1.6.0", - "minimatch": "3.0.4", - "optimist": "0.6.1", - "qjobs": "1.1.5", - "range-parser": "1.2.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", - "socket.io": "1.7.3", - "source-map": "0.5.7", - "tmp": "0.0.31", - "useragent": "2.2.1" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - } + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, - "karma-chrome-launcher": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz", - "integrity": "sha1-IWh5xorATY1RQOmWGboEtZr9Rs8=", + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "requires": { - "fs-access": "1.0.1", - "which": "1.3.0" + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "karma-cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", - "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "requires": { - "resolve": "1.5.0" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "karma-coverage-istanbul-reporter": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.3.3.tgz", - "integrity": "sha512-MFkB6bh11J8nKygUdqyHb9sMz17XoBRYR4tiNxnSpi/UtDk0wk8eRGa0jRSJaILgCl4xyq1TL6Jidww1OWly/Q==", + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, - "requires": { - "istanbul-api": "1.2.1", - "minimatch": "3.0.4" + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "karma-jasmine": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.1.tgz", - "integrity": "sha1-b+hA51oRYAydkehLM8RY4cRqNSk=", - "dev": true + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" }, - "karma-jasmine-html-reporter": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", - "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, - "requires": { - "karma-jasmine": "1.1.1" + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" } }, - "karma-source-map-support": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz", - "integrity": "sha1-G/gee7SwiWJ6s1LsQXnhF8QGpUA=", + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, - "requires": { - "source-map-support": "0.4.18" + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" } }, - "killable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", - "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, - "requires": { - "is-buffer": "1.1.6" + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", - "dev": true + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT", + "optional": true }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", "dev": true, - "requires": { - "invert-kv": "1.0.0" + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" } }, - "less": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", - "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "requires": { - "errno": "0.1.6", - "graceful-fs": "4.1.11", - "image-size": "0.5.5", - "mime": "1.6.0", - "mkdirp": "0.5.1", - "promise": "7.3.1", - "request": "2.81.0", - "source-map": "0.5.7" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "less-loader": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.0.5.tgz", - "integrity": "sha1-rhVadAbKxqzSk9eFWH/P8PR4xN0=", + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, - "requires": { - "clone": "2.1.1", - "loader-utils": "1.1.0", - "pify": "2.3.0" - }, - "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" } - } + ], + "license": "MIT" }, - "license-webpack-plugin": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.1.1.tgz", - "integrity": "sha512-TjKOyiC0exqd4Idy/4M8/DETR22dXBZks387DuS5LbslxHiMRXGx/Q2F/j9IUtvEoH5uFvt72vRgk/G6f8j3Dg==", + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "dev": true, - "requires": { - "ejs": "2.5.7" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" } }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, - "optional": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "lodash.mergewith": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", - "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=", + "node_modules/raw-body": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", + "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", "dev": true, - "optional": true - }, - "lodash.tail": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", - "dev": true + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.7.0", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.10" + } }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" }, - "log4js": { - "version": "0.6.38", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", - "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "requires": { - "readable-stream": "1.0.34", - "semver": "4.3.6" - }, + "license": "MIT", "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "loglevel": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.0.tgz", - "integrity": "sha1-rgyqVhERSYxboTcj1vtjHSQAOTQ=", - "dev": true + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true, - "requires": { - "js-tokens": "3.0.2" - } + "license": "MIT" }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" } }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true + "node_modules/regex-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", + "dev": true, + "license": "MIT" }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "node_modules/regexpu-core": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.3.1.tgz", + "integrity": "sha512-DzcswPr252wEr7Qz8AyAVbfyBDKLoYp6eRA1We2Fa9qirRFSdtkP5sHr3yglDKy2BbA0fd2T+j/CUSKes3FeVQ==", "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" } }, - "macaddress": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", - "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", - "dev": true + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" }, - "magic-string": { - "version": "0.22.4", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", - "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==", + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, - "requires": { - "vlq": "0.2.3" + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" } }, - "make-dir": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", - "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, - "requires": { - "pify": "3.0.0" + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" } }, - "make-error": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.2.tgz", - "integrity": "sha512-l9ra35l5VWLF24y75Tg8XgfGLX0ueRhph118WKM6H5denx4bB5QF59+4UAm9oJ2qsPQZas/CQUDdtDdfvYHBdQ==", - "dev": true + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", - "dev": true + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "dev": true, - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - } + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "requires": { - "mimic-fn": "1.1.0" + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "requires": { - "errno": "0.1.6", - "readable-stream": "2.3.3" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "license": "MIT", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" } }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "license": "MIT", + "engines": { + "node": ">=10" } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", - "dev": true + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, - "requires": { - "mime-db": "1.30.0" + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "mimic-fn": { + "node_modules/reusify": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, - "requires": { - "brace-expansion": "1.1.8" + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" }, - "mississippi": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-1.3.0.tgz", - "integrity": "sha1-0gFYPrEjJ+PFwWQqQEqcrPlONPU=", - "dev": true, - "requires": { - "concat-stream": "1.6.0", - "duplexify": "3.5.1", - "end-of-stream": "1.4.0", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "1.0.3", - "pumpify": "1.3.5", - "stream-each": "1.2.2", - "through2": "2.0.3" - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "node_modules/rolldown": { + "version": "1.0.0-beta.32", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.32.tgz", + "integrity": "sha512-vxI2sPN07MMaoYKlFrVva5qZ1Y7DAZkgp7MQwTnyHt4FUMz9Sh+YeCzNFV9JYHI6ZNwoGWLCfCViE3XVsRC1cg==", "dev": true, - "requires": { - "for-in": "0.1.8", - "is-extendable": "0.1.1" + "license": "MIT", + "dependencies": { + "@oxc-project/runtime": "=0.81.0", + "@oxc-project/types": "=0.81.0", + "@rolldown/pluginutils": "1.0.0-beta.32", + "ansis": "^4.0.0" }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-beta.32", + "@rolldown/binding-darwin-arm64": "1.0.0-beta.32", + "@rolldown/binding-darwin-x64": "1.0.0-beta.32", + "@rolldown/binding-freebsd-x64": "1.0.0-beta.32", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.32", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.32", + "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.32", + "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.32", + "@rolldown/binding-linux-x64-musl": "1.0.0-beta.32", + "@rolldown/binding-openharmony-arm64": "1.0.0-beta.32", + "@rolldown/binding-wasm32-wasi": "1.0.0-beta.32", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.32", + "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.32", + "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.32" + } + }, + "node_modules/rollup": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.2.tgz", + "integrity": "sha512-BgLRGy7tNS9H66aIMASq1qSYbAAJV6Z6WR4QYTvj5FgF15rZ/ympT1uixHXwzbZUBDbkvqUI1KR0fH1FhMaQ9w==", + "dev": true, + "license": "MIT", "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", - "dev": true - } + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.50.2", + "@rollup/rollup-android-arm64": "4.50.2", + "@rollup/rollup-darwin-arm64": "4.50.2", + "@rollup/rollup-darwin-x64": "4.50.2", + "@rollup/rollup-freebsd-arm64": "4.50.2", + "@rollup/rollup-freebsd-x64": "4.50.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.2", + "@rollup/rollup-linux-arm-musleabihf": "4.50.2", + "@rollup/rollup-linux-arm64-gnu": "4.50.2", + "@rollup/rollup-linux-arm64-musl": "4.50.2", + "@rollup/rollup-linux-loong64-gnu": "4.50.2", + "@rollup/rollup-linux-ppc64-gnu": "4.50.2", + "@rollup/rollup-linux-riscv64-gnu": "4.50.2", + "@rollup/rollup-linux-riscv64-musl": "4.50.2", + "@rollup/rollup-linux-s390x-gnu": "4.50.2", + "@rollup/rollup-linux-x64-gnu": "4.50.2", + "@rollup/rollup-linux-x64-musl": "4.50.2", + "@rollup/rollup-openharmony-arm64": "4.50.2", + "@rollup/rollup-win32-arm64-msvc": "4.50.2", + "@rollup/rollup-win32-ia32-msvc": "4.50.2", + "@rollup/rollup-win32-x64-msvc": "4.50.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-dts": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.2.3.tgz", + "integrity": "sha512-UgnEsfciXSPpASuOelix7m4DrmyQgiaWBnvI0TM4GxuDh5FkqW8E5hu57bCxXB90VvR1WNfLV80yEDN18UogSA==", + "dev": true, + "license": "LGPL-3.0-only", + "dependencies": { + "magic-string": "^0.30.17" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/Swatinem" + }, + "optionalDependencies": { + "@babel/code-frame": "^7.27.1" + }, + "peerDependencies": { + "rollup": "^3.29.4 || ^4", + "typescript": "^4.5 || ^5.0" } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "dev": true, - "requires": { - "minimist": "0.0.8" - }, + "license": "MIT", "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", "dev": true, - "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multicast-dns": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.1.tgz", - "integrity": "sha512-uV3/ckdsffHx9IrGQrx613mturMdMqQ06WTq+C09NsStJ9iNG6RcUWgPKs1Rfjy+idZT6tfQoXEusGNnEZhT3w==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "requires": { - "dns-packet": "1.2.2", - "thunky": "0.1.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true + "node_modules/rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } }, - "nan": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, - "optional": true + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "ncname": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, - "requires": { - "xml-char-classes": "1.0.0" - } - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true + "license": "MIT" }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "node_modules/sass": { + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", + "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", "dev": true, - "requires": { - "lower-case": "1.1.4" + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, - "node-forge": { - "version": "0.6.33", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", - "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=", - "dev": true - }, - "node-gyp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", - "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "4.1.2", - "osenv": "0.1.4", - "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.3.0" - }, - "dependencies": { - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.1" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true, + "node_modules/sass-loader": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { "optional": true - } - } - }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.1.7", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "1.0.3", - "timers-browserify": "2.0.4", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4" - } - }, - "node-modules-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.1.tgz", - "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=", - "dev": true - }, - "node-sass": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.7.2.tgz", - "integrity": "sha512-CaV+wLqZ7//Jdom5aUFCpGNoECd7BbNhjuwdsX/LkXBrHl8eb1Wjw4HvWqcFvhr5KuNgAk8i/myf/MQ1YYeroA==", - "dev": true, - "optional": true, - "requires": { - "async-foreach": "0.1.3", - "chalk": "1.1.3", - "cross-spawn": "3.0.1", - "gaze": "1.1.2", - "get-stdin": "4.0.1", - "glob": "7.1.2", - "in-publish": "2.0.0", - "lodash.assign": "4.2.0", - "lodash.clonedeep": "4.5.0", - "lodash.mergewith": "4.6.0", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "nan": "2.8.0", - "node-gyp": "3.6.2", - "npmlog": "4.1.2", - "request": "2.79.0", - "sass-graph": "2.2.4", - "stdout-stream": "1.4.0", - "true-case-path": "1.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true, + "node-sass": { "optional": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "optional": true, - "requires": { - "chalk": "1.1.3", - "commander": "2.12.2", - "is-my-json-valid": "2.17.1", - "pinkie-promise": "2.0.1" - } - }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", - "dev": true, + "sass": { "optional": true }, - "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.11.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "qs": "6.3.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.4.3", - "uuid": "3.1.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "sass-embedded": { + "optional": true }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true, + "webpack": { "optional": true } } }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.4" + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" } }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "normalize-path": { + "node_modules/schema-utils/node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, - "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, - "requires": { - "path-key": "2.0.1" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "dev": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" } }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, - "requires": { - "boolbase": "1.0.0" + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" } }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - } + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "obuf": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", - "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "node_modules/serve-index/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "requires": { - "ee-first": "1.1.1" + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" } }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "requires": { - "wrappy": "1.0.2" + "license": "MIT", + "dependencies": { + "ms": "2.0.0" } }, - "opn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, - "requires": { - "is-wsl": "1.1.0" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, - "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.2" - }, + "license": "MIT", "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } - } - }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true - }, - "original": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", - "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", - "dev": true, - "requires": { - "url-parse": "1.0.5" - }, - "dependencies": { - "url-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", - "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", - "dev": true, - "requires": { - "querystringify": "0.0.4", - "requires-port": "1.0.0" - } - } + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true + "node_modules/serve-index/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "node_modules/serve-index/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "requires": { - "lcid": "1.0.0" + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" }, - "osenv": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "node_modules/serve-index/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "license": "ISC" }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, - "requires": { - "p-try": "1.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "dev": true, - "requires": { - "p-limit": "1.2.0" + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" } }, - "p-map": { + "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" } }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { - "no-case": "2.3.2" + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "requires": { - "asn1.js": "4.9.2", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, - "requires": { - "error-ex": "1.3.1" + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "parsejson": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, - "requires": { - "better-assert": "1.0.2" + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, - "requires": { - "better-assert": "1.0.2" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, - "requires": { - "better-assert": "1.0.2" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "node_modules/sigstore": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, - "path-parse": { + "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" }, - "path-type": { + "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "requires": { - "pify": "3.0.0" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, - "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, - "requires": { - "pinkie": "2.0.4" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, - "requires": { - "find-up": "2.1.0" + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "portfinder": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, - "requires": { - "async": "1.5.2", - "debug": "2.6.9", - "mkdirp": "0.5.1" - }, + "license": "MIT", "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" } }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - }, + "license": "MIT", "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0", - "reduce-css-calc": "1.3.0" + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" } }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, - "requires": { - "colormin": "1.1.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" } }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "postcss-custom-properties": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-6.2.0.tgz", - "integrity": "sha512-eNR2h9T9ciKMoQEORrPjH33XeN/nuvVuxArOKmHtsFbGbNss631tgTrKou3/pmjAZbA4QQkhLIkPQkIk3WW+8w==", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "postcss": "6.0.15" - }, - "dependencies": { - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.15.tgz", - "integrity": "sha512-v/SpyMzLbtkmh45zUdaqLAaqXqzPdSrw8p4cQVO0/w6YiYfpj4k+Wkzhn68qk9br+H+0qfddhdPEVnbmBPfXVQ==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "5.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "node_modules/source-map-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", + "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" } }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, - "requires": { - "postcss": "5.2.18" + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "requires": { - "postcss": "5.2.18" + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "requires": { - "postcss": "5.2.18" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "requires": { - "postcss": "5.2.18" + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, - "requires": { - "postcss": "5.2.18", - "uniqs": "2.0.0" - } + "license": "CC-BY-3.0" }, - "postcss-filter-plugins": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", - "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "requires": { - "postcss": "5.2.18", - "uniqid": "4.1.1" + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, - "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1", - "postcss-load-options": "1.2.0", - "postcss-load-plugins": "2.3.0" + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" } }, - "postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, - "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" } }, - "postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", - "dev": true, - "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" - } - }, - "postcss-loader": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.10.tgz", - "integrity": "sha512-xQaDcEgJ/2JqFY18zpFkik8vyYs7oS5ZRbrjvDqkP97k2wYWfPT4+qA0m4o3pTSCsz0u26PNqs8ZO9FRUWAqrA==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "postcss": "6.0.15", - "postcss-load-config": "1.2.0", - "schema-utils": "0.3.0" - }, - "dependencies": { - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.15.tgz", - "integrity": "sha512-v/SpyMzLbtkmh45zUdaqLAaqXqzPdSrw8p4cQVO0/w6YiYfpj4k+Wkzhn68qk9br+H+0qfddhdPEVnbmBPfXVQ==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "5.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "postcss-merge-longhand": { + "node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, - "requires": { - "postcss": "5.2.18" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", "dev": true, - "requires": { - "browserslist": "1.7.7", - "caniuse-api": "1.6.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3", - "vendors": "1.0.1" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, - "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" } }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "uniqs": "2.0.0" + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3" + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "dev": true, - "requires": { - "postcss": "6.0.15" - }, - "dependencies": { - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.15.tgz", - "integrity": "sha512-v/SpyMzLbtkmh45zUdaqLAaqXqzPdSrw8p4cQVO0/w6YiYfpj4k+Wkzhn68qk9br+H+0qfddhdPEVnbmBPfXVQ==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "5.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.15" - }, - "dependencies": { - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.15.tgz", - "integrity": "sha512-v/SpyMzLbtkmh45zUdaqLAaqXqzPdSrw8p4cQVO0/w6YiYfpj4k+Wkzhn68qk9br+H+0qfddhdPEVnbmBPfXVQ==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "5.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.15" - }, - "dependencies": { - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.15.tgz", - "integrity": "sha512-v/SpyMzLbtkmh45zUdaqLAaqXqzPdSrw8p4cQVO0/w6YiYfpj4k+Wkzhn68qk9br+H+0qfddhdPEVnbmBPfXVQ==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "5.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.15" - }, - "dependencies": { - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.15.tgz", - "integrity": "sha512-v/SpyMzLbtkmh45zUdaqLAaqXqzPdSrw8p4cQVO0/w6YiYfpj4k+Wkzhn68qk9br+H+0qfddhdPEVnbmBPfXVQ==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "5.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { - "postcss": "5.2.18" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "1.9.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "requires": { - "postcss": "5.2.18" + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true, - "requires": { - "is-svg": "2.1.0", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "svgo": "0.7.2" - } + "license": "MIT" }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "uniqs": "2.0.0" + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "postcss-url": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.0.tgz", - "integrity": "sha512-VBP6uf6iL3AZra23nkPkOEkS/5azj1xf/toRrjfkolfFEgg9Gyzg9UhJZeIsz12EGKZTNVeGbPa2XtaZm/iZvg==", + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, - "requires": { - "mime": "1.6.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "postcss": "6.0.15", - "xxhashjs": "0.2.1" - }, - "dependencies": { - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.15.tgz", - "integrity": "sha512-v/SpyMzLbtkmh45zUdaqLAaqXqzPdSrw8p4cQVO0/w6YiYfpj4k+Wkzhn68qk9br+H+0qfddhdPEVnbmBPfXVQ==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "5.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", - "dev": true + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "uniqs": "2.0.0" + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, - "requires": { - "renderkid": "2.0.1", - "utila": "0.4.0" + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" } }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true + "node_modules/tar/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "node_modules/terser": { + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "dev": true, - "optional": true, - "requires": { - "asap": "2.0.6" + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" } }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "protractor": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.1.2.tgz", - "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=", - "dev": true, - "requires": { - "@types/node": "6.0.95", - "@types/q": "0.0.32", - "@types/selenium-webdriver": "2.53.43", - "blocking-proxy": "0.0.5", - "chalk": "1.1.3", - "glob": "7.1.2", - "jasmine": "2.8.0", - "jasminewd2": "2.2.0", - "optimist": "0.6.1", - "q": "1.4.1", - "saucelabs": "1.3.0", - "selenium-webdriver": "3.0.1", - "source-map-support": "0.4.18", - "webdriver-js-extender": "1.0.0", - "webdriver-manager": "12.0.6" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" - } - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "esbuild": { + "optional": true }, - "webdriver-manager": { - "version": "12.0.6", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.0.6.tgz", - "integrity": "sha1-PfGkgZdwELTL+MnYXHpXeCjA5ws=", - "dev": true, - "requires": { - "adm-zip": "0.4.7", - "chalk": "1.1.3", - "del": "2.2.2", - "glob": "7.1.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "q": "1.4.1", - "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.4.1", - "xml2js": "0.4.19" - } + "uglify-js": { + "optional": true } } }, - "proxy-addr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", - "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.5.2" + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.5" + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" } }, - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "node_modules/thingies": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", + "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", "dev": true, - "requires": { - "end-of-stream": "1.4.0", - "once": "1.4.0" + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" } }, - "pumpify": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.5.tgz", - "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=", + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true, - "requires": { - "duplexify": "3.5.1", - "inherits": "2.0.3", - "pump": "1.0.3" - } + "license": "MIT" }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qjobs": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.1.5.tgz", - "integrity": "sha1-ZZ3p8s+NzCehSBJ28gU3cnI4LnM=", - "dev": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", "dev": true, - "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", - "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, - "requires": { - "safe-buffer": "5.1.1" + "license": "MIT", + "engines": { + "node": ">=0.6" } }, - "randomfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", - "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, - "requires": { - "randombytes": "2.0.5", - "safe-buffer": "5.1.1" + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" } }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" } }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", - "dev": true - }, - "read-pkg": { + "node_modules/tree-dump": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - } + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "license": "MIT", + "bin": { + "tree-kill": "cli.js" } }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "node_modules/ts-jest": { + "version": "29.4.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.1.tgz", + "integrity": "sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==", "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.2", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, - "requires": { - "balanced-match": "0.4.2", - "math-expression-evaluator": "1.2.17", - "reduce-function-call": "1.0.2" - }, + "license": "MIT", "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true } } }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, - "requires": { - "balanced-match": "0.4.2" - }, + "license": "MIT", "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - } + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "reflect-metadata": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", - "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=", - "dev": true - }, - "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", - "dev": true + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "node_modules/tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", "dev": true, - "requires": { - "is-equal-shallow": "0.1.3" + "license": "Apache-2.0", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" } }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "node_modules/tslint/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "node_modules/tslint/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "jsesc": "0.5.0" + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", - "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", - "dev": true, - "requires": { - "css-select": "1.2.0", - "dom-converter": "0.1.4", - "htmlparser2": "3.3.0", - "strip-ansi": "3.0.1", - "utila": "0.3.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", - "dev": true - } + "node_modules/tslint/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" } }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true + "node_modules/tslint/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "node_modules/tslint/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "requires": { - "path-parse": "1.0.5" - } + "license": "MIT" }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "node_modules/tslint/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "requires": { - "resolve-from": "3.0.0" + "license": "MIT", + "engines": { + "node": ">=0.8.0" } }, - "resolve-from": { + "node_modules/tslint/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "requires": { - "align-text": "0.1.4" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "node_modules/tslint/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, - "requires": { - "glob": "7.1.2" + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "node_modules/tslint/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "node_modules/tslint/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "aproba": "1.2.0" - } - }, - "rxjs": { - "version": "5.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz", - "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==", - "requires": { - "symbol-observable": "1.0.1" + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "node_modules/tslint/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, - "optional": true, - "requires": { - "glob": "7.1.2", - "lodash": "4.17.4", - "scss-tokenizer": "0.2.3", - "yargs": "7.1.0" + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, - "sass-loader": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.6.tgz", - "integrity": "sha512-c3/Zc+iW+qqDip6kXPYLEgsAu2lf4xz0EZDplB7EmSUMda12U1sGJPetH55B/j9eu0bTtKzKlNPWWyYC7wFNyQ==", + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, - "requires": { - "async": "2.6.0", - "clone-deep": "0.3.0", - "loader-utils": "1.1.0", - "lodash.tail": "4.1.1", - "pify": "3.0.0" - } + "license": "0BSD" }, - "saucelabs": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz", - "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=", + "node_modules/tuf-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.1.0.tgz", + "integrity": "sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==", "dev": true, - "requires": { - "https-proxy-agent": "1.0.0" + "license": "MIT", + "dependencies": { + "@tufjs/models": "3.0.1", + "debug": "^4.4.1", + "make-fetch-happen": "^14.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, - "requires": { - "ajv": "5.5.2" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "optional": true, - "requires": { - "js-base64": "2.4.0", - "source-map": "0.4.4" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "optional": true, - "requires": { - "amdefine": "1.0.1" - } - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selenium-webdriver": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz", - "integrity": "sha1-ot6l2kqX9mcuiefKcnbO+jZRR6c=", - "dev": true, - "requires": { - "adm-zip": "0.4.7", - "rimraf": "2.6.2", - "tmp": "0.0.30", - "xml2js": "0.4.19" - }, - "dependencies": { - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - } - } - }, - "selfsigned": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz", - "integrity": "sha1-v4y3uDJWxFUeMTR8YxF3jbme7FI=", + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "dev": true, - "requires": { - "node-forge": "0.6.33" + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" } }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true, + "license": "MIT" }, - "semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, - "requires": { - "semver": "5.4.1" + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" } }, - "send": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "1.1.1", - "destroy": "1.0.4", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" - }, - "dependencies": { - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - } + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" } }, - "serialize-javascript": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", - "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=", - "dev": true - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, - "requires": { - "accepts": "1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.2", - "mime-types": "2.1.17", - "parseurl": "1.3.2" - } + "license": "MIT" }, - "serve-static": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, - "requires": { - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.1" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "set-blocking": { + "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } }, - "sha.js": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", - "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "dev": true, - "requires": { - "is-extendable": "0.1.1", - "kind-of": "2.0.1", - "lazy-cache": "0.2.7", - "mixin-object": "2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", "dev": true, - "requires": { - "shebang-regex": "1.0.0" + "license": "ISC", + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, - "silent-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz", - "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=", + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, - "requires": { - "debug": "2.6.9" + "license": "MIT", + "engines": { + "node": ">= 4.0.0" } }, - "slash": { + "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, - "requires": { - "hoek": "2.16.3" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "socket.io": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", - "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, - "requires": { - "debug": "2.3.3", - "engine.io": "1.8.3", - "has-binary": "0.1.7", - "object-assign": "4.1.0", - "socket.io-adapter": "0.5.0", - "socket.io-client": "1.7.3", - "socket.io-parser": "2.3.1" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true + { + "type": "github", + "url": "https://github.com/sponsors/ai" } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "socket.io-adapter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", - "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "requires": { - "debug": "2.3.3", - "socket.io-parser": "2.3.1" - }, + "license": "BSD-2-Clause", "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "socket.io-client": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", - "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "2.3.3", - "engine.io-client": "1.8.3", - "has-binary": "0.1.7", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseuri": "0.0.5", - "socket.io-parser": "2.3.1", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } + "punycode": "^2.1.0" } }, - "socket.io-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", - "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, - "requires": { - "component-emitter": "1.1.2", - "debug": "2.2.0", - "isarray": "0.0.1", - "json3": "3.3.2" - }, + "license": "MIT", "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "sockjs": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", - "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true, - "requires": { - "faye-websocket": "0.10.0", - "uuid": "2.0.3" - }, - "dependencies": { - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - } - } + "license": "MIT" }, - "sockjs-client": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", - "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, - "requires": { - "debug": "2.6.9", - "eventsource": "0.1.6", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.2.0" - }, - "dependencies": { - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "dev": true, - "requires": { - "websocket-driver": "0.7.0" - } - } + "license": "MIT", + "engines": { + "node": ">= 0.4.0" } }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "requires": { - "is-plain-obj": "1.1.0" + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" } }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" }, - "source-map-loader": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.3.tgz", - "integrity": "sha512-MYbFX9DYxmTQFfy2v8FC1XZwpwHKYxg3SK8Wb7VPBKuhDjz8gi9re2819MsG4p49HDyiOSUKlmZ+nQBArW5CGw==", + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, - "requires": { - "async": "2.6.0", - "loader-utils": "0.2.17", - "source-map": "0.6.1" - }, + "license": "ISC", "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" } }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "requires": { - "source-map": "0.5.7" - } + "license": "MIT" }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "node_modules/validate-npm-package-name": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", + "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", "dev": true, - "requires": { - "debug": "2.6.9", - "handle-thing": "1.2.5", - "http-deceiver": "1.2.7", - "safe-buffer": "5.1.1", - "select-hose": "2.0.0", - "spdy-transport": "2.0.20" + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "spdy-transport": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", - "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, - "requires": { - "debug": "2.6.9", - "detect-node": "2.0.3", - "hpack.js": "2.1.6", - "obuf": "1.1.1", - "readable-stream": "2.3.3", - "safe-buffer": "5.1.1", - "wbuf": "1.7.2" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "node_modules/vite": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.5.tgz", + "integrity": "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "ssri": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.0.0.tgz", - "integrity": "sha512-728D4yoQcQm1ooZvSbywLkV1RjfITZXh0oWrhM/lnsx3nAHx7LsRGJWB/YyvoceAYRq98xqbstiN4JBv1/wNHg==", + "node_modules/vite/node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, - "requires": { - "safe-buffer": "5.1.1" + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - }, - "stdout-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", - "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dev": true, - "optional": true, - "requires": { - "readable-stream": "2.3.3" + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" } }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" } }, - "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "dev": true, - "requires": { - "end-of-stream": "1.4.0", - "stream-shift": "1.0.0" + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" } }, - "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" } }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } + "license": "MIT", + "optional": true }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, - "requires": { - "safe-buffer": "5.1.1" + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" } }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/webpack": { + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.2.tgz", + "integrity": "sha512-4JLXU0tD6OZNVqlwzm3HGEhAHufSiyv+skb7q0d2367VDMzrU1Q/ZeepvkcHH0rZie6uqEtTQQe0OEOOluH3Mg==", "dev": true, - "requires": { - "ansi-regex": "2.1.1" + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "node_modules/webpack-dev-middleware": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "dev": true, - "requires": { - "is-utf8": "0.2.1" + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, - "requires": { - "get-stdin": "4.0.1" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "style-loader": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.13.2.tgz", - "integrity": "sha1-dFMzhM9pjHEEx5URULSXF63C87s=", + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "requires": { - "loader-utils": "1.1.0" + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "stylus": { - "version": "0.54.5", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", - "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "node_modules/webpack-dev-server": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", + "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", "dev": true, - "requires": { - "css-parse": "1.7.0", - "debug": "2.6.9", - "glob": "7.0.6", - "mkdirp": "0.5.1", - "sax": "0.5.8", - "source-map": "0.1.43" - }, - "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "sax": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", - "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", - "dev": true + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.21.2", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } + "webpack-cli": { + "optional": true } } }, - "stylus-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.1.tgz", - "integrity": "sha1-d/SzT9Aw0lsmF7z1UT21sHMMQIk=", + "node_modules/webpack-dev-server/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "requires": { - "loader-utils": "1.1.0", - "lodash.clonedeep": "4.5.0", - "when": "3.6.4" + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" } }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "node_modules/webpack-dev-server/node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, - "requires": { - "has-flag": "2.0.0" + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "sax": "1.2.4", - "whet.extend": "0.9.9" + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" - }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", - "dev": true + "node_modules/webpack-dev-server/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "node_modules/webpack-dev-server/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, - "optional": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "node_modules/webpack-dev-server/node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "node_modules/webpack-dev-server/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" + "license": "MIT", + "dependencies": { + "ms": "2.0.0" } }, - "thunky": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", - "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", - "dev": true - }, - "time-stamp": { + "node_modules/webpack-dev-server/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "requires": { - "setimmediate": "1.0.5" - } + "license": "MIT" }, - "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "node_modules/webpack-dev-server/node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, - "requires": { - "os-tmpdir": "1.0.2" + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "toposort": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", - "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "node_modules/webpack-dev-server/node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, - "requires": { - "punycode": "1.4.1" + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "tree-kill": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", - "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", - "dev": true - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "true-case-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", - "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", - "dev": true, - "optional": true, - "requires": { - "glob": "6.0.4" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "optional": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } + "node_modules/webpack-dev-server/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "ts-node": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.0.6.tgz", - "integrity": "sha1-VRJ/95DH7r9rpowebd6UsJqqIeA=", - "dev": true, - "requires": { - "arrify": "1.0.1", - "chalk": "1.1.3", - "diff": "3.4.0", - "make-error": "1.3.2", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18", - "tsconfig": "6.0.0", - "v8flags": "2.1.1", - "yn": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "tsconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", - "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "dev": true, - "requires": { - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1" - }, + "license": "MIT", "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true } } }, - "tsickle": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.25.6.tgz", - "integrity": "sha1-tZXbFrI2chgk7u2ouyYjZbR+8zQ=", + "node_modules/webpack-dev-server/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "requires": { - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map": "0.5.7", - "source-map-support": "0.4.18" + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "tslib": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", - "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=" - }, - "tslint": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.3.2.tgz", - "integrity": "sha1-5WRZ+wlacwfxA7hAUhdPXju+9u0=", + "node_modules/webpack-dev-server/node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "colors": "1.1.2", - "diff": "3.4.0", - "glob": "7.1.2", - "optimist": "0.6.1", - "resolve": "1.5.0", - "semver": "5.4.1", - "tslib": "1.8.1", - "tsutils": "2.15.0" + "license": "MIT", + "engines": { + "node": ">= 10" } }, - "tsutils": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.15.0.tgz", - "integrity": "sha512-kKb1mSqRMwF0GHKya5/hZsI2m7Flg4ONZDeYu4e6Gx+kYAu86zsLNCHcUmNWhCRaUcKshNI272hOzuaCQDzJ2g==", + "node_modules/webpack-dev-server/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, - "requires": { - "tslib": "1.8.1" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true + "node_modules/webpack-dev-server/node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "node_modules/webpack-dev-server/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, - "requires": { - "safe-buffer": "5.1.1" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "node_modules/webpack-dev-server/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "optional": true + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } }, - "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "node_modules/webpack-dev-server/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.17" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "node_modules/webpack-dev-server/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" }, - "typescript": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz", - "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==", - "dev": true + "node_modules/webpack-dev-server/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "uglify-js": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.4.tgz", - "integrity": "sha512-hfIwuAQI5dlXP30UtdmWoYF9k+ypVqBXIdmd6ZKBiaNHHvA8ty7ZloMe3+7S5AEKVkxHbjByl4DfRHQ7QpZquw==", + "node_modules/webpack-dev-server/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, - "requires": { - "commander": "2.12.2", - "source-map": "0.6.1" + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/webpack-dev-server/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "optional": true + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } }, - "uglifyjs-webpack-plugin": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.1.5.tgz", - "integrity": "sha512-YBGc9G7dv12Vjx8vUQs54DZgAXVf04LlG6dNNiEbTZjL3PbUqiY4uPB9Kv+fUJaqRskEGva/lS7sh08yJr7jnA==", - "dev": true, - "requires": { - "cacache": "10.0.1", - "find-cache-dir": "1.0.0", - "schema-utils": "0.3.0", - "serialize-javascript": "1.4.0", - "source-map": "0.6.1", - "uglify-es": "3.2.2", - "webpack-sources": "1.1.0", - "worker-farm": "1.5.2" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-es": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.2.2.tgz", - "integrity": "sha512-l+s5VLzFwGJfS+fbqaGf/Dfwo1MF13jLOF2ekL0PytzqEqQ6cVppvHf4jquqFok+35USMpKjqkYxy6pQyUcuug==", - "dev": true, - "requires": { - "commander": "2.12.2", - "source-map": "0.6.1" - } - } + "node_modules/webpack-dev-server/node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "ultron": { + "node_modules/webpack-dev-server/node_modules/send/node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqid": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", - "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, - "requires": { - "macaddress": "0.2.8" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "node_modules/webpack-dev-server/node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, - "requires": { - "unique-slug": "2.0.0" + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "node_modules/webpack-dev-server/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "requires": { - "imurmurhash": "0.1.4" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "node_modules/webpack-dev-server/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "dev": true, + "license": "MIT", "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" } }, - "url-loader": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", - "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, - "requires": { - "loader-utils": "1.1.0", - "mime": "1.6.0", - "schema-utils": "0.3.0" + "license": "MIT", + "engines": { + "node": ">=10.13.0" } }, - "url-parse": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", - "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, - "requires": { - "querystringify": "1.0.0", - "requires-port": "1.0.0" - }, + "license": "MIT", "dependencies": { - "querystringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", - "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", - "dev": true + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true } } }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true + "node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" }, - "useragent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", - "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, - "requires": { - "lru-cache": "2.2.4", - "tmp": "0.0.31" - }, - "dependencies": { - "lru-cache": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", - "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", - "dev": true - } + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "requires": { - "inherits": "2.0.1" - }, + "license": "MIT", "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "dev": true + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, - "requires": { - "user-home": "1.1.1" + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" } }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" } }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "vendors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", - "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" } }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { - "indexof": "0.0.1" + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "void-elements": { + "node_modules/wildcard": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" }, - "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, - "requires": { - "async": "2.6.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - } + "license": "MIT" }, - "wbuf": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", - "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "requires": { - "minimalistic-assert": "1.0.0" + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "webdriver-js-extender": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", - "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { - "@types/selenium-webdriver": "2.53.43", - "selenium-webdriver": "2.53.3" - }, + "license": "MIT", "dependencies": { - "adm-zip": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", - "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=", - "dev": true - }, - "sax": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", - "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=", - "dev": true - }, - "selenium-webdriver": { - "version": "2.53.3", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", - "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=", - "dev": true, - "requires": { - "adm-zip": "0.4.4", - "rimraf": "2.6.2", - "tmp": "0.0.24", - "ws": "1.1.2", - "xml2js": "0.4.4" - } - }, - "tmp": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", - "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=", - "dev": true - }, - "xml2js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", - "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", - "dev": true, - "requires": { - "sax": "0.6.1", - "xmlbuilder": "9.0.4" - } - } + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "webpack": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", - "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", - "dev": true, - "requires": { - "acorn": "5.3.0", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.1.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - } - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - } + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "webpack-core": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", - "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "requires": { - "source-list-map": "0.1.8", - "source-map": "0.4.4" - }, + "license": "MIT", "dependencies": { - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", - "dev": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "requires": { - "memory-fs": "0.4.1", - "mime": "1.6.0", - "path-is-absolute": "1.0.1", - "range-parser": "1.2.0", - "time-stamp": "2.0.0" - } - }, - "webpack-dev-server": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.9.7.tgz", - "integrity": "sha512-Pu7uoQFgQj5RE5wmlfkpYSzihMKxulwEuO2xCsaMnAnyRSApwoVi3B8WCm9XbigyWTHaIMzYGkB90Vr6leAeTQ==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "array-includes": "3.0.3", - "bonjour": "3.5.0", - "chokidar": "1.7.0", - "compression": "1.7.1", - "connect-history-api-fallback": "1.5.0", - "debug": "3.1.0", - "del": "3.0.0", - "express": "4.16.2", - "html-entities": "1.2.1", - "http-proxy-middleware": "0.17.4", - "import-local": "0.1.1", - "internal-ip": "1.2.0", - "ip": "1.1.5", - "killable": "1.0.0", - "loglevel": "1.6.0", - "opn": "5.1.0", - "portfinder": "1.0.13", - "selfsigned": "1.10.1", - "serve-index": "1.9.1", - "sockjs": "0.3.18", - "sockjs-client": "1.1.4", - "spdy": "3.4.7", - "strip-ansi": "3.0.1", - "supports-color": "4.5.0", - "webpack-dev-middleware": "1.12.2", - "yargs": "6.6.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - } - } - } + "license": "MIT" }, - "webpack-merge": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.1.tgz", - "integrity": "sha512-geQsZ86YkXOVOjvPC5yv3JSNnL6/X3Kzh935AQ/gJNEYXEfJDQFu/sdFuktS9OW2JcH/SJec8TGfRdrpHshH7A==", + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "requires": { - "lodash": "4.17.4" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" - }, + "license": "MIT", "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "webpack-subresource-integrity": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.3.tgz", - "integrity": "sha1-wGBtQAkLBwzeQovsjfNgMhbkcus=", + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, - "requires": { - "webpack-core": "0.6.9" - } + "license": "ISC" }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "requires": { - "http-parser-js": "0.4.9", - "websocket-extensions": "0.1.3" + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true - }, - "when": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", - "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", - "dev": true - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", - "dev": true - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true + "license": "ISC" }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, - "requires": { - "string-width": "1.0.2" + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "window-size": { + "node_modules/wsl-utils": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "worker-farm": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.2.tgz", - "integrity": "sha512-XxiQ9kZN5n6mmnW+mFJ+wXjNNI/Nx4DIdaAKLX1Bn6LYBWlN/zaBhu34DQYPZ1AJobQuu67S2OfDdNSVULvXkQ==", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", "dev": true, - "requires": { - "errno": "0.1.6", - "xtend": "4.0.1" + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "license": "Apache-2.0", + "engines": { + "node": ">=12" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" }, - "ws": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", - "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "requires": { - "options": "0.0.6", - "ultron": "1.0.2" + "license": "ISC", + "engines": { + "node": ">=10" } }, - "wtf-8": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", - "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", - "dev": true - }, - "xml-char-classes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", - "dev": true + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "dev": true, - "requires": { - "sax": "1.2.4", - "xmlbuilder": "9.0.4" + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "xmlbuilder": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.4.tgz", - "integrity": "sha1-UZy0ymhtAFqEINNJbz8MruzKWA8=", - "dev": true - }, - "xmlhttprequest-ssl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "xxhashjs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.1.tgz", - "integrity": "sha1-m76b6JYUKXbfo0wGGy0GjEPTDeA=", + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "requires": { - "cuint": "0.2.2" + "license": "ISC", + "engines": { + "node": ">=12" } }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true + "node_modules/yargs/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true, - "optional": true - } + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "dev": true, - "optional": true, - "requires": { - "camelcase": "3.0.0" + "license": "MIT", + "engines": { + "node": ">=18" }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true, - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } }, - "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true - }, - "zone.js": { - "version": "0.8.19", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.19.tgz", - "integrity": "sha512-l9rofaOs6a4y1W8zt4pDmnCUCnYG377dG+5SZlXNWrTWYUuXFqcJZiOarhYiRVR0NI9sH/8ooPJiz4uprB/Mkg==" + "node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, + "node_modules/zone.js": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", + "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", + "license": "MIT" } } } diff --git a/package.json b/package.json index ee6644aa..b63b5cb6 100644 --- a/package.json +++ b/package.json @@ -1,84 +1,50 @@ { - "name": "angular-bootstrap-md-lib", - "version": "6.1.1", - "description": "Bootstrap Material Design for Angular", - "license": "MIT", - "files": [ - "dist/**/*" - ], + "name": "mdb-angular-ui-kit-free", + "version": "9.0.0", "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build", + "build:lib": "ng-packagr -p projects/mdb-angular-ui-kit/ng-package.json && npm run schematics:build", + "schematics:build": "tsc -p projects/mdb-angular-ui-kit/tsconfig.schematics.json && npm run schematics:copy-schema && npm run schematics:copy-collection", + "schematics:copy-schema": "cp projects/mdb-angular-ui-kit/schematics/ng-add/schema.json dist/mdb-angular-ui-kit/schematics/ng-add", + "schematics:copy-collection": "cp projects/mdb-angular-ui-kit/schematics/collection.json dist/mdb-angular-ui-kit/schematics/", "test": "ng test", + "test:lib": "ng test --project mdb-angular-ui-kit", "lint": "ng lint", - "e2e": "ng e2e", - "build:lib": "gulp --gulpfile gulpfile.lib.js", - "pack": "cp -r src/angular-bootstrap-md/scss src/angular-bootstrap-md/font/ src/angular-bootstrap-md/img/ dist && cd dist && npm pack && cd ..", - "copy": "cp dist/angular-bootstrap-md-6.* ./", - "compile": "npm run build:lib && npm run pack && npm run copy", - "version": "sync-json -v --property version --source package.json src/package.json" + "e2e": "ng e2e" }, + "private": true, "dependencies": { - "@angular/animations": "^6.0.0-rc.1", - "@angular/common": "^6.0.0-rc.1", - "@angular/compiler": "^6.0.0-rc.1", - "@angular/core": "^6.0.0-rc.1", - "@angular/forms": "^6.0.0-rc.1", - "@angular/http": "^6.0.0-rc.1", - "@angular/platform-browser": "^6.0.0-rc.1", - "@angular/platform-browser-dynamic": "^6.0.0-rc.1", - "@angular/router": "^6.0.0-rc.1", - "angular-bootstrap-md": "file:angular-bootstrap-md-6.1.0.tgz", - "chart.js": "^2.7.2", - "core-js": "^2.4.1", - "font-awesome": "4.7.x", - "fs-extra": "^6.0.1", - "rxjs": "^6.0.0-rc.1", - "zone.js": "^0.8.14" + "@angular/animations": "^20.2.4", + "@angular/cdk": "^20.2.2", + "@angular/common": "^20.2.4", + "@angular/compiler": "^20.2.4", + "@angular/core": "^20.2.4", + "@angular/forms": "^20.2.4", + "@angular/platform-browser": "^20.2.4", + "@angular/platform-browser-dynamic": "^20.2.4", + "@angular/router": "^20.2.4", + "@fortawesome/fontawesome-free": "^6.0.0", + "rxjs": "~7.5.0", + "tslib": "^2.3.0", + "zone.js": "~0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.5.0", - "@angular-devkit/core": "^0.5.7", - "@angular/cli": "^6.0.0-rc.1", - "@angular/compiler-cli": "^6.0.0-rc.1", - "@angular/language-service": "^6.0.0-rc.1", - "@types/jasmine": "~2.5.53", - "@types/jasminewd2": "~2.0.2", - "@types/node": "~6.0.60", - "codelyzer": "~3.0.1", - "jasmine-core": "~2.6.2", - "jasmine-spec-reporter": "~4.1.0", - "karma": "~1.7.0", - "karma-chrome-launcher": "~2.1.1", - "karma-cli": "~1.0.1", - "karma-coverage-istanbul-reporter": "^1.2.1", - "karma-jasmine": "~1.1.0", - "karma-jasmine-html-reporter": "^0.2.2", - "protractor": "~5.1.2", - "ts-node": "~3.0.4", - "tslint": "~5.3.2", - "typescript": "2.7.2 - 2.8.0", - "webpack": "^4.3.0", - "del": "^3.0.0", - "fs": "0.0.1-security", - "gulp": "^3.9.1", - "gulp-clean-css": "^3.9.2", - "gulp-htmlmin": "^4.0.0", - "gulp-if": "^2.0.2", - "gulp-replace": "^0.6.1", - "gulp-sass": "^3.1.0", - "path": "^0.12.7", - "rimraf": "^2.6.2", - "rollup": "^0.54.0", - "run-sequence": "^2.2.1", - "sorcery": "^0.10.0", - "sync-json": "^1.0.2", - "through2": "^2.0.3", - "gulp-autoprefixer": "^5.0.0" - }, - "repository": { - "type": "git", - "url": "https://github.com/mdbootstrap/Angular-Bootstrap-with-Material-Design" + "@angular-builders/jest": "^20.0.0", + "@angular-devkit/build-angular": "^20.2.2", + "@angular/cli": "^20.2.2", + "@angular/compiler-cli": "^20.2.4", + "@types/jasmine": "~5.1.4", + "@types/jest": "^29.5.12", + "@types/node": "^22.2.0", + "jasmine-core": "~5.2.0", + "jasmine-spec-reporter": "~7.0.0", + "jest": "^29.5.0", + "karma-coverage": "~2.2.0", + "ng-packagr": "^20.2.0", + "ts-node": "~10.9.2", + "tslint": "~6.1.0", + "typescript": "~5.9.2" } -} +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/CHANGELOG.md b/projects/mdb-angular-ui-kit/CHANGELOG.md new file mode 100644 index 00000000..29e567ec --- /dev/null +++ b/projects/mdb-angular-ui-kit/CHANGELOG.md @@ -0,0 +1,1037 @@ +## 9.0.0 (21.09.2025) + +This version requires Angular v20. Follow the [Angular Update Guide](https://angular.dev/update-guide) to migrate your project to Angular 20. + +### Breaking changes: + +- Updated Angular to v20, this version is required in MDB Angular v9 + +### Fixes and improvements: + +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) + - Improved blocking of months and years cells in some edge cases + - Resolved problems with errors when parsing invalid date formats +- [File upload](https://mdbootstrap.com/docs/angular/plugins/file-upload/) + - Added error handling for `maxFileQuantity` + - Improved extensions validation logic to handle problems with uploading files with extensions defined in `mimeTypes` input +- [Input fields](https://mdbootstrap.com/docs/angular/forms/input-fields/) - resolved problem with border gap updates for dynamically rendered label +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) - resolved issue where clicking the arrow icon in one Select input would not close the dropdown of another Select component + +### New features: + +- Added new SCSS and CSS variables for plugins styles +- [Autocomplete](https://mdbootstrap.com/docs/angular/forms/autocomplete/) - added new `dropdownWidth` input that allows to set custom width for the dropdown menu +- [Datatables](https://mdbootstrap.com/docs/angular/data/datatables/) - added new `defaultSortDirection` input that allows to set default sort direction for the table header + +--- + +## 8.0.0 (07.04.2025) + +This version requires Angular v19. Follow the [Angular Update Guide](https://angular.dev/update-guide) to migrate your project to Angular 19. + +### Breaking changes: + +- Updated Angular to v19, this version is required in MDB Angular v8 +- Older theming styles are no longer supported, use new [color modes](https://mdbootstrap.com/docs/angular/content-styles/theme/) instead +- Slightly increased cell width in [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) +- The `.navbar-light` class is no longer used in [Navbar](https://mdbootstrap.com/docs/angular/navigation/navbar), use [color modes](https://mdbootstrap.com/docs/angular/content-styles/theme/) instead + +### Design updates: + +Introduced a new theming system that allows setting the theme for the entire page, its parts, or selected elements using data attributes. + +Read [Colors modes](https://mdbootstrap.com/docs/angular/content-styles/theme/) page to learn more about new theming. + +### Fixes and improvements: + +- [Modal](https://mdbootstrap.com/docs/angular/components/modal/) - resolved problem with opening animation +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) - resolved problem with not hiding option groups labels when using filter +- [Popconfirm](https://mdbootstrap.com/docs/angular/components/popconfirm/) - added default offset to the component +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) - fixed date parsing bug for `yy` year format +- [Stepper](https://mdbootstrap.com/docs/angular/components/stepper/) - added 'Optional' text to the steps that use `optional` input +- [Onboarding](https://mdbootstrap.com/docs/angular/plugins/onboarding/) - added gap between the buttons and fixed border styles +- Fixed [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) and [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) toggle button padding in Firefox browser +- Removed unnecessary `BrowserAnimationsModule` imports from [Onboarding](https://mdbootstrap.com/docs/angular/plugins/onboarding/), [Ecommerce gallery](https://mdbootstrap.com/docs/angular/plugins/ecommerce-gallery/) and [Organization chart](https://mdbootstrap.com/docs/angular/plugins/organization-chart/) plugins + +### New features: + +- Added new SCSS and CSS variables for plugins styles +- [File upload](https://mdbootstrap.com/docs/angular/plugins/file-upload/) - added new `mimeTypes` input that allow to define a list of mime types for supported file types +- [Multi item carousel](https://mdbootstrap.com/docs/angular/plugins/multi-item-carousel/) - added new `(slideClick)` event +- [Color picker](https://mdbootstrap.com/docs/angular/plugins/color-picker/) - added new `color-picker-next-format-button`, `color-picker-previous-format-button` and `color-picker-copy-button` classes for the buttons + +--- + +## 7.1.0 (18.11.2024) + +### Fixes and improvements: + +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) + - Resolved problem with `close` method being called twice on component close + - Fixed dark theme styles in inline mode +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) + - Added `aria-disabled` attributes to elements that display disabled dates + - Fixed `aria-label` attribute value in the element used to display day value + - Resolved problem with adding `aria-selected` attribute to the element that display day value +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) + - Fixed disabled options styles in custom theme + - Resolved problem with opening dropdown on `space` key press + - Added `aria-label` and `aria-labelledby` attributes to the component + - Fixed value returned by `(deselect)` event +- [Autocomplete](https://mdbootstrap.com/docs/angular/forms/autocomplete/) + - Fixed `aria-expended` attribute values for opened and closed menu + - Fixed problem where component menu was opening even when input was disbled +- [Transfer](https://mdbootstrap.com/docs/angular/plugins/transfer/) + - Fixed events output for target container + - Fixed checkboxes styles +- [Range](https://mdbootstrap.com/docs/angular/forms/range/) - fixed thumb position on component init +- [Onboarding](https://mdbootstrap.com/docs/angular/plugins/onboarding/) - added fix to prevent memory leak after component destroy +- [Input mask](https://mdbootstrap.com/docs/angular/plugins/input-mask/) - fixed a problem with value formatting when pasting all content into input at once +- [Vector maps](https://mdbootstrap.com/docs/angular/plugins/vector-maps/) - fixed shadow styles in zoom buttons +- [Transfer](https://mdbootstrap.com/docs/angular/plugins/wysiwyg-editor/) - fixed dropdown menu alignment +- [Dropdown](https://mdbootstrap.com/docs/angular/component/dropdowns/) - fixed `aria-expended` attribute values for opened and closed menu +- [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) - fixed problem with focus trap when the last focused element is inside the component content + +### New features: + +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) + - Added new `showClearBtn` input + - Added new `(clear)` event that will be fired after using Clear button +- [File upload](https://mdbootstrap.com/docs/angular/plugins/file-upload/) + - Added `svg` and `webp` extensions to the list of allowed file types for default preview + - Added new `datepickerOptions` that allow to define options for the date pickers used by the plugin +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) - added new `(search)` event that will be fired after using search input +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) - added new `(viewChanged)` event that will be fired on component view change +- [Progress](https://mdbootstrap.com/docs/angular/components/progress/) - added new circular version of the component + +--- + +## 7.0.0 (16.09.2024) + +This version requires Angular v18. Follow the [Angular Update Guide](https://angular.dev/update-guide) to migrate your project to Angular 18. + +### Breaking changes: + +- Updated Angular to v18, this version is required in MDB Angular v7. +- [Checkbox](https://mdbootstrap.com/docs/angular/forms/checkbox/) - changed `margin-right` style from `4px` to `6px` in `.form-check-input` element. +- [Forms](https://mdbootstrap.com/docs/angular/forms/overview/) - added `padding-left: 0.15rem` style to `.form-check-label` element. +- [Switch](https://mdbootstrap.com/docs/angular/forms/switch/) - changed `margin-right` style from `4px` to `8px` in `.form-check-input` element. +- [Progress](https://mdbootstrap.com/docs/angular/components/progress/) - added `box-shadow: none` style to `.progress` element. +- [Input group](https://mdbootstrap.com/docs/angular/forms/input-group/) - added `flex-wrap: nowrap` style to `.input-group` element. +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) - changed SCSS variable `$datepicker-small-cell-content-width` value from `36px` to `40px`. +- [Range](https://mdbootstrap.com/docs/angular/forms/range/): + - Added `box-shadow: none` style to `.form-range ::-webkit-slider-runnable-track` element. + - Added `box-shadow: none` style to `.form-range ::-moz-range-track` element. +- [Captcha](https://mdbootstrap.com/docs/angular/plugins/captcha/): + - Changed `error` event name to `captchaError`. + - Changed `expire` event name to `captchaExpire`. + - Changed `success` event name to `captchaSuccess`. +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/): + - Redesigned clock's page HTML structure and styles. + - Arrow icons are now displayed when hour/minute buttons are hovered in inline mode. +- [Treeview](https://mdbootstrap.com/docs/angular/plugins/tree-view/): + - Redesigned entire HTML structure. + - Replaced `li` element with `mdb-treeview-item`. + - Removed the `
` wrapper element from the entire component. + - Removed the `checkboxesField` input. + - Added a public `MdbTreeviewColor` type for the color input. + - Added a new mechanism for setting the arrow icon with the `collapseIcon` property. + - Added keyboard navigation handling. + +### Fixes and improvements: + +- [Multi range](https://mdbootstrap.com/docs/angular/forms/multi-range-slider/) - resolved the issue with `TouchEvent` in Firefox. +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) - resolved the issue with unhandled `tabindex` input. +- [Onboarding](https://mdbootstrap.com/docs/angular/plugins/onboarding/) - resolved the issue with initializing onboarding with a delay after navigating to another page. +- [Input fields](https://mdbootstrap.com/docs/angular/forms/input-fields/) - resolved the issue with displaying the value after setting it programmatically in all inputs with built-in placeholders (e.g., `datetime-local` or `time`). +- [Datatable](https://mdbootstrap.com/docs/angular/data/datatables/) - resolved the issue with the `showAllEntries` input not working properly with the `entries` input. +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) - resolved the issue with `ArrowUp` and `ArrowDown` key presses not working upon opening the timepicker. +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/): + - Resolved the issue with returned form control values for empty or invalid input values. + - Resolved the issue with closing the datepicker using the input toggle. +- [Calendar](https://mdbootstrap.com/docs/angular/plugins/calendar/): + - Resolved the issue with unpreserved event IDs on edit. + - Resolved the issue with dragging in `readonly` mode. + - Resolved the issue with view selection when non-default captions are used. + - Resolved the issue with rendering the period in the correct format in Month view. + +### New features: + +- [Dropdown](https://mdbootstrap.com/docs/angular/components/dropdown/) - added `MdbDropdownPositionClass` type to the public API. +- [Modal](https://mdbootstrap.com/docs/angular/components/modal/) - added `focusElementSelector` property to the `open` method's options for specifying the element to focus on when the modal opens. +- [Calendar](https://mdbootstrap.com/docs/angular/plugins/calendar/): + - Added `addEventButtonCaption` property to the `options` input for setting a custom caption for the add event button. + - Added `MdbCalendarViews` Enum to the public API. + +--- + +## 6.1.0 (27.05.2024) + +### Fixes and improvements: + +- [Multi range](https://mdbootstrap.com/docs/angular/forms/multi-range-slider/) + - Fixed problem with thumb limiting logic when using custom step + - Fixed problem with updating thumb positions via form controls +- [Popconfirm](https://mdbootstrap.com/docs/angular/components/popconfirm/) - added focus trap +- [Autocomplete](https://mdbootstrap.com/docs/angular/forms/autocomplete/) - restored native `shift + home` and `shift + end` keys behavior (open/close dropdown) +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) - added support for opening and closing dropdown with `alt + arrow-up` and `alt + arrow-down` keys + +### New: + +- [Table pagination](https://mdbootstrap.com/docs/angular/data/datatables/) - added new `page` input that allows to set page number +- [Multi range](https://mdbootstrap.com/docs/angular/forms/multi-range-slider/) - added new `highlightRange` input that allows to highlight range +- [Parallax](https://mdbootstrap.com/docs/angular/plugins/parallax/) - added new `container` input that allows to set wrapper element for parallax effect + +--- + +## 6.0.0 (15.01.2024) + +This version requires Angular v17. Follow the [Angular Update Guide](https://update.angular.io/?l=3&v=16.0-17.0) to migrate your project to Angular 17. + +### Breaking changes: + +- Updated Angular to v17, this version is required in MDB Angular v6 +- [Calendar](https://mdbootstrap.com/docs/angular/plugins/calendar/) - changed type of `defaultView` input from `string` to `MdbCalendarView` +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) - changed type of `options` input from `any` to `MdbDatepickerOptions` +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) + - Changed type of `options` input from `Options` to `MdbTimepickerOptions` and made all parameters optional + - Changed `SelectedTime` type name to `MdbTimepickerSelectedTime` and added this type to public exports +- [Popover](https://mdbootstrap.com/docs/angular/components/popover/) - removed unused `template` input +- [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) + - Changed return type of all events from `MdbSidenavComponent` to `void` + - Removed redundant `li` element from `MdbSidenavItemComponent` template +- [Transfer](https://mdbootstrap.com/docs/angular/plugins/transfer/) + - Changed `onSearchOutput` event name to `searchOutput` + - Changed `selectOutput` event name to `selectOutput` + - Changed `onChange` event name to `listChange` + - Changed `onSearch` event name to `itemSearch` + - Changed `onSelect` event name to `itemSelect` + +### Fixes and improvements: + +- [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) - removed height animation transition +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) - blocked input clearing in disabled component +- [Input fields](https://mdbootstrap.com/docs/angular/forms/input-fields/) - resolved problem with default label position in all inputs with built-in placeholder (like `datetime-local` or `time`) +- [Lightbox](https://mdbootstrap.com/docs/angular/components/lightbox/) - resolved problem with component removal from DOM after using browser's back button +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) - resolved problem with font size in landscape view + +### New fetures: + +- [Select](https://mdbootstrap.com/docs/angular/forms/select/) - added new `inputId` and `inputFilterId` inputs that allow to declare ids for input elements + +--- + +## 5.2.0 (04.12.2023) + +### Fixes and improvements: + +- Resolved problem with components rendering when using Server Side Rendering +- Resolved problem with overlay when using `menuPositionClass` in [Datatable](https://mdbootstrap.com/docs/angular/components/dropdowns/) +- Replaced hardcoded `padding-left` value in [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) link with a value from CSS variable +- Replaced hardcoded `box-shadow`, `border-color` and `background-color` values in [Buttons](https://mdbootstrap.com/docs/angular/components/buttons/) with a values from CSS variables +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) + - Fixed the button press behavior to consider the duration of the press + - Removed the default scroll effect from the arrow keydown events in inline mode +- Fixed events types for `opened` and `closed` events in [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) +- Resolved problem with initial value in [Rating](https://mdbootstrap.com/docs/angular/components/rating) +- [Multi Range Slider](https://mdbootstrap.com/docs/angular/forms/multi-range-slider/) + - Resolved problem with thumbs position updates on `ngModel` or `formControl` value changes + - Added thumbs position constraints so that the position of a given thumb is limited by its counterpart +- Resolved problem with the `Host already has a portal attached` error in [Wysiwyg](https://mdbootstrap.com/docs/angular/plugins/wysiwyg-editor/) + +### New: + +- A new `MdbSidenavMenuDirective` directive has been added to [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) allowing to create multiple menus within one component +- A new `size` input has been added to [Select](https://mdbootstrap.com/docs/angular/orms/select/) allowing to change input size to `sm` or `lg` + +--- + +## 5.1.0 (09.10.2023) + +### Fixes and improvements: + +- [Datatable](https://mdbootstrap.com/docs/angular/data/datatables/) + - Added missing `cursor: pointer` styles to clickable rows + - Resolved problems with pagination width styles + - Resolved problems with page number calculation in pagination +- [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) + - Resolved problems with accessibility + - Removed the need to define template variables in HTML template + - Adjusted padding in slim version to correctly display link icon and arrow +- [Tabs](https://mdbootstrap.com/docs/angular/navigation/tabs/) + - Improved animation smoothness + - Added `MdbTabChange` event type to public exports +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) + - Resolved problem with `disabled` input + - Resolved problem with disabling and enabling component via Reactive Forms methods + - Removed border styles from focused buttons +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) + - Resolved problem with border radius styles + - Resolved problem with disabling and enabling component via Reactive Forms methods +- [Autocomplete](https://mdbootstrap.com/docs/angular/forms/autocomplete/) + - Removed auto highlight from first option + - Resolved problems with input and dropdown keyboard navigation when using `HOME` and `END` keys +- [Multi range](https://mdbootstrap.com/docs/angular/forms/multi-range-slider/) + - Resolved problem with component render in apps using Angular 16 + - Resolved problem with unhandled `endDrag` event +- [Onboarding](https://mdbootstrap.com/docs/angular/plugins/onboarding/) + - Resolved problem with component render in apps using Angular 16 + - Resolved problems with popover styles + - Fixed event types + - Fixed event emitted when jumping to next step +- [Treeview](/docs/angular/plugins/tree-view/) + - Improved animation smoothness + - Added correct types to public events + - Resolved problem with `accordion` option + - Resolved problem with `openOnClick` option + - Improved accessibility +- Resolved problem with styles of anchor elements used as [floating buttons](https://mdbootstrap.com/docs/angular/components/buttons/#section-floating) +- Resolved problem with adding new [Chips](https://mdbootstrap.com/docs/angular/components/chips/) on blur event +- Resolved problem with [Dropdown](https://mdbootstrap.com/docs/angular/components/dropdowns/) menu position +- Fixed focus styles in [Select](https://mdbootstrap.com/docs/angular/forms/select/) with `form-white` class +- Resolved problem with position of bottom frame [non-invasive Modal](https://mdbootstrap.com/docs/angular/components/modal/#section-non-invasive-modal) +- Fixed type of `infiniteScrollCompleted` event in [Infinite scroll](https://mdbootstrap.com/docs/angular/methods/infinite-scroll/) +- Added mechanism to handle dynamic updates in [Input mask](https://mdbootstrap.com/docs/angular/plugins/input-mask/) plugin +- Resolved problems with [Color picker](https://mdbootstrap.com/docs/angular/plugins/color-picker/) plugin styles and slider in Firefox browser +- Resolved problem with [Parallax](https://mdbootstrap.com/docs/angular/plugins/parallax/) plugin render in apps using Angular 16 +- Fixed event types and unhandled events in [Drag and drop](https://mdbootstrap.com/docs/angular/plugins/drag-and-drop/) plugin +- Resolved problem with reverting lists transformation in [WYSIWYG editor](https://mdbootstrap.com/docs/angular/plugins/wysiwyg-editor/) plugin +- Resolved problem with `changeView` method in [Calendar](https://mdbootstrap.com/docs/angular/plugins/calendar/) plugin +- Added types to public exports in [Data parser](https://mdbootstrap.com/docs/angular/plugins/data-parser/) plugin + +### New: + +- Added new [Treetable](https://mdbootstrap.com/docs/angular/plugins/treetable/) plugin +- Added mechanism that allow to add context for `ng-template` template in [Popover](https://mdbootstrap.com/docs/angular/components/popovers/) +- Added new `showAllEntries` option to [Datatable pagination](https://mdbootstrap.com/docs/angular/data/datatables/) +- Added new `filterFn` option to [Select](https://mdbootstrap.com/docs/angular/forms/select/) +- Added new directive that allow to create a custom header in [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) +- Added new `positionClass` and `menuPositionClass` options to [Dropdown](https://mdbootstrap.com/docs/angular/components/dropdowns/) +- Added new `disabled` input that allow to disable [Accordion](https://mdbootstrap.com/docs/angular/components/accordion/)Accordion items +- Added mechanism that allow to define custom icon template with `ng-template` in [Datepicker](/docs/angular/forms/datepicker/) and [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) +- Added mechanism that allow to define custom header template with `ng-template` in [Stepper](https://mdbootstrap.com/docs/angular/components/stepper/) +- Added new `$link-decoration` and `--mdb-link-decoration` variables to make it easier to customize `text-decoration` styles for anchor elements +- Added new inputs for disabling specific features in [Calendar](https://mdbootstrap.com/docs/angular/plugins/calendar/) plugin + +--- + +## 5.0.0 (26.06.2023) + +This version requires Angular v16. Follow the [Angular update guide](https://update.angular.io/?l=3&v=15.0-16.0) to migrate your project to Angular 16. + +### Dependencies: + +- Updated Angular to v16, this version is required in MDB Angular v5 +- Updated Bootstrap to [5.2.3](https://github.com/twbs/bootstrap/releases/tag/v5.2.3) version. + +### Design changes: + +- Changed arrow styles in [Select](https://mdbootstrap.com/docs/angular/forms/select/) input +- Slightly changed hover styles in [outline buttons](https://mdbootstrap.com/docs/angular/components/buttons/#section-outline) to make them more elegant and subtle + +### Fixes and improvements: + +- Fixed problems with schematics installation in MDB Angular Free version +- Fixed problem with display of [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) item when its content is translated with the `translate` pipe from the `@ngx-translate` library +- Fixed position of smaller icons in relation to the text in [Rating](https://mdbootstrap.com/docs/angular/components/rating/) + +### New: + +- Converted MDB components to CSS variables +- Added SCSS and CSS variables for `mdb-option` and `mdb-option-group` components +- Added access to the underlying component instance from ref element in [Modal](https://mdbootstrap.com/docs/angular/components/modal/), [Popconfirm](https://mdbootstrap.com/docs/angular/components/popconfirm/), [Alerts](https://mdbootstrap.com/docs/angular/components/alerts/) and [Toasts](https://mdbootstrap.com/docs/angular/components/toasts/) + +--- + +## 4.1.0 (24.01.2023) + +### Fixes and improvements: + +- Fixed default value display in [Autocomplete](https://mdbootstrap.com/docs/angular/forms/autocomplete/) when the value is an object +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) + - Fixed focus trap + - Fixed keyboard navigation in inline mode + - Fixed the problem with minTime and maxTime range +- Fixed [Ripple effect](https://mdbootstrap.com/docs/angular/methods/ripple/) on inputs styled as buttons +- Fixed background colors of [Toasts](https://mdbootstrap.com/docs/angular/components/toasts/) and [Alerts](https://mdbootstrap.com/docs/angular/components/alerts/) in MDB theme +- [Modal](https://mdbootstrap.com/docs/angular/components/modal/) + - Fixed the problem with scrollbar on bottom frame modal init + - Removed rounded corners from frame modals + - Removed unnecessary body scroll when using `scrollable` modal +- [Datatable](https://mdbootstrap.com/docs/angular/data/datatables/) + - Removed ability to focus disabled buttons in pagination + - Fixed the problem with case-sensitive sorting +- Fixed the problem with hiding buttons in the [Wysiwyg](https://mdbootstrap.com/docs/angular/plugins/wysiwyg-editor/) toolbar +- Fixed problem with event types in [Select](https://mdbootstrap.com/docs/angular/forms/select/) +- Fixed problem with `Rxjs operators` import paths in all the components and plugins + +### New: + +- Added new [Data Parser](https://mdbootstrap.com/docs/angular/plugins/data-parser/) plugin +- Added new [Organization Chart](https://mdbootstrap.com/docs/angular/plugins/organization-chart/) plugin +- Added new [Captcha](https://mdbootstrap.com/docs/angular/plugins/captcha/) plugin +- Added new [Chips](https://mdbootstrap.com/docs/angular/components/chips/) component +- Added new `[collapsible]` input to [Scrollspy](https://mdbootstrap.com/docs/angular/navigation/scrollspy/) +- Added new `[disableWindowScroll]` input to the [Sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) +- Added new [non-invasive Modal](https://mdbootstrap.com/docs/angular/components/modal/#section-non-invasive-modal) +- [Datatable](https://mdbootstrap.com/docs/angular/data/datatables/) + - Added new `[forceSort]` input that allow to disable sort reset on third click + - Added new `[disableSort]` input that allow to disable a specific sort header + - Added new `[disabled]` input to pagination component +- [Datepicker](https://mdbootstrap.com/docs/angular/forms/datepicker/) +- Added new `[removeOkBtn]`, `[removeCancelBtn]` and `[removeClearBtn]` inputs that allow to remove specific buttons from the component footer +- Addew new `[confirmDateOnSelect]` input that allow to select date without a confirmation by click on `Ok` button + +--- + +## 4.0.0 (09.01.2023) + +### Design updates: + +Our basic color palette has been updated. We toned down our colors to be less flashy and more elegant and subtle. This affects virtually all of our components, so be aware of this before upgrading your project to v4.0.0. + +Read [colors docs](https://mdbootstrap.com/docs/angular/content-styles/colors/) to learn more about new palette. + +### Breaking changes: + +- Added support for Angular 15, this Angular version is now required, +- Improved [buttons](https://mdbootstrap.com/docs/angular/components/buttons/) +- Improved existing [accordion](https://mdbootstrap.com/docs/angular/components/accordion/) and added new examples +- Improved [stepper](https://mdbootstrap.com/docs/angular/components/stepper/) design +- Improved [badges](https://mdbootstrap.com/docs/angular/components/badges/) design and added new examples +- Improved [popovers](https://mdbootstrap.com/docs/angular/components/popovers/) and [popconfirm](https://mdbootstrap.com/docs/angular/components/popconfirm/) design +- Removed default configuration of `chartjs-plugin-datalabels` from [charts](https://mdbootstrap.com/docs/angular/data/charts/), all plugins must be now registered before use + +### Fixes and improvements: + +- Resolved problem with [scrollbar](https://mdbootstrap.com/docs/angular/methods/scrollbar/) initialization on element with a `mdbScrollbar` directive +- Removed unnecessary border animation on initialization of `mdb-form-control` component +- Resolved problem with global registration of controllers and plugins in [charts](https://mdbootstrap.com/docs/angular/data/charts/) +- Improved types in `mdbChart` directive inputs +- Added some fixes to the [transfer plugin](https://mdbootstrap.com/docs/angular/plugins/transfer/) + - Improved 'select all' option implementation + - Resolved problems with value updates in search bar input + - Resolved problems with component view updates when using pagination +- Improved theme styles in the following components: + - List group + - Pagination + - Datepicker + +### New: + +- Addew new [color picker plugin](https://mdbootstrap.com/docs/angular/plugins/color-picker/) plugin +- Addew new [multi item carousel plugin](https://mdbootstrap.com/docs/angular/plugins/multi-item-carousel/) +- Addew new [ecommerce gallery plugin](https://mdbootstrap.com/docs/angular/plugins/ecommerce-gallery/) +- Addew new `[borderless]` input to [accordion](https://mdbootstrap.com/docs/angular/components/accordion/) +- Added new `[withPush]` input to [dropdown](https://mdbootstrap.com/docs/angular/components/dropdown/) +- Added new `[plugins]` input to [charts](https://mdbootstrap.com/docs/angular/data/charts/) +- Added public access to the chart instance in `mdbChart` directive +- Added new `[ofText]` input to [datatables](https://mdbootstrap.com/docs/angular/data/datatables/) +- Added new `[titleSource]` and `[titleTarget]` inputs to [transfer plugin](https://mdbootstrap.com/docs/angular/plugins/transfer/) + +--- + +## 3.0.1 (05.12.2022) + +### Fixes and improvements: + +- [Timepicker](https://mdbootstrap.com/docs/angular/forms/timepicker/) + - Removed border styles displayed on focused elements + - Resolved problems with keyboard navigation +- It will be now possible to jump to any step in [linear stepper](https://mdbootstrap.com/docs/angular/components/stepper/#section-linear-stepper-example/), as long as all previous steps are completed +- Resolved problems with `acceptedExtensions` in [file upload plugin](https://mdbootstrap.com/docs/angular/plugins/file-upload/) +- Select all option will now select/deselect only filtered options when used inside a [select component with filter](https://mdbootstrap.com/docs/angular/forms/select/#section-search/) +- Events `itemShown` and `itemHidden` in [accordion](https://mdbootstrap.com/docs/angular/components/accordion/) will be now correctly emitted after animation end +- Resolved problem with close animation in [popconfirm](https://mdbootstrap.com/docs/angular/components/popconfirm/) +- Resolved problem with value returned to [autocomplete](https://mdbootstrap.com/docs/angular/forms/autocomplete/) form control on option selection +- Resolved problem with wrong page value returned by `(paginationChange)` event in [datatable](https://mdbootstrap.com/docs/angular/data/datatables/) +- Increased backdrop z-index in [onboarding plugin](https://mdbootstrap.com/docs/angular/plugins/onboarding/) +- Resolved problem with `autohide` option in [toast](https://mdbootstrap.com/docs/angular/components/toasts/), notification will be removed only if it is not hovered +- Added default padding to the content container in [WYSIWYG editor plugin](https://mdbootstrap.com/docs/angular/plugins/wysiwyg-editor/) +- Resolved problem with Angular dependencies versions in schematics installation + +### New: + +- Addew new [color picker plugin](https://mdbootstrap.com/docs/angular/plugins/color-picker/) +- Addew new [scroll status plugin](https://mdbootstrap.com/docs/angular/plugins/scroll-status/) + +--- + +## 3.0.0 (10.10.2022) + +This version requires Angular v14 and Node 14.15.0 (or later). Follow the [Angular update guide](https://update.angular.io/?l=3&v=13.0-14.0) to migrate your project to Angular 14: + +### Breaking changes: + +- Added support for Angular 14, this Angular version is now required, +- Removed `~` from styles imports, this syntax is now deprecated +- Updated [calendar](https://mdbootstrap.com/docs/angular/plugins/calendar/) plugin: + - redesigned toolbar, events, views and modals + - replaced view toggle buttons with select + - created an `Add event` button + - added [blur](https://mdbootstrap.com/docs/angular/plugins/calendar/#section-blur/) option to style past events + - improved long events styling + - improved responsiveness +- Design changes: + - Changed shadows for components such as [card](https://mdbootstrap.com/docs/angular/components/cards/), [popover](https://mdbootstrap.com/docs/angular/components/popovers/), [toast](https://mdbootstrap.com/docs/angular/components/toasts/), [modal](https://mdbootstrap.com/docs/angular/components/modal/), [image hoverable](https://mdbootstrap.com/docs/angular/content-styles/images/), [dropdown menu](https://mdbootstrap.com/docs/angular/components/dropdowns/), [popconfirm](https://mdbootstrap.com/docs/angular/components/popconfirm/) + - Changed styling of border for [card](https://mdbootstrap.com/docs/angular/components/cards/), [modal](https://mdbootstrap.com/docs/angular/components/modal/), header and footer + - Changed [table](https://mdbootstrap.com/docs/angular/data/tables/) font weight and text color + - Changed [checkbox](https://mdbootstrap.com/docs/angular/forms/checkbox/) and [radio](https://mdbootstrap.com/docs/angular/forms/radio/) border color + - Changed [switch](https://mdbootstrap.com/docs/angular/forms/switch/) background color + - Changed [checkbox](https://mdbootstrap.com/docs/angular/forms/checkbox/) border radius size + - Changed [list group](https://mdbootstrap.com/docs/angular/components/list-group/), [pagination](https://mdbootstrap.com/docs/angular/navigation/pagination/) and [dropdown](https://mdbootstrap.com/docs/angular/components/dropdowns/) text color as it is in the body + - Changed [toast](https://mdbootstrap.com/docs/angular/components/toasts/) color palette + - Changed [datatables](https://mdbootstrap.com/docs/angular/data/datatables/) striped and hover background color as it is in the usual table + - Changed [select](https://mdbootstrap.com/docs/angular/forms/select/) states background colors + - Changed [sidenav](https://mdbootstrap.com/docs/angular/navigation/sidenav/) icons colors and width of the slim version + - Added new [toast](https://mdbootstrap.com/docs/angular/components/toasts/) color classes that replaced background color classes. Old: `toast bg-primary`. New: `toast toast-primary` + +### Fixes and improvements: + +- [Lightbox](https://mdbootstrap.com/docs/angular/components/lightbox/) + - Resolved problems with zoom + - Resolved problems with swipe on mobile devices + - Resolved problem with display of smaller images + - Fixed image position in fullscreen mode + - Disabled elements will no longer be displayed inside the component modal +- Fixed problems with `rebuild` method in [charts](https://mdbootstrap.com/docs/angular/data/charts/) +- Replaced hardcoded color values with SCSS variables in [autocomplete](https://mdbootstrap.com/docs/angular/forms/autocomplete/) and [select](https://mdbootstrap.com/docs/angular/forms/select/) +- Resolved problem with [carousel](https://mdbootstrap.com/docs/angular/components/carousel/) animations inside a component with OnPush change detection strategy +- Position of dropdown menus in all components will be now correctly updated on scroll event +- Resolved problem with fade animation in [tabs](https://mdbootstrap.com/docs/angular/components/tabs/) +- Label values in [select](https://mdbootstrap.com/docs/angular/forms/select/) will be now dynamically updated on option label change +- All event listeners in the [WYSIWYG](https://mdbootstrap.com/docs/angular/plugins/wysiwyg-editor/) plugin will be now correctly removed when component is destroyed +- Resolved problem with [input](https://mdbootstrap.com/docs/angular/forms/input-fields/) label position when browser autofill is used + +### New: + +- Addew new [countdown plugin](https://mdbootstrap.com/docs/angular/plugins/countdown/) +- Addew new [input mask plugin](https://mdbootstrap.com/docs/angular/plugins/input-mask/) +- Addew new [parallax plugin](https://mdbootstrap.com/docs/angular/plugins/parallax/) +- Addew new [multi range component](https://mdbootstrap.com/docs/angular/components/multi-range-slider/) +- Added new `[fade]` input that allow to toggle fade animations in [tabs](https://mdbootstrap.com/docs/angular/components/tabs/) + +### Design updates: + +- Updated icon colors of basic light navbar and footer with secondary color +- Added new horizontal dividers classes `.hr` and `.hr-blurry` +- Updated styles of vertical divider class `.vr` and add new class `.vr-blurry` +- Added new sidenav with menu categories and class `.sidenav-sm` +- Added new `object-fit` and `object-position` utilities + +### Removed: + +- Deprecated button close classes. Old: `.close`. New: `.btn-close` and `.btn-close-white` +- Deprecated embed classes. Old: `.embed`. New: `.ratio` +- Deprecated flag classes. Check [flags](https://mdbootstrap.com/docs/angular/content-styles/flags/) docs +- Deprecated utils + +### Deprecated: + +- `.divider-horizontal` and `.divider-horizontal-blurry` +- `.divider-vertical` and `.divider-vertical-blurry` + +--- + +## 2.3.0 (27.06.2022) + +### Fixes and improvements + +- [Sidenav](https://mdbootstrap.com/docs/b5/angular/navigation/sidenav/) + - Resolved problems with arrow position updates in slim mode and accordion mode + - Resolved problem with initialization of component with `[right]="true"` and `[hidden]="false"` options + - Fixed problem with long content display in component with `[right]="true"` option +- Fixed problems with long label positioning in [checkbox](https://mdbootstrap.com/docs/b5/angular/forms/checkbox/), [switch](https://mdbootstrap.com/docs/b5/angular/forms/switch/) and [radio](https://mdbootstrap.com/docs/b5/angular/forms/radio/) +- Resolved problem with multiple `paginationChange` events emitted on [datatable](https://mdbootstrap.com/docs/b5/angular/data/datatables/) initialization +- Resolved problems with [pagination](https://mdbootstrap.com/docs/b5/angular/navigation/pagination/) and [accordion](https://mdbootstrap.com/docs/b5/angular/components/accordion/) styles when using [theme](https://mdbootstrap.com/docs/b5/angular/content-styles/theme/) +- Fixed problem with max file quantity in [file upload](https://mdbootstrap.com/docs/b5/angular/plugins/file-upload/) plugin with `multiple` mode +- Resolved problem with first option highlight in [select](https://mdbootstrap.com/docs/b5/angular/forms/select/) with a `[highlightFirst]="false"` option +- Added `type="button"` to the 'insert horizontal line' button in [WYSIWYG](https://mdbootstrap.com/docs/b5/angular/plugins/wysiwyg-editor/) to resolve problem with form submit +- Zero-length [tooltip](https://mdbootstrap.com/docs/b5/angular/components/tooltips/) and [popover](https://mdbootstrap.com/docs/b5/angular/components/popovers/) will no longer be displayed +- Fixed problem with multiple `(selected)` events emitted after click on [autocomplete](https://mdbootstrap.com/docs/b5/angular/forms/autocomplete/) option + +### New + +- Addew new [onboarding plugin](https://mdbootstrap.com/docs/b5/angular/plugins/onboarding/) +- [Stepper](https://mdbootstrap.com/docs/b5/angular/components/stepper/) + - Added possibility to block step navigation on step header click + - Added possibility to edit buttons and header text in mobile mode +- Added new `--mdb-bg-opacity` CSS variable +- Added optional auto select on tab-out in [select](https://mdbootstrap.com/docs/b5/angular/forms/select/) and [autocomplete](https://mdbootstrap.com/docs/b5/angular/forms/autocomplete/) +- Added list group new variant with `.list-group-light` class +- Added `.table-group-divider` and `.table-divider-color` classes to emphasize the separation of thead from tbody +- Added new `.divider-horizontal`, `.divider-vertical`, `.divider-horizontal-blurry` and `.divider-vertical-blurry` classes + +--- + +## 2.2.0 (16.05.2022) + +### Fixes and improvements: + +- Datepicker - resolved problem with returned month value when `m` format is used, +- Treeview - resolved problem with `(selected)` event emit when selecting checkbox, +- Select - resolved problem with keyboard navigation and option highlight after filter input is used. +- Charts - resolved problem with chart options being overriden by options defined for other charts, +- Range - resolved problem with thumb position update after change in `ngModel` or `formControl` + +### New: + +- [Added filter plugin](https://mdbootstrap.com/docs/b5/angular/plugins/filters/) +- Dropdown - added keyboard navigation + +--- + +## 2.1.0 (11.04.2022) + +### Fixes and improvements: + +- Datepicker - resolved problem with validation of date typed into input, +- Sidenav - removed unnecessary transition animation on initialization in slim mode, +- File upload plugin - fixed typo in main error message, +- Carousel/Lightbox - updated icons styles for Font Awesome v6. + +### New: + +- [Cookies management](https://mdbootstrap.com/docs/b5/angular/plugins/cookies-management/) +- [Storage management](https://mdbootstrap.com/docs/b5/angular/plugins/storage-management/) +- [Mention](https://mdbootstrap.com/docs/b5/angular/plugins/mention/) +- [Transfer](https://mdbootstrap.com/docs/b5/angular/plugins/transfer/) + +--- + +## 2.0.0 (28.02.2022) + +### Breaking changes: + +- Added support for Angular 13, this Angular version is now required, +- Sidenav - removed support for automatic item expansion based on an active link ([in our documentation](https://mdbootstrap.com/docs/b5/angular/navigation/sidenav/) you can find information on how to achieve this effect using methods provided by Angular Router). + +### Dependencies: + +- Updated Font Awesome to v6.0.0 + +### Fixes and improvements: + +- Toasts/Alerts - resolved problem with positioning when stacking and position bottom options are used, +- Select/Datepicker - resolved problems with input, label and icons styles when `form-white` class is used on `mdb-form-control` component, +- Select - resolved problem with selection when multiple options have the same label (in some cases component incorrectly displayed option value instead of option label in input), +- Datatable pagination - component will now display correct information when data source is empty. + +### New features: + +- Tabs - added new `[navColumnClass]` and `[contentColumnClass]` inputs that allow to customize width of the navigation and content sections in vertical mode. + +--- + +## 1.6.1 (24.01.2022) + +### Optimization: + +- Documentation migration from Wordpress to Hugo, +- Updated code in snippets in documentation to work properly with tsconfig strict settings. + +### Fixes and improvements: + +- Input - resolved problem with label position in input with type="date", +- Datepicker/Timepicker - improved backdrop animation (removed unnecessary delay), +- Datepicker - resolved problem with navigation using previous/next arrows when min and max date is specified, +- Sidenav - animation of the collapsed item in slim mode will be now in sync with animation of the menu (previously there was unnecessary delay) +- Select - list of filtered options will be now correctly reset after the dropdown menu is closed, +- Treeview plugin - click on checkbox will no longer change collapsed state of the node, +- Treeview plugin - checked state of the checkox in parent node will be now in sync with the checkboxes in child nodes. + +--- + +## 1.6.0 (27.12.2021) + +### Dependencies: + +- Updated Bootstrap to 5.1.3 version. + +### Fixes and improvements: + +- Charts - resolved problem with `chartjs-plugin-datalabels` configuration, +- Carousel - component should now work correctly inside components with `OnPush` change detection strategy, +- Table - updated `dataSource` type to resolve problem with asynchronous data and async pipe, +- File upload plugin - resolved problem with extensions handled by the `acceptedExtensions` input, +- Popconfirm - target element will be now optional in modal display mode, +- Sidenav - resolved problem with `child.querySelector is not a function` error when using `ngFor` directive to render sidenav items, +- Popover - `mdbPopover` input will now correctly accept value with `TemplateRef` type. + +### New: + +- Dropdown - added new `closeOnOutsideClick`, `closeOnItemClick`, `closeOnEsc` inputs that allow to configure menu closing actions, +- File upload plugin - added a new `reset` method that allow to reset component state to default settings. + +--- + +## 1.5.1 (22.11.2021) + +### Fixes and improvements + +- Toast/Alert - resolved problem with stacking and close animation, +- Modal - resolved problem with closing when mouseup event is detected outside the component, +- Sidenav - setting `hidden` input to `false` will no longer trigger component animation, +- Sidenav - resolved problem with arrow rotation update when `[collapsed]="false"` is used, +- Sidenav - removed focus trap in side and push modes, +- Sidenav - default position will be now correctly set to `fixed`, +- Input - resolved problem with border top gap recalculation when used inside a dynamically loaded component (such as tabs), +- Overlay - resolved problem with z-index in components using overlay (e.g. modal, popconfirm, tooltip, components with dropdown menus). The components will be correctly displayed above the elements with sticky/fixed styles, +- Charts - fixed default options and resolved problem with custom options merge. + +### Vector maps 1.1.0: + +- resolved problem with automatic updates of colors defined in `colorMap`, +- resolved problem with tooltip display when `[hover]="false"` is used, +- added possibility to display custom tooltips. + +--- + +## 1.5.0 (02.11.2021) + +### New + +- [File upload](https://mdbootstrap.com/docs/b5/angular/plugins/file-upload) +- [Treeview](https://mdbootstrap.com/docs/b5/angular/plugins/tree-view) + +--- + +## 1.4.0 (18.10.2021) + +### New + +- [Drag and drop](https://mdbootstrap.com/docs/b5/angular/plugins/drag-and-drop) +- [Vector maps](https://mdbootstrap.com/docs/b5/angular/plugins/vector-maps) + +--- + +## 1.3.0 (04.10.2021) + +### New + +- [Wysiwyg](https://mdbootstrap.com/docs/b5/angular/plugins/wysiwyg-editor) + +### Fixes and improvements: + +- Popover/Tooltip - resolved problem with closing component when quickly moving mouse over trigger element + +--- + +## 1.2.0 (20.09.2021) + +### New + +- [Calendar](https://mdbootstrap.com/docs/b5/angular/plugins/calendar) +- [Table Editor](https://mdbootstrap.com/docs/b5/angular/plugins/table-editor) + +--- + +## 1.1.0 (06.09.2021) + +### Fixes and improvements: + +- Table pagination - resolved problem with disabled state of next button, +- Input - resolved problem with disabled state updates using Angular form control methods, +- Table - resolved problem with default filter function, +- Datepicker - resolved problem with disabled state of toggle button, +- Timepicker - resolved problem with setting default value in component with 24h format, +- Sidenav - resolved problem with `Cannot read property destroy of undefined` error, +- Select - resolved problem with disabled state of checkboxes in options, +- Select - resolved problem with closing modal on clear button click, +- Dropdown - menu will be now closed correctly on item click. + +### New components: + +- [Theming](https://mdbootstrap.com/docs/b5/angular/content-styles/theme) + +### New features: + +- Table pagination - added new `rowsPerPageText` input that allow to change default 'Rows per page' text + +--- + +## 1.0.0 (09.08.2021) + +In this version we introduced some breaking changes, please check `Breaking changes` section and update your application accordingly. + +### Breaking changes: + +- Inputs - removed `margin-bottom` styles from inputs with validation classes. + +### Fixes and improvements: + +- Select - dropdown will be correctly removed on component destroy, +- Select - resolved problem with select-all option state on component initialization, +- Select - resolved problem with selection of options with false values, +- Dropdown - resolved problem with opening component on icon click, +- Toasts/Alerts - resolved problem with z-index, +- Popconfirm - resolved problem with `onClose` and `onConfirm` events, +- Loading management - backdrop will be correctly removed on component destroy when fullscreen option is used, +- Timepicker - resolved problem with setting default value using Angular form controls, +- Datepicker - previous/next button disabled state will be now correctly updated on component initialization, +- Datepicker/Timepicker - click on toggle button will no longer submit form, +- Datepicker/Timepicker - resolved problems with `valueChanges` event and validation status updates, +- Datatables - resolved problem with scroll position when component is rendered inside a tab. + +### New components: + +- [Accordion](https://mdbootstrap.com/docs/b5/angular/components/accordion/) +- [Charts advanced](https://mdbootstrap.com/docs/b5/angular/data/charts-advanced/) +- [Lightbox](https://mdbootstrap.com/docs/b5/angular/components/lightbox/) +- [Smooth scroll](https://mdbootstrap.com/docs/b5/angular/methods/smooth-scroll/) + +--- + +## 1.0.0-beta8 (12.07.2021) + +In this version we introduced some breaking changes, please check `Breaking changes` section and update your application accordingly. + +### Breaking changes: + +- Popover - `[template]` input will now accept value of type `TemplateRef` and can be used to display `ng-template` content. + +### Fixes and improvements: + +- Toast - component will no longer throw error after reopening, +- Toast - stacked components will now slide up automatically, +- Sidenav - resolved problem with auto expand when route has route parameters, +- Dropdown - opened menu will be now correctly destroyed on route change, +- Table pagination - resolved problem with data automatic updates after change in `[entryOptions]` input. + +### New components: + +- [Popconfirm](https://mdbootstrap.com/docs/b5/angular/components/popconfirm/) +- [Lazy loading](https://mdbootstrap.com/docs/b5/angular/methods/lazy-loading/) +- [Loading management](https://mdbootstrap.com/docs/b5/angular/methods/loading-management/) + +### New features: + +- Popover - `[template]` input will now accept value of type `TemplateRef` and can be used to display `ng-template` content. + +--- + +## 1.0.0-beta7 (28.06.2021) + +In this version we introduced some breaking changes, please check `Breaking changes` section and update your application accordingly. + +### Breaking changes: + +- Changed `mdb-select-option` selector to `mdb-option`, +- Removed `select-` prefix from option and option group class names, +- Moved option and option group styles to individual file. + +### Fixes and improvements: + +- Sidenav - resolved problem with arrow icons in collapsed items, +- Sidenav - resolved problem with z-index, +- Select - resolved problem with dropdown toggle on arrow icon click, +- Input - resolved problem with label position when setting value dynamically using Angular form controls. + +### New components: + +- [Autcomplete](https://mdbootstrap.com/docs/b5/angular/forms/autocomplete/) +- [Infinite scroll](https://mdbootstrap.com/docs/b5/angular/methods/infinite-scroll/) +- [Touch](https://mdbootstrap.com/docs/b5/angular/methods/touch/) + +### New features: + +- Select - added new `[filterPlaceholder]` input that allow to change filter input placeholder. + +--- + +## 1.0.0-beta6 (14.06.2021) + +In this version we introduced some breaking changes, please check `Breaking changes` section and update your application accordingly. The list of all individual modules and entry points can be found here: + +[MDB Angular UI Kit Free Modules And Imports](https://mdbootstrap.com/docs/b5/angular/getting-started/modules-and-imports/) + +[MDB Angular UI Kit Pro Essential Modules And Imports](https://mdbootstrap.com/docs/b5/angular/pro/modules-and-imports/) + +### Breaking changes: + +- Updated Angular to v12 (this version is now required), +- Components, modules and types can no longer be imported from `mdb-angular-ui-kit` entry point. Use the newly added secondary entry points, such as `mdb-angular-ui-kit/checkbox` to import individual elements, +- Removed main `MdbModule`, import individual modules from its entry points, for example: `import { MdbCheckboxModule } from 'mdb-angular-ui-kit/checkbox'`, +- Renamed `MdbTimePickerComponent` to `MdbTimepickerComponent`, +- Renamed `MdbTimePickerDirective` to `MdbTimepickerDirective`, +- Renamed `MdbTimePickerModule` to `MdbTimepickerModule`, +- Updated Bootstrap styles to the latest stable version. + +### Components redesign: + +- Redesigned shadows for components: Cards, Dropdowns, Modal, Popover, Toasts, Buttons, Button Group, Navbar, Pagination, Pills, Sidenav, +- Redesigned padding for components: Alerts, Cards, List Group, +- Redesigned border radius to 0.5rem for components: Alerts, Cards, Dropdowns, Modal, List group, Popover, Toasts, Dateipcker, Timepicker. + +### Fixes and improvements: + +- Sidenav - resolved problem with height of the element with `.sidenav-menu` class, +- Range - resolved problem with a hardcoded `Example label` text, +- Datepicker - `dateChanged` event will be now correctly emited on date change, +- Datepicker - resolved problem with components updates on Angular form control changes, +- File input - updated styles to Material Design styles, +- Pills - fixed width of pills when they're filled or justified, +- Checkbox/Switch/Radio - fix margin styles and positioning. + +### New components: + +- [Stepper](https://mdbootstrap.com/docs/b5/angular/components/stepper/) +- [Sticky](https://mdbootstrap.com/docs/b5/angular/components/sticky/) + +### New features: + +- Navbar - added a new `.navbar-nav-scroll` class to enable vertical scrolling when a collapsed navbar is opened, +- Navbar - re-added `flex-grow` to the `.navbar-collapse` to restore the flexbox behaviors from v4 and prevent some content from being inadvertently squished, +- List group - added a new `.list-group-numbered` variation to list groups that uses pseudo-elements for numbering list group items, +- Shadows - added a new styles design: shadows soft, shadows standard, shadows strong, +- Added color-scheme mixin. + +--- + +## 1.0.0-beta5 (31.05.2021) + +### New components: + +- [Datatables](https://mdbootstrap.com/docs/b5/angular/data/datatables/) +- [Rating](https://mdbootstrap.com/docs/b5/angular/components/rating/) + +--- + +## 1.0.0-beta4 (04.05.2021) + +### New components: + +- [Charts](https://mdbootstrap.com/docs/b5/angular/data/charts/) + +### Bug fixes: + +- Animations - resolved problem with parameters in HTML template, +- Sidenav - resolved problems with `mode` and `hidden` inputs, +- Sidenav - resolved problem with `show` method. + +--- + +## 1.0.0-beta3 (19.04.2021) + +### New components: + +- [Alerts](https://mdbootstrap.com/docs/b5/angular/components/alerts/) +- [Carousel](https://mdbootstrap.com/docs/b5/angular/components/carousel) +- [Toasts](https://mdbootstrap.com/docs/b5/angular/components/toasts) + +### Bug fixes: + +- Datepicker - resolved problem with keyboard navigation when using `DownArrow` key, +- Datepicker - resolved problem with selecting dates using `Enter/Space` keys in component with date filter, +- Datepicker - added correct aria-labels to the previous/next buttons in the days view. + +--- + +## 1.0.0-beta2 (06.04.2021) + +### New components: + +- [Datepicker](https://mdbootstrap.com/docs/b5/angular/forms/datepicker/) +- [Timepicker](https://mdbootstrap.com/docs/b5/angular/forms/timepicker) + +--- + +## 1.0.0-beta1 (22.03.2021) + +### New components: + +- [Range](https://mdbootstrap.com/docs/b5/angular/forms/range/) +- [File](https://mdbootstrap.com/docs/b5/angular/forms/file) +- [Switch](https://mdbootstrap.com/docs/b5/angular/forms/switch/) +- [Input group](https://mdbootstrap.com/docs/b5/angular/forms-input-group/) +- [Pills](https://mdbootstrap.com/docs/b5/angular/navigation/pills/) +- [Tabs](https://mdbootstrap.com/docs/b5/angular/navigation/tabs/) + +### Bug fixes: + +- Scrollspy - added `cursor: pointer` styles to scrollspy links, +- Sidenav - resolved problem with errors when `RouterModule` is not imported, +- Sidenav - component will be correctly updated on inputs changes, +- Sidenav - resolved problem with scroll position, +- Sidenav - added components and module exports to main library index. + +### New features: + +- Animations - added new animations: `slideLeft`, `slideRight`, `slideUp`, `slideDown`, +- Sidenav - added focus trap, +- Sidenav - escape button will now close the component. + +--- + +## 1.0.0-alpha4 (08.03.2021) + +### New components: + +- [Animations](https://mdbootstrap.com/docs/b5/angular/content-styles/animations/) +- [Ripple](https://mdbootstrap.com/docs/b5/angular/methods/ripple/) +- [Sidenav](https://mdbootstrap.com/docs/b5/angular/navigation/sidenav/) +- [Scrollspy](https://mdbootstrap.com/docs/b5/angular/navigation/scrollbar/) +- [Validation](https://mdbootstrap.com/docs/b5/angular/forms/validation/) + +### Bug fixes: + +- Select - `x options selected` text will be displayed correctly when more than 5 options have been selected, +- Select - fixed clear button focusing issue. + +### New features: + +- Select - added new `displayedLabels` input that allows to change maximum number of comma-separated options labels displayed in the multiselect input, +- Select - added new `optionsSelectedLabel` input that allows to customize x options selected text, +- Select - added new `filterDebounce` input that allows to add delay to the options list updates when using filter input + +--- + +## 1.0.0-alpha3 (22.02.2021) + +### New components: + +- [Dropdown](https://mdbootstrap.com/docs/b5/angular/components/dropdowns/) +- [Modal](https://mdbootstrap.com/docs/b5/angular/components/modal/) +- [Select](https://mdbootstrap.com/docs/b5/angular/forms/select/) +- [Scrollbar](https://mdbootstrap.com/docs/b5/angular/methods/scrollbar/) + +--- + +## 1.0.0-alpha2 (25.01.2021) + +### New components: + +- [Popover](https://mdbootstrap.com/docs/b5/angular/components/popovers/) +- [Tooltip](https://mdbootstrap.com/docs/b5/angular/components/tooltips/) +- [Checkbox](https://mdbootstrap.com/docs/b5/angular/forms/checkbox/) +- [Input](https://mdbootstrap.com/docs/b5/angular/forms/input-fields/) +- [Radio](https://mdbootstrap.com/docs/b5/angular/forms/radio/) + +--- + +## 1.0.0-alpha1 (11.01.2021) + +The initial release of MDB 5 Angular Alpha 1. + +### New components: + +- [Badges](https://mdbootstrap.com/docs/b5/angular/components/badges/) +- [Buttons](https://mdbootstrap.com/docs/b5/angular/components/buttons/) +- [Button Group](https://mdbootstrap.com/docs/b5/angular/components/button-group/) +- [Cards](https://mdbootstrap.com/docs/b5/angular/components/cards/) +- [Collapse](https://mdbootstrap.com/docs/b5/angular/components/collapse/) +- [List Group](https://mdbootstrap.com/docs/b5/angular/components/list-group/) +- [Progress](https://mdbootstrap.com/docs/b5/angular/components/progress/) +- [Spinners](https://mdbootstrap.com/docs/b5/angular/components/spinners/) +- [Tables](https://mdbootstrap.com/docs/b5/angular/data/tables/) +- [Breadcrumb](https://mdbootstrap.com/docs/b5/angular/navigation/breadcrumb/) +- [Footer](https://mdbootstrap.com/docs/b5/angular/navigation/footer/) +- [Headers](https://mdbootstrap.com/docs/b5/angular/navigation/headers/) +- [Navbar](https://mdbootstrap.com/docs/b5/angular/navigation/navbar/) +- [Pagination](https://mdbootstrap.com/docs/b5/angular/navigation/pagination/) + +### New sections: + +- Layout +- Utilities +- Content & styles diff --git a/projects/mdb-angular-ui-kit/LICENSE b/projects/mdb-angular-ui-kit/LICENSE new file mode 100644 index 00000000..b7512314 --- /dev/null +++ b/projects/mdb-angular-ui-kit/LICENSE @@ -0,0 +1,19 @@ +MIT license for MDB Free + +Free packages are available under the MIT License. + +-- Highlights + +● Free for personal use + +● Free for commercial use + +● No attribution required + +-- Copyright notice + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions. + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +The software is provided "As is", without warranty of any kind, express or implied, including but not limited To the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall The authors or copyright holders be liable for any claim, damages or other liability, whether in an action of Contract, tort or otherwise, arising from, out of or in connection with the software or the use or other Dealings in the software. \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/README.md b/projects/mdb-angular-ui-kit/README.md new file mode 100644 index 00000000..2b958ead --- /dev/null +++ b/projects/mdb-angular-ui-kit/README.md @@ -0,0 +1,238 @@ +Bootstrap 5 & Angular 20 UI KIT - 700+ components, MIT license, simple installation. + +MDB is a collection of free Bootstrap templates, themes, design tools & resources. + +--- + +# Get started + +### [>> Get Started in 1 minute](https://mdbootstrap.com/docs/angular/getting-started/installation/) +Simple installation via .zip, npm or cdnjs. + +### [>> Install with MDBGO](https://mdbgo.com/) + Free Hosting, WordPress support, custom domains, SSL support, free database, frontend & backend templates, webpack starter included, git repostiory, FTP & jenkins support. + +### [>> Install with MDBGO + e-commerce shop integration](https://mdbgo.com/wordpress-shop/) +One click setup! MDB GO allows you to create a WordPress page with a single click. +Regardless whether you want to create a Travel Blog or an e-commerce shop to sell your product you can easily do that. You can even combine both into single page. + + +## About Material Design for Bootstrap 5 & Angular 20 + +

Created by + Downloads +License + +YouTube Video Views

+ +Trusted by 2 000 000+ developers & designers. Used by companies & institutions like + + + + + + + + + +
+ + + + + + + + +
+ + + + + + + + +
+ + + + +
    +
  • 700+ UI components
  • +
  • Super simple, 1 minute installation
  • +
  • Detailed docs & practical examples
  • +
  • Lots of tutorials
  • +
  • Huge and active community
  • +
  • MIT license - free for personal & commercial use
  • +
+
+ +___ + +# Bootstrap 5 tutorial + +**[>> Learn more about Bootstrap 5](https://mdbootstrap.com/docs/standard/bootstrap-5/)** + + +**[>> Bootstrap 5 Tutorial](https://mdbootstrap.com/docs/standard/bootstrap-5-tutorial/)** + +**[>> Subscribe to our YouTube channel with dozens of Bootstrap tutorials](https://www.youtube.com/c/Mdbootstrap?sub_confirmation=1)** + + + + + + + + + + + + +
+ + + + + + + +
+

Start learning from Basics

+ + + +
+

Learn Bootstrap 5 | Crash Course for Beginners in 1.5H

+ + + +
+ +--- + +# Demo + +#### Simplicity and ease of use are key features of MDB 5 Angular UI Kit. You need only one minute to install and run it. + +### Buttons + +

Use MDB custom button styles for actions in forms, dialogs, and more with support for multiple sizes, states, and more.

+ + +

+ +

+
+ + +

+ +

+
+ + +

+ +

+
+ + +

+ +

+
+ +### Spinners + +

Indicate the loading state of a component or page with MDB spinners, built entirely with HTML, CSS, and no JavaScript.

+ + +

+ +

+
+ + +

+ +

+
+ +### Cards + +

A card is a flexible and extensible content container. It includes options for headers and footers, a wide variety of content, contextual background colors, and powerful display options.

+ + +

+ +

+
+ +### Footer + +

A footer is an additional navigation component. It can hold links, buttons, company info, copyrights, forms, and many other elements.

+ + +

+ +

+
+ +### Hover + +

MDB hover effect appears when the user positions the computer cursor over an element without activating it. Hover effects make a website more interactive.

+ + +

+ +

+
+ + +

+ +

+
+ +### Notes + +

Notes are small components very helpful in inserting an additional piece of information.

+ + +

+ +

+
+ + + +___ + +# Extended documentation + + diff --git a/projects/mdb-angular-ui-kit/accordion/accordion-item-content.directive.ts b/projects/mdb-angular-ui-kit/accordion/accordion-item-content.directive.ts new file mode 100644 index 00000000..9eac351b --- /dev/null +++ b/projects/mdb-angular-ui-kit/accordion/accordion-item-content.directive.ts @@ -0,0 +1,15 @@ +import { Directive, InjectionToken, TemplateRef } from '@angular/core'; + +export const MDB_ACCORDION_ITEM_BODY = new InjectionToken( + 'MdbAccordionItemBodyDirective' +); + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbAccordionItemBody]', + providers: [{ provide: MDB_ACCORDION_ITEM_BODY, useExisting: MdbAccordionItemBodyDirective }], + standalone: false, +}) +export class MdbAccordionItemBodyDirective { + constructor(public template: TemplateRef) {} +} diff --git a/projects/mdb-angular-ui-kit/accordion/accordion-item-header.directive.ts b/projects/mdb-angular-ui-kit/accordion/accordion-item-header.directive.ts new file mode 100644 index 00000000..647f341c --- /dev/null +++ b/projects/mdb-angular-ui-kit/accordion/accordion-item-header.directive.ts @@ -0,0 +1,15 @@ +import { Directive, InjectionToken, TemplateRef } from '@angular/core'; + +export const MDB_ACCORDION_ITEM_HEADER = new InjectionToken( + 'MdbAccordionItemHeaderDirective' +); + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbAccordionItemHeader]', + providers: [{ provide: MDB_ACCORDION_ITEM_HEADER, useExisting: MdbAccordionItemHeaderDirective }], + standalone: false, +}) +export class MdbAccordionItemHeaderDirective { + constructor(public template: TemplateRef) {} +} diff --git a/projects/mdb-angular-ui-kit/accordion/accordion-item.component.html b/projects/mdb-angular-ui-kit/accordion/accordion-item.component.html new file mode 100644 index 00000000..9c2a2856 --- /dev/null +++ b/projects/mdb-angular-ui-kit/accordion/accordion-item.component.html @@ -0,0 +1,27 @@ +

+ +

+
+
+ +
+
diff --git a/projects/mdb-angular-ui-kit/accordion/accordion-item.component.ts b/projects/mdb-angular-ui-kit/accordion/accordion-item.component.ts new file mode 100644 index 00000000..c5777d0c --- /dev/null +++ b/projects/mdb-angular-ui-kit/accordion/accordion-item.component.ts @@ -0,0 +1,135 @@ +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ContentChild, + EventEmitter, + HostBinding, + Input, + OnInit, + Output, + TemplateRef, + ViewChild, +} from '@angular/core'; +import { MdbCollapseDirective } from 'mdb-angular-ui-kit/collapse'; +import { Subject } from 'rxjs'; +import { MDB_ACCORDION_ITEM_BODY } from './accordion-item-content.directive'; +import { MDB_ACCORDION_ITEM_HEADER } from './accordion-item-header.directive'; +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; + +let uniqueHeaderId = 0; +let uniqueId = 0; + +@Component({ + selector: 'mdb-accordion-item', + templateUrl: './accordion-item.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false, +}) +export class MdbAccordionItemComponent implements OnInit { + @ContentChild(MDB_ACCORDION_ITEM_HEADER, { read: TemplateRef, static: true }) + _headerTemplate: TemplateRef; + + @ContentChild(MDB_ACCORDION_ITEM_BODY, { read: TemplateRef, static: true }) + _bodyTemplate: TemplateRef; + + @ViewChild(MdbCollapseDirective, { static: true }) collapse: MdbCollapseDirective; + + @Input() + get disabled(): boolean { + return this._disabled; + } + set disabled(value: boolean) { + this._disabled = coerceBooleanProperty(value); + } + private _disabled = false; + + @Input() header: string; + @Input() + set collapsed(value: boolean) { + if (!this._isInitialized) { + if (!value) { + this._shouldOpenOnInit = true; + } + return; + } + + if (value) { + this.hide(); + } else { + this.show(); + } + } + + @Input() id = `mdb-accordion-item-${uniqueId++}`; + + _headerId = `mdb-accordion-item-header-${uniqueHeaderId++}`; + + private _isInitialized = false; + private _shouldOpenOnInit = false; + + @Output() itemShow: EventEmitter = new EventEmitter(); + @Output() itemShown: EventEmitter = new EventEmitter(); + @Output() itemHide: EventEmitter = new EventEmitter(); + @Output() itemHidden: EventEmitter = new EventEmitter(); + + @HostBinding('class.accordion-item') accordionItem = true; + @HostBinding('class.d-block') accordionItemDisplayBlock = true; + + ngOnInit(): void { + this._isInitialized = true; + + if (this._shouldOpenOnInit) { + this.show(); + } + } + + show$ = new Subject(); + + _collapsed = true; + _addCollapsedClass = true; + + constructor(private _cdRef: ChangeDetectorRef) {} + + toggle(): void { + if (this.disabled) { + return; + } + + this.collapse.toggle(); + } + + show(): void { + this.collapse.show(); + this._cdRef.markForCheck(); + } + + hide(): void { + this.collapse.hide(); + this._cdRef.markForCheck(); + } + + onShow(): void { + this._addCollapsedClass = false; + this.itemShow.emit(this); + + this.show$.next(this); + } + + onHide(): void { + this._addCollapsedClass = true; + this.itemHide.emit(this); + } + + onShown(): void { + this._collapsed = false; + this.itemShown.emit(this); + } + + onHidden(): void { + this._collapsed = true; + this.itemHidden.emit(this); + } + + static ngAcceptInputType_disabled: BooleanInput; +} diff --git a/projects/mdb-angular-ui-kit/accordion/accordion.component.html b/projects/mdb-angular-ui-kit/accordion/accordion.component.html new file mode 100644 index 00000000..6dbc7430 --- /dev/null +++ b/projects/mdb-angular-ui-kit/accordion/accordion.component.html @@ -0,0 +1 @@ + diff --git a/projects/mdb-angular-ui-kit/accordion/accordion.component.ts b/projects/mdb-angular-ui-kit/accordion/accordion.component.ts new file mode 100644 index 00000000..6d462f0a --- /dev/null +++ b/projects/mdb-angular-ui-kit/accordion/accordion.component.ts @@ -0,0 +1,91 @@ +import { + AfterContentInit, + ChangeDetectionStrategy, + Component, + ContentChildren, + HostBinding, + Input, + QueryList, +} from '@angular/core'; +import { startWith, switchMap } from 'rxjs/operators'; +import { merge } from 'rxjs'; +import { MdbAccordionItemComponent } from './accordion-item.component'; +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; + +@Component({ + selector: 'mdb-accordion', + templateUrl: './accordion.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false, +}) +export class MdbAccordionComponent implements AfterContentInit { + @ContentChildren(MdbAccordionItemComponent) items: QueryList; + + @Input() + get borderless(): boolean { + return this._borderless; + } + set borderless(value: boolean) { + this._borderless = coerceBooleanProperty(value); + } + private _borderless = false; + + @Input() + get flush(): boolean { + return this._flush; + } + set flush(value: boolean) { + this._flush = coerceBooleanProperty(value); + } + private _flush = false; + + @Input() + get multiple(): boolean { + return this._multiple; + } + set multiple(value: boolean) { + this._multiple = coerceBooleanProperty(value); + } + private _multiple = false; + + @HostBinding('class.accordion') accordion = true; + + @HostBinding('class.accordion-borderless') + get addBorderlessClass(): boolean { + return this.borderless; + } + + @HostBinding('class.accordion-flush') + get addFlushClass(): boolean { + return this.flush; + } + + constructor() {} + + ngAfterContentInit(): void { + this.items.changes + .pipe( + startWith(this.items), + switchMap((items: QueryList) => { + return merge(...items.map((item: MdbAccordionItemComponent) => item.show$)); + }) + ) + .subscribe((clickedItem: MdbAccordionItemComponent) => + this._handleMultipleItems(clickedItem) + ); + } + + private _handleMultipleItems(clickedItem: MdbAccordionItemComponent): void { + if (!this.multiple) { + const itemsToClose = this.items.filter( + (item: MdbAccordionItemComponent) => item !== clickedItem && !item._collapsed + ); + + itemsToClose.forEach((item: MdbAccordionItemComponent) => item.hide()); + } + } + + static ngAcceptInputType_borderless: BooleanInput; + static ngAcceptInputType_flush: BooleanInput; + static ngAcceptInputType_multiple: BooleanInput; +} diff --git a/projects/mdb-angular-ui-kit/accordion/accordion.module.ts b/projects/mdb-angular-ui-kit/accordion/accordion.module.ts new file mode 100644 index 00000000..cf8a59df --- /dev/null +++ b/projects/mdb-angular-ui-kit/accordion/accordion.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MdbAccordionComponent } from './accordion.component'; +import { MdbAccordionItemComponent } from './accordion-item.component'; +import { MdbAccordionItemHeaderDirective } from './accordion-item-header.directive'; +import { MdbAccordionItemBodyDirective } from './accordion-item-content.directive'; +import { MdbCollapseModule } from 'mdb-angular-ui-kit/collapse'; + +@NgModule({ + declarations: [ + MdbAccordionComponent, + MdbAccordionItemComponent, + MdbAccordionItemHeaderDirective, + MdbAccordionItemBodyDirective, + ], + imports: [CommonModule, MdbCollapseModule], + exports: [ + MdbAccordionComponent, + MdbAccordionItemComponent, + MdbAccordionItemHeaderDirective, + MdbAccordionItemBodyDirective, + ], +}) +export class MdbAccordionModule {} diff --git a/projects/mdb-angular-ui-kit/accordion/accordion.spec.ts b/projects/mdb-angular-ui-kit/accordion/accordion.spec.ts new file mode 100644 index 00000000..5248eb2e --- /dev/null +++ b/projects/mdb-angular-ui-kit/accordion/accordion.spec.ts @@ -0,0 +1,241 @@ +import { Component, QueryList, ViewChildren } from '@angular/core'; +import { ComponentFixture, fakeAsync, flush, TestBed, tick } from '@angular/core/testing'; +import { MdbAccordionItemComponent } from './accordion-item.component'; +import { MdbAccordionModule } from './accordion.module'; + +const ANIMATION_TIME = 350; // animation time from collapse directive + +const template = ` + + + Accordion Item #1 + + This is the first item's accordion body. It is hidden by default, + until the collapse plugin adds the appropriate classes that we use to style each + element. These classes control the overall appearance, as well as the showing and + hiding via CSS transitions. You can modify any of this with custom CSS or overriding + our default variables. It's also worth noting that just about any HTML can go within + the .accordion-body, though the transition does limit overflow. + + + + + Accordion Item #2 + + This is the second item's accordion body. It is hidden by default, + until the collapse plugin adds the appropriate classes that we use to style each + element. These classes control the overall appearance, as well as the showing and + hiding via CSS transitions. You can modify any of this with custom CSS or overriding + our default variables. It's also worth noting that just about any HTML can go within + the .accordion-body, though the transition does limit overflow. + + + + + Accordion Item #3 + + This is the third item's accordion body. It is hidden by default, + until the collapse plugin adds the appropriate classes that we use to style each + element. These classes control the overall appearance, as well as the showing and + hiding via CSS transitions. You can modify any of this with custom CSS or overriding + our default variables. It's also worth noting that just about any HTML can go within + the .accordion-body, though the transition does limit overflow. + + + +`; + +@Component({ + selector: 'mdb-accordion-test', + template, + standalone: false, +}) +class TestAccordionComponent { + @ViewChildren(MdbAccordionItemComponent) _accordionItems: QueryList; + multiple = false; + flush = false; + borderless = false; + disabled = false; + + get accordionItems(): MdbAccordionItemComponent[] { + return this._accordionItems.toArray(); + } +} + +describe('MDB Accordion', () => { + let fixture: ComponentFixture; + let element: any; + let component: any; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [TestAccordionComponent], + imports: [MdbAccordionModule], + teardown: { destroyAfterEach: false }, + }); + fixture = TestBed.createComponent(TestAccordionComponent); + fixture.detectChanges(); + component = fixture.componentInstance; + element = fixture.nativeElement; + }); + + it('should toggle item on click', fakeAsync(() => { + const item = document.querySelector('.accordion-item') as HTMLElement; + const button = item.querySelector('.accordion-button') as HTMLElement; + + button.click(); + fixture.detectChanges(); + flush(); + + const itemCollapse = item.querySelector('.collapse'); + + expect(button.classList).not.toContain('collapsed'); + expect(itemCollapse.classList).toContain('show'); + + button.click(); + fixture.detectChanges(); + flush(); + + expect(button.classList).toContain('collapsed'); + expect(itemCollapse.classList).not.toContain('show'); + })); + + it('should toggle item when toggle method is used', fakeAsync(() => { + const item = document.querySelector('.accordion-item') as HTMLElement; + const button = item.querySelector('.accordion-button') as HTMLElement; + component.accordionItems[0].toggle(); + + fixture.detectChanges(); + flush(); + + const itemCollapse = item.querySelector('.collapse'); + + expect(button.classList).not.toContain('collapsed'); + expect(itemCollapse.classList).toContain('show'); + + component.accordionItems[0].toggle(); + fixture.detectChanges(); + flush(); + + expect(button.classList).toContain('collapsed'); + expect(itemCollapse.classList).not.toContain('show'); + })); + + it('should allow only one item to be opened if multiple is set to false', fakeAsync(() => { + const buttons = document.querySelectorAll('.accordion-button'); + const contents = document.querySelectorAll('.collapse'); + + component.accordionItems[0].toggle(); + fixture.detectChanges(); + flush(); + + expect(buttons[0].classList).not.toContain('collapsed'); + expect(contents[0].classList).toContain('show'); + + component.accordionItems[1].toggle(); + fixture.detectChanges(); + flush(); + + expect(buttons[0].classList).toContain('collapsed'); + expect(contents[0].classList).not.toContain('show'); + expect(buttons[1].classList).not.toContain('collapsed'); + expect(contents[1].classList).toContain('show'); + })); + + it('should allow multiple items to be opened if multiple is set to true', fakeAsync(() => { + component.multiple = true; + fixture.detectChanges(); + + const buttons = document.querySelectorAll('.accordion-button'); + const contents = document.querySelectorAll('.collapse'); + + component.accordionItems[0].toggle(); + fixture.detectChanges(); + flush(); + + expect(buttons[0].classList).not.toContain('collapsed'); + expect(contents[0].classList).toContain('show'); + + component.accordionItems[1].toggle(); + fixture.detectChanges(); + flush(); + + expect(buttons[0].classList).not.toContain('collapsed'); + expect(contents[0].classList).toContain('show'); + expect(buttons[1].classList).not.toContain('collapsed'); + expect(contents[1].classList).toContain('show'); + })); + + it('should add accordion-flush class if flush is set to true', () => { + component.flush = true; + fixture.detectChanges(); + + const accordion = document.querySelector('.accordion'); + + expect(accordion.classList).toContain('accordion-flush'); + }); + + it('should add accordion-borderless class if borderless is set to true', () => { + const accordion = document.querySelector('.accordion'); + + expect(accordion.classList).not.toContain('accordion-borderless'); + + component.borderless = true; + fixture.detectChanges(); + + expect(accordion.classList).toContain('accordion-borderless'); + }); + + it('should emit correct events on item collapse and expand', fakeAsync(() => { + const item = component.accordionItems[0]; + + const showSpy = jest.spyOn(item.itemShow, 'emit'); + const shownSpy = jest.spyOn(item.itemShown, 'emit'); + const hideSpy = jest.spyOn(item.itemHide, 'emit'); + const hiddenSpy = jest.spyOn(item.itemHidden, 'emit'); + + item.show(); + fixture.detectChanges(); + + expect(showSpy).toHaveBeenCalled(); + expect(shownSpy).not.toHaveBeenCalled(); + + tick(ANIMATION_TIME); + flush(); + fixture.detectChanges(); + + expect(shownSpy).toHaveBeenCalled(); + + item.hide(); + fixture.detectChanges(); + + expect(hideSpy).toHaveBeenCalled(); + expect(hiddenSpy).not.toHaveBeenCalled(); + + tick(ANIMATION_TIME); + flush(); + fixture.detectChanges(); + + expect(hiddenSpy).toHaveBeenCalled(); + })); + + it('should not toggle item on click when disabled input is set to true', fakeAsync(() => { + component.disabled = true; + fixture.detectChanges(); + + const item = document.querySelector('.accordion-item') as HTMLElement; + const button = item.querySelector('.accordion-button') as HTMLButtonElement; + const itemCollapse = item.querySelector('.collapse') as HTMLDivElement; + + expect(button.hasAttribute('disabled')).toBe(true); + expect(button.classList).toContain('collapsed'); + expect(itemCollapse.classList).not.toContain('show'); + + button.click(); + fixture.detectChanges(); + flush(); + + expect(button.classList).toContain('collapsed'); + expect(itemCollapse.classList).not.toContain('show'); + })); +}); diff --git a/src/index.ts b/projects/mdb-angular-ui-kit/accordion/index.ts similarity index 100% rename from src/index.ts rename to projects/mdb-angular-ui-kit/accordion/index.ts diff --git a/projects/mdb-angular-ui-kit/accordion/ng-package.json b/projects/mdb-angular-ui-kit/accordion/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/accordion/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/accordion/public_api.ts b/projects/mdb-angular-ui-kit/accordion/public_api.ts new file mode 100644 index 00000000..4a8239b3 --- /dev/null +++ b/projects/mdb-angular-ui-kit/accordion/public_api.ts @@ -0,0 +1,5 @@ +export { MdbAccordionComponent } from './accordion.component'; +export { MdbAccordionItemComponent } from './accordion-item.component'; +export { MdbAccordionItemHeaderDirective } from './accordion-item-header.directive'; +export { MdbAccordionItemBodyDirective } from './accordion-item-content.directive'; +export { MdbAccordionModule } from './accordion.module'; diff --git a/projects/mdb-angular-ui-kit/assets/scss/bootstrap/_accordion.scss b/projects/mdb-angular-ui-kit/assets/scss/bootstrap/_accordion.scss new file mode 100644 index 00000000..75588a5a --- /dev/null +++ b/projects/mdb-angular-ui-kit/assets/scss/bootstrap/_accordion.scss @@ -0,0 +1,158 @@ +// +// Base styles +// + +.accordion { + // scss-docs-start accordion-css-vars + --#{$prefix}accordion-color: #{$accordion-color}; + --#{$prefix}accordion-bg: #{$accordion-bg}; + --#{$prefix}accordion-transition: #{$accordion-transition}; + --#{$prefix}accordion-border-color: #{$accordion-border-color}; + --#{$prefix}accordion-border-width: #{$accordion-border-width}; + --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; + --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; + --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; + --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; + --#{$prefix}accordion-btn-color: #{$accordion-button-color}; + --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; + --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; + --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; + --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; + --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; + --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; + --#{$prefix}accordion-btn-focus-border-color: #{$accordion-button-focus-border-color}; + --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; + --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; + --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; + --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; + --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; + // scss-docs-end accordion-css-vars +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); + @include font-size($font-size-base); + color: var(--#{$prefix}accordion-btn-color); + text-align: left; // Reset button style + background-color: var(--#{$prefix}accordion-btn-bg); + border: 0; + @include border-radius(0); + overflow-anchor: none; + @include transition(var(--#{$prefix}accordion-transition)); + + &:not(.collapsed) { + color: var(--#{$prefix}accordion-active-color); + background-color: var(--#{$prefix}accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list + + &::after { + background-image: var(--#{$prefix}accordion-btn-active-icon); + transform: var(--#{$prefix}accordion-btn-icon-transform); + } + } + + // Accordion icon + &::after { + flex-shrink: 0; + width: var(--#{$prefix}accordion-btn-icon-width); + height: var(--#{$prefix}accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--#{$prefix}accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--#{$prefix}accordion-btn-icon-width); + @include transition(var(--#{$prefix}accordion-btn-icon-transition)); + } + + &:hover { + z-index: 2; + } + + &:focus { + z-index: 3; + border-color: var(--#{$prefix}accordion-btn-focus-border-color); + outline: 0; + box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); + } +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + color: var(--#{$prefix}accordion-color); + background-color: var(--#{$prefix}accordion-bg); + border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); + + &:first-of-type { + @include border-top-radius(var(--#{$prefix}accordion-border-radius)); + + .accordion-button { + @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); + } + } + + &:not(:first-of-type) { + border-top: 0; + } + + // Only set a border-radius on the last item if the accordion is collapsed + &:last-of-type { + @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); + + .accordion-button { + &.collapsed { + @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); + } + } + + .accordion-collapse { + @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); + } + } +} + +.accordion-body { + padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); +} + + +// Flush accordion items +// +// Remove borders and border-radius to keep accordion items edge-to-edge. + +.accordion-flush { + .accordion-collapse { + border-width: 0; + } + + .accordion-item { + border-right: 0; + border-left: 0; + @include border-radius(0); + + &:first-child { border-top: 0; } + &:last-child { border-bottom: 0; } + + .accordion-button { + &, + &.collapsed { + @include border-radius(0); + } + } + } +} + +@if $enable-dark-mode { + @include color-mode(dark) { + .accordion-button::after { + --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; + --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; + } + } +} diff --git a/projects/mdb-angular-ui-kit/assets/scss/bootstrap/_alert.scss b/projects/mdb-angular-ui-kit/assets/scss/bootstrap/_alert.scss new file mode 100644 index 00000000..b8cff9b7 --- /dev/null +++ b/projects/mdb-angular-ui-kit/assets/scss/bootstrap/_alert.scss @@ -0,0 +1,68 @@ +// +// Base styles +// + +.alert { + // scss-docs-start alert-css-vars + --#{$prefix}alert-bg: transparent; + --#{$prefix}alert-padding-x: #{$alert-padding-x}; + --#{$prefix}alert-padding-y: #{$alert-padding-y}; + --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; + --#{$prefix}alert-color: inherit; + --#{$prefix}alert-border-color: transparent; + --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); + --#{$prefix}alert-border-radius: #{$alert-border-radius}; + --#{$prefix}alert-link-color: inherit; + // scss-docs-end alert-css-vars + + position: relative; + padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); + margin-bottom: var(--#{$prefix}alert-margin-bottom); + color: var(--#{$prefix}alert-color); + background-color: var(--#{$prefix}alert-bg); + border: var(--#{$prefix}alert-border); + @include border-radius(var(--#{$prefix}alert-border-radius)); +} + +// Headings for larger alerts +.alert-heading { + // Specified to prevent conflicts of changing $headings-color + color: inherit; +} + +// Provide class for links that match alerts +.alert-link { + font-weight: $alert-link-font-weight; + color: var(--#{$prefix}alert-link-color); +} + + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissible { + padding-right: $alert-dismissible-padding-r; + + // Adjust close link position + .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: $stretched-link-z-index + 1; + padding: $alert-padding-y * 1.25 $alert-padding-x; + } +} + + +// scss-docs-start alert-modifiers +// Generate contextual modifier classes for colorizing the alert +@each $state in map-keys($theme-colors) { + .alert-#{$state} { + --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); + --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); + --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); + --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); + } +} +// scss-docs-end alert-modifiers diff --git a/projects/mdb-angular-ui-kit/assets/scss/bootstrap/_badge.scss b/projects/mdb-angular-ui-kit/assets/scss/bootstrap/_badge.scss new file mode 100644 index 00000000..cc3d2695 --- /dev/null +++ b/projects/mdb-angular-ui-kit/assets/scss/bootstrap/_badge.scss @@ -0,0 +1,38 @@ +// Base class +// +// Requires one of the contextual, color modifier classes for `color` and +// `background-color`. + +.badge { + // scss-docs-start badge-css-vars + --#{$prefix}badge-padding-x: #{$badge-padding-x}; + --#{$prefix}badge-padding-y: #{$badge-padding-y}; + @include rfs($badge-font-size, --#{$prefix}badge-font-size); + --#{$prefix}badge-font-weight: #{$badge-font-weight}; + --#{$prefix}badge-color: #{$badge-color}; + --#{$prefix}badge-border-radius: #{$badge-border-radius}; + // scss-docs-end badge-css-vars + + display: inline-block; + padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); + @include font-size(var(--#{$prefix}badge-font-size)); + font-weight: var(--#{$prefix}badge-font-weight); + line-height: 1; + color: var(--#{$prefix}badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + @include border-radius(var(--#{$prefix}badge-border-radius)); + @include gradient-bg(); + + // Empty badges collapse automatically + &:empty { + display: none; + } +} + +// Quick fix for badges in buttons +.btn .badge { + position: relative; + top: -1px; +} diff --git a/projects/mdb-angular-ui-kit/assets/scss/bootstrap/_breadcrumb.scss b/projects/mdb-angular-ui-kit/assets/scss/bootstrap/_breadcrumb.scss new file mode 100644 index 00000000..b8252ff2 --- /dev/null +++ b/projects/mdb-angular-ui-kit/assets/scss/bootstrap/_breadcrumb.scss @@ -0,0 +1,40 @@ +.breadcrumb { + // scss-docs-start breadcrumb-css-vars + --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; + --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; + --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; + @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); + --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; + --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; + --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; + --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; + --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; + // scss-docs-end breadcrumb-css-vars + + display: flex; + flex-wrap: wrap; + padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); + margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); + @include font-size(var(--#{$prefix}breadcrumb-font-size)); + list-style: none; + background-color: var(--#{$prefix}breadcrumb-bg); + @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); +} + +.breadcrumb-item { + // The separator between breadcrumbs (by default, a forward-slash: "/") + + .breadcrumb-item { + padding-left: var(--#{$prefix}breadcrumb-item-padding-x); + + &::before { + float: left; // Suppress inline spacings and underlining of the separator + padding-right: var(--#{$prefix}breadcrumb-item-padding-x); + color: var(--#{$prefix}breadcrumb-divider-color); + content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; + } + } + + &.active { + color: var(--#{$prefix}breadcrumb-item-active-color); + } +} diff --git a/src/angular-bootstrap-md/scss/bootstrap/_button-group.scss b/projects/mdb-angular-ui-kit/assets/scss/bootstrap/_button-group.scss similarity index 55% rename from src/angular-bootstrap-md/scss/bootstrap/_button-group.scss rename to projects/mdb-angular-ui-kit/assets/scss/bootstrap/_button-group.scss index 54951703..55ae3f65 100644 --- a/src/angular-bootstrap-md/scss/bootstrap/_button-group.scss +++ b/projects/mdb-angular-ui-kit/assets/scss/bootstrap/_button-group.scss @@ -1,5 +1,3 @@ -// stylelint-disable selector-no-qualifying-type - // Make the div behave like a button .btn-group, .btn-group-vertical { @@ -9,26 +7,18 @@ > .btn { position: relative; - flex: 0 1 auto; - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - @include hover { - z-index: 1; - } - &:focus, - &:active, - &.active { - z-index: 1; - } + flex: 1 1 auto; } - // Prevent double borders when buttons are next to each other - .btn + .btn, - .btn + .btn-group, - .btn-group + .btn, - .btn-group + .btn-group { - margin-left: -$btn-border-width; + // Bring the hover, focused, and "active" buttons to the front to overlay + // the borders properly + > .btn-check:checked + .btn, + > .btn-check:focus + .btn, + > .btn:hover, + > .btn:focus, + > .btn:active, + > .btn.active { + z-index: 1; } } @@ -44,19 +34,29 @@ } .btn-group { - > .btn:first-child { - margin-left: 0; + @include border-radius($btn-border-radius); + + // Prevent double borders when buttons are next to each other + > :not(.btn-check:first-child) + .btn, + > .btn-group:not(:first-child) { + margin-left: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list } // Reset rounded corners > .btn:not(:last-child):not(.dropdown-toggle), + > .btn.dropdown-toggle-split:first-child, > .btn-group:not(:last-child) > .btn { - @include border-right-radius(0); + @include border-end-radius(0); } - > .btn:not(:first-child), + // The left radius should be 0 if the button is: + // - the "third or more" child + // - the second child and the previous element isn't `.btn-check` (making it the first child visually) + // - part of a btn-group which isn't the first child + > .btn:nth-child(n + 3), + > :not(.btn-check) + .btn, > .btn-group:not(:first-child) > .btn { - @include border-left-radius(0); + @include border-start-radius(0); } } @@ -78,11 +78,11 @@ &::after, .dropup &::after, - .dropright &::after { + .dropend &::after { margin-left: 0; } - .dropleft &::before { + .dropstart &::before { margin-right: 0; } } @@ -119,17 +119,14 @@ align-items: flex-start; justify-content: center; - .btn, - .btn-group { + > .btn, + > .btn-group { width: 100%; } - > .btn + .btn, - > .btn + .btn-group, - > .btn-group + .btn, - > .btn-group + .btn-group { - margin-top: -$btn-border-width; - margin-left: 0; + > .btn:not(:first-child), + > .btn-group:not(:first-child) { + margin-top: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list } // Reset rounded corners @@ -138,35 +135,8 @@ @include border-bottom-radius(0); } - > .btn:not(:first-child), + > .btn ~ .btn, > .btn-group:not(:first-child) > .btn { @include border-top-radius(0); } } - - -// Checkbox and radio options -// -// In order to support the browser's form validation feedback, powered by the -// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use -// `display: none;` or `visibility: hidden;` as that also hides the popover. -// Simply visually hiding the inputs via `opacity` would leave them clickable in -// certain cases which is prevented by using `clip` and `pointer-events`. -// This way, we ensure a DOM element is visible to position the popover from. -// -// See https://github.com/twbs/bootstrap/pull/12794 and -// https://github.com/twbs/bootstrap/pull/14559 for more information. - -.btn-group-toggle { - > .btn, - > .btn-group > .btn { - margin-bottom: 0; // Override default `
diff --git a/projects/mdb-angular-ui-kit/carousel/carousel.component.ts b/projects/mdb-angular-ui-kit/carousel/carousel.component.ts new file mode 100644 index 00000000..8bb45cc4 --- /dev/null +++ b/projects/mdb-angular-ui-kit/carousel/carousel.component.ts @@ -0,0 +1,395 @@ +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { + AfterViewInit, + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ContentChildren, + ElementRef, + EventEmitter, + HostBinding, + HostListener, + Input, + OnDestroy, + Output, + QueryList, +} from '@angular/core'; +import { fromEvent, Subject } from 'rxjs'; +import { take, takeUntil } from 'rxjs/operators'; +import { MdbCarouselItemComponent } from './carousel-item.component'; + +export enum Direction { + UNKNOWN, + NEXT, + PREV, +} + +@Component({ + selector: 'mdb-carousel', + templateUrl: './carousel.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false, +}) +export class MdbCarouselComponent implements AfterViewInit, OnDestroy { + @ContentChildren(MdbCarouselItemComponent) _items: QueryList; + get items(): MdbCarouselItemComponent[] { + return this._items && this._items.toArray(); + } + + @Input() animation: 'slide' | 'fade' = 'slide'; + + @Input() + get controls(): boolean { + return this._controls; + } + set controls(value: boolean) { + this._controls = coerceBooleanProperty(value); + } + private _controls = false; + + @Input() + get dark(): boolean { + return this._dark; + } + set dark(value: boolean) { + this._dark = coerceBooleanProperty(value); + } + private _dark = false; + + @Input() + get indicators(): boolean { + return this._indicators; + } + set indicators(value: boolean) { + this._indicators = coerceBooleanProperty(value); + } + private _indicators = false; + + @Input() + get ride(): boolean { + return this._ride; + } + set ride(value: boolean) { + this._ride = coerceBooleanProperty(value); + } + private _ride = true; + + @Input() + get interval(): number { + return this._interval; + } + set interval(value: number) { + this._interval = value; + + if (this.items) { + this._restartInterval(); + } + } + private _interval = 5000; + + @Input() keyboard = true; + @Input() pause = true; + @Input() wrap = true; + + @Output() slide: EventEmitter = new EventEmitter(); + @Output() slideChange: EventEmitter = new EventEmitter(); + + get activeSlide(): number { + return this._activeSlide; + } + + set activeSlide(index: number) { + if (this.items.length && this._activeSlide !== index) { + this._activeSlide = index; + this._restartInterval(); + } + } + private _activeSlide = 0; + + private _lastInterval: any; + private _isPlaying = false; + private _isSliding = false; + + private readonly _destroy$: Subject = new Subject(); + + @HostListener('mouseenter') + onMouseEnter(): void { + if (this.pause && this._isPlaying) { + this.stop(); + } + } + + @HostListener('mouseleave') + onMouseLeave(): void { + if (this.pause && !this._isPlaying) { + this.play(); + } + } + + @HostBinding('class.d-block') display = true; + + constructor(private _elementRef: ElementRef, private _cdRef: ChangeDetectorRef) {} + + ngAfterViewInit(): void { + Promise.resolve().then(() => { + this._setActiveSlide(this._activeSlide); + + if (this.interval > 0 && this.ride) { + this.play(); + } + this._cdRef.markForCheck(); + }); + + if (this.keyboard) { + fromEvent(this._elementRef.nativeElement, 'keydown') + .pipe(takeUntil(this._destroy$)) + .subscribe((event: KeyboardEvent) => { + if (event.key === 'ArrowRight') { + this.next(); + } else if (event.key === 'ArrowLeft') { + this.prev(); + } + }); + } + } + + ngOnDestroy(): void { + this._destroy$.next(); + this._destroy$.complete(); + } + + private _setActiveSlide(index: number): void { + const currentSlide = this.items[this._activeSlide]; + currentSlide.active = false; + + const newSlide = this.items[index]; + newSlide.active = true; + this._activeSlide = index; + } + + private _restartInterval(): void { + this._resetInterval(); + const activeElement = this.items[this.activeSlide]; + const interval = activeElement.interval ? activeElement.interval : this.interval; + + if (!isNaN(interval) && interval > 0) { + this._lastInterval = setInterval(() => { + const nInterval = +interval; + if (this._isPlaying && !isNaN(nInterval) && nInterval > 0) { + this.next(); + this._cdRef.markForCheck(); + } else { + this.stop(); + } + }, interval); + } + } + + private _resetInterval(): void { + if (this._lastInterval) { + clearInterval(this._lastInterval); + this._lastInterval = null; + } + } + + play(): void { + if (!this._isPlaying) { + this._isPlaying = true; + this._restartInterval(); + } + } + + stop(): void { + if (this._isPlaying) { + this._isPlaying = false; + this._resetInterval(); + } + } + + to(index: number): void { + if (index > this.items.length - 1 || index < 0) { + return; + } + + if (this.activeSlide === index) { + this.stop(); + this.play(); + return; + } + + const direction = index > this.activeSlide ? Direction.NEXT : Direction.PREV; + + this._animateSlides(direction, this.activeSlide, index); + this.activeSlide = index; + } + + next(): void { + if (!this._isSliding) { + this._slide(Direction.NEXT); + } + } + + prev(): void { + if (!this._isSliding) { + this._slide(Direction.PREV); + } + } + + private _slide(direction: Direction): void { + const isFirst = this._activeSlide === 0; + const isLast = this._activeSlide === this.items.length - 1; + + if (!this.wrap) { + if ((direction === Direction.NEXT && isLast) || (direction === Direction.PREV && isFirst)) { + return; + } + } + + const newSlideIndex = this._getNewSlideIndex(direction); + + this._animateSlides(direction, this.activeSlide, newSlideIndex); + this.activeSlide = newSlideIndex; + + this.slide.emit(); + } + + private _animateSlides(direction: Direction, currentIndex: number, nextIndex: number): void { + const currentItem = this.items[currentIndex]; + const nextItem = this.items[nextIndex]; + const currentEl = currentItem.host; + const nextEl = nextItem.host; + + this._isSliding = true; + + if (this._isPlaying) { + this.stop(); + } + + if (direction === Direction.NEXT) { + nextItem.next = true; + + setTimeout(() => { + this._reflow(nextEl); + currentItem.start = true; + nextItem.start = true; + this._cdRef.markForCheck(); + }, 0); + + const transitionDuration = 600; + + fromEvent(currentEl, 'transitionend') + .pipe(take(1)) + .subscribe(() => { + nextItem.next = false; + nextItem.start = false; + nextItem.active = true; + + currentItem.active = false; + currentItem.start = false; + currentItem.next = false; + + this.slideChange.emit(); + this._isSliding = false; + }); + + this._emulateTransitionEnd(currentEl, transitionDuration); + } else if (direction === Direction.PREV) { + nextItem.prev = true; + + setTimeout(() => { + this._reflow(nextEl); + currentItem.end = true; + nextItem.end = true; + this._cdRef.markForCheck(); + }, 0); + + const transitionDuration = 600; + + fromEvent(currentEl, 'transitionend') + .pipe(take(1)) + .subscribe(() => { + nextItem.prev = false; + nextItem.end = false; + nextItem.active = true; + + currentItem.active = false; + currentItem.end = false; + currentItem.prev = false; + + this.slideChange.emit(); + this._isSliding = false; + }); + + this._emulateTransitionEnd(currentEl, transitionDuration); + } + + if (!this._isPlaying && this.interval > 0) { + this.play(); + } + } + + private _reflow(element: HTMLElement): number { + return element.offsetHeight; + } + + private _emulateTransitionEnd(element: HTMLElement, duration: number): void { + let eventEmitted = false; + const durationPadding = 5; + const emulatedDuration = duration + durationPadding; + + fromEvent(element, 'transitionend') + .pipe(take(1)) + .subscribe(() => { + eventEmitted = true; + }); + + setTimeout(() => { + if (!eventEmitted) { + element.dispatchEvent(new Event('transitionend')); + } + }, emulatedDuration); + } + + private _getNewSlideIndex(direction: Direction): number { + let newSlideIndex: number; + + if (direction === Direction.NEXT) { + newSlideIndex = this._getNextSlideIndex(); + } + + if (direction === Direction.PREV) { + newSlideIndex = this._getPrevSlideIndex(); + } + + return newSlideIndex; + } + + private _getNextSlideIndex(): number { + const isLast = this._activeSlide === this.items.length - 1; + + if (!isLast) { + return this._activeSlide + 1; + } else if (this.wrap && isLast) { + return 0; + } else { + return this._activeSlide; + } + } + + private _getPrevSlideIndex(): number { + const isFirst = this._activeSlide === 0; + + if (!isFirst) { + return this._activeSlide - 1; + } else if (this.wrap && isFirst) { + return this.items.length - 1; + } else { + return this._activeSlide; + } + } + + static ngAcceptInputType_controls: BooleanInput; + static ngAcceptInputType_dark: BooleanInput; + static ngAcceptInputType_indicators: BooleanInput; + static ngAcceptInputType_ride: BooleanInput; +} diff --git a/projects/mdb-angular-ui-kit/carousel/carousel.module.ts b/projects/mdb-angular-ui-kit/carousel/carousel.module.ts new file mode 100644 index 00000000..67a70093 --- /dev/null +++ b/projects/mdb-angular-ui-kit/carousel/carousel.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { MdbCarouselComponent } from './carousel.component'; +import { MdbCarouselItemComponent } from './carousel-item.component'; + +@NgModule({ + declarations: [MdbCarouselComponent, MdbCarouselItemComponent], + exports: [MdbCarouselComponent, MdbCarouselItemComponent], + imports: [CommonModule], +}) +export class MdbCarouselModule {} diff --git a/projects/mdb-angular-ui-kit/carousel/carousel.spec.ts b/projects/mdb-angular-ui-kit/carousel/carousel.spec.ts new file mode 100644 index 00000000..7e7f5786 --- /dev/null +++ b/projects/mdb-angular-ui-kit/carousel/carousel.spec.ts @@ -0,0 +1,218 @@ +import { Component, ViewChild } from '@angular/core'; +import { ComponentFixture, fakeAsync, flush, TestBed, tick } from '@angular/core/testing'; +import { MdbCarouselComponent } from './carousel.component'; +import { MdbCarouselModule } from './carousel.module'; + +const carouselTemplate = ` + + + ... + + + + ... + + + + ... + + +`; + +@Component({ + template: carouselTemplate, + standalone: false, +}) +export class CarouselTestComponent { + @ViewChild(MdbCarouselComponent, { static: true }) carousel: MdbCarouselComponent; + controls = false; + indicators = false; + wrap = true; + dark = false; + animation = 'slide'; +} + +describe('MDB Carousel', () => { + let fixture: ComponentFixture; + let component: CarouselTestComponent; + let carousel: MdbCarouselComponent; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [CarouselTestComponent], + imports: [MdbCarouselModule], + teardown: { destroyAfterEach: false }, + }); + + fixture = TestBed.createComponent(CarouselTestComponent); + component = fixture.componentInstance; + carousel = component.carousel; + + fixture.detectChanges(); + }); + + it('should set first slide as active by default', fakeAsync(() => { + flush(); + fixture.detectChanges(); + const items = fixture.nativeElement.querySelectorAll('.carousel-item'); + expect(items[0].classList.contains('active')).toBe(true); + })); + + it('should show indicators if indicators input is set to true', () => { + component.indicators = true; + fixture.detectChanges(); + const indicators = fixture.nativeElement.querySelectorAll('.carousel-indicators'); + expect(indicators).toBeDefined(); + }); + + it('should show controls if controls input is set to true', () => { + component.controls = true; + fixture.detectChanges(); + const prevArrow = fixture.nativeElement.querySelector('.carousel-control-prev'); + const nextArrow = fixture.nativeElement.querySelector('.carousel-control-next'); + expect(prevArrow).toBeDefined(); + expect(nextArrow).toBeDefined(); + }); + + it('should add carousel-fade class if animation type is set to fade', () => { + component.animation = 'fade'; + fixture.detectChanges(); + const carouselEl = fixture.nativeElement.querySelector('.carousel'); + expect(carouselEl.classList.contains('carousel-fade')).toBe(true); + }); + + it('should add carousel-dark class if dark input is set to true', () => { + component.dark = true; + fixture.detectChanges(); + const carouselEl = fixture.nativeElement.querySelector('.carousel'); + expect(carouselEl.classList.contains('carousel-dark')).toBe(true); + }); + + it('should set corresponding indicator as active', fakeAsync(() => { + component.indicators = true; + fixture.detectChanges(); + const indicators = fixture.nativeElement.querySelectorAll('.carousel-indicators > button'); + expect(indicators[0].classList.contains('active')).toBe(true); + })); + + it('should change active slide on indicator click', fakeAsync(() => { + component.indicators = true; + fixture.detectChanges(); + const items = fixture.nativeElement.querySelectorAll('.carousel-item'); + const indicators = fixture.nativeElement.querySelectorAll('.carousel-indicators > button'); + expect(indicators[0].classList.contains('active')).toBe(true); + expect(items[0].classList.contains('active')).toBe(true); + + indicators[1].click(); + tick(1000); + fixture.detectChanges(); + + expect(indicators[1].classList.contains('active')).toBe(true); + expect(items[1].classList.contains('active')).toBe(true); + })); + + it('should change slide on previous arrow click', fakeAsync(() => { + component.controls = true; + component.wrap = true; + fixture.detectChanges(); + const items = fixture.nativeElement.querySelectorAll('.carousel-item'); + const prevArrow = fixture.nativeElement.querySelector('.carousel-control-prev'); + expect(items[0].classList.contains('active')).toBe(true); + + prevArrow.click(); + tick(1000); + fixture.detectChanges(); + + expect(items[2].classList.contains('active')).toBe(true); + + prevArrow.click(); + tick(1000); + fixture.detectChanges(); + + expect(items[1].classList.contains('active')).toBe(true); + })); + + it('should change slide on next arrow click', fakeAsync(() => { + component.controls = true; + component.wrap = true; + fixture.detectChanges(); + const items = fixture.nativeElement.querySelectorAll('.carousel-item'); + const nextArrow = fixture.nativeElement.querySelector('.carousel-control-next'); + expect(items[0].classList.contains('active')).toBe(true); + + nextArrow.click(); + tick(1000); + fixture.detectChanges(); + + expect(items[1].classList.contains('active')).toBe(true); + + nextArrow.click(); + tick(1000); + fixture.detectChanges(); + + expect(items[2].classList.contains('active')).toBe(true); + })); + + it('should not go to previous slide if first slide is active and wrap option is disabled', fakeAsync(() => { + component.controls = true; + component.wrap = false; + fixture.detectChanges(); + const items = fixture.nativeElement.querySelectorAll('.carousel-item'); + const prevArrow = fixture.nativeElement.querySelector('.carousel-control-prev'); + expect(items[0].classList.contains('active')).toBe(true); + + prevArrow.click(); + tick(1000); + fixture.detectChanges(); + + expect(items[0].classList.contains('active')).toBe(true); + expect(items[2].classList.contains('active')).toBe(false); + })); + + it('should not go to next slide if last slide is active and wrap option is disabled', fakeAsync(() => { + component.controls = true; + component.wrap = false; + fixture.detectChanges(); + const items = fixture.nativeElement.querySelectorAll('.carousel-item'); + const nextArrow = fixture.nativeElement.querySelector('.carousel-control-next'); + expect(items[0].classList.contains('active')).toBe(true); + + nextArrow.click(); + tick(1000); + fixture.detectChanges(); + + expect(items[1].classList.contains('active')).toBe(true); + + nextArrow.click(); + tick(1000); + fixture.detectChanges(); + + expect(items[2].classList.contains('active')).toBe(true); + + nextArrow.click(); + tick(1000); + fixture.detectChanges(); + + expect(items[2].classList.contains('active')).toBe(true); + expect(items[0].classList.contains('active')).toBe(false); + })); +}); diff --git a/projects/mdb-angular-ui-kit/carousel/index.ts b/projects/mdb-angular-ui-kit/carousel/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/mdb-angular-ui-kit/carousel/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/mdb-angular-ui-kit/carousel/ng-package.json b/projects/mdb-angular-ui-kit/carousel/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/carousel/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/carousel/public_api.ts b/projects/mdb-angular-ui-kit/carousel/public_api.ts new file mode 100644 index 00000000..0c661600 --- /dev/null +++ b/projects/mdb-angular-ui-kit/carousel/public_api.ts @@ -0,0 +1,3 @@ +export { MdbCarouselComponent } from './carousel.component'; +export { MdbCarouselItemComponent } from './carousel-item.component'; +export { MdbCarouselModule } from './carousel.module'; diff --git a/projects/mdb-angular-ui-kit/checkbox/checkbox.directive.spec.ts b/projects/mdb-angular-ui-kit/checkbox/checkbox.directive.spec.ts new file mode 100644 index 00000000..c143cc9e --- /dev/null +++ b/projects/mdb-angular-ui-kit/checkbox/checkbox.directive.spec.ts @@ -0,0 +1,196 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { Component, DebugElement } from '@angular/core'; +import { MdbCheckboxModule } from './index'; +import { By } from '@angular/platform-browser'; +import { UntypedFormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; + +describe('MDB Checkbox', () => { + let checkbox: BasicCheckboxComponent; + let fixture: ComponentFixture; + let input: HTMLInputElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [ + BasicCheckboxComponent, + CheckboxWithNgModelComponent, + CheckboxWithFormControlComponent, + ], + imports: [MdbCheckboxModule, FormsModule, ReactiveFormsModule], + teardown: { destroyAfterEach: false }, + }); + + fixture = TestBed.createComponent(BasicCheckboxComponent); + fixture.detectChanges(); + checkbox = fixture.componentInstance; + input = fixture.nativeElement.querySelector('input'); + }); + + it('should be checked if checked input is set to true', () => { + checkbox.checked = true; + fixture.detectChanges(); + expect(input.checked).toBe(true); + }); + + it('should be unchecked if checked input is set to false', () => { + checkbox.checked = false; + fixture.detectChanges(); + expect(input.checked).toBe(false); + }); + + it('should be disabled if disabled input is set to true', () => { + checkbox.disabled = true; + fixture.detectChanges(); + expect(input.disabled).toBe(true); + }); + + it('should be enabled if disabled input is set to false', () => { + checkbox.disabled = false; + fixture.detectChanges(); + expect(input.disabled).toBe(false); + }); + + it('should toggle checked state when clicked', () => { + checkbox.checked = false; + fixture.detectChanges(); + input.click(); + fixture.detectChanges(); + expect(input.checked).toBe(true); + + input.click(); + fixture.detectChanges(); + expect(input.checked).toBe(false); + }); + + it('should not toggle checked state if element is disabled', () => { + checkbox.checked = false; + checkbox.disabled = true; + fixture.detectChanges(); + + expect(input.checked).toBe(false); + + input.click(); + fixture.detectChanges(); + + expect(input.checked).toBe(false); + }); + + describe('Checkbox with ngModel', () => { + let checkbox: CheckboxWithNgModelComponent; + let fixture: ComponentFixture; + let input: HTMLInputElement; + + beforeEach(() => { + fixture = TestBed.createComponent(CheckboxWithNgModelComponent); + fixture.detectChanges(); + checkbox = fixture.componentInstance; + input = fixture.nativeElement.querySelector('input'); + }); + + // it('should use value from ngModel to set default checked state', () => { + // checkbox.checked = true; + // fixture.detectChanges(); + + // expect(input.checked).toBe(true); + // }); + + it('should update ngModel value when checked state change', () => { + checkbox.checked = false; + fixture.detectChanges(); + + input.click(); + fixture.detectChanges(); + + expect(checkbox.checked).toBe(true); + }); + }); + + describe('Checkbox with form control', () => { + let checkbox: CheckboxWithFormControlComponent; + let fixture: ComponentFixture; + let input: HTMLInputElement; + + beforeEach(() => { + fixture = TestBed.createComponent(CheckboxWithFormControlComponent); + fixture.detectChanges(); + checkbox = fixture.componentInstance; + input = fixture.nativeElement.querySelector('input'); + }); + + it('should use value from form control to set default checked state', () => { + expect(input.checked).toBe(false); + + checkbox.control.setValue(true); + fixture.detectChanges(); + + expect(input.checked).toBe(true); + }); + + it('should update form control value when checked state change', () => { + expect(checkbox.control.value).toBe(false); + expect(input.checked).toBe(false); + + input.click(); + fixture.detectChanges(); + + expect(input.checked).toBe(true); + expect(checkbox.control.value).toBe(true); + }); + + it('should disable input when form control disable method is used', () => { + expect(input.disabled).toBe(false); + + checkbox.control.disable(); + fixture.detectChanges(); + + expect(input.disabled).toBe(true); + }); + }); +}); + +const basicTemplate = ` +
+ + +
+`; + +@Component({ + template: basicTemplate, + standalone: false, +}) +class BasicCheckboxComponent { + checked = false; + disabled = false; +} + +const ngModelTemplate = ` +
+ + +
+`; + +@Component({ + template: ngModelTemplate, + standalone: false, +}) +class CheckboxWithNgModelComponent { + checked = false; + disabled = false; +} + +const formControlTemplate = ` +
+ + +
+`; + +@Component({ + template: formControlTemplate, + standalone: false, +}) +class CheckboxWithFormControlComponent { + control = new UntypedFormControl(false); +} diff --git a/projects/mdb-angular-ui-kit/checkbox/checkbox.directive.ts b/projects/mdb-angular-ui-kit/checkbox/checkbox.directive.ts new file mode 100644 index 00000000..e30717fd --- /dev/null +++ b/projects/mdb-angular-ui-kit/checkbox/checkbox.directive.ts @@ -0,0 +1,125 @@ +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { + EventEmitter, + forwardRef, + Input, + Output, + Directive, + HostBinding, + HostListener, +} from '@angular/core'; +import { NG_VALUE_ACCESSOR } from '@angular/forms'; + +export const MDB_CHECKBOX_VALUE_ACCESSOR: any = { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MdbCheckboxDirective), + multi: true, +}; + +export class MdbCheckboxChange { + element: MdbCheckboxDirective; + checked: boolean; +} + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbCheckbox]', + providers: [MDB_CHECKBOX_VALUE_ACCESSOR], + standalone: false, +}) +export class MdbCheckboxDirective { + @Input('checked') + get checked(): boolean { + return this._checked; + } + set checked(value: boolean) { + this._checked = coerceBooleanProperty(value); + } + private _checked = false; + + @Input('value') + get value(): any { + return this._value; + } + set value(value: any) { + this._value = value; + } + private _value: any = null; + + @Input('disabled') + get disabled(): boolean { + return this._disabled; + } + set disabled(value: boolean) { + this._disabled = coerceBooleanProperty(value); + } + private _disabled = false; + + @Output() checkboxChange: EventEmitter = new EventEmitter(); + + @HostBinding('disabled') + get isDisabled(): boolean { + return this._disabled; + } + + @HostBinding('checked') + get isChecked(): boolean { + return this._checked; + } + + @HostListener('click') + onCheckboxClick(): void { + this.toggle(); + } + + @HostListener('blur') + onBlur(): void { + this.onTouched(); + } + + constructor() {} + + get changeEvent(): MdbCheckboxChange { + const newChangeEvent = new MdbCheckboxChange(); + newChangeEvent.element = this; + newChangeEvent.checked = this.checked; + return newChangeEvent; + } + + toggle(): void { + if (this.disabled) { + return; + } + this._checked = !this._checked; + this.onChange(this.checked); + this.onCheckboxChange(); + } + + onCheckboxChange(): void { + this.checkboxChange.emit(this.changeEvent); + } + + // Control Value Accessor Methods + onChange = (_: any) => {}; + onTouched = () => {}; + + writeValue(value: any): void { + this.value = value; + this.checked = !!value; + } + + registerOnChange(fn: (_: any) => void): void { + this.onChange = fn; + } + + registerOnTouched(fn: () => void): void { + this.onTouched = fn; + } + + setDisabledState(isDisabled: boolean): void { + this.disabled = isDisabled; + } + + static ngAcceptInputType_checked: BooleanInput; + static ngAcceptInputType_disabled: BooleanInput; +} diff --git a/projects/mdb-angular-ui-kit/checkbox/checkbox.module.ts b/projects/mdb-angular-ui-kit/checkbox/checkbox.module.ts new file mode 100644 index 00000000..5268ccc6 --- /dev/null +++ b/projects/mdb-angular-ui-kit/checkbox/checkbox.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { MdbCheckboxDirective } from './checkbox.directive'; + +@NgModule({ + declarations: [MdbCheckboxDirective], + exports: [MdbCheckboxDirective], + imports: [CommonModule, FormsModule], +}) +export class MdbCheckboxModule {} diff --git a/projects/mdb-angular-ui-kit/checkbox/index.ts b/projects/mdb-angular-ui-kit/checkbox/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/mdb-angular-ui-kit/checkbox/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/mdb-angular-ui-kit/checkbox/ng-package.json b/projects/mdb-angular-ui-kit/checkbox/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/checkbox/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/checkbox/public_api.ts b/projects/mdb-angular-ui-kit/checkbox/public_api.ts new file mode 100644 index 00000000..fcbb1357 --- /dev/null +++ b/projects/mdb-angular-ui-kit/checkbox/public_api.ts @@ -0,0 +1,6 @@ +export { + MdbCheckboxDirective, + MdbCheckboxChange, + MDB_CHECKBOX_VALUE_ACCESSOR, +} from './checkbox.directive'; +export { MdbCheckboxModule } from './checkbox.module'; diff --git a/projects/mdb-angular-ui-kit/collapse/collapse.directive.spec.ts b/projects/mdb-angular-ui-kit/collapse/collapse.directive.spec.ts new file mode 100644 index 00000000..95189697 --- /dev/null +++ b/projects/mdb-angular-ui-kit/collapse/collapse.directive.spec.ts @@ -0,0 +1,112 @@ +import { Component, ViewChild } from '@angular/core'; +import { ComponentFixture, fakeAsync, flush, TestBed, tick } from '@angular/core/testing'; +import { MdbCollapseDirective } from '.'; +import { MdbCollapseModule } from './collapse.module'; + +const template = ` + +
+ Collapse directive content +
+`; + +@Component({ + selector: 'mdb-collapse-test', + template, + standalone: false, +}) +class TestCollapseComponent { + @ViewChild('collapse') collapse: MdbCollapseDirective; + + collapsed = true; +} + +describe('MDB Collapse', () => { + const ANIMATION_TIME = 355; + let fixture: ComponentFixture; + let element: any; + let component: any; + let collapse: any; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [TestCollapseComponent], + imports: [MdbCollapseModule], + teardown: { destroyAfterEach: false }, + }); + fixture = TestBed.createComponent(TestCollapseComponent); + fixture.detectChanges(); + component = fixture.componentInstance; + element = fixture.nativeElement; + collapse = fixture.nativeElement.querySelector('.collapse'); + }); + + it('should have content collapsed by default', () => { + expect(collapse.classList.contains('show')).toBe(false); + }); + + it('should be expanded if collapsed input is set to false', fakeAsync(() => { + component.collapsed = false; + fixture.detectChanges(); + + tick(ANIMATION_TIME); + flush(); + fixture.detectChanges(); + + expect(collapse.classList).toContain('show'); + })); + + it('should allow toggling component by clicking on another element', fakeAsync(() => { + const button = fixture.nativeElement.querySelector('button'); + + expect(collapse.classList).not.toContain('show'); + + button.click(); + fixture.detectChanges(); + + tick(ANIMATION_TIME); + flush(); + fixture.detectChanges(); + + expect(collapse.classList).toContain('show'); + + button.click(); + fixture.detectChanges(); + + tick(ANIMATION_TIME); + flush(); + fixture.detectChanges(); + + expect(collapse.classList).not.toContain('show'); + })); + + it('should emit events on collapse and expand', fakeAsync(() => { + const button = fixture.nativeElement.querySelector('button'); + const showSpy = jest.spyOn(component.collapse.collapseShow, 'emit'); + const shownSpy = jest.spyOn(component.collapse.collapseShown, 'emit'); + const hideSpy = jest.spyOn(component.collapse.collapseHide, 'emit'); + const hiddenSpy = jest.spyOn(component.collapse.collapseHidden, 'emit'); + + button.click(); + fixture.detectChanges(); + + expect(showSpy).toHaveBeenCalled(); + + tick(ANIMATION_TIME); + flush(); + fixture.detectChanges(); + + expect(shownSpy).toHaveBeenCalled(); + + button.click(); + fixture.detectChanges(); + + expect(hideSpy).toHaveBeenCalled(); + + tick(ANIMATION_TIME); + flush(); + fixture.detectChanges(); + + expect(hiddenSpy).toHaveBeenCalled(); + })); +}); diff --git a/projects/mdb-angular-ui-kit/collapse/collapse.directive.ts b/projects/mdb-angular-ui-kit/collapse/collapse.directive.ts new file mode 100644 index 00000000..5a67952a --- /dev/null +++ b/projects/mdb-angular-ui-kit/collapse/collapse.directive.ts @@ -0,0 +1,149 @@ +import { + Directive, + ElementRef, + EventEmitter, + HostBinding, + Input, + Output, + Renderer2, +} from '@angular/core'; +import { fromEvent } from 'rxjs'; +import { take } from 'rxjs/operators'; + +const TRANSITION_TIME = 350; + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbCollapse]', + exportAs: 'mdbCollapse', + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +export class MdbCollapseDirective { + constructor(private _elementRef: ElementRef, private _renderer: Renderer2) {} + + @HostBinding('class.collapse') collapseClass = true; + + @Output() collapseShow: EventEmitter = new EventEmitter(); + @Output() collapseShown: EventEmitter = new EventEmitter(); + @Output() collapseHide: EventEmitter = new EventEmitter(); + @Output() collapseHidden: EventEmitter = new EventEmitter(); + + @Input() + set collapsed(collapsed: boolean) { + if (collapsed !== this._collapsed) { + collapsed ? this.hide() : this.show(); + this._collapsed = collapsed; + } + } + get collapsed(): boolean { + return this._collapsed; + } + private _collapsed = true; + + get host(): HTMLElement { + return this._elementRef.nativeElement; + } + + private _isTransitioning = false; + + show(): void { + if (this._isTransitioning || !this.collapsed) { + return; + } + + this.collapseShow.emit(this); + + this._renderer.removeClass(this.host, 'collapse'); + this._renderer.addClass(this.host, 'collapsing'); + + this._renderer.setStyle(this.host, 'height', '0px'); + + this._isTransitioning = true; + + const scrollHeight = this.host.scrollHeight; + + fromEvent(this.host, 'transitionend') + .pipe(take(1)) + .subscribe(() => { + this._isTransitioning = false; + this.collapsed = false; + this._renderer.removeClass(this.host, 'collapsing'); + this._renderer.addClass(this.host, 'collapse'); + this._renderer.addClass(this.host, 'show'); + + this._renderer.removeStyle(this.host, 'height'); + + this.collapseShown.emit(this); + }); + + this._emulateTransitionEnd(this.host, TRANSITION_TIME); + + this._renderer.setStyle(this.host, 'height', `${scrollHeight}px`); + } + + hide(): void { + if (this._isTransitioning || this.collapsed) { + return; + } + + this.collapseHide.emit(this); + + const hostHeight = this.host.getBoundingClientRect().height; + + this._renderer.setStyle(this.host, 'height', `${hostHeight}px`); + + this._reflow(this.host); + + this._renderer.addClass(this.host, 'collapsing'); + this._renderer.removeClass(this.host, 'collapse'); + this._renderer.removeClass(this.host, 'show'); + + this._isTransitioning = true; + + fromEvent(this.host, 'transitionend') + .pipe(take(1)) + .subscribe(() => { + this._renderer.removeClass(this.host, 'collapsing'); + this._renderer.addClass(this.host, 'collapse'); + this._isTransitioning = false; + this.collapsed = true; + + this.collapseHidden.emit(this); + }); + + this._renderer.removeStyle(this.host, 'height'); + this._emulateTransitionEnd(this.host, TRANSITION_TIME); + } + + toggle(): void { + if (this._isTransitioning) { + return; + } + + this.collapsed = !this.collapsed; + this.collapsed ? this.hide() : this.show(); + } + + private _reflow(element: HTMLElement): number { + return element.offsetHeight; + } + + private _emulateTransitionEnd(element: HTMLElement, duration: number): void { + let eventEmitted = false; + const durationPadding = 5; + const emulatedDuration = duration + durationPadding; + + fromEvent(element, 'transitionend') + .pipe(take(1)) + .subscribe(() => { + eventEmitted = true; + }); + + setTimeout(() => { + if (!eventEmitted) { + element.dispatchEvent(new Event('transitionend')); + } + }, emulatedDuration); + } +} diff --git a/projects/mdb-angular-ui-kit/collapse/collapse.module.ts b/projects/mdb-angular-ui-kit/collapse/collapse.module.ts new file mode 100755 index 00000000..e5e5b1c9 --- /dev/null +++ b/projects/mdb-angular-ui-kit/collapse/collapse.module.ts @@ -0,0 +1,8 @@ +import { MdbCollapseDirective } from './collapse.directive'; +import { NgModule } from '@angular/core'; + +@NgModule({ + declarations: [MdbCollapseDirective], + exports: [MdbCollapseDirective], +}) +export class MdbCollapseModule {} diff --git a/projects/mdb-angular-ui-kit/collapse/index.ts b/projects/mdb-angular-ui-kit/collapse/index.ts new file mode 100755 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/mdb-angular-ui-kit/collapse/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/mdb-angular-ui-kit/collapse/ng-package.json b/projects/mdb-angular-ui-kit/collapse/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/collapse/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/collapse/public_api.ts b/projects/mdb-angular-ui-kit/collapse/public_api.ts new file mode 100644 index 00000000..a9c97388 --- /dev/null +++ b/projects/mdb-angular-ui-kit/collapse/public_api.ts @@ -0,0 +1,2 @@ +export { MdbCollapseDirective } from './collapse.directive'; +export { MdbCollapseModule } from './collapse.module'; diff --git a/projects/mdb-angular-ui-kit/dropdown/dropdown-menu.directive.ts b/projects/mdb-angular-ui-kit/dropdown/dropdown-menu.directive.ts new file mode 100644 index 00000000..7ee58e7a --- /dev/null +++ b/projects/mdb-angular-ui-kit/dropdown/dropdown-menu.directive.ts @@ -0,0 +1,53 @@ +import { Directive, ElementRef, EventEmitter, Input, Output, Renderer2 } from '@angular/core'; + +export type MdbDropdownMenuPositionClass = 'dropdown-menu-end'; + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbDropdownMenu]', + exportAs: 'mdbDropdownMenu', + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +export class MdbDropdownMenuDirective { + constructor(public elementRef: ElementRef, private _renderer: Renderer2) {} + @Output() menuPositionClassChanged: EventEmitter = new EventEmitter(); + + @Input() + get menuPositionClass(): string { + return this._menuPositionClass; + } + + set menuPositionClass(newClass: string) { + const host = this.elementRef.nativeElement; + const isSameClass = host.classList.contains(newClass); + if (this._menuPositionClass !== newClass && !isSameClass) { + const menuPositionClasses = [ + 'dropdown-menu-start', + 'dropdown-menu-sm-start', + 'dropdown-menu-md-start', + 'dropdown-menu-lg-start', + 'dropdown-menu-xl-start', + 'dropdown-menu-xxl-start', + 'dropdown-menu-xxl-start', + 'dropdown-menu-xxl-start', + 'dropdown-menu-end', + 'dropdown-menu-sm-end', + 'dropdown-menu-md-end', + 'dropdown-menu-lg-end', + 'dropdown-menu-xl-end', + 'dropdown-menu-xxl-end', + 'dropdown-menu-xxl-end', + 'dropdown-menu-xxl-end', + ]; + + menuPositionClasses.forEach((className) => { + this._renderer.removeClass(host, className); + }); + this._renderer.addClass(host, newClass); + + this.menuPositionClassChanged.emit(this.menuPositionClass); + } + } + private _menuPositionClass: string; +} diff --git a/projects/mdb-angular-ui-kit/dropdown/dropdown-toggle.directive.ts b/projects/mdb-angular-ui-kit/dropdown/dropdown-toggle.directive.ts new file mode 100644 index 00000000..99b17219 --- /dev/null +++ b/projects/mdb-angular-ui-kit/dropdown/dropdown-toggle.directive.ts @@ -0,0 +1,10 @@ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[mdbDropdownToggle]', + exportAs: 'mdbDropdownToggle', + standalone: false, +}) +export class MdbDropdownToggleDirective { + constructor() {} +} diff --git a/projects/mdb-angular-ui-kit/dropdown/dropdown.component.html b/projects/mdb-angular-ui-kit/dropdown/dropdown.component.html new file mode 100644 index 00000000..1d270978 --- /dev/null +++ b/projects/mdb-angular-ui-kit/dropdown/dropdown.component.html @@ -0,0 +1,7 @@ + + + +
+ +
+
diff --git a/projects/mdb-angular-ui-kit/dropdown/dropdown.directive.spec.ts b/projects/mdb-angular-ui-kit/dropdown/dropdown.directive.spec.ts new file mode 100644 index 00000000..64a97517 --- /dev/null +++ b/projects/mdb-angular-ui-kit/dropdown/dropdown.directive.spec.ts @@ -0,0 +1,371 @@ +import { ComponentFixture, fakeAsync, flush, inject, TestBed, tick } from '@angular/core/testing'; +import { Component } from '@angular/core'; +import { MdbDropdownMenuDirective, MdbDropdownModule } from './index'; +import { MdbDropdownDirective } from './index'; +import { By } from '@angular/platform-browser'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { OverlayContainer } from '@angular/cdk/overlay'; +import { first } from 'rxjs'; + +describe('MDB Dropdown', () => { + let fixture: ComponentFixture; + let testComponent: TestDropdownComponent; + let directive: MdbDropdownDirective; + let overlayContainer: OverlayContainer; + let overlayContainerElement: HTMLElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [MdbDropdownModule, NoopAnimationsModule], + declarations: [TestDropdownComponent], + teardown: { destroyAfterEach: false }, + }); + + inject([OverlayContainer], (container: OverlayContainer) => { + overlayContainer = container; + overlayContainerElement = container.getContainerElement(); + })(); + + fixture = TestBed.createComponent(TestDropdownComponent); + testComponent = fixture.componentInstance; + directive = fixture.debugElement + .query(By.directive(MdbDropdownDirective)) + .injector.get(MdbDropdownDirective); + fixture.detectChanges(); + }); + + afterEach(inject([OverlayContainer], (currentOverlayContainer: OverlayContainer) => { + currentOverlayContainer.ngOnDestroy(); + overlayContainer.ngOnDestroy(); + })); + + describe('Opening and closing', () => { + it('should open and close dropdown on click', fakeAsync(() => { + jest.spyOn(directive, 'show'); + jest.spyOn(directive, 'hide'); + + const buttonEl: HTMLButtonElement = fixture.nativeElement.querySelector('.dropdown-toggle'); + + buttonEl.click(); + fixture.detectChanges(); + + expect(directive.show).toHaveBeenCalled(); + expect(overlayContainerElement.textContent).toContain('Action'); + + buttonEl.click(); + fixture.detectChanges(); + + flush(); + fixture.detectChanges(); + + expect(directive.hide).toHaveBeenCalled(); + expect(overlayContainerElement.textContent).toEqual(''); + })); + + it('should close dropdown on outside click', fakeAsync(() => { + directive.show(); + fixture.detectChanges(); + + document.body.click(); + fixture.detectChanges(); + + flush(); + fixture.detectChanges(); + + expect(overlayContainerElement.textContent).toEqual(''); + })); + + it('should close dropdown on dropdown item click', fakeAsync(() => { + directive.show(); + fixture.detectChanges(); + + const item: HTMLElement = document.querySelector('.dropdown-item'); + + item.click(); + fixture.detectChanges(); + + flush(); + fixture.detectChanges(); + + expect(overlayContainerElement.textContent).toEqual(''); + })); + }); + + describe('Accessibility', () => { + it('should update aria-expanded attribute on dropdown open and close', fakeAsync(() => { + const buttonEl: HTMLButtonElement = fixture.nativeElement.querySelector('.dropdown-toggle'); + + buttonEl.click(); + fixture.detectChanges(); + + expect(buttonEl.getAttribute('aria-expanded')).toBe('true'); + + buttonEl.click(); + fixture.detectChanges(); + flush(); + + expect(buttonEl.getAttribute('aria-expanded')).toContain('false'); + })); + }); + + describe('Keyboard navigation', () => { + it('should correctly focus dropdown items when ArrowUp or ArrowDown key is used', () => { + directive.show(); + fixture.detectChanges(); + + const menu = document.querySelector('.dropdown-menu'); + const items = menu.querySelectorAll('.dropdown-item'); + + document.body.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown' })); + fixture.detectChanges(); + + expect(document.activeElement).toBe(items[0]); + + document.body.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown' })); + fixture.detectChanges(); + + expect(document.activeElement).toBe(items[1]); + + document.body.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp' })); + fixture.detectChanges(); + + expect(document.activeElement).toBe(items[0]); + }); + + it('should focus last option if ArrowUp is used and no item is selected', () => { + directive.show(); + fixture.detectChanges(); + + const menu = document.querySelector('.dropdown-menu'); + const items = menu.querySelectorAll('.dropdown-item'); + + document.body.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp' })); + fixture.detectChanges(); + + expect(document.activeElement).toBe(items[items.length - 1]); + }); + + it('should close dropdown on ESC keyup', fakeAsync(() => { + directive.show(); + fixture.detectChanges(); + + document.dispatchEvent(new KeyboardEvent('keyup', { key: 'Escape' })); + fixture.detectChanges(); + + flush(); + fixture.detectChanges(); + + expect(overlayContainerElement.textContent).toEqual(''); + })); + }); + + describe('Inputs', () => { + it('should not close dropdown on ESC keyup if closeOnEsc input is set to false', fakeAsync(() => { + testComponent.closeOnEsc = false; + directive.show(); + fixture.detectChanges(); + + expect(overlayContainerElement.textContent).toContain('Action'); + + document.dispatchEvent(new KeyboardEvent('keyup', { key: 'Escape' })); + fixture.detectChanges(); + + flush(); + fixture.detectChanges(); + + expect(overlayContainerElement.textContent).toContain('Action'); + })); + + it('should not close dropdown on dropdown item click if closeOnItemClick input is set to false', fakeAsync(() => { + testComponent.closeOnItemClick = false; + directive.show(); + fixture.detectChanges(); + + expect(overlayContainerElement.textContent).toContain('Action'); + + const item: HTMLElement = document.querySelector('.dropdown-item'); + + item.click(); + fixture.detectChanges(); + + flush(); + fixture.detectChanges(); + + expect(overlayContainerElement.textContent).toContain('Action'); + })); + + it('should not close dropdown on outside click if closeOnOutsideClick input is set to false', fakeAsync(() => { + testComponent.closeOnOutsideClick = false; + directive.show(); + fixture.detectChanges(); + + expect(overlayContainerElement.textContent).toContain('Action'); + + document.body.click(); + fixture.detectChanges(); + + flush(); + fixture.detectChanges(); + + expect(overlayContainerElement.textContent).toContain('Action'); + })); + + it('should apply appropriate transform style when offset input is set', () => { + testComponent.offset = 43; + fixture.detectChanges(); + + directive.show(); + fixture.detectChanges(); + + let overlayPane: HTMLDivElement = overlayContainerElement.querySelector('.cdk-overlay-pane'); + expect(overlayPane.style.transform).toBe('translateY(43px)'); + }); + + it('should apply appropriate class when positionClass input is set', () => { + expect(directive.host.classList).toContain('dropdown'); + expect(directive.host.classList).not.toContain('dropup'); + + directive.positionClass = 'dropup'; + + expect(directive.host.classList).not.toContain('dropdown'); + expect(directive.host.classList).toContain('dropup'); + }); + + it('should apply appropriate class when menuPositionClass input is set', () => { + const dropdownMenuDirective: MdbDropdownMenuDirective = directive._dropdownMenu; + expect(dropdownMenuDirective.elementRef.nativeElement.classList).toContain( + 'dropdown-menu-start' + ); + expect(dropdownMenuDirective.elementRef.nativeElement.classList).not.toContain( + 'dropdown-menu-end' + ); + + dropdownMenuDirective.menuPositionClass = 'dropdown-menu-end'; + + expect(dropdownMenuDirective.elementRef.nativeElement.classList).not.toContain( + 'dropdown-menu-start' + ); + expect(dropdownMenuDirective.elementRef.nativeElement.classList).toContain( + 'dropdown-menu-end' + ); + }); + }); + + describe('Outputs', () => { + it('should emit events on show and hide', fakeAsync(() => { + let showDropdown: MdbDropdownDirective | undefined; + let shownDropdown: MdbDropdownDirective | undefined; + let hideDropdown: MdbDropdownDirective | undefined; + let hiddenDropdown: MdbDropdownDirective | undefined; + + const showSpy = jest.spyOn(directive.dropdownShow, 'emit'); + const shownSpy = jest.spyOn(directive.dropdownShown, 'emit'); + const hideSpy = jest.spyOn(directive.dropdownHide, 'emit'); + const hiddenSpy = jest.spyOn(directive.dropdownHidden, 'emit'); + + directive.dropdownShow.pipe(first()).subscribe((event) => (showDropdown = event)); + directive.dropdownShown.pipe(first()).subscribe((event) => (shownDropdown = event)); + directive.dropdownHide.pipe(first()).subscribe((event) => (hideDropdown = event)); + directive.dropdownHidden.pipe(first()).subscribe((event) => (hiddenDropdown = event)); + + directive.show(); + fixture.detectChanges(); + + expect(showSpy).toHaveBeenCalledTimes(1); + expect(showDropdown).toEqual(directive); + + tick(); + + expect(shownSpy).toHaveBeenCalledTimes(1); + expect(shownDropdown).toEqual(directive); + + directive.hide(); + fixture.detectChanges(); + + expect(hideSpy).toHaveBeenCalledTimes(1); + expect(hideDropdown).toEqual(directive); + + tick(); + + expect(hiddenSpy).toHaveBeenCalledTimes(1); + expect(hiddenDropdown).toEqual(directive); + })); + }); + + describe('Public methods', () => { + it('should show dropdown when show method is called', fakeAsync(() => { + expect(overlayContainerElement.textContent).not.toContain('Action'); + + directive.show(); + fixture.detectChanges(); + flush(); + + expect(overlayContainerElement.textContent).toContain('Action'); + })); + + it('should hide dropdown when hide method is called', fakeAsync(() => { + expect(overlayContainerElement.textContent).not.toContain('Action'); + + directive.show(); + fixture.detectChanges(); + flush(); + + expect(overlayContainerElement.textContent).toContain('Action'); + + directive.hide(); + fixture.detectChanges(); + flush(); + fixture.detectChanges(); + + expect(overlayContainerElement.textContent).toEqual(''); + })); + + it('should toggle dropdown when toggle method is called', fakeAsync(() => { + expect(overlayContainerElement.textContent).not.toContain('Action'); + + directive.toggle(); + fixture.detectChanges(); + + expect(overlayContainerElement.textContent).toContain('Action'); + + directive.toggle(); + fixture.detectChanges(); + flush(); + fixture.detectChanges(); + + expect(overlayContainerElement.textContent).toEqual(''); + })); + }); +}); + +@Component({ + selector: 'mdb-dropdown-test', + template: ` +
+ `, + standalone: false, +}) +class TestDropdownComponent { + closeOnOutsideClick = true; + closeOnItemClick = true; + closeOnEsc = true; + offset = 0; +} diff --git a/projects/mdb-angular-ui-kit/dropdown/dropdown.directive.ts b/projects/mdb-angular-ui-kit/dropdown/dropdown.directive.ts new file mode 100644 index 00000000..77c082e9 --- /dev/null +++ b/projects/mdb-angular-ui-kit/dropdown/dropdown.directive.ts @@ -0,0 +1,462 @@ +import { + AfterContentInit, + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ElementRef, + EventEmitter, + Input, + OnDestroy, + Output, + Renderer2, + TemplateRef, + ViewChild, + ViewContainerRef, + booleanAttribute, + numberAttribute, +} from '@angular/core'; +import { + ConnectedPosition, + FlexibleConnectedPositionStrategy, + Overlay, + OverlayConfig, + OverlayPositionBuilder, + OverlayRef, +} from '@angular/cdk/overlay'; +import { TemplatePortal } from '@angular/cdk/portal'; +import { fromEvent, Observable, Subject } from 'rxjs'; +import { filter, takeUntil } from 'rxjs/operators'; +import { ContentChild } from '@angular/core'; +import { MdbDropdownToggleDirective } from './dropdown-toggle.directive'; +import { MdbDropdownMenuDirective } from './dropdown-menu.directive'; +import { animate, state, style, transition, trigger, AnimationEvent } from '@angular/animations'; +import { BreakpointObserver } from '@angular/cdk/layout'; + +export type MdbDropdownPositionClass = 'dropdown' | 'dropup' | 'dropstart' | 'dropend'; + +@Component({ + // eslint-disable-next-line @angular-eslint/component-selector + selector: '[mdbDropdown]', + templateUrl: 'dropdown.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + animations: [ + trigger('fade', [ + state('visible', style({ opacity: 1 })), + state('hidden', style({ opacity: 0 })), + transition('visible => hidden', animate('150ms linear')), + transition('hidden => visible', [style({ opacity: 0 }), animate('150ms linear')]), + ]), + ], + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +export class MdbDropdownDirective implements OnDestroy, AfterContentInit { + @ViewChild('dropdownTemplate') _template: TemplateRef; + @ContentChild(MdbDropdownToggleDirective, { read: ElementRef }) _dropdownToggle: ElementRef; + @ContentChild(MdbDropdownMenuDirective) _dropdownMenu: MdbDropdownMenuDirective; + + @Input({ transform: booleanAttribute }) animation = true; + @Input({ transform: booleanAttribute }) closeOnEsc = true; + @Input({ transform: booleanAttribute }) closeOnItemClick = true; + @Input({ transform: booleanAttribute }) closeOnOutsideClick = true; + @Input({ transform: numberAttribute }) offset = 0; + @Input() + get positionClass(): MdbDropdownPositionClass { + return this._positionClass; + } + set positionClass(newClass: MdbDropdownPositionClass) { + const isSameClass = this.host.classList.contains(newClass); + if (this._positionClass !== newClass && !isSameClass) { + const positionClasses = ['dropdown', 'dropup', 'dropstart', 'dropend']; + positionClasses.forEach((className) => { + this._renderer.removeClass(this.host, className); + }); + this._renderer.addClass(this.host, newClass); + } + this._updateOverlay(); + } + private _positionClass: MdbDropdownPositionClass; + @Input({ transform: booleanAttribute }) withPush = false; + + @Output() dropdownShow: EventEmitter = new EventEmitter(); + @Output() dropdownShown: EventEmitter = new EventEmitter(); + @Output() dropdownHide: EventEmitter = new EventEmitter(); + @Output() dropdownHidden: EventEmitter = new EventEmitter(); + + private _overlayRef: OverlayRef; + private _portal: TemplatePortal; + private _open = false; + private _isDropUp: boolean; + private _isDropStart: boolean; + private _isDropEnd: boolean; + private _isDropdownMenuEnd: boolean; + private _xPosition: string; + private _breakpoints: any; + private _mousedownTarget: HTMLElement | null = null; + + readonly _destroy$: Subject = new Subject(); + + get host(): HTMLElement { + return this._elementRef.nativeElement; + } + + _breakpointSubscription: any; + _animationState = 'hidden'; + + constructor( + private _overlay: Overlay, + private _overlayPositionBuilder: OverlayPositionBuilder, + private _elementRef: ElementRef, + private _vcr: ViewContainerRef, + private _breakpointObserver: BreakpointObserver, + private _cdRef: ChangeDetectorRef, + private _renderer: Renderer2 + ) { + this._breakpoints = { + isSm: this._breakpointObserver.isMatched('(min-width: 576px)'), + isMd: this._breakpointObserver.isMatched('(min-width: 768px)'), + isLg: this._breakpointObserver.isMatched('(min-width: 992px)'), + isXl: this._breakpointObserver.isMatched('(min-width: 1200px)'), + isXxl: this._breakpointObserver.isMatched('(min-width: 1400px)'), + }; + } + + ngAfterContentInit(): void { + this._bindDropdownToggleClick(); + this._listenToMenuPositionClassChange(); + } + + ngOnDestroy(): void { + if (this._overlayRef) { + this._overlayRef.detach(); + this._overlayRef.dispose(); + } + + this._destroy$.next(); + this._destroy$.complete(); + } + + private _bindDropdownToggleClick(): void { + fromEvent(this._dropdownToggle.nativeElement, 'click') + .pipe(takeUntil(this._destroy$)) + .subscribe(() => this.toggle()); + } + + private _listenToMenuPositionClassChange(): void { + this._dropdownMenu.menuPositionClassChanged + .pipe(takeUntil(this._destroy$)) + .subscribe(() => this._updateOverlay()); + } + + private _updateOverlay() { + this._overlayRef?.updatePositionStrategy(this._createPositionStrategy()); + } + + private _createOverlayConfig(): OverlayConfig { + return new OverlayConfig({ + hasBackdrop: false, + scrollStrategy: this._overlay.scrollStrategies.reposition(), + positionStrategy: this._createPositionStrategy(), + }); + } + + private _createOverlay(): void { + this._overlayRef = this._overlay.create(this._createOverlayConfig()); + } + + private _createPositionStrategy(): FlexibleConnectedPositionStrategy { + const positionStrategy = this._overlayPositionBuilder + .flexibleConnectedTo(this._dropdownToggle) + .withPositions(this._getPosition()) + .withFlexibleDimensions(false) + .withPush(this.withPush); + + return positionStrategy; + } + + private _getPosition(): ConnectedPosition[] { + this._isDropUp = this.host.classList.contains('dropup'); + this._isDropStart = this.host.classList.contains('dropstart'); + this._isDropEnd = this.host.classList.contains('dropend'); + this._isDropdownMenuEnd = + this._dropdownMenu.elementRef.nativeElement.classList.contains('dropdown-menu-end'); + this._xPosition = this._isDropdownMenuEnd ? 'end' : 'start'; + + const regex = new RegExp(/dropdown-menu-(sm|md|lg|xl|xxl)-(start|end)/, 'g'); + + const responsiveClass = this._dropdownMenu.elementRef.nativeElement.className.match(regex); + + if (responsiveClass) { + this._subscribeBrakpoints(); + + const positionRegex = new RegExp(/start|end/, 'g'); + const breakpointRegex = new RegExp(/(sm|md|lg|xl|xxl)/, 'g'); + + const dropdownPosition = positionRegex.exec(responsiveClass)[0]; + const breakpoint = breakpointRegex.exec(responsiveClass)[0]; + + switch (true) { + case breakpoint === 'xxl' && this._breakpoints.isXxl: + this._xPosition = dropdownPosition; + break; + case breakpoint === 'xl' && this._breakpoints.isXl: + this._xPosition = dropdownPosition; + break; + case breakpoint === 'lg' && this._breakpoints.isLg: + this._xPosition = dropdownPosition; + break; + case breakpoint === 'md' && this._breakpoints.isMd: + this._xPosition = dropdownPosition; + break; + case breakpoint === 'sm' && this._breakpoints.isSm: + this._xPosition = dropdownPosition; + break; + default: + break; + } + } + + let position; + + const positionDropup = { + originX: this._xPosition, + originY: 'top', + overlayX: this._xPosition, + overlayY: 'bottom', + offsetY: -this.offset, + }; + + const positionDropdown = { + originX: this._xPosition, + originY: 'bottom', + overlayX: this._xPosition, + overlayY: 'top', + offsetY: this.offset, + }; + + const positionDropstart = { + originX: 'start', + originY: 'top', + overlayX: 'end', + overlayY: 'top', + offsetX: this.offset, + }; + + const positionDropend = { + originX: 'end', + originY: 'top', + overlayX: 'start', + overlayY: 'top', + offsetX: -this.offset, + }; + + switch (true) { + case this._isDropEnd: + position = [positionDropend, positionDropstart]; + break; + case this._isDropStart: + position = [positionDropstart, positionDropend]; + break; + case this._isDropUp: + position = [positionDropup, positionDropdown]; + break; + default: + position = [positionDropdown, positionDropup]; + break; + } + + return position; + } + + private _listenToEscKeyup(overlayRef: OverlayRef): Observable { + return fromEvent(document, 'keyup').pipe( + filter((event: KeyboardEvent) => event.key === 'Escape'), + takeUntil(overlayRef.detachments()) + ); + } + + private _listenToMousedown(overlayRef: OverlayRef): Observable { + return fromEvent(document, 'mousedown').pipe(takeUntil(overlayRef.detachments())); + } + + private _listenToClick(overlayRef: OverlayRef, origin: HTMLElement): Observable { + return fromEvent(document, 'click').pipe( + filter((event: MouseEvent) => { + const target = event.target as HTMLElement; + const isInsideMenu = this._dropdownMenu.elementRef.nativeElement.contains(target); + const notTogglerIcon = !this._dropdownToggle.nativeElement.contains(target); + const notCustomContent = + !isInsideMenu || (target.classList && target.classList.contains('dropdown-item')); + const notOrigin = target !== origin; + return notOrigin && notTogglerIcon && notCustomContent; + }), + takeUntil(overlayRef.detachments()) + ); + } + + public onAnimationEnd(event: AnimationEvent): void { + if (event.fromState === 'visible' && event.toState === 'hidden') { + this._overlayRef.detach(); + this._open = false; + + this._renderer.setAttribute(this._dropdownToggle.nativeElement, 'aria-expanded', 'false'); + + this.dropdownHidden.emit(this); + } + + if (event.fromState === 'hidden' && event.toState === 'visible') { + this.dropdownShown.emit(this); + } + } + + private _subscribeBrakpoints(): void { + const brakpoints = [ + '(min-width: 576px)', + '(min-width: 768px)', + '(min-width: 992px)', + '(min-width: 1200px)', + '(min-width: 1400px)', + ]; + + this._breakpointSubscription = this._breakpointObserver + .observe(brakpoints) + .pipe(takeUntil(this._destroy$)) + .subscribe((result) => { + Object.keys(this._breakpoints).forEach((key, index) => { + const brakpointValue = brakpoints[index]; + const newBreakpoint = result.breakpoints[brakpointValue]; + const isBreakpointChanged = newBreakpoint !== this._breakpoints[key]; + + if (!isBreakpointChanged) { + return; + } + + this._breakpoints[key] = newBreakpoint; + + if (this._open) { + this._updateOverlay(); + } + }); + }); + } + + show(): void { + this._cdRef.markForCheck(); + + if (this._open) { + return; + } + + if (!this._overlayRef) { + this._createOverlay(); + } + + this._portal = new TemplatePortal(this._template, this._vcr); + + this.dropdownShow.emit(this); + + this._open = true; + + this._renderer.setAttribute(this._dropdownToggle.nativeElement, 'aria-expanded', 'true'); + + this._overlayRef.attach(this._portal); + + this._listenToEscKeyup(this._overlayRef).subscribe((isEsc) => { + if (isEsc && this.closeOnEsc) { + this.hide(); + } + }); + + this._overlayRef + .keydownEvents() + .pipe(takeUntil(this._overlayRef.detachments())) + .subscribe((event: KeyboardEvent) => { + this._handleKeyboardNavigation(event); + }); + + this._listenToMousedown(this._overlayRef).subscribe((event) => { + this._mousedownTarget = event.target as HTMLElement; + }); + + this._listenToClick(this._overlayRef, this._dropdownToggle.nativeElement).subscribe((event) => { + const target = event.target as HTMLElement; + const isDropdownItem = target.classList && target.classList.contains('dropdown-item'); + + const isOnMousedownDropdownMenu = this._dropdownMenu.elementRef.nativeElement.contains( + this._mousedownTarget + ); + + this._mousedownTarget = null; + + if (this.closeOnItemClick && isDropdownItem) { + this.hide(); + return; + } + if (this.closeOnOutsideClick && !isDropdownItem && !isOnMousedownDropdownMenu) { + this.hide(); + return; + } + }); + + this._animationState = 'visible'; + } + + private _handleKeyboardNavigation(event: KeyboardEvent) { + const items: HTMLElement[] = Array.from( + this._dropdownMenu.elementRef.nativeElement.querySelectorAll('.dropdown-item') + ); + const key = event.key; + const activeElement = this._dropdownMenu.elementRef.nativeElement.ownerDocument.activeElement; + + if (items.length === 0) { + return; + } + + let index = items.indexOf(activeElement); + + switch (key) { + case 'ArrowDown': + event.preventDefault(); + + index = Math.min(index + 1, items.length - 1); + break; + case 'ArrowUp': + event.preventDefault(); + + if (index === -1) { + index = items.length - 1; + break; + } + index = Math.max(index - 1, 0); + break; + } + + const nextActiveElement: HTMLElement = items[index]; + + if (nextActiveElement) { + nextActiveElement.focus(); + } + } + + hide(): void { + this._cdRef.markForCheck(); + + if (!this._open) { + return; + } + + this.dropdownHide.emit(this); + + this._animationState = 'hidden'; + } + + toggle(): void { + this._cdRef.markForCheck(); + + if (this._open) { + this.hide(); + } else { + this.show(); + } + } +} diff --git a/projects/mdb-angular-ui-kit/dropdown/dropdown.module.ts b/projects/mdb-angular-ui-kit/dropdown/dropdown.module.ts new file mode 100644 index 00000000..75211ac9 --- /dev/null +++ b/projects/mdb-angular-ui-kit/dropdown/dropdown.module.ts @@ -0,0 +1,12 @@ +import { MdbDropdownDirective } from './dropdown.directive'; +import { MdbDropdownToggleDirective } from './dropdown-toggle.directive'; +import { MdbDropdownMenuDirective } from './dropdown-menu.directive'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { OverlayModule } from '@angular/cdk/overlay'; +@NgModule({ + imports: [CommonModule, OverlayModule], + declarations: [MdbDropdownDirective, MdbDropdownToggleDirective, MdbDropdownMenuDirective], + exports: [MdbDropdownDirective, MdbDropdownToggleDirective, MdbDropdownMenuDirective], +}) +export class MdbDropdownModule {} diff --git a/projects/mdb-angular-ui-kit/dropdown/index.ts b/projects/mdb-angular-ui-kit/dropdown/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/mdb-angular-ui-kit/dropdown/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/mdb-angular-ui-kit/dropdown/ng-package.json b/projects/mdb-angular-ui-kit/dropdown/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/dropdown/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/dropdown/public_api.ts b/projects/mdb-angular-ui-kit/dropdown/public_api.ts new file mode 100644 index 00000000..2677a6fd --- /dev/null +++ b/projects/mdb-angular-ui-kit/dropdown/public_api.ts @@ -0,0 +1,4 @@ +export { MdbDropdownDirective, MdbDropdownPositionClass } from './dropdown.directive'; +export { MdbDropdownToggleDirective } from './dropdown-toggle.directive'; +export { MdbDropdownMenuDirective } from './dropdown-menu.directive'; +export { MdbDropdownModule } from './dropdown.module'; diff --git a/projects/mdb-angular-ui-kit/forms/form-control.component.html b/projects/mdb-angular-ui-kit/forms/form-control.component.html new file mode 100644 index 00000000..81f48f48 --- /dev/null +++ b/projects/mdb-angular-ui-kit/forms/form-control.component.html @@ -0,0 +1,6 @@ + +
+
+
+
+
diff --git a/projects/mdb-angular-ui-kit/forms/form-control.component.ts b/projects/mdb-angular-ui-kit/forms/form-control.component.ts new file mode 100644 index 00000000..f81ef2aa --- /dev/null +++ b/projects/mdb-angular-ui-kit/forms/form-control.component.ts @@ -0,0 +1,149 @@ +import { + Component, + ChangeDetectionStrategy, + HostBinding, + ViewChild, + ContentChild, + ElementRef, + AfterContentInit, + Renderer2, + OnDestroy, + NgZone, + AfterContentChecked, +} from '@angular/core'; +import { MdbAbstractFormControl } from './form-control'; +import { MdbLabelDirective } from './label.directive'; +import { ContentObserver } from '@angular/cdk/observers'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +@Component({ + selector: 'mdb-form-control', + templateUrl: './form-control.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false, +}) +export class MdbFormControlComponent implements AfterContentInit, AfterContentChecked, OnDestroy { + @ViewChild('notchLeading', { static: true }) _notchLeading: ElementRef; + @ViewChild('notchMiddle', { static: true }) _notchMiddle: ElementRef; + @ContentChild(MdbAbstractFormControl, { static: true }) _formControl: MdbAbstractFormControl; + @ContentChild(MdbLabelDirective, { static: false, read: ElementRef }) _label: ElementRef; + + @HostBinding('class.form-outline') outline = true; + @HostBinding('class.d-block') display = true; + + get input(): HTMLInputElement { + return this._formControl.input; + } + + constructor( + private _renderer: Renderer2, + private _contentObserver: ContentObserver, + private _elementRef: ElementRef, + private _ngZone: NgZone + ) {} + + readonly _destroy$: Subject = new Subject(); + + private _notchLeadingLength = 9; + private _labelMarginLeft = 0; + private _labelGapPadding = 8; + private _labelScale = 0.8; + private _recalculateGapWhenVisible = false; + + private _previousLabel: ElementRef | null = null; + + ngAfterContentInit(): void { + if (this.hasLabel) { + setTimeout(() => { + this._updateBorderGap(); + }, 0); + this._previousLabel = this._label; + } else { + this._renderer.addClass(this.input, 'placeholder-active'); + } + this._updateLabelActiveState(); + + if (this.hasLabel) { + this._contentObserver + .observe(this._label.nativeElement) + .pipe(takeUntil(this._destroy$)) + .subscribe(() => { + this._updateBorderGap(); + }); + } + + this._formControl.stateChanges.pipe(takeUntil(this._destroy$)).subscribe(() => { + this._updateLabelActiveState(); + if (this.hasLabel) { + this._updateBorderGap(); + } + }); + + this._ngZone.runOutsideAngular(() => { + this._ngZone.onStable.pipe(takeUntil(this._destroy$)).subscribe(() => { + if (this.hasLabel && this._recalculateGapWhenVisible) { + this._updateBorderGap(); + } + }); + }); + } + + ngAfterContentChecked(): void { + if (!this._previousLabel && this.hasLabel) { + setTimeout(() => this._updateBorderGap()); + } + this._previousLabel = this._label; + } + + ngOnDestroy(): void { + this._destroy$.next(); + this._destroy$.unsubscribe(); + } + + get hasLabel(): boolean { + return !!this._label; + } + + private _getLabelWidth(): number { + return this._label.nativeElement.clientWidth * this._labelScale + this._labelGapPadding; + } + + private _updateBorderGap(): void { + // Element is in DOM but is not visible, we need to recalculate the gap when element + // is displayed. This problem may occur in components such as tabs where content of + // inactive tabs has display:none styles + + if (this._isHidden()) { + this._recalculateGapWhenVisible = true; + return; + } + + const notchLeadingWidth = `${this._labelMarginLeft + this._notchLeadingLength}px`; + const notchMiddleWidth = `${this._getLabelWidth()}px`; + + this._notchLeading.nativeElement.style.width = notchLeadingWidth; + this._notchMiddle.nativeElement.style.width = notchMiddleWidth; + this._label.nativeElement.style.marginLeft = `${this._labelMarginLeft}px`; + + this._recalculateGapWhenVisible = false; + } + + private _updateLabelActiveState(): void { + if (this._isLabelActive()) { + this._renderer.addClass(this.input, 'active'); + } else { + this._renderer.removeClass(this.input, 'active'); + } + } + + private _isLabelActive(): boolean { + return this._formControl && this._formControl.labelActive; + } + + private _isHidden(): boolean { + const el = this._elementRef.nativeElement; + + return !el.offsetHeight && !el.offsetWidth; + } +} diff --git a/projects/mdb-angular-ui-kit/forms/form-control.spec.ts b/projects/mdb-angular-ui-kit/forms/form-control.spec.ts new file mode 100644 index 00000000..5ea204d3 --- /dev/null +++ b/projects/mdb-angular-ui-kit/forms/form-control.spec.ts @@ -0,0 +1,125 @@ +import { ComponentFixture, fakeAsync, flush, TestBed } from '@angular/core/testing'; +import { Component, DebugElement } from '@angular/core'; +import { By } from '@angular/platform-browser'; +import { MdbFormsModule } from './index'; +import { MdbFormControlComponent } from './form-control.component'; + +describe('MDB Form Control', () => { + let fixture: ComponentFixture; + let wrapper: DebugElement; + let input: DebugElement; + const labelGapPadding = 8; + const labelScale = 0.8; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [BasicFormControlComponent, WithoutLabelComponent, DynamicLabelComponent], + imports: [MdbFormsModule], + teardown: { destroyAfterEach: false }, + }); + + fixture = TestBed.createComponent(BasicFormControlComponent); + fixture.detectChanges(); + wrapper = fixture.debugElement.query(By.directive(MdbFormControlComponent)); + input = fixture.debugElement.query(By.css('input')); + }); + + beforeAll(() => { + Object.defineProperty(HTMLElement.prototype, 'offsetHeight', { configurable: true, value: 20 }); + Object.defineProperty(HTMLElement.prototype, 'offsetWidth', { configurable: true, value: 20 }); + Object.defineProperty(HTMLElement.prototype, 'clientWidth', { configurable: true, value: 20 }); + }); + + it('should add outline class to the wrapper element', () => { + fixture.detectChanges(); + expect(wrapper.nativeElement.classList.contains('form-outline')).toBe(true); + }); + + it('should toggle input active class on value change', () => { + input.nativeElement.value = 'Test'; + fixture.detectChanges(); + expect(input.nativeElement.classList.contains('active')).toBe(true); + }); + + it('should set placeholder-active class on input if label is not defined', () => { + const fixture = TestBed.createComponent(WithoutLabelComponent); + fixture.detectChanges(); + + const input = fixture.nativeElement.querySelector('input'); + + expect(input.classList).toContain('placeholder-active'); + }); + + it('should set top border gap on component init if label is defined', fakeAsync(() => { + const fixture = TestBed.createComponent(BasicFormControlComponent); + fixture.detectChanges(); + + flush(); + fixture.detectChanges(); + const labelWidth = fixture.nativeElement.querySelector('label').clientWidth; + const middleNotch = fixture.nativeElement.querySelector('.form-notch-middle'); + const expectedBorderGap = labelWidth * labelScale + labelGapPadding + 'px'; + + expect(middleNotch.style.width).toEqual(expectedBorderGap); + })); + + it('should update border gap when label is dynamically rendered with *ngIf', fakeAsync(() => { + const fixture = TestBed.createComponent(DynamicLabelComponent); + fixture.detectChanges(); + + let label = fixture.nativeElement.querySelector('label'); + let middleNotch = fixture.nativeElement.querySelector('.form-notch-middle'); + expect(label).toBeNull(); + expect(middleNotch.style.width).toBe(''); + + fixture.componentInstance.showLabel = true; + fixture.detectChanges(); + flush(); + fixture.detectChanges(); + + label = fixture.nativeElement.querySelector('label'); + middleNotch = fixture.nativeElement.querySelector('.form-notch-middle'); + expect(label).not.toBeNull(); + const expectedBorderGap = label.clientWidth * labelScale + labelGapPadding + 'px'; + expect(middleNotch.style.width).toEqual(expectedBorderGap); + })); +}); + +const dynamicLabelTemplate = ` + + + + +`; +@Component({ + template: dynamicLabelTemplate, + standalone: false, +}) +class DynamicLabelComponent { + showLabel = false; +} + +const basicTemplate = ` + + + + +`; + +@Component({ + template: basicTemplate, + standalone: false, +}) +class BasicFormControlComponent {} + +const withoutLabelTemplate = ` + + + +`; + +@Component({ + template: withoutLabelTemplate, + standalone: false, +}) +class WithoutLabelComponent {} diff --git a/projects/mdb-angular-ui-kit/forms/form-control.ts b/projects/mdb-angular-ui-kit/forms/form-control.ts new file mode 100644 index 00000000..a60ad746 --- /dev/null +++ b/projects/mdb-angular-ui-kit/forms/form-control.ts @@ -0,0 +1,10 @@ +import { Observable } from 'rxjs'; +import { Directive } from '@angular/core'; + +@Directive() +// eslint-disable-next-line @angular-eslint/directive-class-suffix +export abstract class MdbAbstractFormControl { + readonly stateChanges: Observable; + readonly input: HTMLInputElement; + readonly labelActive: boolean; +} diff --git a/projects/mdb-angular-ui-kit/forms/forms.module.ts b/projects/mdb-angular-ui-kit/forms/forms.module.ts new file mode 100644 index 00000000..69d9a85e --- /dev/null +++ b/projects/mdb-angular-ui-kit/forms/forms.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { MdbFormControlComponent } from './form-control.component'; +import { MdbInputDirective } from './input.directive'; +import { MdbLabelDirective } from './label.directive'; + +@NgModule({ + declarations: [MdbFormControlComponent, MdbInputDirective, MdbLabelDirective], + exports: [MdbFormControlComponent, MdbInputDirective, MdbLabelDirective], + imports: [CommonModule, FormsModule], +}) +export class MdbFormsModule {} diff --git a/projects/mdb-angular-ui-kit/forms/index.ts b/projects/mdb-angular-ui-kit/forms/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/mdb-angular-ui-kit/forms/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/mdb-angular-ui-kit/forms/input.directive.ts b/projects/mdb-angular-ui-kit/forms/input.directive.ts new file mode 100644 index 00000000..bdc0280f --- /dev/null +++ b/projects/mdb-angular-ui-kit/forms/input.directive.ts @@ -0,0 +1,169 @@ +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { + AfterViewInit, + DestroyRef, + Directive, + DoCheck, + ElementRef, + HostBinding, + HostListener, + Input, + OnDestroy, + Optional, + Renderer2, + Self, +} from '@angular/core'; +import { NgControl } from '@angular/forms'; +import { Subject } from 'rxjs'; +import { MdbAbstractFormControl } from './form-control'; +import { AutofillEvent, AutofillMonitor } from '@angular/cdk/text-field'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbInput]', + exportAs: 'mdbInput', + providers: [{ provide: MdbAbstractFormControl, useExisting: MdbInputDirective }], + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +export class MdbInputDirective + implements MdbAbstractFormControl, DoCheck, AfterViewInit, OnDestroy +{ + constructor( + private _elementRef: ElementRef, + private _renderer: Renderer2, + @Optional() @Self() private _ngControl: NgControl, + private _autofill: AutofillMonitor, + private _destroyRef: DestroyRef + ) {} + + readonly stateChanges: Subject = new Subject(); + + private _focused = false; + private _autofilled = false; + private _color = ''; + + ngAfterViewInit() { + if (typeof getComputedStyle === 'function') { + this._color = getComputedStyle(this._elementRef.nativeElement).color; + + if (this._hasTypeInterferingPlaceholder()) { + this._updateTextColorForDateType(); + } + } + + this._autofill.monitor(this.input).subscribe((event: AutofillEvent) => { + this._autofilled = event.isAutofilled; + this.stateChanges.next(); + }); + + this.stateChanges.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => { + if (this._hasTypeInterferingPlaceholder()) { + this._updateTextColorForDateType(); + } + }); + } + + private _currentNativeValue: any; + + @HostBinding('disabled') + @Input('disabled') + get disabled(): boolean { + if (this._ngControl && this._ngControl.disabled !== null) { + return this._ngControl.disabled; + } + return this._disabled; + } + set disabled(value: boolean) { + this._disabled = coerceBooleanProperty(value); + } + private _disabled = false; + + @Input('readonly') + get readonly(): boolean { + return this._readonly; + } + set readonly(value: boolean) { + if (value) { + this._renderer.setAttribute(this._elementRef.nativeElement, 'readonly', ''); + } else { + this._renderer.removeAttribute(this._elementRef.nativeElement, 'readonly'); + } + this._readonly = coerceBooleanProperty(value); + } + private _readonly = false; + + @Input() + get value(): string { + return this._elementRef.nativeElement.value; + } + set value(value: string) { + if (value !== this.value) { + this._elementRef.nativeElement.value = value; + this._value = value; + this.stateChanges.next(); + } + } + private _value: any; + + private _updateTextColorForDateType() { + const actualColor = getComputedStyle(this._elementRef.nativeElement).color; + this._color = actualColor !== 'rgba(0, 0, 0, 0)' ? actualColor : this._color; + + const color = this.labelActive ? this._color : `transparent`; + + this._renderer.setStyle(this._elementRef.nativeElement, 'color', color); + } + + @HostListener('focus') + _onFocus(): void { + this._focused = true; + this.stateChanges.next(); + } + + @HostListener('blur') + _onBlur(): void { + this._focused = false; + this.stateChanges.next(); + } + + ngDoCheck(): void { + const value = this._elementRef.nativeElement.value; + if (this._currentNativeValue !== value) { + this._currentNativeValue = value; + this.stateChanges.next(); + } + } + + get hasValue(): boolean { + return this._elementRef.nativeElement.value !== ''; + } + + get focused(): boolean { + return this._focused; + } + + get autofilled(): boolean { + return this._autofilled; + } + + get input(): HTMLInputElement { + return this._elementRef.nativeElement; + } + + get labelActive(): boolean { + return this.focused || this.hasValue || this.autofilled; + } + + private _hasTypeInterferingPlaceholder() { + const typesArray = ['date', 'datetime-local', 'time', 'month', 'week']; + return typesArray.includes(this._elementRef.nativeElement.type); + } + + static ngAcceptInputType_disabled: BooleanInput; + static ngAcceptInputType_readonly: BooleanInput; + + ngOnDestroy(): void { + this._autofill.stopMonitoring(this.input); + } +} diff --git a/projects/mdb-angular-ui-kit/forms/input.spec.ts b/projects/mdb-angular-ui-kit/forms/input.spec.ts new file mode 100644 index 00000000..0193f64d --- /dev/null +++ b/projects/mdb-angular-ui-kit/forms/input.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { Component, DebugElement } from '@angular/core'; +import { By } from '@angular/platform-browser'; +import { MdbFormsModule } from './index'; + +describe('MDB Checkbox', () => { + let component: BasicInputComponent; + let fixture: ComponentFixture; + let input: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [BasicInputComponent], + imports: [MdbFormsModule], + teardown: { destroyAfterEach: false }, + }); + + fixture = TestBed.createComponent(BasicInputComponent); + component = fixture.componentInstance; + input = fixture.debugElement.query(By.css('input')); + }); + + it('Should be disabled if disabled input is set to true', () => { + component.disabled = true; + fixture.detectChanges(); + expect(input.nativeElement.disabled).toBe(true); + }); + + it('Should be readonly if readonly input is set to true', () => { + component.readonly = true; + fixture.detectChanges(); + expect(input.nativeElement.hasAttribute('readonly')).toBe(true); + }); +}); + +const basicTemplate = ` + +`; + +@Component({ + selector: 'mdb-input-test', + template: basicTemplate, + standalone: false, +}) +class BasicInputComponent { + disabled = false; + readonly = false; +} diff --git a/projects/mdb-angular-ui-kit/forms/label.directive.ts b/projects/mdb-angular-ui-kit/forms/label.directive.ts new file mode 100644 index 00000000..c277cda2 --- /dev/null +++ b/projects/mdb-angular-ui-kit/forms/label.directive.ts @@ -0,0 +1,12 @@ +import { Directive, ElementRef } from '@angular/core'; + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbLabel]', + exportAs: 'mdbLabel', + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +export class MdbLabelDirective { + constructor() {} +} diff --git a/projects/mdb-angular-ui-kit/forms/ng-package.json b/projects/mdb-angular-ui-kit/forms/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/forms/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/forms/public_api.ts b/projects/mdb-angular-ui-kit/forms/public_api.ts new file mode 100644 index 00000000..4fb2cf87 --- /dev/null +++ b/projects/mdb-angular-ui-kit/forms/public_api.ts @@ -0,0 +1,5 @@ +export { MdbFormControlComponent } from './form-control.component'; +export { MdbInputDirective } from './input.directive'; +export { MdbLabelDirective } from './label.directive'; +export { MdbFormsModule } from './forms.module'; +export { MdbAbstractFormControl } from './form-control'; diff --git a/projects/mdb-angular-ui-kit/index.ts b/projects/mdb-angular-ui-kit/index.ts new file mode 100644 index 00000000..ff8b4c56 --- /dev/null +++ b/projects/mdb-angular-ui-kit/index.ts @@ -0,0 +1 @@ +export default {}; diff --git a/projects/mdb-angular-ui-kit/jest.config.js b/projects/mdb-angular-ui-kit/jest.config.js new file mode 100644 index 00000000..32df13e3 --- /dev/null +++ b/projects/mdb-angular-ui-kit/jest.config.js @@ -0,0 +1,10 @@ +const baseConfig = require('../../jest.config'); + +module.exports = { + ...baseConfig, + globals: { + 'ts-jest': { + tsConfig: '/projects/mdb-angular-ui-kit/tsconfig.spec.json', + }, + }, +}; diff --git a/projects/mdb-angular-ui-kit/modal/index.ts b/projects/mdb-angular-ui-kit/modal/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/mdb-angular-ui-kit/modal/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/mdb-angular-ui-kit/modal/modal-config.ts b/projects/mdb-angular-ui-kit/modal/modal-config.ts new file mode 100644 index 00000000..a8cf3deb --- /dev/null +++ b/projects/mdb-angular-ui-kit/modal/modal-config.ts @@ -0,0 +1,14 @@ +import { ViewContainerRef } from '@angular/core'; + +export class MdbModalConfig { + animation? = true; + backdrop? = true; + ignoreBackdropClick? = false; + keyboard? = true; + modalClass? = ''; + containerClass? = ''; + viewContainerRef?: ViewContainerRef; + data?: D | null = null; + nonInvasive? = false; + focusElementSelector? = ''; +} diff --git a/projects/mdb-angular-ui-kit/modal/modal-container.component.html b/projects/mdb-angular-ui-kit/modal/modal-container.component.html new file mode 100644 index 00000000..c5c752e1 --- /dev/null +++ b/projects/mdb-angular-ui-kit/modal/modal-container.component.html @@ -0,0 +1,9 @@ +
+ +
diff --git a/projects/mdb-angular-ui-kit/modal/modal-container.component.ts b/projects/mdb-angular-ui-kit/modal/modal-container.component.ts new file mode 100644 index 00000000..4ba207b6 --- /dev/null +++ b/projects/mdb-angular-ui-kit/modal/modal-container.component.ts @@ -0,0 +1,338 @@ +import { CdkPortalOutlet, ComponentPortal, TemplatePortal } from '@angular/cdk/portal'; +import { + AfterViewInit, + ChangeDetectionStrategy, + Component, + ComponentRef, + ElementRef, + EmbeddedViewRef, + HostBinding, + HostListener, + Inject, + NgZone, + OnDestroy, + OnInit, + Renderer2, + ViewChild, + DOCUMENT, +} from '@angular/core'; +import { MdbModalConfig } from './modal-config'; +import { ConfigurableFocusTrapFactory, ConfigurableFocusTrap } from '@angular/cdk/a11y'; +import { fromEvent, Subject } from 'rxjs'; +import { filter, takeUntil } from 'rxjs/operators'; + +// width below which, according to css rules, modal position changes - modal gets position relative instead of absolute. +const MODAL_CSS_BREAKPOINT = 992; +const MODAL_OPEN_CLASS = 'modal-open'; +const NON_INVASIVE_CLASS = 'modal-non-invasive-open'; +const NON_INVASIVE_SHOW_CLASS = 'modal-non-invasive-show'; + +@Component({ + selector: 'mdb-modal-container', + templateUrl: 'modal-container.component.html', + changeDetection: ChangeDetectionStrategy.Default, + standalone: false, +}) +export class MdbModalContainerComponent implements OnInit, AfterViewInit, OnDestroy { + @ViewChild(CdkPortalOutlet, { static: true }) _portalOutlet: CdkPortalOutlet; + @ViewChild('dialog', { static: true }) modalDialog: ElementRef; + @ViewChild('content', { static: true }) modalContent: ElementRef; + + readonly _destroy$: Subject = new Subject(); + readonly backdropClick$: Subject = new Subject(); + + _config: MdbModalConfig; + + BACKDROP_TRANSITION = 150; + MODAL_TRANSITION = 200; + NON_INVASIVE_TRANSITION = 450; + + private _previouslyFocusedElement: HTMLElement; + private _focusTrap: ConfigurableFocusTrap; + + @HostBinding('class.modal') modal = true; + @HostBinding('class.fade') + get hasAnimation(): boolean { + return this._config.animation; + } + + @HostListener('window:resize', ['$event']) + onWindowResize() { + this._ngZone.runOutsideAngular(() => { + if (this._config.nonInvasive) { + this._handleWindowResize(); + } + }); + } + + get host(): HTMLElement { + return this._elementRef.nativeElement; + } + + private _isScrollable = false; + private _isBottomRight = false; + private _isBottomLeft = false; + private _isTopRight = false; + private _isTopLeft = false; + private _isSideTopModal = false; + private _isSideBottomModal = false; + private _isSideModal = false; + private _isModalBottom = false; + private _modalContentRect: null | DOMRectReadOnly; + private _modalContentComputedStyles: null | CSSStyleDeclaration; + private _modalDialogComputedStyles: null | CSSStyleDeclaration; + private _topOffset = 0; + private _leftOffset = 0; + private _rightOffset = 0; + private _bottomOffset = 0; + + constructor( + @Inject(DOCUMENT) private _document, + public _elementRef: ElementRef, + private _renderer: Renderer2, + private _focusTrapFactory: ConfigurableFocusTrapFactory, + private _ngZone: NgZone + ) {} + + ngOnInit(): void { + this._updateContainerClass(); + this._renderer.setStyle(this.host, 'display', 'block'); + + if (!this._config.nonInvasive) { + this._focusTrap = this._focusTrapFactory.create(this.host); + this._previouslyFocusedElement = this._document.activeElement as HTMLElement; + } + const focusElement = + this._config.focusElementSelector && + (this.modalContent.nativeElement.querySelector( + this._config.focusElementSelector + ) as HTMLElement); + if (this._config.animation) { + setTimeout(() => { + this._renderer.addClass(this.host, 'show'); + if (focusElement) { + setTimeout(() => { + focusElement.focus(); + }, this.MODAL_TRANSITION); + } else { + setTimeout(() => { + this._focusTrap?.focusInitialElementWhenReady(); + }, this.MODAL_TRANSITION); + } + }, this.BACKDROP_TRANSITION); + } else if (focusElement) { + focusElement.focus(); + } else { + this._focusTrap?.focusInitialElementWhenReady(); + } + } + + ngAfterViewInit(): void { + const widthWithVerticalScroll = this._document.body.offsetWidth; + this._renderer.addClass(this._document.body, MODAL_OPEN_CLASS); + + if (this._config.nonInvasive) { + this._renderer.addClass(this._document.body, NON_INVASIVE_CLASS); + setTimeout(() => { + this._onNonInvasiveModalShown(); + }, this.NON_INVASIVE_TRANSITION); + } + + if (!this._config.nonInvasive) { + this._renderer.setStyle(this._document.body, 'overflow', 'hidden'); + } + + const widthWithoutVerticalScroll = this._document.body.offsetWidth; + + if (!this._config.nonInvasive) { + this._renderer.setStyle( + this._document.body, + 'padding-right', + `${widthWithoutVerticalScroll - widthWithVerticalScroll}px` + ); + } + + if (!this._config.ignoreBackdropClick && !this._config.nonInvasive) { + fromEvent(this.host, 'mousedown') + .pipe( + filter((event: MouseEvent) => { + const target = event.target as HTMLElement; + const dialog = this.modalDialog.nativeElement; + const notDialog = target !== dialog; + const notDialogContent = !dialog.contains(target); + return notDialog && notDialogContent; + }), + takeUntil(this._destroy$) + ) + .subscribe((event: MouseEvent) => { + this.backdropClick$.next(event); + }); + } + } + + ngOnDestroy(): void { + this._previouslyFocusedElement?.focus(); + this._focusTrap?.destroy(); + + this._destroy$.next(); + this._destroy$.complete(); + } + + private _updateContainerClass(): void { + if ( + this._config.containerClass === '' || + (this._config.containerClass.length && this._config.containerClass.length === 0) + ) { + return; + } + + const containerClasses = this._config.containerClass.split(' '); + + containerClasses.forEach((containerClass) => { + this._renderer.addClass(this.host, containerClass); + }); + } + + private _onNonInvasiveModalShown() { + this._isScrollable = this._config.modalClass.includes('modal-dialog-scrollable'); + this._isBottomRight = this._config.modalClass.includes('modal-bottom-right'); + this._isBottomLeft = this._config.modalClass.includes('modal-bottom-left'); + this._isTopRight = this._config.modalClass.includes('modal-top-right'); + this._isTopLeft = this._config.modalClass.includes('modal-top-left'); + this._isModalBottom = this._config.modalClass.includes('modal-bottom'); + this._isSideTopModal = this._isTopLeft || this._isTopRight; + this._isSideBottomModal = this._isBottomLeft || this._isBottomRight; + this._isSideModal = this._isSideTopModal || this._isSideBottomModal; + this._modalContentRect = this.modalContent.nativeElement.getBoundingClientRect(); + this._modalContentComputedStyles = window.getComputedStyle(this.modalContent.nativeElement); + this._modalDialogComputedStyles = window.getComputedStyle(this.modalDialog.nativeElement); + this._topOffset = parseInt(this._modalDialogComputedStyles.top, 0); + this._leftOffset = parseInt(this._modalDialogComputedStyles.left, 0); + this._rightOffset = parseInt(this._modalDialogComputedStyles.right, 0); + this._bottomOffset = parseInt(this._modalDialogComputedStyles.bottom, 0); + + this._renderer.addClass(this.host, NON_INVASIVE_SHOW_CLASS); + this._setNonInvasiveStyles(); + } + + private _setNonInvasiveStyles(leftOffset = 0, topOffset = 0) { + const isAboveBreakpoint = window.innerWidth >= MODAL_CSS_BREAKPOINT; + this._renderer.setStyle(this.host, 'left', `${this._modalContentRect.left + leftOffset}px`); + this._renderer.setStyle(this.host, 'width', this._modalContentComputedStyles.width); + + if (!this._isScrollable) { + // If the modal content is not long enough to require scroll shrink the modal wrapper to + // the height of modal content so other elements on site are clickable outside modal + this._renderer.setStyle(this.host, 'height', this._modalContentComputedStyles.height); + this._renderer.setStyle(this.host, 'display', ''); + } + + if (isAboveBreakpoint) { + if (this._isSideBottomModal || this._isModalBottom) { + // Force modal to correct bottom placement. It's needed because modal host has position + // fixed and fixed height. + this._renderer.setStyle(this.host, 'top', `${this._modalContentRect.top + topOffset}px`); + } + + if (this._isSideModal) { + // Enable horizontal scrolling when the content is wider than the modal's fixed width + this._renderer.setStyle(this.host, 'overflowX', 'auto'); + } + } + + if (!isAboveBreakpoint) { + this.host.style.height = ''; + } + } + + _onNonInvasiveModalHidden() { + this._renderer.removeClass(this.host, NON_INVASIVE_SHOW_CLASS); + this._resetNonInvasiveStyles(); + this._removeNonInvasiveClass(); + } + + private _resetNonInvasiveStyles() { + this._renderer.setStyle(this.host, 'left', ''); + this._renderer.setStyle(this.host, 'top', ''); + this._renderer.setStyle(this.host, 'height', ''); + this._renderer.setStyle(this.host, 'width', ''); + + if (!this._isScrollable) { + this._renderer.setStyle(this.host, 'display', ''); + } + + if (this._isSideModal) { + this._renderer.setStyle(this.host, 'overflowX', ''); + } + } + + private _removeNonInvasiveClass() { + const isOtherModalOpen = this._document.body.querySelector( + '.modal.show.modal-non-invasive-show' + ); + if (!isOtherModalOpen) { + this._renderer.removeClass(this._document.body, NON_INVASIVE_CLASS); + } else { + this._renderer.addClass(this._document.body, MODAL_OPEN_CLASS); + } + } + + private _handleWindowResize() { + const modalContent = this.host.querySelector('.modal-content'); + this._resetNonInvasiveStyles(); + + this._modalContentRect = modalContent.getBoundingClientRect(); + this._modalContentComputedStyles = window.getComputedStyle(modalContent); + + if (this._isSideTopModal || this._isSideBottomModal) { + let sideOffset = 0; + let topOffset = 0; + if (this._isBottomRight || this._isBottomLeft) { + topOffset = -this._bottomOffset; + } + if (this._isBottomRight || this._isTopRight) { + sideOffset = -this._rightOffset; + } + if (this._isBottomLeft || this._isTopLeft) { + sideOffset = this._leftOffset; + } + + this._setNonInvasiveStyles(sideOffset, topOffset); + } else { + this._setNonInvasiveStyles(); + } + } + + _close(): void { + if (this._config.animation) { + this._renderer.removeClass(this.host, 'show'); + } + + // Pause iframe/video when closing modal + const iframeElements = Array.from(this.host.querySelectorAll('iframe')); + const videoElements = Array.from(this.host.querySelectorAll('video')); + + iframeElements.forEach((iframe: HTMLIFrameElement) => { + const srcAttribute: any = iframe.getAttribute('src'); + this._renderer.setAttribute(iframe, 'src', srcAttribute); + }); + + videoElements.forEach((video: HTMLVideoElement) => { + video.pause(); + }); + } + + _restoreScrollbar(): void { + this._renderer.removeClass(this._document.body, MODAL_OPEN_CLASS); + this._renderer.removeStyle(this._document.body, 'overflow'); + this._renderer.removeStyle(this._document.body, 'padding-right'); + } + + attachComponentPortal(portal: ComponentPortal): ComponentRef { + return this._portalOutlet.attachComponentPortal(portal); + } + + attachTemplatePortal(portal: TemplatePortal): EmbeddedViewRef { + return this._portalOutlet.attachTemplatePortal(portal); + } +} diff --git a/projects/mdb-angular-ui-kit/modal/modal-ref.ts b/projects/mdb-angular-ui-kit/modal/modal-ref.ts new file mode 100644 index 00000000..8293199a --- /dev/null +++ b/projects/mdb-angular-ui-kit/modal/modal-ref.ts @@ -0,0 +1,27 @@ +import { OverlayRef } from '@angular/cdk/overlay'; +import { Observable, Subject } from 'rxjs'; +import { MdbModalContainerComponent } from './modal-container.component'; + +export class MdbModalRef { + constructor(protected _overlayRef: OverlayRef, private _container: MdbModalContainerComponent) {} + + component: T; + + private readonly onClose$: Subject = new Subject(); + readonly onClose: Observable = this.onClose$.asObservable(); + + close(message?: any): void { + this._container._close(); + + setTimeout(() => { + if (this._container._config.nonInvasive) { + this._container._onNonInvasiveModalHidden(); + } + this._container._restoreScrollbar(); + this.onClose$.next(message); + this.onClose$.complete(); + this._overlayRef.detach(); + this._overlayRef.dispose(); + }, this._container.MODAL_TRANSITION); + } +} diff --git a/projects/mdb-angular-ui-kit/modal/modal.module.ts b/projects/mdb-angular-ui-kit/modal/modal.module.ts new file mode 100644 index 00000000..8775961b --- /dev/null +++ b/projects/mdb-angular-ui-kit/modal/modal.module.ts @@ -0,0 +1,14 @@ +import { CommonModule } from '@angular/common'; +import { OverlayModule } from '@angular/cdk/overlay'; +import { PortalModule } from '@angular/cdk/portal'; +import { NgModule } from '@angular/core'; +import { MdbModalContainerComponent } from './modal-container.component'; +import { MdbModalService } from './modal.service'; + +@NgModule({ + imports: [CommonModule, OverlayModule, PortalModule], + exports: [MdbModalContainerComponent], + declarations: [MdbModalContainerComponent], + providers: [MdbModalService], +}) +export class MdbModalModule {} diff --git a/projects/mdb-angular-ui-kit/modal/modal.service.ts b/projects/mdb-angular-ui-kit/modal/modal.service.ts new file mode 100644 index 00000000..0b28823e --- /dev/null +++ b/projects/mdb-angular-ui-kit/modal/modal.service.ts @@ -0,0 +1,144 @@ +import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay'; +import { ComponentPortal, ComponentType, TemplatePortal } from '@angular/cdk/portal'; + +import { + Inject, + Injectable, + Injector, + StaticProvider, + TemplateRef, + ChangeDetectorRef, + DOCUMENT, +} from '@angular/core'; +import { fromEvent } from 'rxjs'; +import { filter, take } from 'rxjs/operators'; +import { MdbModalConfig } from './modal-config'; +import { MdbModalContainerComponent } from './modal-container.component'; +import { MdbModalRef } from './modal-ref'; + +@Injectable() +export class MdbModalService { + constructor( + @Inject(DOCUMENT) private _document, + private _overlay: Overlay, + private _injector: Injector + ) {} + + open( + componentOrTemplateRef: ComponentType | TemplateRef, + config?: MdbModalConfig + ): MdbModalRef { + const defaultConfig = new MdbModalConfig(); + config = config ? Object.assign(defaultConfig, config) : defaultConfig; + + const overlayRef = this._createOverlay(config); + const container = this._createContainer(overlayRef, config); + const modalRef = this._createContent(componentOrTemplateRef, container, overlayRef, config); + + this._registerListeners(modalRef, config, container); + + return modalRef; + } + + private _createOverlay(config: MdbModalConfig): OverlayRef { + const overlayConfig = this._getOverlayConfig(config); + return this._overlay.create(overlayConfig); + } + + private _getOverlayConfig(modalConfig: MdbModalConfig): OverlayConfig { + const config = new OverlayConfig({ + positionStrategy: this._overlay.position().global(), + scrollStrategy: this._overlay.scrollStrategies.noop(), + hasBackdrop: modalConfig.nonInvasive ? false : modalConfig.backdrop, + backdropClass: 'mdb-backdrop', + }); + + return config; + } + + private _createContainer( + overlayRef: OverlayRef, + config: MdbModalConfig + ): MdbModalContainerComponent { + const portal = new ComponentPortal(MdbModalContainerComponent, null, this._injector); + const containerRef = overlayRef.attach(portal); + containerRef.instance._config = config; + + containerRef.changeDetectorRef.detectChanges(); + + return containerRef.instance; + } + + private _createContent( + componentOrTemplate: ComponentType | TemplateRef, + container: MdbModalContainerComponent, + overlayRef: OverlayRef, + config: MdbModalConfig + ): MdbModalRef { + const modalRef: MdbModalRef = new MdbModalRef(overlayRef, container); + + if (componentOrTemplate instanceof TemplateRef) { + container.attachTemplatePortal( + new TemplatePortal(componentOrTemplate, null, { + $implicit: config.data, + modalRef, + } as any) + ); + } else { + const injector = this._createInjector(config, modalRef, container); + const contentRef = container.attachComponentPortal( + new ComponentPortal(componentOrTemplate, config.viewContainerRef, injector) + ); + + if (config.data) { + Object.assign(contentRef.instance, { ...config.data }); + } + + modalRef.component = contentRef.instance; + } + + return modalRef; + } + + private _createInjector( + config: MdbModalConfig, + modalRef: MdbModalRef, + container: MdbModalContainerComponent + ): Injector { + const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector; + + // The dialog container should be provided as the dialog container and the dialog's + // content are created out of the same `ViewContainerRef` and as such, are siblings + // for injector purposes. To allow the hierarchy that is expected, the dialog + // container is explicitly provided in the injector. + const providers: StaticProvider[] = [ + { provide: MdbModalContainerComponent, useValue: container }, + { provide: MdbModalRef, useValue: modalRef }, + ]; + + return Injector.create({ parent: userInjector || this._injector, providers }); + } + + private _registerListeners( + modalRef: MdbModalRef, + config: MdbModalConfig, + container: MdbModalContainerComponent + ): void { + container.backdropClick$.pipe(take(1)).subscribe(() => { + modalRef.close(); + }); + + if (config.keyboard) { + fromEvent(container._elementRef.nativeElement, 'keydown') + .pipe( + filter((event: KeyboardEvent) => { + return event.key === 'Escape'; + }), + take(1) + ) + .subscribe(() => { + modalRef.close(); + }); + } + } +} diff --git a/projects/mdb-angular-ui-kit/modal/modal.spec.ts b/projects/mdb-angular-ui-kit/modal/modal.spec.ts new file mode 100644 index 00000000..7f67a9c0 --- /dev/null +++ b/projects/mdb-angular-ui-kit/modal/modal.spec.ts @@ -0,0 +1,324 @@ +import { ComponentFixture, fakeAsync, flush, inject, TestBed, tick } from '@angular/core/testing'; +import { OverlayContainer } from '@angular/cdk/overlay'; + +import { MdbModalModule } from './modal.module'; +import { MdbModalService } from './modal.service'; +import { Component, NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; + +@Component({ + template: ` + + + + `, + providers: [MdbModalService], + standalone: false, +}) +class BasicModalComponent { + constructor(public modal: MdbModalService) {} + + mainView = true; + + setView(isMain) { + this.mainView = isMain; + } +} + +@NgModule({ + declarations: [BasicModalComponent], + imports: [BrowserModule], +}) +class TestModalModule {} + +describe('MDB Modal', () => { + let modal: MdbModalService; + let overlayContainer: OverlayContainer; + let overlayContainerElement: HTMLElement; + let fixture: ComponentFixture; + + beforeEach(fakeAsync(() => { + const module = TestBed.configureTestingModule({ + imports: [MdbModalModule, TestModalModule], + teardown: { destroyAfterEach: false }, + }); + + TestBed.compileComponents(); + fixture = module.createComponent(BasicModalComponent); + })); + + beforeEach(inject( + [MdbModalService, OverlayContainer], + (mdbModal: MdbModalService, oc: OverlayContainer) => { + modal = mdbModal; + overlayContainer = oc; + overlayContainerElement = oc.getContainerElement(); + } + )); + + afterEach(() => { + overlayContainer.ngOnDestroy(); + }); + + it('should open a modal with a specified component', () => { + modal.open(BasicModalComponent); + + expect(overlayContainerElement.textContent).toContain('Modal title'); + + const modalContainer = overlayContainerElement.querySelector('mdb-modal-container'); + expect(modalContainer).not.toBe(null); + }); + + it('should correctly add container classes', fakeAsync(() => { + modal.open(BasicModalComponent, { + containerClass: 'top', + }); + + fixture.detectChanges(); + tick(350); + + const modalContainer = overlayContainerElement.querySelector('mdb-modal-container'); + expect(modalContainer.classList.contains('top')).toBe(true); + })); + + it('should correctly add modal classes', fakeAsync(() => { + modal.open(BasicModalComponent, { + modalClass: 'modal-top-right', + }); + + fixture.detectChanges(); + tick(350); + + const modalContainer = overlayContainerElement.querySelector('mdb-modal-container'); + const modalDialog = modalContainer.querySelector('.modal-dialog'); + expect(modalDialog.classList.contains('modal-top-right')).toBe(true); + })); + + it('should close the modal on backdrop click', fakeAsync(() => { + modal.open(BasicModalComponent); + + fixture.detectChanges(); + tick(350); + + let modalContainer = overlayContainerElement.querySelector( + 'mdb-modal-container' + ) as HTMLElement; + expect(modalContainer).not.toBe(null); + + const event = new MouseEvent('mousedown', { clientX: 0, clientY: 0 }); + modalContainer.dispatchEvent(event); + + fixture.detectChanges(); + tick(700); + + modalContainer = overlayContainerElement.querySelector('mdb-modal-container') as HTMLElement; + + expect(modalContainer).toBe(null); + })); + + it('should not close the modal on mousedown inside modal, move mouse outside modal and mouseup', fakeAsync(() => { + modal.open(BasicModalComponent); + + fixture.detectChanges(); + tick(350); + + let modalContainer = overlayContainerElement.querySelector( + 'mdb-modal-container' + ) as HTMLElement; + let modalContent = overlayContainerElement.querySelector('.modal-content') as HTMLElement; + + expect(modalContainer).not.toBe(null); + expect(modalContent).not.toBe(null); + + const mousedownEvent = new MouseEvent('mousedown', { clientX: 0, clientY: 0 }); + const mouseupEvent = new MouseEvent('mouseup', { clientX: 0, clientY: 0 }); + + modalContent.dispatchEvent(mousedownEvent); + modalContainer.dispatchEvent(mouseupEvent); + + fixture.detectChanges(); + tick(700); + + modalContainer = overlayContainerElement.querySelector('mdb-modal-container') as HTMLElement; + modalContent = overlayContainerElement.querySelector('.modal-content') as HTMLElement; + + expect(modalContent).not.toBe(null); + expect(modalContainer).not.toBe(null); + })); + + it('should not close the modal on backdrop click if ignoreBackdropClick is set to true', fakeAsync(() => { + modal.open(BasicModalComponent, { + ignoreBackdropClick: true, + }); + + fixture.detectChanges(); + tick(350); + + let modalContainer = overlayContainerElement.querySelector('mdb-modal-container'); + expect(modalContainer).not.toBe(null); + + const event = new MouseEvent('mousedown'); + modalContainer.dispatchEvent(event); + + fixture.detectChanges(); + tick(700); + + modalContainer = overlayContainerElement.querySelector('mdb-modal-container'); + + expect(modalContainer).not.toBe(null); + })); + + it('should close on escape press if keyboard option is true', fakeAsync(() => { + modal.open(BasicModalComponent, { + keyboard: true, + }); + + fixture.detectChanges(); + tick(350); + + let modalContainer = overlayContainerElement.querySelector('mdb-modal-container'); + expect(modalContainer).not.toBe(null); + + const event = new KeyboardEvent('keydown', { key: 'Escape' }); + modalContainer.dispatchEvent(event); + + fixture.detectChanges(); + tick(700); + + modalContainer = overlayContainerElement.querySelector('mdb-modal-container'); + + expect(modalContainer).toBe(null); + })); + + it('should not close on escape press if keyboard option is false', fakeAsync(() => { + modal.open(BasicModalComponent, { + keyboard: false, + }); + + let modalContainer = overlayContainerElement.querySelector('mdb-modal-container'); + expect(modalContainer).not.toBe(null); + + const event = new KeyboardEvent('keydown', { key: 'Escape' }); + modalContainer.dispatchEvent(event); + + fixture.detectChanges(); + tick(700); + + modalContainer = overlayContainerElement.querySelector('mdb-modal-container'); + + expect(modalContainer).not.toBe(null); + })); + + it('should not close when click on btn inside modal', fakeAsync(() => { + modal.open(BasicModalComponent); + + fixture.detectChanges(); + tick(700); + + let modalContainer = overlayContainerElement.querySelector('mdb-modal-container'); + let mainView = modalContainer.querySelector('#main-view'); + let notMainView = modalContainer.querySelector('#not-main-view'); + let mainViewToggler = modalContainer.querySelector('#main-view-toggler'); + let notMainViewToggler = modalContainer.querySelector('#not-main-view-toggler'); + + expect(modalContainer).not.toBe(null); + expect(mainView).not.toBe(null); + expect(notMainView).toBe(null); + expect(mainViewToggler).not.toBe(null); + expect(notMainViewToggler).toBe(null); + + mainViewToggler.dispatchEvent(new MouseEvent('click')); + + fixture.detectChanges(); + tick(700); + + modalContainer = overlayContainerElement.querySelector('mdb-modal-container'); + mainView = modalContainer.querySelector('#main-view'); + notMainView = modalContainer.querySelector('#not-main-view'); + mainViewToggler = modalContainer.querySelector('#main-view-toggler'); + notMainViewToggler = modalContainer.querySelector('#not-main-view-toggler'); + + expect(modalContainer).not.toBe(null); + expect(mainView).toBe(null); + expect(notMainView).not.toBe(null); + expect(mainViewToggler).toBe(null); + expect(notMainViewToggler).not.toBe(null); + })); +}); + +describe('MDB Non-invasive Modal', () => { + let modal: MdbModalService; + let overlayContainer: OverlayContainer; + let overlayContainerElement: HTMLElement; + let fixture: ComponentFixture; + + beforeEach(fakeAsync(() => { + const module = TestBed.configureTestingModule({ + imports: [MdbModalModule, TestModalModule], + teardown: { destroyAfterEach: false }, + }); + + TestBed.compileComponents(); + fixture = module.createComponent(BasicModalComponent); + })); + + beforeEach(inject( + [MdbModalService, OverlayContainer], + (mdbModal: MdbModalService, oc: OverlayContainer) => { + modal = mdbModal; + overlayContainer = oc; + overlayContainerElement = oc.getContainerElement(); + } + )); + + afterEach(() => { + overlayContainer.ngOnDestroy(); + }); + + it('should add non-invasive class', fakeAsync(() => { + modal.open(BasicModalComponent, { + nonInvasive: true, + }); + + fixture.detectChanges(); + flush(); + + fixture.detectChanges(); + tick(350); + + const body = document.body; + const modalContainer = overlayContainerElement.querySelector('mdb-modal-container'); + expect(body.classList.contains('modal-non-invasive-open')).toBe(true); + expect(modalContainer.classList.contains('modal-non-invasive-show')).toBe(true); + })); + + it('should not apply padding-right style to document body', fakeAsync(() => { + modal.open(BasicModalComponent, { + nonInvasive: true, + }); + + fixture.detectChanges(); + flush(); + + fixture.detectChanges(); + tick(350); + + const body = document.body; + expect(body.style.paddingRight).toBe('0px'); + })); +}); diff --git a/projects/mdb-angular-ui-kit/modal/ng-package.json b/projects/mdb-angular-ui-kit/modal/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/modal/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/modal/public_api.ts b/projects/mdb-angular-ui-kit/modal/public_api.ts new file mode 100644 index 00000000..58191971 --- /dev/null +++ b/projects/mdb-angular-ui-kit/modal/public_api.ts @@ -0,0 +1,5 @@ +export { MdbModalConfig } from './modal-config'; +export { MdbModalRef } from './modal-ref'; +export { MdbModalContainerComponent } from './modal-container.component'; +export { MdbModalService } from './modal.service'; +export { MdbModalModule } from './modal.module'; diff --git a/projects/mdb-angular-ui-kit/ng-package.json b/projects/mdb-angular-ui-kit/ng-package.json new file mode 100644 index 00000000..fc74550a --- /dev/null +++ b/projects/mdb-angular-ui-kit/ng-package.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/mdb-angular-ui-kit", + "lib": { + "entryFile": "index.ts" + }, + "assets": ["./assets/**/*", "./CHANGELOG.md", "./License.pdf"] +} diff --git a/projects/mdb-angular-ui-kit/package.json b/projects/mdb-angular-ui-kit/package.json new file mode 100644 index 00000000..0fb8a0de --- /dev/null +++ b/projects/mdb-angular-ui-kit/package.json @@ -0,0 +1,24 @@ +{ + "name": "mdb-angular-ui-kit", + "repository": "https://github.com/mdbootstrap/mdb-angular-ui-kit", + "homepage": "https://mdbootstrap.com/docs/b5/angular/", + "author": "MDBootstrap", + "license": "MIT", + "version": "9.0.0", + "peerDependencies": { + "@angular/common": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/animations": "^20.0.0", + "@angular/forms": "^20.0.0", + "@angular/cdk": "^20.0.0" + }, + "schematics": "./schematics/collection.json", + "dependencies": { + "tslib": "^2.0.0" + }, + "exports": { + "./assets/scss/mdb.scss": { + "sass": "./assets/scss/mdb.scss" + } + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/popover/index.ts b/projects/mdb-angular-ui-kit/popover/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/mdb-angular-ui-kit/popover/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/mdb-angular-ui-kit/popover/ng-package.json b/projects/mdb-angular-ui-kit/popover/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/popover/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/popover/popover.component.html b/projects/mdb-angular-ui-kit/popover/popover.component.html new file mode 100644 index 00000000..99d4df76 --- /dev/null +++ b/projects/mdb-angular-ui-kit/popover/popover.component.html @@ -0,0 +1,19 @@ +
+

+ {{ title }} +

+
+ +
+
+ {{ content }} +
+
diff --git a/projects/mdb-angular-ui-kit/popover/popover.component.ts b/projects/mdb-angular-ui-kit/popover/popover.component.ts new file mode 100644 index 00000000..c3bdfab0 --- /dev/null +++ b/projects/mdb-angular-ui-kit/popover/popover.component.ts @@ -0,0 +1,50 @@ +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + Input, + TemplateRef, + booleanAttribute, +} from '@angular/core'; +import { trigger, style, animate, transition, state, AnimationEvent } from '@angular/animations'; +import { Subject } from 'rxjs'; +@Component({ + selector: 'mdb-popover', + templateUrl: 'popover.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + animations: [ + trigger('fade', [ + state('visible', style({ opacity: 1 })), + state('hidden', style({ opacity: 0 })), + transition('visible <=> hidden', animate('150ms linear')), + transition(':enter', animate('150ms linear')), + ]), + ], + standalone: false, +}) +export class MdbPopoverComponent { + @Input({ transform: booleanAttribute }) animation: boolean; + @Input() content: string | TemplateRef; + @Input() context: any; + @Input() title: string; + + get isContentTemplate(): boolean { + return this.content instanceof TemplateRef; + } + + readonly _hidden: Subject = new Subject(); + + animationState = 'hidden'; + + constructor(private _cdRef: ChangeDetectorRef) {} + + markForCheck(): void { + this._cdRef.markForCheck(); + } + + onAnimationEnd(event: AnimationEvent): void { + if (event.toState === 'hidden') { + this._hidden.next(); + } + } +} diff --git a/projects/mdb-angular-ui-kit/popover/popover.directive.spec.ts b/projects/mdb-angular-ui-kit/popover/popover.directive.spec.ts new file mode 100644 index 00000000..a7f091ed --- /dev/null +++ b/projects/mdb-angular-ui-kit/popover/popover.directive.spec.ts @@ -0,0 +1,241 @@ +import { ComponentFixture, TestBed, fakeAsync, flush } from '@angular/core/testing'; +import { Component } from '@angular/core'; +import { MdbPopoverModule } from './index'; +import { MdbPopoverDirective } from './popover.directive'; +import { By } from '@angular/platform-browser'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; + +describe('MDB Popover', () => { + describe('after init', () => { + let fixture: ComponentFixture; + let element: any; + let component: any; + let directive: any; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [MdbPopoverModule, NoopAnimationsModule], + declarations: [TestPopoverComponent], + teardown: { destroyAfterEach: false }, + }); + fixture = TestBed.createComponent(TestPopoverComponent); + component = fixture.componentInstance; + element = fixture.nativeElement; + fixture.detectChanges(); + }); + + it('should create the component', () => { + expect(component).toBeTruthy(); + }); + + it('should open tooltip after mouseenter and close after mouseout', () => { + fixture.detectChanges(); + + directive = fixture.debugElement + .query(By.directive(MdbPopoverDirective)) + .injector.get(MdbPopoverDirective) as MdbPopoverDirective; + + const onOpen = jest.spyOn(directive, 'show'); + const onClose = jest.spyOn(directive, 'hide'); + + const buttonEl = element.querySelector('button'); + + buttonEl.dispatchEvent(new Event('mouseenter')); + fixture.detectChanges(); + + expect(directive.show).toHaveBeenCalled(); + + directive._open = true; + buttonEl.dispatchEvent(new Event('mouseleave')); + fixture.detectChanges(); + + expect(directive.hide).toHaveBeenCalled(); + }); + + it('should set popover header and title', () => { + jest.useFakeTimers(); + const buttonEl = fixture.nativeElement.querySelector('button'); + + buttonEl.dispatchEvent(new Event('mouseenter')); + jest.runAllTimers(); + + fixture.detectChanges(); + const popoverContent = document.querySelector('.popover-body').textContent; + const popoverTitle = document.querySelector('.popover-header').textContent; + + expect(popoverContent).toMatch(component.testMdbPopover); + expect(popoverTitle).toMatch(component.testMdbPopoverTitle); + }); + + it('should set placement', () => { + jest.useFakeTimers(); + const buttonEl = fixture.nativeElement.querySelector('button'); + + buttonEl.dispatchEvent(new Event('mouseenter')); + jest.runAllTimers(); + + fixture.detectChanges(); + directive = fixture.debugElement + .query(By.directive(MdbPopoverDirective)) + .injector.get(MdbPopoverDirective) as MdbPopoverDirective; + + const placement = directive._overlayRef._config.positionStrategy._lastPosition.originY; + expect(placement).toMatch('top'); + }); + }); + + describe('onInit', () => { + it('should open/close tooltip after click', () => { + let fixture: ComponentFixture; + let directive: any; + let component: any; + let element: any; + + TestBed.configureTestingModule({ + imports: [MdbPopoverModule, NoopAnimationsModule], + declarations: [TestPopoverComponent2], + teardown: { destroyAfterEach: false }, + }); + fixture = TestBed.createComponent(TestPopoverComponent2); + component = fixture.componentInstance; + element = fixture.nativeElement; + fixture.detectChanges(); + + directive = fixture.debugElement + .query(By.directive(MdbPopoverDirective)) + .injector.get(MdbPopoverDirective) as MdbPopoverDirective; + + const onOpen = jest.spyOn(directive, 'show'); + const onClose = jest.spyOn(directive, 'hide'); + + const buttonEl = fixture.nativeElement.querySelector('button'); + + buttonEl.dispatchEvent(new Event('click')); + fixture.detectChanges(); + + expect(directive.show).toHaveBeenCalled(); + + directive._open = true; + buttonEl.dispatchEvent(new Event('click')); + fixture.detectChanges(); + + expect(directive.hide).toHaveBeenCalled(); + }); + + it('should prevent open', () => { + let fixture: ComponentFixture; + let directive: any; + let component: any; + let element: any; + + TestBed.configureTestingModule({ + imports: [MdbPopoverModule, NoopAnimationsModule], + declarations: [TestPopoverComponent3], + teardown: { destroyAfterEach: false }, + }); + fixture = TestBed.createComponent(TestPopoverComponent3); + component = fixture.componentInstance; + element = fixture.nativeElement; + fixture.detectChanges(); + + directive = fixture.debugElement + .query(By.directive(MdbPopoverDirective)) + .injector.get(MdbPopoverDirective) as MdbPopoverDirective; + + const onOpen = jest.spyOn(directive, 'show'); + + const buttonEl = fixture.nativeElement.querySelector('button'); + + buttonEl.dispatchEvent(new Event('click')); + fixture.detectChanges(); + + expect(directive.show).not.toHaveBeenCalled(); + }); + }); + + describe('custom template', () => { + let fixture: ComponentFixture; + let element: any; + let component: any; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [MdbPopoverModule, NoopAnimationsModule], + declarations: [TestPopoverComponent4], + teardown: { destroyAfterEach: false }, + }); + fixture = TestBed.createComponent(TestPopoverComponent4); + component = fixture.componentInstance; + element = fixture.nativeElement; + fixture.detectChanges(); + }); + + it('should set custom content with context data', fakeAsync(() => { + const buttonEl = element.querySelector('button'); + buttonEl.click(); + fixture.detectChanges(); + flush(); + const popoverBody = document.querySelector('.popover-body'); + expect(popoverBody.textContent).toBe('Current user: John Doe'); + })); + }); +}); + +@Component({ + selector: 'mdb-test-tooltip', + template: ` `, + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +class TestPopoverComponent { + testTrigger = 'hover'; + testMdbPopover = 'popoverTitle'; + testMdbPopoverTitle = 'popoverTitle'; + testPlacement = 'top'; + testDisabled = false; +} + +@Component({ + selector: 'mdb-test-popover2', + template: ` `, + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +class TestPopoverComponent2 {} + +@Component({ + selector: 'mdb-test-popover2', + template: ` `, + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +class TestPopoverComponent3 {} + +@Component({ + selector: 'mdb-test-popover4', + template: ` + Current user: {{ person.name }} {{ person.surname }}`, + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +class TestPopoverComponent4 {} diff --git a/projects/mdb-angular-ui-kit/popover/popover.directive.ts b/projects/mdb-angular-ui-kit/popover/popover.directive.ts new file mode 100644 index 00000000..e76db104 --- /dev/null +++ b/projects/mdb-angular-ui-kit/popover/popover.directive.ts @@ -0,0 +1,243 @@ +import { + ComponentRef, + Directive, + ElementRef, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, + TemplateRef, + booleanAttribute, + numberAttribute, +} from '@angular/core'; +import { + ConnectedPosition, + Overlay, + OverlayConfig, + OverlayPositionBuilder, + OverlayRef, +} from '@angular/cdk/overlay'; +import { ComponentPortal } from '@angular/cdk/portal'; +import { MdbPopoverComponent } from './popover.component'; +import { fromEvent, Subject } from 'rxjs'; +import { first, takeUntil } from 'rxjs/operators'; +import { MdbPopoverPosition } from './popover.types'; + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbPopover]', + exportAs: 'mdbPopover', + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +export class MdbPopoverDirective implements OnInit, OnDestroy { + @Input({ transform: booleanAttribute }) animation = true; + @Input({ transform: numberAttribute }) delayHide = 0; + @Input({ transform: numberAttribute }) delayShow = 0; + @Input() mdbPopover: TemplateRef | string = ''; + @Input() mdbPopoverData: any; + @Input() mdbPopoverTitle = ''; + @Input({ transform: numberAttribute }) offset = 4; + @Input() placement: MdbPopoverPosition = 'top'; + @Input({ transform: booleanAttribute }) popoverDisabled = false; + @Input() trigger = 'click'; + + @Output() popoverShow = new EventEmitter(); + @Output() popoverShown = new EventEmitter(); + @Output() popoverHide = new EventEmitter(); + @Output() popoverHidden = new EventEmitter(); + + private _overlayRef: OverlayRef; + private _tooltipRef: ComponentRef; + private _open = false; + private _showTimeout: any = 0; + private _hideTimeout: any = 0; + + readonly _destroy$: Subject = new Subject(); + + constructor( + private _overlay: Overlay, + private _overlayPositionBuilder: OverlayPositionBuilder, + private _elementRef: ElementRef + ) {} + + ngOnInit(): void { + if (this.popoverDisabled || (this.mdbPopover === '' && this.mdbPopoverTitle === '')) { + return; + } + + this._bindTriggerEvents(); + } + + ngOnDestroy(): void { + if (this._open) { + this.hide(); + } + + this._destroy$.next(); + this._destroy$.complete(); + } + + private _bindTriggerEvents(): void { + const triggers = this.trigger.split(' '); + + triggers.forEach((trigger) => { + if (trigger === 'click') { + fromEvent(this._elementRef.nativeElement, trigger) + .pipe(takeUntil(this._destroy$)) + .subscribe(() => this.toggle()); + } else if (trigger !== 'manual') { + const evIn = trigger === 'hover' ? 'mouseenter' : 'focusin'; + const evOut = trigger === 'hover' ? 'mouseleave' : 'focusout'; + + fromEvent(this._elementRef.nativeElement, evIn) + .pipe(takeUntil(this._destroy$)) + .subscribe(() => this.show()); + fromEvent(this._elementRef.nativeElement, evOut) + .pipe(takeUntil(this._destroy$)) + .subscribe(() => this.hide()); + } + }); + } + + private _createOverlayConfig(): OverlayConfig { + const positionStrategy = this._overlayPositionBuilder + .flexibleConnectedTo(this._elementRef) + .withPositions(this._getPosition()) + .withPush(false); + const overlayConfig = new OverlayConfig({ + hasBackdrop: false, + scrollStrategy: this._overlay.scrollStrategies.reposition(), + positionStrategy, + }); + + return overlayConfig; + } + + private _createOverlay(): void { + this._overlayRef = this._overlay.create(this._createOverlayConfig()); + } + + private _getPosition(): ConnectedPosition[] { + let position; + + const positionTop = { + originX: 'center', + originY: 'top', + overlayX: 'center', + overlayY: 'bottom', + offsetY: -this.offset, + }; + + const positionBottom = { + originX: 'center', + originY: 'bottom', + overlayX: 'center', + overlayY: 'top', + offsetY: this.offset, + }; + + const positionRight = { + originX: 'end', + originY: 'center', + overlayX: 'start', + overlayY: 'center', + offsetX: this.offset, + }; + + const positionLeft = { + originX: 'start', + originY: 'center', + overlayX: 'end', + overlayY: 'center', + offsetX: -this.offset, + }; + + switch (this.placement) { + case 'top': + position = [positionTop, positionBottom]; + break; + case 'bottom': + position = [positionBottom, positionTop]; + break; + case 'left': + position = [positionLeft, positionRight, positionTop, positionBottom]; + break; + case 'right': + position = [positionRight, positionLeft, positionTop, positionBottom]; + break; + default: + break; + } + + return position; + } + + show(): void { + if (this._hideTimeout) { + this._overlayRef.detach(); + clearTimeout(this._hideTimeout); + this._hideTimeout = null; + } + + this._createOverlay(); + + if (this._hideTimeout) { + clearTimeout(this._hideTimeout); + this._hideTimeout = null; + } + + this._showTimeout = setTimeout(() => { + const tooltipPortal = new ComponentPortal(MdbPopoverComponent); + + this.popoverShow.emit(this); + this._open = true; + + this._tooltipRef = this._overlayRef.attach(tooltipPortal); + + this._tooltipRef.instance.content = this.mdbPopover; + this._tooltipRef.instance.title = this.mdbPopoverTitle; + this._tooltipRef.instance.animation = this.animation; + this._tooltipRef.instance.context = this.mdbPopoverData; + this._tooltipRef.instance.animationState = 'visible'; + this._tooltipRef.instance.markForCheck(); + + this.popoverShown.emit(this); + }, this.delayShow); + } + + hide(): void { + if (this._showTimeout) { + clearTimeout(this._showTimeout); + this._showTimeout = null; + } else { + return; + } + + this._hideTimeout = setTimeout(() => { + this.popoverHide.emit(this); + if (!this._tooltipRef) { + this._overlayRef.detach(); + this._open = false; + this.popoverHidden.emit(this); + } else { + this._tooltipRef.instance._hidden.pipe(first()).subscribe(() => { + this._overlayRef.detach(); + this._open = false; + this.popoverHidden.emit(this); + }); + this._tooltipRef.instance.animationState = 'hidden'; + this._tooltipRef.instance.markForCheck(); + } + }, this.delayHide); + } + + toggle(): void { + if (this._open) { + this.hide(); + } else { + this.show(); + } + } +} diff --git a/projects/mdb-angular-ui-kit/popover/popover.module.ts b/projects/mdb-angular-ui-kit/popover/popover.module.ts new file mode 100644 index 00000000..e5315adc --- /dev/null +++ b/projects/mdb-angular-ui-kit/popover/popover.module.ts @@ -0,0 +1,12 @@ +import { MdbPopoverDirective } from './popover.directive'; +import { NgModule } from '@angular/core'; +import { OverlayModule } from '@angular/cdk/overlay'; +import { CommonModule } from '@angular/common'; +import { MdbPopoverComponent } from './popover.component'; + +@NgModule({ + imports: [CommonModule, OverlayModule], + declarations: [MdbPopoverDirective, MdbPopoverComponent], + exports: [MdbPopoverDirective, MdbPopoverComponent], +}) +export class MdbPopoverModule {} diff --git a/projects/mdb-angular-ui-kit/popover/popover.types.ts b/projects/mdb-angular-ui-kit/popover/popover.types.ts new file mode 100644 index 00000000..4648f6bf --- /dev/null +++ b/projects/mdb-angular-ui-kit/popover/popover.types.ts @@ -0,0 +1 @@ +export type MdbPopoverPosition = 'top' | 'right' | 'bottom' | 'left'; diff --git a/projects/mdb-angular-ui-kit/popover/public_api.ts b/projects/mdb-angular-ui-kit/popover/public_api.ts new file mode 100644 index 00000000..946952a3 --- /dev/null +++ b/projects/mdb-angular-ui-kit/popover/public_api.ts @@ -0,0 +1,4 @@ +export { MdbPopoverDirective } from './popover.directive'; +export { MdbPopoverModule } from './popover.module'; +export { MdbPopoverPosition } from './popover.types'; +export { MdbPopoverComponent } from './popover.component'; diff --git a/projects/mdb-angular-ui-kit/radio/index.ts b/projects/mdb-angular-ui-kit/radio/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/mdb-angular-ui-kit/radio/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/mdb-angular-ui-kit/radio/ng-package.json b/projects/mdb-angular-ui-kit/radio/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/radio/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/radio/public_api.ts b/projects/mdb-angular-ui-kit/radio/public_api.ts new file mode 100644 index 00000000..67dd43dd --- /dev/null +++ b/projects/mdb-angular-ui-kit/radio/public_api.ts @@ -0,0 +1,3 @@ +export { MdbRadioDirective } from './radio-button.directive'; +export { MdbRadioGroupDirective, MDB_RADIO_GROUP_VALUE_ACCESSOR } from './radio-group.directive'; +export { MdbRadioModule } from './radio.module'; diff --git a/projects/mdb-angular-ui-kit/radio/radio-button.directive.ts b/projects/mdb-angular-ui-kit/radio/radio-button.directive.ts new file mode 100644 index 00000000..a311fcf9 --- /dev/null +++ b/projects/mdb-angular-ui-kit/radio/radio-button.directive.ts @@ -0,0 +1,77 @@ +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { Directive, HostBinding, Input } from '@angular/core'; + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbRadio]', + standalone: false, +}) +export class MdbRadioDirective { + @Input() + get name(): string { + return this._name; + } + set name(value: string) { + this._name = value; + } + private _name: string; + + @Input('checked') + get checked(): boolean { + return this._checked; + } + set checked(value: boolean) { + this._checked = coerceBooleanProperty(value); + } + private _checked = false; + + @Input('value') + get value(): any { + return this._value; + } + set value(value: any) { + this._value = value; + } + private _value: any = null; + + @Input('disabled') + get disabled(): boolean { + return this._disabled; + } + set disabled(value: boolean) { + this._disabled = coerceBooleanProperty(value); + } + private _disabled = false; + + @HostBinding('disabled') + get isDisabled(): boolean { + return this._disabled; + } + + @HostBinding('checked') + get isChecked(): boolean { + return this._checked; + } + + @HostBinding('attr.name') + get nameAttr(): string { + return this.name; + } + + constructor() {} + + _updateName(value: string): void { + this._name = value; + } + + _updateChecked(value: boolean): void { + this._checked = value; + } + + _updateDisabledState(value: boolean): void { + this._disabled = value; + } + + static ngAcceptInputType_checked: BooleanInput; + static ngAcceptInputType_disabled: BooleanInput; +} diff --git a/projects/mdb-angular-ui-kit/radio/radio-group.directive.spec.ts b/projects/mdb-angular-ui-kit/radio/radio-group.directive.spec.ts new file mode 100644 index 00000000..95dce45a --- /dev/null +++ b/projects/mdb-angular-ui-kit/radio/radio-group.directive.spec.ts @@ -0,0 +1,76 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { Component } from '@angular/core'; +import { MdbRadioModule } from './index'; + +describe('MDB Checkbox', () => { + let component: BasicRadioGroupComponent; + let fixture: ComponentFixture; + let nativeElement: HTMLElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [BasicRadioGroupComponent], + imports: [MdbRadioModule], + teardown: { destroyAfterEach: false }, + }); + + fixture = TestBed.createComponent(BasicRadioGroupComponent); + component = fixture.componentInstance; + nativeElement = fixture.elementRef.nativeElement; + }); + + it('Should disable all inputs if the group is disabled', () => { + component.disabled = true; + fixture.detectChanges(); + const inputs = nativeElement.querySelectorAll('input'); + + expect(inputs[0].disabled).toBe(true); + expect(inputs[1].disabled).toBe(true); + }); + + it('Should set inputs name to the group name', () => { + component.name = 'test name'; + fixture.detectChanges(); + const inputs = nativeElement.querySelectorAll('input'); + + expect(inputs[0].getAttribute('name')).toBe('test name'); + expect(inputs[1].getAttribute('name')).toBe('test name'); + }); +}); + +const basicTemplate = ` +
+
+ + +
+ +
+ + +
+
+`; + +@Component({ + selector: 'mdb-radio-group-test', + template: basicTemplate, + standalone: false, +}) +class BasicRadioGroupComponent { + checked = false; + name = 'mdb-radio-group'; + disabled = false; +} diff --git a/projects/mdb-angular-ui-kit/radio/radio-group.directive.ts b/projects/mdb-angular-ui-kit/radio/radio-group.directive.ts new file mode 100644 index 00000000..fb1bf8fd --- /dev/null +++ b/projects/mdb-angular-ui-kit/radio/radio-group.directive.ts @@ -0,0 +1,128 @@ +import { + AfterContentInit, + ContentChildren, + Directive, + forwardRef, + Input, + OnDestroy, + QueryList, +} from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { from, Subject } from 'rxjs'; +import { startWith, switchMap, takeUntil } from 'rxjs/operators'; +import { MdbRadioDirective } from './radio-button.directive'; + +export const MDB_RADIO_GROUP_VALUE_ACCESSOR: any = { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MdbRadioGroupDirective), + multi: true, +}; + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbRadioGroup]', + providers: [MDB_RADIO_GROUP_VALUE_ACCESSOR], + standalone: false, +}) +export class MdbRadioGroupDirective implements ControlValueAccessor, AfterContentInit, OnDestroy { + @ContentChildren(MdbRadioDirective, { descendants: true }) radios: QueryList; + + @Input() + get value(): any { + return this._value; + } + set value(value: any) { + this._value = value; + if (this.radios) { + this._updateChecked(); + } + } + private _value: any; + + @Input() + get name(): string { + return this._name; + } + set name(name: string) { + this._name = name; + if (this.radios) { + this._updateNames(); + } + } + private _name: string; + + @Input() + get disabled(): boolean { + return this._disabled; + } + set disabled(disabled: boolean) { + this._disabled = disabled; + + if (this.radios) { + this._updateDisabled(); + } + } + private _disabled = false; + + private _destroy$ = new Subject(); + + onChange = (_: any) => {}; + onTouched = () => {}; + + ngAfterContentInit(): void { + this._updateNames(); + this._updateDisabled(); + + this.radios.changes + .pipe( + startWith(this.radios), + switchMap((radios: QueryList) => from(Promise.resolve(radios))), + takeUntil(this._destroy$) + ) + .subscribe(() => this._updateRadiosState()); + } + + ngOnDestroy(): void { + this._destroy$.next(); + this._destroy$.complete(); + } + + private _updateRadiosState(): void { + this._updateNames(); + this._updateChecked(); + this._updateDisabled(); + } + + private _updateNames(): void { + this.radios.forEach((radio: MdbRadioDirective) => radio._updateName(this.name)); + } + + private _updateChecked(): void { + this.radios.forEach((radio: MdbRadioDirective) => { + const isChecked = radio.value === this._value; + radio._updateChecked(isChecked); + }); + } + + private _updateDisabled(): void { + this.radios.forEach((radio: MdbRadioDirective) => radio._updateDisabledState(this._disabled)); + } + + // Control value accessor methods + registerOnChange(fn: (value: any) => any): void { + this.onChange = fn; + } + + registerOnTouched(fn: () => any): void { + this.onTouched = fn; + } + + setDisabledState(isDisabled: boolean): void { + this._disabled = isDisabled; + this._updateDisabled(); + } + + writeValue(value: any): void { + this.value = value; + } +} diff --git a/projects/mdb-angular-ui-kit/radio/radio.directive.spec.ts b/projects/mdb-angular-ui-kit/radio/radio.directive.spec.ts new file mode 100644 index 00000000..6ba75e5c --- /dev/null +++ b/projects/mdb-angular-ui-kit/radio/radio.directive.spec.ts @@ -0,0 +1,73 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { Component } from '@angular/core'; +import { MdbRadioModule } from './index'; + +describe('MDB Checkbox', () => { + let component: BasicRadioComponent; + let fixture: ComponentFixture; + let nativeElement: HTMLElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [BasicRadioComponent], + imports: [MdbRadioModule], + teardown: { destroyAfterEach: false }, + }); + + fixture = TestBed.createComponent(BasicRadioComponent); + component = fixture.componentInstance; + nativeElement = fixture.elementRef.nativeElement; + }); + + it('Should disable input element if disabled is set to true', () => { + component.disabled = true; + fixture.detectChanges(); + const input = nativeElement.querySelector('input'); + + expect(input.hasAttribute('disabled')).toBe(true); + }); + + it('Should correctly update name attribute', () => { + component.name = 'test name'; + fixture.detectChanges(); + + const input = nativeElement.querySelector('input'); + + expect(input.getAttribute('name')).toBe('test name'); + }); + + it('Should correctly update input checked state', () => { + component.checked = true; + fixture.detectChanges(); + + const input = nativeElement.querySelector('input'); + + expect(input.checked).toBe(true); + }); +}); + +const basicTemplate = ` +
+ + +
+`; + +@Component({ + selector: 'mdb-radio-test', + template: basicTemplate, + standalone: false, +}) +class BasicRadioComponent { + checked = false; + name = 'mdb-radio'; + disabled = false; +} diff --git a/projects/mdb-angular-ui-kit/radio/radio.module.ts b/projects/mdb-angular-ui-kit/radio/radio.module.ts new file mode 100644 index 00000000..a265ecd4 --- /dev/null +++ b/projects/mdb-angular-ui-kit/radio/radio.module.ts @@ -0,0 +1,12 @@ +import { MdbRadioDirective } from './radio-button.directive'; +import { MdbRadioGroupDirective } from './radio-group.directive'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +@NgModule({ + declarations: [MdbRadioDirective, MdbRadioGroupDirective], + exports: [MdbRadioDirective, MdbRadioGroupDirective], + imports: [CommonModule, FormsModule], +}) +export class MdbRadioModule {} diff --git a/projects/mdb-angular-ui-kit/range/index.ts b/projects/mdb-angular-ui-kit/range/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/mdb-angular-ui-kit/range/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/mdb-angular-ui-kit/range/ng-package.json b/projects/mdb-angular-ui-kit/range/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/range/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/range/public_api.ts b/projects/mdb-angular-ui-kit/range/public_api.ts new file mode 100644 index 00000000..6d843762 --- /dev/null +++ b/projects/mdb-angular-ui-kit/range/public_api.ts @@ -0,0 +1,2 @@ +export { MdbRangeModule } from './range.module'; +export { MdbRangeComponent } from './range.component'; diff --git a/projects/mdb-angular-ui-kit/range/range.component.html b/projects/mdb-angular-ui-kit/range/range.component.html new file mode 100644 index 00000000..9672cce9 --- /dev/null +++ b/projects/mdb-angular-ui-kit/range/range.component.html @@ -0,0 +1,27 @@ + +
+ + + {{ value }} + +
diff --git a/projects/mdb-angular-ui-kit/range/range.component.spec.ts b/projects/mdb-angular-ui-kit/range/range.component.spec.ts new file mode 100644 index 00000000..99d20f5d --- /dev/null +++ b/projects/mdb-angular-ui-kit/range/range.component.spec.ts @@ -0,0 +1,101 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ComponentFixture, fakeAsync, flush, TestBed, tick } from '@angular/core/testing'; +import { MdbRangeModule } from './range.module'; +import { MdbRangeComponent } from './range.component'; +import { UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; +import { By } from '@angular/platform-browser'; + +const template = ` + +`; + +@Component({ + selector: 'mdb-range-test', + template, + standalone: false, +}) +class TestRangeComponent implements OnInit { + @ViewChild(MdbRangeComponent) _range: MdbRangeComponent; + + rangeControl = new UntypedFormControl(50); + ngOnInit(): void { + this.rangeControl.valueChanges.subscribe((val) => console.log(val)); + } +} + +describe('MDB Range', () => { + let fixture: ComponentFixture; + let component: any; + let mdbRange: any; + let thumb: any; + let valueThumb: any; + let input: any; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [TestRangeComponent], + imports: [MdbRangeModule, ReactiveFormsModule], + teardown: { destroyAfterEach: false }, + }); + fixture = TestBed.createComponent(TestRangeComponent); + fixture.detectChanges(); + component = fixture.componentInstance; + mdbRange = fixture.debugElement.query(By.css('mdb-range')); + thumb = fixture.debugElement.query(By.css('.thumb')); + valueThumb = fixture.debugElement.query(By.css('.thumb-value')); + input = fixture.debugElement.query(By.css('input')); + }); + + it('should show thumb on mousedown and hide on mauseup', fakeAsync(() => { + expect(thumb.nativeElement.classList.contains('thumb-active')).toBe(false); + + input.nativeElement.dispatchEvent(new MouseEvent('mousedown')); + + fixture.detectChanges(); + flush(); + + expect(thumb.nativeElement.classList.contains('thumb-active')).toBe(true); + + input.nativeElement.dispatchEvent(new MouseEvent('mouseup')); + + fixture.detectChanges(); + flush(); + + expect(thumb.nativeElement.classList.contains('thumb-active')).toBe(false); + })); + + it('should show input value', () => { + fixture.detectChanges(); + + expect(document.querySelector('.thumb')).not.toBe(null); + expect(valueThumb.nativeElement.textContent).toBe(input.nativeElement.value); + }); + + it('should update thumb value after input', () => { + input.nativeElement.value = 24; + input.nativeElement.dispatchEvent(new Event('input')); + fixture.detectChanges(); + + expect(valueThumb.nativeElement.textContent).toBe('24'); + }); + + it('should update value after set new FormControl', () => { + component.rangeControl = new UntypedFormControl(60); + fixture.detectChanges(); + + expect(valueThumb.nativeElement.textContent).toBe('60'); + expect(input.nativeElement.value).toBe('60'); + }); + + it('should update thumb position', fakeAsync(() => { + const initialThumbStyle = { ...component._range.thumbStyle }; + + component.rangeControl = new UntypedFormControl(70); + + fixture.detectChanges(); + flush(); + const newThumbStyle = { ...component._range.thumbStyle }; + + expect(initialThumbStyle.left).not.toBe(newThumbStyle.left); + })); +}); diff --git a/projects/mdb-angular-ui-kit/range/range.component.ts b/projects/mdb-angular-ui-kit/range/range.component.ts new file mode 100644 index 00000000..b1f1f024 --- /dev/null +++ b/projects/mdb-angular-ui-kit/range/range.component.ts @@ -0,0 +1,134 @@ +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { + AfterViewInit, + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ElementRef, + EventEmitter, + forwardRef, + HostListener, + Input, + Output, + ViewChild, +} from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; + +export const RANGE_VALUE_ACCESOR: any = { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MdbRangeComponent), + multi: true, +}; +@Component({ + selector: 'mdb-range', + templateUrl: 'range.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [RANGE_VALUE_ACCESOR], + standalone: false, +}) +export class MdbRangeComponent implements ControlValueAccessor, AfterViewInit { + @ViewChild('input') input: ElementRef; + @ViewChild('thumb') thumb: ElementRef; + @ViewChild('thumbValue') thumbValue: ElementRef; + + @Input() id: string; + @Input() required: boolean; + @Input() name: string; + @Input() value: string; + + @Input() + get disabled(): boolean { + return this._disabled; + } + set disabled(value: boolean) { + this._disabled = coerceBooleanProperty(value); + } + private _disabled: boolean; + + @Input() label: string; + @Input() min = 0; + @Input() max = 100; + @Input() step: number; + + @Input() + get default(): boolean { + return this._default; + } + set default(value: boolean) { + this._default = value; + } + private _default: boolean; + + @Input() defaultRangeCounterClass: string; + + @Output() rangeValueChange = new EventEmitter(); + + public visibility = false; + public thumbStyle: any; + + @HostListener('change', ['$event']) onchange(event: any): void { + this.onChange(event.target.value); + } + + @HostListener('input') onInput(): void { + this.rangeValueChange.emit({ value: this.value }); + this.focusRangeInput(); + } + + constructor(private _cdRef: ChangeDetectorRef) {} + + ngAfterViewInit(): void { + this.thumbPositionUpdate(); + this._cdRef.detectChanges(); + } + + focusRangeInput(): void { + this.input.nativeElement.focus(); + this.visibility = true; + } + + blurRangeInput(): void { + this.input.nativeElement.blur(); + this.visibility = false; + } + + thumbPositionUpdate(): void { + const rangeInput = this.input.nativeElement; + const inputValue = rangeInput.value; + const minValue = rangeInput.min ? rangeInput.min : 0; + const maxValue = rangeInput.max ? rangeInput.max : 100; + const newValue = Number(((inputValue - minValue) * 100) / (maxValue - minValue)); + + this.value = inputValue; + this.thumbStyle = { left: `calc(${newValue}% + (${8 - newValue * 0.15}px))` }; + } + + // Control Value Accessor Methods + onChange = (_: any) => {}; + onTouched = () => {}; + + writeValue(value: any): void { + this.value = value; + + this._cdRef.markForCheck(); + + setTimeout(() => { + this.thumbPositionUpdate(); + }, 0); + } + + registerOnChange(fn: (_: any) => void): void { + this.onChange = fn; + } + + registerOnTouched(fn: () => void): void { + this.onTouched = fn; + } + + setDisabledState(isDisabled: boolean): void { + this.disabled = isDisabled; + } + + static ngAcceptInputType_default: BooleanInput; + static ngAcceptInputType_disabled: BooleanInput; +} diff --git a/projects/mdb-angular-ui-kit/range/range.module.ts b/projects/mdb-angular-ui-kit/range/range.module.ts new file mode 100644 index 00000000..3347ea45 --- /dev/null +++ b/projects/mdb-angular-ui-kit/range/range.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { MdbRangeComponent } from './range.component'; + +@NgModule({ + imports: [CommonModule, FormsModule], + declarations: [MdbRangeComponent], + exports: [MdbRangeComponent], +}) +export class MdbRangeModule {} diff --git a/projects/mdb-angular-ui-kit/ripple/index.ts b/projects/mdb-angular-ui-kit/ripple/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/mdb-angular-ui-kit/ripple/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/mdb-angular-ui-kit/ripple/ng-package.json b/projects/mdb-angular-ui-kit/ripple/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/ripple/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/ripple/public_api.ts b/projects/mdb-angular-ui-kit/ripple/public_api.ts new file mode 100644 index 00000000..bcab2457 --- /dev/null +++ b/projects/mdb-angular-ui-kit/ripple/public_api.ts @@ -0,0 +1,2 @@ +export { MdbRippleDirective } from './ripple.directive'; +export { MdbRippleModule } from './ripple.module'; diff --git a/projects/mdb-angular-ui-kit/ripple/ripple-utils.spec.ts b/projects/mdb-angular-ui-kit/ripple/ripple-utils.spec.ts new file mode 100644 index 00000000..a6c57d99 --- /dev/null +++ b/projects/mdb-angular-ui-kit/ripple/ripple-utils.spec.ts @@ -0,0 +1,119 @@ +import { colorToRGB, durationToMsNumber, getDiameter } from './ripple-utils'; + +describe('Ripple utils', () => { + const DEFAULT_RIPPLE_COLOR = [0, 0, 0]; + + it('should convert seconds string to miliseconds in number format', () => { + expect(durationToMsNumber('5s')).toEqual(5000); + }); + + it('should convert miliseconds string to miliseconds in number format', () => { + expect(durationToMsNumber('3000ms')).toEqual(3000); + }); + + it('should convert hex color to rgb', () => { + expect(colorToRGB('#c953d6')).toEqual([201, 83, 214]); + }); + + it('should convert short hex color to rgb', () => { + expect(colorToRGB('#fff')).toEqual([255, 255, 255]); + }); + + it('should convert rgba color to rgb', () => { + expect(colorToRGB('rgba(255,0,0,0.5)')).toEqual([255, 0, 0]); + }); + + it('should return default ripple color for transparent color', () => { + expect(colorToRGB('transparent')).toEqual(DEFAULT_RIPPLE_COLOR); + }); + + it('should return correct diameter for click in the first quadrant', () => { + const height = 50; + const width = 100; + const offsetX = 90; + const offsetY = 10; + + const pythagorean = (sideA: number, sideB: number) => Math.sqrt(sideA ** 2 + sideB ** 2); + + const getCorner = { + topLeft: pythagorean(offsetX, offsetY), + topRight: pythagorean(width - offsetX, offsetY), + bottomLeft: pythagorean(offsetX, height - offsetY), + bottomRight: pythagorean(width - offsetX, height - offsetY), + }; + + expect(getDiameter({ offsetX, offsetY, height, width })).toEqual(getCorner.bottomLeft * 2); + }); + + it('should return correct diameter for click in the second quadrant', () => { + const height = 50; + const width = 100; + const offsetX = 15; + const offsetY = 10; + + const pythagorean = (sideA: number, sideB: number) => Math.sqrt(sideA ** 2 + sideB ** 2); + + const getCorner = { + topLeft: pythagorean(offsetX, offsetY), + topRight: pythagorean(width - offsetX, offsetY), + bottomLeft: pythagorean(offsetX, height - offsetY), + bottomRight: pythagorean(width - offsetX, height - offsetY), + }; + + expect(getDiameter({ offsetX, offsetY, height, width })).toEqual(getCorner.bottomRight * 2); + }); + + it('should return correct diameter for click in the third quadrant', () => { + const height = 50; + const width = 100; + const offsetX = 15; + const offsetY = 90; + + const pythagorean = (sideA: number, sideB: number) => Math.sqrt(sideA ** 2 + sideB ** 2); + + const getCorner = { + topLeft: pythagorean(offsetX, offsetY), + topRight: pythagorean(width - offsetX, offsetY), + bottomLeft: pythagorean(offsetX, height - offsetY), + bottomRight: pythagorean(width - offsetX, height - offsetY), + }; + + expect(getDiameter({ offsetX, offsetY, height, width })).toEqual(getCorner.topRight * 2); + }); + + it('should return correct diameter for click in the fourth quadrant', () => { + const height = 50; + const width = 100; + const offsetX = 90; + const offsetY = 30; + + const pythagorean = (sideA: number, sideB: number) => Math.sqrt(sideA ** 2 + sideB ** 2); + + const getCorner = { + topLeft: pythagorean(offsetX, offsetY), + topRight: pythagorean(width - offsetX, offsetY), + bottomLeft: pythagorean(offsetX, height - offsetY), + bottomRight: pythagorean(width - offsetX, height - offsetY), + }; + + expect(getDiameter({ offsetX, offsetY, height, width })).toEqual(getCorner.topLeft * 2); + }); + + it('should return correct diameter for click in the center', () => { + const height = 50; + const width = 100; + const offsetX = 50; + const offsetY = 25; + + const pythagorean = (sideA: number, sideB: number) => Math.sqrt(sideA ** 2 + sideB ** 2); + + const getCorner = { + topLeft: pythagorean(offsetX, offsetY), + topRight: pythagorean(width - offsetX, offsetY), + bottomLeft: pythagorean(offsetX, height - offsetY), + bottomRight: pythagorean(width - offsetX, height - offsetY), + }; + + expect(getDiameter({ offsetX, offsetY, height, width })).toEqual(getCorner.topLeft * 2); + }); +}); diff --git a/projects/mdb-angular-ui-kit/ripple/ripple-utils.ts b/projects/mdb-angular-ui-kit/ripple/ripple-utils.ts new file mode 100644 index 00000000..bf148847 --- /dev/null +++ b/projects/mdb-angular-ui-kit/ripple/ripple-utils.ts @@ -0,0 +1,100 @@ +const DEFAULT_RIPPLE_COLOR = [0, 0, 0]; + +export function durationToMsNumber(time: string): number { + return Number(time.replace('ms', '').replace('s', '000')); +} + +export function colorToRGB(color: any): number[] { + function hexToRgb(color: any): any { + const HEX_COLOR_LENGTH = 7; + const IS_SHORT_HEX = color.length < HEX_COLOR_LENGTH; + if (IS_SHORT_HEX) { + color = `#${color[1]}${color[1]}${color[2]}${color[2]}${color[3]}${color[3]}`; + } + return [ + parseInt(color.substr(1, 2), 16), + parseInt(color.substr(3, 2), 16), + parseInt(color.substr(5, 2), 16), + ]; + } + + function namedColorsToRgba(color: any): any { + const tempElem = document.body.appendChild(document.createElement('fictum')); + const flag = 'rgb(1, 2, 3)'; + tempElem.style.color = flag; + if (tempElem.style.color !== flag) { + return DEFAULT_RIPPLE_COLOR; + } + tempElem.style.color = color; + if (tempElem.style.color === flag || tempElem.style.color === '') { + return DEFAULT_RIPPLE_COLOR; + } // color parse failed + color = getComputedStyle(tempElem).color; + document.body.removeChild(tempElem); + return color; + } + + function rgbaToRgb(color: any): any { + color = color.match(/[.\d]+/g).map((a) => +Number(a)); + color.length = 3; + return color; + } + + if (color.toLowerCase() === 'transparent') { + return DEFAULT_RIPPLE_COLOR; + } + if (color[0] === '#') { + return hexToRgb(color); + } + if (color.indexOf('rgb') === -1) { + color = namedColorsToRgba(color); + } + if (color.indexOf('rgb') === 0) { + return rgbaToRgb(color); + } + + return DEFAULT_RIPPLE_COLOR; +} + +export function getDiameter({ + offsetX, + offsetY, + height, + width, +}: { + [key: string]: number; +}): number { + const top = offsetY <= height / 2; + const left = offsetX <= width / 2; + const pythagorean = (sideA: number, sideB: number) => Math.sqrt(sideA ** 2 + sideB ** 2); + + const positionCenter = offsetY === height / 2 && offsetX === width / 2; + // mouse position on the quadrants of the coordinate system + const quadrant = { + first: top === true && left === false, + second: top === true && left === true, + third: top === false && left === true, + fourth: top === false && left === false, + }; + + const getCorner = { + topLeft: pythagorean(offsetX, offsetY), + topRight: pythagorean(width - offsetX, offsetY), + bottomLeft: pythagorean(offsetX, height - offsetY), + bottomRight: pythagorean(width - offsetX, height - offsetY), + }; + + let diameter = 0; + + if (positionCenter || quadrant.fourth) { + diameter = getCorner.topLeft; + } else if (quadrant.third) { + diameter = getCorner.topRight; + } else if (quadrant.second) { + diameter = getCorner.bottomRight; + } else if (quadrant.first) { + diameter = getCorner.bottomLeft; + } + + return diameter * 2; +} diff --git a/projects/mdb-angular-ui-kit/ripple/ripple.directive.spec.ts b/projects/mdb-angular-ui-kit/ripple/ripple.directive.spec.ts new file mode 100644 index 00000000..6045bf52 --- /dev/null +++ b/projects/mdb-angular-ui-kit/ripple/ripple.directive.spec.ts @@ -0,0 +1,138 @@ +import { Component } from '@angular/core'; +import { ComponentFixture, fakeAsync, flush, TestBed, tick } from '@angular/core/testing'; +import { MdbRippleModule } from './ripple.module'; + +const template = ` + +`; + +@Component({ + selector: 'mdb-ripple-test', + template, + standalone: false, +}) +class TestRippleComponent { + rippleCentered = true; + rippleColor = ''; + rippleDuration = '1s'; + rippleRadius = 100; + rippleUnbound = false; +} + +describe('MDB Ripple', () => { + let fixture: ComponentFixture; + let component: any; + let button: any; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [TestRippleComponent], + imports: [MdbRippleModule], + teardown: { destroyAfterEach: false }, + }); + fixture = TestBed.createComponent(TestRippleComponent); + fixture.detectChanges(); + component = fixture.componentInstance; + button = document.querySelector('.btn'); + }); + + it('should set class ripple-surface on element', () => { + expect(button.classList.contains('ripple-surface')).toBe(true); + }); + + it('should create helper element on click', () => { + button.click(); + + fixture.detectChanges(); + expect(button.children[0]).not.toBe(null); + }); + + it('should add class ripple-wave on helper element', () => { + button.click(); + + fixture.detectChanges(); + + expect(button.children[0]).not.toBe(null); + expect(button.children[0].classList.contains('ripple-wave')).toBe(true); + }); + + it('should set class ripple-surface-unbound on wrapper if rippleUnbound option is true', () => { + component.rippleUnbound = true; + + fixture.detectChanges(); + + button.click(); + + fixture.detectChanges(); + expect(button.classList.contains('ripple-surface-unbound')).toBe(true); + }); + + it('should remove helper after duration', fakeAsync(() => { + button.click(); + + fixture.detectChanges(); + + let helper = button.children[0]; + + expect(helper).not.toBe(null); + + tick(1000); + + helper = button.children[0]; + + expect(helper).toBe(undefined); + })); + + it('should accept Bootstrap colors', () => { + fixture.componentInstance.rippleColor = 'primary'; + fixture.detectChanges(); + + button.click(); + fixture.detectChanges(); + + expect(button.classList).toContain('ripple-surface-primary'); + }); + + it('should add new colors class and remove previous color classes', fakeAsync(() => { + fixture.componentInstance.rippleColor = 'primary'; + fixture.detectChanges(); + + button.click(); + fixture.detectChanges(); + + expect(button.classList).toContain('ripple-surface-primary'); + + fixture.componentInstance.rippleColor = 'secondary'; + fixture.detectChanges(); + + button.click(); + fixture.detectChanges(); + + flush(); + + expect(button.classList).not.toContain('ripple-surface-primary'); + expect(button.classList).toContain('ripple-surface-secondary'); + })); + + it('should add ripple-surface-color class only if Bootstrap color type is used', () => { + const REGEXP_CLASS_COLOR = new RegExp(`${'ripple-surface'}-[a-z]+`, 'gi'); + + fixture.componentInstance.rippleColor = '#c953d6'; + fixture.detectChanges(); + + button.click(); + fixture.detectChanges(); + + expect(REGEXP_CLASS_COLOR.test(button.classList)).toBe(false); + }); +}); diff --git a/projects/mdb-angular-ui-kit/ripple/ripple.directive.ts b/projects/mdb-angular-ui-kit/ripple/ripple.directive.ts new file mode 100644 index 00000000..e9270fe0 --- /dev/null +++ b/projects/mdb-angular-ui-kit/ripple/ripple.directive.ts @@ -0,0 +1,205 @@ +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { Directive, ElementRef, HostBinding, HostListener, Input, Renderer2 } from '@angular/core'; +import { colorToRGB, durationToMsNumber, getDiameter } from './ripple-utils'; + +const TRANSITION_BREAK_OPACITY = 0.5; + +const GRADIENT = + 'rgba({{color}}, 0.2) 0, rgba({{color}}, 0.3) 40%, rgba({{color}}, 0.4) 50%, rgba({{color}}, 0.5) 60%, rgba({{color}}, 0) 70%'; +const BOOTSTRAP_COLORS = [ + 'primary', + 'secondary', + 'success', + 'danger', + 'warning', + 'info', + 'light', + 'dark', +]; + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbRipple]', + exportAs: 'mdbRipple', + standalone: false, +}) +export class MdbRippleDirective { + @Input() + get rippleCentered(): boolean { + return this._rippleCentered; + } + set rippleCentered(value: boolean) { + this._rippleCentered = coerceBooleanProperty(value); + } + private _rippleCentered = false; + + @Input() rippleColor = ''; + @Input() rippleDuration = '500ms'; + @Input() rippleRadius = 0; + + @Input() + get rippleUnbound(): boolean { + return this._rippleUnbound; + } + set rippleUnbound(value: boolean) { + this._rippleUnbound = coerceBooleanProperty(value); + } + private _rippleUnbound = false; + + private _rippleInSpan = false; + + private _rippleTimer = null; + + constructor(private _elementRef: ElementRef, private _renderer: Renderer2) {} + + get host(): HTMLElement { + return this._elementRef.nativeElement; + } + + @HostBinding('class.ripple-surface') ripple = true; + + @HostListener('click', ['$event']) + _createRipple(event: any): void { + const { layerX, layerY } = event; + const offsetX = layerX; + const offsetY = layerY; + const height = this.host.offsetHeight; + const width = this.host.offsetWidth; + const duration = durationToMsNumber(this.rippleDuration); + const diameterOptions = { + offsetX: this.rippleCentered ? height / 2 : offsetX, + offsetY: this.rippleCentered ? width / 2 : offsetY, + height, + width, + }; + const diameter = getDiameter(diameterOptions); + const radiusValue = this.rippleRadius || diameter / 2; + + const opacity = { + delay: duration * TRANSITION_BREAK_OPACITY, + duration: duration - duration * TRANSITION_BREAK_OPACITY, + }; + + const styles = { + left: this.rippleCentered ? `${width / 2 - radiusValue}px` : `${offsetX - radiusValue}px`, + top: this.rippleCentered ? `${height / 2 - radiusValue}px` : `${offsetY - radiusValue}px`, + height: `${this.rippleRadius * 2 || diameter}px`, + width: `${this.rippleRadius * 2 || diameter}px`, + transitionDelay: `0s, ${opacity.delay}ms`, + transitionDuration: `${duration}ms, ${opacity.duration}ms`, + }; + + const rippleHTML = this._renderer.createElement('div'); + + if (this.host.tagName.toLowerCase() === 'input') { + this._createWrapperSpan(); + } + + this._createHTMLRipple(this.host, rippleHTML, styles); + this._removeHTMLRipple(rippleHTML, duration); + } + + private _createWrapperSpan(): void { + const parent = this._renderer.parentNode(this.host); + this._rippleInSpan = true; + if (parent.tagName.toLowerCase() === 'span' && parent.classList.contains('ripple-surface')) { + this._elementRef.nativeElement = parent; + } else { + const wrapper = this._renderer.createElement('span'); + + this._renderer.addClass(wrapper, 'ripple-surface'); + this._renderer.addClass(wrapper, 'input-wrapper'); + + this._renderer.setStyle(wrapper, 'border', 0); + + const shadow = getComputedStyle(this.host).boxShadow; + this._renderer.setStyle(wrapper, 'box-shadow', shadow); + + // Put element as child + parent.replaceChild(wrapper, this.host); + wrapper.appendChild(this.host); + this._elementRef.nativeElement = wrapper; + } + this.host.focus(); + } + + _removeWrapperSpan() { + const child = this.host.firstChild; + this.host.replaceWith(child); + this._elementRef.nativeElement = child; + this.host.focus(); + this._rippleInSpan = false; + } + + private _createHTMLRipple(wrapper: HTMLElement, ripple: HTMLElement, styles: any): void { + Object.keys(styles).forEach((property) => (ripple.style[property] = styles[property])); + this._renderer.addClass(ripple, 'ripple-wave'); + + if (this.rippleColor !== '') { + this._removeOldColorClasses(wrapper); + this._addColor(ripple, wrapper); + } + + this._toggleUnbound(wrapper); + this._appendRipple(ripple, wrapper); + } + + private _removeHTMLRipple(ripple: HTMLElement, duration: number): void { + if (this._rippleTimer) { + clearTimeout(this._rippleTimer); + this._rippleTimer = null; + } + this._rippleTimer = setTimeout(() => { + if (ripple) { + ripple.remove(); + this.host.querySelectorAll('.ripple-wave').forEach((rippleEl) => { + rippleEl.remove(); + }); + if (this._rippleInSpan && this.host.classList.contains('input-wrapper')) { + this._removeWrapperSpan(); + } + } + }, duration); + } + + _appendRipple(target: HTMLElement, parent: HTMLElement): void { + const FIX_ADD_RIPPLE_EFFECT = 50; // delay for active animations + this._renderer.appendChild(parent, target); + setTimeout(() => { + this._renderer.addClass(target, 'active'); + }, FIX_ADD_RIPPLE_EFFECT); + } + + _toggleUnbound(target: HTMLElement): void { + if (this.rippleUnbound) { + this._renderer.addClass(target, 'ripple-surface-unbound'); + } else { + this._renderer.removeClass(target, 'ripple-surface-unbound'); + } + } + + _addColor(target: HTMLElement, parent: HTMLElement): void { + const isBootstrapColor = BOOTSTRAP_COLORS.find( + (color) => color === this.rippleColor.toLowerCase() + ); + + if (isBootstrapColor) { + this._renderer.addClass(parent, `${'ripple-surface'}-${this.rippleColor.toLowerCase()}`); + } else { + const rgbValue = colorToRGB(this.rippleColor).join(','); + const gradientImage = GRADIENT.split('{{color}}').join(`${rgbValue}`); + target.style.backgroundImage = `radial-gradient(circle, ${gradientImage})`; + } + } + + _removeOldColorClasses(target: HTMLElement): void { + const REGEXP_CLASS_COLOR = new RegExp(`${'ripple-surface'}-[a-z]+`, 'gi'); + const PARENT_CLASSS_COLOR = target.classList.value.match(REGEXP_CLASS_COLOR) || []; + PARENT_CLASSS_COLOR.forEach((className) => { + this._renderer.removeClass(target, className); + }); + } + + static ngAcceptInputType_rippleCentered: BooleanInput; + static ngAcceptInputType_rippleUnbound: BooleanInput; +} diff --git a/projects/mdb-angular-ui-kit/ripple/ripple.module.ts b/projects/mdb-angular-ui-kit/ripple/ripple.module.ts new file mode 100644 index 00000000..3ff0a9d7 --- /dev/null +++ b/projects/mdb-angular-ui-kit/ripple/ripple.module.ts @@ -0,0 +1,9 @@ +import { NgModule } from '@angular/core'; +import { MdbRippleDirective } from './ripple.directive'; + +@NgModule({ + declarations: [MdbRippleDirective], + imports: [], + exports: [MdbRippleDirective], +}) +export class MdbRippleModule {} diff --git a/projects/mdb-angular-ui-kit/schematics/collection.json b/projects/mdb-angular-ui-kit/schematics/collection.json new file mode 100644 index 00000000..c7e10c80 --- /dev/null +++ b/projects/mdb-angular-ui-kit/schematics/collection.json @@ -0,0 +1,15 @@ +{ + "$schema": "./node_modules/@angular-devkit/schematics/collection-schema.json", + "schematics": { + "ng-add": { + "description": "Add MDB Angular Ui Kit to the application.", + "factory": "./ng-add/index#ngAdd", + "schema": "./ng-add/schema.json" + }, + "ng-add-mdb-setup": { + "description": "Setup MDB Angular.", + "factory": "./ng-add/mdb-setup", + "schema": "./ng-add/schema.json" + } + } +} diff --git a/projects/mdb-angular-ui-kit/schematics/ng-add/index.ts b/projects/mdb-angular-ui-kit/schematics/ng-add/index.ts new file mode 100644 index 00000000..ad1cda85 --- /dev/null +++ b/projects/mdb-angular-ui-kit/schematics/ng-add/index.ts @@ -0,0 +1,29 @@ +import { Rule, SchematicContext, Tree } from '@angular-devkit/schematics'; +import { RunSchematicTask, NodePackageInstallTask } from '@angular-devkit/schematics/tasks'; +import { Schema } from './schema'; +import { addPackageToPackageJson } from './package'; + +// Just return the tree +export function ngAdd(options: Schema): Rule { + return (tree: Tree, context: SchematicContext) => { + const angularDependencyVersion = '^20.0.0'; + + addPackageToPackageJson(tree, '@angular/cdk', angularDependencyVersion); + addPackageToPackageJson(tree, '@angular/forms', angularDependencyVersion); + addPackageToPackageJson(tree, '@angular/animations', angularDependencyVersion); + + if (options.fontAwesome) { + addPackageToPackageJson(tree, '@fortawesome/fontawesome-free', '^6.0.0'); + } + + if (options.charts) { + addPackageToPackageJson(tree, 'chart.js', '^3.1.1'); + } + + const installMainDependenciesTask = context.addTask(new NodePackageInstallTask()); + + context.addTask(new RunSchematicTask('ng-add-mdb-setup', options), [ + installMainDependenciesTask, + ]); + }; +} diff --git a/projects/mdb-angular-ui-kit/schematics/ng-add/mdb-setup.ts b/projects/mdb-angular-ui-kit/schematics/ng-add/mdb-setup.ts new file mode 100644 index 00000000..056e62e2 --- /dev/null +++ b/projects/mdb-angular-ui-kit/schematics/ng-add/mdb-setup.ts @@ -0,0 +1,238 @@ +import { SchematicContext, Tree, chain } from '@angular-devkit/schematics'; +import { getWorkspace } from '@schematics/angular/utility/workspace'; +import { ProjectType } from '@schematics/angular/utility/workspace-models'; +import { + getProjectMainFile, + addModuleImportToRootModule, + getProjectFromWorkspace, + getProjectIndexFiles, + appendHtmlElementToHead, + getProjectStyleFile, + isStandaloneApp, +} from '@angular/cdk/schematics'; +import { addRootProvider } from '@schematics/angular/utility'; +import { Schema } from './schema'; + +const mdbModules = [ + { name: 'MdbAccordionModule', path: 'mdb-angular-ui-kit/accordion'}, + { name: 'MdbCarouselModule', path: 'mdb-angular-ui-kit/carousel'}, + { name: 'MdbCheckboxModule', path: 'mdb-angular-ui-kit/checkbox'}, + { name: 'MdbCollapseModule', path: 'mdb-angular-ui-kit/collapse'}, + { name: 'MdbDropdownModule', path: 'mdb-angular-ui-kit/dropdown'}, + { name: 'MdbFormsModule', path: 'mdb-angular-ui-kit/forms'}, + { name: 'MdbModalModule', path: 'mdb-angular-ui-kit/modal'}, + { name: 'MdbPopoverModule', path: 'mdb-angular-ui-kit/popover'}, + { name: 'MdbRadioModule', path: 'mdb-angular-ui-kit/radio'}, + { name: 'MdbRangeModule', path: 'mdb-angular-ui-kit/range'}, + { name: 'MdbRippleModule', path: 'mdb-angular-ui-kit/ripple'}, + { name: 'MdbScrollspyModule', path: 'mdb-angular-ui-kit/scrollspy'}, + { name: 'MdbTabsModule', path: 'mdb-angular-ui-kit/tabs'}, + { name: 'MdbTooltipModule', path: 'mdb-angular-ui-kit/tooltip'}, + { name: 'MdbValidationModule', path: 'mdb-angular-ui-kit/validation'}, +]; + +// eslint-disable-next-line space-before-function-paren +export default function (options: Schema): any { + return async (tree: Tree) => { + const workspace: any = await getWorkspace(tree); + const project = getProjectFromWorkspace(workspace, options.project); + + if (project.extensions.projectType === ProjectType.Application) { + return chain([ + addMdbModulesImports(options), + addAngularAnimationsModule(options), + addStylesImports(options), + addChartsToScripts(options), + addRobotoFontToIndexHtml(options), + updateAppComponentContent(), + ]); + } + return; + }; +} + +function addMdbModulesImports(options: Schema): any { + return async (tree: Tree) => { + const workspace: any = await getWorkspace(tree); + const project = getProjectFromWorkspace(workspace, options.project); + const mainFile = getProjectMainFile(project); + + if (isStandaloneApp(tree, mainFile)) { + return; + } + + if (options.modules) { + mdbModules.forEach((module) => { + addModuleImportToRootModule(tree, module.name, module.path, project); + }); + } + + return tree; + }; +} + +function addAngularAnimationsModule(options: Schema): any { + return () => { + return addRootProvider(options.project, ({ code, external }) => { + return code`${external('provideAnimations', '@angular/platform-browser/animations')}(${ + options.animations ? '' : `'noop'` + })`; + }); + }; +} + +function addRobotoFontToIndexHtml(options: Schema): any { + return async (tree: Tree, context: SchematicContext) => { + const fontUrl = 'https://fonts.googleapis.com/css?family=Roboto:300,400,500,600&display=swap'; + const workspace: any = await getWorkspace(tree); + const project: any = getProjectFromWorkspace(workspace, options.project); + const projectIndexFiles = getProjectIndexFiles(project); + const logger = context.logger; + + if (options.robotoFont) { + if (!projectIndexFiles.length) { + logger.error('Index HTML not found'); + logger.info('Add roboto font manually'); + return; + } + + projectIndexFiles.forEach((indexFile: any) => { + appendHtmlElementToHead(tree, indexFile, ``); + }); + } + + return tree; + }; +} + +function addStylesImports(options: Schema): any { + return async (host: Tree, context: SchematicContext) => { + const workspace: any = await getWorkspace(host); + const project = getProjectFromWorkspace(workspace, options.project); + const logger = context.logger; + const styleFilePath = getProjectStyleFile(project); + + if (!styleFilePath) { + logger.error( + `Could not find the default style file for this project. Please add styles imports manually` + ); + return; + } + + const buffer = host.read(styleFilePath); + + if (!buffer) { + logger.error( + `Could not read the default style file for this project. Please add styles imports manually` + ); + return; + } + + const fileContent = buffer.toString(); + + let newContent: string; + + if (options.fontAwesome) { + newContent = + `@import '@fortawesome/fontawesome-free/css/all.css';\n` + + `@import 'mdb-angular-ui-kit/assets/scss/mdb.scss';\n`; + } else { + newContent = `@import 'mdb-angular-ui-kit/assets/scss/mdb.scss';\n`; + } + + if (fileContent.includes(newContent)) { + return; + } + + const recorder = host.beginUpdate(styleFilePath); + + recorder.insertLeft(fileContent.length, newContent); + host.commitUpdate(recorder); + }; +} + +function addChartsToScripts(options: Schema): any { + return async (host: Tree, context: SchematicContext) => { + const logger = context.logger; + + const chartsPath = 'node_modules/chart.js/dist/chart.js'; + + if (options.charts) { + const angularJsonFile = host.read('angular.json'); + + if (angularJsonFile) { + const angularJsonFileObject = JSON.parse(angularJsonFile.toString('utf-8')); + const project = options.project + ? options.project + : Object.keys(angularJsonFileObject.projects)[0]; + const projectObject = angularJsonFileObject.projects[project]; + if (!projectObject.architect.build.options.scripts) { + projectObject.architect.build.options.scripts = []; + } + const scripts = projectObject.architect.build.options.scripts; + + scripts.push(chartsPath); + + host.overwrite('angular.json', JSON.stringify(angularJsonFileObject, null, 2)); + } else { + logger.error('Failed to add charts script to angular.json'); + } + } + }; +} + +function updateAppComponentContent(): any { + return async (host: Tree, context: SchematicContext) => { + const filePath = './src/app/app.html'; + const logger = context.logger; + const buffer = host.read(filePath); + + if (!buffer) { + logger.error('No buffer'); + return; + } + + const fileContent = buffer.toString(); + + const newContent = + `
\n` + + `
\n` + + `
\n` + + ` \n` + + `
Thank you for using our product. We're glad you're with us.
\n` + + `

MDB Team

\n` + + `

\n` + + ` PS. We'll be releasing "How to build your first project with MDB 5 Angular" tutorial soon.\n` + + `

\n` + + ` Join now\n` + + `
\n` + + `
\n` + + `
`; + + const hasNewContent = fileContent.includes(newContent); + const hasDefaultContent = + fileContent.includes('Delete the template below') && + fileContent.includes('to get started with your project!') && + fileContent.includes('Congratulations! Your app is running.'); + + if (hasNewContent || !hasDefaultContent) { + return; + } + + const recorder = host.beginUpdate(filePath); + + recorder.remove(0, fileContent.length); + recorder.insertLeft(0, newContent); + host.commitUpdate(recorder); + }; +} diff --git a/projects/mdb-angular-ui-kit/schematics/ng-add/package.ts b/projects/mdb-angular-ui-kit/schematics/ng-add/package.ts new file mode 100644 index 00000000..3c30a87d --- /dev/null +++ b/projects/mdb-angular-ui-kit/schematics/ng-add/package.ts @@ -0,0 +1,28 @@ +import { Tree } from '@angular-devkit/schematics'; + +function sortObjectByKeys(obj: any): any { + return Object.keys(obj) + .sort() + .reduce((result: any, key) => (result[key] = obj[key]) && result, {}); +} + +export function addPackageToPackageJson(tree: Tree, pkg: string, version: string): Tree { + if (tree.exists('package.json')) { + const packageJsonFile = tree.read('package.json'); + const sourceText = packageJsonFile && packageJsonFile.toString('utf-8'); + const json = sourceText && JSON.parse(sourceText); + + if (!json.dependencies) { + json.dependencies = {}; + } + + if (!json.dependencies[pkg]) { + json.dependencies[pkg] = version; + json.dependencies = sortObjectByKeys(json.dependencies); + } + + tree.overwrite('package.json', JSON.stringify(json, null, 2)); + } + + return tree; +} diff --git a/projects/mdb-angular-ui-kit/schematics/ng-add/schema.json b/projects/mdb-angular-ui-kit/schematics/ng-add/schema.json new file mode 100644 index 00000000..937f7f60 --- /dev/null +++ b/projects/mdb-angular-ui-kit/schematics/ng-add/schema.json @@ -0,0 +1,46 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "mdb-angular-ng-add", + "title": "MDB Angular ng-add schematic", + "type": "object", + "properties": { + "project": { + "type": "string", + "description": "Name of the project.", + "$default": { + "$source": "projectName" + } + }, + "modules": { + "type": "boolean", + "default": true, + "description": "Whether to import all MDB modules.", + "x-prompt": "Import all MDB modules?" + }, + "robotoFont": { + "type": "boolean", + "default": true, + "description": "Whether to add Roboto Font.", + "x-prompt": "Set up Roboto Font?" + }, + "animations": { + "type": "boolean", + "default": true, + "description": "Whether to set up browser animations.", + "x-prompt": "Set up Angular browser animations?" + }, + "fontAwesome": { + "type": "boolean", + "default": true, + "description": "Whether to install and configure Font Awesome.", + "x-prompt": "Set up Font Awesome?" + }, + "charts": { + "type": "boolean", + "default": true, + "description": "Whether to install and configure Charts.", + "x-prompt": "Set up Charts?" + } + }, + "required": [] +} diff --git a/projects/mdb-angular-ui-kit/schematics/ng-add/schema.ts b/projects/mdb-angular-ui-kit/schematics/ng-add/schema.ts new file mode 100644 index 00000000..783672fa --- /dev/null +++ b/projects/mdb-angular-ui-kit/schematics/ng-add/schema.ts @@ -0,0 +1,8 @@ +export interface Schema { + project: string; + modules: boolean; + robotoFont: boolean; + animations: boolean; + fontAwesome: boolean; + charts: boolean; +} diff --git a/projects/mdb-angular-ui-kit/scrollspy/index.ts b/projects/mdb-angular-ui-kit/scrollspy/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/mdb-angular-ui-kit/scrollspy/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/mdb-angular-ui-kit/scrollspy/ng-package.json b/projects/mdb-angular-ui-kit/scrollspy/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/scrollspy/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/scrollspy/public_api.ts b/projects/mdb-angular-ui-kit/scrollspy/public_api.ts new file mode 100644 index 00000000..697543bb --- /dev/null +++ b/projects/mdb-angular-ui-kit/scrollspy/public_api.ts @@ -0,0 +1,6 @@ +export { MdbScrollspyDirective } from './scrollspy.directive'; +export { MdbScrollspyElementDirective } from './scrollspy-element.directive'; +export { MdbScrollspyWindowDirective } from './scrollspy-window.directive'; +export { MdbScrollspyLinkDirective } from './scrollspy-link.directive'; +export { MdbScrollspyService } from './scrollspy.service'; +export { MdbScrollspyModule } from './scrollspy.module'; diff --git a/projects/mdb-angular-ui-kit/scrollspy/scrollspy-element.directive.ts b/projects/mdb-angular-ui-kit/scrollspy/scrollspy-element.directive.ts new file mode 100644 index 00000000..0265f064 --- /dev/null +++ b/projects/mdb-angular-ui-kit/scrollspy/scrollspy-element.directive.ts @@ -0,0 +1,101 @@ +import { + Directive, + ElementRef, + OnInit, + Renderer2, + NgZone, + Input, + AfterViewInit, + Inject, + DOCUMENT, +} from '@angular/core'; +import { MdbScrollspyService } from './scrollspy.service'; + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbScrollspyElement]', + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/directive-class-suffix +export class MdbScrollspyElementDirective implements OnInit, AfterViewInit { + private id: string; + + get host(): HTMLElement { + return this._elementRef.nativeElement; + } + + @Input() container: HTMLElement; + + @Input('mdbScrollspyElement') + get scrollSpyId(): string { + return this._scrollSpyId; + } + set scrollSpyId(newId: string) { + if (newId) { + this._scrollSpyId = newId; + } + } + private _scrollSpyId: string; + + @Input() offset = 0; + + constructor( + private _elementRef: ElementRef, + private renderer: Renderer2, + private ngZone: NgZone, + private scrollSpyService: MdbScrollspyService, + @Inject(DOCUMENT) private _document: any + ) {} + + isElementInViewport(): boolean { + const scrollTop = this.container.scrollTop; + const elTop = this.host.offsetTop - this.offset; + const elHeight = this.host.offsetHeight; + + return scrollTop >= elTop && scrollTop < elTop + elHeight; + } + + updateActiveState(scrollSpyId: string, id: string): void { + if (this.isElementInViewport()) { + this.scrollSpyService.removeActiveLinks(scrollSpyId); + this.scrollSpyService.updateActiveState(scrollSpyId, id); + } + } + + onScroll(): void { + this.updateActiveState(this.scrollSpyId, this.id); + } + + listenToScroll(): void { + this.renderer.listen(this.container, 'scroll', () => { + this.onScroll(); + }); + } + + ngOnInit(): void { + this.id = this.host.id; + + if (!this.container) { + this.container = this._getClosestEl(this.host, '.scrollspy-container'); + } + + this.renderer.setStyle(this.container, 'position', 'relative'); + + this.ngZone.runOutsideAngular(this.listenToScroll.bind(this)); + } + + ngAfterViewInit(): void { + setTimeout(() => { + this.updateActiveState(this.scrollSpyId, this.id); + }, 0); + } + + private _getClosestEl(el: any, selector: string): HTMLElement | null { + for (; el && el !== this._document; el = el.parentNode) { + if (el.matches && el.matches(selector)) { + return el; + } + } + return null; + } +} diff --git a/projects/mdb-angular-ui-kit/scrollspy/scrollspy-link.directive.spec.ts b/projects/mdb-angular-ui-kit/scrollspy/scrollspy-link.directive.spec.ts new file mode 100644 index 00000000..3b1e1e7d --- /dev/null +++ b/projects/mdb-angular-ui-kit/scrollspy/scrollspy-link.directive.spec.ts @@ -0,0 +1,28 @@ +import { MdbScrollspyLinkDirective } from './scrollspy-link.directive'; + +describe('ScrollspyDirective', () => { + let scrollspyLink: MdbScrollspyLinkDirective; + const cdRefMock = { + detectChanges: jest.fn(), + }; + + beforeEach(() => { + scrollspyLink = new MdbScrollspyLinkDirective(cdRefMock as any, document); + }); + + it('should get section with id equal to link id', () => { + scrollspyLink.id = 'scrollspy'; + const div = document.createElement('div'); + div.setAttribute('id', scrollspyLink.id); + document.body.appendChild(div); + + scrollspyLink.ngOnInit(); + + expect(scrollspyLink.section).toBe(div); + }); + + it('should activate change detection cycle', () => { + scrollspyLink.detectChanges(); + expect(cdRefMock.detectChanges).toHaveBeenCalled(); + }); +}); diff --git a/projects/mdb-angular-ui-kit/scrollspy/scrollspy-link.directive.ts b/projects/mdb-angular-ui-kit/scrollspy/scrollspy-link.directive.ts new file mode 100644 index 00000000..61cfe605 --- /dev/null +++ b/projects/mdb-angular-ui-kit/scrollspy/scrollspy-link.directive.ts @@ -0,0 +1,74 @@ +import { + Directive, + OnInit, + Input, + HostListener, + HostBinding, + ChangeDetectorRef, + Inject, + DOCUMENT, +} from '@angular/core'; + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbScrollspyLink]', + standalone: false, +}) +export class MdbScrollspyLinkDirective implements OnInit { + @Input() + get scrollIntoView(): boolean { + return this._scrollIntoView; + } + set scrollIntoView(value: boolean) { + this._scrollIntoView = value; + } + private _scrollIntoView = true; + + get section(): HTMLElement { + return this._section; + } + set section(value: HTMLElement) { + if (value) { + this._section = value; + } + } + private _section: HTMLElement; + private _id: string; + + constructor(private cdRef: ChangeDetectorRef, @Inject(DOCUMENT) private document: any) {} + + @Input('mdbScrollspyLink') + get id(): string { + return this._id; + } + set id(newId: string) { + if (newId) { + this._id = newId; + } + } + + @HostBinding('class.scrollspy-link') + scrollspyLink = true; + + @HostBinding('class.active') + active = false; + + @HostListener('click', []) + onClick(): void { + if (this.section && this.scrollIntoView === true) { + this.section.scrollIntoView(); + } + } + + detectChanges(): void { + this.cdRef.detectChanges(); + } + + assignSectionToId(): void { + this.section = this.document.documentElement.querySelector(`#${this.id}`); + } + + ngOnInit(): void { + this.assignSectionToId(); + } +} diff --git a/projects/mdb-angular-ui-kit/scrollspy/scrollspy-window.directive.ts b/projects/mdb-angular-ui-kit/scrollspy/scrollspy-window.directive.ts new file mode 100644 index 00000000..179d99e5 --- /dev/null +++ b/projects/mdb-angular-ui-kit/scrollspy/scrollspy-window.directive.ts @@ -0,0 +1,82 @@ +import { + Directive, + ElementRef, + OnInit, + Inject, + Renderer2, + NgZone, + Input, + AfterViewInit, + DOCUMENT, +} from '@angular/core'; + +import { MdbScrollspyService } from './scrollspy.service'; + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbScrollspyWindow]', + standalone: false, +}) +export class MdbScrollspyWindowDirective implements OnInit, AfterViewInit { + private id: string; + + @Input('mdbScrollspyWindow') + get scrollSpyId(): string { + return this._scrollSpyId; + } + set scrollSpyId(newId: string) { + if (newId) { + this._scrollSpyId = newId; + } + } + private _scrollSpyId: string; + + @Input() offset = 0; + + constructor( + @Inject(DOCUMENT) private document: any, + private el: ElementRef, + private renderer: Renderer2, + private ngZone: NgZone, + private scrollSpyService: MdbScrollspyService + ) {} + + isElementInViewport(): boolean { + const scrollTop = this.document.documentElement.scrollTop || this.document.body.scrollTop; + const elHeight = this.el.nativeElement.offsetHeight; + const elTop = this.el.nativeElement.offsetTop - this.offset; + const elBottom = elTop + elHeight; + + return scrollTop >= elTop && scrollTop <= elBottom; + } + + updateActiveState(scrollSpyId: string, id: string): void { + if (this.isElementInViewport()) { + this.scrollSpyService.updateActiveState(scrollSpyId, id); + } else { + this.scrollSpyService.removeActiveState(scrollSpyId, id); + } + } + + onScroll(): void { + this.updateActiveState(this.scrollSpyId, this.id); + } + + listenToScroll(): void { + this.renderer.listen(window, 'scroll', () => { + this.onScroll(); + }); + } + + ngOnInit(): void { + this.id = this.el.nativeElement.id; + + this.ngZone.runOutsideAngular(this.listenToScroll.bind(this)); + } + + ngAfterViewInit(): void { + setTimeout(() => { + this.updateActiveState(this.scrollSpyId, this.id); + }, 0); + } +} diff --git a/projects/mdb-angular-ui-kit/scrollspy/scrollspy.directive.spec.ts b/projects/mdb-angular-ui-kit/scrollspy/scrollspy.directive.spec.ts new file mode 100644 index 00000000..329406e0 --- /dev/null +++ b/projects/mdb-angular-ui-kit/scrollspy/scrollspy.directive.spec.ts @@ -0,0 +1,37 @@ +import { MdbScrollspyLinkDirective } from './scrollspy-link.directive'; +import { MdbScrollspyDirective } from './scrollspy.directive'; +import { MdbScrollspyService } from './scrollspy.service'; + +describe('ScrollspyDirective', () => { + let scrollspy: MdbScrollspyDirective; + let scrollspyService: MdbScrollspyService; + const cdRefMock = { + detectChanges: jest.fn(), + }; + + beforeEach(() => { + scrollspyService = new MdbScrollspyService(); + // scrollspy = new MdbScrollspyDirective(scrollspyService); + }); + + it('should add new scrollspy to service after content init', () => { + // const spy = jest.spyOn(scrollspyService, 'addScrollspy'); + // scrollspy.ngAfterContentInit(); + // expect(spy).toHaveBeenCalled(); + }); + + it('should remove scrollspy from service on destroy', () => { + // const spy = jest.spyOn(scrollspyService, 'removeScrollspy'); + // scrollspy.ngOnDestroy(); + // expect(spy).toHaveBeenCalled(); + }); + + it('should emit activeLinkChange event when active link change', () => { + // const spy = jest.spyOn(scrollspy.activeLinkChange, 'emit'); + // const document = DOCUMENT; + // const link = new MdbScrollspyLinkDirective(cdRefMock as any, document); + // scrollspy.ngOnInit(); + // scrollspyService.setActiveLink(link); + // expect(spy).toHaveBeenCalled(); + }); +}); diff --git a/projects/mdb-angular-ui-kit/scrollspy/scrollspy.directive.ts b/projects/mdb-angular-ui-kit/scrollspy/scrollspy.directive.ts new file mode 100644 index 00000000..868557a7 --- /dev/null +++ b/projects/mdb-angular-ui-kit/scrollspy/scrollspy.directive.ts @@ -0,0 +1,135 @@ +import { + AfterContentInit, + Component, + ContentChildren, + ElementRef, + EventEmitter, + Inject, + Input, + OnDestroy, + OnInit, + Output, + PLATFORM_ID, + QueryList, + Renderer2, +} from '@angular/core'; +import { MdbScrollspyLinkDirective } from './scrollspy-link.directive'; +import { MdbScrollspyService } from './scrollspy.service'; +import { distinctUntilChanged, takeUntil } from 'rxjs/operators'; +import { Subject, Subscription } from 'rxjs'; +import { coerceBooleanProperty } from '@angular/cdk/coercion'; +import { isPlatformBrowser } from '@angular/common'; + +@Component({ + // eslint-disable-next-line @angular-eslint/component-selector + selector: '[mdbScrollspy]', + template: '', + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +export class MdbScrollspyDirective implements OnInit, AfterContentInit, OnDestroy { + @ContentChildren(MdbScrollspyLinkDirective, { descendants: true }) + links: QueryList; + + readonly _destroy$: Subject = new Subject(); + + @Input('mdbScrollspy') + get id(): string { + return this._id; + } + + set id(newId: string) { + if (newId) { + this._id = newId; + } + } + + private _id: string; + + @Input() + get collapsible(): boolean { + return this._collapsible; + } + set collapsible(value: boolean) { + this._collapsible = coerceBooleanProperty(value); + } + + private _collapsible = false; + + private _isBrowser: boolean; + + @Output() activeLinkChange: EventEmitter = new EventEmitter(); + + activeSub: Subscription; + + constructor( + private scrollSpyService: MdbScrollspyService, + private _elementRef: ElementRef, + private _renderer: Renderer2, + @Inject(PLATFORM_ID) platformId: Object + ) { + this._isBrowser = isPlatformBrowser(platformId); + } + + get host(): HTMLElement { + return this._elementRef.nativeElement; + } + + collapsibleElementHeight = 0; + + ngOnInit(): void { + if (this._isBrowser) { + this.collapsibleElementHeight = this.host.getBoundingClientRect().height; + } + + this.activeSub = this.scrollSpyService.active$ + .pipe(takeUntil(this._destroy$), distinctUntilChanged()) + .subscribe((activeLink) => { + this.activeLinkChange.emit(activeLink); + if (this.collapsible) { + this.styleCollapsibleElement(); + } + }); + } + + ngAfterContentInit(): void { + this.scrollSpyService.addScrollspy({ id: this.id, links: this.links }); + } + + ngOnDestroy(): void { + this.scrollSpyService.removeScrollspy(this.id); + this._destroy$.next(); + this._destroy$.complete(); + } + + private styleCollapsibleElement(): void { + this._renderer.setStyle(this.host, 'overflow', 'hidden'); + this._renderer.setStyle(this.host, 'transition', 'height 0.2s ease-in-out'); + this._renderer.setStyle(this.host, 'flex-wrap', 'nowrap'); + + const hostSiblings = this.getAllSiblings(this.host); + const isAnySiblingActive = hostSiblings.some((element) => { + return element.classList.contains('active'); + }); + + if (this.collapsible && isAnySiblingActive) { + this._renderer.setStyle(this.host, 'height', `${this.collapsibleElementHeight}px`); + } else if (this.collapsible && !isAnySiblingActive) { + this._renderer.setStyle(this.host, 'height', '0px'); + } + } + + private getAllSiblings(element: HTMLElement) { + let siblings = []; + if (!element.parentNode) { + return siblings; + } + let sibling = element.parentNode.firstElementChild; + do { + if (sibling != element) { + siblings.push(sibling); + } + } while ((sibling = sibling.nextElementSibling)); + return siblings; + } +} diff --git a/projects/mdb-angular-ui-kit/scrollspy/scrollspy.module.ts b/projects/mdb-angular-ui-kit/scrollspy/scrollspy.module.ts new file mode 100644 index 00000000..018f0a0b --- /dev/null +++ b/projects/mdb-angular-ui-kit/scrollspy/scrollspy.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; + +import { MdbScrollspyDirective } from './scrollspy.directive'; +import { MdbScrollspyLinkDirective } from './scrollspy-link.directive'; +import { MdbScrollspyElementDirective } from './scrollspy-element.directive'; +import { MdbScrollspyService } from './scrollspy.service'; +import { MdbScrollspyWindowDirective } from './scrollspy-window.directive'; + +@NgModule({ + declarations: [ + MdbScrollspyDirective, + MdbScrollspyLinkDirective, + MdbScrollspyElementDirective, + MdbScrollspyWindowDirective, + ], + exports: [ + MdbScrollspyDirective, + MdbScrollspyLinkDirective, + MdbScrollspyElementDirective, + MdbScrollspyWindowDirective, + ], + providers: [MdbScrollspyService], +}) +export class MdbScrollspyModule {} diff --git a/projects/mdb-angular-ui-kit/scrollspy/scrollspy.service.spec.ts b/projects/mdb-angular-ui-kit/scrollspy/scrollspy.service.spec.ts new file mode 100644 index 00000000..35d5d912 --- /dev/null +++ b/projects/mdb-angular-ui-kit/scrollspy/scrollspy.service.spec.ts @@ -0,0 +1,82 @@ +import { TestBed, inject } from '@angular/core/testing'; +import { QueryList } from '@angular/core'; + +import { MdbScrollspyService } from './scrollspy.service'; +import { MdbScrollspyLinkDirective } from './scrollspy-link.directive'; + +describe('ScrollspyService', () => { + let scrollspyService: MdbScrollspyService; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [MdbScrollspyService], + teardown: { destroyAfterEach: false }, + }); + + inject([MdbScrollspyService], (service: MdbScrollspyService) => { + scrollspyService = service; + })(); + }); + + it('should add new scrollspy to the list', () => { + const links = new QueryList(); + const id = 'test-scrollspy'; + scrollspyService.addScrollspy({ id, links }); + + expect(scrollspyService.scrollSpys).toEqual([{ id: 'test-scrollspy', links }]); + }); + + it('should remove scrollspy from the list', () => { + const links = new QueryList(); + const id = 'test-scrollspy'; + scrollspyService.addScrollspy({ id, links }); + + expect(scrollspyService.scrollSpys).toEqual([{ id: 'test-scrollspy', links }]); + + scrollspyService.removeScrollspy('test-scrollspy'); + + expect(scrollspyService.scrollSpys).toEqual([]); + }); + + it('should correctly set and remove link active state', () => { + const links = [ + { + id: 'test-link', + active: false, + section: 'test-section', + detectChanges: () => {}, + }, + ]; + + scrollspyService.scrollSpys = [{ id: 'test-scrollspy', links }]; + + expect(links[0].active).toBe(false); + + scrollspyService.updateActiveState('test-scrollspy', 'test-link'); + + expect(links[0].active).toBe(true); + + scrollspyService.removeActiveState('test-scrollspy', 'test-link'); + }); + + it('should correctly remove active state from all links in specific scrollspy', () => { + const links = [ + { + id: 'test-link-1', + active: true, + section: 'test-section-1', + detectChanges: () => {}, + }, + { + id: 'test-link-2', + active: true, + section: 'test-section-2', + detectChanges: () => {}, + }, + ]; + + scrollspyService.scrollSpys = [{ id: 'test-scrollspy', links }]; + + scrollspyService.removeActiveLinks('test-scrollspy'); + }); +}); diff --git a/projects/mdb-angular-ui-kit/scrollspy/scrollspy.service.ts b/projects/mdb-angular-ui-kit/scrollspy/scrollspy.service.ts new file mode 100644 index 00000000..3ee523dc --- /dev/null +++ b/projects/mdb-angular-ui-kit/scrollspy/scrollspy.service.ts @@ -0,0 +1,87 @@ +import { Injectable, QueryList } from '@angular/core'; +import { MdbScrollspyLinkDirective } from './scrollspy-link.directive'; +import { Subject, Observable } from 'rxjs'; + +export interface MdbScrollspy { + id: string; + links: QueryList; +} + +@Injectable() +export class MdbScrollspyService { + scrollSpys: MdbScrollspy[] = []; + + private activeSubject = new Subject(); + active$: Observable = this.activeSubject; + + addScrollspy(scrollSpy: MdbScrollspy): void { + this.scrollSpys.push(scrollSpy); + } + + removeScrollspy(scrollSpyId: string): void { + const scrollSpyIndex = this.scrollSpys.findIndex((spy) => { + return spy.id === scrollSpyId; + }); + this.scrollSpys.splice(scrollSpyIndex, 1); + } + + updateActiveState(scrollSpyId: string, activeLinkId: string): void { + const scrollSpy = this.scrollSpys.find((spy) => { + return spy.id === scrollSpyId; + }); + + if (!scrollSpy) { + return; + } + + const activeLink = scrollSpy.links.find((link) => { + return link.id === activeLinkId; + }); + + this.setActiveLink(activeLink); + } + + removeActiveState(scrollSpyId: string, activeLinkId: string): void { + const scrollSpy = this.scrollSpys.find((spy) => { + return spy.id === scrollSpyId; + }); + + if (!scrollSpy) { + return; + } + + const activeLink = scrollSpy.links.find((link) => { + return link.id === activeLinkId; + }); + + if (!activeLink) { + return; + } + + activeLink.active = false; + activeLink.detectChanges(); + } + + setActiveLink(activeLink: MdbScrollspyLinkDirective | any): void { + if (activeLink) { + activeLink.active = true; + activeLink.detectChanges(); + this.activeSubject.next(activeLink); + } + } + + removeActiveLinks(scrollSpyId: string): void { + const scrollSpy: MdbScrollspy | undefined = this.scrollSpys.find((spy) => { + return spy.id === scrollSpyId; + }); + + if (!scrollSpy) { + return; + } + + scrollSpy.links.forEach((link) => { + link.active = false; + link.detectChanges(); + }); + } +} diff --git a/projects/mdb-angular-ui-kit/tabs/index.ts b/projects/mdb-angular-ui-kit/tabs/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tabs/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/mdb-angular-ui-kit/tabs/ng-package.json b/projects/mdb-angular-ui-kit/tabs/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tabs/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/tabs/public_api.ts b/projects/mdb-angular-ui-kit/tabs/public_api.ts new file mode 100644 index 00000000..5be2ae78 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tabs/public_api.ts @@ -0,0 +1,7 @@ +export { MdbTabComponent } from './tab.component'; +export { MdbTabContentDirective } from './tab-content.directive'; +export { MdbTabTitleDirective } from './tab-title.directive'; +export { MdbTabsComponent } from './tabs.component'; +export { MdbTabsModule } from './tabs.module'; +export { MdbTabPortalOutlet } from './tab-outlet.directive'; +export { MdbTabChange } from './tabs.component'; diff --git a/projects/mdb-angular-ui-kit/tabs/tab-content.directive.ts b/projects/mdb-angular-ui-kit/tabs/tab-content.directive.ts new file mode 100644 index 00000000..f8e91973 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tabs/tab-content.directive.ts @@ -0,0 +1,13 @@ +import { Directive, InjectionToken, TemplateRef } from '@angular/core'; + +export const MDB_TAB_CONTENT = new InjectionToken('MdbTabContentDirective'); + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbTabContent]', + providers: [{ provide: MDB_TAB_CONTENT, useExisting: MdbTabContentDirective }], + standalone: false, +}) +export class MdbTabContentDirective { + constructor(public template: TemplateRef) {} +} diff --git a/projects/mdb-angular-ui-kit/tabs/tab-outlet.directive.ts b/projects/mdb-angular-ui-kit/tabs/tab-outlet.directive.ts new file mode 100644 index 00000000..fb7f1101 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tabs/tab-outlet.directive.ts @@ -0,0 +1,50 @@ +import { CdkPortalOutlet } from '@angular/cdk/portal'; + +import { + Directive, + Inject, + Input, + OnDestroy, + OnInit, + ViewContainerRef, + DOCUMENT, +} from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { MdbTabComponent } from './tab.component'; + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbTabPortalOutlet]', + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/directive-class-suffix +export class MdbTabPortalOutlet extends CdkPortalOutlet implements OnInit, OnDestroy { + readonly _destroy$: Subject = new Subject(); + + @Input() tab: MdbTabComponent; + + constructor(_vcr: ViewContainerRef, @Inject(DOCUMENT) _document: any) { + super(_vcr, _document); + } + + ngOnInit(): void { + super.ngOnInit(); + + if ((this.tab.shouldAttach || this.tab.active) && !this.hasAttached()) { + this.attach(this.tab.content); + } else { + this.tab.activeStateChange$.pipe(takeUntil(this._destroy$)).subscribe((isActive) => { + if (isActive && !this.hasAttached()) { + this.attach(this.tab.content); + } + }); + } + } + + ngOnDestroy(): void { + this._destroy$.next(); + this._destroy$.complete(); + super.ngOnDestroy(); + } +} diff --git a/projects/mdb-angular-ui-kit/tabs/tab-title.directive.ts b/projects/mdb-angular-ui-kit/tabs/tab-title.directive.ts new file mode 100644 index 00000000..a30be04b --- /dev/null +++ b/projects/mdb-angular-ui-kit/tabs/tab-title.directive.ts @@ -0,0 +1,13 @@ +import { Directive, InjectionToken, TemplateRef } from '@angular/core'; + +export const MDB_TAB_TITLE = new InjectionToken('MdbTabTitleDirective'); + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbTabTitle]', + providers: [{ provide: MDB_TAB_TITLE, useExisting: MdbTabTitleDirective }], + standalone: false, +}) +export class MdbTabTitleDirective { + constructor(public template: TemplateRef) {} +} diff --git a/projects/mdb-angular-ui-kit/tabs/tab.component.html b/projects/mdb-angular-ui-kit/tabs/tab.component.html new file mode 100644 index 00000000..cd48c06b --- /dev/null +++ b/projects/mdb-angular-ui-kit/tabs/tab.component.html @@ -0,0 +1 @@ + diff --git a/projects/mdb-angular-ui-kit/tabs/tab.component.ts b/projects/mdb-angular-ui-kit/tabs/tab.component.ts new file mode 100644 index 00000000..581a8427 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tabs/tab.component.ts @@ -0,0 +1,117 @@ +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { TemplatePortal } from '@angular/cdk/portal'; +import { + Component, + ContentChild, + Input, + OnInit, + TemplateRef, + ViewChild, + ViewContainerRef, +} from '@angular/core'; +import { Subject } from 'rxjs'; +import { MDB_TAB_CONTENT } from './tab-content.directive'; +import { MDB_TAB_TITLE } from './tab-title.directive'; + +const SHOW_TRANSITION_DELAY = 150; // Time of transition taken from styles +const TRANSITION_PADDING = 5; // Value from standard added via executeAfterTransition function + +@Component({ + selector: 'mdb-tab', + templateUrl: './tab.component.html', + standalone: false, +}) +export class MdbTabComponent implements OnInit { + @ContentChild(MDB_TAB_CONTENT, { read: TemplateRef, static: true }) + _lazyContent: TemplateRef; + + @ContentChild(MDB_TAB_TITLE, { read: TemplateRef, static: true }) + _titleContent: TemplateRef; + + @ViewChild(TemplateRef, { static: true }) _content: TemplateRef; + + readonly activeStateChange$: Subject = new Subject(); + + @Input() + get disabled(): boolean { + return this._disabled; + } + set disabled(value: boolean) { + this._disabled = coerceBooleanProperty(value); + } + private _disabled = false; + + @Input() + get fade(): boolean { + return this._fade; + } + set fade(value: boolean) { + this._fade = coerceBooleanProperty(value); + } + private _fade = true; + + @Input() title: string; + + get content(): TemplatePortal | null { + return this._contentPortal; + } + + get titleContent(): TemplatePortal | null { + return this._titlePortal; + } + + get shouldAttach(): boolean { + return this._lazyContent === undefined; + } + + private _contentPortal: TemplatePortal | null = null; + private _titlePortal: TemplatePortal | null = null; + + get active(): boolean { + return this._active; + } + + set active(value: boolean) { + this._active = coerceBooleanProperty(value); + this.activeStateChange$.next(value); + } + + private _active = false; + + get show(): boolean { + return this._show; + } + + set show(value: boolean) { + // We use setTimeout to apply delay for setting show class to reproduce standard library where + // show class is applied after a delay to newly activated item via usage of _queueCallback and + // executeAfterTransition functions which introduce delay equal to transition time taken from + // element styles + setTimeout(() => { + this._show = coerceBooleanProperty(value); + }, SHOW_TRANSITION_DELAY + TRANSITION_PADDING); + } + + private _show = true; + + constructor(private _vcr: ViewContainerRef) {} + + ngOnInit(): void { + this._createContentPortal(); + + if (this._titleContent) { + this._createTitlePortal(); + } + } + + private _createContentPortal(): void { + const content = this._lazyContent || this._content; + this._contentPortal = new TemplatePortal(content, this._vcr); + } + + private _createTitlePortal(): void { + this._titlePortal = new TemplatePortal(this._titleContent, this._vcr); + } + + static ngAcceptInputType_disabled: BooleanInput; +} diff --git a/projects/mdb-angular-ui-kit/tabs/tabs.animations.ts b/projects/mdb-angular-ui-kit/tabs/tabs.animations.ts new file mode 100644 index 00000000..c5504482 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tabs/tabs.animations.ts @@ -0,0 +1,30 @@ +import { + animate, + AnimationTriggerMetadata, + keyframes, + style, + transition, + trigger, + animation, + useAnimation, +} from '@angular/animations'; + +export function fadeInAnimation(): AnimationTriggerMetadata { + return trigger('fadeIn', [ + transition('0 => 1', [ + useAnimation( + animation( + [ + animate( + '500ms 0ms', + keyframes([style({ opacity: 0, offset: 0 }), style({ opacity: 1, offset: 1 })]) + ), + ], + { + delay: 0, + } + ) + ), + ]), + ]); +} diff --git a/projects/mdb-angular-ui-kit/tabs/tabs.component.html b/projects/mdb-angular-ui-kit/tabs/tabs.component.html new file mode 100644 index 00000000..85ef5ad3 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tabs/tabs.component.html @@ -0,0 +1,49 @@ + + +
+ + +
+ +
+
+
diff --git a/projects/mdb-angular-ui-kit/tabs/tabs.component.ts b/projects/mdb-angular-ui-kit/tabs/tabs.component.ts new file mode 100644 index 00000000..ed922aeb --- /dev/null +++ b/projects/mdb-angular-ui-kit/tabs/tabs.component.ts @@ -0,0 +1,156 @@ +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { + AfterContentInit, + Component, + ContentChildren, + EventEmitter, + HostBinding, + Input, + OnDestroy, + Output, + QueryList, +} from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { MdbTabComponent } from './tab.component'; + +export class MdbTabChange { + index: number; + tab: MdbTabComponent; +} + +@Component({ + selector: 'mdb-tabs', + templateUrl: './tabs.component.html', + standalone: false, +}) +export class MdbTabsComponent implements AfterContentInit, OnDestroy { + @ContentChildren(MdbTabComponent) tabs: QueryList; + + readonly _destroy$: Subject = new Subject(); + + @Input() + get fill(): boolean { + return this._fill; + } + set fill(value: boolean) { + this._fill = coerceBooleanProperty(value); + } + private _fill = false; + + @Input() + get justified(): boolean { + return this._justified; + } + set justified(value: boolean) { + this._justified = coerceBooleanProperty(value); + } + private _justified = false; + + @Input() + get pills(): boolean { + return this._pills; + } + set pills(value: boolean) { + this._pills = coerceBooleanProperty(value); + } + private _pills = false; + + @HostBinding('class.row') + @Input() + get vertical(): boolean { + return this._vertical; + } + set vertical(value: boolean) { + this._vertical = coerceBooleanProperty(value); + } + private _vertical = false; + + @Input() navColumnClass = 'col-3'; + @Input() contentColumnClass = 'col-9'; + + get navColClass(): string { + return this.vertical ? this.navColumnClass : ''; + } + + get contentColClass(): string { + return this.vertical ? this.contentColumnClass : ''; + } + + private _selectedIndex: number; + + @Output() activeTabChange: EventEmitter = new EventEmitter(); + + constructor() {} + + ngAfterContentInit(): void { + const firstActiveTabIndex = this.tabs.toArray().findIndex((tab) => !tab.disabled); + + this.setActiveTab(firstActiveTabIndex); + this.tabs.changes.pipe(takeUntil(this._destroy$)).subscribe(() => { + const hasActiveTab = this.tabs.find((tab) => tab.active); + + if (!hasActiveTab) { + const closestTabIndex = this._getClosestTabIndex(this._selectedIndex); + + if (closestTabIndex !== -1) { + this.setActiveTab(closestTabIndex); + } + } + }); + } + + setActiveTab(index: number): void { + const activeTab = this.tabs.toArray()[index]; + + if (!activeTab || (activeTab && activeTab.disabled)) { + return; + } + + this.tabs.forEach((tab) => (tab.active = tab === activeTab)); + this.tabs.forEach((tab) => (tab.show = tab === activeTab)); + + this._selectedIndex = index; + + const tabChangeEvent = this._getTabChangeEvent(index, activeTab); + this.activeTabChange.emit(tabChangeEvent); + } + + private _getTabChangeEvent(index: number, tab: MdbTabComponent): MdbTabChange { + const event = new MdbTabChange(); + event.index = index; + event.tab = tab; + + return event; + } + + private _getClosestTabIndex(index: number): number { + const tabs = this.tabs.toArray(); + const tabsLength = tabs.length; + if (!tabsLength) { + return -1; + } + + for (let i = 1; i <= tabsLength; i += 1) { + const prevIndex = index - i; + const nextIndex = index + i; + if (tabs[prevIndex] && !tabs[prevIndex].disabled) { + return prevIndex; + } + if (tabs[nextIndex] && !tabs[nextIndex].disabled) { + return nextIndex; + } + } + return -1; + } + + ngOnDestroy(): void { + this._destroy$.next(); + this._destroy$.complete(); + } + + static ngAcceptInputType_fill: BooleanInput; + static ngAcceptInputType_justified: BooleanInput; + static ngAcceptInputType_pills: BooleanInput; + static ngAcceptInputType_vertical: BooleanInput; +} diff --git a/projects/mdb-angular-ui-kit/tabs/tabs.module.ts b/projects/mdb-angular-ui-kit/tabs/tabs.module.ts new file mode 100644 index 00000000..679136a3 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tabs/tabs.module.ts @@ -0,0 +1,27 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MdbTabComponent } from './tab.component'; +import { MdbTabsComponent } from './tabs.component'; +import { PortalModule } from '@angular/cdk/portal'; +import { MdbTabContentDirective } from './tab-content.directive'; +import { MdbTabPortalOutlet } from './tab-outlet.directive'; +import { MdbTabTitleDirective } from './tab-title.directive'; + +@NgModule({ + declarations: [ + MdbTabComponent, + MdbTabContentDirective, + MdbTabTitleDirective, + MdbTabPortalOutlet, + MdbTabsComponent, + ], + imports: [CommonModule, PortalModule], + exports: [ + MdbTabComponent, + MdbTabContentDirective, + MdbTabTitleDirective, + MdbTabPortalOutlet, + MdbTabsComponent, + ], +}) +export class MdbTabsModule {} diff --git a/projects/mdb-angular-ui-kit/tabs/tabs.spec.ts b/projects/mdb-angular-ui-kit/tabs/tabs.spec.ts new file mode 100644 index 00000000..3b9eb2af --- /dev/null +++ b/projects/mdb-angular-ui-kit/tabs/tabs.spec.ts @@ -0,0 +1,287 @@ +import { Component, QueryList, ViewChild, ViewChildren } from '@angular/core'; +import { ComponentFixture, fakeAsync, flush, TestBed, tick } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { MdbTabComponent } from './tab.component'; +import { MdbTabsComponent } from './tabs.component'; +import { MdbTabsModule } from './tabs.module'; + +const tabsTemplate = ` + + Tab 1 content + Tab 2 content + Tab 3 content + + + Tab 4 + + Tab content 4 + + Hidden tab content + +`; + +@Component({ + template: tabsTemplate, + standalone: false, +}) +export class TabsTestComponent { + pills = false; + fill = false; + justified = false; + vertical = false; + navColumnClass = 'col-3'; + contentColumnClass = 'col-9'; + firstTabDisabled = true; + secondTabDisabled = false; + thirdTabDisabled = false; + showHiddenTab = false; + + @ViewChild(MdbTabsComponent) tabsComponent: MdbTabsComponent; + @ViewChildren(MdbTabComponent) tabComponents: QueryList; +} + +describe('MDB Tabs', () => { + let fixture: ComponentFixture; + let component: TabsTestComponent; + let tabsComponent: MdbTabsComponent; + + beforeEach(fakeAsync(() => { + TestBed.configureTestingModule({ + declarations: [TabsTestComponent], + imports: [MdbTabsModule, NoopAnimationsModule], + teardown: { destroyAfterEach: false }, + }); + + fixture = TestBed.createComponent(TabsTestComponent); + component = fixture.componentInstance; + + fixture.detectChanges(); + tick(); + flush(); + + tabsComponent = component.tabsComponent; + })); + + it('should activate first available tab', () => { + fixture.detectChanges(); + + const tabs = component.tabComponents.toArray(); + + expect(tabs[0].active).toBe(false); + expect(tabs[1].active).toBe(true); + }); + + it('should set show to true and apply show class on first available tab', () => { + fixture.detectChanges(); + + const tabs = component.tabComponents.toArray(); + const tabPanes = fixture.debugElement.queryAll(By.css('.tab-pane')); + + expect(tabs[0].show).toBe(false); + expect(tabs[1].show).toBe(true); + expect(tabs[2].show).toBe(false); + expect(tabPanes[0].nativeElement.classList.contains('show')).toBe(false); + expect(tabPanes[1].nativeElement.classList.contains('show')).toBe(true); + expect(tabPanes[2].nativeElement.classList.contains('show')).toBe(false); + }); + + it('should change active tab on tab button click', () => { + fixture.detectChanges(); + + const tabs = component.tabComponents.toArray(); + const tabLinks = fixture.debugElement.queryAll(By.css('.nav-link')); + + expect(tabs[1].active).toBe(true); + + tabLinks[2].nativeElement.click(); + fixture.detectChanges(); + + expect(tabs[2].active).toBe(true); + }); + + it('should apply show class after 155ms delay on tab button click', fakeAsync(() => { + fixture.detectChanges(); + flush(); + + const tabs = component.tabComponents.toArray(); + const tabLinks = fixture.debugElement.queryAll(By.css('.nav-link')); + const tabPanes = fixture.debugElement.queryAll(By.css('.tab-pane')); + + expect(tabs[1].active).toBe(true); + expect(tabs[1].show).toBe(true); + expect(tabPanes[1].nativeElement.classList.contains('show')).toBe(true); + expect(tabs[2].active).toBe(false); + expect(tabs[2].show).toBe(false); + expect(tabPanes[2].nativeElement.classList.contains('show')).toBe(false); + + tabLinks[2].nativeElement.click(); + fixture.detectChanges(); + + expect(tabs[1].active).toBe(false); + expect(tabs[1].show).toBe(true); + expect(tabPanes[1].nativeElement.classList.contains('show')).toBe(true); + expect(tabs[2].active).toBe(true); + expect(tabs[2].show).toBe(false); + expect(tabPanes[2].nativeElement.classList.contains('show')).toBe(false); + + tick(155); + fixture.detectChanges(); + + expect(tabs[1].active).toBe(false); + expect(tabs[1].show).toBe(false); + expect(tabPanes[1].nativeElement.classList.contains('show')).toBe(false); + expect(tabs[2].active).toBe(true); + expect(tabs[2].show).toBe(true); + expect(tabPanes[2].nativeElement.classList.contains('show')).toBe(true); + })); + + it('should add active class to active tab link', () => { + fixture.detectChanges(); + + const tabLinks = fixture.debugElement.queryAll(By.css('.nav-link')); + + expect(tabLinks[1].nativeElement.classList.contains('active')).toBe(true); + + tabLinks[2].nativeElement.click(); + fixture.detectChanges(); + + expect(tabLinks[2].nativeElement.classList.contains('active')).toBe(true); + }); + + it('should add disabled class to disabled tab link', () => { + fixture.detectChanges(); + + const tabLinks = fixture.debugElement.queryAll(By.css('.nav-link')); + + expect(tabLinks[0].nativeElement.classList.contains('disabled')).toBe(true); + }); + + it('should add nav-pills class if pills input is set to true', () => { + component.pills = true; + fixture.detectChanges(); + + const tabNav = fixture.debugElement.query(By.css('.nav')); + + expect(tabNav.nativeElement.classList.contains('nav-pills')).toBe(true); + }); + + it('should add nav-fill class if fill input is set to true', () => { + component.fill = true; + fixture.detectChanges(); + + const tabNav = fixture.debugElement.query(By.css('.nav')); + + expect(tabNav.nativeElement.classList.contains('nav-fill')).toBe(true); + }); + + it('should add nav-justified class if justified input is set to true', () => { + component.justified = true; + fixture.detectChanges(); + + const tabNav = fixture.debugElement.query(By.css('.nav')); + + expect(tabNav.nativeElement.classList.contains('nav-justified')).toBe(true); + }); + + it('should add flex-column and text-center classes if vertical input is set to true', () => { + component.vertical = true; + fixture.detectChanges(); + + const tabNav = fixture.debugElement.query(By.css('.nav')); + + expect(tabNav.nativeElement.classList.contains('flex-column')).toBe(true); + expect(tabNav.nativeElement.classList.contains('text-center')).toBe(true); + }); + + it('should not set nav and content column classes on horizontal tabs', () => { + component.vertical = false; + fixture.detectChanges(); + + const tabNav = fixture.debugElement.query(By.css('.nav')); + const tabContent = fixture.debugElement.query(By.css('.tab-content')); + + expect(tabNav.nativeElement.classList.contains('col-3')).toBe(false); + expect(tabContent.nativeElement.classList.contains('col-9')).toBe(false); + }); + + it('should correctly set and update nav and content column classes on vertical tabs', () => { + component.vertical = true; + fixture.detectChanges(); + + const tabNav = fixture.debugElement.query(By.css('.nav')); + const tabContent = fixture.debugElement.query(By.css('.tab-content')); + + expect(tabNav.nativeElement.classList.contains('col-3')).toBe(true); + expect(tabContent.nativeElement.classList.contains('col-9')).toBe(true); + + component.navColumnClass = 'col-6'; + component.contentColumnClass = 'col-6'; + fixture.detectChanges(); + + expect(tabNav.nativeElement.classList.contains('col-3')).toBe(false); + expect(tabContent.nativeElement.classList.contains('col-9')).toBe(false); + expect(tabNav.nativeElement.classList.contains('col-6')).toBe(true); + expect(tabContent.nativeElement.classList.contains('col-6')).toBe(true); + }); + + it('should not activate disabled tab programmaticaly', () => { + const tabs = component.tabComponents.toArray(); + + expect(tabs[0].disabled).toBe(true); + expect(tabs[0].active).toBe(false); + + component.tabsComponent.setActiveTab(0); + fixture.detectChanges(); + + expect(tabs[0].active).toBe(false); + }); + + it('should not change current active tab when tab list is updated', () => { + const tabs = component.tabComponents.toArray(); + + expect(tabs[1].active).toBe(true); + + component.showHiddenTab = true; + fixture.detectChanges(); + + expect(tabs[1].active).toBe(true); + }); + + it('should activate first available on tab list change if no tab is active', () => { + let tabs = component.tabComponents.toArray(); + + expect(tabs[1].active).toBe(true); + + tabs[1].active = false; + component.secondTabDisabled = true; + fixture.detectChanges(); + + component.showHiddenTab = true; + fixture.detectChanges(); + + tabs = component.tabComponents.toArray(); + + expect(tabs[1].active).toBe(false); + expect(tabs[2].active).toBe(true); + }); + + it('should render custom title content when mdbTabTitle directive and ng-template is used', () => { + const span = fixture.nativeElement.querySelector('span'); + const customTabIcon = span.querySelector('i'); + + expect(customTabIcon).toBeTruthy(); + expect(span.textContent).toEqual('Tab 4'); + }); + + it('should lazy load tab content if mdbTabContent directive and ng-template is used', () => { + const tabPanes = fixture.nativeElement.querySelectorAll('.tab-pane'); + + expect(tabPanes[3].textContent).toEqual(''); + + component.tabsComponent.setActiveTab(3); + fixture.detectChanges(); + + expect(tabPanes[3].textContent).toEqual('Tab content 4'); + }); +}); diff --git a/projects/mdb-angular-ui-kit/tooltip/index.ts b/projects/mdb-angular-ui-kit/tooltip/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tooltip/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/mdb-angular-ui-kit/tooltip/ng-package.json b/projects/mdb-angular-ui-kit/tooltip/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tooltip/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/tooltip/public_api.ts b/projects/mdb-angular-ui-kit/tooltip/public_api.ts new file mode 100644 index 00000000..8e4beb2b --- /dev/null +++ b/projects/mdb-angular-ui-kit/tooltip/public_api.ts @@ -0,0 +1,4 @@ +export { MdbTooltipDirective } from './tooltip.directive'; +export { MdbTooltipModule } from './tooltip.module'; +export { MdbTooltipPosition } from './tooltip.types'; +export { MdbTooltipComponent } from './tooltip.component'; diff --git a/projects/mdb-angular-ui-kit/tooltip/tooltip.component.html b/projects/mdb-angular-ui-kit/tooltip/tooltip.component.html new file mode 100644 index 00000000..1b58b751 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tooltip/tooltip.component.html @@ -0,0 +1,17 @@ +
+
+ {{ title }} +
diff --git a/projects/mdb-angular-ui-kit/tooltip/tooltip.component.ts b/projects/mdb-angular-ui-kit/tooltip/tooltip.component.ts new file mode 100644 index 00000000..2d09ecac --- /dev/null +++ b/projects/mdb-angular-ui-kit/tooltip/tooltip.component.ts @@ -0,0 +1,46 @@ +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + HostBinding, + Input, +} from '@angular/core'; +import { trigger, style, animate, transition, state, AnimationEvent } from '@angular/animations'; +import { Subject } from 'rxjs'; +@Component({ + selector: 'mdb-tooltip', + templateUrl: 'tooltip.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + animations: [ + trigger('fade', [ + state('visible', style({ opacity: 1 })), + state('hidden', style({ opacity: 0 })), + transition('visible => hidden', animate('150ms linear')), + transition(':enter', animate('150ms linear')), + ]), + ], + standalone: false, +}) +export class MdbTooltipComponent { + @Input() title: string; + @Input() html: boolean; + @Input() animation: boolean; + + @HostBinding('class.tooltip') tooltip = true; + + readonly _hidden: Subject = new Subject(); + + animationState = 'hidden'; + + constructor(private _cdRef: ChangeDetectorRef) {} + + markForCheck(): void { + this._cdRef.markForCheck(); + } + + onAnimationEnd(event: AnimationEvent): void { + if (event.toState === 'hidden') { + this._hidden.next(); + } + } +} diff --git a/projects/mdb-angular-ui-kit/tooltip/tooltip.directive.spec.ts b/projects/mdb-angular-ui-kit/tooltip/tooltip.directive.spec.ts new file mode 100644 index 00000000..3e4c063b --- /dev/null +++ b/projects/mdb-angular-ui-kit/tooltip/tooltip.directive.spec.ts @@ -0,0 +1,190 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { Component } from '@angular/core'; +import { MdbTooltipModule } from './index'; +import { MdbTooltipDirective } from './tooltip.directive'; +import { By } from '@angular/platform-browser'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; + +describe('MDB Tooltip', () => { + describe('after init', () => { + let fixture: ComponentFixture; + let element: any; + let component: any; + let directive: any; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [MdbTooltipModule, NoopAnimationsModule], + declarations: [TestTooltipComponent], + teardown: { destroyAfterEach: false }, + }); + fixture = TestBed.createComponent(TestTooltipComponent); + component = fixture.componentInstance; + element = fixture.nativeElement; + fixture.detectChanges(); + }); + + it('should create the component', () => { + expect(component).toBeTruthy(); + }); + + it('should open tooltip after mouseenter and close after mouseout', () => { + fixture.detectChanges(); + + directive = fixture.debugElement + .query(By.directive(MdbTooltipDirective)) + .injector.get(MdbTooltipDirective) as MdbTooltipDirective; + + const onOpen = jest.spyOn(directive, 'show'); + const onClose = jest.spyOn(directive, 'hide'); + + const buttonEl = fixture.nativeElement.querySelector('button'); + + buttonEl.dispatchEvent(new Event('mouseenter')); + fixture.detectChanges(); + + expect(directive.show).toHaveBeenCalled(); + + directive.open = true; + buttonEl.dispatchEvent(new Event('mouseleave')); + fixture.detectChanges(); + + expect(directive.hide).toHaveBeenCalled(); + }); + + it('should set tooltip title', () => { + jest.useFakeTimers(); + const buttonEl = fixture.nativeElement.querySelector('button'); + + buttonEl.dispatchEvent(new Event('mouseenter')); + jest.runAllTimers(); + + fixture.detectChanges(); + const tooltip = document.querySelector('.tooltip-inner'); + expect(tooltip.textContent).toMatch(component.testMdbTooltip); + }); + + it('should set placement', () => { + jest.useFakeTimers(); + const buttonEl = fixture.nativeElement.querySelector('button'); + + buttonEl.dispatchEvent(new Event('mouseenter')); + jest.runAllTimers(); + + fixture.detectChanges(); + directive = fixture.debugElement + .query(By.directive(MdbTooltipDirective)) + .injector.get(MdbTooltipDirective) as MdbTooltipDirective; + + const placement = directive._overlayRef._config.positionStrategy._lastPosition.originY; + expect(placement).toMatch('top'); + }); + }); + + describe('onInit', () => { + it('should open/close tooltip after click', () => { + let fixture: ComponentFixture; + let directive: any; + let component: any; + let element: any; + + TestBed.configureTestingModule({ + imports: [MdbTooltipModule], + declarations: [TestTooltipComponent2], + teardown: { destroyAfterEach: false }, + }); + fixture = TestBed.createComponent(TestTooltipComponent2); + component = fixture.componentInstance; + element = fixture.nativeElement; + fixture.detectChanges(); + + directive = fixture.debugElement + .query(By.directive(MdbTooltipDirective)) + .injector.get(MdbTooltipDirective) as MdbTooltipDirective; + + const onOpen = jest.spyOn(directive, 'show'); + const onClose = jest.spyOn(directive, 'hide'); + + const buttonEl = fixture.nativeElement.querySelector('button'); + + buttonEl.dispatchEvent(new Event('click')); + fixture.detectChanges(); + + expect(directive.show).toHaveBeenCalled(); + + directive._open = true; + buttonEl.dispatchEvent(new Event('click')); + fixture.detectChanges(); + + expect(directive.hide).toHaveBeenCalled(); + }); + }); + + it('should prevent open', () => { + let fixture: ComponentFixture; + let directive: any; + let component: any; + let element: any; + + TestBed.configureTestingModule({ + imports: [MdbTooltipModule], + declarations: [TestTooltipComponent3], + teardown: { destroyAfterEach: false }, + }); + fixture = TestBed.createComponent(TestTooltipComponent3); + component = fixture.componentInstance; + element = fixture.nativeElement; + fixture.detectChanges(); + + directive = fixture.debugElement + .query(By.directive(MdbTooltipDirective)) + .injector.get(MdbTooltipDirective) as MdbTooltipDirective; + + const onOpen = jest.spyOn(directive, 'show'); + + const buttonEl = fixture.nativeElement.querySelector('button'); + + buttonEl.dispatchEvent(new Event('click')); + fixture.detectChanges(); + + expect(directive.show).not.toHaveBeenCalled(); + }); +}); + +@Component({ + selector: 'mdb-test-tooltip', + template: ` `, + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +class TestTooltipComponent { + testTrigger = 'hover'; + testMdbTooltip = 'tooltipTitle'; + testPlacement = 'top'; + testDisabled = false; +} + +@Component({ + selector: 'mdb-test-tooltip2', + template: ` `, + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +class TestTooltipComponent2 {} + +@Component({ + selector: 'mdb-test-tooltip2', + template: ` `, + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +class TestTooltipComponent3 {} diff --git a/projects/mdb-angular-ui-kit/tooltip/tooltip.directive.ts b/projects/mdb-angular-ui-kit/tooltip/tooltip.directive.ts new file mode 100644 index 00000000..265e3bd3 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tooltip/tooltip.directive.ts @@ -0,0 +1,235 @@ +import { + ComponentRef, + Directive, + ElementRef, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, +} from '@angular/core'; +import { + ConnectedPosition, + Overlay, + OverlayConfig, + OverlayPositionBuilder, + OverlayRef, +} from '@angular/cdk/overlay'; +import { ComponentPortal } from '@angular/cdk/portal'; +import { MdbTooltipComponent } from './tooltip.component'; +import { MdbTooltipPosition } from './tooltip.types'; +import { fromEvent, Subject } from 'rxjs'; +import { first, takeUntil } from 'rxjs/operators'; + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbTooltip]', + exportAs: 'mdbTooltip', + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +export class MdbTooltipDirective implements OnInit, OnDestroy { + @Input() mdbTooltip = ''; + @Input() tooltipDisabled = false; + @Input() placement: MdbTooltipPosition = 'top'; + @Input() html = false; + @Input() animation = true; + @Input() trigger = 'hover focus'; + @Input() delayShow = 0; + @Input() delayHide = 0; + @Input() offset = 6; + + @Output() tooltipShow: EventEmitter = new EventEmitter(); + @Output() tooltipShown: EventEmitter = new EventEmitter(); + @Output() tooltipHide: EventEmitter = new EventEmitter(); + @Output() tooltipHidden: EventEmitter = new EventEmitter(); + + private _overlayRef: OverlayRef; + private _tooltipRef: ComponentRef; + private _open = false; + private _showTimeout: any = 0; + private _hideTimeout: any = 0; + + readonly _destroy$: Subject = new Subject(); + + constructor( + private _overlay: Overlay, + private _overlayPositionBuilder: OverlayPositionBuilder, + private _elementRef: ElementRef + ) {} + + ngOnInit(): void { + if (this.tooltipDisabled || this.mdbTooltip === '') { + return; + } + + this._bindTriggerEvents(); + } + + ngOnDestroy(): void { + if (this._open || this._showTimeout) { + this.hide(); + } + + this._destroy$.next(); + this._destroy$.complete(); + } + + private _bindTriggerEvents(): void { + const triggers = this.trigger.split(' '); + + triggers.forEach((trigger) => { + if (trigger === 'click') { + fromEvent(this._elementRef.nativeElement, trigger) + .pipe(takeUntil(this._destroy$)) + .subscribe(() => this.toggle()); + } else if (trigger !== 'manual') { + const evIn = trigger === 'hover' ? 'mouseenter' : 'focusin'; + const evOut = trigger === 'hover' ? 'mouseleave' : 'focusout'; + + fromEvent(this._elementRef.nativeElement, evIn) + .pipe(takeUntil(this._destroy$)) + .subscribe(() => this.show()); + fromEvent(this._elementRef.nativeElement, evOut) + .pipe(takeUntil(this._destroy$)) + .subscribe(() => this.hide()); + } + }); + } + + private _createOverlayConfig(): OverlayConfig { + const positionStrategy = this._overlayPositionBuilder + .flexibleConnectedTo(this._elementRef) + .withPositions(this._getPosition()); + const overlayConfig = new OverlayConfig({ + hasBackdrop: false, + scrollStrategy: this._overlay.scrollStrategies.reposition(), + positionStrategy, + }); + + return overlayConfig; + } + + private _createOverlay(): void { + this._overlayRef = this._overlay.create(this._createOverlayConfig()); + } + + private _getPosition(): ConnectedPosition[] { + let position; + + const positionTop = { + originX: 'center', + originY: 'top', + overlayX: 'center', + overlayY: 'bottom', + offsetY: -this.offset, + }; + + const positionBottom = { + originX: 'center', + originY: 'bottom', + overlayX: 'center', + overlayY: 'top', + offsetY: this.offset, + }; + + const positionRight = { + originX: 'end', + originY: 'center', + overlayX: 'start', + overlayY: 'center', + offsetX: this.offset, + }; + + const positionLeft = { + originX: 'start', + originY: 'center', + overlayX: 'end', + overlayY: 'center', + offsetX: -this.offset, + }; + + switch (this.placement) { + case 'top': + position = [positionTop, positionBottom]; + break; + case 'bottom': + position = [positionBottom, positionTop]; + break; + case 'left': + position = [positionLeft, positionRight]; + break; + case 'right': + position = [positionRight, positionLeft]; + break; + default: + break; + } + + return position; + } + + show(): void { + if (this._hideTimeout || this._open) { + this._overlayRef.detach(); + clearTimeout(this._hideTimeout); + this._hideTimeout = null; + } + + this._createOverlay(); + + this._showTimeout = setTimeout(() => { + if (!this._overlayRef.hasAttached()) { + const tooltipPortal = new ComponentPortal(MdbTooltipComponent); + + this.tooltipShow.emit(this); + this._open = true; + + this._tooltipRef = this._overlayRef.attach(tooltipPortal); + this._tooltipRef.instance.title = this.mdbTooltip; + this._tooltipRef.instance.html = this.html; + this._tooltipRef.instance.animation = this.animation; + this._tooltipRef.instance.animationState = 'visible'; + + this._tooltipRef.instance.markForCheck(); + + this.tooltipShown.emit(this); + } + }, this.delayShow); + } + + hide(): void { + if (this._showTimeout) { + clearTimeout(this._showTimeout); + this._showTimeout = null; + } else { + return; + } + + this._hideTimeout = setTimeout(() => { + this.tooltipHide.emit(this); + + if (!this._tooltipRef) { + this._overlayRef.detach(); + this._open = false; + this.tooltipHidden.emit(this); + } else { + this._tooltipRef.instance._hidden.pipe(first()).subscribe(() => { + this._overlayRef.detach(); + this._open = false; + this.tooltipHidden.emit(this); + }); + this._tooltipRef.instance.animationState = 'hidden'; + this._tooltipRef.instance.markForCheck(); + } + }, this.delayHide); + } + + toggle(): void { + if (this._open) { + this.hide(); + } else { + this.show(); + } + } +} diff --git a/projects/mdb-angular-ui-kit/tooltip/tooltip.module.ts b/projects/mdb-angular-ui-kit/tooltip/tooltip.module.ts new file mode 100644 index 00000000..845b1bfc --- /dev/null +++ b/projects/mdb-angular-ui-kit/tooltip/tooltip.module.ts @@ -0,0 +1,12 @@ +import { MdbTooltipDirective } from './tooltip.directive'; +import { NgModule } from '@angular/core'; +import { OverlayModule } from '@angular/cdk/overlay'; +import { CommonModule } from '@angular/common'; +import { MdbTooltipComponent } from './tooltip.component'; + +@NgModule({ + imports: [CommonModule, OverlayModule], + declarations: [MdbTooltipDirective, MdbTooltipComponent], + exports: [MdbTooltipDirective, MdbTooltipComponent], +}) +export class MdbTooltipModule {} diff --git a/projects/mdb-angular-ui-kit/tooltip/tooltip.types.ts b/projects/mdb-angular-ui-kit/tooltip/tooltip.types.ts new file mode 100644 index 00000000..677da187 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tooltip/tooltip.types.ts @@ -0,0 +1 @@ +export type MdbTooltipPosition = 'top' | 'right' | 'bottom' | 'left'; diff --git a/projects/mdb-angular-ui-kit/tsconfig.lib.json b/projects/mdb-angular-ui-kit/tsconfig.lib.json new file mode 100644 index 00000000..ea356ef5 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tsconfig.lib.json @@ -0,0 +1,24 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [], + "lib": [ + "dom", + "es2018" + ] + }, + "angularCompilerOptions": { + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "enableResourceInlining": true + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/projects/mdb-angular-ui-kit/tsconfig.lib.prod.json b/projects/mdb-angular-ui-kit/tsconfig.lib.prod.json new file mode 100644 index 00000000..06de549e --- /dev/null +++ b/projects/mdb-angular-ui-kit/tsconfig.lib.prod.json @@ -0,0 +1,10 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/projects/mdb-angular-ui-kit/tsconfig.schematics.json b/projects/mdb-angular-ui-kit/tsconfig.schematics.json new file mode 100644 index 00000000..ff47ee5f --- /dev/null +++ b/projects/mdb-angular-ui-kit/tsconfig.schematics.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "lib": ["es2018", "dom"], + "declaration": true, + "module": "commonjs", + "moduleResolution": "node", + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedParameters": true, + "noUnusedLocals": true, + "rootDir": "schematics", + "outDir": "../../dist/mdb-angular-ui-kit/schematics", + "skipDefaultLibCheck": true, + "skipLibCheck": true, + "sourceMap": true, + "strictNullChecks": true, + "target": "es6", + "types": ["jasmine", "node"] + }, + "include": ["schematics/"], + "exclude": [] +} diff --git a/projects/mdb-angular-ui-kit/tsconfig.spec.json b/projects/mdb-angular-ui-kit/tsconfig.spec.json new file mode 100644 index 00000000..372750f4 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tsconfig.spec.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": ["jest"], + "module": "commonjs", + "emitDecoratorMetadata": true, + "allowJs": true + }, + "files": [], + "include": ["**/*.spec.ts", "**/*.d.ts"] +} diff --git a/projects/mdb-angular-ui-kit/tslint.json b/projects/mdb-angular-ui-kit/tslint.json new file mode 100644 index 00000000..124133f8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "lib", + "camelCase" + ], + "component-selector": [ + true, + "element", + "lib", + "kebab-case" + ] + } +} diff --git a/projects/mdb-angular-ui-kit/validation/error.directive.ts b/projects/mdb-angular-ui-kit/validation/error.directive.ts new file mode 100644 index 00000000..ad7c17ea --- /dev/null +++ b/projects/mdb-angular-ui-kit/validation/error.directive.ts @@ -0,0 +1,60 @@ +import { + Input, + HostBinding, + ElementRef, + Renderer2, + OnInit, + OnDestroy, + Component, +} from '@angular/core'; +import { fromEvent, Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +let defaultIdNumber = 0; + +@Component({ + selector: 'mdb-error', + template: '', + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +export class MdbErrorDirective implements OnInit, OnDestroy { + @Input() id = `mdb-error-${defaultIdNumber++}`; + + @HostBinding('class.error-message') errorMsg = true; + @HostBinding('attr.id') messageId = this.id; + + readonly _destroy$: Subject = new Subject(); + + constructor(private _elementRef: ElementRef, private renderer: Renderer2) {} + + private _getClosestEl(el: any, selector: string): HTMLElement | null { + for (; el && el !== document; el = el.parentNode) { + if (el.matches && el.matches(selector)) { + return el; + } + } + return null; + } + + ngOnInit(): void { + const textarea = this._getClosestEl(this._elementRef.nativeElement, 'textarea'); + + if (textarea) { + let height = textarea.offsetHeight + 4 + 'px'; + this.renderer.setStyle(this._elementRef.nativeElement, 'top', height); + + fromEvent(textarea, 'keyup') + .pipe(takeUntil(this._destroy$)) + .subscribe(() => { + height = textarea.offsetHeight + 4 + 'px'; + this.renderer.setStyle(this._elementRef.nativeElement, 'top', height); + }); + } + } + + ngOnDestroy(): void { + this._destroy$.next(); + this._destroy$.complete(); + } +} diff --git a/projects/mdb-angular-ui-kit/validation/index.ts b/projects/mdb-angular-ui-kit/validation/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/mdb-angular-ui-kit/validation/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/mdb-angular-ui-kit/validation/ng-package.json b/projects/mdb-angular-ui-kit/validation/ng-package.json new file mode 100644 index 00000000..ecef3ed8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/validation/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "index.ts" + } +} \ No newline at end of file diff --git a/projects/mdb-angular-ui-kit/validation/public_api.ts b/projects/mdb-angular-ui-kit/validation/public_api.ts new file mode 100644 index 00000000..5aa0ed87 --- /dev/null +++ b/projects/mdb-angular-ui-kit/validation/public_api.ts @@ -0,0 +1,4 @@ +export { MdbValidateDirective } from './validate.directive'; +export { MdbErrorDirective } from './error.directive'; +export { MdbSuccessDirective } from './success.directive'; +export { MdbValidationModule } from './validation.module'; diff --git a/projects/mdb-angular-ui-kit/validation/success.directive.ts b/projects/mdb-angular-ui-kit/validation/success.directive.ts new file mode 100644 index 00000000..0eeeacc5 --- /dev/null +++ b/projects/mdb-angular-ui-kit/validation/success.directive.ts @@ -0,0 +1,60 @@ +import { + Input, + HostBinding, + ElementRef, + Renderer2, + OnInit, + OnDestroy, + Component, +} from '@angular/core'; +import { fromEvent, Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +let defaultIdNumber = 0; + +@Component({ + selector: 'mdb-success', + template: '', + standalone: false, +}) +// eslint-disable-next-line @angular-eslint/component-class-suffix +export class MdbSuccessDirective implements OnInit, OnDestroy { + @Input() id = `mdb-success-${defaultIdNumber++}`; + + @HostBinding('class.success-message') successMsg = true; + @HostBinding('attr.id') messageId = this.id; + + readonly _destroy$: Subject = new Subject(); + + constructor(private _elementRef: ElementRef, private renderer: Renderer2) {} + + private _getClosestEl(el: any, selector: string): HTMLElement | null { + for (; el && el !== document; el = el.parentNode) { + if (el.matches && el.matches(selector)) { + return el; + } + } + return null; + } + + ngOnInit(): void { + const textarea = this._getClosestEl(this._elementRef.nativeElement, 'textarea'); + + if (textarea) { + let height = textarea.offsetHeight + 4 + 'px'; + this.renderer.setStyle(this._elementRef.nativeElement, 'top', height); + + fromEvent(textarea, 'keyup') + .pipe(takeUntil(this._destroy$)) + .subscribe(() => { + height = textarea.offsetHeight + 4 + 'px'; + this.renderer.setStyle(this._elementRef.nativeElement, 'top', height); + }); + } + } + + ngOnDestroy(): void { + this._destroy$.next(); + this._destroy$.complete(); + } +} diff --git a/projects/mdb-angular-ui-kit/validation/validate.directive.spec.ts b/projects/mdb-angular-ui-kit/validation/validate.directive.spec.ts new file mode 100644 index 00000000..eb24d105 --- /dev/null +++ b/projects/mdb-angular-ui-kit/validation/validate.directive.spec.ts @@ -0,0 +1,63 @@ +import { Component } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MdbValidationModule } from './validation.module'; + +const template = ` + +`; + +@Component({ + selector: 'mdb-collapse-test', + template, + standalone: false, +}) +class TestValidateComponent { + success = true; + error = true; +} + +describe('MDB Collapse', () => { + let fixture: ComponentFixture; + let element: any; + let component: any; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [TestValidateComponent], + imports: [MdbValidationModule], + teardown: { destroyAfterEach: false }, + }); + fixture = TestBed.createComponent(TestValidateComponent); + fixture.detectChanges(); + component = fixture.componentInstance; + element = fixture.nativeElement; + }); + + it('should add validation classes', () => { + const input = fixture.nativeElement.querySelector('.input'); + expect(input.classList.contains('validate-success')).toBe(true); + expect(input.classList.contains('validate-error')).toBe(true); + }); + + it('should only add validate-success class if validateError is set to false', () => { + component.success = true; + component.error = false; + fixture.detectChanges(); + + const input = fixture.nativeElement.querySelector('.input'); + + expect(input.classList.contains('validate-success')).toBe(true); + expect(input.classList.contains('validate-error')).toBe(false); + }); + + it('should only add validate-error class if validateSuccess is set to false', () => { + component.success = false; + component.error = true; + fixture.detectChanges(); + + const input = fixture.nativeElement.querySelector('.input'); + + expect(input.classList.contains('validate-success')).toBe(false); + expect(input.classList.contains('validate-error')).toBe(true); + }); +}); diff --git a/projects/mdb-angular-ui-kit/validation/validate.directive.ts b/projects/mdb-angular-ui-kit/validation/validate.directive.ts new file mode 100644 index 00000000..41d649b8 --- /dev/null +++ b/projects/mdb-angular-ui-kit/validation/validate.directive.ts @@ -0,0 +1,79 @@ +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { Directive, ElementRef, Input, OnInit, Renderer2 } from '@angular/core'; + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: '[mdbValidate]', + standalone: false, +}) +export class MdbValidateDirective implements OnInit { + private _validate = true; + private _validateSuccess = true; + private _validateError = true; + + @Input() + get mdbValidate(): boolean { + return this._mdbValidate; + } + set mdbValidate(value: boolean) { + this._mdbValidate = coerceBooleanProperty(value); + } + private _mdbValidate: boolean; + + @Input() + get validate(): boolean { + return this._validate; + } + set validate(value: boolean) { + this._validate = coerceBooleanProperty(value); + this.updateErrorClass(); + this.updateSuccessClass(); + } + + @Input() + get validateSuccess(): boolean { + return this._validateSuccess; + } + set validateSuccess(value: boolean) { + this._validateSuccess = coerceBooleanProperty(value); + this.updateSuccessClass(); + } + + @Input() + get validateError(): boolean { + return this._validateError; + } + set validateError(value: boolean) { + this._validateError = coerceBooleanProperty(value); + this.updateErrorClass(); + this.updateSuccessClass(); + } + + constructor(private renderer: Renderer2, private _elementRef: ElementRef) {} + + updateSuccessClass(): void { + if (this.validate && this.validateSuccess) { + this.renderer.addClass(this._elementRef.nativeElement, 'validate-success'); + } else { + this.renderer.removeClass(this._elementRef.nativeElement, 'validate-success'); + } + } + + updateErrorClass(): void { + if (this.validate && this.validateError) { + this.renderer.addClass(this._elementRef.nativeElement, 'validate-error'); + } else { + this.renderer.removeClass(this._elementRef.nativeElement, 'validate-error'); + } + } + + ngOnInit(): void { + this.updateSuccessClass(); + this.updateErrorClass(); + } + + static ngAcceptInputType_mdbValidate: BooleanInput; + static ngAcceptInputType_validate: BooleanInput; + static ngAcceptInputType_validateSuccess: BooleanInput; + static ngAcceptInputType_validateError: BooleanInput; +} diff --git a/projects/mdb-angular-ui-kit/validation/validation.module.ts b/projects/mdb-angular-ui-kit/validation/validation.module.ts new file mode 100644 index 00000000..8c2c5f2f --- /dev/null +++ b/projects/mdb-angular-ui-kit/validation/validation.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MdbErrorDirective } from './error.directive'; +import { MdbSuccessDirective } from './success.directive'; +import { MdbValidateDirective } from './validate.directive'; + +@NgModule({ + imports: [CommonModule], + declarations: [MdbErrorDirective, MdbSuccessDirective, MdbValidateDirective], + exports: [MdbErrorDirective, MdbSuccessDirective, MdbValidateDirective], +}) +export class MdbValidationModule {} diff --git a/setup-jest.ts b/setup-jest.ts new file mode 100644 index 00000000..eb5e4856 --- /dev/null +++ b/setup-jest.ts @@ -0,0 +1,30 @@ +import 'jest-preset-angular'; + +/* global mocks for jsdom */ +const mock = () => { + let storage: { [key: string]: string } = {}; + return { + getItem: (key: string) => (key in storage ? storage[key] : null), + setItem: (key: string, value: string) => (storage[key] = value || ''), + removeItem: (key: string) => delete storage[key], + clear: () => (storage = {}), + }; +}; + +Object.defineProperty(window, 'localStorage', { value: mock() }); +Object.defineProperty(window, 'sessionStorage', { value: mock() }); +Object.defineProperty(window, 'getComputedStyle', { + value: () => ['-webkit-appearance'], +}); + +Object.defineProperty(document.body.style, 'transform', { + value: () => { + return { + enumerable: true, + configurable: true, + }; + }, +}); + +/* output shorter and more meaningful Zone error stack traces */ +// Error.stackTraceLimit = 2; diff --git a/src/angular-bootstrap-md/.directory b/src/angular-bootstrap-md/.directory deleted file mode 100755 index 43f29452..00000000 --- a/src/angular-bootstrap-md/.directory +++ /dev/null @@ -1,10 +0,0 @@ -[Dolphin] -PreviewsShown=true -SortOrder=1 -SortRole=modificationtime -Timestamp=2018,4,20,11,20,20 -Version=4 -VisibleRoles=Icons_text,Icons_modificationtime - -[Settings] -HiddenFilesShown=true diff --git a/src/angular-bootstrap-md/README.md b/src/angular-bootstrap-md/README.md deleted file mode 100755 index d0594d2f..00000000 --- a/src/angular-bootstrap-md/README.md +++ /dev/null @@ -1,177 +0,0 @@ -[![Angular-Bootstrap-with-Material-Design](https://mdbootstrap.com/img/Mockups/MDB-post/angular-about5.jpg)](https://mdbootstrap.com/angular/) - -# Angular Bootstrap with Material Design - -[![npm version](https://badge.fury.io/js/angular-bootstrap-md.svg)](https://badge.fury.io/js/angular-bootstrap-md) - -Built with Angular 5, Bootstrap 4 and TypeScript. CLI version available. Absolutely no jQuery. - -400+ material UI elements, 600+ material icons, 74 CSS animations, TypeScript modules, SASS files and many more. - -All fully responsive. All compatible with different browsers. - -__________ - -# Demo: -**Main demo**: https://mdbootstrap.com/angular/components/ - -# Version: -- Angular CLI 1.5.0 - 6.0.2 -- Angular 5.0.0 - 6.0.2 - -# Quick start -- Clone following repo: -```javascript -git clone https://github.com/mdbootstrap/Angular-Bootstrap-with-Material-Design.git . -``` -note "." at the end. It will clone files directly into current folder. -- Run `npm i` -- Run `npm start` -- Voilà! Open browser and visit http://localhost:4200 - -Now you can navigate to our documentation (http://mdbootstrap.com/angular/), pick any component and place within your project. - -# How to install MDB via npm: -- create new project `ng new project_name --style=scss` -- `npm i angular-bootstrap-md --save` -- to app.module.ts add -```javascript -import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core'; -import { MDBBootstrapModule } from 'angular-bootstrap-md'; - -@NgModule({ - imports: [ - MDBBootstrapModule.forRoot() - ], - schemas: [ NO_ERRORS_SCHEMA ] -}); -``` -- in angular-cli.json change: - -`"styleExt": "css"` to `"styleExt": "scss"` - -rename /src/styles.css to styles.scss - -- if you want to change styles in exisiting project you can use `ng set defaults.styleExt scss` - -- add below lines to angular-cli.json: -```javascript -"styles": [ - "../node_modules/font-awesome/scss/font-awesome.scss", - "../node_modules/angular-bootstrap-md/scss/bootstrap/bootstrap.scss", - "../node_modules/angular-bootstrap-md/scss/mdb-free.scss", - "./styles.scss" -], -"scripts": [ - "../node_modules/chart.js/dist/Chart.js", - "../node_modules/hammerjs/hammer.min.js" -], -``` -- install external libs -```bash -npm install -–save chart.js@2.5.0 font-awesome hammerjs -``` - -### Run server -```bash -ng serve --open -``` - -## Getting started: - -http://mdbootstrap.com/angular/getting-started/ - -**5min Quick Start**: https://mdbootstrap.com/angular/5min-quickstart/ - -# Additional tutorials: - -**MDB - Bootstrap tutorial**: https://mdbootstrap.com/bootstrap-tutorial/ - -**MDB - Wordpress tutorial**: https://mdbootstrap.com/wordpress-tutorial/ - -# PRO version: - -**Angular Bootstrap with Material Design PRO (from $79)**: https://mdbootstrap.com/product/angular-bootstrap-pro/ - -## Documentation: -**Huge, detailed documentation avilable online on**: http://mdbootstrap.com/angular/ - -# Highlights: -**Bootstrap 4** -Up-to-date with the latest standards of Bootstrap 4 and all the best it has to offer. - -**Angular CLI** -A command line interface handling all the tedious tasks for you out of the box. - -**Detailed documentation** -Intuitive and user-friendly documentation, created with a copy-paste approach. - -**No jQuery** -Writing you code with pure Angular is now quicker, easier, and cleaner. - -**TypeScript** -Superset of JavaScript that compiles to clean JavaScript output. - -**Angular 6** -Create smarter and faster Angular apps with the latest official Angular release. - -**Cross-browser compatibility** -Works perfectly with Chrome, Firefox, IE, Safari, Opera and Microsoft Edge. - -**Frequent updates** -Expect any bugs being fixed in a matter of days. - -**Active community** -MDB is broadly used by professionals on multiple levels, who are ready to aid you. - -**Modularity** -Use TypeScript modules to compile package adjusted yo your needs. - -**Useful helpers** -Reduce the frequency of highly repetitive declarations in your CSS. - -**Technical support** -Every day we help our users with their issues and problems. - -**SASS files** -Thought-out .scss files come in a compile-ready form. - -**Flexbox** -Full support of Flexbox layout system lets you forget about alignment issues. - - -A big **thank you to all our users** who are working with us to improve the software. We wouldn't be where we are without you. - - -# Useful Links: - -Getting started: https://mdbootstrap.com/angular-bootstrap-getting-started/ - -5 min quick start: https://mdbootstrap.com/angular/5min-quickstart/ - -Material Design + Bootstrap Tutorial: https://mdbootstrap.com/bootstrap-tutorial/ - -Material Design + WordPress Tutorial: https://mdbootstrap.com/wordpress-tutorial/ - -Freebies: https://mdbootstrap.com/freebies/ - -Premium Templates: https://mdbootstrap.com/templates/ - -Changelog: https://mdbootstrap.com/angular/changelog/ - -# Social Media: - -Twitter: https://twitter.com/MDBootstrap - -Facebook: https://www.facebook.com/mdbootstrap - -Pinterest: https://pl.pinterest.com/mdbootstrap - -Google+: https://plus.google.com/u/0/b/107863090883699620484/+Mdbootstrap/posts - -Dribbble: https://dribbble.com/mdbootstrap - -LinkedIn: https://www.linkedin.com/company/material-design-for-bootstrap - -## Contact: -office@mdbootstrap.com diff --git a/src/angular-bootstrap-md/buttons/buttons.module.ts b/src/angular-bootstrap-md/buttons/buttons.module.ts deleted file mode 100755 index bc805fa0..00000000 --- a/src/angular-bootstrap-md/buttons/buttons.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; - -import { ButtonCheckboxDirective } from './checkbox.directive'; -import { ButtonRadioDirective } from './radio.directive'; - -@NgModule({ - declarations: [ButtonCheckboxDirective, ButtonRadioDirective], - exports: [ButtonCheckboxDirective, ButtonRadioDirective] -}) -export class ButtonsModule { - public static forRoot(): ModuleWithProviders { - return {ngModule: ButtonsModule, providers: []}; - } -} diff --git a/src/angular-bootstrap-md/buttons/checkbox.directive.ts b/src/angular-bootstrap-md/buttons/checkbox.directive.ts deleted file mode 100755 index 9d0700c1..00000000 --- a/src/angular-bootstrap-md/buttons/checkbox.directive.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Directive, HostBinding, HostListener, Input, OnInit, forwardRef } from '@angular/core'; -import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; - -// TODO: config: activeClass - Class to apply to the checked buttons - -export const CHECKBOX_CONTROL_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ButtonCheckboxDirective), - multi: true -}; - -/** -* Add checkbox functionality to any element -*/ -@Directive({selector: '[mdbCheckbox]', providers: [CHECKBOX_CONTROL_VALUE_ACCESSOR]}) -export class ButtonCheckboxDirective implements ControlValueAccessor, OnInit { - /** Truthy value, will be set to ngModel */ - @Input() public btnCheckboxTrue: any = true; - /** Falsy value, will be set to ngModel */ - @Input() public btnCheckboxFalse: any = false; - - @HostBinding('class.active') public state = false; - - protected value: any; - protected isDisabled: boolean; - - protected onChange: any = Function.prototype; - protected onTouched: any = Function.prototype; - - // view -> model - @HostListener('click') - public onClick(): void { - if (this.isDisabled) { - return; - } - - this.toggle(!this.state); - this.onChange(this.value); - } - - public ngOnInit(): any { - this.toggle(this.trueValue === this.value); - } - - protected get trueValue(): boolean { - return typeof this.btnCheckboxTrue !== 'undefined' - ? this.btnCheckboxTrue - : true; - } - - protected get falseValue(): boolean { - return typeof this.btnCheckboxFalse !== 'undefined' - ? this.btnCheckboxFalse - : false; - } - - public toggle(state: boolean): void { - this.state = state; - this.value = this.state ? this.trueValue : this.falseValue; - } - - // ControlValueAccessor - // model -> view - public writeValue(value: any): void { - this.state = this.trueValue === value; - this.value = value ? this.trueValue : this.falseValue; - } - - public setDisabledState(isDisabled: boolean): void { - this.isDisabled = isDisabled; - } - - public registerOnChange(fn: (_: any) => {}): void { - this.onChange = fn; - } - - public registerOnTouched(fn: () => {}): void { - this.onTouched = fn; - } -} diff --git a/src/angular-bootstrap-md/buttons/index.ts b/src/angular-bootstrap-md/buttons/index.ts deleted file mode 100755 index 99b59e51..00000000 --- a/src/angular-bootstrap-md/buttons/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { ButtonsModule } from './buttons.module'; -export { ButtonRadioDirective } from './radio.directive'; -export { ButtonCheckboxDirective } from './checkbox.directive'; diff --git a/src/angular-bootstrap-md/buttons/licens.md b/src/angular-bootstrap-md/buttons/licens.md deleted file mode 100755 index 68dc12fd..00000000 --- a/src/angular-bootstrap-md/buttons/licens.md +++ /dev/null @@ -1 +0,0 @@ -https://github.com/valor-software/ngx-bootstrap/blob/development/LICENSE \ No newline at end of file diff --git a/src/angular-bootstrap-md/buttons/radio.directive.ts b/src/angular-bootstrap-md/buttons/radio.directive.ts deleted file mode 100755 index 16888030..00000000 --- a/src/angular-bootstrap-md/buttons/radio.directive.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { Directive, ElementRef, HostBinding, forwardRef, HostListener, Input, OnInit, Renderer2 } from '@angular/core'; -import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; - -export const RADIO_CONTROL_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ButtonRadioDirective), - multi: true -}; - -/** -* Create radio buttons or groups of buttons. -* A value of a selected button is bound to a variable specified via ngModel. -*/ -@Directive({ selector: '[mdbRadio]', providers: [RADIO_CONTROL_VALUE_ACCESSOR] }) -export class ButtonRadioDirective implements ControlValueAccessor, OnInit { - public onChange: any = Function.prototype; - public onTouched: any = Function.prototype; - - radioElementsArray: Array = []; - /** Radio button value, will be set to `ngModel` */ - @Input() public mdbRadio: any; - /** If `true` — radio button can be unchecked */ - @Input() public uncheckable: boolean; - /** Current value of radio component or group */ - @Input() public value: any; - - protected el: ElementRef; - - @HostBinding('class.active') - public get isActive(): boolean { - return this.mdbRadio === this.value; - } - - // @HostBinding('class.active') - @HostListener('click', ['$event']) - public onClick(event?: any): void { - try { - this.el.nativeElement.parentElement.childNodes.forEach(element => { - this.radioElementsArray.push(element); - }); - this.radioElementsArray.forEach(element => { - this.renderer.removeClass(element, 'active'); - }); - this.renderer.addClass(event.target, 'active'); - } catch (error) { - - } - if (this.el.nativeElement.attributes.disabled) { - return; - } - - if (this.uncheckable && this.mdbRadio === this.value) { - this.value = undefined; - } else { - this.value = this.mdbRadio; - } - - this.onTouched(); - this.onChange(this.value); - } - - public constructor(el: ElementRef, private renderer: Renderer2) { - this.el = el; - } - - public ngOnInit(): void { - this.uncheckable = typeof this.uncheckable !== 'undefined'; - } - - public onBlur(): void { - this.onTouched(); - } - - // ControlValueAccessor - // model -> view - public writeValue(value: any): void { - this.value = value; - } - - public registerOnChange(fn: any): void { - this.onChange = fn; - } - - public registerOnTouched(fn: any): void { - this.onTouched = fn; - } -} diff --git a/src/angular-bootstrap-md/carousel/carousel.component.html b/src/angular-bootstrap-md/carousel/carousel.component.html deleted file mode 100755 index 07b7a5fc..00000000 --- a/src/angular-bootstrap-md/carousel/carousel.component.html +++ /dev/null @@ -1,23 +0,0 @@ - \ No newline at end of file diff --git a/src/angular-bootstrap-md/carousel/carousel.component.ts b/src/angular-bootstrap-md/carousel/carousel.component.ts deleted file mode 100755 index 24ec6f7d..00000000 --- a/src/angular-bootstrap-md/carousel/carousel.component.ts +++ /dev/null @@ -1,457 +0,0 @@ -import { Component, Input, OnDestroy, Output, EventEmitter, ElementRef, HostListener } from '@angular/core'; - - import { isBs3 } from '../utils/ng2-bootstrap-config'; - import { LinkedList } from '../utils/linked-list.class'; - import { SlideComponent } from './slide.component'; - import { CarouselConfig } from './carousel.config'; - - export enum Direction {UNKNOWN, NEXT, PREV} - -/** -* Base element to create carousel -*/ -@Component({ - selector: 'mdb-carousel', - templateUrl: './carousel.component.html', -}) - -export class CarouselComponent implements OnDestroy { - SWIPE_ACTION = { LEFT: 'swipeleft', RIGHT: 'swiperight' }; - - protected _slides: LinkedList = new LinkedList(); - public get slides(): SlideComponent[] { - return this._slides.toArray(); - } - - protected currentInterval: any; - protected isPlaying: boolean; - protected destroyed = false; - // protected el: ElementRef = null; - protected el: ElementRef | any = null; - protected animationEnd = true; - - /** If `true` — carousel will not cycle continuously and will have hard stops (prevent looping) */ - @Input() public noWrap: boolean; - /** If `true` — will disable pausing on carousel mouse hover */ - @Input() public noPause: boolean; - - @Input('isControls') public isControls: boolean = true; - @Input() public keyboard: boolean; - - @Input('class') public class: String = ''; - @Input('type') public type: String = ''; - @Input('animation') public animation: String = ''; - - // protected _currentActiveSlide: number; - protected _currentActiveSlide: number | any ; - - /** Will be emitted when active slide has been changed. Part of two-way-bindable [(activeSlide)] property */ - @Output() public activeSlideChange: EventEmitter = new EventEmitter(false); - - /** Index of currently displayed slide(started for 0) */ - @Input() - public set activeSlide(index: number) { - if (this._slides.length && index !== this._currentActiveSlide) { - this._select(index); - } - } - public get activeSlide(): number { - return this._currentActiveSlide; - } - - protected _interval: number; - - public checkNavigation() { - if (this.type === 'carousel-multi-item') { - return false; - } - return true; - - } - - public checkDots() { - if (this.type === 'carousel-thumbnails') { - return false; - } - - - return true; - } - - getImg(slide: any) { - return slide.el.nativeElement.querySelector('img').src; - } - - /** - * Delay of item cycling in milliseconds. If false, carousel won't cycle automatically. - */ - @Input() - public get interval(): number { - return this._interval; - } - public set interval(value: number) { - this._interval = value; - this.restartTimer(); - } - - public get isBs4(): boolean { - return !isBs3(); - } - - public constructor(config: CarouselConfig, el: ElementRef) { - Object.assign(this, config); - this.el = el; - } - - public ngOnDestroy(): void { - this.destroyed = true; - } - - /** - * Adds new slide. If this slide is first in collection - set it as active and starts auto changing - * @param slide - */ - public addSlide(slide: SlideComponent): void { - this._slides.add(slide); - if (this._slides.length === 1) { - this._currentActiveSlide = void 0; - this.activeSlide = 0; - this.play(); - } - } - - /** - * Removes specified slide. If this slide is active - will roll to another slide - * @param slide - */ - public removeSlide(slide: SlideComponent): void { - const remIndex = this._slides.indexOf(slide); - - if (this._currentActiveSlide === remIndex) { - - // removing of active slide - // let nextSlideIndex: number = void 0; - let nextSlideIndex: number | any = void 0; - if (this._slides.length > 1) { - // if this slide last - will roll to first slide, if noWrap flag is FALSE or to previous, if noWrap is TRUE - // in case, if this slide in middle of collection, index of next slide is same to removed - nextSlideIndex = !this.isLast(remIndex) ? remIndex : - this.noWrap ? remIndex - 1 : 0; - } - this._slides.remove(remIndex); - - // prevents exception with changing some value after checking - setTimeout(() => { - this._select(nextSlideIndex); - }, 0); - } else { - this._slides.remove(remIndex); - const currentSlideIndex = this.getCurrentSlideIndex(); - setTimeout(() => { - // after removing, need to actualize index of current active slide - this._currentActiveSlide = currentSlideIndex; - this.activeSlideChange.emit(this._currentActiveSlide); - }, 0); - - } - } - // Fixed problem while cannot swipe next / previous image while using HammerJS. - swipe(action = this.SWIPE_ACTION.RIGHT) { - if (action === this.SWIPE_ACTION.RIGHT) { - this.previousSlide(); - } - - if (action === this.SWIPE_ACTION.LEFT) { - this.nextSlide(); - } - } - - - /** - * Rolling to next slide - * @param force: {boolean} if true - will ignore noWrap flag - */ - public nextSlide(force: boolean = false) { - if (this.animation === 'slide') { - this.pause(); - const direction = Direction.NEXT; - this.slideAnimation(this.findNextSlideIndex(direction, force), direction); - } else if (this.animation === 'fade') { - this.pause(); - this.fadeAnimation(this.findNextSlideIndex(Direction.NEXT, force)); - } else { - this.activeSlide = this.findNextSlideIndex(Direction.NEXT, force); - } - - } - - /** - * Rolling to previous slide - * @param force: {boolean} if true - will ignore noWrap flag - */ - public previousSlide(force: boolean = false): void { - if (this.animation === 'slide') { - this.pause(); - const direction = Direction.PREV; - this.slideAnimation(this.findNextSlideIndex(direction, force), direction); - } else if (this.animation === 'fade') { - this.pause(); - this.fadeAnimation(this.findNextSlideIndex(Direction.PREV, force)); - } else { - this.activeSlide = this.findNextSlideIndex(Direction.PREV, force); - } - } - - protected fadeAnimation(goToIndex: number) { - //const currentSlide = this._slides.get(this._currentActiveSlide); - const goToSlide = this._slides.get(goToIndex); - - if (this.animationEnd) { - this.animationEnd = false; - - goToSlide.directionNext = true; - - setTimeout(() => { - goToSlide.directionNext = false; - this.animationEnd = true; - - this.activeSlide = goToIndex; - - this.play(); - }, 100); - } - } - - protected slideAnimation(goToIndex: number, direction: any) { - - const currentSlide = this._slides.get(this._currentActiveSlide); - const goToSlide = this._slides.get(goToIndex); - - if (this.animationEnd) { - if (direction === Direction.NEXT) { - this.animationEnd = false; - goToSlide.directionNext = true; - setTimeout(() => { - goToSlide.directionLeft = true; - currentSlide.directionLeft = true; - }, 100); - } - - if (direction === Direction.PREV) { - this.animationEnd = false; - - goToSlide.directionPrev = true; - setTimeout(() => { - goToSlide.directionRight = true; - currentSlide.directionRight = true; - }, 100); - } - - setTimeout(() => { - goToSlide.directionLeft = false; - goToSlide.directionNext = false; - currentSlide.directionLeft = false; - currentSlide.directionNext = false; - goToSlide.directionRight = false; - goToSlide.directionPrev = false; - currentSlide.directionRight = false; - currentSlide.directionPrev = false; - - this.animationEnd = true; - - this.activeSlide = goToIndex; - - let directionName; - if (direction === Direction.NEXT) { - directionName = 'Next'; - } else if (direction === Direction.PREV) { - directionName = 'Prev'; - } - - this.activeSlideChange.emit({'direction': directionName, 'relatedTarget': this.activeSlide}); - this.play(); - }, 700); - } - } - - - - /** - * Rolling to specified slide - * @param index: {number} index of slide, which must be shown - */ - public selectSlide(index: number): void { - this.pause(); - if (this.animation === 'slide') { - - if (this.activeSlide < index) { - this.slideAnimation(index, Direction.NEXT); - } else if (this.activeSlide > index) { - this.slideAnimation(index, Direction.PREV); - } - } else if (this.animation === 'fade') { - if (index !== this.activeSlide) { - this.fadeAnimation(index); - } - } - this.play(); - } - - /** - * Starts a auto changing of slides - */ - @HostListener('mouseleave') play() { - if (!this.isPlaying) { - this.isPlaying = true; - this.restartTimer(); - } - } - - /** - * Stops a auto changing of slides - */ - @HostListener('mouseenter') pause() { - if (!this.noPause) { - this.isPlaying = false; - this.resetTimer(); - } - } - - /** - * Finds and returns index of currently displayed slide - */ - public getCurrentSlideIndex(): number { - return this._slides.findIndex((slide: SlideComponent) => slide.active); - } - - /** - * Defines, whether the specified index is last in collection - */ - public isLast(index: number): boolean { - return index + 1 >= this._slides.length; - } - - /** - * Defines next slide index, depending of direction - * @param direction: Direction(UNKNOWN|PREV|NEXT) - * @param force: {boolean} if TRUE - will ignore noWrap flag, else will return undefined if next slide require wrapping - - */ - private findNextSlideIndex(direction: Direction, force: boolean): any { - let nextSlideIndex = 0; - - if (!force && (this.isLast(this.activeSlide) && direction !== Direction.PREV && this.noWrap)) { - return void 0; - } - - switch (direction) { - case Direction.NEXT: - // if this is last slide, not force, looping is disabled and need to going forward - select current slide, as a next - nextSlideIndex = (!this.isLast(this._currentActiveSlide)) ? this._currentActiveSlide + 1 : - (!force && this.noWrap ) ? this._currentActiveSlide : 0; - break; - case Direction.PREV: - // if this is first slide, not force, looping is disabled and need to going backward - select current slide, as a next - nextSlideIndex = (this._currentActiveSlide > 0) ? this._currentActiveSlide - 1 : - (!force && this.noWrap ) ? this._currentActiveSlide : this._slides.length - 1; - break; - default: - throw new Error('Unknown direction'); - } - return nextSlideIndex; - } - - /** - * Sets a slide, which specified through index, as active - * @param index - */ - private _select(index: number): void { - if (isNaN(index)) { - this.pause(); - return; - } - const currentSlide = this._slides.get(this._currentActiveSlide); - if (currentSlide) { - currentSlide.active = false; - } - const nextSlide = this._slides.get(index); - if (nextSlide) { - this._currentActiveSlide = index; - nextSlide.active = true; - this.activeSlide = index; - // this.activeSlideChange.emit(index); - } - } - - /** - * Starts loop of auto changing of slides - */ - private restartTimer(): any { - this.resetTimer(); - const interval = +this.interval; - if (!isNaN(interval) && interval > 0) { - this.currentInterval = setInterval( - () => { - const nInterval = +this.interval; - if (this.isPlaying && !isNaN(this.interval) && nInterval > 0 && this.slides.length) { - this.nextSlide(); - } else { - this.pause(); - } - }, - interval); - } - } - - /** - * Stops loop of auto changing of slides - */ - private resetTimer(): void { - if (this.currentInterval) { - clearInterval(this.currentInterval); - this.currentInterval = void 0; - } - } - - protected hasClass(el: any, className: any) { - if (el.classList) { - return el.classList.contains(className); - } else { - return !!el.className.match(new RegExp('(\\s|^)' + className + '(\\s|$)')); - } - } - - protected classAdd(el: any, className: any) { - if (el.classList) { - el.classList.add(className); - } else if (!this.hasClass(el, className)) { - el.className += ' ' + className; - } - } - - protected removeClass(el: any, className: any) { - if (el.classList) { - el.classList.remove(className); - } else if (this.hasClass(el, className)) { - const reg = new RegExp('(\\s|^)' + className + '(\\s|$)'); - el.className = el.className.replace(reg, ' '); - } - } - - @HostListener('keyup', ['$event']) keyboardControl(event: KeyboardEvent) { - if (this.keyboard) { - if (event.keyCode === 39) { - this.nextSlide(); - } - - if (event.keyCode === 37) { - this.previousSlide(); - } - } - - } - @HostListener('click', ['$event']) focus() { - this.el.nativeElement.focus(); - } - - } diff --git a/src/angular-bootstrap-md/carousel/carousel.config.ts b/src/angular-bootstrap-md/carousel/carousel.config.ts deleted file mode 100755 index 21fbe1ff..00000000 --- a/src/angular-bootstrap-md/carousel/carousel.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable() -export class CarouselConfig { - /** Default interval of auto changing of slides */ - public interval = 5000; - - /** Is loop of auto changing of slides can be paused */ - public noPause = false; - - /** Is slides can wrap from the last to the first slide */ - public noWrap = false; - - public keyboard = false; -} diff --git a/src/angular-bootstrap-md/carousel/carousel.module.ts b/src/angular-bootstrap-md/carousel/carousel.module.ts deleted file mode 100755 index 777217cd..00000000 --- a/src/angular-bootstrap-md/carousel/carousel.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule, ModuleWithProviders } from '@angular/core'; - -import { CarouselComponent } from './carousel.component'; -import { SlideComponent } from './slide.component'; -import { CarouselConfig } from './carousel.config'; - -@NgModule({ - imports: [CommonModule], - declarations: [SlideComponent, CarouselComponent], - exports: [SlideComponent, CarouselComponent], - providers: [CarouselConfig] -}) -export class CarouselModule { - public static forRoot(): ModuleWithProviders { - return {ngModule: CarouselModule, providers: []}; - } -} diff --git a/src/angular-bootstrap-md/carousel/index.ts b/src/angular-bootstrap-md/carousel/index.ts deleted file mode 100755 index 322baeaa..00000000 --- a/src/angular-bootstrap-md/carousel/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { CarouselComponent } from './carousel.component'; -export { CarouselModule } from './carousel.module'; -export { SlideComponent } from './slide.component'; -export { CarouselConfig } from './carousel.config'; diff --git a/src/angular-bootstrap-md/carousel/licens.md b/src/angular-bootstrap-md/carousel/licens.md deleted file mode 100755 index 68dc12fd..00000000 --- a/src/angular-bootstrap-md/carousel/licens.md +++ /dev/null @@ -1 +0,0 @@ -https://github.com/valor-software/ngx-bootstrap/blob/development/LICENSE \ No newline at end of file diff --git a/src/angular-bootstrap-md/carousel/slide.component.ts b/src/angular-bootstrap-md/carousel/slide.component.ts deleted file mode 100755 index c7dc53c5..00000000 --- a/src/angular-bootstrap-md/carousel/slide.component.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Component, HostBinding, OnDestroy, Input, OnInit, ElementRef } from '@angular/core'; - -import { CarouselComponent } from './carousel.component'; - -@Component({ - selector: 'mdb-slide', - template: ` - - ` -}) -export class SlideComponent implements OnInit, OnDestroy { - - /** Is current slide active */ - @HostBinding('class.active') - @Input() public active: boolean; - @HostBinding('class.animated') animated = false; - @HostBinding('class.carousel-item-next') directionNext = false; - @HostBinding('class.carousel-item-left') directionLeft = false; - @HostBinding('class.carousel-item-prev') directionPrev = false; - @HostBinding('class.carousel-item-right') directionRight = false; - /** Wraps element by appropriate CSS classes */ - @HostBinding('class.carousel-item') - - - /** Link to Parent(container-collection) component */ - protected carousel: CarouselComponent; - // public el: ElementRef = null; - public el: ElementRef | any = null; - - public constructor(carousel: CarouselComponent, el: ElementRef) { - this.carousel = carousel; - this.el = el; - } - - /** Fires changes in container collection after adding a new slide instance */ - public ngOnInit(): void { - this.carousel.addSlide(this); - } - - /** Fires changes in container collection after removing of this slide instance */ - public ngOnDestroy(): void { - this.carousel.removeSlide(this); - } -} diff --git a/src/angular-bootstrap-md/changelog b/src/angular-bootstrap-md/changelog deleted file mode 100644 index 80839b6b..00000000 --- a/src/angular-bootstrap-md/changelog +++ /dev/null @@ -1,206 +0,0 @@ -6.1.1 -*** NOTE: *** -You may need to rename the modules you are using in your application. The list of modified modules is presented below. - -In 6.1.0 we have made it possible to import only those modules that you actually use in your application. -If only individual modules are used, import them but do not import the MDBBootstrapModulesPro main module as this may cause errors. - -*** What's new: *** - Source code delivered to customers is now compilated to .js instead of .ts, - There's now possibility to import only those modules, which you need in your project. Full module list: https://mdbootstrap.com/angular/modules-list - Changed names of few modules: - * MDBChartsModule -> ChartsModule, - * BsDropdownModule -> DropdownModule, - * MDBTooltipModule -> TooltipModule, - * SqueezeBoxModule -> AccordionModule, - * Ng2CompleterModule -> AutocompleteModule, - * MDBDatePickerModule -> DatepickerModule, - * MDBUploaderModule -> FileInputModule, - * MDBPageScrollModule -> SmoothscrollModule, - * MdbStickyModule -> StickyContentModule, - * MaterialRootModule -> PreloadersModule. - -*** Fixes: *** - Fixed missing space in mdb-angular.scss file, - Added close icon to Autocomplete, - Fixed problem with prefilling Char Counter value, - Fixed problem with overlapping label & error / success messages with mdbInputDirective, - Fixed problem with focusing inputs through TAB key. - - -6.0.2 -*** General: *** - Changed Renderer to Renderer2. - -*** Fixes: *** - Unnable to scroll in Sidenav, - Fixed problems with skins, - Fixed mobile view in DatePicker, - Fixed problem with scrolling page to the top edge in DatePicker, - Fixed problem with scrolling page to the top edge in TimePicker. - - -6.0.1 -*** Fixes: *** - Fix for dropdowns, dropup variation, - Fix for fixed button when collapsing (need to pass $event in .toggle() method), - Few fixes in scss - -6.0.0 -*** NOTE: Most of the components have been rebuilt. Please, check the ones you use in your project. *** - -*** General: *** - - Compatible with MDB 4.5.1, - Compatible with Angular 6.0.0-rc.5, rxjs 6.0.0-uncanny-rc.7 and rxjs-compat 6.0.0-uncanny-rc.7, - Compatible with Angular CLI ^1.7.1. - -*** NOTE 2: For proper using Angular 6 with MDB Angular 6 please check, if you're using rxjs in version at least 6.0.0-uncanny-rc.7 and rxjs-compat in version at least 6.0.0-uncanny-rc.7. Using older versions may produce errors and problems. *** - -*** Marked as deprecated: *** - - mdbActive, - mdbInputValidate, - mdbDeepDirective, - mdbRippleRadius. - -mdbInputDirective has three of the above directives - mdbActive, mdbInputValidate and mdbDeepDirective. - -mdbActive is used by default and we do not anticipate that you will be able to disable it. - -mdbInputValidate is used by default, but the user can disable validation by using the [mdbValidate]="false" control on input which contains mdbInputDirective. - -mdbDeepDirective is used by default when used on a checkbox or radio. It is possible to disable it by using [focusCheckbox]="false" and [focusRadio]="false". - -mdbRippleRadius was changed to mdbWavesEffect. mdbRippleRadius will be deleted after next release. - -*** Fixes: *** - - Fix for z-index in few scenarios (tabs & datePicker), navbar and other, - Fixed clearUnselected in Autocomplete, - Fix for mdbActive in Autocomplete. - -*** Features: *** - - Added feature to close datePicker after selecting an date (closeAfterSelect: true) in datePicker options object. - -*** Docs: *** - - New category Forms, - Autocomplete, Inputs, Input Validation, Forms moved from Components to Forms, - Material Select moved from Advanced to Forms, - Input Groups moved from Extended to Forms, - Added instructions how to update Angular projects: https://mdbootstrap.com/getting-started/update-instructions/ - Added instructions how to create project with Angular Universal: https://mdbootstrap.com/getting-started/universal/ - -*** Changed syntax: *** - - Cards, - Flipping Cards, - Intros, - Sections, - Inputs, - Footers, - Preloaders, - Masks, - Hover Effects, - Accordion, - Modals, - -5.2.3 -*** Compatibility with Angular Universal (Server-Side Rendering) ***. Read tutorial. -Improved dropdown animation in Material Select, -Fixed problem with dropdown transition in Material Select, -"Not Found" message in Material Select will be visible only when filtering does not show results , -Fix for top / bottom arrow in Material Select, -Added possibility to overwrite $image-path variable. - -5.2.2 -Hotfixes not included in 5.2.1 patch - -5.2.1 -Enhanced mdbActive directive - works with data prefilled by browser -Sidenav issue fixed (skin is optional) -Fixed with rounded buttons inside input group -Fixed for dropdown not getting closed after click in other dropdown. -Fix for line breaking label in checkboxes - -5.2.0 -Updated to Bootstrap 4 stable version -Integration with .NET CORE - tutorial here -Compatibility with Angular 5.2.1 and CLI 1.6.5 -noImplicitAny and strictNullChecks compatibility -New validation added (number, tel, submit) + custom validation regex. Read tutorial. -Configurable labels for DatePicker - -5.1.2 -Angular 5.2.1 and CLI 1.6.5 compatibility -Extended docs for modals - auto focus on input -Fixed validation for email and password -Aria attributes added to datepicker -Added filtering options to Material Select -Support for IE+ and Edge for Double Navigation -Extended DatePicker with new functionality: -Important! -By default date picker will load now +- 7 years starting from current year. It can be overwritten using minYear and maxYear parameters: - -import { Component } from '@angular/core'; -import { IMyOptions } from 'your_path_to/date-picker/index'; - -@Component({ - selector: 'date-picker-component-example', - templateUrl: 'toast.component.html' -}) - - export class DatePickerComponentExample { - public myDatePickerOptions: IMyOptions = { - minYear: 2015, - maxYear: 2017 - }; -} - -5.1.1 -Double navigation - support for collapsed sidenav and navbar -Extended documentation for Autocomplete -Auto resize function for collapse added -Mobile gestures carousel support added -Added option to hide next / prev buttons in carousel -Fix for: Module has no exported member 'MDBSpinningPreloader' -Automatically set date in DatePicker using ngModel -Fixed docs for File Upload - -5.1.0 -Angular 5.1.3 and CLI 1.6.3. compatibility -Fixed issue with exceeding text tabs component -Auto-close navbar after click into link (check documentation for more information) -Fixed problem with error/success message on Firefox -Fixed problems with selecting hour on mobile devices in Timepicker -Extended configuration options of easy pie charts (check documentation for more information) -Fixed for relative path in _skins.scss -Fixed issue with date picker for Firefox -Enhanced support for small screen resolution in Datepicker (<575 px) -Fix for issue while using multiple MDB Autocomplete components - -5.0.5 -Added compatibility with noUnusedLocals - -5.0.4 -Added compatibility with noUnusedParameters - -5.0.3 -Fixed missing arrow in popovers - -5.0.2 -Fixed circular dependencies error. - -5.0.1 -Fixed for imgPath in .scss - -5.0.0 -Version 5.0.0 brings brings compatibility with new Angular 5.0 and CLI 1.5. Except for that new update include Bootstrap 4 Beta 2 assets. - -What's new in Bootstrap 4 beta-2: - -Restored `.offset-*` classes -Switched Breadcrumbs from `float` to Flexbox -Dropped support for Bower \ No newline at end of file diff --git a/src/angular-bootstrap-md/charts/chart.directive.ts b/src/angular-bootstrap-md/charts/chart.directive.ts deleted file mode 100755 index 908a74fc..00000000 --- a/src/angular-bootstrap-md/charts/chart.directive.ts +++ /dev/null @@ -1,280 +0,0 @@ -import { - OnDestroy, - OnInit, - OnChanges, - EventEmitter, - ElementRef, - Input, - Output, - SimpleChanges, - Directive -} from '@angular/core'; - -import { Color } from './color.service'; -import { Colors } from './colors.service'; - -import { isPlatformBrowser } from '@angular/common'; -import { PLATFORM_ID, Inject } from '@angular/core'; -declare var Chart: any; - -@Directive({ selector: 'canvas[mdbChart]', exportAs: 'mdb-base-chart' }) -export class BaseChartDirective implements OnDestroy, OnChanges, OnInit, Colors { - public static defaultColors: Array = [ - [255, 99, 132], - [54, 162, 235], - [255, 206, 86], - [231, 233, 237], - [75, 192, 192], - [151, 187, 205], - [220, 220, 220], - [247, 70, 74], - [70, 191, 189], - [253, 180, 92], - [148, 159, 177], - [77, 83, 96] - ]; - - @Input() public data: number[] | any[]; - @Input() public datasets: any[]; - @Input() public labels: Array = []; - @Input() public options: any = { - legend: { display: false } - }; - @Input() public chartType: string; - @Input() public colors: Array; - @Input() public legend = false; - - @Output() public chartClick: EventEmitter = new EventEmitter(); - @Output() public chartHover: EventEmitter = new EventEmitter(); - - public ctx: any; - public chart: any; - cvs: any; - initFlag = false; - - element: ElementRef; - isBrowser: any = false; - public constructor(element: ElementRef, @Inject(PLATFORM_ID) platformId: string) { - this.element = element; - this.isBrowser = isPlatformBrowser(platformId); - } - - public ngOnInit(): any { - if (this.isBrowser) { - this.ctx = this.element.nativeElement.getContext('2d'); - this.cvs = this.element.nativeElement; - this.initFlag = true; - if (this.data || this.datasets) { - this.refresh(); - } - } - } - - public ngOnChanges(changes: SimpleChanges): void { - if (this.initFlag) { - // Check if the changes are in the data or datasets - if (changes.hasOwnProperty('data') || changes.hasOwnProperty('datasets')) { - if (changes['data']) { - this.updateChartData(changes['data'].currentValue); - } else { - this.updateChartData(changes['datasets'].currentValue); - } - - this.chart.update(); - } else { - // otherwise rebuild the chart - this.refresh(); - } - } - } - - public ngOnDestroy(): any { - if (this.chart) { - this.chart.destroy(); - this.chart = void 0; - } - } - - public getChartBuilder(ctx: any/*, data:Array, options:any*/): any { - const datasets: any = this.getDatasets(); - - const options: any = Object.assign({}, this.options); - if (this.legend === false) { - options.legend = { display: false }; - } - // hock for onHover and onClick events - options.hover = options.hover || {}; - if (!options.hover.onHover) { - options.hover.onHover = (event: any, active: Array) => { - if (active && active.length) { - this.chartHover.emit({ event, active }); - } - }; - } - - if (!options.onClick) { - options.onClick = (event: any, active: Array) => { - this.chartClick.emit({ event, active }); - }; - } - - const opts = { - type: this.chartType, - data: { - labels: this.labels, - datasets: datasets - }, - options: options - }; - - return new Chart(ctx, opts); - } - - private updateChartData(newDataValues: number[] | any[]): void { - if (Array.isArray(newDataValues[0].data)) { - this.chart.data.datasets.forEach((dataset: any, i: number) => { - dataset.data = newDataValues[i].data; - - if (newDataValues[i].label) { - dataset.label = newDataValues[i].label; - } - }); - } else { - this.chart.data.datasets[0].data = newDataValues; - } - } - - private getDatasets(): any { - let datasets: any = void 0; - // in case if datasets is not provided, but data is present - if (!this.datasets || !this.datasets.length && (this.data && this.data.length)) { - if (Array.isArray(this.data[0])) { - datasets = (this.data as Array).map((data: number[], index: number) => { - return { data, label: this.labels[index] || `Label ${index}` }; - }); - } else { - datasets = [{ data: this.data, label: `Label 0` }]; - } - } - - if (this.datasets && this.datasets.length || - (datasets && datasets.length)) { - datasets = (this.datasets || datasets) - .map((elm: number, index: number) => { - const newElm: any = Object.assign({}, elm); - if (this.colors && this.colors.length) { - Object.assign(newElm, this.colors[index]); - } else { - Object.assign(newElm, getColors(this.chartType, index, newElm.data.length)); - } - return newElm; - }); - } - - if (!datasets) { - throw new Error(`ng-charts configuration error, - data or datasets field are required to render char ${this.chartType}`); - } - - return datasets; - } - - private refresh(): any { - this.ngOnDestroy(); - this.chart = this.getChartBuilder(this.ctx/*, data, this.options*/); - } -} - -function rgba(colour: Array, alpha: number): string { - return 'rgba(' + colour.concat(alpha).join(',') + ')'; -} - -function getRandomInt(min: number, max: number): number { - return Math.floor(Math.random() * (max - min + 1)) + min; -} - -function formatLineColor(colors: Array): Color { - return { - backgroundColor: rgba(colors, 0.4), - borderColor: rgba(colors, 1), - pointBackgroundColor: rgba(colors, 1), - pointBorderColor: '#fff', - pointHoverBackgroundColor: '#fff', - pointHoverBorderColor: rgba(colors, 0.8) - }; -} - -function formatBarColor(colors: Array): Color { - return { - backgroundColor: rgba(colors, 0.6), - borderColor: rgba(colors, 1), - hoverBackgroundColor: rgba(colors, 0.8), - hoverBorderColor: rgba(colors, 1) - }; -} - -function formatPieColors(colors: Array): any { - return { - backgroundColor: colors.map((color: number[]) => rgba(color, 0.6)), - borderColor: colors.map(() => '#fff'), - pointBackgroundColor: colors.map((color: number[]) => rgba(color, 1)), - pointBorderColor: colors.map(() => '#fff'), - pointHoverBackgroundColor: colors.map((color: number[]) => rgba(color, 1)), - pointHoverBorderColor: colors.map((color: number[]) => rgba(color, 1)) - }; -} - -function formatPolarAreaColors(colors: Array): Color { - return { - backgroundColor: colors.map((color: number[]) => rgba(color, 0.6)), - borderColor: colors.map((color: number[]) => rgba(color, 1)), - hoverBackgroundColor: colors.map((color: number[]) => rgba(color, 0.8)), - hoverBorderColor: colors.map((color: number[]) => rgba(color, 1)) - }; -} - -function getRandomColor(): number[] { - return [getRandomInt(0, 255), getRandomInt(0, 255), getRandomInt(0, 255)]; -} - -/** - * Generate colors for line|bar charts - */ -function generateColor(index: number): number[] { - return BaseChartDirective.defaultColors[index] || getRandomColor(); -} - -/** - * Generate colors for pie|doughnut charts - */ -function generateColors(count: number): Array { - const colorsArr: Array = new Array(count); - for (let i = 0; i < count; i++) { - colorsArr[i] = BaseChartDirective.defaultColors[i] || getRandomColor(); - } - return colorsArr; -} - -/** - * Generate colors by chart type - */ -function getColors(chartType: string, index: number, count: number): any { - if (chartType === 'pie' || chartType === 'doughnut') { - return formatPieColors(generateColors(count)); - } - - if (chartType === 'polarArea') { - return formatPolarAreaColors(generateColors(count)); - } - - if (chartType === 'line' || chartType === 'radar') { - return formatLineColor(generateColor(index)); - } - - if (chartType === 'bar' || chartType === 'horizontalBar') { - return formatBarColor(generateColor(index)); - } - return generateColor(index); -} - - diff --git a/src/angular-bootstrap-md/charts/chart.module.ts b/src/angular-bootstrap-md/charts/chart.module.ts deleted file mode 100755 index 9baf90d7..00000000 --- a/src/angular-bootstrap-md/charts/chart.module.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { NgModule } from '@angular/core'; - -import { BaseChartDirective } from './chart.directive'; - -@NgModule({ - declarations: [ - BaseChartDirective - ], - exports: [ - BaseChartDirective - ], - imports: [] -}) -export class ChartsModule { -} diff --git a/src/angular-bootstrap-md/charts/color.service.ts b/src/angular-bootstrap-md/charts/color.service.ts deleted file mode 100755 index f6d02c62..00000000 --- a/src/angular-bootstrap-md/charts/color.service.ts +++ /dev/null @@ -1,27 +0,0 @@ -// private helper functions -export interface Color { - backgroundColor?: string | string[]; - borderWidth?: number | number[]; - borderColor?: string | string[]; - borderCapStyle?: string; - borderDash?: number[]; - borderDashOffset?: number; - borderJoinStyle?: string; - - pointBorderColor?: string | string[]; - pointBackgroundColor?: string | string[]; - pointBorderWidth?: number | number[]; - - pointRadius?: number | number[]; - pointHoverRadius?: number | number[]; - pointHitRadius?: number | number[]; - - pointHoverBackgroundColor?: string | string[]; - pointHoverBorderColor?: string | string[]; - pointHoverBorderWidth?: number | number[]; - pointStyle?: string | string[]; - - hoverBackgroundColor?: string | string[]; - hoverBorderColor?: string | string[]; - hoverBorderWidth?: number; -} diff --git a/src/angular-bootstrap-md/charts/colors.service.ts b/src/angular-bootstrap-md/charts/colors.service.ts deleted file mode 100755 index 0d150743..00000000 --- a/src/angular-bootstrap-md/charts/colors.service.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Color } from './color.service'; - -export interface Colors extends Color { - data?: number[]; - label?: string; -} diff --git a/src/angular-bootstrap-md/charts/index.ts b/src/angular-bootstrap-md/charts/index.ts deleted file mode 100755 index 94317ab9..00000000 --- a/src/angular-bootstrap-md/charts/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { BaseChartDirective } from './chart.directive'; -export { Color } from './color.service'; -export { Colors } from './colors.service'; -export { ChartsModule } from './chart.module'; diff --git a/src/angular-bootstrap-md/charts/licens.md b/src/angular-bootstrap-md/charts/licens.md deleted file mode 100755 index a9cf4e94..00000000 --- a/src/angular-bootstrap-md/charts/licens.md +++ /dev/null @@ -1,5 +0,0 @@ -https://github.com/valor-software/ng2-charts/blob/development/LICENSE -https://github.com/chartjs/Chart.js/blob/master/LICENSE.md -https://github.com/rendro/easy-pie-chart/blob/master/LICENSE -https://www.npmjs.com/package/ng2modules-easypiechart - diff --git a/src/angular-bootstrap-md/collapse/collapse.directive.ts b/src/angular-bootstrap-md/collapse/collapse.directive.ts deleted file mode 100755 index 1c1decff..00000000 --- a/src/angular-bootstrap-md/collapse/collapse.directive.ts +++ /dev/null @@ -1,157 +0,0 @@ -// todo: add animations when https://github.com/angular/angular/issues/9947 solved -import { - Directive, ElementRef, EventEmitter, Input, OnInit, Output, - Renderer2, AfterViewInit -} from '@angular/core'; - - -@Directive({ - selector: '[mdbCollapse]', - exportAs: 'bs-collapse', - /* tslint:disable-next-line */ -}) -export class CollapseDirective implements OnInit, AfterViewInit { - - @Output('showBsCollapse') public showBsCollapse: EventEmitter = new EventEmitter(); - @Output('shownBsCollapse') public shownBsCollapse: EventEmitter = new EventEmitter(); - @Output('hideBsCollapse') public hideBsCollapse: EventEmitter = new EventEmitter(); - @Output('hiddenBsCollapse') public hiddenBsCollapse: EventEmitter = new EventEmitter(); - - - /** This event fires as soon as content collapses */ - @Output() public collapsed: EventEmitter = new EventEmitter(); - /** This event fires as soon as content becomes visible */ - @Output() public expanded: EventEmitter = new EventEmitter(); - // shown - // @HostBinding('class.in') - // @HostBinding('class.show') - // @HostBinding('attr.aria-expanded') - public isExpanded = true; - // hidden - // @HostBinding('attr.aria-hidden') - public isCollapsed = false; - // stale state - // @HostBinding('class.collapse') - public isCollapse = true; - // animation state - // @HostBinding('class.collapsing') - public isCollapsing = false; - public collapsing = false; - - - @Input() public collapse: boolean; - @Input() public animationTime = 500; - - public maxHeight: number; - - - protected _el: ElementRef; - protected _renderer: Renderer2; - - public constructor(_el: ElementRef, _renderer: Renderer2) { - this._el = _el; - this._renderer = _renderer; - } - ngOnInit() { - - this._el.nativeElement.classList.add('show'); - - this._el.nativeElement.style.transition = this.animationTime + 'ms ease'; - - if (!this.collapse) { - this._el.nativeElement.classList.remove('show'); - this.hide(); - } else { - this.show(); - } - - this.isExpanded = this.collapse; - } - - ngAfterViewInit() { - this.maxHeight = this._el.nativeElement.scrollHeight; - } - - public resize(): void { - const container = this._el.nativeElement; - this.maxHeight = this._el.nativeElement.scrollHeight; - this._renderer.setStyle(container, 'height', this.maxHeight + 'px'); - } - - /** allows to manually toggle content visibility */ - public toggle(event?: any): void { - if (!this.collapsing) { - if (this.isExpanded) { - this.hide(); - } else { - this.show(); - } - } - try { - if (event.type === 'click') { - this.maxHeight = event.target.parentElement.nextElementSibling.scrollHeight; - } else if (event.type === 'mouseenter' || event.type === 'mouseleave') { - this.maxHeight = event.target.nextElementSibling.scrollHeight; - } - } catch (error) { } - } - - - /** allows to manually hide content */ - public hide(): void { - this.collapsing = true; - this.hideBsCollapse.emit(); - this.isCollapse = false; - this.isCollapsing = true; - - this.isExpanded = false; - this.isCollapsed = true; - - const container = this._el.nativeElement; - - container.classList.remove('collapse'); - container.classList.remove('show'); - container.classList.add('collapsing'); - - this._renderer.setStyle(container, 'height', '0px'); - - setTimeout(() => { - container.classList.remove('collapsing'); - container.classList.add('collapse'); - this.hiddenBsCollapse.emit(); - this.collapsing = false; - }, this.animationTime); - this.collapsed.emit(this); - } - - /** allows to manually show collapsed content */ - public show(): void { - if (!this.isExpanded) { - this.collapsing = true; - this.showBsCollapse.emit(); - this.isCollapse = false; - this.isCollapsing = true; - - this.isExpanded = true; - this.isCollapsed = false; - - const container = this._el.nativeElement; - - container.classList.remove('collapse'); - container.classList.add('collapsing'); - - setTimeout(() => { - this._renderer.setStyle(container, 'height', this.maxHeight + 'px'); - }, 10); - - setTimeout(() => { - container.classList.remove('collapsing'); - container.classList.add('collapse'); - container.classList.add('show'); - this.shownBsCollapse.emit(); - this.collapsing = false; - }, this.animationTime - (this.animationTime * 0.5)); - this.expanded.emit(this); - } - } -} diff --git a/src/angular-bootstrap-md/collapse/collapse.module.ts b/src/angular-bootstrap-md/collapse/collapse.module.ts deleted file mode 100755 index 72da3066..00000000 --- a/src/angular-bootstrap-md/collapse/collapse.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CollapseDirective } from './collapse.directive'; - -@NgModule({ - declarations: [CollapseDirective], - exports: [CollapseDirective] -}) -export class CollapseModule { - public static forRoot(): ModuleWithProviders { - return {ngModule: CollapseModule, providers: []}; - } -} diff --git a/src/angular-bootstrap-md/collapse/index.ts b/src/angular-bootstrap-md/collapse/index.ts deleted file mode 100755 index c10f14f7..00000000 --- a/src/angular-bootstrap-md/collapse/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { CollapseDirective } from './collapse.directive'; -export { CollapseModule } from './collapse.module'; diff --git a/src/angular-bootstrap-md/dropdown/dropdown-container.component.html b/src/angular-bootstrap-md/dropdown/dropdown-container.component.html deleted file mode 100755 index 8841ad9f..00000000 --- a/src/angular-bootstrap-md/dropdown/dropdown-container.component.html +++ /dev/null @@ -1,6 +0,0 @@ -
- -
\ No newline at end of file diff --git a/src/angular-bootstrap-md/dropdown/dropdown-container.component.ts b/src/angular-bootstrap-md/dropdown/dropdown-container.component.ts deleted file mode 100755 index da47cdec..00000000 --- a/src/angular-bootstrap-md/dropdown/dropdown-container.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { ChangeDetectionStrategy, Component, OnDestroy, HostBinding } from '@angular/core'; -import { BsDropdownState } from './dropdown.state'; - -@Component({ - selector: 'mdb-dropdown-container', - changeDetection: ChangeDetectionStrategy.OnPush, - template: ` -
- -
- ` -}) -export class BsDropdownContainerComponent implements OnDestroy { - isOpen = false; - - @HostBinding('style.display') display = 'block'; - @HostBinding('style.position') position = 'absolute'; - - get direction(): 'down' | 'up' { - return this._state.direction; - } - - private _subscription: any; - - constructor(private _state: BsDropdownState) { - this._subscription = _state.isOpenChange.subscribe((value: boolean) => { - this.isOpen = value; - }); - } - - ngOnDestroy(): void { - this._subscription.unsubscribe(); - } -} diff --git a/src/angular-bootstrap-md/dropdown/dropdown-menu.directive.ts b/src/angular-bootstrap-md/dropdown/dropdown-menu.directive.ts deleted file mode 100755 index b8af437c..00000000 --- a/src/angular-bootstrap-md/dropdown/dropdown-menu.directive.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Directive, TemplateRef, ViewContainerRef } from '@angular/core'; -import { BsDropdownState } from './dropdown.state'; - -@Directive({ - selector: '[mdbDropdownMenu],[dropdownMenu]', - exportAs: 'bs-dropdown-menu' -}) -export class BsDropdownMenuDirective { - constructor(_state: BsDropdownState, - _viewContainer: ViewContainerRef, - _templateRef: TemplateRef) { - _state.resolveDropdownMenu({ - templateRef: _templateRef, - viewContainer: _viewContainer - }); - } -} diff --git a/src/angular-bootstrap-md/dropdown/dropdown-toggle.directive.ts b/src/angular-bootstrap-md/dropdown/dropdown-toggle.directive.ts deleted file mode 100755 index 438395b1..00000000 --- a/src/angular-bootstrap-md/dropdown/dropdown-toggle.directive.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Directive, ElementRef, HostBinding, HostListener, OnDestroy } from '@angular/core'; -import { Subscription } from 'rxjs'; - -import { BsDropdownState } from './dropdown.state'; - -@Directive({ - selector: '[mdbDropdownToggle],[dropdownToggle]', - exportAs: 'bs-dropdown-toggle' -}) -export class BsDropdownToggleDirective implements OnDestroy { - private _subscriptions: Subscription[] = []; - - @HostBinding('attr.aria-haspopup') ariaHaspopup = true; - // @HostBinding('attr.disabled') isDisabled: boolean = null; - @HostBinding('attr.disabled') isDisabled: boolean | any = null; - - // @HostBinding('class.active') - @HostBinding('attr.aria-expanded') isOpen: boolean; - - @HostListener('click') - onClick(): void { - if (this.isDisabled) { - return; - } - this._state.toggleClick.emit(); - } - - @HostListener('document:click', ['$event']) - onDocumentClick(event: any): void { - if (this._state.autoClose && event.button !== 2 && - !this._element.nativeElement.contains(event.target)) { - this._state.toggleClick.emit(false); - } -} - -@HostListener('keyup.esc') -onEsc(): void { - if (this._state.autoClose) { - this._state.toggleClick.emit(false); - } -} - -constructor(private _state: BsDropdownState, - private _element: ElementRef) { - // sync is open value with state - this._subscriptions.push(this._state - .isOpenChange.subscribe((value: boolean) => this.isOpen = value)); - // populate disabled state - this._subscriptions.push(this._state - .isDisabledChange - // .subscribe((value: boolean) => this.isDisabled = value || null)); - .subscribe((value: boolean | any) => this.isDisabled = value || null)); -} - -ngOnDestroy(): void { - for (const sub of this._subscriptions) { - sub.unsubscribe(); - } -} -} diff --git a/src/angular-bootstrap-md/dropdown/dropdown.config.ts b/src/angular-bootstrap-md/dropdown/dropdown.config.ts deleted file mode 100755 index 51d4988b..00000000 --- a/src/angular-bootstrap-md/dropdown/dropdown.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Injectable } from '@angular/core'; - -/** Default dropdown configuration */ -@Injectable() -export class BsDropdownConfig { - /** default dropdown auto closing behavior */ - autoClose = true; -} diff --git a/src/angular-bootstrap-md/dropdown/dropdown.directive.ts b/src/angular-bootstrap-md/dropdown/dropdown.directive.ts deleted file mode 100755 index 589c48bc..00000000 --- a/src/angular-bootstrap-md/dropdown/dropdown.directive.ts +++ /dev/null @@ -1,285 +0,0 @@ -import { - Directive, ElementRef, EmbeddedViewRef, EventEmitter, HostBinding, Input, OnDestroy, OnInit, Output, Renderer2, - ViewContainerRef -} from '@angular/core'; -import { Subscription } from 'rxjs'; - -import { ComponentLoader } from '../utils/component-loader/component-loader.class'; -import { ComponentLoaderFactory } from '../utils/component-loader/component-loader.factory'; -import { BsDropdownConfig } from './dropdown.config'; -import { BsDropdownContainerComponent } from './dropdown-container.component'; -import { BsDropdownState } from './dropdown.state'; -import { BsComponentRef } from '../utils/component-loader/bs-component-ref.class'; -import { BsDropdownMenuDirective } from './dropdown-menu.directive'; -import { isBs3 } from '../utils/ng2-bootstrap-config'; - -@Directive({ - selector: '[mdbDropdown],[dropdown]', - exportAs: 'bs-dropdown', - providers: [BsDropdownState] -}) -export class BsDropdownDirective implements OnInit, OnDestroy { - - /** - * Placement of a popover. Accepts: "top", "bottom", "left", "right" - */ - @Input() placement: string; - /** - * Specifies events that should trigger. Supports a space separated list of - * event names. - */ - @Input() triggers: string; - /** - * A selector specifying the element the popover should be appended to. - * Currently only supports "body". - */ - @Input() container: string; - - /** - * This attribute indicates that the dropdown should be opened upwards - */ - @HostBinding('class.dropup') - @Input() dropup: boolean; - - /** - * Indicates that dropdown will be closed on item or document click, - * and after pressing ESC - */ - @Input() set autoClose(value: boolean) { - if (typeof value === 'boolean') { - this._state.autoClose = value; - } - }; - - get autoClose(): boolean { - return this._state.autoClose; - } - - /** - * Disables dropdown toggle and hides dropdown menu if opened - */ - @Input() set isDisabled(value: boolean) { - this._isDisabled = value; - this._state.isDisabledChange.emit(value); - if (value) { - this.hide(); - } - } - - get isDisabled(): boolean { return this._isDisabled; } - - /** - * Returns whether or not the popover is currently being shown - */ - @HostBinding('class.open') - @HostBinding('class.show') - @Input() get isOpen(): boolean { - if (this._showInline) { - return this._isInlineOpen; - } - return this._dropdown.isShown; - } - - set isOpen(value: boolean) { - if (value) { - this.show(); - } else { - this.hide(); - } - } - - /** - * Emits an event when isOpen change - */ - @Output() isOpenChange: EventEmitter; - - /** - * Emits an event when the popover is shown - */ - @Output() onShown: EventEmitter; - - /** - * Emits an event when the popover is hidden - */ - @Output() onHidden: EventEmitter; - - get isBs4(): boolean { - return !isBs3(); - } - // todo: move to component loader - _isInlineOpen = false; - _showInline: boolean; - _inlinedMenu: EmbeddedViewRef; - - _isDisabled: boolean; - _dropdown: ComponentLoader; - _subscriptions: Subscription[] = []; - _isInited = false; - - constructor(private _elementRef: ElementRef, - private _renderer: Renderer2, - private _viewContainerRef: ViewContainerRef, - private _cis: ComponentLoaderFactory, - private _config: BsDropdownConfig, - private _state: BsDropdownState) { - // create dropdown component loader - this._dropdown = this._cis - .createLoader(this._elementRef, this._viewContainerRef, this._renderer) - .provide({ provide: BsDropdownState, useValue: this._state }); - - this.onShown = this._dropdown.onShown; - this.onHidden = this._dropdown.onHidden; - this.isOpenChange = this._state.isOpenChange; - - // set initial dropdown state from config - this._state.autoClose = this._config.autoClose; - } - - ngOnInit(): void { - // fix: seems there are an issue with `routerLinkActive` - // which result in duplicated call ngOnInit without call to ngOnDestroy - // read more: https://github.com/valor-software/ngx-bootstrap/issues/1885 - if (this._isInited) { return; } - this._isInited = true; - - this._showInline = !this.container; - - // attach DOM listeners - this._dropdown.listen({ - triggers: this.triggers, - show: () => this.show() - }); - - // toggle visibility on toggle element click - this._subscriptions.push(this._state - .toggleClick.subscribe((value: boolean) => this.toggle(value))); - - // hide dropdown if set disabled while opened - this._subscriptions.push(this._state - .isDisabledChange - .subscribe((element: any) => { - if (element === true) { - this.hide(); - } - } - )); - - // attach dropdown menu inside of dropdown - if (this._showInline) { - this._state.dropdownMenu - .then((dropdownMenu: BsComponentRef) => { - this._inlinedMenu = dropdownMenu.viewContainer.createEmbeddedView(dropdownMenu.templateRef); - }); - } - } - - /** - * Opens an element’s popover. This is considered a “manual” triggering of - * the popover. - */ - show(): void { - if (this.isOpen || this.isDisabled) { - return; - } - - // material and dropup dropdown animation - //const parent = this._elementRef.nativeElement.classList; - const container = this._elementRef.nativeElement.lastElementChild; - - setTimeout(() => { container.classList.add('fadeInDropdown'); }, 200); - - if (this._showInline) { - this._isInlineOpen = true; - this.onShown.emit(true); - this._state.isOpenChange.emit(true); - return; - } - this._state.dropdownMenu - .then((dropdownMenu) => { - // check direction in which dropdown should be opened - const _dropup = this.dropup === true || - (typeof this.dropup !== 'undefined' && this.dropup !== false); - this._state.direction = _dropup ? 'up' : 'down'; - const _placement = this.placement || - (_dropup ? 'top left' : 'bottom left'); - - // show dropdown - this._dropdown - .attach(BsDropdownContainerComponent) - .to(this.container) - .position({ attachment: _placement }) - .show({ - content: dropdownMenu.templateRef, - placement: _placement - }); - - this._state.isOpenChange.emit(true); - - }); - - } - - /** - * Closes an element’s popover. This is considered a “manual” triggering of - * the popover. - */ - hide(): void { - if (!this.isOpen) { - return; - } - - const parent = this._elementRef.nativeElement.classList; - const container = this._elementRef.nativeElement.lastElementChild; - - - if ((parent.value === 'dropdown open show') || (parent.value === 'btn-group dropup open show')) { - container.classList.remove('fadeInDropdown'); - - setTimeout(() => { - - if (this._showInline) { - this._isInlineOpen = false; - this.onHidden.emit(true); - } else { - this._dropdown.hide(); - } - - this._state.isOpenChange.emit(false); - - }, 560); - - } else { - - if (this._showInline) { - this._isInlineOpen = false; - this.onHidden.emit(true); - } else { - this._dropdown.hide(); - } - - this._state.isOpenChange.emit(false); - - } - - } - - /** - * Toggles an element’s popover. This is considered a “manual” triggering of - * the popover. - */ - toggle(value?: boolean): void { - if (this.isOpen || value === false) { - return this.hide(); - } - - return this.show(); - } - - ngOnDestroy(): void { - // clean up subscriptions and destroy dropdown - for (const sub of this._subscriptions) { - sub.unsubscribe(); - } - this._dropdown.dispose(); - } -} diff --git a/src/angular-bootstrap-md/dropdown/dropdown.module.ts b/src/angular-bootstrap-md/dropdown/dropdown.module.ts deleted file mode 100755 index 404ab15d..00000000 --- a/src/angular-bootstrap-md/dropdown/dropdown.module.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ModuleWithProviders, NgModule } from '@angular/core'; -import { ComponentLoaderFactory } from '../utils/component-loader/component-loader.factory'; - -import { PositioningService } from '../utils/positioning/positioning.service'; -import { BsDropdownContainerComponent } from './dropdown-container.component'; -import { BsDropdownMenuDirective } from './dropdown-menu.directive'; -import { BsDropdownToggleDirective } from './dropdown-toggle.directive'; -import { BsDropdownConfig } from './dropdown.config'; - -import { BsDropdownDirective } from './dropdown.directive'; -import { BsDropdownState } from './dropdown.state'; - -@NgModule({ - declarations: [ - BsDropdownMenuDirective, - BsDropdownToggleDirective, - BsDropdownContainerComponent, - BsDropdownDirective - ], - exports: [ - BsDropdownMenuDirective, - BsDropdownToggleDirective, - BsDropdownDirective - ], - entryComponents: [BsDropdownContainerComponent] -}) -export class DropdownModule { - public static forRoot(config?: any): ModuleWithProviders { - return { - ngModule: DropdownModule, providers: [ - ComponentLoaderFactory, - PositioningService, - BsDropdownState, - {provide: BsDropdownConfig, useValue: config ? config : {autoClose: true}} - ] - }; - }; -} diff --git a/src/angular-bootstrap-md/dropdown/dropdown.state.ts b/src/angular-bootstrap-md/dropdown/dropdown.state.ts deleted file mode 100755 index 403dc4e1..00000000 --- a/src/angular-bootstrap-md/dropdown/dropdown.state.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { EventEmitter, Injectable } from '@angular/core'; -import { BsComponentRef } from '../utils/component-loader/bs-component-ref.class'; - -@Injectable() -export class BsDropdownState { - direction: 'down' | 'up' = 'down'; - autoClose: boolean; - isOpenChange = new EventEmitter(); - isDisabledChange = new EventEmitter(); - toggleClick = new EventEmitter(); - - /** - * Content to be displayed as popover. - */ - dropdownMenu: Promise>; - resolveDropdownMenu: (componentRef: BsComponentRef) => void; - - constructor() { - this.dropdownMenu = new Promise((resolve) => { - this.resolveDropdownMenu = resolve; - }); - } - } diff --git a/src/angular-bootstrap-md/dropdown/index.ts b/src/angular-bootstrap-md/dropdown/index.ts deleted file mode 100755 index 64b15674..00000000 --- a/src/angular-bootstrap-md/dropdown/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export { BsDropdownDirective } from './dropdown.directive'; -export { BsDropdownMenuDirective } from './dropdown-menu.directive'; -export { BsDropdownToggleDirective } from './dropdown-toggle.directive'; -export { BsDropdownContainerComponent } from './dropdown-container.component'; -export { BsDropdownState } from './dropdown.state'; -export { BsDropdownConfig } from './dropdown.config'; -export { DropdownModule } from './dropdown.module'; diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Bold.eot b/src/angular-bootstrap-md/font/roboto/Roboto-Bold.eot deleted file mode 100644 index b73776ee..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Bold.eot and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Bold.ttf b/src/angular-bootstrap-md/font/roboto/Roboto-Bold.ttf deleted file mode 100644 index 68822caf..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Bold.ttf and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Bold.woff b/src/angular-bootstrap-md/font/roboto/Roboto-Bold.woff deleted file mode 100644 index 1f75afdc..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Bold.woff and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Bold.woff2 b/src/angular-bootstrap-md/font/roboto/Roboto-Bold.woff2 deleted file mode 100644 index 350d1c3a..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Bold.woff2 and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Light.eot b/src/angular-bootstrap-md/font/roboto/Roboto-Light.eot deleted file mode 100644 index 072cdc48..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Light.eot and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Light.ttf b/src/angular-bootstrap-md/font/roboto/Roboto-Light.ttf deleted file mode 100644 index aa453407..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Light.ttf and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Light.woff b/src/angular-bootstrap-md/font/roboto/Roboto-Light.woff deleted file mode 100644 index 3480c6c8..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Light.woff and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Light.woff2 b/src/angular-bootstrap-md/font/roboto/Roboto-Light.woff2 deleted file mode 100644 index 9a4d98c4..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Light.woff2 and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Medium.eot b/src/angular-bootstrap-md/font/roboto/Roboto-Medium.eot deleted file mode 100644 index f9ad9956..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Medium.eot and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Medium.ttf b/src/angular-bootstrap-md/font/roboto/Roboto-Medium.ttf deleted file mode 100644 index a3c1a1f1..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Medium.ttf and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Medium.woff b/src/angular-bootstrap-md/font/roboto/Roboto-Medium.woff deleted file mode 100644 index 1186773f..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Medium.woff and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Medium.woff2 b/src/angular-bootstrap-md/font/roboto/Roboto-Medium.woff2 deleted file mode 100644 index d10a5926..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Medium.woff2 and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Regular.eot b/src/angular-bootstrap-md/font/roboto/Roboto-Regular.eot deleted file mode 100644 index 9b5e8e41..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Regular.eot and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Regular.ttf b/src/angular-bootstrap-md/font/roboto/Roboto-Regular.ttf deleted file mode 100644 index 0e58508a..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Regular.ttf and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Regular.woff b/src/angular-bootstrap-md/font/roboto/Roboto-Regular.woff deleted file mode 100644 index f823258a..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Regular.woff and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Regular.woff2 b/src/angular-bootstrap-md/font/roboto/Roboto-Regular.woff2 deleted file mode 100644 index b7082ef3..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Regular.woff2 and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Thin.eot b/src/angular-bootstrap-md/font/roboto/Roboto-Thin.eot deleted file mode 100644 index 2284a3b3..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Thin.eot and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Thin.ttf b/src/angular-bootstrap-md/font/roboto/Roboto-Thin.ttf deleted file mode 100644 index 8779333b..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Thin.ttf and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Thin.woff b/src/angular-bootstrap-md/font/roboto/Roboto-Thin.woff deleted file mode 100644 index 2a98c1e4..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Thin.woff and /dev/null differ diff --git a/src/angular-bootstrap-md/font/roboto/Roboto-Thin.woff2 b/src/angular-bootstrap-md/font/roboto/Roboto-Thin.woff2 deleted file mode 100644 index a38025a1..00000000 Binary files a/src/angular-bootstrap-md/font/roboto/Roboto-Thin.woff2 and /dev/null differ diff --git a/src/angular-bootstrap-md/img/lightbox/default-skin.png b/src/angular-bootstrap-md/img/lightbox/default-skin.png deleted file mode 100644 index 441c502c..00000000 Binary files a/src/angular-bootstrap-md/img/lightbox/default-skin.png and /dev/null differ diff --git a/src/angular-bootstrap-md/img/lightbox/default-skin.svg b/src/angular-bootstrap-md/img/lightbox/default-skin.svg deleted file mode 100644 index 9d5f0c6a..00000000 --- a/src/angular-bootstrap-md/img/lightbox/default-skin.svg +++ /dev/null @@ -1 +0,0 @@ -default-skin 2 \ No newline at end of file diff --git a/src/angular-bootstrap-md/img/lightbox/preloader.gif b/src/angular-bootstrap-md/img/lightbox/preloader.gif deleted file mode 100644 index b8faa697..00000000 Binary files a/src/angular-bootstrap-md/img/lightbox/preloader.gif and /dev/null differ diff --git a/src/angular-bootstrap-md/img/overlays/01.png b/src/angular-bootstrap-md/img/overlays/01.png deleted file mode 100644 index f9b60ee7..00000000 Binary files a/src/angular-bootstrap-md/img/overlays/01.png and /dev/null differ diff --git a/src/angular-bootstrap-md/img/overlays/02.png b/src/angular-bootstrap-md/img/overlays/02.png deleted file mode 100644 index acce7a66..00000000 Binary files a/src/angular-bootstrap-md/img/overlays/02.png and /dev/null differ diff --git a/src/angular-bootstrap-md/img/overlays/03.png b/src/angular-bootstrap-md/img/overlays/03.png deleted file mode 100644 index c11a355b..00000000 Binary files a/src/angular-bootstrap-md/img/overlays/03.png and /dev/null differ diff --git a/src/angular-bootstrap-md/img/overlays/04.png b/src/angular-bootstrap-md/img/overlays/04.png deleted file mode 100644 index 89b85338..00000000 Binary files a/src/angular-bootstrap-md/img/overlays/04.png and /dev/null differ diff --git a/src/angular-bootstrap-md/img/overlays/04.png~HEAD b/src/angular-bootstrap-md/img/overlays/04.png~HEAD deleted file mode 100644 index 89b85338..00000000 Binary files a/src/angular-bootstrap-md/img/overlays/04.png~HEAD and /dev/null differ diff --git a/src/angular-bootstrap-md/img/overlays/04.png~ecacfc5c730e25dcad92fe8f4a80cba6c23a4b6b b/src/angular-bootstrap-md/img/overlays/04.png~ecacfc5c730e25dcad92fe8f4a80cba6c23a4b6b deleted file mode 100644 index 89b85338..00000000 Binary files a/src/angular-bootstrap-md/img/overlays/04.png~ecacfc5c730e25dcad92fe8f4a80cba6c23a4b6b and /dev/null differ diff --git a/src/angular-bootstrap-md/img/overlays/05.png b/src/angular-bootstrap-md/img/overlays/05.png deleted file mode 100644 index 082bda8c..00000000 Binary files a/src/angular-bootstrap-md/img/overlays/05.png and /dev/null differ diff --git a/src/angular-bootstrap-md/img/overlays/06.png b/src/angular-bootstrap-md/img/overlays/06.png deleted file mode 100644 index 9c9006a2..00000000 Binary files a/src/angular-bootstrap-md/img/overlays/06.png and /dev/null differ diff --git a/src/angular-bootstrap-md/img/overlays/07.png b/src/angular-bootstrap-md/img/overlays/07.png deleted file mode 100644 index 218be609..00000000 Binary files a/src/angular-bootstrap-md/img/overlays/07.png and /dev/null differ diff --git a/src/angular-bootstrap-md/img/overlays/08.png b/src/angular-bootstrap-md/img/overlays/08.png deleted file mode 100644 index 1b9dffc9..00000000 Binary files a/src/angular-bootstrap-md/img/overlays/08.png and /dev/null differ diff --git a/src/angular-bootstrap-md/img/overlays/09.png b/src/angular-bootstrap-md/img/overlays/09.png deleted file mode 100644 index b9ed2ff1..00000000 Binary files a/src/angular-bootstrap-md/img/overlays/09.png and /dev/null differ diff --git a/src/angular-bootstrap-md/img/svg/arrow_left.svg b/src/angular-bootstrap-md/img/svg/arrow_left.svg deleted file mode 100644 index a88d2997..00000000 --- a/src/angular-bootstrap-md/img/svg/arrow_left.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/angular-bootstrap-md/img/svg/arrow_right.svg b/src/angular-bootstrap-md/img/svg/arrow_right.svg deleted file mode 100644 index f62d8852..00000000 --- a/src/angular-bootstrap-md/img/svg/arrow_right.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/angular-bootstrap-md/index.ts b/src/angular-bootstrap-md/index.ts deleted file mode 100755 index 9dc2e9f9..00000000 --- a/src/angular-bootstrap-md/index.ts +++ /dev/null @@ -1,123 +0,0 @@ -// free -import { ModuleWithProviders, NgModule, NO_ERRORS_SCHEMA } from '@angular/core'; -import { DeepModule } from './inputs/deep.module'; -import { ButtonsModule } from './buttons/buttons.module'; -import { RippleModule } from './ripple/ripple.module'; -import { ActiveModule } from './inputs/active.module'; -import { InputsModule} from './inputs/inputs.module'; -import { NavbarModule } from './navbars/navbar.module'; -import { DropdownModule } from './dropdown/dropdown.module'; -import { CarouselModule } from './carousel/carousel.module'; -import { ChartsModule } from './charts/chart.module'; -import { CollapseModule } from './collapse/collapse.module'; -import { ModalModule } from './modals/modal.module'; -import { TooltipModule } from './tooltip/tooltip.module'; -import { PopoverModule } from './popover/popover.module'; -import { WavesModule } from './waves/waves.module'; - -export { - ButtonsModule, ButtonRadioDirective, ButtonCheckboxDirective -} from './buttons/index'; - -export { - RippleModule, RippleDirective -} from './ripple/index'; - -export { - WavesModule, WavesDirective -} from './waves/index'; - -export { - DeepModule, DeepDirective -} from './inputs/index'; - -export { - InputsModule, MdbInputDirective -} from './inputs/index'; - -export { - ActiveModule, ActiveDirective, InputValidateDirective -} from './inputs/index'; - -export { - NavbarModule -} from './navbars/index'; - -export { - BsDropdownConfig, BsDropdownContainerComponent, BsDropdownDirective, BsDropdownMenuDirective, - DropdownModule, BsDropdownState, BsDropdownToggleDirective -} from './dropdown/index'; - -export { - CarouselComponent, CarouselConfig, CarouselModule -} from './carousel/index'; - -export { - ChartsModule, BaseChartDirective -} from './charts/index'; - -export { - CollapseDirective, CollapseModule -} from './collapse/index'; - -export { - ModalBackdropComponent, ModalBackdropOptions, ModalDirective, ModalModule, ModalOptions, MDBModalService, - ModalContainerComponent, MDBModalRef -} from './modals/index'; - -export { - TooltipConfig, TooltipContainerComponent, TooltipDirective, TooltipModule -} from './tooltip/index'; - -export { - PopoverConfig, PopoverContainerComponent, PopoverModule, PopoverDirective -} from './popover/index'; - - - -const MODULES = [ - DeepModule, - ButtonsModule, - RippleModule, - WavesModule, - InputsModule, - ActiveModule, - NavbarModule, - DropdownModule, - CarouselModule, - ChartsModule, - CollapseModule, - ModalModule, - TooltipModule, - PopoverModule, -]; - -@NgModule({ - imports: [ - ButtonsModule, - DeepModule, - RippleModule.forRoot(), - WavesModule.forRoot(), - InputsModule.forRoot(), - ActiveModule.forRoot(), - NavbarModule, - DropdownModule.forRoot(), - CarouselModule.forRoot(), - ChartsModule, - CollapseModule.forRoot(), - ModalModule.forRoot(), - TooltipModule.forRoot(), - PopoverModule.forRoot(), - ], - exports: MODULES, - schemas: [NO_ERRORS_SCHEMA] -}) -export class MDBRootModule { -} - -@NgModule({ exports: MODULES }) -export class MDBBootstrapModule { - public static forRoot(): ModuleWithProviders { - return { ngModule: MDBRootModule }; - } -} diff --git a/src/angular-bootstrap-md/inputs/active.class.ts b/src/angular-bootstrap-md/inputs/active.class.ts deleted file mode 100755 index 649bc79e..00000000 --- a/src/angular-bootstrap-md/inputs/active.class.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Directive, ElementRef, Input, HostListener, Renderer2, AfterViewInit, AfterViewChecked } from '@angular/core'; -import { isPlatformBrowser } from '@angular/common'; -import { PLATFORM_ID, Inject } from '@angular/core'; -@Directive({ - selector: '[mdbActive]' -}) - -export class ActiveDirective implements AfterViewInit, AfterViewChecked { - isBrowser: any = false; - - @Input() public mdbActive: ActiveDirective; - isClicked: boolean = false; - // public el: ElementRef = null; - public el: ElementRef | any = null; - // public elLabel: ElementRef = null; - public elLabel: ElementRef | any = null; - // public elIcon: Element = null; - public elIcon: Element | any = null; - - - constructor(el: ElementRef, public renderer: Renderer2, @Inject(PLATFORM_ID) platformId: string) { - this.el = el; - this.isBrowser = isPlatformBrowser(platformId); - } - @HostListener('focus', ['$event']) onClick() { - this.initComponent(); - this.isClicked = true; - } - - @HostListener('click', ['$event']) Click() { - this.isClicked = true; - } - - @HostListener('blur', ['$event']) onBlur() { - this.checkValue(); - this.isClicked = false; - } - - - // ngAfterViewInit with checkValue after setTimeout is needed in situation when we have prefilled - // forms, and label has to be lifted up. - ngAfterViewInit() { - this.initComponent(); - setTimeout(() => { - this.checkValue(); - }, 0); - } - ngAfterViewChecked() { - this.initComponent(); - this.checkValue(); - } - - - private initComponent(): void { - let inputId; - let inputP; - if (this.isBrowser) { - try { - inputId = this.el.nativeElement.id; - } catch (err) { } - - try { - inputP = this.el.nativeElement.parentNode; - } catch (err) { } - - this.elLabel = inputP.querySelector('label[for="' + inputId + '"]') || inputP.querySelector('label'); - if (this.elLabel != null) { - this.renderer.addClass(this.elLabel, 'active'); - } - - this.elIcon = inputP.querySelector('i') || false; - - if (this.elIcon) { - this.renderer.addClass(this.elIcon, 'active'); - } - } - } - private checkValue(): void { - let value = ''; - if (this.elLabel != null) { - value = this.el.nativeElement.value || ''; - if (value === '') { - this.renderer.removeClass(this.elLabel, 'active'); - if (this.elIcon) { - this.renderer.removeClass(this.elIcon, 'active'); - } - // tslint:disable-next-line:max-line-length - } if (value === '' && this.isClicked || value === '' && this.el.nativeElement.placeholder || value === '' && this.el.nativeElement.attributes.placeholder) { - this.renderer.addClass(this.elLabel, 'active'); - } - } - } -} diff --git a/src/angular-bootstrap-md/inputs/active.module.ts b/src/angular-bootstrap-md/inputs/active.module.ts deleted file mode 100755 index d857aa4a..00000000 --- a/src/angular-bootstrap-md/inputs/active.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { ActiveDirective } from './active.class'; -import { InputValidateDirective } from './input-validate.directive'; - -@NgModule({ - declarations: [ActiveDirective, InputValidateDirective], - exports: [ActiveDirective, InputValidateDirective] -}) - -export class ActiveModule { - public static forRoot(): ModuleWithProviders { - return {ngModule: ActiveModule, providers: []}; - } -} diff --git a/src/angular-bootstrap-md/inputs/deep.directive.ts b/src/angular-bootstrap-md/inputs/deep.directive.ts deleted file mode 100755 index 05c452f4..00000000 --- a/src/angular-bootstrap-md/inputs/deep.directive.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Directive, ElementRef, AfterViewInit, Renderer2 } from '@angular/core'; - - -@Directive({ - selector: '[mdbDeepDirective]', -}) - -export class DeepDirective implements AfterViewInit { - constructor(private el: ElementRef, private renderer: Renderer2) { } - - ngAfterViewInit() { - this.renderer.addClass(this.el.nativeElement, 'onFocusSelect'); - } -} diff --git a/src/angular-bootstrap-md/inputs/deep.module.ts b/src/angular-bootstrap-md/inputs/deep.module.ts deleted file mode 100755 index 22654848..00000000 --- a/src/angular-bootstrap-md/inputs/deep.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { DeepDirective } from './deep.directive'; -import { NgModule, ModuleWithProviders } from '@angular/core'; - -@NgModule({ - declarations: [DeepDirective], - exports: [DeepDirective] -}) - -export class DeepModule { - public static forRoot(): ModuleWithProviders { - return {ngModule: DeepModule, providers: []}; - } -} diff --git a/src/angular-bootstrap-md/inputs/equal-validator.directive.ts b/src/angular-bootstrap-md/inputs/equal-validator.directive.ts deleted file mode 100755 index ec5a2128..00000000 --- a/src/angular-bootstrap-md/inputs/equal-validator.directive.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Directive, forwardRef, Attribute } from '@angular/core'; -import { Validator, AbstractControl, NG_VALIDATORS } from '@angular/forms'; - -@Directive({ - selector: '[mdb-validateEqual][formControlName],[validateEqual][formControl],[validateEqual][ngModel]', - providers: [ - { provide: NG_VALIDATORS, useExisting: forwardRef(() => EqualValidatorDirective), multi: true } - ] -}) - -export class EqualValidatorDirective implements Validator { - constructor( @Attribute('validateEqual') public validateEqual: string, - @Attribute('reverse') public reverse: string) { - - } - - private get isReverse() { - if (!this.reverse) { - return false; - } - return this.reverse === 'true' ? true : false; - } - - validate(c: AbstractControl): { [key: string]: any } { - const setToNullValue: any = null; - // self value (e.g. retype password) - const v = c.value; - - // control value (e.g. password) - // const e: any = c.root.get(this.validateEqual); - const e: any = c.root.get(this.validateEqual); - - // value not equal - if (e && v !== e.value) { - return { validateEqual: false }; - } - - // value equal and reverse - if (e && v === e.value && this.isReverse) { - delete e.errors['validateEqual']; - if (!Object.keys(e.errors).length) { - e.setErrors(null); - } - } - - // value not equal and reverse - if (e && v !== e.value && this.isReverse) { - e.setErrors({ - validateEqual: false - }); - } - - // return null; - return setToNullValue; - } -} - diff --git a/src/angular-bootstrap-md/inputs/index.ts b/src/angular-bootstrap-md/inputs/index.ts deleted file mode 100755 index 669210ca..00000000 --- a/src/angular-bootstrap-md/inputs/index.ts +++ /dev/null @@ -1,9 +0,0 @@ - -export { InputsModule } from './inputs.module'; -export { DeepModule } from './deep.module'; -export { DeepDirective } from './deep.directive'; -export { MdbInputDirective } from './mdb-input.directive'; -export { InputValidateDirective} from './input-validate.directive'; -export { EqualValidatorDirective} from './equal-validator.directive'; -export { ActiveDirective } from './active.class'; -export { ActiveModule } from './active.module'; diff --git a/src/angular-bootstrap-md/inputs/input-validate.directive.ts b/src/angular-bootstrap-md/inputs/input-validate.directive.ts deleted file mode 100755 index 0d7bb6a5..00000000 --- a/src/angular-bootstrap-md/inputs/input-validate.directive.ts +++ /dev/null @@ -1,207 +0,0 @@ - -import { Directive, Input, ElementRef, Renderer, HostListener, OnInit } from '@angular/core'; - - - -@Directive({ - selector: '[mdbInputValidate]', -}) - -export class InputValidateDirective implements OnInit { - - @Input() public value = ''; - @Input('minLength') public minLength: string = '0'; - @Input('maxLength') public maxLength: string = '524288'; - @Input('customRegex') customRegex: any; - public wrongTextContainer: any; - public rightTextContainer: any; - - - constructor(private _elRef: ElementRef, private _renderer: Renderer) { - - } - ngOnInit() { - // Inititalise a new wrong/right elements and render it below the host component. - this.wrongTextContainer = this._renderer.createElement(this._elRef.nativeElement.parentElement, 'span'); - this._renderer.setElementClass(this.wrongTextContainer, 'inputVal', true); - this._renderer.setElementClass(this.wrongTextContainer, 'text-danger', true); - const textWrong = this._elRef.nativeElement.getAttribute('data-error'); - this.wrongTextContainer.innerHTML = (textWrong ? textWrong : 'wrong'); - this._renderer.setElementStyle(this.wrongTextContainer, 'visibility', 'hidden'); - - this.rightTextContainer = this._renderer.createElement(this._elRef.nativeElement.parentElement, 'span'); - this._renderer.setElementClass(this.rightTextContainer, 'inputVal', true); - this._renderer.setElementClass(this.rightTextContainer, 'text-success', true); - const textSuccess = this._elRef.nativeElement.getAttribute('data-success'); - this.rightTextContainer.innerHTML = (textSuccess ? textSuccess : 'success'); - this._renderer.setElementStyle(this.rightTextContainer, 'visibility', 'hidden'); - - } - - - @HostListener('blur', ['$event']) onBlur() { - - - const inputType = this._elRef.nativeElement.type; - - if (inputType === 'email') { - if (this.customRegex) { - const re = new RegExp(this._elRef.nativeElement.getAttribute('customRegex')); - if (this._elRef.nativeElement.length === 0) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - /*tslint:disable:max-line-length*/ - } else if (re.test(this._elRef.nativeElement.value) && this._elRef.nativeElement.value.length >= this.minLength && this._elRef.nativeElement.value.length <= this.maxLength) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', true); - } else if (!re.test(this._elRef.nativeElement.value) || this._elRef.nativeElement.value.length < this.minLength || this._elRef.nativeElement.value.length > this.maxLength) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', true); - } - - } else if (!this.customRegex) { - /*tslint:disable:max-line-length*/ - const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - if (this._elRef.nativeElement.length === 0) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - } else if (re.test(this._elRef.nativeElement.value) && this._elRef.nativeElement.value.length >= this.minLength && this._elRef.nativeElement.value.length <= this.maxLength) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', true); - } else if (!re.test(this._elRef.nativeElement.value) || this._elRef.nativeElement.value.length < this.minLength || this._elRef.nativeElement.value.length > this.maxLength) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', true); - } - } - - - } else if (inputType === 'password') { - if (this.customRegex) { - const re = new RegExp(this._elRef.nativeElement.getAttribute('customRegex')); - if (this._elRef.nativeElement.length === 0) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - // tslint:disable-next-line:max-line-length - } else if (this._elRef.nativeElement.value.match(re) && this._elRef.nativeElement.value.length >= this.minLength && this._elRef.nativeElement.value.length <= this.maxLength) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', true); - // tslint:disable-next-line:max-line-length - } else if (!this._elRef.nativeElement.value.match(re) || this._elRef.nativeElement.value.length < this.minLength || this._elRef.nativeElement.value.length > this.maxLength) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', true); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - } - } else if (!this.customRegex) { - if (this._elRef.nativeElement.length === 0) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - // tslint:disable-next-line:max-line-length - } else if (this._elRef.nativeElement.value.match(/^(?=(.*\d){1})(.*\S)(?=.*[a-zA-Z\S])[0-9a-zA-Z\S]/g) && this._elRef.nativeElement.value.length >= this.minLength && this._elRef.nativeElement.value.length <= this.maxLength) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', true); - // tslint:disable-next-line:max-line-length - } else if (!this._elRef.nativeElement.value.match(/^(?=(.*\d){1})(.*\S)(?=.*[a-zA-Z\S])[0-9a-zA-Z\S]/g) || this._elRef.nativeElement.value.length < this.minLength || this._elRef.nativeElement.value.length > this.maxLength) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', true); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - } - } - - } else if (inputType === 'text') { - if (this.customRegex) { - const re = new RegExp(this._elRef.nativeElement.getAttribute('customRegex')); - if (this._elRef.nativeElement.length === 0) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - // tslint:disable-next-line:max-line-length - } else if (this._elRef.nativeElement.value.match(re) && this._elRef.nativeElement.value.length >= this.minLength && this._elRef.nativeElement.value.length <= this.maxLength) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', true); - // tslint:disable-next-line:max-line-length - } else if (!this._elRef.nativeElement.value.match(re) || this._elRef.nativeElement.value.length < this.minLength || this._elRef.nativeElement.value.length > this.maxLength) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', true); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - } - } else if (!this.customRegex) { - if (this._elRef.nativeElement.length === 0) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - // tslint:disable-next-line:max-line-length - } else if (this._elRef.nativeElement.value.match(/^[a-zA-Z0-9]+$/g) && this._elRef.nativeElement.value.length >= this.minLength && this._elRef.nativeElement.value.length <= this.maxLength) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', true); - // tslint:disable-next-line:max-line-length - } else if (!this._elRef.nativeElement.value.match(/^[a-zA-Z0-9]+$/g) || this._elRef.nativeElement.value.length < this.minLength || this._elRef.nativeElement.value.length > this.maxLength) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', true); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - } - } - - } else if (inputType === 'submit') { - for (let i = 0; i < this._elRef.nativeElement.parentElement.length; i++) { - if (this._elRef.nativeElement.parentElement[i].value == null || this._elRef.nativeElement.parentElement[i].value === '') { - this._renderer.setElementClass(this._elRef.nativeElement.parentElement[i], 'counter-danger', true); - this._renderer.setElementClass(this._elRef.nativeElement.parentElement[i], 'counter-success', false); - - } else if (!this._elRef.nativeElement.parentElement[i].value == null) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', true); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - } - } - - } else if (inputType === 'tel') { - if (this.customRegex) { - const re = new RegExp(this._elRef.nativeElement.getAttribute('customRegex')); - if (this._elRef.nativeElement.length === 0) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - } else if (re.test(this._elRef.nativeElement.value) && this._elRef.nativeElement.value.length >= 8 && this._elRef.nativeElement.value.length <= 20) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', true); - } else if (!re.test(this._elRef.nativeElement.value) || this._elRef.nativeElement.value.length > 20) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', true); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - } - } else if (!this.customRegex) { - const re = /^(1[ \-\+]{0,3}|\+1[ -\+]{0,3}|\+1|\+)?((\(\+?1-[2-9][0-9]{1,2}\))|(\(\+?[2-8][0-9][0-9]\))|(\(\+?[1-9][0-9]\))|(\(\+?[17]\))|(\([2-9][2-9]\))|([ \-\.]{0,3}[0-9]{2,4}))?([ \-\.][0-9])?([ \-\.]{0,3}[0-9]{2,4}){2,3}$/; - if (this._elRef.nativeElement.length === 0) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - } else if (re.test(this._elRef.nativeElement.value) && this._elRef.nativeElement.value.length >= 8 && this._elRef.nativeElement.value.length <= 20) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', true); - } else if (!re.test(this._elRef.nativeElement.value) || this._elRef.nativeElement.value.length > 20) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', true); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - } - } - - - } else if (inputType === 'number') { - if (this.customRegex) { - const re = new RegExp(this._elRef.nativeElement.getAttribute('customRegex')); - if (this._elRef.nativeElement.length === 0) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - } else if (re.test(this._elRef.nativeElement.value) && this._elRef.nativeElement.value.length > 0) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', true); - } else if (!re.test(this._elRef.nativeElement.value) || this._elRef.nativeElement.value.length < 1) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', true); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - } - } else if (!this.customRegex) { - const re = /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:(\.|,)\d+)?$/; - if (this._elRef.nativeElement.length === 0) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - } else if (re.test(this._elRef.nativeElement.value) && this._elRef.nativeElement.value.length > 0) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', false); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', true); - } else if (!re.test(this._elRef.nativeElement.value) || this._elRef.nativeElement.value.length < 1) { - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-danger', true); - this._renderer.setElementClass(this._elRef.nativeElement, 'counter-success', false); - } - } - } - } -} - diff --git a/src/angular-bootstrap-md/inputs/inputs.module.ts b/src/angular-bootstrap-md/inputs/inputs.module.ts deleted file mode 100644 index f0bf9502..00000000 --- a/src/angular-bootstrap-md/inputs/inputs.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { MdbInputDirective } from './mdb-input.directive'; -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { EqualValidatorDirective } from './equal-validator.directive'; - -@NgModule({ - declarations: [MdbInputDirective, EqualValidatorDirective], - exports: [MdbInputDirective, EqualValidatorDirective] -}) - -export class InputsModule { - public static forRoot(): ModuleWithProviders { - return {ngModule: InputsModule, providers: []}; - } -} diff --git a/src/angular-bootstrap-md/inputs/licens.md b/src/angular-bootstrap-md/inputs/licens.md deleted file mode 100755 index 8e1c25fb..00000000 --- a/src/angular-bootstrap-md/inputs/licens.md +++ /dev/null @@ -1,3 +0,0 @@ -https://github.com/SebastianM/angular-google-maps/blob/master/LICENSE -https://www.npmjs.com/package/ng2-completer -https://github.com/jkuri/ngx-uploader diff --git a/src/angular-bootstrap-md/inputs/mdb-input.directive.ts b/src/angular-bootstrap-md/inputs/mdb-input.directive.ts deleted file mode 100644 index 858401d9..00000000 --- a/src/angular-bootstrap-md/inputs/mdb-input.directive.ts +++ /dev/null @@ -1,340 +0,0 @@ - -import { isPlatformBrowser } from '@angular/common'; -import { - Directive, - ElementRef, - Renderer2, - Input, - AfterViewInit, - HostListener, - PLATFORM_ID, - Inject, - AfterViewChecked, - OnInit -} from '@angular/core'; - -@Directive({ - selector: '[mdbInputDirective]' -}) -export class MdbInputDirective implements AfterViewChecked, OnInit, AfterViewInit { - - @Input('mdbInputDirective') mdbInputDirective: MdbInputDirective; - @Input('placeholder') public placeholder: string; - @Input('minLength') public minLength: string = '0'; - @Input('maxLength') public maxLength: string = '524288'; - @Input('customRegex') customRegex: any; - @Input('mdbValidate') mdbValidate: boolean = true; - @Input('focusCheckbox') focusCheckbox: boolean = true; - @Input('focusRadio') focusRadio: boolean = true; - - isBrowser: any = false; - isClicked: boolean = false; - - public wrongTextContainer: any; - public rightTextContainer: any; - public el: ElementRef | any = null; - public elLabel: ElementRef | any = null; - public elIcon: Element | any = null; - - - @HostListener('focus') onfocus() { - try { - this.renderer.addClass(this.elLabel, 'active'); - this.isClicked = true; - } catch (error) { - - } - } - - @HostListener('blur') onBlur() { - try { - if (this.el.nativeElement.value === '') { - this.renderer.removeClass(this.elLabel, 'active'); - } - this.isClicked = false; - } catch (error) { - - } - - - try { - // Validation: - if (this.mdbValidate) { - const inputType = this.el.nativeElement.type; - - if (inputType === 'email') { - if (this.customRegex) { - const re = new RegExp(this.el.nativeElement.getAttribute('customRegex')); - if (this.el.nativeElement.length === 0) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - /*tslint:disable:max-line-length*/ - } else if (re.test(this.el.nativeElement.value) && this.el.nativeElement.value.length >= this.minLength && this.el.nativeElement.value.length <= this.maxLength) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.addClass(this.el.nativeElement, 'counter-success'); - } else if (!re.test(this.el.nativeElement.value) || this.el.nativeElement.value.length < this.minLength || this.el.nativeElement.value.length > this.maxLength) { - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - this.renderer.addClass(this.el.nativeElement, 'counter-danger'); - } - - } else if (!this.customRegex) { - /*tslint:disable:max-line-length*/ - const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - if (this.el.nativeElement.length === 0) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - } else if (re.test(this.el.nativeElement.value) && this.el.nativeElement.value.length >= this.minLength && this.el.nativeElement.value.length <= this.maxLength) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.addClass(this.el.nativeElement, 'counter-success'); - } else if (!re.test(this.el.nativeElement.value) || this.el.nativeElement.value.length < this.minLength || this.el.nativeElement.value.length > this.maxLength) { - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - this.renderer.addClass(this.el.nativeElement, 'counter-danger'); - } - } - - - } else if (inputType === 'password') { - if (this.customRegex) { - const re = new RegExp(this.el.nativeElement.getAttribute('customRegex')); - if (this.el.nativeElement.length === 0) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - // tslint:disable-next-line:max-line-length - } else if (this.el.nativeElement.value.match(re) && this.el.nativeElement.value.length >= this.minLength && this.el.nativeElement.value.length <= this.maxLength) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.addClass(this.el.nativeElement, 'counter-success'); - // tslint:disable-next-line:max-line-length - } else if (!this.el.nativeElement.value.match(re) || this.el.nativeElement.value.length < this.minLength || this.el.nativeElement.value.length > this.maxLength) { - this.renderer.addClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - } - } else if (!this.customRegex) { - if (this.el.nativeElement.length === 0) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - // tslint:disable-next-line:max-line-length - } else if (this.el.nativeElement.value.match(/^(?=(.*\d){1})(.*\S)(?=.*[a-zA-Z\S])[0-9a-zA-Z\S]/g) && this.el.nativeElement.value.length >= this.minLength && this.el.nativeElement.value.length <= this.maxLength) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.addClass(this.el.nativeElement, 'counter-success'); - // tslint:disable-next-line:max-line-length - } else if (!this.el.nativeElement.value.match(/^(?=(.*\d){1})(.*\S)(?=.*[a-zA-Z\S])[0-9a-zA-Z\S]/g) || this.el.nativeElement.value.length < this.minLength || this.el.nativeElement.value.length > this.maxLength) { - this.renderer.addClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - } - } - - } else if (inputType === 'text') { - if (this.customRegex) { - const re = new RegExp(this.el.nativeElement.getAttribute('customRegex')); - if (this.el.nativeElement.length === 0) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - // tslint:disable-next-line:max-line-length - } else if (this.el.nativeElement.value.match(re) && this.el.nativeElement.value.length >= this.minLength && this.el.nativeElement.value.length <= this.maxLength) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.addClass(this.el.nativeElement, 'counter-success'); - // tslint:disable-next-line:max-line-length - } else if (!this.el.nativeElement.value.match(re) || this.el.nativeElement.value.length < this.minLength || this.el.nativeElement.value.length > this.maxLength) { - this.renderer.addClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - } - } else if (!this.customRegex) { - if (this.el.nativeElement.length === 0) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - // tslint:disable-next-line:max-line-length - } else if (this.el.nativeElement.value.match(/^[a-zA-Z0-9]+$/g) && this.el.nativeElement.value.length >= this.minLength && this.el.nativeElement.value.length <= this.maxLength) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.addClass(this.el.nativeElement, 'counter-success'); - // tslint:disable-next-line:max-line-length - } else if (!this.el.nativeElement.value.match(/^[a-zA-Z0-9]+$/g) || this.el.nativeElement.value.length < this.minLength || this.el.nativeElement.value.length > this.maxLength) { - this.renderer.addClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - } - } - - } else if (inputType === 'submit') { - for (let i = 0; i < this.el.nativeElement.parentElement.length; i++) { - if (this.el.nativeElement.parentElement[i].value == null || this.el.nativeElement.parentElement[i].value === '') { - this.renderer.addClass(this.el.nativeElement.parentElement[i], 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement.parentElement[i], 'counter-success'); - - } else if (!this.el.nativeElement.parentElement[i].value == null) { - this.renderer.addClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - } - } - - } else if (inputType === 'tel') { - if (this.customRegex) { - const re = new RegExp(this.el.nativeElement.getAttribute('customRegex')); - if (this.el.nativeElement.length === 0) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - } else if (re.test(this.el.nativeElement.value) && this.el.nativeElement.value.length >= 8 && this.el.nativeElement.value.length <= 20) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.addClass(this.el.nativeElement, 'counter-success'); - } else if (!re.test(this.el.nativeElement.value) || this.el.nativeElement.value.length > 20) { - this.renderer.addClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - } - } else if (!this.customRegex) { - const re = /^(1[ \-\+]{0,3}|\+1[ -\+]{0,3}|\+1|\+)?((\(\+?1-[2-9][0-9]{1,2}\))|(\(\+?[2-8][0-9][0-9]\))|(\(\+?[1-9][0-9]\))|(\(\+?[17]\))|(\([2-9][2-9]\))|([ \-\.]{0,3}[0-9]{2,4}))?([ \-\.][0-9])?([ \-\.]{0,3}[0-9]{2,4}){2,3}$/; - if (this.el.nativeElement.length === 0) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - } else if (re.test(this.el.nativeElement.value) && this.el.nativeElement.value.length >= 8 && this.el.nativeElement.value.length <= 20) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.addClass(this.el.nativeElement, 'counter-success'); - } else if (!re.test(this.el.nativeElement.value) || this.el.nativeElement.value.length > 20) { - this.renderer.addClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - } - } - - - } else if (inputType === 'number') { - if (this.customRegex) { - const re = new RegExp(this.el.nativeElement.getAttribute('customRegex')); - if (this.el.nativeElement.length === 0) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - } else if (re.test(this.el.nativeElement.value) && this.el.nativeElement.value.length > 0) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.addClass(this.el.nativeElement, 'counter-success'); - } else if (!re.test(this.el.nativeElement.value) || this.el.nativeElement.value.length < 1) { - this.renderer.addClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - } - } else if (!this.customRegex) { - const re = /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:(\.|,)\d+)?$/; - if (this.el.nativeElement.length === 0) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - } else if (re.test(this.el.nativeElement.value) && this.el.nativeElement.value.length > 0) { - this.renderer.removeClass(this.el.nativeElement, 'counter-danger'); - this.renderer.addClass(this.el.nativeElement, 'counter-success'); - } else if (!re.test(this.el.nativeElement.value) || this.el.nativeElement.value.length < 1) { - this.renderer.addClass(this.el.nativeElement, 'counter-danger'); - this.renderer.removeClass(this.el.nativeElement, 'counter-success'); - } - } - } - } - } catch (error) { - - } - - - } - - - @HostListener('change') onchange() { - try { - this.checkValue(); - } catch (error) { - - } - } - - - constructor(el: ElementRef, private renderer: Renderer2, @Inject(PLATFORM_ID) platformId: string) { - this.el = el; - this.isBrowser = isPlatformBrowser(platformId); - } - - ngOnInit() { - if (this.mdbValidate) { - // Inititalise a new wrong/right elements and render it below the host component. - // this.wrongTextContainer = this.renderer.createElement(this.el.nativeElement.parentElement, 'span'); - this.wrongTextContainer = this.renderer.createElement('span'); - this.renderer.addClass(this.wrongTextContainer, 'inputVal'); - this.renderer.addClass(this.wrongTextContainer, 'text-danger'); - this.renderer.appendChild(this.el.nativeElement.parentElement, this.wrongTextContainer); - const textWrong = this.el.nativeElement.getAttribute('data-error'); - this.wrongTextContainer.innerHTML = (textWrong ? textWrong : 'wrong'); - this.renderer.setStyle(this.wrongTextContainer, 'visibility', 'hidden'); - - // this.rightTextContainer = this.renderer.createElement(this.el.nativeElement.parentElement, 'span'); - this.rightTextContainer = this.renderer.createElement('span'); - this.renderer.addClass(this.rightTextContainer, 'inputVal'); - this.renderer.addClass(this.rightTextContainer, 'text-success'); - this.renderer.appendChild(this.el.nativeElement.parentElement, this.rightTextContainer); - const textSuccess = this.el.nativeElement.getAttribute('data-success'); - this.rightTextContainer.innerHTML = (textSuccess ? textSuccess : 'success'); - this.renderer.setStyle(this.rightTextContainer, 'visibility', 'hidden'); - } - - } - - ngAfterViewInit() { - const type = this.el.nativeElement.type; - if (this.focusCheckbox && type === 'checkbox') { - this.renderer.addClass(this.el.nativeElement, 'onFocusSelect'); - } - - if (this.focusRadio && type === 'radio') { - this.renderer.addClass(this.el.nativeElement, 'onFocusSelect'); - } - } - - ngAfterViewChecked() { - this.initComponent(); - this.checkValue(); - // tslint:disable-next-line:max-line-length - if (this.el.nativeElement.tagName === 'MDB-COMPLETER' && this.el.nativeElement.getAttribute('ng-reflect-model') == null && !this.isClicked) { - this.renderer.removeClass(this.elLabel, 'active'); - } - } - - public initComponent(): void { - let inputId; - let inputP; - if (this.isBrowser) { - try { - inputId = this.el.nativeElement.id; - } catch (err) { } - - try { - inputP = this.el.nativeElement.parentNode; - } catch (err) { } - - this.elLabel = inputP.querySelector('label[for="' + inputId + '"]') || inputP.querySelector('label'); - if (this.elLabel && this.el.nativeElement.value !== '') { - this.renderer.addClass(this.elLabel, 'active'); - } - - this.elIcon = inputP.querySelector('i') || false; - - if (this.elIcon) { - this.renderer.addClass(this.elIcon, 'active'); - } - } - } - - - - private checkValue(): void { - let value = ''; - if (this.elLabel != null) { - value = this.el.nativeElement.value || ''; - if (value === '') { - this.renderer.removeClass(this.elLabel, 'active'); - if (this.elIcon) { - this.renderer.removeClass(this.elIcon, 'active'); - } - // tslint:disable-next-line:max-line-length - } if (value === '' && this.isClicked || - value === '' && this.el.nativeElement.placeholder || - value === '' && this.el.nativeElement.attributes.placeholder - ) { - this.renderer.addClass(this.elLabel, 'active'); - } - if (this.el.nativeElement.getAttribute('ng-reflect-model') != null) { - if (this.el.nativeElement.tagName === 'MDB-COMPLETER' && this.el.nativeElement.getAttribute('ng-reflect-model').length !== 0) { - this.renderer.addClass(this.elLabel, 'active'); - } - } - } - } -} diff --git a/src/angular-bootstrap-md/mdb-free.module.ts b/src/angular-bootstrap-md/mdb-free.module.ts deleted file mode 100755 index 815dd6d9..00000000 --- a/src/angular-bootstrap-md/mdb-free.module.ts +++ /dev/null @@ -1,124 +0,0 @@ - - -// free -import { ModuleWithProviders, NgModule, NO_ERRORS_SCHEMA } from '@angular/core'; -import { DeepModule } from './inputs/deep.module'; -import { ButtonsModule } from './buttons/buttons.module'; -import { RippleModule } from './ripple/ripple.module'; -import { NavbarModule } from './navbars/navbar.module'; -import { DropdownModule } from './dropdown/dropdown.module'; -import { CarouselModule } from './carousel/carousel.module'; -import { ChartsModule } from './charts/chart.module'; -import { CollapseModule } from './collapse/collapse.module'; -import { ModalModule } from './modals/modal.module'; -import { TooltipModule } from './tooltip/tooltip.module'; -import { PopoverModule } from './popover/popover.module'; -import { InputsModule } from './inputs/inputs.module'; -import { WavesModule } from './waves/waves.module'; -import { ActiveModule } from './inputs/active.module'; -export { - ButtonsModule, ButtonRadioDirective, ButtonCheckboxDirective -} from './buttons/index'; - -export { - RippleModule, RippleDirective -} from './ripple/index'; - -export { - WavesModule, WavesDirective -} from './waves/index'; - -export { - DeepModule, DeepDirective -} from './inputs/index'; - -export { - InputsModule, MdbInputDirective -} from './inputs/index'; - -export { - ActiveModule, ActiveDirective, InputValidateDirective -} from './inputs/index'; - -export { - NavbarModule -} from './navbars/index'; - -export { - BsDropdownConfig, BsDropdownContainerComponent, BsDropdownDirective, BsDropdownMenuDirective, - DropdownModule, BsDropdownState, BsDropdownToggleDirective -} from './dropdown/index'; - -export { - CarouselComponent, CarouselConfig, CarouselModule -} from './carousel/index'; - -export { - ChartsModule, BaseChartDirective -} from './charts/index'; - -export { - CollapseDirective, CollapseModule -} from './collapse/index'; - -export { - ModalBackdropComponent, ModalBackdropOptions, ModalDirective, ModalModule, ModalOptions, MDBModalService, - ModalContainerComponent, MDBModalRef -} from './modals/index'; - -export { - TooltipConfig, TooltipContainerComponent, TooltipDirective, TooltipModule -} from './tooltip/index'; - -export { - PopoverConfig, PopoverContainerComponent, PopoverModule, PopoverDirective -} from './popover/index'; - - - -const MODULES = [ - DeepModule, - ButtonsModule, - RippleModule, - WavesModule, - InputsModule, - ActiveModule, - NavbarModule, - DropdownModule, - CarouselModule, - ChartsModule, - CollapseModule, - ModalModule, - TooltipModule, - PopoverModule, -]; - -@NgModule({ - imports: [ - ButtonsModule, - DeepModule, - RippleModule.forRoot(), - WavesModule.forRoot(), - InputsModule.forRoot(), - ActiveModule.forRoot(), - NavbarModule, - DropdownModule.forRoot(), - CarouselModule.forRoot(), - ChartsModule, - CollapseModule.forRoot(), - ModalModule.forRoot(), - TooltipModule.forRoot(), - PopoverModule.forRoot(), - ], - exports: MODULES, - schemas: [NO_ERRORS_SCHEMA] -}) -export class MDBRootModule { -} - -@NgModule({ exports: MODULES }) -export class MDBBootstrapModule { - public static forRoot(): ModuleWithProviders { - return { ngModule: MDBRootModule }; - } -} diff --git a/src/angular-bootstrap-md/modals/index.ts b/src/angular-bootstrap-md/modals/index.ts deleted file mode 100755 index d9407229..00000000 --- a/src/angular-bootstrap-md/modals/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { ModalBackdropComponent, ModalBackdropOptions } from './modalBackdrop.component'; -export { ModalOptions, MDBModalRef } from './modal.options'; -export { ModalDirective } from './modal.directive'; -export { ModalModule } from './modal.module'; -export { MDBModalService } from './modal.service'; -export { ModalContainerComponent } from './modalContainer.component'; diff --git a/src/angular-bootstrap-md/modals/licens.md b/src/angular-bootstrap-md/modals/licens.md deleted file mode 100755 index 68dc12fd..00000000 --- a/src/angular-bootstrap-md/modals/licens.md +++ /dev/null @@ -1 +0,0 @@ -https://github.com/valor-software/ngx-bootstrap/blob/development/LICENSE \ No newline at end of file diff --git a/src/angular-bootstrap-md/modals/modal.directive.ts b/src/angular-bootstrap-md/modals/modal.directive.ts deleted file mode 100755 index 00e06ee4..00000000 --- a/src/angular-bootstrap-md/modals/modal.directive.ts +++ /dev/null @@ -1,350 +0,0 @@ -import { - AfterViewInit, - ComponentRef, - Directive, - ElementRef, - EventEmitter, - HostListener, - Input, - OnDestroy, - Output, - Renderer2, ViewContainerRef -} from '@angular/core'; - -import { document } from '../utils/facade/browser'; - -import { isBs3 } from '../utils/ng2-bootstrap-config'; -import { Utils } from '../utils/utils.class'; -import { ModalBackdropComponent } from './modalBackdrop.component'; -import { ClassName, modalConfigDefaults, ModalOptions, DISMISS_REASONS } from './modal.options'; - -import { window } from '../utils/facade/browser'; -import { ComponentLoader } from '../utils/component-loader/component-loader.class'; -import { ComponentLoaderFactory } from '../utils/component-loader/component-loader.factory'; - -const TRANSITION_DURATION = 300; -const BACKDROP_TRANSITION_DURATION = 150; - -/** Mark any code with directive to show it's content in modal */ -@Directive({ - selector: '[mdbModal]', - exportAs: 'mdb-modal' -}) -export class ModalDirective implements AfterViewInit, OnDestroy { - /** allows to set modal configuration via element property */ - @Input() - // public set config(conf: ModalOptions) { - public set config(conf: ModalOptions | any) { - this._config = this.getConfig(conf); - } - - // public get config(): ModalOptions { - public get config(): ModalOptions | any { - return this._config; - } - - /** This event fires immediately when the `show` instance method is called. */ - @Output() public onShow: EventEmitter = new EventEmitter(); - /** This event is fired when the modal has been made visible to the user (will wait for CSS transitions to complete) */ - @Output() public onShown: EventEmitter = new EventEmitter(); - /** This event is fired immediately when the hide instance method has been called. */ - @Output() public onHide: EventEmitter = new EventEmitter(); - /** This event is fired when the modal has finished being hidden from the user (will wait for CSS transitions to complete). */ - @Output() public onHidden: EventEmitter = new EventEmitter(); - - // seems like an Options - public isAnimated = true; - /** This field contains last dismiss reason. - Possible values: `backdrop-click`, `esc` and `null` (if modal was closed by direct call of `.hide()`). */ - public dismissReason: string | any; - - public get isShown(): boolean { - return this._isShown; - } - - protected _config: ModalOptions | any; - protected _isShown = false; - - protected isBodyOverflowing = false; - protected originalBodyPadding = 0; - protected scrollbarWidth = 0; - - protected timerHideModal: any = 0; - protected timerRmBackDrop: any = 0; - - // constructor props - protected _element: ElementRef; - protected _renderer: Renderer2; - - // reference to backdrop component - protected backdrop: ComponentRef; - private _backdrop: ComponentLoader; - // todo: implement _dialog - _dialog: any; - - isNested = false; - - @HostListener('click', ['$event']) - public onClick(event: any): void { - if (this.config.ignoreBackdropClick || this.config.backdrop === 'static' || event.target !== this._element.nativeElement) { - return; - } - this.dismissReason = DISMISS_REASONS.BACKRDOP; - this.hide(event); - } - - // todo: consider preventing default and stopping propagation - @HostListener('keydown.esc') - public onEsc(): void { - if (this.config.keyboard) { - this.dismissReason = DISMISS_REASONS.ESC; - this.hide(); - } - } - - public constructor(_element: ElementRef, _viewContainerRef: ViewContainerRef, _renderer: Renderer2, clf: ComponentLoaderFactory) { - this._element = _element; - this._renderer = _renderer; - this._backdrop = clf.createLoader(_element, _viewContainerRef, _renderer); - } - - public ngOnDestroy(): any { - this.config = void 0; - if (this._isShown) { - this._isShown = false; - this.hideModal(); - this._backdrop.dispose(); - } - } - - public ngAfterViewInit(): any { - this._config = this._config || this.getConfig(); - setTimeout(() => { - if (this._config.show) { - this.show(); - } - }, 0); - } - - /* Public methods */ - - /** Allows to manually toggle modal visibility */ - public toggle(): void { - return this._isShown ? this.hide() : this.show(); - } - - /** Allows to manually open modal */ - public show(): void { - this.dismissReason = null; - this.onShow.emit(this); - if (this._isShown) { - return; - } - clearTimeout(this.timerHideModal); - clearTimeout(this.timerRmBackDrop); - - this._isShown = true; - - this.checkScrollbar(); - this.setScrollbar(); - - if (document && document.body) { - if (document.body.classList.contains(ClassName.OPEN)) { - this.isNested = true; - } else { - this._renderer.addClass(document.body, ClassName.OPEN); - } - } - - this.showBackdrop(() => { - this.showElement(); - }); - } - - /** Allows to manually close modal */ - public hide(event?: Event): void { - if (event) { - event.preventDefault(); - } - - this.onHide.emit(this); - - // todo: add an option to prevent hiding - if (!this._isShown) { - return; - } - - clearTimeout(this.timerHideModal); - clearTimeout(this.timerRmBackDrop); - - this._isShown = false; - this._renderer.removeClass(this._element.nativeElement, ClassName.IN); - if (!isBs3()) { - this._renderer.removeClass(this._element.nativeElement, ClassName.SHOW); - } - - if (this.isAnimated) { - this.timerHideModal = setTimeout(() => this.hideModal(), TRANSITION_DURATION); - } else { - this.hideModal(); - } - } - - /** Private methods @internal */ - protected getConfig(config?: ModalOptions): ModalOptions { - return Object.assign({}, modalConfigDefaults, config); - } - - /** - * Show dialog - * @internal - */ - protected showElement(): void { - // todo: replace this with component loader usage - if (!this._element.nativeElement.parentNode || - (this._element.nativeElement.parentNode.nodeType !== Node.ELEMENT_NODE)) { - // don't move modals dom position - if (document && document.body) { - document.body.appendChild(this._element.nativeElement); - } - } - - this._renderer.setAttribute(this._element.nativeElement, 'aria-hidden', 'false'); - this._renderer.setStyle(this._element.nativeElement, 'display', 'block'); - this._renderer.setProperty(this._element.nativeElement, 'scrollTop', 0); - - if (this.isAnimated) { - Utils.reflow(this._element.nativeElement); - } - - this._renderer.addClass(this._element.nativeElement, ClassName.IN); - if (!isBs3()) { - this._renderer.addClass(this._element.nativeElement, ClassName.SHOW); - } - - const transitionComplete = () => { - if (this._config.focus) { - this._element.nativeElement.focus(); - } - this.onShown.emit(this); - }; - - if (this.isAnimated) { - setTimeout(transitionComplete, TRANSITION_DURATION); - } else { - transitionComplete(); - } - } - - /** @internal */ - protected hideModal(): void { - this._renderer.setAttribute(this._element.nativeElement, 'aria-hidden', 'true'); - this._renderer.setStyle(this._element.nativeElement, 'display', 'none'); - this.showBackdrop(() => { - if (!this.isNested) { - if (document && document.body) { - this._renderer.removeClass(document.body, ClassName.OPEN); - } - this.resetScrollbar(); - } - this.resetAdjustments(); - this.focusOtherModal(); - this.onHidden.emit(this); - }); - } - - // todo: original show was calling a callback when done, but we can use promise - /** @internal */ - protected showBackdrop(callback?: Function): void { - if (this._isShown && this.config.backdrop && (!this.backdrop || !this.backdrop.instance.isShown)) { - this.removeBackdrop(); - this._backdrop - .attach(ModalBackdropComponent) - .to('body') - .show({isAnimated: this.isAnimated}); - this.backdrop = this._backdrop._componentRef; - - if (!callback) { - return; - } - - if (!this.isAnimated) { - callback(); - return; - } - - setTimeout(callback, BACKDROP_TRANSITION_DURATION); - } else if (!this._isShown && this.backdrop) { - this.backdrop.instance.isShown = false; - - const callbackRemove = () => { - this.removeBackdrop(); - if (callback) { - callback(); - } - }; - - if (this.backdrop.instance.isAnimated) { - this.timerRmBackDrop = setTimeout(callbackRemove, BACKDROP_TRANSITION_DURATION); - } else { - callbackRemove(); - } - } else if (callback) { - callback(); - } - } - - /** @internal */ - protected removeBackdrop(): void { - this._backdrop.hide(); - } - - - protected focusOtherModal() { - const otherOpenedModals = this._element.nativeElement.parentElement.querySelectorAll('.in[mdbModal]'); - if (!otherOpenedModals.length) { - return; - } - // this._renderer.invokeElementMethod(otherOpenedModals[otherOpenedModals.length - 1], 'focus'); - otherOpenedModals[otherOpenedModals.length - 1].nativeElement.focus(); - } - - /** @internal */ - protected resetAdjustments(): void { - this._renderer.setStyle(this._element.nativeElement, 'paddingLeft', ''); - this._renderer.setStyle(this._element.nativeElement, 'paddingRight', ''); - } - - /** Scroll bar tricks */ - /** @internal */ - protected checkScrollbar(): void { - this.isBodyOverflowing = document.body.clientWidth < window.innerWidth; - this.scrollbarWidth = this.getScrollbarWidth(); - } - - protected setScrollbar(): void { - if (!document) { - return; - } - - this.originalBodyPadding = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right') || 0, 10); - - if (this.isBodyOverflowing) { - document.body.style.paddingRight = `${this.originalBodyPadding + this.scrollbarWidth}px`; - } - } - - protected resetScrollbar(): void { - document.body.style.paddingRight = this.originalBodyPadding; - } - - // thx d.walsh - protected getScrollbarWidth(): number { - const scrollDiv = this._renderer.createElement('div', void 0); - this._renderer.appendChild(document.body, scrollDiv); - scrollDiv.className = ClassName.SCROLLBAR_MEASURER; - const scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; - document.body.removeChild(scrollDiv); - return scrollbarWidth; - } -} diff --git a/src/angular-bootstrap-md/modals/modal.module.ts b/src/angular-bootstrap-md/modals/modal.module.ts deleted file mode 100755 index 187c0cbf..00000000 --- a/src/angular-bootstrap-md/modals/modal.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule, ModuleWithProviders, NO_ERRORS_SCHEMA } from '@angular/core'; - -import { ModalBackdropComponent } from './modalBackdrop.component'; -import { ModalDirective } from './modal.directive'; -import { PositioningService } from '../utils/positioning/positioning.service'; -import { ComponentLoaderFactory } from '../utils/component-loader/component-loader.factory'; -import { ModalContainerComponent } from './modalContainer.component'; -import { MDBModalService } from './modal.service'; - -@NgModule({ - declarations: [ModalBackdropComponent, ModalDirective, ModalContainerComponent], - exports: [ModalBackdropComponent, ModalDirective], - entryComponents: [ModalBackdropComponent, ModalContainerComponent], - schemas: [NO_ERRORS_SCHEMA] -}) -export class ModalModule { - public static forRoot(): ModuleWithProviders { - return {ngModule: ModalModule, providers: [MDBModalService, ComponentLoaderFactory, PositioningService]}; - } -} diff --git a/src/angular-bootstrap-md/modals/modal.options.ts b/src/angular-bootstrap-md/modals/modal.options.ts deleted file mode 100755 index a0f18b5e..00000000 --- a/src/angular-bootstrap-md/modals/modal.options.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable() -export class ModalOptions { - /** - * Includes a modal-backdrop element. Alternatively, specify static for a backdrop which doesn't close the modal on click. - */ - // backdrop?: boolean | 'static'; - backdrop?: boolean | 'static' | any; - /** - * Closes the modal when escape key is pressed. - */ - keyboard?: boolean; - - focus?: boolean; - /** - * Shows the modal when initialized. - */ - show?: boolean; - /** - * Ignore the backdrop click - */ - ignoreBackdropClick?: boolean; - /** - * Css class for opened modal - */ - class?: string; - /** - * Toggle animation - */ - animated?: boolean; - } - - @Injectable() - export class MDBModalRef { - /** - * Reference to a component inside the modal. Null if modal's been created with TemplateRef - */ - content?: any | null; - /** - * Hides the modal - */ - hide(): void {} - } - - export const modalConfigDefaults: ModalOptions = { - backdrop: true, - keyboard: true, - focus: true, - show: false, - ignoreBackdropClick: false, - class: '', - animated: true - }; - - export const ClassName: any = { - SCROLLBAR_MEASURER: 'modal-scrollbar-measure', - BACKDROP: 'modal-backdrop', - OPEN: 'modal-open', - FADE: 'fade', - IN: 'in', // bs3 - SHOW: 'show' // bs4 - }; - - export const Selector: any = { - DIALOG: '.modal-dialog', - DATA_TOGGLE: '[data-toggle="modal"]', - DATA_DISMISS: '[data-dismiss="modal"]', - FIXED_CONTENT: '.navbar-fixed-top, .navbar-fixed-bottom, .is-fixed' - }; - - export const TransitionDurations: any = { - MODAL: 300, - BACKDROP: 150 - }; - - export const DISMISS_REASONS = { - BACKRDOP: 'backdrop-click', - ESC: 'esc' - }; diff --git a/src/angular-bootstrap-md/modals/modal.service.ts b/src/angular-bootstrap-md/modals/modal.service.ts deleted file mode 100755 index a8054420..00000000 --- a/src/angular-bootstrap-md/modals/modal.service.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { ComponentRef, Injectable, TemplateRef, EventEmitter, Renderer2, ViewContainerRef, ElementRef } from '@angular/core'; - -import { ComponentLoader } from '../utils/component-loader/component-loader.class'; -import { ComponentLoaderFactory } from '../utils/component-loader/component-loader.factory'; -import { ModalBackdropComponent } from './modalBackdrop.component'; -import { ModalContainerComponent } from './modalContainer.component'; -import { MDBModalRef, ClassName, modalConfigDefaults, ModalOptions, TransitionDurations } from './modal.options'; -import { msConfig } from './modalService.config'; - - -@Injectable() -export class MDBModalService { - // constructor props - public config: ModalOptions = modalConfigDefaults; - - public onShow: EventEmitter = new EventEmitter(); - public onShown: EventEmitter = new EventEmitter(); - public onHide: EventEmitter = new EventEmitter(); - public onHidden: EventEmitter = new EventEmitter(); - - protected isBodyOverflowing = false; - protected originalBodyPadding = 0; - - protected scrollbarWidth = 0; - - // protected backdropRef: ComponentRef; - protected backdropRef: ComponentRef | any; - private _backdropLoader: ComponentLoader; - private modalsCount = 0; - // private lastDismissReason = ''; - private lastDismissReason: any = ''; - - private loaders: ComponentLoader[] = []; - // public constructor(private clf: ComponentLoaderFactory) { - public constructor(private clf: ComponentLoaderFactory, private el: ElementRef, private v: ViewContainerRef, private r: Renderer2) { - // this._backdropLoader = this.clf.createLoader(null, null, null); - this._backdropLoader = this.clf.createLoader(this.el, this.v, this.r); - msConfig.serviceInstance = this; - } - - /** Shows a modal */ - show(content: string | TemplateRef | any, config?: any): MDBModalRef { - this.modalsCount++; - this._createLoaders(); - this.config = Object.assign({}, modalConfigDefaults, config); - this._showBackdrop(); - this.lastDismissReason = null; - return this._showModal(content); - } - - hide(level: number) { - if (this.modalsCount === 1) { - this._hideBackdrop(); - this.resetScrollbar(); - } - this.modalsCount = this.modalsCount >= 1 ? this.modalsCount - 1 : 0; - setTimeout(() => { - this._hideModal(level); - this.removeLoaders(level); - }, this.config.animated ? TransitionDurations.BACKDROP : 0); - } - - _showBackdrop(): void { - const isBackdropEnabled = this.config.backdrop || this.config.backdrop === 'static'; - const isBackdropInDOM = !this.backdropRef || !this.backdropRef.instance.isShown; - - if (this.modalsCount === 1) { - this.removeBackdrop(); - - if (isBackdropEnabled && isBackdropInDOM) { - this._backdropLoader - .attach(ModalBackdropComponent) - .to('body') - .show({isAnimated: this.config.animated}); - this.backdropRef = this._backdropLoader._componentRef; - } - } - } - - _hideBackdrop(): void { - if (!this.backdropRef) { - return; - } - this.backdropRef.instance.isShown = false; - const duration = this.config.animated ? TransitionDurations.BACKDROP : 0; - setTimeout(() => this.removeBackdrop(), duration); - } - - _showModal(content: any): MDBModalRef { - const modalLoader = this.loaders[this.loaders.length - 1]; - const mdbModalRef = new MDBModalRef(); - const modalContainerRef = modalLoader - .provide({provide: ModalOptions, useValue: this.config}) - .provide({provide: MDBModalRef, useValue: mdbModalRef}) - .attach(ModalContainerComponent) - .to('body') - .show({content, isAnimated: this.config.animated}); - modalContainerRef.instance.level = this.getModalsCount(); - mdbModalRef.hide = () => { - modalContainerRef.instance.hide(); - }; - mdbModalRef.content = modalLoader.getInnerComponent() || null; - return mdbModalRef; - } - - _hideModal(level: number): void { - const modalLoader = this.loaders[level - 1]; - if (modalLoader) { - modalLoader.hide(); - } - } - - getModalsCount(): number { - return this.modalsCount; - } - - setDismissReason(reason: string) { - this.lastDismissReason = reason; - } - - protected removeBackdrop(): void { - this._backdropLoader.hide(); - this.backdropRef = null; - } - - /** AFTER PR MERGE MODAL.COMPONENT WILL BE USING THIS CODE*/ - /** Scroll bar tricks */ - /** @internal */ - public checkScrollbar(): void { - this.isBodyOverflowing = document.body.clientWidth < window.innerWidth; - this.scrollbarWidth = this.getScrollbarWidth(); - } - - public setScrollbar(): void { - if (!document) { - return; - } - - this.originalBodyPadding = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right') || '0', 10); - - if (this.isBodyOverflowing) { - document.body.style.paddingRight = `${this.originalBodyPadding + this.scrollbarWidth}px`; - } - } - - private resetScrollbar(): void { - document.body.style.paddingRight = this.originalBodyPadding + 'px'; - } - - // thx d.walsh - private getScrollbarWidth(): number { - const scrollDiv = document.createElement('div'); - scrollDiv.className = ClassName.SCROLLBAR_MEASURER; - document.body.appendChild(scrollDiv); - const scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; - document.body.removeChild(scrollDiv); - return scrollbarWidth; - - } - - private _createLoaders(): void { - // const loader = this.clf.createLoader(null, null, null); - const loader = this.clf.createLoader(this.el, this.v, this.r); - this.copyEvent(loader.onBeforeShow, this.onShow); - this.copyEvent(loader.onShown, this.onShown); - this.copyEvent(loader.onBeforeHide, this.onHide); - this.copyEvent(loader.onHidden, this.onHidden); - this.loaders.push(loader); - } - - private removeLoaders(level: number): void { - this.loaders.splice(level - 1, 1); - this.loaders.forEach((loader: ComponentLoader, i: number) => { - loader.instance.level = i + 1; - }); - } - - private copyEvent(from: EventEmitter, to: EventEmitter) { - from.subscribe(() => { - to.emit(this.lastDismissReason); - }); - } -} diff --git a/src/angular-bootstrap-md/modals/modalBackdrop.component.html b/src/angular-bootstrap-md/modals/modalBackdrop.component.html deleted file mode 100755 index e69de29b..00000000 diff --git a/src/angular-bootstrap-md/modals/modalBackdrop.component.ts b/src/angular-bootstrap-md/modals/modalBackdrop.component.ts deleted file mode 100755 index 1524fd35..00000000 --- a/src/angular-bootstrap-md/modals/modalBackdrop.component.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, ElementRef, OnInit, Renderer, HostBinding } from '@angular/core'; - -import { ClassName } from './modal.options'; -import { isBs3 } from '../utils/ng2-bootstrap-config'; -import { Utils } from '../utils/utils.class'; - -export class ModalBackdropOptions { - public animate = true; - - public constructor(options: ModalBackdropOptions) { - Object.assign(this, options); - } -} - -/** This component will be added as background layout for modals if enabled */ -@Component({ - selector: 'mdb-modal-backdrop', - template: ``, -}) -export class ModalBackdropComponent implements OnInit { - @HostBinding('class.modal-backdrop') public classNameBackDrop = true; - - public get isAnimated(): boolean { - return this._isAnimated; - } - - public set isAnimated(value: boolean) { - this._isAnimated = value; - } - - public get isShown(): boolean { - return this._isShown; - } - - public set isShown(value: boolean) { - this._isShown = value; - this.renderer.setElementClass(this.element.nativeElement, `${ClassName.IN}`, value); - if (!isBs3()) { - this.renderer.setElementClass(this.element.nativeElement, `${ClassName.SHOW}`, value); - } - } - - public element: ElementRef; - public renderer: Renderer; - - protected _isAnimated: boolean; - protected _isShown = false; - - public constructor(element: ElementRef, renderer: Renderer) { - this.element = element; - this.renderer = renderer; - } - - ngOnInit(): void { - if (this.isAnimated) { - this.renderer.setElementClass(this.element.nativeElement, `${ClassName.FADE}`, this.isAnimated); - Utils.reflow(this.element.nativeElement); - } - this.isShown = true; - } -} diff --git a/src/angular-bootstrap-md/modals/modalContainer.component.html b/src/angular-bootstrap-md/modals/modalContainer.component.html deleted file mode 100755 index c1a070f1..00000000 --- a/src/angular-bootstrap-md/modals/modalContainer.component.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
\ No newline at end of file diff --git a/src/angular-bootstrap-md/modals/modalContainer.component.ts b/src/angular-bootstrap-md/modals/modalContainer.component.ts deleted file mode 100755 index f5d0bdab..00000000 --- a/src/angular-bootstrap-md/modals/modalContainer.component.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { Component, ElementRef, HostListener, OnDestroy, OnInit, Renderer, HostBinding } from '@angular/core'; -import { ClassName, DISMISS_REASONS, ModalOptions, TransitionDurations } from './modal.options'; -import { isBs3 } from '../utils/ng2-bootstrap-config'; -import { msConfig } from './modalService.config'; - -@Component({ - selector: 'mdb-modal-container', - template: ` -
- -
` -}) -export class ModalContainerComponent implements OnInit, OnDestroy { - @HostBinding('tabindex') tabindex = -1; - @HostBinding('role') role = 'dialog'; - @HostBinding('class.modal') modla = true; - - private mdbModalService: any; - - public config: ModalOptions; - public isShown = false; - public level: number; - public isAnimated: boolean; - protected _element: ElementRef; - private isModalHiding = false; - @HostListener('click', ['$event']) - public onClick(event: any): void { - if (this.config.ignoreBackdropClick || this.config.backdrop === 'static' || event.target !== this._element.nativeElement) { - return; - } - this.mdbModalService.setDismissReason(DISMISS_REASONS.BACKRDOP); - this.hide(); - } - @HostListener('window:keydown.esc') - public onEsc(): void { - if (this.config.keyboard && this.level === this.mdbModalService.getModalsCount()) { - this.mdbModalService.setDismissReason(DISMISS_REASONS.ESC); - this.hide(); - } - } - - public constructor(options: ModalOptions, _element: ElementRef, private _renderer: Renderer) { - this.mdbModalService = msConfig.serviceInstance; - - this._element = _element; - this.config = Object.assign({}, options); - } - - ngOnInit(): void { - if (this.isAnimated) { - this._renderer.setElementClass(this._element.nativeElement, ClassName.FADE, true); - } - this._renderer.setElementStyle(this._element.nativeElement, 'display', 'block'); - setTimeout(() => { - this.isShown = true; - this._renderer.setElementClass(this._element.nativeElement, isBs3() ? ClassName.IN : ClassName.SHOW, true); - }, this.isAnimated ? TransitionDurations.BACKDROP : 0); - if (document && document.body) { - if (this.mdbModalService.getModalsCount() === 1) { - this.mdbModalService.checkScrollbar(); - this.mdbModalService.setScrollbar(); - } - this._renderer.setElementClass(document.body, ClassName.OPEN, true); - } - } - - ngOnDestroy(): void { - if (this.isShown) { - this.hide(); - } - } - - hide(): void { - if (this.isModalHiding || !this.isShown) { - return; - } - this.isModalHiding = true; - this._renderer.setElementClass(this._element.nativeElement, isBs3() ? ClassName.IN : ClassName.SHOW, false); - - setTimeout(() => { - this.isShown = false; - if (document && document.body && this.mdbModalService.getModalsCount() === 1) { - this._renderer.setElementClass(document.body, ClassName.OPEN, false); - } - this.mdbModalService.hide(this.level); - this.isModalHiding = false; - }, this.isAnimated ? TransitionDurations.MODAL : 0); - } -} diff --git a/src/angular-bootstrap-md/modals/modalService.config.ts b/src/angular-bootstrap-md/modals/modalService.config.ts deleted file mode 100755 index 12cedbba..00000000 --- a/src/angular-bootstrap-md/modals/modalService.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const msConfig = { - serviceInstance: new Object() -} \ No newline at end of file diff --git a/src/angular-bootstrap-md/navbars/index.ts b/src/angular-bootstrap-md/navbars/index.ts deleted file mode 100755 index 9e1c9b5a..00000000 --- a/src/angular-bootstrap-md/navbars/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { NavbarComponent } from './navbar.component'; -export { NavbarModule } from './navbar.module'; diff --git a/src/angular-bootstrap-md/navbars/links.component.ts b/src/angular-bootstrap-md/navbars/links.component.ts deleted file mode 100755 index d2316c6c..00000000 --- a/src/angular-bootstrap-md/navbars/links.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { NavbarService } from './navbar.service'; -import { AfterContentInit, Component, ContentChildren, ElementRef, QueryList, EventEmitter, Output } from '@angular/core'; -import { RouterLinkWithHref } from '@angular/router'; -import { AfterViewInit } from '@angular/core/src/metadata/lifecycle_hooks'; -@Component({ - selector: 'links', - template: ` - - `, -}) -export class LinksComponent implements AfterViewInit, AfterContentInit { - @ContentChildren(RouterLinkWithHref, { read: ElementRef, descendants: true }) - links: QueryList; - - @Output() linkClick = new EventEmitter(); - constructor( private _navbarService: NavbarService) { } - - ngAfterContentInit() { - const that = this; - - - - setTimeout(function () { - that.links.forEach(function (element) { - element.nativeElement.onclick = function () { - that._navbarService.setNavbarLinkClicks(); - }; - }); - - }, 0); - } - ngAfterViewInit() { - - } -} diff --git a/src/angular-bootstrap-md/navbars/logo.component.ts b/src/angular-bootstrap-md/navbars/logo.component.ts deleted file mode 100755 index 2bc3941b..00000000 --- a/src/angular-bootstrap-md/navbars/logo.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {Component} from '@angular/core'; - -@Component({ - selector: 'logo', - template: ` - - ` -}) -export class LogoComponent { - -} diff --git a/src/angular-bootstrap-md/navbars/navbar.component.html b/src/angular-bootstrap-md/navbars/navbar.component.html deleted file mode 100755 index ec88b104..00000000 --- a/src/angular-bootstrap-md/navbars/navbar.component.html +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/src/angular-bootstrap-md/navbars/navbar.component.ts b/src/angular-bootstrap-md/navbars/navbar.component.ts deleted file mode 100755 index f30bdb2b..00000000 --- a/src/angular-bootstrap-md/navbars/navbar.component.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { NavbarService } from './navbar.service'; -import { Component, ElementRef, ViewChild, Input, Renderer2, AfterViewInit, HostListener, OnInit } from '@angular/core'; -import { Subscription } from 'rxjs'; - -@Component({ - selector: 'mdb-navbar', - templateUrl: 'navbar.component.html', -}) - -export class NavbarComponent implements AfterViewInit, OnInit { - @Input() SideClass: string; - @Input() containerInside = true; - subscription: Subscription; - navbarLinkClicks: any; - shown = false; - - public doubleNav: boolean; - public height: number; - public duration = 350; // ms - - public collapse = false; - public showClass = false; - public collapsing = false; - @ViewChild('navbar') el: ElementRef; - @ViewChild('mobile') mobile: ElementRef; - @ViewChild('nav') navbar: ElementRef; - @ViewChild('container') container: ElementRef; - - constructor(public renderer: Renderer2, private _navbarService: NavbarService) { - // tslint:disable-next-line:max-line-length - this.subscription = this._navbarService.getNavbarLinkClicks().subscribe(navbarLinkClicks => { this.closeNavbarOnClick(navbarLinkClicks); }); - } - - closeNavbarOnClick(navbarLinkClicks: any) { - this.navbarLinkClicks = navbarLinkClicks; - if (this.showClass) { - this.hide(); - } - } - - ngOnInit() { - const isDoubleNav = this.SideClass.split(' '); - if (isDoubleNav.indexOf('double-nav') !== -1) { - this.doubleNav = true; - } else { - this.doubleNav = false; - } - } - - - ngAfterViewInit() { - /* bugfix - bez tego sypie ExpressionChangedAfterItHasBeenCheckedError - - https://github.com/angular/angular/issues/6005#issuecomment-165951692 */ - setTimeout(() => { - this.height = this.el.nativeElement.scrollHeight; - this.collapse = true; - - if (!this.containerInside) { - const childrens = Array.from(this.container.nativeElement.children); - childrens.forEach(child => { - // this.navbar.nativeElement.append(child); - this.renderer.appendChild(this.navbar.nativeElement, child); - - this.container.nativeElement.remove(); - }); - - } - if (this.el.nativeElement.children.length === 0) { - this.el.nativeElement.remove(); - } - }); - } - - toggle(event: any) { - event.preventDefault(); - if (!this.collapsing) { - if (this.shown) { - this.hide(); - } else { - this.show(); - } - } - } - - show() { - this.shown = true; - this.collapse = false; - this.collapsing = true; - setTimeout(() => { - this.renderer.setStyle(this.el.nativeElement, 'height', this.height + 'px'); - }, 10); - - - setTimeout(() => { - this.collapsing = false; - this.collapse = true; - this.showClass = true; - }, this.duration); - } - - hide() { - this.shown = false; - this.collapse = false; - this.showClass = false; - this.collapsing = true; - setTimeout(() => { - this.renderer.setStyle(this.el.nativeElement, 'height', '0px'); - }, 10); - - - setTimeout(() => { - this.collapsing = false; - this.collapse = true; - }, this.duration); - } - - get displayStyle() { - // if(!this.containerInside) { - // return 'flex'; - // } else { - return ''; - // } - } - - @HostListener('window:resize', ['$event']) onResize(event: any) { - let breakpoit = 0; - - if (this.SideClass.includes('navbar-expand-xl')) { - breakpoit = 1200; - } else if (this.SideClass.includes('navbar-expand-lg')) { - breakpoit = 992; - } else if (this.SideClass.includes('navbar-expand-md')) { - breakpoit = 768; - } else if (this.SideClass.includes('navbar-expand-sm')) { - breakpoit = 576; - } else { - breakpoit = event.target.innerWidth + 1; - } - - if (event.target.innerWidth < breakpoit) { - if (!this.shown) { - this.collapse = false; - this.renderer.setStyle(this.el.nativeElement, 'height', '0px'); - this.renderer.setStyle(this.el.nativeElement, 'opacity', '0'); - setTimeout(() => { - this.height = this.el.nativeElement.scrollHeight; - this.collapse = true; - this.renderer.setStyle(this.el.nativeElement, 'opacity', ''); - }, 4); - } - } else { - this.collapsing = false; - this.shown = false; - this.showClass = false; - this.collapse = true; - this.renderer.setStyle(this.el.nativeElement, 'height', ''); - } - } - - @HostListener('document:scroll', ['$event']) onScroll() { - if (this.navbar.nativeElement.classList.contains('scrolling-navbar')) { - if (window.pageYOffset > 120) { - this.renderer.addClass(this.navbar.nativeElement, 'top-nav-collapse'); - } else { - this.renderer.removeClass(this.navbar.nativeElement, 'top-nav-collapse'); - } - } - } -} diff --git a/src/angular-bootstrap-md/navbars/navbar.module.ts b/src/angular-bootstrap-md/navbars/navbar.module.ts deleted file mode 100755 index 83166c8d..00000000 --- a/src/angular-bootstrap-md/navbars/navbar.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { LinksComponent } from './links.component'; -import { LogoComponent } from './logo.component'; -import { NavbarService } from './navbar.service'; -import {CommonModule} from '@angular/common'; -import {NgModule} from '@angular/core'; -import {NavbarComponent} from './navbar.component'; -import { NavlinksComponent } from './navlinks.component'; -@NgModule({ - imports: [CommonModule], - declarations: [NavbarComponent, LinksComponent, LogoComponent, NavlinksComponent], - exports: [NavbarComponent, LinksComponent , LogoComponent, NavlinksComponent], - providers: [NavbarService] -}) -export class NavbarModule {} diff --git a/src/angular-bootstrap-md/navbars/navbar.service.ts b/src/angular-bootstrap-md/navbars/navbar.service.ts deleted file mode 100755 index e68f1f2f..00000000 --- a/src/angular-bootstrap-md/navbars/navbar.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import {Injectable} from '@angular/core'; -import { Subject , Observable } from 'rxjs'; - -@Injectable() -export class NavbarService { - - private navbarLinkClicks = new Subject(); - - - getNavbarLinkClicks(): Observable { - return this.navbarLinkClicks.asObservable(); - } - - setNavbarLinkClicks() { - this.navbarLinkClicks.next(); - } -} diff --git a/src/angular-bootstrap-md/navbars/navlinks.component.ts b/src/angular-bootstrap-md/navbars/navlinks.component.ts deleted file mode 100755 index 7b45e02c..00000000 --- a/src/angular-bootstrap-md/navbars/navlinks.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { NavbarService } from './navbar.service'; -import { AfterContentInit, Component, ContentChildren, ElementRef, QueryList, EventEmitter, Output } from '@angular/core'; -import { RouterLinkWithHref } from '@angular/router'; -import { AfterViewInit } from '@angular/core/src/metadata/lifecycle_hooks'; -@Component({ - selector: 'navlinks', - template: ` - - `, -}) -export class NavlinksComponent implements AfterViewInit, AfterContentInit { - @ContentChildren(RouterLinkWithHref, { read: ElementRef, descendants: true }) - links: QueryList; - - @Output() linkClick = new EventEmitter(); - constructor( private _navbarService: NavbarService) { } - - ngAfterContentInit() { - const that = this; - - - - setTimeout(function () { - that.links.forEach(function (element) { - element.nativeElement.onclick = function () { - that._navbarService.setNavbarLinkClicks(); - }; - }); - - }, 0); - } - ngAfterViewInit() { - - } -} diff --git a/src/angular-bootstrap-md/package.json b/src/angular-bootstrap-md/package.json deleted file mode 100755 index 967d3530..00000000 --- a/src/angular-bootstrap-md/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "angular-bootstrap-md", - "version": "6.1.1", - "description": "Material Design for Bootstrap (MDB) is a powerful Material Design UI KIT for most popular HTML, CSS, and JS framework - Bootstrap.", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "https://github.com/mdbootstrap/Angular-Bootstrap-with-Material-Design.git" - }, - "keywords": [ - "material", - "design", - "bootstrap", - "mdbootstrap", - "mdb", - "framework", - "css", - "mobile-first", - "responsive", - "angular", - "ng", - "ng2", - "angular2", - "ng4", - "angular4", - "ng5", - "angular 5", - "ng6", - "angular 6" - ], - "author": "MDBootstrap", - "license": "Custom license (read license.pdf)", - "bugs": { - "url": "https://github.com/mdbootstrap/bootstrap-material-design/issues" - }, - "homepage": "https://mdbootstrap.com", - "peerDependencies": { - "@angular/animations": "5.0.0 - 6.0.2", - "@angular/common": "5.0.0 - 6.0.2", - "@angular/compiler": "5.0.0 - 6.0.2", - "@angular/core": "5.0.0 - 6.0.2", - "@angular/forms": "5.0.0 - 6.0.2", - "chart.js": "2.5.x", - "hammerjs": "2.0.8", - "font-awesome": "4.7.x", - "@agm/core": "~1.0.0-beta.2" - } -} \ No newline at end of file diff --git a/src/angular-bootstrap-md/popover/index.ts b/src/angular-bootstrap-md/popover/index.ts deleted file mode 100755 index 234a9258..00000000 --- a/src/angular-bootstrap-md/popover/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { PopoverDirective } from './popover.directive'; -export { PopoverModule } from './popover.module'; -export { PopoverConfig } from './popover.config'; -export { PopoverContainerComponent } from './popover-container.component'; diff --git a/src/angular-bootstrap-md/popover/licens.md b/src/angular-bootstrap-md/popover/licens.md deleted file mode 100755 index 68dc12fd..00000000 --- a/src/angular-bootstrap-md/popover/licens.md +++ /dev/null @@ -1 +0,0 @@ -https://github.com/valor-software/ngx-bootstrap/blob/development/LICENSE \ No newline at end of file diff --git a/src/angular-bootstrap-md/popover/popover-container.component.html b/src/angular-bootstrap-md/popover/popover-container.component.html deleted file mode 100755 index 0695078a..00000000 --- a/src/angular-bootstrap-md/popover/popover-container.component.html +++ /dev/null @@ -1,5 +0,0 @@ -
-

{{title}}

-
- -
\ No newline at end of file diff --git a/src/angular-bootstrap-md/popover/popover-container.component.ts b/src/angular-bootstrap-md/popover/popover-container.component.ts deleted file mode 100755 index 7d8dd784..00000000 --- a/src/angular-bootstrap-md/popover/popover-container.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { ChangeDetectionStrategy, Input, Component, HostBinding, OnInit } from '@angular/core'; -import { PopoverConfig } from './popover.config'; -import { isBs3 } from '../utils/ng2-bootstrap-config'; - -@Component({ - selector: 'mdb-popover-container', - changeDetection: ChangeDetectionStrategy.OnPush, - template: ` -

{{title}}

-
- -
` -}) -export class PopoverContainerComponent implements OnInit { - -@Input() public placement: string; - @Input() public title: string; - -@HostBinding('class.show') show = '!isBs3'; - @HostBinding('attr.role') role = 'tooltip'; -// @HostBinding('class') class; -@HostBinding('class') class: any; - - - -public get isBs3(): boolean { - return isBs3(); - } - -public constructor(config: PopoverConfig) { - Object.assign(this, config); - } - -ngOnInit() { - this.class = 'popover-fadeIn popover in popover-' + this.placement + ' ' + this.placement + ' bs-popover-' + this.placement; - } -} \ No newline at end of file diff --git a/src/angular-bootstrap-md/popover/popover.config.ts b/src/angular-bootstrap-md/popover/popover.config.ts deleted file mode 100755 index d52ce229..00000000 --- a/src/angular-bootstrap-md/popover/popover.config.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Injectable } from '@angular/core'; - -/** - * Configuration service for the Popover directive. - * You can inject this service, typically in your root component, and customize - * the values of its properties in order to provide default values for all the - * popovers used in the application. - */ - @Injectable() - export class PopoverConfig { - /** - * Placement of a popover. Accepts: "top", "bottom", "left", "right" - */ - public placement = 'top'; - /** - * Specifies events that should trigger. Supports a space separated list of - * event names. - */ - public triggers = 'click'; - /** - * A selector specifying the element the popover should be appended to. - * Currently only supports "body". - */ - public container: string; - } diff --git a/src/angular-bootstrap-md/popover/popover.directive.ts b/src/angular-bootstrap-md/popover/popover.directive.ts deleted file mode 100755 index 1fd53457..00000000 --- a/src/angular-bootstrap-md/popover/popover.directive.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { Directive, Input, Output, EventEmitter, OnInit, OnDestroy, Renderer2, ElementRef, TemplateRef, - ViewContainerRef } from '@angular/core'; - import { PopoverConfig } from './popover.config'; - import { ComponentLoaderFactory } from '../utils/component-loader/component-loader.factory'; - import { ComponentLoader } from '../utils/component-loader/component-loader.class'; - import { PopoverContainerComponent } from './popover-container.component'; - -/** - * A lightweight, extensible directive for fancy popover creation. - */ - @Directive({selector: '[mdbPopover]', exportAs: 'bs-mdbPopover'}) - export class PopoverDirective implements OnInit, OnDestroy { - /** - * Content to be displayed as popover. - */ - @Input() public mdbPopover: string | TemplateRef; - /** - * Title of a popover. - */ - @Input() public popoverTitle: string; - /** - * Placement of a popover. Accepts: "top", "bottom", "left", "right" - */ - @Input() public placement: 'top' | 'bottom' | 'left' | 'right'; - /** - * Specifies events that should trigger. Supports a space separated list of - * event names. - */ - @Input() public triggers: string; - /** - * A selector specifying the element the popover should be appended to. - * Currently only supports "body". - */ - @Input() public container: string; - - /** - * Returns whether or not the popover is currently being shown - */ - @Input() - public get isOpen(): boolean { return this._popover.isShown; } - - public set isOpen(value: boolean) { - if (value) {this.show(); } else {this.hide(); } - } - - /** - * Emits an event when the popover is shown - */ - @Output() public onShown: EventEmitter; - /** - * Emits an event when the popover is hidden - */ - @Output() public onHidden: EventEmitter; - - private _popover: ComponentLoader; - - public constructor(_elementRef: ElementRef, - _renderer: Renderer2, - _viewContainerRef: ViewContainerRef, - _config: PopoverConfig, - cis: ComponentLoaderFactory) { - this._popover = cis - .createLoader(_elementRef, _viewContainerRef, _renderer) - .provide({provide: PopoverConfig, useValue: _config}); - Object.assign(this, _config); - this.onShown = this._popover.onShown; - this.onHidden = this._popover.onHidden; - } - - /** - * Opens an element’s popover. This is considered a “manual” triggering of - * the popover. - */ - public show(): void | any { - if (this._popover.isShown) { - return; - } - - this._popover - .attach(PopoverContainerComponent) - .to(this.container) - .position({attachment: this.placement}) - .show({ - content: this.mdbPopover, - placement: this.placement, - title: this.popoverTitle - }); - this.isOpen = true; - } - - /** - * Closes an element’s popover. This is considered a “manual” triggering of - * the popover. - */ - public hide(): void { - if (this.isOpen) { - this._popover.hide(); - this.isOpen = false; - } - } - - /** - * Toggles an element’s popover. This is considered a “manual” triggering of - * the popover. - */ - public toggle(): void { - if (this.isOpen) { - return this.hide(); - } - - this.show(); - } - - public ngOnInit(): any { - this._popover.listen({ - triggers: this.triggers, - show: () => this.show() - }); - } - - public dispose() { - this._popover.dispose(); - } - - public ngOnDestroy(): any { - this._popover.dispose(); - } - } diff --git a/src/angular-bootstrap-md/popover/popover.module.ts b/src/angular-bootstrap-md/popover/popover.module.ts deleted file mode 100755 index df35c44f..00000000 --- a/src/angular-bootstrap-md/popover/popover.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { ComponentLoaderFactory } from '../utils/component-loader/component-loader.factory'; -import { PositioningService } from '../utils/positioning/positioning.service'; -import { PopoverConfig } from './popover.config'; -import { PopoverDirective } from './popover.directive'; -import { PopoverContainerComponent } from './popover-container.component'; - -@NgModule({ - imports: [CommonModule], - declarations: [PopoverDirective, PopoverContainerComponent], - exports: [PopoverDirective], - entryComponents: [PopoverContainerComponent] -}) -export class PopoverModule { - public static forRoot(): ModuleWithProviders { - return { - ngModule: PopoverModule, - providers: [PopoverConfig, ComponentLoaderFactory, PositioningService] - }; - } -} diff --git a/src/angular-bootstrap-md/ripple/index.ts b/src/angular-bootstrap-md/ripple/index.ts deleted file mode 100755 index c5862c70..00000000 --- a/src/angular-bootstrap-md/ripple/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { RippleDirective } from './ripple-effect.directive'; -export { RippleModule } from './ripple.module'; diff --git a/src/angular-bootstrap-md/ripple/ripple-effect.directive.ts b/src/angular-bootstrap-md/ripple/ripple-effect.directive.ts deleted file mode 100755 index 5ee555d2..00000000 --- a/src/angular-bootstrap-md/ripple/ripple-effect.directive.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Directive, ElementRef, HostListener } from '@angular/core'; -@Directive({ - selector: '[mdbRippleRadius]' -}) -export class RippleDirective { - el: ElementRef; - - constructor(el: ElementRef) { - this.el = el; - } - - @HostListener('click', ['$event']) - public click(event: any) { - // event.stopPropagation(); - - if (!this.el.nativeElement.classList.contains('disabled')) { - - const button = this.el.nativeElement; - if (!button.classList.contains('waves-effect')) { - button.className += ' waves-effect'; - } - - const xPos = event.clientX - button.getBoundingClientRect().left; - const yPos = event.clientY - button.getBoundingClientRect().top; - - - const tmp = document.createElement('div'); - tmp.className += 'waves-ripple waves-rippling'; - const ripple = button.appendChild(tmp); - - const top = yPos + 'px'; - const left = xPos + 'px'; - - tmp.style.top = top; - tmp.style.left = left; - - const scale = 'scale(' + ((button.clientWidth / 100) * 3) + ') translate(0,0)'; - - tmp.style.webkitTransform = scale; - tmp.style.transform = scale; - tmp.style.opacity = '1'; - - const duration = 750; - - tmp.style.webkitTransitionDuration = duration + 'ms'; - tmp.style.transitionDuration = duration + 'ms'; - - - this.removeRipple(button, ripple); - } - } - - removeRipple(button: any, ripple: any) { - ripple.classList.remove('waves-rippling'); - - setTimeout(() => { - ripple.style.opacity = '0'; - - setTimeout(() => { - button.removeChild(ripple); - }, 750); - }, 200); - - - - } -} diff --git a/src/angular-bootstrap-md/ripple/ripple.module.ts b/src/angular-bootstrap-md/ripple/ripple.module.ts deleted file mode 100755 index c08ef941..00000000 --- a/src/angular-bootstrap-md/ripple/ripple.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { RippleDirective } from './ripple-effect.directive'; - -@NgModule({ - declarations: [RippleDirective], - exports: [RippleDirective] -}) - -export class RippleModule { - public static forRoot(): ModuleWithProviders { - return {ngModule: RippleModule, providers: []}; - } -} diff --git a/src/angular-bootstrap-md/scss/.directory b/src/angular-bootstrap-md/scss/.directory deleted file mode 100644 index 1d809c83..00000000 --- a/src/angular-bootstrap-md/scss/.directory +++ /dev/null @@ -1,10 +0,0 @@ -[Dolphin] -PreviewsShown=true -SortOrder=1 -SortRole=modificationtime -Timestamp=2018,3,23,10,44,54 -Version=4 -VisibleRoles=Icons_text,Icons_modificationtime - -[Settings] -HiddenFilesShown=true diff --git a/src/angular-bootstrap-md/scss/_custom-skin.scss b/src/angular-bootstrap-md/scss/_custom-skin.scss deleted file mode 100755 index c9c646e8..00000000 --- a/src/angular-bootstrap-md/scss/_custom-skin.scss +++ /dev/null @@ -1,23 +0,0 @@ -// Your custom skin -$skins: () !default; -$skins: map-merge(( - "test": ( - "skin-primary-color": #fff, - "skin-navbar": #fff, - "skin-footer-color": #fff, - "skin-accent": #fff, - "skin-flat": #fff, - "skin-sidenav-item": #fff, - "skin-sidenav-item-hover": #fff, - "skin-gradient-start": #fff, - "skin-gradient-end": #fff, - "skin-mask-slight": #fff, - "skin-mask-light": #fff, - "skin-mask-strong": #fff, - "skin-sn-child": #fff, - "skin-btn-primary": #fff, - "skin-btn-secondary": #fff, - "skin-btn-default": #fff, - "skin-text": #fff - ) -), $skins); \ No newline at end of file diff --git a/src/angular-bootstrap-md/scss/_custom-styles.scss b/src/angular-bootstrap-md/scss/_custom-styles.scss deleted file mode 100755 index d1906751..00000000 --- a/src/angular-bootstrap-md/scss/_custom-styles.scss +++ /dev/null @@ -1 +0,0 @@ -// Your custom styles \ No newline at end of file diff --git a/src/angular-bootstrap-md/scss/_custom-variables.scss b/src/angular-bootstrap-md/scss/_custom-variables.scss deleted file mode 100755 index 5539a15f..00000000 --- a/src/angular-bootstrap-md/scss/_custom-variables.scss +++ /dev/null @@ -1 +0,0 @@ -// Your custom variables \ No newline at end of file diff --git a/src/angular-bootstrap-md/scss/_custom.scss b/src/angular-bootstrap-md/scss/_custom.scss deleted file mode 100755 index 116b807f..00000000 --- a/src/angular-bootstrap-md/scss/_custom.scss +++ /dev/null @@ -1 +0,0 @@ -// Your custom styles diff --git a/src/angular-bootstrap-md/scss/angular/free/_carousel.scss b/src/angular-bootstrap-md/scss/angular/free/_carousel.scss deleted file mode 100755 index e78d81b1..00000000 --- a/src/angular-bootstrap-md/scss/angular/free/_carousel.scss +++ /dev/null @@ -1,23 +0,0 @@ -.carousel-item.active, .carousel-item-next, .carousel-item-prev { - display: flex; - overflow: hidden; -} - -.carousel, .carousel-multi-item, .carousel-thumbnails { - outline: none; -} - -.carousel-fade .carousel-inner .carousel-item { - opacity: 0; - transition-property: opacity; -} - -.carousel-fade .carousel-inner .active { - opacity: 1; -} - -.carousel-fade .carousel-inner>.carousel-item.active, .carousel-fade .carousel-inner>.carousel-item.next.left, .carousel-fade .carousel-inner>.carousel-item.prev.right { - opacity: 1; - -webkit-transform: translate3d(0,0,0); - transform: translate3d(0,0,0); -} \ No newline at end of file diff --git a/src/angular-bootstrap-md/scss/angular/free/_dropdowns.scss b/src/angular-bootstrap-md/scss/angular/free/_dropdowns.scss deleted file mode 100755 index d2cabb50..00000000 --- a/src/angular-bootstrap-md/scss/angular/free/_dropdowns.scss +++ /dev/null @@ -1,71 +0,0 @@ -.show { - // Show the menu - > .dropdown-menu { - display: block; - } - - // Remove the outline when :focus is triggered - > a { - outline: 0; - } -} - -dropdown{ - .dropdown-menu { - display: none; - position: absolute; - transform: translate3d(0px, 47px, 0px); - top: 0px; - left: 0px; - will-change: transform; - } -} - -//dropup -.dropup { - // Different positioning for bottom up menu - .dropdown-menu { - display: none; - // // position: absolute; - // transform: translate3d(117px, -165px, 0px); - // // top: 0px; - // // left: 0px; - will-change: transform; - } -} -//dropup animation -.dropup.show { - .dropdown-menu { - display: block; - opacity: 0; - transition: 0.55s; - } - - .fadeInDropdown { - opacity: 1; - } -} - -//material dropdown -.dropdown { - .dropdown-menu { - display: none; - position: absolute; - transform: translate3d(6px, 49px, 0px); - top: 0px; - left: 0px; - will-change: transform; - } -} -//material dropdown animation -.dropdown.show { - .dropdown-menu { - display: block; - opacity: 0; - transition: 0.55s; - } - - .fadeInDropdown { - opacity: 1; - } -} \ No newline at end of file diff --git a/src/angular-bootstrap-md/scss/angular/free/_inputs.scss b/src/angular-bootstrap-md/scss/angular/free/_inputs.scss deleted file mode 100755 index 0fcb67aa..00000000 --- a/src/angular-bootstrap-md/scss/angular/free/_inputs.scss +++ /dev/null @@ -1,53 +0,0 @@ -//input disabled -.disabled { - cursor: not-allowed !important; -} - -//input counter -.counter-danger { - border-bottom: 1px solid #F44336 !important; - box-shadow: 0 1px 0 0 #F44336 !important; -} - -input:focus~.chars { - float: right; - clear: both; - display: block; -} - -textarea:focus~.chars { - float: right; - clear: both; - display: block; -} - -//active styles for input label -.md-form label.active { - color: #757575; - transform: translateY(-120%); - -webkit-transform: translateY(-120%); -} - -//inputs validation -.counter-success { - border-bottom: 1px solid $input-success-color !important; - box-shadow: 0 1px 0 0 $input-success-color !important; -} - -.inputVal { - font-size: .8rem; - position: absolute; - top: 40px; -} - -.md-form .prefix~.inputVal { - margin-left: 2.5rem; -} - -input.counter-danger~span.text-danger { - visibility: visible !important; -} - -input.counter-success~span.text-success { - visibility: visible !important; -} diff --git a/src/angular-bootstrap-md/scss/angular/free/_layout.scss b/src/angular-bootstrap-md/scss/angular/free/_layout.scss deleted file mode 100755 index e69de29b..00000000 diff --git a/src/angular-bootstrap-md/scss/angular/free/_list-group.scss b/src/angular-bootstrap-md/scss/angular/free/_list-group.scss deleted file mode 100755 index 99245406..00000000 --- a/src/angular-bootstrap-md/scss/angular/free/_list-group.scss +++ /dev/null @@ -1,21 +0,0 @@ -.flex-column { - - .nav-item a { - width: 100%; - margin: 0; - color: #495057; - margin-bottom: -1px; - } - .nav-link { - padding:0 !important; - } - .active a { - background-color: #007bff; - border-color: #007bff; - color: #fff !important; - } - .list-group-item { - border-radius: 0; - } -} - diff --git a/src/angular-bootstrap-md/scss/angular/free/_maps.scss b/src/angular-bootstrap-md/scss/angular/free/_maps.scss deleted file mode 100755 index 98ace457..00000000 --- a/src/angular-bootstrap-md/scss/angular/free/_maps.scss +++ /dev/null @@ -1,3 +0,0 @@ -agm-map { - display: block; -} \ No newline at end of file diff --git a/src/angular-bootstrap-md/scss/angular/free/_modals.scss b/src/angular-bootstrap-md/scss/angular/free/_modals.scss deleted file mode 100755 index 8d717568..00000000 --- a/src/angular-bootstrap-md/scss/angular/free/_modals.scss +++ /dev/null @@ -1,552 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ - -// Distance -$modal-distance:10px; -$modal-info-color: #5394ff; -$modal-success-color: #01d36b; -$modal-warning-color: #ff8e38; -$modal-danger-color: #ff4b4b; - -// Styles for body -body { - &.modal-open { - padding-right: 0 !important; - } - &.scrollable { - overflow-y: auto; - } -} - -// *** ENHANCED BOOTSTRAP MODALS ***/// -// General styles -.modal-dialog { - .modal-content { - // @include border-radius(2px); - // @extend .z-depth-1-half; - border: 0; - } -} - -// Position & Size -.modal { - padding-right:0 !important; - .modal-dialog { - @media (min-width: 768px) { - &.modal-top { - top: 0; - } - &.modal-left { - left: 0; - } - &.modal-right { - right: 0; - } - &.modal-bottom { - bottom: 0; - } - &.modal-top-left { - top: $modal-distance; - left: $modal-distance; - } - &.modal-top-right { - top: $modal-distance; - right: $modal-distance; - } - &.modal-bottom-left { - left: $modal-distance; - bottom: $modal-distance; - } - &.modal-bottom-right { - right: $modal-distance; - bottom: $modal-distance; - } - } - } - .modal-side { - &.modal-top { - top: 0; - } - &.modal-left { - left: 0; - } - &.modal-right { - right: 0; - } - &.modal-bottom { - bottom: 0; - } - &.modal-top-left { - top: $modal-distance; - left: $modal-distance; - } - &.modal-top-right { - top: $modal-distance; - right: $modal-distance; - } - &.modal-bottom-left { - left: $modal-distance; - bottom: $modal-distance; - } - &.modal-bottom-right { - right: $modal-distance; - bottom: $modal-distance; - } - } - &.fade { - &.top:not(.show) .modal-dialog { - transform: translate3d(0, -25%, 0); - } - &.left:not(.show) .modal-dialog { - transform: translate3d(-25%, 0, 0); - } - &.right:not(.show) .modal-dialog { - transform: translate3d(25%, 0, 0); - } - &.bottom:not(.show) .modal-dialog { - transform: translate3d(0, 25%, 0); - } - &.in { - opacity: 1; - .modal-dialog { - // -webkit-transform: translate(0, 0); - transform: translate(0, 0); - .relative { - display: inline-block; - // transform: translate3d(0, 0, 0); - } - } - } - } - &.modal-scrolling { - position: relative; - .modal-dialog { - position: fixed; - z-index: 1050; - } - } - &.modal-content-clickable { - top:auto; - bottom:auto; - .modal-dialog { - position:fixed; - } - } - .modal-fluid { - width: 100%; - max-width: 100%; - .modal-content { - width: 100%; - } - } - .modal-frame { - position: absolute; - width: 100%; - max-width: 100%; - margin: 0; - &.modal-bottom { - bottom: 0; - } - } - .modal-full-height { - display: flex; - position: absolute; - width: 400px; - min-height: 100%; - margin: 0; - top: 0; - // bottom: 0; - right: 0; - &.modal-top, &.modal-bottom { - display:block; - width:100%; - max-width:100%; - height:auto; - } - &.modal-top { - bottom:auto; - } - &.modal-bottom { - top:auto; - } - .modal-content { - width:100%; - } - &.modal-lg { - max-width:90%; - width:90%; - @media (min-width:992px) { - max-width:800px; - width:800px; - } - @media (min-width:1200px) { - max-width:1000px; - width:1000px; - } - } - } - .modal-side { - position: absolute; - right: $modal-distance; - bottom: $modal-distance; - margin: 0; - width: 400px; - } -} - -// Styles -.modal-dialog { - .btn .fa { - color:#fff !important; - } - [class*="btn-outline-"] .fa { - color: inherit !important; - } - // Cascading modals - &.cascading-modal { - margin-top: 10%; - // Cascading header - .modal-header { - text-align: center; - margin: -2rem 1rem 1rem 1rem; - padding: 1.5rem; - border: none; - flex-direction: column; - // @extend .z-depth-1-half; - // @include border-radius(3px); - .close { - margin-right: 2.5rem; - } - &.white-text { - .close { - color: #fff; - opacity: 1; - } - } - .title { - width: 100%; - margin-bottom: 0; - font-size: 1.25rem; - .fa { - margin-right: 9px; - } - } - .social-buttons { - margin-top: 1.5rem; - a { - font-size: 1rem; - } - } - } - // Cascading tabs nav - .modal-c-tabs { - .nav-tabs { - margin: -1.5rem 1rem 0 1rem; - // @extend .z-depth-1; - } - .tab-content { - padding: 1.7rem 0 0 0; - } - } - // Footer customization - .modal-body, - .modal-footer { - color: #616161; - padding-right: 2rem; - padding-left: 2rem; - .additional-option { - text-align: center; - margin-top: 1rem; - } - } - // Cascading avatar - &.modal-avatar { - margin-top: 6rem; - .modal-header { - // @extend .z-depth-0; - // @extend .img-fluid; - margin: -6rem 2rem -1rem 2rem; - img { - width: 130px; - // @extend .z-depth-2; - } - } - } - } - // Modal notify - &.modal-notify { - .heading { - margin: 0; - padding: 0.3rem; - color: #fff; - font-size: 1.15rem; - } - .modal-header { - // @extend .z-depth-1; - border: 0; - } - .close { - opacity: 1; - } - .modal-body { - padding: 1.5rem; - color: #616161; - } - .btn-outline-secondary-modal { - background-color: transparent; - } - // Modal info - &.modal-info { - .modal-header { - background-color: $modal-info-color; - } - .fa { - color: $modal-info-color; - } - .badge { - background-color: $modal-info-color; - } - .btn-primary-modal { - background: $modal-info-color; - &:hover, - &:focus, - &:active { - background-color: lighten( $modal-info-color, 5%)!important; - } - &.active { - background-color: darken( $modal-info-color, 20%)!important; - // @extend .z-depth-1-half; - } - } - .btn-outline-secondary-modal { - border: 2px solid $modal-info-color; - color: $modal-info-color!important; - } - } - // Modal warning - &.modal-warning { - .modal-header { - background-color: $modal-warning-color; - } - .fa { - color: $modal-warning-color; - } - .badge { - background-color: $modal-warning-color; - } - .btn-primary-modal { - background: $modal-warning-color; - &:hover, - &:focus, - &:active { - background-color: lighten( $modal-warning-color, 5%)!important; - } - &.active { - background-color: darken( $modal-warning-color, 20%)!important; - // @extend .z-depth-1-half; - } - } - .btn-outline-secondary-modal { - border: 2px solid $modal-warning-color; - color: $modal-warning-color!important; - } - } - // Modal success - &.modal-success { - .modal-header { - background-color: $modal-success-color; - } - .fa { - color: $modal-success-color; - } - .badge { - background-color: $modal-success-color; - } - .btn-primary-modal { - background: $modal-success-color; - &:hover, - &:focus, - &:active { - background-color: lighten( $modal-success-color, 5%)!important; - } - &.active { - background-color: darken( $modal-success-color, 20%)!important; - // @extend .z-depth-1-half; - } - } - .btn-outline-secondary-modal { - border: 2px solid $modal-success-color; - color: $modal-success-color!important; - } - } - // Modal danger - &.modal-danger { - .modal-header { - background-color: $modal-danger-color; - } - .fa { - color: $modal-danger-color; - } - .badge { - background-color: $modal-danger-color; - } - .btn-primary-modal { - background: $modal-danger-color; - &:hover, - &:focus, - &:active { - background-color: lighten( $modal-danger-color, 5%)!important; - } - &.active { - background-color: darken( $modal-danger-color, 20%)!important; - // @extend .z-depth-1-half; - } - } - .btn-outline-secondary-modal { - border: 2px solid $modal-danger-color; - color: $modal-danger-color!important; - } - } - } -} - -.modal-sm .modal-content{ - margin: 0 auto; - max-width: 300px; -} - -@media (min-width: 768px){ - .modal-sm{ - max-width: 100%; - } -} - -.modal .modal-fluid, .modal .modal-frame { - width: 100%; - max-width: 100%; -} - -/********************* - Modals -**********************/ - -// Modal Login & Modal Register -.modal-ext .modal-content { - .modal-header { - text-align: center; - } - .options { - float: left; - } - .modal-body .text-xs-center fieldset { - margin-top: 20px; - } - .call { - margin-top: 1rem; - } - .modal-body { - padding: 2rem 2rem 1rem 2rem; - } -} - -.modal-content { - .close { - position: absolute; - right: 15px; - } -} - -// Modal Cart -.modal-cart { - li p { - margin: 5px; - font-weight: 400; - .badge { - margin-left: 10px; - margin-top: 3px; - font-weight: 400; - position: absolute; - } - .quantity { - font-size: 16px; - margin-right: 7px; - font-weight: 300; - } - } - .cartPageLink { - margin-left: 10px; - a { - text-decoration: underline; - color: #666; - } - } - .total { - float: right; - font-weight: 400; - } -} - -// Modals normalize -.cf-phone { - margin-left: 7px; -} - -// Container that the modal scrolls within -.side-modal { - position: fixed; - width: 400px; - height: 100%; - width: 100%; - z-index: 9999; - // Shell div to position the modal with bottom padding - .modal-dialog { - position: absolute; - bottom: 10px; - right: 10px; - width: 400px; - margin: 10px; - // @extend .z-depth-1-half; - @media (max-width: 760px) { - display: none; - } - } - // Actual modal - .modal-header { - padding: 1rem; - .heading { - margin: 0; - padding: 0; - } - } - .modal-content { - border: none; - } - // Modal background -} - -.side-modal.fade:not(.show) .modal-dialog { - -webkit-transform: translate3d(25%, 0, 0); - transform: translate3d(25%, 0, 0); -} - -// Transparent backdrop -.transparent-bd { - opacity: 0!important; -} - -.modal-backdrop.in { - opacity: 0.5; -} - -.modal-backdrop { - opacity: 0.5; -} - -#exampleModalScroll { - overflow-x: hidden; - overflow-y: auto; -} - -.modal-open .modal { - overflow-x: hidden; - overflow-y: hidden; -} \ No newline at end of file diff --git a/src/angular-bootstrap-md/scss/angular/free/_navbar.scss b/src/angular-bootstrap-md/scss/angular/free/_navbar.scss deleted file mode 100755 index 465502be..00000000 --- a/src/angular-bootstrap-md/scss/angular/free/_navbar.scss +++ /dev/null @@ -1,206 +0,0 @@ -@media (min-width: 1200px) { - .navbar.navbar-expand-xl { - links, - navlinks { - display: flex; - flex-direction: row; - align-items: center !important; - align-self: center !important; - width: 100%; - } - } -} - -@media (min-width: 992px) { - .navbar>logo>div>a { - img { - margin-left: 20px; - } - } - .navbar.navbar-expand-lg { - links, - navlinks { - display: flex; - flex-direction: row; - align-items: center !important; - align-self: center !important; - width: 100%; - } - } -} - -@media (min-width: 768px) { - .navbar.navbar-expand-md { - links, - navlinks { - display: flex; - flex-direction: row; - width: 100%; - } - } -} - -@media (min-width: 576px) { - .navbar.navbar-expand-sm { - links, - navlinks { - display: flex; - flex-direction: row; - width: 100%; - } - } -} - -// .navbar { -// z-index: 91; -// } -.navbar-container { - order: -1; - width: 50px !important; - padding-left: 5px; - padding-right: 5px; -} - -.navbar-nav { - .dropdown-menu-right.dropdown-menu { - left: unset; - } -} - -.breadcrumbs { - display: flex; - padding-left: 5px; - padding-right: 5px; - order: 0; - align-items: center; - @media (min-width: 1441px) { - margin-left: -0.6rem; - } -} //EDGE -@supports (-ms-ime-align: auto) { - .ie-nav { - @media all and (min-width: 992px) { - .navbar-nav.nav-flex-icons { - position: absolute; - top: 30%; - right: 0; - } - .navbar-nav { - position: absolute; - top: 30%; - margin-left: 88px; - } - .navbar-brand>img { - margin-top: -2px; - padding-right: 16px; - } - } - .navbar-toggler { - position: absolute; - margin-top: -40px; - right: 0; - } - } - .intro-non-fixed-nav>links { - @media all and (min-width: 992px) { - .navbar-collapse { - display: inline-flex !important; - align-items: center !important; - justify-content: space-between !important; - } - } - } - .intro-fixed-nav { - @media all and (min-width: 992px) { - .navbar-nav.nav-flex-icons { - position: absolute; - top: 30%; - right: 0; - } - .navbar-nav { - position: absolute; - top: 30%; - margin-left: 88px; - } - .navbar-brand { - img { - margin-top: -2px; - padding-right: 16px; - } - } - } - .navbar-toggler { - position: absolute; - margin-top: -40px; - right: 0; - } - } -} //IE10+ -@media all and (-ms-high-contrast: none), -(-ms-high-contrast: active) { - .ie-nav { - @media all and (min-width: 992px) { - .navbar-nav.nav-flex-icons { - position: absolute; - top: 30%; - right: 0; - } - .navbar-nav { - position: absolute; - top: 30%; - margin-left: 88px; - } - .navbar-brand>img { - margin-top: -2px; - padding-right: 16px; - } - } - .navbar-toggler { - position: absolute; - margin-top: -40px; - right: 0; - } - } - .intro-non-fixed-nav>links { - @media all and (min-width: 992px) { - .navbar-collapse { - display: inline-flex !important; - align-items: center !important; - justify-content: space-between !important; - } - } - } - .intro-fixed-nav { - @media all and (min-width: 992px) { - .navbar-nav.nav-flex-icons { - position: absolute; - top: 30%; - right: 0; - } - .navbar-nav { - position: absolute; - top: 30%; - margin-left: 88px; - } - .navbar-brand { - img { - margin-top: -2px; - padding-right: 16px; - } - } - } - .navbar-toggler { - position: absolute; - margin-top: -40px; - right: 0; - } - } -} - -// Fix for situation when in Chrome, dropdown button got default browser styling -button, -html [type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: none; -} diff --git a/src/angular-bootstrap-md/scss/angular/free/_popover.scss b/src/angular-bootstrap-md/scss/angular/free/_popover.scss deleted file mode 100755 index 11fa8ad8..00000000 --- a/src/angular-bootstrap-md/scss/angular/free/_popover.scss +++ /dev/null @@ -1,138 +0,0 @@ -//Bootstrap 4 alpha popover styles - works with ng-bootstrap by Valor popover plugin - -.popover.popover-top, .popover.bs-tether-element-attached-bottom { - margin-top: -10px; -} - -.popover.popover-top::before, .popover.popover-top::after, .popover.bs-tether-element-attached-bottom::before, .popover.bs-tether-element-attached-bottom::after { - left: 50%; - border-bottom-width: 0; -} - -.popover.popover-top::before, .popover.bs-tether-element-attached-bottom::before { - bottom: -11px; - margin-left: -11px; - border-top-color: rgba(0, 0, 0, 0.25); -} - -.popover.popover-top::after, .popover.bs-tether-element-attached-bottom::after { - bottom: -10px; - margin-left: -10px; - border-top-color: #fff; -} - -.popover.popover-right, .popover.bs-tether-element-attached-left { - margin-left: 10px; -} - -.popover.popover-right::before, .popover.popover-right::after, .popover.bs-tether-element-attached-left::before, .popover.bs-tether-element-attached-left::after { - top: 50%; - border-left-width: 0; -} - -.popover.popover-right::before, .popover.bs-tether-element-attached-left::before { - left: -11px; - margin-top: -11px; - border-right-color: rgba(0, 0, 0, 0.25); -} - -.popover.popover-right::after, .popover.bs-tether-element-attached-left::after { - left: -10px; - margin-top: -10px; - border-right-color: #fff; -} - -.popover.popover-bottom, .popover.bs-tether-element-attached-top { - margin-top: 10px; -} - -.popover.popover-bottom::before, .popover.popover-bottom::after, .popover.bs-tether-element-attached-top::before, .popover.bs-tether-element-attached-top::after { - left: 50%; - border-top-width: 0; -} - -.popover.popover-bottom::before, .popover.bs-tether-element-attached-top::before { - top: -11px; - margin-left: -11px; - border-bottom-color: rgba(0, 0, 0, 0.25); -} - -.popover.popover-bottom::after, .popover.bs-tether-element-attached-top::after { - top: -10px; - margin-left: -10px; - border-bottom-color: #f7f7f7; -} - -.popover.popover-bottom .popover-title::before, .popover.bs-tether-element-attached-top .popover-title::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: 20px; - margin-left: -10px; - content: ""; - border-bottom: 1px solid #f7f7f7; -} - -.popover.popover-left, .popover.bs-tether-element-attached-right { - margin-left: -10px; -} - -.popover.popover-left::before, .popover.popover-left::after, .popover.bs-tether-element-attached-right::before, .popover.bs-tether-element-attached-right::after { - top: 50%; - border-right-width: 0; -} - -.popover.popover-left::before, .popover.bs-tether-element-attached-right::before { - right: -11px; - margin-top: -11px; - border-left-color: rgba(0, 0, 0, 0.25); -} - -.popover.popover-left::after, .popover.bs-tether-element-attached-right::after { - right: -10px; - margin-top: -10px; - border-left-color: #fff; -} - -.popover::before, -.popover::after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover::before { - content: ""; - border-width: 11px; -} - -.popover::after { - content: ""; - border-width: 10px; -} - -// Popover animations - -@-webkit-keyframes fadeInPopover { - from { opacity: 0; } - to { opacity: 1; } -} -@keyframes fadeInPopover { - from { opacity: 0; } - to { opacity: 1; } -} - -.popover-fadeIn { - -webkit-animation-name: fadeInPopover; - animation-name: fadeInPopover; - -webkit-animation-delay: 0.2s; - -moz-animation-delay: 0.2s; animation-delay: 0.2s; - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} \ No newline at end of file diff --git a/src/angular-bootstrap-md/scss/angular/free/_sections.scss b/src/angular-bootstrap-md/scss/angular/free/_sections.scss deleted file mode 100755 index ebb9382f..00000000 --- a/src/angular-bootstrap-md/scss/angular/free/_sections.scss +++ /dev/null @@ -1,11 +0,0 @@ -@media (min-width: 1200px) { - .offset-xl-1 { - margin-left: 8.333333%; - } -} - -DoubleNavbar{ - header { - height: 0 !important; - } -} \ No newline at end of file diff --git a/src/angular-bootstrap-md/scss/angular/free/_tooltip.scss b/src/angular-bootstrap-md/scss/angular/free/_tooltip.scss deleted file mode 100755 index e82a14a1..00000000 --- a/src/angular-bootstrap-md/scss/angular/free/_tooltip.scss +++ /dev/null @@ -1,145 +0,0 @@ -@mixin reset-text { - font-family: $font-family-base; - // We deliberately do NOT reset font-size or word-wrap. - font-style: normal; - font-weight: $font-weight-normal; - letter-spacing: normal; - line-break: auto; - line-height: $line-height-base; - text-align: left; // Fallback for where `start` is not supported - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - white-space: normal; - word-break: normal; - word-spacing: normal; -} - -// Base class -.tooltip { - position: absolute; - z-index: $zindex-tooltip; - display: block; - // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element. - // So reset our font and text properties to avoid inheriting weird values. - @include reset-text(); - font-size: $font-size-sm; - // Allow breaking very long words so they don't overflow the tooltip's bounds - word-wrap: break-word; - opacity: 0; - - &.show { opacity: $tooltip-opacity; } - - &.tooltip-top, - &.bs-tether-element-attached-bottom { - padding: $tooltip-arrow-width 0; - margin-top: -$tooltip-margin; - - .tooltip-inner::before { - bottom: 0; - left: 50%; - margin-left: -$tooltip-arrow-width; - content: ""; - border-width: $tooltip-arrow-width $tooltip-arrow-width 0; - // border-top-color: $tooltip-arrow-color; - } - } - &.tooltip-right, - &.bs-tether-element-attached-left { - padding: 0 $tooltip-arrow-width; - margin-left: $tooltip-margin; - - .tooltip-inner::before { - top: 50%; - left: 0; - margin-top: -$tooltip-arrow-width; - content: ""; - border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0; - // border-right-color: $tooltip-arrow-color; - } - } - &.tooltip-bottom, - &.bs-tether-element-attached-top { - padding: $tooltip-arrow-width 0; - margin-top: $tooltip-margin; - - .tooltip-inner::before { - top: 0; - left: 50%; - margin-left: -$tooltip-arrow-width; - content: ""; - border-width: 0 $tooltip-arrow-width $tooltip-arrow-width; - // border-bottom-color: $tooltip-arrow-color; - } - } - &.tooltip-left, - &.bs-tether-element-attached-right { - padding: 0 $tooltip-arrow-width; - margin-left: -$tooltip-margin; - - .tooltip-inner::before { - top: 50%; - right: 0; - margin-top: -$tooltip-arrow-width; - content: ""; - border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width; - // border-left-color: $tooltip-arrow-color; - } - } -} - -// Wrapper for the tooltip content -.tooltip-inner { - max-width: $tooltip-max-width; - padding: $tooltip-padding-y $tooltip-padding-x; - // color: $tooltip-color; - text-align: center; - // background-color: $tooltip-bg; - padding: 0.2rem 0.4rem; - @extend .z-depth-1-half; - border-radius: ($border-radius); - - &::before { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - } -} - -// Tooltip animations -@-webkit-keyframes fadeInTooltip { - from { opacity: 0; } - to { opacity: 1; } -} -@keyframes fadeInTooltip { - from { opacity: 0; } - to { opacity: 1; } -} - -.tooltip-fadeIn { - -webkit-animation-name: fadeInTooltip; - animation-name: fadeInTooltip; - -webkit-animation-delay: 0.2s; - -moz-animation-delay: 0.2s; - animation-delay: 0.2s; - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} - -//sebfix for tooltips -.single-tooltip { - padding: .75rem 0 0 0; - a { - padding: 0 !important; - } -} - -a[tooltip] { - margin-left: 0 !important; - padding: 0 .5rem; -} \ No newline at end of file diff --git a/src/angular-bootstrap-md/scss/angular/free/_waves.scss b/src/angular-bootstrap-md/scss/angular/free/_waves.scss deleted file mode 100755 index 7a31cd61..00000000 --- a/src/angular-bootstrap-md/scss/angular/free/_waves.scss +++ /dev/null @@ -1,8 +0,0 @@ -mdb-tabset { - a { - &.waves-effect, - &.waves-light { - display: block; - } - } -} diff --git a/src/angular-bootstrap-md/scss/angular/mdb-angular-free.scss b/src/angular-bootstrap-md/scss/angular/mdb-angular-free.scss deleted file mode 100755 index 537a4bc6..00000000 --- a/src/angular-bootstrap-md/scss/angular/mdb-angular-free.scss +++ /dev/null @@ -1,13 +0,0 @@ -@import "./free/inputs"; -@import "./free/list-group"; -@import "./free/navbar"; -@import "./free/waves"; -@import "./free/dropdowns"; -@import "./free/tooltip"; -@import "./free/sections"; -@import "./free/popover"; -@import "./free/carousel"; -@import "./free/maps"; -@import "./free/layout"; -@import "./free/modals"; - diff --git a/src/angular-bootstrap-md/scss/bootstrap/.directory b/src/angular-bootstrap-md/scss/bootstrap/.directory deleted file mode 100644 index cfb190e7..00000000 --- a/src/angular-bootstrap-md/scss/bootstrap/.directory +++ /dev/null @@ -1,10 +0,0 @@ -[Dolphin] -PreviewsShown=true -SortOrder=1 -SortRole=modificationtime -Timestamp=2018,4,20,11,13,6 -Version=4 -VisibleRoles=Icons_text,Icons_modificationtime - -[Settings] -HiddenFilesShown=true diff --git a/src/angular-bootstrap-md/scss/bootstrap/_alert.scss b/src/angular-bootstrap-md/scss/bootstrap/_alert.scss deleted file mode 100644 index dd43e237..00000000 --- a/src/angular-bootstrap-md/scss/bootstrap/_alert.scss +++ /dev/null @@ -1,51 +0,0 @@ -// -// Base styles -// - -.alert { - position: relative; - padding: $alert-padding-y $alert-padding-x; - margin-bottom: $alert-margin-bottom; - border: $alert-border-width solid transparent; - @include border-radius($alert-border-radius); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: ($close-font-size + $alert-padding-x * 2); - - // Adjust close link position - .close { - position: absolute; - top: 0; - right: 0; - padding: $alert-padding-y $alert-padding-x; - color: inherit; - } -} - - -// Alternate styles -// -// Generate contextual modifier classes for colorizing the alert. - -@each $color, $value in $theme-colors { - .alert-#{$color} { - @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level)); - } -} diff --git a/src/angular-bootstrap-md/scss/bootstrap/_badge.scss b/src/angular-bootstrap-md/scss/bootstrap/_badge.scss deleted file mode 100644 index b87a1b00..00000000 --- a/src/angular-bootstrap-md/scss/bootstrap/_badge.scss +++ /dev/null @@ -1,47 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - display: inline-block; - padding: $badge-padding-y $badge-padding-x; - font-size: $badge-font-size; - font-weight: $badge-font-weight; - line-height: 1; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius($badge-border-radius); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} - -// Pill badges -// -// Make them extra rounded with a modifier to replace v3's badges. - -.badge-pill { - padding-right: $badge-pill-padding-x; - padding-left: $badge-pill-padding-x; - @include border-radius($badge-pill-border-radius); -} - -// Colors -// -// Contextual variations (linked badges get darker on :hover). - -@each $color, $value in $theme-colors { - .badge-#{$color} { - @include badge-variant($value); - } -} diff --git a/src/angular-bootstrap-md/scss/bootstrap/_breadcrumb.scss b/src/angular-bootstrap-md/scss/bootstrap/_breadcrumb.scss deleted file mode 100644 index be309506..00000000 --- a/src/angular-bootstrap-md/scss/bootstrap/_breadcrumb.scss +++ /dev/null @@ -1,41 +0,0 @@ -.breadcrumb { - display: flex; - flex-wrap: wrap; - padding: $breadcrumb-padding-y $breadcrumb-padding-x; - margin-bottom: $breadcrumb-margin-bottom; - list-style: none; - background-color: $breadcrumb-bg; - @include border-radius($breadcrumb-border-radius); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: $breadcrumb-item-padding; - - &::before { - display: inline-block; // Suppress underlining of the separator in modern browsers - padding-right: $breadcrumb-item-padding; - color: $breadcrumb-divider-color; - content: $breadcrumb-divider; - } - } - - // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built - // without `