@mandujs/core 0.53.2 → 0.54.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +654 -654
- package/package.json +2 -2
- package/src/a11y/__tests__/run-audit.test.ts +333 -333
- package/src/a11y/fix-hints.ts +76 -76
- package/src/a11y/index.ts +18 -18
- package/src/a11y/run-audit.ts +394 -394
- package/src/a11y/types.ts +125 -125
- package/src/auth/__tests__/login.test.ts +1 -1
- package/src/auth/__tests__/password.test.ts +122 -122
- package/src/auth/__tests__/tokens.test.ts +274 -274
- package/src/auth/__tests__/verification.test.ts +274 -274
- package/src/auth/index.ts +76 -76
- package/src/auth/login.ts +225 -225
- package/src/auth/password.ts +120 -120
- package/src/auth/reset.ts +243 -243
- package/src/auth/tokens.ts +612 -612
- package/src/auth/verification.ts +253 -253
- package/src/brain/__tests__/redactor.test.ts +94 -94
- package/src/brain/adapters/__tests__/_helpers.ts +83 -83
- package/src/brain/adapters/__tests__/anthropic-oauth.test.ts +196 -196
- package/src/brain/adapters/__tests__/chatgpt-auth.test.ts +193 -193
- package/src/brain/adapters/__tests__/openai-oauth.test.ts +209 -209
- package/src/brain/adapters/__tests__/resolver.test.ts +143 -143
- package/src/brain/adapters/anthropic-oauth.ts +1 -1
- package/src/brain/adapters/chatgpt-auth.ts +300 -300
- package/src/brain/adapters/index.ts +319 -319
- package/src/brain/adapters/oauth-flow.ts +439 -439
- package/src/brain/consent.ts +240 -240
- package/src/brain/credentials.ts +396 -396
- package/src/bundler/__tests__/build-runner.ts +113 -113
- package/src/bundler/__tests__/dev-reliability.test.ts +619 -619
- package/src/bundler/__tests__/extended-watch.test.ts +711 -711
- package/src/bundler/__tests__/fast-refresh.test.ts +10 -10
- package/src/bundler/__tests__/hdr.test.ts +353 -353
- package/src/bundler/__tests__/hmr-client.test.ts +532 -532
- package/src/bundler/__tests__/manifest-schema.test.ts +266 -266
- package/src/bundler/__tests__/prod-smoke.test.ts +138 -138
- package/src/bundler/__tests__/reverse-import-graph.test.ts +519 -519
- package/src/bundler/__tests__/slot-dispatch.test.ts +573 -573
- package/src/bundler/__tests__/url-cap-and-slot-regex.test.ts +286 -286
- package/src/bundler/__tests__/vendor-cache.test.ts +455 -455
- package/src/bundler/budget.ts +404 -404
- package/src/bundler/build.test.ts +179 -179
- package/src/bundler/build.ts +55 -55
- package/src/bundler/dev.ts +42 -42
- package/src/bundler/manifest-schema.ts +301 -301
- package/src/bundler/plugins/__tests__/block-generated-imports.test.ts +263 -263
- package/src/bundler/plugins/__tests__/react-compiler-config.test.ts +83 -83
- package/src/bundler/plugins/__tests__/react-compiler-lint.test.ts +110 -110
- package/src/bundler/plugins/block-generated-imports.ts +155 -155
- package/src/bundler/plugins/index.ts +83 -83
- package/src/bundler/plugins/react-compiler-config.ts +108 -108
- package/src/bundler/plugins/react-compiler-lint.ts +253 -253
- package/src/bundler/plugins/react-compiler.ts +162 -162
- package/src/bundler/reverse-import-graph.ts +339 -339
- package/src/bundler/safe-build.test.ts +201 -201
- package/src/bundler/safe-build.ts +103 -103
- package/src/bundler/scenario-matrix.ts +229 -229
- package/src/bundler/types.ts +10 -10
- package/src/bundler/vendor-cache-types.ts +130 -130
- package/src/bundler/vendor-cache.ts +526 -526
- package/src/change/snapshot.ts +18 -18
- package/src/client/Form.tsx +105 -105
- package/src/client/Link.tsx +9 -9
- package/src/client/__tests__/use-sse.test.ts +153 -153
- package/src/client/globals.ts +1 -1
- package/src/client/hooks.ts +362 -362
- package/src/client/hydrate.ts +340 -340
- package/src/client/prefetch-helper.ts +55 -55
- package/src/client/router.ts +11 -11
- package/src/client/runtime.ts +47 -47
- package/src/client/serialize.ts +404 -404
- package/src/client/use-fetch.ts +6 -6
- package/src/client/use-head.ts +197 -197
- package/src/client/use-sse.ts +378 -378
- package/src/client/window-state.ts +101 -101
- package/src/components/Image.tsx +162 -162
- package/src/config/validate.ts +3 -3
- package/src/config/watcher.ts +311 -311
- package/src/constants.ts +40 -40
- package/src/content/collection.ts +8 -8
- package/src/content/content-layer.ts +7 -7
- package/src/content/data-store.ts +245 -245
- package/src/content/frontmatter.ts +189 -189
- package/src/content/loader-context.ts +171 -171
- package/src/content/loaders/api.ts +216 -216
- package/src/content/loaders/file.ts +172 -172
- package/src/content/loaders/glob.ts +253 -253
- package/src/content/loaders/index.ts +34 -34
- package/src/content/loaders/types.ts +137 -137
- package/src/content/meta-store.ts +209 -209
- package/src/content/prebuild.test.ts +571 -571
- package/src/content/prebuild.ts +636 -636
- package/src/content/schema.ts +20 -20
- package/src/content/sidebar.ts +630 -630
- package/src/content/slug.ts +110 -110
- package/src/content/types.ts +282 -282
- package/src/content/watcher.ts +135 -135
- package/src/contract/client-safe.test.ts +42 -42
- package/src/contract/client-safe.ts +114 -114
- package/src/contract/define.ts +11 -11
- package/src/contract/index.ts +1 -1
- package/src/contract/normalize.test.ts +276 -276
- package/src/contract/normalize.ts +410 -410
- package/src/contract/registry.test.ts +206 -206
- package/src/contract/route-helpers.ts +1 -1
- package/src/contract/rpc.ts +443 -443
- package/src/contract/schema.ts +48 -48
- package/src/contract/types.ts +58 -58
- package/src/db/__tests__/db.test.ts +482 -482
- package/src/db/index.ts +138 -138
- package/src/db/migrations/history-table.ts +345 -345
- package/src/db/migrations/index.ts +3 -3
- package/src/db/migrations/lock.ts +324 -324
- package/src/db/migrations/runner.ts +650 -650
- package/src/deploy/cache.ts +140 -140
- package/src/deploy/compile/vercel.ts +344 -344
- package/src/deploy/index.ts +87 -87
- package/src/deploy/inference/brain.ts +268 -268
- package/src/deploy/inference/context.ts +182 -182
- package/src/deploy/inference/filling-extract.ts +245 -245
- package/src/deploy/inference/heuristic.ts +182 -182
- package/src/deploy/intent.ts +173 -173
- package/src/deploy/plan.ts +178 -178
- package/src/design/__tests__/agents-link.test.ts +109 -109
- package/src/design/__tests__/extract-patch-diff.test.ts +265 -265
- package/src/design/__tests__/lint.test.ts +110 -110
- package/src/design/__tests__/parser.test.ts +195 -195
- package/src/design/__tests__/tailwind-theme.test.ts +229 -229
- package/src/design/agents-link.ts +165 -165
- package/src/design/diff.ts +138 -138
- package/src/design/extract.ts +285 -285
- package/src/design/index.ts +102 -102
- package/src/design/lint.ts +209 -209
- package/src/design/parser.ts +555 -555
- package/src/design/patch.ts +241 -241
- package/src/design/scaffold.ts +147 -147
- package/src/design/tailwind-theme.ts +441 -441
- package/src/design/types.ts +210 -210
- package/src/desktop/__tests__/webview-fallback.test.ts +254 -254
- package/src/desktop/__tests__/window.test.ts +248 -248
- package/src/desktop/__tests__/worker.test.ts +266 -266
- package/src/desktop/index.ts +43 -43
- package/src/desktop/types.ts +158 -158
- package/src/desktop/worker.ts +180 -180
- package/src/dev-error-overlay/__tests__/overlay-injector.test.ts +241 -241
- package/src/dev-error-overlay/index.ts +30 -30
- package/src/dev-error-overlay/overlay-injector.ts +243 -243
- package/src/dev-error-overlay/overlay-styles.ts +52 -52
- package/src/dev-error-overlay/types.ts +66 -66
- package/src/devtools/ai/context-builder.ts +375 -375
- package/src/devtools/ai/index.ts +25 -25
- package/src/devtools/ai/mcp-connector.ts +25 -25
- package/src/devtools/client/catchers/error-catcher.ts +344 -344
- package/src/devtools/client/catchers/index.ts +18 -18
- package/src/devtools/client/components/index.ts +39 -39
- package/src/devtools/client/components/mandu-character.tsx +331 -331
- package/src/devtools/client/components/overlay.tsx +368 -368
- package/src/devtools/client/components/panel/errors-panel.tsx +259 -259
- package/src/devtools/client/components/panel/guard-panel.tsx +30 -30
- package/src/devtools/client/components/panel/islands-panel.tsx +320 -320
- package/src/devtools/client/components/panel/network-panel.tsx +291 -291
- package/src/devtools/client/components/panel/panel-container.tsx +500 -500
- package/src/devtools/client/components/panel/preview-panel.tsx +46 -46
- package/src/devtools/client/filters/context-filters.ts +282 -282
- package/src/devtools/client/filters/index.ts +16 -16
- package/src/devtools/client/index.ts +63 -63
- package/src/devtools/client/persistence.ts +335 -335
- package/src/devtools/hook/create-hook.ts +207 -207
- package/src/devtools/hook/index.ts +13 -13
- package/src/devtools/index.ts +439 -439
- package/src/devtools/init.ts +265 -265
- package/src/devtools/protocol.ts +237 -237
- package/src/devtools/server/index.ts +17 -17
- package/src/devtools/server/source-context.ts +450 -450
- package/src/devtools/types.ts +35 -35
- package/src/devtools/worker/index.ts +25 -25
- package/src/devtools/worker/redaction-worker.ts +233 -233
- package/src/devtools/worker/worker-manager.ts +410 -410
- package/src/diagnose/__tests__/checks.test.ts +451 -380
- package/src/diagnose/checks.ts +832 -720
- package/src/diagnose/index.ts +17 -16
- package/src/diagnose/run.ts +93 -91
- package/src/diagnose/types.ts +53 -53
- package/src/email/__tests__/email.test.ts +355 -355
- package/src/email/index.ts +282 -282
- package/src/email/smtp.ts +64 -64
- package/src/error/domains.ts +265 -265
- package/src/error/result.ts +60 -60
- package/src/error/types.ts +6 -6
- package/src/errors/extractor.ts +409 -409
- package/src/errors/index.ts +19 -19
- package/src/filling/__tests__/session-sqlite.test.ts +454 -454
- package/src/filling/auth.ts +308 -308
- package/src/filling/cookie-codec.ts +299 -299
- package/src/filling/deps.ts +265 -265
- package/src/filling/session-sqlite.ts +617 -617
- package/src/filling/sse.ts +5 -5
- package/src/filling/ws.ts +78 -78
- package/src/generator/index.ts +3 -3
- package/src/guard/__tests__/design-inline-class.test.ts +219 -219
- package/src/guard/__tests__/tsgolint-bridge.test.ts +347 -347
- package/src/guard/analyzer.ts +360 -360
- package/src/guard/auto-correct.ts +1 -1
- package/src/guard/contract-guard.ts +9 -9
- package/src/guard/define-rule.ts +243 -243
- package/src/guard/design-inline-class.ts +393 -393
- package/src/guard/file-type.test.ts +24 -24
- package/src/guard/graph.ts +1 -1
- package/src/guard/healing.ts +36 -36
- package/src/guard/presets/atomic.ts +70 -70
- package/src/guard/presets/clean.ts +77 -77
- package/src/guard/presets/fsd.ts +79 -79
- package/src/guard/presets/hexagonal.ts +68 -68
- package/src/guard/reporter.ts +442 -442
- package/src/guard/rule-presets.ts +379 -379
- package/src/guard/semantic-slots.ts +1 -1
- package/src/guard/suggestions.ts +358 -358
- package/src/guard/tsgolint-bridge.ts +512 -512
- package/src/guard/types.ts +348 -348
- package/src/guard/watcher.ts +405 -405
- package/src/i18n/define.ts +126 -126
- package/src/i18n/index.ts +52 -52
- package/src/i18n/message-registry.ts +173 -173
- package/src/i18n/types.ts +112 -112
- package/src/id/index.ts +105 -105
- package/src/index.ts +2 -2
- package/src/kitchen/api/agent-devtools-api.ts +779 -544
- package/src/kitchen/api/errors-grouping.ts +126 -0
- package/src/kitchen/kitchen-handler.ts +192 -63
- package/src/kitchen/kitchen-ui.ts +842 -464
- package/src/logging/index.ts +22 -22
- package/src/logging/transports.ts +365 -365
- package/src/middleware/bridge.ts +147 -147
- package/src/middleware/compose.ts +134 -134
- package/src/middleware/compress.ts +62 -62
- package/src/middleware/cors.ts +47 -47
- package/src/middleware/csrf.ts +328 -328
- package/src/middleware/define.ts +132 -132
- package/src/middleware/jwt.ts +134 -134
- package/src/middleware/logger.ts +58 -58
- package/src/middleware/oauth/__tests__/oauth.test.ts +1 -1
- package/src/middleware/oauth/index.ts +505 -505
- package/src/middleware/oauth/providers.ts +115 -115
- package/src/middleware/rate-limit/index.ts +522 -522
- package/src/middleware/rate-limit/sqlite-store.ts +382 -382
- package/src/middleware/scheduler-cron.ts +96 -96
- package/src/middleware/secure/__tests__/secure.test.ts +360 -360
- package/src/middleware/secure/csp.ts +193 -193
- package/src/middleware/session.ts +174 -174
- package/src/middleware/timeout.ts +55 -55
- package/src/observability/logger-adapter.ts +36 -36
- package/src/observability/sqlite-store.ts +254 -254
- package/src/openapi/generator.ts +1 -1
- package/src/openapi/openapi.test.ts +43 -43
- package/src/perf/__tests__/user-marks.test.ts +354 -354
- package/src/perf/index.ts +133 -133
- package/src/plugins/__tests__/lifecycle-integration.test.ts +272 -272
- package/src/plugins/__tests__/runner.test.ts +409 -409
- package/src/plugins/define.ts +124 -124
- package/src/plugins/examples/dep-check-plugin.ts +80 -80
- package/src/plugins/examples/prerender-cache-plugin.ts +111 -111
- package/src/plugins/examples/sitemap-plugin.ts +65 -65
- package/src/plugins/runner.ts +361 -361
- package/src/plugins/types.ts +368 -368
- package/src/report/index.ts +1 -1
- package/src/resource/__tests__/generator.test.ts +32 -32
- package/src/resource/ddl/__tests__/diff.test.ts +639 -639
- package/src/resource/ddl/__tests__/emit.test.ts +823 -823
- package/src/resource/ddl/__tests__/snapshot.test.ts +499 -499
- package/src/resource/ddl/emit.ts +559 -559
- package/src/resource/ddl/persistence-types.ts +218 -218
- package/src/resource/ddl/type-map.ts +223 -223
- package/src/resource/ddl/types.ts +232 -232
- package/src/resource/generator-repo.ts +630 -630
- package/src/resource/schema.ts +1 -1
- package/src/router/fs-patterns.test.ts +96 -96
- package/src/router/fs-routes.ts +6 -6
- package/src/routes/index.ts +74 -74
- package/src/routes/metadata-routes.ts +427 -427
- package/src/routes/types.ts +341 -341
- package/src/runtime/__tests__/error-boundary-redaction.test.ts +141 -141
- package/src/runtime/__tests__/hdr-client.test.ts +223 -223
- package/src/runtime/__tests__/http-errors.test.ts +117 -117
- package/src/runtime/__tests__/not-found.test.ts +152 -152
- package/src/runtime/adapter.ts +47 -47
- package/src/runtime/boundary.tsx +252 -252
- package/src/runtime/cache.ts +494 -494
- package/src/runtime/compose.ts +222 -222
- package/src/runtime/fast-refresh-runtime.ts +322 -322
- package/src/runtime/handler.ts +65 -65
- package/src/runtime/handlers.ts +300 -300
- package/src/runtime/http-errors.ts +113 -113
- package/src/runtime/image-handler.ts +1 -1
- package/src/runtime/lifecycle.ts +381 -381
- package/src/runtime/logger.test.ts +345 -345
- package/src/runtime/middleware.ts +264 -264
- package/src/runtime/not-found.ts +93 -93
- package/src/runtime/openapi-endpoint.ts +236 -236
- package/src/runtime/ppr.ts +74 -74
- package/src/runtime/registry.ts +171 -171
- package/src/runtime/router.ts +105 -105
- package/src/runtime/server.ts +67 -67
- package/src/runtime/shims.ts +48 -48
- package/src/runtime/ssr.ts +24 -31
- package/src/runtime/streaming-ssr.ts +32 -37
- package/src/runtime/trace.ts +144 -144
- package/src/scheduler/validate.ts +169 -169
- package/src/seo/index.ts +219 -219
- package/src/seo/integration/ssr.ts +306 -306
- package/src/seo/render/basic.ts +435 -435
- package/src/seo/render/index.ts +143 -143
- package/src/seo/render/jsonld.ts +539 -539
- package/src/seo/render/opengraph.ts +197 -197
- package/src/seo/render/robots.ts +116 -116
- package/src/seo/render/sitemap.ts +137 -137
- package/src/seo/render/twitter.ts +127 -127
- package/src/seo/resolve/opengraph.ts +143 -143
- package/src/seo/resolve/robots.ts +73 -73
- package/src/seo/resolve/title.ts +94 -94
- package/src/seo/resolve/twitter.ts +73 -73
- package/src/seo/resolve/url.ts +104 -104
- package/src/seo/routes/index.ts +290 -290
- package/src/seo/types.ts +588 -588
- package/src/slot/validator.ts +39 -39
- package/src/storage/s3/__tests__/s3.test.ts +479 -479
- package/src/storage/s3/index.ts +412 -412
- package/src/testing/__tests__/assertions.test.ts +632 -632
- package/src/testing/__tests__/reporter.test.ts +454 -454
- package/src/testing/assertions.ts +986 -986
- package/src/testing/db.ts +157 -157
- package/src/testing/mocks.ts +203 -203
- package/src/testing/session.ts +190 -190
- package/src/types/branded.ts +56 -56
- package/src/types/index.ts +1 -1
- package/src/utils/safe-io.ts +188 -188
- package/src/utils/string-safe.ts +298 -298
- package/src/watcher/watcher.ts +18 -18
|
@@ -1,241 +1,241 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phase 18.α — Dev Error Overlay regression tests.
|
|
3
|
-
*
|
|
4
|
-
* Covers:
|
|
5
|
-
* - Dev injection emits both <style> and <script> tags
|
|
6
|
-
* - Production (NODE_ENV=production) suppresses injection
|
|
7
|
-
* - Explicit `enabled: false` suppresses injection even in dev
|
|
8
|
-
* - Stack parsing handles Chrome + Firefox shapes + fallthrough
|
|
9
|
-
* - Error embed escapes `</script>` sequences
|
|
10
|
-
* - Payload builder tolerates non-Error throws
|
|
11
|
-
* - buildOverlayErrorHtml wraps the embed in a valid doctype doc
|
|
12
|
-
* - Client IIFE mounts the mounted-flag guard to prevent double-mount
|
|
13
|
-
*/
|
|
14
|
-
import { describe, it, expect, beforeEach, afterEach } from "bun:test";
|
|
15
|
-
import {
|
|
16
|
-
buildOverlayHeadTag,
|
|
17
|
-
maybeInjectDevOverlay,
|
|
18
|
-
shouldInjectOverlay,
|
|
19
|
-
parseStackFrames,
|
|
20
|
-
buildPayloadFromError,
|
|
21
|
-
buildOverlayErrorEmbed,
|
|
22
|
-
buildOverlayErrorHtml,
|
|
23
|
-
} from "../overlay-injector";
|
|
24
|
-
import {
|
|
25
|
-
OVERLAY_CLIENT_SCRIPT,
|
|
26
|
-
_testOnly_buildOverlayClientScript,
|
|
27
|
-
} from "../overlay-client";
|
|
28
|
-
import {
|
|
29
|
-
OVERLAY_CUSTOM_EVENT,
|
|
30
|
-
OVERLAY_MOUNTED_FLAG,
|
|
31
|
-
OVERLAY_PAYLOAD_ELEMENT_ID,
|
|
32
|
-
} from "../types";
|
|
33
|
-
|
|
34
|
-
describe("shouldInjectOverlay", () => {
|
|
35
|
-
const prevEnv = process.env.NODE_ENV;
|
|
36
|
-
afterEach(() => {
|
|
37
|
-
if (prevEnv === undefined) delete process.env.NODE_ENV;
|
|
38
|
-
else process.env.NODE_ENV = prevEnv;
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it("returns true in dev with default config", () => {
|
|
42
|
-
process.env.NODE_ENV = "development";
|
|
43
|
-
expect(shouldInjectOverlay({ isDev: true })).toBe(true);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it("returns false when isDev is false", () => {
|
|
47
|
-
process.env.NODE_ENV = "development";
|
|
48
|
-
expect(shouldInjectOverlay({ isDev: false })).toBe(false);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it("returns false when NODE_ENV=production even if isDev lies", () => {
|
|
52
|
-
process.env.NODE_ENV = "production";
|
|
53
|
-
expect(shouldInjectOverlay({ isDev: true })).toBe(false);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it("returns false when user opts out via enabled: false", () => {
|
|
57
|
-
process.env.NODE_ENV = "development";
|
|
58
|
-
expect(shouldInjectOverlay({ isDev: true, enabled: false })).toBe(false);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it("returns true when user explicitly enables in dev", () => {
|
|
62
|
-
process.env.NODE_ENV = "development";
|
|
63
|
-
expect(shouldInjectOverlay({ isDev: true, enabled: true })).toBe(true);
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
describe("buildOverlayHeadTag", () => {
|
|
68
|
-
const prevEnv = process.env.NODE_ENV;
|
|
69
|
-
afterEach(() => {
|
|
70
|
-
if (prevEnv === undefined) delete process.env.NODE_ENV;
|
|
71
|
-
else process.env.NODE_ENV = prevEnv;
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it("emits <style> and <script> in dev", () => {
|
|
75
|
-
process.env.NODE_ENV = "development";
|
|
76
|
-
const out = buildOverlayHeadTag({ isDev: true });
|
|
77
|
-
expect(out).toContain("<style");
|
|
78
|
-
expect(out).toContain("id=\"__mandu-dev-overlay-style\"");
|
|
79
|
-
expect(out).toContain("<script");
|
|
80
|
-
expect(out).toContain("id=\"__mandu-dev-overlay-client\"");
|
|
81
|
-
expect(out).toContain(".mandu-dev-overlay");
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it("emits empty string in production", () => {
|
|
85
|
-
process.env.NODE_ENV = "production";
|
|
86
|
-
expect(buildOverlayHeadTag({ isDev: true })).toBe("");
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it("emits empty string when opted out", () => {
|
|
90
|
-
process.env.NODE_ENV = "development";
|
|
91
|
-
expect(buildOverlayHeadTag({ isDev: true, enabled: false })).toBe("");
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it("maybeInjectDevOverlay is alias with same behavior", () => {
|
|
95
|
-
process.env.NODE_ENV = "development";
|
|
96
|
-
expect(maybeInjectDevOverlay({ isDev: true })).toBe(
|
|
97
|
-
buildOverlayHeadTag({ isDev: true }),
|
|
98
|
-
);
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
it("does not contain the sentinel flag leaking as a global assignment outside the IIFE", () => {
|
|
102
|
-
process.env.NODE_ENV = "development";
|
|
103
|
-
const out = buildOverlayHeadTag({ isDev: true });
|
|
104
|
-
// The sentinel is only ever referenced via `window[MOUNTED]`, never as a bare identifier assignment.
|
|
105
|
-
expect(out.includes(`var ${OVERLAY_MOUNTED_FLAG}=`)).toBe(false);
|
|
106
|
-
// But the string literal MUST appear at least once (inside the IIFE).
|
|
107
|
-
expect(out).toContain(OVERLAY_MOUNTED_FLAG);
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
describe("parseStackFrames", () => {
|
|
112
|
-
it("parses Chrome-style frames", () => {
|
|
113
|
-
const stack = `TypeError: boom
|
|
114
|
-
at myFn (/src/app/page.tsx:42:10)
|
|
115
|
-
at Other (/src/app/layout.tsx:7:5)`;
|
|
116
|
-
const frames = parseStackFrames(stack);
|
|
117
|
-
expect(frames.length).toBe(2);
|
|
118
|
-
expect(frames[0].fn).toBe("myFn");
|
|
119
|
-
expect(frames[0].file).toBe("/src/app/page.tsx");
|
|
120
|
-
expect(frames[0].line).toBe(42);
|
|
121
|
-
expect(frames[0].column).toBe(10);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it("parses Firefox-style frames", () => {
|
|
125
|
-
const stack = `TypeError: boom
|
|
126
|
-
myFn@/src/app/page.tsx:42:10
|
|
127
|
-
@/src/app/layout.tsx:7:5`;
|
|
128
|
-
const frames = parseStackFrames(stack);
|
|
129
|
-
expect(frames.length).toBeGreaterThanOrEqual(1);
|
|
130
|
-
expect(frames[0].file).toBe("/src/app/page.tsx");
|
|
131
|
-
expect(frames[0].line).toBe(42);
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
it("tolerates empty / null input", () => {
|
|
135
|
-
expect(parseStackFrames(undefined)).toEqual([]);
|
|
136
|
-
expect(parseStackFrames(null)).toEqual([]);
|
|
137
|
-
expect(parseStackFrames("")).toEqual([]);
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
it("falls through with <anonymous> for unparseable lines", () => {
|
|
141
|
-
const stack = `SomeWeirdRuntime\nopaque frame line`;
|
|
142
|
-
const frames = parseStackFrames(stack);
|
|
143
|
-
expect(frames.length).toBeGreaterThan(0);
|
|
144
|
-
expect(frames.some((f) => f.fn === "<anonymous>")).toBe(true);
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
describe("buildPayloadFromError", () => {
|
|
149
|
-
it("extracts name, message, and stack from an Error", () => {
|
|
150
|
-
const err = new Error("boom");
|
|
151
|
-
err.name = "CustomError";
|
|
152
|
-
const p = buildPayloadFromError(err, { kind: "ssr", routeId: "r1" });
|
|
153
|
-
expect(p.name).toBe("CustomError");
|
|
154
|
-
expect(p.message).toBe("boom");
|
|
155
|
-
expect(p.kind).toBe("ssr");
|
|
156
|
-
expect(p.routeId).toBe("r1");
|
|
157
|
-
expect(typeof p.timestamp).toBe("number");
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
it("tolerates string throws", () => {
|
|
161
|
-
const p = buildPayloadFromError("just a string");
|
|
162
|
-
expect(p.message).toBe("just a string");
|
|
163
|
-
expect(p.name).toBe("Error");
|
|
164
|
-
expect(p.frames).toEqual([]);
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
it("tolerates null and undefined", () => {
|
|
168
|
-
const p1 = buildPayloadFromError(null);
|
|
169
|
-
expect(p1.name).toBe("Error");
|
|
170
|
-
const p2 = buildPayloadFromError(undefined);
|
|
171
|
-
expect(p2.name).toBe("Error");
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
describe("buildOverlayErrorEmbed", () => {
|
|
176
|
-
it("emits a JSON script tag with the payload id", () => {
|
|
177
|
-
const p = buildPayloadFromError(new Error("test"), { kind: "ssr" });
|
|
178
|
-
const embed = buildOverlayErrorEmbed(p);
|
|
179
|
-
expect(embed).toContain(`id="${OVERLAY_PAYLOAD_ELEMENT_ID}"`);
|
|
180
|
-
expect(embed).toContain("application/json");
|
|
181
|
-
expect(embed).toContain(OVERLAY_CUSTOM_EVENT);
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
it("escapes </script> in the payload so it cannot break out", () => {
|
|
185
|
-
const err = new Error("</script><script>alert(1)</script>");
|
|
186
|
-
const p = buildPayloadFromError(err);
|
|
187
|
-
const embed = buildOverlayErrorEmbed(p);
|
|
188
|
-
// The literal </script> sequence must not appear in the serialized JSON.
|
|
189
|
-
// escapeJsonForInlineScript breaks it into a harmless form.
|
|
190
|
-
const between = embed.split(`id="${OVERLAY_PAYLOAD_ELEMENT_ID}"`)[1] ?? "";
|
|
191
|
-
const payloadChunk = between.split("</script>")[0] ?? "";
|
|
192
|
-
expect(payloadChunk.toLowerCase().includes("<script>alert(1)")).toBe(false);
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
describe("buildOverlayErrorHtml", () => {
|
|
197
|
-
const prevEnv = process.env.NODE_ENV;
|
|
198
|
-
afterEach(() => {
|
|
199
|
-
if (prevEnv === undefined) delete process.env.NODE_ENV;
|
|
200
|
-
else process.env.NODE_ENV = prevEnv;
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
it("wraps the embed in a valid dev HTML document", () => {
|
|
204
|
-
process.env.NODE_ENV = "development";
|
|
205
|
-
const p = buildPayloadFromError(new Error("ssr boom"), { kind: "ssr", routeId: "home" });
|
|
206
|
-
const html = buildOverlayErrorHtml(p);
|
|
207
|
-
expect(html.startsWith("<!doctype html>")).toBe(true);
|
|
208
|
-
expect(html).toContain("<title>");
|
|
209
|
-
expect(html).toContain(`id="${OVERLAY_PAYLOAD_ELEMENT_ID}"`);
|
|
210
|
-
expect(html).toContain(".mandu-dev-overlay");
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
describe("OVERLAY_CLIENT_SCRIPT shape", () => {
|
|
215
|
-
it("is a well-formed IIFE", () => {
|
|
216
|
-
expect(OVERLAY_CLIENT_SCRIPT.startsWith("(function(){")).toBe(true);
|
|
217
|
-
expect(OVERLAY_CLIENT_SCRIPT.endsWith("})();")).toBe(true);
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
it("references the mounted-flag guard (prevents double-mount on HMR)", () => {
|
|
221
|
-
expect(OVERLAY_CLIENT_SCRIPT).toContain(OVERLAY_MOUNTED_FLAG);
|
|
222
|
-
expect(OVERLAY_CLIENT_SCRIPT).toContain("window[MOUNTED]=true");
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
it("wires all three error entry points", () => {
|
|
226
|
-
expect(OVERLAY_CLIENT_SCRIPT).toContain(`"error"`);
|
|
227
|
-
expect(OVERLAY_CLIENT_SCRIPT).toContain("unhandledrejection");
|
|
228
|
-
expect(OVERLAY_CLIENT_SCRIPT).toContain(OVERLAY_CUSTOM_EVENT);
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
it("stays under the 10 KB-gzip target (rough byte budget check)", () => {
|
|
232
|
-
// Uncompressed budget: 64 KB is a generous ceiling; gzip typically
|
|
233
|
-
// achieves 4-5x on this sort of string-heavy JS. We assert uncompressed
|
|
234
|
-
// < 32 KB as a hard ceiling — the current IIFE is ~7 KB uncompressed.
|
|
235
|
-
expect(OVERLAY_CLIENT_SCRIPT.length).toBeLessThan(32 * 1024);
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
it("is recomputable — _testOnly_buildOverlayClientScript yields identical output", () => {
|
|
239
|
-
expect(_testOnly_buildOverlayClientScript()).toBe(OVERLAY_CLIENT_SCRIPT);
|
|
240
|
-
});
|
|
241
|
-
});
|
|
1
|
+
/**
|
|
2
|
+
* Phase 18.α — Dev Error Overlay regression tests.
|
|
3
|
+
*
|
|
4
|
+
* Covers:
|
|
5
|
+
* - Dev injection emits both <style> and <script> tags
|
|
6
|
+
* - Production (NODE_ENV=production) suppresses injection
|
|
7
|
+
* - Explicit `enabled: false` suppresses injection even in dev
|
|
8
|
+
* - Stack parsing handles Chrome + Firefox shapes + fallthrough
|
|
9
|
+
* - Error embed escapes `</script>` sequences
|
|
10
|
+
* - Payload builder tolerates non-Error throws
|
|
11
|
+
* - buildOverlayErrorHtml wraps the embed in a valid doctype doc
|
|
12
|
+
* - Client IIFE mounts the mounted-flag guard to prevent double-mount
|
|
13
|
+
*/
|
|
14
|
+
import { describe, it, expect, beforeEach, afterEach } from "bun:test";
|
|
15
|
+
import {
|
|
16
|
+
buildOverlayHeadTag,
|
|
17
|
+
maybeInjectDevOverlay,
|
|
18
|
+
shouldInjectOverlay,
|
|
19
|
+
parseStackFrames,
|
|
20
|
+
buildPayloadFromError,
|
|
21
|
+
buildOverlayErrorEmbed,
|
|
22
|
+
buildOverlayErrorHtml,
|
|
23
|
+
} from "../overlay-injector";
|
|
24
|
+
import {
|
|
25
|
+
OVERLAY_CLIENT_SCRIPT,
|
|
26
|
+
_testOnly_buildOverlayClientScript,
|
|
27
|
+
} from "../overlay-client";
|
|
28
|
+
import {
|
|
29
|
+
OVERLAY_CUSTOM_EVENT,
|
|
30
|
+
OVERLAY_MOUNTED_FLAG,
|
|
31
|
+
OVERLAY_PAYLOAD_ELEMENT_ID,
|
|
32
|
+
} from "../types";
|
|
33
|
+
|
|
34
|
+
describe("shouldInjectOverlay", () => {
|
|
35
|
+
const prevEnv = process.env.NODE_ENV;
|
|
36
|
+
afterEach(() => {
|
|
37
|
+
if (prevEnv === undefined) delete process.env.NODE_ENV;
|
|
38
|
+
else process.env.NODE_ENV = prevEnv;
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("returns true in dev with default config", () => {
|
|
42
|
+
process.env.NODE_ENV = "development";
|
|
43
|
+
expect(shouldInjectOverlay({ isDev: true })).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("returns false when isDev is false", () => {
|
|
47
|
+
process.env.NODE_ENV = "development";
|
|
48
|
+
expect(shouldInjectOverlay({ isDev: false })).toBe(false);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("returns false when NODE_ENV=production even if isDev lies", () => {
|
|
52
|
+
process.env.NODE_ENV = "production";
|
|
53
|
+
expect(shouldInjectOverlay({ isDev: true })).toBe(false);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("returns false when user opts out via enabled: false", () => {
|
|
57
|
+
process.env.NODE_ENV = "development";
|
|
58
|
+
expect(shouldInjectOverlay({ isDev: true, enabled: false })).toBe(false);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("returns true when user explicitly enables in dev", () => {
|
|
62
|
+
process.env.NODE_ENV = "development";
|
|
63
|
+
expect(shouldInjectOverlay({ isDev: true, enabled: true })).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
describe("buildOverlayHeadTag", () => {
|
|
68
|
+
const prevEnv = process.env.NODE_ENV;
|
|
69
|
+
afterEach(() => {
|
|
70
|
+
if (prevEnv === undefined) delete process.env.NODE_ENV;
|
|
71
|
+
else process.env.NODE_ENV = prevEnv;
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("emits <style> and <script> in dev", () => {
|
|
75
|
+
process.env.NODE_ENV = "development";
|
|
76
|
+
const out = buildOverlayHeadTag({ isDev: true });
|
|
77
|
+
expect(out).toContain("<style");
|
|
78
|
+
expect(out).toContain("id=\"__mandu-dev-overlay-style\"");
|
|
79
|
+
expect(out).toContain("<script");
|
|
80
|
+
expect(out).toContain("id=\"__mandu-dev-overlay-client\"");
|
|
81
|
+
expect(out).toContain(".mandu-dev-overlay");
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("emits empty string in production", () => {
|
|
85
|
+
process.env.NODE_ENV = "production";
|
|
86
|
+
expect(buildOverlayHeadTag({ isDev: true })).toBe("");
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("emits empty string when opted out", () => {
|
|
90
|
+
process.env.NODE_ENV = "development";
|
|
91
|
+
expect(buildOverlayHeadTag({ isDev: true, enabled: false })).toBe("");
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("maybeInjectDevOverlay is alias with same behavior", () => {
|
|
95
|
+
process.env.NODE_ENV = "development";
|
|
96
|
+
expect(maybeInjectDevOverlay({ isDev: true })).toBe(
|
|
97
|
+
buildOverlayHeadTag({ isDev: true }),
|
|
98
|
+
);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("does not contain the sentinel flag leaking as a global assignment outside the IIFE", () => {
|
|
102
|
+
process.env.NODE_ENV = "development";
|
|
103
|
+
const out = buildOverlayHeadTag({ isDev: true });
|
|
104
|
+
// The sentinel is only ever referenced via `window[MOUNTED]`, never as a bare identifier assignment.
|
|
105
|
+
expect(out.includes(`var ${OVERLAY_MOUNTED_FLAG}=`)).toBe(false);
|
|
106
|
+
// But the string literal MUST appear at least once (inside the IIFE).
|
|
107
|
+
expect(out).toContain(OVERLAY_MOUNTED_FLAG);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
describe("parseStackFrames", () => {
|
|
112
|
+
it("parses Chrome-style frames", () => {
|
|
113
|
+
const stack = `TypeError: boom
|
|
114
|
+
at myFn (/src/app/page.tsx:42:10)
|
|
115
|
+
at Other (/src/app/layout.tsx:7:5)`;
|
|
116
|
+
const frames = parseStackFrames(stack);
|
|
117
|
+
expect(frames.length).toBe(2);
|
|
118
|
+
expect(frames[0].fn).toBe("myFn");
|
|
119
|
+
expect(frames[0].file).toBe("/src/app/page.tsx");
|
|
120
|
+
expect(frames[0].line).toBe(42);
|
|
121
|
+
expect(frames[0].column).toBe(10);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("parses Firefox-style frames", () => {
|
|
125
|
+
const stack = `TypeError: boom
|
|
126
|
+
myFn@/src/app/page.tsx:42:10
|
|
127
|
+
@/src/app/layout.tsx:7:5`;
|
|
128
|
+
const frames = parseStackFrames(stack);
|
|
129
|
+
expect(frames.length).toBeGreaterThanOrEqual(1);
|
|
130
|
+
expect(frames[0].file).toBe("/src/app/page.tsx");
|
|
131
|
+
expect(frames[0].line).toBe(42);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it("tolerates empty / null input", () => {
|
|
135
|
+
expect(parseStackFrames(undefined)).toEqual([]);
|
|
136
|
+
expect(parseStackFrames(null)).toEqual([]);
|
|
137
|
+
expect(parseStackFrames("")).toEqual([]);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it("falls through with <anonymous> for unparseable lines", () => {
|
|
141
|
+
const stack = `SomeWeirdRuntime\nopaque frame line`;
|
|
142
|
+
const frames = parseStackFrames(stack);
|
|
143
|
+
expect(frames.length).toBeGreaterThan(0);
|
|
144
|
+
expect(frames.some((f) => f.fn === "<anonymous>")).toBe(true);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
describe("buildPayloadFromError", () => {
|
|
149
|
+
it("extracts name, message, and stack from an Error", () => {
|
|
150
|
+
const err = new Error("boom");
|
|
151
|
+
err.name = "CustomError";
|
|
152
|
+
const p = buildPayloadFromError(err, { kind: "ssr", routeId: "r1" });
|
|
153
|
+
expect(p.name).toBe("CustomError");
|
|
154
|
+
expect(p.message).toBe("boom");
|
|
155
|
+
expect(p.kind).toBe("ssr");
|
|
156
|
+
expect(p.routeId).toBe("r1");
|
|
157
|
+
expect(typeof p.timestamp).toBe("number");
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it("tolerates string throws", () => {
|
|
161
|
+
const p = buildPayloadFromError("just a string");
|
|
162
|
+
expect(p.message).toBe("just a string");
|
|
163
|
+
expect(p.name).toBe("Error");
|
|
164
|
+
expect(p.frames).toEqual([]);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it("tolerates null and undefined", () => {
|
|
168
|
+
const p1 = buildPayloadFromError(null);
|
|
169
|
+
expect(p1.name).toBe("Error");
|
|
170
|
+
const p2 = buildPayloadFromError(undefined);
|
|
171
|
+
expect(p2.name).toBe("Error");
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
describe("buildOverlayErrorEmbed", () => {
|
|
176
|
+
it("emits a JSON script tag with the payload id", () => {
|
|
177
|
+
const p = buildPayloadFromError(new Error("test"), { kind: "ssr" });
|
|
178
|
+
const embed = buildOverlayErrorEmbed(p);
|
|
179
|
+
expect(embed).toContain(`id="${OVERLAY_PAYLOAD_ELEMENT_ID}"`);
|
|
180
|
+
expect(embed).toContain("application/json");
|
|
181
|
+
expect(embed).toContain(OVERLAY_CUSTOM_EVENT);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it("escapes </script> in the payload so it cannot break out", () => {
|
|
185
|
+
const err = new Error("</script><script>alert(1)</script>");
|
|
186
|
+
const p = buildPayloadFromError(err);
|
|
187
|
+
const embed = buildOverlayErrorEmbed(p);
|
|
188
|
+
// The literal </script> sequence must not appear in the serialized JSON.
|
|
189
|
+
// escapeJsonForInlineScript breaks it into a harmless form.
|
|
190
|
+
const between = embed.split(`id="${OVERLAY_PAYLOAD_ELEMENT_ID}"`)[1] ?? "";
|
|
191
|
+
const payloadChunk = between.split("</script>")[0] ?? "";
|
|
192
|
+
expect(payloadChunk.toLowerCase().includes("<script>alert(1)")).toBe(false);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
describe("buildOverlayErrorHtml", () => {
|
|
197
|
+
const prevEnv = process.env.NODE_ENV;
|
|
198
|
+
afterEach(() => {
|
|
199
|
+
if (prevEnv === undefined) delete process.env.NODE_ENV;
|
|
200
|
+
else process.env.NODE_ENV = prevEnv;
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it("wraps the embed in a valid dev HTML document", () => {
|
|
204
|
+
process.env.NODE_ENV = "development";
|
|
205
|
+
const p = buildPayloadFromError(new Error("ssr boom"), { kind: "ssr", routeId: "home" });
|
|
206
|
+
const html = buildOverlayErrorHtml(p);
|
|
207
|
+
expect(html.startsWith("<!doctype html>")).toBe(true);
|
|
208
|
+
expect(html).toContain("<title>");
|
|
209
|
+
expect(html).toContain(`id="${OVERLAY_PAYLOAD_ELEMENT_ID}"`);
|
|
210
|
+
expect(html).toContain(".mandu-dev-overlay");
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
describe("OVERLAY_CLIENT_SCRIPT shape", () => {
|
|
215
|
+
it("is a well-formed IIFE", () => {
|
|
216
|
+
expect(OVERLAY_CLIENT_SCRIPT.startsWith("(function(){")).toBe(true);
|
|
217
|
+
expect(OVERLAY_CLIENT_SCRIPT.endsWith("})();")).toBe(true);
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it("references the mounted-flag guard (prevents double-mount on HMR)", () => {
|
|
221
|
+
expect(OVERLAY_CLIENT_SCRIPT).toContain(OVERLAY_MOUNTED_FLAG);
|
|
222
|
+
expect(OVERLAY_CLIENT_SCRIPT).toContain("window[MOUNTED]=true");
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it("wires all three error entry points", () => {
|
|
226
|
+
expect(OVERLAY_CLIENT_SCRIPT).toContain(`"error"`);
|
|
227
|
+
expect(OVERLAY_CLIENT_SCRIPT).toContain("unhandledrejection");
|
|
228
|
+
expect(OVERLAY_CLIENT_SCRIPT).toContain(OVERLAY_CUSTOM_EVENT);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it("stays under the 10 KB-gzip target (rough byte budget check)", () => {
|
|
232
|
+
// Uncompressed budget: 64 KB is a generous ceiling; gzip typically
|
|
233
|
+
// achieves 4-5x on this sort of string-heavy JS. We assert uncompressed
|
|
234
|
+
// < 32 KB as a hard ceiling — the current IIFE is ~7 KB uncompressed.
|
|
235
|
+
expect(OVERLAY_CLIENT_SCRIPT.length).toBeLessThan(32 * 1024);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
it("is recomputable — _testOnly_buildOverlayClientScript yields identical output", () => {
|
|
239
|
+
expect(_testOnly_buildOverlayClientScript()).toBe(OVERLAY_CLIENT_SCRIPT);
|
|
240
|
+
});
|
|
241
|
+
});
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phase 18.α — Dev Error Overlay public surface.
|
|
3
|
-
*
|
|
4
|
-
* Consumed by:
|
|
5
|
-
* - `runtime/ssr.ts` (injects `<style>` + `<script>` into `<head>` in dev)
|
|
6
|
-
* - `runtime/server.ts` (embeds an SSR 500 payload so the overlay can
|
|
7
|
-
* mount even when the React tree never rendered)
|
|
8
|
-
*
|
|
9
|
-
* Production never imports from here at runtime — tree-shaking drops
|
|
10
|
-
* the IIFE string because `shouldInjectOverlay` returns `false`.
|
|
11
|
-
*/
|
|
12
|
-
export {
|
|
13
|
-
buildOverlayHeadTag,
|
|
14
|
-
maybeInjectDevOverlay,
|
|
15
|
-
shouldInjectOverlay,
|
|
16
|
-
parseStackFrames,
|
|
17
|
-
buildPayloadFromError,
|
|
18
|
-
buildOverlayErrorEmbed,
|
|
19
|
-
buildOverlayErrorHtml,
|
|
20
|
-
type DevOverlayInjectorConfig,
|
|
21
|
-
} from "./overlay-injector";
|
|
22
|
-
export { OVERLAY_CLIENT_SCRIPT } from "./overlay-client";
|
|
23
|
-
export { OVERLAY_STYLES } from "./overlay-styles";
|
|
24
|
-
export {
|
|
25
|
-
OVERLAY_PAYLOAD_ELEMENT_ID,
|
|
26
|
-
OVERLAY_CUSTOM_EVENT,
|
|
27
|
-
OVERLAY_MOUNTED_FLAG,
|
|
28
|
-
type DevErrorPayload,
|
|
29
|
-
type DevErrorStackFrame,
|
|
30
|
-
} from "./types";
|
|
1
|
+
/**
|
|
2
|
+
* Phase 18.α — Dev Error Overlay public surface.
|
|
3
|
+
*
|
|
4
|
+
* Consumed by:
|
|
5
|
+
* - `runtime/ssr.ts` (injects `<style>` + `<script>` into `<head>` in dev)
|
|
6
|
+
* - `runtime/server.ts` (embeds an SSR 500 payload so the overlay can
|
|
7
|
+
* mount even when the React tree never rendered)
|
|
8
|
+
*
|
|
9
|
+
* Production never imports from here at runtime — tree-shaking drops
|
|
10
|
+
* the IIFE string because `shouldInjectOverlay` returns `false`.
|
|
11
|
+
*/
|
|
12
|
+
export {
|
|
13
|
+
buildOverlayHeadTag,
|
|
14
|
+
maybeInjectDevOverlay,
|
|
15
|
+
shouldInjectOverlay,
|
|
16
|
+
parseStackFrames,
|
|
17
|
+
buildPayloadFromError,
|
|
18
|
+
buildOverlayErrorEmbed,
|
|
19
|
+
buildOverlayErrorHtml,
|
|
20
|
+
type DevOverlayInjectorConfig,
|
|
21
|
+
} from "./overlay-injector";
|
|
22
|
+
export { OVERLAY_CLIENT_SCRIPT } from "./overlay-client";
|
|
23
|
+
export { OVERLAY_STYLES } from "./overlay-styles";
|
|
24
|
+
export {
|
|
25
|
+
OVERLAY_PAYLOAD_ELEMENT_ID,
|
|
26
|
+
OVERLAY_CUSTOM_EVENT,
|
|
27
|
+
OVERLAY_MOUNTED_FLAG,
|
|
28
|
+
type DevErrorPayload,
|
|
29
|
+
type DevErrorStackFrame,
|
|
30
|
+
} from "./types";
|