ngwr 11.1.0 → 12.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/burger/styles/_index.scss +1 -1
- package/button/styles/_index.scss +2 -2
- package/calendar/styles/_index.scss +32 -12
- package/calendar-heatmap/styles/_index.scss +20 -0
- package/carousel/styles/_index.scss +23 -1
- package/cascader/styles/_index.scss +15 -3
- package/checkbox/styles/_index.scss +2 -2
- package/circular-text/styles/_index.scss +11 -0
- package/collapse/styles/_index.scss +2 -2
- package/color-picker/styles/_index.scss +3 -3
- package/command-palette/styles/_index.scss +12 -0
- package/compare/styles/_index.scss +18 -2
- package/context-menu/styles/_index.scss +21 -2
- package/date-picker/styles/_index.scss +5 -5
- package/descriptions/styles/_index.scss +1 -1
- package/drag-drop/styles/_index.scss +28 -1
- package/drawer/styles/_index.scss +37 -0
- package/dropdown/styles/_index.scss +2 -2
- package/event-calendar/styles/_index.scss +67 -10
- package/fesm2022/ngwr-action-sheet-testing.mjs +313 -0
- package/fesm2022/ngwr-action-sheet-testing.mjs.map +1 -0
- package/fesm2022/ngwr-action-sheet.mjs +3 -3
- package/fesm2022/ngwr-affix.mjs +3 -3
- package/fesm2022/ngwr-alert.mjs +3 -3
- package/fesm2022/ngwr-anchor.mjs +3 -3
- package/fesm2022/ngwr-aurora.mjs +3 -3
- package/fesm2022/ngwr-avatar.mjs +3 -3
- package/fesm2022/ngwr-back-top.mjs +3 -3
- package/fesm2022/ngwr-badge.mjs +6 -6
- package/fesm2022/ngwr-bar-chart-testing.mjs +107 -0
- package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-bar-chart.mjs +3 -3
- package/fesm2022/ngwr-blur-text-testing.mjs +203 -0
- package/fesm2022/ngwr-blur-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-blur-text.mjs +18 -4
- package/fesm2022/ngwr-blur-text.mjs.map +1 -1
- package/fesm2022/ngwr-border-glow-testing.mjs +325 -0
- package/fesm2022/ngwr-border-glow-testing.mjs.map +1 -0
- package/fesm2022/ngwr-border-glow.mjs +4 -4
- package/fesm2022/ngwr-border-glow.mjs.map +1 -1
- package/fesm2022/ngwr-breadcrumbs.mjs +29 -17
- package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
- package/fesm2022/ngwr-burger.mjs +3 -3
- package/fesm2022/ngwr-button.mjs +6 -6
- package/fesm2022/ngwr-calendar-heatmap-testing.mjs +95 -0
- package/fesm2022/ngwr-calendar-heatmap-testing.mjs.map +1 -0
- package/fesm2022/ngwr-calendar-heatmap.mjs +17 -5
- package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-testing.mjs +368 -0
- package/fesm2022/ngwr-calendar-testing.mjs.map +1 -0
- package/fesm2022/ngwr-calendar.mjs +228 -10
- package/fesm2022/ngwr-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-card.mjs +10 -10
- package/fesm2022/ngwr-card.mjs.map +1 -1
- package/fesm2022/ngwr-carousel.mjs +124 -24
- package/fesm2022/ngwr-carousel.mjs.map +1 -1
- package/fesm2022/ngwr-cascader.mjs +60 -5
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox.mjs +14 -6
- package/fesm2022/ngwr-checkbox.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text-testing.mjs +230 -0
- package/fesm2022/ngwr-circular-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-circular-text.mjs +4 -4
- package/fesm2022/ngwr-circular-text.mjs.map +1 -1
- package/fesm2022/ngwr-click-spark.mjs +27 -7
- package/fesm2022/ngwr-click-spark.mjs.map +1 -1
- package/fesm2022/ngwr-clipboard.mjs +3 -3
- package/fesm2022/ngwr-collapse.mjs +9 -9
- package/fesm2022/ngwr-color-picker-testing.mjs +452 -0
- package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -0
- package/fesm2022/ngwr-color-picker.mjs +126 -10
- package/fesm2022/ngwr-color-picker.mjs.map +1 -1
- package/fesm2022/ngwr-command-palette.mjs +14 -5
- package/fesm2022/ngwr-command-palette.mjs.map +1 -1
- package/fesm2022/ngwr-compare.mjs +3 -3
- package/fesm2022/ngwr-confetti.mjs +31 -6
- package/fesm2022/ngwr-confetti.mjs.map +1 -1
- package/fesm2022/ngwr-config.mjs +9 -0
- package/fesm2022/ngwr-config.mjs.map +1 -1
- package/fesm2022/ngwr-context-menu-testing.mjs +30 -11
- package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -1
- package/fesm2022/ngwr-context-menu.mjs +358 -48
- package/fesm2022/ngwr-context-menu.mjs.map +1 -1
- package/fesm2022/ngwr-cookie.mjs +3 -3
- package/fesm2022/ngwr-counter.mjs +25 -9
- package/fesm2022/ngwr-counter.mjs.map +1 -1
- package/fesm2022/{ngwr-date-adapter-fns.mjs → ngwr-date-adapters-fns.mjs} +37 -10
- package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -0
- package/fesm2022/{ngwr-date-adapter-luxon.mjs → ngwr-date-adapters-luxon.mjs} +5 -5
- package/fesm2022/ngwr-date-adapters-luxon.mjs.map +1 -0
- package/fesm2022/ngwr-date-picker-testing.mjs +21 -85
- package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
- package/fesm2022/ngwr-date-picker.mjs +119 -37
- package/fesm2022/ngwr-date-picker.mjs.map +1 -1
- package/fesm2022/{ngwr-date-adapter.mjs → ngwr-date.mjs} +36 -10
- package/fesm2022/ngwr-date.mjs.map +1 -0
- package/fesm2022/ngwr-decrypt-text-testing.mjs +261 -0
- package/fesm2022/ngwr-decrypt-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-decrypt-text.mjs +9 -4
- package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
- package/fesm2022/ngwr-density.mjs +6 -6
- package/fesm2022/ngwr-descriptions.mjs +6 -6
- package/fesm2022/ngwr-dialog.mjs +73 -18
- package/fesm2022/ngwr-dialog.mjs.map +1 -1
- package/fesm2022/ngwr-directives.mjs +12 -12
- package/fesm2022/ngwr-divider.mjs +52 -5
- package/fesm2022/ngwr-divider.mjs.map +1 -1
- package/fesm2022/ngwr-donut-chart-testing.mjs +97 -0
- package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-donut-chart.mjs +7 -7
- package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
- package/fesm2022/ngwr-drag-drop.mjs +160 -11
- package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
- package/fesm2022/ngwr-drawer.mjs +156 -64
- package/fesm2022/ngwr-drawer.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown.mjs +58 -12
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-empty.mjs +3 -3
- package/fesm2022/ngwr-event-calendar-testing.mjs +446 -0
- package/fesm2022/ngwr-event-calendar-testing.mjs.map +1 -0
- package/fesm2022/ngwr-event-calendar.mjs +66 -28
- package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-falling-text-testing.mjs +220 -0
- package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-falling-text.mjs +75 -46
- package/fesm2022/ngwr-falling-text.mjs.map +1 -1
- package/fesm2022/ngwr-file-upload.mjs +3 -3
- package/fesm2022/ngwr-form.mjs +32 -15
- package/fesm2022/ngwr-form.mjs.map +1 -1
- package/fesm2022/ngwr-fuzzy-text-testing.mjs +134 -0
- package/fesm2022/ngwr-fuzzy-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-fuzzy-text.mjs +21 -11
- package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
- package/fesm2022/ngwr-gauge-testing.mjs +86 -0
- package/fesm2022/ngwr-gauge-testing.mjs.map +1 -0
- package/fesm2022/ngwr-gauge.mjs +3 -3
- package/fesm2022/ngwr-glitch-text-testing.mjs +215 -0
- package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-glitch-text.mjs +7 -7
- package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
- package/fesm2022/ngwr-gradient-text-testing.mjs +258 -0
- package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-gradient-text.mjs +4 -4
- package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
- package/fesm2022/ngwr-hotkey.mjs +24 -9
- package/fesm2022/ngwr-hotkey.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-en.mjs +87 -1
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +69 -1
- package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
- package/fesm2022/ngwr-i18n.mjs +26 -15
- package/fesm2022/ngwr-i18n.mjs.map +1 -1
- package/fesm2022/ngwr-icon.mjs +6 -6
- package/fesm2022/ngwr-image-cropper-testing.mjs +200 -0
- package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -0
- package/fesm2022/ngwr-image-cropper.mjs +156 -11
- package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
- package/fesm2022/ngwr-input-number-testing.mjs +15 -10
- package/fesm2022/ngwr-input-number-testing.mjs.map +1 -1
- package/fesm2022/ngwr-input-number.mjs +89 -15
- package/fesm2022/ngwr-input-number.mjs.map +1 -1
- package/fesm2022/ngwr-input-otp-testing.mjs +12 -6
- package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -1
- package/fesm2022/ngwr-input-otp.mjs +24 -5
- package/fesm2022/ngwr-input-otp.mjs.map +1 -1
- package/fesm2022/ngwr-input.mjs +15 -15
- package/fesm2022/ngwr-keyboard.mjs +3 -3
- package/fesm2022/ngwr-knob-testing.mjs +220 -0
- package/fesm2022/ngwr-knob-testing.mjs.map +1 -0
- package/fesm2022/ngwr-knob.mjs +3 -3
- package/fesm2022/ngwr-layout.mjs +15 -15
- package/fesm2022/ngwr-lightbox-testing.mjs +223 -0
- package/fesm2022/ngwr-lightbox-testing.mjs.map +1 -0
- package/fesm2022/ngwr-lightbox.mjs +11 -4
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart-testing.mjs +119 -0
- package/fesm2022/ngwr-line-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-line-chart.mjs +73 -26
- package/fesm2022/ngwr-line-chart.mjs.map +1 -1
- package/fesm2022/ngwr-list.mjs +7 -7
- package/fesm2022/ngwr-list.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar.mjs +7 -7
- package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
- package/fesm2022/ngwr-markdown.mjs +66 -8
- package/fesm2022/ngwr-markdown.mjs.map +1 -1
- package/fesm2022/ngwr-marquee-testing.mjs +336 -0
- package/fesm2022/ngwr-marquee-testing.mjs.map +1 -0
- package/fesm2022/ngwr-marquee.mjs +4 -4
- package/fesm2022/ngwr-marquee.mjs.map +1 -1
- package/fesm2022/ngwr-media.mjs +3 -3
- package/fesm2022/ngwr-mention.mjs +108 -13
- package/fesm2022/ngwr-mention.mjs.map +1 -1
- package/fesm2022/ngwr-meta.mjs +6 -6
- package/fesm2022/ngwr-meter-group-testing.mjs +100 -0
- package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -0
- package/fesm2022/ngwr-meter-group.mjs +3 -3
- package/fesm2022/ngwr-overlay.mjs +34 -7
- package/fesm2022/ngwr-overlay.mjs.map +1 -1
- package/fesm2022/ngwr-page-header.mjs +3 -3
- package/fesm2022/ngwr-pagination-testing.mjs +6 -6
- package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
- package/fesm2022/ngwr-pagination.mjs +17 -13
- package/fesm2022/ngwr-pagination.mjs.map +1 -1
- package/fesm2022/ngwr-pipes.mjs +39 -26
- package/fesm2022/ngwr-pipes.mjs.map +1 -1
- package/fesm2022/ngwr-platform.mjs +9 -9
- package/fesm2022/ngwr-popconfirm.mjs +6 -6
- package/fesm2022/ngwr-popover-testing.mjs +7 -2
- package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
- package/fesm2022/ngwr-popover.mjs +169 -33
- package/fesm2022/ngwr-popover.mjs.map +1 -1
- package/fesm2022/ngwr-progress.mjs +3 -3
- package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
- package/fesm2022/ngwr-qr.mjs +42 -5
- package/fesm2022/ngwr-qr.mjs.map +1 -1
- package/fesm2022/ngwr-radio.mjs +6 -6
- package/fesm2022/ngwr-rating.mjs +3 -3
- package/fesm2022/ngwr-result.mjs +21 -30
- package/fesm2022/ngwr-result.mjs.map +1 -1
- package/fesm2022/ngwr-rotating-text-testing.mjs +220 -0
- package/fesm2022/ngwr-rotating-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-rotating-text.mjs +4 -4
- package/fesm2022/ngwr-rotating-text.mjs.map +1 -1
- package/fesm2022/ngwr-scroll.mjs +3 -3
- package/fesm2022/ngwr-segmented-testing.mjs +14 -1
- package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
- package/fesm2022/ngwr-segmented.mjs +29 -6
- package/fesm2022/ngwr-segmented.mjs.map +1 -1
- package/fesm2022/ngwr-select.mjs +227 -43
- package/fesm2022/ngwr-select.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text-testing.mjs +237 -0
- package/fesm2022/ngwr-shiny-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-shiny-text.mjs +11 -9
- package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
- package/fesm2022/ngwr-sidebar.mjs +31 -16
- package/fesm2022/ngwr-sidebar.mjs.map +1 -1
- package/fesm2022/ngwr-skeleton.mjs +3 -3
- package/fesm2022/ngwr-slider.mjs +143 -14
- package/fesm2022/ngwr-slider.mjs.map +1 -1
- package/fesm2022/ngwr-sparkline-testing.mjs +76 -0
- package/fesm2022/ngwr-sparkline-testing.mjs.map +1 -0
- package/fesm2022/ngwr-sparkline.mjs +3 -3
- package/fesm2022/ngwr-speed-dial-testing.mjs +281 -0
- package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -0
- package/fesm2022/ngwr-speed-dial.mjs +27 -12
- package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
- package/fesm2022/ngwr-spinner.mjs +3 -3
- package/fesm2022/ngwr-splash-cursor-testing.mjs +89 -0
- package/fesm2022/ngwr-splash-cursor-testing.mjs.map +1 -0
- package/fesm2022/ngwr-splash-cursor.mjs +3 -3
- package/fesm2022/ngwr-split-text-testing.mjs +224 -0
- package/fesm2022/ngwr-split-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-split-text.mjs +31 -5
- package/fesm2022/ngwr-split-text.mjs.map +1 -1
- package/fesm2022/ngwr-splitter-testing.mjs +245 -0
- package/fesm2022/ngwr-splitter-testing.mjs.map +1 -0
- package/fesm2022/ngwr-splitter.mjs +3 -3
- package/fesm2022/ngwr-spotlight-card-testing.mjs +368 -0
- package/fesm2022/ngwr-spotlight-card-testing.mjs.map +1 -0
- package/fesm2022/ngwr-spotlight-card.mjs +7 -7
- package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
- package/fesm2022/ngwr-squircle.mjs +6 -6
- package/fesm2022/ngwr-star-border-testing.mjs +172 -0
- package/fesm2022/ngwr-star-border-testing.mjs.map +1 -0
- package/fesm2022/ngwr-star-border.mjs +4 -4
- package/fesm2022/ngwr-star-border.mjs.map +1 -1
- package/fesm2022/ngwr-statistic.mjs +9 -9
- package/fesm2022/ngwr-stepper-testing.mjs +8 -8
- package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
- package/fesm2022/ngwr-stepper.mjs +33 -8
- package/fesm2022/ngwr-stepper.mjs.map +1 -1
- package/fesm2022/ngwr-storage.mjs +17 -5
- package/fesm2022/ngwr-storage.mjs.map +1 -1
- package/fesm2022/ngwr-switch.mjs +3 -3
- package/fesm2022/ngwr-table.mjs +110 -40
- package/fesm2022/ngwr-table.mjs.map +1 -1
- package/fesm2022/ngwr-tabs-testing.mjs +11 -10
- package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tabs.mjs +51 -11
- package/fesm2022/ngwr-tabs.mjs.map +1 -1
- package/fesm2022/ngwr-textarea.mjs +3 -3
- package/fesm2022/ngwr-theme.mjs +181 -4
- package/fesm2022/ngwr-theme.mjs.map +1 -1
- package/fesm2022/ngwr-tilt-card-testing.mjs +190 -0
- package/fesm2022/ngwr-tilt-card-testing.mjs.map +1 -0
- package/fesm2022/ngwr-tilt-card.mjs +26 -8
- package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
- package/fesm2022/ngwr-timeline.mjs +6 -6
- package/fesm2022/ngwr-toast.mjs +44 -15
- package/fesm2022/ngwr-toast.mjs.map +1 -1
- package/fesm2022/ngwr-toolbar.mjs +3 -3
- package/fesm2022/ngwr-tour-testing.mjs +173 -0
- package/fesm2022/ngwr-tour-testing.mjs.map +1 -0
- package/fesm2022/ngwr-tour.mjs +34 -10
- package/fesm2022/ngwr-tour.mjs.map +1 -1
- package/fesm2022/ngwr-transfer.mjs +3 -3
- package/fesm2022/ngwr-tree.mjs +36 -11
- package/fesm2022/ngwr-tree.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter-testing.mjs +242 -0
- package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -0
- package/fesm2022/ngwr-typewriter.mjs +13 -5
- package/fesm2022/ngwr-typewriter.mjs.map +1 -1
- package/fesm2022/ngwr-typography.mjs +3 -3
- package/fesm2022/ngwr-utils.mjs +5 -2
- package/fesm2022/ngwr-utils.mjs.map +1 -1
- package/fesm2022/ngwr-version.mjs +1 -1
- package/fesm2022/ngwr-version.mjs.map +1 -1
- package/fesm2022/ngwr-virtual-scroll.mjs +4 -4
- package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
- package/fesm2022/ngwr-waves-testing.mjs +128 -0
- package/fesm2022/ngwr-waves-testing.mjs.map +1 -0
- package/fesm2022/ngwr-waves.mjs +4 -4
- package/fesm2022/ngwr-waves.mjs.map +1 -1
- package/fesm2022/ngwr-window-testing.mjs +361 -0
- package/fesm2022/ngwr-window-testing.mjs.map +1 -0
- package/fesm2022/ngwr-window.mjs +175 -31
- package/fesm2022/ngwr-window.mjs.map +1 -1
- package/file-upload/styles/_index.scss +2 -2
- package/glitch-text/styles/_index.scss +27 -12
- package/i18n/en.json +71 -7
- package/i18n/ru.json +71 -7
- package/image-cropper/styles/_index.scss +19 -0
- package/input/styles/_index.scss +2 -2
- package/input-number/styles/_index.scss +2 -2
- package/input-otp/styles/_index.scss +9 -2
- package/knob/styles/_index.scss +1 -1
- package/lightbox/styles/_index.scss +16 -2
- package/line-chart/styles/_index.scss +28 -14
- package/list/styles/_index.scss +1 -1
- package/llms-full.txt +161 -19
- package/llms.txt +45 -10
- package/markdown/styles/_index.scss +3 -3
- package/mcp/api.js +6 -4
- package/mcp/catalog.js +40 -3
- package/mcp/providers.js +42 -0
- package/mcp/tools.js +22 -30
- package/meter-group/styles/_index.scss +1 -1
- package/overlay/styles/_index.scss +33 -1
- package/package.json +161 -12
- package/pagination/styles/_index.scss +23 -1
- package/popover/styles/_index.scss +16 -7
- package/progress/styles/_index.scss +1 -1
- package/radio/styles/_index.scss +2 -2
- package/rating/styles/_index.scss +1 -1
- package/schematics/collection.json +1 -1
- package/schematics/migrations/v12/index.js +65 -0
- package/schematics/migrations/v7/index.js +12 -1
- package/schematics/migrations/v8/index.js +10 -1
- package/schematics/migrations.json +5 -0
- package/schematics/ng-add/index.js +8 -3
- package/schematics/provider/index.js +80 -13
- package/schematics/use/index.js +9 -129
- package/schematics/use/rule.js +206 -0
- package/schematics/use/symbol-map.json +4 -4
- package/segmented/styles/_index.scss +14 -3
- package/select/styles/_index.scss +14 -2
- package/sidebar/styles/_index.scss +12 -10
- package/skills/ngwr/SKILL.md +117 -0
- package/skills/ngwr/references/catalog.md +212 -0
- package/skills/ngwr/references/setup.md +78 -0
- package/slider/styles/_index.scss +1 -1
- package/speed-dial/styles/_index.scss +1 -1
- package/stepper/styles/_index.scss +12 -3
- package/switch/styles/_index.scss +2 -2
- package/table/styles/_index.scss +61 -12
- package/tabs/styles/_index.scss +1 -1
- package/textarea/styles/_index.scss +1 -1
- package/theme/styles/_colors.scss +142 -56
- package/theme/styles/_dark.scss +46 -3
- package/theme/styles/_focus.scss +28 -5
- package/theme/styles/_mixins.scss +1 -1
- package/theme/styles/_variables.scss +67 -0
- package/transfer/styles/_index.scss +26 -3
- package/tree/styles/_index.scss +29 -6
- package/types/ngwr-action-sheet-testing.d.ts +260 -0
- package/types/ngwr-bar-chart-testing.d.ts +85 -0
- package/types/ngwr-blur-text-testing.d.ts +180 -0
- package/types/ngwr-blur-text.d.ts +20 -4
- package/types/ngwr-border-glow-testing.d.ts +219 -0
- package/types/ngwr-breadcrumbs.d.ts +17 -10
- package/types/ngwr-calendar-heatmap-testing.d.ts +79 -0
- package/types/ngwr-calendar-testing.d.ts +277 -0
- package/types/ngwr-calendar.d.ts +76 -0
- package/types/ngwr-carousel.d.ts +85 -6
- package/types/ngwr-cascader.d.ts +17 -0
- package/types/ngwr-checkbox.d.ts +13 -0
- package/types/ngwr-circular-text-testing.d.ts +196 -0
- package/types/ngwr-click-spark.d.ts +4 -0
- package/types/ngwr-color-picker-testing.d.ts +299 -0
- package/types/ngwr-color-picker.d.ts +34 -2
- package/types/ngwr-confetti.d.ts +8 -0
- package/types/ngwr-config.d.ts +10 -1
- package/types/ngwr-context-menu-testing.d.ts +24 -11
- package/types/ngwr-context-menu.d.ts +71 -1
- package/types/ngwr-counter.d.ts +1 -0
- package/types/{ngwr-date-adapter-fns.d.ts → ngwr-date-adapters-fns.d.ts} +33 -6
- package/types/{ngwr-date-adapter-luxon.d.ts → ngwr-date-adapters-luxon.d.ts} +1 -1
- package/types/ngwr-date-picker-testing.d.ts +17 -72
- package/types/ngwr-date-picker.d.ts +8 -4
- package/types/{ngwr-date-adapter.d.ts → ngwr-date.d.ts} +24 -5
- package/types/ngwr-decrypt-text-testing.d.ts +222 -0
- package/types/ngwr-dialog.d.ts +38 -1
- package/types/ngwr-divider.d.ts +25 -0
- package/types/ngwr-donut-chart-testing.d.ts +83 -0
- package/types/ngwr-donut-chart.d.ts +3 -3
- package/types/ngwr-drag-drop.d.ts +56 -2
- package/types/ngwr-drawer.d.ts +68 -5
- package/types/ngwr-dropdown.d.ts +9 -0
- package/types/ngwr-event-calendar-testing.d.ts +301 -0
- package/types/ngwr-event-calendar.d.ts +17 -8
- package/types/ngwr-falling-text-testing.d.ts +188 -0
- package/types/ngwr-falling-text.d.ts +1 -1
- package/types/ngwr-form.d.ts +12 -2
- package/types/ngwr-fuzzy-text-testing.d.ts +130 -0
- package/types/ngwr-gauge-testing.d.ts +71 -0
- package/types/ngwr-glitch-text-testing.d.ts +201 -0
- package/types/ngwr-gradient-text-testing.d.ts +186 -0
- package/types/ngwr-i18n.d.ts +13 -4
- package/types/ngwr-image-cropper-testing.d.ts +173 -0
- package/types/ngwr-image-cropper.d.ts +71 -5
- package/types/ngwr-input-number-testing.d.ts +15 -10
- package/types/ngwr-input-number.d.ts +44 -5
- package/types/ngwr-input-otp-testing.d.ts +12 -6
- package/types/ngwr-input-otp.d.ts +15 -1
- package/types/ngwr-knob-testing.d.ts +150 -0
- package/types/ngwr-lightbox-testing.d.ts +154 -0
- package/types/ngwr-lightbox.d.ts +6 -0
- package/types/ngwr-line-chart-testing.d.ts +93 -0
- package/types/ngwr-line-chart.d.ts +20 -3
- package/types/ngwr-markdown.d.ts +11 -0
- package/types/ngwr-marquee-testing.d.ts +280 -0
- package/types/ngwr-mention.d.ts +32 -0
- package/types/ngwr-meter-group-testing.d.ts +77 -0
- package/types/ngwr-overlay.d.ts +20 -1
- package/types/ngwr-pagination-testing.d.ts +4 -4
- package/types/ngwr-pipes.d.ts +1 -1
- package/types/ngwr-popover-testing.d.ts +7 -2
- package/types/ngwr-popover.d.ts +1 -0
- package/types/ngwr-result.d.ts +6 -0
- package/types/ngwr-rotating-text-testing.d.ts +191 -0
- package/types/ngwr-segmented-testing.d.ts +9 -0
- package/types/ngwr-segmented.d.ts +21 -1
- package/types/ngwr-select.d.ts +100 -6
- package/types/ngwr-shiny-text-testing.d.ts +165 -0
- package/types/ngwr-shiny-text.d.ts +4 -2
- package/types/ngwr-sidebar.d.ts +14 -5
- package/types/ngwr-slider.d.ts +84 -1
- package/types/ngwr-sparkline-testing.d.ts +69 -0
- package/types/ngwr-speed-dial-testing.d.ts +199 -0
- package/types/ngwr-speed-dial.d.ts +22 -3
- package/types/ngwr-splash-cursor-testing.d.ts +95 -0
- package/types/ngwr-split-text-testing.d.ts +209 -0
- package/types/ngwr-split-text.d.ts +21 -0
- package/types/ngwr-splitter-testing.d.ts +174 -0
- package/types/ngwr-spotlight-card-testing.d.ts +303 -0
- package/types/ngwr-star-border-testing.d.ts +135 -0
- package/types/ngwr-stepper-testing.d.ts +5 -5
- package/types/ngwr-stepper.d.ts +8 -0
- package/types/ngwr-storage.d.ts +1 -0
- package/types/ngwr-table.d.ts +114 -12
- package/types/ngwr-tabs-testing.d.ts +11 -10
- package/types/ngwr-tabs.d.ts +2 -0
- package/types/ngwr-theme.d.ts +82 -1
- package/types/ngwr-tilt-card-testing.d.ts +158 -0
- package/types/ngwr-tilt-card.d.ts +2 -0
- package/types/ngwr-toast.d.ts +14 -5
- package/types/ngwr-tour-testing.d.ts +143 -0
- package/types/ngwr-tour.d.ts +22 -4
- package/types/ngwr-tree.d.ts +12 -4
- package/types/ngwr-typewriter-testing.d.ts +211 -0
- package/types/ngwr-utils.d.ts +5 -2
- package/types/ngwr-version.d.ts +1 -1
- package/types/ngwr-waves-testing.d.ts +121 -0
- package/types/ngwr-window-testing.d.ts +263 -0
- package/types/ngwr-window.d.ts +66 -21
- package/typography/styles/_index.scss +1 -1
- package/window/styles/_index.scss +116 -42
- package/fesm2022/ngwr-date-adapter-fns.mjs.map +0 -1
- package/fesm2022/ngwr-date-adapter-luxon.mjs.map +0 -1
- package/fesm2022/ngwr-date-adapter.mjs.map +0 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
/**
|
|
10
|
+
* Anchored with `(?![-\w])` rather than `\b`.
|
|
11
|
+
*
|
|
12
|
+
* A word boundary matches between `r` and `-`, so a `\b`-anchored
|
|
13
|
+
* `ngwr/date-adapter` also matches the first half of `ngwr/date-adapter-fns`.
|
|
14
|
+
* Ordering alone would hide that here, but the anchor is what makes each
|
|
15
|
+
* pattern correct on its own — and it is the same trap the v9 migration
|
|
16
|
+
* documents for `<wr-checkbox` against `<wr-checkbox-group`.
|
|
17
|
+
*/
|
|
18
|
+
const TRANSFORMS = [
|
|
19
|
+
{ pattern: /ngwr\/date-adapter-fns(?![-\w])/g, replacement: 'ngwr/date/adapters/fns' },
|
|
20
|
+
{ pattern: /ngwr\/date-adapter-luxon(?![-\w])/g, replacement: 'ngwr/date/adapters/luxon' },
|
|
21
|
+
{ pattern: /ngwr\/date-adapter(?![-\w])/g, replacement: 'ngwr/date' },
|
|
22
|
+
];
|
|
23
|
+
const IGNORE_DIRS = new Set(['node_modules', 'dist', '.git', '.cache', '.angular', 'coverage', '.next', '.nuxt']);
|
|
24
|
+
function ngUpdateV12() {
|
|
25
|
+
return (tree, context) => {
|
|
26
|
+
let touched = 0;
|
|
27
|
+
visit(tree, '/', filePath => {
|
|
28
|
+
const lower = filePath.toLowerCase();
|
|
29
|
+
// `.ts` for imports, `.html` for a rare inline `@import`-style reference,
|
|
30
|
+
// `.json` because an import map or a jest moduleNameMapper can name them.
|
|
31
|
+
if (!lower.endsWith('.ts') && !lower.endsWith('.html') && !lower.endsWith('.json'))
|
|
32
|
+
return;
|
|
33
|
+
const original = tree.readText(filePath);
|
|
34
|
+
const next = apply(original, TRANSFORMS);
|
|
35
|
+
if (next !== original) {
|
|
36
|
+
tree.overwrite(filePath, next);
|
|
37
|
+
touched += 1;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
context.logger.info(`ngwr v12 migration: rewrote ${touched} file(s) (ngwr/date-adapter* → ngwr/date/adapters/*).\n` +
|
|
41
|
+
'Every symbol keeps its name — only the import path moved, so the catalog nests ' +
|
|
42
|
+
'implementations under their feature the way ngwr/icon/adapters/* already did.');
|
|
43
|
+
context.logger.info('Verify the result with `git diff`.');
|
|
44
|
+
return tree;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function apply(content, transforms) {
|
|
48
|
+
let next = content;
|
|
49
|
+
for (const { pattern, replacement } of transforms) {
|
|
50
|
+
next = next.replace(pattern, replacement);
|
|
51
|
+
}
|
|
52
|
+
return next;
|
|
53
|
+
}
|
|
54
|
+
function visit(tree, dir, visitor) {
|
|
55
|
+
const entry = tree.getDir(dir);
|
|
56
|
+
for (const file of entry.subfiles) {
|
|
57
|
+
visitor(`${dir === '/' ? '' : dir}/${file}`);
|
|
58
|
+
}
|
|
59
|
+
for (const sub of entry.subdirs) {
|
|
60
|
+
if (IGNORE_DIRS.has(sub))
|
|
61
|
+
continue;
|
|
62
|
+
visit(tree, `${dir === '/' ? '' : dir}/${sub}`, visitor);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.default = ngUpdateV12;
|
|
@@ -116,7 +116,18 @@ function ngUpdateV7() {
|
|
|
116
116
|
return;
|
|
117
117
|
const original = tree.readText(filePath);
|
|
118
118
|
let next = original;
|
|
119
|
-
|
|
119
|
+
// Inline templates live in .ts files too, so run the element-scoped
|
|
120
|
+
// transforms there as well — the gate v9 already uses. Skipping them was
|
|
121
|
+
// worse than leaving a file unmigrated: `applyTs` renames the import and
|
|
122
|
+
// the symbol in that same file, so a component with
|
|
123
|
+
// `template: '<wr-autocomplete …>'` came out importing WrSelect with a tag
|
|
124
|
+
// that now matches no directive, and the build failed NG8001 after the
|
|
125
|
+
// migration reported success. Every pattern in HTML_TRANSFORMS is anchored
|
|
126
|
+
// on `<wr-…`, `[wrTooltip]` or `wrTooltip=`, so the only TypeScript they
|
|
127
|
+
// can reach is a line that already reads like markup — an unspaced
|
|
128
|
+
// `this.wrTooltip="x"` assignment being the one shape that qualifies and
|
|
129
|
+
// is not, which is what the `git diff` advice below is for.
|
|
130
|
+
if (isHtml || isTs)
|
|
120
131
|
next = applyHtml(next);
|
|
121
132
|
if (isTs)
|
|
122
133
|
next = applyTs(next);
|
|
@@ -71,7 +71,16 @@ function ngUpdateV8() {
|
|
|
71
71
|
return;
|
|
72
72
|
const original = tree.readText(filePath);
|
|
73
73
|
let next = original;
|
|
74
|
-
|
|
74
|
+
// Inline templates live in .ts files too, so the attribute rewrites run
|
|
75
|
+
// there as well. `wrDensity="compact"` left in one is not a cosmetic miss:
|
|
76
|
+
// `WrDensityDirective.wrDensity` is `input.required<WrDensityValue>()` and
|
|
77
|
+
// `'compact'` is not in that union, so the app stops compiling under
|
|
78
|
+
// strictTemplates after the upgrade. Every pattern is anchored on
|
|
79
|
+
// `wrDensity=`, `data-wr-density=` or `<wr-pagination`, so the only
|
|
80
|
+
// TypeScript they can reach is a line that already reads like markup — an
|
|
81
|
+
// unspaced `this.wrDensity="compact"` assignment being the one shape that
|
|
82
|
+
// qualifies and is not, which is what the `git diff` advice below is for.
|
|
83
|
+
if (isHtml || isTs)
|
|
75
84
|
next = apply(next, HTML_TRANSFORMS);
|
|
76
85
|
if (isTs)
|
|
77
86
|
next = apply(next, TS_TRANSFORMS);
|
|
@@ -15,6 +15,11 @@
|
|
|
15
15
|
"version": "9.0.0",
|
|
16
16
|
"description": "Rename the <wr-checkbox> group-membership input value \u2192 checkboxValue (also [value] / [(value)]). The standalone checkbox is now a signal-forms FormCheckboxControl whose contract reserves `value` for the form value \u2014 its boolean state is the `checked` model. Touches .html and .ts files.",
|
|
17
17
|
"factory": "./migrations/v9/index#default"
|
|
18
|
+
},
|
|
19
|
+
"migration-v12": {
|
|
20
|
+
"version": "12.0.0",
|
|
21
|
+
"description": "Move the date entry points under one namespace: ngwr/date-adapter \u2192 ngwr/date, ngwr/date-adapter-fns \u2192 ngwr/date/adapters/fns, ngwr/date-adapter-luxon \u2192 ngwr/date/adapters/luxon. Import paths only \u2014 every exported symbol keeps its name. Touches .ts, .html and .json files.",
|
|
22
|
+
"factory": "./migrations/v12/index#default"
|
|
18
23
|
}
|
|
19
24
|
}
|
|
20
25
|
}
|
|
@@ -16,6 +16,11 @@ const workspace_1 = require("@schematics/angular/utility/workspace");
|
|
|
16
16
|
* `lucide` is here because the bootstrap snippet this schematic prints registers
|
|
17
17
|
* icons through the lucide adapter — leaving it out made the very first snippet
|
|
18
18
|
* a consumer pastes fail to resolve.
|
|
19
|
+
*
|
|
20
|
+
* `@angular/forms` is a REQUIRED peer in `projects/lib/package.json` and is
|
|
21
|
+
* deliberately NOT here: every `ng new` app already depends on it, so installing
|
|
22
|
+
* it would be a no-op write to the consumer's manifest. The manifest declares it
|
|
23
|
+
* because a consumer can remove it; this list is about what `ng add` has to add.
|
|
19
24
|
*/
|
|
20
25
|
const BASE_PEERS = [
|
|
21
26
|
['@angular/cdk', '>=22.0.0'],
|
|
@@ -145,12 +150,12 @@ function printNextSteps(options, context) {
|
|
|
145
150
|
const providers = ['provideWrOverlay()', 'provideWrIcons(lucideIcons({ plus: Plus, trash: Trash2 }))'];
|
|
146
151
|
const adapterCall = DATE_ADAPTER_PROVIDER[adapter];
|
|
147
152
|
if (adapterCall) {
|
|
148
|
-
imports.push("import { provideWrDateAdapter } from 'ngwr/date
|
|
153
|
+
imports.push("import { provideWrDateAdapter } from 'ngwr/date';");
|
|
149
154
|
if (adapter === 'date-fns') {
|
|
150
|
-
imports.push("import { WrDateFnsAdapter } from 'ngwr/date
|
|
155
|
+
imports.push("import { WrDateFnsAdapter } from 'ngwr/date/adapters/fns';");
|
|
151
156
|
}
|
|
152
157
|
else if (adapter === 'luxon') {
|
|
153
|
-
imports.push("import { WrLuxonAdapter } from 'ngwr/date
|
|
158
|
+
imports.push("import { WrLuxonAdapter } from 'ngwr/date/adapters/luxon';");
|
|
154
159
|
}
|
|
155
160
|
providers.push(adapterCall);
|
|
156
161
|
}
|
|
@@ -34,7 +34,7 @@ const PROVIDERS = {
|
|
|
34
34
|
},
|
|
35
35
|
i18n: { subpath: 'ngwr/i18n', factory: 'provideWrI18n', call: 'provideWrI18n()' },
|
|
36
36
|
'date-adapter': {
|
|
37
|
-
subpath: 'ngwr/date
|
|
37
|
+
subpath: 'ngwr/date',
|
|
38
38
|
factory: 'provideWrDateAdapter',
|
|
39
39
|
call: 'provideWrDateAdapter()',
|
|
40
40
|
},
|
|
@@ -47,13 +47,26 @@ function provider(options) {
|
|
|
47
47
|
const spec = PROVIDERS[options.name];
|
|
48
48
|
if (!spec)
|
|
49
49
|
throw new schematics_1.SchematicsException(`ngwr:provider: unknown provider "${options.name}".`);
|
|
50
|
-
const filePath = await
|
|
50
|
+
const filePath = await resolveTargetFile(tree, options);
|
|
51
51
|
if (!filePath) {
|
|
52
52
|
context.logger.info(printSnippet(spec));
|
|
53
53
|
return tree;
|
|
54
54
|
}
|
|
55
55
|
const original = tree.readText(filePath);
|
|
56
|
-
|
|
56
|
+
// Splice FIRST, and bail before touching the file if there is nowhere to
|
|
57
|
+
// splice into. The imports used to go in ahead of this, so by the time the
|
|
58
|
+
// splice found no array the buffer already differed from the original and
|
|
59
|
+
// the `next === original` guard below could not catch it: the file was
|
|
60
|
+
// overwritten with an unused import and reported as `✓ Added <call>`. On a
|
|
61
|
+
// stock app that made `ng g ngwr:provider overlay` print success and leave
|
|
62
|
+
// it with no overlay container.
|
|
63
|
+
const spliced = ensureProviderCall(original, spec.call);
|
|
64
|
+
if (spliced === null) {
|
|
65
|
+
context.logger.info(`ngwr:provider: no providers array in ${filePath}.`);
|
|
66
|
+
context.logger.info(printSnippet(spec));
|
|
67
|
+
return tree;
|
|
68
|
+
}
|
|
69
|
+
let next = spliced;
|
|
57
70
|
next = ensureImport(next, spec.factory, spec.subpath);
|
|
58
71
|
// Drive the extra imports off `extras` rather than special-casing a provider
|
|
59
72
|
// name here: the two used to drift apart, and the hard-coded branch was
|
|
@@ -61,7 +74,6 @@ function provider(options) {
|
|
|
61
74
|
for (const [symbols, subpath] of spec.extras ?? []) {
|
|
62
75
|
next = ensureImport(next, symbols, subpath);
|
|
63
76
|
}
|
|
64
|
-
next = ensureProviderCall(next, spec.call);
|
|
65
77
|
if (next === original) {
|
|
66
78
|
context.logger.info(`ngwr:provider: ${filePath} already has ${spec.factory} — no changes.`);
|
|
67
79
|
return tree;
|
|
@@ -71,17 +83,70 @@ function provider(options) {
|
|
|
71
83
|
return tree;
|
|
72
84
|
};
|
|
73
85
|
}
|
|
74
|
-
|
|
86
|
+
/** The providers array of a `bootstrapApplication` call or an `ApplicationConfig`. */
|
|
87
|
+
const PROVIDERS_ARRAY = /(\bproviders\s*:\s*\[)([\s\S]*?)(\])/m;
|
|
88
|
+
/**
|
|
89
|
+
* The file that actually holds `providers: [ … ]`.
|
|
90
|
+
*
|
|
91
|
+
* Resolving the build target's entry file and stopping there is only right for
|
|
92
|
+
* the pre-v17 shape, where `bootstrapApplication` and its providers sit in
|
|
93
|
+
* `main.ts` together. `ng new` has since split them: `main.ts` is two lines
|
|
94
|
+
* ending in `bootstrapApplication(App, appConfig)` and the array lives in
|
|
95
|
+
* `app/app.config.ts` — the layout `projects/showcase/main.ts` uses as well. So
|
|
96
|
+
* follow the entry file's own RELATIVE imports one level and prefer whichever of
|
|
97
|
+
* them owns the array; one level is what `ng new` generates, and a path alias
|
|
98
|
+
* (`#root`, `@app/…`) is deliberately not followed, since resolving one needs
|
|
99
|
+
* the tsconfig. When nothing found this way has an array, the entry file is
|
|
100
|
+
* handed back and the caller prints a snippet rather than editing it.
|
|
101
|
+
*/
|
|
102
|
+
async function resolveTargetFile(tree, options) {
|
|
103
|
+
const entry = await resolveEntryFile(tree, options);
|
|
104
|
+
if (!entry)
|
|
105
|
+
return null;
|
|
106
|
+
if (PROVIDERS_ARRAY.test(tree.readText(entry)))
|
|
107
|
+
return entry;
|
|
108
|
+
return followConfigImport(tree, entry) ?? entry;
|
|
109
|
+
}
|
|
110
|
+
/** The first module `entry` imports relatively that declares a providers array. */
|
|
111
|
+
function followConfigImport(tree, entry) {
|
|
112
|
+
const dir = entry.slice(0, entry.lastIndexOf('/') + 1);
|
|
113
|
+
for (const [, specifier] of tree.readText(entry).matchAll(/from\s*['"](\.[^'"]*)['"]/g)) {
|
|
114
|
+
// TypeScript module specifiers carry no extension; `.ts` is the only one
|
|
115
|
+
// `ng new` produces for this file, and a wrong guess just misses.
|
|
116
|
+
const candidate = normalisePath(`${dir}${specifier}.ts`);
|
|
117
|
+
if (tree.exists(candidate) && PROVIDERS_ARRAY.test(tree.readText(candidate)))
|
|
118
|
+
return candidate;
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
/** Collapse `.` / `..` in a joined workspace path — `Tree` resolves neither. */
|
|
123
|
+
function normalisePath(path) {
|
|
124
|
+
const out = [];
|
|
125
|
+
for (const part of path.split('/')) {
|
|
126
|
+
if (part === '' || part === '.')
|
|
127
|
+
continue;
|
|
128
|
+
if (part === '..')
|
|
129
|
+
out.pop();
|
|
130
|
+
else
|
|
131
|
+
out.push(part);
|
|
132
|
+
}
|
|
133
|
+
return `${path.startsWith('/') ? '/' : ''}${out.join('/')}`;
|
|
134
|
+
}
|
|
135
|
+
async function resolveEntryFile(tree, options) {
|
|
75
136
|
if (options.path && tree.exists(options.path))
|
|
76
137
|
return options.path;
|
|
77
138
|
const workspace = await (0, workspace_1.getWorkspace)(tree);
|
|
78
|
-
|
|
139
|
+
// Both bags are `Record<string, JsonValue>`. Named through a shape rather than
|
|
140
|
+
// read with `foo['bar']`, because this file compiles under two configs: its own
|
|
141
|
+
// CommonJS tsconfig, and — since the spec beside it imports it — the root one,
|
|
142
|
+
// which sets `noPropertyAccessFromIndexSignature`.
|
|
143
|
+
const extensions = workspace.extensions;
|
|
144
|
+
const projectName = options.project ?? extensions.defaultProject;
|
|
79
145
|
const project = (projectName && workspace.projects.get(projectName)) ?? workspace.projects.values().next().value;
|
|
80
146
|
if (!project)
|
|
81
147
|
return null;
|
|
82
|
-
const
|
|
83
|
-
const
|
|
84
|
-
const candidate = main ?? browser ?? `${project.sourceRoot ?? 'src'}/main.ts`;
|
|
148
|
+
const build = project.targets.get('build')?.options;
|
|
149
|
+
const candidate = build?.main ?? build?.browser ?? `${project.sourceRoot ?? 'src'}/main.ts`;
|
|
85
150
|
return tree.exists(candidate) ? candidate : null;
|
|
86
151
|
}
|
|
87
152
|
function ensureImport(source, symbol, subpath) {
|
|
@@ -105,12 +170,14 @@ function ensureImport(source, symbol, subpath) {
|
|
|
105
170
|
}
|
|
106
171
|
return `${newLine}${source}`;
|
|
107
172
|
}
|
|
173
|
+
/** The source with `call` spliced in, or `null` when there is no array to splice into. */
|
|
108
174
|
function ensureProviderCall(source, call) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
175
|
+
const match = PROVIDERS_ARRAY.exec(source);
|
|
176
|
+
// `null`, not the untouched source: "nothing to do" and "already done" are
|
|
177
|
+
// different answers, and returning the same value for both is what let the
|
|
178
|
+
// caller report a successful edit it had not made.
|
|
112
179
|
if (!match)
|
|
113
|
-
return
|
|
180
|
+
return null;
|
|
114
181
|
// Already present?
|
|
115
182
|
const callBase = call.split('(')[0];
|
|
116
183
|
if (new RegExp(`\\b${escapeRegExp(callBase)}\\s*\\(`).test(match[2]))
|
package/schematics/use/index.js
CHANGED
|
@@ -6,142 +6,22 @@
|
|
|
6
6
|
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
const
|
|
9
|
+
const rule_1 = require("./rule");
|
|
10
10
|
// Bundled at build time by `scripts/build-symbol-map.ts`. Map of every
|
|
11
11
|
// `Wr*` public symbol → the subpath it lives under.
|
|
12
12
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
13
13
|
const SYMBOL_MAP = require('./symbol-map.json');
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* array. Saves the subpath-lookup dance for newcomers — `ng g ngwr:use
|
|
18
|
-
* WrButton --path src/app/my-page.ts`.
|
|
15
|
+
* `ng g ngwr:use WrButton --path src/app/my-page.ts` — the rule itself is in
|
|
16
|
+
* `./rule`, which takes the map as an argument.
|
|
19
17
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* dep. Covers the common standalone-component shape; an unusual file
|
|
26
|
-
* shape gets a clear warning + a copy-pasteable snippet.
|
|
18
|
+
* The split is what makes the rule testable: `symbol-map.json` is generated
|
|
19
|
+
* into `dist/lib/schematics/use/` and does not exist in the source tree, so
|
|
20
|
+
* anything reading this file from source — the unit-test builder included —
|
|
21
|
+
* fails to resolve the `require` above. Keeping it alone in this file leaves
|
|
22
|
+
* one un-runnable line instead of the whole schematic.
|
|
27
23
|
*/
|
|
28
24
|
function use(options) {
|
|
29
|
-
return (
|
|
30
|
-
const symbol = options.symbol.trim();
|
|
31
|
-
if (!symbol)
|
|
32
|
-
throw new schematics_1.SchematicsException('ngwr:use: missing required `symbol`.');
|
|
33
|
-
const subpath = SYMBOL_MAP[symbol];
|
|
34
|
-
if (!subpath) {
|
|
35
|
-
throw new schematics_1.SchematicsException(`ngwr:use: unknown symbol "${symbol}". Check the catalog at https://ngwr.dev or use the literal import: \`import { ${symbol} } from 'ngwr/<subpath>';\``);
|
|
36
|
-
}
|
|
37
|
-
const filePath = resolveTargetFile(tree, options.path);
|
|
38
|
-
if (!filePath) {
|
|
39
|
-
// No file passed: just print the import snippet and stop.
|
|
40
|
-
context.logger.info(printManualSnippet(symbol, subpath));
|
|
41
|
-
return tree;
|
|
42
|
-
}
|
|
43
|
-
if (!tree.exists(filePath)) {
|
|
44
|
-
throw new schematics_1.SchematicsException(`ngwr:use: file ${filePath} not found.`);
|
|
45
|
-
}
|
|
46
|
-
const original = tree.readText(filePath);
|
|
47
|
-
let next = original;
|
|
48
|
-
next = addImport(next, symbol, subpath);
|
|
49
|
-
next = addToImportsArray(next, symbol);
|
|
50
|
-
if (next === original) {
|
|
51
|
-
context.logger.info(`ngwr:use: ${filePath} already has ${symbol} — no changes.`);
|
|
52
|
-
return tree;
|
|
53
|
-
}
|
|
54
|
-
tree.overwrite(filePath, next);
|
|
55
|
-
context.logger.info(`✓ Added ${symbol} (from ${subpath}) to ${filePath}.`);
|
|
56
|
-
return tree;
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
function resolveTargetFile(tree, candidate) {
|
|
60
|
-
if (!candidate)
|
|
61
|
-
return null;
|
|
62
|
-
const path = candidate.startsWith('/') ? candidate : `/${candidate}`;
|
|
63
|
-
if (tree.exists(path))
|
|
64
|
-
return path;
|
|
65
|
-
if (tree.exists(candidate))
|
|
66
|
-
return candidate;
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Insert `import { Symbol } from 'subpath';` near the existing imports,
|
|
71
|
-
* or merge into an existing line that already references the same path.
|
|
72
|
-
* Idempotent — returns the source untouched if the symbol is already in.
|
|
73
|
-
*/
|
|
74
|
-
function addImport(source, symbol, subpath) {
|
|
75
|
-
// Already imported from somewhere?
|
|
76
|
-
const importedAnywhere = new RegExp(`\\bimport\\s*\\{[^}]*\\b${symbol}\\b[^}]*\\}\\s*from`).test(source);
|
|
77
|
-
if (importedAnywhere)
|
|
78
|
-
return source;
|
|
79
|
-
// Existing import from the same subpath? — splice the symbol in.
|
|
80
|
-
const sameSubpathRe = new RegExp(`(import\\s*\\{)([^}]*)(\\}\\s*from\\s*['"]${escapeRegExp(subpath)}['"])`, 'm');
|
|
81
|
-
const sameSubpathMatch = sameSubpathRe.exec(source);
|
|
82
|
-
if (sameSubpathMatch) {
|
|
83
|
-
const head = sameSubpathMatch[1];
|
|
84
|
-
const body = sameSubpathMatch[2].trim().replace(/,\s*$/, '');
|
|
85
|
-
const tail = sameSubpathMatch[3];
|
|
86
|
-
const merged = body ? `${head} ${body}, ${symbol} ${tail}` : `${head} ${symbol} ${tail}`;
|
|
87
|
-
return source.replace(sameSubpathMatch[0], merged);
|
|
88
|
-
}
|
|
89
|
-
// No related import — prepend a new line after the last top-of-file
|
|
90
|
-
// import we can find.
|
|
91
|
-
const importBlockRe = /(^|\n)(import\s[^;]+;\s*\n)+/m;
|
|
92
|
-
const block = importBlockRe.exec(source);
|
|
93
|
-
const newLine = `import { ${symbol} } from '${subpath}';\n`;
|
|
94
|
-
if (block) {
|
|
95
|
-
// Splice in immediately after the last import in the block.
|
|
96
|
-
const end = (block.index ?? 0) + block[0].length;
|
|
97
|
-
return `${source.slice(0, end)}${newLine}${source.slice(end)}`;
|
|
98
|
-
}
|
|
99
|
-
// No existing imports — just prepend.
|
|
100
|
-
return `${newLine}${source}`;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Find `imports: [...]` inside a `@Component({...})` decorator (single or
|
|
104
|
-
* multi-line) and splice the symbol in. Skips if the symbol is already
|
|
105
|
-
* listed.
|
|
106
|
-
*/
|
|
107
|
-
function addToImportsArray(source, symbol) {
|
|
108
|
-
// Match `imports: [ ... ]` allowing multi-line + trailing commas.
|
|
109
|
-
const arrayRe = /(\bimports\s*:\s*\[)([\s\S]*?)(\])/m;
|
|
110
|
-
const match = arrayRe.exec(source);
|
|
111
|
-
if (!match) {
|
|
112
|
-
// No imports array — try to insert one after the `@Component({`
|
|
113
|
-
// opening brace. Heuristic, not foolproof.
|
|
114
|
-
const componentRe = /@Component\s*\(\s*\{/;
|
|
115
|
-
const compMatch = componentRe.exec(source);
|
|
116
|
-
if (compMatch?.index === undefined) {
|
|
117
|
-
// No @Component decorator at all — leave the file alone, the user
|
|
118
|
-
// probably wants the import only.
|
|
119
|
-
return source;
|
|
120
|
-
}
|
|
121
|
-
const insertAt = compMatch.index + compMatch[0].length;
|
|
122
|
-
return `${source.slice(0, insertAt)}\n imports: [${symbol}],${source.slice(insertAt)}`;
|
|
123
|
-
}
|
|
124
|
-
const body = match[2];
|
|
125
|
-
if (new RegExp(`\\b${escapeRegExp(symbol)}\\b`).test(body))
|
|
126
|
-
return source;
|
|
127
|
-
const trimmed = body.replace(/\s+$/, '');
|
|
128
|
-
const sep = trimmed.length && !trimmed.endsWith(',') ? ', ' : trimmed.length ? ' ' : '';
|
|
129
|
-
const replaced = `${match[1]}${trimmed}${sep}${symbol}${match[3]}`;
|
|
130
|
-
return source.replace(match[0], replaced);
|
|
131
|
-
}
|
|
132
|
-
function escapeRegExp(value) {
|
|
133
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
134
|
-
}
|
|
135
|
-
function printManualSnippet(symbol, subpath) {
|
|
136
|
-
return `
|
|
137
|
-
ngwr:use — copy this into your component:
|
|
138
|
-
|
|
139
|
-
import { ${symbol} } from '${subpath}';
|
|
140
|
-
|
|
141
|
-
@Component({
|
|
142
|
-
imports: [/* …, */ ${symbol}],
|
|
143
|
-
/* … */
|
|
144
|
-
})
|
|
145
|
-
`;
|
|
25
|
+
return (0, rule_1.useRule)(options, SYMBOL_MAP);
|
|
146
26
|
}
|
|
147
27
|
exports.default = use;
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.NON_DECLARABLE = void 0;
|
|
10
|
+
exports.useRule = useRule;
|
|
11
|
+
const schematics_1 = require("@angular-devkit/schematics");
|
|
12
|
+
/**
|
|
13
|
+
* The public symbols that are NOT an Angular declarable, and what each one is.
|
|
14
|
+
*
|
|
15
|
+
* `@Component({ imports })` takes components, directives, pipes and NgModules;
|
|
16
|
+
* anything else is rejected outright — "Component imports must be standalone
|
|
17
|
+
* components, directives, pipes, or must be NgModules." The symbol map this
|
|
18
|
+
* schematic resolves a name through carries subpaths only, because the import
|
|
19
|
+
* LINE is the same whatever the symbol is; the `imports` array it also edits is
|
|
20
|
+
* not. So `ng g ngwr:use WrDialog` used to report `✓ Added WrDialog (from
|
|
21
|
+
* ngwr/dialog)` and leave behind a component that no longer builds.
|
|
22
|
+
*
|
|
23
|
+
* Each noun is read off the declaration in the library source — `@Service` /
|
|
24
|
+
* `@Injectable` is a service, the rest are what they are written as. This table
|
|
25
|
+
* has to ship (a consumer's machine has no library source to read), and
|
|
26
|
+
* `rule.spec.ts` derives the same one from every `public-api.ts` in the lib and
|
|
27
|
+
* fails when the two disagree — which is what keeps a newly added service from
|
|
28
|
+
* quietly becoming spliceable again.
|
|
29
|
+
*/
|
|
30
|
+
const NON_DECLARABLE = {
|
|
31
|
+
WrClipboard: 'a service',
|
|
32
|
+
WrConfetti: 'a service',
|
|
33
|
+
WrCookie: 'a service',
|
|
34
|
+
WrDateAdapter: 'an abstract class',
|
|
35
|
+
WrDateFnsAdapter: 'a service',
|
|
36
|
+
WrDensity: 'a service',
|
|
37
|
+
WrDialog: 'a service',
|
|
38
|
+
WrDialogRef: 'a class',
|
|
39
|
+
WrDrawerManager: 'a service',
|
|
40
|
+
WrDrawerRef: 'a class',
|
|
41
|
+
WrHaptics: 'a service',
|
|
42
|
+
WrHotkey: 'a service',
|
|
43
|
+
WrI18n: 'a service',
|
|
44
|
+
WrI18nHttpLoader: 'a class',
|
|
45
|
+
WrI18nStaticLoader: 'a class',
|
|
46
|
+
WrLoadingBar: 'a service',
|
|
47
|
+
WrLuxonAdapter: 'a service',
|
|
48
|
+
WrMarkdownHighlight: 'a service',
|
|
49
|
+
WrMedia: 'a service',
|
|
50
|
+
WrMeta: 'a service',
|
|
51
|
+
WrNativeDateAdapter: 'a service',
|
|
52
|
+
WrOutsideClick: 'a service',
|
|
53
|
+
WrOverlayContainer: 'a service',
|
|
54
|
+
WrPlatform: 'a service',
|
|
55
|
+
WrScroll: 'a service',
|
|
56
|
+
WrStorage: 'a service',
|
|
57
|
+
WrTheme: 'a service',
|
|
58
|
+
WrToast: 'a service',
|
|
59
|
+
WrToastRef: 'a class',
|
|
60
|
+
WrTour: 'a service',
|
|
61
|
+
WrValidators: 'a constant',
|
|
62
|
+
WrVisualViewport: 'a service',
|
|
63
|
+
WrWindowManager: 'a service',
|
|
64
|
+
WrWindowRef: 'a class',
|
|
65
|
+
};
|
|
66
|
+
exports.NON_DECLARABLE = NON_DECLARABLE;
|
|
67
|
+
/**
|
|
68
|
+
* Add `import { WrFoo } from 'ngwr/<subpath>';` to the given component
|
|
69
|
+
* file and splice `WrFoo` into the `@Component({ imports: [...] })`
|
|
70
|
+
* array. Saves the subpath-lookup dance for newcomers — `ng g ngwr:use
|
|
71
|
+
* WrButton --path src/app/my-page.ts`.
|
|
72
|
+
*
|
|
73
|
+
* Only `symbol` is positional (see schema.json); `path` is a named option, so
|
|
74
|
+
* the bare `ng g ngwr:use WrButton src/app/my-page.ts` form fails with
|
|
75
|
+
* `Unknown argument`.
|
|
76
|
+
*
|
|
77
|
+
* Regex-based on purpose to avoid pulling in the TS compiler as a runtime
|
|
78
|
+
* dep. Covers the common standalone-component shape; an unusual file
|
|
79
|
+
* shape gets a clear warning + a copy-pasteable snippet.
|
|
80
|
+
*
|
|
81
|
+
* `symbolMap` is an argument rather than a module-level `require` so that this
|
|
82
|
+
* file can be loaded from source — see the note in `./index`.
|
|
83
|
+
*/
|
|
84
|
+
function useRule(options, symbolMap) {
|
|
85
|
+
return (tree, context) => {
|
|
86
|
+
const symbol = options.symbol.trim();
|
|
87
|
+
if (!symbol)
|
|
88
|
+
throw new schematics_1.SchematicsException('ngwr:use: missing required `symbol`.');
|
|
89
|
+
const subpath = symbolMap[symbol];
|
|
90
|
+
if (!subpath) {
|
|
91
|
+
throw new schematics_1.SchematicsException(`ngwr:use: unknown symbol "${symbol}". Check the catalog at https://ngwr.dev or use the literal import: \`import { ${symbol} } from 'ngwr/<subpath>';\``);
|
|
92
|
+
}
|
|
93
|
+
const kind = NON_DECLARABLE[symbol];
|
|
94
|
+
if (kind) {
|
|
95
|
+
throw new schematics_1.SchematicsException(`ngwr:use: ${symbol} is ${kind}, not a component, directive or pipe — Angular rejects it in \`@Component({ imports })\`. Import it and use it directly: \`import { ${symbol} } from '${subpath}';\``);
|
|
96
|
+
}
|
|
97
|
+
const filePath = resolveTargetFile(tree, options.path);
|
|
98
|
+
if (!filePath) {
|
|
99
|
+
// No file passed: just print the import snippet and stop.
|
|
100
|
+
context.logger.info(printManualSnippet(symbol, subpath));
|
|
101
|
+
return tree;
|
|
102
|
+
}
|
|
103
|
+
if (!tree.exists(filePath)) {
|
|
104
|
+
throw new schematics_1.SchematicsException(`ngwr:use: file ${filePath} not found.`);
|
|
105
|
+
}
|
|
106
|
+
const original = tree.readText(filePath);
|
|
107
|
+
let next = original;
|
|
108
|
+
next = addImport(next, symbol, subpath);
|
|
109
|
+
next = addToImportsArray(next, symbol);
|
|
110
|
+
if (next === original) {
|
|
111
|
+
context.logger.info(`ngwr:use: ${filePath} already has ${symbol} — no changes.`);
|
|
112
|
+
return tree;
|
|
113
|
+
}
|
|
114
|
+
tree.overwrite(filePath, next);
|
|
115
|
+
context.logger.info(`✓ Added ${symbol} (from ${subpath}) to ${filePath}.`);
|
|
116
|
+
return tree;
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function resolveTargetFile(tree, candidate) {
|
|
120
|
+
if (!candidate)
|
|
121
|
+
return null;
|
|
122
|
+
const path = candidate.startsWith('/') ? candidate : `/${candidate}`;
|
|
123
|
+
if (tree.exists(path))
|
|
124
|
+
return path;
|
|
125
|
+
if (tree.exists(candidate))
|
|
126
|
+
return candidate;
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Insert `import { Symbol } from 'subpath';` near the existing imports,
|
|
131
|
+
* or merge into an existing line that already references the same path.
|
|
132
|
+
* Idempotent — returns the source untouched if the symbol is already in.
|
|
133
|
+
*/
|
|
134
|
+
function addImport(source, symbol, subpath) {
|
|
135
|
+
// Already imported from somewhere?
|
|
136
|
+
const importedAnywhere = new RegExp(`\\bimport\\s*\\{[^}]*\\b${symbol}\\b[^}]*\\}\\s*from`).test(source);
|
|
137
|
+
if (importedAnywhere)
|
|
138
|
+
return source;
|
|
139
|
+
// Existing import from the same subpath? — splice the symbol in.
|
|
140
|
+
const sameSubpathRe = new RegExp(`(import\\s*\\{)([^}]*)(\\}\\s*from\\s*['"]${escapeRegExp(subpath)}['"])`, 'm');
|
|
141
|
+
const sameSubpathMatch = sameSubpathRe.exec(source);
|
|
142
|
+
if (sameSubpathMatch) {
|
|
143
|
+
const head = sameSubpathMatch[1];
|
|
144
|
+
const body = sameSubpathMatch[2].trim().replace(/,\s*$/, '');
|
|
145
|
+
const tail = sameSubpathMatch[3];
|
|
146
|
+
const merged = body ? `${head} ${body}, ${symbol} ${tail}` : `${head} ${symbol} ${tail}`;
|
|
147
|
+
return source.replace(sameSubpathMatch[0], merged);
|
|
148
|
+
}
|
|
149
|
+
// No related import — prepend a new line after the last top-of-file
|
|
150
|
+
// import we can find.
|
|
151
|
+
const importBlockRe = /(^|\n)(import\s[^;]+;\s*\n)+/m;
|
|
152
|
+
const block = importBlockRe.exec(source);
|
|
153
|
+
const newLine = `import { ${symbol} } from '${subpath}';\n`;
|
|
154
|
+
if (block) {
|
|
155
|
+
// Splice in immediately after the last import in the block.
|
|
156
|
+
const end = (block.index ?? 0) + block[0].length;
|
|
157
|
+
return `${source.slice(0, end)}${newLine}${source.slice(end)}`;
|
|
158
|
+
}
|
|
159
|
+
// No existing imports — just prepend.
|
|
160
|
+
return `${newLine}${source}`;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Find `imports: [...]` inside a `@Component({...})` decorator (single or
|
|
164
|
+
* multi-line) and splice the symbol in. Skips if the symbol is already
|
|
165
|
+
* listed.
|
|
166
|
+
*/
|
|
167
|
+
function addToImportsArray(source, symbol) {
|
|
168
|
+
// Match `imports: [ ... ]` allowing multi-line + trailing commas.
|
|
169
|
+
const arrayRe = /(\bimports\s*:\s*\[)([\s\S]*?)(\])/m;
|
|
170
|
+
const match = arrayRe.exec(source);
|
|
171
|
+
if (!match) {
|
|
172
|
+
// No imports array — try to insert one after the `@Component({`
|
|
173
|
+
// opening brace. Heuristic, not foolproof.
|
|
174
|
+
const componentRe = /@Component\s*\(\s*\{/;
|
|
175
|
+
const compMatch = componentRe.exec(source);
|
|
176
|
+
if (compMatch?.index === undefined) {
|
|
177
|
+
// No @Component decorator at all — leave the file alone, the user
|
|
178
|
+
// probably wants the import only.
|
|
179
|
+
return source;
|
|
180
|
+
}
|
|
181
|
+
const insertAt = compMatch.index + compMatch[0].length;
|
|
182
|
+
return `${source.slice(0, insertAt)}\n imports: [${symbol}],${source.slice(insertAt)}`;
|
|
183
|
+
}
|
|
184
|
+
const body = match[2];
|
|
185
|
+
if (new RegExp(`\\b${escapeRegExp(symbol)}\\b`).test(body))
|
|
186
|
+
return source;
|
|
187
|
+
const trimmed = body.replace(/\s+$/, '');
|
|
188
|
+
const sep = trimmed.length && !trimmed.endsWith(',') ? ', ' : trimmed.length ? ' ' : '';
|
|
189
|
+
const replaced = `${match[1]}${trimmed}${sep}${symbol}${match[3]}`;
|
|
190
|
+
return source.replace(match[0], replaced);
|
|
191
|
+
}
|
|
192
|
+
function escapeRegExp(value) {
|
|
193
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
194
|
+
}
|
|
195
|
+
function printManualSnippet(symbol, subpath) {
|
|
196
|
+
return `
|
|
197
|
+
ngwr:use — copy this into your component:
|
|
198
|
+
|
|
199
|
+
import { ${symbol} } from '${subpath}';
|
|
200
|
+
|
|
201
|
+
@Component({
|
|
202
|
+
imports: [/* …, */ ${symbol}],
|
|
203
|
+
/* … */
|
|
204
|
+
})
|
|
205
|
+
`;
|
|
206
|
+
}
|
|
@@ -44,12 +44,12 @@
|
|
|
44
44
|
"WrCookie": "ngwr/cookie",
|
|
45
45
|
"WrCounter": "ngwr/counter",
|
|
46
46
|
"WrCountUp": "ngwr/counter",
|
|
47
|
-
"WrDateAdapter": "ngwr/date
|
|
48
|
-
"WrNativeDateAdapter": "ngwr/date
|
|
49
|
-
"WrDateFnsAdapter": "ngwr/date-adapter-fns",
|
|
50
|
-
"WrLuxonAdapter": "ngwr/date-adapter-luxon",
|
|
47
|
+
"WrDateAdapter": "ngwr/date",
|
|
48
|
+
"WrNativeDateAdapter": "ngwr/date",
|
|
51
49
|
"WrDatePicker": "ngwr/date-picker",
|
|
52
50
|
"WrDateRangePicker": "ngwr/date-picker",
|
|
51
|
+
"WrDateFnsAdapter": "ngwr/date/adapters/fns",
|
|
52
|
+
"WrLuxonAdapter": "ngwr/date/adapters/luxon",
|
|
53
53
|
"WrDecryptText": "ngwr/decrypt-text",
|
|
54
54
|
"WrDensity": "ngwr/density",
|
|
55
55
|
"WrDensityDirective": "ngwr/density",
|