ngwr 11.2.0 → 12.1.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 +85 -26
- 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/collapse/styles/_index.scss +2 -2
- package/color-picker/styles/_index.scss +3 -3
- 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.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 +20 -2
- package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-bar-chart.mjs +3 -3
- package/fesm2022/ngwr-blur-text.mjs +3 -3
- package/fesm2022/ngwr-blur-text.mjs.map +1 -1
- 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.mjs +17 -5
- package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-testing.mjs +1 -1
- package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
- package/fesm2022/ngwr-calendar.mjs +187 -9
- 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 +48 -5
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox.mjs +6 -6
- 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 +26 -6
- package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
- package/fesm2022/ngwr-color-picker.mjs +98 -8
- 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 +333 -43
- 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 +11 -6
- 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.mjs +3 -3
- 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 +8 -4
- package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -1
- 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 +121 -58
- package/fesm2022/ngwr-drawer.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown.mjs +26 -10
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-empty.mjs +3 -3
- package/fesm2022/ngwr-event-calendar.mjs +28 -15
- package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-falling-text-testing.mjs +5 -3
- package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -1
- 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.mjs +21 -11
- package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
- package/fesm2022/ngwr-gauge.mjs +3 -3
- package/fesm2022/ngwr-glitch-text-testing.mjs +51 -17
- package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-glitch-text.mjs +7 -7
- package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
- package/fesm2022/ngwr-gradient-text-testing.mjs +46 -11
- package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -1
- 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 +73 -1
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +55 -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 +53 -9
- package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -1
- package/fesm2022/ngwr-image-cropper.mjs +150 -12
- 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 +17 -10
- 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.mjs +3 -3
- package/fesm2022/ngwr-layout.mjs +15 -15
- package/fesm2022/ngwr-lightbox.mjs +4 -4
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- 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.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 +26 -6
- package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -1
- package/fesm2022/ngwr-meter-group.mjs +3 -3
- package/fesm2022/ngwr-overlay.mjs +6 -6
- 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 +83 -16
- 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 +155 -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.mjs +3 -3
- package/fesm2022/ngwr-scroll.mjs +3 -3
- package/fesm2022/ngwr-segmented-testing.mjs +85 -1
- package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
- package/fesm2022/ngwr-segmented.mjs +123 -10
- package/fesm2022/ngwr-segmented.mjs.map +1 -1
- package/fesm2022/ngwr-select.mjs +159 -34
- package/fesm2022/ngwr-select.mjs.map +1 -1
- 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 +100 -9
- package/fesm2022/ngwr-slider.mjs.map +1 -1
- package/fesm2022/ngwr-sparkline.mjs +3 -3
- package/fesm2022/ngwr-speed-dial-testing.mjs +15 -13
- package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -1
- 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.mjs +3 -3
- package/fesm2022/ngwr-split-text.mjs +17 -5
- package/fesm2022/ngwr-split-text.mjs.map +1 -1
- package/fesm2022/ngwr-splitter.mjs +3 -3
- 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.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 +99 -39
- 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 +36 -10
- 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.mjs +7 -7
- package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
- package/fesm2022/ngwr-timeline.mjs +6 -6
- package/fesm2022/ngwr-toast.mjs +9 -9
- package/fesm2022/ngwr-toolbar.mjs +3 -3
- 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 +28 -10
- package/fesm2022/ngwr-tree.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter-testing.mjs +15 -1
- package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -1
- 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.mjs +4 -4
- package/fesm2022/ngwr-waves.mjs.map +1 -1
- package/fesm2022/ngwr-window.mjs +94 -24
- 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 +56 -6
- package/i18n/ru.json +56 -6
- 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 +19 -24
- package/llms.txt +46 -8
- package/markdown/styles/_index.scss +3 -3
- package/mcp/api.js +6 -4
- package/mcp/catalog.js +40 -3
- package/mcp/providers.js +16 -3
- package/mcp/tools.js +21 -1
- package/meter-group/styles/_index.scss +1 -1
- package/overlay/styles/_index.scss +33 -1
- package/package.json +17 -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 +7 -5
- package/skills/ngwr/references/catalog.md +9 -9
- package/skills/ngwr/references/setup.md +10 -5
- 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-bar-chart-testing.d.ts +9 -1
- package/types/ngwr-blur-text.d.ts +8 -4
- package/types/ngwr-breadcrumbs.d.ts +17 -10
- package/types/ngwr-calendar-testing.d.ts +1 -1
- package/types/ngwr-calendar.d.ts +66 -0
- package/types/ngwr-carousel.d.ts +85 -6
- package/types/ngwr-cascader.d.ts +17 -0
- package/types/ngwr-click-spark.d.ts +4 -0
- package/types/ngwr-color-picker-testing.d.ts +8 -0
- package/types/ngwr-color-picker.d.ts +21 -1
- 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 +56 -0
- 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 +11 -6
- 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-dialog.d.ts +38 -1
- package/types/ngwr-divider.d.ts +25 -0
- package/types/ngwr-donut-chart-testing.d.ts +7 -3
- package/types/ngwr-donut-chart.d.ts +3 -3
- package/types/ngwr-drag-drop.d.ts +56 -2
- package/types/ngwr-drawer.d.ts +56 -5
- package/types/ngwr-event-calendar.d.ts +8 -2
- package/types/ngwr-falling-text-testing.d.ts +5 -3
- package/types/ngwr-falling-text.d.ts +1 -1
- package/types/ngwr-form.d.ts +12 -2
- package/types/ngwr-glitch-text-testing.d.ts +37 -8
- package/types/ngwr-gradient-text-testing.d.ts +16 -3
- package/types/ngwr-i18n.d.ts +13 -4
- package/types/ngwr-image-cropper-testing.d.ts +49 -10
- package/types/ngwr-image-cropper.d.ts +70 -5
- package/types/ngwr-input-number-testing.d.ts +15 -10
- package/types/ngwr-input-number.d.ts +11 -4
- package/types/ngwr-input-otp-testing.d.ts +12 -6
- package/types/ngwr-input-otp.d.ts +15 -1
- package/types/ngwr-line-chart.d.ts +20 -3
- package/types/ngwr-markdown.d.ts +11 -0
- package/types/ngwr-mention.d.ts +32 -0
- package/types/ngwr-meter-group-testing.d.ts +12 -2
- package/types/ngwr-overlay.d.ts +1 -0
- package/types/ngwr-pagination-testing.d.ts +4 -4
- package/types/ngwr-pagination.d.ts +11 -0
- 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-segmented-testing.d.ts +53 -0
- package/types/ngwr-segmented.d.ts +107 -5
- package/types/ngwr-select.d.ts +68 -6
- package/types/ngwr-shiny-text.d.ts +4 -2
- package/types/ngwr-sidebar.d.ts +14 -5
- package/types/ngwr-slider.d.ts +69 -1
- package/types/ngwr-speed-dial-testing.d.ts +15 -11
- package/types/ngwr-speed-dial.d.ts +22 -3
- package/types/ngwr-split-text.d.ts +9 -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 +104 -11
- 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-tour.d.ts +22 -4
- package/types/ngwr-tree.d.ts +5 -4
- package/types/ngwr-typewriter-testing.d.ts +10 -0
- package/types/ngwr-utils.d.ts +5 -2
- package/types/ngwr-version.d.ts +1 -1
- package/types/ngwr-window.d.ts +39 -11
- package/typography/styles/_index.scss +1 -1
- package/window/styles/_index.scss +72 -26
- 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
package/radio/styles/_index.scss
CHANGED
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
white-space: nowrap;
|
|
37
37
|
|
|
38
38
|
&:focus-visible + .wr-radio__dot {
|
|
39
|
-
|
|
39
|
+
@include theme.focus-ring;
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
&--disabled {
|
|
116
116
|
--wr-radio-color: var(--wr-color-on-surface-muted);
|
|
117
117
|
pointer-events: none;
|
|
118
|
-
opacity:
|
|
118
|
+
opacity: var(--wr-disabled-opacity);
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"schema": "./use/schema.json"
|
|
19
19
|
},
|
|
20
20
|
"provider": {
|
|
21
|
-
"description": "Add a `provideWr*()` call to your bootstrap providers (overlay / icons / toast / i18n / date-adapter / density /
|
|
21
|
+
"description": "Add a `provideWr*()` call to your bootstrap providers (overlay / icons / toast / i18n / date-adapter / density / storage / theme).",
|
|
22
22
|
"factory": "./provider/index#default",
|
|
23
23
|
"schema": "./provider/schema.json"
|
|
24
24
|
},
|
|
@@ -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;
|