@mandujs/core 0.54.32 → 0.55.0-beta.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.
- package/README.md +654 -654
- package/package.json +106 -210
- package/scripts/postinstall-lock.ts +153 -153
- 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 +15 -15
- package/src/a11y/types.ts +125 -125
- package/src/agent/__tests__/apply.test.ts +224 -0
- package/src/agent/__tests__/context.test.ts +97 -98
- package/src/agent/apply.ts +1031 -0
- package/src/agent/context.ts +552 -552
- package/src/agent/index.ts +4 -3
- package/src/agent/plan.ts +161 -243
- package/src/agent/repair.ts +239 -162
- package/src/agent/sync.ts +197 -198
- package/src/agent/types.ts +242 -94
- package/src/agent/verify.ts +55 -55
- package/src/auth/__tests__/login.test.ts +1 -1
- package/src/auth/__tests__/password.test.ts +15 -5
- package/src/auth/__tests__/reset.test.ts +2 -2
- 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 +14 -2
- 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/brain/doctor/analyzer.ts +7 -7
- package/src/bundler/__snapshots__/build.test.ts.snap +5 -5
- package/src/bundler/__tests__/build-runner.ts +166 -166
- package/src/bundler/__tests__/client-boundary-transform.test.ts +524 -524
- package/src/bundler/__tests__/cold-start.test.ts +60 -60
- package/src/bundler/__tests__/css.test.ts +49 -20
- 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 +24 -24
- package/src/bundler/__tests__/generation.test.ts +447 -0
- package/src/bundler/__tests__/hdr.test.ts +24 -18
- package/src/bundler/__tests__/hmr-client.test.ts +62 -24
- package/src/bundler/__tests__/jsx-runtime-shim.test.ts +179 -140
- package/src/bundler/__tests__/manifest-schema.test.ts +305 -266
- package/src/bundler/__tests__/prod-smoke.test.ts +138 -138
- package/src/bundler/__tests__/reverse-import-graph.test.ts +42 -42
- 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/analyzer.ts +15 -15
- package/src/bundler/budget.ts +404 -404
- package/src/bundler/build.test.ts +898 -915
- package/src/bundler/build.ts +113 -24
- package/src/bundler/client-boundary-transform.ts +977 -977
- package/src/bundler/css.ts +65 -44
- package/src/bundler/dev.ts +105 -73
- package/src/bundler/fast-refresh-preamble.ts +47 -47
- package/src/bundler/generation.ts +602 -0
- package/src/bundler/index.ts +3 -3
- package/src/bundler/manifest-schema.ts +55 -40
- package/src/bundler/plugins/__tests__/block-generated-imports.test.ts +13 -13
- 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 +16 -15
- 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/prerender.ts +29 -9
- package/src/bundler/reverse-import-graph.ts +339 -339
- package/src/bundler/safe-build.test.ts +1 -1
- package/src/bundler/safe-build.ts +103 -103
- package/src/bundler/scenario-matrix.ts +229 -229
- package/src/bundler/types.ts +58 -56
- 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__/props-serialization.test.ts +37 -37
- 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 +2 -2
- package/src/client/index.ts +1 -1
- package/src/client/island.ts +79 -79
- package/src/client/prefetch-helper.ts +55 -55
- package/src/client/props-serialization.ts +233 -233
- package/src/client/runtime-entry.ts +598 -598
- package/src/client/runtime.ts +1 -1
- package/src/client/serialize.ts +50 -50
- 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-compat.ts +3 -0
- package/src/components/Image.tsx +162 -162
- package/src/config/validate.ts +1 -1
- package/src/config/watcher.ts +311 -311
- package/src/constants.ts +40 -40
- package/src/content/collection.ts +9 -9
- 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/generate-types.ts +1 -1
- package/src/content/index.ts +2 -2
- 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/types.ts +58 -58
- package/src/db/__tests__/db.test.ts +9 -9
- package/src/db/index.ts +2 -2
- 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 +82 -82
- 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__/smoke.test.ts +2 -2
- package/src/desktop/__tests__/webview-fallback.test.ts +12 -32
- package/src/desktop/__tests__/window.test.ts +20 -99
- 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/webview-fallback.ts +17 -4
- package/src/desktop/window.ts +17 -8
- 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/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 +16 -16
- package/src/devtools/client/components/panel/network-panel.tsx +291 -291
- package/src/devtools/client/components/panel/panel-container.tsx +1 -1
- 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/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/types.ts +35 -35
- package/src/devtools/worker/index.ts +25 -25
- package/src/devtools/worker/redaction-worker.ts +233 -233
- package/src/diagnose/__tests__/checks.test.ts +136 -136
- package/src/diagnose/checks.ts +185 -185
- package/src/diagnose/index.ts +17 -17
- package/src/diagnose/run.ts +10 -10
- 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/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 +5 -1
- package/src/filling/auth.ts +308 -308
- package/src/filling/body-parse.test.ts +60 -60
- package/src/filling/cookie-codec.ts +5 -3
- package/src/filling/deps.ts +265 -265
- package/src/filling/head-method.test.ts +154 -154
- 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/generate.ts +30 -30
- package/src/generator/index.ts +3 -3
- package/src/generator/templates.test.ts +48 -48
- package/src/generator/templates.ts +219 -219
- 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/check.ts +39 -24
- package/src/guard/config-guard.ts +13 -13
- 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/fs-routes-policy.ts +51 -51
- package/src/guard/graph.ts +1 -1
- package/src/guard/healing.ts +36 -36
- package/src/guard/index.ts +11 -11
- 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/__tests__/id.test.ts +3 -3
- package/src/id/index.ts +105 -105
- package/src/index.ts +9 -48
- package/src/internal/client-boundary.ts +266 -266
- package/src/internal/index.ts +2 -2
- package/src/kitchen/api/agent-devtools-api.ts +779 -779
- package/src/kitchen/api/bundle-inspector.ts +179 -0
- package/src/kitchen/api/errors-grouping.ts +126 -126
- package/src/kitchen/api/file-api.ts +11 -11
- package/src/kitchen/kitchen-handler.ts +36 -0
- package/src/kitchen/kitchen-ui.ts +456 -0
- 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/perf/user-marks.ts +1 -1
- 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 +7 -7
- package/src/resource/__tests__/schema.test.ts +14 -14
- package/src/resource/ddl/__tests__/diff.test.ts +639 -639
- package/src/resource/ddl/__tests__/emit.test.ts +165 -165
- package/src/resource/ddl/__tests__/snapshot.test.ts +499 -499
- package/src/resource/ddl/emit.ts +146 -146
- 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/generator-schema.ts +11 -11
- package/src/resource/generators/slot.ts +72 -72
- package/src/resource/schema.ts +21 -21
- package/src/router/client-entry.test.ts +227 -227
- package/src/router/client-entry.ts +218 -218
- package/src/router/fs-patterns.test.ts +96 -96
- package/src/router/fs-routes.test.ts +532 -532
- package/src/router/fs-routes.ts +53 -53
- package/src/router/fs-scanner.ts +216 -216
- package/src/router/fs-types.ts +19 -19
- package/src/router/route-source-analyzer.ts +521 -521
- 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__/devtools-adapter.test.ts +68 -68
- 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__/inline-client-hydration.test.ts +237 -237
- package/src/runtime/__tests__/not-found.test.ts +152 -152
- package/src/runtime/__tests__/observability-lifecycle.test.ts +103 -103
- package/src/runtime/__tests__/page-render-response.test.ts +517 -517
- package/src/runtime/__tests__/request-middleware.test.ts +70 -70
- package/src/runtime/__tests__/searchparams-page-props.test.ts +81 -81
- 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/devtools-adapter.ts +68 -68
- package/src/runtime/escape.ts +34 -34
- package/src/runtime/fast-refresh-runtime.ts +322 -322
- package/src/runtime/fast-refresh-types.ts +1 -1
- package/src/runtime/handler.ts +65 -65
- package/src/runtime/handlers.ts +30 -11
- 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/observability-lifecycle.ts +290 -290
- package/src/runtime/openapi-endpoint.ts +236 -236
- package/src/runtime/page-render-response.ts +287 -274
- package/src/runtime/ppr.ts +74 -74
- package/src/runtime/rate-limit.ts +1 -1
- package/src/runtime/redirect.ts +1 -1
- package/src/runtime/registry.ts +171 -171
- package/src/runtime/request-middleware.ts +31 -31
- package/src/runtime/router.test.ts +4 -4
- package/src/runtime/router.ts +10 -10
- package/src/runtime/server.ts +127 -211
- package/src/runtime/shims.ts +48 -48
- package/src/runtime/ssr.ts +43 -17
- package/src/runtime/static-files.ts +369 -289
- package/src/runtime/streaming-ssr.ts +219 -180
- package/src/runtime/trace.ts +144 -144
- package/src/scheduler/__tests__/scheduler.test.ts +12 -11
- package/src/scheduler/index.ts +11 -5
- 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/spec/schema.ts +35 -35
- 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/index.ts +9 -3
- package/src/testing/lcov.ts +192 -0
- 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/__tests__/watcher.test.ts +59 -59
- package/src/watcher/watcher.ts +61 -61
package/src/diagnose/checks.ts
CHANGED
|
@@ -549,7 +549,7 @@ export async function checkPackageExportGaps(rootDir: string): Promise<DiagnoseC
|
|
|
549
549
|
}
|
|
550
550
|
|
|
551
551
|
const files = await collectSourceFiles(rootDir);
|
|
552
|
-
// Match both `from "@mandujs/core/..."` and `require("@mandujs/core/...")` forms.
|
|
552
|
+
// Match both `from "@mandujs/core/compat/..."` and `require("@mandujs/core/compat/...")` forms.
|
|
553
553
|
const importRegex = /(?:from|require\()\s*["']([^"']+)["']/g;
|
|
554
554
|
const userSubpaths = new Map<string, string[]>();
|
|
555
555
|
|
|
@@ -767,7 +767,7 @@ async function listMandujsSiblings(rootDir: string): Promise<string[]> {
|
|
|
767
767
|
* version to the hoisted core. A mismatch is reported as `error`
|
|
768
768
|
* (boot-breaking on the user's machine) with a copy-pastable fix.
|
|
769
769
|
*/
|
|
770
|
-
export async function checkNestedInternalCore(rootDir: string): Promise<DiagnoseCheckResult> {
|
|
770
|
+
export async function checkNestedInternalCore(rootDir: string): Promise<DiagnoseCheckResult> {
|
|
771
771
|
const hoistedPath = path.join(rootDir, "node_modules", "@mandujs", "core", "package.json");
|
|
772
772
|
const hoistedVersion = await readPackageVersion(hoistedPath);
|
|
773
773
|
|
|
@@ -828,186 +828,186 @@ export async function checkNestedInternalCore(rootDir: string): Promise<Diagnose
|
|
|
828
828
|
mismatchCount: mismatches.length,
|
|
829
829
|
mismatches,
|
|
830
830
|
},
|
|
831
|
-
};
|
|
832
|
-
}
|
|
833
|
-
|
|
834
|
-
// ────────────────────────────────────────────────────────────────────────
|
|
835
|
-
// 8. client_boundary_manifests (F42/F45)
|
|
836
|
-
// ────────────────────────────────────────────────────────────────────────
|
|
837
|
-
|
|
838
|
-
interface DiagnoseRouteBoundary {
|
|
839
|
-
id?: unknown;
|
|
840
|
-
routeId?: unknown;
|
|
841
|
-
module?: unknown;
|
|
842
|
-
exportName?: unknown;
|
|
843
|
-
source?: unknown;
|
|
844
|
-
}
|
|
845
|
-
|
|
846
|
-
interface DiagnoseRouteRecord {
|
|
847
|
-
id?: unknown;
|
|
848
|
-
boundaries?: unknown;
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
async function readJsonObject(filePath: string): Promise<Record<string, unknown> | null> {
|
|
852
|
-
try {
|
|
853
|
-
const raw = await fs.readFile(filePath, "utf-8");
|
|
854
|
-
const parsed = JSON.parse(raw) as unknown;
|
|
855
|
-
return parsed && typeof parsed === "object" && !Array.isArray(parsed)
|
|
856
|
-
? parsed as Record<string, unknown>
|
|
857
|
-
: null;
|
|
858
|
-
} catch {
|
|
859
|
-
return null;
|
|
860
|
-
}
|
|
861
|
-
}
|
|
862
|
-
|
|
863
|
-
function toRouteRecords(value: unknown): DiagnoseRouteRecord[] {
|
|
864
|
-
if (!Array.isArray(value)) return [];
|
|
865
|
-
return value.filter((entry): entry is DiagnoseRouteRecord =>
|
|
866
|
-
!!entry && typeof entry === "object" && !Array.isArray(entry)
|
|
867
|
-
);
|
|
868
|
-
}
|
|
869
|
-
|
|
870
|
-
function toRouteBoundaries(route: DiagnoseRouteRecord): DiagnoseRouteBoundary[] {
|
|
871
|
-
if (!Array.isArray(route.boundaries)) return [];
|
|
872
|
-
return route.boundaries.filter((entry): entry is DiagnoseRouteBoundary =>
|
|
873
|
-
!!entry && typeof entry === "object" && !Array.isArray(entry)
|
|
874
|
-
);
|
|
875
|
-
}
|
|
876
|
-
|
|
877
|
-
function bundleAssetExists(rootDir: string, jsPath: unknown): Promise<boolean> {
|
|
878
|
-
if (typeof jsPath !== "string" || jsPath.length === 0) return Promise.resolve(false);
|
|
879
|
-
const relativePath = jsPath.startsWith("/")
|
|
880
|
-
? jsPath.slice(1)
|
|
881
|
-
: jsPath;
|
|
882
|
-
return fs.access(path.join(rootDir, relativePath)).then(
|
|
883
|
-
() => true,
|
|
884
|
-
() => false,
|
|
885
|
-
);
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
/**
|
|
889
|
-
* F42/F45 check: validate compiler-owned client boundary records.
|
|
890
|
-
*
|
|
891
|
-
* This does not rebuild the app. It inspects generated route and bundle
|
|
892
|
-
* manifests and reports:
|
|
893
|
-
* - duplicate boundary ids in `.mandu/routes.manifest.json`
|
|
894
|
-
* - malformed boundary records missing id/module/exportName
|
|
895
|
-
* - missing boundary bundle entries in `.mandu/manifest.json`
|
|
896
|
-
* - boundary bundle entries whose JS asset is absent on disk
|
|
897
|
-
*/
|
|
898
|
-
export async function checkClientBoundaryManifests(rootDir: string): Promise<DiagnoseCheckResult> {
|
|
899
|
-
const routesManifestPath = path.join(rootDir, ".mandu", "routes.manifest.json");
|
|
900
|
-
const routesManifest = await readJsonObject(routesManifestPath);
|
|
901
|
-
|
|
902
|
-
if (!routesManifest) {
|
|
903
|
-
return {
|
|
904
|
-
ok: true,
|
|
905
|
-
rule: "client_boundary_manifests",
|
|
906
|
-
message: "Routes manifest is missing or unreadable — boundary manifest check skipped.",
|
|
907
|
-
details: { skipped: true, routesManifestPath: path.relative(rootDir, routesManifestPath) },
|
|
908
|
-
};
|
|
909
|
-
}
|
|
910
|
-
|
|
911
|
-
const boundaries: Array<{ routeId: string; id: string; module: string; exportName: string }> = [];
|
|
912
|
-
const malformed: Array<{ routeId: string; reason: string }> = [];
|
|
913
|
-
const seen = new Map<string, string>();
|
|
914
|
-
const duplicates: Array<{ id: string; firstRouteId: string; duplicateRouteId: string }> = [];
|
|
915
|
-
|
|
916
|
-
for (const route of toRouteRecords(routesManifest.routes)) {
|
|
917
|
-
const routeId = typeof route.id === "string" ? route.id : "(unknown-route)";
|
|
918
|
-
for (const boundary of toRouteBoundaries(route)) {
|
|
919
|
-
const id = typeof boundary.id === "string" ? boundary.id : "";
|
|
920
|
-
const module = typeof boundary.module === "string" ? boundary.module : "";
|
|
921
|
-
const exportName = typeof boundary.exportName === "string" ? boundary.exportName : "";
|
|
922
|
-
if (!id || !module || !exportName) {
|
|
923
|
-
malformed.push({ routeId, reason: "Boundary record must include id, module, and exportName." });
|
|
924
|
-
continue;
|
|
925
|
-
}
|
|
926
|
-
|
|
927
|
-
const firstRouteId = seen.get(id);
|
|
928
|
-
if (firstRouteId) {
|
|
929
|
-
duplicates.push({ id, firstRouteId, duplicateRouteId: routeId });
|
|
930
|
-
} else {
|
|
931
|
-
seen.set(id, routeId);
|
|
932
|
-
}
|
|
933
|
-
boundaries.push({ routeId, id, module, exportName });
|
|
934
|
-
}
|
|
935
|
-
}
|
|
936
|
-
|
|
937
|
-
if (malformed.length > 0 || duplicates.length > 0) {
|
|
938
|
-
return {
|
|
939
|
-
ok: false,
|
|
940
|
-
rule: "client_boundary_manifests",
|
|
941
|
-
severity: "error",
|
|
942
|
-
message: `Client boundary route manifest has ${malformed.length} malformed record(s) and ${duplicates.length} duplicate id(s).`,
|
|
943
|
-
suggestion: "Regenerate routes with `mandu generate` or rerun the build; boundary ids must be unique and include id/module/exportName.",
|
|
944
|
-
details: {
|
|
945
|
-
boundaryCount: boundaries.length,
|
|
946
|
-
malformed: malformed.slice(0, 10),
|
|
947
|
-
duplicates: duplicates.slice(0, 10),
|
|
948
|
-
},
|
|
949
|
-
};
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
if (boundaries.length === 0) {
|
|
953
|
-
return {
|
|
954
|
-
ok: true,
|
|
955
|
-
rule: "client_boundary_manifests",
|
|
956
|
-
message: "No compiler-owned client boundaries recorded in the routes manifest.",
|
|
957
|
-
details: { boundaryCount: 0 },
|
|
958
|
-
};
|
|
959
|
-
}
|
|
960
|
-
|
|
961
|
-
const bundleManifestPath = path.join(rootDir, ".mandu", "manifest.json");
|
|
962
|
-
const bundleManifest = await readJsonObject(bundleManifestPath);
|
|
963
|
-
if (!bundleManifest) {
|
|
964
|
-
return {
|
|
965
|
-
ok: false,
|
|
966
|
-
rule: "client_boundary_manifests",
|
|
967
|
-
severity: "error",
|
|
968
|
-
message: `Routes manifest declares ${boundaries.length} client boundary record(s), but bundle manifest is missing.`,
|
|
969
|
-
suggestion: "Run `mandu build` before deploy so boundary bundles are emitted and can be checked.",
|
|
970
|
-
details: { boundaryCount: boundaries.length, bundleManifestPath: path.relative(rootDir, bundleManifestPath) },
|
|
971
|
-
};
|
|
972
|
-
}
|
|
973
|
-
|
|
974
|
-
const bundleBoundaries = bundleManifest.boundaries && typeof bundleManifest.boundaries === "object" && !Array.isArray(bundleManifest.boundaries)
|
|
975
|
-
? bundleManifest.boundaries as Record<string, unknown>
|
|
976
|
-
: {};
|
|
977
|
-
const missingEntries: string[] = [];
|
|
978
|
-
const missingAssets: string[] = [];
|
|
979
|
-
|
|
980
|
-
for (const boundary of boundaries) {
|
|
981
|
-
const entry = bundleBoundaries[boundary.id];
|
|
982
|
-
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
983
|
-
missingEntries.push(boundary.id);
|
|
984
|
-
continue;
|
|
985
|
-
}
|
|
986
|
-
const jsPath = (entry as { js?: unknown }).js;
|
|
987
|
-
if (!(await bundleAssetExists(rootDir, jsPath))) {
|
|
988
|
-
missingAssets.push(boundary.id);
|
|
989
|
-
}
|
|
990
|
-
}
|
|
991
|
-
|
|
992
|
-
if (missingEntries.length > 0 || missingAssets.length > 0) {
|
|
993
|
-
return {
|
|
994
|
-
ok: false,
|
|
995
|
-
rule: "client_boundary_manifests",
|
|
996
|
-
severity: "error",
|
|
997
|
-
message: `Client boundary bundle manifest is incomplete: ${missingEntries.length} missing entr${missingEntries.length === 1 ? "y" : "ies"}, ${missingAssets.length} missing asset(s).`,
|
|
998
|
-
suggestion: "Run `mandu clean && mandu build`; if the issue persists, inspect `mandu.route.boundaries` with `includeBundle: true`.",
|
|
999
|
-
details: {
|
|
1000
|
-
boundaryCount: boundaries.length,
|
|
1001
|
-
missingEntries: missingEntries.slice(0, 10),
|
|
1002
|
-
missingAssets: missingAssets.slice(0, 10),
|
|
1003
|
-
},
|
|
1004
|
-
};
|
|
1005
|
-
}
|
|
1006
|
-
|
|
1007
|
-
return {
|
|
1008
|
-
ok: true,
|
|
1009
|
-
rule: "client_boundary_manifests",
|
|
1010
|
-
message: `Client boundary manifests are consistent for ${boundaries.length} boundary record(s).`,
|
|
1011
|
-
details: { boundaryCount: boundaries.length },
|
|
1012
|
-
};
|
|
1013
|
-
}
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
835
|
+
// 8. client_boundary_manifests (F42/F45)
|
|
836
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
837
|
+
|
|
838
|
+
interface DiagnoseRouteBoundary {
|
|
839
|
+
id?: unknown;
|
|
840
|
+
routeId?: unknown;
|
|
841
|
+
module?: unknown;
|
|
842
|
+
exportName?: unknown;
|
|
843
|
+
source?: unknown;
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
interface DiagnoseRouteRecord {
|
|
847
|
+
id?: unknown;
|
|
848
|
+
boundaries?: unknown;
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
async function readJsonObject(filePath: string): Promise<Record<string, unknown> | null> {
|
|
852
|
+
try {
|
|
853
|
+
const raw = await fs.readFile(filePath, "utf-8");
|
|
854
|
+
const parsed = JSON.parse(raw) as unknown;
|
|
855
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed)
|
|
856
|
+
? parsed as Record<string, unknown>
|
|
857
|
+
: null;
|
|
858
|
+
} catch {
|
|
859
|
+
return null;
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
function toRouteRecords(value: unknown): DiagnoseRouteRecord[] {
|
|
864
|
+
if (!Array.isArray(value)) return [];
|
|
865
|
+
return value.filter((entry): entry is DiagnoseRouteRecord =>
|
|
866
|
+
!!entry && typeof entry === "object" && !Array.isArray(entry)
|
|
867
|
+
);
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
function toRouteBoundaries(route: DiagnoseRouteRecord): DiagnoseRouteBoundary[] {
|
|
871
|
+
if (!Array.isArray(route.boundaries)) return [];
|
|
872
|
+
return route.boundaries.filter((entry): entry is DiagnoseRouteBoundary =>
|
|
873
|
+
!!entry && typeof entry === "object" && !Array.isArray(entry)
|
|
874
|
+
);
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
function bundleAssetExists(rootDir: string, jsPath: unknown): Promise<boolean> {
|
|
878
|
+
if (typeof jsPath !== "string" || jsPath.length === 0) return Promise.resolve(false);
|
|
879
|
+
const relativePath = jsPath.startsWith("/")
|
|
880
|
+
? jsPath.slice(1)
|
|
881
|
+
: jsPath;
|
|
882
|
+
return fs.access(path.join(rootDir, relativePath)).then(
|
|
883
|
+
() => true,
|
|
884
|
+
() => false,
|
|
885
|
+
);
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
/**
|
|
889
|
+
* F42/F45 check: validate compiler-owned client boundary records.
|
|
890
|
+
*
|
|
891
|
+
* This does not rebuild the app. It inspects generated route and bundle
|
|
892
|
+
* manifests and reports:
|
|
893
|
+
* - duplicate boundary ids in `.mandu/routes.manifest.json`
|
|
894
|
+
* - malformed boundary records missing id/module/exportName
|
|
895
|
+
* - missing boundary bundle entries in `.mandu/manifest.json`
|
|
896
|
+
* - boundary bundle entries whose JS asset is absent on disk
|
|
897
|
+
*/
|
|
898
|
+
export async function checkClientBoundaryManifests(rootDir: string): Promise<DiagnoseCheckResult> {
|
|
899
|
+
const routesManifestPath = path.join(rootDir, ".mandu", "routes.manifest.json");
|
|
900
|
+
const routesManifest = await readJsonObject(routesManifestPath);
|
|
901
|
+
|
|
902
|
+
if (!routesManifest) {
|
|
903
|
+
return {
|
|
904
|
+
ok: true,
|
|
905
|
+
rule: "client_boundary_manifests",
|
|
906
|
+
message: "Routes manifest is missing or unreadable — boundary manifest check skipped.",
|
|
907
|
+
details: { skipped: true, routesManifestPath: path.relative(rootDir, routesManifestPath) },
|
|
908
|
+
};
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
const boundaries: Array<{ routeId: string; id: string; module: string; exportName: string }> = [];
|
|
912
|
+
const malformed: Array<{ routeId: string; reason: string }> = [];
|
|
913
|
+
const seen = new Map<string, string>();
|
|
914
|
+
const duplicates: Array<{ id: string; firstRouteId: string; duplicateRouteId: string }> = [];
|
|
915
|
+
|
|
916
|
+
for (const route of toRouteRecords(routesManifest.routes)) {
|
|
917
|
+
const routeId = typeof route.id === "string" ? route.id : "(unknown-route)";
|
|
918
|
+
for (const boundary of toRouteBoundaries(route)) {
|
|
919
|
+
const id = typeof boundary.id === "string" ? boundary.id : "";
|
|
920
|
+
const module = typeof boundary.module === "string" ? boundary.module : "";
|
|
921
|
+
const exportName = typeof boundary.exportName === "string" ? boundary.exportName : "";
|
|
922
|
+
if (!id || !module || !exportName) {
|
|
923
|
+
malformed.push({ routeId, reason: "Boundary record must include id, module, and exportName." });
|
|
924
|
+
continue;
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
const firstRouteId = seen.get(id);
|
|
928
|
+
if (firstRouteId) {
|
|
929
|
+
duplicates.push({ id, firstRouteId, duplicateRouteId: routeId });
|
|
930
|
+
} else {
|
|
931
|
+
seen.set(id, routeId);
|
|
932
|
+
}
|
|
933
|
+
boundaries.push({ routeId, id, module, exportName });
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
if (malformed.length > 0 || duplicates.length > 0) {
|
|
938
|
+
return {
|
|
939
|
+
ok: false,
|
|
940
|
+
rule: "client_boundary_manifests",
|
|
941
|
+
severity: "error",
|
|
942
|
+
message: `Client boundary route manifest has ${malformed.length} malformed record(s) and ${duplicates.length} duplicate id(s).`,
|
|
943
|
+
suggestion: "Regenerate routes with `mandu generate` or rerun the build; boundary ids must be unique and include id/module/exportName.",
|
|
944
|
+
details: {
|
|
945
|
+
boundaryCount: boundaries.length,
|
|
946
|
+
malformed: malformed.slice(0, 10),
|
|
947
|
+
duplicates: duplicates.slice(0, 10),
|
|
948
|
+
},
|
|
949
|
+
};
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
if (boundaries.length === 0) {
|
|
953
|
+
return {
|
|
954
|
+
ok: true,
|
|
955
|
+
rule: "client_boundary_manifests",
|
|
956
|
+
message: "No compiler-owned client boundaries recorded in the routes manifest.",
|
|
957
|
+
details: { boundaryCount: 0 },
|
|
958
|
+
};
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
const bundleManifestPath = path.join(rootDir, ".mandu", "manifest.json");
|
|
962
|
+
const bundleManifest = await readJsonObject(bundleManifestPath);
|
|
963
|
+
if (!bundleManifest) {
|
|
964
|
+
return {
|
|
965
|
+
ok: false,
|
|
966
|
+
rule: "client_boundary_manifests",
|
|
967
|
+
severity: "error",
|
|
968
|
+
message: `Routes manifest declares ${boundaries.length} client boundary record(s), but bundle manifest is missing.`,
|
|
969
|
+
suggestion: "Run `mandu build` before deploy so boundary bundles are emitted and can be checked.",
|
|
970
|
+
details: { boundaryCount: boundaries.length, bundleManifestPath: path.relative(rootDir, bundleManifestPath) },
|
|
971
|
+
};
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
const bundleBoundaries = bundleManifest.boundaries && typeof bundleManifest.boundaries === "object" && !Array.isArray(bundleManifest.boundaries)
|
|
975
|
+
? bundleManifest.boundaries as Record<string, unknown>
|
|
976
|
+
: {};
|
|
977
|
+
const missingEntries: string[] = [];
|
|
978
|
+
const missingAssets: string[] = [];
|
|
979
|
+
|
|
980
|
+
for (const boundary of boundaries) {
|
|
981
|
+
const entry = bundleBoundaries[boundary.id];
|
|
982
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
983
|
+
missingEntries.push(boundary.id);
|
|
984
|
+
continue;
|
|
985
|
+
}
|
|
986
|
+
const jsPath = (entry as { js?: unknown }).js;
|
|
987
|
+
if (!(await bundleAssetExists(rootDir, jsPath))) {
|
|
988
|
+
missingAssets.push(boundary.id);
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
if (missingEntries.length > 0 || missingAssets.length > 0) {
|
|
993
|
+
return {
|
|
994
|
+
ok: false,
|
|
995
|
+
rule: "client_boundary_manifests",
|
|
996
|
+
severity: "error",
|
|
997
|
+
message: `Client boundary bundle manifest is incomplete: ${missingEntries.length} missing entr${missingEntries.length === 1 ? "y" : "ies"}, ${missingAssets.length} missing asset(s).`,
|
|
998
|
+
suggestion: "Run `mandu clean && mandu build`; if the issue persists, inspect `mandu.route.boundaries` with `includeBundle: true`.",
|
|
999
|
+
details: {
|
|
1000
|
+
boundaryCount: boundaries.length,
|
|
1001
|
+
missingEntries: missingEntries.slice(0, 10),
|
|
1002
|
+
missingAssets: missingAssets.slice(0, 10),
|
|
1003
|
+
},
|
|
1004
|
+
};
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
return {
|
|
1008
|
+
ok: true,
|
|
1009
|
+
rule: "client_boundary_manifests",
|
|
1010
|
+
message: `Client boundary manifests are consistent for ${boundaries.length} boundary record(s).`,
|
|
1011
|
+
details: { boundaryCount: boundaries.length },
|
|
1012
|
+
};
|
|
1013
|
+
}
|
package/src/diagnose/index.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @mandujs/core/diagnose — structured diagnostic checks.
|
|
3
|
-
*
|
|
4
|
-
* Public surface for Issue #215 diagnose-check expansion.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export type { DiagnoseSeverity, DiagnoseCheckResult, DiagnoseReport } from "./types";
|
|
8
|
-
export {
|
|
9
|
-
checkManifestFreshness,
|
|
10
|
-
checkPrerenderPollution,
|
|
11
|
-
checkCloneElementWarnings,
|
|
12
|
-
checkDevArtifactsInProd,
|
|
13
|
-
checkPackageExportGaps,
|
|
14
|
-
checkNestedInternalCore,
|
|
15
|
-
checkA11yHints,
|
|
16
|
-
} from "./checks";
|
|
17
|
-
export { EXTENDED_CHECKS, runExtendedDiagnose, buildReport } from "./run";
|
|
1
|
+
/**
|
|
2
|
+
* @mandujs/core/diagnose — structured diagnostic checks.
|
|
3
|
+
*
|
|
4
|
+
* Public surface for Issue #215 diagnose-check expansion.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export type { DiagnoseSeverity, DiagnoseCheckResult, DiagnoseReport } from "./types";
|
|
8
|
+
export {
|
|
9
|
+
checkManifestFreshness,
|
|
10
|
+
checkPrerenderPollution,
|
|
11
|
+
checkCloneElementWarnings,
|
|
12
|
+
checkDevArtifactsInProd,
|
|
13
|
+
checkPackageExportGaps,
|
|
14
|
+
checkNestedInternalCore,
|
|
15
|
+
checkA11yHints,
|
|
16
|
+
} from "./checks";
|
|
17
|
+
export { EXTENDED_CHECKS, runExtendedDiagnose, buildReport } from "./run";
|
package/src/diagnose/run.ts
CHANGED
|
@@ -11,11 +11,11 @@ import {
|
|
|
11
11
|
checkPrerenderPollution,
|
|
12
12
|
checkCloneElementWarnings,
|
|
13
13
|
checkDevArtifactsInProd,
|
|
14
|
-
checkPackageExportGaps,
|
|
15
|
-
checkNestedInternalCore,
|
|
16
|
-
checkA11yHints,
|
|
17
|
-
checkClientBoundaryManifests,
|
|
18
|
-
} from "./checks";
|
|
14
|
+
checkPackageExportGaps,
|
|
15
|
+
checkNestedInternalCore,
|
|
16
|
+
checkA11yHints,
|
|
17
|
+
checkClientBoundaryManifests,
|
|
18
|
+
} from "./checks";
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* Registered extended checks (Issue #215 + Phase 18.χ).
|
|
@@ -31,11 +31,11 @@ export const EXTENDED_CHECKS = [
|
|
|
31
31
|
{ name: "prerender_pollution", run: checkPrerenderPollution },
|
|
32
32
|
{ name: "cloneelement_warnings", run: checkCloneElementWarnings },
|
|
33
33
|
{ name: "dev_artifacts_in_prod", run: checkDevArtifactsInProd },
|
|
34
|
-
{ name: "package_export_gaps", run: checkPackageExportGaps },
|
|
35
|
-
{ name: "nested_internal_core", run: checkNestedInternalCore },
|
|
36
|
-
{ name: "client_boundary_manifests", run: checkClientBoundaryManifests },
|
|
37
|
-
{ name: "a11y_hints", run: checkA11yHints },
|
|
38
|
-
] as const;
|
|
34
|
+
{ name: "package_export_gaps", run: checkPackageExportGaps },
|
|
35
|
+
{ name: "nested_internal_core", run: checkNestedInternalCore },
|
|
36
|
+
{ name: "client_boundary_manifests", run: checkClientBoundaryManifests },
|
|
37
|
+
{ name: "a11y_hints", run: checkA11yHints },
|
|
38
|
+
] as const;
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* Run every extended check in parallel and return the aggregate report.
|
package/src/diagnose/types.ts
CHANGED
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mandu Diagnose — unified check result shape.
|
|
3
|
-
*
|
|
4
|
-
* Every diagnose check returns a `DiagnoseCheckResult`. Severity semantics:
|
|
5
|
-
*
|
|
6
|
-
* - `error` : blocks deploy. CI should fail. Example: stale dev-mode
|
|
7
|
-
* manifest shipped to prod, package export gap, empty bundles
|
|
8
|
-
* with islands declared.
|
|
9
|
-
* - `warning` : degraded UX or future risk. Does NOT block deploy, but
|
|
10
|
-
* surfaces for operator attention. Example: suspicious
|
|
11
|
-
* prerendered routes, many cloneElement warnings.
|
|
12
|
-
* - `info` : neutral observation, no action required.
|
|
13
|
-
*
|
|
14
|
-
* The `rule` field is a stable machine-readable identifier. The `message`
|
|
15
|
-
* field is human-readable and MAY include route paths or counts. The
|
|
16
|
-
* optional `suggestion` field is a single actionable next step.
|
|
17
|
-
*/
|
|
18
|
-
export type DiagnoseSeverity = "error" | "warning" | "info";
|
|
19
|
-
|
|
20
|
-
export interface DiagnoseCheckResult {
|
|
21
|
-
/** Overall pass/fail for this check. `true` = healthy. */
|
|
22
|
-
ok: boolean;
|
|
23
|
-
/** Stable machine-readable rule id, e.g. `manifest_freshness`. */
|
|
24
|
-
rule: string;
|
|
25
|
-
/** Severity when `ok === false`. Omitted when `ok === true`. */
|
|
26
|
-
severity?: DiagnoseSeverity;
|
|
27
|
-
/** Human-readable summary. */
|
|
28
|
-
message: string;
|
|
29
|
-
/** Single-line actionable next step, e.g. `"Run mandu build"`. */
|
|
30
|
-
suggestion?: string;
|
|
31
|
-
/** Structured details (route list, counts, file paths). */
|
|
32
|
-
details?: Record<string, unknown>;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Aggregated report across all checks for a single diagnose run.
|
|
37
|
-
*/
|
|
38
|
-
export interface DiagnoseReport {
|
|
39
|
-
/** `true` when no check has `ok: false` with `severity: 'error'`. */
|
|
40
|
-
healthy: boolean;
|
|
41
|
-
/** Count of checks returning `ok: false` with `severity: 'error'`. */
|
|
42
|
-
errorCount: number;
|
|
43
|
-
/** Count of checks returning `ok: false` with `severity: 'warning'`. */
|
|
44
|
-
warningCount: number;
|
|
45
|
-
/** Individual check results in registration order. */
|
|
46
|
-
checks: DiagnoseCheckResult[];
|
|
47
|
-
/** Summary statistics. */
|
|
48
|
-
summary: {
|
|
49
|
-
total: number;
|
|
50
|
-
passed: number;
|
|
51
|
-
failed: number;
|
|
52
|
-
};
|
|
53
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Mandu Diagnose — unified check result shape.
|
|
3
|
+
*
|
|
4
|
+
* Every diagnose check returns a `DiagnoseCheckResult`. Severity semantics:
|
|
5
|
+
*
|
|
6
|
+
* - `error` : blocks deploy. CI should fail. Example: stale dev-mode
|
|
7
|
+
* manifest shipped to prod, package export gap, empty bundles
|
|
8
|
+
* with islands declared.
|
|
9
|
+
* - `warning` : degraded UX or future risk. Does NOT block deploy, but
|
|
10
|
+
* surfaces for operator attention. Example: suspicious
|
|
11
|
+
* prerendered routes, many cloneElement warnings.
|
|
12
|
+
* - `info` : neutral observation, no action required.
|
|
13
|
+
*
|
|
14
|
+
* The `rule` field is a stable machine-readable identifier. The `message`
|
|
15
|
+
* field is human-readable and MAY include route paths or counts. The
|
|
16
|
+
* optional `suggestion` field is a single actionable next step.
|
|
17
|
+
*/
|
|
18
|
+
export type DiagnoseSeverity = "error" | "warning" | "info";
|
|
19
|
+
|
|
20
|
+
export interface DiagnoseCheckResult {
|
|
21
|
+
/** Overall pass/fail for this check. `true` = healthy. */
|
|
22
|
+
ok: boolean;
|
|
23
|
+
/** Stable machine-readable rule id, e.g. `manifest_freshness`. */
|
|
24
|
+
rule: string;
|
|
25
|
+
/** Severity when `ok === false`. Omitted when `ok === true`. */
|
|
26
|
+
severity?: DiagnoseSeverity;
|
|
27
|
+
/** Human-readable summary. */
|
|
28
|
+
message: string;
|
|
29
|
+
/** Single-line actionable next step, e.g. `"Run mandu build"`. */
|
|
30
|
+
suggestion?: string;
|
|
31
|
+
/** Structured details (route list, counts, file paths). */
|
|
32
|
+
details?: Record<string, unknown>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Aggregated report across all checks for a single diagnose run.
|
|
37
|
+
*/
|
|
38
|
+
export interface DiagnoseReport {
|
|
39
|
+
/** `true` when no check has `ok: false` with `severity: 'error'`. */
|
|
40
|
+
healthy: boolean;
|
|
41
|
+
/** Count of checks returning `ok: false` with `severity: 'error'`. */
|
|
42
|
+
errorCount: number;
|
|
43
|
+
/** Count of checks returning `ok: false` with `severity: 'warning'`. */
|
|
44
|
+
warningCount: number;
|
|
45
|
+
/** Individual check results in registration order. */
|
|
46
|
+
checks: DiagnoseCheckResult[];
|
|
47
|
+
/** Summary statistics. */
|
|
48
|
+
summary: {
|
|
49
|
+
total: number;
|
|
50
|
+
passed: number;
|
|
51
|
+
failed: number;
|
|
52
|
+
};
|
|
53
|
+
}
|