@openelement/ssg 0.41.0-alpha.1

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.
@@ -0,0 +1,172 @@
1
+ /**
2
+ * @openelement/ssg - DSD report assembly
3
+ *
4
+ * Builds the dsd-report.json contents from render diagnostics,
5
+ * hydration strategy summary, manifest decisions, and CEM
6
+ * compatibility classifications.
7
+ */ import { join } from 'node:path';
8
+ import { writeFileSync } from 'node:fs';
9
+ import { createLogger } from '@openelement/core/logger';
10
+ import { writeJson } from '@openelement/content/write-json';
11
+ const log = createLogger('ssg');
12
+ // ─── Hydration Strategy Summary ────────────────────────────────
13
+ /**
14
+ * Build a summary of hydration strategies used across all components.
15
+ */ export function buildHydrationStrategySummary(evidence) {
16
+ const summary = {
17
+ load: 0,
18
+ idle: 0,
19
+ visible: 0,
20
+ only: 0,
21
+ clientOnlyExcluded: 0
22
+ };
23
+ const decisions = evidence.admissionDecisions || [];
24
+ const localMeta = evidence.localIslandMeta || {};
25
+ for (const meta of Object.values(localMeta)){
26
+ const strategy = meta.hydrate || 'idle';
27
+ if (strategy in summary) {
28
+ summary[strategy]++;
29
+ }
30
+ }
31
+ for (const decl of evidence.packageIslandDecls || []){
32
+ const strategy = decl.hydrate || 'idle';
33
+ if (strategy in summary) {
34
+ summary[strategy]++;
35
+ }
36
+ }
37
+ summary.clientOnlyExcluded = decisions.filter((d)=>d.renderPath === 'client-only').length;
38
+ return summary;
39
+ }
40
+ // ─── Manifest Decisions Builder (v0.17.2) ───────────────────────
41
+ /**
42
+ * Build manifest-driven render decisions from ctx.
43
+ *
44
+ * For each package island declaration, records how the pipeline resolved
45
+ * manifest flags (ssr, dsd, hydrate) into a concrete render path:
46
+ * - 'ssr+client': component is SSR-rendered + client-upgraded
47
+ * - 'client-only': component is client-only (ssr === false)
48
+ *
49
+ * When ctx or packageIslandDecls is absent, returns an empty array.
50
+ */ export function buildManifestDecisions(evidence) {
51
+ const decls = evidence.packageIslandDecls;
52
+ const manifests = evidence.packageManifests;
53
+ if (!decls?.length || !manifests?.length) return [];
54
+ // Build a tagName -> packageName lookup from manifests
55
+ const tagNameToPackage = new Map();
56
+ for (const pkg of manifests){
57
+ for (const decl of pkg.declarations){
58
+ tagNameToPackage.set(decl.tagName, pkg.packageName);
59
+ }
60
+ }
61
+ return decls.map((island)=>{
62
+ const admission = evidence.admissionDecisions?.find((d)=>d.tagName === island.tagName);
63
+ const ssr = admission?.renderPath === 'ssr+client';
64
+ const dsd = island.dsd !== false; // default: true
65
+ const renderPath = ssr ? 'ssr+client' : 'client-only';
66
+ return {
67
+ tagName: island.tagName,
68
+ packageName: tagNameToPackage.get(island.tagName) || 'unknown',
69
+ ssr,
70
+ dsd,
71
+ hydrate: island.hydrate,
72
+ renderPath,
73
+ reason: admission?.reason,
74
+ source: 'package'
75
+ };
76
+ });
77
+ }
78
+ // ─── CEM Compatibility Report Builder (v0.18.0) ─────────────────
79
+ /**
80
+ * Build a CEM compatibility report from CEM classifications.
81
+ *
82
+ * Summarizes how the compatibility classifier classified each third-party
83
+ * WC package component into a tier (ssr-capable, client-only, rejected,
84
+ * experimental-dom). Written to dsd-report.json for CI assertion.
85
+ *
86
+ * Returns undefined when no CEM classifications exist.
87
+ */ export function buildCemCompatibilityReport(classifications) {
88
+ if (!classifications?.length) return undefined;
89
+ const ssrCapableCount = classifications.filter((c)=>c.tier === 'ssr-capable').length;
90
+ const clientOnlyCount = classifications.filter((c)=>c.tier === 'client-only').length;
91
+ const rejectedCount = classifications.filter((c)=>c.tier === 'rejected').length;
92
+ const experimentalDomCount = classifications.filter((c)=>c.tier === 'experimental-dom').length;
93
+ // Order: rejected first (most critical), then ssr-capable, client-only, experimental-dom
94
+ const sortedClassifications = [
95
+ ...classifications
96
+ ].sort((a, b)=>{
97
+ const tierOrder = {
98
+ rejected: 0,
99
+ 'ssr-capable': 1,
100
+ 'client-only': 2,
101
+ 'experimental-dom': 3
102
+ };
103
+ return (tierOrder[a.tier] ?? 99) - (tierOrder[b.tier] ?? 99);
104
+ });
105
+ const summaryParts = [];
106
+ if (ssrCapableCount > 0) summaryParts.push(`${ssrCapableCount} ssr-capable`);
107
+ if (clientOnlyCount > 0) summaryParts.push(`${clientOnlyCount} client-only`);
108
+ if (rejectedCount > 0) summaryParts.push(`${rejectedCount} rejected`);
109
+ if (experimentalDomCount > 0) summaryParts.push(`${experimentalDomCount} experimental-dom`);
110
+ return {
111
+ totalClassified: classifications.length,
112
+ ssrCapableCount,
113
+ clientOnlyCount,
114
+ rejectedCount,
115
+ experimentalDomCount,
116
+ classifications: sortedClassifications,
117
+ summary: summaryParts.length > 0 ? `CEM: ${summaryParts.join(', ')}` : 'CEM: no components classified'
118
+ };
119
+ }
120
+ // ─── Report Assembly ────────────────────────────────────────────
121
+ /**
122
+ * Assemble the full dsd-report.json object from page diagnostics and evidence.
123
+ */ export function assembleDsdReport(pageDiagnostics, evidence) {
124
+ const totalErrors = pageDiagnostics.reduce((sum, p)=>sum + p.errors.length, 0);
125
+ const totalComponents = pageDiagnostics.reduce((sum, p)=>sum + p.componentCount, 0);
126
+ const totalRenderTimeMs = pageDiagnostics.reduce((sum, p)=>sum + p.renderTimeMs, 0);
127
+ const totalTemplateSize = pageDiagnostics.reduce((sum, p)=>sum + p.hydrationHints.length, 0);
128
+ const errorComponentCount = pageDiagnostics.filter((p)=>p.errors.length > 0).length;
129
+ const maxNestingDepth = 0; // Determined from collector, not per-page
130
+ const interactiveCount = pageDiagnostics.reduce((sum, p)=>sum + p.hydrationHints.filter((h)=>h.layer === 'dsd-interactive').length, 0);
131
+ const pureIslandCount = pageDiagnostics.reduce((sum, p)=>sum + p.hydrationHints.filter((h)=>h.layer === 'pure-island').length, 0);
132
+ const totalHints = pageDiagnostics.reduce((sum, p)=>sum + p.hydrationHints.length, 0);
133
+ const strategySummary = buildHydrationStrategySummary(evidence);
134
+ return {
135
+ reportVersion: '1.2.0',
136
+ timestamp: new Date().toISOString(),
137
+ totalPages: pageDiagnostics.length,
138
+ totalErrors,
139
+ renderErrors: pageDiagnostics.map((p)=>({
140
+ path: p.path,
141
+ errors: p.errors,
142
+ hydrationHints: p.hydrationHints,
143
+ componentCount: p.componentCount,
144
+ renderTimeMs: p.renderTimeMs
145
+ })),
146
+ metricsSummary: {
147
+ totalComponents,
148
+ totalRenderTimeMs,
149
+ avgRenderTimeMs: totalComponents > 0 ? Math.round(totalRenderTimeMs / totalComponents * 100) / 100 : 0,
150
+ totalTemplateSize,
151
+ maxNestingDepth,
152
+ errorComponentCount
153
+ },
154
+ hydrationHintSummary: {
155
+ totalHints,
156
+ interactiveCount,
157
+ pureIslandCount
158
+ },
159
+ hydrationStrategySummary: strategySummary,
160
+ manifestDecisions: buildManifestDecisions(evidence),
161
+ admissionDecisions: evidence.admissionDecisions || [],
162
+ cemCompatibility: buildCemCompatibilityReport(evidence.cemClassifications)
163
+ };
164
+ }
165
+ /**
166
+ * Write the DSD report to the output directory.
167
+ */ export function writeDsdReport(outputDir, report) {
168
+ const reportPath = join(outputDir, 'dsd-report.json');
169
+ writeFileSync(reportPath, writeJson(report), 'utf-8');
170
+ log.info(`DSD report -> ${reportPath} (${report.totalPages} pages, ${report.totalErrors} errors)`);
171
+ }
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9zc2cvc3JjL3NzZy1yZXBvcnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAb3BlbmVsZW1lbnQvc3NnIC0gRFNEIHJlcG9ydCBhc3NlbWJseVxuICpcbiAqIEJ1aWxkcyB0aGUgZHNkLXJlcG9ydC5qc29uIGNvbnRlbnRzIGZyb20gcmVuZGVyIGRpYWdub3N0aWNzLFxuICogaHlkcmF0aW9uIHN0cmF0ZWd5IHN1bW1hcnksIG1hbmlmZXN0IGRlY2lzaW9ucywgYW5kIENFTVxuICogY29tcGF0aWJpbGl0eSBjbGFzc2lmaWNhdGlvbnMuXG4gKi9cblxuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyB3cml0ZUZpbGVTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICdAb3BlbmVsZW1lbnQvY29yZS9sb2dnZXInO1xuaW1wb3J0IHsgd3JpdGVKc29uIH0gZnJvbSAnQG9wZW5lbGVtZW50L2NvbnRlbnQvd3JpdGUtanNvbic7XG5pbXBvcnQgdHlwZSB7IENlbUNvbXBhdGliaWxpdHlSZXBvcnQgfSBmcm9tICdAb3BlbmVsZW1lbnQvcHJvdG9jb2wvbWFuaWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21wYXRpYmlsaXR5Q2xhc3NpZmljYXRpb24gfSBmcm9tICdAb3BlbmVsZW1lbnQvcHJvdG9jb2wvZnJhbWV3b3JrJztcbmltcG9ydCB0eXBlIHtcbiAgRHNkQnVpbGRSZXBvcnQsXG4gIERzZEh5ZHJhdGlvblN0cmF0ZWd5U3VtbWFyeSxcbiAgTWFuaWZlc3REZWNpc2lvbixcbn0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3JlbmRlcic7XG5pbXBvcnQgdHlwZSB7IFNzZ1JlbmRlckV2aWRlbmNlIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3NzZyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2VEaWFnbm9zdGljIH0gZnJvbSAnLi9zc2ctaGVscGVycy5qcyc7XG5cbmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcignc3NnJyk7XG5cbi8vIOKUgOKUgOKUgCBIeWRyYXRpb24gU3RyYXRlZ3kgU3VtbWFyeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBCdWlsZCBhIHN1bW1hcnkgb2YgaHlkcmF0aW9uIHN0cmF0ZWdpZXMgdXNlZCBhY3Jvc3MgYWxsIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEh5ZHJhdGlvblN0cmF0ZWd5U3VtbWFyeShcbiAgZXZpZGVuY2U6IFNzZ1JlbmRlckV2aWRlbmNlLFxuKTogRHNkSHlkcmF0aW9uU3RyYXRlZ3lTdW1tYXJ5IHtcbiAgY29uc3Qgc3VtbWFyeTogRHNkSHlkcmF0aW9uU3RyYXRlZ3lTdW1tYXJ5ID0ge1xuICAgIGxvYWQ6IDAsXG4gICAgaWRsZTogMCxcbiAgICB2aXNpYmxlOiAwLFxuICAgIG9ubHk6IDAsXG4gICAgY2xpZW50T25seUV4Y2x1ZGVkOiAwLFxuICB9O1xuICBjb25zdCBkZWNpc2lvbnMgPSBldmlkZW5jZS5hZG1pc3Npb25EZWNpc2lvbnMgfHwgW107XG4gIGNvbnN0IGxvY2FsTWV0YSA9IGV2aWRlbmNlLmxvY2FsSXNsYW5kTWV0YSB8fCB7fTtcblxuICBmb3IgKGNvbnN0IG1ldGEgb2YgT2JqZWN0LnZhbHVlcyhsb2NhbE1ldGEpKSB7XG4gICAgY29uc3Qgc3RyYXRlZ3kgPSBtZXRhLmh5ZHJhdGUgfHwgJ2lkbGUnO1xuICAgIGlmIChzdHJhdGVneSBpbiBzdW1tYXJ5KSB7XG4gICAgICBzdW1tYXJ5W3N0cmF0ZWd5IGFzIGtleW9mIHR5cGVvZiBzdW1tYXJ5XSsrO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGRlY2wgb2YgZXZpZGVuY2UucGFja2FnZUlzbGFuZERlY2xzIHx8IFtdKSB7XG4gICAgY29uc3Qgc3RyYXRlZ3kgPSBkZWNsLmh5ZHJhdGUgfHwgJ2lkbGUnO1xuICAgIGlmIChzdHJhdGVneSBpbiBzdW1tYXJ5KSB7XG4gICAgICBzdW1tYXJ5W3N0cmF0ZWd5IGFzIGtleW9mIHR5cGVvZiBzdW1tYXJ5XSsrO1xuICAgIH1cbiAgfVxuICBzdW1tYXJ5LmNsaWVudE9ubHlFeGNsdWRlZCA9IGRlY2lzaW9ucy5maWx0ZXIoKGQpID0+IGQucmVuZGVyUGF0aCA9PT0gJ2NsaWVudC1vbmx5JykubGVuZ3RoO1xuICByZXR1cm4gc3VtbWFyeTtcbn1cblxuLy8g4pSA4pSA4pSAIE1hbmlmZXN0IERlY2lzaW9ucyBCdWlsZGVyICh2MC4xNy4yKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBCdWlsZCBtYW5pZmVzdC1kcml2ZW4gcmVuZGVyIGRlY2lzaW9ucyBmcm9tIGN0eC5cbiAqXG4gKiBGb3IgZWFjaCBwYWNrYWdlIGlzbGFuZCBkZWNsYXJhdGlvbiwgcmVjb3JkcyBob3cgdGhlIHBpcGVsaW5lIHJlc29sdmVkXG4gKiBtYW5pZmVzdCBmbGFncyAoc3NyLCBkc2QsIGh5ZHJhdGUpIGludG8gYSBjb25jcmV0ZSByZW5kZXIgcGF0aDpcbiAqIC0gJ3NzcitjbGllbnQnOiBjb21wb25lbnQgaXMgU1NSLXJlbmRlcmVkICsgY2xpZW50LXVwZ3JhZGVkXG4gKiAtICdjbGllbnQtb25seSc6IGNvbXBvbmVudCBpcyBjbGllbnQtb25seSAoc3NyID09PSBmYWxzZSlcbiAqXG4gKiBXaGVuIGN0eCBvciBwYWNrYWdlSXNsYW5kRGVjbHMgaXMgYWJzZW50LCByZXR1cm5zIGFuIGVtcHR5IGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRNYW5pZmVzdERlY2lzaW9ucyhcbiAgZXZpZGVuY2U6IFNzZ1JlbmRlckV2aWRlbmNlLFxuKTogTWFuaWZlc3REZWNpc2lvbltdIHtcbiAgY29uc3QgZGVjbHMgPSBldmlkZW5jZS5wYWNrYWdlSXNsYW5kRGVjbHM7XG4gIGNvbnN0IG1hbmlmZXN0cyA9IGV2aWRlbmNlLnBhY2thZ2VNYW5pZmVzdHM7XG4gIGlmICghZGVjbHM/Lmxlbmd0aCB8fCAhbWFuaWZlc3RzPy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAvLyBCdWlsZCBhIHRhZ05hbWUgLT4gcGFja2FnZU5hbWUgbG9va3VwIGZyb20gbWFuaWZlc3RzXG4gIGNvbnN0IHRhZ05hbWVUb1BhY2thZ2UgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHBrZyBvZiBtYW5pZmVzdHMpIHtcbiAgICBmb3IgKGNvbnN0IGRlY2wgb2YgcGtnLmRlY2xhcmF0aW9ucykge1xuICAgICAgdGFnTmFtZVRvUGFja2FnZS5zZXQoZGVjbC50YWdOYW1lLCBwa2cucGFja2FnZU5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkZWNscy5tYXAoKGlzbGFuZCkgPT4ge1xuICAgIGNvbnN0IGFkbWlzc2lvbiA9IGV2aWRlbmNlLmFkbWlzc2lvbkRlY2lzaW9ucz8uZmluZChcbiAgICAgIChkKSA9PiBkLnRhZ05hbWUgPT09IGlzbGFuZC50YWdOYW1lLFxuICAgICk7XG4gICAgY29uc3Qgc3NyID0gYWRtaXNzaW9uPy5yZW5kZXJQYXRoID09PSAnc3NyK2NsaWVudCc7XG4gICAgY29uc3QgZHNkID0gaXNsYW5kLmRzZCAhPT0gZmFsc2U7IC8vIGRlZmF1bHQ6IHRydWVcbiAgICBjb25zdCByZW5kZXJQYXRoOiBNYW5pZmVzdERlY2lzaW9uWydyZW5kZXJQYXRoJ10gPSBzc3IgPyAnc3NyK2NsaWVudCcgOiAnY2xpZW50LW9ubHknO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRhZ05hbWU6IGlzbGFuZC50YWdOYW1lLFxuICAgICAgcGFja2FnZU5hbWU6IHRhZ05hbWVUb1BhY2thZ2UuZ2V0KGlzbGFuZC50YWdOYW1lKSB8fCAndW5rbm93bicsXG4gICAgICBzc3IsXG4gICAgICBkc2QsXG4gICAgICBoeWRyYXRlOiBpc2xhbmQuaHlkcmF0ZSxcbiAgICAgIHJlbmRlclBhdGgsXG4gICAgICByZWFzb246IGFkbWlzc2lvbj8ucmVhc29uLFxuICAgICAgc291cmNlOiAncGFja2FnZScsXG4gICAgfTtcbiAgfSk7XG59XG5cbi8vIOKUgOKUgOKUgCBDRU0gQ29tcGF0aWJpbGl0eSBSZXBvcnQgQnVpbGRlciAodjAuMTguMCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQnVpbGQgYSBDRU0gY29tcGF0aWJpbGl0eSByZXBvcnQgZnJvbSBDRU0gY2xhc3NpZmljYXRpb25zLlxuICpcbiAqIFN1bW1hcml6ZXMgaG93IHRoZSBjb21wYXRpYmlsaXR5IGNsYXNzaWZpZXIgY2xhc3NpZmllZCBlYWNoIHRoaXJkLXBhcnR5XG4gKiBXQyBwYWNrYWdlIGNvbXBvbmVudCBpbnRvIGEgdGllciAoc3NyLWNhcGFibGUsIGNsaWVudC1vbmx5LCByZWplY3RlZCxcbiAqIGV4cGVyaW1lbnRhbC1kb20pLiBXcml0dGVuIHRvIGRzZC1yZXBvcnQuanNvbiBmb3IgQ0kgYXNzZXJ0aW9uLlxuICpcbiAqIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gbm8gQ0VNIGNsYXNzaWZpY2F0aW9ucyBleGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2VtQ29tcGF0aWJpbGl0eVJlcG9ydChcbiAgY2xhc3NpZmljYXRpb25zPzogQ29tcGF0aWJpbGl0eUNsYXNzaWZpY2F0aW9uW10sXG4pOiBDZW1Db21wYXRpYmlsaXR5UmVwb3J0IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjbGFzc2lmaWNhdGlvbnM/Lmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBzc3JDYXBhYmxlQ291bnQgPSBjbGFzc2lmaWNhdGlvbnMuZmlsdGVyKChjKSA9PiBjLnRpZXIgPT09ICdzc3ItY2FwYWJsZScpLmxlbmd0aDtcbiAgY29uc3QgY2xpZW50T25seUNvdW50ID0gY2xhc3NpZmljYXRpb25zLmZpbHRlcigoYykgPT4gYy50aWVyID09PSAnY2xpZW50LW9ubHknKS5sZW5ndGg7XG4gIGNvbnN0IHJlamVjdGVkQ291bnQgPSBjbGFzc2lmaWNhdGlvbnMuZmlsdGVyKChjKSA9PiBjLnRpZXIgPT09ICdyZWplY3RlZCcpLmxlbmd0aDtcbiAgY29uc3QgZXhwZXJpbWVudGFsRG9tQ291bnQgPSBjbGFzc2lmaWNhdGlvbnMuZmlsdGVyKChjKSA9PiBjLnRpZXIgPT09ICdleHBlcmltZW50YWwtZG9tJykubGVuZ3RoO1xuXG4gIC8vIE9yZGVyOiByZWplY3RlZCBmaXJzdCAobW9zdCBjcml0aWNhbCksIHRoZW4gc3NyLWNhcGFibGUsIGNsaWVudC1vbmx5LCBleHBlcmltZW50YWwtZG9tXG4gIGNvbnN0IHNvcnRlZENsYXNzaWZpY2F0aW9ucyA9IFsuLi5jbGFzc2lmaWNhdGlvbnNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCB0aWVyT3JkZXIgPSB7XG4gICAgICByZWplY3RlZDogMCxcbiAgICAgICdzc3ItY2FwYWJsZSc6IDEsXG4gICAgICAnY2xpZW50LW9ubHknOiAyLFxuICAgICAgJ2V4cGVyaW1lbnRhbC1kb20nOiAzLFxuICAgIH07XG4gICAgcmV0dXJuICh0aWVyT3JkZXJbYS50aWVyXSA/PyA5OSkgLSAodGllck9yZGVyW2IudGllcl0gPz8gOTkpO1xuICB9KTtcblxuICBjb25zdCBzdW1tYXJ5UGFydHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChzc3JDYXBhYmxlQ291bnQgPiAwKSBzdW1tYXJ5UGFydHMucHVzaChgJHtzc3JDYXBhYmxlQ291bnR9IHNzci1jYXBhYmxlYCk7XG4gIGlmIChjbGllbnRPbmx5Q291bnQgPiAwKSBzdW1tYXJ5UGFydHMucHVzaChgJHtjbGllbnRPbmx5Q291bnR9IGNsaWVudC1vbmx5YCk7XG4gIGlmIChyZWplY3RlZENvdW50ID4gMCkgc3VtbWFyeVBhcnRzLnB1c2goYCR7cmVqZWN0ZWRDb3VudH0gcmVqZWN0ZWRgKTtcbiAgaWYgKGV4cGVyaW1lbnRhbERvbUNvdW50ID4gMCkgc3VtbWFyeVBhcnRzLnB1c2goYCR7ZXhwZXJpbWVudGFsRG9tQ291bnR9IGV4cGVyaW1lbnRhbC1kb21gKTtcblxuICByZXR1cm4ge1xuICAgIHRvdGFsQ2xhc3NpZmllZDogY2xhc3NpZmljYXRpb25zLmxlbmd0aCxcbiAgICBzc3JDYXBhYmxlQ291bnQsXG4gICAgY2xpZW50T25seUNvdW50LFxuICAgIHJlamVjdGVkQ291bnQsXG4gICAgZXhwZXJpbWVudGFsRG9tQ291bnQsXG4gICAgY2xhc3NpZmljYXRpb25zOiBzb3J0ZWRDbGFzc2lmaWNhdGlvbnMsXG4gICAgc3VtbWFyeTogc3VtbWFyeVBhcnRzLmxlbmd0aCA+IDBcbiAgICAgID8gYENFTTogJHtzdW1tYXJ5UGFydHMuam9pbignLCAnKX1gXG4gICAgICA6ICdDRU06IG5vIGNvbXBvbmVudHMgY2xhc3NpZmllZCcsXG4gIH07XG59XG5cbi8vIOKUgOKUgOKUgCBSZXBvcnQgQXNzZW1ibHkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQXNzZW1ibGUgdGhlIGZ1bGwgZHNkLXJlcG9ydC5qc29uIG9iamVjdCBmcm9tIHBhZ2UgZGlhZ25vc3RpY3MgYW5kIGV2aWRlbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVEc2RSZXBvcnQoXG4gIHBhZ2VEaWFnbm9zdGljczogUGFnZURpYWdub3N0aWNbXSxcbiAgZXZpZGVuY2U6IFNzZ1JlbmRlckV2aWRlbmNlLFxuKTogRHNkQnVpbGRSZXBvcnQge1xuICBjb25zdCB0b3RhbEVycm9ycyA9IHBhZ2VEaWFnbm9zdGljcy5yZWR1Y2UoXG4gICAgKHN1bSwgcCkgPT4gc3VtICsgcC5lcnJvcnMubGVuZ3RoLFxuICAgIDAsXG4gICk7XG4gIGNvbnN0IHRvdGFsQ29tcG9uZW50cyA9IHBhZ2VEaWFnbm9zdGljcy5yZWR1Y2UoXG4gICAgKHN1bSwgcCkgPT4gc3VtICsgcC5jb21wb25lbnRDb3VudCxcbiAgICAwLFxuICApO1xuICBjb25zdCB0b3RhbFJlbmRlclRpbWVNcyA9IHBhZ2VEaWFnbm9zdGljcy5yZWR1Y2UoXG4gICAgKHN1bSwgcCkgPT4gc3VtICsgcC5yZW5kZXJUaW1lTXMsXG4gICAgMCxcbiAgKTtcbiAgY29uc3QgdG90YWxUZW1wbGF0ZVNpemUgPSBwYWdlRGlhZ25vc3RpY3MucmVkdWNlKFxuICAgIChzdW0sIHApID0+IHN1bSArIHAuaHlkcmF0aW9uSGludHMubGVuZ3RoLFxuICAgIDAsXG4gICk7XG4gIGNvbnN0IGVycm9yQ29tcG9uZW50Q291bnQgPSBwYWdlRGlhZ25vc3RpY3MuZmlsdGVyKFxuICAgIChwKSA9PiBwLmVycm9ycy5sZW5ndGggPiAwLFxuICApLmxlbmd0aDtcbiAgY29uc3QgbWF4TmVzdGluZ0RlcHRoID0gMDsgLy8gRGV0ZXJtaW5lZCBmcm9tIGNvbGxlY3Rvciwgbm90IHBlci1wYWdlXG4gIGNvbnN0IGludGVyYWN0aXZlQ291bnQgPSBwYWdlRGlhZ25vc3RpY3MucmVkdWNlKFxuICAgIChzdW0sIHApID0+IHN1bSArIHAuaHlkcmF0aW9uSGludHMuZmlsdGVyKChoKSA9PiBoLmxheWVyID09PSAnZHNkLWludGVyYWN0aXZlJykubGVuZ3RoLFxuICAgIDAsXG4gICk7XG4gIGNvbnN0IHB1cmVJc2xhbmRDb3VudCA9IHBhZ2VEaWFnbm9zdGljcy5yZWR1Y2UoXG4gICAgKHN1bSwgcCkgPT4gc3VtICsgcC5oeWRyYXRpb25IaW50cy5maWx0ZXIoKGgpID0+IGgubGF5ZXIgPT09ICdwdXJlLWlzbGFuZCcpLmxlbmd0aCxcbiAgICAwLFxuICApO1xuICBjb25zdCB0b3RhbEhpbnRzID0gcGFnZURpYWdub3N0aWNzLnJlZHVjZShcbiAgICAoc3VtLCBwKSA9PiBzdW0gKyBwLmh5ZHJhdGlvbkhpbnRzLmxlbmd0aCxcbiAgICAwLFxuICApO1xuICBjb25zdCBzdHJhdGVneVN1bW1hcnkgPSBidWlsZEh5ZHJhdGlvblN0cmF0ZWd5U3VtbWFyeShldmlkZW5jZSk7XG5cbiAgcmV0dXJuIHtcbiAgICByZXBvcnRWZXJzaW9uOiAnMS4yLjAnLFxuICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIHRvdGFsUGFnZXM6IHBhZ2VEaWFnbm9zdGljcy5sZW5ndGgsXG4gICAgdG90YWxFcnJvcnMsXG4gICAgcmVuZGVyRXJyb3JzOiBwYWdlRGlhZ25vc3RpY3MubWFwKChwKSA9PiAoe1xuICAgICAgcGF0aDogcC5wYXRoLFxuICAgICAgZXJyb3JzOiBwLmVycm9ycyxcbiAgICAgIGh5ZHJhdGlvbkhpbnRzOiBwLmh5ZHJhdGlvbkhpbnRzLFxuICAgICAgY29tcG9uZW50Q291bnQ6IHAuY29tcG9uZW50Q291bnQsXG4gICAgICByZW5kZXJUaW1lTXM6IHAucmVuZGVyVGltZU1zLFxuICAgIH0pKSxcbiAgICBtZXRyaWNzU3VtbWFyeToge1xuICAgICAgdG90YWxDb21wb25lbnRzLFxuICAgICAgdG90YWxSZW5kZXJUaW1lTXMsXG4gICAgICBhdmdSZW5kZXJUaW1lTXM6IHRvdGFsQ29tcG9uZW50cyA+IDBcbiAgICAgICAgPyBNYXRoLnJvdW5kKHRvdGFsUmVuZGVyVGltZU1zIC8gdG90YWxDb21wb25lbnRzICogMTAwKSAvIDEwMFxuICAgICAgICA6IDAsXG4gICAgICB0b3RhbFRlbXBsYXRlU2l6ZSxcbiAgICAgIG1heE5lc3RpbmdEZXB0aCxcbiAgICAgIGVycm9yQ29tcG9uZW50Q291bnQsXG4gICAgfSxcbiAgICBoeWRyYXRpb25IaW50U3VtbWFyeToge1xuICAgICAgdG90YWxIaW50cyxcbiAgICAgIGludGVyYWN0aXZlQ291bnQsXG4gICAgICBwdXJlSXNsYW5kQ291bnQsXG4gICAgfSxcbiAgICBoeWRyYXRpb25TdHJhdGVneVN1bW1hcnk6IHN0cmF0ZWd5U3VtbWFyeSxcbiAgICBtYW5pZmVzdERlY2lzaW9uczogYnVpbGRNYW5pZmVzdERlY2lzaW9ucyhldmlkZW5jZSksXG4gICAgYWRtaXNzaW9uRGVjaXNpb25zOiBldmlkZW5jZS5hZG1pc3Npb25EZWNpc2lvbnMgfHwgW10sXG4gICAgY2VtQ29tcGF0aWJpbGl0eTogYnVpbGRDZW1Db21wYXRpYmlsaXR5UmVwb3J0KFxuICAgICAgZXZpZGVuY2UuY2VtQ2xhc3NpZmljYXRpb25zLFxuICAgICksXG4gIH07XG59XG5cbi8qKlxuICogV3JpdGUgdGhlIERTRCByZXBvcnQgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURzZFJlcG9ydChcbiAgb3V0cHV0RGlyOiBzdHJpbmcsXG4gIHJlcG9ydDogRHNkQnVpbGRSZXBvcnQsXG4pOiB2b2lkIHtcbiAgY29uc3QgcmVwb3J0UGF0aCA9IGpvaW4ob3V0cHV0RGlyLCAnZHNkLXJlcG9ydC5qc29uJyk7XG4gIHdyaXRlRmlsZVN5bmMocmVwb3J0UGF0aCwgd3JpdGVKc29uKHJlcG9ydCksICd1dGYtOCcpO1xuICBsb2cuaW5mbyhcbiAgICBgRFNEIHJlcG9ydCAtPiAke3JlcG9ydFBhdGh9ICgke3JlcG9ydC50b3RhbFBhZ2VzfSBwYWdlcywgJHtyZXBvcnQudG90YWxFcnJvcnN9IGVycm9ycylgLFxuICApO1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Q0FNQyxHQUVELFNBQVMsSUFBSSxRQUFRLFlBQVk7QUFDakMsU0FBUyxhQUFhLFFBQVEsVUFBVTtBQUN4QyxTQUFTLFlBQVksUUFBUSwyQkFBMkI7QUFDeEQsU0FBUyxTQUFTLFFBQVEsa0NBQWtDO0FBVzVELE1BQU0sTUFBTSxhQUFhO0FBRXpCLGtFQUFrRTtBQUVsRTs7Q0FFQyxHQUNELE9BQU8sU0FBUyw4QkFDZCxRQUEyQjtFQUUzQixNQUFNLFVBQXVDO0lBQzNDLE1BQU07SUFDTixNQUFNO0lBQ04sU0FBUztJQUNULE1BQU07SUFDTixvQkFBb0I7RUFDdEI7RUFDQSxNQUFNLFlBQVksU0FBUyxrQkFBa0IsSUFBSSxFQUFFO0VBQ25ELE1BQU0sWUFBWSxTQUFTLGVBQWUsSUFBSSxDQUFDO0VBRS9DLEtBQUssTUFBTSxRQUFRLE9BQU8sTUFBTSxDQUFDLFdBQVk7SUFDM0MsTUFBTSxXQUFXLEtBQUssT0FBTyxJQUFJO0lBQ2pDLElBQUksWUFBWSxTQUFTO01BQ3ZCLE9BQU8sQ0FBQyxTQUFpQztJQUMzQztFQUNGO0VBQ0EsS0FBSyxNQUFNLFFBQVEsU0FBUyxrQkFBa0IsSUFBSSxFQUFFLENBQUU7SUFDcEQsTUFBTSxXQUFXLEtBQUssT0FBTyxJQUFJO0lBQ2pDLElBQUksWUFBWSxTQUFTO01BQ3ZCLE9BQU8sQ0FBQyxTQUFpQztJQUMzQztFQUNGO0VBQ0EsUUFBUSxrQkFBa0IsR0FBRyxVQUFVLE1BQU0sQ0FBQyxDQUFDLElBQU0sRUFBRSxVQUFVLEtBQUssZUFBZSxNQUFNO0VBQzNGLE9BQU87QUFDVDtBQUVBLG1FQUFtRTtBQUVuRTs7Ozs7Ozs7O0NBU0MsR0FDRCxPQUFPLFNBQVMsdUJBQ2QsUUFBMkI7RUFFM0IsTUFBTSxRQUFRLFNBQVMsa0JBQWtCO0VBQ3pDLE1BQU0sWUFBWSxTQUFTLGdCQUFnQjtFQUMzQyxJQUFJLENBQUMsT0FBTyxVQUFVLENBQUMsV0FBVyxRQUFRLE9BQU8sRUFBRTtFQUVuRCx1REFBdUQ7RUFDdkQsTUFBTSxtQkFBbUIsSUFBSTtFQUM3QixLQUFLLE1BQU0sT0FBTyxVQUFXO0lBQzNCLEtBQUssTUFBTSxRQUFRLElBQUksWUFBWSxDQUFFO01BQ25DLGlCQUFpQixHQUFHLENBQUMsS0FBSyxPQUFPLEVBQUUsSUFBSSxXQUFXO0lBQ3BEO0VBQ0Y7RUFFQSxPQUFPLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDaEIsTUFBTSxZQUFZLFNBQVMsa0JBQWtCLEVBQUUsS0FDN0MsQ0FBQyxJQUFNLEVBQUUsT0FBTyxLQUFLLE9BQU8sT0FBTztJQUVyQyxNQUFNLE1BQU0sV0FBVyxlQUFlO0lBQ3RDLE1BQU0sTUFBTSxPQUFPLEdBQUcsS0FBSyxPQUFPLGdCQUFnQjtJQUNsRCxNQUFNLGFBQTZDLE1BQU0sZUFBZTtJQUV4RSxPQUFPO01BQ0wsU0FBUyxPQUFPLE9BQU87TUFDdkIsYUFBYSxpQkFBaUIsR0FBRyxDQUFDLE9BQU8sT0FBTyxLQUFLO01BQ3JEO01BQ0E7TUFDQSxTQUFTLE9BQU8sT0FBTztNQUN2QjtNQUNBLFFBQVEsV0FBVztNQUNuQixRQUFRO0lBQ1Y7RUFDRjtBQUNGO0FBRUEsbUVBQW1FO0FBRW5FOzs7Ozs7OztDQVFDLEdBQ0QsT0FBTyxTQUFTLDRCQUNkLGVBQStDO0VBRS9DLElBQUksQ0FBQyxpQkFBaUIsUUFBUSxPQUFPO0VBRXJDLE1BQU0sa0JBQWtCLGdCQUFnQixNQUFNLENBQUMsQ0FBQyxJQUFNLEVBQUUsSUFBSSxLQUFLLGVBQWUsTUFBTTtFQUN0RixNQUFNLGtCQUFrQixnQkFBZ0IsTUFBTSxDQUFDLENBQUMsSUFBTSxFQUFFLElBQUksS0FBSyxlQUFlLE1BQU07RUFDdEYsTUFBTSxnQkFBZ0IsZ0JBQWdCLE1BQU0sQ0FBQyxDQUFDLElBQU0sRUFBRSxJQUFJLEtBQUssWUFBWSxNQUFNO0VBQ2pGLE1BQU0sdUJBQXVCLGdCQUFnQixNQUFNLENBQUMsQ0FBQyxJQUFNLEVBQUUsSUFBSSxLQUFLLG9CQUFvQixNQUFNO0VBRWhHLHlGQUF5RjtFQUN6RixNQUFNLHdCQUF3QjtPQUFJO0dBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRztJQUMxRCxNQUFNLFlBQVk7TUFDaEIsVUFBVTtNQUNWLGVBQWU7TUFDZixlQUFlO01BQ2Ysb0JBQW9CO0lBQ3RCO0lBQ0EsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7RUFDN0Q7RUFFQSxNQUFNLGVBQXlCLEVBQUU7RUFDakMsSUFBSSxrQkFBa0IsR0FBRyxhQUFhLElBQUksQ0FBQyxHQUFHLGdCQUFnQixZQUFZLENBQUM7RUFDM0UsSUFBSSxrQkFBa0IsR0FBRyxhQUFhLElBQUksQ0FBQyxHQUFHLGdCQUFnQixZQUFZLENBQUM7RUFDM0UsSUFBSSxnQkFBZ0IsR0FBRyxhQUFhLElBQUksQ0FBQyxHQUFHLGNBQWMsU0FBUyxDQUFDO0VBQ3BFLElBQUksdUJBQXVCLEdBQUcsYUFBYSxJQUFJLENBQUMsR0FBRyxxQkFBcUIsaUJBQWlCLENBQUM7RUFFMUYsT0FBTztJQUNMLGlCQUFpQixnQkFBZ0IsTUFBTTtJQUN2QztJQUNBO0lBQ0E7SUFDQTtJQUNBLGlCQUFpQjtJQUNqQixTQUFTLGFBQWEsTUFBTSxHQUFHLElBQzNCLENBQUMsS0FBSyxFQUFFLGFBQWEsSUFBSSxDQUFDLE9BQU8sR0FDakM7RUFDTjtBQUNGO0FBRUEsbUVBQW1FO0FBRW5FOztDQUVDLEdBQ0QsT0FBTyxTQUFTLGtCQUNkLGVBQWlDLEVBQ2pDLFFBQTJCO0VBRTNCLE1BQU0sY0FBYyxnQkFBZ0IsTUFBTSxDQUN4QyxDQUFDLEtBQUssSUFBTSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFDakM7RUFFRixNQUFNLGtCQUFrQixnQkFBZ0IsTUFBTSxDQUM1QyxDQUFDLEtBQUssSUFBTSxNQUFNLEVBQUUsY0FBYyxFQUNsQztFQUVGLE1BQU0sb0JBQW9CLGdCQUFnQixNQUFNLENBQzlDLENBQUMsS0FBSyxJQUFNLE1BQU0sRUFBRSxZQUFZLEVBQ2hDO0VBRUYsTUFBTSxvQkFBb0IsZ0JBQWdCLE1BQU0sQ0FDOUMsQ0FBQyxLQUFLLElBQU0sTUFBTSxFQUFFLGNBQWMsQ0FBQyxNQUFNLEVBQ3pDO0VBRUYsTUFBTSxzQkFBc0IsZ0JBQWdCLE1BQU0sQ0FDaEQsQ0FBQyxJQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUN6QixNQUFNO0VBQ1IsTUFBTSxrQkFBa0IsR0FBRywwQ0FBMEM7RUFDckUsTUFBTSxtQkFBbUIsZ0JBQWdCLE1BQU0sQ0FDN0MsQ0FBQyxLQUFLLElBQU0sTUFBTSxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFNLEVBQUUsS0FBSyxLQUFLLG1CQUFtQixNQUFNLEVBQ3RGO0VBRUYsTUFBTSxrQkFBa0IsZ0JBQWdCLE1BQU0sQ0FDNUMsQ0FBQyxLQUFLLElBQU0sTUFBTSxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFNLEVBQUUsS0FBSyxLQUFLLGVBQWUsTUFBTSxFQUNsRjtFQUVGLE1BQU0sYUFBYSxnQkFBZ0IsTUFBTSxDQUN2QyxDQUFDLEtBQUssSUFBTSxNQUFNLEVBQUUsY0FBYyxDQUFDLE1BQU0sRUFDekM7RUFFRixNQUFNLGtCQUFrQiw4QkFBOEI7RUFFdEQsT0FBTztJQUNMLGVBQWU7SUFDZixXQUFXLElBQUksT0FBTyxXQUFXO0lBQ2pDLFlBQVksZ0JBQWdCLE1BQU07SUFDbEM7SUFDQSxjQUFjLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxJQUFNLENBQUM7UUFDeEMsTUFBTSxFQUFFLElBQUk7UUFDWixRQUFRLEVBQUUsTUFBTTtRQUNoQixnQkFBZ0IsRUFBRSxjQUFjO1FBQ2hDLGdCQUFnQixFQUFFLGNBQWM7UUFDaEMsY0FBYyxFQUFFLFlBQVk7TUFDOUIsQ0FBQztJQUNELGdCQUFnQjtNQUNkO01BQ0E7TUFDQSxpQkFBaUIsa0JBQWtCLElBQy9CLEtBQUssS0FBSyxDQUFDLG9CQUFvQixrQkFBa0IsT0FBTyxNQUN4RDtNQUNKO01BQ0E7TUFDQTtJQUNGO0lBQ0Esc0JBQXNCO01BQ3BCO01BQ0E7TUFDQTtJQUNGO0lBQ0EsMEJBQTBCO0lBQzFCLG1CQUFtQix1QkFBdUI7SUFDMUMsb0JBQW9CLFNBQVMsa0JBQWtCLElBQUksRUFBRTtJQUNyRCxrQkFBa0IsNEJBQ2hCLFNBQVMsa0JBQWtCO0VBRS9CO0FBQ0Y7QUFFQTs7Q0FFQyxHQUNELE9BQU8sU0FBUyxlQUNkLFNBQWlCLEVBQ2pCLE1BQXNCO0VBRXRCLE1BQU0sYUFBYSxLQUFLLFdBQVc7RUFDbkMsY0FBYyxZQUFZLFVBQVUsU0FBUztFQUM3QyxJQUFJLElBQUksQ0FDTixDQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUUsRUFBRSxPQUFPLFVBQVUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxXQUFXLENBQUMsUUFBUSxDQUFDO0FBRTVGIn0=
@@ -0,0 +1,15 @@
1
+ /**
2
+ * SSR Polyfills for browser-only APIs.
3
+ *
4
+ * Polyfill 分层策略(ADR-0044):
5
+ * - Entry code body (this module): CSSStyleSheet — needs `import { StyleSheet } from @openelement/core`
6
+ * - Output banner (build-ssg.ts): HTMLElement + customElements — no import, runs before module evaluation
7
+ *
8
+ * ADR-0044: SSR polyfill strategy — browser globals in Deno SSR runtime.
9
+ */ /**
10
+ * Generates the entry-code polyfill (CSSStyleSheet only).
11
+ *
12
+ * HTMLElement and customElements are in output.banner (build-ssg.ts)
13
+ * because they must execute BEFORE any ESM import is evaluated.
14
+ * CSSStyleSheet lives here because it needs `import { StyleSheet }`.
15
+ */ export declare function generateSsrPolyfillBanner(): string;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SSR Polyfills for browser-only APIs.
3
+ *
4
+ * Polyfill 分层策略(ADR-0044):
5
+ * - Entry code body (this module): CSSStyleSheet — needs `import { StyleSheet } from @openelement/core`
6
+ * - Output banner (build-ssg.ts): HTMLElement + customElements — no import, runs before module evaluation
7
+ *
8
+ * ADR-0044: SSR polyfill strategy — browser globals in Deno SSR runtime.
9
+ */ /**
10
+ * Generates the entry-code polyfill (CSSStyleSheet only).
11
+ *
12
+ * HTMLElement and customElements are in output.banner (build-ssg.ts)
13
+ * because they must execute BEFORE any ESM import is evaluated.
14
+ * CSSStyleSheet lives here because it needs `import { StyleSheet }`.
15
+ */ export function generateSsrPolyfillBanner() {
16
+ return `\
17
+ import { StyleSheet } from '@openelement/core';
18
+ if (typeof globalThis.CSSStyleSheet === 'undefined') {
19
+ globalThis.CSSStyleSheet = class {
20
+ replaceSync(_css) {}
21
+ get cssRules() { return []; }
22
+ };
23
+ }
24
+ `;
25
+ }
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9zc2cvc3JjL3Nzci1wb2x5ZmlsbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTU1IgUG9seWZpbGxzIGZvciBicm93c2VyLW9ubHkgQVBJcy5cbiAqXG4gKiBQb2x5ZmlsbCDliIblsYLnrZbnlaXvvIhBRFItMDA0NO+8iTpcbiAqIC0gRW50cnkgY29kZSBib2R5ICh0aGlzIG1vZHVsZSk6IENTU1N0eWxlU2hlZXQg4oCUIG5lZWRzIGBpbXBvcnQgeyBTdHlsZVNoZWV0IH0gZnJvbSBAb3BlbmVsZW1lbnQvY29yZWBcbiAqIC0gT3V0cHV0IGJhbm5lciAoYnVpbGQtc3NnLnRzKTogSFRNTEVsZW1lbnQgKyBjdXN0b21FbGVtZW50cyDigJQgbm8gaW1wb3J0LCBydW5zIGJlZm9yZSBtb2R1bGUgZXZhbHVhdGlvblxuICpcbiAqIEFEUi0wMDQ0OiBTU1IgcG9seWZpbGwgc3RyYXRlZ3kg4oCUIGJyb3dzZXIgZ2xvYmFscyBpbiBEZW5vIFNTUiBydW50aW1lLlxuICovXG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBlbnRyeS1jb2RlIHBvbHlmaWxsIChDU1NTdHlsZVNoZWV0IG9ubHkpLlxuICpcbiAqIEhUTUxFbGVtZW50IGFuZCBjdXN0b21FbGVtZW50cyBhcmUgaW4gb3V0cHV0LmJhbm5lciAoYnVpbGQtc3NnLnRzKVxuICogYmVjYXVzZSB0aGV5IG11c3QgZXhlY3V0ZSBCRUZPUkUgYW55IEVTTSBpbXBvcnQgaXMgZXZhbHVhdGVkLlxuICogQ1NTU3R5bGVTaGVldCBsaXZlcyBoZXJlIGJlY2F1c2UgaXQgbmVlZHMgYGltcG9ydCB7IFN0eWxlU2hlZXQgfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNzclBvbHlmaWxsQmFubmVyKCk6IHN0cmluZyB7XG4gIHJldHVybiBgXFxcbmltcG9ydCB7IFN0eWxlU2hlZXQgfSBmcm9tICdAb3BlbmVsZW1lbnQvY29yZSc7XG5pZiAodHlwZW9mIGdsb2JhbFRoaXMuQ1NTU3R5bGVTaGVldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgZ2xvYmFsVGhpcy5DU1NTdHlsZVNoZWV0ID0gY2xhc3Mge1xuICAgIHJlcGxhY2VTeW5jKF9jc3MpIHt9XG4gICAgZ2V0IGNzc1J1bGVzKCkgeyByZXR1cm4gW107IH1cbiAgfTtcbn1cbmA7XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0NBUUMsR0FFRDs7Ozs7O0NBTUMsR0FDRCxPQUFPLFNBQVM7RUFDZCxPQUFPLENBQUM7Ozs7Ozs7O0FBUVYsQ0FBQztBQUNEIn0=