@invarn/cibuild 2.9.6 → 2.9.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/dist/chunk-35SI42CD.mjs +1 -0
- package/dist/chunk-IC45KVLJ.mjs +1 -0
- package/dist/chunk-XDY4V23V.mjs +1 -0
- package/dist/cli.cjs +14 -14
- package/dist/commands.mjs +1 -0
- package/dist/lib.mjs +3934 -0
- package/package.json +6 -10
- package/dist/src/cli.d.ts +0 -3
- package/dist/src/cli.d.ts.map +0 -1
- package/dist/src/cli.js +0 -399
- package/dist/src/commands/a-credential-target-follows-the-flavor-source-set.test.d.ts +0 -38
- package/dist/src/commands/a-credential-target-follows-the-flavor-source-set.test.d.ts.map +0 -1
- package/dist/src/commands/a-credential-target-follows-the-flavor-source-set.test.js +0 -222
- package/dist/src/commands/a-credential-two-workflows-cannot-share-is-declared-per-workflow.test.d.ts +0 -41
- package/dist/src/commands/a-credential-two-workflows-cannot-share-is-declared-per-workflow.test.d.ts.map +0 -1
- package/dist/src/commands/a-credential-two-workflows-cannot-share-is-declared-per-workflow.test.js +0 -324
- package/dist/src/commands/a-properties-stand-in-declares-the-keys-the-build-reads.test.d.ts +0 -2
- package/dist/src/commands/a-properties-stand-in-declares-the-keys-the-build-reads.test.d.ts.map +0 -1
- package/dist/src/commands/a-properties-stand-in-declares-the-keys-the-build-reads.test.js +0 -382
- package/dist/src/commands/an-already-stored-value-does-not-answer-the-target-question.test.d.ts +0 -29
- package/dist/src/commands/an-already-stored-value-does-not-answer-the-target-question.test.d.ts.map +0 -1
- package/dist/src/commands/an-already-stored-value-does-not-answer-the-target-question.test.js +0 -160
- package/dist/src/commands/android-gms-guard.test.d.ts +0 -9
- package/dist/src/commands/android-gms-guard.test.d.ts.map +0 -1
- package/dist/src/commands/android-gms-guard.test.js +0 -78
- package/dist/src/commands/android-java-version.test.d.ts +0 -12
- package/dist/src/commands/android-java-version.test.d.ts.map +0 -1
- package/dist/src/commands/android-java-version.test.js +0 -209
- package/dist/src/commands/android-scanner-java.test.d.ts +0 -2
- package/dist/src/commands/android-scanner-java.test.d.ts.map +0 -1
- package/dist/src/commands/android-scanner-java.test.js +0 -130
- package/dist/src/commands/android-scanner.d.ts +0 -250
- package/dist/src/commands/android-scanner.d.ts.map +0 -1
- package/dist/src/commands/android-scanner.js +0 -1639
- package/dist/src/commands/build.d.ts +0 -215
- package/dist/src/commands/build.d.ts.map +0 -1
- package/dist/src/commands/build.js +0 -1433
- package/dist/src/commands/build.test.d.ts +0 -13
- package/dist/src/commands/build.test.d.ts.map +0 -1
- package/dist/src/commands/build.test.js +0 -121
- package/dist/src/commands/detect-platform.d.ts +0 -13
- package/dist/src/commands/detect-platform.d.ts.map +0 -1
- package/dist/src/commands/detect-platform.js +0 -51
- package/dist/src/commands/detect-project.d.ts +0 -7
- package/dist/src/commands/detect-project.d.ts.map +0 -1
- package/dist/src/commands/detect-project.js +0 -12
- package/dist/src/commands/each-flavor-is-asked-for-its-own-properties-file.test.d.ts +0 -26
- package/dist/src/commands/each-flavor-is-asked-for-its-own-properties-file.test.d.ts.map +0 -1
- package/dist/src/commands/each-flavor-is-asked-for-its-own-properties-file.test.js +0 -196
- package/dist/src/commands/edit.d.ts +0 -12
- package/dist/src/commands/edit.d.ts.map +0 -1
- package/dist/src/commands/edit.js +0 -652
- package/dist/src/commands/edit.test.d.ts +0 -6
- package/dist/src/commands/edit.test.d.ts.map +0 -1
- package/dist/src/commands/edit.test.js +0 -45
- package/dist/src/commands/fidelity-trim.d.ts +0 -13
- package/dist/src/commands/fidelity-trim.d.ts.map +0 -1
- package/dist/src/commands/fidelity-trim.js +0 -21
- package/dist/src/commands/fidelity-trim.test.d.ts +0 -8
- package/dist/src/commands/fidelity-trim.test.d.ts.map +0 -1
- package/dist/src/commands/fidelity-trim.test.js +0 -79
- package/dist/src/commands/file-secret-collector.d.ts +0 -50
- package/dist/src/commands/file-secret-collector.d.ts.map +0 -1
- package/dist/src/commands/file-secret-collector.js +0 -217
- package/dist/src/commands/flavors-a-convention-plugin-creates-are-still-found.test.d.ts +0 -38
- package/dist/src/commands/flavors-a-convention-plugin-creates-are-still-found.test.d.ts.map +0 -1
- package/dist/src/commands/flavors-a-convention-plugin-creates-are-still-found.test.js +0 -300
- package/dist/src/commands/github-workflow.d.ts +0 -5
- package/dist/src/commands/github-workflow.d.ts.map +0 -1
- package/dist/src/commands/github-workflow.js +0 -45
- package/dist/src/commands/index.d.ts +0 -33
- package/dist/src/commands/index.d.ts.map +0 -1
- package/dist/src/commands/index.js +0 -33
- package/dist/src/commands/init.d.ts +0 -20
- package/dist/src/commands/init.d.ts.map +0 -1
- package/dist/src/commands/init.js +0 -264
- package/dist/src/commands/ios-scanner.d.ts +0 -104
- package/dist/src/commands/ios-scanner.d.ts.map +0 -1
- package/dist/src/commands/ios-scanner.js +0 -492
- package/dist/src/commands/ios-scheme-ranking.test.d.ts +0 -2
- package/dist/src/commands/ios-scheme-ranking.test.d.ts.map +0 -1
- package/dist/src/commands/ios-scheme-ranking.test.js +0 -264
- package/dist/src/commands/local-properties-reaches-every-workflow.test.d.ts +0 -30
- package/dist/src/commands/local-properties-reaches-every-workflow.test.d.ts.map +0 -1
- package/dist/src/commands/local-properties-reaches-every-workflow.test.js +0 -146
- package/dist/src/commands/reset.d.ts +0 -7
- package/dist/src/commands/reset.d.ts.map +0 -1
- package/dist/src/commands/reset.js +0 -81
- package/dist/src/commands/run.d.ts +0 -22
- package/dist/src/commands/run.d.ts.map +0 -1
- package/dist/src/commands/run.js +0 -141
- package/dist/src/commands/secrets-sync-workflow.d.ts +0 -15
- package/dist/src/commands/secrets-sync-workflow.d.ts.map +0 -1
- package/dist/src/commands/secrets-sync-workflow.js +0 -255
- package/dist/src/commands/secrets-upload.d.ts +0 -21
- package/dist/src/commands/secrets-upload.d.ts.map +0 -1
- package/dist/src/commands/secrets-upload.js +0 -177
- package/dist/src/commands/secrets-upload.test.d.ts +0 -5
- package/dist/src/commands/secrets-upload.test.d.ts.map +0 -1
- package/dist/src/commands/secrets-upload.test.js +0 -60
- package/dist/src/commands/validate.d.ts +0 -10
- package/dist/src/commands/validate.d.ts.map +0 -1
- package/dist/src/commands/validate.js +0 -46
- package/dist/src/config.d.ts +0 -3
- package/dist/src/config.d.ts.map +0 -1
- package/dist/src/config.js +0 -47
- package/dist/src/envman/cli.d.ts +0 -21
- package/dist/src/envman/cli.d.ts.map +0 -1
- package/dist/src/envman/cli.js +0 -240
- package/dist/src/envman/envman.d.ts +0 -83
- package/dist/src/envman/envman.d.ts.map +0 -1
- package/dist/src/envman/envman.js +0 -361
- package/dist/src/envman/envman.test.d.ts +0 -5
- package/dist/src/envman/envman.test.d.ts.map +0 -1
- package/dist/src/envman/envman.test.js +0 -236
- package/dist/src/envman/envstore-round-trip.test.d.ts +0 -27
- package/dist/src/envman/envstore-round-trip.test.d.ts.map +0 -1
- package/dist/src/envman/envstore-round-trip.test.js +0 -130
- package/dist/src/envman/index.d.ts +0 -23
- package/dist/src/envman/index.d.ts.map +0 -1
- package/dist/src/envman/index.js +0 -23
- package/dist/src/envman/shim.d.ts +0 -16
- package/dist/src/envman/shim.d.ts.map +0 -1
- package/dist/src/envman/shim.js +0 -66
- package/dist/src/envman/types.d.ts +0 -55
- package/dist/src/envman/types.d.ts.map +0 -1
- package/dist/src/envman/types.js +0 -12
- package/dist/src/lib.d.ts +0 -33
- package/dist/src/lib.d.ts.map +0 -1
- package/dist/src/lib.js +0 -37
- package/dist/src/pipeline.d.ts +0 -3
- package/dist/src/pipeline.d.ts.map +0 -1
- package/dist/src/pipeline.js +0 -57
- package/dist/src/runner-node-step.test.d.ts +0 -12
- package/dist/src/runner-node-step.test.d.ts.map +0 -1
- package/dist/src/runner-node-step.test.js +0 -61
- package/dist/src/runner.d.ts +0 -31
- package/dist/src/runner.d.ts.map +0 -1
- package/dist/src/runner.js +0 -240
- package/dist/src/shared/detect-project.d.ts +0 -57
- package/dist/src/shared/detect-project.d.ts.map +0 -1
- package/dist/src/shared/detect-project.js +0 -219
- package/dist/src/shared/detect-project.test.d.ts +0 -2
- package/dist/src/shared/detect-project.test.d.ts.map +0 -1
- package/dist/src/shared/detect-project.test.js +0 -161
- package/dist/src/shared/git.d.ts +0 -25
- package/dist/src/shared/git.d.ts.map +0 -1
- package/dist/src/shared/git.js +0 -53
- package/dist/src/shared/git.test.d.ts +0 -9
- package/dist/src/shared/git.test.d.ts.map +0 -1
- package/dist/src/shared/git.test.js +0 -66
- package/dist/src/shared/gitignore.d.ts +0 -6
- package/dist/src/shared/gitignore.d.ts.map +0 -1
- package/dist/src/shared/gitignore.js +0 -26
- package/dist/src/shared/gradle-settings.d.ts +0 -49
- package/dist/src/shared/gradle-settings.d.ts.map +0 -1
- package/dist/src/shared/gradle-settings.js +0 -138
- package/dist/src/shared/gradle-settings.test.d.ts +0 -2
- package/dist/src/shared/gradle-settings.test.d.ts.map +0 -1
- package/dist/src/shared/gradle-settings.test.js +0 -65
- package/dist/src/shared/prompts.d.ts +0 -30
- package/dist/src/shared/prompts.d.ts.map +0 -1
- package/dist/src/shared/prompts.js +0 -121
- package/dist/src/shared/xcode-container.test.d.ts +0 -2
- package/dist/src/shared/xcode-container.test.d.ts.map +0 -1
- package/dist/src/shared/xcode-container.test.js +0 -123
- package/dist/src/step-marker.d.ts +0 -12
- package/dist/src/step-marker.d.ts.map +0 -1
- package/dist/src/step-marker.js +0 -29
- package/dist/src/step-marker.test.d.ts +0 -11
- package/dist/src/step-marker.test.d.ts.map +0 -1
- package/dist/src/step-marker.test.js +0 -45
- package/dist/src/types.d.ts +0 -58
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -2
- package/dist/src/yaml/a-cache-path-must-not-swallow-a-credential.test.d.ts +0 -28
- package/dist/src/yaml/a-cache-path-must-not-swallow-a-credential.test.d.ts.map +0 -1
- package/dist/src/yaml/a-cache-path-must-not-swallow-a-credential.test.js +0 -223
- package/dist/src/yaml/a-declared-secret-reaches-the-file-step.test.d.ts +0 -20
- package/dist/src/yaml/a-declared-secret-reaches-the-file-step.test.d.ts.map +0 -1
- package/dist/src/yaml/a-declared-secret-reaches-the-file-step.test.js +0 -201
- package/dist/src/yaml/a-declared-slot-may-name-the-workflow-it-belongs-to.test.d.ts +0 -37
- package/dist/src/yaml/a-declared-slot-may-name-the-workflow-it-belongs-to.test.d.ts.map +0 -1
- package/dist/src/yaml/a-declared-slot-may-name-the-workflow-it-belongs-to.test.js +0 -255
- package/dist/src/yaml/a-missing-credential-is-loud.test.d.ts +0 -32
- package/dist/src/yaml/a-missing-credential-is-loud.test.d.ts.map +0 -1
- package/dist/src/yaml/a-missing-credential-is-loud.test.js +0 -301
- package/dist/src/yaml/a-runtime-requirement-names-a-real-provider.test.d.ts +0 -18
- package/dist/src/yaml/a-runtime-requirement-names-a-real-provider.test.d.ts.map +0 -1
- package/dist/src/yaml/a-runtime-requirement-names-a-real-provider.test.js +0 -66
- package/dist/src/yaml/a-scoped-slot-must-name-a-workflow-the-pipeline-has.test.d.ts +0 -34
- package/dist/src/yaml/a-scoped-slot-must-name-a-workflow-the-pipeline-has.test.d.ts.map +0 -1
- package/dist/src/yaml/a-scoped-slot-must-name-a-workflow-the-pipeline-has.test.js +0 -218
- package/dist/src/yaml/a-value-this-instance-stored-is-a-value-it-has.test.d.ts +0 -27
- package/dist/src/yaml/a-value-this-instance-stored-is-a-value-it-has.test.d.ts.map +0 -1
- package/dist/src/yaml/a-value-this-instance-stored-is-a-value-it-has.test.js +0 -126
- package/dist/src/yaml/bitrise-compat.d.ts +0 -65
- package/dist/src/yaml/bitrise-compat.d.ts.map +0 -1
- package/dist/src/yaml/bitrise-compat.js +0 -206
- package/dist/src/yaml/bitrise-compat.test.d.ts +0 -5
- package/dist/src/yaml/bitrise-compat.test.d.ts.map +0 -1
- package/dist/src/yaml/bitrise-compat.test.js +0 -347
- package/dist/src/yaml/cache-key-missing-file.test.d.ts +0 -12
- package/dist/src/yaml/cache-key-missing-file.test.d.ts.map +0 -1
- package/dist/src/yaml/cache-key-missing-file.test.js +0 -116
- package/dist/src/yaml/converter.d.ts +0 -103
- package/dist/src/yaml/converter.d.ts.map +0 -1
- package/dist/src/yaml/converter.js +0 -420
- package/dist/src/yaml/converter.test.d.ts +0 -5
- package/dist/src/yaml/converter.test.d.ts.map +0 -1
- package/dist/src/yaml/converter.test.js +0 -548
- package/dist/src/yaml/e2e.test.d.ts +0 -6
- package/dist/src/yaml/e2e.test.d.ts.map +0 -1
- package/dist/src/yaml/e2e.test.js +0 -446
- package/dist/src/yaml/env-resolver.d.ts +0 -218
- package/dist/src/yaml/env-resolver.d.ts.map +0 -1
- package/dist/src/yaml/env-resolver.js +0 -591
- package/dist/src/yaml/env-resolver.test.d.ts +0 -5
- package/dist/src/yaml/env-resolver.test.d.ts.map +0 -1
- package/dist/src/yaml/env-resolver.test.js +0 -502
- package/dist/src/yaml/every-build-log-witnesses-the-commit-on-disk.test.d.ts +0 -16
- package/dist/src/yaml/every-build-log-witnesses-the-commit-on-disk.test.d.ts.map +0 -1
- package/dist/src/yaml/every-build-log-witnesses-the-commit-on-disk.test.js +0 -126
- package/dist/src/yaml/fidelity-input-digest.d.ts +0 -37
- package/dist/src/yaml/fidelity-input-digest.d.ts.map +0 -1
- package/dist/src/yaml/fidelity-input-digest.js +0 -208
- package/dist/src/yaml/fidelity-input-digest.test.d.ts +0 -2
- package/dist/src/yaml/fidelity-input-digest.test.d.ts.map +0 -1
- package/dist/src/yaml/fidelity-input-digest.test.js +0 -167
- package/dist/src/yaml/fidelity-manifest.d.ts +0 -126
- package/dist/src/yaml/fidelity-manifest.d.ts.map +0 -1
- package/dist/src/yaml/fidelity-manifest.js +0 -134
- package/dist/src/yaml/fidelity-manifest.test.d.ts +0 -12
- package/dist/src/yaml/fidelity-manifest.test.d.ts.map +0 -1
- package/dist/src/yaml/fidelity-manifest.test.js +0 -251
- package/dist/src/yaml/interactive-prompts.d.ts +0 -71
- package/dist/src/yaml/interactive-prompts.d.ts.map +0 -1
- package/dist/src/yaml/interactive-prompts.js +0 -260
- package/dist/src/yaml/meta-helpers.d.ts +0 -28
- package/dist/src/yaml/meta-helpers.d.ts.map +0 -1
- package/dist/src/yaml/meta-helpers.js +0 -46
- package/dist/src/yaml/missing-env-handler.d.ts +0 -45
- package/dist/src/yaml/missing-env-handler.d.ts.map +0 -1
- package/dist/src/yaml/missing-env-handler.js +0 -64
- package/dist/src/yaml/parser.d.ts +0 -33
- package/dist/src/yaml/parser.d.ts.map +0 -1
- package/dist/src/yaml/parser.js +0 -148
- package/dist/src/yaml/parser.test.d.ts +0 -5
- package/dist/src/yaml/parser.test.d.ts.map +0 -1
- package/dist/src/yaml/parser.test.js +0 -83
- package/dist/src/yaml/pipeline-with-secrets.d.ts +0 -25
- package/dist/src/yaml/pipeline-with-secrets.d.ts.map +0 -1
- package/dist/src/yaml/pipeline-with-secrets.js +0 -76
- package/dist/src/yaml/platform-detector.d.ts +0 -83
- package/dist/src/yaml/platform-detector.d.ts.map +0 -1
- package/dist/src/yaml/platform-detector.js +0 -189
- package/dist/src/yaml/platform-detector.test.d.ts +0 -5
- package/dist/src/yaml/platform-detector.test.d.ts.map +0 -1
- package/dist/src/yaml/platform-detector.test.js +0 -525
- package/dist/src/yaml/preflight-validation.d.ts +0 -29
- package/dist/src/yaml/preflight-validation.d.ts.map +0 -1
- package/dist/src/yaml/preflight-validation.js +0 -21
- package/dist/src/yaml/secrets-manager.d.ts +0 -87
- package/dist/src/yaml/secrets-manager.d.ts.map +0 -1
- package/dist/src/yaml/secrets-manager.js +0 -230
- package/dist/src/yaml/shell-assignments.d.ts +0 -40
- package/dist/src/yaml/shell-assignments.d.ts.map +0 -1
- package/dist/src/yaml/shell-assignments.js +0 -77
- package/dist/src/yaml/step-validator-check-failure.test.d.ts +0 -24
- package/dist/src/yaml/step-validator-check-failure.test.d.ts.map +0 -1
- package/dist/src/yaml/step-validator-check-failure.test.js +0 -130
- package/dist/src/yaml/step-validator-self-assigned.test.d.ts +0 -23
- package/dist/src/yaml/step-validator-self-assigned.test.d.ts.map +0 -1
- package/dist/src/yaml/step-validator-self-assigned.test.js +0 -191
- package/dist/src/yaml/step-validator.d.ts +0 -67
- package/dist/src/yaml/step-validator.d.ts.map +0 -1
- package/dist/src/yaml/step-validator.js +0 -466
- package/dist/src/yaml/step-validator.test.d.ts +0 -18
- package/dist/src/yaml/step-validator.test.d.ts.map +0 -1
- package/dist/src/yaml/step-validator.test.js +0 -140
- package/dist/src/yaml/steps/a-missing-pinned-jdk-yields-for-every-gradle-run.test.d.ts +0 -2
- package/dist/src/yaml/steps/a-missing-pinned-jdk-yields-for-every-gradle-run.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/a-missing-pinned-jdk-yields-for-every-gradle-run.test.js +0 -96
- package/dist/src/yaml/steps/android-sign.d.ts +0 -35
- package/dist/src/yaml/steps/android-sign.d.ts.map +0 -1
- package/dist/src/yaml/steps/android-sign.js +0 -147
- package/dist/src/yaml/steps/android-variant-resolution.test.d.ts +0 -2
- package/dist/src/yaml/steps/android-variant-resolution.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/android-variant-resolution.test.js +0 -260
- package/dist/src/yaml/steps/android-version.d.ts +0 -26
- package/dist/src/yaml/steps/android-version.d.ts.map +0 -1
- package/dist/src/yaml/steps/android-version.js +0 -128
- package/dist/src/yaml/steps/android-version.test.d.ts +0 -5
- package/dist/src/yaml/steps/android-version.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/android-version.test.js +0 -196
- package/dist/src/yaml/steps/android.d.ts +0 -156
- package/dist/src/yaml/steps/android.d.ts.map +0 -1
- package/dist/src/yaml/steps/android.js +0 -1100
- package/dist/src/yaml/steps/app-store-deploy.d.ts +0 -48
- package/dist/src/yaml/steps/app-store-deploy.d.ts.map +0 -1
- package/dist/src/yaml/steps/app-store-deploy.js +0 -167
- package/dist/src/yaml/steps/base.d.ts +0 -263
- package/dist/src/yaml/steps/base.d.ts.map +0 -1
- package/dist/src/yaml/steps/base.js +0 -380
- package/dist/src/yaml/steps/bitrise-android-tools.d.ts +0 -26
- package/dist/src/yaml/steps/bitrise-android-tools.d.ts.map +0 -1
- package/dist/src/yaml/steps/bitrise-android-tools.js +0 -200
- package/dist/src/yaml/steps/bitrise-android-tools.test.d.ts +0 -5
- package/dist/src/yaml/steps/bitrise-android-tools.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/bitrise-android-tools.test.js +0 -280
- package/dist/src/yaml/steps/bitrise-apk-info.d.ts +0 -22
- package/dist/src/yaml/steps/bitrise-apk-info.d.ts.map +0 -1
- package/dist/src/yaml/steps/bitrise-apk-info.js +0 -144
- package/dist/src/yaml/steps/bitrise-apk-info.test.d.ts +0 -5
- package/dist/src/yaml/steps/bitrise-apk-info.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/bitrise-apk-info.test.js +0 -331
- package/dist/src/yaml/steps/bitrise-slack.d.ts +0 -49
- package/dist/src/yaml/steps/bitrise-slack.d.ts.map +0 -1
- package/dist/src/yaml/steps/bitrise-slack.js +0 -280
- package/dist/src/yaml/steps/bitrise-slack.test.d.ts +0 -5
- package/dist/src/yaml/steps/bitrise-slack.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/bitrise-slack.test.js +0 -484
- package/dist/src/yaml/steps/bitrise-ssh.d.ts +0 -27
- package/dist/src/yaml/steps/bitrise-ssh.d.ts.map +0 -1
- package/dist/src/yaml/steps/bitrise-ssh.js +0 -134
- package/dist/src/yaml/steps/bitrise-ssh.test.d.ts +0 -5
- package/dist/src/yaml/steps/bitrise-ssh.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/bitrise-ssh.test.js +0 -205
- package/dist/src/yaml/steps/cache-pull-daemon.test.d.ts +0 -27
- package/dist/src/yaml/steps/cache-pull-daemon.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/cache-pull-daemon.test.js +0 -212
- package/dist/src/yaml/steps/cache-pull-restore-roots.test.d.ts +0 -42
- package/dist/src/yaml/steps/cache-pull-restore-roots.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/cache-pull-restore-roots.test.js +0 -209
- package/dist/src/yaml/steps/cache-push-daemon.test.d.ts +0 -27
- package/dist/src/yaml/steps/cache-push-daemon.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/cache-push-daemon.test.js +0 -171
- package/dist/src/yaml/steps/cache.d.ts +0 -59
- package/dist/src/yaml/steps/cache.d.ts.map +0 -1
- package/dist/src/yaml/steps/cache.js +0 -1027
- package/dist/src/yaml/steps/capture-injection.d.ts +0 -30
- package/dist/src/yaml/steps/capture-injection.d.ts.map +0 -1
- package/dist/src/yaml/steps/capture-injection.js +0 -88
- package/dist/src/yaml/steps/capture-injection.test.d.ts +0 -2
- package/dist/src/yaml/steps/capture-injection.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/capture-injection.test.js +0 -163
- package/dist/src/yaml/steps/cocoapods-deployment-floor.d.ts +0 -42
- package/dist/src/yaml/steps/cocoapods-deployment-floor.d.ts.map +0 -1
- package/dist/src/yaml/steps/cocoapods-deployment-floor.js +0 -140
- package/dist/src/yaml/steps/cocoapods-deployment-floor.test.d.ts +0 -11
- package/dist/src/yaml/steps/cocoapods-deployment-floor.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/cocoapods-deployment-floor.test.js +0 -176
- package/dist/src/yaml/steps/cocoapods-install-emits-valid-bash.test.d.ts +0 -22
- package/dist/src/yaml/steps/cocoapods-install-emits-valid-bash.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/cocoapods-install-emits-valid-bash.test.js +0 -97
- package/dist/src/yaml/steps/cocoapods-locked-bundler.test.d.ts +0 -17
- package/dist/src/yaml/steps/cocoapods-locked-bundler.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/cocoapods-locked-bundler.test.js +0 -282
- package/dist/src/yaml/steps/cocoapods-skip-if-absent.test.d.ts +0 -17
- package/dist/src/yaml/steps/cocoapods-skip-if-absent.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/cocoapods-skip-if-absent.test.js +0 -132
- package/dist/src/yaml/steps/envstore-loader.test.d.ts +0 -15
- package/dist/src/yaml/steps/envstore-loader.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/envstore-loader.test.js +0 -143
- package/dist/src/yaml/steps/fastlane.d.ts +0 -27
- package/dist/src/yaml/steps/fastlane.d.ts.map +0 -1
- package/dist/src/yaml/steps/fastlane.js +0 -79
- package/dist/src/yaml/steps/fidelity-aspect-guard.d.ts +0 -53
- package/dist/src/yaml/steps/fidelity-aspect-guard.d.ts.map +0 -1
- package/dist/src/yaml/steps/fidelity-aspect-guard.js +0 -72
- package/dist/src/yaml/steps/fidelity-aspect-guard.test.d.ts +0 -11
- package/dist/src/yaml/steps/fidelity-aspect-guard.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/fidelity-aspect-guard.test.js +0 -50
- package/dist/src/yaml/steps/fidelity-reference-provenance.d.ts +0 -87
- package/dist/src/yaml/steps/fidelity-reference-provenance.d.ts.map +0 -1
- package/dist/src/yaml/steps/fidelity-reference-provenance.js +0 -111
- package/dist/src/yaml/steps/fidelity-reference-provenance.test.d.ts +0 -22
- package/dist/src/yaml/steps/fidelity-reference-provenance.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/fidelity-reference-provenance.test.js +0 -118
- package/dist/src/yaml/steps/file.d.ts +0 -52
- package/dist/src/yaml/steps/file.d.ts.map +0 -1
- package/dist/src/yaml/steps/file.js +0 -108
- package/dist/src/yaml/steps/flutter.d.ts +0 -63
- package/dist/src/yaml/steps/flutter.d.ts.map +0 -1
- package/dist/src/yaml/steps/flutter.js +0 -215
- package/dist/src/yaml/steps/git-clone-names-the-inputs-it-ignores.test.d.ts +0 -16
- package/dist/src/yaml/steps/git-clone-names-the-inputs-it-ignores.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/git-clone-names-the-inputs-it-ignores.test.js +0 -127
- package/dist/src/yaml/steps/git-clone.d.ts +0 -32
- package/dist/src/yaml/steps/git-clone.d.ts.map +0 -1
- package/dist/src/yaml/steps/git-clone.js +0 -171
- package/dist/src/yaml/steps/git-fetch-retry-exec.test.d.ts +0 -10
- package/dist/src/yaml/steps/git-fetch-retry-exec.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/git-fetch-retry-exec.test.js +0 -162
- package/dist/src/yaml/steps/git-fetch-retry.d.ts +0 -62
- package/dist/src/yaml/steps/git-fetch-retry.d.ts.map +0 -1
- package/dist/src/yaml/steps/git-fetch-retry.js +0 -155
- package/dist/src/yaml/steps/git-fetch-retry.test.d.ts +0 -5
- package/dist/src/yaml/steps/git-fetch-retry.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/git-fetch-retry.test.js +0 -86
- package/dist/src/yaml/steps/google-play-deploy.d.ts +0 -37
- package/dist/src/yaml/steps/google-play-deploy.d.ts.map +0 -1
- package/dist/src/yaml/steps/google-play-deploy.js +0 -193
- package/dist/src/yaml/steps/google-play-deploy.test.d.ts +0 -5
- package/dist/src/yaml/steps/google-play-deploy.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/google-play-deploy.test.js +0 -310
- package/dist/src/yaml/steps/gradle-memory.d.ts +0 -91
- package/dist/src/yaml/steps/gradle-memory.d.ts.map +0 -1
- package/dist/src/yaml/steps/gradle-memory.js +0 -495
- package/dist/src/yaml/steps/gradle-memory.test.d.ts +0 -2
- package/dist/src/yaml/steps/gradle-memory.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/gradle-memory.test.js +0 -344
- package/dist/src/yaml/steps/gradle-sdk-cmake.d.ts +0 -28
- package/dist/src/yaml/steps/gradle-sdk-cmake.d.ts.map +0 -1
- package/dist/src/yaml/steps/gradle-sdk-cmake.js +0 -107
- package/dist/src/yaml/steps/gradle-sdk-cmake.test.d.ts +0 -2
- package/dist/src/yaml/steps/gradle-sdk-cmake.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/gradle-sdk-cmake.test.js +0 -183
- package/dist/src/yaml/steps/index.d.ts +0 -10
- package/dist/src/yaml/steps/index.d.ts.map +0 -1
- package/dist/src/yaml/steps/index.js +0 -1461
- package/dist/src/yaml/steps/ios-deps.d.ts +0 -78
- package/dist/src/yaml/steps/ios-deps.d.ts.map +0 -1
- package/dist/src/yaml/steps/ios-deps.js +0 -279
- package/dist/src/yaml/steps/ios-deps.test.d.ts +0 -5
- package/dist/src/yaml/steps/ios-deps.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/ios-deps.test.js +0 -90
- package/dist/src/yaml/steps/ios-signing.d.ts +0 -31
- package/dist/src/yaml/steps/ios-signing.d.ts.map +0 -1
- package/dist/src/yaml/steps/ios-signing.js +0 -144
- package/dist/src/yaml/steps/ios-version.d.ts +0 -47
- package/dist/src/yaml/steps/ios-version.d.ts.map +0 -1
- package/dist/src/yaml/steps/ios-version.js +0 -151
- package/dist/src/yaml/steps/java-home-version-spec.test.d.ts +0 -10
- package/dist/src/yaml/steps/java-home-version-spec.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/java-home-version-spec.test.js +0 -58
- package/dist/src/yaml/steps/kotlin-metadata-compiles-on-a-daemon.test.d.ts +0 -2
- package/dist/src/yaml/steps/kotlin-metadata-compiles-on-a-daemon.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/kotlin-metadata-compiles-on-a-daemon.test.js +0 -139
- package/dist/src/yaml/steps/linting.d.ts +0 -47
- package/dist/src/yaml/steps/linting.d.ts.map +0 -1
- package/dist/src/yaml/steps/linting.js +0 -148
- package/dist/src/yaml/steps/phase2.test.d.ts +0 -6
- package/dist/src/yaml/steps/phase2.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/phase2.test.js +0 -197
- package/dist/src/yaml/steps/phase3.test.d.ts +0 -5
- package/dist/src/yaml/steps/phase3.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/phase3.test.js +0 -144
- package/dist/src/yaml/steps/phase4.test.d.ts +0 -5
- package/dist/src/yaml/steps/phase4.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/phase4.test.js +0 -166
- package/dist/src/yaml/steps/phase5.test.d.ts +0 -6
- package/dist/src/yaml/steps/phase5.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/phase5.test.js +0 -263
- package/dist/src/yaml/steps/registry.d.ts +0 -88
- package/dist/src/yaml/steps/registry.d.ts.map +0 -1
- package/dist/src/yaml/steps/registry.js +0 -125
- package/dist/src/yaml/steps/registry.test.d.ts +0 -5
- package/dist/src/yaml/steps/registry.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/registry.test.js +0 -235
- package/dist/src/yaml/steps/release.d.ts +0 -50
- package/dist/src/yaml/steps/release.d.ts.map +0 -1
- package/dist/src/yaml/steps/release.js +0 -154
- package/dist/src/yaml/steps/render-post-processor.d.ts +0 -100
- package/dist/src/yaml/steps/render-post-processor.d.ts.map +0 -1
- package/dist/src/yaml/steps/render-post-processor.js +0 -270
- package/dist/src/yaml/steps/render-post-processor.test.d.ts +0 -13
- package/dist/src/yaml/steps/render-post-processor.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/render-post-processor.test.js +0 -220
- package/dist/src/yaml/steps/script.d.ts +0 -23
- package/dist/src/yaml/steps/script.d.ts.map +0 -1
- package/dist/src/yaml/steps/script.js +0 -63
- package/dist/src/yaml/steps/spec-validation.test.d.ts +0 -6
- package/dist/src/yaml/steps/spec-validation.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/spec-validation.test.js +0 -130
- package/dist/src/yaml/steps/steps.test.d.ts +0 -6
- package/dist/src/yaml/steps/steps.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/steps.test.js +0 -881
- package/dist/src/yaml/steps/structural-facts.d.ts +0 -992
- package/dist/src/yaml/steps/structural-facts.d.ts.map +0 -1
- package/dist/src/yaml/steps/structural-facts.js +0 -3276
- package/dist/src/yaml/steps/structural-facts.test.d.ts +0 -12
- package/dist/src/yaml/steps/structural-facts.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/structural-facts.test.js +0 -3039
- package/dist/src/yaml/steps/test-config.d.ts +0 -5
- package/dist/src/yaml/steps/test-config.d.ts.map +0 -1
- package/dist/src/yaml/steps/test-config.js +0 -25
- package/dist/src/yaml/steps/trim-align-corpus.test.d.ts +0 -28
- package/dist/src/yaml/steps/trim-align-corpus.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/trim-align-corpus.test.js +0 -383
- package/dist/src/yaml/steps/trim-align.d.ts +0 -87
- package/dist/src/yaml/steps/trim-align.d.ts.map +0 -1
- package/dist/src/yaml/steps/trim-align.js +0 -367
- package/dist/src/yaml/steps/trim-align.test.d.ts +0 -11
- package/dist/src/yaml/steps/trim-align.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/trim-align.test.js +0 -261
- package/dist/src/yaml/steps/ui-fidelity-preview-android.d.ts +0 -66
- package/dist/src/yaml/steps/ui-fidelity-preview-android.d.ts.map +0 -1
- package/dist/src/yaml/steps/ui-fidelity-preview-android.js +0 -251
- package/dist/src/yaml/steps/ui-fidelity-preview-android.test.d.ts +0 -13
- package/dist/src/yaml/steps/ui-fidelity-preview-android.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/ui-fidelity-preview-android.test.js +0 -302
- package/dist/src/yaml/steps/ui-fidelity-preview.d.ts +0 -134
- package/dist/src/yaml/steps/ui-fidelity-preview.d.ts.map +0 -1
- package/dist/src/yaml/steps/ui-fidelity-preview.js +0 -173
- package/dist/src/yaml/steps/ui-fidelity-preview.test.d.ts +0 -11
- package/dist/src/yaml/steps/ui-fidelity-preview.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/ui-fidelity-preview.test.js +0 -210
- package/dist/src/yaml/steps/ui-fidelity-render-android.d.ts +0 -155
- package/dist/src/yaml/steps/ui-fidelity-render-android.d.ts.map +0 -1
- package/dist/src/yaml/steps/ui-fidelity-render-android.js +0 -1389
- package/dist/src/yaml/steps/ui-fidelity-render-android.test.d.ts +0 -2
- package/dist/src/yaml/steps/ui-fidelity-render-android.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/ui-fidelity-render-android.test.js +0 -1106
- package/dist/src/yaml/steps/ui-fidelity-render.d.ts +0 -230
- package/dist/src/yaml/steps/ui-fidelity-render.d.ts.map +0 -1
- package/dist/src/yaml/steps/ui-fidelity-render.js +0 -1597
- package/dist/src/yaml/steps/ui-fidelity-render.test.d.ts +0 -18
- package/dist/src/yaml/steps/ui-fidelity-render.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/ui-fidelity-render.test.js +0 -1871
- package/dist/src/yaml/steps/xcode-app-product.d.ts +0 -90
- package/dist/src/yaml/steps/xcode-app-product.d.ts.map +0 -1
- package/dist/src/yaml/steps/xcode-app-product.js +0 -247
- package/dist/src/yaml/steps/xcode-app-product.test.d.ts +0 -2
- package/dist/src/yaml/steps/xcode-app-product.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/xcode-app-product.test.js +0 -202
- package/dist/src/yaml/steps/xcode-derived-data.test.d.ts +0 -30
- package/dist/src/yaml/steps/xcode-derived-data.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/xcode-derived-data.test.js +0 -279
- package/dist/src/yaml/steps/xcode-destination.d.ts +0 -47
- package/dist/src/yaml/steps/xcode-destination.d.ts.map +0 -1
- package/dist/src/yaml/steps/xcode-destination.js +0 -202
- package/dist/src/yaml/steps/xcode-destination.test.d.ts +0 -9
- package/dist/src/yaml/steps/xcode-destination.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/xcode-destination.test.js +0 -227
- package/dist/src/yaml/steps/xcode-new.test.d.ts +0 -5
- package/dist/src/yaml/steps/xcode-new.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/xcode-new.test.js +0 -211
- package/dist/src/yaml/steps/xcode-resolve-retry.test.d.ts +0 -9
- package/dist/src/yaml/steps/xcode-resolve-retry.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/xcode-resolve-retry.test.js +0 -146
- package/dist/src/yaml/steps/xcode-simulator-archs.d.ts +0 -53
- package/dist/src/yaml/steps/xcode-simulator-archs.d.ts.map +0 -1
- package/dist/src/yaml/steps/xcode-simulator-archs.js +0 -98
- package/dist/src/yaml/steps/xcode-simulator-archs.test.d.ts +0 -21
- package/dist/src/yaml/steps/xcode-simulator-archs.test.d.ts.map +0 -1
- package/dist/src/yaml/steps/xcode-simulator-archs.test.js +0 -155
- package/dist/src/yaml/steps/xcode.d.ts +0 -230
- package/dist/src/yaml/steps/xcode.d.ts.map +0 -1
- package/dist/src/yaml/steps/xcode.js +0 -1350
- package/dist/src/yaml/types.d.ts +0 -76
- package/dist/src/yaml/types.d.ts.map +0 -1
- package/dist/src/yaml/types.js +0 -5
- package/dist/src/yaml/validation-types.d.ts +0 -102
- package/dist/src/yaml/validation-types.d.ts.map +0 -1
- package/dist/src/yaml/validation-types.js +0 -8
- package/dist/src/yaml/yaml-updater.d.ts +0 -24
- package/dist/src/yaml/yaml-updater.d.ts.map +0 -1
- package/dist/src/yaml/yaml-updater.js +0 -128
|
@@ -1,992 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Structural-facts deriver — Signal A of the UI-fidelity structural pass.
|
|
3
|
-
*
|
|
4
|
-
* Pure and platform-agnostic: it takes a per-node layout dump (clipped +
|
|
5
|
-
* unclipped bounds in px, parent) emitted alongside the render and derives
|
|
6
|
-
* intent-agnostic geometric facts the fidelity judge should check instead of
|
|
7
|
-
* discovering them by eye:
|
|
8
|
-
*
|
|
9
|
-
* - `overflow` — a node extends past its parent's box (parent does
|
|
10
|
-
* NOT clip, so the excess is visibly sticking out).
|
|
11
|
-
* - `clipped_by_parent` — a node extends past a CLIPPING parent's box, so the
|
|
12
|
-
* excess is cut away (the motivating euro-coin case).
|
|
13
|
-
* - `off_screen` — a node extends past the root canvas.
|
|
14
|
-
* - `overlap` — two siblings overlap by a significant area.
|
|
15
|
-
*
|
|
16
|
-
* The deriver does NOT judge or score; it reports facts. The verdict stays the
|
|
17
|
-
* agent's. This is the brain of Signal A; the render-side emission + facts
|
|
18
|
-
* artifact wiring live in the render step (a separate slice).
|
|
19
|
-
*/
|
|
20
|
-
export interface LayoutBounds {
|
|
21
|
-
left: number;
|
|
22
|
-
top: number;
|
|
23
|
-
right: number;
|
|
24
|
-
bottom: number;
|
|
25
|
-
}
|
|
26
|
-
export interface LayoutNode {
|
|
27
|
-
/** Stable id/label for the node within one dump. */
|
|
28
|
-
id: string;
|
|
29
|
-
/** Clipped root-space bounds in px (boundsInRoot — the visible region,
|
|
30
|
-
* clamped by any clipping ancestor). */
|
|
31
|
-
bounds: LayoutBounds;
|
|
32
|
-
/** Unclipped root-space bounds in px (positionInRoot + size — the true layout
|
|
33
|
-
* extent). Absent in legacy dumps emitted before the structural pass tracked
|
|
34
|
-
* it; when present, overflow/clip is derived from this so it survives a
|
|
35
|
-
* clamping parent (which would otherwise hide the excess in `bounds`). */
|
|
36
|
-
unclippedBounds?: LayoutBounds;
|
|
37
|
-
/** Parent node id, or null for a root node. */
|
|
38
|
-
parentId: string | null;
|
|
39
|
-
/** Legacy clip hint (parent clips its children). The current emitter writes a
|
|
40
|
-
* constant false; used only for the legacy (no-`unclippedBounds`) fallback. */
|
|
41
|
-
clipsChildren: boolean;
|
|
42
|
-
/** Accessible text content. */
|
|
43
|
-
text?: string;
|
|
44
|
-
/** Fill (background) color, hex. */
|
|
45
|
-
fillColor?: string;
|
|
46
|
-
/** Text (foreground) color, hex. */
|
|
47
|
-
textColor?: string;
|
|
48
|
-
/** Fill alpha 0..1 (issue 14b), present only when the render painted the fill
|
|
49
|
-
* TRANSLUCENT — omitted at full opacity, exactly like the design side, so
|
|
50
|
-
* absence means opaque on both sides. Older harnesses omit it always. */
|
|
51
|
-
fillAlpha?: number;
|
|
52
|
-
/** Text alpha 0..1 (issue 14b), same convention as `fillAlpha`. */
|
|
53
|
-
textAlpha?: number;
|
|
54
|
-
/** Border (ring) colour, hex — the design's `stroke` (property-recognizer 01),
|
|
55
|
-
* read from the layout node's `Modifier.border(...)` element. Absent when the
|
|
56
|
-
* node has no border OR has one this read cannot measure (a gradient brush),
|
|
57
|
-
* so absence alone is not "no border" — that is what `styleChannels` on the
|
|
58
|
-
* dump is for. */
|
|
59
|
-
borderColor?: string;
|
|
60
|
-
/** Border thickness in DP (the harness reads `Dp.value`), so unlike `bounds`
|
|
61
|
-
* it is NOT divided by density. Emitted together with `borderColor` or not at
|
|
62
|
-
* all: half a measurement compared against a whole design value is how a
|
|
63
|
-
* wrong number ships. */
|
|
64
|
-
borderWidth?: number;
|
|
65
|
-
/** AnnotatedString background-span extents (issue 16): each range of the
|
|
66
|
-
* node's text drawn with a specified span background — the highlighted
|
|
67
|
-
* substrings. Offsets index into `text`. Absent in dumps from packages
|
|
68
|
-
* generated before the emitter tracked spans, and on spanless text — no
|
|
69
|
-
* signal, never a divergence. */
|
|
70
|
-
textSpans?: TextSpan[];
|
|
71
|
-
/** Laid-out line extents (issue 18): where the node's text ACTUALLY wrapped,
|
|
72
|
-
* read from the render's TextLayoutResult — one entry per laid-out line,
|
|
73
|
-
* with a VISIBLE end (trailing whitespace and the newline excluded).
|
|
74
|
-
* Offsets index into `text`. Absent in dumps from packages generated
|
|
75
|
-
* before the emitter tracked lines, and on nodes that lay out no text —
|
|
76
|
-
* no signal, never a divergence. */
|
|
77
|
-
textLines?: TextLine[];
|
|
78
|
-
/** The RESOLVED typeface (typeface facts, issue 03): the font that ACTUALLY
|
|
79
|
-
* painted this node's text, post-fallback — NOT the requested
|
|
80
|
-
* TextStyle.fontFamily, which still reads "correct" during a runtime
|
|
81
|
-
* fallback (the incident class the typeface fact exists to catch). Captured
|
|
82
|
-
* via per-glyph shaping (TextRunShaper, API 31+). Absent in dumps from
|
|
83
|
-
* packages generated before the emitter tracked it, on non-text nodes, and
|
|
84
|
-
* whenever the capture could not resolve — no signal, never a divergence. */
|
|
85
|
-
resolvedTypeface?: TypefaceSpec;
|
|
86
|
-
/** The TYPE METRICS this node's text was laid out with (typography facts 01),
|
|
87
|
-
* in sp: the layout input's own style, which is the style that produced the
|
|
88
|
-
* layout. A separate field from `resolvedTypeface` on purpose — that capture
|
|
89
|
-
* needs per-glyph shaping (API 31+) and is frequently absent, while these are
|
|
90
|
-
* read straight off a style, so coupling them would make a size uncomparable
|
|
91
|
-
* on every proof that renders below the shaping seam.
|
|
92
|
-
*
|
|
93
|
-
* Absent on non-text nodes, in dumps from packages generated before the
|
|
94
|
-
* emitter tracked it, and PER METRIC when the style declares one in anything
|
|
95
|
-
* but sp — no signal, never a divergence. */
|
|
96
|
-
typeMetrics?: TypeMetrics;
|
|
97
|
-
/** What the node PAINTS, as distinct from the box it occupies. `Icon(N.dp)`
|
|
98
|
-
* paints `N × (path bounds ÷ viewport)` — 62.5% for a typical close glyph —
|
|
99
|
-
* while a design reference's key for an icon is its vector PATH box, which is
|
|
100
|
-
* pure ink. Without this the two are compared as if they measured the same
|
|
101
|
-
* thing. In the drawable's own viewport units: converting to dp needs the
|
|
102
|
-
* rendered box, which the consumer holds. Absent in dumps from packages
|
|
103
|
-
* generated before the emitter tracked it, and on nodes that paint no painter
|
|
104
|
-
* — their layout box IS the measurement. */
|
|
105
|
-
paintedInk?: PaintedInk;
|
|
106
|
-
}
|
|
107
|
-
/** A node's painted extent, in its drawable's viewport units.
|
|
108
|
-
*
|
|
109
|
-
* `unmeasurable` is a distinct claim from absence: it says the node paints
|
|
110
|
-
* SOMETHING whose extent could not be derived (a bitmap painter, a transformed
|
|
111
|
-
* or clipped vector group), so a consumer knows it is comparing a container
|
|
112
|
-
* against ink rather than assuming it is not. */
|
|
113
|
-
export type PaintedInk = {
|
|
114
|
-
kind: 'vector';
|
|
115
|
-
viewport: {
|
|
116
|
-
w: number;
|
|
117
|
-
h: number;
|
|
118
|
-
};
|
|
119
|
-
/** The ink's extent AND, since icon-ink-ratio 02 Half B, its ORIGIN in the
|
|
120
|
-
* same viewport units. `x`/`y` are optional because every dump written
|
|
121
|
-
* before the origin was captured carries the extent alone — a consumer that
|
|
122
|
-
* needs placement must treat their absence as "unknown", never as (0,0) or
|
|
123
|
-
* as centred. */
|
|
124
|
-
ink: {
|
|
125
|
-
w: number;
|
|
126
|
-
h: number;
|
|
127
|
-
x?: number;
|
|
128
|
-
y?: number;
|
|
129
|
-
};
|
|
130
|
-
} | {
|
|
131
|
-
kind: 'unmeasurable';
|
|
132
|
-
why: string;
|
|
133
|
-
};
|
|
134
|
-
/** One styled extent of a text node (an AnnotatedString span style with a
|
|
135
|
-
* specified background and/or a specified foreground color). */
|
|
136
|
-
export interface TextSpan {
|
|
137
|
-
start: number;
|
|
138
|
-
end: number;
|
|
139
|
-
text: string;
|
|
140
|
-
/** Span background color, hex. */
|
|
141
|
-
background?: string;
|
|
142
|
-
/** Span foreground (text) color, hex — partial-color emphasis. */
|
|
143
|
-
color?: string;
|
|
144
|
-
}
|
|
145
|
-
/** One laid-out line of a text node (issue 18). */
|
|
146
|
-
export interface TextLine {
|
|
147
|
-
start: number;
|
|
148
|
-
end: number;
|
|
149
|
-
text: string;
|
|
150
|
-
}
|
|
151
|
-
export interface LayoutDump {
|
|
152
|
-
/** The captured canvas / root bounds in px. */
|
|
153
|
-
canvas: LayoutBounds;
|
|
154
|
-
nodes: LayoutNode[];
|
|
155
|
-
/** The Android SDK the proof rendered at (Robolectric testOptions.targetSdk),
|
|
156
|
-
* declared by the emitter. The typeface capture seam (TextRunShaper) is API
|
|
157
|
-
* 31+, so a dump from an older render SDK cannot carry `resolvedTypeface` —
|
|
158
|
-
* consumers use this to advise "typeface not checked" instead of silently
|
|
159
|
-
* passing. Absent in dumps emitted before the field existed. */
|
|
160
|
-
renderSdk?: number;
|
|
161
|
-
/** The span channels this dump's emitter can report ("background",
|
|
162
|
-
* "color"). Absent in dumps emitted before foreground-color spans
|
|
163
|
-
* existed — their silence on the color channel is "cannot see", never
|
|
164
|
-
* "no color span rendered", so the span compare only derives color-span
|
|
165
|
-
* facts when the marker includes "color". */
|
|
166
|
-
spanChannels?: string[];
|
|
167
|
-
/** The STYLE channels this dump's emitter can report ("border").
|
|
168
|
-
* Absent in dumps emitted before border capture existed, and load-bearing in
|
|
169
|
-
* that case: their silence means "cannot see a border", NOT "the render has no
|
|
170
|
-
* border". The border compare therefore withholds the ABSENCE case entirely
|
|
171
|
-
* without this marker and the caller advises "not checked" — reading it the
|
|
172
|
-
* other way would put a finding on every stroked design in the catalogue
|
|
173
|
-
* (property-recognizer 01). */
|
|
174
|
-
styleChannels?: string[];
|
|
175
|
-
}
|
|
176
|
-
export type Edge = 'left' | 'top' | 'right' | 'bottom';
|
|
177
|
-
export type StructuralFact = {
|
|
178
|
-
kind: 'overflow';
|
|
179
|
-
nodeId: string;
|
|
180
|
-
parentId: string;
|
|
181
|
-
edges: Edge[];
|
|
182
|
-
overflowPx: Partial<Record<Edge, number>>;
|
|
183
|
-
} | {
|
|
184
|
-
kind: 'clipped_by_parent';
|
|
185
|
-
nodeId: string;
|
|
186
|
-
clipperId: string;
|
|
187
|
-
edges: Edge[];
|
|
188
|
-
clippedPx: Partial<Record<Edge, number>>;
|
|
189
|
-
} | {
|
|
190
|
-
kind: 'off_screen';
|
|
191
|
-
nodeId: string;
|
|
192
|
-
edges: Edge[];
|
|
193
|
-
offscreenPx: Partial<Record<Edge, number>>;
|
|
194
|
-
} | {
|
|
195
|
-
kind: 'overlap';
|
|
196
|
-
nodeIds: [string, string];
|
|
197
|
-
overlapPx: {
|
|
198
|
-
width: number;
|
|
199
|
-
height: number;
|
|
200
|
-
};
|
|
201
|
-
ratio: number;
|
|
202
|
-
} | {
|
|
203
|
-
/** Composition runs only (design-frame anchor): the captured wrapper
|
|
204
|
-
* root's dp size differs from the declared design frame — an authoring
|
|
205
|
-
* problem with the wrapper, never a defect of the screen. While this
|
|
206
|
-
* fact is present, placement facts are withheld for the State
|
|
207
|
-
* (`StructuralBlock.placement`), so a mis-sized root can never
|
|
208
|
-
* masquerade as placement drift. */
|
|
209
|
-
kind: 'frame_mismatch';
|
|
210
|
-
declared: {
|
|
211
|
-
w: number;
|
|
212
|
-
h: number;
|
|
213
|
-
};
|
|
214
|
-
captured: {
|
|
215
|
-
w: number;
|
|
216
|
-
h: number;
|
|
217
|
-
};
|
|
218
|
-
deltas: Array<{
|
|
219
|
-
dimension: 'w' | 'h';
|
|
220
|
-
delta: number;
|
|
221
|
-
}>;
|
|
222
|
-
} | {
|
|
223
|
-
/** One testTag shared by `instanceCount` nodes in the dump — an authoring
|
|
224
|
-
* problem with the wrapper, never a defect of the screen. Every id
|
|
225
|
-
* lookup (parent pairing, geometry, placement) is last-wins for a
|
|
226
|
-
* duplicated tag, so facts derived through it would compare arbitrary
|
|
227
|
-
* instances; they are WITHHELD rather than guessed while this fact is
|
|
228
|
-
* present, mirroring the `frame_mismatch` withhold pattern. */
|
|
229
|
-
kind: 'duplicate_tag';
|
|
230
|
-
tag: string;
|
|
231
|
-
instanceCount: number;
|
|
232
|
-
};
|
|
233
|
-
/** The declared design frame for one screen (design px, treated 1:1 with dp —
|
|
234
|
-
* same convention as `ReferenceGeometry`). Composition runs declare one per
|
|
235
|
-
* State via `params.reference_frame`; component runs never pass it. */
|
|
236
|
-
export interface ReferenceFrame {
|
|
237
|
-
w: number;
|
|
238
|
-
h: number;
|
|
239
|
-
}
|
|
240
|
-
/** One member root whose position on the surface diverges from the design
|
|
241
|
-
* frame beyond tolerance (composition runs only): `expected` is the declared
|
|
242
|
-
* design x/y (design px, 1:1 dp), `actual` the rendered root-space dp —
|
|
243
|
-
* directly comparable because the root is frame-sized (asserted). Only the
|
|
244
|
-
* out-of-tolerance dimensions appear in `deltas`. */
|
|
245
|
-
export interface PlacementFact {
|
|
246
|
-
elementId: string;
|
|
247
|
-
expected: {
|
|
248
|
-
x: number;
|
|
249
|
-
y: number;
|
|
250
|
-
};
|
|
251
|
-
actual: {
|
|
252
|
-
x: number;
|
|
253
|
-
y: number;
|
|
254
|
-
};
|
|
255
|
-
deltas: Array<{
|
|
256
|
-
dimension: 'x' | 'y';
|
|
257
|
-
delta: number;
|
|
258
|
-
}>;
|
|
259
|
-
}
|
|
260
|
-
/** Placement drift at or below this many dp is sub-pixel/rounding noise, not
|
|
261
|
-
* a misplacement — same reasoning as the size-delta floor. */
|
|
262
|
-
export declare const DEFAULT_PLACEMENT_TOLERANCE_DP = 2;
|
|
263
|
-
/** Placement-fact gate for one State (composition runs only): present when a
|
|
264
|
-
* design frame was declared and asserted against the captured root. When the
|
|
265
|
-
* root mis-matches the frame, placement facts are WITHHELD (`withheld: true`,
|
|
266
|
-
* with the reason, no `facts`) — the placement deriver must not compute drift
|
|
267
|
-
* against a wrongly-sized canvas. When the root matches, `facts` carries the
|
|
268
|
-
* tolerance-banded member-root x/y divergences (empty = placement holds). */
|
|
269
|
-
export interface StructuralPlacement {
|
|
270
|
-
withheld: boolean;
|
|
271
|
-
reason?: 'frame_mismatch';
|
|
272
|
-
facts?: PlacementFact[];
|
|
273
|
-
}
|
|
274
|
-
/** Captured-root vs declared-frame tolerance (dp): sub-pixel rounding must not
|
|
275
|
-
* read as a mis-sized wrapper root. */
|
|
276
|
-
export declare const DEFAULT_FRAME_TOLERANCE_DP = 1;
|
|
277
|
-
export interface DeriveStructuralFactsOptions {
|
|
278
|
-
/** Edge excesses / overlaps at or below this many px are ignored, so that
|
|
279
|
-
* exact-touching layout edges don't read as overflow or overlap. */
|
|
280
|
-
tolerancePx?: number;
|
|
281
|
-
/** Minimum (intersection area / smaller node area) for an overlap to be
|
|
282
|
-
* reported as significant. */
|
|
283
|
-
overlapMinRatio?: number;
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Node ids that appear on MORE THAN ONE node of the dump (testTag collisions),
|
|
287
|
-
* mapped to their instance count. Every id-keyed lookup (parent pairing,
|
|
288
|
-
* geometry, placement) is last-wins for such an id, so facts derived through it
|
|
289
|
-
* would compare arbitrary instances — consumers withhold them and report the
|
|
290
|
-
* collision as a `duplicate_tag` fact instead.
|
|
291
|
-
*/
|
|
292
|
-
export declare function duplicatedNodeIds(nodes: readonly LayoutNode[]): Map<string, number>;
|
|
293
|
-
export declare function deriveStructuralFacts(dump: LayoutDump, options?: DeriveStructuralFactsOptions): StructuralFact[];
|
|
294
|
-
/** One element's geometry; x/y optional (position is advisory, see ADR-0004). */
|
|
295
|
-
export interface ElementGeometry {
|
|
296
|
-
width: number;
|
|
297
|
-
height: number;
|
|
298
|
-
x?: number;
|
|
299
|
-
y?: number;
|
|
300
|
-
}
|
|
301
|
-
export type GeometrySource = Record<string, ElementGeometry>;
|
|
302
|
-
export interface DimensionDelta {
|
|
303
|
-
dimension: 'width' | 'height' | 'x' | 'y';
|
|
304
|
-
generated: number;
|
|
305
|
-
reference: number;
|
|
306
|
-
delta: number;
|
|
307
|
-
}
|
|
308
|
-
export interface GeometryDelta {
|
|
309
|
-
elementId: string;
|
|
310
|
-
deltas: DimensionDelta[];
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* Per-element dimensional deltas between a GENERATED geometry (render layout) and
|
|
314
|
-
* a REFERENCE geometry (design numbers), both in the same unit. Only elements
|
|
315
|
-
* present on both sides, and only dimensions supplied on both, are compared.
|
|
316
|
-
* Port of `packages/cli/lib/fidelity-geometry-diff.mjs`.
|
|
317
|
-
*/
|
|
318
|
-
export declare function diffKeyGeometry(generated: GeometrySource, reference: GeometrySource | null | undefined, options?: {
|
|
319
|
-
tolerancePx?: number;
|
|
320
|
-
}): GeometryDelta[];
|
|
321
|
-
/** `params.reference_geometry["<Screen>"]` — design px, treated 1:1 with dp. */
|
|
322
|
-
export type ReferenceGeometry = Record<string, {
|
|
323
|
-
w?: number;
|
|
324
|
-
h?: number;
|
|
325
|
-
x?: number;
|
|
326
|
-
y?: number;
|
|
327
|
-
}>;
|
|
328
|
-
/**
|
|
329
|
-
* Per-edge overhang of an element that overflows its frame (Signal B v2). For a
|
|
330
|
-
* clipping element the load-bearing invariant is its overhang per edge (= the
|
|
331
|
-
* clip), NOT its raw w/h: width can match and the clip still be wrong. Frame-
|
|
332
|
-
* relative edge overhang is the real clip, so it IS flagged — unlike absolute
|
|
333
|
-
* canvas x/y, which stays suppressed as a canvas-width artifact.
|
|
334
|
-
*
|
|
335
|
-
* rendered[edge] = element's unclipped edge − frame's edge (dp)
|
|
336
|
-
* design[edge] = design element edge − design frame edge (from reference_geometry)
|
|
337
|
-
* deltas = edges where |rendered − design| > overhangTolerance
|
|
338
|
-
* clipFlag = any delta present
|
|
339
|
-
*/
|
|
340
|
-
export interface StructuralOverhang {
|
|
341
|
-
unit: 'dp';
|
|
342
|
-
rendered: Partial<Record<Edge, number>>;
|
|
343
|
-
design: Partial<Record<Edge, number>>;
|
|
344
|
-
deltas: Array<{
|
|
345
|
-
edge: Edge;
|
|
346
|
-
delta: number;
|
|
347
|
-
}>;
|
|
348
|
-
clipFlag: boolean;
|
|
349
|
-
/** The clip delta is explained by the element's OWN size being wrong on the
|
|
350
|
-
* clip axis (a size delta, not the design's intended clip). */
|
|
351
|
-
sizeDriven: boolean;
|
|
352
|
-
/** …and that wrong size matches the frame's size — the parent-relative
|
|
353
|
-
* (`fillMaxHeight`/`matchParentSize`) signature. The fix is a fixed size. */
|
|
354
|
-
frameRelative: boolean;
|
|
355
|
-
/** The clip delta is explained by the element's frame-relative POSITION on the
|
|
356
|
-
* clip axis being wrong (an offset, not a size). Frame-relative position is NOT
|
|
357
|
-
* the suppressed absolute-x/y canvas artifact — it changes the real clip. */
|
|
358
|
-
positionDriven: boolean;
|
|
359
|
-
}
|
|
360
|
-
export interface StructuralGeometryElement {
|
|
361
|
-
id: string;
|
|
362
|
-
rendered?: {
|
|
363
|
-
w: number;
|
|
364
|
-
h: number;
|
|
365
|
-
x: number;
|
|
366
|
-
y: number;
|
|
367
|
-
};
|
|
368
|
-
design?: {
|
|
369
|
-
w: number | undefined;
|
|
370
|
-
h: number | undefined;
|
|
371
|
-
x?: number;
|
|
372
|
-
y?: number;
|
|
373
|
-
};
|
|
374
|
-
deltas?: Array<{
|
|
375
|
-
dimension: 'w' | 'h' | 'x' | 'y';
|
|
376
|
-
delta: number;
|
|
377
|
-
}>;
|
|
378
|
-
sizeFlag?: boolean;
|
|
379
|
-
/** Present only when the element overflows its (declared) frame. */
|
|
380
|
-
overhang?: StructuralOverhang;
|
|
381
|
-
/** What the element PAINTS (see `LayoutNode.paintedInk`), passed through from
|
|
382
|
-
* the dump so the judge can compare ink to ink instead of a container to
|
|
383
|
-
* ink. Absent for anything that paints no painter, and for every render made
|
|
384
|
-
* before the emitter tracked it. */
|
|
385
|
-
paintedInk?: PaintedInk;
|
|
386
|
-
/**
|
|
387
|
-
* The element's render ancestry: every ancestor node id from its IMMEDIATE
|
|
388
|
-
* parent up to the root (icon-ink-ratio 05). The dump's `parentId` links are
|
|
389
|
-
* consumed here for sibling grouping and were dropped, so the judge could not
|
|
390
|
-
* see the render's tree at all — and an element the wrapper nested in the wrong
|
|
391
|
-
* container had no finding of its own.
|
|
392
|
-
*
|
|
393
|
-
* The CHAIN rather than the parent link, because Compose's semantics tree omits
|
|
394
|
-
* untagged layout nodes: a declared key routinely sits several levels below the
|
|
395
|
-
* container it should be compared against, and an immediate parent alone cannot
|
|
396
|
-
* see past the gap. Measured over three gated screens, the parent link produces
|
|
397
|
-
* 21 false rows where the chain produces 2.
|
|
398
|
-
*
|
|
399
|
-
* An EMPTY array is a root node — a measurement, distinguishable from the
|
|
400
|
-
* ABSENT field of every render made before this shipped.
|
|
401
|
-
*/
|
|
402
|
-
ancestors?: string[];
|
|
403
|
-
}
|
|
404
|
-
export interface StructuralGeometry {
|
|
405
|
-
unit: 'dp';
|
|
406
|
-
density: number;
|
|
407
|
-
elements: StructuralGeometryElement[];
|
|
408
|
-
}
|
|
409
|
-
export interface StructuralSummary {
|
|
410
|
-
clean: boolean;
|
|
411
|
-
factCount: number;
|
|
412
|
-
maxSizeDeltaDp: number | null;
|
|
413
|
-
/** Largest |overhang delta| in dp, or null when there is no geometry. */
|
|
414
|
-
maxClipDeltaDp: number | null;
|
|
415
|
-
}
|
|
416
|
-
export interface StructuralBlock {
|
|
417
|
-
summary: StructuralSummary;
|
|
418
|
-
facts: StructuralFact[];
|
|
419
|
-
geometry?: StructuralGeometry;
|
|
420
|
-
appearance?: StructuralAppearance;
|
|
421
|
-
/** Composition runs only — see `StructuralPlacement`. */
|
|
422
|
-
placement?: StructuralPlacement;
|
|
423
|
-
}
|
|
424
|
-
/** Which reference the appearance facts were diffed against. `previous_render`
|
|
425
|
-
* facts are regressions/drift, NOT design divergences (the no-Figma path). */
|
|
426
|
-
export type AppearanceBaseline = 'figma' | 'previous_render';
|
|
427
|
-
export type AppearanceFact = {
|
|
428
|
-
kind: 'color';
|
|
429
|
-
elementId: string;
|
|
430
|
-
channel: 'fill' | 'text';
|
|
431
|
-
rendered: string;
|
|
432
|
-
reference: string;
|
|
433
|
-
/** CIEDE2000 perceptual distance — measurement only, no significance. */
|
|
434
|
-
deltaE: number;
|
|
435
|
-
} | {
|
|
436
|
-
/** The channel's OPACITY differs from the design's (issue 14b). Its own
|
|
437
|
-
* kind, not a `color` one: the hex can match exactly while the design
|
|
438
|
-
* paints the element at 30% (disabled) and the render at 100% (enabled),
|
|
439
|
-
* and a matching hex gives deltaE 0, which would never flag. */
|
|
440
|
-
kind: 'color_alpha';
|
|
441
|
-
elementId: string;
|
|
442
|
-
channel: 'fill' | 'text';
|
|
443
|
-
rendered: number;
|
|
444
|
-
reference: number;
|
|
445
|
-
}
|
|
446
|
-
/** The design declares a STROKE the render drew no border for at all
|
|
447
|
-
* (property-recognizer 01). The motivating case: an 18dp badge with a 4dp
|
|
448
|
-
* white ring inside it, rendered as a plain green blob, about which the gate
|
|
449
|
-
* said nothing because no harness captured a border. Emitted ONLY from a dump
|
|
450
|
-
* that declares border capability (`styleChannels`) — an older emitter's
|
|
451
|
-
* silence is "cannot see a border", never "no border was drawn". */
|
|
452
|
-
| {
|
|
453
|
-
kind: 'border_missing';
|
|
454
|
-
elementId: string;
|
|
455
|
-
reference: string;
|
|
456
|
-
referenceWidth?: number;
|
|
457
|
-
}
|
|
458
|
-
/** A drawn border whose COLOUR differs from the design's stroke. */
|
|
459
|
-
| {
|
|
460
|
-
kind: 'border';
|
|
461
|
-
elementId: string;
|
|
462
|
-
rendered: string;
|
|
463
|
-
reference: string;
|
|
464
|
-
}
|
|
465
|
-
/** A drawn border of the right colour and the wrong THICKNESS, in dp. Its own
|
|
466
|
-
* kind so a correctly-coloured ring is never reported as a colour problem. */
|
|
467
|
-
| {
|
|
468
|
-
kind: 'border_width';
|
|
469
|
-
elementId: string;
|
|
470
|
-
rendered: number;
|
|
471
|
-
reference: number;
|
|
472
|
-
} | {
|
|
473
|
-
kind: 'text_mismatch';
|
|
474
|
-
elementId: string;
|
|
475
|
-
rendered: string;
|
|
476
|
-
reference: string;
|
|
477
|
-
} | {
|
|
478
|
-
kind: 'text_missing';
|
|
479
|
-
elementId: string;
|
|
480
|
-
reference: string;
|
|
481
|
-
}
|
|
482
|
-
/** The highlighted extent (an AnnotatedString background span) differs from
|
|
483
|
-
* the declared reference span (issue 16). `rendered` is what the render
|
|
484
|
-
* actually highlighted (all span extents, comma-joined); `reference` the
|
|
485
|
-
* substring the design highlights. */
|
|
486
|
-
| {
|
|
487
|
-
kind: 'span_mismatch';
|
|
488
|
-
elementId: string;
|
|
489
|
-
rendered: string;
|
|
490
|
-
reference: string;
|
|
491
|
-
}
|
|
492
|
-
/** The styled segment's FOREGROUND COLOR differs from the declared span
|
|
493
|
-
* color (partial-color emphasis): the extent matched, the emphasis painted
|
|
494
|
-
* the wrong color. `rendered`/`reference` are hex; `extent` names the
|
|
495
|
-
* segment. Derived only from a dump that DECLARES it can report color
|
|
496
|
-
* spans (`spanChannels`) — an old emitter's silence is never a fact. */
|
|
497
|
-
| {
|
|
498
|
-
kind: 'span_color_mismatch';
|
|
499
|
-
elementId: string;
|
|
500
|
-
extent?: string;
|
|
501
|
-
rendered: string;
|
|
502
|
-
reference: string;
|
|
503
|
-
}
|
|
504
|
-
/** The laid-out line split differs from the declared reference split
|
|
505
|
-
* (issue 18): the text wrapped on the wrong word, or dropped/added a
|
|
506
|
-
* break. `rendered`/`reference` carry the newline-joined line texts. */
|
|
507
|
-
| {
|
|
508
|
-
kind: 'line_break_mismatch';
|
|
509
|
-
elementId: string;
|
|
510
|
-
rendered: string;
|
|
511
|
-
reference: string;
|
|
512
|
-
}
|
|
513
|
-
/** The RESOLVED typeface (what actually painted, post-fallback) diverges from the
|
|
514
|
-
* design typeface in family or weight. `rendered` is the font that resolved on
|
|
515
|
-
* the render (e.g. a Roboto fallback); `reference` is the design font. The crux
|
|
516
|
-
* is "resolved, not requested": a runtime fallback reads correct at the
|
|
517
|
-
* TextStyle.fontFamily layer, so the requested family can never be the signal. */
|
|
518
|
-
| {
|
|
519
|
-
kind: 'typeface';
|
|
520
|
-
elementId: string;
|
|
521
|
-
channel: 'text';
|
|
522
|
-
rendered: TypefaceSpec;
|
|
523
|
-
reference: TypefaceSpec;
|
|
524
|
-
}
|
|
525
|
-
/** ONE type metric — size, tracking or leading — diverges from the design, in
|
|
526
|
-
* sp (typography facts 01).
|
|
527
|
-
*
|
|
528
|
-
* One fact PER METRIC rather than one carrying all three: downstream finding
|
|
529
|
-
* identity is `screen + element + category`, so two metrics folded into a
|
|
530
|
-
* single fact would collapse into one finding and silently drop the other —
|
|
531
|
-
* and the motivating case diverged in TWO of them at once (18sp against 16sp,
|
|
532
|
-
* with −0.6 tracking). A separate fact per metric is what keeps both
|
|
533
|
-
* reportable.
|
|
534
|
-
*
|
|
535
|
-
* Emitted only when BOTH sides declare the metric: a design that says nothing
|
|
536
|
-
* about tracking is not asserting 0. */
|
|
537
|
-
| {
|
|
538
|
-
kind: 'type_metric';
|
|
539
|
-
elementId: string;
|
|
540
|
-
channel: 'text';
|
|
541
|
-
metric: TypeMetricKey;
|
|
542
|
-
rendered: number;
|
|
543
|
-
reference: number;
|
|
544
|
-
}
|
|
545
|
-
/** In the reference, not rendered. */
|
|
546
|
-
| {
|
|
547
|
-
kind: 'element_missing';
|
|
548
|
-
elementId: string;
|
|
549
|
-
}
|
|
550
|
-
/** Rendered, not in the reference. */
|
|
551
|
-
| {
|
|
552
|
-
kind: 'element_extra';
|
|
553
|
-
elementId: string;
|
|
554
|
-
};
|
|
555
|
-
/** A resolved or design typeface: a font `family` plus a numeric `weight`
|
|
556
|
-
* (100–900, CSS/OpenType scale). `weight` is optional because a design
|
|
557
|
-
* annotation may name only a family (the weight is then derived from a
|
|
558
|
-
* weight-suffix token on the family, or defaults to 400 Regular). */
|
|
559
|
-
export interface TypefaceSpec {
|
|
560
|
-
family: string;
|
|
561
|
-
weight?: number;
|
|
562
|
-
/** Design-side type metrics in sp (typography facts 01), carried on the same
|
|
563
|
-
* reference entry as the family because they arrive on the same channel and
|
|
564
|
-
* describe the same thing: the type. The RENDERED side keeps them in its own
|
|
565
|
-
* map (`DumpNode.typeMetrics`), because its family capture has an API floor
|
|
566
|
-
* these do not. Each is absent when the design declares no value for it. */
|
|
567
|
-
fontSize?: number;
|
|
568
|
-
letterSpacing?: number;
|
|
569
|
-
lineHeight?: number;
|
|
570
|
-
}
|
|
571
|
-
/** The metrics a text node was laid out with, in sp. Every field optional: a
|
|
572
|
-
* style may declare a size and no tracking, and a metric declared in Em or left
|
|
573
|
-
* Unspecified is omitted rather than converted — it is not comparable against a
|
|
574
|
-
* design that declares absolute sp. */
|
|
575
|
-
export interface TypeMetrics {
|
|
576
|
-
fontSize?: number;
|
|
577
|
-
letterSpacing?: number;
|
|
578
|
-
lineHeight?: number;
|
|
579
|
-
}
|
|
580
|
-
/** The metrics a `type_metric` fact can report, in the order a finding reads
|
|
581
|
-
* them: the size first (it explains the others), then tracking, then leading. */
|
|
582
|
-
export declare const TYPE_METRIC_KEYS: readonly ["fontSize", "letterSpacing", "lineHeight"];
|
|
583
|
-
export type TypeMetricKey = (typeof TYPE_METRIC_KEYS)[number];
|
|
584
|
-
/**
|
|
585
|
-
* A reference-shaped snapshot of the render's OWN appearance — the element-id
|
|
586
|
-
* set plus per-element text/colors it produced. Persisted in the structural
|
|
587
|
-
* block so a later no-Figma render can use it as the `previous_render` baseline
|
|
588
|
-
* (the colors/text/ids to diff against), mirroring how Signal B's geometry
|
|
589
|
-
* baseline reuses the previous render's persisted `geometry`. text/color are
|
|
590
|
-
* present only for the elements that exposed them.
|
|
591
|
-
*/
|
|
592
|
-
export interface AppearanceRendered {
|
|
593
|
-
elementIds: string[];
|
|
594
|
-
text?: TextSource;
|
|
595
|
-
color?: ColorSource;
|
|
596
|
-
/** The resolved typeface per element (issue 03) — what actually painted,
|
|
597
|
-
* post-fallback. Persisted so it serves as the previous-render typeface
|
|
598
|
-
* drift baseline. */
|
|
599
|
-
typeface?: TypefaceSource;
|
|
600
|
-
}
|
|
601
|
-
export interface StructuralAppearance {
|
|
602
|
-
baseline: AppearanceBaseline;
|
|
603
|
-
facts: AppearanceFact[];
|
|
604
|
-
/** The render's own appearance, persisted as the baseline source for the next
|
|
605
|
-
* no-Figma render. Present whenever Signal C ran. */
|
|
606
|
-
rendered?: AppearanceRendered;
|
|
607
|
-
/** Signals a check that could NOT run (never a silent pass): e.g. a typeface
|
|
608
|
-
* reference was supplied but the proof rendered below SDK 31, where the
|
|
609
|
-
* resolved-typeface capture seam does not exist. Standard CI vocabulary
|
|
610
|
-
* (LLM-facing). Absent when every requested check ran. */
|
|
611
|
-
advisories?: string[];
|
|
612
|
-
}
|
|
613
|
-
/**
|
|
614
|
-
* The reference side of the appearance diff, passed into `buildStructuralBlock`.
|
|
615
|
-
* `elementIds` is the reference element-id set (Figma node ids on the `figma`
|
|
616
|
-
* baseline; the previous render's element ids on `previous_render`). This slice
|
|
617
|
-
* derives presence only; the copy/color slices extend this with reference text /
|
|
618
|
-
* colors keyed by element id.
|
|
619
|
-
*/
|
|
620
|
-
export interface AppearanceReference {
|
|
621
|
-
baseline: AppearanceBaseline;
|
|
622
|
-
elementIds: string[];
|
|
623
|
-
/** Reference text per element id (Figma `characters` on the figma baseline; the
|
|
624
|
-
* previous render's text on `previous_render`). When supplied, copy facts are
|
|
625
|
-
* derived against the render's per-node text. Absent → presence facts only. */
|
|
626
|
-
text?: TextSource;
|
|
627
|
-
/** Reference fill/text color per element id (Figma `fills` on the figma
|
|
628
|
-
* baseline; the previous render's colors on `previous_render`). When supplied,
|
|
629
|
-
* color facts are derived against the render's per-node colors. */
|
|
630
|
-
color?: ColorSource;
|
|
631
|
-
/** Declared highlight extents per element id (issue 16): the substring the
|
|
632
|
-
* design highlights on that text element (and optionally its background).
|
|
633
|
-
* When supplied, span facts are derived against the render's per-node
|
|
634
|
-
* `textSpans`. */
|
|
635
|
-
spans?: SpanSource;
|
|
636
|
-
/** Declared line splits per element id (issue 18): the exact line texts
|
|
637
|
-
* the design breaks that text element into. When supplied, line facts
|
|
638
|
-
* are derived against the render's per-node `textLines`. */
|
|
639
|
-
lines?: LineSource;
|
|
640
|
-
/** Reference typeface per element id (the DESIGN font from Figma node
|
|
641
|
-
* metadata on the figma baseline; the previous render's resolved font on
|
|
642
|
-
* `previous_render`). When supplied, typeface facts are derived against the
|
|
643
|
-
* render's per-node `resolvedTypeface`. */
|
|
644
|
-
typeface?: TypefaceSource;
|
|
645
|
-
}
|
|
646
|
-
/** The per-screen reference params the runner assembles an `AppearanceReference`
|
|
647
|
-
* from (the slices of `params.reference_*` for one screen). */
|
|
648
|
-
export interface AppearanceReferenceParams {
|
|
649
|
-
/** Per-screen `reference_geometry` (design/baseline geometry). Its keys seed
|
|
650
|
-
* the element-id set. */
|
|
651
|
-
refGeom?: ReferenceGeometry | null;
|
|
652
|
-
/** Per-screen `reference_text` (text per element id). */
|
|
653
|
-
refText?: TextSource | null;
|
|
654
|
-
/** Per-screen `reference_color` (fill/text color per element id). */
|
|
655
|
-
refColor?: ColorSource | null;
|
|
656
|
-
/** Per-screen `reference_spans` (declared highlight extents per element id). */
|
|
657
|
-
refSpans?: SpanSource | null;
|
|
658
|
-
/** Per-screen `reference_lines` (declared line split per element id). */
|
|
659
|
-
refLines?: LineSource | null;
|
|
660
|
-
/** Per-screen `reference_typeface` (the DESIGN font per element id, built by
|
|
661
|
-
* the caller from Figma node metadata — typeface issue 04). */
|
|
662
|
-
refTypeface?: TypefaceSource | null;
|
|
663
|
-
baseline: AppearanceBaseline;
|
|
664
|
-
}
|
|
665
|
-
/**
|
|
666
|
-
* Assemble the `AppearanceReference` from a screen's reference params. Issue 05
|
|
667
|
-
* decouples the appearance container from `reference_geometry`: the reference is
|
|
668
|
-
* built when ANY of geometry / text / color is present, with `elementIds` = the
|
|
669
|
-
* UNION of their keys (geometry first, then text, then color — deduped, order
|
|
670
|
-
* preserved). So a run carrying `reference_color` but no `reference_geometry` now
|
|
671
|
-
* yields a reference (→ color facts), while a geometry-only run is byte-identical
|
|
672
|
-
* to before (color/text keys are a subset). `text`/`color` are attached only when
|
|
673
|
-
* present. No reference of any kind → null (no appearance container).
|
|
674
|
-
*/
|
|
675
|
-
export declare function buildAppearanceReferenceFromParams(params: AppearanceReferenceParams): AppearanceReference | null;
|
|
676
|
-
/**
|
|
677
|
-
* Map a previous catalog render's persisted appearance snapshot
|
|
678
|
-
* (`StructuralAppearance.rendered` — element ids + per-element colors) into the
|
|
679
|
-
* `previous_render` AppearanceReference the next render diffs against. The
|
|
680
|
-
* no-Figma drift path: the colors/ids the next render compares itself to are the
|
|
681
|
-
* LAST render's, so a diverging fill surfaces as a regression (drift), marked
|
|
682
|
-
* `baseline: 'previous_render'`, distinct from a design divergence.
|
|
683
|
-
*
|
|
684
|
-
* Pure (no I/O) — the testable core the thin catalog-fetch adapter wraps,
|
|
685
|
-
* mirroring how the geometry baseline reuses the previous render's persisted
|
|
686
|
-
* `geometry`. `color` is carried only when the previous render exposed colors;
|
|
687
|
-
* a previous render with no extractable color yields a presence-only reference
|
|
688
|
-
* (element ids, no color). A genuinely absent previous render (no snapshot) →
|
|
689
|
-
* null, so the next render carries no appearance container, exactly as before.
|
|
690
|
-
* `color` (issue 01/02) and `text` (issue 03) are each carried only when the
|
|
691
|
-
* previous render exposed them; an empty map is no signal on that axis.
|
|
692
|
-
*/
|
|
693
|
-
export declare function appearanceReferenceFromPreviousRender(previous: AppearanceRendered | null | undefined): AppearanceReference | null;
|
|
694
|
-
/**
|
|
695
|
-
* Element-presence facts from the set difference of the rendered element-id set
|
|
696
|
-
* and the reference element-id set, keyed on the stable element id shared with
|
|
697
|
-
* Signal B. An id present in the reference but not rendered is `element_missing`;
|
|
698
|
-
* an id rendered but not in the reference is `element_extra`.
|
|
699
|
-
*
|
|
700
|
-
* Pure and platform-agnostic: it takes two id collections and is order-
|
|
701
|
-
* independent — the result depends only on the two SETS, not on input order or
|
|
702
|
-
* duplicates. Output is sorted (missing before extra, each by id) so callers get
|
|
703
|
-
* a deterministic list. The deriver reports facts only; significance is a later,
|
|
704
|
-
* separately-wired concern.
|
|
705
|
-
*/
|
|
706
|
-
export declare function derivePresenceFacts(renderedIds: Iterable<string>, referenceIds: Iterable<string>): AppearanceFact[];
|
|
707
|
-
/** Per-element text content, keyed on the stable element id (rendered text from
|
|
708
|
-
* the layout dump's per-node `text`; reference text from the Figma node tree's
|
|
709
|
-
* `characters`). A missing or empty string means "no text signal for that
|
|
710
|
-
* element," which the deriver treats as absence, never a divergence. */
|
|
711
|
-
export type TextSource = Record<string, string | undefined>;
|
|
712
|
-
/**
|
|
713
|
-
* Copy/text facts from the per-element comparison of rendered text vs reference
|
|
714
|
-
* text, keyed on the stable element id shared with Signal B. For each element the
|
|
715
|
-
* REFERENCE declares text for: identical text → no fact; a different rendered
|
|
716
|
-
* string → `text_mismatch` (both strings attached); empty/absent rendered text →
|
|
717
|
-
* `text_missing`. An element with no reference text signal produces no fact —
|
|
718
|
-
* absence of a signal is never reported as a divergence, so a rendered string the
|
|
719
|
-
* reference never declared is silent.
|
|
720
|
-
*
|
|
721
|
-
* Pure and platform-agnostic; order-independent and deterministic (output sorted
|
|
722
|
-
* by element id). The deriver reports facts only; significance is a later,
|
|
723
|
-
* separately-wired concern.
|
|
724
|
-
*/
|
|
725
|
-
export declare function deriveCopyFacts(rendered: TextSource, reference: TextSource): AppearanceFact[];
|
|
726
|
-
/** Declared highlight extent per element id: the substring the design
|
|
727
|
-
* highlights on that text element (an AnnotatedString background span),
|
|
728
|
-
* optionally with its background color. A missing/empty `text` is "no span
|
|
729
|
-
* signal for that element" — never a divergence. */
|
|
730
|
-
export type SpanSource = Record<string, {
|
|
731
|
-
text?: string;
|
|
732
|
-
background?: string;
|
|
733
|
-
color?: string;
|
|
734
|
-
} | undefined>;
|
|
735
|
-
/** The rendered highlight extents per element id — each node's `textSpans`
|
|
736
|
-
* from the layout dump. `undefined` for a node that emitted no spans (an
|
|
737
|
-
* old package, or a spanless text): no signal, never a divergence. */
|
|
738
|
-
export type RenderedSpans = Record<string, TextSpan[] | undefined>;
|
|
739
|
-
/**
|
|
740
|
-
* Span facts (issue 16 + color spans) from the per-element comparison of
|
|
741
|
-
* rendered styled extents vs the declared reference span, keyed on the stable
|
|
742
|
-
* element id. Channel-scoped: a `background` declaration (highlight chip)
|
|
743
|
-
* compares against background-carrying rendered spans; a `color` declaration
|
|
744
|
-
* (partial foreground emphasis) against color-carrying ones — a color-only
|
|
745
|
-
* rendered span never satisfies a chip declaration. A channel-less
|
|
746
|
-
* declaration ({text} only) keeps its legacy semantics (any extent matches).
|
|
747
|
-
*
|
|
748
|
-
* Capability gate: the COLOR channel compares only when `colorCapable` is
|
|
749
|
-
* true (the dump's `spanChannels` marker includes "color") — an old
|
|
750
|
-
* emitter's silence is "cannot see", never "no color span rendered". Within
|
|
751
|
-
* a capable dump, an ABSENT `textSpans` is a real absence for a color
|
|
752
|
-
* declaration (the segment rendered unstyled); background/legacy
|
|
753
|
-
* declarations keep the old-package tolerance (no spans array → no fact).
|
|
754
|
-
* A wrong extent on either channel is one `span_mismatch`; a matching extent
|
|
755
|
-
* whose color diverges is a `span_color_mismatch` carrying both hex values.
|
|
756
|
-
*
|
|
757
|
-
* Pure and platform-agnostic; order-independent and deterministic (output
|
|
758
|
-
* sorted by element id). The deriver reports facts only; significance is a
|
|
759
|
-
* later, separately-wired concern.
|
|
760
|
-
*/
|
|
761
|
-
export declare function deriveSpanFacts(rendered: RenderedSpans, reference: SpanSource, colorCapable?: boolean): AppearanceFact[];
|
|
762
|
-
/** Declared line split per element id (issue 18): the exact line texts the
|
|
763
|
-
* design breaks that text element into, in order. A missing/empty array (or
|
|
764
|
-
* one with no usable line text) is "no line signal for that element" —
|
|
765
|
-
* never a divergence. */
|
|
766
|
-
export type LineSource = Record<string, string[] | undefined>;
|
|
767
|
-
/** The rendered laid-out lines per element id — each node's `textLines` from
|
|
768
|
-
* the layout dump. `undefined` for a node that emitted no lines (an old
|
|
769
|
-
* package, or a node that lays out no text): no signal, never a divergence. */
|
|
770
|
-
export type RenderedLines = Record<string, TextLine[] | undefined>;
|
|
771
|
-
/**
|
|
772
|
-
* Line facts (issue 18) from the per-element comparison of the rendered
|
|
773
|
-
* laid-out lines vs the declared reference split, keyed on the stable element
|
|
774
|
-
* id. For each element the REFERENCE declares a split for: rendered line
|
|
775
|
-
* texts equal to the declared line texts (same count, same order) → no fact;
|
|
776
|
-
* anything else — the break on a different word, a dropped break (fewer
|
|
777
|
-
* lines), an extra break — is ONE `line_break_mismatch` carrying both splits
|
|
778
|
-
* newline-joined. An element whose node emitted NO lines produces no fact —
|
|
779
|
-
* old committed packages don't emit `textLines`, and absence of a signal is
|
|
780
|
-
* never reported as a divergence (regenerating the package picks it up).
|
|
781
|
-
*
|
|
782
|
-
* Pure and platform-agnostic; order-independent and deterministic (output
|
|
783
|
-
* sorted by element id). The deriver reports facts only; significance is a
|
|
784
|
-
* later, separately-wired concern.
|
|
785
|
-
*/
|
|
786
|
-
export declare function deriveLineFacts(rendered: RenderedLines, reference: LineSource): AppearanceFact[];
|
|
787
|
-
/** CIELAB triple [L, a, b]. */
|
|
788
|
-
export type Lab = [number, number, number];
|
|
789
|
-
/** One element's rendered/reference colors, by channel. A missing channel is
|
|
790
|
-
* "no color signal" for that element/channel — never a divergence. */
|
|
791
|
-
export interface ElementColors {
|
|
792
|
-
fill?: string;
|
|
793
|
-
text?: string;
|
|
794
|
-
/** Per-channel alpha 0..1 (issue 14b), present only when translucent. */
|
|
795
|
-
fillAlpha?: number;
|
|
796
|
-
textAlpha?: number;
|
|
797
|
-
/** The BORDER colour (property-recognizer 01) — the design calls this a
|
|
798
|
-
* `stroke`, and both sides use that name so they line up. On the reference
|
|
799
|
-
* side it comes from `colors[key].stroke`; on the rendered side from the
|
|
800
|
-
* dump's `borderColor`. */
|
|
801
|
-
stroke?: string;
|
|
802
|
-
/** Border thickness in DP on both sides — the harness reads `Dp.value` and the
|
|
803
|
-
* design's `strokeWeight` is in design units, so unlike bounds this is never
|
|
804
|
-
* divided by density. */
|
|
805
|
-
strokeWeight?: number;
|
|
806
|
-
}
|
|
807
|
-
export type ColorSource = Record<string, ElementColors>;
|
|
808
|
-
/**
|
|
809
|
-
* Convert an sRGB hex string to CIELAB (D65). White → ~[100,0,0], black → L 0.
|
|
810
|
-
* Returns [0,0,0] for an unparseable string so a malformed color never throws
|
|
811
|
-
* (the deriver guards on signal presence separately).
|
|
812
|
-
*/
|
|
813
|
-
export declare function hexToLab(hex: string): Lab;
|
|
814
|
-
/**
|
|
815
|
-
* CIEDE2000 colour-difference ΔE00 between two CIELAB colours (kL=kC=kH=1).
|
|
816
|
-
* Implements Sharma, Wu & Dalal (2005); validated against their supplementary
|
|
817
|
-
* test data. Pure and symmetric; identical colours give 0.
|
|
818
|
-
*/
|
|
819
|
-
export declare function ciede2000(lab1: Lab, lab2: Lab): number;
|
|
820
|
-
/**
|
|
821
|
-
* Border facts (property-recognizer 01) — the design's `stroke` against the
|
|
822
|
-
* render's captured border. THE case this exists for: an 18dp badge with a 4dp
|
|
823
|
-
* white ring inside it rendered as a plain green blob, about which the gate said
|
|
824
|
-
* nothing at all, because the design's stroke lived in an authoring hint and the
|
|
825
|
-
* dump captured no border. Nothing compared, so an unmeasured property read as a
|
|
826
|
-
* pass.
|
|
827
|
-
*
|
|
828
|
-
* The DESIGN is the only side that raises the question, exactly as with alpha: an
|
|
829
|
-
* entry with no declared `stroke` is skipped, so a wrapper adding a ring the
|
|
830
|
-
* design never asked for is not something this calls wrong.
|
|
831
|
-
*
|
|
832
|
-
* Three kinds, because they are three different fixes — absent / wrong colour /
|
|
833
|
-
* wrong thickness. Folding width into `border` would report "the ring is the
|
|
834
|
-
* wrong colour" about a ring whose colour is exactly right.
|
|
835
|
-
*
|
|
836
|
-
* `capable` gates the ABSENCE case only, and both directions of that gate are
|
|
837
|
-
* wrong in a way worth naming: without it, a border-blind dump would fire
|
|
838
|
-
* `border_missing` on every stroked design in the catalogue; with it applied too
|
|
839
|
-
* broadly, a real divergence on a capable dump would go unreported. A colour or
|
|
840
|
-
* width difference is a genuine measurement either way — only "I saw no border"
|
|
841
|
-
* depends on being able to see borders at all.
|
|
842
|
-
*
|
|
843
|
-
* Pure and platform-agnostic; deterministic (sorted by element id). Mirrors the
|
|
844
|
-
* CLI preview twin in `packages/cli/lib/fidelity-structural.mjs`.
|
|
845
|
-
*/
|
|
846
|
-
export declare function deriveBorderFacts(rendered: ColorSource, reference: ColorSource, capable: boolean): AppearanceFact[];
|
|
847
|
-
/**
|
|
848
|
-
* Color facts from the per-element, per-channel comparison of rendered vs
|
|
849
|
-
* reference color, keyed on the stable element id shared with Signal B. For each
|
|
850
|
-
* element/channel the REFERENCE declares a color for and the render also exposes
|
|
851
|
-
* one: identical color → no fact; any divergence → a `color` fact carrying the
|
|
852
|
-
* channel (fill vs text), both hex values, and the CIEDE2000 ΔE as the metric.
|
|
853
|
-
* Fill and text are distinct channels, so a correct background with a wrong text
|
|
854
|
-
* color and the reverse are separate facts, never collapsed. A missing rendered
|
|
855
|
-
* or reference color for a channel is no signal → no fact.
|
|
856
|
-
*
|
|
857
|
-
* Pure and platform-agnostic; order-independent and deterministic (output sorted
|
|
858
|
-
* by element id then channel, fill before text). Measurement only — significance
|
|
859
|
-
* is a later, separately-wired concern.
|
|
860
|
-
*/
|
|
861
|
-
export declare function deriveColorFacts(rendered: ColorSource, reference: ColorSource): AppearanceFact[];
|
|
862
|
-
/** One element's resolved/design typeface, by the (single) text channel. */
|
|
863
|
-
export type TypefaceSource = Record<string, TypefaceSpec | undefined>;
|
|
864
|
-
/**
|
|
865
|
-
* Typeface facts from the per-element comparison of the RESOLVED render font vs the
|
|
866
|
-
* DESIGN reference font, keyed on the stable element id shared with Signal B. For
|
|
867
|
-
* each element the reference declares a typeface for and the render also resolved
|
|
868
|
-
* one: normalize both (family-name + weight-encoding) and emit a `typeface` fact
|
|
869
|
-
* when the normalized family OR weight differs. A normalization-equivalent pair
|
|
870
|
-
* ("Poppins-SemiBold" vs "Poppins" + 600) yields no fact. A missing rendered or
|
|
871
|
-
* reference font for an element is no signal → no fact (graceful, no false
|
|
872
|
-
* positive). The fact carries the raw `rendered`/`reference` specs as given, so the
|
|
873
|
-
* finding names the actual fonts.
|
|
874
|
-
*
|
|
875
|
-
* Pure and platform-agnostic; order-independent and deterministic (output sorted by
|
|
876
|
-
* element id). Measurement only — significance is a later, separately-wired concern.
|
|
877
|
-
*/
|
|
878
|
-
export declare function deriveTypefaceFacts(rendered: TypefaceSource, reference: TypefaceSource): AppearanceFact[];
|
|
879
|
-
/** Per-element type metrics, keyed like every other appearance source. */
|
|
880
|
-
export type TypeMetricSource = Record<string, TypeMetrics | undefined>;
|
|
881
|
-
/**
|
|
882
|
-
* Type-metric facts from the per-element comparison of the LAID-OUT metrics
|
|
883
|
-
* against the design's, keyed on the stable element id shared with Signal B.
|
|
884
|
-
*
|
|
885
|
-
* For each element the reference declares and the render measured, each of the
|
|
886
|
-
* three metrics is compared independently and emits its own fact when the two
|
|
887
|
-
* differ by more than the sub-unit tolerance. A metric missing on EITHER side is
|
|
888
|
-
* no signal and yields no fact — a design that declares no tracking is not
|
|
889
|
-
* asserting zero, and a style that leaves leading Unspecified has not chosen a
|
|
890
|
-
* value to be wrong about.
|
|
891
|
-
*
|
|
892
|
-
* Pure and platform-agnostic; deterministic (sorted by element id, then by the
|
|
893
|
-
* metric order a finding reads them in). Measurement only — significance and
|
|
894
|
-
* wording live downstream.
|
|
895
|
-
*/
|
|
896
|
-
export declare function deriveTypeMetricFacts(rendered: TypeMetricSource, reference: TypefaceSource): AppearanceFact[];
|
|
897
|
-
/**
|
|
898
|
-
* Assemble the inline `structural` block (ADR-0004): Signal-A facts always, plus
|
|
899
|
-
* the Signal-B geometry block when `referenceGeometry` is supplied. Size (w/h)
|
|
900
|
-
* deltas drive `sizeFlag`/`summary.clean`; x/y position deltas are reported but
|
|
901
|
-
* never flagged (canvas-width artifact). Mirrors Invarn's `buildStructuralBlock`.
|
|
902
|
-
*/
|
|
903
|
-
export declare function buildStructuralBlock(dump: LayoutDump, referenceGeometry?: ReferenceGeometry | null, density?: number, options?: {
|
|
904
|
-
sizeTolerancePx?: number;
|
|
905
|
-
overhangTolerancePx?: number;
|
|
906
|
-
}, appearanceReference?: AppearanceReference | null, referenceFrame?: ReferenceFrame | null, anchorFrame?: ReferenceFrame | null): StructuralBlock;
|
|
907
|
-
export interface ReviewRow {
|
|
908
|
-
element: string;
|
|
909
|
-
rendered: string | null;
|
|
910
|
-
design: string | null;
|
|
911
|
-
fact: string;
|
|
912
|
-
verdict: null;
|
|
913
|
-
}
|
|
914
|
-
export interface ReviewScaffold {
|
|
915
|
-
verdict: null;
|
|
916
|
-
mustExplain: string[];
|
|
917
|
-
rows: ReviewRow[];
|
|
918
|
-
}
|
|
919
|
-
/**
|
|
920
|
-
* Build the run-only `review` scaffold from an assembled structural block:
|
|
921
|
-
* size-flagged geometry elements first (load-bearing), then every structural
|
|
922
|
-
* fact, each as a row with a null `verdict` the agent must replace.
|
|
923
|
-
*/
|
|
924
|
-
export declare function buildReviewScaffold(structural: {
|
|
925
|
-
facts?: StructuralFact[];
|
|
926
|
-
geometry?: StructuralGeometry | null;
|
|
927
|
-
}): ReviewScaffold;
|
|
928
|
-
/**
|
|
929
|
-
* Render-side embedded form of the deriver.
|
|
930
|
-
*
|
|
931
|
-
* The Android render runs as a single self-contained generated script (see
|
|
932
|
-
* `generateAndroidRenderScript`), so render-side pure logic is embedded as a
|
|
933
|
-
* JS-source string and concatenated in — exactly like `RENDER_SCRIPT_TRIM_STAGE`.
|
|
934
|
-
* The typed `deriveStructuralFacts` above stays the canonical, tested spec; the
|
|
935
|
-
* `parity` test asserts this embedded port produces identical facts on shared
|
|
936
|
-
* fixtures so the two cannot drift.
|
|
937
|
-
*
|
|
938
|
-
* `deriveStructuralFacts` here is pure; `deriveAndWriteFacts` references runtime
|
|
939
|
-
* globals (`fs`, `path`, `artifactsDir`, `log`) defined in the main script and
|
|
940
|
-
* is only invoked from there — harmless to define in the eval sandbox.
|
|
941
|
-
*/
|
|
942
|
-
export declare const RENDER_SCRIPT_FACTS_STAGE: string;
|
|
943
|
-
/**
|
|
944
|
-
* Evaluates the embedded facts stage and returns its pure `deriveStructuralFacts`,
|
|
945
|
-
* so the parity test exercises exactly the code that ships in the runtime script
|
|
946
|
-
* (mirrors `getPostProcessorInternals`). `deriveAndWriteFacts` references runtime
|
|
947
|
-
* globals only when called, so defining it in the sandbox is harmless.
|
|
948
|
-
*/
|
|
949
|
-
export declare function getStructuralFactsStageInternals(): {
|
|
950
|
-
deriveStructuralFacts: (dump: LayoutDump, options?: DeriveStructuralFactsOptions) => StructuralFact[];
|
|
951
|
-
};
|
|
952
|
-
/**
|
|
953
|
-
* Render-side embedded form of the Signal-B differ + structural-block assembler.
|
|
954
|
-
*
|
|
955
|
-
* Concatenated into the generated render script alongside `RENDER_SCRIPT_FACTS_STAGE`
|
|
956
|
-
* (function declarations hoist, so order does not matter — `buildStructuralBlock`
|
|
957
|
-
* calls the facts stage's `deriveStructuralFacts`). `assembleStructural` references
|
|
958
|
-
* runtime globals (`fs`, `path`, `log`) defined in the main script and is only
|
|
959
|
-
* invoked from there. Kept byte-equivalent to the typed `buildStructuralBlock` /
|
|
960
|
-
* `diffKeyGeometry` above by the parity test, so run-side and preview-side (Invarn)
|
|
961
|
-
* structural blocks cannot drift.
|
|
962
|
-
*/
|
|
963
|
-
export declare const RENDER_SCRIPT_GEOMETRY_STAGE: string;
|
|
964
|
-
/**
|
|
965
|
-
* Evaluates the embedded facts + geometry stages together (mirroring how the
|
|
966
|
-
* render script concatenates them) and returns the pure `diffKeyGeometry` +
|
|
967
|
-
* `buildStructuralBlock`, so the parity test exercises exactly the shipped code.
|
|
968
|
-
*/
|
|
969
|
-
export declare function getGeometryStageInternals(): {
|
|
970
|
-
diffKeyGeometry: (generated: GeometrySource, reference: GeometrySource | null | undefined, options?: {
|
|
971
|
-
tolerancePx?: number;
|
|
972
|
-
}) => GeometryDelta[];
|
|
973
|
-
buildStructuralBlock: (dump: LayoutDump, referenceGeometry?: ReferenceGeometry | null, density?: number, options?: {
|
|
974
|
-
sizeTolerancePx?: number;
|
|
975
|
-
overhangTolerancePx?: number;
|
|
976
|
-
}, appearanceReference?: AppearanceReference | null, referenceFrame?: ReferenceFrame | null, anchorFrame?: ReferenceFrame | null) => StructuralBlock;
|
|
977
|
-
buildReviewScaffold: (structural: {
|
|
978
|
-
facts?: StructuralFact[];
|
|
979
|
-
geometry?: StructuralGeometry | null;
|
|
980
|
-
}) => ReviewScaffold;
|
|
981
|
-
derivePresenceFacts: (renderedIds: Iterable<string>, referenceIds: Iterable<string>) => AppearanceFact[];
|
|
982
|
-
deriveCopyFacts: (rendered: TextSource, reference: TextSource) => AppearanceFact[];
|
|
983
|
-
deriveSpanFacts: (rendered: RenderedSpans, reference: SpanSource) => AppearanceFact[];
|
|
984
|
-
deriveLineFacts: (rendered: RenderedLines, reference: LineSource) => AppearanceFact[];
|
|
985
|
-
deriveColorFacts: (rendered: ColorSource, reference: ColorSource) => AppearanceFact[];
|
|
986
|
-
deriveTypefaceFacts: (rendered: TypefaceSource, reference: TypefaceSource) => AppearanceFact[];
|
|
987
|
-
deriveTypeMetricFacts: (rendered: TypeMetricSource, reference: TypefaceSource) => AppearanceFact[];
|
|
988
|
-
buildAppearanceReferenceFromParams: (params: AppearanceReferenceParams) => AppearanceReference | null;
|
|
989
|
-
ciede2000: (lab1: Lab, lab2: Lab) => number;
|
|
990
|
-
hexToLab: (hex: string) => Lab;
|
|
991
|
-
};
|
|
992
|
-
//# sourceMappingURL=structural-facts.d.ts.map
|