Skip to content

fix(app-shell): bridge Is null to the spec's $null instead of erasing the dataset filter #5105

fix(app-shell): bridge Is null to the spec's $null instead of erasing the dataset filter

fix(app-shell): bridge Is null to the spec's $null instead of erasing the dataset filter #5105

name: Pre-Install Import Graph
# Why this is its own workflow rather than a step in `lint.yml` or `ci.yml`:
# what it judges is the ARRANGEMENT of the workflows themselves — which steps
# run a `scripts/` gate before their job installs anything. Its whole input is
# `.github/workflows/**` plus the `scripts/` files those steps name, so a run
# lives or dies on files that both `ci.yml` and `lint.yml` keep OUT of their
# expensive lanes. Putting it inside either one would make it skip on exactly
# the change most likely to break it: a workflow edit that moves a step across
# `pnpm install`.
#
# Same shape and the same reasoning as `docs-links.yml`, `control-bytes.yml`,
# `skills-paths.yml` and `changeset-presence.yml`, whose headers record the
# conclusion this repository reached four times already — a gate that cannot see
# the PR shape most likely to trip it "rebuilds the hole it exists to close".
# One gate, one home.
#
# Hence: no `paths` and no `paths-ignore` here, deliberately. Reporting on every
# pull request is also what makes the check requirable, and
# `scripts/dependabot-merge-gate.mjs` classifies it as a required context —
# an unclassified blocking check is one a Dependabot merge would be let past
# (objectui#6135).
#
# It needs no install and no build — a checkout plus one `node` call over every
# file in `.github/workflows/` and the `scripts/` gates their pre-install steps
# name, well under a second. ⛔ No population count here, deliberately: this
# sentence used to state one as a literal, it went stale by double digits, and
# nothing went red over that whole distance, because nothing fails on a number
# written in a comment (objectui#8606, objectui#7448). The population is DERIVED
# from `.github/workflows/` on every run, so the live reading is a command —
# `node scripts/check-pre-install-import-graph.mjs --list` prints it — and
# `scripts/__tests__/check-pre-install-import-graph.test.ts` refuses a count
# written back here. Keep it that way: the gate exists to protect install-free
# gates, so an install here would be the joke telling itself.
on:
pull_request:
branches: [main, develop]
push:
branches: [main, develop]
# Merge queue (objectui#3523 — see `ci.yml`'s trigger block for the full note
# and the measurements behind it). A required check that does not report on a
# queue build stalls the queue until the ruleset's 60-minute timeout fails it,
# so an unfiltered gate that can become required subscribes here from the
# start. `types:` is named although `checks_requested` is currently the only
# activity type GitHub defines for `merge_group`.
merge_group:
types: [checks_requested]
workflow_dispatch:
concurrency:
group: pre-install-import-graph-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
pre-install-import-graph:
name: Pre-Install Import Graph Check
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout code
uses: actions/checkout@v7
- name: Setup Node.js
uses: actions/setup-node@v7
with:
node-version: '22.x'
# Two legs, in this order and in one step, for the reason `lint.yml` runs
# the entry-guard gate the same way: a scan whose recogniser is broken
# reports a clean tree. The self-test pins the workflow parser and the
# graph walk against fixtures, so a green scan below means something.
#
# This step is itself in the population the gate derives — it runs a
# `scripts/` file before any install, in a job that never installs — so
# the gate walks its own import graph on every run. That is deliberate: a
# floor that exempted its own enforcer would be the first thing to rot.
- name: Check the pre-install gates' import graphs
run: |
node scripts/check-pre-install-import-graph.mjs --self-test
node scripts/check-pre-install-import-graph.mjs