From b8a90d356f01e10ebe90131e157d8ac479474f63 Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Fri, 29 Mar 2024 02:51:29 -0700 Subject: [PATCH] feat!: rewrite in TypeScript with CacheMap support BREAKING `cache-source` and `cache-target` are removed in favour of `cache-map` that expects a JSON string Signed-off-by: Amin Yahyaabadi --- .github/workflows/test.yml | 37 +- .gitignore | 2 + README.md | 47 +- action.yml | 13 +- dist/index.js | 860 ++++++++++++++ dist/index.js.map | 1 + main | 24 - package.json | 39 + pnpm-lock.yaml | 2010 +++++++++++++++++++++++++++++++++ post | 33 - read-action-input | 13 - src/extract-cache.ts | 56 + entrypoint.js => src/index.ts | 37 +- src/inject-cache.ts | 45 + src/opts.ts | 35 + src/run.ts | 5 + tsconfig.json | 19 + 17 files changed, 3138 insertions(+), 138 deletions(-) create mode 100644 .gitignore create mode 100644 dist/index.js create mode 100644 dist/index.js.map delete mode 100755 main create mode 100644 package.json create mode 100644 pnpm-lock.yaml delete mode 100755 post delete mode 100755 read-action-input create mode 100644 src/extract-cache.ts rename entrypoint.js => src/index.ts (80%) create mode 100644 src/inject-cache.ts create mode 100644 src/opts.ts create mode 100644 src/run.ts create mode 100644 tsconfig.json diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8616179..2d09320 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,29 +14,26 @@ jobs: id: meta with: images: test - - name: Cache var-cache-apt - id: cache-var-cache-apt - uses: actions/cache@v3 + + - name: Cache + uses: actions/cache@v4 + id: cache with: - path: var-cache-apt - key: var-cache-apt-${{ hashFiles('.github/workflows/test/Dockerfile') }} - - name: Cache var-lib-apt - id: cache-var-lib-apt - uses: actions/cache@v3 - with: - path: var-lib-apt - key: var-lib-apt-${{ hashFiles('.github/workflows/test/Dockerfile') }} - - name: inject var-cache-apt into docker - uses: ./ - with: - cache-source: var-cache-apt - cache-target: /var/cache/apt - - name: inject var-lib-apt into docker + path: | + var-cache-apt + var-lib-apt + key: cache-${{ hashFiles('.github/workflows/test/Dockerfile') }} + + - name: inject cache into docker uses: ./ with: - cache-source: var-lib-apt - cache-target: /var/lib/apt - skip-extraction: ${{ steps.cache-var-lib-apt.outputs.cache-hit }} + skip-extraction: ${{ steps.cache.outputs.cache-hit }} + cache-map: | + { + "var-cache-apt": "/var/cache/apt", + "var-lib-apt": "/var/lib/apt" + } + - name: Build and push uses: docker/build-push-action@v5 with: diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..59dc1f7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +.parcel-cache/ diff --git a/README.md b/README.md index 2d09a2a..1af81ec 100644 --- a/README.md +++ b/README.md @@ -32,11 +32,11 @@ Action: ```yaml --- name: Build -on: push +on: + push: jobs: - build: - name: Build + Build: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 @@ -44,31 +44,27 @@ jobs: - uses: docker/metadata-action@v5 id: meta with: - images: YOUR_IMAGE - - name: Cache var-cache-apt - id: cache-var-cache-apt - uses: actions/cache@v3 - with: - path: var-cache-apt - key: var-cache-apt-${{ hashFiles('Dockerfile') }} - - name: Cache var-lib-apt - id: cache-var-lib-apt + images: Build + + - name: Cache uses: actions/cache@v3 + id: cache with: - path: var-lib-apt - key: var-lib-apt-${{ hashFiles('Dockerfile') }} - - name: inject var-cache-apt into docker - uses: reproducible-containers/buildkit-cache-dance@v2.1.4 - with: - cache-source: var-cache-apt - cache-target: /var/cache/apt - skip-extraction: ${{ steps.cache-var-cache-apt.outputs.cache-hit }} - - name: inject var-lib-apt into docker - uses: reproducible-containers/buildkit-cache-dance@v2.1.4 + path: | + var-cache-apt + var-lib-apt + key: cache-${{ hashFiles('.github/workflows/test/Dockerfile') }} + + - name: inject cache into docker + uses: reproducible-containers/buildkit-cache-dance@v3.0.0 with: - cache-source: var-lib-apt - cache-target: /var/lib/apt - skip-extraction: ${{ steps.cache-var-lib-apt.outputs.cache-hit }} + cache-map: | + { + "var-cache-apt": "/var/cache/apt", + "var-lib-apt": "/var/lib/apt" + } + skip-extraction: ${{ steps.cache.outputs.cache-hit }} + - name: Build and push uses: docker/build-push-action@v5 with: @@ -79,6 +75,7 @@ jobs: push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} + ``` Real-world examples: diff --git a/action.yml b/action.yml index 23344c0..21dc2ae 100644 --- a/action.yml +++ b/action.yml @@ -1,12 +1,9 @@ name: Inject/Extract Cache description: "Injects the cached data into the docker build(x|kit) process" inputs: - cache-source: - default: cache - description: "Where the cache is stored in the calling workspace. Default: `cache`" - cache-target: - default: /root/.cache/go-build - description: "Where the cache is stored in the docker container. Default: `/root/.cache/go-build`" + cache-map: + required: true + description: "The map of actions source to container destination paths for the cache paths" scratch-dir: default: scratch description: "Where the action is stores some temporary files for its processing. Default: `scratch`" @@ -15,5 +12,5 @@ inputs: description: "Skip the extraction of the cache from the docker container" runs: using: 'node20' - main: 'entrypoint.js' - post: 'entrypoint.js' + main: 'dist/index.js' + post: 'dist/index.js' diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..82c61ad --- /dev/null +++ b/dist/index.js @@ -0,0 +1,860 @@ +import {stat as $evV72$stat, statSync as $evV72$statSync, openSync as $evV72$openSync, readSync as $evV72$readSync, closeSync as $evV72$closeSync} from "fs"; +import {appendFile as $evV72$appendFile, rm as $evV72$rm, mkdir as $evV72$mkdir, writeFile as $evV72$writeFile, rename as $evV72$rename} from "fs/promises"; +import {EOL as $evV72$EOL} from "os"; +import {join as $evV72$join, normalize as $evV72$normalize, delimiter as $evV72$delimiter, resolve as $evV72$resolve} from "path"; +import {spawn as $evV72$spawn, spawnSync as $evV72$spawnSync} from "child_process"; + + +function $parcel$interopDefault(a) { + return a && a.__esModule ? a.default : a; +} + + var $parcel$global = globalThis; + +var $parcel$modules = {}; +var $parcel$inits = {}; + +var parcelRequire = $parcel$global["parcelRequire86b4"]; + +if (parcelRequire == null) { + parcelRequire = function(id) { + if (id in $parcel$modules) { + return $parcel$modules[id].exports; + } + if (id in $parcel$inits) { + var init = $parcel$inits[id]; + delete $parcel$inits[id]; + var module = {id: id, exports: {}}; + $parcel$modules[id] = module; + init.call(module.exports, module, module.exports); + return module.exports; + } + var err = new Error("Cannot find module '" + id + "'"); + err.code = 'MODULE_NOT_FOUND'; + throw err; + }; + + parcelRequire.register = function register(id, init) { + $parcel$inits[id] = init; + }; + + $parcel$global["parcelRequire86b4"] = parcelRequire; +} + +var parcelRegister = parcelRequire.register; +parcelRegister("dE8Bn", function(module, exports) { +module.exports = $9ef5aef4681a6fb1$var$isexe; +$9ef5aef4681a6fb1$var$isexe.sync = $9ef5aef4681a6fb1$var$sync; + +function $9ef5aef4681a6fb1$var$checkPathExt(path, options) { + var pathext = options.pathExt !== undefined ? options.pathExt : process.env.PATHEXT; + if (!pathext) return true; + pathext = pathext.split(";"); + if (pathext.indexOf("") !== -1) return true; + for(var i = 0; i < pathext.length; i++){ + var p = pathext[i].toLowerCase(); + if (p && path.substr(-p.length).toLowerCase() === p) return true; + } + return false; +} +function $9ef5aef4681a6fb1$var$checkStat(stat, path, options) { + if (!stat.isSymbolicLink() && !stat.isFile()) return false; + return $9ef5aef4681a6fb1$var$checkPathExt(path, options); +} +function $9ef5aef4681a6fb1$var$isexe(path, options, cb) { + $evV72$stat(path, function(er, stat) { + cb(er, er ? false : $9ef5aef4681a6fb1$var$checkStat(stat, path, options)); + }); +} +function $9ef5aef4681a6fb1$var$sync(path, options) { + return $9ef5aef4681a6fb1$var$checkStat($evV72$statSync(path), path, options); +} + +}); + +parcelRegister("5dXTc", function(module, exports) { +module.exports = $3cdc9f651a760b03$var$isexe; +$3cdc9f651a760b03$var$isexe.sync = $3cdc9f651a760b03$var$sync; + +function $3cdc9f651a760b03$var$isexe(path, options, cb) { + $evV72$stat(path, function(er, stat) { + cb(er, er ? false : $3cdc9f651a760b03$var$checkStat(stat, options)); + }); +} +function $3cdc9f651a760b03$var$sync(path, options) { + return $3cdc9f651a760b03$var$checkStat($evV72$statSync(path), options); +} +function $3cdc9f651a760b03$var$checkStat(stat, options) { + return stat.isFile() && $3cdc9f651a760b03$var$checkMode(stat, options); +} +function $3cdc9f651a760b03$var$checkMode(stat, options) { + var mod = stat.mode; + var uid = stat.uid; + var gid = stat.gid; + var myUid = options.uid !== undefined ? options.uid : process.getuid && process.getuid(); + var myGid = options.gid !== undefined ? options.gid : process.getgid && process.getgid(); + var u = parseInt("100", 8); + var g = parseInt("010", 8); + var o = parseInt("001", 8); + var ug = u | g; + var ret = mod & o || mod & g && gid === myGid || mod & u && uid === myUid || mod & ug && myUid === 0; + return ret; +} + +}); + +// Forked from https://github.com/pyTooling/Actions/blob/v0.4.6/with-post-step/main.js +// The following copyright header is from the upstream. +/* ================================================================================================================== * + * Authors: * + * Unai Martinez-Corral * + * Amin Yahyaabadi * + * * + * ================================================================================================================== * + * Copyright 2021-2022 Unai Martinez-Corral * + * Copyright 2022 Unai Martinez-Corral * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); * + * you may not use this file except in compliance with the License. * + * You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, software * + * distributed under the License is distributed on an "AS IS" BASIS, * + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * + * See the License for the specific language governing permissions and * + * limitations under the License. * + * * + * SPDX-License-Identifier: Apache-2.0 * + * ================================================================================================================== * + * * + * Context: * + * * https://github.com/docker/login-action/issues/72 * + * * https://github.com/actions/runner/issues/1478 * + * ================================================================================================================== */ + + + +function $ec42a3295e12ea98$var$toArr(any) { + return any == null ? [] : Array.isArray(any) ? any : [ + any + ]; +} +function $ec42a3295e12ea98$var$toVal(out, key, val, opts) { + var x, old = out[key], nxt = !!~opts.string.indexOf(key) ? val == null || val === true ? "" : String(val) : typeof val === "boolean" ? val : !!~opts.boolean.indexOf(key) ? val === "false" ? false : val === "true" || (out._.push((x = +val, x * 0 === 0) ? x : val), !!val) : (x = +val, x * 0 === 0) ? x : val; + out[key] = old == null ? nxt : Array.isArray(old) ? old.concat(nxt) : [ + old, + nxt + ]; +} +function $ec42a3295e12ea98$export$2e2bcd8739ae039(args, opts) { + args = args || []; + opts = opts || {}; + var k, arr, arg, name, val, out = { + _: [] + }; + var i = 0, j = 0, idx = 0, len = args.length; + const alibi = opts.alias !== void 0; + const strict = opts.unknown !== void 0; + const defaults = opts.default !== void 0; + opts.alias = opts.alias || {}; + opts.string = $ec42a3295e12ea98$var$toArr(opts.string); + opts.boolean = $ec42a3295e12ea98$var$toArr(opts.boolean); + if (alibi) for(k in opts.alias){ + arr = opts.alias[k] = $ec42a3295e12ea98$var$toArr(opts.alias[k]); + for(i = 0; i < arr.length; i++)(opts.alias[arr[i]] = arr.concat(k)).splice(i, 1); + } + for(i = opts.boolean.length; i-- > 0;){ + arr = opts.alias[opts.boolean[i]] || []; + for(j = arr.length; j-- > 0;)opts.boolean.push(arr[j]); + } + for(i = opts.string.length; i-- > 0;){ + arr = opts.alias[opts.string[i]] || []; + for(j = arr.length; j-- > 0;)opts.string.push(arr[j]); + } + if (defaults) for(k in opts.default){ + name = typeof opts.default[k]; + arr = opts.alias[k] = opts.alias[k] || []; + if (opts[name] !== void 0) { + opts[name].push(k); + for(i = 0; i < arr.length; i++)opts[name].push(arr[i]); + } + } + const keys = strict ? Object.keys(opts.alias) : []; + for(i = 0; i < len; i++){ + arg = args[i]; + if (arg === "--") { + out._ = out._.concat(args.slice(++i)); + break; + } + for(j = 0; j < arg.length; j++){ + if (arg.charCodeAt(j) !== 45) break; // "-" + } + if (j === 0) out._.push(arg); + else if (arg.substring(j, j + 3) === "no-") { + name = arg.substring(j + 3); + if (strict && !~keys.indexOf(name)) return opts.unknown(arg); + out[name] = false; + } else { + for(idx = j + 1; idx < arg.length; idx++){ + if (arg.charCodeAt(idx) === 61) break; // "=" + } + name = arg.substring(j, idx); + val = arg.substring(++idx) || i + 1 === len || ("" + args[i + 1]).charCodeAt(0) === 45 || args[++i]; + arr = j === 2 ? [ + name + ] : name; + for(idx = 0; idx < arr.length; idx++){ + name = arr[idx]; + if (strict && !~keys.indexOf(name)) return opts.unknown("-".repeat(j) + name); + $ec42a3295e12ea98$var$toVal(out, name, idx + 1 < arr.length || val, opts); + } + } + } + if (defaults) { + for(k in opts.default)if (out[k] === void 0) out[k] = opts.default[k]; + } + if (alibi) for(k in out){ + arr = opts.alias[k] || []; + while(arr.length > 0)out[arr.shift()] = out[k]; + } + return out; +} + + +function $76d06fcdc9bff1f5$export$77714ac6976d0316(args) { + return (0, $ec42a3295e12ea98$export$2e2bcd8739ae039)(args, { + default: { + "cache-map": $76d06fcdc9bff1f5$var$getInput("cache-map"), + "scratch-dir": $76d06fcdc9bff1f5$var$getInput("scratch-dir"), + "skip-extraction": $76d06fcdc9bff1f5$var$getInput("skip-extraction") === "true" + }, + string: [ + "cache-map", + "scratch-dir" + ], + boolean: [ + "skip-extraction" + ] + }); +} +/** + * Get the action input value from the environment (INPUT_NAME) + */ function $76d06fcdc9bff1f5$var$getInput(name) { + const val = process.env[`INPUT_${name.replace(/ /g, "_").toUpperCase()}`] || ""; + return val.trim(); +} +function $76d06fcdc9bff1f5$export$8550a4d7282a21d0(opts) { + try { + return JSON.parse(opts["cache-map"]); + } catch (e) { + throw new Error(`Failed to parse cache map. Expected JSON, got:\n${opts["cache-map"]}\n${e}`); + } +} + + +var $03c48d50d9d7039f$exports = {}; +var $92de28abfb9027ac$exports = {}; +"use strict"; + +var $9f07a96c8577f666$exports = {}; +"use strict"; + +var $37f30101baa1381d$exports = {}; +"use strict"; + +var $10bb1950eec72619$exports = {}; +const $10bb1950eec72619$var$isWindows = process.platform === "win32" || process.env.OSTYPE === "cygwin" || process.env.OSTYPE === "msys"; + +const $10bb1950eec72619$var$COLON = $10bb1950eec72619$var$isWindows ? ";" : ":"; +var $0b1af7ee1bc1c627$exports = {}; + +var $0b1af7ee1bc1c627$var$core; + + +if (process.platform === "win32" || $parcel$global.TESTING_WINDOWS) $0b1af7ee1bc1c627$var$core = (parcelRequire("dE8Bn")); +else $0b1af7ee1bc1c627$var$core = (parcelRequire("5dXTc")); +$0b1af7ee1bc1c627$exports = $0b1af7ee1bc1c627$var$isexe; +$0b1af7ee1bc1c627$var$isexe.sync = $0b1af7ee1bc1c627$var$sync; +function $0b1af7ee1bc1c627$var$isexe(path, options, cb) { + if (typeof options === "function") { + cb = options; + options = {}; + } + if (!cb) { + if (typeof Promise !== "function") throw new TypeError("callback not provided"); + return new Promise(function(resolve, reject) { + $0b1af7ee1bc1c627$var$isexe(path, options || {}, function(er, is) { + if (er) reject(er); + else resolve(is); + }); + }); + } + $0b1af7ee1bc1c627$var$core(path, options || {}, function(er, is) { + // ignore EACCES because that just means we aren't allowed to run it + if (er) { + if (er.code === "EACCES" || options && options.ignoreErrors) { + er = null; + is = false; + } + } + cb(er, is); + }); +} +function $0b1af7ee1bc1c627$var$sync(path, options) { + // my kingdom for a filtered catch + try { + return $0b1af7ee1bc1c627$var$core.sync(path, options || {}); + } catch (er) { + if (options && options.ignoreErrors || er.code === "EACCES") return false; + else throw er; + } +} + + +const $10bb1950eec72619$var$getNotFoundError = (cmd)=>Object.assign(new Error(`not found: ${cmd}`), { + code: "ENOENT" + }); +const $10bb1950eec72619$var$getPathInfo = (cmd, opt)=>{ + const colon = opt.colon || $10bb1950eec72619$var$COLON; + // If it has a slash, then we don't bother searching the pathenv. + // just check the file itself, and that's it. + const pathEnv = cmd.match(/\//) || $10bb1950eec72619$var$isWindows && cmd.match(/\\/) ? [ + "" + ] : [ + // windows always checks the cwd first + ...$10bb1950eec72619$var$isWindows ? [ + process.cwd() + ] : [], + ...(opt.path || process.env.PATH || /* istanbul ignore next: very unusual */ "").split(colon) + ]; + const pathExtExe = $10bb1950eec72619$var$isWindows ? opt.pathExt || process.env.PATHEXT || ".EXE;.CMD;.BAT;.COM" : ""; + const pathExt = $10bb1950eec72619$var$isWindows ? pathExtExe.split(colon) : [ + "" + ]; + if ($10bb1950eec72619$var$isWindows) { + if (cmd.indexOf(".") !== -1 && pathExt[0] !== "") pathExt.unshift(""); + } + return { + pathEnv: pathEnv, + pathExt: pathExt, + pathExtExe: pathExtExe + }; +}; +const $10bb1950eec72619$var$which = (cmd, opt, cb)=>{ + if (typeof opt === "function") { + cb = opt; + opt = {}; + } + if (!opt) opt = {}; + const { pathEnv: pathEnv, pathExt: pathExt, pathExtExe: pathExtExe } = $10bb1950eec72619$var$getPathInfo(cmd, opt); + const found = []; + const step = (i)=>new Promise((resolve, reject)=>{ + if (i === pathEnv.length) return opt.all && found.length ? resolve(found) : reject($10bb1950eec72619$var$getNotFoundError(cmd)); + const ppRaw = pathEnv[i]; + const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw; + const pCmd = $evV72$join(pathPart, cmd); + const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd; + resolve(subStep(p, i, 0)); + }); + const subStep = (p, i, ii)=>new Promise((resolve, reject)=>{ + if (ii === pathExt.length) return resolve(step(i + 1)); + const ext = pathExt[ii]; + $0b1af7ee1bc1c627$exports(p + ext, { + pathExt: pathExtExe + }, (er, is)=>{ + if (!er && is) { + if (opt.all) found.push(p + ext); + else return resolve(p + ext); + } + return resolve(subStep(p, i, ii + 1)); + }); + }); + return cb ? step(0).then((res)=>cb(null, res), cb) : step(0); +}; +const $10bb1950eec72619$var$whichSync = (cmd, opt)=>{ + opt = opt || {}; + const { pathEnv: pathEnv, pathExt: pathExt, pathExtExe: pathExtExe } = $10bb1950eec72619$var$getPathInfo(cmd, opt); + const found = []; + for(let i = 0; i < pathEnv.length; i++){ + const ppRaw = pathEnv[i]; + const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw; + const pCmd = $evV72$join(pathPart, cmd); + const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd; + for(let j = 0; j < pathExt.length; j++){ + const cur = p + pathExt[j]; + try { + const is = $0b1af7ee1bc1c627$exports.sync(cur, { + pathExt: pathExtExe + }); + if (is) { + if (opt.all) found.push(cur); + else return cur; + } + } catch (ex) {} + } + } + if (opt.all && found.length) return found; + if (opt.nothrow) return null; + throw $10bb1950eec72619$var$getNotFoundError(cmd); +}; +$10bb1950eec72619$exports = $10bb1950eec72619$var$which; +$10bb1950eec72619$var$which.sync = $10bb1950eec72619$var$whichSync; + + +var $3487f7b8c16699fc$exports = {}; +"use strict"; +const $3487f7b8c16699fc$var$pathKey = (options = {})=>{ + const environment = options.env || process.env; + const platform = options.platform || process.platform; + if (platform !== "win32") return "PATH"; + return Object.keys(environment).reverse().find((key)=>key.toUpperCase() === "PATH") || "Path"; +}; +$3487f7b8c16699fc$exports = $3487f7b8c16699fc$var$pathKey; +// TODO: Remove this for the next major release +$3487f7b8c16699fc$exports.default = $3487f7b8c16699fc$var$pathKey; + + +function $37f30101baa1381d$var$resolveCommandAttempt(parsed, withoutPathExt) { + const env = parsed.options.env || process.env; + const cwd = process.cwd(); + const hasCustomCwd = parsed.options.cwd != null; + // Worker threads do not have process.chdir() + const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined && !process.chdir.disabled; + // If a custom `cwd` was specified, we need to change the process cwd + // because `which` will do stat calls but does not support a custom cwd + if (shouldSwitchCwd) try { + process.chdir(parsed.options.cwd); + } catch (err) { + /* Empty */ } + let resolved; + try { + resolved = $10bb1950eec72619$exports.sync(parsed.command, { + path: env[$3487f7b8c16699fc$exports({ + env: env + })], + pathExt: withoutPathExt ? $evV72$delimiter : undefined + }); + } catch (e) { + /* Empty */ } finally{ + if (shouldSwitchCwd) process.chdir(cwd); + } + // If we successfully resolved, ensure that an absolute path is returned + // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it + if (resolved) resolved = $evV72$resolve(hasCustomCwd ? parsed.options.cwd : "", resolved); + return resolved; +} +function $37f30101baa1381d$var$resolveCommand(parsed) { + return $37f30101baa1381d$var$resolveCommandAttempt(parsed) || $37f30101baa1381d$var$resolveCommandAttempt(parsed, true); +} +$37f30101baa1381d$exports = $37f30101baa1381d$var$resolveCommand; + + +var $cbf6c9fb7b5a3003$export$ae50443ffc990749; +var $cbf6c9fb7b5a3003$export$6ea29ee575e3f5ff; +"use strict"; +// See http://www.robvanderwoude.com/escapechars.php +const $cbf6c9fb7b5a3003$var$metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g; +function $cbf6c9fb7b5a3003$var$escapeCommand(arg) { + // Escape meta chars + arg = arg.replace($cbf6c9fb7b5a3003$var$metaCharsRegExp, "^$1"); + return arg; +} +function $cbf6c9fb7b5a3003$var$escapeArgument(arg, doubleEscapeMetaChars) { + // Convert to string + arg = `${arg}`; + // Algorithm below is based on https://qntm.org/cmd + // Sequence of backslashes followed by a double quote: + // double up all the backslashes and escape the double quote + arg = arg.replace(/(\\*)"/g, '$1$1\\"'); + // Sequence of backslashes followed by the end of the string + // (which will become a double quote later): + // double up all the backslashes + arg = arg.replace(/(\\*)$/, "$1$1"); + // All other backslashes occur literally + // Quote the whole thing: + arg = `"${arg}"`; + // Escape meta chars + arg = arg.replace($cbf6c9fb7b5a3003$var$metaCharsRegExp, "^$1"); + // Double escape meta chars if necessary + if (doubleEscapeMetaChars) arg = arg.replace($cbf6c9fb7b5a3003$var$metaCharsRegExp, "^$1"); + return arg; +} +$cbf6c9fb7b5a3003$export$ae50443ffc990749 = $cbf6c9fb7b5a3003$var$escapeCommand; +$cbf6c9fb7b5a3003$export$6ea29ee575e3f5ff = $cbf6c9fb7b5a3003$var$escapeArgument; + + +var $4bfe3bff3b3eb488$exports = {}; +"use strict"; + +var $550cee7733391e8f$exports = {}; +"use strict"; +var $41ec2024f8465164$exports = {}; +"use strict"; +$41ec2024f8465164$exports = /^#!(.*)/; + + +$550cee7733391e8f$exports = (string = "")=>{ + const match = string.match($41ec2024f8465164$exports); + if (!match) return null; + const [path, argument] = match[0].replace(/#! ?/, "").split(" "); + const binary = path.split("/").pop(); + if (binary === "env") return argument; + return argument ? `${binary} ${argument}` : binary; +}; + + +function $4bfe3bff3b3eb488$var$readShebang(command) { + // Read the first 150 bytes from the file + const size = 150; + const buffer = Buffer.alloc(size); + let fd; + try { + fd = $evV72$openSync(command, "r"); + $evV72$readSync(fd, buffer, 0, size, 0); + $evV72$closeSync(fd); + } catch (e) {} + // Attempt to extract shebang (null is returned if not a shebang) + return $550cee7733391e8f$exports(buffer.toString()); +} +$4bfe3bff3b3eb488$exports = $4bfe3bff3b3eb488$var$readShebang; + + +const $9f07a96c8577f666$var$isWin = process.platform === "win32"; +const $9f07a96c8577f666$var$isExecutableRegExp = /\.(?:com|exe)$/i; +const $9f07a96c8577f666$var$isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i; +function $9f07a96c8577f666$var$detectShebang(parsed) { + parsed.file = $37f30101baa1381d$exports(parsed); + const shebang = parsed.file && $4bfe3bff3b3eb488$exports(parsed.file); + if (shebang) { + parsed.args.unshift(parsed.file); + parsed.command = shebang; + return $37f30101baa1381d$exports(parsed); + } + return parsed.file; +} +function $9f07a96c8577f666$var$parseNonShell(parsed) { + if (!$9f07a96c8577f666$var$isWin) return parsed; + // Detect & add support for shebangs + const commandFile = $9f07a96c8577f666$var$detectShebang(parsed); + // We don't need a shell if the command filename is an executable + const needsShell = !$9f07a96c8577f666$var$isExecutableRegExp.test(commandFile); + // If a shell is required, use cmd.exe and take care of escaping everything correctly + // Note that `forceShell` is an hidden option used only in tests + if (parsed.options.forceShell || needsShell) { + // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/` + // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument + // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called, + // we need to double escape them + const needsDoubleEscapeMetaChars = $9f07a96c8577f666$var$isCmdShimRegExp.test(commandFile); + // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar) + // This is necessary otherwise it will always fail with ENOENT in those cases + parsed.command = $evV72$normalize(parsed.command); + // Escape command & arguments + parsed.command = $cbf6c9fb7b5a3003$export$ae50443ffc990749(parsed.command); + parsed.args = parsed.args.map((arg)=>$cbf6c9fb7b5a3003$export$6ea29ee575e3f5ff(arg, needsDoubleEscapeMetaChars)); + const shellCommand = [ + parsed.command + ].concat(parsed.args).join(" "); + parsed.args = [ + "/d", + "/s", + "/c", + `"${shellCommand}"` + ]; + parsed.command = process.env.comspec || "cmd.exe"; + parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped + } + return parsed; +} +function $9f07a96c8577f666$var$parse(command, args, options) { + // Normalize arguments, similar to nodejs + if (args && !Array.isArray(args)) { + options = args; + args = null; + } + args = args ? args.slice(0) : []; // Clone array to avoid changing the original + options = Object.assign({}, options); // Clone object to avoid changing the original + // Build our parsed object + const parsed = { + command: command, + args: args, + options: options, + file: undefined, + original: { + command: command, + args: args + } + }; + // Delegate further parsing to shell or non-shell + return options.shell ? parsed : $9f07a96c8577f666$var$parseNonShell(parsed); +} +$9f07a96c8577f666$exports = $9f07a96c8577f666$var$parse; + + +var $1ef36613317ba37d$exports = {}; +"use strict"; +const $1ef36613317ba37d$var$isWin = process.platform === "win32"; +function $1ef36613317ba37d$var$notFoundError(original, syscall) { + return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), { + code: "ENOENT", + errno: "ENOENT", + syscall: `${syscall} ${original.command}`, + path: original.command, + spawnargs: original.args + }); +} +function $1ef36613317ba37d$var$hookChildProcess(cp, parsed) { + if (!$1ef36613317ba37d$var$isWin) return; + const originalEmit = cp.emit; + cp.emit = function(name, arg1) { + // If emitting "exit" event and exit code is 1, we need to check if + // the command exists and emit an "error" instead + // See https://github.com/IndigoUnited/node-cross-spawn/issues/16 + if (name === "exit") { + const err = $1ef36613317ba37d$var$verifyENOENT(arg1, parsed, "spawn"); + if (err) return originalEmit.call(cp, "error", err); + } + return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params + }; +} +function $1ef36613317ba37d$var$verifyENOENT(status, parsed) { + if ($1ef36613317ba37d$var$isWin && status === 1 && !parsed.file) return $1ef36613317ba37d$var$notFoundError(parsed.original, "spawn"); + return null; +} +function $1ef36613317ba37d$var$verifyENOENTSync(status, parsed) { + if ($1ef36613317ba37d$var$isWin && status === 1 && !parsed.file) return $1ef36613317ba37d$var$notFoundError(parsed.original, "spawnSync"); + return null; +} +$1ef36613317ba37d$exports = { + hookChildProcess: $1ef36613317ba37d$var$hookChildProcess, + verifyENOENT: $1ef36613317ba37d$var$verifyENOENT, + verifyENOENTSync: $1ef36613317ba37d$var$verifyENOENTSync, + notFoundError: $1ef36613317ba37d$var$notFoundError +}; + + +function $92de28abfb9027ac$var$spawn(command, args, options) { + // Parse the arguments + const parsed = $9f07a96c8577f666$exports(command, args, options); + // Spawn the child process + const spawned = $evV72$spawn(parsed.command, parsed.args, parsed.options); + // Hook into child process "exit" event to emit an error if the command + // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 + $1ef36613317ba37d$exports.hookChildProcess(spawned, parsed); + return spawned; +} +function $92de28abfb9027ac$var$spawnSync(command, args, options) { + // Parse the arguments + const parsed = $9f07a96c8577f666$exports(command, args, options); + // Spawn the child process + const result = $evV72$spawnSync(parsed.command, parsed.args, parsed.options); + // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 + result.error = result.error || $1ef36613317ba37d$exports.verifyENOENTSync(result.status, parsed); + return result; +} +$92de28abfb9027ac$exports = $92de28abfb9027ac$var$spawn; +$92de28abfb9027ac$exports.spawn = $92de28abfb9027ac$var$spawn; +$92de28abfb9027ac$exports.sync = $92de28abfb9027ac$var$spawnSync; +$92de28abfb9027ac$exports._parse = $9f07a96c8577f666$exports; +$92de28abfb9027ac$exports._enoent = $1ef36613317ba37d$exports; + + +/** Spawns a child process, as long as you ask nicely. + * + * @param {string} command - The shell command to execute. + * @param {string[]} [args] - An array of arguments that are given after the command. + * @param {{ rejectOnError?: boolean, stdin?: string, stderr?: (data: string) => void, stdout?: (data: string) => void }} [options] - Options. + * @param {any} [spawnOptions] - Options that are passed directly to child_process.spawn. Also supports stdin: string. + * @returns {Promise<{ stdout: string, stderr: string }>} + */ const $03c48d50d9d7039f$var$spawnPlease = (command, args, options = {}, spawnOptions = {})=>{ + // defaults + if (options.rejectOnError === undefined) options.rejectOnError = true; + let stdout = ""; + let stderr = ""; + const child = $92de28abfb9027ac$exports(command, args, spawnOptions); + return new Promise((resolve, reject)=>{ + if (options.stdin !== undefined && options.stdin != null) child.stdin.write(options.stdin); + child.stdin.end(); + child.stdout.on("data", (data)=>{ + stdout += data; + if (options.stdout) options.stdout(data); + }); + child.stderr.on("data", (data)=>{ + stderr += data; + if (options.stderr) options.stderr(data); + }); + if (options.rejectOnError) child.addListener("error", reject); + child.on("close", (code)=>{ + if (code !== 0 && options.rejectOnError) reject(stderr); + else resolve({ + stdout: stdout, + stderr: stderr + }); + }); + }); +}; +$03c48d50d9d7039f$exports = $03c48d50d9d7039f$var$spawnPlease; + + +function $4c028fad90f63861$export$889ea624f2cb2c57(command, args) { + return (0, (/*@__PURE__*/$parcel$interopDefault($03c48d50d9d7039f$exports)))(command, args, {}, { + stdout: "inherit" + }); +} + + +async function $bd1d73aff0732146$var$injectCache(cacheSource, cacheTarget, scratchDir) { + // Clean Scratch Directory + await $evV72$rm(scratchDir, { + recursive: true, + force: true + }); + await $evV72$mkdir(scratchDir, { + recursive: true + }); + // Prepare Cache Source Directory + await $evV72$mkdir(cacheSource, { + recursive: true + }); + // Prepare Timestamp for Layer Cache Busting + const { stdout: date } = await (0, $4c028fad90f63861$export$889ea624f2cb2c57)("date", [ + "--iso=ns" + ]); + await $evV72$writeFile($evV72$join(cacheSource, "buildstamp"), date); + // Prepare Dancefile to Access Caches + const dancefileContent = ` +FROM busybox:1 +COPY buildstamp buildstamp +RUN --mount=type=cache,target=${cacheTarget} \ + --mount=type=bind,source=.,target=/var/dance-cache \ + cp -p -R /var/dance-cache/. ${cacheTarget} || true +`; + await $evV72$writeFile($evV72$join(scratchDir, "Dancefile.inject"), dancefileContent); + console.log(dancefileContent); + // Inject Data into Docker Cache + await (0, $4c028fad90f63861$export$889ea624f2cb2c57)("docker", [ + "buildx", + "build", + "-f", + $evV72$join(scratchDir, "Dancefile.inject"), + "--tag", + "dance:inject", + cacheSource + ]); + // Clean Directories + await $evV72$rm(cacheSource, { + recursive: true, + force: true + }); +} +async function $bd1d73aff0732146$export$38c65e9f06d3d433(opts) { + const cacheMap = (0, $76d06fcdc9bff1f5$export$8550a4d7282a21d0)(opts); + const scratchDir = opts["scratch-dir"]; + // Inject Caches for each source-target pair + for (const [cacheSource, cacheTarget] of Object.entries(cacheMap))await $bd1d73aff0732146$var$injectCache(cacheSource, cacheTarget, scratchDir); +} + + + + + + +async function $8d40300f3635b768$var$extractCache(cacheSource, cacheTarget, scratchDir) { + // Prepare Timestamp for Layer Cache Busting + const { stdout: date } = await (0, $4c028fad90f63861$export$889ea624f2cb2c57)("date", [ + "--iso=ns" + ]); + await $evV72$writeFile($evV72$join(scratchDir, "buildstamp"), date); + // Prepare Dancefile to Access Caches + const dancefileContent = ` +FROM busybox:1 +COPY buildstamp buildstamp +RUN --mount=type=cache,target=${cacheTarget} \ + mkdir -p /var/dance-cache/ \ + && cp -p -R ${cacheTarget}/. /var/dance-cache/ || true +`; + await $evV72$writeFile($evV72$join(scratchDir, "Dancefile.extract"), dancefileContent); + console.log(dancefileContent); + // Extract Data into Docker Image + await (0, $4c028fad90f63861$export$889ea624f2cb2c57)("docker", [ + "buildx", + "build", + "-f", + $evV72$join(scratchDir, "Dancefile.extract"), + "--tag", + "dance:extract", + "--load", + scratchDir + ]); + // Create Extraction Image + try { + await (0, $4c028fad90f63861$export$889ea624f2cb2c57)("docker", [ + "rm", + "-f", + "cache-container" + ]); + } catch (error) { + // Ignore error if container does not exist + } + await (0, $4c028fad90f63861$export$889ea624f2cb2c57)("docker", [ + "create", + "-ti", + "--name", + "cache-container", + "dance:extract" + ]); + // Unpack Docker Image into Scratch + const { stdout: tarOutput } = await (0, $4c028fad90f63861$export$889ea624f2cb2c57)("docker", [ + "cp", + "-L", + "cache-container:/var/dance-cache", + "-" + ]); + await $evV72$writeFile($evV72$join(scratchDir, "dance-cache.tar"), tarOutput); + await (0, $4c028fad90f63861$export$889ea624f2cb2c57)("tar", [ + "-H", + "posix", + "-x", + "-C", + scratchDir, + "-f", + $evV72$join(scratchDir, "dance-cache.tar") + ]); + // Move Cache into Its Place + await $evV72$rm(cacheSource, { + recursive: true, + force: true + }); + await $evV72$rename($evV72$join(scratchDir, "dance-cache"), cacheSource); +} +async function $8d40300f3635b768$export$bd3cfa0c41fc7012(opts) { + if (opts["skip-extraction"]) { + console.log("skip-extraction is set. Skipping extraction step..."); + return; + } + const cacheMap = (0, $76d06fcdc9bff1f5$export$8550a4d7282a21d0)(opts); + const scratchDir = opts["scratch-dir"]; + // Extract Caches for each source-target pair + for (const [cacheSource, cacheTarget] of Object.entries(cacheMap))await $8d40300f3635b768$var$extractCache(cacheSource, cacheTarget, scratchDir); +} + + + +async function $bec5d2ddaaf4a876$var$main(args) { + const opts = (0, $76d06fcdc9bff1f5$export$77714ac6976d0316)(args); + const is_post_step = process.env[`STATE_POST`] !== undefined; + if (is_post_step) // Run the post step + (0, $8d40300f3635b768$export$bd3cfa0c41fc7012)(opts); + else { + // Otherwise, this is the main step + if (process.env.GITHUB_STATE === undefined) throw new Error("GITHUB_STATE is not defined"); + await (0, $evV72$appendFile)(process.env.GITHUB_STATE, `POST=true${(0, $evV72$EOL)}`); + await (0, $bd1d73aff0732146$export$38c65e9f06d3d433)(opts); + } +} +await $bec5d2ddaaf4a876$var$main(process.argv); + + +//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map new file mode 100644 index 0000000..a63e5dd --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"mappings":"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","sources":["node_modules/.pnpm/isexe@2.0.0/node_modules/isexe/windows.js","node_modules/.pnpm/isexe@2.0.0/node_modules/isexe/mode.js","src/index.ts","src/inject-cache.ts","src/opts.ts","node_modules/.pnpm/mri@1.2.0/node_modules/mri/lib/index.mjs","src/run.ts","node_modules/.pnpm/spawn-please@3.0.0/node_modules/spawn-please/src/index.js","node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/index.js","node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/parse.js","node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/resolveCommand.js","node_modules/.pnpm/which@2.0.2/node_modules/which/which.js","node_modules/.pnpm/isexe@2.0.0/node_modules/isexe/index.js","node_modules/.pnpm/path-key@3.1.1/node_modules/path-key/index.js","node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/escape.js","node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/readShebang.js","node_modules/.pnpm/shebang-command@2.0.0/node_modules/shebang-command/index.js","node_modules/.pnpm/shebang-regex@3.0.0/node_modules/shebang-regex/index.js","node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/enoent.js","src/extract-cache.ts"],"sourcesContent":["module.exports = isexe\nisexe.sync = sync\n\nvar fs = require('fs')\n\nfunction checkPathExt (path, options) {\n var pathext = options.pathExt !== undefined ?\n options.pathExt : process.env.PATHEXT\n\n if (!pathext) {\n return true\n }\n\n pathext = pathext.split(';')\n if (pathext.indexOf('') !== -1) {\n return true\n }\n for (var i = 0; i < pathext.length; i++) {\n var p = pathext[i].toLowerCase()\n if (p && path.substr(-p.length).toLowerCase() === p) {\n return true\n }\n }\n return false\n}\n\nfunction checkStat (stat, path, options) {\n if (!stat.isSymbolicLink() && !stat.isFile()) {\n return false\n }\n return checkPathExt(path, options)\n}\n\nfunction isexe (path, options, cb) {\n fs.stat(path, function (er, stat) {\n cb(er, er ? false : checkStat(stat, path, options))\n })\n}\n\nfunction sync (path, options) {\n return checkStat(fs.statSync(path), path, options)\n}\n","module.exports = isexe\nisexe.sync = sync\n\nvar fs = require('fs')\n\nfunction isexe (path, options, cb) {\n fs.stat(path, function (er, stat) {\n cb(er, er ? false : checkStat(stat, options))\n })\n}\n\nfunction sync (path, options) {\n return checkStat(fs.statSync(path), options)\n}\n\nfunction checkStat (stat, options) {\n return stat.isFile() && checkMode(stat, options)\n}\n\nfunction checkMode (stat, options) {\n var mod = stat.mode\n var uid = stat.uid\n var gid = stat.gid\n\n var myUid = options.uid !== undefined ?\n options.uid : process.getuid && process.getuid()\n var myGid = options.gid !== undefined ?\n options.gid : process.getgid && process.getgid()\n\n var u = parseInt('100', 8)\n var g = parseInt('010', 8)\n var o = parseInt('001', 8)\n var ug = u | g\n\n var ret = (mod & o) ||\n (mod & g) && gid === myGid ||\n (mod & u) && uid === myUid ||\n (mod & ug) && myUid === 0\n\n return ret\n}\n","// Forked from https://github.com/pyTooling/Actions/blob/v0.4.6/with-post-step/main.js\n// The following copyright header is from the upstream.\n\n/* ================================================================================================================== *\n * Authors: *\n * Unai Martinez-Corral *\n * Amin Yahyaabadi *\n * *\n * ================================================================================================================== *\n * Copyright 2021-2022 Unai Martinez-Corral *\n * Copyright 2022 Unai Martinez-Corral *\n * *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); *\n * you may not use this file except in compliance with the License. *\n * You may obtain a copy of the License at *\n * *\n * http://www.apache.org/licenses/LICENSE-2.0 *\n * *\n * Unless required by applicable law or agreed to in writing, software *\n * distributed under the License is distributed on an \"AS IS\" BASIS, *\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *\n * See the License for the specific language governing permissions and *\n * limitations under the License. *\n * *\n * SPDX-License-Identifier: Apache-2.0 *\n * ================================================================================================================== *\n * *\n * Context: *\n * * https://github.com/docker/login-action/issues/72 *\n * * https://github.com/actions/runner/issues/1478 *\n * ================================================================================================================== */\nimport { appendFile } from \"fs/promises\";\nimport { EOL } from \"os\";\nimport { injectCaches } from \"./inject-cache.js\";\nimport { extractCaches } from \"./extract-cache.js\";\nimport { parseOpts } from \"./opts.js\";\n\nasync function main(args: string[]) {\n const opts = parseOpts(args);\n\n const is_post_step = process.env[`STATE_POST`] !== undefined;\n\n if (is_post_step) {\n // Run the post step\n extractCaches(opts);\n } else {\n // Otherwise, this is the main step\n if (process.env.GITHUB_STATE === undefined) {\n throw new Error(\"GITHUB_STATE is not defined\");\n }\n await appendFile(process.env.GITHUB_STATE, `POST=true${EOL}`);\n await injectCaches(opts);\n }\n}\n\nawait main(process.argv);\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { Opts, getCacheMap } from './opts.js';\nimport { run } from './run.js';\n\nasync function injectCache(cacheSource: string, cacheTarget: string, scratchDir: string) {\n // Clean Scratch Directory\n await fs.rm(scratchDir, { recursive: true, force: true });\n await fs.mkdir(scratchDir, { recursive: true });\n\n // Prepare Cache Source Directory\n await fs.mkdir(cacheSource, { recursive: true });\n\n // Prepare Timestamp for Layer Cache Busting\n const { stdout: date } = await run('date', ['--iso=ns']);\n await fs.writeFile(path.join(cacheSource, 'buildstamp'), date);\n\n // Prepare Dancefile to Access Caches\n const dancefileContent = `\nFROM busybox:1\nCOPY buildstamp buildstamp\nRUN --mount=type=cache,target=${cacheTarget} \\\n --mount=type=bind,source=.,target=/var/dance-cache \\\n cp -p -R /var/dance-cache/. ${cacheTarget} || true\n`;\n await fs.writeFile(path.join(scratchDir, 'Dancefile.inject'), dancefileContent);\n console.log(dancefileContent);\n\n // Inject Data into Docker Cache\n await run('docker', ['buildx', 'build', '-f', path.join(scratchDir, 'Dancefile.inject'), '--tag', 'dance:inject', cacheSource]);\n\n // Clean Directories\n await fs.rm(cacheSource, { recursive: true, force: true });\n}\n\n\nexport async function injectCaches(opts: Opts) {\n const cacheMap = getCacheMap(opts);\n const scratchDir = opts['scratch-dir'];\n\n // Inject Caches for each source-target pair\n for (const [cacheSource, cacheTarget] of Object.entries(cacheMap)) {\n await injectCache(cacheSource, cacheTarget, scratchDir);\n }\n}\n","import mri from 'mri';\n\nexport type Opts = {\n \"cache-map\": string\n \"scratch-dir\": string\n \"skip-extraction\": boolean\n}\n\nexport function parseOpts(args: string[]): mri.Argv {\n return mri(args, {\n default: {\n \"cache-map\": getInput(\"cache-map\"),\n \"scratch-dir\": getInput(\"scratch-dir\"),\n \"skip-extraction\": getInput(\"skip-extraction\") === \"true\",\n },\n string: [\"cache-map\", \"scratch-dir\"],\n boolean: [\"skip-extraction\"],\n })\n}\n\n/**\n * Get the action input value from the environment (INPUT_NAME)\n */\nfunction getInput(name: string) {\n const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';\n return val.trim();\n}\n\nexport function getCacheMap(opts: Opts): Record {\n try {\n return JSON.parse(opts[\"cache-map\"]) as Record;\n } catch (e) {\n throw new Error(`Failed to parse cache map. Expected JSON, got:\\n${opts[\"cache-map\"]}\\n${e}`);\n }\n}\n","function toArr(any) {\n\treturn any == null ? [] : Array.isArray(any) ? any : [any];\n}\n\nfunction toVal(out, key, val, opts) {\n\tvar x, old=out[key], nxt=(\n\t\t!!~opts.string.indexOf(key) ? (val == null || val === true ? '' : String(val))\n\t\t: typeof val === 'boolean' ? val\n\t\t: !!~opts.boolean.indexOf(key) ? (val === 'false' ? false : val === 'true' || (out._.push((x = +val,x * 0 === 0) ? x : val),!!val))\n\t\t: (x = +val,x * 0 === 0) ? x : val\n\t);\n\tout[key] = old == null ? nxt : (Array.isArray(old) ? old.concat(nxt) : [old, nxt]);\n}\n\nexport default function (args, opts) {\n\targs = args || [];\n\topts = opts || {};\n\n\tvar k, arr, arg, name, val, out={ _:[] };\n\tvar i=0, j=0, idx=0, len=args.length;\n\n\tconst alibi = opts.alias !== void 0;\n\tconst strict = opts.unknown !== void 0;\n\tconst defaults = opts.default !== void 0;\n\n\topts.alias = opts.alias || {};\n\topts.string = toArr(opts.string);\n\topts.boolean = toArr(opts.boolean);\n\n\tif (alibi) {\n\t\tfor (k in opts.alias) {\n\t\t\tarr = opts.alias[k] = toArr(opts.alias[k]);\n\t\t\tfor (i=0; i < arr.length; i++) {\n\t\t\t\t(opts.alias[arr[i]] = arr.concat(k)).splice(i, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (i=opts.boolean.length; i-- > 0;) {\n\t\tarr = opts.alias[opts.boolean[i]] || [];\n\t\tfor (j=arr.length; j-- > 0;) opts.boolean.push(arr[j]);\n\t}\n\n\tfor (i=opts.string.length; i-- > 0;) {\n\t\tarr = opts.alias[opts.string[i]] || [];\n\t\tfor (j=arr.length; j-- > 0;) opts.string.push(arr[j]);\n\t}\n\n\tif (defaults) {\n\t\tfor (k in opts.default) {\n\t\t\tname = typeof opts.default[k];\n\t\t\tarr = opts.alias[k] = opts.alias[k] || [];\n\t\t\tif (opts[name] !== void 0) {\n\t\t\t\topts[name].push(k);\n\t\t\t\tfor (i=0; i < arr.length; i++) {\n\t\t\t\t\topts[name].push(arr[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst keys = strict ? Object.keys(opts.alias) : [];\n\n\tfor (i=0; i < len; i++) {\n\t\targ = args[i];\n\n\t\tif (arg === '--') {\n\t\t\tout._ = out._.concat(args.slice(++i));\n\t\t\tbreak;\n\t\t}\n\n\t\tfor (j=0; j < arg.length; j++) {\n\t\t\tif (arg.charCodeAt(j) !== 45) break; // \"-\"\n\t\t}\n\n\t\tif (j === 0) {\n\t\t\tout._.push(arg);\n\t\t} else if (arg.substring(j, j + 3) === 'no-') {\n\t\t\tname = arg.substring(j + 3);\n\t\t\tif (strict && !~keys.indexOf(name)) {\n\t\t\t\treturn opts.unknown(arg);\n\t\t\t}\n\t\t\tout[name] = false;\n\t\t} else {\n\t\t\tfor (idx=j+1; idx < arg.length; idx++) {\n\t\t\t\tif (arg.charCodeAt(idx) === 61) break; // \"=\"\n\t\t\t}\n\n\t\t\tname = arg.substring(j, idx);\n\t\t\tval = arg.substring(++idx) || (i+1 === len || (''+args[i+1]).charCodeAt(0) === 45 || args[++i]);\n\t\t\tarr = (j === 2 ? [name] : name);\n\n\t\t\tfor (idx=0; idx < arr.length; idx++) {\n\t\t\t\tname = arr[idx];\n\t\t\t\tif (strict && !~keys.indexOf(name)) return opts.unknown('-'.repeat(j) + name);\n\t\t\t\ttoVal(out, name, (idx + 1 < arr.length) || val, opts);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (defaults) {\n\t\tfor (k in opts.default) {\n\t\t\tif (out[k] === void 0) {\n\t\t\t\tout[k] = opts.default[k];\n\t\t\t}\n\t\t}\n\t}\n\n\tif (alibi) {\n\t\tfor (k in out) {\n\t\t\tarr = opts.alias[k] || [];\n\t\t\twhile (arr.length > 0) {\n\t\t\t\tout[arr.shift()] = out[k];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn out;\n}\n","import spawn from 'spawn-please'\n\nexport function run(command: string, args: string[]) {\n return spawn(command, args, {}, { stdout: 'inherit' });\n}\n","const spawn = require('cross-spawn')\n\n/** Spawns a child process, as long as you ask nicely.\n * \n * @param {string} command - The shell command to execute.\n * @param {string[]} [args] - An array of arguments that are given after the command.\n * @param {{ rejectOnError?: boolean, stdin?: string, stderr?: (data: string) => void, stdout?: (data: string) => void }} [options] - Options.\n * @param {any} [spawnOptions] - Options that are passed directly to child_process.spawn. Also supports stdin: string.\n * @returns {Promise<{ stdout: string, stderr: string }>}\n */\nconst spawnPlease = (command, args, options={}, spawnOptions={}) => {\n // defaults\n if (options.rejectOnError === undefined) {\n options.rejectOnError = true\n }\n\n let stdout = ''\n let stderr = ''\n const child = spawn(command, args, spawnOptions)\n\n return new Promise((resolve, reject) => {\n if (options.stdin !== undefined && options.stdin != null) {\n child.stdin.write(options.stdin)\n }\n child.stdin.end()\n\n child.stdout.on('data', data => {\n stdout += data\n if (options.stdout) options.stdout(data)\n })\n\n child.stderr.on('data', data => {\n stderr += data\n if (options.stderr) options.stderr(data)\n })\n\n if (options.rejectOnError) {\n child.addListener('error', reject)\n }\n\n child.on('close', code => {\n if (code !== 0 && options.rejectOnError) {\n reject(stderr)\n } else {\n resolve({ stdout, stderr })\n }\n })\n })\n}\n\nmodule.exports = spawnPlease\n","'use strict';\n\nconst cp = require('child_process');\nconst parse = require('./lib/parse');\nconst enoent = require('./lib/enoent');\n\nfunction spawn(command, args, options) {\n // Parse the arguments\n const parsed = parse(command, args, options);\n\n // Spawn the child process\n const spawned = cp.spawn(parsed.command, parsed.args, parsed.options);\n\n // Hook into child process \"exit\" event to emit an error if the command\n // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16\n enoent.hookChildProcess(spawned, parsed);\n\n return spawned;\n}\n\nfunction spawnSync(command, args, options) {\n // Parse the arguments\n const parsed = parse(command, args, options);\n\n // Spawn the child process\n const result = cp.spawnSync(parsed.command, parsed.args, parsed.options);\n\n // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16\n result.error = result.error || enoent.verifyENOENTSync(result.status, parsed);\n\n return result;\n}\n\nmodule.exports = spawn;\nmodule.exports.spawn = spawn;\nmodule.exports.sync = spawnSync;\n\nmodule.exports._parse = parse;\nmodule.exports._enoent = enoent;\n","'use strict';\n\nconst path = require('path');\nconst resolveCommand = require('./util/resolveCommand');\nconst escape = require('./util/escape');\nconst readShebang = require('./util/readShebang');\n\nconst isWin = process.platform === 'win32';\nconst isExecutableRegExp = /\\.(?:com|exe)$/i;\nconst isCmdShimRegExp = /node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/i;\n\nfunction detectShebang(parsed) {\n parsed.file = resolveCommand(parsed);\n\n const shebang = parsed.file && readShebang(parsed.file);\n\n if (shebang) {\n parsed.args.unshift(parsed.file);\n parsed.command = shebang;\n\n return resolveCommand(parsed);\n }\n\n return parsed.file;\n}\n\nfunction parseNonShell(parsed) {\n if (!isWin) {\n return parsed;\n }\n\n // Detect & add support for shebangs\n const commandFile = detectShebang(parsed);\n\n // We don't need a shell if the command filename is an executable\n const needsShell = !isExecutableRegExp.test(commandFile);\n\n // If a shell is required, use cmd.exe and take care of escaping everything correctly\n // Note that `forceShell` is an hidden option used only in tests\n if (parsed.options.forceShell || needsShell) {\n // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/`\n // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument\n // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called,\n // we need to double escape them\n const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile);\n\n // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\\bar)\n // This is necessary otherwise it will always fail with ENOENT in those cases\n parsed.command = path.normalize(parsed.command);\n\n // Escape command & arguments\n parsed.command = escape.command(parsed.command);\n parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars));\n\n const shellCommand = [parsed.command].concat(parsed.args).join(' ');\n\n parsed.args = ['/d', '/s', '/c', `\"${shellCommand}\"`];\n parsed.command = process.env.comspec || 'cmd.exe';\n parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped\n }\n\n return parsed;\n}\n\nfunction parse(command, args, options) {\n // Normalize arguments, similar to nodejs\n if (args && !Array.isArray(args)) {\n options = args;\n args = null;\n }\n\n args = args ? args.slice(0) : []; // Clone array to avoid changing the original\n options = Object.assign({}, options); // Clone object to avoid changing the original\n\n // Build our parsed object\n const parsed = {\n command,\n args,\n options,\n file: undefined,\n original: {\n command,\n args,\n },\n };\n\n // Delegate further parsing to shell or non-shell\n return options.shell ? parsed : parseNonShell(parsed);\n}\n\nmodule.exports = parse;\n","'use strict';\n\nconst path = require('path');\nconst which = require('which');\nconst getPathKey = require('path-key');\n\nfunction resolveCommandAttempt(parsed, withoutPathExt) {\n const env = parsed.options.env || process.env;\n const cwd = process.cwd();\n const hasCustomCwd = parsed.options.cwd != null;\n // Worker threads do not have process.chdir()\n const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined && !process.chdir.disabled;\n\n // If a custom `cwd` was specified, we need to change the process cwd\n // because `which` will do stat calls but does not support a custom cwd\n if (shouldSwitchCwd) {\n try {\n process.chdir(parsed.options.cwd);\n } catch (err) {\n /* Empty */\n }\n }\n\n let resolved;\n\n try {\n resolved = which.sync(parsed.command, {\n path: env[getPathKey({ env })],\n pathExt: withoutPathExt ? path.delimiter : undefined,\n });\n } catch (e) {\n /* Empty */\n } finally {\n if (shouldSwitchCwd) {\n process.chdir(cwd);\n }\n }\n\n // If we successfully resolved, ensure that an absolute path is returned\n // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it\n if (resolved) {\n resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved);\n }\n\n return resolved;\n}\n\nfunction resolveCommand(parsed) {\n return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true);\n}\n\nmodule.exports = resolveCommand;\n","const isWindows = process.platform === 'win32' ||\n process.env.OSTYPE === 'cygwin' ||\n process.env.OSTYPE === 'msys'\n\nconst path = require('path')\nconst COLON = isWindows ? ';' : ':'\nconst isexe = require('isexe')\n\nconst getNotFoundError = (cmd) =>\n Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' })\n\nconst getPathInfo = (cmd, opt) => {\n const colon = opt.colon || COLON\n\n // If it has a slash, then we don't bother searching the pathenv.\n // just check the file itself, and that's it.\n const pathEnv = cmd.match(/\\//) || isWindows && cmd.match(/\\\\/) ? ['']\n : (\n [\n // windows always checks the cwd first\n ...(isWindows ? [process.cwd()] : []),\n ...(opt.path || process.env.PATH ||\n /* istanbul ignore next: very unusual */ '').split(colon),\n ]\n )\n const pathExtExe = isWindows\n ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM'\n : ''\n const pathExt = isWindows ? pathExtExe.split(colon) : ['']\n\n if (isWindows) {\n if (cmd.indexOf('.') !== -1 && pathExt[0] !== '')\n pathExt.unshift('')\n }\n\n return {\n pathEnv,\n pathExt,\n pathExtExe,\n }\n}\n\nconst which = (cmd, opt, cb) => {\n if (typeof opt === 'function') {\n cb = opt\n opt = {}\n }\n if (!opt)\n opt = {}\n\n const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)\n const found = []\n\n const step = i => new Promise((resolve, reject) => {\n if (i === pathEnv.length)\n return opt.all && found.length ? resolve(found)\n : reject(getNotFoundError(cmd))\n\n const ppRaw = pathEnv[i]\n const pathPart = /^\".*\"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw\n\n const pCmd = path.join(pathPart, cmd)\n const p = !pathPart && /^\\.[\\\\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd\n : pCmd\n\n resolve(subStep(p, i, 0))\n })\n\n const subStep = (p, i, ii) => new Promise((resolve, reject) => {\n if (ii === pathExt.length)\n return resolve(step(i + 1))\n const ext = pathExt[ii]\n isexe(p + ext, { pathExt: pathExtExe }, (er, is) => {\n if (!er && is) {\n if (opt.all)\n found.push(p + ext)\n else\n return resolve(p + ext)\n }\n return resolve(subStep(p, i, ii + 1))\n })\n })\n\n return cb ? step(0).then(res => cb(null, res), cb) : step(0)\n}\n\nconst whichSync = (cmd, opt) => {\n opt = opt || {}\n\n const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)\n const found = []\n\n for (let i = 0; i < pathEnv.length; i ++) {\n const ppRaw = pathEnv[i]\n const pathPart = /^\".*\"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw\n\n const pCmd = path.join(pathPart, cmd)\n const p = !pathPart && /^\\.[\\\\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd\n : pCmd\n\n for (let j = 0; j < pathExt.length; j ++) {\n const cur = p + pathExt[j]\n try {\n const is = isexe.sync(cur, { pathExt: pathExtExe })\n if (is) {\n if (opt.all)\n found.push(cur)\n else\n return cur\n }\n } catch (ex) {}\n }\n }\n\n if (opt.all && found.length)\n return found\n\n if (opt.nothrow)\n return null\n\n throw getNotFoundError(cmd)\n}\n\nmodule.exports = which\nwhich.sync = whichSync\n","var fs = require('fs')\nvar core\nif (process.platform === 'win32' || global.TESTING_WINDOWS) {\n core = require('./windows.js')\n} else {\n core = require('./mode.js')\n}\n\nmodule.exports = isexe\nisexe.sync = sync\n\nfunction isexe (path, options, cb) {\n if (typeof options === 'function') {\n cb = options\n options = {}\n }\n\n if (!cb) {\n if (typeof Promise !== 'function') {\n throw new TypeError('callback not provided')\n }\n\n return new Promise(function (resolve, reject) {\n isexe(path, options || {}, function (er, is) {\n if (er) {\n reject(er)\n } else {\n resolve(is)\n }\n })\n })\n }\n\n core(path, options || {}, function (er, is) {\n // ignore EACCES because that just means we aren't allowed to run it\n if (er) {\n if (er.code === 'EACCES' || options && options.ignoreErrors) {\n er = null\n is = false\n }\n }\n cb(er, is)\n })\n}\n\nfunction sync (path, options) {\n // my kingdom for a filtered catch\n try {\n return core.sync(path, options || {})\n } catch (er) {\n if (options && options.ignoreErrors || er.code === 'EACCES') {\n return false\n } else {\n throw er\n }\n }\n}\n","'use strict';\n\nconst pathKey = (options = {}) => {\n\tconst environment = options.env || process.env;\n\tconst platform = options.platform || process.platform;\n\n\tif (platform !== 'win32') {\n\t\treturn 'PATH';\n\t}\n\n\treturn Object.keys(environment).reverse().find(key => key.toUpperCase() === 'PATH') || 'Path';\n};\n\nmodule.exports = pathKey;\n// TODO: Remove this for the next major release\nmodule.exports.default = pathKey;\n","'use strict';\n\n// See http://www.robvanderwoude.com/escapechars.php\nconst metaCharsRegExp = /([()\\][%!^\"`<>&|;, *?])/g;\n\nfunction escapeCommand(arg) {\n // Escape meta chars\n arg = arg.replace(metaCharsRegExp, '^$1');\n\n return arg;\n}\n\nfunction escapeArgument(arg, doubleEscapeMetaChars) {\n // Convert to string\n arg = `${arg}`;\n\n // Algorithm below is based on https://qntm.org/cmd\n\n // Sequence of backslashes followed by a double quote:\n // double up all the backslashes and escape the double quote\n arg = arg.replace(/(\\\\*)\"/g, '$1$1\\\\\"');\n\n // Sequence of backslashes followed by the end of the string\n // (which will become a double quote later):\n // double up all the backslashes\n arg = arg.replace(/(\\\\*)$/, '$1$1');\n\n // All other backslashes occur literally\n\n // Quote the whole thing:\n arg = `\"${arg}\"`;\n\n // Escape meta chars\n arg = arg.replace(metaCharsRegExp, '^$1');\n\n // Double escape meta chars if necessary\n if (doubleEscapeMetaChars) {\n arg = arg.replace(metaCharsRegExp, '^$1');\n }\n\n return arg;\n}\n\nmodule.exports.command = escapeCommand;\nmodule.exports.argument = escapeArgument;\n","'use strict';\n\nconst fs = require('fs');\nconst shebangCommand = require('shebang-command');\n\nfunction readShebang(command) {\n // Read the first 150 bytes from the file\n const size = 150;\n const buffer = Buffer.alloc(size);\n\n let fd;\n\n try {\n fd = fs.openSync(command, 'r');\n fs.readSync(fd, buffer, 0, size, 0);\n fs.closeSync(fd);\n } catch (e) { /* Empty */ }\n\n // Attempt to extract shebang (null is returned if not a shebang)\n return shebangCommand(buffer.toString());\n}\n\nmodule.exports = readShebang;\n","'use strict';\nconst shebangRegex = require('shebang-regex');\n\nmodule.exports = (string = '') => {\n\tconst match = string.match(shebangRegex);\n\n\tif (!match) {\n\t\treturn null;\n\t}\n\n\tconst [path, argument] = match[0].replace(/#! ?/, '').split(' ');\n\tconst binary = path.split('/').pop();\n\n\tif (binary === 'env') {\n\t\treturn argument;\n\t}\n\n\treturn argument ? `${binary} ${argument}` : binary;\n};\n","'use strict';\nmodule.exports = /^#!(.*)/;\n","'use strict';\n\nconst isWin = process.platform === 'win32';\n\nfunction notFoundError(original, syscall) {\n return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), {\n code: 'ENOENT',\n errno: 'ENOENT',\n syscall: `${syscall} ${original.command}`,\n path: original.command,\n spawnargs: original.args,\n });\n}\n\nfunction hookChildProcess(cp, parsed) {\n if (!isWin) {\n return;\n }\n\n const originalEmit = cp.emit;\n\n cp.emit = function (name, arg1) {\n // If emitting \"exit\" event and exit code is 1, we need to check if\n // the command exists and emit an \"error\" instead\n // See https://github.com/IndigoUnited/node-cross-spawn/issues/16\n if (name === 'exit') {\n const err = verifyENOENT(arg1, parsed, 'spawn');\n\n if (err) {\n return originalEmit.call(cp, 'error', err);\n }\n }\n\n return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params\n };\n}\n\nfunction verifyENOENT(status, parsed) {\n if (isWin && status === 1 && !parsed.file) {\n return notFoundError(parsed.original, 'spawn');\n }\n\n return null;\n}\n\nfunction verifyENOENTSync(status, parsed) {\n if (isWin && status === 1 && !parsed.file) {\n return notFoundError(parsed.original, 'spawnSync');\n }\n\n return null;\n}\n\nmodule.exports = {\n hookChildProcess,\n verifyENOENT,\n verifyENOENTSync,\n notFoundError,\n};\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { Opts, getCacheMap } from './opts.js';\nimport { run } from './run.js';\n\nasync function extractCache(cacheSource: string, cacheTarget: string, scratchDir: string) {\n // Prepare Timestamp for Layer Cache Busting\n const { stdout: date } = await run('date', ['--iso=ns']);\n await fs.writeFile(path.join(scratchDir, 'buildstamp'), date);\n\n // Prepare Dancefile to Access Caches\n const dancefileContent = `\nFROM busybox:1\nCOPY buildstamp buildstamp\nRUN --mount=type=cache,target=${cacheTarget} \\\n mkdir -p /var/dance-cache/ \\\n && cp -p -R ${cacheTarget}/. /var/dance-cache/ || true\n`;\n await fs.writeFile(path.join(scratchDir, 'Dancefile.extract'), dancefileContent);\n console.log(dancefileContent);\n\n // Extract Data into Docker Image\n await run('docker', ['buildx', 'build', '-f', path.join(scratchDir, 'Dancefile.extract'), '--tag', 'dance:extract', '--load', scratchDir]);\n\n // Create Extraction Image\n try {\n await run('docker', ['rm', '-f', 'cache-container']);\n } catch (error) {\n // Ignore error if container does not exist\n }\n await run('docker', ['create', '-ti', '--name', 'cache-container', 'dance:extract']);\n\n // Unpack Docker Image into Scratch\n const { stdout: tarOutput } = await run('docker', ['cp', '-L', 'cache-container:/var/dance-cache', '-']);\n await fs.writeFile(path.join(scratchDir, 'dance-cache.tar'), tarOutput);\n await run('tar', ['-H', 'posix', '-x', '-C', scratchDir, '-f', path.join(scratchDir, 'dance-cache.tar')]);\n\n // Move Cache into Its Place\n await fs.rm(cacheSource, { recursive: true, force: true });\n await fs.rename(path.join(scratchDir, 'dance-cache'), cacheSource);\n}\n\nexport async function extractCaches(opts: Opts) {\n if (opts[\"skip-extraction\"]) {\n console.log(\"skip-extraction is set. Skipping extraction step...\");\n return;\n }\n\n const cacheMap = getCacheMap(opts);\n const scratchDir = opts['scratch-dir'];\n\n // Extract Caches for each source-target pair\n for (const [cacheSource, cacheTarget] of Object.entries(cacheMap)) {\n await extractCache(cacheSource, cacheTarget, scratchDir);\n }\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"} \ No newline at end of file diff --git a/main b/main deleted file mode 100755 index 98499d9..0000000 --- a/main +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -set -eux -o pipefail -: "Argv0: $0" -dir="$(dirname "$0")" -read_action_input() { - "${dir}/read-action-input" "$1" -} -: "Clean Directories" -rm -Rf "$(read_action_input scratch-dir)" && mkdir -p "$(read_action_input scratch-dir)" "$(read_action_input cache-source)" -: "Prepare Timestamp for Layer Cache Busting" -date --iso=ns | tee "$(read_action_input cache-source)"/buildstamp -: "Prepare Dancefile to Access Caches" -cat >"$(read_action_input scratch-dir)"/Dancefile.inject <=20" + }, + "devDependencies": { + "@types/node": "^20.11.30", + "parcel": "^2.12.0", + "typescript": "^5.4.3" + }, + "dependencies": { + "mri": "^1.2.0", + "spawn-please": "^3.0.0" + }, + "targets": { + "main": { + "includeNodeModules": true + } + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..97a5794 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2010 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + mri: + specifier: ^1.2.0 + version: 1.2.0 + spawn-please: + specifier: ^3.0.0 + version: 3.0.0 + +devDependencies: + '@types/node': + specifier: ^20.11.30 + version: 20.11.30 + parcel: + specifier: ^2.12.0 + version: 2.12.0(typescript@5.4.3) + typescript: + specifier: ^5.4.3 + version: 5.4.3 + +packages: + + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: true + + /@lezer/common@1.2.1: + resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==} + dev: true + + /@lezer/lr@1.4.0: + resolution: {integrity: sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==} + dependencies: + '@lezer/common': 1.2.1 + dev: true + + /@lmdb/lmdb-darwin-arm64@2.8.5: + resolution: {integrity: sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-darwin-x64@2.8.5: + resolution: {integrity: sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-linux-arm64@2.8.5: + resolution: {integrity: sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-linux-arm@2.8.5: + resolution: {integrity: sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-linux-x64@2.8.5: + resolution: {integrity: sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-win32-x64@2.8.5: + resolution: {integrity: sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@mischnic/json-sourcemap@0.1.1: + resolution: {integrity: sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==} + engines: {node: '>=12.0.0'} + dependencies: + '@lezer/common': 1.2.1 + '@lezer/lr': 1.4.0 + json5: 2.2.3 + dev: true + + /@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2: + resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2: + resolution: {integrity: sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2: + resolution: {integrity: sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2: + resolution: {integrity: sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2: + resolution: {integrity: sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2: + resolution: {integrity: sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@parcel/bundler-default@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-3ybN74oYNMKyjD6V20c9Gerdbh7teeNvVMwIoHIQMzuIFT6IGX53PyOLlOKRLbjxMc0TMimQQxIt2eQqxR5LsA==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/graph': 3.2.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/cache@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/core': 2.12.0 + '@parcel/fs': 2.12.0(@parcel/core@2.12.0) + '@parcel/logger': 2.12.0 + '@parcel/utils': 2.12.0 + lmdb: 2.8.5 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@parcel/codeframe@2.12.0: + resolution: {integrity: sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==} + engines: {node: '>= 12.0.0'} + dependencies: + chalk: 4.1.2 + dev: true + + /@parcel/compressor-raw@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-h41Q3X7ZAQ9wbQ2csP8QGrwepasLZdXiuEdpUryDce6rF9ZiHoJ97MRpdLxOhOPyASTw/xDgE1xyaPQr0Q3f5A==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/config-default@2.12.0(@parcel/core@2.12.0)(typescript@5.4.3): + resolution: {integrity: sha512-dPNe2n9eEsKRc1soWIY0yToMUPirPIa2QhxcCB3Z5RjpDGIXm0pds+BaiqY6uGLEEzsjhRO0ujd4v2Rmm0vuFg==} + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/bundler-default': 2.12.0(@parcel/core@2.12.0) + '@parcel/compressor-raw': 2.12.0(@parcel/core@2.12.0) + '@parcel/core': 2.12.0 + '@parcel/namer-default': 2.12.0(@parcel/core@2.12.0) + '@parcel/optimizer-css': 2.12.0(@parcel/core@2.12.0) + '@parcel/optimizer-htmlnano': 2.12.0(@parcel/core@2.12.0)(typescript@5.4.3) + '@parcel/optimizer-image': 2.12.0(@parcel/core@2.12.0) + '@parcel/optimizer-svgo': 2.12.0(@parcel/core@2.12.0) + '@parcel/optimizer-swc': 2.12.0(@parcel/core@2.12.0) + '@parcel/packager-css': 2.12.0(@parcel/core@2.12.0) + '@parcel/packager-html': 2.12.0(@parcel/core@2.12.0) + '@parcel/packager-js': 2.12.0(@parcel/core@2.12.0) + '@parcel/packager-raw': 2.12.0(@parcel/core@2.12.0) + '@parcel/packager-svg': 2.12.0(@parcel/core@2.12.0) + '@parcel/packager-wasm': 2.12.0(@parcel/core@2.12.0) + '@parcel/reporter-dev-server': 2.12.0(@parcel/core@2.12.0) + '@parcel/resolver-default': 2.12.0(@parcel/core@2.12.0) + '@parcel/runtime-browser-hmr': 2.12.0(@parcel/core@2.12.0) + '@parcel/runtime-js': 2.12.0(@parcel/core@2.12.0) + '@parcel/runtime-react-refresh': 2.12.0(@parcel/core@2.12.0) + '@parcel/runtime-service-worker': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-babel': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-css': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-html': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-image': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-js': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-json': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-postcss': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-posthtml': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-raw': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-react-refresh-wrap': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-svg': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@swc/helpers' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - typescript + - uncss + dev: true + + /@parcel/core@2.12.0: + resolution: {integrity: sha512-s+6pwEj+GfKf7vqGUzN9iSEPueUssCCQrCBUlcAfKrJe0a22hTUCjewpB0I7lNrCIULt8dkndD+sMdOrXsRl6Q==} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/cache': 2.12.0(@parcel/core@2.12.0) + '@parcel/diagnostic': 2.12.0 + '@parcel/events': 2.12.0 + '@parcel/fs': 2.12.0(@parcel/core@2.12.0) + '@parcel/graph': 3.2.0 + '@parcel/logger': 2.12.0 + '@parcel/package-manager': 2.12.0(@parcel/core@2.12.0) + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/profiler': 2.12.0 + '@parcel/rust': 2.12.0 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + abortcontroller-polyfill: 1.7.5 + base-x: 3.0.9 + browserslist: 4.23.0 + clone: 2.1.2 + dotenv: 7.0.0 + dotenv-expand: 5.1.0 + json5: 2.2.3 + msgpackr: 1.10.1 + nullthrows: 1.1.1 + semver: 7.6.0 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@parcel/diagnostic@2.12.0: + resolution: {integrity: sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + nullthrows: 1.1.1 + dev: true + + /@parcel/events@2.12.0: + resolution: {integrity: sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==} + engines: {node: '>= 12.0.0'} + dev: true + + /@parcel/fs@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/core': 2.12.0 + '@parcel/rust': 2.12.0 + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + '@parcel/watcher': 2.4.1 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@parcel/graph@3.2.0: + resolution: {integrity: sha512-xlrmCPqy58D4Fg5umV7bpwDx5Vyt7MlnQPxW68vae5+BA4GSWetfZt+Cs5dtotMG2oCHzZxhIPt7YZ7NRyQzLA==} + engines: {node: '>= 12.0.0'} + dependencies: + nullthrows: 1.1.1 + dev: true + + /@parcel/logger@2.12.0: + resolution: {integrity: sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/events': 2.12.0 + dev: true + + /@parcel/markdown-ansi@2.12.0: + resolution: {integrity: sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==} + engines: {node: '>= 12.0.0'} + dependencies: + chalk: 4.1.2 + dev: true + + /@parcel/namer-default@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-9DNKPDHWgMnMtqqZIMiEj/R9PNWW16lpnlHjwK3ciRlMPgjPJ8+UNc255teZODhX0T17GOzPdGbU/O/xbxVPzA==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/node-resolver-core@3.3.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/diagnostic': 2.12.0 + '@parcel/fs': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + semver: 7.6.0 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/optimizer-css@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-ifbcC97fRzpruTjaa8axIFeX4MjjSIlQfem3EJug3L2AVqQUXnM1XO8L0NaXGNLTW2qnh1ZjIJ7vXT/QhsphsA==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.12.0 + browserslist: 4.23.0 + lightningcss: 1.24.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/optimizer-htmlnano@2.12.0(@parcel/core@2.12.0)(typescript@5.4.3): + resolution: {integrity: sha512-MfPMeCrT8FYiOrpFHVR+NcZQlXAptK2r4nGJjfT+ndPBhEEZp4yyL7n1y7HfX9geg5altc4WTb4Gug7rCoW8VQ==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + htmlnano: 2.1.0(svgo@2.8.0)(typescript@5.4.3) + nullthrows: 1.1.1 + posthtml: 0.16.6 + svgo: 2.8.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - typescript + - uncss + dev: true + + /@parcel/optimizer-image@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-bo1O7raeAIbRU5nmNVtx8divLW9Xqn0c57GVNGeAK4mygnQoqHqRZ0mR9uboh64pxv6ijXZHPhKvU9HEpjPjBQ==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/core': 2.12.0 + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + '@parcel/utils': 2.12.0 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@parcel/optimizer-svgo@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-Kyli+ZZXnoonnbeRQdoWwee9Bk2jm/49xvnfb+2OO8NN0d41lblBoRhOyFiScRnJrw7eVl1Xrz7NTkXCIO7XFQ==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + svgo: 2.8.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/optimizer-swc@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-iBi6LZB3lm6WmbXfzi8J3DCVPmn4FN2lw7DGXxUXu7MouDPVWfTsM6U/5TkSHJRNRogZ2gqy5q9g34NPxHbJcw==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.12.0 + '@swc/core': 1.4.11 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/package-manager@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/core': 2.12.0 + '@parcel/diagnostic': 2.12.0 + '@parcel/fs': 2.12.0(@parcel/core@2.12.0) + '@parcel/logger': 2.12.0 + '@parcel/node-resolver-core': 3.3.0(@parcel/core@2.12.0) + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + '@swc/core': 1.4.11 + semver: 7.6.0 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@parcel/packager-css@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-j3a/ODciaNKD19IYdWJT+TP+tnhhn5koBGBWWtrKSu0UxWpnezIGZetit3eE+Y9+NTePalMkvpIlit2eDhvfJA==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.12.0 + lightningcss: 1.24.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/packager-html@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-PpvGB9hFFe+19NXGz2ApvPrkA9GwEqaDAninT+3pJD57OVBaxB8U+HN4a5LICKxjUppPPqmrLb6YPbD65IX4RA==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/packager-js@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-viMF+FszITRRr8+2iJyk+4ruGiL27Y6AF7hQ3xbJfzqnmbOhGFtLTQwuwhOLqN/mWR2VKdgbLpZSarWaO3yAMg==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + globals: 13.24.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/packager-raw@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-tJZqFbHqP24aq1F+OojFbQIc09P/u8HAW5xfndCrFnXpW4wTgM3p03P0xfw3gnNq+TtxHJ8c3UFE5LnXNNKhYA==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/packager-svg@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-ldaGiacGb2lLqcXas97k8JiZRbAnNREmcvoY2W2dvW4loVuDT9B9fU777mbV6zODpcgcHWsLL3lYbJ5Lt3y9cg==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/packager-wasm@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-fYqZzIqO9fGYveeImzF8ll6KRo2LrOXfD+2Y5U3BiX/wp9wv17dz50QLDQm9hmTcKGWxK4yWqKQh+Evp/fae7A==} + engines: {node: '>=12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/plugin@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-nc/uRA8DiMoe4neBbzV6kDndh/58a4wQuGKw5oEoIwBCHUvE2W8ZFSu7ollSXUGRzfacTt4NdY8TwS73ScWZ+g==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/profiler@2.12.0: + resolution: {integrity: sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/events': 2.12.0 + chrome-trace-event: 1.0.3 + dev: true + + /@parcel/reporter-cli@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-TqKsH4GVOLPSCanZ6tcTPj+rdVHERnt5y4bwTM82cajM21bCX1Ruwp8xOKU+03091oV2pv5ieB18pJyRF7IpIw==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + chalk: 4.1.2 + term-size: 2.2.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/reporter-dev-server@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-tIcDqRvAPAttRlTV28dHcbWT5K2r/MBFks7nM4nrEDHWtnrCwimkDmZTc1kD8QOCCjGVwRHcQybpHvxfwol6GA==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/reporter-tracer@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-g8rlu9GxB8Ut/F8WGx4zidIPQ4pcYFjU9bZO+fyRIPrSUFH2bKijCnbZcr4ntqzDGx74hwD6cCG4DBoleq2UlQ==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + chrome-trace-event: 1.0.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/resolver-default@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-uuhbajTax37TwCxu7V98JtRLiT6hzE4VYSu5B7Qkauy14/WFt2dz6GOUXPgVsED569/hkxebPx3KCMtZW6cHHA==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/node-resolver-core': 3.3.0(@parcel/core@2.12.0) + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/runtime-browser-hmr@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-4ZLp2FWyD32r0GlTulO3+jxgsA3oO1P1b5oO2IWuWilfhcJH5LTiazpL5YdusUjtNn9PGN6QLAWfxmzRIfM+Ow==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/runtime-js@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-sBerP32Z1crX5PfLNGDSXSdqzlllM++GVnVQVeM7DgMKS8JIFG3VLi28YkX+dYYGtPypm01JoIHCkvwiZEcQJg==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/runtime-react-refresh@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-SCHkcczJIDFTFdLTzrHTkQ0aTrX3xH6jrA4UsCBL6ji61+w+ohy4jEEe9qCgJVXhnJfGLE43HNXek+0MStX+Mw==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + react-error-overlay: 6.0.9 + react-refresh: 0.9.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/runtime-service-worker@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-BXuMBsfiwpIEnssn+jqfC3jkgbS8oxeo3C7xhSQsuSv+AF2FwY3O3AO1c1RBskEW3XrBLNINOJujroNw80VTKA==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/rust@2.12.0: + resolution: {integrity: sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==} + engines: {node: '>= 12.0.0'} + dev: true + + /@parcel/source-map@2.1.1: + resolution: {integrity: sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==} + engines: {node: ^12.18.3 || >=14} + dependencies: + detect-libc: 1.0.3 + dev: true + + /@parcel/transformer-babel@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-zQaBfOnf/l8rPxYGnsk/ufh/0EuqvmnxafjBIpKZ//j6rGylw5JCqXSb1QvvAqRYruKeccxGv7+HrxpqKU6V4A==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.12.0 + browserslist: 4.23.0 + json5: 2.2.3 + nullthrows: 1.1.1 + semver: 7.6.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-css@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-vXhOqoAlQGATYyQ433Z1DXKmiKmzOAUmKysbYH3FD+LKEKLMEl/pA14goqp00TW+A/EjtSKKyeMyHlMIIUqj4Q==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.12.0 + browserslist: 4.23.0 + lightningcss: 1.24.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-html@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-5jW4dFFBlYBvIQk4nrH62rfA/G/KzVzEDa6S+Nne0xXhglLjkm64Ci9b/d4tKZfuGWUbpm2ASAq8skti/nfpXw==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.6.0 + srcset: 4.0.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-image@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-8hXrGm2IRII49R7lZ0RpmNk27EhcsH+uNKsvxuMpXPuEnWgC/ha/IrjaI29xCng1uGur74bJF43NUSQhR4aTdw==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/core': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@parcel/transformer-js@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-OSZpOu+FGDbC/xivu24v092D9w6EGytB3vidwbdiJ2FaPgfV7rxS0WIUjH4I0OcvHAcitArRXL0a3+HrNTdQQw==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/core': 2.12.0 + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.12.0 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + '@swc/helpers': 0.5.8 + browserslist: 4.23.0 + nullthrows: 1.1.1 + regenerator-runtime: 0.13.11 + semver: 7.6.0 + dev: true + + /@parcel/transformer-json@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-Utv64GLRCQILK5r0KFs4o7I41ixMPllwOLOhkdjJKvf1hZmN6WqfOmB1YLbWS/y5Zb/iB52DU2pWZm96vLFQZQ==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + json5: 2.2.3 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-postcss@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-FZqn+oUtiLfPOn67EZxPpBkfdFiTnF4iwiXPqvst3XI8H+iC+yNgzmtJkunOOuylpYY6NOU5jT8d7saqWSDv2Q==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + '@parcel/utils': 2.12.0 + clone: 2.1.2 + nullthrows: 1.1.1 + postcss-value-parser: 4.2.0 + semver: 7.6.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-posthtml@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-z6Z7rav/pcaWdeD+2sDUcd0mmNZRUvtHaUGa50Y2mr+poxrKilpsnFMSiWBT+oOqPt7j71jzDvrdnAF4XkCljg==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.6.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-raw@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-Ht1fQvXxix0NncdnmnXZsa6hra20RXYh1VqhBYZLsDfkvGGFnXIgO03Jqn4Z8MkKoa0tiNbDhpKIeTjyclbBxQ==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-react-refresh-wrap@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-GE8gmP2AZtkpBIV5vSCVhewgOFRhqwdM5Q9jNPOY5PKcM3/Ff0qCqDiTzzGLhk0/VMBrdjssrfZkVx6S/lHdJw==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + react-refresh: 0.9.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-svg@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-cZJqGRJ4JNdYcb+vj94J7PdOuTnwyy45dM9xqbIMH+HSiiIkfrMsdEwYft0GTyFTdsnf+hdHn3tau7Qa5hhX+A==} + engines: {node: '>= 12.0.0', parcel: ^2.12.0} + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.6.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/types@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==} + dependencies: + '@parcel/cache': 2.12.0(@parcel/core@2.12.0) + '@parcel/diagnostic': 2.12.0 + '@parcel/fs': 2.12.0(@parcel/core@2.12.0) + '@parcel/package-manager': 2.12.0(@parcel/core@2.12.0) + '@parcel/source-map': 2.1.1 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + utility-types: 3.11.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/utils@2.12.0: + resolution: {integrity: sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/codeframe': 2.12.0 + '@parcel/diagnostic': 2.12.0 + '@parcel/logger': 2.12.0 + '@parcel/markdown-ansi': 2.12.0 + '@parcel/rust': 2.12.0 + '@parcel/source-map': 2.1.1 + chalk: 4.1.2 + nullthrows: 1.1.1 + dev: true + + /@parcel/watcher-android-arm64@2.4.1: + resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-darwin-arm64@2.4.1: + resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-darwin-x64@2.4.1: + resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-freebsd-x64@2.4.1: + resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-arm-glibc@2.4.1: + resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-arm64-glibc@2.4.1: + resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-arm64-musl@2.4.1: + resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-x64-glibc@2.4.1: + resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-x64-musl@2.4.1: + resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-win32-arm64@2.4.1: + resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-win32-ia32@2.4.1: + resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-win32-x64@2.4.1: + resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher@2.4.1: + resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} + engines: {node: '>= 10.0.0'} + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 7.1.0 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.4.1 + '@parcel/watcher-darwin-arm64': 2.4.1 + '@parcel/watcher-darwin-x64': 2.4.1 + '@parcel/watcher-freebsd-x64': 2.4.1 + '@parcel/watcher-linux-arm-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-musl': 2.4.1 + '@parcel/watcher-linux-x64-glibc': 2.4.1 + '@parcel/watcher-linux-x64-musl': 2.4.1 + '@parcel/watcher-win32-arm64': 2.4.1 + '@parcel/watcher-win32-ia32': 2.4.1 + '@parcel/watcher-win32-x64': 2.4.1 + dev: true + + /@parcel/workers@2.12.0(@parcel/core@2.12.0): + resolution: {integrity: sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/core': 2.12.0 + '@parcel/diagnostic': 2.12.0 + '@parcel/logger': 2.12.0 + '@parcel/profiler': 2.12.0 + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + dev: true + + /@swc/core-darwin-arm64@1.4.11: + resolution: {integrity: sha512-C1j1Qp/IHSelVWdEnT7f0iONWxQz6FAqzjCF2iaL+0vFg4V5f2nlgrueY8vj5pNNzSGhrAlxsMxEIp4dj1MXkg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64@1.4.11: + resolution: {integrity: sha512-0TTy3Ni8ncgaMCchSQ7FK8ZXQLlamy0FXmGWbR58c+pVZWYZltYPTmheJUvVcR0H2+gPAymRKyfC0iLszDALjg==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm-gnueabihf@1.4.11: + resolution: {integrity: sha512-XJLB71uw0rog4DjYAPxFGAuGCBQpgJDlPZZK6MTmZOvI/1t0+DelJ24IjHIxk500YYM26Yv47xPabqFPD7I2zQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu@1.4.11: + resolution: {integrity: sha512-vYQwzJvm/iu052d5Iw27UFALIN5xSrGkPZXxLNMHPySVko2QMNNBv35HLatkEQHbQ3X+VKSW9J9SkdtAvAVRAQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl@1.4.11: + resolution: {integrity: sha512-eV+KduiRYUFjPsvbZuJ9aknQH9Tj0U2/G9oIZSzLx/18WsYi+upzHbgxmIIHJ2VJgfd7nN40RI/hMtxNsUzR/g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu@1.4.11: + resolution: {integrity: sha512-WA1iGXZ2HpqM1OR9VCQZJ8sQ1KP2or9O4bO8vWZo6HZJIeoQSo7aa9waaCLRpkZvkng1ct/TF/l6ymqSNFXIzQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl@1.4.11: + resolution: {integrity: sha512-UkVJToKf0owwQYRnGvjHAeYVDfeimCEcx0VQSbJoN7Iy0ckRZi7YPlmWJU31xtKvikE2bQWCOVe0qbSDqqcWXA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc@1.4.11: + resolution: {integrity: sha512-35khwkyly7lF5NDSyvIrukBMzxPorgc5iTSDfVO/LvnmN5+fm4lTlrDr4tUfTdOhv3Emy7CsKlsNAeFRJ+Pm+w==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc@1.4.11: + resolution: {integrity: sha512-Wx8/6f0ufgQF2pbVPsJ2dAmFLwIOW+xBE5fxnb7VnEbGkTgP1qMDWiiAtD9rtvDSuODG3i1AEmAak/2HAc6i6A==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc@1.4.11: + resolution: {integrity: sha512-0xRFW6K9UZQH2NVC/0pVB0GJXS45lY24f+6XaPBF1YnMHd8A8GoHl7ugyM5yNUTe2AKhSgk5fJV00EJt/XBtdQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core@1.4.11: + resolution: {integrity: sha512-WKEakMZxkVwRdgMN4AMJ9K5nysY8g8npgQPczmjBeNK5In7QEAZAJwnyccrWwJZU0XjVeHn2uj+XbOKdDW17rg==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.6 + optionalDependencies: + '@swc/core-darwin-arm64': 1.4.11 + '@swc/core-darwin-x64': 1.4.11 + '@swc/core-linux-arm-gnueabihf': 1.4.11 + '@swc/core-linux-arm64-gnu': 1.4.11 + '@swc/core-linux-arm64-musl': 1.4.11 + '@swc/core-linux-x64-gnu': 1.4.11 + '@swc/core-linux-x64-musl': 1.4.11 + '@swc/core-win32-arm64-msvc': 1.4.11 + '@swc/core-win32-ia32-msvc': 1.4.11 + '@swc/core-win32-x64-msvc': 1.4.11 + dev: true + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: true + + /@swc/helpers@0.5.8: + resolution: {integrity: sha512-lruDGw3pnfM3wmZHeW7JuhkGQaJjPyiKjxeGhdmfoOT53Ic9qb5JLDNaK2HUdl1zLDeX28H221UvKjfdvSLVMg==} + dependencies: + tslib: 2.6.2 + dev: true + + /@swc/types@0.1.6: + resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} + dependencies: + '@swc/counter': 0.1.3 + dev: true + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: true + + /@types/node@20.11.30: + resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + dependencies: + undici-types: 5.26.5 + dev: true + + /abortcontroller-polyfill@1.7.5: + resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /base-x@3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001600 + electron-to-chromium: 1.4.721 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /caniuse-lite@1.0.30001600: + resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /cosmiconfig@8.3.6(typescript@5.4.3): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.4.3 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: true + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: true + + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + dev: true + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + dev: true + + /dotenv@7.0.0: + resolution: {integrity: sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==} + engines: {node: '>=6'} + dev: true + + /electron-to-chromium@1.4.721: + resolution: {integrity: sha512-k1x2r6foI8iJOp+1qTxbbrrWMsOiHkzGBYwYigaq+apO1FSqtn44KTo3Sy69qt7CRr7149zTcsDvH7MUKsOuIQ==} + dev: true + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /get-port@4.2.0: + resolution: {integrity: sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==} + engines: {node: '>=6'} + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /htmlnano@2.1.0(svgo@2.8.0)(typescript@5.4.3): + resolution: {integrity: sha512-jVGRE0Ep9byMBKEu0Vxgl8dhXYOUk0iNQ2pjsG+BcRB0u0oDF5A9p/iBGMg/PGKYUyMD0OAGu8dVT5Lzj8S58g==} + peerDependencies: + cssnano: ^6.0.0 + postcss: ^8.3.11 + purgecss: ^5.0.0 + relateurl: ^0.2.7 + srcset: 4.0.0 + svgo: ^3.0.2 + terser: ^5.10.0 + uncss: ^0.17.3 + peerDependenciesMeta: + cssnano: + optional: true + postcss: + optional: true + purgecss: + optional: true + relateurl: + optional: true + srcset: + optional: true + svgo: + optional: true + terser: + optional: true + uncss: + optional: true + dependencies: + cosmiconfig: 8.3.6(typescript@5.4.3) + posthtml: 0.16.6 + svgo: 2.8.0 + timsort: 0.3.0 + transitivePeerDependencies: + - typescript + dev: true + + /htmlparser2@7.2.0: + resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 3.0.1 + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-json@2.0.1: + resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==} + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /lightningcss-darwin-arm64@1.24.1: + resolution: {integrity: sha512-1jQ12jBy+AE/73uGQWGSafK5GoWgmSiIQOGhSEXiFJSZxzV+OXIx+a9h2EYHxdJfX864M+2TAxWPWb0Vv+8y4w==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lightningcss-darwin-x64@1.24.1: + resolution: {integrity: sha512-R4R1d7VVdq2mG4igMU+Di8GPf0b64ZLnYVkubYnGG0Qxq1KaXQtAzcLI43EkpnoWvB/kUg8JKCWH4S13NfiLcQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lightningcss-freebsd-x64@1.24.1: + resolution: {integrity: sha512-z6NberUUw5ALES6Ixn2shmjRRrM1cmEn1ZQPiM5IrZ6xHHL5a1lPin9pRv+w6eWfcrEo+qGG6R9XfJrpuY3e4g==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm-gnueabihf@1.24.1: + resolution: {integrity: sha512-NLQLnBQW/0sSg74qLNI8F8QKQXkNg4/ukSTa+XhtkO7v3BnK19TS1MfCbDHt+TTdSgNEBv0tubRuapcKho2EWw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm64-gnu@1.24.1: + resolution: {integrity: sha512-AQxWU8c9E9JAjAi4Qw9CvX2tDIPjgzCTrZCSXKELfs4mCwzxRkHh2RCxX8sFK19RyJoJAjA/Kw8+LMNRHS5qEg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm64-musl@1.24.1: + resolution: {integrity: sha512-JCgH/SrNrhqsguUA0uJUM1PvN5+dVuzPIlXcoWDHSv2OU/BWlj2dUYr3XNzEw748SmNZPfl2NjQrAdzaPOn1lA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-x64-gnu@1.24.1: + resolution: {integrity: sha512-TYdEsC63bHV0h47aNRGN3RiK7aIeco3/keN4NkoSQ5T8xk09KHuBdySltWAvKLgT8JvR+ayzq8ZHnL1wKWY0rw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-x64-musl@1.24.1: + resolution: {integrity: sha512-HLfzVik3RToot6pQ2Rgc3JhfZkGi01hFetHt40HrUMoeKitLoqUUT5owM6yTZPTytTUW9ukLBJ1pc3XNMSvlLw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-win32-x64-msvc@1.24.1: + resolution: {integrity: sha512-joEupPjYJ7PjZtDsS5lzALtlAudAbgIBMGJPNeFe5HfdmJXFd13ECmEM+5rXNxYVMRHua2w8132R6ab5Z6K9Ow==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /lightningcss@1.24.1: + resolution: {integrity: sha512-kUpHOLiH5GB0ERSv4pxqlL0RYKnOXtgGtVe7shDGfhS0AZ4D1ouKFYAcLcZhql8aMspDNzaUCumGHZ78tb2fTg==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.24.1 + lightningcss-darwin-x64: 1.24.1 + lightningcss-freebsd-x64: 1.24.1 + lightningcss-linux-arm-gnueabihf: 1.24.1 + lightningcss-linux-arm64-gnu: 1.24.1 + lightningcss-linux-arm64-musl: 1.24.1 + lightningcss-linux-x64-gnu: 1.24.1 + lightningcss-linux-x64-musl: 1.24.1 + lightningcss-win32-x64-msvc: 1.24.1 + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lmdb@2.8.5: + resolution: {integrity: sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==} + hasBin: true + requiresBuild: true + dependencies: + msgpackr: 1.10.1 + node-addon-api: 6.1.0 + node-gyp-build-optional-packages: 5.1.1 + ordered-binary: 1.5.1 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 2.8.5 + '@lmdb/lmdb-darwin-x64': 2.8.5 + '@lmdb/lmdb-linux-arm': 2.8.5 + '@lmdb/lmdb-linux-arm64': 2.8.5 + '@lmdb/lmdb-linux-x64': 2.8.5 + '@lmdb/lmdb-win32-x64': 2.8.5 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: false + + /msgpackr-extract@3.0.2: + resolution: {integrity: sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==} + hasBin: true + requiresBuild: true + dependencies: + node-gyp-build-optional-packages: 5.0.7 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.2 + dev: true + optional: true + + /msgpackr@1.10.1: + resolution: {integrity: sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==} + optionalDependencies: + msgpackr-extract: 3.0.2 + dev: true + + /node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + dev: true + + /node-addon-api@7.1.0: + resolution: {integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==} + engines: {node: ^16 || ^18 || >= 20} + dev: true + + /node-gyp-build-optional-packages@5.0.7: + resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /node-gyp-build-optional-packages@5.1.1: + resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} + hasBin: true + dependencies: + detect-libc: 2.0.3 + dev: true + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + dev: true + + /ordered-binary@1.5.1: + resolution: {integrity: sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==} + dev: true + + /parcel@2.12.0(typescript@5.4.3): + resolution: {integrity: sha512-W+gxAq7aQ9dJIg/XLKGcRT0cvnStFAQHPaI0pvD0U2l6IVLueUAm3nwN7lkY62zZNmlvNx6jNtE4wlbS+CyqSg==} + engines: {node: '>= 12.0.0'} + hasBin: true + dependencies: + '@parcel/config-default': 2.12.0(@parcel/core@2.12.0)(typescript@5.4.3) + '@parcel/core': 2.12.0 + '@parcel/diagnostic': 2.12.0 + '@parcel/events': 2.12.0 + '@parcel/fs': 2.12.0(@parcel/core@2.12.0) + '@parcel/logger': 2.12.0 + '@parcel/package-manager': 2.12.0(@parcel/core@2.12.0) + '@parcel/reporter-cli': 2.12.0(@parcel/core@2.12.0) + '@parcel/reporter-dev-server': 2.12.0(@parcel/core@2.12.0) + '@parcel/reporter-tracer': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + chalk: 4.1.2 + commander: 7.2.0 + get-port: 4.2.0 + transitivePeerDependencies: + - '@swc/helpers' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - typescript + - uncss + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.24.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /posthtml-parser@0.10.2: + resolution: {integrity: sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==} + engines: {node: '>=12'} + dependencies: + htmlparser2: 7.2.0 + dev: true + + /posthtml-parser@0.11.0: + resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==} + engines: {node: '>=12'} + dependencies: + htmlparser2: 7.2.0 + dev: true + + /posthtml-render@3.0.0: + resolution: {integrity: sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==} + engines: {node: '>=12'} + dependencies: + is-json: 2.0.1 + dev: true + + /posthtml@0.16.6: + resolution: {integrity: sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==} + engines: {node: '>=12.0.0'} + dependencies: + posthtml-parser: 0.11.0 + posthtml-render: 3.0.0 + dev: true + + /react-error-overlay@6.0.9: + resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==} + dev: true + + /react-refresh@0.9.0: + resolution: {integrity: sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /spawn-please@3.0.0: + resolution: {integrity: sha512-XFHEGgEG9R/MCypDDQVWoSSQoGAz5LFYcGoFpdYvnqgYDumHvapPDj54C5Xv7tqTkzEC17AY7Iz90KgrDfj7Gg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + dev: false + + /srcset@4.0.0: + resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} + engines: {node: '>=12'} + dev: true + + /stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: true + + /term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + dev: true + + /timsort@0.3.0: + resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /typescript@5.4.3: + resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + dev: true + + /utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + dev: true + + /weak-lru-cache@1.2.2: + resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true diff --git a/post b/post deleted file mode 100755 index d54e6de..0000000 --- a/post +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -set -eux -o pipefail -: "Argv0: $0" -dir="$(dirname "$0")" -read_action_input() { - "${dir}/read-action-input" "$1" -} - -if [ "$(read_action_input skip-extraction)" == "true" ]; then - echo "skip-extraction is set. Skipping extraction step..." >&2 - exit 0 -fi - -: "Prepare Timestamp for Layer Cache Busting" -date --iso=ns | tee "$(read_action_input scratch-dir)"/buildstamp -: "Prepare Dancefile to Access Caches" -cat >"$(read_action_input scratch-dir)"/Dancefile.extract < "INPUT_FOO-BAR". -// -// This does not need to be implemented in nodejs, -// but reimplementing this in sh is hard. - -const arg = process.argv[2]; // Equates to "$1" in sh -const k = "INPUT_" + arg.toUpperCase(); -const v = process.env[k]; -if ( v !== undefined ) { - console.log(v); -} diff --git a/src/extract-cache.ts b/src/extract-cache.ts new file mode 100644 index 0000000..ec9eaad --- /dev/null +++ b/src/extract-cache.ts @@ -0,0 +1,56 @@ +import * as fs from 'fs/promises'; +import * as path from 'path'; +import { Opts, getCacheMap } from './opts.js'; +import { run } from './run.js'; + +async function extractCache(cacheSource: string, cacheTarget: string, scratchDir: string) { + // Prepare Timestamp for Layer Cache Busting + const { stdout: date } = await run('date', ['--iso=ns']); + await fs.writeFile(path.join(scratchDir, 'buildstamp'), date); + + // Prepare Dancefile to Access Caches + const dancefileContent = ` +FROM busybox:1 +COPY buildstamp buildstamp +RUN --mount=type=cache,target=${cacheTarget} \ + mkdir -p /var/dance-cache/ \ + && cp -p -R ${cacheTarget}/. /var/dance-cache/ || true +`; + await fs.writeFile(path.join(scratchDir, 'Dancefile.extract'), dancefileContent); + console.log(dancefileContent); + + // Extract Data into Docker Image + await run('docker', ['buildx', 'build', '-f', path.join(scratchDir, 'Dancefile.extract'), '--tag', 'dance:extract', '--load', scratchDir]); + + // Create Extraction Image + try { + await run('docker', ['rm', '-f', 'cache-container']); + } catch (error) { + // Ignore error if container does not exist + } + await run('docker', ['create', '-ti', '--name', 'cache-container', 'dance:extract']); + + // Unpack Docker Image into Scratch + const { stdout: tarOutput } = await run('docker', ['cp', '-L', 'cache-container:/var/dance-cache', '-']); + await fs.writeFile(path.join(scratchDir, 'dance-cache.tar'), tarOutput); + await run('tar', ['-H', 'posix', '-x', '-C', scratchDir, '-f', path.join(scratchDir, 'dance-cache.tar')]); + + // Move Cache into Its Place + await fs.rm(cacheSource, { recursive: true, force: true }); + await fs.rename(path.join(scratchDir, 'dance-cache'), cacheSource); +} + +export async function extractCaches(opts: Opts) { + if (opts["skip-extraction"]) { + console.log("skip-extraction is set. Skipping extraction step..."); + return; + } + + const cacheMap = getCacheMap(opts); + const scratchDir = opts['scratch-dir']; + + // Extract Caches for each source-target pair + for (const [cacheSource, cacheTarget] of Object.entries(cacheMap)) { + await extractCache(cacheSource, cacheTarget, scratchDir); + } +} diff --git a/entrypoint.js b/src/index.ts similarity index 80% rename from entrypoint.js rename to src/index.ts index 21c1236..5bfed12 100644 --- a/entrypoint.js +++ b/src/index.ts @@ -4,6 +4,7 @@ /* ================================================================================================================== * * Authors: * * Unai Martinez-Corral * + * Amin Yahyaabadi * * * * ================================================================================================================== * * Copyright 2021-2022 Unai Martinez-Corral * @@ -28,22 +29,28 @@ * * https://github.com/docker/login-action/issues/72 * * * https://github.com/actions/runner/issues/1478 * * ================================================================================================================== */ -const { spawn } = require("child_process"); -const { appendFileSync } = require("fs"); -const { EOL } = require("os"); +import { appendFile } from "fs/promises"; +import { EOL } from "os"; +import { injectCaches } from "./inject-cache.js"; +import { extractCaches } from "./extract-cache.js"; +import { parseOpts } from "./opts.js"; -function run(cmd) { - const subprocess = spawn(cmd, { stdio: "inherit", shell: false }); - subprocess.on("exit", (exitCode) => { - process.exitCode = exitCode; - }); -} +async function main(args: string[]) { + const opts = parseOpts(args); -const key = "POST" + const is_post_step = process.env[`STATE_POST`] !== undefined; -if ( process.env[`STATE_${key}`] !== undefined ) { // Are we in the 'post' step? - run(__dirname+"/post"); -} else { // Otherwise, this is the main step - appendFileSync(process.env.GITHUB_STATE, `${key}=true${EOL}`); - run(__dirname+"/main"); + if (is_post_step) { + // Run the post step + extractCaches(opts); + } else { + // Otherwise, this is the main step + if (process.env.GITHUB_STATE === undefined) { + throw new Error("GITHUB_STATE is not defined"); + } + await appendFile(process.env.GITHUB_STATE, `POST=true${EOL}`); + await injectCaches(opts); + } } + +await main(process.argv); diff --git a/src/inject-cache.ts b/src/inject-cache.ts new file mode 100644 index 0000000..b764e48 --- /dev/null +++ b/src/inject-cache.ts @@ -0,0 +1,45 @@ +import * as fs from 'fs/promises'; +import * as path from 'path'; +import { Opts, getCacheMap } from './opts.js'; +import { run } from './run.js'; + +async function injectCache(cacheSource: string, cacheTarget: string, scratchDir: string) { + // Clean Scratch Directory + await fs.rm(scratchDir, { recursive: true, force: true }); + await fs.mkdir(scratchDir, { recursive: true }); + + // Prepare Cache Source Directory + await fs.mkdir(cacheSource, { recursive: true }); + + // Prepare Timestamp for Layer Cache Busting + const { stdout: date } = await run('date', ['--iso=ns']); + await fs.writeFile(path.join(cacheSource, 'buildstamp'), date); + + // Prepare Dancefile to Access Caches + const dancefileContent = ` +FROM busybox:1 +COPY buildstamp buildstamp +RUN --mount=type=cache,target=${cacheTarget} \ + --mount=type=bind,source=.,target=/var/dance-cache \ + cp -p -R /var/dance-cache/. ${cacheTarget} || true +`; + await fs.writeFile(path.join(scratchDir, 'Dancefile.inject'), dancefileContent); + console.log(dancefileContent); + + // Inject Data into Docker Cache + await run('docker', ['buildx', 'build', '-f', path.join(scratchDir, 'Dancefile.inject'), '--tag', 'dance:inject', cacheSource]); + + // Clean Directories + await fs.rm(cacheSource, { recursive: true, force: true }); +} + + +export async function injectCaches(opts: Opts) { + const cacheMap = getCacheMap(opts); + const scratchDir = opts['scratch-dir']; + + // Inject Caches for each source-target pair + for (const [cacheSource, cacheTarget] of Object.entries(cacheMap)) { + await injectCache(cacheSource, cacheTarget, scratchDir); + } +} diff --git a/src/opts.ts b/src/opts.ts new file mode 100644 index 0000000..61754f1 --- /dev/null +++ b/src/opts.ts @@ -0,0 +1,35 @@ +import mri from 'mri'; + +export type Opts = { + "cache-map": string + "scratch-dir": string + "skip-extraction": boolean +} + +export function parseOpts(args: string[]): mri.Argv { + return mri(args, { + default: { + "cache-map": getInput("cache-map"), + "scratch-dir": getInput("scratch-dir"), + "skip-extraction": getInput("skip-extraction") === "true", + }, + string: ["cache-map", "scratch-dir"], + boolean: ["skip-extraction"], + }) +} + +/** + * Get the action input value from the environment (INPUT_NAME) + */ +function getInput(name: string) { + const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; + return val.trim(); +} + +export function getCacheMap(opts: Opts): Record { + try { + return JSON.parse(opts["cache-map"]) as Record; + } catch (e) { + throw new Error(`Failed to parse cache map. Expected JSON, got:\n${opts["cache-map"]}\n${e}`); + } +} diff --git a/src/run.ts b/src/run.ts new file mode 100644 index 0000000..5fba60e --- /dev/null +++ b/src/run.ts @@ -0,0 +1,5 @@ +import spawn from 'spawn-please' + +export function run(command: string, args: string[]) { + return spawn(command, args, {}, { stdout: 'inherit' }); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..629038a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "_version": "20.1.0", + "compilerOptions": { + "lib": ["ES2022"], + "target": "ES2022", + "moduleResolution": "Bundler", + "module": "Preserve", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "incremental": true, + "outDir": "dist", + "tsBuildInfoFile": "./node_modules/cache/.tsbuildinfo", + }, + "include": [ + "src/**/*.ts" + ], +}