diff --git a/.github/workflows/update-monaco-editor.yml b/.github/workflows/update-monaco-editor.yml index 646aa98f..6d36aa63 100644 --- a/.github/workflows/update-monaco-editor.yml +++ b/.github/workflows/update-monaco-editor.yml @@ -10,7 +10,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - run: ./bin/update-monaco + - uses: actions/setup-node@v2 + with: + node-version: 18 + - run: node ./bin/update-monaco.js - name: Commit changes uses: EndBug/add-and-commit@v9 with: diff --git a/bin/update-monaco b/bin/update-monaco deleted file mode 100755 index dbddd571..00000000 --- a/bin/update-monaco +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -monacoVersion="$(jq -r '.dependencies."monaco-editor"' package.json)" -monacoVersion="${monacoVersion:1}" - -if [[ $(uname) == "Darwin" ]]; -then - sed -i '' -E "s/monaco-editor\/[^/]*/monaco-editor\/$monacoVersion/g" ./src/app.html -else - sed -i'' -E "s/monaco-editor\/[^/]*/monaco-editor\/$monacoVersion/g" ./src/app.html -fi - diff --git a/bin/update-monaco.js b/bin/update-monaco.js new file mode 100755 index 00000000..3d81bdfc --- /dev/null +++ b/bin/update-monaco.js @@ -0,0 +1,45 @@ +import fs from 'fs'; +import path from 'path'; +import { parse } from 'node-html-parser'; +import prettier from 'prettier'; + +// parse monaco version out of package.json +const packageJson = JSON.parse(fs.readFileSync('package.json')); +const monacoVersion = packageJson.dependencies['monaco-editor'].replace('^', ''); + +// fetch monaco sri info from cdnjs api +const cdnjsAPIResp = await fetch( + `https://api.cdnjs.com/libraries/monaco-editor/${monacoVersion}?fields=sri` +); +if (cdnjsAPIResp.ok) { + const respJson = await cdnjsAPIResp.json(); + const htmlPath = path.join('src', 'app.html'); + const appHtml = fs + .readFileSync(htmlPath, 'utf8') + // update monaco version of every asset in app.html + .replaceAll(/[0-9.]+\/min\/vs/g, `${monacoVersion}/min/vs`); + const root = parse(appHtml); + const updateIntegrity = (tag, attr) => { + for (const node of root + .getElementsByTagName(tag) + .filter((node) => node.getAttribute(attr)?.includes('monaco-editor'))) { + const file = node.getAttribute(attr).split(`${monacoVersion}/`)[1]; + node.setAttribute('integrity', respJson.sri[file]); + } + }; + + updateIntegrity('script', 'src'); + updateIntegrity('link', 'href'); + + fs.writeFileSync( + htmlPath, + prettier.format(root.toString(), { + singleQuote: false, + parser: 'html', + bracketSameLine: true, + useTabs: true + }) + ); +} else { + throw Error('Unable to fetch monaco sri data from cdnjs api.'); +} diff --git a/package.json b/package.json index 63242307..ce7a2fff 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ ] }, "volta": { - "node": "16.15.0", + "node": "18.5.0", "yarn": "1.22.10" }, "engines": { diff --git a/src/app.html b/src/app.html index e6054088..38b8fb45 100644 --- a/src/app.html +++ b/src/app.html @@ -15,30 +15,38 @@ + href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" + integrity="sha512-HK5fgLBL+xu6dm/Ii3z4xhlSUyZgTT9tuc/hSrtw6uzJOvgRr2a9jyxxT1ely+B+xFAmJKVSTbpM/CuL7qxO8w==" + crossorigin="anonymous" + referrerpolicy="no-referrer" /> - %sveltekit.head%