@heal-dev/heal-playwright-tracer 1.0.0 → 1.0.8
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 +94 -116
- package/dist/application/babel-playwright-tracer-plugin/index.js +16 -2
- package/dist/application/commander-cli-adapter/commander-cli-adapter.d.ts +24 -0
- package/dist/application/commander-cli-adapter/commander-cli-adapter.js +133 -0
- package/dist/application/heal-config/index.d.ts +1 -1
- package/dist/application/heal-config/registry.js +2 -1
- package/dist/application/heal-config/types.d.ts +187 -6
- package/dist/application/playwright-fixture/index.js +247 -48
- package/dist/application/playwright-fixture/wire-all-pages.d.ts +37 -0
- package/dist/application/playwright-fixture/wire-all-pages.js +71 -0
- package/dist/application/trace-event-recorder-runtime/index.d.ts +5 -0
- package/dist/application/trace-event-recorder-runtime/index.js +11 -1
- package/dist/bin/heal-tracer.d.ts +7 -0
- package/dist/bin/heal-tracer.js +16 -0
- package/dist/domain/code-hook-injector/service/statement-analysis/async-enclosing-function-detector.d.ts +11 -0
- package/dist/domain/code-hook-injector/service/statement-analysis/async-enclosing-function-detector.js +21 -0
- package/dist/domain/code-hook-injector/service/trace-hook/preprocess-call.d.ts +10 -0
- package/dist/domain/code-hook-injector/service/trace-hook/preprocess-call.js +17 -0
- package/dist/domain/persistence/execution-history-schema.d.ts +112 -0
- package/dist/domain/persistence/execution-history-schema.js +10 -0
- package/dist/domain/persistence/index.d.ts +7 -0
- package/dist/domain/persistence/index.js +10 -0
- package/dist/domain/persistence/test-status.d.ts +6 -0
- package/dist/domain/persistence/test-status.js +7 -0
- package/dist/domain/trace-event-recorder/model/console-trace-schema.d.ts +36 -0
- package/dist/domain/trace-event-recorder/model/console-trace-schema.js +7 -0
- package/dist/domain/trace-event-recorder/model/global-names.d.ts +1 -0
- package/dist/domain/trace-event-recorder/model/global-names.js +9 -1
- package/dist/domain/trace-event-recorder/model/network-trace-schema.d.ts +105 -0
- package/dist/domain/trace-event-recorder/model/network-trace-schema.js +7 -0
- package/dist/domain/trace-event-recorder/model/statement-trace-schema.d.ts +68 -2
- package/dist/domain/trace-event-recorder/model/statement-trace-schema.js +1 -1
- package/dist/domain/trace-event-recorder/model/trace-schema.d.ts +1 -0
- package/dist/domain/trace-event-recorder/service/projectors/statement-projector.d.ts +10 -1
- package/dist/domain/trace-event-recorder/service/projectors/statement-projector.js +39 -3
- package/dist/domain/trace-event-recorder/service/serializers/error-serializer.js +28 -10
- package/dist/domain/trace-event-recorder/service/serializers/index.d.ts +7 -0
- package/dist/domain/trace-event-recorder/service/serializers/index.js +13 -0
- package/dist/domain/trace-event-recorder/service/trace-event-recorder.d.ts +25 -0
- package/dist/domain/trace-event-recorder/service/trace-event-recorder.js +33 -0
- package/dist/index.d.ts +1 -1
- package/dist/infrastructure/artifact-summary-printer/artifact-summary-printer.d.ts +20 -0
- package/dist/infrastructure/artifact-summary-printer/artifact-summary-printer.js +24 -0
- package/dist/infrastructure/artifact-summary-printer/index.d.ts +7 -0
- package/dist/infrastructure/artifact-summary-printer/index.js +10 -0
- package/dist/infrastructure/heal-reporter/crash-error-classifier.d.ts +13 -0
- package/dist/infrastructure/heal-reporter/crash-error-classifier.js +65 -0
- package/dist/infrastructure/heal-reporter/failing-statement-finder.d.ts +14 -0
- package/dist/infrastructure/heal-reporter/failing-statement-finder.js +118 -0
- package/dist/infrastructure/heal-reporter/heal-tracer-reporter.d.ts +134 -0
- package/dist/infrastructure/heal-reporter/heal-tracer-reporter.js +537 -0
- package/dist/infrastructure/heal-reporter/index.d.ts +14 -0
- package/dist/infrastructure/heal-reporter/index.js +23 -0
- package/dist/infrastructure/heal-reporter/ndjson-tail-inspector.d.ts +8 -0
- package/dist/infrastructure/heal-reporter/ndjson-tail-inspector.js +75 -0
- package/dist/infrastructure/heal-traces-layout/execution-id-resolver.d.ts +14 -0
- package/dist/infrastructure/heal-traces-layout/execution-id-resolver.js +52 -0
- package/dist/infrastructure/heal-traces-layout/heal-traces-layout.d.ts +37 -0
- package/dist/infrastructure/heal-traces-layout/heal-traces-layout.js +116 -0
- package/dist/infrastructure/heal-traces-layout/index.d.ts +7 -0
- package/dist/infrastructure/heal-traces-layout/index.js +14 -0
- package/dist/infrastructure/local-viewer-adapter/discover-traces.d.ts +70 -0
- package/dist/infrastructure/local-viewer-adapter/discover-traces.js +280 -0
- package/dist/infrastructure/local-viewer-adapter/local-viewer-server.d.ts +44 -0
- package/dist/infrastructure/local-viewer-adapter/local-viewer-server.js +398 -0
- package/dist/infrastructure/local-viewer-adapter/ndjson-trace-loader.d.ts +25 -0
- package/dist/infrastructure/local-viewer-adapter/ndjson-trace-loader.js +74 -0
- package/dist/infrastructure/playwright-console-capture-adapter/console-capture-session.d.ts +40 -0
- package/dist/infrastructure/playwright-console-capture-adapter/console-capture-session.js +243 -0
- package/dist/infrastructure/playwright-console-capture-adapter/index.d.ts +7 -0
- package/dist/infrastructure/playwright-console-capture-adapter/index.js +20 -0
- package/dist/infrastructure/playwright-locator-screenshot-adapter/assertion-wrapper.js +22 -9
- package/dist/infrastructure/playwright-locator-screenshot-adapter/index.d.ts +1 -1
- package/dist/infrastructure/playwright-locator-screenshot-adapter/index.js +2 -2
- package/dist/infrastructure/playwright-locator-screenshot-adapter/locator-patch.js +19 -7
- package/dist/infrastructure/playwright-locator-screenshot-adapter/overlay-helpers.d.ts +2 -2
- package/dist/infrastructure/playwright-locator-screenshot-adapter/overlay-helpers.js +22 -9
- package/dist/infrastructure/playwright-locator-screenshot-adapter/screenshot-capture-session.d.ts +14 -3
- package/dist/infrastructure/playwright-locator-screenshot-adapter/screenshot-capture-session.js +94 -25
- package/dist/infrastructure/playwright-network-capture-adapter/body-preview.d.ts +43 -0
- package/dist/infrastructure/playwright-network-capture-adapter/body-preview.js +107 -0
- package/dist/infrastructure/playwright-network-capture-adapter/index.d.ts +10 -0
- package/dist/infrastructure/playwright-network-capture-adapter/index.js +27 -0
- package/dist/infrastructure/playwright-network-capture-adapter/network-capture-session.d.ts +55 -0
- package/dist/infrastructure/playwright-network-capture-adapter/network-capture-session.js +630 -0
- package/dist/infrastructure/playwright-network-capture-adapter/network-coalescer.d.ts +54 -0
- package/dist/infrastructure/playwright-network-capture-adapter/network-coalescer.js +96 -0
- package/dist/infrastructure/playwright-network-capture-adapter/redaction.d.ts +14 -0
- package/dist/infrastructure/playwright-network-capture-adapter/redaction.js +44 -0
- package/dist/infrastructure/playwright-test-context-adapter/playwright-test-context-adapter.d.ts +6 -1
- package/dist/infrastructure/playwright-test-context-adapter/playwright-test-context-adapter.js +5 -1
- package/dist/infrastructure/stdout-capture-adapter/stdout-capture-session.js +1 -1
- package/dist/util/logger.d.ts +17 -0
- package/dist/util/logger.js +60 -0
- package/dist/util/with-timeout.d.ts +6 -0
- package/dist/util/with-timeout.js +33 -0
- package/package.json +20 -3
- package/tracer-viewer-bundle/assets/abap-BdImnpbu.js +13 -0
- package/tracer-viewer-bundle/assets/abap-BdImnpbu.js.map +1 -0
- package/tracer-viewer-bundle/assets/actionscript-3-CoDkCxhg.js +13 -0
- package/tracer-viewer-bundle/assets/actionscript-3-CoDkCxhg.js.map +1 -0
- package/tracer-viewer-bundle/assets/ada-bCR0ucgS.js +13 -0
- package/tracer-viewer-bundle/assets/ada-bCR0ucgS.js.map +1 -0
- package/tracer-viewer-bundle/assets/andromeeda-C4gqWexZ.js +12 -0
- package/tracer-viewer-bundle/assets/andromeeda-C4gqWexZ.js.map +1 -0
- package/tracer-viewer-bundle/assets/angular-html-DA-rfuFy.js +41 -0
- package/tracer-viewer-bundle/assets/angular-html-DA-rfuFy.js.map +1 -0
- package/tracer-viewer-bundle/assets/angular-ts-BrjP3tb8.js +30 -0
- package/tracer-viewer-bundle/assets/angular-ts-BrjP3tb8.js.map +1 -0
- package/tracer-viewer-bundle/assets/apache-Pmp26Uib.js +13 -0
- package/tracer-viewer-bundle/assets/apache-Pmp26Uib.js.map +1 -0
- package/tracer-viewer-bundle/assets/apex-D8_7TLub.js +13 -0
- package/tracer-viewer-bundle/assets/apex-D8_7TLub.js.map +1 -0
- package/tracer-viewer-bundle/assets/apl-CORt7UWP.js +19 -0
- package/tracer-viewer-bundle/assets/apl-CORt7UWP.js.map +1 -0
- package/tracer-viewer-bundle/assets/applescript-Co6uUVPk.js +13 -0
- package/tracer-viewer-bundle/assets/applescript-Co6uUVPk.js.map +1 -0
- package/tracer-viewer-bundle/assets/ara-BRHolxvo.js +13 -0
- package/tracer-viewer-bundle/assets/ara-BRHolxvo.js.map +1 -0
- package/tracer-viewer-bundle/assets/asciidoc-Ve4PFQV2.js +13 -0
- package/tracer-viewer-bundle/assets/asciidoc-Ve4PFQV2.js.map +1 -0
- package/tracer-viewer-bundle/assets/asm-D_Q5rh1f.js +13 -0
- package/tracer-viewer-bundle/assets/asm-D_Q5rh1f.js.map +1 -0
- package/tracer-viewer-bundle/assets/astro-HNnZUWAn.js +19 -0
- package/tracer-viewer-bundle/assets/astro-HNnZUWAn.js.map +1 -0
- package/tracer-viewer-bundle/assets/aurora-x-D-2ljcwZ.js +12 -0
- package/tracer-viewer-bundle/assets/aurora-x-D-2ljcwZ.js.map +1 -0
- package/tracer-viewer-bundle/assets/awk-DMzUqQB5.js +13 -0
- package/tracer-viewer-bundle/assets/awk-DMzUqQB5.js.map +1 -0
- package/tracer-viewer-bundle/assets/ayu-dark-DYE7WIF3.js +12 -0
- package/tracer-viewer-bundle/assets/ayu-dark-DYE7WIF3.js.map +1 -0
- package/tracer-viewer-bundle/assets/ayu-light-BA47KaF1.js +12 -0
- package/tracer-viewer-bundle/assets/ayu-light-BA47KaF1.js.map +1 -0
- package/tracer-viewer-bundle/assets/ayu-mirage-32ctXXKs.js +12 -0
- package/tracer-viewer-bundle/assets/ayu-mirage-32ctXXKs.js.map +1 -0
- package/tracer-viewer-bundle/assets/ballerina-BFfxhgS-.js +13 -0
- package/tracer-viewer-bundle/assets/ballerina-BFfxhgS-.js.map +1 -0
- package/tracer-viewer-bundle/assets/bat-BkioyH1T.js +13 -0
- package/tracer-viewer-bundle/assets/bat-BkioyH1T.js.map +1 -0
- package/tracer-viewer-bundle/assets/beancount-k_qm7-4y.js +13 -0
- package/tracer-viewer-bundle/assets/beancount-k_qm7-4y.js.map +1 -0
- package/tracer-viewer-bundle/assets/berry-uYugtg8r.js +13 -0
- package/tracer-viewer-bundle/assets/berry-uYugtg8r.js.map +1 -0
- package/tracer-viewer-bundle/assets/bibtex-CHM0blh-.js +13 -0
- package/tracer-viewer-bundle/assets/bibtex-CHM0blh-.js.map +1 -0
- package/tracer-viewer-bundle/assets/bicep-Bmn6On1c.js +13 -0
- package/tracer-viewer-bundle/assets/bicep-Bmn6On1c.js.map +1 -0
- package/tracer-viewer-bundle/assets/bird2-BIv1doCn.js +13 -0
- package/tracer-viewer-bundle/assets/bird2-BIv1doCn.js.map +1 -0
- package/tracer-viewer-bundle/assets/blade-BjGOyj-B.js +21 -0
- package/tracer-viewer-bundle/assets/blade-BjGOyj-B.js.map +1 -0
- package/tracer-viewer-bundle/assets/bsl-BO_Y6i37.js +14 -0
- package/tracer-viewer-bundle/assets/bsl-BO_Y6i37.js.map +1 -0
- package/tracer-viewer-bundle/assets/c-BIGW1oBm.js +13 -0
- package/tracer-viewer-bundle/assets/c-BIGW1oBm.js.map +1 -0
- package/tracer-viewer-bundle/assets/c3-eo99z4R2.js +13 -0
- package/tracer-viewer-bundle/assets/c3-eo99z4R2.js.map +1 -0
- package/tracer-viewer-bundle/assets/cadence-Bv_4Rxtq.js +13 -0
- package/tracer-viewer-bundle/assets/cadence-Bv_4Rxtq.js.map +1 -0
- package/tracer-viewer-bundle/assets/cairo-KRGpt6FW.js +14 -0
- package/tracer-viewer-bundle/assets/cairo-KRGpt6FW.js.map +1 -0
- package/tracer-viewer-bundle/assets/catppuccin-frappe-DFWUc33u.js +12 -0
- package/tracer-viewer-bundle/assets/catppuccin-frappe-DFWUc33u.js.map +1 -0
- package/tracer-viewer-bundle/assets/catppuccin-latte-C9dUb6Cb.js +12 -0
- package/tracer-viewer-bundle/assets/catppuccin-latte-C9dUb6Cb.js.map +1 -0
- package/tracer-viewer-bundle/assets/catppuccin-macchiato-DQyhUUbL.js +12 -0
- package/tracer-viewer-bundle/assets/catppuccin-macchiato-DQyhUUbL.js.map +1 -0
- package/tracer-viewer-bundle/assets/catppuccin-mocha-D87Tk5Gz.js +12 -0
- package/tracer-viewer-bundle/assets/catppuccin-mocha-D87Tk5Gz.js.map +1 -0
- package/tracer-viewer-bundle/assets/clarity-D53aC0YG.js +13 -0
- package/tracer-viewer-bundle/assets/clarity-D53aC0YG.js.map +1 -0
- package/tracer-viewer-bundle/assets/clojure-P80f7IUj.js +13 -0
- package/tracer-viewer-bundle/assets/clojure-P80f7IUj.js.map +1 -0
- package/tracer-viewer-bundle/assets/cmake-D1j8_8rp.js +13 -0
- package/tracer-viewer-bundle/assets/cmake-D1j8_8rp.js.map +1 -0
- package/tracer-viewer-bundle/assets/cobol-nBiQ_Alo.js +17 -0
- package/tracer-viewer-bundle/assets/cobol-nBiQ_Alo.js.map +1 -0
- package/tracer-viewer-bundle/assets/codeowners-Bp6g37R7.js +13 -0
- package/tracer-viewer-bundle/assets/codeowners-Bp6g37R7.js.map +1 -0
- package/tracer-viewer-bundle/assets/codeql-DsOJ9woJ.js +13 -0
- package/tracer-viewer-bundle/assets/codeql-DsOJ9woJ.js.map +1 -0
- package/tracer-viewer-bundle/assets/coffee-Ch7k5sss.js +14 -0
- package/tracer-viewer-bundle/assets/coffee-Ch7k5sss.js.map +1 -0
- package/tracer-viewer-bundle/assets/common-lisp-Cg-RD9OK.js +13 -0
- package/tracer-viewer-bundle/assets/common-lisp-Cg-RD9OK.js.map +1 -0
- package/tracer-viewer-bundle/assets/coq-DkFqJrB1.js +13 -0
- package/tracer-viewer-bundle/assets/coq-DkFqJrB1.js.map +1 -0
- package/tracer-viewer-bundle/assets/cpp-CofmeUqb.js +23 -0
- package/tracer-viewer-bundle/assets/cpp-CofmeUqb.js.map +1 -0
- package/tracer-viewer-bundle/assets/crystal-DNxU26gB.js +19 -0
- package/tracer-viewer-bundle/assets/crystal-DNxU26gB.js.map +1 -0
- package/tracer-viewer-bundle/assets/csharp-COcwbKMJ.js +13 -0
- package/tracer-viewer-bundle/assets/csharp-COcwbKMJ.js.map +1 -0
- package/tracer-viewer-bundle/assets/css-CLj8gQPS.js +13 -0
- package/tracer-viewer-bundle/assets/css-CLj8gQPS.js.map +1 -0
- package/tracer-viewer-bundle/assets/csv-fuZLfV_i.js +13 -0
- package/tracer-viewer-bundle/assets/csv-fuZLfV_i.js.map +1 -0
- package/tracer-viewer-bundle/assets/cue-D82EKSYY.js +13 -0
- package/tracer-viewer-bundle/assets/cue-D82EKSYY.js.map +1 -0
- package/tracer-viewer-bundle/assets/cypher-COkxafJQ.js +13 -0
- package/tracer-viewer-bundle/assets/cypher-COkxafJQ.js.map +1 -0
- package/tracer-viewer-bundle/assets/d-85-TOEBH.js +13 -0
- package/tracer-viewer-bundle/assets/d-85-TOEBH.js.map +1 -0
- package/tracer-viewer-bundle/assets/dark-plus-C3mMm8J8.js +12 -0
- package/tracer-viewer-bundle/assets/dark-plus-C3mMm8J8.js.map +1 -0
- package/tracer-viewer-bundle/assets/dart-bE4Kk8sk.js +13 -0
- package/tracer-viewer-bundle/assets/dart-bE4Kk8sk.js.map +1 -0
- package/tracer-viewer-bundle/assets/dax-CEL-wOlO.js +13 -0
- package/tracer-viewer-bundle/assets/dax-CEL-wOlO.js.map +1 -0
- package/tracer-viewer-bundle/assets/desktop-BmXAJ9_W.js +13 -0
- package/tracer-viewer-bundle/assets/desktop-BmXAJ9_W.js.map +1 -0
- package/tracer-viewer-bundle/assets/diff-D97Zzqfu.js +13 -0
- package/tracer-viewer-bundle/assets/diff-D97Zzqfu.js.map +1 -0
- package/tracer-viewer-bundle/assets/docker-BcOcwvcX.js +13 -0
- package/tracer-viewer-bundle/assets/docker-BcOcwvcX.js.map +1 -0
- package/tracer-viewer-bundle/assets/dotenv-Da5cRb03.js +13 -0
- package/tracer-viewer-bundle/assets/dotenv-Da5cRb03.js.map +1 -0
- package/tracer-viewer-bundle/assets/dracula-BzJJZx-M.js +12 -0
- package/tracer-viewer-bundle/assets/dracula-BzJJZx-M.js.map +1 -0
- package/tracer-viewer-bundle/assets/dracula-soft-BXkSAIEj.js +12 -0
- package/tracer-viewer-bundle/assets/dracula-soft-BXkSAIEj.js.map +1 -0
- package/tracer-viewer-bundle/assets/dream-maker-BtqSS_iP.js +13 -0
- package/tracer-viewer-bundle/assets/dream-maker-BtqSS_iP.js.map +1 -0
- package/tracer-viewer-bundle/assets/edge-FbVlp4U3.js +18 -0
- package/tracer-viewer-bundle/assets/edge-FbVlp4U3.js.map +1 -0
- package/tracer-viewer-bundle/assets/elixir-CkH2-t6x.js +16 -0
- package/tracer-viewer-bundle/assets/elixir-CkH2-t6x.js.map +1 -0
- package/tracer-viewer-bundle/assets/elm-DbKCFpqz.js +15 -0
- package/tracer-viewer-bundle/assets/elm-DbKCFpqz.js.map +1 -0
- package/tracer-viewer-bundle/assets/emacs-lisp-CXvaQtF9.js +13 -0
- package/tracer-viewer-bundle/assets/emacs-lisp-CXvaQtF9.js.map +1 -0
- package/tracer-viewer-bundle/assets/erb-BYCe7drp.js +32 -0
- package/tracer-viewer-bundle/assets/erb-BYCe7drp.js.map +1 -0
- package/tracer-viewer-bundle/assets/erlang-DsQrWhSR.js +14 -0
- package/tracer-viewer-bundle/assets/erlang-DsQrWhSR.js.map +1 -0
- package/tracer-viewer-bundle/assets/everforest-dark-BgDCqdQA.js +12 -0
- package/tracer-viewer-bundle/assets/everforest-dark-BgDCqdQA.js.map +1 -0
- package/tracer-viewer-bundle/assets/everforest-light-C8M2exoo.js +12 -0
- package/tracer-viewer-bundle/assets/everforest-light-C8M2exoo.js.map +1 -0
- package/tracer-viewer-bundle/assets/favicon-DRSNNJwn.svg +3 -0
- package/tracer-viewer-bundle/assets/fennel-BYunw83y.js +13 -0
- package/tracer-viewer-bundle/assets/fennel-BYunw83y.js.map +1 -0
- package/tracer-viewer-bundle/assets/fish-BvzEVeQv.js +13 -0
- package/tracer-viewer-bundle/assets/fish-BvzEVeQv.js.map +1 -0
- package/tracer-viewer-bundle/assets/fluent-C4IJs8-o.js +13 -0
- package/tracer-viewer-bundle/assets/fluent-C4IJs8-o.js.map +1 -0
- package/tracer-viewer-bundle/assets/fortran-fixed-form-CkoXwp7k.js +14 -0
- package/tracer-viewer-bundle/assets/fortran-fixed-form-CkoXwp7k.js.map +1 -0
- package/tracer-viewer-bundle/assets/fortran-free-form-BxgE0vQu.js +13 -0
- package/tracer-viewer-bundle/assets/fortran-free-form-BxgE0vQu.js.map +1 -0
- package/tracer-viewer-bundle/assets/fsharp-CXgrBDvD.js +14 -0
- package/tracer-viewer-bundle/assets/fsharp-CXgrBDvD.js.map +1 -0
- package/tracer-viewer-bundle/assets/gdresource-BOOCDP_w.js +15 -0
- package/tracer-viewer-bundle/assets/gdresource-BOOCDP_w.js.map +1 -0
- package/tracer-viewer-bundle/assets/gdscript-C5YyOfLZ.js +13 -0
- package/tracer-viewer-bundle/assets/gdscript-C5YyOfLZ.js.map +1 -0
- package/tracer-viewer-bundle/assets/gdshader-DkwncUOv.js +13 -0
- package/tracer-viewer-bundle/assets/gdshader-DkwncUOv.js.map +1 -0
- package/tracer-viewer-bundle/assets/genie-D0YGMca9.js +13 -0
- package/tracer-viewer-bundle/assets/genie-D0YGMca9.js.map +1 -0
- package/tracer-viewer-bundle/assets/gherkin-DyxjwDmM.js +13 -0
- package/tracer-viewer-bundle/assets/gherkin-DyxjwDmM.js.map +1 -0
- package/tracer-viewer-bundle/assets/git-commit-F4YmCXRG.js +14 -0
- package/tracer-viewer-bundle/assets/git-commit-F4YmCXRG.js.map +1 -0
- package/tracer-viewer-bundle/assets/git-rebase-r7XF79zn.js +14 -0
- package/tracer-viewer-bundle/assets/git-rebase-r7XF79zn.js.map +1 -0
- package/tracer-viewer-bundle/assets/github-dark-DHJKELXO.js +12 -0
- package/tracer-viewer-bundle/assets/github-dark-DHJKELXO.js.map +1 -0
- package/tracer-viewer-bundle/assets/github-dark-default-Cuk6v7N8.js +12 -0
- package/tracer-viewer-bundle/assets/github-dark-default-Cuk6v7N8.js.map +1 -0
- package/tracer-viewer-bundle/assets/github-dark-dimmed-DH5Ifo-i.js +12 -0
- package/tracer-viewer-bundle/assets/github-dark-dimmed-DH5Ifo-i.js.map +1 -0
- package/tracer-viewer-bundle/assets/github-dark-high-contrast-E3gJ1_iC.js +12 -0
- package/tracer-viewer-bundle/assets/github-dark-high-contrast-E3gJ1_iC.js.map +1 -0
- package/tracer-viewer-bundle/assets/github-light-DAi9KRSo.js +12 -0
- package/tracer-viewer-bundle/assets/github-light-DAi9KRSo.js.map +1 -0
- package/tracer-viewer-bundle/assets/github-light-default-D7oLnXFd.js +12 -0
- package/tracer-viewer-bundle/assets/github-light-default-D7oLnXFd.js.map +1 -0
- package/tracer-viewer-bundle/assets/github-light-high-contrast-BfjtVDDH.js +12 -0
- package/tracer-viewer-bundle/assets/github-light-high-contrast-BfjtVDDH.js.map +1 -0
- package/tracer-viewer-bundle/assets/gleam-BspZqrRM.js +13 -0
- package/tracer-viewer-bundle/assets/gleam-BspZqrRM.js.map +1 -0
- package/tracer-viewer-bundle/assets/glimmer-js-ByusRIyA.js +17 -0
- package/tracer-viewer-bundle/assets/glimmer-js-ByusRIyA.js.map +1 -0
- package/tracer-viewer-bundle/assets/glimmer-ts-BfAWNZQY.js +17 -0
- package/tracer-viewer-bundle/assets/glimmer-ts-BfAWNZQY.js.map +1 -0
- package/tracer-viewer-bundle/assets/glsl-DplSGwfg.js +14 -0
- package/tracer-viewer-bundle/assets/glsl-DplSGwfg.js.map +1 -0
- package/tracer-viewer-bundle/assets/gn-n2N0HUVH.js +13 -0
- package/tracer-viewer-bundle/assets/gn-n2N0HUVH.js.map +1 -0
- package/tracer-viewer-bundle/assets/gnuplot-DdkO51Og.js +13 -0
- package/tracer-viewer-bundle/assets/gnuplot-DdkO51Og.js.map +1 -0
- package/tracer-viewer-bundle/assets/go-C27-OAKa.js +13 -0
- package/tracer-viewer-bundle/assets/go-C27-OAKa.js.map +1 -0
- package/tracer-viewer-bundle/assets/graphql-ChdNCCLP.js +17 -0
- package/tracer-viewer-bundle/assets/graphql-ChdNCCLP.js.map +1 -0
- package/tracer-viewer-bundle/assets/groovy-gcz8RCvz.js +13 -0
- package/tracer-viewer-bundle/assets/groovy-gcz8RCvz.js.map +1 -0
- package/tracer-viewer-bundle/assets/gruvbox-dark-hard-CFHQjOhq.js +12 -0
- package/tracer-viewer-bundle/assets/gruvbox-dark-hard-CFHQjOhq.js.map +1 -0
- package/tracer-viewer-bundle/assets/gruvbox-dark-medium-GsRaNv29.js +12 -0
- package/tracer-viewer-bundle/assets/gruvbox-dark-medium-GsRaNv29.js.map +1 -0
- package/tracer-viewer-bundle/assets/gruvbox-dark-soft-CVdnzihN.js +12 -0
- package/tracer-viewer-bundle/assets/gruvbox-dark-soft-CVdnzihN.js.map +1 -0
- package/tracer-viewer-bundle/assets/gruvbox-light-hard-CH1njM8p.js +12 -0
- package/tracer-viewer-bundle/assets/gruvbox-light-hard-CH1njM8p.js.map +1 -0
- package/tracer-viewer-bundle/assets/gruvbox-light-medium-DRw_LuNl.js +12 -0
- package/tracer-viewer-bundle/assets/gruvbox-light-medium-DRw_LuNl.js.map +1 -0
- package/tracer-viewer-bundle/assets/gruvbox-light-soft-hJgmCMqR.js +12 -0
- package/tracer-viewer-bundle/assets/gruvbox-light-soft-hJgmCMqR.js.map +1 -0
- package/tracer-viewer-bundle/assets/hack-i7_Ulhet.js +17 -0
- package/tracer-viewer-bundle/assets/hack-i7_Ulhet.js.map +1 -0
- package/tracer-viewer-bundle/assets/haml-D5jkg6IW.js +15 -0
- package/tracer-viewer-bundle/assets/haml-D5jkg6IW.js.map +1 -0
- package/tracer-viewer-bundle/assets/handlebars-BpdQsYii.js +17 -0
- package/tracer-viewer-bundle/assets/handlebars-BpdQsYii.js.map +1 -0
- package/tracer-viewer-bundle/assets/haskell-Df6bDoY_.js +13 -0
- package/tracer-viewer-bundle/assets/haskell-Df6bDoY_.js.map +1 -0
- package/tracer-viewer-bundle/assets/haxe-CzTSHFRz.js +13 -0
- package/tracer-viewer-bundle/assets/haxe-CzTSHFRz.js.map +1 -0
- package/tracer-viewer-bundle/assets/hcl-BWvSN4gD.js +13 -0
- package/tracer-viewer-bundle/assets/hcl-BWvSN4gD.js.map +1 -0
- package/tracer-viewer-bundle/assets/hjson-D5-asLiD.js +13 -0
- package/tracer-viewer-bundle/assets/hjson-D5-asLiD.js.map +1 -0
- package/tracer-viewer-bundle/assets/hlsl-D3lLCCz7.js +13 -0
- package/tracer-viewer-bundle/assets/hlsl-D3lLCCz7.js.map +1 -0
- package/tracer-viewer-bundle/assets/horizon-BUw7H-hv.js +12 -0
- package/tracer-viewer-bundle/assets/horizon-BUw7H-hv.js.map +1 -0
- package/tracer-viewer-bundle/assets/horizon-bright-CUuTKBJd.js +12 -0
- package/tracer-viewer-bundle/assets/horizon-bright-CUuTKBJd.js.map +1 -0
- package/tracer-viewer-bundle/assets/houston-DnULxvSX.js +12 -0
- package/tracer-viewer-bundle/assets/houston-DnULxvSX.js.map +1 -0
- package/tracer-viewer-bundle/assets/html-derivative-DlHx6ybY.js +16 -0
- package/tracer-viewer-bundle/assets/html-derivative-DlHx6ybY.js.map +1 -0
- package/tracer-viewer-bundle/assets/html-pp8916En.js +15 -0
- package/tracer-viewer-bundle/assets/html-pp8916En.js.map +1 -0
- package/tracer-viewer-bundle/assets/http-jrhK8wxY.js +22 -0
- package/tracer-viewer-bundle/assets/http-jrhK8wxY.js.map +1 -0
- package/tracer-viewer-bundle/assets/hurl-irOxFIW8.js +21 -0
- package/tracer-viewer-bundle/assets/hurl-irOxFIW8.js.map +1 -0
- package/tracer-viewer-bundle/assets/hxml-Bvhsp5Yf.js +14 -0
- package/tracer-viewer-bundle/assets/hxml-Bvhsp5Yf.js.map +1 -0
- package/tracer-viewer-bundle/assets/hy-DFXneXwc.js +13 -0
- package/tracer-viewer-bundle/assets/hy-DFXneXwc.js.map +1 -0
- package/tracer-viewer-bundle/assets/imba-DGztddWO.js +13 -0
- package/tracer-viewer-bundle/assets/imba-DGztddWO.js.map +1 -0
- package/tracer-viewer-bundle/assets/index-CIRSNBm6.css +4792 -0
- package/tracer-viewer-bundle/assets/index-DS0dKIBi.js +36912 -0
- package/tracer-viewer-bundle/assets/index-DS0dKIBi.js.map +1 -0
- package/tracer-viewer-bundle/assets/ini-BEwlwnbL.js +13 -0
- package/tracer-viewer-bundle/assets/ini-BEwlwnbL.js.map +1 -0
- package/tracer-viewer-bundle/assets/java-CylS5w8V.js +13 -0
- package/tracer-viewer-bundle/assets/java-CylS5w8V.js.map +1 -0
- package/tracer-viewer-bundle/assets/javascript-wDzz0qaB.js +13 -0
- package/tracer-viewer-bundle/assets/javascript-wDzz0qaB.js.map +1 -0
- package/tracer-viewer-bundle/assets/jinja-f2NsQr07.js +22 -0
- package/tracer-viewer-bundle/assets/jinja-f2NsQr07.js.map +1 -0
- package/tracer-viewer-bundle/assets/jison-wvAkD_A8.js +14 -0
- package/tracer-viewer-bundle/assets/jison-wvAkD_A8.js.map +1 -0
- package/tracer-viewer-bundle/assets/json-Cp-IABpG.js +13 -0
- package/tracer-viewer-bundle/assets/json-Cp-IABpG.js.map +1 -0
- package/tracer-viewer-bundle/assets/json5-C9tS-k6U.js +13 -0
- package/tracer-viewer-bundle/assets/json5-C9tS-k6U.js.map +1 -0
- package/tracer-viewer-bundle/assets/jsonc-Des-eS-w.js +13 -0
- package/tracer-viewer-bundle/assets/jsonc-Des-eS-w.js.map +1 -0
- package/tracer-viewer-bundle/assets/jsonl-DcaNXYhu.js +13 -0
- package/tracer-viewer-bundle/assets/jsonl-DcaNXYhu.js.map +1 -0
- package/tracer-viewer-bundle/assets/jsonnet-DFQXde-d.js +13 -0
- package/tracer-viewer-bundle/assets/jsonnet-DFQXde-d.js.map +1 -0
- package/tracer-viewer-bundle/assets/jssm-C2t-YnRu.js +13 -0
- package/tracer-viewer-bundle/assets/jssm-C2t-YnRu.js.map +1 -0
- package/tracer-viewer-bundle/assets/jsx-g9-lgVsj.js +13 -0
- package/tracer-viewer-bundle/assets/jsx-g9-lgVsj.js.map +1 -0
- package/tracer-viewer-bundle/assets/julia-CxzCAyBv.js +21 -0
- package/tracer-viewer-bundle/assets/julia-CxzCAyBv.js.map +1 -0
- package/tracer-viewer-bundle/assets/just-VxiPbLrw.js +34 -0
- package/tracer-viewer-bundle/assets/just-VxiPbLrw.js.map +1 -0
- package/tracer-viewer-bundle/assets/kanagawa-dragon-CkXjmgJE.js +12 -0
- package/tracer-viewer-bundle/assets/kanagawa-dragon-CkXjmgJE.js.map +1 -0
- package/tracer-viewer-bundle/assets/kanagawa-lotus-CfQXZHmo.js +12 -0
- package/tracer-viewer-bundle/assets/kanagawa-lotus-CfQXZHmo.js.map +1 -0
- package/tracer-viewer-bundle/assets/kanagawa-wave-DWedfzmr.js +12 -0
- package/tracer-viewer-bundle/assets/kanagawa-wave-DWedfzmr.js.map +1 -0
- package/tracer-viewer-bundle/assets/kdl-DV7GczEv.js +13 -0
- package/tracer-viewer-bundle/assets/kdl-DV7GczEv.js.map +1 -0
- package/tracer-viewer-bundle/assets/kotlin-BdnUsdx6.js +13 -0
- package/tracer-viewer-bundle/assets/kotlin-BdnUsdx6.js.map +1 -0
- package/tracer-viewer-bundle/assets/kusto-wEQ09or8.js +13 -0
- package/tracer-viewer-bundle/assets/kusto-wEQ09or8.js.map +1 -0
- package/tracer-viewer-bundle/assets/laserwave-DUszq2jm.js +12 -0
- package/tracer-viewer-bundle/assets/laserwave-DUszq2jm.js.map +1 -0
- package/tracer-viewer-bundle/assets/latex-CWtU0Tv5.js +15 -0
- package/tracer-viewer-bundle/assets/latex-CWtU0Tv5.js.map +1 -0
- package/tracer-viewer-bundle/assets/lean-BZvkOJ9d.js +13 -0
- package/tracer-viewer-bundle/assets/lean-BZvkOJ9d.js.map +1 -0
- package/tracer-viewer-bundle/assets/less-B1dDrJ26.js +13 -0
- package/tracer-viewer-bundle/assets/less-B1dDrJ26.js.map +1 -0
- package/tracer-viewer-bundle/assets/light-plus-B7mTdjB0.js +12 -0
- package/tracer-viewer-bundle/assets/light-plus-B7mTdjB0.js.map +1 -0
- package/tracer-viewer-bundle/assets/liquid-C0sCDyMI.js +17 -0
- package/tracer-viewer-bundle/assets/liquid-C0sCDyMI.js.map +1 -0
- package/tracer-viewer-bundle/assets/llvm-DjAJT7YJ.js +13 -0
- package/tracer-viewer-bundle/assets/llvm-DjAJT7YJ.js.map +1 -0
- package/tracer-viewer-bundle/assets/log-2UxHyX5q.js +13 -0
- package/tracer-viewer-bundle/assets/log-2UxHyX5q.js.map +1 -0
- package/tracer-viewer-bundle/assets/logo-BtOb2qkB.js +13 -0
- package/tracer-viewer-bundle/assets/logo-BtOb2qkB.js.map +1 -0
- package/tracer-viewer-bundle/assets/lua-BaeVxFsk.js +14 -0
- package/tracer-viewer-bundle/assets/lua-BaeVxFsk.js.map +1 -0
- package/tracer-viewer-bundle/assets/luau-C-HG3fhB.js +13 -0
- package/tracer-viewer-bundle/assets/luau-C-HG3fhB.js.map +1 -0
- package/tracer-viewer-bundle/assets/make-CHLpvVh8.js +13 -0
- package/tracer-viewer-bundle/assets/make-CHLpvVh8.js.map +1 -0
- package/tracer-viewer-bundle/assets/markdown-Cvjx9yec.js +13 -0
- package/tracer-viewer-bundle/assets/markdown-Cvjx9yec.js.map +1 -0
- package/tracer-viewer-bundle/assets/marko-DjSrsDqO.js +17 -0
- package/tracer-viewer-bundle/assets/marko-DjSrsDqO.js.map +1 -0
- package/tracer-viewer-bundle/assets/material-theme-D5KoaKCx.js +12 -0
- package/tracer-viewer-bundle/assets/material-theme-D5KoaKCx.js.map +1 -0
- package/tracer-viewer-bundle/assets/material-theme-darker-BfHTSMKl.js +12 -0
- package/tracer-viewer-bundle/assets/material-theme-darker-BfHTSMKl.js.map +1 -0
- package/tracer-viewer-bundle/assets/material-theme-lighter-B0m2ddpp.js +12 -0
- package/tracer-viewer-bundle/assets/material-theme-lighter-B0m2ddpp.js.map +1 -0
- package/tracer-viewer-bundle/assets/material-theme-ocean-CyktbL80.js +12 -0
- package/tracer-viewer-bundle/assets/material-theme-ocean-CyktbL80.js.map +1 -0
- package/tracer-viewer-bundle/assets/material-theme-palenight-Csfq5Kiy.js +12 -0
- package/tracer-viewer-bundle/assets/material-theme-palenight-Csfq5Kiy.js.map +1 -0
- package/tracer-viewer-bundle/assets/matlab-D7o27uSR.js +13 -0
- package/tracer-viewer-bundle/assets/matlab-D7o27uSR.js.map +1 -0
- package/tracer-viewer-bundle/assets/mdc-DTYItulj.js +19 -0
- package/tracer-viewer-bundle/assets/mdc-DTYItulj.js.map +1 -0
- package/tracer-viewer-bundle/assets/mdx-Cmh6b_Ma.js +13 -0
- package/tracer-viewer-bundle/assets/mdx-Cmh6b_Ma.js.map +1 -0
- package/tracer-viewer-bundle/assets/mermaid-mWjccvbQ.js +13 -0
- package/tracer-viewer-bundle/assets/mermaid-mWjccvbQ.js.map +1 -0
- package/tracer-viewer-bundle/assets/min-dark-CafNBF8u.js +12 -0
- package/tracer-viewer-bundle/assets/min-dark-CafNBF8u.js.map +1 -0
- package/tracer-viewer-bundle/assets/min-light-CTRr51gU.js +12 -0
- package/tracer-viewer-bundle/assets/min-light-CTRr51gU.js.map +1 -0
- package/tracer-viewer-bundle/assets/mipsasm-CKIfxQSi.js +13 -0
- package/tracer-viewer-bundle/assets/mipsasm-CKIfxQSi.js.map +1 -0
- package/tracer-viewer-bundle/assets/mojo-rZm6bMo-.js +13 -0
- package/tracer-viewer-bundle/assets/mojo-rZm6bMo-.js.map +1 -0
- package/tracer-viewer-bundle/assets/monokai-D4h5O-jR.js +12 -0
- package/tracer-viewer-bundle/assets/monokai-D4h5O-jR.js.map +1 -0
- package/tracer-viewer-bundle/assets/moonbit-_H4v1dQx.js +13 -0
- package/tracer-viewer-bundle/assets/moonbit-_H4v1dQx.js.map +1 -0
- package/tracer-viewer-bundle/assets/move-IF9eRakj.js +13 -0
- package/tracer-viewer-bundle/assets/move-IF9eRakj.js.map +1 -0
- package/tracer-viewer-bundle/assets/narrat-DRg8JJMk.js +13 -0
- package/tracer-viewer-bundle/assets/narrat-DRg8JJMk.js.map +1 -0
- package/tracer-viewer-bundle/assets/nextflow-C-mBbutL.js +14 -0
- package/tracer-viewer-bundle/assets/nextflow-C-mBbutL.js.map +1 -0
- package/tracer-viewer-bundle/assets/nextflow-groovy-vE_lwT2v.js +13 -0
- package/tracer-viewer-bundle/assets/nextflow-groovy-vE_lwT2v.js.map +1 -0
- package/tracer-viewer-bundle/assets/nginx-BpAMiNFr.js +15 -0
- package/tracer-viewer-bundle/assets/nginx-BpAMiNFr.js.map +1 -0
- package/tracer-viewer-bundle/assets/night-owl-C39BiMTA.js +12 -0
- package/tracer-viewer-bundle/assets/night-owl-C39BiMTA.js.map +1 -0
- package/tracer-viewer-bundle/assets/night-owl-light-CMTm3GFP.js +12 -0
- package/tracer-viewer-bundle/assets/night-owl-light-CMTm3GFP.js.map +1 -0
- package/tracer-viewer-bundle/assets/nim-BIad80T-.js +21 -0
- package/tracer-viewer-bundle/assets/nim-BIad80T-.js.map +1 -0
- package/tracer-viewer-bundle/assets/nix-CwoSXNpI.js +19 -0
- package/tracer-viewer-bundle/assets/nix-CwoSXNpI.js.map +1 -0
- package/tracer-viewer-bundle/assets/nord-Ddv68eIx.js +12 -0
- package/tracer-viewer-bundle/assets/nord-Ddv68eIx.js.map +1 -0
- package/tracer-viewer-bundle/assets/nushell-Cz2AlsmD.js +13 -0
- package/tracer-viewer-bundle/assets/nushell-Cz2AlsmD.js.map +1 -0
- package/tracer-viewer-bundle/assets/objective-c-DXmwc3jG.js +13 -0
- package/tracer-viewer-bundle/assets/objective-c-DXmwc3jG.js.map +1 -0
- package/tracer-viewer-bundle/assets/objective-cpp-CLxacb5B.js +13 -0
- package/tracer-viewer-bundle/assets/objective-cpp-CLxacb5B.js.map +1 -0
- package/tracer-viewer-bundle/assets/ocaml-C0hk2d4L.js +13 -0
- package/tracer-viewer-bundle/assets/ocaml-C0hk2d4L.js.map +1 -0
- package/tracer-viewer-bundle/assets/odin-BBf5iR-q.js +13 -0
- package/tracer-viewer-bundle/assets/odin-BBf5iR-q.js.map +1 -0
- package/tracer-viewer-bundle/assets/one-dark-pro-DVMEJ2y_.js +12 -0
- package/tracer-viewer-bundle/assets/one-dark-pro-DVMEJ2y_.js.map +1 -0
- package/tracer-viewer-bundle/assets/one-light-C3Wv6jpd.js +12 -0
- package/tracer-viewer-bundle/assets/one-light-C3Wv6jpd.js.map +1 -0
- package/tracer-viewer-bundle/assets/openscad-C4EeE6gA.js +13 -0
- package/tracer-viewer-bundle/assets/openscad-C4EeE6gA.js.map +1 -0
- package/tracer-viewer-bundle/assets/pascal-D93ZcfNL.js +13 -0
- package/tracer-viewer-bundle/assets/pascal-D93ZcfNL.js.map +1 -0
- package/tracer-viewer-bundle/assets/perl-NvoQZIq0.js +19 -0
- package/tracer-viewer-bundle/assets/perl-NvoQZIq0.js.map +1 -0
- package/tracer-viewer-bundle/assets/php-R6g_5hLQ.js +20 -0
- package/tracer-viewer-bundle/assets/php-R6g_5hLQ.js.map +1 -0
- package/tracer-viewer-bundle/assets/pkl-u5AG7uiY.js +13 -0
- package/tracer-viewer-bundle/assets/pkl-u5AG7uiY.js.map +1 -0
- package/tracer-viewer-bundle/assets/plastic-3e1v2bzS.js +12 -0
- package/tracer-viewer-bundle/assets/plastic-3e1v2bzS.js.map +1 -0
- package/tracer-viewer-bundle/assets/plsql-ChMvpjG-.js +13 -0
- package/tracer-viewer-bundle/assets/plsql-ChMvpjG-.js.map +1 -0
- package/tracer-viewer-bundle/assets/po-BTJTHyun.js +13 -0
- package/tracer-viewer-bundle/assets/po-BTJTHyun.js.map +1 -0
- package/tracer-viewer-bundle/assets/poimandres-CS3Unz2-.js +12 -0
- package/tracer-viewer-bundle/assets/poimandres-CS3Unz2-.js.map +1 -0
- package/tracer-viewer-bundle/assets/polar-C0HS_06l.js +13 -0
- package/tracer-viewer-bundle/assets/polar-C0HS_06l.js.map +1 -0
- package/tracer-viewer-bundle/assets/postcss-CXtECtnM.js +13 -0
- package/tracer-viewer-bundle/assets/postcss-CXtECtnM.js.map +1 -0
- package/tracer-viewer-bundle/assets/powerquery-CEu0bR-o.js +13 -0
- package/tracer-viewer-bundle/assets/powerquery-CEu0bR-o.js.map +1 -0
- package/tracer-viewer-bundle/assets/powershell-Dpen1YoG.js +13 -0
- package/tracer-viewer-bundle/assets/powershell-Dpen1YoG.js.map +1 -0
- package/tracer-viewer-bundle/assets/prisma-Dd19v3D-.js +13 -0
- package/tracer-viewer-bundle/assets/prisma-Dd19v3D-.js.map +1 -0
- package/tracer-viewer-bundle/assets/prolog-CbFg5uaA.js +13 -0
- package/tracer-viewer-bundle/assets/prolog-CbFg5uaA.js.map +1 -0
- package/tracer-viewer-bundle/assets/proto-C7zT0LnQ.js +13 -0
- package/tracer-viewer-bundle/assets/proto-C7zT0LnQ.js.map +1 -0
- package/tracer-viewer-bundle/assets/pug-DKIMFp6K.js +16 -0
- package/tracer-viewer-bundle/assets/pug-DKIMFp6K.js.map +1 -0
- package/tracer-viewer-bundle/assets/puppet-BMWR74SV.js +13 -0
- package/tracer-viewer-bundle/assets/puppet-BMWR74SV.js.map +1 -0
- package/tracer-viewer-bundle/assets/purescript-CklMAg4u.js +13 -0
- package/tracer-viewer-bundle/assets/purescript-CklMAg4u.js.map +1 -0
- package/tracer-viewer-bundle/assets/python-B6aJPvgy.js +13 -0
- package/tracer-viewer-bundle/assets/python-B6aJPvgy.js.map +1 -0
- package/tracer-viewer-bundle/assets/qml-3beO22l8.js +14 -0
- package/tracer-viewer-bundle/assets/qml-3beO22l8.js.map +1 -0
- package/tracer-viewer-bundle/assets/qmldir-C8lEn-DE.js +13 -0
- package/tracer-viewer-bundle/assets/qmldir-C8lEn-DE.js.map +1 -0
- package/tracer-viewer-bundle/assets/qss-IeuSbFQv.js +13 -0
- package/tracer-viewer-bundle/assets/qss-IeuSbFQv.js.map +1 -0
- package/tracer-viewer-bundle/assets/r-Dspwwk_N.js +13 -0
- package/tracer-viewer-bundle/assets/r-Dspwwk_N.js.map +1 -0
- package/tracer-viewer-bundle/assets/racket-BqYA7rlc.js +13 -0
- package/tracer-viewer-bundle/assets/racket-BqYA7rlc.js.map +1 -0
- package/tracer-viewer-bundle/assets/raku-DXvB9xmW.js +13 -0
- package/tracer-viewer-bundle/assets/raku-DXvB9xmW.js.map +1 -0
- package/tracer-viewer-bundle/assets/razor-BDqjjVU7.js +17 -0
- package/tracer-viewer-bundle/assets/razor-BDqjjVU7.js.map +1 -0
- package/tracer-viewer-bundle/assets/red-bN70gL4F.js +12 -0
- package/tracer-viewer-bundle/assets/red-bN70gL4F.js.map +1 -0
- package/tracer-viewer-bundle/assets/reg-C-SQnVFl.js +13 -0
- package/tracer-viewer-bundle/assets/reg-C-SQnVFl.js.map +1 -0
- package/tracer-viewer-bundle/assets/regexp-CDVJQ6XC.js +13 -0
- package/tracer-viewer-bundle/assets/regexp-CDVJQ6XC.js.map +1 -0
- package/tracer-viewer-bundle/assets/rel-C3B-1QV4.js +13 -0
- package/tracer-viewer-bundle/assets/rel-C3B-1QV4.js.map +1 -0
- package/tracer-viewer-bundle/assets/riscv-BM1_JUlF.js +13 -0
- package/tracer-viewer-bundle/assets/riscv-BM1_JUlF.js.map +1 -0
- package/tracer-viewer-bundle/assets/ron-D8l8udqQ.js +13 -0
- package/tracer-viewer-bundle/assets/ron-D8l8udqQ.js.map +1 -0
- package/tracer-viewer-bundle/assets/rose-pine-dawn-DHQR4-dF.js +12 -0
- package/tracer-viewer-bundle/assets/rose-pine-dawn-DHQR4-dF.js.map +1 -0
- package/tracer-viewer-bundle/assets/rose-pine-moon-D4_iv3hh.js +12 -0
- package/tracer-viewer-bundle/assets/rose-pine-moon-D4_iv3hh.js.map +1 -0
- package/tracer-viewer-bundle/assets/rose-pine-qdsjHGoJ.js +12 -0
- package/tracer-viewer-bundle/assets/rose-pine-qdsjHGoJ.js.map +1 -0
- package/tracer-viewer-bundle/assets/rosmsg-BJDFO7_C.js +13 -0
- package/tracer-viewer-bundle/assets/rosmsg-BJDFO7_C.js.map +1 -0
- package/tracer-viewer-bundle/assets/rst-CRjBmOyv.js +35 -0
- package/tracer-viewer-bundle/assets/rst-CRjBmOyv.js.map +1 -0
- package/tracer-viewer-bundle/assets/ruby-Wjq7vjNf.js +31 -0
- package/tracer-viewer-bundle/assets/ruby-Wjq7vjNf.js.map +1 -0
- package/tracer-viewer-bundle/assets/rust-B1yitclQ.js +13 -0
- package/tracer-viewer-bundle/assets/rust-B1yitclQ.js.map +1 -0
- package/tracer-viewer-bundle/assets/sas-cz2c8ADy.js +14 -0
- package/tracer-viewer-bundle/assets/sas-cz2c8ADy.js.map +1 -0
- package/tracer-viewer-bundle/assets/sass-Cj5Yp3dK.js +13 -0
- package/tracer-viewer-bundle/assets/sass-Cj5Yp3dK.js.map +1 -0
- package/tracer-viewer-bundle/assets/scala-C151Ov-r.js +13 -0
- package/tracer-viewer-bundle/assets/scala-C151Ov-r.js.map +1 -0
- package/tracer-viewer-bundle/assets/scheme-C98Dy4si.js +13 -0
- package/tracer-viewer-bundle/assets/scheme-C98Dy4si.js.map +1 -0
- package/tracer-viewer-bundle/assets/scss-D5BDwBP9.js +14 -0
- package/tracer-viewer-bundle/assets/scss-D5BDwBP9.js.map +1 -0
- package/tracer-viewer-bundle/assets/sdbl-DVxCFoDh.js +13 -0
- package/tracer-viewer-bundle/assets/sdbl-DVxCFoDh.js.map +1 -0
- package/tracer-viewer-bundle/assets/shaderlab-Dg9Lc6iA.js +14 -0
- package/tracer-viewer-bundle/assets/shaderlab-Dg9Lc6iA.js.map +1 -0
- package/tracer-viewer-bundle/assets/shellscript-Yzrsuije.js +13 -0
- package/tracer-viewer-bundle/assets/shellscript-Yzrsuije.js.map +1 -0
- package/tracer-viewer-bundle/assets/shellsession-BADoaaVG.js +14 -0
- package/tracer-viewer-bundle/assets/shellsession-BADoaaVG.js.map +1 -0
- package/tracer-viewer-bundle/assets/slack-dark-BthQWCQV.js +12 -0
- package/tracer-viewer-bundle/assets/slack-dark-BthQWCQV.js.map +1 -0
- package/tracer-viewer-bundle/assets/slack-ochin-DqwNpetd.js +12 -0
- package/tracer-viewer-bundle/assets/slack-ochin-DqwNpetd.js.map +1 -0
- package/tracer-viewer-bundle/assets/smalltalk-BERRCDM3.js +13 -0
- package/tracer-viewer-bundle/assets/smalltalk-BERRCDM3.js.map +1 -0
- package/tracer-viewer-bundle/assets/snazzy-light-Bw305WKR.js +12 -0
- package/tracer-viewer-bundle/assets/snazzy-light-Bw305WKR.js.map +1 -0
- package/tracer-viewer-bundle/assets/solarized-dark-DXbdFlpD.js +12 -0
- package/tracer-viewer-bundle/assets/solarized-dark-DXbdFlpD.js.map +1 -0
- package/tracer-viewer-bundle/assets/solarized-light-L9t79GZl.js +12 -0
- package/tracer-viewer-bundle/assets/solarized-light-L9t79GZl.js.map +1 -0
- package/tracer-viewer-bundle/assets/solidity-rGO070M0.js +13 -0
- package/tracer-viewer-bundle/assets/solidity-rGO070M0.js.map +1 -0
- package/tracer-viewer-bundle/assets/soy-8wufbnw4.js +16 -0
- package/tracer-viewer-bundle/assets/soy-8wufbnw4.js.map +1 -0
- package/tracer-viewer-bundle/assets/sparql-rVzFXLq3.js +14 -0
- package/tracer-viewer-bundle/assets/sparql-rVzFXLq3.js.map +1 -0
- package/tracer-viewer-bundle/assets/splunk-BtCnVYZw.js +13 -0
- package/tracer-viewer-bundle/assets/splunk-BtCnVYZw.js.map +1 -0
- package/tracer-viewer-bundle/assets/sql-BLtJtn59.js +13 -0
- package/tracer-viewer-bundle/assets/sql-BLtJtn59.js.map +1 -0
- package/tracer-viewer-bundle/assets/ssh-config-_ykCGR6B.js +13 -0
- package/tracer-viewer-bundle/assets/ssh-config-_ykCGR6B.js.map +1 -0
- package/tracer-viewer-bundle/assets/stata-BH5u7GGu.js +14 -0
- package/tracer-viewer-bundle/assets/stata-BH5u7GGu.js.map +1 -0
- package/tracer-viewer-bundle/assets/stylus-BEDo0Tqx.js +13 -0
- package/tracer-viewer-bundle/assets/stylus-BEDo0Tqx.js.map +1 -0
- package/tracer-viewer-bundle/assets/surrealql-Bq5Q-fJD.js +14 -0
- package/tracer-viewer-bundle/assets/surrealql-Bq5Q-fJD.js.map +1 -0
- package/tracer-viewer-bundle/assets/svelte-Cy7k_4gC.js +17 -0
- package/tracer-viewer-bundle/assets/svelte-Cy7k_4gC.js.map +1 -0
- package/tracer-viewer-bundle/assets/swift-D82vCrfD.js +13 -0
- package/tracer-viewer-bundle/assets/swift-D82vCrfD.js.map +1 -0
- package/tracer-viewer-bundle/assets/synthwave-84-CbfX1IO0.js +12 -0
- package/tracer-viewer-bundle/assets/synthwave-84-CbfX1IO0.js.map +1 -0
- package/tracer-viewer-bundle/assets/system-verilog-CnnmHF94.js +13 -0
- package/tracer-viewer-bundle/assets/system-verilog-CnnmHF94.js.map +1 -0
- package/tracer-viewer-bundle/assets/systemd-4A_iFExJ.js +13 -0
- package/tracer-viewer-bundle/assets/systemd-4A_iFExJ.js.map +1 -0
- package/tracer-viewer-bundle/assets/talonscript-CkByrt1z.js +13 -0
- package/tracer-viewer-bundle/assets/talonscript-CkByrt1z.js.map +1 -0
- package/tracer-viewer-bundle/assets/tasl-QIJgUcNo.js +13 -0
- package/tracer-viewer-bundle/assets/tasl-QIJgUcNo.js.map +1 -0
- package/tracer-viewer-bundle/assets/tcl-dwOrl1Do.js +13 -0
- package/tracer-viewer-bundle/assets/tcl-dwOrl1Do.js.map +1 -0
- package/tracer-viewer-bundle/assets/templ-DhtptRzy.js +16 -0
- package/tracer-viewer-bundle/assets/templ-DhtptRzy.js.map +1 -0
- package/tracer-viewer-bundle/assets/terraform-BETggiCN.js +13 -0
- package/tracer-viewer-bundle/assets/terraform-BETggiCN.js.map +1 -0
- package/tracer-viewer-bundle/assets/tex-idrVyKtj.js +14 -0
- package/tracer-viewer-bundle/assets/tex-idrVyKtj.js.map +1 -0
- package/tracer-viewer-bundle/assets/tokyo-night-hegEt444.js +12 -0
- package/tracer-viewer-bundle/assets/tokyo-night-hegEt444.js.map +1 -0
- package/tracer-viewer-bundle/assets/toml-vGWfd6FD.js +13 -0
- package/tracer-viewer-bundle/assets/toml-vGWfd6FD.js.map +1 -0
- package/tracer-viewer-bundle/assets/ts-tags-DQrlYJgV.js +52 -0
- package/tracer-viewer-bundle/assets/ts-tags-DQrlYJgV.js.map +1 -0
- package/tracer-viewer-bundle/assets/tsv-B_m7g4N7.js +13 -0
- package/tracer-viewer-bundle/assets/tsv-B_m7g4N7.js.map +1 -0
- package/tracer-viewer-bundle/assets/tsx-COt5Ahok.js +13 -0
- package/tracer-viewer-bundle/assets/tsx-COt5Ahok.js.map +1 -0
- package/tracer-viewer-bundle/assets/turtle-BsS91CYL.js +13 -0
- package/tracer-viewer-bundle/assets/turtle-BsS91CYL.js.map +1 -0
- package/tracer-viewer-bundle/assets/twig-xg9kU7Mw.js +36 -0
- package/tracer-viewer-bundle/assets/twig-xg9kU7Mw.js.map +1 -0
- package/tracer-viewer-bundle/assets/typescript-BPQ3VLAy.js +13 -0
- package/tracer-viewer-bundle/assets/typescript-BPQ3VLAy.js.map +1 -0
- package/tracer-viewer-bundle/assets/typespec-CAFt9gP4.js +13 -0
- package/tracer-viewer-bundle/assets/typespec-CAFt9gP4.js.map +1 -0
- package/tracer-viewer-bundle/assets/typst-DHCkPAjA.js +13 -0
- package/tracer-viewer-bundle/assets/typst-DHCkPAjA.js.map +1 -0
- package/tracer-viewer-bundle/assets/v-BcVCzyr7.js +13 -0
- package/tracer-viewer-bundle/assets/v-BcVCzyr7.js.map +1 -0
- package/tracer-viewer-bundle/assets/vala-CsfeWuGM.js +13 -0
- package/tracer-viewer-bundle/assets/vala-CsfeWuGM.js.map +1 -0
- package/tracer-viewer-bundle/assets/vb-D17OF-Vu.js +13 -0
- package/tracer-viewer-bundle/assets/vb-D17OF-Vu.js.map +1 -0
- package/tracer-viewer-bundle/assets/verilog-BQ8w6xss.js +13 -0
- package/tracer-viewer-bundle/assets/verilog-BQ8w6xss.js.map +1 -0
- package/tracer-viewer-bundle/assets/vesper-DU1UobuO.js +12 -0
- package/tracer-viewer-bundle/assets/vesper-DU1UobuO.js.map +1 -0
- package/tracer-viewer-bundle/assets/vhdl-CeAyd5Ju.js +13 -0
- package/tracer-viewer-bundle/assets/vhdl-CeAyd5Ju.js.map +1 -0
- package/tracer-viewer-bundle/assets/viml-CJc9bBzg.js +13 -0
- package/tracer-viewer-bundle/assets/viml-CJc9bBzg.js.map +1 -0
- package/tracer-viewer-bundle/assets/vitesse-black-Bkuqu6BP.js +12 -0
- package/tracer-viewer-bundle/assets/vitesse-black-Bkuqu6BP.js.map +1 -0
- package/tracer-viewer-bundle/assets/vitesse-dark-D0r3Knsf.js +12 -0
- package/tracer-viewer-bundle/assets/vitesse-dark-D0r3Knsf.js.map +1 -0
- package/tracer-viewer-bundle/assets/vitesse-light-CVO1_9PV.js +12 -0
- package/tracer-viewer-bundle/assets/vitesse-light-CVO1_9PV.js.map +1 -0
- package/tracer-viewer-bundle/assets/vue-D2xRrEX4.js +43 -0
- package/tracer-viewer-bundle/assets/vue-D2xRrEX4.js.map +1 -0
- package/tracer-viewer-bundle/assets/vue-html-AaS7Mt5G.js +14 -0
- package/tracer-viewer-bundle/assets/vue-html-AaS7Mt5G.js.map +1 -0
- package/tracer-viewer-bundle/assets/vue-vine-BoDAl6tE.js +19 -0
- package/tracer-viewer-bundle/assets/vue-vine-BoDAl6tE.js.map +1 -0
- package/tracer-viewer-bundle/assets/vyper-CDx5xZoG.js +13 -0
- package/tracer-viewer-bundle/assets/vyper-CDx5xZoG.js.map +1 -0
- package/tracer-viewer-bundle/assets/wasm-CG6Dc4jp.js +15 -0
- package/tracer-viewer-bundle/assets/wasm-CG6Dc4jp.js.map +1 -0
- package/tracer-viewer-bundle/assets/wasm-MzD3tlZU.js +13 -0
- package/tracer-viewer-bundle/assets/wasm-MzD3tlZU.js.map +1 -0
- package/tracer-viewer-bundle/assets/wenyan-BV7otONQ.js +13 -0
- package/tracer-viewer-bundle/assets/wenyan-BV7otONQ.js.map +1 -0
- package/tracer-viewer-bundle/assets/wgsl-Dx-B1_4e.js +13 -0
- package/tracer-viewer-bundle/assets/wgsl-Dx-B1_4e.js.map +1 -0
- package/tracer-viewer-bundle/assets/wikitext-BhOHFoWU.js +13 -0
- package/tracer-viewer-bundle/assets/wikitext-BhOHFoWU.js.map +1 -0
- package/tracer-viewer-bundle/assets/wit-5i3qLPDT.js +13 -0
- package/tracer-viewer-bundle/assets/wit-5i3qLPDT.js.map +1 -0
- package/tracer-viewer-bundle/assets/wolfram-lXgVvXCa.js +13 -0
- package/tracer-viewer-bundle/assets/wolfram-lXgVvXCa.js.map +1 -0
- package/tracer-viewer-bundle/assets/xml-sdJ4AIDG.js +14 -0
- package/tracer-viewer-bundle/assets/xml-sdJ4AIDG.js.map +1 -0
- package/tracer-viewer-bundle/assets/xsl-CtQFsRM5.js +15 -0
- package/tracer-viewer-bundle/assets/xsl-CtQFsRM5.js.map +1 -0
- package/tracer-viewer-bundle/assets/yaml-Buea-lGh.js +13 -0
- package/tracer-viewer-bundle/assets/yaml-Buea-lGh.js.map +1 -0
- package/tracer-viewer-bundle/assets/zenscript-DVFEvuxE.js +13 -0
- package/tracer-viewer-bundle/assets/zenscript-DVFEvuxE.js.map +1 -0
- package/tracer-viewer-bundle/assets/zig-VOosw3JB.js +13 -0
- package/tracer-viewer-bundle/assets/zig-VOosw3JB.js.map +1 -0
- package/tracer-viewer-bundle/index.html +25 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright: (c) Myia SAS 2026.
|
|
3
|
+
* This file and its contents are licensed under the AGPLv3 License.
|
|
4
|
+
* Please see the LICENSE file at the root of this repository
|
|
5
|
+
*/
|
|
6
|
+
import type { FullConfig, Reporter, TestCase, TestResult } from '@playwright/test/reporter';
|
|
7
|
+
import type { TestResultRecord } from '../../domain/trace-event-recorder/model/statement-trace-schema';
|
|
8
|
+
import { CrashErrorClassifier } from './crash-error-classifier';
|
|
9
|
+
import { FailingStatementFinder } from './failing-statement-finder';
|
|
10
|
+
import { NdjsonTailInspector } from './ndjson-tail-inspector';
|
|
11
|
+
/**
|
|
12
|
+
* Subdirectory under each project's `outputDir` where the fixture
|
|
13
|
+
* writes a registry entry per (testId, attempt). Shared string
|
|
14
|
+
* constant between fixture (writer) and reporter (reader).
|
|
15
|
+
*/
|
|
16
|
+
export declare const HEAL_PENDING_SUBDIR = ".heal-pending";
|
|
17
|
+
/**
|
|
18
|
+
* Shape of the per-test registry entry. Minimal: everything else
|
|
19
|
+
* the reporter needs is reachable from `TestCase` / `TestResult`.
|
|
20
|
+
*/
|
|
21
|
+
export interface HealTraceContext {
|
|
22
|
+
/** Absolute path to the per-test `heal-traces.ndjson`. */
|
|
23
|
+
ndjsonPath: string;
|
|
24
|
+
/**
|
|
25
|
+
* Absolute path to the per-(test, attempt) directory inside the
|
|
26
|
+
* persistent `heal-traces/` tree — the destination root the reporter
|
|
27
|
+
* copies Playwright artefacts into. Reporter-emitted
|
|
28
|
+
* `test-attachments` paths are relative to this directory.
|
|
29
|
+
*/
|
|
30
|
+
rootDir: string;
|
|
31
|
+
/**
|
|
32
|
+
* Absolute `testInfo.outputDir` — the source directory Playwright
|
|
33
|
+
* writes its own attachments into (`trace.zip`, `video.webm`,
|
|
34
|
+
* failure screenshots, user `testInfo.attach()` files).
|
|
35
|
+
*/
|
|
36
|
+
playwrightOutputDir: string;
|
|
37
|
+
/** Per-process executionId at the time the fixture wrote the entry. */
|
|
38
|
+
executionId: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Context handed to the `onRescue` hook. Extends `HealTraceContext`
|
|
42
|
+
* with the per-test correlation fields the hook needs to route the
|
|
43
|
+
* synthetic record.
|
|
44
|
+
*/
|
|
45
|
+
export interface RescueContext extends HealTraceContext {
|
|
46
|
+
/** Playwright `TestCase.id` — stable hash of (file, title, project). */
|
|
47
|
+
testId: string;
|
|
48
|
+
/** 1-indexed attempt number = `TestResult.retry + 1`. */
|
|
49
|
+
attempt: number;
|
|
50
|
+
/** `TestResult.workerIndex` where the crash happened. */
|
|
51
|
+
workerIndex: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Invoked after the reporter has appended its synthetic
|
|
55
|
+
* `test-result` to the NDJSON. Intended for extensions that need to
|
|
56
|
+
* forward the rescued record to a live destination the in-worker
|
|
57
|
+
* exporters never got to reach — anything running per-test inside
|
|
58
|
+
* the worker dies with it on a crash.
|
|
59
|
+
*
|
|
60
|
+
* Errors are caught by the reporter and logged to `process.stderr`;
|
|
61
|
+
* a failing hook never breaks the Playwright run or prevents the
|
|
62
|
+
* on-disk append from landing.
|
|
63
|
+
*/
|
|
64
|
+
export type RescueHook = (record: TestResultRecord, ctx: RescueContext) => void | Promise<void>;
|
|
65
|
+
export interface HealTracerReporterDeps {
|
|
66
|
+
classifier?: CrashErrorClassifier;
|
|
67
|
+
inspector?: NdjsonTailInspector;
|
|
68
|
+
failingStatementFinder?: FailingStatementFinder;
|
|
69
|
+
/**
|
|
70
|
+
* Seam for tests — defaults to `fs.appendFileSync`. Kept sync so
|
|
71
|
+
* the synthetic line hits disk before the reporter returns, same
|
|
72
|
+
* crash-safety discipline as `NdjsonExporter`.
|
|
73
|
+
*/
|
|
74
|
+
appendFile?: (path: string, data: string) => void;
|
|
75
|
+
onRescue?: RescueHook;
|
|
76
|
+
}
|
|
77
|
+
/** Path to the registry file for a given (project, test, attempt). */
|
|
78
|
+
export declare function healPendingRegistryPath(projectOutputDir: string, testId: string, attempt: number): string;
|
|
79
|
+
export declare class HealTracerReporter implements Reporter {
|
|
80
|
+
private readonly classifier;
|
|
81
|
+
private readonly inspector;
|
|
82
|
+
private readonly failingStatementFinder;
|
|
83
|
+
private readonly appendFile;
|
|
84
|
+
private readonly onRescue;
|
|
85
|
+
private readonly stderrByWorker;
|
|
86
|
+
private projectOutputDirs;
|
|
87
|
+
private executionId;
|
|
88
|
+
private executionSource;
|
|
89
|
+
private startedAt;
|
|
90
|
+
private rootDir;
|
|
91
|
+
private playwrightVersion;
|
|
92
|
+
private gitInfo;
|
|
93
|
+
private readonly testEntriesById;
|
|
94
|
+
constructor(deps?: HealTracerReporterDeps);
|
|
95
|
+
printsToStdio(): boolean;
|
|
96
|
+
onBegin(config: FullConfig, _suite: unknown): void;
|
|
97
|
+
onTestBegin(_test: TestCase, result: TestResult): void;
|
|
98
|
+
onStdErr(chunk: string | Buffer, _test: void | TestCase, result: void | TestResult): void;
|
|
99
|
+
onTestEnd(test: TestCase, result: TestResult): void;
|
|
100
|
+
private resolveTraceContext;
|
|
101
|
+
/**
|
|
102
|
+
* Copy each Playwright attachment from its `outputDir` location
|
|
103
|
+
* into the persistent heal-traces tree (under `traceCtx.rootDir`),
|
|
104
|
+
* mapping by `name` / `contentType`:
|
|
105
|
+
*
|
|
106
|
+
* - 'trace' → <rootDir>/trace.zip
|
|
107
|
+
* - contentType: 'video/...' → <rootDir>/videos/<basename>
|
|
108
|
+
* - other (screenshot, user) → <rootDir>/<rel-from-outputDir>
|
|
109
|
+
*
|
|
110
|
+
* Returns a `test-attachments` record whose `path` fields are the
|
|
111
|
+
* destination-relative locations using forward slashes, so the
|
|
112
|
+
* local-viewer-server can serve them via `/api/asset/...`.
|
|
113
|
+
*
|
|
114
|
+
* Attachments whose source path falls outside Playwright's
|
|
115
|
+
* outputDir are dropped — those would not be safely servable.
|
|
116
|
+
*/
|
|
117
|
+
private copyAndBuildAttachmentsRecord;
|
|
118
|
+
private placeAttachment;
|
|
119
|
+
private cleanupRegistry;
|
|
120
|
+
private buildSyntheticTestResult;
|
|
121
|
+
private invokeRescueHook;
|
|
122
|
+
/**
|
|
123
|
+
* Upsert the per-test entry for `test` and append an attempt slice
|
|
124
|
+
* built from `result`. When `ndjsonPath` is non-null and the
|
|
125
|
+
* attempt did not pass, scans the file for the deepest threw
|
|
126
|
+
* statement and attaches it as `failingStatement` + `error`. A
|
|
127
|
+
* `rescuedRecord` (synthesized by the rescue path) supplies
|
|
128
|
+
* `error` when no statement-level threw is present.
|
|
129
|
+
*/
|
|
130
|
+
private captureAttempt;
|
|
131
|
+
private upsertTestEntry;
|
|
132
|
+
private mapTestStatus;
|
|
133
|
+
onEnd(): void;
|
|
134
|
+
}
|
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright: (c) Myia SAS 2026.
|
|
4
|
+
* This file and its contents are licensed under the AGPLv3 License.
|
|
5
|
+
* Please see the LICENSE file at the root of this repository
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.HealTracerReporter = exports.HEAL_PENDING_SUBDIR = void 0;
|
|
42
|
+
exports.healPendingRegistryPath = healPendingRegistryPath;
|
|
43
|
+
// Optional Playwright `Reporter` that runs in the MAIN process and
|
|
44
|
+
// rescues per-test NDJSON files when the worker dies before the
|
|
45
|
+
// fixture's teardown can finalize them.
|
|
46
|
+
//
|
|
47
|
+
// Crash paths the fixture cannot handle on its own (worker OOM,
|
|
48
|
+
// SIGKILL, segfault, `process.exit()`): the fixture's `finally`
|
|
49
|
+
// block never runs, so `projector.finalize(...)` never writes the
|
|
50
|
+
// `test-result` terminator. The NDJSON is left open-ended, and
|
|
51
|
+
// consumers cannot tell whether the test crashed or the file is
|
|
52
|
+
// simply still being written.
|
|
53
|
+
//
|
|
54
|
+
// The reporter subscribes to `onTestEnd` — which fires even when
|
|
55
|
+
// the worker died, because Playwright fabricates the result from
|
|
56
|
+
// the main-process side. It then:
|
|
57
|
+
//
|
|
58
|
+
// 1. Resolves the per-test NDJSON path + outputDir from a
|
|
59
|
+
// filesystem REGISTRY the fixture writes at test setup:
|
|
60
|
+
// `<project.outputDir>/.heal-pending/<testId>-<attempt>.json`.
|
|
61
|
+
// The registry is needed because Playwright's IPC does NOT
|
|
62
|
+
// flush fixture-pushed annotations/attachments on abrupt
|
|
63
|
+
// worker exit (OOM/SIGKILL/`process.exit()`) — exactly the
|
|
64
|
+
// cases we most need to rescue. A file on disk survives any
|
|
65
|
+
// abrupt exit. The fixture deletes the registry entry at
|
|
66
|
+
// teardown, so only crashed tests leave an orphan behind.
|
|
67
|
+
// This reporter is then the only thing that reads the orphan.
|
|
68
|
+
// 2. Early-returns if the registry entry is missing (tracer not
|
|
69
|
+
// wired for this test, or fixture already deleted it on clean
|
|
70
|
+
// teardown) or if the NDJSON already ends with `test-result`
|
|
71
|
+
// (defensive — shouldn't happen given the deletion step).
|
|
72
|
+
// 3. Classifies the crash via `CrashErrorClassifier` using the
|
|
73
|
+
// worker's stderr buffer and `TestResult.errors`, then appends
|
|
74
|
+
// a synthetic `test-result` line with the classified error.
|
|
75
|
+
// 4. If an `onRescue` hook is configured, invokes it (fire-and-
|
|
76
|
+
// forget) so extension code can observe the rescued record.
|
|
77
|
+
//
|
|
78
|
+
// Registration (user-facing, in `playwright.config.ts`):
|
|
79
|
+
//
|
|
80
|
+
// reporter: [['@heal-dev/heal-playwright-tracer/reporter']]
|
|
81
|
+
//
|
|
82
|
+
// Registration is mandatory whenever the Babel plugin is wired —
|
|
83
|
+
// the fixture asserts on the `HEAL_TRACER_REPORTER` env var (set
|
|
84
|
+
// here in `onBegin`) and fails fast if it's missing.
|
|
85
|
+
const child_process_1 = require("child_process");
|
|
86
|
+
const fs = __importStar(require("fs"));
|
|
87
|
+
const path = __importStar(require("path"));
|
|
88
|
+
const persistence_1 = require("../../domain/persistence");
|
|
89
|
+
const heal_traces_layout_1 = require("../heal-traces-layout");
|
|
90
|
+
const crash_error_classifier_1 = require("./crash-error-classifier");
|
|
91
|
+
const failing_statement_finder_1 = require("./failing-statement-finder");
|
|
92
|
+
const ndjson_tail_inspector_1 = require("./ndjson-tail-inspector");
|
|
93
|
+
const logger_1 = require("../../util/logger");
|
|
94
|
+
/**
|
|
95
|
+
* Subdirectory under each project's `outputDir` where the fixture
|
|
96
|
+
* writes a registry entry per (testId, attempt). Shared string
|
|
97
|
+
* constant between fixture (writer) and reporter (reader).
|
|
98
|
+
*/
|
|
99
|
+
exports.HEAL_PENDING_SUBDIR = '.heal-pending';
|
|
100
|
+
/** Path to the registry file for a given (project, test, attempt). */
|
|
101
|
+
function healPendingRegistryPath(projectOutputDir, testId, attempt) {
|
|
102
|
+
return path.join(projectOutputDir, exports.HEAL_PENDING_SUBDIR, `${testId}-${attempt}.json`);
|
|
103
|
+
}
|
|
104
|
+
class HealTracerReporter {
|
|
105
|
+
constructor(deps = {}) {
|
|
106
|
+
this.stderrByWorker = new Map();
|
|
107
|
+
this.projectOutputDirs = [];
|
|
108
|
+
// Execution history (P2) — reporter is the only writer of
|
|
109
|
+
// executions.ndjson + execution.json. Resolved at onBegin so the
|
|
110
|
+
// executionId propagates to workers via HEAL_EXECUTION_ID.
|
|
111
|
+
this.executionId = '';
|
|
112
|
+
this.executionSource = 'generated';
|
|
113
|
+
this.startedAt = 0;
|
|
114
|
+
this.rootDir = '';
|
|
115
|
+
// Keyed by playwrightTestId so retries fold into the same test entry.
|
|
116
|
+
// Insertion order = first-seen test order, which the manifest preserves.
|
|
117
|
+
this.testEntriesById = new Map();
|
|
118
|
+
this.classifier = deps.classifier ?? new crash_error_classifier_1.CrashErrorClassifier();
|
|
119
|
+
this.inspector = deps.inspector ?? new ndjson_tail_inspector_1.NdjsonTailInspector();
|
|
120
|
+
this.failingStatementFinder = deps.failingStatementFinder ?? new failing_statement_finder_1.FailingStatementFinder();
|
|
121
|
+
this.appendFile = deps.appendFile ?? ((p, d) => fs.appendFileSync(p, d, { encoding: 'utf8' }));
|
|
122
|
+
this.onRescue = deps.onRescue ?? null;
|
|
123
|
+
}
|
|
124
|
+
printsToStdio() {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
onBegin(config, _suite) {
|
|
128
|
+
// Capture every project's outputDir so we know where to look
|
|
129
|
+
// for registry entries regardless of which project a given
|
|
130
|
+
// TestCase belongs to. Deduped — sharded configs sometimes
|
|
131
|
+
// repeat the same outputDir across projects.
|
|
132
|
+
const seen = new Set();
|
|
133
|
+
for (const project of config.projects) {
|
|
134
|
+
if (project.outputDir && !seen.has(project.outputDir)) {
|
|
135
|
+
seen.add(project.outputDir);
|
|
136
|
+
this.projectOutputDirs.push(project.outputDir);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Resolve executionId once in main BEFORE workers spawn, then
|
|
140
|
+
// propagate via env so worker fixtures see the same value.
|
|
141
|
+
// Workers' resolver reports `source='env'` after this — that's
|
|
142
|
+
// expected; the truthful source we record on the run is OURS,
|
|
143
|
+
// captured here before we mutate the env var.
|
|
144
|
+
this.executionSource = (0, heal_traces_layout_1.getExecutionIdSource)();
|
|
145
|
+
this.executionId = (0, heal_traces_layout_1.resolveExecutionId)();
|
|
146
|
+
if (this.executionSource === 'generated') {
|
|
147
|
+
process.env.HEAL_EXECUTION_ID = this.executionId;
|
|
148
|
+
}
|
|
149
|
+
// Worker fixtures assert on this env var to detect when a user has
|
|
150
|
+
// wired the Babel plugin but forgotten to register the reporter.
|
|
151
|
+
// Setting it here (before workers spawn) is the handshake; the
|
|
152
|
+
// fixture's check is the enforcement.
|
|
153
|
+
process.env.HEAL_TRACER_REPORTER = '1';
|
|
154
|
+
this.startedAt = Date.now();
|
|
155
|
+
this.rootDir = process.cwd();
|
|
156
|
+
this.playwrightVersion = readPlaywrightVersion();
|
|
157
|
+
this.gitInfo = readGitInfo();
|
|
158
|
+
}
|
|
159
|
+
onTestBegin(_test, result) {
|
|
160
|
+
this.stderrByWorker.delete(result.workerIndex);
|
|
161
|
+
}
|
|
162
|
+
onStdErr(chunk, _test, result) {
|
|
163
|
+
if (!result)
|
|
164
|
+
return;
|
|
165
|
+
const text = typeof chunk === 'string' ? chunk : chunk.toString('utf8');
|
|
166
|
+
const buf = this.stderrByWorker.get(result.workerIndex) ?? [];
|
|
167
|
+
buf.push(text);
|
|
168
|
+
this.stderrByWorker.set(result.workerIndex, buf);
|
|
169
|
+
}
|
|
170
|
+
onTestEnd(test, result) {
|
|
171
|
+
const traceCtx = this.resolveTraceContext(test, result);
|
|
172
|
+
// Tracer not wired for this test (no registry entry) or the
|
|
173
|
+
// worker never started a trace file — record what Playwright
|
|
174
|
+
// already knows and stop. No failing-statement source on disk.
|
|
175
|
+
if (!traceCtx || !fs.existsSync(traceCtx.ndjsonPath)) {
|
|
176
|
+
this.captureAttempt(test, result, null, null);
|
|
177
|
+
if (traceCtx)
|
|
178
|
+
this.cleanupRegistry(test, result);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
let rescuedRecord = null;
|
|
182
|
+
// Rescue path: file is missing the `test-result` terminator.
|
|
183
|
+
// Synthesize one from the worker's stderr buffer + Playwright's
|
|
184
|
+
// post-mortem `result.errors`.
|
|
185
|
+
if (!this.inspector.endsWithTestResult(traceCtx.ndjsonPath)) {
|
|
186
|
+
const stderr = (this.stderrByWorker.get(result.workerIndex) ?? []).join('');
|
|
187
|
+
const error = this.classifier.classify(result.errors, stderr);
|
|
188
|
+
rescuedRecord = this.buildSyntheticTestResult(result, stderr, error);
|
|
189
|
+
try {
|
|
190
|
+
this.appendFile(traceCtx.ndjsonPath, JSON.stringify(rescuedRecord) + '\n');
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
logger_1.log.error(`failed to append synthetic test-result to ${traceCtx.ndjsonPath}`, err);
|
|
194
|
+
this.captureAttempt(test, result, null, null);
|
|
195
|
+
this.cleanupRegistry(test, result);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Always-on: copy each Playwright attachment from its outputDir
|
|
200
|
+
// location into the persistent heal-traces tree, then append a
|
|
201
|
+
// `test-attachments` record whose paths are relative to that
|
|
202
|
+
// tree. Keeps the file shape canonical (test-result then
|
|
203
|
+
// test-attachments) and makes the heal-traces dir the single
|
|
204
|
+
// source of truth — Playwright's `outputDir` can be wiped, the
|
|
205
|
+
// history survives.
|
|
206
|
+
const attachmentsRecord = this.copyAndBuildAttachmentsRecord(result, traceCtx);
|
|
207
|
+
try {
|
|
208
|
+
this.appendFile(traceCtx.ndjsonPath, JSON.stringify(attachmentsRecord) + '\n');
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
logger_1.log.error(`failed to append test-attachments to ${traceCtx.ndjsonPath}`, err);
|
|
212
|
+
}
|
|
213
|
+
this.captureAttempt(test, result, traceCtx.ndjsonPath, rescuedRecord);
|
|
214
|
+
this.cleanupRegistry(test, result);
|
|
215
|
+
if (rescuedRecord) {
|
|
216
|
+
this.invokeRescueHook(rescuedRecord, traceCtx, test, result);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// Probes each known project outputDir for the per-test registry
|
|
220
|
+
// entry. First match wins — the same (testId, attempt) never
|
|
221
|
+
// spans projects. Returns null when no entry exists, which means
|
|
222
|
+
// either the tracer wasn't wired for this test or the fixture
|
|
223
|
+
// already cleaned up on a clean teardown.
|
|
224
|
+
resolveTraceContext(test, result) {
|
|
225
|
+
const attempt = result.retry + 1;
|
|
226
|
+
for (const outputDir of this.projectOutputDirs) {
|
|
227
|
+
const entryPath = healPendingRegistryPath(outputDir, test.id, attempt);
|
|
228
|
+
let body;
|
|
229
|
+
try {
|
|
230
|
+
body = fs.readFileSync(entryPath, 'utf8');
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
const parsed = JSON.parse(body);
|
|
237
|
+
if (typeof parsed.ndjsonPath !== 'string' || parsed.ndjsonPath.length === 0)
|
|
238
|
+
continue;
|
|
239
|
+
if (typeof parsed.rootDir !== 'string' || parsed.rootDir.length === 0)
|
|
240
|
+
continue;
|
|
241
|
+
if (typeof parsed.playwrightOutputDir !== 'string' ||
|
|
242
|
+
parsed.playwrightOutputDir.length === 0) {
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
if (typeof parsed.executionId !== 'string' || parsed.executionId.length === 0) {
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
ndjsonPath: parsed.ndjsonPath,
|
|
250
|
+
rootDir: parsed.rootDir,
|
|
251
|
+
playwrightOutputDir: parsed.playwrightOutputDir,
|
|
252
|
+
executionId: parsed.executionId,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Copy each Playwright attachment from its `outputDir` location
|
|
263
|
+
* into the persistent heal-traces tree (under `traceCtx.rootDir`),
|
|
264
|
+
* mapping by `name` / `contentType`:
|
|
265
|
+
*
|
|
266
|
+
* - 'trace' → <rootDir>/trace.zip
|
|
267
|
+
* - contentType: 'video/...' → <rootDir>/videos/<basename>
|
|
268
|
+
* - other (screenshot, user) → <rootDir>/<rel-from-outputDir>
|
|
269
|
+
*
|
|
270
|
+
* Returns a `test-attachments` record whose `path` fields are the
|
|
271
|
+
* destination-relative locations using forward slashes, so the
|
|
272
|
+
* local-viewer-server can serve them via `/api/asset/...`.
|
|
273
|
+
*
|
|
274
|
+
* Attachments whose source path falls outside Playwright's
|
|
275
|
+
* outputDir are dropped — those would not be safely servable.
|
|
276
|
+
*/
|
|
277
|
+
copyAndBuildAttachmentsRecord(result, traceCtx) {
|
|
278
|
+
const srcRoot = path.resolve(traceCtx.playwrightOutputDir);
|
|
279
|
+
const dstRoot = path.resolve(traceCtx.rootDir);
|
|
280
|
+
const attachments = [];
|
|
281
|
+
for (const att of result.attachments ?? []) {
|
|
282
|
+
if (!att.path)
|
|
283
|
+
continue;
|
|
284
|
+
const srcResolved = path.resolve(att.path);
|
|
285
|
+
const relFromSrc = path.relative(srcRoot, srcResolved);
|
|
286
|
+
if (relFromSrc.length === 0 || relFromSrc.startsWith('..') || path.isAbsolute(relFromSrc)) {
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
const dstRel = this.placeAttachment(att.name, att.contentType, relFromSrc);
|
|
290
|
+
const dstAbs = path.resolve(dstRoot, dstRel);
|
|
291
|
+
try {
|
|
292
|
+
fs.mkdirSync(path.dirname(dstAbs), { recursive: true });
|
|
293
|
+
fs.copyFileSync(srcResolved, dstAbs);
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
logger_1.log.error(`failed to copy attachment ${att.name} (${srcResolved} → ${dstAbs})`, err);
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
// Forward slashes on all platforms — the local viewer maps
|
|
300
|
+
// these into URLs and Windows paths break URL routing.
|
|
301
|
+
const rel = dstRel.split(path.sep).join('/');
|
|
302
|
+
attachments.push({
|
|
303
|
+
name: att.name,
|
|
304
|
+
path: rel,
|
|
305
|
+
contentType: att.contentType,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
return { kind: 'test-attachments', attachments };
|
|
309
|
+
}
|
|
310
|
+
placeAttachment(name, contentType, relFromSrc) {
|
|
311
|
+
if (name === 'trace') {
|
|
312
|
+
return 'trace.zip';
|
|
313
|
+
}
|
|
314
|
+
if (contentType.toLowerCase().startsWith('video/')) {
|
|
315
|
+
return path.join('videos', path.basename(relFromSrc));
|
|
316
|
+
}
|
|
317
|
+
return relFromSrc;
|
|
318
|
+
}
|
|
319
|
+
cleanupRegistry(test, result) {
|
|
320
|
+
const attempt = result.retry + 1;
|
|
321
|
+
for (const outputDir of this.projectOutputDirs) {
|
|
322
|
+
const entryPath = healPendingRegistryPath(outputDir, test.id, attempt);
|
|
323
|
+
try {
|
|
324
|
+
fs.unlinkSync(entryPath);
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
/* entry may not exist; ignore */
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
buildSyntheticTestResult(result, stderr, error) {
|
|
332
|
+
const record = {
|
|
333
|
+
kind: 'test-result',
|
|
334
|
+
status: result.status,
|
|
335
|
+
duration: result.duration,
|
|
336
|
+
error,
|
|
337
|
+
};
|
|
338
|
+
if (stderr.length > 0)
|
|
339
|
+
record.stderr = [stderr];
|
|
340
|
+
return record;
|
|
341
|
+
}
|
|
342
|
+
invokeRescueHook(record, traceCtx, test, result) {
|
|
343
|
+
if (!this.onRescue)
|
|
344
|
+
return;
|
|
345
|
+
const rescueCtx = {
|
|
346
|
+
ndjsonPath: traceCtx.ndjsonPath,
|
|
347
|
+
rootDir: traceCtx.rootDir,
|
|
348
|
+
playwrightOutputDir: traceCtx.playwrightOutputDir,
|
|
349
|
+
executionId: traceCtx.executionId,
|
|
350
|
+
testId: test.id,
|
|
351
|
+
attempt: result.retry + 1,
|
|
352
|
+
workerIndex: result.workerIndex,
|
|
353
|
+
};
|
|
354
|
+
// Fire-and-forget: Playwright's `onTestEnd` is typed as sync
|
|
355
|
+
// `void`, and the synthetic record is already durably on disk.
|
|
356
|
+
// A slow or failing hook must not block the reporter or
|
|
357
|
+
// propagate errors to the Playwright run.
|
|
358
|
+
void Promise.resolve()
|
|
359
|
+
.then(() => this.onRescue(record, rescueCtx))
|
|
360
|
+
.catch((err) => {
|
|
361
|
+
logger_1.log.error('onRescue hook failed', err);
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Upsert the per-test entry for `test` and append an attempt slice
|
|
366
|
+
* built from `result`. When `ndjsonPath` is non-null and the
|
|
367
|
+
* attempt did not pass, scans the file for the deepest threw
|
|
368
|
+
* statement and attaches it as `failingStatement` + `error`. A
|
|
369
|
+
* `rescuedRecord` (synthesized by the rescue path) supplies
|
|
370
|
+
* `error` when no statement-level threw is present.
|
|
371
|
+
*/
|
|
372
|
+
captureAttempt(test, result, ndjsonPath, rescuedRecord) {
|
|
373
|
+
const entry = this.upsertTestEntry(test);
|
|
374
|
+
const attempt = {
|
|
375
|
+
attempt: result.retry + 1,
|
|
376
|
+
status: this.mapTestStatus(result.status),
|
|
377
|
+
startedAt: result.startTime instanceof Date ? result.startTime.getTime() : Date.now(),
|
|
378
|
+
durationMs: result.duration,
|
|
379
|
+
};
|
|
380
|
+
if (attempt.status !== 'passed' && attempt.status !== 'skipped') {
|
|
381
|
+
const found = ndjsonPath ? this.failingStatementFinder.find(ndjsonPath) : null;
|
|
382
|
+
if (found) {
|
|
383
|
+
attempt.failingStatement = found.statement;
|
|
384
|
+
attempt.error = found.error;
|
|
385
|
+
}
|
|
386
|
+
else if (rescuedRecord?.error) {
|
|
387
|
+
attempt.error = rescuedRecord.error;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
entry.attempts.push(attempt);
|
|
391
|
+
}
|
|
392
|
+
upsertTestEntry(test) {
|
|
393
|
+
const existing = this.testEntriesById.get(test.id);
|
|
394
|
+
if (existing)
|
|
395
|
+
return existing;
|
|
396
|
+
const titlePath = typeof test.titlePath === 'function'
|
|
397
|
+
? test.titlePath()
|
|
398
|
+
: [];
|
|
399
|
+
const file = test.location?.file ?? '';
|
|
400
|
+
const project = test.parent?.project?.()
|
|
401
|
+
?.name ?? '';
|
|
402
|
+
const entry = {
|
|
403
|
+
playwrightTestId: test.id,
|
|
404
|
+
title: test.title,
|
|
405
|
+
titlePath,
|
|
406
|
+
file,
|
|
407
|
+
project,
|
|
408
|
+
attempts: [],
|
|
409
|
+
};
|
|
410
|
+
this.testEntriesById.set(test.id, entry);
|
|
411
|
+
return entry;
|
|
412
|
+
}
|
|
413
|
+
mapTestStatus(s) {
|
|
414
|
+
switch (s) {
|
|
415
|
+
case 'passed':
|
|
416
|
+
case 'failed':
|
|
417
|
+
case 'timedOut':
|
|
418
|
+
case 'skipped':
|
|
419
|
+
case 'interrupted':
|
|
420
|
+
return s;
|
|
421
|
+
default:
|
|
422
|
+
return 'unknown';
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
onEnd() {
|
|
426
|
+
if (this.executionId.length === 0)
|
|
427
|
+
return;
|
|
428
|
+
const layout = new heal_traces_layout_1.HealTracesLayout(this.rootDir, this.executionId);
|
|
429
|
+
const endedAt = Date.now();
|
|
430
|
+
const tests = Array.from(this.testEntriesById.values());
|
|
431
|
+
const totals = computeTotals(tests);
|
|
432
|
+
const manifest = {
|
|
433
|
+
executionId: this.executionId,
|
|
434
|
+
source: this.executionSource,
|
|
435
|
+
startedAt: this.startedAt,
|
|
436
|
+
endedAt,
|
|
437
|
+
durationMs: endedAt - this.startedAt,
|
|
438
|
+
...(this.gitInfo ? { git: this.gitInfo } : {}),
|
|
439
|
+
...(this.playwrightVersion ? { playwrightVersion: this.playwrightVersion } : {}),
|
|
440
|
+
totals,
|
|
441
|
+
tests,
|
|
442
|
+
};
|
|
443
|
+
const record = {
|
|
444
|
+
kind: persistence_1.EXECUTION_RECORD_KIND,
|
|
445
|
+
executionId: this.executionId,
|
|
446
|
+
source: this.executionSource,
|
|
447
|
+
startedAt: this.startedAt,
|
|
448
|
+
endedAt,
|
|
449
|
+
durationMs: endedAt - this.startedAt,
|
|
450
|
+
...(this.gitInfo ? { git: this.gitInfo } : {}),
|
|
451
|
+
...(this.playwrightVersion ? { playwrightVersion: this.playwrightVersion } : {}),
|
|
452
|
+
totals,
|
|
453
|
+
};
|
|
454
|
+
try {
|
|
455
|
+
fs.mkdirSync(layout.executionDir(), { recursive: true });
|
|
456
|
+
fs.writeFileSync(layout.executionManifestPath(), JSON.stringify(manifest, null, 2), 'utf8');
|
|
457
|
+
}
|
|
458
|
+
catch (err) {
|
|
459
|
+
logger_1.log.error('failed to write execution.json', err);
|
|
460
|
+
}
|
|
461
|
+
try {
|
|
462
|
+
fs.mkdirSync(layout.healTracesRoot(), { recursive: true });
|
|
463
|
+
this.appendFile(layout.executionsNdjsonPath(), JSON.stringify(record) + '\n');
|
|
464
|
+
}
|
|
465
|
+
catch (err) {
|
|
466
|
+
logger_1.log.error('failed to append executions.ndjson', err);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
exports.HealTracerReporter = HealTracerReporter;
|
|
471
|
+
// Per-attempt totals: each retry counts as a separate row, matching
|
|
472
|
+
// the pre-grouping semantics. A flaky test that fails-then-passes
|
|
473
|
+
// surfaces as 1 passed + 1 failed against `tests: 2`.
|
|
474
|
+
function computeTotals(entries) {
|
|
475
|
+
const totals = {
|
|
476
|
+
tests: 0,
|
|
477
|
+
passed: 0,
|
|
478
|
+
failed: 0,
|
|
479
|
+
timedOut: 0,
|
|
480
|
+
skipped: 0,
|
|
481
|
+
interrupted: 0,
|
|
482
|
+
};
|
|
483
|
+
for (const e of entries) {
|
|
484
|
+
for (const a of e.attempts) {
|
|
485
|
+
totals.tests += 1;
|
|
486
|
+
if (a.status === 'passed')
|
|
487
|
+
totals.passed += 1;
|
|
488
|
+
else if (a.status === 'failed')
|
|
489
|
+
totals.failed += 1;
|
|
490
|
+
else if (a.status === 'timedOut')
|
|
491
|
+
totals.timedOut += 1;
|
|
492
|
+
else if (a.status === 'skipped')
|
|
493
|
+
totals.skipped += 1;
|
|
494
|
+
else if (a.status === 'interrupted')
|
|
495
|
+
totals.interrupted += 1;
|
|
496
|
+
// 'unknown' counts toward `tests` but not any per-status bucket.
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
return totals;
|
|
500
|
+
}
|
|
501
|
+
function readPlaywrightVersion() {
|
|
502
|
+
try {
|
|
503
|
+
const pkg = require('@playwright/test/package.json');
|
|
504
|
+
return typeof pkg.version === 'string' ? pkg.version : undefined;
|
|
505
|
+
}
|
|
506
|
+
catch {
|
|
507
|
+
return undefined;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
function readGitInfo() {
|
|
511
|
+
const sha = tryGit('rev-parse HEAD');
|
|
512
|
+
const branch = tryGit('rev-parse --abbrev-ref HEAD');
|
|
513
|
+
const dirty = tryGit('status --porcelain');
|
|
514
|
+
if (sha === undefined && branch === undefined && dirty === undefined) {
|
|
515
|
+
return undefined;
|
|
516
|
+
}
|
|
517
|
+
const info = {};
|
|
518
|
+
if (sha !== undefined)
|
|
519
|
+
info.sha = sha;
|
|
520
|
+
if (branch !== undefined && branch !== 'HEAD')
|
|
521
|
+
info.branch = branch;
|
|
522
|
+
if (dirty !== undefined)
|
|
523
|
+
info.dirty = dirty.length > 0;
|
|
524
|
+
return info;
|
|
525
|
+
}
|
|
526
|
+
function tryGit(args) {
|
|
527
|
+
try {
|
|
528
|
+
return (0, child_process_1.execSync)(`git ${args}`, {
|
|
529
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
530
|
+
})
|
|
531
|
+
.toString()
|
|
532
|
+
.trim();
|
|
533
|
+
}
|
|
534
|
+
catch {
|
|
535
|
+
return undefined;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright: (c) Myia SAS 2026.
|
|
3
|
+
* This file and its contents are licensed under the AGPLv3 License.
|
|
4
|
+
* Please see the LICENSE file at the root of this repository
|
|
5
|
+
*/
|
|
6
|
+
import { HealTracerReporter } from './heal-tracer-reporter';
|
|
7
|
+
export { HealTracerReporter, HEAL_PENDING_SUBDIR, healPendingRegistryPath, } from './heal-tracer-reporter';
|
|
8
|
+
export type { HealTracerReporterDeps, HealTraceContext, RescueContext, RescueHook, } from './heal-tracer-reporter';
|
|
9
|
+
export { CrashErrorClassifier } from './crash-error-classifier';
|
|
10
|
+
export type { TestInfoErrorLike } from './crash-error-classifier';
|
|
11
|
+
export { NdjsonTailInspector } from './ndjson-tail-inspector';
|
|
12
|
+
export { FailingStatementFinder } from './failing-statement-finder';
|
|
13
|
+
export type { FoundFailure } from './failing-statement-finder';
|
|
14
|
+
export default HealTracerReporter;
|