@ng-prism/core 22.2.1 → 22.4.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 +34 -36
- package/builders.json +11 -11
- package/dist/app/canvas/canvas-bg.styles.d.ts +7 -12
- package/dist/app/canvas/canvas-bg.styles.d.ts.map +1 -1
- package/dist/app/canvas/canvas-bg.styles.js +37 -22
- package/dist/app/canvas/measure-geometry.d.ts +140 -0
- package/dist/app/canvas/measure-geometry.d.ts.map +1 -0
- package/dist/app/canvas/measure-geometry.js +217 -0
- package/dist/app/canvas/measure-keyboard.d.ts +20 -0
- package/dist/app/canvas/measure-keyboard.d.ts.map +1 -0
- package/dist/app/canvas/measure-keyboard.js +34 -0
- package/dist/app/canvas/measure-quad.d.ts +114 -0
- package/dist/app/canvas/measure-quad.d.ts.map +1 -0
- package/dist/app/canvas/measure-quad.js +173 -0
- package/dist/app/canvas/measure-snap.d.ts +35 -0
- package/dist/app/canvas/measure-snap.d.ts.map +1 -0
- package/dist/app/canvas/measure-snap.js +63 -0
- package/dist/app/canvas/prism-canvas-bg-pill.component.d.ts.map +1 -1
- package/dist/app/canvas/prism-canvas-bg-pill.component.js +3 -18
- package/dist/app/canvas/prism-canvas-measure.component.d.ts +142 -0
- package/dist/app/canvas/prism-canvas-measure.component.d.ts.map +1 -0
- package/dist/app/canvas/prism-canvas-measure.component.js +554 -0
- package/dist/app/canvas/prism-canvas-pin-row.component.d.ts +23 -0
- package/dist/app/canvas/prism-canvas-pin-row.component.d.ts.map +1 -0
- package/dist/app/canvas/prism-canvas-pin-row.component.js +64 -0
- package/dist/app/canvas/prism-canvas-rulers.component.d.ts +1 -0
- package/dist/app/canvas/prism-canvas-rulers.component.d.ts.map +1 -1
- package/dist/app/canvas/prism-canvas-rulers.component.js +9 -14
- package/dist/app/canvas/prism-canvas-toolbar.component.d.ts +28 -28
- package/dist/app/canvas/prism-canvas-toolbar.component.d.ts.map +1 -1
- package/dist/app/canvas/prism-canvas-toolbar.component.js +124 -162
- package/dist/app/canvas/prism-template-popover.component.d.ts.map +1 -1
- package/dist/app/canvas/prism-template-popover.component.js +8 -49
- package/dist/app/canvas/viewport-snap.d.ts +12 -0
- package/dist/app/canvas/viewport-snap.d.ts.map +1 -0
- package/dist/app/canvas/viewport-snap.js +23 -0
- package/dist/app/component-head/head-metrics.d.ts +2 -2
- package/dist/app/component-head/head-metrics.d.ts.map +1 -1
- package/dist/app/component-head/head-metrics.js +3 -3
- package/dist/app/component-head/prism-component-head.component.d.ts +3 -3
- package/dist/app/component-head/prism-component-head.component.d.ts.map +1 -1
- package/dist/app/component-head/prism-component-head.component.js +24 -64
- package/dist/app/component-head/prism-head-gauge.component.d.ts.map +1 -1
- package/dist/app/component-head/prism-head-gauge.component.js +4 -36
- package/dist/app/component-head/prism-head-info.component.d.ts +1 -1
- package/dist/app/component-head/prism-head-info.component.d.ts.map +1 -1
- package/dist/app/component-head/prism-head-info.component.js +4 -37
- package/dist/app/component-head/prism-stat.component.d.ts +1 -1
- package/dist/app/component-head/prism-stat.component.d.ts.map +1 -1
- package/dist/app/component-head/prism-stat.component.js +4 -15
- package/dist/app/controls/boolean-control.component.d.ts.map +1 -1
- package/dist/app/controls/boolean-control.component.js +4 -12
- package/dist/app/controls/json-control.component.d.ts.map +1 -1
- package/dist/app/controls/json-control.component.js +4 -24
- package/dist/app/controls/number-control.component.d.ts.map +1 -1
- package/dist/app/controls/number-control.component.js +4 -11
- package/dist/app/controls/string-control.component.d.ts.map +1 -1
- package/dist/app/controls/string-control.component.js +4 -11
- package/dist/app/controls/union-control.component.d.ts.map +1 -1
- package/dist/app/controls/union-control.component.js +4 -16
- package/dist/app/directives/prism-resizer.directive.d.ts +24 -1
- package/dist/app/directives/prism-resizer.directive.d.ts.map +1 -1
- package/dist/app/directives/prism-resizer.directive.js +44 -7
- package/dist/app/directives/resize-value.d.ts +22 -0
- package/dist/app/directives/resize-value.d.ts.map +1 -0
- package/dist/app/directives/resize-value.js +23 -0
- 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 +16 -22
- package/dist/app/header/prism-header-widget-host.component.d.ts.map +1 -1
- package/dist/app/header/prism-header-widget-host.component.js +4 -8
- package/dist/app/header/prism-header.component.d.ts.map +1 -1
- package/dist/app/header/prism-header.component.js +9 -78
- package/dist/app/hmr.d.ts.map +1 -1
- package/dist/app/icons/icon-registry.d.ts +2 -2
- package/dist/app/icons/icon-registry.d.ts.map +1 -1
- package/dist/app/icons/icon-registry.js +5 -3
- package/dist/app/icons/prism-icon.component.d.ts +2 -2
- package/dist/app/icons/prism-icon.component.d.ts.map +1 -1
- package/dist/app/icons/prism-icon.component.js +9 -9
- package/dist/app/index.d.ts +3 -3
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/index.js +17 -24
- package/dist/app/layout-menu/prism-layout-menu.component.d.ts.map +1 -1
- package/dist/app/layout-menu/prism-layout-menu.component.js +3 -77
- package/dist/app/overview/overview-panel.js +1 -1
- package/dist/app/overview/overview-visibility.d.ts +1 -1
- package/dist/app/overview/overview-visibility.d.ts.map +1 -1
- package/dist/app/overview/overview-visibility.js +1 -1
- package/dist/app/overview/prism-overview-cell.component.d.ts +2 -2
- package/dist/app/overview/prism-overview-cell.component.d.ts.map +1 -1
- package/dist/app/overview/prism-overview-cell.component.js +17 -25
- package/dist/app/overview/prism-overview.component.d.ts +2 -2
- package/dist/app/overview/prism-overview.component.d.ts.map +1 -1
- package/dist/app/overview/prism-overview.component.js +6 -14
- package/dist/app/page-renderer/prism-page-renderer.component.d.ts.map +1 -1
- package/dist/app/page-renderer/prism-page-renderer.component.js +4 -17
- package/dist/app/panels/a11y/a11y-audit.service.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-audit.service.js +14 -2
- package/dist/app/panels/a11y/a11y-core.plugin.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-core.plugin.js +1 -1
- package/dist/app/panels/a11y/a11y-dom-utils.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-dom-utils.js +9 -6
- package/dist/app/panels/a11y/a11y-header-badge.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-header-badge.component.js +6 -22
- package/dist/app/panels/a11y/a11y-keyboard-overlay.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-keyboard-overlay.component.js +6 -25
- package/dist/app/panels/a11y/a11y-keyboard.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-keyboard.component.js +5 -36
- package/dist/app/panels/a11y/a11y-keyboard.service.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-keyboard.service.js +2 -2
- package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-overlay-host.component.js +5 -32
- package/dist/app/panels/a11y/a11y-panel-state.service.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-panel.component.d.ts +1 -1
- package/dist/app/panels/a11y/a11y-panel.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-panel.component.js +7 -69
- package/dist/app/panels/a11y/a11y-perspective.service.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-score.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-score.component.js +4 -31
- package/dist/app/panels/a11y/a11y-sr-overlay.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-sr-overlay.component.js +8 -28
- package/dist/app/panels/a11y/a11y-sr.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-sr.component.js +5 -28
- package/dist/app/panels/a11y/a11y-sr.service.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-sr.service.js +4 -7
- package/dist/app/panels/a11y/a11y-summary.d.ts +3 -4
- package/dist/app/panels/a11y/a11y-summary.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-summary.js +5 -9
- package/dist/app/panels/a11y/a11y-thresholds.d.ts +1 -1
- package/dist/app/panels/a11y/a11y-thresholds.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-thresholds.js +2 -2
- package/dist/app/panels/a11y/a11y-tree.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-tree.component.js +9 -46
- package/dist/app/panels/a11y/a11y-tree.service.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-tree.service.js +3 -5
- package/dist/app/panels/a11y/a11y-violations.component.d.ts.map +1 -1
- package/dist/app/panels/a11y/a11y-violations.component.js +7 -58
- package/dist/app/panels/a11y/a11y.types.d.ts +1 -1
- package/dist/app/panels/a11y/a11y.types.d.ts.map +1 -1
- package/dist/app/panels/builtin-header-widgets.js +2 -2
- package/dist/app/panels/builtin-navigation-decorations.d.ts +1 -1
- package/dist/app/panels/builtin-navigation-decorations.d.ts.map +1 -1
- package/dist/app/panels/builtin-navigation-decorations.js +3 -3
- package/dist/app/panels/builtin-panels.d.ts.map +1 -1
- package/dist/app/panels/builtin-panels.js +2 -7
- package/dist/app/panels/controls/controls-plugin.js +3 -3
- package/dist/app/panels/controls/non-editable-input-types.d.ts.map +1 -1
- package/dist/app/panels/controls/non-editable-input-types.js +2 -6
- package/dist/app/panels/controls/prism-controls-panel.component.d.ts.map +1 -1
- package/dist/app/panels/controls/prism-controls-panel.component.js +5 -95
- package/dist/app/panels/events/events-plugin.js +3 -3
- package/dist/app/panels/events/prism-events-panel.component.d.ts.map +1 -1
- package/dist/app/panels/events/prism-events-panel.component.js +5 -23
- package/dist/app/panels/events/prism-json-node.component.d.ts.map +1 -1
- package/dist/app/panels/events/prism-json-node.component.js +4 -86
- package/dist/app/panels/events/prism-json-node.utils.d.ts.map +1 -1
- package/dist/app/panels/panel-host/panel-badge.d.ts +1 -1
- package/dist/app/panels/panel-host/panel-badge.d.ts.map +1 -1
- package/dist/app/panels/panel-host/panel-badge.js +2 -4
- package/dist/app/panels/panel-host/prism-panel-host.component.d.ts +1 -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 +12 -67
- package/dist/app/provide-prism.d.ts +1 -1
- package/dist/app/provide-prism.d.ts.map +1 -1
- package/dist/app/provide-prism.js +8 -12
- package/dist/app/renderer/known-inputs.d.ts +1 -1
- package/dist/app/renderer/known-inputs.d.ts.map +1 -1
- package/dist/app/renderer/known-inputs.js +1 -1
- package/dist/app/renderer/overlay-resolver.d.ts +17 -3
- package/dist/app/renderer/overlay-resolver.d.ts.map +1 -1
- package/dist/app/renderer/overlay-resolver.js +10 -5
- package/dist/app/renderer/prism-renderer.component.d.ts +28 -3
- package/dist/app/renderer/prism-renderer.component.d.ts.map +1 -1
- package/dist/app/renderer/prism-renderer.component.js +107 -80
- package/dist/app/renderer/projectable-content.d.ts.map +1 -1
- package/dist/app/renderer/projectable-content.js +4 -6
- package/dist/app/renderer/snippet-generator.d.ts +1 -1
- package/dist/app/renderer/snippet-generator.d.ts.map +1 -1
- package/dist/app/renderer/snippet-generator.js +7 -22
- package/dist/app/services/navigation-item.types.d.ts +1 -1
- package/dist/app/services/navigation-item.types.d.ts.map +1 -1
- package/dist/app/services/prism-canvas.service.d.ts +33 -0
- package/dist/app/services/prism-canvas.service.d.ts.map +1 -1
- package/dist/app/services/prism-canvas.service.js +71 -6
- package/dist/app/services/prism-capture.service.d.ts +24 -50
- package/dist/app/services/prism-capture.service.d.ts.map +1 -1
- package/dist/app/services/prism-capture.service.js +62 -146
- package/dist/app/services/prism-event-log.service.d.ts.map +1 -1
- package/dist/app/services/prism-event-log.service.js +1 -4
- package/dist/app/services/prism-layout.service.d.ts.map +1 -1
- package/dist/app/services/prism-layout.service.js +5 -4
- package/dist/app/services/prism-manifest.service.d.ts +1 -1
- package/dist/app/services/prism-manifest.service.d.ts.map +1 -1
- package/dist/app/services/prism-manifest.service.js +1 -1
- package/dist/app/services/prism-measure.service.d.ts +44 -0
- package/dist/app/services/prism-measure.service.d.ts.map +1 -0
- package/dist/app/services/prism-measure.service.js +91 -0
- package/dist/app/services/prism-navigation.service.d.ts +1 -1
- package/dist/app/services/prism-navigation.service.d.ts.map +1 -1
- package/dist/app/services/prism-navigation.service.js +5 -13
- package/dist/app/services/prism-panel.service.d.ts +2 -2
- package/dist/app/services/prism-panel.service.d.ts.map +1 -1
- package/dist/app/services/prism-panel.service.js +4 -7
- package/dist/app/services/prism-persistence.service.d.ts.map +1 -1
- package/dist/app/services/prism-persistence.service.js +9 -11
- package/dist/app/services/prism-plugin.service.d.ts.map +1 -1
- package/dist/app/services/prism-renderer.service.d.ts.map +1 -1
- package/dist/app/services/prism-renderer.service.js +5 -9
- package/dist/app/services/prism-search.service.d.ts.map +1 -1
- package/dist/app/services/prism-search.service.js +1 -2
- package/dist/app/services/prism-theme.service.d.ts.map +1 -1
- package/dist/app/services/prism-theme.service.js +6 -4
- package/dist/app/services/prism-url-state.service.d.ts.map +1 -1
- package/dist/app/services/prism-url-state.service.js +4 -10
- package/dist/app/services/prism-variant-bg.service.d.ts +10 -24
- package/dist/app/services/prism-variant-bg.service.d.ts.map +1 -1
- package/dist/app/services/prism-variant-bg.service.js +13 -29
- package/dist/app/shared/prism-metric-badge.component.d.ts +9 -15
- package/dist/app/shared/prism-metric-badge.component.d.ts.map +1 -1
- package/dist/app/shared/prism-metric-badge.component.js +13 -32
- package/dist/app/shell/prism-shell.component.d.ts.map +1 -1
- package/dist/app/shell/prism-shell.component.js +26 -125
- package/dist/app/sidebar/navigation-decorations.d.ts +4 -4
- package/dist/app/sidebar/navigation-decorations.d.ts.map +1 -1
- package/dist/app/sidebar/navigation-decorations.js +3 -3
- package/dist/app/sidebar/prism-sidebar.component.d.ts +3 -3
- package/dist/app/sidebar/prism-sidebar.component.d.ts.map +1 -1
- package/dist/app/sidebar/prism-sidebar.component.js +21 -156
- package/dist/app/theme/prism-default-theme.d.ts.map +1 -1
- package/dist/app/theme/prism-default-theme.js +6 -6
- package/dist/app/tokens/prism-tokens.d.ts.map +1 -1
- package/dist/app/tokens/prism-tokens.js +1 -1
- package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts.map +1 -1
- package/dist/app/variant-ribbon/prism-variant-ribbon.component.js +4 -49
- package/dist/app/variant-ribbon/spectrum.d.ts +1 -1
- package/dist/app/variant-ribbon/spectrum.d.ts.map +1 -1
- package/dist/app/variant-ribbon/spectrum.js +1 -1
- package/dist/app/view-tab-bar/next-view-id.d.ts +1 -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 +2 -4
- 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 +5 -17
- 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 +4 -27
- package/dist/builder/a11y/a11y-report-reader.d.ts +2 -2
- package/dist/builder/a11y/a11y-report-reader.d.ts.map +1 -1
- package/dist/builder/a11y/a11y-report-reader.js +8 -8
- package/dist/builder/build/index.d.ts.map +1 -1
- package/dist/builder/build/index.js +5 -9
- package/dist/builder/build/schema.d.ts.map +1 -1
- package/dist/builder/config-loader/config-loader.d.ts.map +1 -1
- package/dist/builder/config-loader/config-loader.js +4 -5
- package/dist/builder/manifest/host-parser.d.ts.map +1 -1
- package/dist/builder/manifest/host-parser.js +1 -1
- package/dist/builder/manifest/runtime-manifest.generator.d.ts +1 -1
- package/dist/builder/manifest/runtime-manifest.generator.d.ts.map +1 -1
- package/dist/builder/manifest/runtime-manifest.generator.js +14 -35
- package/dist/builder/plugin-runner/plugin-runner.d.ts.map +1 -1
- package/dist/builder/plugin-runner/plugin-runner.js +2 -4
- package/dist/builder/scanner/ast-utils.d.ts +46 -2
- package/dist/builder/scanner/ast-utils.d.ts.map +1 -1
- package/dist/builder/scanner/ast-utils.js +338 -38
- package/dist/builder/scanner/class-hierarchy.d.ts +33 -0
- package/dist/builder/scanner/class-hierarchy.d.ts.map +1 -0
- package/dist/builder/scanner/class-hierarchy.js +87 -0
- package/dist/builder/scanner/component.scanner.d.ts +7 -1
- package/dist/builder/scanner/component.scanner.d.ts.map +1 -1
- package/dist/builder/scanner/component.scanner.js +113 -72
- package/dist/builder/scanner/entry-point-discovery.d.ts.map +1 -1
- package/dist/builder/scanner/entry-point-discovery.js +3 -5
- package/dist/builder/scanner/entry-point.scanner.d.ts.map +1 -1
- package/dist/builder/scanner/entry-point.scanner.js +1 -3
- package/dist/builder/scanner/index.d.ts +1 -1
- package/dist/builder/scanner/index.d.ts.map +1 -1
- package/dist/builder/scanner/input.extractor.d.ts +7 -4
- package/dist/builder/scanner/input.extractor.d.ts.map +1 -1
- package/dist/builder/scanner/input.extractor.js +157 -76
- package/dist/builder/scanner/manifest.generator.d.ts.map +1 -1
- package/dist/builder/scanner/manifest.generator.js +8 -6
- package/dist/builder/scanner/scanner.d.ts +3 -1
- package/dist/builder/scanner/scanner.d.ts.map +1 -1
- package/dist/builder/scanner/scanner.js +10 -8
- package/dist/builder/scanner/showcase-diagnostics.d.ts +25 -0
- package/dist/builder/scanner/showcase-diagnostics.d.ts.map +1 -0
- package/dist/builder/scanner/showcase-diagnostics.js +96 -0
- package/dist/builder/serve/index.d.ts.map +1 -1
- package/dist/builder/serve/index.js +8 -10
- package/dist/builder/serve/schema.d.ts.map +1 -1
- package/dist/builder/shared/index.d.ts +1 -1
- package/dist/builder/shared/index.d.ts.map +1 -1
- package/dist/builder/shared/index.js +1 -1
- package/dist/builder/shared/prism-pipeline.d.ts +1 -1
- package/dist/builder/shared/prism-pipeline.d.ts.map +1 -1
- package/dist/builder/shared/prism-pipeline.js +29 -38
- package/dist/builder/shared/resolve-cache-dir.d.ts.map +1 -1
- package/dist/builder/shared/resolve-cache-dir.js +1 -1
- package/dist/builder/watcher/index.d.ts +1 -1
- package/dist/builder/watcher/index.d.ts.map +1 -1
- package/dist/builder/watcher/prism-watcher.d.ts.map +1 -1
- package/dist/builder/watcher/prism-watcher.js +14 -12
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/decorator/index.d.ts +1 -1
- package/dist/decorator/index.d.ts.map +1 -1
- package/dist/decorator/showcase.decorator.d.ts.map +1 -1
- package/dist/decorator/showcase.types.d.ts +11 -9
- package/dist/decorator/showcase.types.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/plugin/define-config.js +1 -1
- package/dist/plugin/index.d.ts +4 -4
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +7 -11
- package/dist/plugin/page-helpers.d.ts +1 -1
- package/dist/plugin/page-helpers.d.ts.map +1 -1
- package/dist/plugin/page-helpers.js +2 -2
- package/dist/plugin/page.types.d.ts.map +1 -1
- package/dist/plugin/plugin.types.d.ts +31 -14
- package/dist/plugin/plugin.types.d.ts.map +1 -1
- package/dist/schematics/migrations/v21-13-manifest-cache/index.d.ts.map +1 -1
- package/dist/schematics/migrations/v21-13-manifest-cache/index.js +4 -10
- package/dist/schematics/migrations/v22-0-cache-dir-rename/index.d.ts.map +1 -1
- package/dist/schematics/migrations/v22-0-cache-dir-rename/index.js +6 -10
- package/dist/schematics/ng-add/index.d.ts.map +1 -1
- package/dist/schematics/ng-add/index.js +122 -56
- package/dist/schematics/ng-add/schema.d.ts.map +1 -1
- package/dist/schematics/utils/config-ast.d.ts.map +1 -1
- package/dist/schematics/utils/config-ast.js +8 -15
- package/dist/schematics/utils/tsconfig-paths.d.ts.map +1 -1
- package/dist/schematics/utils/tsconfig-paths.js +1 -1
- package/dist/shared/canvas-bg.type.d.ts +5 -6
- package/dist/shared/canvas-bg.type.d.ts.map +1 -1
- package/dist/shared/canvas-bg.type.js +5 -13
- package/dist/shared/canvas-layout.type.d.ts.map +1 -1
- package/dist/shared/canvas-layout.type.js +1 -4
- package/dist/shared/measure.type.d.ts +52 -0
- package/dist/shared/measure.type.d.ts.map +1 -0
- package/dist/shared/measure.type.js +21 -0
- package/dist/shared/variant-bg.d.ts +20 -31
- package/dist/shared/variant-bg.d.ts.map +1 -1
- package/dist/shared/variant-bg.js +20 -31
- package/dist/shared/viewport.type.d.ts +43 -0
- package/dist/shared/viewport.type.d.ts.map +1 -0
- package/dist/shared/viewport.type.js +44 -0
- package/dist/transformer/cli.js +0 -0
- package/dist/transformer/index.d.ts +2 -2
- package/dist/transformer/index.d.ts.map +1 -1
- package/dist/transformer/index.js +2 -2
- package/dist/transformer/showcase-strip.transformer.d.ts.map +1 -1
- package/dist/transformer/showcase-strip.transformer.js +7 -16
- package/dist/transformer/strip-directory.d.ts.map +1 -1
- package/dist/transformer/strip-directory.js +2 -4
- package/package.json +5 -2
- package/schematics/collection.json +7 -7
- package/schematics/migrations.json +12 -12
- package/schematics/ng-add/schema.json +22 -22
- package/src/builder/build/schema.json +36 -36
- package/src/builder/serve/schema.json +37 -37
|
@@ -1,84 +1,174 @@
|
|
|
1
1
|
import ts from 'typescript';
|
|
2
|
-
import {
|
|
2
|
+
import { evaluateStatic, findDecorator, getDecoratorArgument, getJsDocComment } from './ast-utils.js';
|
|
3
|
+
import { getClassHierarchy } from './class-hierarchy.js';
|
|
3
4
|
/**
|
|
4
|
-
* Extract all @Input(), input() and model() signal metadata from a class
|
|
5
|
+
* Extract all @Input(), input() and model() signal metadata from a class
|
|
6
|
+
* declaration and the base classes Angular inherits inputs from. An input the
|
|
7
|
+
* subclass redeclares wins over the one in its base class.
|
|
5
8
|
*/
|
|
6
|
-
export function extractInputs(classDecl, checker) {
|
|
9
|
+
export function extractInputs(classDecl, checker, hierarchy = getClassHierarchy(classDecl, checker)) {
|
|
7
10
|
const inputs = [];
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (signalCall) {
|
|
37
|
-
const required = isSignalInputRequired(signalCall);
|
|
38
|
-
const defaultValue = !required && signalCall.arguments.length > 0
|
|
39
|
-
? evaluateExpression(signalCall.arguments[0])
|
|
40
|
-
: undefined;
|
|
41
|
-
const doc = getJsDocComment(member, checker);
|
|
42
|
-
const { type, values, rawType } = resolveSignalInputType(signalCall, checker);
|
|
43
|
-
inputs.push({
|
|
44
|
-
name,
|
|
45
|
-
type,
|
|
46
|
-
rawType,
|
|
47
|
-
required,
|
|
48
|
-
...(values && { values }),
|
|
49
|
-
...(defaultValue !== undefined && { defaultValue }),
|
|
50
|
-
...(doc && { doc }),
|
|
51
|
-
});
|
|
11
|
+
const seen = new Set();
|
|
12
|
+
// Fields a more derived class initializes without declaring them an input.
|
|
13
|
+
// Angular keeps the inherited input, but the component starts out with that value.
|
|
14
|
+
const reinitialized = new Map();
|
|
15
|
+
for (const { classDecl: owner, definesMetadata } of hierarchy.classes) {
|
|
16
|
+
const subclass = owner === classDecl ? undefined : classDecl;
|
|
17
|
+
for (const member of owner.members) {
|
|
18
|
+
if (!ts.isPropertyDeclaration(member) || isStatic(member))
|
|
19
|
+
continue;
|
|
20
|
+
const name = member.name && ts.isIdentifier(member.name) ? member.name.text : undefined;
|
|
21
|
+
if (!name || seen.has(name))
|
|
22
|
+
continue;
|
|
23
|
+
const input = definesMetadata ? readInput(member, name, checker, owner, subclass) : undefined;
|
|
24
|
+
if (!input) {
|
|
25
|
+
if (member.initializer && !reinitialized.has(name))
|
|
26
|
+
reinitialized.set(name, member);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
const initializedBy = reinitialized.get(name);
|
|
30
|
+
if (initializedBy) {
|
|
31
|
+
const defaultValue = readInitialValue(initializedBy, checker);
|
|
32
|
+
if (defaultValue === undefined)
|
|
33
|
+
delete input.defaultValue;
|
|
34
|
+
else
|
|
35
|
+
input.defaultValue = defaultValue;
|
|
36
|
+
}
|
|
37
|
+
seen.add(name);
|
|
38
|
+
inputs.push(input);
|
|
52
39
|
}
|
|
53
40
|
}
|
|
54
41
|
return inputs;
|
|
55
42
|
}
|
|
43
|
+
function isStatic(member) {
|
|
44
|
+
return !!ts.getModifiers(member)?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword);
|
|
45
|
+
}
|
|
46
|
+
/** What a field starts out with: its initializer, or for `input()` and `model()` the value passed to them. */
|
|
47
|
+
function readInitialValue(member, checker) {
|
|
48
|
+
const signalCall = getInputSignalCall(member);
|
|
49
|
+
if (!signalCall)
|
|
50
|
+
return member.initializer ? evaluateDefault(member.initializer, checker) : undefined;
|
|
51
|
+
return !isSignalInputRequired(signalCall) && signalCall.arguments.length > 0 ? evaluateDefault(signalCall.arguments[0], checker) : undefined;
|
|
52
|
+
}
|
|
56
53
|
/**
|
|
57
|
-
*
|
|
54
|
+
* `owner` declares the member. `subclass` is the showcased class when that is
|
|
55
|
+
* a different one, which decides what the type parameters of `owner` stand for.
|
|
58
56
|
*/
|
|
59
|
-
|
|
57
|
+
function readInput(member, name, checker, owner, subclass) {
|
|
58
|
+
const inputDecorator = findDecorator(member, 'Input');
|
|
59
|
+
if (inputDecorator) {
|
|
60
|
+
const required = isDecoratorInputRequired(inputDecorator);
|
|
61
|
+
const defaultValue = readInitialValue(member, checker);
|
|
62
|
+
const doc = getJsDocComment(member, checker);
|
|
63
|
+
const instantiated = subclass && usesTypeParameters(member.type ?? member.initializer, owner, checker) ? getInstantiatedType(name, subclass, checker) : undefined;
|
|
64
|
+
const { type, values, rawType } = instantiated ? mapType(instantiated, checker) : resolveDecoratorInputType(member, checker);
|
|
65
|
+
return {
|
|
66
|
+
name,
|
|
67
|
+
type,
|
|
68
|
+
rawType,
|
|
69
|
+
required,
|
|
70
|
+
...(values && { values }),
|
|
71
|
+
...(defaultValue !== undefined && { defaultValue }),
|
|
72
|
+
...(doc && { doc })
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const signalCall = getInputSignalCall(member);
|
|
76
|
+
if (!signalCall)
|
|
77
|
+
return undefined;
|
|
78
|
+
const required = isSignalInputRequired(signalCall);
|
|
79
|
+
const defaultValue = readInitialValue(member, checker);
|
|
80
|
+
const doc = getJsDocComment(member, checker);
|
|
81
|
+
const declaredType = signalCall.typeArguments?.[0] ?? signalCall.arguments[0];
|
|
82
|
+
// A signal is a getter function, so its call signature returns the value type.
|
|
83
|
+
const instantiated = subclass && usesTypeParameters(declaredType, owner, checker) ? getInstantiatedType(name, subclass, checker)?.getCallSignatures()[0]?.getReturnType() : undefined;
|
|
84
|
+
const { type, values, rawType } = instantiated ? mapType(instantiated, checker) : resolveSignalInputType(signalCall, checker);
|
|
85
|
+
return {
|
|
86
|
+
name,
|
|
87
|
+
type,
|
|
88
|
+
rawType,
|
|
89
|
+
required,
|
|
90
|
+
...(values && { values }),
|
|
91
|
+
...(defaultValue !== undefined && { defaultValue }),
|
|
92
|
+
...(doc && { doc })
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Extract all @Output() and output() signal metadata from a class declaration
|
|
97
|
+
* and the base classes Angular inherits outputs from.
|
|
98
|
+
*/
|
|
99
|
+
export function extractOutputs(classDecl, checker, hierarchy = getClassHierarchy(classDecl, checker)) {
|
|
60
100
|
const outputs = [];
|
|
61
|
-
|
|
62
|
-
|
|
101
|
+
const seen = new Set();
|
|
102
|
+
for (const { classDecl: owner, definesMetadata } of hierarchy.classes) {
|
|
103
|
+
if (!definesMetadata)
|
|
63
104
|
continue;
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
outputs.push({ name, ...(doc && { doc }) });
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
75
|
-
if (isOutputSignal(member)) {
|
|
105
|
+
for (const member of owner.members) {
|
|
106
|
+
if (!ts.isPropertyDeclaration(member))
|
|
107
|
+
continue;
|
|
108
|
+
const name = member.name && ts.isIdentifier(member.name) ? member.name.text : undefined;
|
|
109
|
+
if (!name || seen.has(name))
|
|
110
|
+
continue;
|
|
111
|
+
if (!findDecorator(member, 'Output') && !isOutputSignal(member))
|
|
112
|
+
continue;
|
|
76
113
|
const doc = getJsDocComment(member, checker);
|
|
114
|
+
seen.add(name);
|
|
77
115
|
outputs.push({ name, ...(doc && { doc }) });
|
|
78
116
|
}
|
|
79
117
|
}
|
|
80
118
|
return outputs;
|
|
81
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Whether a declared type, or the expression a type is inferred from,
|
|
122
|
+
* mentions a type parameter of the class that declares it. Only then does the
|
|
123
|
+
* subclass change the type; otherwise the source text stays, alias names included.
|
|
124
|
+
*/
|
|
125
|
+
function usesTypeParameters(node, owner, checker) {
|
|
126
|
+
const parameters = owner.typeParameters;
|
|
127
|
+
if (!node || !parameters?.length)
|
|
128
|
+
return false;
|
|
129
|
+
const isOwnParameter = (declaration) => !!declaration && ts.isTypeParameterDeclaration(declaration) && parameters.includes(declaration);
|
|
130
|
+
const visit = (child) => {
|
|
131
|
+
if (ts.isTypeReferenceNode(child) && ts.isIdentifier(child.typeName) && isOwnParameter(checker.getSymbolAtLocation(child.typeName)?.declarations?.[0])) {
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
return ts.forEachChild(child, visit) ?? false;
|
|
135
|
+
};
|
|
136
|
+
// An inferred type can depend on `T` without the source naming it: `model(this.initial)`.
|
|
137
|
+
return visit(node) || (!ts.isTypeNode(node) && typeMentions(checker.getTypeAtLocation(node), isOwnParameter, checker));
|
|
138
|
+
}
|
|
139
|
+
function typeMentions(type, isOwnParameter, checker, visited = new Set()) {
|
|
140
|
+
if (visited.has(type))
|
|
141
|
+
return false;
|
|
142
|
+
visited.add(type);
|
|
143
|
+
if (type.flags & ts.TypeFlags.TypeParameter)
|
|
144
|
+
return isOwnParameter(type.symbol?.declarations?.[0]);
|
|
145
|
+
const isReference = type.flags & ts.TypeFlags.Object && type.objectFlags & ts.ObjectFlags.Reference;
|
|
146
|
+
const nested = [
|
|
147
|
+
...(type.isUnionOrIntersection() ? type.types : []),
|
|
148
|
+
...(type.aliasTypeArguments ?? []),
|
|
149
|
+
...(isReference ? checker.getTypeArguments(type) : [])
|
|
150
|
+
];
|
|
151
|
+
return nested.some((t) => typeMentions(t, isOwnParameter, checker, visited));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* The type of a property declared in a generic base class, as the subclass
|
|
155
|
+
* sees it: `items = input.required<T[]>()` in `Field<T>` is an
|
|
156
|
+
* `InputSignal<Country[]>` on `Picker extends Field<Country>`.
|
|
157
|
+
*/
|
|
158
|
+
function getInstantiatedType(name, subclass, checker) {
|
|
159
|
+
const property = checker.getPropertyOfType(checker.getTypeAtLocation(subclass), name);
|
|
160
|
+
return property && checker.getTypeOfSymbolAtLocation(property, subclass);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* A default is all or nothing. The renderer applies it to the component, so
|
|
164
|
+
* the part of `{ ...shared, size: 'm' }` that can be read would overwrite the
|
|
165
|
+
* whole default the component actually declares.
|
|
166
|
+
*/
|
|
167
|
+
function evaluateDefault(node, checker) {
|
|
168
|
+
let complete = true;
|
|
169
|
+
const value = evaluateStatic(node, { checker, report: () => (complete = false) });
|
|
170
|
+
return complete ? value : undefined;
|
|
171
|
+
}
|
|
82
172
|
function getInputSignalCall(member) {
|
|
83
173
|
const init = member.initializer;
|
|
84
174
|
if (!init || !ts.isCallExpression(init))
|
|
@@ -97,9 +187,7 @@ function getInputSignalCall(member) {
|
|
|
97
187
|
}
|
|
98
188
|
function isSignalInputRequired(callExpr) {
|
|
99
189
|
const expr = callExpr.expression;
|
|
100
|
-
return
|
|
101
|
-
ts.isIdentifier(expr.name) &&
|
|
102
|
-
expr.name.text === 'required');
|
|
190
|
+
return ts.isPropertyAccessExpression(expr) && ts.isIdentifier(expr.name) && expr.name.text === 'required';
|
|
103
191
|
}
|
|
104
192
|
function isOutputSignal(member) {
|
|
105
193
|
const init = member.initializer;
|
|
@@ -125,9 +213,7 @@ function isDecoratorInputRequired(decorator) {
|
|
|
125
213
|
if (!arg || !ts.isObjectLiteralExpression(arg))
|
|
126
214
|
return false;
|
|
127
215
|
for (const prop of arg.properties) {
|
|
128
|
-
if (ts.isPropertyAssignment(prop) &&
|
|
129
|
-
ts.isIdentifier(prop.name) &&
|
|
130
|
-
prop.name.text === 'required') {
|
|
216
|
+
if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === 'required') {
|
|
131
217
|
return prop.initializer.kind === ts.SyntaxKind.TrueKeyword;
|
|
132
218
|
}
|
|
133
219
|
}
|
|
@@ -135,19 +221,14 @@ function isDecoratorInputRequired(decorator) {
|
|
|
135
221
|
}
|
|
136
222
|
function resolveDecoratorInputType(member, checker) {
|
|
137
223
|
const tsType = checker.getTypeAtLocation(member);
|
|
138
|
-
const declaredText = member.type
|
|
139
|
-
? normalizeTypeText(member.type.getText())
|
|
140
|
-
: undefined;
|
|
224
|
+
const declaredText = member.type ? normalizeTypeText(member.type.getText()) : undefined;
|
|
141
225
|
return mapType(tsType, checker, declaredText);
|
|
142
226
|
}
|
|
143
227
|
function normalizeTypeText(text) {
|
|
144
228
|
return text.replace(/\s+/g, ' ').trim();
|
|
145
229
|
}
|
|
146
230
|
function getRawTypeLabel(tsType, checker) {
|
|
147
|
-
if (tsType.flags &
|
|
148
|
-
(ts.TypeFlags.Boolean |
|
|
149
|
-
ts.TypeFlags.BooleanLike |
|
|
150
|
-
ts.TypeFlags.BooleanLiteral)) {
|
|
231
|
+
if (tsType.flags & (ts.TypeFlags.Boolean | ts.TypeFlags.BooleanLike | ts.TypeFlags.BooleanLiteral)) {
|
|
151
232
|
return 'boolean';
|
|
152
233
|
}
|
|
153
234
|
if (tsType.isUnion()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.generator.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/manifest.generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;GAEG;AACH,wBAAgB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"manifest.generator.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/manifest.generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAyBvE"}
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export function generateManifest(components) {
|
|
5
5
|
const lines = [
|
|
6
|
-
'// AUTO-GENERATED by ng-prism
|
|
6
|
+
'// AUTO-GENERATED by ng-prism. Do not edit!',
|
|
7
7
|
"import type { PrismManifest } from 'ng-prism/plugin';",
|
|
8
8
|
'',
|
|
9
9
|
'export const PRISM_MANIFEST: PrismManifest = {',
|
|
10
|
-
' components: ['
|
|
10
|
+
' components: ['
|
|
11
11
|
];
|
|
12
12
|
for (const comp of components) {
|
|
13
13
|
lines.push(' {');
|
|
@@ -30,6 +30,10 @@ function json(value) {
|
|
|
30
30
|
function indent(depth) {
|
|
31
31
|
return ' '.repeat(depth);
|
|
32
32
|
}
|
|
33
|
+
/** `'aria-label'` and content slots like `'[card-header]'` are only valid keys in quotes. */
|
|
34
|
+
function formatKey(key) {
|
|
35
|
+
return /^[A-Za-z_$][\w$]*$/.test(key) ? key : JSON.stringify(key);
|
|
36
|
+
}
|
|
33
37
|
function formatObject(obj, baseIndent) {
|
|
34
38
|
const entries = Object.entries(obj).filter(([, v]) => v !== undefined);
|
|
35
39
|
if (entries.length === 0)
|
|
@@ -41,7 +45,7 @@ function formatObject(obj, baseIndent) {
|
|
|
41
45
|
: typeof value === 'object' && value !== null
|
|
42
46
|
? formatObject(value, inner)
|
|
43
47
|
: json(value);
|
|
44
|
-
return `${indent(inner)}${key}: ${formatted},`;
|
|
48
|
+
return `${indent(inner)}${formatKey(key)}: ${formatted},`;
|
|
45
49
|
});
|
|
46
50
|
return `{\n${lines.join('\n')}\n${indent(baseIndent)}}`;
|
|
47
51
|
}
|
|
@@ -50,9 +54,7 @@ function formatArray(arr, baseIndent) {
|
|
|
50
54
|
return '[]';
|
|
51
55
|
const inner = baseIndent + 2;
|
|
52
56
|
const items = arr.map((item) => {
|
|
53
|
-
const formatted = typeof item === 'object' && item !== null && !Array.isArray(item)
|
|
54
|
-
? formatObject(item, inner)
|
|
55
|
-
: json(item);
|
|
57
|
+
const formatted = typeof item === 'object' && item !== null && !Array.isArray(item) ? formatObject(item, inner) : json(item);
|
|
56
58
|
return `${indent(inner)}${formatted},`;
|
|
57
59
|
});
|
|
58
60
|
return `[\n${items.join('\n')}\n${indent(baseIndent)}]`;
|
|
@@ -7,6 +7,8 @@ export interface CreateScannerOptions {
|
|
|
7
7
|
}
|
|
8
8
|
export interface ScanResult {
|
|
9
9
|
components: ScannedComponent[];
|
|
10
|
+
/** One message per @Showcase value the scan had to drop, already printed as a warning. */
|
|
11
|
+
diagnostics: string[];
|
|
10
12
|
}
|
|
11
13
|
export interface Scanner {
|
|
12
14
|
/** Scan all entry points. Reuses TypeScript program state from previous scans. */
|
|
@@ -16,7 +18,7 @@ export interface Scanner {
|
|
|
16
18
|
* Create a stateful multi-entry scanner that retains the previous ts.Program between scans.
|
|
17
19
|
* A single shared program is created with every entry-point file as a root name, so the
|
|
18
20
|
* transitive type graph (Angular framework typings, etc.) is parsed once and shared via
|
|
19
|
-
* the program's `TypeChecker
|
|
21
|
+
* the program's `TypeChecker`, instead of N programs that each load Material/CDK/RxJS.
|
|
20
22
|
*
|
|
21
23
|
* TypeScript reuses parsed SourceFile objects from the old program on rebuild, making
|
|
22
24
|
* incremental scans fast.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,EAAE,KAAK,eAAe,EAA4B,MAAM,0BAA0B,CAAC;AAE1F,MAAM,WAAW,oBAAoB;IACjC,WAAW,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAC5C,eAAe,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;CACxC;AAED,MAAM,WAAW,UAAU;IACvB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,0FAA0F;IAC1F,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACpB,kFAAkF;IAClF,IAAI,IAAI,UAAU,CAAC;CACtB;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAiDpE"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import ts from 'typescript';
|
|
2
|
-
import { resolveEntryPointExports, } from './entry-point.scanner.js';
|
|
3
2
|
import { scanComponents } from './component.scanner.js';
|
|
3
|
+
import { resolveEntryPointExports } from './entry-point.scanner.js';
|
|
4
4
|
const DEFAULT_COMPILER_OPTIONS = {
|
|
5
5
|
target: ts.ScriptTarget.ES2022,
|
|
6
6
|
module: ts.ModuleKind.ES2022,
|
|
@@ -13,14 +13,14 @@ const DEFAULT_COMPILER_OPTIONS = {
|
|
|
13
13
|
types: [],
|
|
14
14
|
// Perf: we never call program.emit(); skip emit-related setup work.
|
|
15
15
|
noEmit: true,
|
|
16
|
-
// Perf:
|
|
17
|
-
skipDefaultLibCheck: true
|
|
16
|
+
// Perf: complements skipLibCheck by also skipping type-checking of lib.*.d.ts files.
|
|
17
|
+
skipDefaultLibCheck: true
|
|
18
18
|
};
|
|
19
19
|
/**
|
|
20
20
|
* Create a stateful multi-entry scanner that retains the previous ts.Program between scans.
|
|
21
21
|
* A single shared program is created with every entry-point file as a root name, so the
|
|
22
22
|
* transitive type graph (Angular framework typings, etc.) is parsed once and shared via
|
|
23
|
-
* the program's `TypeChecker
|
|
23
|
+
* the program's `TypeChecker`, instead of N programs that each load Material/CDK/RxJS.
|
|
24
24
|
*
|
|
25
25
|
* TypeScript reuses parsed SourceFile objects from the old program on rebuild, making
|
|
26
26
|
* incremental scans fast.
|
|
@@ -28,7 +28,7 @@ const DEFAULT_COMPILER_OPTIONS = {
|
|
|
28
28
|
export function createScanner(options) {
|
|
29
29
|
const compilerOptions = {
|
|
30
30
|
...DEFAULT_COMPILER_OPTIONS,
|
|
31
|
-
...options.compilerOptions
|
|
31
|
+
...options.compilerOptions
|
|
32
32
|
};
|
|
33
33
|
let previousProgram;
|
|
34
34
|
return {
|
|
@@ -37,8 +37,10 @@ export function createScanner(options) {
|
|
|
37
37
|
previousProgram = program;
|
|
38
38
|
const checker = program.getTypeChecker();
|
|
39
39
|
const allComponents = [];
|
|
40
|
+
const diagnostics = [];
|
|
41
|
+
const notices = new Set();
|
|
40
42
|
for (const { exports, importPath } of entries) {
|
|
41
|
-
const components = scanComponents(exports, checker);
|
|
43
|
+
const components = scanComponents(exports, checker, diagnostics, notices);
|
|
42
44
|
for (const c of components)
|
|
43
45
|
c.importPath = importPath;
|
|
44
46
|
allComponents.push(...components);
|
|
@@ -59,7 +61,7 @@ export function createScanner(options) {
|
|
|
59
61
|
seen.add(key);
|
|
60
62
|
unique.push(c);
|
|
61
63
|
}
|
|
62
|
-
return { components: unique };
|
|
63
|
-
}
|
|
64
|
+
return { components: unique, diagnostics };
|
|
65
|
+
}
|
|
64
66
|
};
|
|
65
67
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { type UnevaluableIssue } from './ast-utils.js';
|
|
3
|
+
import type { UnreadableBase } from './class-hierarchy.js';
|
|
4
|
+
/**
|
|
5
|
+
* Describe one value the scanner had to drop from a `@Showcase` config:
|
|
6
|
+
* which component, where in the config, what the source said and where.
|
|
7
|
+
*
|
|
8
|
+
* `SguiFileInputComponent › variants[3] "Auto hint" › inputs.maxFileSize — "megabytes(5)" (src/file-input.component.ts:27:22) cannot be evaluated statically and was dropped.`
|
|
9
|
+
*/
|
|
10
|
+
export declare function describeUnevaluable(className: string, config: ts.Expression, issue: UnevaluableIssue): string;
|
|
11
|
+
/**
|
|
12
|
+
* `providers` never reached the manifest: classes, factories and instances
|
|
13
|
+
* cannot be written into static data. One message for the field, not one per
|
|
14
|
+
* provider, because none of them could have been kept. It points at the
|
|
15
|
+
* literal property if there is one, else at `found`, a provider the scan came
|
|
16
|
+
* across through a spread or a constant, else at the whole config.
|
|
17
|
+
*/
|
|
18
|
+
export declare function describeDeprecatedProviders(className: string, config: ts.Expression, found?: ts.Node): string;
|
|
19
|
+
/**
|
|
20
|
+
* A base class from a package only ships its declarations: no `input()`
|
|
21
|
+
* call, no required flag, no default. Its inputs are named so the reader
|
|
22
|
+
* knows which variant values will not reach the component.
|
|
23
|
+
*/
|
|
24
|
+
export declare function describeUnreadableBase(className: string, base: UnreadableBase): string;
|
|
25
|
+
//# sourceMappingURL=showcase-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"showcase-diagnostics.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/showcase-diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAA2C,KAAK,gBAAgB,EAA4B,MAAM,gBAAgB,CAAC;AAC1H,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAa3D;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAY7G;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,CAO7G;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,CAOtF"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { relative } from 'node:path';
|
|
2
|
+
import ts from 'typescript';
|
|
3
|
+
import { evaluateExpression } from './ast-utils.js';
|
|
4
|
+
const MAX_EXCERPT_LENGTH = 60;
|
|
5
|
+
const CAUSES = {
|
|
6
|
+
let: 'is declared with let; only const declarations can be read',
|
|
7
|
+
var: 'is declared with var; only const declarations can be read',
|
|
8
|
+
'no-value': 'is declared without a value, as in a .d.ts file or with declare',
|
|
9
|
+
cycle: 'refers back to itself',
|
|
10
|
+
'runtime-value': 'is a function or class, which only exists at runtime'
|
|
11
|
+
};
|
|
12
|
+
const IDENTIFIER = /^[A-Za-z_$][\w$]*$/;
|
|
13
|
+
/**
|
|
14
|
+
* Describe one value the scanner had to drop from a `@Showcase` config:
|
|
15
|
+
* which component, where in the config, what the source said and where.
|
|
16
|
+
*
|
|
17
|
+
* `SguiFileInputComponent › variants[3] "Auto hint" › inputs.maxFileSize — "megabytes(5)" (src/file-input.component.ts:27:22) cannot be evaluated statically and was dropped.`
|
|
18
|
+
*/
|
|
19
|
+
export function describeUnevaluable(className, config, issue) {
|
|
20
|
+
const isRoot = issue.node === config;
|
|
21
|
+
const where = issue.path.length === 0 ? '@Showcase' : formatShowcasePath(issue.path, config);
|
|
22
|
+
const consequence = isRoot
|
|
23
|
+
? 'cannot be evaluated statically, so the component is skipped'
|
|
24
|
+
: issue.reason === 'runtime-value'
|
|
25
|
+
? 'is a runtime value (function, class or instance) and cannot be part of the static manifest; it was dropped'
|
|
26
|
+
: 'cannot be evaluated statically and was dropped';
|
|
27
|
+
const cause = issue.cause ? `: ${excerpt(issue.cause.node)} ${CAUSES[issue.cause.kind]}` : '';
|
|
28
|
+
return `${className} › ${where} — "${excerpt(issue.node)}" (${location(issue.node)}) ${consequence}${cause}.`;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* `providers` never reached the manifest: classes, factories and instances
|
|
32
|
+
* cannot be written into static data. One message for the field, not one per
|
|
33
|
+
* provider, because none of them could have been kept. It points at the
|
|
34
|
+
* literal property if there is one, else at `found`, a provider the scan came
|
|
35
|
+
* across through a spread or a constant, else at the whole config.
|
|
36
|
+
*/
|
|
37
|
+
export function describeDeprecatedProviders(className, config, found) {
|
|
38
|
+
const literal = ts.isObjectLiteralExpression(config) ? findProperty(config, 'providers') : undefined;
|
|
39
|
+
return (`${className} declares @Showcase providers (${location(literal ?? found ?? config)}), which are deprecated and will be removed in 23.0.0; ` +
|
|
40
|
+
`the manifest is static and cannot hold them, so they never reach the styleguide. Use defineConfig({ appProviders }) instead.`);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A base class from a package only ships its declarations: no `input()`
|
|
44
|
+
* call, no required flag, no default. Its inputs are named so the reader
|
|
45
|
+
* knows which variant values will not reach the component.
|
|
46
|
+
*/
|
|
47
|
+
export function describeUnreadableBase(className, base) {
|
|
48
|
+
const baseName = base.classDecl.name?.text ?? 'an anonymous class';
|
|
49
|
+
return (`${className} inherits ${base.inputs.join(', ')} from ${baseName}, which only exists as a declaration (${location(base.classDecl)}); ` +
|
|
50
|
+
`without its source these inputs cannot be read, so they are missing from the manifest and variants cannot set them.`);
|
|
51
|
+
}
|
|
52
|
+
/** A variant is named by its `name` as well as its index, since that is what the styleguide shows. */
|
|
53
|
+
function formatShowcasePath(path, config) {
|
|
54
|
+
const [head, index, ...rest] = path;
|
|
55
|
+
if (head !== 'variants' || typeof index !== 'number')
|
|
56
|
+
return formatPath(path);
|
|
57
|
+
const name = variantName(config, index);
|
|
58
|
+
const variant = name === undefined ? `variants[${index}]` : `variants[${index}] ${JSON.stringify(name)}`;
|
|
59
|
+
return rest.length === 0 ? variant : `${variant} › ${formatPath(rest)}`;
|
|
60
|
+
}
|
|
61
|
+
function formatPath(path) {
|
|
62
|
+
return path
|
|
63
|
+
.map((segment, i) => {
|
|
64
|
+
if (typeof segment === 'number')
|
|
65
|
+
return `[${segment}]`;
|
|
66
|
+
if (!IDENTIFIER.test(segment))
|
|
67
|
+
return `[${JSON.stringify(segment)}]`;
|
|
68
|
+
return i === 0 ? segment : `.${segment}`;
|
|
69
|
+
})
|
|
70
|
+
.join('');
|
|
71
|
+
}
|
|
72
|
+
/** Read from the source, because the evaluated array has already lost the elements before the index. */
|
|
73
|
+
function variantName(config, index) {
|
|
74
|
+
const variants = ts.isObjectLiteralExpression(config) ? findInitializer(config, 'variants') : undefined;
|
|
75
|
+
const variant = variants && ts.isArrayLiteralExpression(variants) ? variants.elements[index] : undefined;
|
|
76
|
+
const name = variant && ts.isObjectLiteralExpression(variant) ? findInitializer(variant, 'name') : undefined;
|
|
77
|
+
const value = name && evaluateExpression(name);
|
|
78
|
+
return typeof value === 'string' ? value : undefined;
|
|
79
|
+
}
|
|
80
|
+
function findProperty(object, key) {
|
|
81
|
+
return object.properties.find((prop) => prop.name !== undefined && (ts.isIdentifier(prop.name) || ts.isStringLiteral(prop.name)) && prop.name.text === key);
|
|
82
|
+
}
|
|
83
|
+
function findInitializer(object, key) {
|
|
84
|
+
const prop = findProperty(object, key);
|
|
85
|
+
return prop && ts.isPropertyAssignment(prop) ? prop.initializer : undefined;
|
|
86
|
+
}
|
|
87
|
+
function excerpt(node) {
|
|
88
|
+
const text = node.getText().replace(/\s+/g, ' ');
|
|
89
|
+
return text.length > MAX_EXCERPT_LENGTH ? `${text.slice(0, MAX_EXCERPT_LENGTH - 1)}…` : text;
|
|
90
|
+
}
|
|
91
|
+
/** Relative to the working directory and with line and column, so that terminals and editors can link it. */
|
|
92
|
+
function location(node) {
|
|
93
|
+
const sourceFile = node.getSourceFile();
|
|
94
|
+
const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
|
|
95
|
+
return `${relative(process.cwd(), sourceFile.fileName)}:${line + 1}:${character + 1}`;
|
|
96
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builder/serve/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builder/serve/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,OAAO,EAA0D,MAAM,2BAA2B,CAAC;AACjH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAIjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAsEtD,QAAA,MAAM,OAAO,EAAE,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAyD,CAAC;AAErH,eAAe,OAAO,CAAC"}
|
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
import { createBuilder, } from '@angular-devkit/architect';
|
|
2
|
-
import { join } from 'path';
|
|
3
1
|
import { existsSync } from 'fs';
|
|
4
|
-
import {
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { createBuilder } from '@angular-devkit/architect';
|
|
4
|
+
import { createPipelineState, runPrismPipeline } from '../shared/prism-pipeline.js';
|
|
5
5
|
import { resolveCacheDir } from '../shared/resolve-cache-dir.js';
|
|
6
6
|
import { startWatcher } from '../watcher/index.js';
|
|
7
7
|
async function createServeBuilder(options, context) {
|
|
8
8
|
const cacheDir = resolveCacheDir(options.cacheDir, context.workspaceRoot);
|
|
9
9
|
const pipelineOptions = {
|
|
10
10
|
entryPoint: options.entryPoint,
|
|
11
|
-
libraryImportPath: options.libraryImportPath ??
|
|
12
|
-
options.libraryProject ??
|
|
13
|
-
options.prismProject,
|
|
11
|
+
libraryImportPath: options.libraryImportPath ?? options.libraryProject ?? options.prismProject,
|
|
14
12
|
prismProject: options.prismProject,
|
|
15
13
|
configFile: options.configFile ?? 'ng-prism.config.ts',
|
|
16
|
-
cacheDir
|
|
14
|
+
cacheDir
|
|
17
15
|
};
|
|
18
16
|
const state = createPipelineState();
|
|
19
17
|
await runPrismPipeline(pipelineOptions, context, state);
|
|
@@ -30,8 +28,8 @@ async function createServeBuilder(options, context) {
|
|
|
30
28
|
},
|
|
31
29
|
logger: {
|
|
32
30
|
info: (msg) => context.logger.info(msg),
|
|
33
|
-
error: (msg) => context.logger.error(msg)
|
|
34
|
-
}
|
|
31
|
+
error: (msg) => context.logger.error(msg)
|
|
32
|
+
}
|
|
35
33
|
});
|
|
36
34
|
const run = await context.scheduleTarget({ project: options.prismProject, target: 'serve', configuration: '' }, { port: options.port ?? 4400 });
|
|
37
35
|
const shutdown = () => {
|
|
@@ -59,7 +57,7 @@ async function createServeBuilder(options, context) {
|
|
|
59
57
|
cleanupSignals();
|
|
60
58
|
watcher.close();
|
|
61
59
|
resolve(lastOutput ?? { success: false });
|
|
62
|
-
}
|
|
60
|
+
}
|
|
63
61
|
});
|
|
64
62
|
});
|
|
65
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/builder/serve/schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/builder/serve/schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { createPipelineState, runPrismPipeline } from './prism-pipeline.js';
|
|
2
2
|
export type { PrismPipelineOptions, PrismPipelineResult, PrismPipelineState } from './prism-pipeline.js';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builder/shared/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builder/shared/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { createPipelineState, runPrismPipeline } from './prism-pipeline.js';
|
|
@@ -17,7 +17,7 @@ export interface PrismPipelineResult {
|
|
|
17
17
|
}
|
|
18
18
|
export interface PrismPipelineState {
|
|
19
19
|
scanner: Scanner | undefined;
|
|
20
|
-
/** Sorted, joined entry-file paths
|
|
20
|
+
/** Sorted, joined entry-file paths. Used to detect when the entry set changed between rebuilds. */
|
|
21
21
|
lastEntrySetKey: string | undefined;
|
|
22
22
|
}
|
|
23
23
|
export declare function createPipelineState(): PrismPipelineState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prism-pipeline.d.ts","sourceRoot":"","sources":["../../../src/builder/shared/prism-pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prism-pipeline.d.ts","sourceRoot":"","sources":["../../../src/builder/shared/prism-pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAShE,OAAO,EAAiB,KAAK,OAAO,EAAmB,MAAM,uBAAuB,CAAC;AAErF,MAAM,WAAW,oBAAoB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,mGAAmG;IACnG,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,mGAAmG;IACnG,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,wBAAgB,mBAAmB,IAAI,kBAAkB,CAExD;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAuFtJ"}
|