@ng-prism/core 22.5.0 → 22.7.0-beta.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 +13 -9
- package/dist/app/canvas/canvas-bg.styles.d.ts +1 -1
- package/dist/app/canvas/canvas-bg.styles.d.ts.map +1 -1
- package/dist/app/canvas/canvas-bg.styles.js +1 -1
- package/dist/app/canvas/canvas-overlay-tokens.d.ts +12 -0
- package/dist/app/canvas/canvas-overlay-tokens.d.ts.map +1 -0
- package/dist/app/canvas/canvas-overlay-tokens.js +52 -0
- package/dist/app/canvas/prism-canvas-bg-pill.component.js +2 -2
- package/dist/app/canvas/prism-canvas-pin-row.component.js +2 -2
- package/dist/app/canvas/prism-canvas-rulers.component.d.ts +2 -0
- package/dist/app/canvas/prism-canvas-rulers.component.d.ts.map +1 -1
- package/dist/app/canvas/prism-canvas-rulers.component.js +17 -12
- package/dist/app/canvas/prism-canvas-toolbar.component.d.ts +25 -3
- package/dist/app/canvas/prism-canvas-toolbar.component.d.ts.map +1 -1
- package/dist/app/canvas/prism-canvas-toolbar.component.js +154 -89
- package/dist/app/canvas/prism-template-popover.component.d.ts.map +1 -1
- package/dist/app/canvas/prism-template-popover.component.js +16 -7
- package/dist/app/canvas/state-chips.d.ts +50 -0
- package/dist/app/canvas/state-chips.d.ts.map +1 -0
- package/dist/app/canvas/state-chips.js +40 -0
- package/dist/app/component-head/head-metrics.d.ts +35 -19
- package/dist/app/component-head/head-metrics.d.ts.map +1 -1
- package/dist/app/component-head/head-metrics.js +57 -27
- package/dist/app/component-head/pipe-facts.d.ts +9 -0
- package/dist/app/component-head/pipe-facts.d.ts.map +1 -0
- package/dist/app/component-head/pipe-facts.js +15 -0
- package/dist/app/component-head/prism-component-head.component.d.ts +20 -22
- package/dist/app/component-head/prism-component-head.component.d.ts.map +1 -1
- package/dist/app/component-head/prism-component-head.component.js +85 -96
- package/dist/app/component-head/prism-head-gauge.component.d.ts +8 -12
- package/dist/app/component-head/prism-head-gauge.component.d.ts.map +1 -1
- package/dist/app/component-head/prism-head-gauge.component.js +51 -67
- package/dist/app/component-head/prism-head-info.component.d.ts +14 -2
- package/dist/app/component-head/prism-head-info.component.d.ts.map +1 -1
- package/dist/app/component-head/prism-head-info.component.js +84 -20
- package/dist/app/component-head/prism-stat.component.d.ts +4 -5
- package/dist/app/component-head/prism-stat.component.d.ts.map +1 -1
- package/dist/app/component-head/prism-stat.component.js +16 -12
- package/dist/app/component-head/service-facts.d.ts +8 -0
- package/dist/app/component-head/service-facts.d.ts.map +1 -0
- package/dist/app/component-head/service-facts.js +11 -0
- package/dist/app/controls/boolean-control.component.js +2 -2
- package/dist/app/controls/json-control.component.js +2 -2
- package/dist/app/controls/union-control.component.js +4 -3
- package/dist/app/directives/resize-value.d.ts +1 -1
- package/dist/app/directives/resize-value.js +1 -1
- package/dist/app/discovery-manifest.d.ts +2 -2
- package/dist/app/discovery-manifest.d.ts.map +1 -1
- package/dist/app/discovery-manifest.js +15 -3
- package/dist/app/header/header-brand.d.ts +25 -0
- package/dist/app/header/header-brand.d.ts.map +1 -0
- package/dist/app/header/header-brand.js +10 -0
- package/dist/app/header/prism-header.component.d.ts +2 -2
- package/dist/app/header/prism-header.component.d.ts.map +1 -1
- package/dist/app/header/prism-header.component.js +73 -57
- package/dist/app/icons/icon-registry.d.ts.map +1 -1
- package/dist/app/icons/icon-registry.js +4 -1
- package/dist/app/index.d.ts +12 -0
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/index.js +12 -1
- package/dist/app/layout-menu/prism-layout-menu.component.d.ts +3 -0
- package/dist/app/layout-menu/prism-layout-menu.component.d.ts.map +1 -1
- package/dist/app/layout-menu/prism-layout-menu.component.js +72 -58
- package/dist/app/overview/open-in-playground.d.ts +19 -0
- package/dist/app/overview/open-in-playground.d.ts.map +1 -0
- package/dist/app/overview/open-in-playground.js +25 -0
- package/dist/app/overview/overview-matrix.d.ts +85 -0
- package/dist/app/overview/overview-matrix.d.ts.map +1 -0
- package/dist/app/overview/overview-matrix.js +98 -0
- package/dist/app/overview/overview-visibility.d.ts +10 -2
- package/dist/app/overview/overview-visibility.d.ts.map +1 -1
- package/dist/app/overview/overview-visibility.js +14 -3
- package/dist/app/overview/prism-overview-cell.component.d.ts +27 -2
- package/dist/app/overview/prism-overview-cell.component.d.ts.map +1 -1
- package/dist/app/overview/prism-overview-cell.component.js +145 -28
- package/dist/app/overview/prism-overview-matrix.component.d.ts +29 -0
- package/dist/app/overview/prism-overview-matrix.component.d.ts.map +1 -0
- package/dist/app/overview/prism-overview-matrix.component.js +155 -0
- package/dist/app/overview/prism-overview.component.d.ts +4 -0
- package/dist/app/overview/prism-overview.component.d.ts.map +1 -1
- package/dist/app/overview/prism-overview.component.js +37 -14
- package/dist/app/page-renderer/prism-page-renderer.component.js +2 -2
- package/dist/app/panels/a11y/a11y-core.plugin.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-core.plugin.js +0 -1
- package/dist/app/panels/a11y/a11y-header-badge.component.d.ts +1 -4
- package/dist/app/panels/a11y/a11y-header-badge.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-header-badge.component.js +8 -19
- package/dist/app/panels/a11y/a11y-keyboard-overlay.component.js +2 -2
- package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts +1 -0
- package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-overlay-host.component.js +4 -3
- package/dist/app/panels/a11y/a11y-panel.component.d.ts +4 -1
- package/dist/app/panels/a11y/a11y-panel.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-panel.component.js +32 -54
- package/dist/app/panels/a11y/a11y-score.component.d.ts +8 -3
- package/dist/app/panels/a11y/a11y-score.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-score.component.js +19 -35
- package/dist/app/panels/a11y/a11y-sr-overlay.component.js +2 -2
- package/dist/app/panels/a11y/a11y-sr.component.js +2 -2
- package/dist/app/panels/a11y/a11y-summary.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-summary.js +8 -1
- package/dist/app/panels/a11y/a11y-tree.component.js +2 -2
- package/dist/app/panels/a11y/a11y-violations.component.d.ts +23 -2
- package/dist/app/panels/a11y/a11y-violations.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-violations.component.js +104 -89
- package/dist/app/panels/a11y/severity.d.ts +9 -0
- package/dist/app/panels/a11y/severity.d.ts.map +1 -0
- package/dist/app/panels/a11y/severity.js +12 -0
- package/dist/app/panels/controls/controls-plugin.d.ts.map +1 -1
- package/dist/app/panels/controls/controls-plugin.js +1 -2
- package/dist/app/panels/controls/non-editable-input-types.d.ts +9 -1
- package/dist/app/panels/controls/non-editable-input-types.d.ts.map +1 -1
- package/dist/app/panels/controls/non-editable-input-types.js +18 -0
- package/dist/app/panels/controls/prism-controls-panel.component.d.ts +2 -1
- package/dist/app/panels/controls/prism-controls-panel.component.d.ts.map +1 -1
- package/dist/app/panels/controls/prism-controls-panel.component.js +77 -59
- package/dist/app/panels/events/events-plugin.d.ts.map +1 -1
- package/dist/app/panels/events/events-plugin.js +1 -2
- package/dist/app/panels/events/prism-events-panel.component.d.ts +2 -0
- package/dist/app/panels/events/prism-events-panel.component.d.ts.map +1 -1
- package/dist/app/panels/events/prism-events-panel.component.js +20 -7
- package/dist/app/panels/events/prism-json-node.utils.d.ts +6 -0
- package/dist/app/panels/events/prism-json-node.utils.d.ts.map +1 -1
- package/dist/app/panels/events/prism-json-node.utils.js +8 -0
- package/dist/app/panels/panel-host/addon-panels.d.ts +11 -0
- package/dist/app/panels/panel-host/addon-panels.d.ts.map +1 -0
- package/dist/app/panels/panel-host/addon-panels.js +12 -0
- package/dist/app/panels/panel-host/panel-badge.d.ts +22 -0
- package/dist/app/panels/panel-host/panel-badge.d.ts.map +1 -1
- package/dist/app/panels/panel-host/panel-badge.js +56 -11
- package/dist/app/panels/panel-host/prism-panel-host.component.d.ts +4 -1
- package/dist/app/panels/panel-host/prism-panel-host.component.d.ts.map +1 -1
- package/dist/app/panels/panel-host/prism-panel-host.component.js +36 -70
- package/dist/app/pseudo/pseudo-state-marker.d.ts +32 -10
- package/dist/app/pseudo/pseudo-state-marker.d.ts.map +1 -1
- package/dist/app/pseudo/pseudo-state-marker.js +83 -67
- package/dist/app/pseudo/pseudo-targets.d.ts +11 -0
- package/dist/app/pseudo/pseudo-targets.d.ts.map +1 -0
- package/dist/app/pseudo/pseudo-targets.js +46 -0
- package/dist/app/pseudo/state-fit.d.ts +28 -0
- package/dist/app/pseudo/state-fit.d.ts.map +1 -0
- package/dist/app/pseudo/state-fit.js +97 -0
- package/dist/app/renderer/composition.d.ts +20 -0
- package/dist/app/renderer/composition.d.ts.map +1 -0
- package/dist/app/renderer/composition.js +26 -0
- package/dist/app/renderer/input-bindings.d.ts +28 -0
- package/dist/app/renderer/input-bindings.d.ts.map +1 -0
- package/dist/app/renderer/input-bindings.js +42 -0
- package/dist/app/renderer/known-inputs.d.ts +8 -1
- package/dist/app/renderer/known-inputs.d.ts.map +1 -1
- package/dist/app/renderer/known-inputs.js +13 -5
- package/dist/app/renderer/prism-renderer.component.d.ts +18 -4
- package/dist/app/renderer/prism-renderer.component.d.ts.map +1 -1
- package/dist/app/renderer/prism-renderer.component.js +78 -44
- package/dist/app/renderer/projectable-content.d.ts +8 -1
- package/dist/app/renderer/projectable-content.d.ts.map +1 -1
- package/dist/app/renderer/projectable-content.js +40 -29
- package/dist/app/renderer/rendered-key.d.ts +20 -6
- package/dist/app/renderer/rendered-key.d.ts.map +1 -1
- package/dist/app/renderer/rendered-key.js +25 -8
- package/dist/app/renderer/snippet-generator.d.ts +14 -2
- package/dist/app/renderer/snippet-generator.d.ts.map +1 -1
- package/dist/app/renderer/snippet-generator.js +138 -81
- package/dist/app/services/navigation-item.d.ts +10 -0
- package/dist/app/services/navigation-item.d.ts.map +1 -0
- package/dist/app/services/navigation-item.js +20 -0
- package/dist/app/services/navigation-item.types.d.ts +8 -0
- package/dist/app/services/navigation-item.types.d.ts.map +1 -1
- package/dist/app/services/prism-layout.service.d.ts +12 -0
- package/dist/app/services/prism-layout.service.d.ts.map +1 -1
- package/dist/app/services/prism-layout.service.js +17 -7
- package/dist/app/services/prism-manifest.service.d.ts +4 -0
- package/dist/app/services/prism-manifest.service.d.ts.map +1 -1
- package/dist/app/services/prism-manifest.service.js +4 -0
- package/dist/app/services/prism-navigation.service.d.ts +12 -0
- package/dist/app/services/prism-navigation.service.d.ts.map +1 -1
- package/dist/app/services/prism-navigation.service.js +85 -19
- package/dist/app/services/prism-panel.service.d.ts +7 -3
- package/dist/app/services/prism-panel.service.d.ts.map +1 -1
- package/dist/app/services/prism-panel.service.js +13 -4
- package/dist/app/services/prism-pseudo-state.service.d.ts +59 -14
- package/dist/app/services/prism-pseudo-state.service.d.ts.map +1 -1
- package/dist/app/services/prism-pseudo-state.service.js +86 -29
- package/dist/app/services/prism-renderer.service.d.ts +23 -0
- package/dist/app/services/prism-renderer.service.d.ts.map +1 -1
- package/dist/app/services/prism-renderer.service.js +77 -8
- package/dist/app/services/prism-search.service.d.ts +4 -0
- package/dist/app/services/prism-search.service.d.ts.map +1 -1
- package/dist/app/services/prism-search.service.js +29 -6
- package/dist/app/services/prism-theme.service.d.ts +11 -3
- package/dist/app/services/prism-theme.service.d.ts.map +1 -1
- package/dist/app/services/prism-theme.service.js +27 -19
- package/dist/app/services/prism-url-state.service.d.ts.map +1 -1
- package/dist/app/services/prism-url-state.service.js +81 -12
- package/dist/app/shared/badge.types.d.ts +7 -0
- package/dist/app/shared/badge.types.d.ts.map +1 -0
- package/dist/app/shared/badge.types.js +9 -0
- package/dist/app/shared/brand-mark.d.ts +35 -0
- package/dist/app/shared/brand-mark.d.ts.map +1 -0
- package/dist/app/shared/brand-mark.js +52 -0
- package/dist/app/shared/metric-bar.d.ts +6 -0
- package/dist/app/shared/metric-bar.d.ts.map +1 -0
- package/dist/app/shared/metric-bar.js +7 -0
- package/dist/app/shared/prism-badge.component.d.ts +21 -0
- package/dist/app/shared/prism-badge.component.d.ts.map +1 -0
- package/dist/app/shared/prism-badge.component.js +68 -0
- package/dist/app/shared/prism-button.component.d.ts +12 -0
- package/dist/app/shared/prism-button.component.d.ts.map +1 -0
- package/dist/app/shared/prism-button.component.js +28 -0
- package/dist/app/shared/prism-icon-button.component.d.ts +17 -0
- package/dist/app/shared/prism-icon-button.component.d.ts.map +1 -0
- package/dist/app/shared/prism-icon-button.component.js +37 -0
- package/dist/app/shared/prism-list-row.component.d.ts +17 -0
- package/dist/app/shared/prism-list-row.component.d.ts.map +1 -0
- package/dist/app/shared/prism-list-row.component.js +57 -0
- package/dist/app/shared/prism-logo.component.d.ts +24 -0
- package/dist/app/shared/prism-logo.component.d.ts.map +1 -0
- package/dist/app/shared/prism-logo.component.js +77 -0
- package/dist/app/shared/prism-metric-badge.component.d.ts +9 -4
- package/dist/app/shared/prism-metric-badge.component.d.ts.map +1 -1
- package/dist/app/shared/prism-metric-badge.component.js +33 -12
- package/dist/app/shared/prism-metric-card.component.d.ts +30 -0
- package/dist/app/shared/prism-metric-card.component.d.ts.map +1 -0
- package/dist/app/shared/prism-metric-card.component.js +111 -0
- package/dist/app/shared/prism-panel-toolbar.component.d.ts +13 -0
- package/dist/app/shared/prism-panel-toolbar.component.d.ts.map +1 -0
- package/dist/app/shared/prism-panel-toolbar.component.js +28 -0
- package/dist/app/shared/prism-segmented.component.d.ts +25 -0
- package/dist/app/shared/prism-segmented.component.d.ts.map +1 -0
- package/dist/app/shared/prism-segmented.component.js +77 -0
- package/dist/app/shared/prism-tabs.component.d.ts +44 -0
- package/dist/app/shared/prism-tabs.component.d.ts.map +1 -0
- package/dist/app/shared/prism-tabs.component.js +134 -0
- package/dist/app/shared/roving-focus.d.ts +13 -0
- package/dist/app/shared/roving-focus.d.ts.map +1 -0
- package/dist/app/shared/roving-focus.js +34 -0
- package/dist/app/shell/prism-shell.component.d.ts +13 -0
- package/dist/app/shell/prism-shell.component.d.ts.map +1 -1
- package/dist/app/shell/prism-shell.component.js +57 -28
- package/dist/app/shell/should-select-first.d.ts +17 -0
- package/dist/app/shell/should-select-first.d.ts.map +1 -0
- package/dist/app/shell/should-select-first.js +13 -0
- package/dist/app/sidebar/navigation-decorations.d.ts +23 -1
- package/dist/app/sidebar/navigation-decorations.d.ts.map +1 -1
- package/dist/app/sidebar/navigation-decorations.js +33 -2
- package/dist/app/sidebar/prism-sidebar.component.d.ts +5 -15
- package/dist/app/sidebar/prism-sidebar.component.d.ts.map +1 -1
- package/dist/app/sidebar/prism-sidebar.component.js +89 -77
- package/dist/app/theme/deprecated-tokens.d.ts +15 -0
- package/dist/app/theme/deprecated-tokens.d.ts.map +1 -0
- package/dist/app/theme/deprecated-tokens.js +22 -0
- package/dist/app/theme/favicon.d.ts +3 -0
- package/dist/app/theme/favicon.d.ts.map +1 -0
- package/dist/app/theme/favicon.js +3 -0
- package/dist/app/theme/prism-default-theme.d.ts.map +1 -1
- package/dist/app/theme/prism-default-theme.js +122 -66
- package/dist/app/theme/resolve-theme-tokens.d.ts +29 -0
- package/dist/app/theme/resolve-theme-tokens.d.ts.map +1 -0
- package/dist/app/theme/resolve-theme-tokens.js +43 -0
- package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts +4 -7
- package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts.map +1 -1
- package/dist/app/variant-ribbon/prism-variant-ribbon.component.js +31 -69
- package/dist/app/view-tab-bar/next-view-id.d.ts +7 -1
- package/dist/app/view-tab-bar/next-view-id.d.ts.map +1 -1
- package/dist/app/view-tab-bar/next-view-id.js +9 -1
- package/dist/app/view-tab-bar/panel-inputs.d.ts +28 -0
- package/dist/app/view-tab-bar/panel-inputs.d.ts.map +1 -0
- package/dist/app/view-tab-bar/panel-inputs.js +41 -0
- package/dist/app/view-tab-bar/prism-view-panel-host.component.d.ts +2 -3
- package/dist/app/view-tab-bar/prism-view-panel-host.component.d.ts.map +1 -1
- package/dist/app/view-tab-bar/prism-view-panel-host.component.js +9 -9
- package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts +6 -0
- package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts.map +1 -1
- package/dist/app/view-tab-bar/prism-view-tab-bar.component.js +22 -29
- package/dist/builder/config-loader/deprecated-options.d.ts +9 -0
- package/dist/builder/config-loader/deprecated-options.d.ts.map +1 -0
- package/dist/builder/config-loader/deprecated-options.js +34 -0
- package/dist/builder/manifest/composition-wrapper.generator.d.ts +14 -0
- package/dist/builder/manifest/composition-wrapper.generator.d.ts.map +1 -0
- package/dist/builder/manifest/composition-wrapper.generator.js +66 -0
- package/dist/builder/manifest/host-parser.d.ts +2 -0
- package/dist/builder/manifest/host-parser.d.ts.map +1 -1
- package/dist/builder/manifest/host-parser.js +9 -4
- package/dist/builder/manifest/manifest-imports.d.ts +34 -0
- package/dist/builder/manifest/manifest-imports.d.ts.map +1 -0
- package/dist/builder/manifest/manifest-imports.js +91 -0
- package/dist/builder/manifest/runtime-manifest.generator.d.ts +13 -0
- package/dist/builder/manifest/runtime-manifest.generator.d.ts.map +1 -1
- package/dist/builder/manifest/runtime-manifest.generator.js +137 -65
- package/dist/builder/manifest/selector-element.d.ts +16 -0
- package/dist/builder/manifest/selector-element.d.ts.map +1 -0
- package/dist/builder/manifest/selector-element.js +46 -0
- package/dist/builder/manifest/template-literal.d.ts +3 -0
- package/dist/builder/manifest/template-literal.d.ts.map +1 -0
- package/dist/builder/manifest/template-literal.js +4 -0
- package/dist/builder/plugin-runner/plugin-runner.d.ts.map +1 -1
- package/dist/builder/plugin-runner/plugin-runner.js +29 -26
- package/dist/builder/scanner/api/angular-decorators.d.ts +84 -0
- package/dist/builder/scanner/api/angular-decorators.d.ts.map +1 -0
- package/dist/builder/scanner/api/angular-decorators.js +157 -0
- package/dist/builder/scanner/api/component-api.extractor.d.ts +13 -0
- package/dist/builder/scanner/api/component-api.extractor.d.ts.map +1 -0
- package/dist/builder/scanner/api/component-api.extractor.js +104 -0
- package/dist/builder/scanner/api/doc-tags.d.ts +13 -0
- package/dist/builder/scanner/api/doc-tags.d.ts.map +1 -0
- package/dist/builder/scanner/api/doc-tags.js +101 -0
- package/dist/builder/scanner/api/export-index.d.ts +18 -0
- package/dist/builder/scanner/api/export-index.d.ts.map +1 -0
- package/dist/builder/scanner/api/export-index.js +22 -0
- package/dist/builder/scanner/api/member.extractor.d.ts +90 -0
- package/dist/builder/scanner/api/member.extractor.d.ts.map +1 -0
- package/dist/builder/scanner/api/member.extractor.js +270 -0
- package/dist/builder/scanner/api/pipe-api.extractor.d.ts +12 -0
- package/dist/builder/scanner/api/pipe-api.extractor.d.ts.map +1 -0
- package/dist/builder/scanner/api/pipe-api.extractor.js +52 -0
- package/dist/builder/scanner/api/service-api.extractor.d.ts +14 -0
- package/dist/builder/scanner/api/service-api.extractor.d.ts.map +1 -0
- package/dist/builder/scanner/api/service-api.extractor.js +119 -0
- package/dist/builder/scanner/api/setup.reader.d.ts +26 -0
- package/dist/builder/scanner/api/setup.reader.d.ts.map +1 -0
- package/dist/builder/scanner/api/setup.reader.js +89 -0
- package/dist/builder/scanner/api/type-collector.d.ts +24 -0
- package/dist/builder/scanner/api/type-collector.d.ts.map +1 -0
- package/dist/builder/scanner/api/type-collector.js +211 -0
- package/dist/builder/scanner/ast-utils.d.ts +8 -0
- package/dist/builder/scanner/ast-utils.d.ts.map +1 -1
- package/dist/builder/scanner/ast-utils.js +37 -1
- package/dist/builder/scanner/class-hierarchy.d.ts +5 -3
- package/dist/builder/scanner/class-hierarchy.d.ts.map +1 -1
- package/dist/builder/scanner/class-hierarchy.js +12 -6
- package/dist/builder/scanner/component.scanner.d.ts +60 -6
- package/dist/builder/scanner/component.scanner.d.ts.map +1 -1
- package/dist/builder/scanner/component.scanner.js +229 -58
- package/dist/builder/scanner/composition/compose-template.d.ts +36 -0
- package/dist/builder/scanner/composition/compose-template.d.ts.map +1 -0
- package/dist/builder/scanner/composition/compose-template.js +187 -0
- package/dist/builder/scanner/composition/declarables.d.ts +54 -0
- package/dist/builder/scanner/composition/declarables.d.ts.map +1 -0
- package/dist/builder/scanner/composition/declarables.js +182 -0
- package/dist/builder/scanner/composition/match-declarables.d.ts +43 -0
- package/dist/builder/scanner/composition/match-declarables.d.ts.map +1 -0
- package/dist/builder/scanner/composition/match-declarables.js +131 -0
- package/dist/builder/scanner/composition/read-composition.d.ts +77 -0
- package/dist/builder/scanner/composition/read-composition.d.ts.map +1 -0
- package/dist/builder/scanner/composition/read-composition.js +302 -0
- package/dist/builder/scanner/composition/template-elements.d.ts +12 -0
- package/dist/builder/scanner/composition/template-elements.d.ts.map +1 -0
- package/dist/builder/scanner/composition/template-elements.js +41 -0
- package/dist/builder/scanner/entry-point-discovery.d.ts +5 -0
- package/dist/builder/scanner/entry-point-discovery.d.ts.map +1 -1
- package/dist/builder/scanner/entry-point-discovery.js +14 -0
- package/dist/builder/scanner/entry-point.scanner.d.ts +3 -1
- package/dist/builder/scanner/entry-point.scanner.d.ts.map +1 -1
- package/dist/builder/scanner/entry-point.scanner.js +7 -6
- package/dist/builder/scanner/index.d.ts +4 -0
- package/dist/builder/scanner/index.d.ts.map +1 -1
- package/dist/builder/scanner/index.js +2 -0
- package/dist/builder/scanner/input.extractor.d.ts +31 -2
- package/dist/builder/scanner/input.extractor.d.ts.map +1 -1
- package/dist/builder/scanner/input.extractor.js +73 -17
- package/dist/builder/scanner/pipe.scanner.d.ts +29 -0
- package/dist/builder/scanner/pipe.scanner.d.ts.map +1 -0
- package/dist/builder/scanner/pipe.scanner.js +65 -0
- package/dist/builder/scanner/pseudo-states.d.ts +1 -0
- package/dist/builder/scanner/pseudo-states.d.ts.map +1 -1
- package/dist/builder/scanner/pseudo-states.js +1 -1
- package/dist/builder/scanner/scanner.d.ts +27 -3
- package/dist/builder/scanner/scanner.d.ts.map +1 -1
- package/dist/builder/scanner/scanner.js +68 -24
- package/dist/builder/scanner/service/angular-decorators.d.ts +80 -0
- package/dist/builder/scanner/service/angular-decorators.d.ts.map +1 -0
- package/dist/builder/scanner/service/angular-decorators.js +154 -0
- package/dist/builder/scanner/service/doc-tags.d.ts +13 -0
- package/dist/builder/scanner/service/doc-tags.d.ts.map +1 -0
- package/dist/builder/scanner/service/doc-tags.js +97 -0
- package/dist/builder/scanner/service/export-index.d.ts +18 -0
- package/dist/builder/scanner/service/export-index.d.ts.map +1 -0
- package/dist/builder/scanner/service/export-index.js +22 -0
- package/dist/builder/scanner/service/member.extractor.d.ts +65 -0
- package/dist/builder/scanner/service/member.extractor.d.ts.map +1 -0
- package/dist/builder/scanner/service/member.extractor.js +216 -0
- package/dist/builder/scanner/service/pipe-api.extractor.d.ts +12 -0
- package/dist/builder/scanner/service/pipe-api.extractor.d.ts.map +1 -0
- package/dist/builder/scanner/service/pipe-api.extractor.js +72 -0
- package/dist/builder/scanner/service/service-api.extractor.d.ts +14 -0
- package/dist/builder/scanner/service/service-api.extractor.d.ts.map +1 -0
- package/dist/builder/scanner/service/service-api.extractor.js +119 -0
- package/dist/builder/scanner/service/setup.reader.d.ts +26 -0
- package/dist/builder/scanner/service/setup.reader.d.ts.map +1 -0
- package/dist/builder/scanner/service/setup.reader.js +89 -0
- package/dist/builder/scanner/service/type-collector.d.ts +23 -0
- package/dist/builder/scanner/service/type-collector.d.ts.map +1 -0
- package/dist/builder/scanner/service/type-collector.js +210 -0
- package/dist/builder/scanner/service.scanner.d.ts +26 -0
- package/dist/builder/scanner/service.scanner.d.ts.map +1 -0
- package/dist/builder/scanner/service.scanner.js +61 -0
- package/dist/builder/scanner/showcase-diagnostics.d.ts +60 -1
- package/dist/builder/scanner/showcase-diagnostics.d.ts.map +1 -1
- package/dist/builder/scanner/showcase-diagnostics.js +123 -10
- package/dist/builder/scanner/showcase-states.d.ts +17 -0
- package/dist/builder/scanner/showcase-states.d.ts.map +1 -0
- package/dist/builder/scanner/showcase-states.js +58 -0
- package/dist/builder/scanner/source-file-cache.d.ts +26 -0
- package/dist/builder/scanner/source-file-cache.d.ts.map +1 -0
- package/dist/builder/scanner/source-file-cache.js +60 -0
- package/dist/builder/shared/prism-pipeline.d.ts +6 -0
- package/dist/builder/shared/prism-pipeline.d.ts.map +1 -1
- package/dist/builder/shared/prism-pipeline.js +71 -18
- package/dist/decorator/index.d.ts +1 -1
- package/dist/decorator/index.d.ts.map +1 -1
- package/dist/decorator/showcase.types.d.ts +102 -9
- package/dist/decorator/showcase.types.d.ts.map +1 -1
- package/dist/plugin/index.d.ts +6 -1
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +4 -0
- package/dist/plugin/pipe.types.d.ts +36 -0
- package/dist/plugin/pipe.types.d.ts.map +1 -0
- package/dist/plugin/pipe.types.js +1 -0
- package/dist/plugin/plugin.types.d.ts +184 -8
- package/dist/plugin/plugin.types.d.ts.map +1 -1
- package/dist/plugin/service.types.d.ts +124 -0
- package/dist/plugin/service.types.d.ts.map +1 -0
- package/dist/plugin/service.types.js +1 -0
- package/dist/plugin/status.d.ts +27 -0
- package/dist/plugin/status.d.ts.map +1 -0
- package/dist/plugin/status.js +26 -0
- package/dist/shared/composition.d.ts +30 -0
- package/dist/shared/composition.d.ts.map +1 -0
- package/dist/shared/composition.js +29 -0
- package/dist/shared/pseudo-state.type.d.ts +2 -1
- package/dist/shared/pseudo-state.type.d.ts.map +1 -1
- package/dist/shared/void-elements.d.ts +3 -0
- package/dist/shared/void-elements.d.ts.map +1 -0
- package/dist/shared/void-elements.js +2 -0
- package/package.json +1 -1
- package/src/builder/build/schema.json +6 -6
- package/src/builder/serve/schema.json +6 -6
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import type { ShowcaseImport } from '../../../decorator/showcase.types.js';
|
|
3
|
+
/** A component, directive or pipe that a template can use, and the module specifier a consumer imports it from. */
|
|
4
|
+
export interface Declarable {
|
|
5
|
+
/** The name it is exported under. */
|
|
6
|
+
name: string;
|
|
7
|
+
from: string;
|
|
8
|
+
kind: 'component' | 'directive' | 'pipe';
|
|
9
|
+
/** Of a component or directive, as written in its metadata: a list of selectors is one string. */
|
|
10
|
+
selector?: string;
|
|
11
|
+
/** Of a pipe: the name a template calls it by. */
|
|
12
|
+
pipeName?: string;
|
|
13
|
+
/** `false` for a class an NgModule declares, which only that module can bring into a template. */
|
|
14
|
+
standalone: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** What {@link readDeclarable} finds in a class: a {@link Declarable} before it is given a name and a module. */
|
|
17
|
+
export type DeclarableShape = Pick<Declarable, 'kind' | 'selector' | 'pipeName' | 'standalone'>;
|
|
18
|
+
/**
|
|
19
|
+
* Index every component, directive and pipe the library's entry points export
|
|
20
|
+
* by its selector or name, with or without `@Showcase`, so that a template can
|
|
21
|
+
* be matched against them. A class from a dependency that an entry point
|
|
22
|
+
* re-exports is read from its `.d.ts`. A class without a selector (or a pipe
|
|
23
|
+
* without a name) cannot be used in a template and is left out, as is
|
|
24
|
+
* everything that is not a component, directive or pipe.
|
|
25
|
+
*
|
|
26
|
+
* A class exported more than once keeps its first entry, as in
|
|
27
|
+
* `buildExportIndex`: callers put the secondary entry points before the
|
|
28
|
+
* primary one.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildDeclarableIndex(entries: ReadonlyArray<{
|
|
31
|
+
exports: ts.Symbol[];
|
|
32
|
+
importPath: string;
|
|
33
|
+
}>, checker: ts.TypeChecker): Declarable[];
|
|
34
|
+
/**
|
|
35
|
+
* Look up each `{ name, from }` of a showcase's `imports` without a program: the module is resolved the way a bundler
|
|
36
|
+
* does it, with the `paths` and the other options given, and the class is read from the file it lands in, following
|
|
37
|
+
* `export … from` up to five modules on. An entry that cannot be found, is not exported, or is not a component,
|
|
38
|
+
* directive or pipe (an NgModule or a service, say) comes back unresolved. A selector that only a checker could
|
|
39
|
+
* evaluate is not read.
|
|
40
|
+
*/
|
|
41
|
+
export declare function resolveShowcaseImports(imports: readonly ShowcaseImport[], containingFile: string, compilerOptions: ts.CompilerOptions): {
|
|
42
|
+
resolved: Declarable[];
|
|
43
|
+
unresolved: ShowcaseImport[];
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* What a class declares for templates: from `@Component`, `@Directive` or `@Pipe` in source, from the `ɵcmp`, `ɵdir`
|
|
47
|
+
* or `ɵpipe` that the compiler left in a `.d.ts`. `undefined` for a class that is neither, or has no selector or name.
|
|
48
|
+
* The `checker` evaluates a selector given as a constant; without one only a literal is read.
|
|
49
|
+
*
|
|
50
|
+
* A class is standalone unless it says otherwise, as in Angular since 19: with `standalone: false` in its decorator,
|
|
51
|
+
* or `false` as the `IsStandalone` type argument in a `.d.ts`.
|
|
52
|
+
*/
|
|
53
|
+
export declare function readDeclarable(classDecl: ts.ClassDeclaration, checker?: ts.TypeChecker): DeclarableShape | undefined;
|
|
54
|
+
//# sourceMappingURL=declarables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declarables.d.ts","sourceRoot":"","sources":["../../../../src/builder/scanner/composition/declarables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAI3E,mHAAmH;AACnH,MAAM,WAAW,UAAU;IACvB,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;IACzC,kGAAkG;IAClG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kGAAkG;IAClG,UAAU,EAAE,OAAO,CAAC;CACvB;AAED,iHAAiH;AACjH,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC,CAAC;AAgChG;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa,CAAC;IAAE,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,GAAG,UAAU,EAAE,CAoBhJ;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAClC,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,EAAE,CAAC,eAAe,GACpC;IAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAAC,UAAU,EAAE,cAAc,EAAE,CAAA;CAAE,CAgB1D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,WAAW,GAAG,eAAe,GAAG,SAAS,CA4BpH"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { isImportableName } from '../../manifest/manifest-imports.js';
|
|
3
|
+
import { findDecorator, getDecoratorArgument, readDecoratorField } from '../ast-utils.js';
|
|
4
|
+
/** How many modules a lookup follows from the one the import names: `export … from` and a re-exported import each count one. */
|
|
5
|
+
const MAX_REEXPORT_DEPTH = 5;
|
|
6
|
+
const DECORATED = [
|
|
7
|
+
{ decorator: 'Component', kind: 'component' },
|
|
8
|
+
{ decorator: 'Directive', kind: 'directive' },
|
|
9
|
+
{ decorator: 'Pipe', kind: 'pipe' }
|
|
10
|
+
];
|
|
11
|
+
/** The static members that Angular's compiler leaves in a `.d.ts`, each typed `ɵɵ…Declaration<Class, "selector" | "name", …>`. */
|
|
12
|
+
const COMPILED_MEMBERS = new Map([
|
|
13
|
+
['ɵcmp', 'component'],
|
|
14
|
+
['ɵdir', 'directive'],
|
|
15
|
+
['ɵpipe', 'pipe']
|
|
16
|
+
]);
|
|
17
|
+
/** The position of `IsStandalone` among the type arguments of `ɵɵComponentDeclaration`, `ɵɵDirectiveDeclaration` and `ɵɵPipeDeclaration`. */
|
|
18
|
+
const STANDALONE_ARGUMENT = { component: 7, directive: 7, pipe: 2 };
|
|
19
|
+
/** Where the declaration of a class can be read from: TypeScript source and its declaration files. */
|
|
20
|
+
const READABLE_EXTENSIONS = new Set([
|
|
21
|
+
ts.Extension.Ts,
|
|
22
|
+
ts.Extension.Tsx,
|
|
23
|
+
ts.Extension.Dts,
|
|
24
|
+
ts.Extension.Mts,
|
|
25
|
+
ts.Extension.Dmts,
|
|
26
|
+
ts.Extension.Cts,
|
|
27
|
+
ts.Extension.Dcts
|
|
28
|
+
]);
|
|
29
|
+
/**
|
|
30
|
+
* Index every component, directive and pipe the library's entry points export
|
|
31
|
+
* by its selector or name, with or without `@Showcase`, so that a template can
|
|
32
|
+
* be matched against them. A class from a dependency that an entry point
|
|
33
|
+
* re-exports is read from its `.d.ts`. A class without a selector (or a pipe
|
|
34
|
+
* without a name) cannot be used in a template and is left out, as is
|
|
35
|
+
* everything that is not a component, directive or pipe.
|
|
36
|
+
*
|
|
37
|
+
* A class exported more than once keeps its first entry, as in
|
|
38
|
+
* `buildExportIndex`: callers put the secondary entry points before the
|
|
39
|
+
* primary one.
|
|
40
|
+
*/
|
|
41
|
+
export function buildDeclarableIndex(entries, checker) {
|
|
42
|
+
const seen = new Set();
|
|
43
|
+
const declarables = [];
|
|
44
|
+
for (const { exports, importPath } of entries) {
|
|
45
|
+
for (const sym of exports) {
|
|
46
|
+
const resolved = sym.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(sym) : sym;
|
|
47
|
+
if (seen.has(resolved))
|
|
48
|
+
continue;
|
|
49
|
+
seen.add(resolved);
|
|
50
|
+
const classDecl = resolved.declarations?.find(ts.isClassDeclaration);
|
|
51
|
+
const shape = classDecl && readDeclarable(classDecl, checker);
|
|
52
|
+
// A default export, or one under a string name, cannot be imported by its name.
|
|
53
|
+
if (shape && isImportableName(sym.name))
|
|
54
|
+
declarables.push({ name: sym.name, from: importPath, ...shape });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return declarables;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Look up each `{ name, from }` of a showcase's `imports` without a program: the module is resolved the way a bundler
|
|
61
|
+
* does it, with the `paths` and the other options given, and the class is read from the file it lands in, following
|
|
62
|
+
* `export … from` up to five modules on. An entry that cannot be found, is not exported, or is not a component,
|
|
63
|
+
* directive or pipe (an NgModule or a service, say) comes back unresolved. A selector that only a checker could
|
|
64
|
+
* evaluate is not read.
|
|
65
|
+
*/
|
|
66
|
+
export function resolveShowcaseImports(imports, containingFile, compilerOptions) {
|
|
67
|
+
const options = { ...compilerOptions, module: ts.ModuleKind.ESNext, moduleResolution: ts.ModuleResolutionKind.Bundler };
|
|
68
|
+
const files = new Map();
|
|
69
|
+
const resolved = [];
|
|
70
|
+
const unresolved = [];
|
|
71
|
+
for (const entry of imports) {
|
|
72
|
+
const lookup = { options, files, visited: new Set() };
|
|
73
|
+
const classDecl = findExportedClass(entry.name, entry.from, containingFile, 0, lookup);
|
|
74
|
+
const shape = classDecl && readDeclarable(classDecl);
|
|
75
|
+
if (shape)
|
|
76
|
+
resolved.push({ name: entry.name, from: entry.from, ...shape });
|
|
77
|
+
else
|
|
78
|
+
unresolved.push(entry);
|
|
79
|
+
}
|
|
80
|
+
return { resolved, unresolved };
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* What a class declares for templates: from `@Component`, `@Directive` or `@Pipe` in source, from the `ɵcmp`, `ɵdir`
|
|
84
|
+
* or `ɵpipe` that the compiler left in a `.d.ts`. `undefined` for a class that is neither, or has no selector or name.
|
|
85
|
+
* The `checker` evaluates a selector given as a constant; without one only a literal is read.
|
|
86
|
+
*
|
|
87
|
+
* A class is standalone unless it says otherwise, as in Angular since 19: with `standalone: false` in its decorator,
|
|
88
|
+
* or `false` as the `IsStandalone` type argument in a `.d.ts`.
|
|
89
|
+
*/
|
|
90
|
+
export function readDeclarable(classDecl, checker) {
|
|
91
|
+
for (const { decorator, kind } of DECORATED) {
|
|
92
|
+
const found = findDecorator(classDecl, decorator);
|
|
93
|
+
if (!found)
|
|
94
|
+
continue;
|
|
95
|
+
const arg = getDecoratorArgument(found);
|
|
96
|
+
return shape(kind, arg && readDecoratorField(arg, kind === 'pipe' ? 'name' : 'selector', checker), arg && readDecoratorField(arg, 'standalone', checker) === false);
|
|
97
|
+
}
|
|
98
|
+
for (const member of classDecl.members) {
|
|
99
|
+
const kind = ts.isPropertyDeclaration(member) && ts.isIdentifier(member.name) ? COMPILED_MEMBERS.get(member.name.text) : undefined;
|
|
100
|
+
if (!kind || !ts.isPropertyDeclaration(member) || !member.type || !ts.isTypeReferenceNode(member.type))
|
|
101
|
+
continue;
|
|
102
|
+
const literal = member.type.typeArguments?.[1];
|
|
103
|
+
const isStandalone = member.type.typeArguments?.[STANDALONE_ARGUMENT[kind]];
|
|
104
|
+
const notStandalone = isStandalone !== undefined && ts.isLiteralTypeNode(isStandalone) && isStandalone.literal.kind === ts.SyntaxKind.FalseKeyword;
|
|
105
|
+
return shape(kind, literal && ts.isLiteralTypeNode(literal) && ts.isStringLiteral(literal.literal) ? literal.literal.text : undefined, notStandalone);
|
|
106
|
+
}
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
function shape(kind, value, notStandalone) {
|
|
110
|
+
if (typeof value !== 'string' || value === '')
|
|
111
|
+
return undefined;
|
|
112
|
+
const standalone = !notStandalone;
|
|
113
|
+
return kind === 'pipe' ? { kind, pipeName: value, standalone } : { kind, selector: value, standalone };
|
|
114
|
+
}
|
|
115
|
+
function findExportedClass(name, specifier, containingFile, depth, lookup) {
|
|
116
|
+
if (depth > MAX_REEXPORT_DEPTH)
|
|
117
|
+
return undefined;
|
|
118
|
+
const resolved = ts.resolveModuleName(specifier, containingFile, lookup.options, ts.sys).resolvedModule;
|
|
119
|
+
if (!resolved || !READABLE_EXTENSIONS.has(resolved.extension))
|
|
120
|
+
return undefined;
|
|
121
|
+
const sourceFile = readSourceFile(resolved.resolvedFileName, lookup.files);
|
|
122
|
+
const key = `${resolved.resolvedFileName}\0${name}`;
|
|
123
|
+
if (!sourceFile || lookup.visited.has(key))
|
|
124
|
+
return undefined;
|
|
125
|
+
lookup.visited.add(key);
|
|
126
|
+
return findExportInFile(name, sourceFile, depth, lookup);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* The class that `sourceFile` exports as `name`. An export of its own wins over what `export *` brings along,
|
|
130
|
+
* which is looked at only when there is none.
|
|
131
|
+
*/
|
|
132
|
+
function findExportInFile(name, sourceFile, depth, lookup) {
|
|
133
|
+
const reexportedAll = [];
|
|
134
|
+
for (const statement of sourceFile.statements) {
|
|
135
|
+
if (ts.isClassDeclaration(statement) && statement.name?.text === name && ts.getModifiers(statement)?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword)) {
|
|
136
|
+
return statement;
|
|
137
|
+
}
|
|
138
|
+
if (!ts.isExportDeclaration(statement) || statement.isTypeOnly)
|
|
139
|
+
continue;
|
|
140
|
+
const specifier = statement.moduleSpecifier && ts.isStringLiteral(statement.moduleSpecifier) ? statement.moduleSpecifier.text : undefined;
|
|
141
|
+
if (!statement.exportClause) {
|
|
142
|
+
if (specifier)
|
|
143
|
+
reexportedAll.push(specifier);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (!ts.isNamedExports(statement.exportClause))
|
|
147
|
+
continue;
|
|
148
|
+
const element = statement.exportClause.elements.find((e) => !e.isTypeOnly && e.name.text === name);
|
|
149
|
+
if (!element)
|
|
150
|
+
continue;
|
|
151
|
+
const exported = (element.propertyName ?? element.name).text;
|
|
152
|
+
return specifier ? findExportedClass(exported, specifier, sourceFile.fileName, depth + 1, lookup) : findLocalClass(exported, sourceFile, depth, lookup);
|
|
153
|
+
}
|
|
154
|
+
for (const specifier of reexportedAll) {
|
|
155
|
+
const found = findExportedClass(name, specifier, sourceFile.fileName, depth + 1, lookup);
|
|
156
|
+
if (found)
|
|
157
|
+
return found;
|
|
158
|
+
}
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
/** The class that `local` names inside `sourceFile`: declared there, or imported from another module, as `export { local }` can re-export either. */
|
|
162
|
+
function findLocalClass(local, sourceFile, depth, lookup) {
|
|
163
|
+
for (const statement of sourceFile.statements) {
|
|
164
|
+
if (ts.isClassDeclaration(statement) && statement.name?.text === local)
|
|
165
|
+
return statement;
|
|
166
|
+
if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier))
|
|
167
|
+
continue;
|
|
168
|
+
const bindings = statement.importClause?.namedBindings;
|
|
169
|
+
const element = bindings && ts.isNamedImports(bindings) ? bindings.elements.find((e) => e.name.text === local) : undefined;
|
|
170
|
+
if (element)
|
|
171
|
+
return findExportedClass((element.propertyName ?? element.name).text, statement.moduleSpecifier.text, sourceFile.fileName, depth + 1, lookup);
|
|
172
|
+
}
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
function readSourceFile(fileName, files) {
|
|
176
|
+
if (files.has(fileName))
|
|
177
|
+
return files.get(fileName);
|
|
178
|
+
const text = ts.sys.readFile(fileName);
|
|
179
|
+
const sourceFile = text === undefined ? undefined : ts.createSourceFile(fileName, text, ts.ScriptTarget.Latest);
|
|
180
|
+
files.set(fileName, sourceFile);
|
|
181
|
+
return sourceFile;
|
|
182
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type TmplAstNode } from '@angular/compiler';
|
|
2
|
+
import type { Declarable } from './declarables.js';
|
|
3
|
+
/** What a composed template uses of the declarables it can see, and what it uses that none of them declares. */
|
|
4
|
+
export interface DeclarableMatch {
|
|
5
|
+
/** Library matches that name something the author wrote, plus every explicit import. Deduplicated by from + name. */
|
|
6
|
+
imports: Declarable[];
|
|
7
|
+
/**
|
|
8
|
+
* Elements neither standard HTML nor matched by an imported component or directive: as in Angular, an element a
|
|
9
|
+
* directive matches (`<lib-outlet>`) counts as declared. Excludes ng-container, ng-template, ng-content.
|
|
10
|
+
*/
|
|
11
|
+
unknownElements: string[];
|
|
12
|
+
/** Pipe names no library or explicit pipe declares. */
|
|
13
|
+
unknownPipes: string[];
|
|
14
|
+
/** Elements two or more imported library components match, which Angular rejects with NG0300. */
|
|
15
|
+
ambiguous: {
|
|
16
|
+
element: string;
|
|
17
|
+
classes: string[];
|
|
18
|
+
}[];
|
|
19
|
+
/** Library matches left out by the written-name rule, for a notice. */
|
|
20
|
+
skipped: {
|
|
21
|
+
element: string;
|
|
22
|
+
className: string;
|
|
23
|
+
}[];
|
|
24
|
+
/** The library classes the template uses that are not standalone, which no wrapper can import: their NgModule has to. */
|
|
25
|
+
notStandalone: string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Decide what the wrapper of a composed template imports, and find what the template uses that nothing declares.
|
|
29
|
+
*
|
|
30
|
+
* A library class is imported when its selector matches an element (or an `<ng-template>`) of the template and the
|
|
31
|
+
* part that matched names something the author wrote: a custom element, which has a `-` in its name, or an attribute
|
|
32
|
+
* that is no DOM property of the element. A class does not count. So `<input type="email">` does not pull in a
|
|
33
|
+
* library directive for `input[type=email]`, which a consumer of the library would not get without importing it
|
|
34
|
+
* either. A library pipe is imported when the template calls it by name. The `explicit` declarables, the resolved
|
|
35
|
+
* `imports` of the showcase, are always imported, and they declare elements and pipes like the library does.
|
|
36
|
+
*
|
|
37
|
+
* A library class that is not standalone is never imported, and declares nothing: only its NgModule, as an explicit
|
|
38
|
+
* import, brings it into a template.
|
|
39
|
+
*
|
|
40
|
+
* Throws what `@angular/compiler` throws, for a selector it cannot parse, say.
|
|
41
|
+
*/
|
|
42
|
+
export declare function matchDeclarables(nodes: readonly TmplAstNode[], library: readonly Declarable[], explicit: readonly Declarable[]): DeclarableMatch;
|
|
43
|
+
//# sourceMappingURL=match-declarables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match-declarables.d.ts","sourceRoot":"","sources":["../../../../src/builder/scanner/composition/match-declarables.ts"],"names":[],"mappings":"AAAA,OAAO,EAOH,KAAK,WAAW,EAEnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,gHAAgH;AAChH,MAAM,WAAW,eAAe;IAC5B,qHAAqH;IACrH,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB;;;OAGG;IACH,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,uDAAuD;IACvD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iGAAiG;IACjG,SAAS,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IACpD,uEAAuE;IACvE,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClD,yHAAyH;IACzH,aAAa,EAAE,MAAM,EAAE,CAAC;CAC3B;AAiBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,QAAQ,EAAE,SAAS,UAAU,EAAE,GAAG,eAAe,CA4EhJ"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { CombinedRecursiveAstVisitor, CssSelector, DomElementSchemaRegistry, SelectorMatcher, TmplAstElement } from '@angular/compiler';
|
|
2
|
+
import { elementSelector, localName } from './template-elements.js';
|
|
3
|
+
/** Elements that Angular renders itself, which the DOM schema does not list. */
|
|
4
|
+
const ANGULAR_ELEMENTS = new Set(['ng-container', 'ng-template', 'ng-content']);
|
|
5
|
+
let domSchema;
|
|
6
|
+
/**
|
|
7
|
+
* Decide what the wrapper of a composed template imports, and find what the template uses that nothing declares.
|
|
8
|
+
*
|
|
9
|
+
* A library class is imported when its selector matches an element (or an `<ng-template>`) of the template and the
|
|
10
|
+
* part that matched names something the author wrote: a custom element, which has a `-` in its name, or an attribute
|
|
11
|
+
* that is no DOM property of the element. A class does not count. So `<input type="email">` does not pull in a
|
|
12
|
+
* library directive for `input[type=email]`, which a consumer of the library would not get without importing it
|
|
13
|
+
* either. A library pipe is imported when the template calls it by name. The `explicit` declarables, the resolved
|
|
14
|
+
* `imports` of the showcase, are always imported, and they declare elements and pipes like the library does.
|
|
15
|
+
*
|
|
16
|
+
* A library class that is not standalone is never imported, and declares nothing: only its NgModule, as an explicit
|
|
17
|
+
* import, brings it into a template.
|
|
18
|
+
*
|
|
19
|
+
* Throws what `@angular/compiler` throws, for a selector it cannot parse, say.
|
|
20
|
+
*/
|
|
21
|
+
export function matchDeclarables(nodes, library, explicit) {
|
|
22
|
+
const schema = (domSchema ??= new DomElementSchemaRegistry());
|
|
23
|
+
const walker = new TemplateWalker();
|
|
24
|
+
const matcher = new SelectorMatcher();
|
|
25
|
+
const addSelectables = (declarables, isExplicit) => {
|
|
26
|
+
for (const declarable of declarables) {
|
|
27
|
+
if (declarable.selector)
|
|
28
|
+
matcher.addSelectables(CssSelector.parse(declarable.selector), { declarable, explicit: isExplicit });
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
for (const node of nodes)
|
|
32
|
+
walker.visit(node);
|
|
33
|
+
addSelectables(library, false);
|
|
34
|
+
addSelectables(explicit, true);
|
|
35
|
+
const matches = walker.nodes.map((node) => {
|
|
36
|
+
const tag = node instanceof TmplAstElement ? node.name : 'ng-template';
|
|
37
|
+
const hits = [];
|
|
38
|
+
matcher.match(elementSelector(node), (part, hit) => hits.push({ ...hit, written: hit.explicit || namesWritten(part, tag, schema) }));
|
|
39
|
+
return { node, hits };
|
|
40
|
+
});
|
|
41
|
+
const imports = new Map();
|
|
42
|
+
const add = (declarable) => {
|
|
43
|
+
if (!imports.has(key(declarable)))
|
|
44
|
+
imports.set(key(declarable), declarable);
|
|
45
|
+
};
|
|
46
|
+
const notStandalone = new Map();
|
|
47
|
+
const use = (declarable, isExplicit) => {
|
|
48
|
+
if (isExplicit || declarable.standalone)
|
|
49
|
+
add(declarable);
|
|
50
|
+
else
|
|
51
|
+
notStandalone.set(key(declarable), declarable);
|
|
52
|
+
};
|
|
53
|
+
explicit.forEach(add);
|
|
54
|
+
for (const { hits } of matches) {
|
|
55
|
+
for (const hit of hits)
|
|
56
|
+
if (hit.written)
|
|
57
|
+
use(hit.declarable, hit.explicit);
|
|
58
|
+
}
|
|
59
|
+
for (const declarable of library) {
|
|
60
|
+
if (declarable.pipeName !== undefined && walker.pipes.has(declarable.pipeName))
|
|
61
|
+
use(declarable, false);
|
|
62
|
+
}
|
|
63
|
+
const isImported = (declarable) => imports.has(key(declarable));
|
|
64
|
+
const unknownElements = new Set();
|
|
65
|
+
const ambiguous = new Map();
|
|
66
|
+
const skipped = new Map();
|
|
67
|
+
for (const { node, hits } of matches) {
|
|
68
|
+
const element = displayName(node);
|
|
69
|
+
const libraryHits = hits.filter((hit) => !hit.explicit);
|
|
70
|
+
const components = new Map(libraryHits.filter((hit) => hit.declarable.kind === 'component' && isImported(hit.declarable)).map((hit) => [key(hit.declarable), hit.declarable.name]));
|
|
71
|
+
if (components.size > 1) {
|
|
72
|
+
const classes = [...components.values()].sort();
|
|
73
|
+
ambiguous.set(`${element} ${classes.join(' ')}`, { element, classes });
|
|
74
|
+
}
|
|
75
|
+
for (const { declarable, written } of libraryHits) {
|
|
76
|
+
if (!written && declarable.standalone && !isImported(declarable))
|
|
77
|
+
skipped.set(`${element} ${declarable.name}`, { element, className: declarable.name });
|
|
78
|
+
}
|
|
79
|
+
if (node instanceof TmplAstElement && !ANGULAR_ELEMENTS.has(element) && !schema.hasElement(node.name, []) && !hits.some((hit) => isImported(hit.declarable))) {
|
|
80
|
+
unknownElements.add(element);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const declaredPipes = new Set([...library.filter((declarable) => declarable.standalone), ...explicit].map((declarable) => declarable.pipeName));
|
|
84
|
+
return {
|
|
85
|
+
imports: [...imports.values()],
|
|
86
|
+
unknownElements: [...unknownElements],
|
|
87
|
+
unknownPipes: [...walker.pipes].filter((pipe) => !declaredPipes.has(pipe)),
|
|
88
|
+
ambiguous: [...ambiguous.values()],
|
|
89
|
+
skipped: [...skipped.values()],
|
|
90
|
+
notStandalone: [...notStandalone.values()].filter((declarable) => !isImported(declarable)).map((declarable) => declarable.name)
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** Every element and `<ng-template>` of a template, also those in control flow blocks, and every pipe its expressions call. */
|
|
94
|
+
class TemplateWalker extends CombinedRecursiveAstVisitor {
|
|
95
|
+
nodes = [];
|
|
96
|
+
/** Pipe names, in the order of their first use. */
|
|
97
|
+
pipes = new Set();
|
|
98
|
+
visitElement(element) {
|
|
99
|
+
this.nodes.push(element);
|
|
100
|
+
super.visitElement(element);
|
|
101
|
+
}
|
|
102
|
+
visitTemplate(template) {
|
|
103
|
+
this.nodes.push(template);
|
|
104
|
+
super.visitTemplate(template);
|
|
105
|
+
}
|
|
106
|
+
visitPipe(pipe, context) {
|
|
107
|
+
this.pipes.add(pipe.name);
|
|
108
|
+
return super.visitPipe(pipe, context);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Whether the part of a selector that matched names something the author wrote: a custom element, or an attribute
|
|
113
|
+
* that is no DOM property of `tag` (`libInput`, but neither `type` nor `tabindex`). Classes do not count.
|
|
114
|
+
*/
|
|
115
|
+
function namesWritten(part, tag, schema) {
|
|
116
|
+
if (part.element?.includes('-'))
|
|
117
|
+
return true;
|
|
118
|
+
return part.attrs.some((name, i) => i % 2 === 0 && !schema.hasProperty(tag, schema.getMappedPropName(camelCase(name)), []));
|
|
119
|
+
}
|
|
120
|
+
/** `aria-label` → `ariaLabel`, the way Angular maps an attribute to a property. */
|
|
121
|
+
function camelCase(name) {
|
|
122
|
+
return name.replace(/-+([a-z0-9])/g, (_, letter) => letter.toUpperCase());
|
|
123
|
+
}
|
|
124
|
+
/** The element as the author wrote it; a template that `*libIf` creates is named after its element. */
|
|
125
|
+
function displayName(node) {
|
|
126
|
+
return localName(node instanceof TmplAstElement ? node.name : (node.tagName ?? 'ng-template'));
|
|
127
|
+
}
|
|
128
|
+
/** Class names have no spaces, so this tells apart every name and module pair. */
|
|
129
|
+
function key({ name, from }) {
|
|
130
|
+
return `${name} ${from}`;
|
|
131
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type ts from 'typescript';
|
|
2
|
+
import type { ShowcaseConfig, ShowcaseImport } from '../../../decorator/showcase.types.js';
|
|
3
|
+
import type { ComponentComposition, InputMeta } from '../../../plugin/plugin.types.js';
|
|
4
|
+
import { type Declarable } from './declarables.js';
|
|
5
|
+
type Report = (message: string) => void;
|
|
6
|
+
/** What the compositions of every showcase in one scan are read against. */
|
|
7
|
+
export interface CompositionContext {
|
|
8
|
+
/**
|
|
9
|
+
* The components, directives and pipes the library's entry points export, read when a showcase first asks for
|
|
10
|
+
* them; `undefined` when they could not be read.
|
|
11
|
+
*/
|
|
12
|
+
declarables(): readonly Declarable[] | undefined;
|
|
13
|
+
/** Look up the `imports` of a showcase written in `containingFile`. */
|
|
14
|
+
resolveImports(imports: readonly ShowcaseImport[], containingFile: string): {
|
|
15
|
+
resolved: Declarable[];
|
|
16
|
+
unresolved: ShowcaseImport[];
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** The showcased component or directive, as the scan read it. */
|
|
20
|
+
export interface CompositionSubject {
|
|
21
|
+
className: string;
|
|
22
|
+
filePath: string;
|
|
23
|
+
selector: string;
|
|
24
|
+
isDirective: boolean;
|
|
25
|
+
/** A wrapper can only import a standalone subject. */
|
|
26
|
+
standalone: boolean;
|
|
27
|
+
inputs: InputMeta[];
|
|
28
|
+
config: ShowcaseConfig;
|
|
29
|
+
/** The argument of `@Showcase`, which the messages point into. */
|
|
30
|
+
configNode: ts.Expression;
|
|
31
|
+
/**
|
|
32
|
+
* Where each entry of `config.variants` and `config.imports` is written in `configNode`, which differs from its
|
|
33
|
+
* position in the list after the scan dropped an entry before it. Without it, the position in the list.
|
|
34
|
+
*/
|
|
35
|
+
sources?: {
|
|
36
|
+
variants?: readonly number[];
|
|
37
|
+
imports?: readonly number[];
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The context of one scan: the library's declarables, and the lookup of a showcase's `imports` with the scan's
|
|
42
|
+
* compiler options.
|
|
43
|
+
*
|
|
44
|
+
* `readDeclarables` runs once, for the first showcase that composes, so that a library without compositions pays
|
|
45
|
+
* nothing for them on any scan. Its declarables come without those whose selector Angular cannot parse, each named
|
|
46
|
+
* once in a notice, so that one of them cannot fail every composition. When it throws, that is one diagnostic, and no
|
|
47
|
+
* showcase of the scan has a composition.
|
|
48
|
+
*/
|
|
49
|
+
export declare function createCompositionContext(readDeclarables: () => readonly Declarable[], compilerOptions: ts.CompilerOptions, reporters: {
|
|
50
|
+
report: Report;
|
|
51
|
+
notify: Report;
|
|
52
|
+
}): CompositionContext;
|
|
53
|
+
/**
|
|
54
|
+
* Read the compositions of a showcase. A variant is composed when it has a `template` or a host template, its own
|
|
55
|
+
* `host` or else the showcase's; a showcase without variants is one variant. A directive's `template` without a host
|
|
56
|
+
* template renders inside the element of its string or object host, if it has one. Each composed variant gets its
|
|
57
|
+
* template from {@link composeTemplate}, checked with Angular's parser against the library and the showcase's
|
|
58
|
+
* `imports`, and variants with the same template and the same unbound inputs share a case.
|
|
59
|
+
*
|
|
60
|
+
* Each problem is reported against the field it comes from, with the showcase's file, line and variant, and leaves
|
|
61
|
+
* that variant out: it renders as it would without `template` and `host`. Only what Angular may still accept is a
|
|
62
|
+
* notice: an import ng-prism cannot read, an element or a pipe nothing declares while there is one, a library class
|
|
63
|
+
* that matches only by standard attributes, and one that is not standalone, which only its NgModule can bring in. A
|
|
64
|
+
* subject that is not standalone has no composition at all.
|
|
65
|
+
*
|
|
66
|
+
* Mutates `config`: a composed variant loses the HTML `content` of a component inside a host template, and the
|
|
67
|
+
* inputs that the template sets on the subject, each with a diagnostic.
|
|
68
|
+
*
|
|
69
|
+
* `undefined` when no variant is composed. Also when `@angular/compiler` throws, which is one diagnostic for the
|
|
70
|
+
* showcase, so that the build goes on, and when the library's declarables could not be read.
|
|
71
|
+
*/
|
|
72
|
+
export declare function readComposition(subject: CompositionSubject, context: CompositionContext, reporters: {
|
|
73
|
+
report: Report;
|
|
74
|
+
notify: Report;
|
|
75
|
+
}): ComponentComposition | undefined;
|
|
76
|
+
export {};
|
|
77
|
+
//# sourceMappingURL=read-composition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-composition.d.ts","sourceRoot":"","sources":["../../../../src/builder/scanner/composition/read-composition.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAA+B,cAAc,EAAE,cAAc,EAAW,MAAM,sCAAsC,CAAC;AACjI,OAAO,KAAK,EAAE,oBAAoB,EAAmB,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAOxG,OAAO,EAAE,KAAK,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AAG3E,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAExC,4EAA4E;AAC5E,MAAM,WAAW,kBAAkB;IAC/B;;;OAGG;IACH,WAAW,IAAI,SAAS,UAAU,EAAE,GAAG,SAAS,CAAC;IACjD,uEAAuE;IACvE,cAAc,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;QAAC,UAAU,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;CACxI;AAED,iEAAiE;AACjE,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,sDAAsD;IACtD,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,kEAAkE;IAClE,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;IAC1B;;;OAGG;IACH,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;CAC3E;AAWD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACpC,eAAe,EAAE,MAAM,SAAS,UAAU,EAAE,EAC5C,eAAe,EAAE,EAAE,CAAC,eAAe,EACnC,SAAS,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC9C,kBAAkB,CAUpB;AA0BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAC3B,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC9C,oBAAoB,GAAG,SAAS,CA0KlC"}
|