@caryhu/codemine-forge 0.0.1-alpha.1 → 0.0.1-alpha.3

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,215 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.readViteConfigMetadata = exports.VITE_CONFIG_PATHS = void 0;
27
+ const ts = __importStar(require("typescript"));
28
+ const virtual_file_system_1 = require("../virtual-file-system");
29
+ exports.VITE_CONFIG_PATHS = [
30
+ "/vite.config.js",
31
+ "/vite.config.mjs",
32
+ "/vite.config.ts",
33
+ ];
34
+ async function readViteConfigMetadata(fileSystem) {
35
+ const detectedPaths = [];
36
+ for (const path of exports.VITE_CONFIG_PATHS) {
37
+ if (await fileSystem.exists(path)) {
38
+ detectedPaths.push(path);
39
+ }
40
+ }
41
+ const selectedPath = detectedPaths[0];
42
+ if (selectedPath === undefined) {
43
+ return {
44
+ detectedPaths,
45
+ };
46
+ }
47
+ return {
48
+ detectedPaths,
49
+ metadata: parseViteConfigMetadata(selectedPath, await fileSystem.readText(selectedPath)),
50
+ };
51
+ }
52
+ exports.readViteConfigMetadata = readViteConfigMetadata;
53
+ function parseViteConfigMetadata(path, source) {
54
+ const sourceFile = ts.createSourceFile(path, source, ts.ScriptTarget.Latest, true, scriptKindForPath(path));
55
+ const configObject = findDefaultConfigObject(sourceFile);
56
+ if (configObject === undefined) {
57
+ return {
58
+ aliases: {},
59
+ define: {},
60
+ path,
61
+ };
62
+ }
63
+ return {
64
+ aliases: parseAliasMap(configObject),
65
+ base: parseBase(configObject),
66
+ define: parseDefineMap(configObject),
67
+ path,
68
+ };
69
+ }
70
+ function findDefaultConfigObject(sourceFile) {
71
+ for (const statement of sourceFile.statements) {
72
+ if (!ts.isExportAssignment(statement)) {
73
+ continue;
74
+ }
75
+ return unwrapConfigObject(statement.expression);
76
+ }
77
+ return undefined;
78
+ }
79
+ function unwrapConfigObject(expression) {
80
+ const unwrapped = unwrapExpression(expression);
81
+ if (ts.isObjectLiteralExpression(unwrapped)) {
82
+ return unwrapped;
83
+ }
84
+ if (ts.isCallExpression(unwrapped) &&
85
+ unwrapped.arguments.length > 0) {
86
+ return unwrapConfigObject(unwrapped.arguments[0]);
87
+ }
88
+ return undefined;
89
+ }
90
+ function unwrapExpression(expression) {
91
+ if (ts.isParenthesizedExpression(expression)) {
92
+ return unwrapExpression(expression.expression);
93
+ }
94
+ if (ts.isAsExpression(expression) || ts.isTypeAssertionExpression(expression)) {
95
+ return unwrapExpression(expression.expression);
96
+ }
97
+ if (ts.isSatisfiesExpression(expression)) {
98
+ return unwrapExpression(expression.expression);
99
+ }
100
+ return expression;
101
+ }
102
+ function parseAliasMap(configObject) {
103
+ const resolveObject = getObjectProperty(configObject, "resolve");
104
+ const aliasObject = resolveObject === undefined ? undefined : getObjectProperty(resolveObject, "alias");
105
+ if (aliasObject === undefined) {
106
+ return {};
107
+ }
108
+ const aliases = {};
109
+ for (const property of aliasObject.properties) {
110
+ if (!ts.isPropertyAssignment(property)) {
111
+ continue;
112
+ }
113
+ const key = getPropertyNameText(property.name);
114
+ const value = getStringLiteralText(property.initializer);
115
+ const normalizedValue = value === undefined ? undefined : normalizeAliasReplacement(value);
116
+ if (key !== undefined && normalizedValue !== undefined) {
117
+ aliases[key] = normalizedValue;
118
+ }
119
+ }
120
+ return sortRecord(aliases);
121
+ }
122
+ function parseDefineMap(configObject) {
123
+ const defineObject = getObjectProperty(configObject, "define");
124
+ if (defineObject === undefined) {
125
+ return {};
126
+ }
127
+ const define = {};
128
+ for (const property of defineObject.properties) {
129
+ if (!ts.isPropertyAssignment(property)) {
130
+ continue;
131
+ }
132
+ const key = getPropertyNameText(property.name);
133
+ const value = getDefineValueText(property.initializer);
134
+ if (key !== undefined && value !== undefined) {
135
+ define[key] = value;
136
+ }
137
+ }
138
+ return sortRecord(define);
139
+ }
140
+ function parseBase(configObject) {
141
+ const baseProperty = getProperty(configObject, "base");
142
+ return baseProperty === undefined
143
+ ? undefined
144
+ : getStringLiteralText(baseProperty.initializer);
145
+ }
146
+ function getObjectProperty(object, propertyName) {
147
+ const property = getProperty(object, propertyName);
148
+ if (property === undefined) {
149
+ return undefined;
150
+ }
151
+ const initializer = unwrapExpression(property.initializer);
152
+ return ts.isObjectLiteralExpression(initializer) ? initializer : undefined;
153
+ }
154
+ function getProperty(object, propertyName) {
155
+ for (const property of object.properties) {
156
+ if (!ts.isPropertyAssignment(property)) {
157
+ continue;
158
+ }
159
+ if (getPropertyNameText(property.name) === propertyName) {
160
+ return property;
161
+ }
162
+ }
163
+ return undefined;
164
+ }
165
+ function getPropertyNameText(name) {
166
+ if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {
167
+ return name.text;
168
+ }
169
+ return undefined;
170
+ }
171
+ function getStringLiteralText(expression) {
172
+ const unwrapped = unwrapExpression(expression);
173
+ if (ts.isStringLiteral(unwrapped) || ts.isNoSubstitutionTemplateLiteral(unwrapped)) {
174
+ return unwrapped.text;
175
+ }
176
+ return undefined;
177
+ }
178
+ function getDefineValueText(expression) {
179
+ const unwrapped = unwrapExpression(expression);
180
+ const stringText = getStringLiteralText(unwrapped);
181
+ if (stringText !== undefined) {
182
+ return stringText;
183
+ }
184
+ if (unwrapped.kind === ts.SyntaxKind.TrueKeyword) {
185
+ return "true";
186
+ }
187
+ if (unwrapped.kind === ts.SyntaxKind.FalseKeyword) {
188
+ return "false";
189
+ }
190
+ if (unwrapped.kind === ts.SyntaxKind.NullKeyword) {
191
+ return "null";
192
+ }
193
+ if (ts.isNumericLiteral(unwrapped)) {
194
+ return unwrapped.text;
195
+ }
196
+ return undefined;
197
+ }
198
+ function normalizeAliasReplacement(value) {
199
+ const path = value.startsWith("/")
200
+ ? value
201
+ : value.startsWith("./")
202
+ ? value.slice(1)
203
+ : undefined;
204
+ if (path === undefined) {
205
+ return undefined;
206
+ }
207
+ const normalized = (0, virtual_file_system_1.normalizeForgePath)(path);
208
+ return normalized.ok ? normalized.path : undefined;
209
+ }
210
+ function scriptKindForPath(path) {
211
+ return path.endsWith(".ts") ? ts.ScriptKind.TS : ts.ScriptKind.JS;
212
+ }
213
+ function sortRecord(record) {
214
+ return Object.fromEntries(Object.entries(record).sort(([left], [right]) => left.localeCompare(right)));
215
+ }
@@ -1,4 +1,4 @@
1
1
  export { createMissingDevScriptDiagnostic, createSessionNotFoundDiagnostic, createSessionStoppedDiagnostic, createUnsupportedDevScriptDiagnostic, } from "./diagnostics";
2
- export { createForgePreviewDocument } from "./preview-document";
2
+ export { createForgePreviewDocument, createForgePreviewErrorOverlayDocument, } from "./preview-document";
3
3
  export { createDevServerPreview, DefaultDevServerPreview, isSupportedViteDevScript, } from "./server";
4
- export { DEV_SERVER_PREVIEW_CAPABILITY, type ForgeCreatePreviewDocumentOptions, type ForgeDevServerPreview, type ForgeDevServerPreviewDiagnostic, type ForgeDevServerPreviewDiagnosticCode, type ForgeDevServerPreviewEvent, type ForgeDevServerPreviewEventListener, type ForgeDevServerPreviewOptions, type ForgeDevSession, type ForgeDevSessionDiagnostic, type ForgeDevSessionFailedEvent, type ForgeDevSessionFileChange, type ForgeDevSessionRefreshResult, type ForgeDevSessionStartedEvent, type ForgeDevSessionStartResult, type ForgeDevSessionStatus, type ForgeDevSessionStoppedEvent, type ForgeDevSessionStopResult, type ForgePreviewDocument, type ForgePreviewRefreshedEvent, type ForgeRebuildDevSessionOptions, type ForgeStartDevSessionOptions, } from "./types";
4
+ export { DEV_SERVER_PREVIEW_CAPABILITY, type ForgeCreatePreviewDocumentOptions, type ForgeDevServerAdapterFramework, type ForgeDevServerAdapterHmrMode, type ForgeDevServerAdapterMetadata, type ForgeDevServerAdapterName, type ForgeDevServerPreview, type ForgeDevServerPreviewDiagnostic, type ForgeDevServerPreviewDiagnosticCode, type ForgeDevServerPreviewEvent, type ForgeDevServerPreviewEventListener, type ForgeDevServerPreviewOptions, type ForgeDevSession, type ForgeDevSessionDiagnostic, type ForgeDevSessionFailedEvent, type ForgeDevSessionFileChange, type ForgeDevSessionRefreshResult, type ForgeDevSessionStartedEvent, type ForgeDevSessionStartResult, type ForgeDevSessionStatus, type ForgeDevSessionStoppedEvent, type ForgeDevSessionStopResult, type ForgePreviewDocument, type ForgePreviewModuleUpdate, type ForgePreviewModuleUpdatedEvent, type ForgePreviewRefreshedEvent, type ForgePreviewStyleUpdate, type ForgePreviewStyleUpdatedEvent, type ForgeRebuildDevSessionOptions, type ForgeStartDevSessionOptions, } from "./types";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEV_SERVER_PREVIEW_CAPABILITY = exports.isSupportedViteDevScript = exports.DefaultDevServerPreview = exports.createDevServerPreview = exports.createForgePreviewDocument = exports.createUnsupportedDevScriptDiagnostic = exports.createSessionStoppedDiagnostic = exports.createSessionNotFoundDiagnostic = exports.createMissingDevScriptDiagnostic = void 0;
3
+ exports.DEV_SERVER_PREVIEW_CAPABILITY = exports.isSupportedViteDevScript = exports.DefaultDevServerPreview = exports.createDevServerPreview = exports.createForgePreviewErrorOverlayDocument = exports.createForgePreviewDocument = exports.createUnsupportedDevScriptDiagnostic = exports.createSessionStoppedDiagnostic = exports.createSessionNotFoundDiagnostic = exports.createMissingDevScriptDiagnostic = void 0;
4
4
  var diagnostics_1 = require("./diagnostics");
5
5
  Object.defineProperty(exports, "createMissingDevScriptDiagnostic", { enumerable: true, get: function () { return diagnostics_1.createMissingDevScriptDiagnostic; } });
6
6
  Object.defineProperty(exports, "createSessionNotFoundDiagnostic", { enumerable: true, get: function () { return diagnostics_1.createSessionNotFoundDiagnostic; } });
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "createSessionStoppedDiagnostic", { enumerable: t
8
8
  Object.defineProperty(exports, "createUnsupportedDevScriptDiagnostic", { enumerable: true, get: function () { return diagnostics_1.createUnsupportedDevScriptDiagnostic; } });
9
9
  var preview_document_1 = require("./preview-document");
10
10
  Object.defineProperty(exports, "createForgePreviewDocument", { enumerable: true, get: function () { return preview_document_1.createForgePreviewDocument; } });
11
+ Object.defineProperty(exports, "createForgePreviewErrorOverlayDocument", { enumerable: true, get: function () { return preview_document_1.createForgePreviewErrorOverlayDocument; } });
11
12
  var server_1 = require("./server");
12
13
  Object.defineProperty(exports, "createDevServerPreview", { enumerable: true, get: function () { return server_1.createDevServerPreview; } });
13
14
  Object.defineProperty(exports, "DefaultDevServerPreview", { enumerable: true, get: function () { return server_1.DefaultDevServerPreview; } });
@@ -1,2 +1,3 @@
1
- import type { ForgeCreatePreviewDocumentOptions, ForgePreviewDocument } from "./types";
1
+ import type { ForgeCreatePreviewDocumentOptions, ForgeDevSessionDiagnostic, ForgePreviewDocument } from "./types";
2
2
  export declare function createForgePreviewDocument(options: ForgeCreatePreviewDocumentOptions): ForgePreviewDocument;
3
+ export declare function createForgePreviewErrorOverlayDocument(previewDocument: ForgePreviewDocument, diagnostics: readonly ForgeDevSessionDiagnostic[]): ForgePreviewDocument;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createForgePreviewDocument = void 0;
3
+ exports.createForgePreviewErrorOverlayDocument = exports.createForgePreviewDocument = void 0;
4
4
  const DEFAULT_HTML_SHELL = [
5
5
  "<!doctype html>",
6
6
  "<html>",
@@ -15,6 +15,9 @@ const DEFAULT_HTML_SHELL = [
15
15
  "</html>",
16
16
  ].join("\n");
17
17
  const PREVIEW_MODULE_SPECIFIER_PREFIX = "__forge_preview__/";
18
+ const PREVIEW_ERROR_OVERLAY_START = "<!-- forge-preview-error-overlay:start -->";
19
+ const PREVIEW_ERROR_OVERLAY_END = "<!-- forge-preview-error-overlay:end -->";
20
+ const PREVIEW_RUNTIME_ERROR_CLIENT_ID = "forge-preview-runtime-error-client";
18
21
  function createForgePreviewDocument(options) {
19
22
  const htmlShell = options.htmlShell ?? DEFAULT_HTML_SHELL;
20
23
  const browserBundle = options.buildResult.browserBundle;
@@ -26,6 +29,7 @@ function createForgePreviewDocument(options) {
26
29
  : previewModuleSpecifiers.get(browserBundle.entryOutputPath) ??
27
30
  browserBundle.entryOutputPath;
28
31
  const metadata = {
32
+ adapter: options.adapter,
29
33
  browserBundle: browserBundle === undefined
30
34
  ? undefined
31
35
  : {
@@ -58,6 +62,7 @@ function createForgePreviewDocument(options) {
58
62
  previewImportMap === undefined
59
63
  ? ""
60
64
  : `<script type="importmap" id="forge-browser-bundle-importmap">${escapeJsonForScript(JSON.stringify(previewImportMap))}</script>`,
65
+ browserBundle === undefined ? "" : createPreviewRuntimeErrorClientScript(),
61
66
  browserBundle === undefined
62
67
  ? ""
63
68
  : `<script type="module" id="forge-browser-bundle-entry">import ${JSON.stringify(previewEntrySpecifier)};</script>`,
@@ -72,6 +77,16 @@ function createForgePreviewDocument(options) {
72
77
  };
73
78
  }
74
79
  exports.createForgePreviewDocument = createForgePreviewDocument;
80
+ function createForgePreviewErrorOverlayDocument(previewDocument, diagnostics) {
81
+ if (diagnostics.length === 0) {
82
+ return previewDocument;
83
+ }
84
+ return {
85
+ ...previewDocument,
86
+ html: injectBeforeBodyEnd(removePreviewErrorOverlay(previewDocument.html), createPreviewErrorOverlay(diagnostics)),
87
+ };
88
+ }
89
+ exports.createForgePreviewErrorOverlayDocument = createForgePreviewErrorOverlayDocument;
75
90
  function createPreviewImportMap(outputFiles, previewModuleSpecifiers) {
76
91
  const importMapFile = outputFiles.find((file) => file.contentType === "application/importmap+json");
77
92
  if (importMapFile === undefined) {
@@ -130,12 +145,199 @@ function injectBeforeBodyEnd(html, injection) {
130
145
  }
131
146
  return `${html}\n${injection}`;
132
147
  }
148
+ function createPreviewRuntimeErrorClientScript() {
149
+ return [
150
+ `<script id="${PREVIEW_RUNTIME_ERROR_CLIENT_ID}">`,
151
+ "(function(){",
152
+ ' var overlaySelector = "[data-forge-preview-runtime-error-overlay]";',
153
+ ' var styleSelector = "style[data-forge-preview-runtime-error-overlay-style]";',
154
+ " function stringify(value){",
155
+ ' if (value instanceof Error) return value.message || value.name || "Runtime error";',
156
+ ' if (typeof value === "string") return value;',
157
+ " if (value === undefined) return \"undefined\";",
158
+ " if (value === null) return \"null\";",
159
+ " try {",
160
+ " var json = JSON.stringify(value);",
161
+ " if (typeof json === \"string\") return json;",
162
+ " } catch (error) {}",
163
+ " return String(value);",
164
+ " }",
165
+ " function stackFor(value){",
166
+ " return value instanceof Error && typeof value.stack === \"string\" && value.stack.length > 0",
167
+ " ? value.stack",
168
+ " : undefined;",
169
+ " }",
170
+ " function formatLocation(event){",
171
+ " var parts = [];",
172
+ " if (typeof event.filename === \"string\" && event.filename.length > 0) parts.push(event.filename);",
173
+ " if (typeof event.lineno === \"number\" && event.lineno > 0) parts.push(\"line \" + event.lineno);",
174
+ " if (typeof event.colno === \"number\" && event.colno > 0) parts.push(\"column \" + event.colno);",
175
+ " return parts.length > 0 ? parts.join(\" · \") : undefined;",
176
+ " }",
177
+ " function createTextElement(tagName, attributeName, text){",
178
+ " var element = document.createElement(tagName);",
179
+ " element.setAttribute(attributeName, \"\");",
180
+ " element.textContent = text;",
181
+ " return element;",
182
+ " }",
183
+ " function ensureStyle(){",
184
+ " if (document.querySelector(styleSelector)) return;",
185
+ " var style = document.createElement(\"style\");",
186
+ " style.setAttribute(\"data-forge-preview-runtime-error-overlay-style\", \"\");",
187
+ " style.textContent = [",
188
+ ' "[data-forge-preview-runtime-error-overlay]{position:fixed;inset:0;z-index:2147483647;display:flex;align-items:flex-start;justify-content:center;padding:32px 16px;background:rgba(15,23,42,.72);color:#f8fafc;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\'Segoe UI\',sans-serif;box-sizing:border-box;}",',
189
+ ' "[data-forge-preview-runtime-error-overlay] *{box-sizing:border-box;}",',
190
+ ' "[data-forge-preview-runtime-error-overlay-panel]{width:min(760px,100%);max-height:calc(100vh - 64px);overflow:auto;border:1px solid rgba(248,113,113,.45);border-radius:8px;background:#111827;box-shadow:0 24px 80px rgba(0,0,0,.42);padding:20px;}",',
191
+ ' "[data-forge-preview-runtime-error-overlay-kicker]{margin:0 0 6px;color:#fca5a5;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;}",',
192
+ ' "[data-forge-preview-runtime-error-overlay-title]{margin:0 0 16px;font-size:20px;line-height:1.25;font-weight:700;}",',
193
+ ' "[data-forge-preview-runtime-error-overlay-message]{margin:0 0 12px;color:#f8fafc;font-size:14px;line-height:1.5;}",',
194
+ ' "[data-forge-preview-runtime-error-overlay-detail]{margin:0;color:#cbd5e1;white-space:pre-wrap;font-family:ui-monospace,SFMono-Regular,Consolas,\'Liberation Mono\',monospace;font-size:12px;line-height:1.45;}",',
195
+ " ].join(\"\");",
196
+ " (document.head || document.documentElement).appendChild(style);",
197
+ " }",
198
+ " function showOverlay(diagnostic){",
199
+ " ensureStyle();",
200
+ " var existing = document.querySelector(overlaySelector);",
201
+ " if (existing && existing.parentNode) existing.parentNode.removeChild(existing);",
202
+ " var overlay = document.createElement(\"div\");",
203
+ " overlay.setAttribute(\"data-forge-preview-runtime-error-overlay\", \"\");",
204
+ " overlay.setAttribute(\"role\", \"alert\");",
205
+ " overlay.setAttribute(\"aria-live\", \"assertive\");",
206
+ " var panel = document.createElement(\"section\");",
207
+ " panel.setAttribute(\"data-forge-preview-runtime-error-overlay-panel\", \"\");",
208
+ " panel.appendChild(createTextElement(\"p\", \"data-forge-preview-runtime-error-overlay-kicker\", \"Forge preview\"));",
209
+ " panel.appendChild(createTextElement(\"h1\", \"data-forge-preview-runtime-error-overlay-title\", diagnostic.title));",
210
+ " panel.appendChild(createTextElement(\"p\", \"data-forge-preview-runtime-error-overlay-message\", diagnostic.message));",
211
+ " if (diagnostic.detail) {",
212
+ " panel.appendChild(createTextElement(\"pre\", \"data-forge-preview-runtime-error-overlay-detail\", diagnostic.detail));",
213
+ " }",
214
+ " overlay.appendChild(panel);",
215
+ " (document.body || document.documentElement).appendChild(overlay);",
216
+ " }",
217
+ " window.addEventListener(\"error\", function(event){",
218
+ " showOverlay({",
219
+ " title: \"Preview runtime error\",",
220
+ " message: event.error === undefined || event.error === null",
221
+ " ? event.message || \"Runtime error\"",
222
+ " : stringify(event.error),",
223
+ " detail: stackFor(event.error) || formatLocation(event),",
224
+ " });",
225
+ " event.preventDefault();",
226
+ " });",
227
+ " window.addEventListener(\"unhandledrejection\", function(event){",
228
+ " showOverlay({",
229
+ " title: \"Unhandled promise rejection\",",
230
+ " message: stringify(event.reason),",
231
+ " detail: stackFor(event.reason),",
232
+ " });",
233
+ " event.preventDefault();",
234
+ " });",
235
+ "})();",
236
+ "</script>",
237
+ ].join("\n");
238
+ }
239
+ function createPreviewErrorOverlay(diagnostics) {
240
+ const items = diagnostics.map(createPreviewErrorOverlayItem).join("\n");
241
+ return [
242
+ PREVIEW_ERROR_OVERLAY_START,
243
+ '<style data-forge-preview-error-overlay>',
244
+ "[data-forge-preview-error-overlay]{position:fixed;inset:0;z-index:2147483647;display:flex;align-items:flex-start;justify-content:center;padding:32px 16px;background:rgba(15,23,42,.72);color:#f8fafc;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;box-sizing:border-box;}",
245
+ "[data-forge-preview-error-overlay] *{box-sizing:border-box;}",
246
+ "[data-forge-preview-error-overlay-panel]{width:min(760px,100%);max-height:calc(100vh - 64px);overflow:auto;border:1px solid rgba(248,113,113,.45);border-radius:8px;background:#111827;box-shadow:0 24px 80px rgba(0,0,0,.42);padding:20px;}",
247
+ "[data-forge-preview-error-overlay-kicker]{margin:0 0 6px;color:#fca5a5;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;}",
248
+ "[data-forge-preview-error-overlay-title]{margin:0 0 16px;font-size:20px;line-height:1.25;font-weight:700;}",
249
+ "[data-forge-preview-error-overlay-list]{display:grid;gap:12px;margin:0;padding:0;list-style:none;}",
250
+ "[data-forge-preview-error-overlay-item]{display:grid;gap:6px;border-top:1px solid rgba(148,163,184,.22);padding-top:12px;}",
251
+ "[data-forge-preview-error-overlay-code]{width:max-content;border-radius:4px;background:rgba(248,113,113,.16);color:#fecaca;padding:2px 6px;font-family:ui-monospace,SFMono-Regular,Consolas,'Liberation Mono',monospace;font-size:12px;}",
252
+ "[data-forge-preview-error-overlay-message]{margin:0;color:#f8fafc;font-size:14px;line-height:1.5;}",
253
+ "[data-forge-preview-error-overlay-detail]{margin:0;color:#cbd5e1;font-family:ui-monospace,SFMono-Regular,Consolas,'Liberation Mono',monospace;font-size:12px;line-height:1.45;}",
254
+ "</style>",
255
+ '<div data-forge-preview-error-overlay role="alert" aria-live="assertive">',
256
+ ' <section data-forge-preview-error-overlay-panel>',
257
+ ' <p data-forge-preview-error-overlay-kicker>Forge preview</p>',
258
+ ' <h1 data-forge-preview-error-overlay-title>Preview refresh failed</h1>',
259
+ ` <ul data-forge-preview-error-overlay-list>${items}</ul>`,
260
+ " </section>",
261
+ "</div>",
262
+ PREVIEW_ERROR_OVERLAY_END,
263
+ ].join("\n");
264
+ }
265
+ function createPreviewErrorOverlayItem(diagnostic) {
266
+ const detail = formatDiagnosticDetail(diagnostic);
267
+ return [
268
+ " <li data-forge-preview-error-overlay-item>",
269
+ ` <code data-forge-preview-error-overlay-code>${escapeHtml(diagnostic.code)}</code>`,
270
+ ` <p data-forge-preview-error-overlay-message>${escapeHtml(diagnostic.message)}</p>`,
271
+ detail === undefined
272
+ ? ""
273
+ : ` <p data-forge-preview-error-overlay-detail>${escapeHtml(detail)}</p>`,
274
+ " </li>",
275
+ ]
276
+ .filter((line) => line.length > 0)
277
+ .join("\n");
278
+ }
279
+ function formatDiagnosticDetail(diagnostic) {
280
+ const parts = [
281
+ getStringDiagnosticProperty(diagnostic, "path"),
282
+ getStringDiagnosticProperty(diagnostic, "importer"),
283
+ getStringDiagnosticProperty(diagnostic, "importSpecifier"),
284
+ getStringDiagnosticProperty(diagnostic, "dependencyName"),
285
+ getStringDiagnosticProperty(diagnostic, "requestedRange"),
286
+ getStringDiagnosticProperty(diagnostic, "script"),
287
+ getStringDiagnosticProperty(diagnostic, "sessionId"),
288
+ formatLimitDiagnostic(diagnostic),
289
+ ].filter((part) => part !== undefined && part.length > 0);
290
+ return parts.length === 0 ? undefined : parts.join(" · ");
291
+ }
292
+ function getStringDiagnosticProperty(diagnostic, key) {
293
+ const value = diagnostic[key];
294
+ return typeof value === "string" ? value : undefined;
295
+ }
296
+ function formatLimitDiagnostic(diagnostic) {
297
+ const limit = diagnostic.limit;
298
+ if (typeof limit !== "object" || limit === null) {
299
+ return undefined;
300
+ }
301
+ const name = limit.name;
302
+ const actual = limit.actual;
303
+ const maximum = limit.maximum;
304
+ if (typeof name !== "string" ||
305
+ typeof actual !== "number" ||
306
+ typeof maximum !== "number") {
307
+ return undefined;
308
+ }
309
+ return `${name}: ${actual}/${maximum}`;
310
+ }
311
+ function removePreviewErrorOverlay(html) {
312
+ return html.replace(new RegExp(`${escapeRegExp(PREVIEW_ERROR_OVERLAY_START)}[\\s\\S]*?${escapeRegExp(PREVIEW_ERROR_OVERLAY_END)}\\n?`, "g"), "");
313
+ }
133
314
  function removeProjectModuleScripts(html) {
134
315
  return html.replace(/<script\b(?=[^>]*\btype\s*=\s*["']module["'])[^>]*>[\s\S]*?<\/script\s*>/gi, "");
135
316
  }
136
317
  function escapeJsonForScript(json) {
137
318
  return json.replace(/</g, "\\u003c");
138
319
  }
320
+ function escapeHtml(value) {
321
+ return value.replace(/[&<>"']/g, (character) => {
322
+ switch (character) {
323
+ case "&":
324
+ return "&amp;";
325
+ case "<":
326
+ return "&lt;";
327
+ case ">":
328
+ return "&gt;";
329
+ case '"':
330
+ return "&quot;";
331
+ case "'":
332
+ return "&#39;";
333
+ default:
334
+ return character;
335
+ }
336
+ });
337
+ }
338
+ function escapeRegExp(value) {
339
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
340
+ }
139
341
  function toBase64(bytes) {
140
342
  const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
141
343
  let output = "";
@@ -14,10 +14,17 @@ export declare class DefaultDevServerPreview implements ForgeDevServerPreview {
14
14
  stop(sessionId: string): Promise<ForgeDevSessionStopResult>;
15
15
  getSession(sessionId: string): ForgeDevSession | undefined;
16
16
  watch(listener: ForgeDevServerPreviewEventListener): ForgeUnsubscribe;
17
- private validateDevScript;
17
+ private readDevManifest;
18
18
  private failStart;
19
19
  private handleFileEvent;
20
+ private handleWorkspaceChange;
21
+ private wasCssPathBundled;
22
+ private wasWorkspaceModuleBundled;
23
+ private performStyleUpdate;
24
+ private performModuleUpdate;
20
25
  private performRebuild;
26
+ private completeSuccessfulRefresh;
27
+ private completeFailedRebuild;
21
28
  private createPreviewDocument;
22
29
  private allocateSessionId;
23
30
  private emit;