1 | "use strict";
|
2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3 | if (k2 === undefined) k2 = k;
|
4 | var desc = Object.getOwnPropertyDescriptor(m, k);
|
5 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6 | desc = { enumerable: true, get: function() { return m[k]; } };
|
7 | }
|
8 | Object.defineProperty(o, k2, desc);
|
9 | }) : (function(o, m, k, k2) {
|
10 | if (k2 === undefined) k2 = k;
|
11 | o[k2] = m[k];
|
12 | }));
|
13 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14 | Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15 | }) : function(o, v) {
|
16 | o["default"] = v;
|
17 | });
|
18 | var __importStar = (this && this.__importStar) || function (mod) {
|
19 | if (mod && mod.__esModule) return mod;
|
20 | var result = {};
|
21 | if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22 | __setModuleDefault(result, mod);
|
23 | return result;
|
24 | };
|
25 | var _a;
|
26 | Object.defineProperty(exports, "__esModule", { value: true });
|
27 | exports.AbstractRenderer = void 0;
|
28 | const core_1 = require("@angular/core");
|
29 | const platform_browser_1 = require("@angular/platform-browser");
|
30 | const rxjs_1 = require("rxjs");
|
31 | const telejson_1 = require("telejson");
|
32 | const StorybookModule_1 = require("./StorybookModule");
|
33 | const StorybookProvider_1 = require("./StorybookProvider");
|
34 | const StorybookWrapperComponent_1 = require("./StorybookWrapperComponent");
|
35 | const PropertyExtractor_1 = require("./utils/PropertyExtractor");
|
36 | const applicationRefs = new Map();
|
37 | class AbstractRenderer {
|
38 | |
39 |
|
40 |
|
41 | static resetApplications(domNode) {
|
42 | StorybookWrapperComponent_1.componentNgModules.clear();
|
43 | applicationRefs.forEach((appRef, appDOMNode) => {
|
44 | if (!appRef.destroyed && (!domNode || appDOMNode === domNode)) {
|
45 | appRef.destroy();
|
46 | }
|
47 | });
|
48 | }
|
49 | constructor() {
|
50 | this.previousStoryRenderInfo = new Map();
|
51 | if (typeof NODE_ENV === 'string' && NODE_ENV !== 'development') {
|
52 | try {
|
53 |
|
54 | (0, core_1.enableProdMode)();
|
55 | }
|
56 | catch (e) {
|
57 |
|
58 | console.debug(e);
|
59 | }
|
60 | }
|
61 | }
|
62 | |
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
|
71 | async render({ storyFnAngular, forced, component, targetDOMNode, }) {
|
72 | const targetSelector = this.generateTargetSelectorFromStoryId(targetDOMNode.id);
|
73 | const newStoryProps$ = new rxjs_1.BehaviorSubject(storyFnAngular.props);
|
74 | if (!this.fullRendererRequired({
|
75 | targetDOMNode,
|
76 | storyFnAngular,
|
77 | moduleMetadata: {
|
78 | ...storyFnAngular.moduleMetadata,
|
79 | },
|
80 | forced,
|
81 | })) {
|
82 | this.storyProps$.next(storyFnAngular.props);
|
83 | return;
|
84 | }
|
85 | await this.beforeFullRender(targetDOMNode);
|
86 |
|
87 | if (this.storyProps$) {
|
88 | this.storyProps$.complete();
|
89 | }
|
90 | this.storyProps$ = newStoryProps$;
|
91 | this.initAngularRootElement(targetDOMNode, targetSelector);
|
92 | const analyzedMetadata = new PropertyExtractor_1.PropertyExtractor(storyFnAngular.moduleMetadata, component);
|
93 | const application = (0, StorybookModule_1.getApplication)({
|
94 | storyFnAngular,
|
95 | component,
|
96 | targetSelector,
|
97 | analyzedMetadata,
|
98 | });
|
99 | const applicationRef = await (0, platform_browser_1.bootstrapApplication)(application, {
|
100 | ...storyFnAngular.applicationConfig,
|
101 | providers: [
|
102 | (0, StorybookProvider_1.storyPropsProvider)(newStoryProps$),
|
103 | ...analyzedMetadata.applicationProviders,
|
104 | ...(storyFnAngular.applicationConfig?.providers ?? []),
|
105 | ],
|
106 | });
|
107 | applicationRefs.set(targetDOMNode, applicationRef);
|
108 | await this.afterFullRender();
|
109 | }
|
110 | |
111 |
|
112 |
|
113 |
|
114 |
|
115 |
|
116 |
|
117 |
|
118 |
|
119 |
|
120 |
|
121 |
|
122 | generateTargetSelectorFromStoryId(id) {
|
123 | const invalidHtmlTag = /[^A-Za-z0-9-]/g;
|
124 | const storyIdIsInvalidHtmlTagName = invalidHtmlTag.test(id);
|
125 | return storyIdIsInvalidHtmlTagName ? `sb-${id.replace(invalidHtmlTag, '')}-component` : id;
|
126 | }
|
127 | initAngularRootElement(targetDOMNode, targetSelector) {
|
128 |
|
129 |
|
130 | targetDOMNode.innerHTML = '';
|
131 | targetDOMNode.appendChild(document.createElement(targetSelector));
|
132 | }
|
133 | fullRendererRequired({ targetDOMNode, storyFnAngular, moduleMetadata, forced, }) {
|
134 | const previousStoryRenderInfo = this.previousStoryRenderInfo.get(targetDOMNode);
|
135 | const currentStoryRender = {
|
136 | storyFnAngular,
|
137 | moduleMetadataSnapshot: (0, telejson_1.stringify)(moduleMetadata),
|
138 | };
|
139 | this.previousStoryRenderInfo.set(targetDOMNode, currentStoryRender);
|
140 | if (
|
141 |
|
142 | !forced ||
|
143 |
|
144 | !this.storyProps$) {
|
145 | return true;
|
146 | }
|
147 |
|
148 | const hasChangedTemplate = !!storyFnAngular?.template &&
|
149 | previousStoryRenderInfo?.storyFnAngular?.template !== storyFnAngular.template;
|
150 | if (hasChangedTemplate) {
|
151 | return true;
|
152 | }
|
153 |
|
154 | const hasChangedModuleMetadata = currentStoryRender.moduleMetadataSnapshot !== previousStoryRenderInfo?.moduleMetadataSnapshot;
|
155 | return hasChangedModuleMetadata;
|
156 | }
|
157 | }
|
158 | exports.AbstractRenderer = AbstractRenderer;
|
159 | _a = AbstractRenderer;
|
160 |
|
161 |
|
162 |
|
163 |
|
164 | AbstractRenderer.resetCompiledComponents = async () => {
|
165 | try {
|
166 |
|
167 |
|
168 |
|
169 |
|
170 |
|
171 | const { ɵresetCompiledComponents } = await Promise.resolve().then(() => __importStar(require('@angular/core')));
|
172 | ɵresetCompiledComponents();
|
173 | }
|
174 | catch (e) {
|
175 | |
176 |
|
177 |
|
178 |
|
179 | }
|
180 | };
|