From ea52bec3f3031edfd2edd07a4466d8b14ccc37a0 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Thu, 30 Apr 2026 14:11:28 -0600 Subject: [PATCH 1/9] ci: Add CI step to check if precompiled regl shaders need to be updated --- .github/workflows/ci.yml | 44 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 79a69597525..fdc74633b3a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,6 +23,7 @@ jobs: outputs: stackgl_modules: ${{ steps.check.outputs.stackgl_modules }} topojson: ${{ steps.check.outputs.topojson }} + regl_codegen: ${{ steps.check.outputs.regl_codegen }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: @@ -42,6 +43,9 @@ jobs: if git diff --name-only "$BASE"...HEAD -- stackgl_modules/ | grep -q .; then echo "stackgl_modules=true" >> "$GITHUB_OUTPUT" fi + if git diff --name-only "$BASE"...HEAD -- src/traces/scattergl/ src/traces/scatterpolargl/ src/traces/splom/ src/traces/parcoords/ src/lib/prepare_regl.js stackgl_modules/ devtools/regl_codegen/ | grep -q .; then + echo "regl_codegen=true" >> "$GITHUB_OUTPUT" + fi # ============================================================ # Root build job - all dependent jobs fan out from here @@ -753,3 +757,43 @@ jobs: name: topojson-dist retention-days: 7 path: topojson/dist/ + + check-regl-codegen: + needs: [detect-changes, install-and-cibuild] + if: needs.detect-changes.outputs.regl_codegen == 'true' + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: ./.github/actions/setup-workspace + - uses: ./.github/actions/setup-chrome + + - name: Run regl codegen + run: | + node devtools/regl_codegen/server.mjs & + SERVER_PID=$! + until curl -sf -o /dev/null http://localhost:3000/build/regl_codegen-bundle.js 2>/dev/null; do + sleep 1 + done + $CHROME_BIN --headless=new --no-sandbox --enable-unsafe-swiftshader --ignore-gpu-blocklist http://localhost:3000/devtools/regl_codegen/index.html & + wait $SERVER_PID + + - name: Check regl precompiled shaders are up to date + run: | + if ! git diff --exit-code src/generated/regl-codegen/ src/traces/scattergl/regl_precompiled.js src/traces/scatterpolargl/regl_precompiled.js src/traces/splom/regl_precompiled.js src/traces/parcoords/regl_precompiled.js; then + echo "::error::Regl precompiled shaders are out of date. Download the 'regl-codegen' artifact from this workflow run and commit the updated files to this pull request." + exit 1 + fi + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + name: Upload updated regl codegen files + if: failure() + with: + name: regl-codegen + retention-days: 7 + path: | + src/generated/regl-codegen/ + src/traces/scattergl/regl_precompiled.js + src/traces/scatterpolargl/regl_precompiled.js + src/traces/splom/regl_precompiled.js + src/traces/parcoords/regl_precompiled.js From 3417dd7840a186ef5a3677c3f3dd971657c63a4b Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Thu, 30 Apr 2026 14:11:39 -0600 Subject: [PATCH 2/9] Update docs --- CONTRIBUTING.md | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d7cfa2bd96c..1a089e31387 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -163,18 +163,31 @@ npm run schema #### Step 9: REGL - Review & commit potential changes to precompiled regl shaders If you are implementing a new feature that involves regl shaders, or if you are -making changes that affect the usage of regl shaders, you would need to run +making changes that affect the usage of regl shaders, you would need to regenerate the precompiled regl shader code. + +This is needed because regl performs codegen in runtime which breaks CSP +compliance, and so for strict builds we pre-generate regl shader code here. + +The CI pipeline will automatically detect when regl-related files have changed and +run the codegen process. If the precompiled shaders are out of date, the +`check-regl-codegen` job will fail and upload a `regl-codegen` artifact containing +the updated files. To fix this: + +1. Download the `regl-codegen` artifact from the failed workflow run +2. Copy the updated files into your working tree +3. Commit and push the changes to your pull request + +Alternatively, you can regenerate the code locally by running: ```bash npm run regl-codegen ``` -to regenerate the regl code. This will prompt you to open a browser window. This will then run through all -traces with 'regl' in the tags, and store the captured code into -[src/generated/regl-codegen](https://github.com/plotly/plotly.js/blob/master/src/generated/regl-codegen). If no updates are necessary, it will be a no-op, but if there are changes, you will need to commit them. - -This is needed because regl performs codegen in runtime which breaks CSP -compliance, and so for strict builds we pre-generate regl shader code here. +This will prompt you to open a browser window, run through all traces with 'regl' +in the tags, and store the captured code into +[src/generated/regl-codegen](https://github.com/plotly/plotly.js/blob/master/src/generated/regl-codegen). +If no updates are necessary, it will be a no-op, but if there are changes, you +will need to commit them. #### Other npm scripts that may be of interest in development From c79c346a98c95a12ae0e1d29f5347621c18b1a09 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Wed, 20 May 2026 07:46:37 -0600 Subject: [PATCH 3/9] Handle new shader filenames --- .github/workflows/ci.yml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fdc74633b3a..3f4e8d8cbc4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,6 +43,8 @@ jobs: if git diff --name-only "$BASE"...HEAD -- stackgl_modules/ | grep -q .; then echo "stackgl_modules=true" >> "$GITHUB_OUTPUT" fi + # stackgl_modules/ is listed here too because the regl-* shader libs live there; + # changes can alter shader output and require regenerating the precompiled shaders. if git diff --name-only "$BASE"...HEAD -- src/traces/scattergl/ src/traces/scatterpolargl/ src/traces/splom/ src/traces/parcoords/ src/lib/prepare_regl.js stackgl_modules/ devtools/regl_codegen/ | grep -q .; then echo "regl_codegen=true" >> "$GITHUB_OUTPUT" fi @@ -760,7 +762,9 @@ jobs: check-regl-codegen: needs: [detect-changes, install-and-cibuild] - if: needs.detect-changes.outputs.regl_codegen == 'true' + if: >- + (github.event_name == 'push' && github.ref_name == github.event.repository.default_branch) || + needs.detect-changes.outputs.regl_codegen == 'true' runs-on: ubuntu-latest timeout-minutes: 10 steps: @@ -770,6 +774,8 @@ jobs: - name: Run regl codegen run: | + # Wipe the codegen output dir so orphaned shader files surface as deletions in the diff below. + rm -rf src/generated/regl-codegen/* node devtools/regl_codegen/server.mjs & SERVER_PID=$! until curl -sf -o /dev/null http://localhost:3000/build/regl_codegen-bundle.js 2>/dev/null; do @@ -780,7 +786,14 @@ jobs: - name: Check regl precompiled shaders are up to date run: | - if ! git diff --exit-code src/generated/regl-codegen/ src/traces/scattergl/regl_precompiled.js src/traces/scatterpolargl/regl_precompiled.js src/traces/splom/regl_precompiled.js src/traces/parcoords/regl_precompiled.js; then + # git add -N so newly-generated (untracked) shader files show up in git diff + git add -N src/generated/regl-codegen/ + if ! git diff --exit-code \ + src/generated/regl-codegen/ \ + src/traces/scattergl/regl_precompiled.js \ + src/traces/scatterpolargl/regl_precompiled.js \ + src/traces/splom/regl_precompiled.js \ + src/traces/parcoords/regl_precompiled.js; then echo "::error::Regl precompiled shaders are out of date. Download the 'regl-codegen' artifact from this workflow run and commit the updated files to this pull request." exit 1 fi From 6f6627462ea42e193c0ecdebc8971aad301e5e2f Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Wed, 20 May 2026 14:27:00 -0600 Subject: [PATCH 4/9] Update docs --- CONTRIBUTING.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1a089e31387..79aaa918ccb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -171,23 +171,30 @@ compliance, and so for strict builds we pre-generate regl shader code here. The CI pipeline will automatically detect when regl-related files have changed and run the codegen process. If the precompiled shaders are out of date, the `check-regl-codegen` job will fail and upload a `regl-codegen` artifact containing -the updated files. To fix this: +the updated files. The artifact represents the full desired state of the codegen +output (CI wipes the output directory before regenerating, so any orphaned shader +files are pruned). To fix this: 1. Download the `regl-codegen` artifact from the failed workflow run -2. Copy the updated files into your working tree +2. Delete `src/generated/regl-codegen/` in your working tree, then unzip the + artifact at the repo root so it replaces (rather than merges into) the + existing directory. Also overwrite the four `regl_precompiled.js` files + under `src/traces/{scattergl,scatterpolargl,splom,parcoords}/`. 3. Commit and push the changes to your pull request -Alternatively, you can regenerate the code locally by running: +Alternatively, you can regenerate the code locally: ```bash +rm -rf src/generated/regl-codegen/* npm run regl-codegen ``` -This will prompt you to open a browser window, run through all traces with 'regl' -in the tags, and store the captured code into +The `rm -rf` mirrors what CI does, so any orphaned shader files left over from +previous changes get cleaned up. `npm run regl-codegen` will prompt you to open a +browser window, run through all traces with 'regl' in the tags, and store the +captured code into [src/generated/regl-codegen](https://github.com/plotly/plotly.js/blob/master/src/generated/regl-codegen). -If no updates are necessary, it will be a no-op, but if there are changes, you -will need to commit them. +Commit any changes that result. #### Other npm scripts that may be of interest in development From 42b3c85a5a6d8b087531848b7ccf272ac4a7096a Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Wed, 20 May 2026 15:02:35 -0600 Subject: [PATCH 5/9] Update script to have deterministic file order --- devtools/regl_codegen/server.mjs | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/devtools/regl_codegen/server.mjs b/devtools/regl_codegen/server.mjs index 8986f919f84..daa2dd43601 100644 --- a/devtools/regl_codegen/server.mjs +++ b/devtools/regl_codegen/server.mjs @@ -85,16 +85,20 @@ function handleCodegen(data) { var exports = ['', '/* eslint-disable quote-props */', 'module.exports = {', ''].join('\n'); var varId = 0; - Object.entries(generated).forEach(function (kv) { - var key = kv[0]; - var value = kv[1]; - var filePath = path.join(pathToReglCodegenSrc, key); - fs.writeFileSync(filePath, 'module.exports = ' + value); - - imports += 'var v' + varId + " = require('../../" + path.join(constants.reglCodegenSubdir, key) + "');\n"; - exports += " '" + key + "': v" + varId + ',\n'; - varId++; - }); + // Sort by shader-hash key so the emitted import/export order is deterministic + // across machines (fs.readdir mock order varies by OS/filesystem, which would + // otherwise leak into regl_precompiled.js). + Object.keys(generated) + .sort() + .forEach((key) => { + var value = generated[key]; + var filePath = path.join(pathToReglCodegenSrc, key); + fs.writeFileSync(filePath, 'module.exports = ' + value); + + imports += 'var v' + varId + " = require('../../" + path.join(constants.reglCodegenSubdir, key) + "');\n"; + exports += " '" + key + "': v" + varId + ',\n'; + varId++; + }); if (varId > 0) { exports = exports.slice(0, -2) + '\n};\n'; From 4213feb5c36f43d31d8e34be37136c2961ebfec2 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Wed, 20 May 2026 15:03:18 -0600 Subject: [PATCH 6/9] Update file order in precompiled scripts to match deterministic order --- src/traces/parcoords/regl_precompiled.js | 16 ++++----- src/traces/scattergl/regl_precompiled.js | 36 +++++++++---------- src/traces/scatterpolargl/regl_precompiled.js | 36 +++++++++---------- src/traces/splom/regl_precompiled.js | 36 +++++++++---------- 4 files changed, 62 insertions(+), 62 deletions(-) diff --git a/src/traces/parcoords/regl_precompiled.js b/src/traces/parcoords/regl_precompiled.js index 09914bcb5c2..4d487a9a53a 100644 --- a/src/traces/parcoords/regl_precompiled.js +++ b/src/traces/parcoords/regl_precompiled.js @@ -1,13 +1,13 @@ 'use strict'; -var v0 = require('../../generated/regl-codegen/453a70fefa48db31713162aeb1ac438cb8579f54504f3b23acf32128df3dfd45'); -var v1 = require('../../generated/regl-codegen/30680f8f6712ef1af5cf7547e0af35b036fb300c67b07967cf448492ff4de4d0'); -var v2 = require('../../generated/regl-codegen/a3970baf1d8cac9305ee830c7026550387343d4dde2353dd86a4d082c97d3470'); -var v3 = require('../../generated/regl-codegen/3fd666968f3ce90d1c048b7a9aab515f3ce387a5401a10f8b66121c9469d1c0d'); +var v0 = require('../../generated/regl-codegen/30680f8f6712ef1af5cf7547e0af35b036fb300c67b07967cf448492ff4de4d0'); +var v1 = require('../../generated/regl-codegen/3fd666968f3ce90d1c048b7a9aab515f3ce387a5401a10f8b66121c9469d1c0d'); +var v2 = require('../../generated/regl-codegen/453a70fefa48db31713162aeb1ac438cb8579f54504f3b23acf32128df3dfd45'); +var v3 = require('../../generated/regl-codegen/a3970baf1d8cac9305ee830c7026550387343d4dde2353dd86a4d082c97d3470'); /* eslint-disable quote-props */ module.exports = { - '453a70fefa48db31713162aeb1ac438cb8579f54504f3b23acf32128df3dfd45': v0, - '30680f8f6712ef1af5cf7547e0af35b036fb300c67b07967cf448492ff4de4d0': v1, - 'a3970baf1d8cac9305ee830c7026550387343d4dde2353dd86a4d082c97d3470': v2, - '3fd666968f3ce90d1c048b7a9aab515f3ce387a5401a10f8b66121c9469d1c0d': v3 + '30680f8f6712ef1af5cf7547e0af35b036fb300c67b07967cf448492ff4de4d0': v0, + '3fd666968f3ce90d1c048b7a9aab515f3ce387a5401a10f8b66121c9469d1c0d': v1, + '453a70fefa48db31713162aeb1ac438cb8579f54504f3b23acf32128df3dfd45': v2, + 'a3970baf1d8cac9305ee830c7026550387343d4dde2353dd86a4d082c97d3470': v3 }; diff --git a/src/traces/scattergl/regl_precompiled.js b/src/traces/scattergl/regl_precompiled.js index c56195b934c..ef4ec23daa7 100644 --- a/src/traces/scattergl/regl_precompiled.js +++ b/src/traces/scattergl/regl_precompiled.js @@ -1,25 +1,25 @@ 'use strict'; var v0 = require('../../generated/regl-codegen/3e771157d23b4793771f65d83e6387262ed73d488209157f19a7fa027bddd71b'); -var v1 = require('../../generated/regl-codegen/cbf700f001fff25b649fba9c37fa0dc6631c1cdee318ad49473d28ec10dcee81'); -var v2 = require('../../generated/regl-codegen/8fad2284703471df7c0e0d0a7b96d983e8c53f6d707dd55d5921c1eab71f6623'); -var v3 = require('../../generated/regl-codegen/fe5b6844077cde1bdd7273f4495969fad93500c26a69b62e74ec2664c447bcc7'); -var v4 = require('../../generated/regl-codegen/db1b82c68771e7f5012fad1fbdae7ff23b526e58d2995bf6dd2cf30024e0f41d'); -var v5 = require('../../generated/regl-codegen/49e82bba439f1d9d441c17ba252d05640bc63fefdf22d1219993633af7730210'); -var v6 = require('../../generated/regl-codegen/dbd1cc9126a137a605df67dc0706e55116f04e33b4545a80042031752de5aef5'); -var v7 = require('../../generated/regl-codegen/bfc540da96a87fcc039073cb37b45e6b81ef5ee6ef3529d726ceed8336354019'); -var v8 = require('../../generated/regl-codegen/6a5d6bd29c15cf7614221b94c3f384df47c2c46fbe4456e8c57b5cd14c84d923'); -var v9 = require('../../generated/regl-codegen/8902aff2b23b600f8103bcc84a8af2999d28795208aedadc2db06f921f9c7034'); +var v1 = require('../../generated/regl-codegen/49e82bba439f1d9d441c17ba252d05640bc63fefdf22d1219993633af7730210'); +var v2 = require('../../generated/regl-codegen/6a5d6bd29c15cf7614221b94c3f384df47c2c46fbe4456e8c57b5cd14c84d923'); +var v3 = require('../../generated/regl-codegen/8902aff2b23b600f8103bcc84a8af2999d28795208aedadc2db06f921f9c7034'); +var v4 = require('../../generated/regl-codegen/8fad2284703471df7c0e0d0a7b96d983e8c53f6d707dd55d5921c1eab71f6623'); +var v5 = require('../../generated/regl-codegen/bfc540da96a87fcc039073cb37b45e6b81ef5ee6ef3529d726ceed8336354019'); +var v6 = require('../../generated/regl-codegen/cbf700f001fff25b649fba9c37fa0dc6631c1cdee318ad49473d28ec10dcee81'); +var v7 = require('../../generated/regl-codegen/db1b82c68771e7f5012fad1fbdae7ff23b526e58d2995bf6dd2cf30024e0f41d'); +var v8 = require('../../generated/regl-codegen/dbd1cc9126a137a605df67dc0706e55116f04e33b4545a80042031752de5aef5'); +var v9 = require('../../generated/regl-codegen/fe5b6844077cde1bdd7273f4495969fad93500c26a69b62e74ec2664c447bcc7'); /* eslint-disable quote-props */ module.exports = { '3e771157d23b4793771f65d83e6387262ed73d488209157f19a7fa027bddd71b': v0, - 'cbf700f001fff25b649fba9c37fa0dc6631c1cdee318ad49473d28ec10dcee81': v1, - '8fad2284703471df7c0e0d0a7b96d983e8c53f6d707dd55d5921c1eab71f6623': v2, - 'fe5b6844077cde1bdd7273f4495969fad93500c26a69b62e74ec2664c447bcc7': v3, - 'db1b82c68771e7f5012fad1fbdae7ff23b526e58d2995bf6dd2cf30024e0f41d': v4, - '49e82bba439f1d9d441c17ba252d05640bc63fefdf22d1219993633af7730210': v5, - 'dbd1cc9126a137a605df67dc0706e55116f04e33b4545a80042031752de5aef5': v6, - 'bfc540da96a87fcc039073cb37b45e6b81ef5ee6ef3529d726ceed8336354019': v7, - '6a5d6bd29c15cf7614221b94c3f384df47c2c46fbe4456e8c57b5cd14c84d923': v8, - '8902aff2b23b600f8103bcc84a8af2999d28795208aedadc2db06f921f9c7034': v9 + '49e82bba439f1d9d441c17ba252d05640bc63fefdf22d1219993633af7730210': v1, + '6a5d6bd29c15cf7614221b94c3f384df47c2c46fbe4456e8c57b5cd14c84d923': v2, + '8902aff2b23b600f8103bcc84a8af2999d28795208aedadc2db06f921f9c7034': v3, + '8fad2284703471df7c0e0d0a7b96d983e8c53f6d707dd55d5921c1eab71f6623': v4, + 'bfc540da96a87fcc039073cb37b45e6b81ef5ee6ef3529d726ceed8336354019': v5, + 'cbf700f001fff25b649fba9c37fa0dc6631c1cdee318ad49473d28ec10dcee81': v6, + 'db1b82c68771e7f5012fad1fbdae7ff23b526e58d2995bf6dd2cf30024e0f41d': v7, + 'dbd1cc9126a137a605df67dc0706e55116f04e33b4545a80042031752de5aef5': v8, + 'fe5b6844077cde1bdd7273f4495969fad93500c26a69b62e74ec2664c447bcc7': v9 }; diff --git a/src/traces/scatterpolargl/regl_precompiled.js b/src/traces/scatterpolargl/regl_precompiled.js index c56195b934c..ef4ec23daa7 100644 --- a/src/traces/scatterpolargl/regl_precompiled.js +++ b/src/traces/scatterpolargl/regl_precompiled.js @@ -1,25 +1,25 @@ 'use strict'; var v0 = require('../../generated/regl-codegen/3e771157d23b4793771f65d83e6387262ed73d488209157f19a7fa027bddd71b'); -var v1 = require('../../generated/regl-codegen/cbf700f001fff25b649fba9c37fa0dc6631c1cdee318ad49473d28ec10dcee81'); -var v2 = require('../../generated/regl-codegen/8fad2284703471df7c0e0d0a7b96d983e8c53f6d707dd55d5921c1eab71f6623'); -var v3 = require('../../generated/regl-codegen/fe5b6844077cde1bdd7273f4495969fad93500c26a69b62e74ec2664c447bcc7'); -var v4 = require('../../generated/regl-codegen/db1b82c68771e7f5012fad1fbdae7ff23b526e58d2995bf6dd2cf30024e0f41d'); -var v5 = require('../../generated/regl-codegen/49e82bba439f1d9d441c17ba252d05640bc63fefdf22d1219993633af7730210'); -var v6 = require('../../generated/regl-codegen/dbd1cc9126a137a605df67dc0706e55116f04e33b4545a80042031752de5aef5'); -var v7 = require('../../generated/regl-codegen/bfc540da96a87fcc039073cb37b45e6b81ef5ee6ef3529d726ceed8336354019'); -var v8 = require('../../generated/regl-codegen/6a5d6bd29c15cf7614221b94c3f384df47c2c46fbe4456e8c57b5cd14c84d923'); -var v9 = require('../../generated/regl-codegen/8902aff2b23b600f8103bcc84a8af2999d28795208aedadc2db06f921f9c7034'); +var v1 = require('../../generated/regl-codegen/49e82bba439f1d9d441c17ba252d05640bc63fefdf22d1219993633af7730210'); +var v2 = require('../../generated/regl-codegen/6a5d6bd29c15cf7614221b94c3f384df47c2c46fbe4456e8c57b5cd14c84d923'); +var v3 = require('../../generated/regl-codegen/8902aff2b23b600f8103bcc84a8af2999d28795208aedadc2db06f921f9c7034'); +var v4 = require('../../generated/regl-codegen/8fad2284703471df7c0e0d0a7b96d983e8c53f6d707dd55d5921c1eab71f6623'); +var v5 = require('../../generated/regl-codegen/bfc540da96a87fcc039073cb37b45e6b81ef5ee6ef3529d726ceed8336354019'); +var v6 = require('../../generated/regl-codegen/cbf700f001fff25b649fba9c37fa0dc6631c1cdee318ad49473d28ec10dcee81'); +var v7 = require('../../generated/regl-codegen/db1b82c68771e7f5012fad1fbdae7ff23b526e58d2995bf6dd2cf30024e0f41d'); +var v8 = require('../../generated/regl-codegen/dbd1cc9126a137a605df67dc0706e55116f04e33b4545a80042031752de5aef5'); +var v9 = require('../../generated/regl-codegen/fe5b6844077cde1bdd7273f4495969fad93500c26a69b62e74ec2664c447bcc7'); /* eslint-disable quote-props */ module.exports = { '3e771157d23b4793771f65d83e6387262ed73d488209157f19a7fa027bddd71b': v0, - 'cbf700f001fff25b649fba9c37fa0dc6631c1cdee318ad49473d28ec10dcee81': v1, - '8fad2284703471df7c0e0d0a7b96d983e8c53f6d707dd55d5921c1eab71f6623': v2, - 'fe5b6844077cde1bdd7273f4495969fad93500c26a69b62e74ec2664c447bcc7': v3, - 'db1b82c68771e7f5012fad1fbdae7ff23b526e58d2995bf6dd2cf30024e0f41d': v4, - '49e82bba439f1d9d441c17ba252d05640bc63fefdf22d1219993633af7730210': v5, - 'dbd1cc9126a137a605df67dc0706e55116f04e33b4545a80042031752de5aef5': v6, - 'bfc540da96a87fcc039073cb37b45e6b81ef5ee6ef3529d726ceed8336354019': v7, - '6a5d6bd29c15cf7614221b94c3f384df47c2c46fbe4456e8c57b5cd14c84d923': v8, - '8902aff2b23b600f8103bcc84a8af2999d28795208aedadc2db06f921f9c7034': v9 + '49e82bba439f1d9d441c17ba252d05640bc63fefdf22d1219993633af7730210': v1, + '6a5d6bd29c15cf7614221b94c3f384df47c2c46fbe4456e8c57b5cd14c84d923': v2, + '8902aff2b23b600f8103bcc84a8af2999d28795208aedadc2db06f921f9c7034': v3, + '8fad2284703471df7c0e0d0a7b96d983e8c53f6d707dd55d5921c1eab71f6623': v4, + 'bfc540da96a87fcc039073cb37b45e6b81ef5ee6ef3529d726ceed8336354019': v5, + 'cbf700f001fff25b649fba9c37fa0dc6631c1cdee318ad49473d28ec10dcee81': v6, + 'db1b82c68771e7f5012fad1fbdae7ff23b526e58d2995bf6dd2cf30024e0f41d': v7, + 'dbd1cc9126a137a605df67dc0706e55116f04e33b4545a80042031752de5aef5': v8, + 'fe5b6844077cde1bdd7273f4495969fad93500c26a69b62e74ec2664c447bcc7': v9 }; diff --git a/src/traces/splom/regl_precompiled.js b/src/traces/splom/regl_precompiled.js index a4f1af3ac89..ef4ec23daa7 100644 --- a/src/traces/splom/regl_precompiled.js +++ b/src/traces/splom/regl_precompiled.js @@ -1,25 +1,25 @@ 'use strict'; var v0 = require('../../generated/regl-codegen/3e771157d23b4793771f65d83e6387262ed73d488209157f19a7fa027bddd71b'); -var v1 = require('../../generated/regl-codegen/cbf700f001fff25b649fba9c37fa0dc6631c1cdee318ad49473d28ec10dcee81'); -var v2 = require('../../generated/regl-codegen/8fad2284703471df7c0e0d0a7b96d983e8c53f6d707dd55d5921c1eab71f6623'); -var v3 = require('../../generated/regl-codegen/dbd1cc9126a137a605df67dc0706e55116f04e33b4545a80042031752de5aef5'); -var v4 = require('../../generated/regl-codegen/bfc540da96a87fcc039073cb37b45e6b81ef5ee6ef3529d726ceed8336354019'); -var v5 = require('../../generated/regl-codegen/fe5b6844077cde1bdd7273f4495969fad93500c26a69b62e74ec2664c447bcc7'); -var v6 = require('../../generated/regl-codegen/db1b82c68771e7f5012fad1fbdae7ff23b526e58d2995bf6dd2cf30024e0f41d'); -var v7 = require('../../generated/regl-codegen/49e82bba439f1d9d441c17ba252d05640bc63fefdf22d1219993633af7730210'); -var v8 = require('../../generated/regl-codegen/6a5d6bd29c15cf7614221b94c3f384df47c2c46fbe4456e8c57b5cd14c84d923'); -var v9 = require('../../generated/regl-codegen/8902aff2b23b600f8103bcc84a8af2999d28795208aedadc2db06f921f9c7034'); +var v1 = require('../../generated/regl-codegen/49e82bba439f1d9d441c17ba252d05640bc63fefdf22d1219993633af7730210'); +var v2 = require('../../generated/regl-codegen/6a5d6bd29c15cf7614221b94c3f384df47c2c46fbe4456e8c57b5cd14c84d923'); +var v3 = require('../../generated/regl-codegen/8902aff2b23b600f8103bcc84a8af2999d28795208aedadc2db06f921f9c7034'); +var v4 = require('../../generated/regl-codegen/8fad2284703471df7c0e0d0a7b96d983e8c53f6d707dd55d5921c1eab71f6623'); +var v5 = require('../../generated/regl-codegen/bfc540da96a87fcc039073cb37b45e6b81ef5ee6ef3529d726ceed8336354019'); +var v6 = require('../../generated/regl-codegen/cbf700f001fff25b649fba9c37fa0dc6631c1cdee318ad49473d28ec10dcee81'); +var v7 = require('../../generated/regl-codegen/db1b82c68771e7f5012fad1fbdae7ff23b526e58d2995bf6dd2cf30024e0f41d'); +var v8 = require('../../generated/regl-codegen/dbd1cc9126a137a605df67dc0706e55116f04e33b4545a80042031752de5aef5'); +var v9 = require('../../generated/regl-codegen/fe5b6844077cde1bdd7273f4495969fad93500c26a69b62e74ec2664c447bcc7'); /* eslint-disable quote-props */ module.exports = { '3e771157d23b4793771f65d83e6387262ed73d488209157f19a7fa027bddd71b': v0, - 'cbf700f001fff25b649fba9c37fa0dc6631c1cdee318ad49473d28ec10dcee81': v1, - '8fad2284703471df7c0e0d0a7b96d983e8c53f6d707dd55d5921c1eab71f6623': v2, - 'dbd1cc9126a137a605df67dc0706e55116f04e33b4545a80042031752de5aef5': v3, - 'bfc540da96a87fcc039073cb37b45e6b81ef5ee6ef3529d726ceed8336354019': v4, - 'fe5b6844077cde1bdd7273f4495969fad93500c26a69b62e74ec2664c447bcc7': v5, - 'db1b82c68771e7f5012fad1fbdae7ff23b526e58d2995bf6dd2cf30024e0f41d': v6, - '49e82bba439f1d9d441c17ba252d05640bc63fefdf22d1219993633af7730210': v7, - '6a5d6bd29c15cf7614221b94c3f384df47c2c46fbe4456e8c57b5cd14c84d923': v8, - '8902aff2b23b600f8103bcc84a8af2999d28795208aedadc2db06f921f9c7034': v9 + '49e82bba439f1d9d441c17ba252d05640bc63fefdf22d1219993633af7730210': v1, + '6a5d6bd29c15cf7614221b94c3f384df47c2c46fbe4456e8c57b5cd14c84d923': v2, + '8902aff2b23b600f8103bcc84a8af2999d28795208aedadc2db06f921f9c7034': v3, + '8fad2284703471df7c0e0d0a7b96d983e8c53f6d707dd55d5921c1eab71f6623': v4, + 'bfc540da96a87fcc039073cb37b45e6b81ef5ee6ef3529d726ceed8336354019': v5, + 'cbf700f001fff25b649fba9c37fa0dc6631c1cdee318ad49473d28ec10dcee81': v6, + 'db1b82c68771e7f5012fad1fbdae7ff23b526e58d2995bf6dd2cf30024e0f41d': v7, + 'dbd1cc9126a137a605df67dc0706e55116f04e33b4545a80042031752de5aef5': v8, + 'fe5b6844077cde1bdd7273f4495969fad93500c26a69b62e74ec2664c447bcc7': v9 }; From 81ef722d3f02f58b475b5385d04a2429442b1984 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Wed, 3 Jun 2026 08:19:08 -0600 Subject: [PATCH 7/9] Apply suggestions from code review Co-authored-by: Emily KL <4672118+emilykl@users.noreply.github.com> --- .github/workflows/ci.yml | 1 + CONTRIBUTING.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3f4e8d8cbc4..ddf8acbea27 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,6 +43,7 @@ jobs: if git diff --name-only "$BASE"...HEAD -- stackgl_modules/ | grep -q .; then echo "stackgl_modules=true" >> "$GITHUB_OUTPUT" fi + # If any of the directories listed below have changed, we need to re-run the regl-codegen step # stackgl_modules/ is listed here too because the regl-* shader libs live there; # changes can alter shader output and require regenerating the precompiled shaders. if git diff --name-only "$BASE"...HEAD -- src/traces/scattergl/ src/traces/scatterpolargl/ src/traces/splom/ src/traces/parcoords/ src/lib/prepare_regl.js stackgl_modules/ devtools/regl_codegen/ | grep -q .; then diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 79aaa918ccb..770c0a53bf5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -163,7 +163,7 @@ npm run schema #### Step 9: REGL - Review & commit potential changes to precompiled regl shaders If you are implementing a new feature that involves regl shaders, or if you are -making changes that affect the usage of regl shaders, you would need to regenerate the precompiled regl shader code. +making changes that affect the usage of regl shaders, you will need to regenerate the precompiled regl shader code. This is needed because regl performs codegen in runtime which breaks CSP compliance, and so for strict builds we pre-generate regl shader code here. From 0530f7869042c2b2021bed8d3de142103bf924c7 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Wed, 3 Jun 2026 08:22:59 -0600 Subject: [PATCH 8/9] Clarify language in docs --- CONTRIBUTING.md | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 770c0a53bf5..4ac4a8f38ca 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -163,7 +163,14 @@ npm run schema #### Step 9: REGL - Review & commit potential changes to precompiled regl shaders If you are implementing a new feature that involves regl shaders, or if you are -making changes that affect the usage of regl shaders, you will need to regenerate the precompiled regl shader code. +making changes that affect the usage of regl shaders, you will need to regenerate the precompiled regl shader code. In practice, that means edits under: + +- `src/traces/{scattergl,scatterpolargl,splom,parcoords}/` +- `src/lib/prepare_regl.js` +- `stackgl_modules/` (where the `regl-*` shader libs live) +- `devtools/regl_codegen/` + +CI's `check-regl-codegen` job uses this same list as its trigger — see [`.github/workflows/ci.yml`](.github/workflows/ci.yml) for the authoritative version. This is needed because regl performs codegen in runtime which breaks CSP compliance, and so for strict builds we pre-generate regl shader code here. @@ -177,9 +184,12 @@ files are pruned). To fix this: 1. Download the `regl-codegen` artifact from the failed workflow run 2. Delete `src/generated/regl-codegen/` in your working tree, then unzip the - artifact at the repo root so it replaces (rather than merges into) the - existing directory. Also overwrite the four `regl_precompiled.js` files - under `src/traces/{scattergl,scatterpolargl,splom,parcoords}/`. + artifact into `src/` so it replaces (rather than merges into) the existing + directory. Note that `actions/upload-artifact` strips the longest common + parent path from the uploaded paths, so the zip's root contains + `generated/regl-codegen/` and `traces/{scattergl,scatterpolargl,splom,parcoords}/regl_precompiled.js` + directly — extracting into `src/` restores the correct layout and + overwrites the four `regl_precompiled.js` files in one step. 3. Commit and push the changes to your pull request Alternatively, you can regenerate the code locally: @@ -189,12 +199,17 @@ rm -rf src/generated/regl-codegen/* npm run regl-codegen ``` -The `rm -rf` mirrors what CI does, so any orphaned shader files left over from -previous changes get cleaned up. `npm run regl-codegen` will prompt you to open a -browser window, run through all traces with 'regl' in the tags, and store the -captured code into +The `rm -rf` step is needed to clean up any orphaned shader files left over from +previous changes. `npm run regl-codegen` will prompt you to open +a browser window, run through the mocks for each regl-using trace +(`parcoords`, `scattergl`, `scatterpolargl`, `splom`), and store the captured +shader code into [src/generated/regl-codegen](https://github.com/plotly/plotly.js/blob/master/src/generated/regl-codegen). -Commit any changes that result. +The four `src/traces/{parcoords,scattergl,scatterpolargl,splom}/regl_precompiled.js` +files are rewritten in the same pass so their imports point at the freshly +generated shader files. Commit any changes that result — both the +`src/generated/regl-codegen/` updates and any modified `regl_precompiled.js` +files. #### Other npm scripts that may be of interest in development From c08967644252e9700c1c735886f7226b3c8851cb Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Wed, 3 Jun 2026 08:23:33 -0600 Subject: [PATCH 9/9] Update error message --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ddf8acbea27..6ff6c50775e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -795,7 +795,7 @@ jobs: src/traces/scatterpolargl/regl_precompiled.js \ src/traces/splom/regl_precompiled.js \ src/traces/parcoords/regl_precompiled.js; then - echo "::error::Regl precompiled shaders are out of date. Download the 'regl-codegen' artifact from this workflow run and commit the updated files to this pull request." + echo "::error::Regl precompiled shaders are out of date. Download the 'regl-codegen' artifact from this workflow run, extract it into src/, and commit the updated files to this pull request." exit 1 fi