@storybook/angular 0.0.0-pr-23609-sha-f47ef339
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/.eslintrc.js +8 -0
- package/README.md +322 -0
- package/dist/builders/build-storybook/index.js +72 -0
- package/dist/builders/build-storybook/index.spec.d.ts +1 -0
- package/dist/builders/build-storybook/index.spec.js +216 -0
- package/dist/builders/build-storybook/schema.json +167 -0
- package/dist/builders/builders.json +14 -0
- package/dist/builders/start-storybook/index.js +93 -0
- package/dist/builders/start-storybook/index.spec.d.ts +1 -0
- package/dist/builders/start-storybook/index.spec.js +215 -0
- package/dist/builders/start-storybook/schema.json +198 -0
- package/dist/builders/utils/error-handler.d.ts +2 -0
- package/dist/builders/utils/error-handler.js +38 -0
- package/dist/builders/utils/run-compodoc.d.ts +6 -0
- package/dist/builders/utils/run-compodoc.js +58 -0
- package/dist/builders/utils/run-compodoc.spec.d.ts +1 -0
- package/dist/builders/utils/run-compodoc.spec.js +86 -0
- package/dist/builders/utils/standalone-options.d.ts +15 -0
- package/dist/builders/utils/standalone-options.js +2 -0
- package/dist/client/angular-beta/AbstractRenderer.d.ts +53 -0
- package/dist/client/angular-beta/AbstractRenderer.js +180 -0
- package/dist/client/angular-beta/CanvasRenderer.d.ts +13 -0
- package/dist/client/angular-beta/CanvasRenderer.js +16 -0
- package/dist/client/angular-beta/ComputesTemplateFromComponent.d.ts +17 -0
- package/dist/client/angular-beta/ComputesTemplateFromComponent.js +132 -0
- package/dist/client/angular-beta/ComputesTemplateFromComponent.test.d.ts +1 -0
- package/dist/client/angular-beta/ComputesTemplateFromComponent.test.js +403 -0
- package/dist/client/angular-beta/DocsRenderer.d.ts +13 -0
- package/dist/client/angular-beta/DocsRenderer.js +40 -0
- package/dist/client/angular-beta/RendererFactory.d.ts +11 -0
- package/dist/client/angular-beta/RendererFactory.js +56 -0
- package/dist/client/angular-beta/RendererFactory.test.d.ts +1 -0
- package/dist/client/angular-beta/RendererFactory.test.js +164 -0
- package/dist/client/angular-beta/StorybookModule.d.ts +8 -0
- package/dist/client/angular-beta/StorybookModule.js +29 -0
- package/dist/client/angular-beta/StorybookModule.test.d.ts +1 -0
- package/dist/client/angular-beta/StorybookModule.test.js +311 -0
- package/dist/client/angular-beta/StorybookProvider.d.ts +5 -0
- package/dist/client/angular-beta/StorybookProvider.js +26 -0
- package/dist/client/angular-beta/StorybookWrapperComponent.d.ts +16 -0
- package/dist/client/angular-beta/StorybookWrapperComponent.js +140 -0
- package/dist/client/angular-beta/__testfixtures__/input.component.d.ts +26 -0
- package/dist/client/angular-beta/__testfixtures__/input.component.js +67 -0
- package/dist/client/angular-beta/__testfixtures__/test.module.d.ts +2 -0
- package/dist/client/angular-beta/__testfixtures__/test.module.js +20 -0
- package/dist/client/angular-beta/utils/NgComponentAnalyzer.d.ts +29 -0
- package/dist/client/angular-beta/utils/NgComponentAnalyzer.js +100 -0
- package/dist/client/angular-beta/utils/NgComponentAnalyzer.test.d.ts +1 -0
- package/dist/client/angular-beta/utils/NgComponentAnalyzer.test.js +374 -0
- package/dist/client/angular-beta/utils/NgModulesAnalyzer.d.ts +6 -0
- package/dist/client/angular-beta/utils/NgModulesAnalyzer.js +41 -0
- package/dist/client/angular-beta/utils/NgModulesAnalyzer.test.d.ts +1 -0
- package/dist/client/angular-beta/utils/NgModulesAnalyzer.test.js +23 -0
- package/dist/client/angular-beta/utils/PropertyExtractor.d.ts +32 -0
- package/dist/client/angular-beta/utils/PropertyExtractor.js +162 -0
- package/dist/client/angular-beta/utils/PropertyExtractor.test.d.ts +1 -0
- package/dist/client/angular-beta/utils/PropertyExtractor.test.js +142 -0
- package/dist/client/config.d.ts +6 -0
- package/dist/client/config.js +10 -0
- package/dist/client/decorateStory.d.ts +4 -0
- package/dist/client/decorateStory.js +49 -0
- package/dist/client/decorateStory.test.d.ts +1 -0
- package/dist/client/decorateStory.test.js +304 -0
- package/dist/client/decorators.d.ts +14 -0
- package/dist/client/decorators.js +70 -0
- package/dist/client/decorators.test.d.ts +1 -0
- package/dist/client/decorators.test.js +146 -0
- package/dist/client/docs/__testfixtures__/doc-button/input.d.ts +111 -0
- package/dist/client/docs/__testfixtures__/doc-button/input.js +207 -0
- package/dist/client/docs/__testfixtures__/doc-button/tsconfig.json +7 -0
- package/dist/client/docs/angular-properties.test.d.ts +1 -0
- package/dist/client/docs/angular-properties.test.js +62 -0
- package/dist/client/docs/compodoc.d.ts +12 -0
- package/dist/client/docs/compodoc.js +258 -0
- package/dist/client/docs/compodoc.test.d.ts +1 -0
- package/dist/client/docs/compodoc.test.js +131 -0
- package/dist/client/docs/config.d.ts +4 -0
- package/dist/client/docs/config.js +19 -0
- package/dist/client/docs/index.d.ts +1 -0
- package/dist/client/docs/index.js +17 -0
- package/dist/client/docs/sourceDecorator.d.ts +9 -0
- package/dist/client/docs/sourceDecorator.js +51 -0
- package/dist/client/docs/types.d.ts +102 -0
- package/dist/client/docs/types.js +2 -0
- package/dist/client/globals.d.ts +23 -0
- package/dist/client/globals.js +40 -0
- package/dist/client/index.d.ts +5 -0
- package/dist/client/index.js +30 -0
- package/dist/client/preview-prod.d.ts +1 -0
- package/dist/client/preview-prod.js +4 -0
- package/dist/client/public-api.d.ts +15 -0
- package/dist/client/public-api.js +36 -0
- package/dist/client/public-types.d.ts +37 -0
- package/dist/client/public-types.js +2 -0
- package/dist/client/render.d.ts +7 -0
- package/dist/client/render.js +19 -0
- package/dist/client/types.d.ts +46 -0
- package/dist/client/types.js +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +29 -0
- package/dist/index.mjs +13 -0
- package/dist/preset.d.ts +6 -0
- package/dist/preset.js +36 -0
- package/dist/preset.mjs +30 -0
- package/dist/renderer.d.ts +6 -0
- package/dist/renderer.js +15 -0
- package/dist/renderer.mjs +6 -0
- package/dist/server/__mocks-ng-workspace__/empty-projects-entry/angular.json +4 -0
- package/dist/server/__mocks-ng-workspace__/minimal-config/angular.json +18 -0
- package/dist/server/__mocks-ng-workspace__/minimal-config/src/main.d.ts +1 -0
- package/dist/server/__mocks-ng-workspace__/minimal-config/src/main.js +5 -0
- package/dist/server/__mocks-ng-workspace__/minimal-config/src/tsconfig.app.json +9 -0
- package/dist/server/__mocks-ng-workspace__/minimal-config/tsconfig.json +13 -0
- package/dist/server/__mocks-ng-workspace__/some-config/angular.json +19 -0
- package/dist/server/__mocks-ng-workspace__/some-config/src/main.d.ts +1 -0
- package/dist/server/__mocks-ng-workspace__/some-config/src/main.js +5 -0
- package/dist/server/__mocks-ng-workspace__/some-config/src/tsconfig.app.json +9 -0
- package/dist/server/__mocks-ng-workspace__/some-config/tsconfig.json +13 -0
- package/dist/server/__mocks-ng-workspace__/with-angularBrowserTarget/angular.json +64 -0
- package/dist/server/__mocks-ng-workspace__/with-angularBrowserTarget/src/main.d.ts +1 -0
- package/dist/server/__mocks-ng-workspace__/with-angularBrowserTarget/src/main.js +5 -0
- package/dist/server/__mocks-ng-workspace__/with-angularBrowserTarget/src/tsconfig.app.json +9 -0
- package/dist/server/__mocks-ng-workspace__/with-angularBrowserTarget/tsconfig.json +13 -0
- package/dist/server/__mocks-ng-workspace__/with-lib/angular.json +28 -0
- package/dist/server/__mocks-ng-workspace__/with-lib/projects/pattern-lib/src/main.d.ts +1 -0
- package/dist/server/__mocks-ng-workspace__/with-lib/projects/pattern-lib/src/main.js +5 -0
- package/dist/server/__mocks-ng-workspace__/with-lib/projects/pattern-lib/tsconfig.lib.json +20 -0
- package/dist/server/__mocks-ng-workspace__/with-lib/tsconfig.json +13 -0
- package/dist/server/__mocks-ng-workspace__/with-nx/angular.json +18 -0
- package/dist/server/__mocks-ng-workspace__/with-nx/nx.json +3 -0
- package/dist/server/__mocks-ng-workspace__/with-nx/src/main.d.ts +1 -0
- package/dist/server/__mocks-ng-workspace__/with-nx/src/main.js +5 -0
- package/dist/server/__mocks-ng-workspace__/with-nx/src/tsconfig.app.json +8 -0
- package/dist/server/__mocks-ng-workspace__/with-nx/tsconfig.json +14 -0
- package/dist/server/__mocks-ng-workspace__/with-nx-workspace/nx.json +3 -0
- package/dist/server/__mocks-ng-workspace__/with-nx-workspace/src/main.d.ts +1 -0
- package/dist/server/__mocks-ng-workspace__/with-nx-workspace/src/main.js +5 -0
- package/dist/server/__mocks-ng-workspace__/with-nx-workspace/src/tsconfig.app.json +8 -0
- package/dist/server/__mocks-ng-workspace__/with-nx-workspace/tsconfig.json +14 -0
- package/dist/server/__mocks-ng-workspace__/with-nx-workspace/workspace.json +18 -0
- package/dist/server/__mocks-ng-workspace__/with-options-styles/angular.json +18 -0
- package/dist/server/__mocks-ng-workspace__/with-options-styles/src/main.d.ts +1 -0
- package/dist/server/__mocks-ng-workspace__/with-options-styles/src/main.js +5 -0
- package/dist/server/__mocks-ng-workspace__/with-options-styles/src/tsconfig.app.json +9 -0
- package/dist/server/__mocks-ng-workspace__/with-options-styles/tsconfig.json +13 -0
- package/dist/server/__mocks-ng-workspace__/without-architect-build/angular.json +5 -0
- package/dist/server/__mocks-ng-workspace__/without-architect-build-options/angular.json +11 -0
- package/dist/server/__mocks-ng-workspace__/without-compatible-projects/angular.json +7 -0
- package/dist/server/__mocks-ng-workspace__/without-projects-entry/angular.json +3 -0
- package/dist/server/__mocks-ng-workspace__/without-projects-entry/projects/pattern-lib/src/main.d.ts +1 -0
- package/dist/server/__mocks-ng-workspace__/without-projects-entry/projects/pattern-lib/src/main.js +5 -0
- package/dist/server/__mocks-ng-workspace__/without-projects-entry/projects/pattern-lib/tsconfig.lib.json +20 -0
- package/dist/server/__mocks-ng-workspace__/without-projects-entry/tsconfig.json +13 -0
- package/dist/server/__mocks-ng-workspace__/without-tsConfig/angular.json +16 -0
- package/dist/server/__mocks-ng-workspace__/without-tsConfig/src/main.d.ts +1 -0
- package/dist/server/__mocks-ng-workspace__/without-tsConfig/src/main.js +5 -0
- package/dist/server/__mocks-ng-workspace__/without-tsConfig/src/tsconfig.app.json +9 -0
- package/dist/server/__mocks-ng-workspace__/without-tsConfig/tsconfig.json +13 -0
- package/dist/server/__tests__/angular.json +96 -0
- package/dist/server/angular-cli-webpack.d.ts +1 -0
- package/dist/server/angular-cli-webpack.js +99 -0
- package/dist/server/framework-preset-angular-cli.d.ts +4 -0
- package/dist/server/framework-preset-angular-cli.js +85 -0
- package/dist/server/framework-preset-angular-docs.d.ts +2 -0
- package/dist/server/framework-preset-angular-docs.js +10 -0
- package/dist/server/framework-preset-angular-ivy.d.ts +10 -0
- package/dist/server/framework-preset-angular-ivy.js +103 -0
- package/dist/server/plugins/storybook-normalize-angular-entry-plugin.d.ts +25 -0
- package/dist/server/plugins/storybook-normalize-angular-entry-plugin.js +48 -0
- package/dist/server/preset-options.d.ts +13 -0
- package/dist/server/preset-options.js +2 -0
- package/dist/server/utils/filter-out-styling-rules.d.ts +2 -0
- package/dist/server/utils/filter-out-styling-rules.js +17 -0
- package/dist/server/utils/module-is-available.d.ts +1 -0
- package/dist/server/utils/module-is-available.js +13 -0
- package/dist/types.d.ts +29 -0
- package/dist/types.js +2 -0
- package/dist/types.mjs +1 -0
- package/jest.config.js +31 -0
- package/package.json +126 -0
- package/preset.js +1 -0
- package/renderer.d.ts +1 -0
- package/renderer.js +1 -0
- package/src/server/angular-cli-webpack.d.ts +7 -0
- package/src/server/angular-cli-webpack.js +127 -0
- package/src/server/plugins/storybook-normalize-angular-entry-plugin.js +54 -0
- package/src/typings.d.ts +21 -0
- package/template/cli/.eslintrc.json +5 -0
- package/template/cli/Button.stories.ts +51 -0
- package/template/cli/Header.stories.ts +37 -0
- package/template/cli/Page.stories.ts +46 -0
- package/template/cli/User.ts +2 -0
- package/template/cli/button.component.ts +55 -0
- package/template/cli/header.component.ts +75 -0
- package/template/cli/page.component.ts +77 -0
- package/template/components/button.component.ts +54 -0
- package/template/components/button.css +30 -0
- package/template/components/form.component.ts +37 -0
- package/template/components/html.component.ts +22 -0
- package/template/components/index.js +8 -0
- package/template/components/pre.component.ts +29 -0
- package/template/stories/angular-mdx.stories.mdx +25 -0
- package/template/stories/argTypes/doc-button/doc-button.component.html +7 -0
- package/template/stories/argTypes/doc-button/doc-button.component.scss +3 -0
- package/template/stories/argTypes/doc-button/doc-button.component.ts +232 -0
- package/template/stories/argTypes/doc-button/doc-button.stories.ts +24 -0
- package/template/stories/argTypes/doc-directive/doc-directive.directive.ts +24 -0
- package/template/stories/argTypes/doc-directive/doc-directive.stories.ts +14 -0
- package/template/stories/argTypes/doc-injectable/doc-injectable.service.ts +27 -0
- package/template/stories/argTypes/doc-injectable/doc-injectable.stories.ts +17 -0
- package/template/stories/argTypes/doc-pipe/doc-pipe.pipe.ts +18 -0
- package/template/stories/argTypes/doc-pipe/doc-pipe.stories.ts +17 -0
- package/template/stories/basics/README.stories.mdx +7 -0
- package/template/stories/basics/angular-forms/customControlValueAccessor/custom-cva-component.stories.ts +27 -0
- package/template/stories/basics/angular-forms/customControlValueAccessor/custom-cva.component.ts +57 -0
- package/template/stories/basics/component-with-complex-selectors/attribute-selector.component.ts +19 -0
- package/template/stories/basics/component-with-complex-selectors/attribute-selectors.component.stories.ts +8 -0
- package/template/stories/basics/component-with-complex-selectors/class-selector.component.stories.ts +8 -0
- package/template/stories/basics/component-with-complex-selectors/class-selector.component.ts +19 -0
- package/template/stories/basics/component-with-complex-selectors/multiple-class-selector.component.stories.ts +8 -0
- package/template/stories/basics/component-with-complex-selectors/multiple-selector.component.stories.ts +8 -0
- package/template/stories/basics/component-with-complex-selectors/multiple-selector.component.ts +37 -0
- package/template/stories/basics/component-with-enums/enums.component.html +8 -0
- package/template/stories/basics/component-with-enums/enums.component.stories.ts +24 -0
- package/template/stories/basics/component-with-enums/enums.component.ts +53 -0
- package/template/stories/basics/component-with-inheritance/base-button.component.ts +10 -0
- package/template/stories/basics/component-with-inheritance/base-button.stories.ts +12 -0
- package/template/stories/basics/component-with-inheritance/icon-button.component.ts +11 -0
- package/template/stories/basics/component-with-inheritance/icon-button.stories.ts +13 -0
- package/template/stories/basics/component-with-ng-content/ng-content-about-parent.stories.ts +58 -0
- package/template/stories/basics/component-with-ng-content/ng-content-simple.stories.ts +29 -0
- package/template/stories/basics/component-with-ng-on-destroy/component-with-on-destroy.stories.ts +40 -0
- package/template/stories/basics/component-with-on-push/on-push-box.component.ts +21 -0
- package/template/stories/basics/component-with-on-push/on-push.stories.ts +21 -0
- package/template/stories/basics/component-with-pipe/custom-pipes.stories.ts +31 -0
- package/template/stories/basics/component-with-pipe/custom.pipe.ts +10 -0
- package/template/stories/basics/component-with-pipe/with-pipe.component.ts +10 -0
- package/template/stories/basics/component-with-provider/di.component.html +7 -0
- package/template/stories/basics/component-with-provider/di.component.stories.ts +26 -0
- package/template/stories/basics/component-with-provider/di.component.ts +28 -0
- package/template/stories/basics/component-with-style/styled.component.css +3 -0
- package/template/stories/basics/component-with-style/styled.component.html +5 -0
- package/template/stories/basics/component-with-style/styled.component.scss +5 -0
- package/template/stories/basics/component-with-style/styled.component.stories.ts +10 -0
- package/template/stories/basics/component-with-style/styled.component.ts +8 -0
- package/template/stories/basics/component-without-selector/without-selector-ng-component-outlet.stories.ts +73 -0
- package/template/stories/basics/component-without-selector/without-selector-ng-factory-resolver.stories.ts +71 -0
- package/template/stories/basics/component-without-selector/without-selector.component.ts +30 -0
- package/template/stories/basics/component-without-selector/without-selector.stories.ts +30 -0
- package/template/stories/basics/ng-module/angular-src/chip-color.token.ts +3 -0
- package/template/stories/basics/ng-module/angular-src/chip-text.pipe.ts +29 -0
- package/template/stories/basics/ng-module/angular-src/chip.component.ts +60 -0
- package/template/stories/basics/ng-module/angular-src/chips-group.component.ts +49 -0
- package/template/stories/basics/ng-module/angular-src/chips.module.ts +31 -0
- package/template/stories/basics/ng-module/import-module-chip.stories.ts +23 -0
- package/template/stories/basics/ng-module/import-module-for-root.stories.ts +50 -0
- package/template/stories/basics/ng-module/import-module.stories.ts +35 -0
- package/template/stories/button.component.ts +26 -0
- package/template/stories/core/README.stories.mdx +7 -0
- package/template/stories/core/applicationConfig/with-browser-animations.stories.ts +40 -0
- package/template/stories/core/applicationConfig/with-noop-browser-animations.stories.ts +35 -0
- package/template/stories/core/decorators/componentWrapperDecorator/child.component.ts +20 -0
- package/template/stories/core/decorators/componentWrapperDecorator/decorators.stories.ts +99 -0
- package/template/stories/core/decorators/componentWrapperDecorator/parent.component.ts +18 -0
- package/template/stories/core/decorators/theme-decorator/decorators.stories.ts +20 -0
- package/template/stories/core/moduleMetadata/angular-src/custom.pipe.ts +10 -0
- package/template/stories/core/moduleMetadata/angular-src/dummy.service.ts +14 -0
- package/template/stories/core/moduleMetadata/angular-src/open-close-component/open-close.component.css +13 -0
- package/template/stories/core/moduleMetadata/angular-src/open-close-component/open-close.component.html +7 -0
- package/template/stories/core/moduleMetadata/angular-src/open-close-component/open-close.component.ts +39 -0
- package/template/stories/core/moduleMetadata/angular-src/service.component.ts +24 -0
- package/template/stories/core/moduleMetadata/angular-src/token.component.ts +31 -0
- package/template/stories/core/moduleMetadata/in-export-default.stories.ts +38 -0
- package/template/stories/core/moduleMetadata/in-stories.stories.ts +46 -0
- package/template/stories/core/moduleMetadata/merge-default-and-story.stories.ts +35 -0
- package/template/stories/core/parameters/bootstrap-options.stories.ts +18 -0
- package/template/stories/core/styles/story-styles.stories.ts +50 -0
- package/template/stories/others/app-initializer-use-factory/app-initializer-use-factory.stories.ts +34 -0
- package/template/stories/others/issues/12009-unknown-component.stories.ts +14 -0
- package/template/stories/others/ngx-translate/README.stories.mdx +65 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CanvasRenderer = void 0;
|
|
4
|
+
const AbstractRenderer_1 = require("./AbstractRenderer");
|
|
5
|
+
class CanvasRenderer extends AbstractRenderer_1.AbstractRenderer {
|
|
6
|
+
async render(options) {
|
|
7
|
+
await super.render(options);
|
|
8
|
+
}
|
|
9
|
+
async beforeFullRender() {
|
|
10
|
+
CanvasRenderer.resetApplications();
|
|
11
|
+
}
|
|
12
|
+
async afterFullRender() {
|
|
13
|
+
await AbstractRenderer_1.AbstractRenderer.resetCompiledComponents();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.CanvasRenderer = CanvasRenderer;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Type } from '@angular/core';
|
|
2
|
+
import { ArgTypes } from '@storybook/types';
|
|
3
|
+
import { ICollection } from '../types';
|
|
4
|
+
/**
|
|
5
|
+
* Converts a component into a template with inputs/outputs present in initial props
|
|
6
|
+
* @param component
|
|
7
|
+
* @param initialProps
|
|
8
|
+
* @param innerTemplate
|
|
9
|
+
*/
|
|
10
|
+
export declare const computesTemplateFromComponent: (component: Type<unknown>, initialProps?: ICollection, innerTemplate?: string) => string;
|
|
11
|
+
/**
|
|
12
|
+
* Converts a component into a template with inputs/outputs present in initial props
|
|
13
|
+
* @param component
|
|
14
|
+
* @param initialProps
|
|
15
|
+
* @param innerTemplate
|
|
16
|
+
*/
|
|
17
|
+
export declare const computesTemplateSourceFromComponent: (component: Type<unknown>, initialProps?: ICollection, argTypes?: ArgTypes) => string | null;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.computesTemplateSourceFromComponent = exports.computesTemplateFromComponent = void 0;
|
|
4
|
+
const NgComponentAnalyzer_1 = require("./utils/NgComponentAnalyzer");
|
|
5
|
+
const separateInputsOutputsAttributes = (ngComponentInputsOutputs, props = {}) => {
|
|
6
|
+
const inputs = ngComponentInputsOutputs.inputs
|
|
7
|
+
.filter((i) => i.templateName in props)
|
|
8
|
+
.map((i) => i.templateName);
|
|
9
|
+
const outputs = ngComponentInputsOutputs.outputs
|
|
10
|
+
.filter((o) => o.templateName in props)
|
|
11
|
+
.map((o) => o.templateName);
|
|
12
|
+
return {
|
|
13
|
+
inputs,
|
|
14
|
+
outputs,
|
|
15
|
+
otherProps: Object.keys(props).filter((k) => ![...inputs, ...outputs].includes(k)),
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Converts a component into a template with inputs/outputs present in initial props
|
|
20
|
+
* @param component
|
|
21
|
+
* @param initialProps
|
|
22
|
+
* @param innerTemplate
|
|
23
|
+
*/
|
|
24
|
+
const computesTemplateFromComponent = (component, initialProps, innerTemplate = '') => {
|
|
25
|
+
const ngComponentMetadata = (0, NgComponentAnalyzer_1.getComponentDecoratorMetadata)(component);
|
|
26
|
+
const ngComponentInputsOutputs = (0, NgComponentAnalyzer_1.getComponentInputsOutputs)(component);
|
|
27
|
+
if (!ngComponentMetadata.selector) {
|
|
28
|
+
// Allow to add renderer component when NgComponent selector is undefined
|
|
29
|
+
return `<ng-container *ngComponentOutlet="storyComponent"></ng-container>`;
|
|
30
|
+
}
|
|
31
|
+
const { inputs: initialInputs, outputs: initialOutputs } = separateInputsOutputsAttributes(ngComponentInputsOutputs, initialProps);
|
|
32
|
+
const templateInputs = initialInputs.length > 0 ? ` ${initialInputs.map((i) => `[${i}]="${i}"`).join(' ')}` : '';
|
|
33
|
+
const templateOutputs = initialOutputs.length > 0
|
|
34
|
+
? ` ${initialOutputs.map((i) => `(${i})="${i}($event)"`).join(' ')}`
|
|
35
|
+
: '';
|
|
36
|
+
return buildTemplate(ngComponentMetadata.selector, innerTemplate, templateInputs, templateOutputs);
|
|
37
|
+
};
|
|
38
|
+
exports.computesTemplateFromComponent = computesTemplateFromComponent;
|
|
39
|
+
const createAngularInputProperty = ({ propertyName, value, argType, }) => {
|
|
40
|
+
let templateValue;
|
|
41
|
+
switch (typeof value) {
|
|
42
|
+
case 'string':
|
|
43
|
+
templateValue = `'${value}'`;
|
|
44
|
+
break;
|
|
45
|
+
case 'object':
|
|
46
|
+
templateValue = JSON.stringify(value)
|
|
47
|
+
.replace(/'/g, '\u2019')
|
|
48
|
+
.replace(/\\"/g, '\u201D')
|
|
49
|
+
.replace(/"([^-"]+)":/g, '$1: ')
|
|
50
|
+
.replace(/"/g, "'")
|
|
51
|
+
.replace(/\u2019/g, "\\'")
|
|
52
|
+
.replace(/\u201D/g, "\\'")
|
|
53
|
+
.split(',')
|
|
54
|
+
.join(', ');
|
|
55
|
+
break;
|
|
56
|
+
default:
|
|
57
|
+
templateValue = value;
|
|
58
|
+
}
|
|
59
|
+
return `[${propertyName}]="${templateValue}"`;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Converts a component into a template with inputs/outputs present in initial props
|
|
63
|
+
* @param component
|
|
64
|
+
* @param initialProps
|
|
65
|
+
* @param innerTemplate
|
|
66
|
+
*/
|
|
67
|
+
const computesTemplateSourceFromComponent = (component, initialProps, argTypes) => {
|
|
68
|
+
const ngComponentMetadata = (0, NgComponentAnalyzer_1.getComponentDecoratorMetadata)(component);
|
|
69
|
+
if (!ngComponentMetadata) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
if (!ngComponentMetadata.selector) {
|
|
73
|
+
// Allow to add renderer component when NgComponent selector is undefined
|
|
74
|
+
return `<ng-container *ngComponentOutlet="${component.name}"></ng-container>`;
|
|
75
|
+
}
|
|
76
|
+
const ngComponentInputsOutputs = (0, NgComponentAnalyzer_1.getComponentInputsOutputs)(component);
|
|
77
|
+
const { inputs: initialInputs, outputs: initialOutputs } = separateInputsOutputsAttributes(ngComponentInputsOutputs, initialProps);
|
|
78
|
+
const templateInputs = initialInputs.length > 0
|
|
79
|
+
? ` ${initialInputs
|
|
80
|
+
.map((propertyName) => createAngularInputProperty({
|
|
81
|
+
propertyName,
|
|
82
|
+
value: initialProps[propertyName],
|
|
83
|
+
argType: argTypes?.[propertyName],
|
|
84
|
+
}))
|
|
85
|
+
.join(' ')}`
|
|
86
|
+
: '';
|
|
87
|
+
const templateOutputs = initialOutputs.length > 0
|
|
88
|
+
? ` ${initialOutputs.map((i) => `(${i})="${i}($event)"`).join(' ')}`
|
|
89
|
+
: '';
|
|
90
|
+
return buildTemplate(ngComponentMetadata.selector, '', templateInputs, templateOutputs);
|
|
91
|
+
};
|
|
92
|
+
exports.computesTemplateSourceFromComponent = computesTemplateSourceFromComponent;
|
|
93
|
+
const buildTemplate = (selector, innerTemplate, inputs, outputs) => {
|
|
94
|
+
// https://www.w3.org/TR/2011/WD-html-markup-20110113/syntax.html#syntax-elements
|
|
95
|
+
const voidElements = [
|
|
96
|
+
'area',
|
|
97
|
+
'base',
|
|
98
|
+
'br',
|
|
99
|
+
'col',
|
|
100
|
+
'command',
|
|
101
|
+
'embed',
|
|
102
|
+
'hr',
|
|
103
|
+
'img',
|
|
104
|
+
'input',
|
|
105
|
+
'keygen',
|
|
106
|
+
'link',
|
|
107
|
+
'meta',
|
|
108
|
+
'param',
|
|
109
|
+
'source',
|
|
110
|
+
'track',
|
|
111
|
+
'wbr',
|
|
112
|
+
];
|
|
113
|
+
const firstSelector = selector.split(',')[0];
|
|
114
|
+
const templateReplacers = [
|
|
115
|
+
[/(^.*?)(?=[,])/, '$1'],
|
|
116
|
+
[/(^\..+)/, 'div$1'],
|
|
117
|
+
[/(^\[.+?])/, 'div$1'],
|
|
118
|
+
[/([\w[\]]+)(\s*,[\w\s-[\],]+)+/, `$1`],
|
|
119
|
+
[/#([\w-]+)/, ` id="$1"`],
|
|
120
|
+
[/((\.[\w-]+)+)/, (_, c) => ` class="${c.split `.`.join ` `.trim()}"`],
|
|
121
|
+
[/(\[.+?])/g, (_, a) => ` ${a.slice(1, -1)}`],
|
|
122
|
+
[
|
|
123
|
+
/([\S]+)(.*)/,
|
|
124
|
+
(template, elementSelector) => {
|
|
125
|
+
return voidElements.some((element) => elementSelector === element)
|
|
126
|
+
? template.replace(/([\S]+)(.*)/, `<$1$2${inputs}${outputs} />`)
|
|
127
|
+
: template.replace(/([\S]+)(.*)/, `<$1$2${inputs}${outputs}>${innerTemplate}</$1>`);
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
];
|
|
131
|
+
return templateReplacers.reduce((prevSelector, [searchValue, replacer]) => prevSelector.replace(searchValue, replacer), firstSelector);
|
|
132
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const core_1 = require("@angular/core");
|
|
10
|
+
const ComputesTemplateFromComponent_1 = require("./ComputesTemplateFromComponent");
|
|
11
|
+
const input_component_1 = require("./__testfixtures__/input.component");
|
|
12
|
+
describe('angular source decorator', () => {
|
|
13
|
+
it('With no props should generate simple tag', () => {
|
|
14
|
+
const component = input_component_1.InputComponent;
|
|
15
|
+
const props = {};
|
|
16
|
+
const argTypes = {};
|
|
17
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
18
|
+
expect(source).toEqual('<doc-button></doc-button>');
|
|
19
|
+
});
|
|
20
|
+
describe('with component without selector', () => {
|
|
21
|
+
let WithoutSelectorComponent = class WithoutSelectorComponent {
|
|
22
|
+
};
|
|
23
|
+
WithoutSelectorComponent = __decorate([
|
|
24
|
+
(0, core_1.Component)({
|
|
25
|
+
template: `The content`,
|
|
26
|
+
})
|
|
27
|
+
], WithoutSelectorComponent);
|
|
28
|
+
it('should add component ng-container', async () => {
|
|
29
|
+
const component = WithoutSelectorComponent;
|
|
30
|
+
const props = {};
|
|
31
|
+
const argTypes = {};
|
|
32
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
33
|
+
expect(source).toEqual(`<ng-container *ngComponentOutlet="WithoutSelectorComponent"></ng-container>`);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('with component with attribute selector', () => {
|
|
37
|
+
let WithAttributeComponent = class WithAttributeComponent {
|
|
38
|
+
};
|
|
39
|
+
WithAttributeComponent = __decorate([
|
|
40
|
+
(0, core_1.Component)({
|
|
41
|
+
selector: 'doc-button[foo]',
|
|
42
|
+
template: '<button></button>',
|
|
43
|
+
})
|
|
44
|
+
], WithAttributeComponent);
|
|
45
|
+
it('should add attribute to template', async () => {
|
|
46
|
+
const component = WithAttributeComponent;
|
|
47
|
+
const props = {};
|
|
48
|
+
const argTypes = {};
|
|
49
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
50
|
+
expect(source).toEqual(`<doc-button foo></doc-button>`);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('with component with attribute and value selector', () => {
|
|
54
|
+
let WithAttributeValueComponent = class WithAttributeValueComponent {
|
|
55
|
+
};
|
|
56
|
+
WithAttributeValueComponent = __decorate([
|
|
57
|
+
(0, core_1.Component)({
|
|
58
|
+
selector: 'doc-button[foo="bar"]',
|
|
59
|
+
template: '<button></button>',
|
|
60
|
+
})
|
|
61
|
+
], WithAttributeValueComponent);
|
|
62
|
+
it('should add attribute to template', async () => {
|
|
63
|
+
const component = WithAttributeValueComponent;
|
|
64
|
+
const props = {};
|
|
65
|
+
const argTypes = {};
|
|
66
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
67
|
+
expect(source).toEqual(`<doc-button foo="bar"></doc-button>`);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('with component with attribute only selector', () => {
|
|
71
|
+
let WithAttributeOnlyComponent = class WithAttributeOnlyComponent {
|
|
72
|
+
};
|
|
73
|
+
WithAttributeOnlyComponent = __decorate([
|
|
74
|
+
(0, core_1.Component)({
|
|
75
|
+
selector: '[foo]',
|
|
76
|
+
template: '<button></button>',
|
|
77
|
+
})
|
|
78
|
+
], WithAttributeOnlyComponent);
|
|
79
|
+
it('should create a div and add attribute to template', async () => {
|
|
80
|
+
const component = WithAttributeOnlyComponent;
|
|
81
|
+
const props = {};
|
|
82
|
+
const argTypes = {};
|
|
83
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
84
|
+
expect(source).toEqual(`<div foo></div>`);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('with component with void element and attribute selector', () => {
|
|
88
|
+
let VoidElementWithAttributeComponent = class VoidElementWithAttributeComponent {
|
|
89
|
+
};
|
|
90
|
+
VoidElementWithAttributeComponent = __decorate([
|
|
91
|
+
(0, core_1.Component)({
|
|
92
|
+
selector: 'input[foo]',
|
|
93
|
+
template: '<button></button>',
|
|
94
|
+
})
|
|
95
|
+
], VoidElementWithAttributeComponent);
|
|
96
|
+
it('should create without separate closing tag', async () => {
|
|
97
|
+
const component = VoidElementWithAttributeComponent;
|
|
98
|
+
const props = {};
|
|
99
|
+
const argTypes = {};
|
|
100
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
101
|
+
expect(source).toEqual(`<input foo />`);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('with component with attribute and value only selector', () => {
|
|
105
|
+
let WithAttributeOnlyComponent = class WithAttributeOnlyComponent {
|
|
106
|
+
};
|
|
107
|
+
WithAttributeOnlyComponent = __decorate([
|
|
108
|
+
(0, core_1.Component)({
|
|
109
|
+
selector: '[foo="bar"]',
|
|
110
|
+
template: '<button></button>',
|
|
111
|
+
})
|
|
112
|
+
], WithAttributeOnlyComponent);
|
|
113
|
+
it('should create a div and add attribute to template', async () => {
|
|
114
|
+
const component = WithAttributeOnlyComponent;
|
|
115
|
+
const props = {};
|
|
116
|
+
const argTypes = {};
|
|
117
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
118
|
+
expect(source).toEqual(`<div foo="bar"></div>`);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe('with component with void element, attribute and value only selector', () => {
|
|
122
|
+
let VoidElementWithAttributeComponent = class VoidElementWithAttributeComponent {
|
|
123
|
+
};
|
|
124
|
+
VoidElementWithAttributeComponent = __decorate([
|
|
125
|
+
(0, core_1.Component)({
|
|
126
|
+
selector: 'input[foo="bar"]',
|
|
127
|
+
template: '<button></button>',
|
|
128
|
+
})
|
|
129
|
+
], VoidElementWithAttributeComponent);
|
|
130
|
+
it('should create and add attribute to template without separate closing tag', async () => {
|
|
131
|
+
const component = VoidElementWithAttributeComponent;
|
|
132
|
+
const props = {};
|
|
133
|
+
const argTypes = {};
|
|
134
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
135
|
+
expect(source).toEqual(`<input foo="bar" />`);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
describe('with component with class selector', () => {
|
|
139
|
+
let WithClassComponent = class WithClassComponent {
|
|
140
|
+
};
|
|
141
|
+
WithClassComponent = __decorate([
|
|
142
|
+
(0, core_1.Component)({
|
|
143
|
+
selector: 'doc-button.foo',
|
|
144
|
+
template: '<button></button>',
|
|
145
|
+
})
|
|
146
|
+
], WithClassComponent);
|
|
147
|
+
it('should add class to template', async () => {
|
|
148
|
+
const component = WithClassComponent;
|
|
149
|
+
const props = {};
|
|
150
|
+
const argTypes = {};
|
|
151
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
152
|
+
expect(source).toEqual(`<doc-button class="foo"></doc-button>`);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
describe('with component with class only selector', () => {
|
|
156
|
+
let WithClassComponent = class WithClassComponent {
|
|
157
|
+
};
|
|
158
|
+
WithClassComponent = __decorate([
|
|
159
|
+
(0, core_1.Component)({
|
|
160
|
+
selector: '.foo',
|
|
161
|
+
template: '<button></button>',
|
|
162
|
+
})
|
|
163
|
+
], WithClassComponent);
|
|
164
|
+
it('should create a div and add attribute to template', async () => {
|
|
165
|
+
const component = WithClassComponent;
|
|
166
|
+
const props = {};
|
|
167
|
+
const argTypes = {};
|
|
168
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
169
|
+
expect(source).toEqual(`<div class="foo"></div>`);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
describe('with component with multiple selectors', () => {
|
|
173
|
+
let WithMultipleSelectorsComponent = class WithMultipleSelectorsComponent {
|
|
174
|
+
};
|
|
175
|
+
WithMultipleSelectorsComponent = __decorate([
|
|
176
|
+
(0, core_1.Component)({
|
|
177
|
+
selector: 'doc-button, doc-button2',
|
|
178
|
+
template: '<button></button>',
|
|
179
|
+
})
|
|
180
|
+
], WithMultipleSelectorsComponent);
|
|
181
|
+
it('should use the first selector', async () => {
|
|
182
|
+
const component = WithMultipleSelectorsComponent;
|
|
183
|
+
const props = {};
|
|
184
|
+
const argTypes = {};
|
|
185
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
186
|
+
expect(source).toEqual(`<doc-button></doc-button>`);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe('with component with multiple selectors starting with attribute', () => {
|
|
190
|
+
let WithMultipleSelectorsComponent = class WithMultipleSelectorsComponent {
|
|
191
|
+
};
|
|
192
|
+
WithMultipleSelectorsComponent = __decorate([
|
|
193
|
+
(0, core_1.Component)({
|
|
194
|
+
selector: 'doc-button[foo], doc-button2',
|
|
195
|
+
template: '<button></button>',
|
|
196
|
+
})
|
|
197
|
+
], WithMultipleSelectorsComponent);
|
|
198
|
+
it('should use the first selector', async () => {
|
|
199
|
+
const component = WithMultipleSelectorsComponent;
|
|
200
|
+
const props = {};
|
|
201
|
+
const argTypes = {};
|
|
202
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
203
|
+
expect(source).toEqual(`<doc-button foo></doc-button>`);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
describe('with component with multiple selectors starting with attribute and value', () => {
|
|
207
|
+
let WithMultipleSelectorsComponent = class WithMultipleSelectorsComponent {
|
|
208
|
+
};
|
|
209
|
+
WithMultipleSelectorsComponent = __decorate([
|
|
210
|
+
(0, core_1.Component)({
|
|
211
|
+
selector: 'doc-button[foo="bar"], doc-button2',
|
|
212
|
+
template: '<button></button>',
|
|
213
|
+
})
|
|
214
|
+
], WithMultipleSelectorsComponent);
|
|
215
|
+
it('should use the first selector', async () => {
|
|
216
|
+
const component = WithMultipleSelectorsComponent;
|
|
217
|
+
const props = {};
|
|
218
|
+
const argTypes = {};
|
|
219
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
220
|
+
expect(source).toEqual(`<doc-button foo="bar"></doc-button>`);
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
describe('with component with multiple selectors including 2 attributes and a class', () => {
|
|
224
|
+
let WithMultipleSelectorsComponent = class WithMultipleSelectorsComponent {
|
|
225
|
+
};
|
|
226
|
+
WithMultipleSelectorsComponent = __decorate([
|
|
227
|
+
(0, core_1.Component)({
|
|
228
|
+
selector: 'doc-button, button[foo], .button[foo], button[baz]',
|
|
229
|
+
template: '<button></button>',
|
|
230
|
+
})
|
|
231
|
+
], WithMultipleSelectorsComponent);
|
|
232
|
+
it('should use the first selector', async () => {
|
|
233
|
+
const component = WithMultipleSelectorsComponent;
|
|
234
|
+
const props = {};
|
|
235
|
+
const argTypes = {};
|
|
236
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
237
|
+
expect(source).toEqual(`<doc-button></doc-button>`);
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
describe('with component with multiple selectors with line breaks', () => {
|
|
241
|
+
let WithMultipleSelectorsComponent = class WithMultipleSelectorsComponent {
|
|
242
|
+
};
|
|
243
|
+
WithMultipleSelectorsComponent = __decorate([
|
|
244
|
+
(0, core_1.Component)({
|
|
245
|
+
selector: `doc-button,
|
|
246
|
+
doc-button2`,
|
|
247
|
+
template: '<button></button>',
|
|
248
|
+
})
|
|
249
|
+
], WithMultipleSelectorsComponent);
|
|
250
|
+
it('should use the first selector', async () => {
|
|
251
|
+
const component = WithMultipleSelectorsComponent;
|
|
252
|
+
const props = {};
|
|
253
|
+
const argTypes = {};
|
|
254
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
255
|
+
expect(source).toEqual(`<doc-button></doc-button>`);
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
describe('with component with multiple selectors starting with attribute only with line breaks', () => {
|
|
259
|
+
let WithMultipleSelectorsComponent = class WithMultipleSelectorsComponent {
|
|
260
|
+
};
|
|
261
|
+
WithMultipleSelectorsComponent = __decorate([
|
|
262
|
+
(0, core_1.Component)({
|
|
263
|
+
selector: `[foo],
|
|
264
|
+
doc-button2`,
|
|
265
|
+
template: '<button></button>',
|
|
266
|
+
})
|
|
267
|
+
], WithMultipleSelectorsComponent);
|
|
268
|
+
it('should use the first selector', async () => {
|
|
269
|
+
const component = WithMultipleSelectorsComponent;
|
|
270
|
+
const props = {};
|
|
271
|
+
const argTypes = {};
|
|
272
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
273
|
+
expect(source).toEqual(`<div foo></div>`);
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
describe('no argTypes', () => {
|
|
277
|
+
it('should generate tag-only template with no props', () => {
|
|
278
|
+
const component = input_component_1.InputComponent;
|
|
279
|
+
const props = {};
|
|
280
|
+
const argTypes = {};
|
|
281
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
282
|
+
expect(source).toEqual(`<doc-button></doc-button>`);
|
|
283
|
+
});
|
|
284
|
+
it('With props should generate tag with properties', () => {
|
|
285
|
+
const component = input_component_1.InputComponent;
|
|
286
|
+
const props = {
|
|
287
|
+
isDisabled: true,
|
|
288
|
+
label: 'Hello world',
|
|
289
|
+
accent: input_component_1.ButtonAccent.High,
|
|
290
|
+
counter: 4,
|
|
291
|
+
};
|
|
292
|
+
const argTypes = {};
|
|
293
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
294
|
+
expect(source).toEqual(`<doc-button [counter]="4" [accent]="'High'" [isDisabled]="true" [label]="'Hello world'"></doc-button>`);
|
|
295
|
+
});
|
|
296
|
+
it('With props should generate tag with outputs', () => {
|
|
297
|
+
const component = input_component_1.InputComponent;
|
|
298
|
+
const props = {
|
|
299
|
+
isDisabled: true,
|
|
300
|
+
label: 'Hello world',
|
|
301
|
+
onClick: ($event) => { },
|
|
302
|
+
};
|
|
303
|
+
const argTypes = {};
|
|
304
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
305
|
+
expect(source).toEqual(`<doc-button [isDisabled]="true" [label]="'Hello world'" (onClick)="onClick($event)"></doc-button>`);
|
|
306
|
+
});
|
|
307
|
+
it('should generate correct property for overridden name for Input', () => {
|
|
308
|
+
const component = input_component_1.InputComponent;
|
|
309
|
+
const props = {
|
|
310
|
+
color: '#ffffff',
|
|
311
|
+
};
|
|
312
|
+
const argTypes = {};
|
|
313
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
314
|
+
expect(source).toEqual(`<doc-button [color]="'#ffffff'"></doc-button>`);
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
describe('with argTypes (from compodoc)', () => {
|
|
318
|
+
it('Should handle enum as strongly typed enum', () => {
|
|
319
|
+
const component = input_component_1.InputComponent;
|
|
320
|
+
const props = {
|
|
321
|
+
isDisabled: false,
|
|
322
|
+
label: 'Hello world',
|
|
323
|
+
accent: input_component_1.ButtonAccent.High,
|
|
324
|
+
};
|
|
325
|
+
const argTypes = {
|
|
326
|
+
accent: {
|
|
327
|
+
control: {
|
|
328
|
+
options: ['Normal', 'High'],
|
|
329
|
+
type: 'radio',
|
|
330
|
+
},
|
|
331
|
+
defaultValue: undefined,
|
|
332
|
+
table: {
|
|
333
|
+
category: 'inputs',
|
|
334
|
+
},
|
|
335
|
+
type: {
|
|
336
|
+
name: 'enum',
|
|
337
|
+
required: true,
|
|
338
|
+
value: [],
|
|
339
|
+
},
|
|
340
|
+
},
|
|
341
|
+
};
|
|
342
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
343
|
+
expect(source).toEqual(`<doc-button [accent]="'High'" [isDisabled]="false" [label]="'Hello world'"></doc-button>`);
|
|
344
|
+
});
|
|
345
|
+
it('Should handle enum without values as string', () => {
|
|
346
|
+
const component = input_component_1.InputComponent;
|
|
347
|
+
const props = {
|
|
348
|
+
isDisabled: false,
|
|
349
|
+
label: 'Hello world',
|
|
350
|
+
accent: input_component_1.ButtonAccent.High,
|
|
351
|
+
};
|
|
352
|
+
const argTypes = {
|
|
353
|
+
accent: {
|
|
354
|
+
control: {
|
|
355
|
+
options: ['Normal', 'High'],
|
|
356
|
+
type: 'radio',
|
|
357
|
+
},
|
|
358
|
+
defaultValue: undefined,
|
|
359
|
+
table: {
|
|
360
|
+
category: 'inputs',
|
|
361
|
+
},
|
|
362
|
+
type: {
|
|
363
|
+
name: 'object',
|
|
364
|
+
required: true,
|
|
365
|
+
value: {},
|
|
366
|
+
},
|
|
367
|
+
},
|
|
368
|
+
};
|
|
369
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, argTypes);
|
|
370
|
+
expect(source).toEqual(`<doc-button [accent]="'High'" [isDisabled]="false" [label]="'Hello world'"></doc-button>`);
|
|
371
|
+
});
|
|
372
|
+
it('Should handle objects correctly', () => {
|
|
373
|
+
const component = input_component_1.InputComponent;
|
|
374
|
+
const someDataObject = {
|
|
375
|
+
one: 'Hello world',
|
|
376
|
+
two: true,
|
|
377
|
+
three: [
|
|
378
|
+
`a string literal with "double quotes"`,
|
|
379
|
+
`a string literal with 'single quotes'`,
|
|
380
|
+
'a single quoted string with "double quotes"',
|
|
381
|
+
"a double quoted string with 'single quotes'",
|
|
382
|
+
// eslint-disable-next-line prettier/prettier
|
|
383
|
+
'a single quoted string with escaped \'single quotes\'',
|
|
384
|
+
// eslint-disable-next-line prettier/prettier
|
|
385
|
+
"a double quoted string with escaped \"double quotes\"",
|
|
386
|
+
// eslint-disable-next-line no-useless-escape
|
|
387
|
+
`a string literal with \'escaped single quotes\'`,
|
|
388
|
+
// eslint-disable-next-line no-useless-escape
|
|
389
|
+
`a string literal with \"escaped double quotes\"`,
|
|
390
|
+
],
|
|
391
|
+
};
|
|
392
|
+
const props = {
|
|
393
|
+
isDisabled: false,
|
|
394
|
+
label: 'Hello world',
|
|
395
|
+
someDataObject,
|
|
396
|
+
};
|
|
397
|
+
const source = (0, ComputesTemplateFromComponent_1.computesTemplateSourceFromComponent)(component, props, null);
|
|
398
|
+
// Ideally we should stringify the object, but that could cause the story to break because of unescaped values in the JSON object.
|
|
399
|
+
// This will have to do for now
|
|
400
|
+
expect(source).toEqual(`<doc-button [isDisabled]="false" [label]="'Hello world'" [someDataObject]="{one: 'Hello world', two: true, three: ['a string literal with \\'double quotes\\'', 'a string literal with \\'single quotes\\'', 'a single quoted string with \\'double quotes\\'', 'a double quoted string with \\'single quotes\\'', 'a single quoted string with escaped \\'single quotes\\'', 'a double quoted string with escaped \\'double quotes\\'', 'a string literal with \\'escaped single quotes\\'', 'a string literal with \\'escaped double quotes\\'']}"></doc-button>`);
|
|
401
|
+
});
|
|
402
|
+
});
|
|
403
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AbstractRenderer } from './AbstractRenderer';
|
|
2
|
+
import { StoryFnAngularReturnType, Parameters } from '../types';
|
|
3
|
+
export declare class DocsRenderer extends AbstractRenderer {
|
|
4
|
+
render(options: {
|
|
5
|
+
storyFnAngular: StoryFnAngularReturnType;
|
|
6
|
+
forced: boolean;
|
|
7
|
+
component: any;
|
|
8
|
+
parameters: Parameters;
|
|
9
|
+
targetDOMNode: HTMLElement;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
beforeFullRender(domNode?: HTMLElement): Promise<void>;
|
|
12
|
+
afterFullRender(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DocsRenderer = void 0;
|
|
4
|
+
const preview_api_1 = require("@storybook/preview-api");
|
|
5
|
+
const core_events_1 = require("@storybook/core-events");
|
|
6
|
+
const AbstractRenderer_1 = require("./AbstractRenderer");
|
|
7
|
+
class DocsRenderer extends AbstractRenderer_1.AbstractRenderer {
|
|
8
|
+
async render(options) {
|
|
9
|
+
const channel = preview_api_1.addons.getChannel();
|
|
10
|
+
/**
|
|
11
|
+
* Destroy and recreate the PlatformBrowserDynamic of angular
|
|
12
|
+
* For several stories to be rendered in the same docs we should
|
|
13
|
+
* not destroy angular between each rendering but do it when the
|
|
14
|
+
* rendered stories are not needed anymore.
|
|
15
|
+
*
|
|
16
|
+
* Note for improvement: currently there is one event per story
|
|
17
|
+
* rendered in the doc. But one event could be enough for the whole docs
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
20
|
+
channel.once(core_events_1.STORY_CHANGED, async () => {
|
|
21
|
+
await DocsRenderer.resetApplications();
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Destroy and recreate the PlatformBrowserDynamic of angular
|
|
25
|
+
* when doc re render. Allows to call ngOnDestroy of angular
|
|
26
|
+
* for previous component
|
|
27
|
+
*/
|
|
28
|
+
channel.once(core_events_1.DOCS_RENDERED, async () => {
|
|
29
|
+
await DocsRenderer.resetApplications();
|
|
30
|
+
});
|
|
31
|
+
await super.render({ ...options, forced: false });
|
|
32
|
+
}
|
|
33
|
+
async beforeFullRender(domNode) {
|
|
34
|
+
DocsRenderer.resetApplications(domNode);
|
|
35
|
+
}
|
|
36
|
+
async afterFullRender() {
|
|
37
|
+
await AbstractRenderer_1.AbstractRenderer.resetCompiledComponents();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.DocsRenderer = DocsRenderer;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AbstractRenderer } from './AbstractRenderer';
|
|
2
|
+
type RenderType = 'canvas' | 'docs';
|
|
3
|
+
export declare class RendererFactory {
|
|
4
|
+
private lastRenderType;
|
|
5
|
+
private rendererMap;
|
|
6
|
+
getRendererInstance(targetDOMNode: HTMLElement): Promise<AbstractRenderer | null>;
|
|
7
|
+
private buildRenderer;
|
|
8
|
+
}
|
|
9
|
+
export declare const getRenderType: (targetDOMNode: HTMLElement) => RenderType;
|
|
10
|
+
export declare function clearRootHTMLElement(renderType: RenderType): void;
|
|
11
|
+
export {};
|