clearotron 0.2.0 → 0.2.2
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/.env.example +105 -0
- package/CONTRIBUTING.md +3 -3
- package/INSTALL.md +57 -52
- package/README.md +2 -1
- package/bin/brandowner.mjs +1 -1
- package/bin/clearotron.mjs +4 -4
- package/bin/connect.mjs +2 -2
- package/bin/example.mjs +114 -37
- package/bin/grant.mjs +3 -3
- package/bin/key.mjs +1 -1
- package/bin/onboard.mjs +97 -119
- package/bin/start.mjs +29 -25
- package/bin/stop.mjs +65 -3
- package/bin/update.mjs +7 -7
- package/bin/uspto-sync.mjs +1 -1
- package/build-info.json +2 -2
- package/docs/DELIVERY.md +6 -2
- package/docs/RELEASES.md +6 -4
- package/docs/architecture/01-product-overview.md +2 -2
- package/docs/architecture/02-architecture.md +2 -2
- package/docs/architecture/04-configuration-reference.md +7 -4
- package/docs/architecture/05-config-governance.md +38 -5
- package/docs/architecture/06-operations-runbook.md +13 -1
- package/docs/architecture/09-security-and-data.md +1 -1
- package/docs/decisions/0004-documentation-structure.md +1 -1
- package/driver/CHANGELOG.md +95 -1
- package/driver/README.md +2 -2
- package/driver/ask-ledger.mjs +72 -4
- package/driver/authority-trees.mjs +1 -1
- package/driver/call-capture.mjs +1 -1
- package/driver/card-frame.mjs +1 -1
- package/driver/case-law-ledger.mjs +1 -1
- package/driver/claim-liveness.mjs +1 -1
- package/driver/common-law-receipts.mjs +1 -1
- package/driver/commonlaw-carry.mjs +1 -1
- package/driver/config-inventory.mjs +1 -1
- package/driver/connotation-search.mjs +12 -12
- package/driver/contract-audit.mjs +5 -5
- package/driver/contract-dictation-registry.mjs +4 -4
- package/driver/contract-dictation.mjs +2 -2
- package/driver/contract-e3-backlog.mjs +6 -6
- package/driver/contract-vocabulary.mjs +3 -3
- package/driver/corrections-feedforward.mjs +1 -1
- package/driver/coverage-form-io.mjs +2 -2
- package/driver/coverage-form.mjs +4 -4
- package/driver/coverage-ledger.mjs +3 -3
- package/driver/coverage-union.mjs +1 -1
- package/driver/declination-call.mjs +35 -3
- package/driver/declination-duty.mjs +1 -1
- package/driver/deliver-trigger.sh +3 -3
- package/driver/deploy-live-run-guard.mjs +6 -2
- package/driver/dev-portal.mjs +1 -1
- package/driver/disposition-call.mjs +4 -4
- package/driver/disposition-tool.mjs +4 -4
- package/driver/disposition-union.mjs +2 -2
- package/driver/doc-constants.mjs +1 -1
- package/driver/door-gates.mjs +2 -2
- package/driver/doubt-selection.mjs +2 -2
- package/driver/drainer-identity.mjs +1 -1
- package/driver/driver.config.mjs +63 -11
- package/driver/e2e-rounds.mjs +2 -2
- package/driver/effort-model.mjs +2 -2
- package/driver/engine/anthropic-agent.mjs +24 -24
- package/driver/engine/auth.mjs +1 -1
- package/driver/engine/common.mjs +1 -1
- package/driver/engine/deny-authority-write.mjs +1 -1
- package/driver/engine/jx-turn.mjs +1 -1
- package/driver/engine/mcp/clarivate-server.mjs +1 -1
- package/driver/engine/mcp/corsearch-server.mjs +1 -1
- package/driver/engine/mcp/declination-server.mjs +1 -1
- package/driver/engine/mcp/dispositions-server.mjs +1 -1
- package/driver/engine/mcp/euipo-server.mjs +1 -1
- package/driver/engine/mcp/fetch-server.mjs +1 -1
- package/driver/engine/mcp/free-tier-server.mjs +2 -2
- package/driver/engine/mcp/gather-config.mjs +11 -11
- package/driver/engine/mcp/perplexity-server.mjs +1 -1
- package/driver/engine/mcp/recording-server.mjs +8 -4
- package/driver/engine/mcp/signa-server.mjs +1 -1
- package/driver/engine/mcp/uspto-local-server.mjs +1 -1
- package/driver/engine/openai-agent.mjs +2 -2
- package/driver/engine-build.mjs +2 -2
- package/driver/enqueue-schema.mjs +2 -2
- package/driver/enqueue.mjs +1 -1
- package/driver/envelope-settle.mjs +1 -1
- package/driver/evidence-claim-invariant.mjs +2 -2
- package/driver/findings-model.mjs +8 -8
- package/driver/floor-duty.mjs +1 -1
- package/driver/form-neighbourhood.mjs +1 -1
- package/driver/framework.mjs +1 -1
- package/driver/gateway.mjs +28 -23
- package/driver/grounds-grammar.mjs +1 -1
- package/driver/hit-list.mjs +1 -1
- package/driver/jurisdiction-systems.mjs +1 -1
- package/driver/jx-lanes.mjs +1 -1
- package/driver/jx-units.mjs +1 -1
- package/driver/jx.mjs +3 -3
- package/driver/knockout-assess-record.mjs +5 -1
- package/driver/narrative-refutation-record.mjs +3 -3
- package/driver/numeric-setting.mjs +1 -1
- package/driver/owner-use-check.mjs +184 -0
- package/driver/package.json +2 -2
- package/driver/phase0.mjs +1 -1
- package/driver/pipeline-knockout.mjs +52 -4
- package/driver/pipeline.mjs +215 -63
- package/driver/placement-diff.mjs +2 -2
- package/driver/placement-form.mjs +4 -4
- package/driver/placement-union.mjs +1 -1
- package/driver/portal-acks.mjs +1 -1
- package/driver/portal-config-view.mjs +2 -2
- package/driver/portal-local-auth.mjs +1 -1
- package/driver/portal-report.mjs +6 -6
- package/driver/portal-service.mjs +15 -15
- package/driver/predelivery-lint.mjs +29 -11
- package/driver/prelim-variants-record.mjs +2 -2
- package/driver/profile-page.html +1 -1
- package/driver/profile-selection.mjs +1 -1
- package/driver/profile-service.mjs +2 -2
- package/driver/profiles.mjs +1 -1
- package/driver/progress.mjs +6 -6
- package/driver/provider-usage.mjs +1 -1
- package/driver/publish/demo-marking.mjs +1 -1
- package/driver/publish/index.mjs +47 -6
- package/driver/publish/knockout.mjs +36 -14
- package/driver/publish/parse.mjs +4 -4
- package/driver/publish/publish-inputs.mjs +2 -2
- package/driver/publish/register-presence.mjs +1 -1
- package/driver/publish/render-knockout.mjs +198 -31
- package/driver/publish/report-data.mjs +13 -3
- package/driver/publish/seed-pool.mjs +24 -9
- package/driver/queue-watch-probe.mjs +1 -1
- package/driver/queue-watch-verdict.mjs +1 -1
- package/driver/recall-reconciliation.mjs +1 -1
- package/driver/recipe-service.mjs +1 -1
- package/driver/record-carry.mjs +141 -2
- package/driver/recording-agreement.mjs +3 -3
- package/driver/reference-score.mjs +59 -9
- package/driver/reference-strip-signatures.mjs +68 -0
- package/driver/refusal-bound.mjs +3 -3
- package/driver/register-availability.mjs +2 -2
- package/driver/register-count.mjs +1 -1
- package/driver/register-digest-record.mjs +31 -1
- package/driver/register-grant-vocabulary.mjs +2 -2
- package/driver/register-plan.mjs +8 -8
- package/driver/register-records.mjs +2 -2
- package/driver/registry-fidelity.mjs +3 -3
- package/driver/remedy-accounting.mjs +1 -1
- package/driver/repair-composers.mjs +2 -2
- package/driver/repair-digest.mjs +3 -3
- package/driver/repairs.mjs +7 -7
- package/driver/replay-archive.mjs +2 -0
- package/driver/report-card-record.mjs +2 -2
- package/driver/result-noun-fields.mjs +10 -3
- package/driver/run-economics.mjs +2 -2
- package/driver/run-integrity.mjs +1 -1
- package/driver/runner.mjs +22 -22
- package/driver/scope-rules.mjs +1 -1
- package/driver/search-policy.mjs +3 -3
- package/driver/skeptic-search.mjs +1 -1
- package/driver/skills/blind-frame/SKILL.md +1 -1
- package/driver/skills/case-law-citation/SKILL.md +2 -2
- package/driver/skills/knockout-assess/SKILL.md +10 -4
- package/driver/skills/prelim-search/SKILL.md +2 -2
- package/driver/skills/prelim-search/template-formatting.md +1 -1
- package/driver/skills/prelim-search/templates/email/generic.md +1 -1
- package/driver/skills/prelim-search/worked-examples.md +1 -1
- package/driver/skills/prelim-variants/SKILL.md +2 -2
- package/driver/stage-context.mjs +1 -1
- package/driver/stages-knockout.mjs +55 -4
- package/driver/stages.mjs +97 -40
- package/driver/stray-artifacts.mjs +2 -2
- package/driver/suite-census.json +188 -44
- package/driver/synthesis-record.mjs +1 -1
- package/driver/systemd/clearotron-client-mcp.service +1 -1
- package/driver/systemd/clearotron-portal.service +1 -1
- package/driver/systemd/render-units.mjs +1 -1
- package/driver/tokens.mjs +1 -1
- package/driver/tool-calls.mjs +1 -1
- package/driver/turnaround-bands.mjs +1 -1
- package/driver/unit-file-drift.mjs +1 -1
- package/driver/unit-inventory.mjs +121 -61
- package/driver/unit-state-verdict.mjs +20 -12
- package/driver/verify-knockout.mjs +10 -2
- package/driver/verify.mjs +14 -14
- package/driver/whatif-memo-run.mjs +46 -5
- package/driver/whatif-queue.mjs +1 -1
- package/driver/whatif-worker.mjs +1 -1
- package/mcp-server/CHANGELOG.md +12 -0
- package/mcp-server/README.md +3 -3
- package/mcp-server/http-server.mjs +44 -1
- package/mcp-server/key-socket.mjs +184 -0
- package/mcp-server/lib/audit-view.mjs +69 -2
- package/mcp-server/lib/brief.mjs +15 -0
- package/mcp-server/lib/driver.mjs +7 -1
- package/mcp-server/lib/events.mjs +1 -1
- package/mcp-server/lib/http-handler.mjs +1 -1
- package/mcp-server/lib/knockout.mjs +435 -0
- package/mcp-server/lib/ops.mjs +4 -4
- package/mcp-server/lib/options.mjs +1 -1
- package/mcp-server/lib/plan.mjs +1 -1
- package/mcp-server/lib/runs.mjs +1 -1
- package/mcp-server/lib/scrub.mjs +1 -1
- package/mcp-server/lib/whatif.mjs +12 -3
- package/mcp-server/mint-token.mjs +1 -1
- package/mcp-server/package.json +2 -2
- package/mcp-server/server.mjs +76 -11
- package/package.json +3 -3
- package/portal-ui/package.json +1 -1
- package/providers/_shared/enumerate.mjs +1 -1
- package/providers/_shared/ledger-path.mjs +3 -3
- package/providers/_shared/ledger.mjs +1 -1
- package/providers/_shared/result-shape.mjs +3 -3
- package/providers/_shared/term-shape.mjs +1 -1
- package/providers/corsearch/src/core.js +1 -1
- package/providers/jx-subclass/BUILDING.md +1 -1
- package/providers/oauth-mcp-bridge/CHANGELOG.md +12 -0
- package/providers/oauth-mcp-bridge/package.json +1 -1
- package/providers/oauth-mcp-bridge/stdin-guard.mjs +2 -2
- package/scripts/README.md +1 -1
- package/scripts/added-reference-check.mjs +29 -1
- package/scripts/ai-page-render-check.mjs +2 -1
- package/scripts/authority-boundary-probe.mjs +1 -1
- package/scripts/backfill-started-at.mjs +1 -1
- package/scripts/citation-line-check.mjs +3 -3
- package/scripts/clearances-render-check.mjs +4 -3
- package/scripts/compare.mjs +2 -2
- package/scripts/composer-render-check.mjs +6 -6
- package/scripts/contract-dictation-scan.mjs +2 -2
- package/scripts/dead-names.mjs +1 -1
- package/scripts/drain-preflight.mjs +5 -5
- package/scripts/e2e-unread-terminals.mjs +1 -1
- package/scripts/e2e.mjs +8 -8
- package/scripts/env-audit.mjs +27 -7
- package/scripts/env-classify.mjs +139 -15
- package/scripts/freeze-example-run.mjs +3 -3
- package/scripts/head-arrived-gated.mjs +1 -1
- package/scripts/headless-page.mjs +274 -0
- package/scripts/home-render-check.mjs +3 -2
- package/scripts/live-surface-check.mjs +92 -19
- package/scripts/main-health.mjs +1 -1
- package/scripts/merge-presence-check.mjs +3 -3
- package/scripts/mint-reference-strip-backlog.mjs +41 -0
- package/scripts/mint-suite-census.mjs +6 -6
- package/scripts/nightly-notice.mjs +1 -1
- package/scripts/portal-lifecycle-check.mjs +3 -3
- package/scripts/reconcile-runs.mjs +1 -1
- package/scripts/release-await-cut.mjs +101 -11
- package/scripts/release-version-pr-checks.mjs +26 -2
- package/scripts/release-version.mjs +2 -2
- package/scripts/render-check.mjs +66 -7
- package/scripts/report-frame-check.mjs +12 -0
- package/scripts/report-screenshot.mjs +62 -2
- package/scripts/revisit-render-check.mjs +3 -2
- package/scripts/score.mjs +18 -4
- package/scripts/strip-tracker-citations.mjs +116 -0
- package/scripts/test-run.mjs +3 -3
- package/scripts/third-party-notices.mjs +3 -3
- package/scripts/travelling-predicates.mjs +3 -3
- package/scripts/unexecuted-asserts.mjs +2 -2
- package/scripts/verify-publishable.mjs +2 -2
- package/scripts/write-up-form-census.mjs +1 -1
- package/shared/access-audience.mjs +215 -0
- package/shared/brand.mjs +13 -13
- package/shared/citation-scan.mjs +1 -1
- package/shared/client-door.mjs +7 -7
- package/shared/driver-dir.mjs +1 -1
- package/shared/env-aliases.mjs +0 -48
- package/shared/env-local.mjs +1 -1
- package/shared/identifier-scan.mjs +3 -3
- package/shared/invocation.mjs +1 -1
- package/shared/names-in-force.mjs +2 -0
- package/shared/product-owned-names.mjs +1 -1
- package/shared/register-selection.mjs +1 -1
- package/shared/scope.mjs +5 -5
- package/shared/server-units.mjs +4 -4
- package/shared/store-in-repo.mjs +2 -2
- package/shared/suite-census.mjs +4 -4
- package/shared/tracked-files.mjs +31 -0
- package/shared/tty-style.mjs +1 -1
- package/shared/uspto-index-size.mjs +1 -1
- package/shared/vacuous-pass.mjs +1 -1
- package/skills/clearotron-account/SKILL.md +42 -13
- package/driver/systemd/prelim-driver.path +0 -69
- package/driver/systemd/prelim-driver.service +0 -86
- package/driver/systemd/prelim-driver.timer +0 -14
- package/driver/systemd/prelim-outbox.path +0 -27
- package/driver/systemd/prelim-outbox.service +0 -37
- package/driver/systemd/prelim-outbox.timer +0 -21
- package/node_modules/exceljs/README_zh.md +0 -2878
- package/node_modules/exceljs/dist/LICENSE +0 -22
- package/node_modules/exceljs/dist/es5/csv/csv.js +0 -182
- package/node_modules/exceljs/dist/es5/csv/csv.js.map +0 -1
- package/node_modules/exceljs/dist/es5/csv/line-buffer.js +0 -68
- package/node_modules/exceljs/dist/es5/csv/line-buffer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/csv/stream-converter.js +0 -110
- package/node_modules/exceljs/dist/es5/csv/stream-converter.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/anchor.js +0 -73
- package/node_modules/exceljs/dist/es5/doc/anchor.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/cell.js +0 -961
- package/node_modules/exceljs/dist/es5/doc/cell.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/column.js +0 -274
- package/node_modules/exceljs/dist/es5/doc/column.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/data-validations.js +0 -18
- package/node_modules/exceljs/dist/es5/doc/data-validations.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/defined-names.js +0 -173
- package/node_modules/exceljs/dist/es5/doc/defined-names.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/enums.js +0 -49
- package/node_modules/exceljs/dist/es5/doc/enums.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/image.js +0 -69
- package/node_modules/exceljs/dist/es5/doc/image.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/modelcontainer.js +0 -16
- package/node_modules/exceljs/dist/es5/doc/modelcontainer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/note.js +0 -64
- package/node_modules/exceljs/dist/es5/doc/note.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/range.js +0 -229
- package/node_modules/exceljs/dist/es5/doc/range.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/row.js +0 -382
- package/node_modules/exceljs/dist/es5/doc/row.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/table.js +0 -443
- package/node_modules/exceljs/dist/es5/doc/table.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/workbook.js +0 -202
- package/node_modules/exceljs/dist/es5/doc/workbook.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/worksheet.js +0 -900
- package/node_modules/exceljs/dist/es5/doc/worksheet.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.bare.js +0 -14
- package/node_modules/exceljs/dist/es5/exceljs.bare.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.browser.js +0 -36
- package/node_modules/exceljs/dist/es5/exceljs.browser.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.nodejs.js +0 -15
- package/node_modules/exceljs/dist/es5/exceljs.nodejs.js.map +0 -1
- package/node_modules/exceljs/dist/es5/index.js +0 -15
- package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js +0 -90
- package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js +0 -94
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js +0 -94
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js +0 -362
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js +0 -347
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js +0 -392
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js +0 -652
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/auto-drain.js +0 -18
- package/node_modules/exceljs/dist/es5/utils/auto-drain.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js +0 -15
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js +0 -18
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/cell-matrix.js +0 -149
- package/node_modules/exceljs/dist/es5/utils/cell-matrix.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/col-cache.js +0 -258
- package/node_modules/exceljs/dist/es5/utils/col-cache.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/copy-style.js +0 -43
- package/node_modules/exceljs/dist/es5/utils/copy-style.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/encryptor.js +0 -58
- package/node_modules/exceljs/dist/es5/utils/encryptor.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/iterate-stream.js +0 -46
- package/node_modules/exceljs/dist/es5/utils/iterate-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/parse-sax.js +0 -47
- package/node_modules/exceljs/dist/es5/utils/parse-sax.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/shared-formula.js +0 -42
- package/node_modules/exceljs/dist/es5/utils/shared-formula.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/shared-strings.js +0 -32
- package/node_modules/exceljs/dist/es5/utils/shared-strings.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stream-base64.js +0 -66
- package/node_modules/exceljs/dist/es5/utils/stream-base64.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stream-buf.js +0 -343
- package/node_modules/exceljs/dist/es5/utils/stream-buf.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/string-buf.js +0 -73
- package/node_modules/exceljs/dist/es5/utils/string-buf.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/string-builder.js +0 -32
- package/node_modules/exceljs/dist/es5/utils/string-builder.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js +0 -61
- package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/typed-stack.js +0 -23
- package/node_modules/exceljs/dist/es5/utils/typed-stack.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/under-dash.js +0 -168
- package/node_modules/exceljs/dist/es5/utils/under-dash.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/utils.js +0 -171
- package/node_modules/exceljs/dist/es5/utils/utils.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/xml-stream.js +0 -151
- package/node_modules/exceljs/dist/es5/utils/xml-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/zip-stream.js +0 -79
- package/node_modules/exceljs/dist/es5/utils/zip-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js +0 -230
- package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/rel-type.js +0 -18
- package/node_modules/exceljs/dist/es5/xlsx/rel-type.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js +0 -139
- package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js +0 -85
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js +0 -24
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js +0 -234
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js +0 -103
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js +0 -76
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js +0 -97
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js +0 -107
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js +0 -92
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js +0 -93
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js +0 -112
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js +0 -158
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js +0 -23
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js +0 -65
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js +0 -62
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js +0 -82
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js +0 -98
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js +0 -59
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js +0 -63
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js +0 -67
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js +0 -62
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js +0 -91
- package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js +0 -451
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js +0 -275
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js +0 -25
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js +0 -45
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js +0 -77
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js +0 -42
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +0 -71
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js +0 -43
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +0 -88
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +0 -52
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +0 -43
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +0 -75
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +0 -66
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js +0 -78
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js +0 -247
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js +0 -69
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js +0 -126
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js +0 -50
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js +0 -26
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js +0 -52
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js +0 -24
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js +0 -46
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js +0 -99
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js +0 -45
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js +0 -37
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js +0 -128
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js +0 -83
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js +0 -84
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js +0 -190
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js +0 -513
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js +0 -58
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js +0 -98
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js +0 -92
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js +0 -99
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js +0 -114
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js +0 -39
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js +0 -139
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js +0 -185
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js +0 -66
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js +0 -106
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js +0 -308
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js +0 -175
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js +0 -59
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js +0 -118
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js +0 -612
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js +0 -46
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js +0 -75
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js +0 -89
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js +0 -42
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js +0 -123
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xlsx.js +0 -697
- package/node_modules/exceljs/dist/es5/xlsx/xlsx.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js +0 -5
- package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js.map +0 -1
- package/node_modules/exceljs/dist/exceljs.bare.js +0 -55253
- package/node_modules/exceljs/dist/exceljs.bare.js.map +0 -761
- package/node_modules/exceljs/dist/exceljs.bare.min.js +0 -45
- package/node_modules/exceljs/dist/exceljs.bare.min.js.map +0 -1
- package/node_modules/exceljs/dist/exceljs.js +0 -59900
- package/node_modules/exceljs/dist/exceljs.js.map +0 -1083
- package/node_modules/exceljs/dist/exceljs.min.js +0 -45
- package/node_modules/exceljs/dist/exceljs.min.js.map +0 -1
- package/scripts/deploy-test.sh +0 -309
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright 2026 Cordillera Sàrl. Additional terms under section 7 of the AGPL-3.0 apply — see ADDITIONAL-TERMS.md
|
|
3
|
+
//
|
|
4
|
+
// headless-page.mjs — did the browser open the page we asked for, or something of its own?
|
|
5
|
+
//
|
|
6
|
+
// (and, since tracker issue 227 criteria 3-4, whether this box can draw what that page says)
|
|
7
|
+
//
|
|
8
|
+
// ── WHY THIS EXISTS (tracker issue 227) ─────────────────────────────────────────────────────────────
|
|
9
|
+
//
|
|
10
|
+
// Seven scripts drive headless Chrome and none of them asked. They cannot ask the obvious way: Chrome is
|
|
11
|
+
// launched with the file URL as a COMMAND-LINE ARGUMENT, so there is no navigation call whose response
|
|
12
|
+
// could be checked. The page simply becomes whatever Chrome ends up showing.
|
|
13
|
+
//
|
|
14
|
+
// What it ends up showing, when the file cannot be read, is Chrome's own interstitial — and that page
|
|
15
|
+
// has an `<h1>`. `report-screenshot.mjs` asserted `document.querySelector("h1")` and nothing else, so it
|
|
16
|
+
// photographed `ERR_ACCESS_DENIED`, wrote 38 KB of grey error page over the README's example frame, and
|
|
17
|
+
// exited 0. Measured: the successful run and the failed one differed in the log by an anchor offset and
|
|
18
|
+
// a font count, neither of which was asserted on.
|
|
19
|
+
//
|
|
20
|
+
// Six of the seven were saved only by an unrelated content assertion that happened to be specific enough.
|
|
21
|
+
// That is luck, and it is per-script: the next assertion somebody writes to be tolerant removes it.
|
|
22
|
+
//
|
|
23
|
+
// ── THE DISCRIMINATOR IS THE ADDRESS, NOT THE CONTENT ───────────────────────────────────────────────
|
|
24
|
+
//
|
|
25
|
+
// `location.href` reads `chrome-error://chromewebdata/` on the interstitial and the requested `file://`
|
|
26
|
+
// URL on a real load. It is the one thing the error page cannot fake, because it is not part of the
|
|
27
|
+
// document — an `<h1>`, a `<title>`, a body class are all things an arbitrary HTML page can carry, and an
|
|
28
|
+
// error page IS an arbitrary HTML page.
|
|
29
|
+
//
|
|
30
|
+
// A MARKER IS STILL REQUIRED, because the address only proves Chrome opened the file. A file that exists,
|
|
31
|
+
// is readable, and is not the artefact this script is about would pass the address check — an empty
|
|
32
|
+
// render, a stale page, a half-written document. So the caller names one thing that only its own artefact
|
|
33
|
+
// carries, and the verdict says which of the two failed.
|
|
34
|
+
|
|
35
|
+
import { execFileSync } from "node:child_process";
|
|
36
|
+
|
|
37
|
+
/** Chrome's own error pages live under this scheme. Nothing a real document is served from does. */
|
|
38
|
+
export const CHROME_ERROR_SCHEME = "chrome-error:";
|
|
39
|
+
/** What Chrome shows before it has navigated. Not a document, and not a wrong one. */
|
|
40
|
+
export const START_PAGE = "about:blank";
|
|
41
|
+
/** How long `assertPageLoaded` will wait for the browser to leave its start page. */
|
|
42
|
+
export const NAVIGATION_GRACE_MS = 5000;
|
|
43
|
+
/** How often it asks, inside that grace. */
|
|
44
|
+
export const NAVIGATION_POLL_MS = 100;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* PURE. Given what the page says about itself, is it the document we asked for?
|
|
48
|
+
*
|
|
49
|
+
* Separated from the evaluation so every branch can be driven — the whole finding here is a check that
|
|
50
|
+
* returned a verdict about a page it never identified, and an arm that could only exercise this through
|
|
51
|
+
* a real browser would be the same shape one level up.
|
|
52
|
+
*
|
|
53
|
+
* @param {string} href `location.href` as the page reports it
|
|
54
|
+
* @param {string} expected the `file://` URL the caller asked Chrome to open
|
|
55
|
+
* @param {boolean|null} marker did the caller's own content marker resolve? `null` means not asked
|
|
56
|
+
* @param {string} markerName what the marker is, for the message
|
|
57
|
+
*/
|
|
58
|
+
export function pageVerdict({ href = "", expected = "", marker = null, markerName = "the page's own content", errorText = null } = {}) {
|
|
59
|
+
const said = String(href ?? "");
|
|
60
|
+
// ── THE TWO SHAPES IN THIS REPOSITORY ───────────────────────────────────────────────────────────
|
|
61
|
+
//
|
|
62
|
+
// Four of these scripts call `Page.navigate`, which RETURNS an `errorText` on failure and which none
|
|
63
|
+
// of them read. Three launch Chrome with the URL as an argument and have no response at all. One
|
|
64
|
+
// verdict serves both: `errorText` is checked when the caller has one, and the address is checked
|
|
65
|
+
// either way — because a failed `Page.navigate` can also leave the page at `about:blank`, which no
|
|
66
|
+
// error text describes and which a content check reads as an empty document rather than a failure.
|
|
67
|
+
if (errorText) {
|
|
68
|
+
return { ok: false, kind: "navigate-failed",
|
|
69
|
+
why: `chrome refused to navigate to ${expected}: ${errorText}. The page is whatever it was showing `
|
|
70
|
+
+ "before, so anything measured now is about the wrong document." };
|
|
71
|
+
}
|
|
72
|
+
if (!said) {
|
|
73
|
+
return { ok: false, kind: "silent",
|
|
74
|
+
why: "the page reported no address at all, so nothing here identifies what was captured. A "
|
|
75
|
+
+ "screenshot taken now certifies an unknown document." };
|
|
76
|
+
}
|
|
77
|
+
if (said.startsWith(CHROME_ERROR_SCHEME)) {
|
|
78
|
+
return { ok: false, kind: "chrome-error",
|
|
79
|
+
why: `chrome could not open ${expected} and is showing ITS OWN error page (${said}). Whatever was `
|
|
80
|
+
+ "captured is Chrome's interstitial, not the artefact — and that page carries an `<h1>`, a "
|
|
81
|
+
+ "`<title>` and a body, so a content check alone reads it as a success." };
|
|
82
|
+
}
|
|
83
|
+
// ── THE BROWSER'S START PAGE IS NOT A WRONG DOCUMENT (tracker issue 273) ────────────────────────
|
|
84
|
+
//
|
|
85
|
+
// `about:blank` is what Chrome shows before it has navigated anywhere. Reaching the check below, it
|
|
86
|
+
// compares unequal to the expected URL and was reported as `wrong-document` — "a redirect, a stale tab
|
|
87
|
+
// or a second page target" — which is a finding about a page. It is not one. Nothing was ever loaded,
|
|
88
|
+
// so nothing about the target document has been measured either way.
|
|
89
|
+
//
|
|
90
|
+
// This mattered because it is what a LOADED BOX produces: three of these scripts launch Chrome with the
|
|
91
|
+
// URL as a command-line argument and cannot wait for a navigation event, so under load the address is
|
|
92
|
+
// read before the browser has moved. A real defect and a slow browser then arrived as the same message,
|
|
93
|
+
// and the arms that exist to catch a wrong page were the ones that fired.
|
|
94
|
+
if (said === START_PAGE || said.startsWith(`${START_PAGE}?`) || said.startsWith(`${START_PAGE}#`)) {
|
|
95
|
+
return { ok: false, kind: "not-navigated",
|
|
96
|
+
why: `chrome is on its start page (${said}) and never reached ${expected}. Nothing about that `
|
|
97
|
+
+ "document has been measured, so this is not a finding about the page. TWO THINGS LOOK LIKE "
|
|
98
|
+
+ "THIS and the address cannot tell them apart: a navigation that failed without saying so, and "
|
|
99
|
+
+ "one that had not happened yet. That is why the caller waits before asking — a verdict of this "
|
|
100
|
+
+ "kind means it waited and the browser never left the start page." };
|
|
101
|
+
}
|
|
102
|
+
// NORMALISED ON BOTH SIDES. Chrome resolves and percent-encodes a `file://` argument, so a raw string
|
|
103
|
+
// comparison fails on a path with a space and reports "the wrong document" about the right one.
|
|
104
|
+
const norm = (u) => { try { return new URL(u).href; } catch { return String(u); } };
|
|
105
|
+
if (expected && norm(said) !== norm(expected)) {
|
|
106
|
+
return { ok: false, kind: "wrong-document",
|
|
107
|
+
why: `chrome is showing ${said}, and this run asked for ${expected}. A redirect, a stale tab or a `
|
|
108
|
+
+ "second page target — whichever it is, the frame is not of the document this script names." };
|
|
109
|
+
}
|
|
110
|
+
if (marker === false) {
|
|
111
|
+
return { ok: false, kind: "not-the-artefact",
|
|
112
|
+
why: `chrome opened ${said} and ${markerName} is not in it. The address is right and the CONTENT is `
|
|
113
|
+
+ "not what this script is about — an empty render, a stale file, or a document half written." };
|
|
114
|
+
}
|
|
115
|
+
if (marker === null) {
|
|
116
|
+
return { ok: false, kind: "unmarked",
|
|
117
|
+
why: "no content marker was asked for, so this run proves only that a file opened. Name one thing "
|
|
118
|
+
+ "the artefact carries and nothing else does — an address alone cannot tell an artefact from any "
|
|
119
|
+
+ "other readable file." };
|
|
120
|
+
}
|
|
121
|
+
return { ok: true, kind: "loaded", why: `${said} is open and ${markerName} is in it.` };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Ask the live page, then judge. `evaluate` runs an expression and returns its value.
|
|
126
|
+
*
|
|
127
|
+
* The caller passes its own CDP `Runtime.evaluate` wrapper, because each of these scripts built its own
|
|
128
|
+
* handshake before this file existed and rewriting seven of them to share one is a bigger change than the
|
|
129
|
+
* defect warrants. What they must share is the QUESTION.
|
|
130
|
+
*/
|
|
131
|
+
export async function assertPageLoaded(evaluate, { expected, marker = null, markerName = "the page's own content", what = "this page", errorText = null,
|
|
132
|
+
graceMs = NAVIGATION_GRACE_MS, pollMs = NAVIGATION_POLL_MS,
|
|
133
|
+
sleep = (ms) => new Promise((r) => setTimeout(r, ms)), now = () => Date.now() } = {}) {
|
|
134
|
+
// ── WAIT FOR THE BROWSER TO LEAVE ITS START PAGE, THEN JUDGE (tracker issue 273) ─────────────────
|
|
135
|
+
//
|
|
136
|
+
// Three of these scripts launch Chrome with the URL as an argument and get no response to wait on, so
|
|
137
|
+
// the first read of `location.href` can land before the browser has moved. On an idle box it never
|
|
138
|
+
// does; under a full parallel suite it did, repeatedly, and the arms reported the start page as a
|
|
139
|
+
// wrong document.
|
|
140
|
+
//
|
|
141
|
+
// BOUNDED, AND THE BOUND IS THE POINT. This waits for the browser to become ready — it does not wait
|
|
142
|
+
// for the page to become correct. If the address is anything other than the start page it is judged
|
|
143
|
+
// immediately, so a genuinely wrong document still fails on the first read and fails as fast as it did
|
|
144
|
+
// before. Only the "nothing has happened yet" case costs time, and only up to the grace.
|
|
145
|
+
//
|
|
146
|
+
// When the grace runs out the verdict is `not-navigated`, which is a could-not-look and says so.
|
|
147
|
+
// Deadline arithmetic is the caller's to drive: `sleep` and `now` are injected so the exhausted path
|
|
148
|
+
// can be exercised without a browser and without waiting.
|
|
149
|
+
let href = await evaluate("location.href");
|
|
150
|
+
if (String(href ?? "") === START_PAGE) {
|
|
151
|
+
const until = now() + graceMs;
|
|
152
|
+
while (String(href ?? "") === START_PAGE && now() < until) {
|
|
153
|
+
await sleep(pollMs);
|
|
154
|
+
href = await evaluate("location.href");
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const found = marker == null ? null : Boolean(await evaluate(`Boolean(${marker})`));
|
|
158
|
+
const verdict = pageVerdict({ href, expected, marker: found, markerName, errorText });
|
|
159
|
+
if (!verdict.ok) {
|
|
160
|
+
console.error(`${what}: ${verdict.why}`);
|
|
161
|
+
return { ...verdict, href };
|
|
162
|
+
}
|
|
163
|
+
return { ...verdict, href };
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Navigate, and refuse if chrome says it could not.
|
|
168
|
+
*
|
|
169
|
+
* `Page.navigate` RETURNS `{ frameId, loaderId, errorText }`, and every caller in this repository threw
|
|
170
|
+
* the result away. So a portal that was not listening, a DNS failure, a refused connection — each left
|
|
171
|
+
* the page showing whatever it had before, and the assertions that followed measured the previous page
|
|
172
|
+
* or an empty one. Six of these scripts were saved from reporting a pass by an unrelated content
|
|
173
|
+
* assertion that happened to be specific enough; that is luck, per script, and the next person to write
|
|
174
|
+
* a more tolerant assertion removes it.
|
|
175
|
+
*
|
|
176
|
+
* THROWS rather than returning a verdict, because there is nothing sensible for a caller to do with a
|
|
177
|
+
* navigation that did not happen, and the alternative — a boolean somebody forgets to read — is the
|
|
178
|
+
* shape this fixes.
|
|
179
|
+
*/
|
|
180
|
+
export async function navigateOrRefuse(cmd, url, { what = "this page" } = {}) {
|
|
181
|
+
const r = await cmd("Page.navigate", { url });
|
|
182
|
+
const errorText = r?.result?.errorText ?? r?.errorText ?? null;
|
|
183
|
+
if (errorText) {
|
|
184
|
+
const verdict = pageVerdict({ errorText, expected: url });
|
|
185
|
+
throw new Error(`${what}: ${verdict.why}`);
|
|
186
|
+
}
|
|
187
|
+
return r;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Does this dumped DOM belong to chrome's own error page?
|
|
192
|
+
*
|
|
193
|
+
* For the callers that use `--dump-dom` rather than CDP: there is no `location.href` to ask, only the
|
|
194
|
+
* bytes chrome printed. Chrome's interstitial is recognisable by the error-code element it always
|
|
195
|
+
* carries and by its `neterror`/`chrome-error` markers — none of which a document we authored has.
|
|
196
|
+
*
|
|
197
|
+
* DELIBERATELY NARROW. A page that merely CONTAINS the words "error" or "denied" is not this; a report
|
|
198
|
+
* about a refused search would say both. What is matched is chrome's own furniture.
|
|
199
|
+
*/
|
|
200
|
+
export function chromeErrorPage(dom = "") {
|
|
201
|
+
const t = String(dom);
|
|
202
|
+
return /chrome-error:\/\//.test(t)
|
|
203
|
+
|| /id="?main-frame-error"?/.test(t)
|
|
204
|
+
|| /jstcache=|<body[^>]*\bid="?neterror"?/.test(t);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// ── CAN THIS BOX DRAW WHAT THE PAGE SAYS? (tracker issue 227, criteria 3 and 4) ──────────────────────
|
|
208
|
+
//
|
|
209
|
+
// The default demo product is a full-country search, and its report carries the mark's native-script
|
|
210
|
+
// renderings — ベンクリ, ベンコリ, ヴェンコリ. They are LOAD-BEARING: the verdict sentence reads "A live
|
|
211
|
+
// Japanese class 9 registration reading ベンクリ covers measuring and testing instruments".
|
|
212
|
+
//
|
|
213
|
+
// On a box with no CJK-capable font those render as `□□□`, twice in the captured frame, and nothing
|
|
214
|
+
// says so. The script's own comment already names this class of failure — "the failure is a screenshot
|
|
215
|
+
// in the wrong typeface that nobody notices until it is in the README" — and it waits for
|
|
216
|
+
// `document.fonts.ready` to prevent it. That solved the TYPEFACE problem and left the WRITING-SYSTEM one,
|
|
217
|
+
// in the same script, with the same failure mode.
|
|
218
|
+
//
|
|
219
|
+
// ASKED OF FONTCONFIG, not of the page. `document.fonts` reports the faces a page ASKED for and got; it
|
|
220
|
+
// says nothing about whether the glyphs exist. `fc-list :lang=ja` answers the question actually being
|
|
221
|
+
// asked — can anything on this box draw these characters — and it is the same source a reader would
|
|
222
|
+
// check by hand.
|
|
223
|
+
|
|
224
|
+
/** Han, Hiragana, Katakana, Hangul — the ranges a Latin-only font set leaves as tofu. */
|
|
225
|
+
const CJK = /[\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af]/gu;
|
|
226
|
+
|
|
227
|
+
/** How many characters in this text need a CJK-capable font. */
|
|
228
|
+
export function cjkCharsIn(text = "") {
|
|
229
|
+
return (String(text).match(CJK) ?? []).length;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* PURE. Given what the page needs and what the box has, is the frame trustworthy?
|
|
234
|
+
*
|
|
235
|
+
* `covering` is the number of fonts fontconfig reports for the writing system — `null` means the caller
|
|
236
|
+
* could not ask, which is NOT zero: a box where `fc-list` is missing is a box this cannot judge, and
|
|
237
|
+
* reporting it as "no coverage" would refuse a machine that may be fine.
|
|
238
|
+
*/
|
|
239
|
+
export function cjkVerdict({ cjkChars = 0, covering = 0, sample = "" } = {}) {
|
|
240
|
+
if (!cjkChars) return { ok: true, kind: "no-cjk", why: "the page carries no CJK characters." };
|
|
241
|
+
if (covering === null) {
|
|
242
|
+
return { ok: true, kind: "unknown-coverage",
|
|
243
|
+
why: `the page carries ${cjkChars} CJK character(s) and this run could not ask fontconfig what can `
|
|
244
|
+
+ "draw them. Not a refusal — a box that cannot be asked is not a box known to be missing fonts — "
|
|
245
|
+
+ "but the frame is unverified on that point." };
|
|
246
|
+
}
|
|
247
|
+
if (covering > 0) {
|
|
248
|
+
return { ok: true, kind: "covered",
|
|
249
|
+
why: `the page carries ${cjkChars} CJK character(s) and ${covering} installed font(s) cover them.` };
|
|
250
|
+
}
|
|
251
|
+
return { ok: false, kind: "tofu",
|
|
252
|
+
why: `the page carries ${cjkChars} CJK character(s)${sample ? ` (${sample})` : ""} and NO installed `
|
|
253
|
+
+ "font can draw them — `fc-list :lang=ja` reports none. They render as empty boxes, and the frame "
|
|
254
|
+
+ "would go out with the mark's own native-script rendering missing. Install a CJK font (on Debian "
|
|
255
|
+
+ "and Ubuntu: `fonts-noto-cjk`), or set XDG_DATA_HOME to a directory holding one." };
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* How many installed fonts cover a writing system, per fontconfig — or `null` if we could not ask.
|
|
260
|
+
*
|
|
261
|
+
* `null` IS THE POINT. `fc-list` missing, or a fontconfig that errors, is a box this cannot judge, and
|
|
262
|
+
* collapsing that into 0 would refuse a machine that may be perfectly able to draw the page. The caller
|
|
263
|
+
* treats the two differently, which is the whole reason this returns three values and not a number.
|
|
264
|
+
*/
|
|
265
|
+
export function fontsCovering(lang = "ja", { run } = {}) {
|
|
266
|
+
try {
|
|
267
|
+
const out = run
|
|
268
|
+
? run(["-f", "%{file}\\n", `:lang=${lang}`])
|
|
269
|
+
: execFileSync("fc-list", ["-f", "%{file}\\n", `:lang=${lang}`], { encoding: "utf8", timeout: 20_000 });
|
|
270
|
+
return String(out).split("\n").map((l) => l.trim()).filter(Boolean).length;
|
|
271
|
+
} catch {
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
// Exits non-zero on the first state that fails to draw, scrolls sideways, or renders a pip count that
|
|
19
19
|
// contradicts the run it is drawn from.
|
|
20
20
|
|
|
21
|
+
import { navigateOrRefuse } from './headless-page.mjs' // Page.navigate returns an errorText, and nothing read it
|
|
21
22
|
import { createServer } from 'node:http'
|
|
22
23
|
import { reapOnExit } from "../shared/reap-on-exit.mjs"; // — a detached group dies with this script
|
|
23
24
|
import { readFileSync, existsSync, writeFileSync, mkdtempSync, rmSync } from 'node:fs'
|
|
@@ -47,7 +48,7 @@ const ago = (m) => new Date(now - m * 60_000).toISOString()
|
|
|
47
48
|
const run = (o) => ({
|
|
48
49
|
runId: o.runId, account: o.account ?? 'zephyr', title: o.mark, markName: o.mark,
|
|
49
50
|
projectKey: o.projectKey ?? null, projectName: o.projectName ?? null,
|
|
50
|
-
// `product` is meta.searchLevel off the wire, and it holds a PRODUCT ID. The fixtures said `
|
|
51
|
+
// `product` is meta.searchLevel off the wire, and it holds a PRODUCT ID. The fixtures said `clearotron`
|
|
51
52
|
// — a RETIRED slug — for every state, so this check could not see that depthLabel had no case for any
|
|
52
53
|
// current product and the chip rendered EMPTY on every run the build creates. A fixture that speaks a
|
|
53
54
|
// vocabulary the build no longer produces certifies the bug.
|
|
@@ -377,7 +378,7 @@ for (const [name, spec] of Object.entries(STATES)) {
|
|
|
377
378
|
}
|
|
378
379
|
|
|
379
380
|
await evalIn(`window.__renderCheckDoc = 1`)
|
|
380
|
-
await cmd
|
|
381
|
+
await navigateOrRefuse(cmd, `${origin}/portal/home`, { what: 'home-render-check' })
|
|
381
382
|
if (!await homeReady('navigate')) continue
|
|
382
383
|
await evalIn(`localStorage.setItem('cordillera-theme', ${JSON.stringify(theme)})`)
|
|
383
384
|
await evalIn(`window.__renderCheckDoc = 1`)
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
// WRONG — the deployment was fine; the caller was not. With the portal's own ops token the same call
|
|
55
55
|
// answers `clients: 10`.
|
|
56
56
|
//
|
|
57
|
-
//
|
|
57
|
+
// an earlier validation failed because it ran in the wrong ENVIRONMENT. A probe can fail the same way by
|
|
58
58
|
// running as the wrong IDENTITY. So this check authenticates the way the portal does, and a missing
|
|
59
59
|
// token is reported as "not probed" rather than quietly producing a false failure.
|
|
60
60
|
//
|
|
@@ -90,7 +90,9 @@ import { unitsActiveVerdict } from "../driver/unit-state-verdict.mjs";
|
|
|
90
90
|
import { deploymentBox } from "../shared/deployment-box.mjs"; // — extracted; one allowlist, two readers
|
|
91
91
|
import { unitFileDriftVerdict } from "../driver/unit-file-drift.mjs"; //
|
|
92
92
|
import { placeholdersIn, resolveValues, renderUnit } from "../driver/systemd/render-units.mjs"; //
|
|
93
|
-
import { CHECKED_UNITS, unitInventoryVerdict, serviceCommitVerdict, unitWorkingDirectory } from "../driver/unit-inventory.mjs"; // · -bundle ·
|
|
93
|
+
import { CHECKED_UNITS, unitInventoryVerdict, serviceCommitVerdict, unitWorkingDirectory, unitClone } from "../driver/unit-inventory.mjs"; // · -bundle ·
|
|
94
|
+
import { entrypointOf } from "../driver/systemd/install-census.mjs"; // the ONE ExecStart parser — a unit says which module it runs
|
|
95
|
+
import { treeOfRunning } from "../shared/checkout-move.mjs"; // …and the live argv says which tree that module came from
|
|
94
96
|
import { findUnitFiles, unitFilePath } from "../driver/unit-files.mjs"; //
|
|
95
97
|
import { managerGroupsVerdict } from "../driver/manager-groups-verdict.mjs"; //
|
|
96
98
|
import { config } from "../driver/driver.config.mjs"; //
|
|
@@ -234,14 +236,20 @@ function serviceClones() {
|
|
|
234
236
|
const out = [];
|
|
235
237
|
let reached = 0, lastErr = null;
|
|
236
238
|
for (const u of units) {
|
|
237
|
-
let wd = null, active = null, type = null, since = null;
|
|
239
|
+
let wd = null, active = null, type = null, since = null, mainPid = null, fragment = null, load = null;
|
|
238
240
|
try {
|
|
239
241
|
// — `Type` and `StateChangeTimestamp` ride along on a call that was already being made. Both
|
|
240
242
|
// are for the MESSAGE, never for the verdict: Type tells a reader whether an `activating` unit is a
|
|
241
243
|
// oneshot mid-fire or a service mid-restart, and the timestamp lets a human judge a long
|
|
242
244
|
// `activating` that this check deliberately does not judge (see driver/unit-state-verdict.mjs).
|
|
245
|
+
//
|
|
246
|
+
// `MainPID` and `FragmentPath` ride along for the SECOND way to attribute a unit to a checkout,
|
|
247
|
+
// below. Same call, no extra round trip. Deliberately NOT `ExecStart`: systemd renders it
|
|
248
|
+
// unexpanded — `argv[]=/usr/bin/node ${CLEAROTRON_CHECKOUT_DIR}/driver/runner.mjs` — so the one
|
|
249
|
+
// field that looks like it names the tree is the one field that does not.
|
|
243
250
|
const shown = execFileSync("systemctl", ["--user", "show", u,
|
|
244
|
-
"-p", "WorkingDirectory", "-p", "ActiveState", "-p", "Type", "-p", "StateChangeTimestamp"
|
|
251
|
+
"-p", "WorkingDirectory", "-p", "ActiveState", "-p", "Type", "-p", "StateChangeTimestamp",
|
|
252
|
+
"-p", "MainPID", "-p", "FragmentPath", "-p", "LoadState"],
|
|
245
253
|
{ encoding: "utf8", env, stdio: ["ignore", "pipe", "pipe"] });
|
|
246
254
|
// `show` answers for a unit that does not exist too (ActiveState=inactive), so a PARSED answer is
|
|
247
255
|
// proof the bus was reachable — which is exactly the fact the old catch destroyed.
|
|
@@ -252,19 +260,77 @@ function serviceClones() {
|
|
|
252
260
|
if (k === "ActiveState") active = v.join("=") || null;
|
|
253
261
|
if (k === "Type") type = v.join("=") || null;
|
|
254
262
|
if (k === "StateChangeTimestamp") since = v.join("=") || null;
|
|
263
|
+
if (k === "MainPID") mainPid = v.join("=") || null;
|
|
264
|
+
if (k === "FragmentPath") fragment = v.join("=") || null;
|
|
265
|
+
// `LoadState` is the discriminator the comment above names and nothing acted on: `not-found`
|
|
266
|
+
// means this deployment DECLARES a unit that does not exist on this box — a defect in the
|
|
267
|
+
// declaration, not a unit at rest. Both used to arrive here as `ActiveState=inactive`.
|
|
268
|
+
if (k === "LoadState") load = v.join("=") || null;
|
|
255
269
|
}
|
|
256
270
|
} catch (e) { lastErr = String(e?.stderr || e?.message || e).replace(/\s+/g, " ").trim().slice(0, 160); }
|
|
257
|
-
|
|
258
|
-
//
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
271
|
+
|
|
272
|
+
// ── ATTRIBUTION ONE: THE DECLARATION ────────────────────────────────────────────────────────────
|
|
273
|
+
let declaredTree = null, declaredWhy = null;
|
|
274
|
+
if (!wd) declaredWhy = "the unit reported no WorkingDirectory";
|
|
275
|
+
else {
|
|
276
|
+
const parsed = unitWorkingDirectory(wd);
|
|
277
|
+
if (!parsed.path) declaredWhy = parsed.why;
|
|
278
|
+
else {
|
|
279
|
+
const top = gitTry(parsed.path, "rev-parse", "--show-toplevel");
|
|
280
|
+
if (top.ok) declaredTree = top.out;
|
|
281
|
+
else declaredWhy = `git could not read ${parsed.path}: ${top.err}`;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// ── ATTRIBUTION TWO: WHAT THE PROCESS IS ACTUALLY RUNNING ───────────────────────────────────────
|
|
286
|
+
//
|
|
287
|
+
// The unit file names its entrypoint as `${CLEAROTRON_CHECKOUT_DIR}/<module>`; the LIVE process was
|
|
288
|
+
// started with that expanded, and `/proc/<pid>/cmdline` carries the resolved absolute path. So the
|
|
289
|
+
// unit file says WHICH module to look for and the process says WHERE it came from. Both readers
|
|
290
|
+
// already exist and are tested — this composes them rather than parsing anything new.
|
|
291
|
+
let runningTree = null, runningWhy = null;
|
|
292
|
+
const pid = Number(mainPid);
|
|
293
|
+
if (!pid) runningWhy = "the unit reported no MainPID, so no running process could be read";
|
|
294
|
+
else if (!fragment) runningWhy = `pid ${pid} is running but the unit reported no FragmentPath, so nothing says which module to look for`;
|
|
295
|
+
else {
|
|
296
|
+
let unitText = null;
|
|
297
|
+
try { unitText = readFileSync(fragment, "utf8"); }
|
|
298
|
+
catch (e) { runningWhy = `the unit file ${fragment} could not be read: ${String(e?.message ?? e).slice(0, 80)}`; }
|
|
299
|
+
if (unitText !== null) {
|
|
300
|
+
const { rel, unreadable } = entrypointOf(unitText);
|
|
301
|
+
if (!rel) runningWhy = unreadable;
|
|
302
|
+
else {
|
|
303
|
+
let cmdline = null;
|
|
304
|
+
try { cmdline = readFileSync(`/proc/${pid}/cmdline`, "utf8"); }
|
|
305
|
+
catch (e) { runningWhy = `/proc/${pid}/cmdline could not be read: ${String(e?.message ?? e).slice(0, 80)}`; }
|
|
306
|
+
if (cmdline !== null) {
|
|
307
|
+
const { tree, why } = treeOfRunning(cmdline, rel);
|
|
308
|
+
if (!tree) runningWhy = why;
|
|
309
|
+
else {
|
|
310
|
+
const top = gitTry(tree, "rev-parse", "--show-toplevel");
|
|
311
|
+
if (top.ok) runningTree = top.out;
|
|
312
|
+
else runningWhy = `git could not read ${tree}, which pid ${pid} is running from: ${top.err}`;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const chosen = unitClone({ declaredTree, runningTree, declaredWhy, runningWhy });
|
|
320
|
+
// — an inactive unit that reported nothing is NOT a gap in the population; there is genuinely
|
|
321
|
+
// nothing to compare, and `unreadable: null` says so. A unit that IS running and could not be
|
|
322
|
+
// attributed is a gap, and the reason names both halves.
|
|
323
|
+
if (!chosen.clone) {
|
|
324
|
+
const idle = !wd && !pid;
|
|
325
|
+
out.push({ unit: u, active, load, type, since, clone: null, head: null, source: null,
|
|
326
|
+
unreadable: idle ? null : chosen.why });
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
const head = gitTry(chosen.clone, "rev-parse", "HEAD");
|
|
330
|
+
out.push({ unit: u, active, load, type, since, clone: chosen.clone, source: chosen.source,
|
|
331
|
+
disagreement: chosen.disagreement,
|
|
332
|
+
head: head.ok ? head.out : null,
|
|
333
|
+
unreadable: head.ok ? null : `git could not read HEAD in ${chosen.clone}: ${head.err}` });
|
|
268
334
|
}
|
|
269
335
|
const probe = reached > 0
|
|
270
336
|
? { ok: true, why: null }
|
|
@@ -441,7 +507,12 @@ try {
|
|
|
441
507
|
//
|
|
442
508
|
// The arm above already travels the route the harness uses (`mcpToolCall` on `MCP_URL`, the same
|
|
443
509
|
// client `scripts/e2e.mjs` enqueues through), so a door that 401s every caller ALREADY fails this
|
|
444
|
-
// check and already fails the deploy —
|
|
510
|
+
// check and already fails the deploy — WHEN a deploy runs this script, which at the time of writing
|
|
511
|
+
// nothing does. `scripts/deploy-test.sh` gated on this script's exit code; that script is retired, and
|
|
512
|
+
// what replaced it was measured on the operations side and does NOT invoke this one. Nothing here is
|
|
513
|
+
// wrong: the check is a real instrument and its reasoning holds. It is simply not reached, and a caller
|
|
514
|
+
// is being wired back in. Until it is, read this as what the check is FOR, not as evidence that
|
|
515
|
+
// something enforces it.
|
|
445
516
|
// That is the issue's first criterion, by its sanctioned second branch, and its third and fourth.
|
|
446
517
|
//
|
|
447
518
|
// What neither arm could say is WHY the door has the posture it has. This face reaches the auth-proxy
|
|
@@ -592,8 +663,10 @@ const { clones, probe: unitProbe } = serviceClones();
|
|
|
592
663
|
const running = clones.filter((c) => c.head);
|
|
593
664
|
const heads = [...new Set(running.map((c) => c.head))];
|
|
594
665
|
// — THREE OUTCOMES, NOT TWO. This arm is the one whose entire purpose is to catch a service still
|
|
595
|
-
// running an old bundle after a deploy
|
|
596
|
-
// deploys itself every hour
|
|
666
|
+
// running an old bundle after a deploy. `deploy-test.sh` ran it as the final gate on an instance that
|
|
667
|
+
// deploys itself every hour; that script is retired and its replacement does not invoke this one, so at
|
|
668
|
+
// the time of writing nothing reaches this arm on a deploy — see the note above. It had been degrading to
|
|
669
|
+
// `skip` with a reason that ASSERTED the deployment
|
|
597
670
|
// was not systemd --user — on a box where it is, and where the units are running.
|
|
598
671
|
// · could not look → skip, naming the error. Not probed is not passed.
|
|
599
672
|
// · looked, found none → skip, saying so. A genuinely non-systemd deployment lands here honestly.
|
|
@@ -664,7 +737,7 @@ else {
|
|
|
664
737
|
// second criterion — an orphaned drainer in a closed login session is a
|
|
665
738
|
// state health must say out loud, whatever the ruling on the posture.
|
|
666
739
|
ppidOf: defaultPpidOf,
|
|
667
|
-
//
|
|
740
|
+
// THE SAME TWO PROBES THE QUEUE ARM READS, so this arm and that one cannot
|
|
668
741
|
// reach opposite conclusions about one box. They did: the queue arm read the worker unit and said
|
|
669
742
|
// the timer posture is retired here, while this one read nothing and called an absent drainer a
|
|
670
743
|
// fault in the same report. A probe that throws answers `enabled: null`, which the rule resolves
|
package/scripts/main-health.mjs
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// and that a red no fix can clear turns into a tax. The next person either stops, or learns to reason
|
|
16
16
|
// past a red main, and the second one is how a real regression gets merged over.
|
|
17
17
|
//
|
|
18
|
-
// THIS IS
|
|
18
|
+
// THIS IS the DISTINCTION ONE SUBSYSTEM OVER. There it was `systemctl --user` with no bus reported
|
|
19
19
|
// as "the unit is not there"; here it is an unallocated runner reported as "the suite failed". Both are
|
|
20
20
|
// could-not-look rendered as a finding, and both are fixed by refusing to answer rather than answering
|
|
21
21
|
// wrongly.
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
//
|
|
6
6
|
// ── WHY THIS EXISTS ──────────────────────────────────────────────────────────────────────────────
|
|
7
7
|
//
|
|
8
|
-
// merged at 18:45:01Z. The commit carrying
|
|
8
|
+
// merged at 18:45:01Z. The commit carrying its own acceptance check was authored at
|
|
9
9
|
// 18:53:12Z — eight minutes AFTER the merge — and never reached `main`. The pull request closed
|
|
10
10
|
// green showing one commit, the branch was deleted, and was labelled ready-for-verification
|
|
11
11
|
// against a fix whose check did not exist. Nothing in the repository noticed. It surfaced because
|
|
@@ -213,8 +213,8 @@ export function presenceOf(sha, git, base = "origin/main") {
|
|
|
213
213
|
// ── LANDED-AND-SINCE-REMOVED IS NOT LOST WORK, AND CALLING IT LOST IS THE WHOLE FAILURE ────────
|
|
214
214
|
//
|
|
215
215
|
// The first cut of this script reported six MISSING rows and every one of them was a merge that
|
|
216
|
-
// landed perfectly and was later retired ON PURPOSE:
|
|
217
|
-
// by,
|
|
216
|
+
// landed perfectly and was later retired ON PURPOSE: the bin/register-ledger-prune.mjs deleted
|
|
217
|
+
// by, the snapshot machinery deleted by, three env-governance.test.mjs rows rewritten
|
|
218
218
|
// by the same. Publishing those as lost work would have been six false accusations drawn
|
|
219
219
|
// from a real signal — the exact shape this check exists to catch, running in the other direction.
|
|
220
220
|
//
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
// Copyright 2026 Cordillera Sàrl. Additional terms under section 7 of the AGPL-3.0 apply — see ADDITIONAL-TERMS.md
|
|
4
|
+
//
|
|
5
|
+
// Mints `driver/test/fixtures/reference-strip-backlog.json` — the per-file floor under the repair of
|
|
6
|
+
// the sentences the reference strip broke (tracker issue 185).
|
|
7
|
+
//
|
|
8
|
+
// Run it AFTER repairing lines, never to make a red arm green: the arm it feeds refuses any count that
|
|
9
|
+
// went UP, so re-minting is how a repair is recorded, not how a regression is absorbed.
|
|
10
|
+
//
|
|
11
|
+
// node scripts/mint-reference-strip-backlog.mjs [--check]
|
|
12
|
+
//
|
|
13
|
+
// `--check` re-derives and exits non-zero if the committed table disagrees with the tree, which is what
|
|
14
|
+
// CI runs. Without it, the table is rewritten.
|
|
15
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { execFileSync } from "node:child_process";
|
|
17
|
+
import { join, dirname } from "node:path";
|
|
18
|
+
import { fileURLToPath } from "node:url";
|
|
19
|
+
import { SIGNATURES, censusOf } from "../driver/reference-strip-signatures.mjs";
|
|
20
|
+
|
|
21
|
+
const ROOT = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
22
|
+
const TABLE = join(ROOT, "driver/test/fixtures/reference-strip-backlog.json");
|
|
23
|
+
|
|
24
|
+
const tracked = execFileSync("git", ["-C", ROOT, "ls-files"], { encoding: "utf8", maxBuffer: 1 << 28 })
|
|
25
|
+
.split("\n").filter(Boolean);
|
|
26
|
+
const minted = censusOf(ROOT, tracked, (f) => readFileSync(join(ROOT, f), "utf8"));
|
|
27
|
+
|
|
28
|
+
if (process.argv.includes("--check")) {
|
|
29
|
+
const have = JSON.parse(readFileSync(TABLE, "utf8"));
|
|
30
|
+
const a = JSON.stringify(have.files), b = JSON.stringify(minted.files);
|
|
31
|
+
if (a !== b || have.total !== minted.total) {
|
|
32
|
+
console.error("reference-strip backlog is STALE against the tree.");
|
|
33
|
+
console.error(` committed total ${have.total}, tree has ${minted.total}`);
|
|
34
|
+
console.error(" re-mint with: node scripts/mint-reference-strip-backlog.mjs");
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
console.log(`reference-strip backlog: current — ${minted.total} line(s) still to repair`);
|
|
38
|
+
} else {
|
|
39
|
+
writeFileSync(TABLE, JSON.stringify({ signatures: SIGNATURES.map((s) => s.name), ...minted }, null, 2) + "\n");
|
|
40
|
+
console.log(`minted ${TABLE}: ${minted.total} line(s) across ${Object.keys(minted.files).length} file(s)`);
|
|
41
|
+
}
|
|
@@ -150,7 +150,7 @@ function main() {
|
|
|
150
150
|
try { prev = JSON.parse(readFileSync(CENSUS, "utf8")); } catch { /* first mint */ }
|
|
151
151
|
|
|
152
152
|
const lost = [];
|
|
153
|
-
//
|
|
153
|
+
// THE THIRD BUCKET, ruled by overwatch 2026-09-06.
|
|
154
154
|
//
|
|
155
155
|
// A reasoned skip is neither a pass nor a loss, and this census had no place to put one. Two guards
|
|
156
156
|
// that are each right about their own failure had come to disagree: `a-bail-on-an-unmeetable-
|
|
@@ -166,7 +166,7 @@ function main() {
|
|
|
166
166
|
for (const { ws } of CENSUS_WORKSPACES) {
|
|
167
167
|
const a = prev?.workspaces?.[ws]?.perFile ?? {};
|
|
168
168
|
const b = next.workspaces[ws].perFile;
|
|
169
|
-
//
|
|
169
|
+
// the buckets are decided in shared/suite-census.mjs, where a test can reach
|
|
170
170
|
// them, and BOTH populations below read the same function. The two loops used to spell the decision
|
|
171
171
|
// out separately and had already drifted on their all-clear line.
|
|
172
172
|
const { added, gone, shrunk, grew, losses, notes, allClear } = censusBuckets({ prev: a, next: b });
|
|
@@ -175,14 +175,14 @@ function main() {
|
|
|
175
175
|
? `${ws} REMOVED ${f} (was ${a[f].tests} tests, ${a[f].asserts} asserts)`
|
|
176
176
|
: `${ws} SHRANK ${f} ${a[f].tests}\u2192${b[f].tests} tests, ${a[f].asserts}\u2192${b[f].asserts} asserts`);
|
|
177
177
|
}
|
|
178
|
-
//
|
|
178
|
+
// a rising skip count is NOT a loss and does not refuse. It is collected for
|
|
179
179
|
// the bucket printed after both loops, where it is neither excused nor counted against the tree.
|
|
180
180
|
for (const { file: f } of notes) noted.push(`${ws} ${f} ${a[f].skips ?? 0}\u2192${b[f].skips ?? 0} skip(s), `
|
|
181
181
|
+ `${a[f].todos ?? 0}\u2192${b[f].todos ?? 0} todo(s)`);
|
|
182
182
|
console.log(`\n${ws}: ${Object.keys(next.workspaces[ws].perFile ?? {}).length} file(s)`);
|
|
183
183
|
for (const f of added) console.log(` + ${f} (${b[f].tests} tests, ${b[f].asserts} asserts)`);
|
|
184
184
|
// A file leaving the census, or shrinking inside it, is the shape this whole thing exists for.
|
|
185
|
-
// Printed loudly and separately, and — since
|
|
185
|
+
// Printed loudly and separately, and — since the loss arm — REFUSED below unless --allow-loss
|
|
186
186
|
// is passed. This comment used to end "an --apply that scrolls past these is the laundering", which
|
|
187
187
|
// was an accurate description of what the code then did: it printed both lines and wrote the file.
|
|
188
188
|
for (const f of gone) console.log(` REMOVED ${f} (was ${a[f].tests} tests, ${a[f].asserts} asserts)`);
|
|
@@ -197,7 +197,7 @@ function main() {
|
|
|
197
197
|
// a verdict. So growth is now printed as its own shape, and the all-clear says what it actually
|
|
198
198
|
// checked instead of implying currency it never established.
|
|
199
199
|
for (const f of grew) console.log(` grew ${f} ${a[f].tests}→${b[f].tests} tests, ${a[f].asserts}→${b[f].asserts} asserts`);
|
|
200
|
-
//
|
|
200
|
+
// `allClear` counts skips. Without that a file that gained nothing but skips
|
|
201
201
|
// printed "(unchanged)" over a tree where an arm had stopped running, which is the exact
|
|
202
202
|
// reassuring-narrator failure the growth line above was added to repair.
|
|
203
203
|
if (allClear) console.log(" (unchanged — no file added, removed, grown, shrunk or newly skipped)");
|
|
@@ -239,7 +239,7 @@ function main() {
|
|
|
239
239
|
else if (!undeclaredGone.length && !shrunk.length && !added.length) console.log(" (nothing LOST — the counts above moved, so the census on disk is stale)");
|
|
240
240
|
}
|
|
241
241
|
|
|
242
|
-
//
|
|
242
|
+
// PRINTED WHENEVER IT IS NON-EMPTY, on every mode this script has. `--check`
|
|
243
243
|
// returns before `--apply`'s refusal and `--apply` returns before `--check`'s comparison, so a bucket
|
|
244
244
|
// printed inside either one would be invisible from the other — and the mode a lane gate runs is the
|
|
245
245
|
// one nobody watches.
|
|
@@ -43,7 +43,7 @@ export function hoursSince(thenISO, nowISO) {
|
|
|
43
43
|
return Math.floor((now - then) / 3_600_000);
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
/** The job's name, whichever shape the caller had. A bare string is the pre- form. */
|
|
46
|
+
/** The job's name, whichever shape the caller had. A bare string is the pre-change form. */
|
|
47
47
|
export function jobName(job) { return typeof job === "string" ? job : String(job?.name ?? "?"); }
|
|
48
48
|
|
|
49
49
|
/**
|
|
@@ -221,7 +221,7 @@ const HELPERS = `
|
|
|
221
221
|
return false;
|
|
222
222
|
};
|
|
223
223
|
const txt = () => document.body.innerText;
|
|
224
|
-
//
|
|
224
|
+
// A MISS THROWS, NAMING WHAT IT MISSED. Same defect as composer-render-check.mjs, in this
|
|
225
225
|
// file's own copy of the helper: six sites below dereference the result immediately, so a button that
|
|
226
226
|
// had not painted arrived as "Cannot read properties of undefined (reading 'click')".
|
|
227
227
|
// maybeByText keeps the undefined return for the one site where absence is the thing being measured.
|
|
@@ -315,7 +315,7 @@ ${HELPERS}
|
|
|
315
315
|
out.topbarHeading = (document.querySelector('.topbar h1') || {}).innerText || null;
|
|
316
316
|
|
|
317
317
|
await goto('/portal/new');
|
|
318
|
-
//
|
|
318
|
+
// THIS WAIT WAS IDENTITY-DEPENDENT AND SILENTLY DEAD FOR ONE OF THE THREE. "Brand owner" is
|
|
319
319
|
// the rail switcher's eyebrow (AppShell.tsx), which a SINGLE-OWNER client never gets — that identity
|
|
320
320
|
// reads its owner in the Account corner instead. So this timed out on every client run, and because
|
|
321
321
|
// settle returned false without objecting it degraded into an 8-second sleep. Waits on the context
|
|
@@ -395,7 +395,7 @@ ${HELPERS}
|
|
|
395
395
|
out.bringBackOnProject = allByText('button', /^Bring back$/).length >= 1;
|
|
396
396
|
out.projectArchiveOnRow = allByText('button', /^Archive$/).length >= 1;
|
|
397
397
|
findByText('button', /New project/).click();
|
|
398
|
-
// "Project name" since
|
|
398
|
+
// "Project name" since the copy pass that shortened the label from "What is this
|
|
399
399
|
// project called?". A driver that opens the real screen is the one thing that notices a rename like
|
|
400
400
|
// this, and it noticed: the whole lifecycle failed here rather than anywhere near the cause.
|
|
401
401
|
await mustSettle(() => /Project name/.test(txt()), 8000, 'the project name prompt never appeared');
|