├── .github └── workflows │ └── publish-npm.yml ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── action.yml ├── index.js ├── package.json ├── pnpm-lock.yaml └── publish-plugin.sh /.github/workflows/publish-npm.yml: -------------------------------------------------------------------------------- 1 | name: Publish to NPM 2 | 3 | on: 4 | push: 5 | # Sequence of patterns matched against refs/tags 6 | tags: 7 | - "[0-9]*" # Only push numbered versions to npm 8 | 9 | jobs: 10 | publish: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v3 15 | - uses: JS-DevTools/npm-publish@v2 16 | with: 17 | token: ${{ secrets.NPM_TOKEN }} 18 | access: public 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | docs 3 | pnpm-lock.yaml 4 | action.yml 5 | publish-plugin.sh 6 | .github 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2022 PJ Eby 2 | 3 | Permission to use, copy, modify, and/or distribute this software for any 4 | purpose with or without fee is hereby granted, provided that the above 5 | copyright notice and this permission notice appear in all copies. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 10 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 12 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 13 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## @ophidian/build: A Build & Publish System for Obsidian Plugins 2 | 3 | This module provides a complete build system for Obsidian plugins including a Github action for publishing them, without needing to duplicate large amounts of code and configuration between plugins. (The build and publish parts are actually independent: you don't have to use the builder to use the publisher or vice-versa, but they are combined in one repository for ease of use.) 4 | 5 | ## Building Plugins with the Builder 6 | 7 | To build your plugin, you'll need a small file like this (named `ophidian.config.mjs` by convention, but anything ending in `.mjs` will work): 8 | 9 | ```js 10 | import Builder from "@ophidian/build"; 11 | 12 | new Builder("src/pane-relief.ts") // <-- the path of your main module 13 | .withSass() // Could be omitted 14 | .withInstall() // Optional: publish to OBSIDIAN_TEST_VAULT on build 15 | .build(); 16 | ``` 17 | 18 | This is the entire build configuration. You can do more complex things with it, but the basics are: 19 | 20 | 1. You create the builder with the path of your plugin's main module (the one exporting the plugin class) 21 | 2. You indicate whether you're using Sass, CSS, or neither. (For Sass, you'll `import` .css or .scss files in your code; for CSS you'll just put a styles.css in your repository root.) 22 | 3. You indicate whether you want builds to be copied to the correct directory under your `OBSIDIAN_TEST_VAULT` environment variable and hot-reloaded (if you have the hot-reload plugin installed in that vault). (Note: if you don't want to set the environment variable by hand, you can use an `.envrc` file with [direnv](https://direnv.net/) to set it automatically, or you can just symlink the plugin directory in your test vault to `./dist` (or vice versa) and make sure there's a `.hotreload` file in it.) 23 | 4. You tell it to build. 24 | 25 | Now, how do you actually run it? You need to modify your package.json like so (changing the file name if needed): 26 | 27 | ```js 28 | { 29 | "scripts": { 30 | "dev": "node ophidian.config.mjs dev", 31 | "build": "node ophidian.config.mjs production" 32 | }, 33 | // ... 34 | "devDependencies": { 35 | "@ophidian/build": "^1", 36 | // ... 37 | } 38 | } 39 | ``` 40 | 41 | Now, you can use your package manger (npm, yarn, or pnpm) to `dev` (watch & rebuild with sourcemaps) or `build` (one-time run with compressed code). (You'll also need to have your package manager `install` your dev dependencies before you start.) 42 | 43 | Regardless of build type, the output files are copied to `dist/` under your project root, and optionally copied to your test vault. Note that because of the way esbuild Sass support works, you'll also see a spurious `dist/main.css` file -- @ophidian/build then copies this file to the correct name of `dist/styles.css`. 44 | 45 | ## Publishing Plugins with the Github Action 46 | 47 | The Ophidian Publish action makes updating your plugins on Github easy, even if you don't use Ophidian as a library or to build your plugin. Its features include: 48 | 49 | - Automatically checking your manifest (or manifest-beta) version against the tag to make sure they match 50 | - Automatically converting your most recent commit message to (markdown) notes on the release 51 | - Using the newer of manifest.json or manifest-beta.json for the actual release, so you can release the beta generally just by pushing a new manifest.json in your repo. 52 | - The built deliverables (main.js and styles.css) can live in the repo root, or a `dist/` or `build/` subdirectory 53 | - A .zip file with the entire plugin is included in each release, for people to easily download and install the entire plugin if they need a specific version 54 | 55 | And, perhaps the best part, it keeps your plugin action scripts short and sweet, e.g.: 56 | 57 | ```yaml 58 | name: Publish plugin 59 | on: 60 | push: # Sequence of patterns matched against refs/tags 61 | tags: 62 | - "*" # Push events to matching any tag format, i.e. 1.0, 20.15.10 63 | 64 | permissions: # needed unless you configure your repo to allow write actions by default 65 | contents: write 66 | 67 | jobs: 68 | build: 69 | runs-on: ubuntu-latest 70 | steps: 71 | - uses: actions/checkout@v3 72 | - uses: ophidian-lib/build@v1 73 | with: 74 | token: ${{ secrets.GITHUB_TOKEN }} 75 | release-notes: ${{ github.event.commits[0].message }} 76 | 77 | ``` 78 | 79 | ### Usage Requirements 80 | 81 | Aside from having a `.github/workflows/publish.yml` file like the above example, your plugin must have a build command that can be run via your package manager `build` command. It should place the built main.js and styles.css (if applicable) in the repository root, or else `dist/` or `build/`. Files in the root take precedence over files found elsewhere; `manifest.json` (and `manifest-beta.json` if applicable) must always be in the repository root since Obsidian (and BRAT) look for them there. 82 | 83 | If you have a manifest-beta.json, Ophidian will publish it in place of manifest.json, if it contains a higher version number. Whichever version is chosen must exactly match the tag you pushed (with `git push --tags`) to deploy the new version, or the action will fail with an error. 84 | 85 | ### Configuration 86 | 87 | The action supports the following configuration variables, which you may need to change from the simple arrangment shown above: 88 | 89 | - `token` - should be set as shown, it will be used to generate the release, upload files, and create release notes 90 | - `release-notes` should be set to what you want included in the release notes. Set as shown in the example unless you need something special. The first line of the string will be converted to an H3 heading (by adding `###` and a space in front of it). 91 | - `package-manager` should be set to `pnpm`, `npm` or `yarn` to match your package lockfile (`pnpm-lock.yaml`, `package-lock.json`, or `yarn.lock`). This is the command that will be used to run the `install` and `build` scripts for your plugin. 92 | - `build-script` can be set if you want the build to use a different package.json script than `build` (e.g. `cibuild`, `publish-plugin`, or something like that) 93 | - `node-version` can be set if you need a specific node.js version to run your builder; Ophidian targets Node 16 by default. 94 | - `pnpm-version` can be set if you need a specific version of pnpm. (The default is 7.33.6.) 95 | 96 | (Note: I am using this action mainly with pnpm; if you experience problems using npm or yarn, feel free to file an issue, ideally referencing the repo and/or branch that's giving you trouble so I can attempt to reproduce the problem.) 97 | 98 | ## Additional Features 99 | 100 | ### Inlining Text and CSS 101 | 102 | As of version 1.2, you can now inline files as strings, using code like this: 103 | 104 | ```ts 105 | // Both of these are strings from the files at build time 106 | import someFile from "text:./someFile.whatever"; 107 | import someCSS from "scss:./some.scss"; // and scss is converted to css 108 | ``` 109 | 110 | If you want to use this feature, you'll probably want to add the following to one of your .d.ts files (e.g. `global.d.ts` in your source folder): 111 | 112 | ```ts 113 | declare module "scss:*" { 114 | const value: string; 115 | export default value; 116 | } 117 | 118 | declare module "text:*" { 119 | const value: string; 120 | export default value; 121 | } 122 | ``` 123 | 124 | This will tell TypeScript and your IDE that what importing from these locations produces strings. 125 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: Ophidian Publish 2 | description: Publish Ophidian-based Plugin with PNPM 3 | 4 | branding: 5 | icon: aperture 6 | color: purple 7 | 8 | inputs: 9 | token: 10 | description: Github Token (for release publishing) 11 | required: true 12 | release-notes: 13 | description: Markdown for release notes (e.g. github.event.commits[0].message) 14 | required: true 15 | node-version: 16 | description: Desired version of Node.js 17 | default: "16.x" 18 | required: true 19 | package-manager: 20 | description: Desired package manager (npm, pnpm, or yarn) 21 | default: pnpm 22 | required: true 23 | build-script: 24 | description: package.json script to run (defaults to 'build') 25 | default: build 26 | required: true 27 | pnpm-version: 28 | description: Desired version of pnpm 29 | default: "7.33.6" 30 | required: true 31 | 32 | runs: 33 | using: composite 34 | 35 | steps: 36 | - uses: actions/setup-node@v4 37 | with: 38 | node-version: ${{ inputs.node-version }} 39 | 40 | - uses: pnpm/action-setup@v3 41 | if: ${{ inputs.package-manager == 'pnpm' }} 42 | with: 43 | version: ${{ inputs.pnpm-version }} 44 | 45 | - name: Create release and Upload 46 | id: release 47 | shell: bash 48 | env: 49 | GITHUB_TOKEN: ${{ inputs.token }} 50 | COMMIT_MESSAGE: ${{ inputs.release-notes }} 51 | PACKAGER: ${{ inputs.package-manager }} 52 | BUILD_SCRIPT: ${{ inputs.build-script }} 53 | run: | 54 | "$GITHUB_ACTION_PATH"/publish-plugin.sh 55 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import esbuild from "esbuild"; 2 | import process from "process"; 3 | import builtins from "builtin-modules"; 4 | import {copy} from "esbuild-plugin-copy"; 5 | import sassPlugin from "esbuild-plugin-sass"; 6 | import sass from "sass"; 7 | import copyNewer from "copy-newer"; 8 | import {basename, dirname, join, resolve} from "path"; 9 | import fs from "fs-extra"; 10 | import { readFile } from "fs/promises"; 11 | import { createRequire } from 'node:module'; 12 | import { fileURLToPath } from 'node:url'; 13 | import { around } from "monkey-around"; 14 | 15 | export function addWatch(...watchFiles) { 16 | watchFiles = fixPaths(watchFiles); 17 | return { 18 | name: 'just-watch', 19 | setup(build) { 20 | build.onLoad({ filter: /.+/ }, (args) => ({watchFiles})); 21 | }, 22 | } 23 | }; 24 | 25 | const prod = process.argv[2] === "production"; 26 | 27 | export default class Builder { 28 | constructor(entryPoint, srcFile = resolve("./ophidian.config.mjs")) { 29 | this.srcFile = srcFile; 30 | this.require = createRequire(srcFile); 31 | this.manifest = this.require("./manifest.json"); 32 | this.cfg = { 33 | minify: prod ? true : false, 34 | sourcemap: prod ? false : "inline", 35 | entryPoints: [entryPoint], 36 | bundle: true, 37 | external: [ 38 | 'obsidian', 39 | 'electron', 40 | '@codemirror/autocomplete', 41 | '@codemirror/closebrackets', 42 | '@codemirror/collab', 43 | '@codemirror/commands', 44 | '@codemirror/comment', 45 | '@codemirror/fold', 46 | '@codemirror/gutter', 47 | '@codemirror/highlight', 48 | '@codemirror/history', 49 | '@codemirror/language', 50 | '@codemirror/lint', 51 | '@codemirror/matchbrackets', 52 | '@codemirror/panel', 53 | '@codemirror/rangeset', 54 | '@codemirror/rectangular-selection', 55 | '@codemirror/search', 56 | '@codemirror/state', 57 | '@codemirror/stream-parser', 58 | '@codemirror/text', 59 | '@codemirror/tooltip', 60 | '@codemirror/view', 61 | '@lezer/common', 62 | '@lezer/highlight', 63 | '@lezer/lr', 64 | ...builtins, 65 | ], 66 | format: "cjs", 67 | loader: { 68 | '.png': 'dataurl', 69 | '.gif': 'dataurl', 70 | '.svg': 'dataurl', 71 | }, 72 | target: "ES2021", 73 | logLevel: "info", 74 | treeShaking: true, 75 | outfile: "dist/main.js", 76 | plugins: [ 77 | inline({filter: /^text:/}), 78 | inline({filter: /^scss:/, transform(data, args) { 79 | return new Promise((resolve, reject) => { 80 | sass.render({data, includePaths: [dirname(args.path)]}, (err, result) => { 81 | if (err) return reject(err); 82 | resolve(result.css.toString()); 83 | }); 84 | }); 85 | }}), 86 | copyManifest() 87 | ], 88 | } 89 | } 90 | 91 | apply(f) { 92 | f(this.cfg); return this; 93 | } 94 | 95 | assign(props) { 96 | return this.apply( c => Object.assign(c, props) ); 97 | } 98 | 99 | withPlugins(...plugins) { 100 | return this.apply(c => c.plugins.push(...plugins)); 101 | } 102 | 103 | withSass(options) { 104 | return this.withPlugins( 105 | fixPlugin(sassPlugin(options)), 106 | copy({verbose: false, assets: {from: ['dist/main.css'], to: ['styles.css']}}) 107 | ); 108 | } 109 | 110 | withCss() { 111 | console.warn("withCss() is deprecated; import your stylesheet(s) instead."); 112 | return this.withPlugins( 113 | // Copy repository/styles.css to dist/ 114 | copy({verbose: false, assets: {from: ['styles.css'], to: ['.']}}) 115 | ); 116 | } 117 | 118 | withWatch(...filenames) { 119 | return this.withPlugins(addWatch(this.srcFile, ...filenames)); 120 | } 121 | 122 | withInstall(pluginName=this.manifest.id, hotreload=true) { 123 | if (process.env.OBSIDIAN_TEST_VAULT) { 124 | const pluginDir = join(process.env.OBSIDIAN_TEST_VAULT, ".obsidian/plugins", basename(pluginName)); 125 | return this.withPlugins(pluginInstaller(pluginDir, hotreload)); 126 | } 127 | return this; 128 | } 129 | 130 | async build() { 131 | try { 132 | if (prod) { 133 | await esbuild.build(this.cfg); 134 | process.exit(0); 135 | } else { 136 | const ctx = await esbuild.context(this.cfg); 137 | await ctx.watch(); 138 | } 139 | } catch (e) { 140 | console.error(e); 141 | process.exit(1); 142 | } 143 | } 144 | } 145 | 146 | function copyManifest() { 147 | return { 148 | name: "manifest-copier", 149 | setup(build) { 150 | build.onEnd(async () => { 151 | const outDir = build.initialOptions.outdir ?? dirname(build.initialOptions.outfile) 152 | await copyNewer("manifest*.json", outDir, {verbose: true, cwd: '.'}); 153 | }); 154 | } 155 | } 156 | } 157 | 158 | function pluginInstaller(pluginDir, hotreload) { 159 | return { 160 | name: "plugin-installer", 161 | setup(build) { 162 | build.onEnd(async () => { 163 | const outDir = build.initialOptions.outdir ?? dirname(build.initialOptions.outfile) 164 | await copyNewer("{main.js,styles.css,manifest.json}", pluginDir, {verbose: true, cwd: outDir}); 165 | if (hotreload) await fs.ensureFile(pluginDir+"/.hotreload"); 166 | }); 167 | } 168 | } 169 | } 170 | 171 | function fixPlugin(plugin) { 172 | around(plugin, {setup(old) { 173 | return function (build, ...args) { 174 | const remove = around(build, {onLoad: fixHook, onResolve: fixHook}); 175 | try { 176 | return old.call(this, build, ...args); 177 | } finally { 178 | remove(); 179 | } 180 | } 181 | }}); 182 | return plugin 183 | } 184 | 185 | function fixResult(res) { 186 | if (res.then) return res.then(fixResult); 187 | if (res.watchFiles) res.watchFiles = fixPaths(res.watchFiles); 188 | if (res.watchDirs) res.watchDirs = fixPaths(res.watchDirs); 189 | return res; 190 | } 191 | 192 | function fixHook(old) { 193 | return function(opts, hook) { 194 | return old.call(this, opts, (...args) => fixResult(hook(...args))); 195 | } 196 | } 197 | 198 | function fixPaths(paths) { 199 | return paths.map(p => 200 | p.startsWith("file:") ? fileURLToPath(p) : // url, use cross-platform conversion 201 | /^\/[A-Za-z]:\//.exec(p) && process.platform === "win32" ? p.slice(1) : // remove / before drive letter 202 | p // path is already proper 203 | ); 204 | } 205 | 206 | function inline(options) { 207 | const { filter, namespace, transform } = Object.assign( 208 | { filter: /^inline:/, namespace: '_' + Math.random().toString(36).substr(2, 9) }, 209 | options 210 | ); 211 | return { 212 | name: 'inline', 213 | setup(build) { 214 | build.onResolve({filter}, args => { 215 | const realPath = args.path.replace(filter, ''); 216 | return { path: resolve(args.resolveDir, realPath), namespace }; 217 | }); 218 | build.onLoad({filter: /.*/, namespace}, async args => { 219 | let contents = await readFile(args.path, 'utf8'); 220 | if (typeof transform === 'function') { 221 | contents = await transform(contents, args); 222 | } 223 | return { contents, loader: 'text', watchFiles: [args.path] } 224 | }); 225 | } 226 | } 227 | } 228 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@ophidian/build", 3 | "version": "1.2.1", 4 | "description": "A build/publish system for Obsidian Plugins", 5 | "keywords": [ 6 | "obsidian" 7 | ], 8 | "files": [ 9 | "index.js" 10 | ], 11 | "repository": "https://github.com/ophidian-lib/build.git", 12 | "author": "PJ Eby", 13 | "license": "ISC", 14 | "type": "module", 15 | "module": "index.js", 16 | "exports": "./index.js", 17 | "dependencies": { 18 | "builtin-modules": "^3.3.0", 19 | "copy-newer": "^2.1.2", 20 | "esbuild": "0.19.11", 21 | "esbuild-plugin-copy": "^2", 22 | "esbuild-plugin-sass": "^1.0.1", 23 | "fs-extra": "^10.1.0", 24 | "monkey-around": "^2.3.0", 25 | "sass": "1.47.0" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | builtin-modules: ^3.3.0 5 | copy-newer: ^2.1.2 6 | esbuild: 0.19.11 7 | esbuild-plugin-copy: ^2 8 | esbuild-plugin-sass: ^1.0.1 9 | fs-extra: ^10.1.0 10 | monkey-around: ^2.3.0 11 | sass: 1.47.0 12 | 13 | dependencies: 14 | builtin-modules: 3.3.0 15 | copy-newer: 2.1.2 16 | esbuild: 0.19.11 17 | esbuild-plugin-copy: 2.1.1_esbuild@0.19.11 18 | esbuild-plugin-sass: 1.0.1_esbuild@0.19.11 19 | fs-extra: 10.1.0 20 | monkey-around: 2.3.0 21 | sass: 1.47.0 22 | 23 | packages: 24 | 25 | /@esbuild/aix-ppc64/0.19.11: 26 | resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} 27 | engines: {node: '>=12'} 28 | cpu: [ppc64] 29 | os: [aix] 30 | requiresBuild: true 31 | dev: false 32 | optional: true 33 | 34 | /@esbuild/android-arm/0.19.11: 35 | resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} 36 | engines: {node: '>=12'} 37 | cpu: [arm] 38 | os: [android] 39 | requiresBuild: true 40 | dev: false 41 | optional: true 42 | 43 | /@esbuild/android-arm64/0.19.11: 44 | resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} 45 | engines: {node: '>=12'} 46 | cpu: [arm64] 47 | os: [android] 48 | requiresBuild: true 49 | dev: false 50 | optional: true 51 | 52 | /@esbuild/android-x64/0.19.11: 53 | resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} 54 | engines: {node: '>=12'} 55 | cpu: [x64] 56 | os: [android] 57 | requiresBuild: true 58 | dev: false 59 | optional: true 60 | 61 | /@esbuild/darwin-arm64/0.19.11: 62 | resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} 63 | engines: {node: '>=12'} 64 | cpu: [arm64] 65 | os: [darwin] 66 | requiresBuild: true 67 | dev: false 68 | optional: true 69 | 70 | /@esbuild/darwin-x64/0.19.11: 71 | resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} 72 | engines: {node: '>=12'} 73 | cpu: [x64] 74 | os: [darwin] 75 | requiresBuild: true 76 | dev: false 77 | optional: true 78 | 79 | /@esbuild/freebsd-arm64/0.19.11: 80 | resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} 81 | engines: {node: '>=12'} 82 | cpu: [arm64] 83 | os: [freebsd] 84 | requiresBuild: true 85 | dev: false 86 | optional: true 87 | 88 | /@esbuild/freebsd-x64/0.19.11: 89 | resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} 90 | engines: {node: '>=12'} 91 | cpu: [x64] 92 | os: [freebsd] 93 | requiresBuild: true 94 | dev: false 95 | optional: true 96 | 97 | /@esbuild/linux-arm/0.19.11: 98 | resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} 99 | engines: {node: '>=12'} 100 | cpu: [arm] 101 | os: [linux] 102 | requiresBuild: true 103 | dev: false 104 | optional: true 105 | 106 | /@esbuild/linux-arm64/0.19.11: 107 | resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} 108 | engines: {node: '>=12'} 109 | cpu: [arm64] 110 | os: [linux] 111 | requiresBuild: true 112 | dev: false 113 | optional: true 114 | 115 | /@esbuild/linux-ia32/0.19.11: 116 | resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} 117 | engines: {node: '>=12'} 118 | cpu: [ia32] 119 | os: [linux] 120 | requiresBuild: true 121 | dev: false 122 | optional: true 123 | 124 | /@esbuild/linux-loong64/0.19.11: 125 | resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} 126 | engines: {node: '>=12'} 127 | cpu: [loong64] 128 | os: [linux] 129 | requiresBuild: true 130 | dev: false 131 | optional: true 132 | 133 | /@esbuild/linux-mips64el/0.19.11: 134 | resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} 135 | engines: {node: '>=12'} 136 | cpu: [mips64el] 137 | os: [linux] 138 | requiresBuild: true 139 | dev: false 140 | optional: true 141 | 142 | /@esbuild/linux-ppc64/0.19.11: 143 | resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} 144 | engines: {node: '>=12'} 145 | cpu: [ppc64] 146 | os: [linux] 147 | requiresBuild: true 148 | dev: false 149 | optional: true 150 | 151 | /@esbuild/linux-riscv64/0.19.11: 152 | resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} 153 | engines: {node: '>=12'} 154 | cpu: [riscv64] 155 | os: [linux] 156 | requiresBuild: true 157 | dev: false 158 | optional: true 159 | 160 | /@esbuild/linux-s390x/0.19.11: 161 | resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} 162 | engines: {node: '>=12'} 163 | cpu: [s390x] 164 | os: [linux] 165 | requiresBuild: true 166 | dev: false 167 | optional: true 168 | 169 | /@esbuild/linux-x64/0.19.11: 170 | resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} 171 | engines: {node: '>=12'} 172 | cpu: [x64] 173 | os: [linux] 174 | requiresBuild: true 175 | dev: false 176 | optional: true 177 | 178 | /@esbuild/netbsd-x64/0.19.11: 179 | resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} 180 | engines: {node: '>=12'} 181 | cpu: [x64] 182 | os: [netbsd] 183 | requiresBuild: true 184 | dev: false 185 | optional: true 186 | 187 | /@esbuild/openbsd-x64/0.19.11: 188 | resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} 189 | engines: {node: '>=12'} 190 | cpu: [x64] 191 | os: [openbsd] 192 | requiresBuild: true 193 | dev: false 194 | optional: true 195 | 196 | /@esbuild/sunos-x64/0.19.11: 197 | resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} 198 | engines: {node: '>=12'} 199 | cpu: [x64] 200 | os: [sunos] 201 | requiresBuild: true 202 | dev: false 203 | optional: true 204 | 205 | /@esbuild/win32-arm64/0.19.11: 206 | resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} 207 | engines: {node: '>=12'} 208 | cpu: [arm64] 209 | os: [win32] 210 | requiresBuild: true 211 | dev: false 212 | optional: true 213 | 214 | /@esbuild/win32-ia32/0.19.11: 215 | resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} 216 | engines: {node: '>=12'} 217 | cpu: [ia32] 218 | os: [win32] 219 | requiresBuild: true 220 | dev: false 221 | optional: true 222 | 223 | /@esbuild/win32-x64/0.19.11: 224 | resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} 225 | engines: {node: '>=12'} 226 | cpu: [x64] 227 | os: [win32] 228 | requiresBuild: true 229 | dev: false 230 | optional: true 231 | 232 | /@nodelib/fs.scandir/2.1.5: 233 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 234 | engines: {node: '>= 8'} 235 | dependencies: 236 | '@nodelib/fs.stat': 2.0.5 237 | run-parallel: 1.2.0 238 | dev: false 239 | 240 | /@nodelib/fs.stat/2.0.5: 241 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 242 | engines: {node: '>= 8'} 243 | dev: false 244 | 245 | /@nodelib/fs.walk/1.2.8: 246 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 247 | engines: {node: '>= 8'} 248 | dependencies: 249 | '@nodelib/fs.scandir': 2.1.5 250 | fastq: 1.13.0 251 | dev: false 252 | 253 | /ansi-styles/4.3.0: 254 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 255 | engines: {node: '>=8'} 256 | dependencies: 257 | color-convert: 2.0.1 258 | dev: false 259 | 260 | /anymatch/3.1.2: 261 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 262 | engines: {node: '>= 8'} 263 | dependencies: 264 | normalize-path: 3.0.0 265 | picomatch: 2.3.1 266 | dev: false 267 | 268 | /array-union/1.0.2: 269 | resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} 270 | engines: {node: '>=0.10.0'} 271 | dependencies: 272 | array-uniq: 1.0.3 273 | dev: false 274 | 275 | /array-union/2.1.0: 276 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 277 | engines: {node: '>=8'} 278 | dev: false 279 | 280 | /array-uniq/1.0.3: 281 | resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} 282 | engines: {node: '>=0.10.0'} 283 | dev: false 284 | 285 | /arrify/1.0.1: 286 | resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} 287 | engines: {node: '>=0.10.0'} 288 | dev: false 289 | 290 | /balanced-match/1.0.2: 291 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 292 | dev: false 293 | 294 | /binary-extensions/2.2.0: 295 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 296 | engines: {node: '>=8'} 297 | dev: false 298 | 299 | /brace-expansion/1.1.11: 300 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 301 | dependencies: 302 | balanced-match: 1.0.2 303 | concat-map: 0.0.1 304 | dev: false 305 | 306 | /braces/3.0.2: 307 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 308 | engines: {node: '>=8'} 309 | dependencies: 310 | fill-range: 7.0.1 311 | dev: false 312 | 313 | /builtin-modules/3.3.0: 314 | resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} 315 | engines: {node: '>=6'} 316 | dev: false 317 | 318 | /chalk/4.1.2: 319 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 320 | engines: {node: '>=10'} 321 | dependencies: 322 | ansi-styles: 4.3.0 323 | supports-color: 7.2.0 324 | dev: false 325 | 326 | /chokidar/3.5.3: 327 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 328 | engines: {node: '>= 8.10.0'} 329 | dependencies: 330 | anymatch: 3.1.2 331 | braces: 3.0.2 332 | glob-parent: 5.1.2 333 | is-binary-path: 2.1.0 334 | is-glob: 4.0.3 335 | normalize-path: 3.0.0 336 | readdirp: 3.6.0 337 | optionalDependencies: 338 | fsevents: 2.3.2 339 | dev: false 340 | 341 | /color-convert/2.0.1: 342 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 343 | engines: {node: '>=7.0.0'} 344 | dependencies: 345 | color-name: 1.1.4 346 | dev: false 347 | 348 | /color-name/1.1.4: 349 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 350 | dev: false 351 | 352 | /concat-map/0.0.1: 353 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 354 | dev: false 355 | 356 | /copy-newer/2.1.2: 357 | resolution: {integrity: sha512-IDhyNGNvbSqwjQXjZ3tAzZNXRw0UmXa+TmTQmMJziikQ+sdsV9EkI6B2WZX1u9m3TKHayBCc2pGqXU/KlBqJdg==} 358 | engines: {node: '>=4'} 359 | hasBin: true 360 | dependencies: 361 | fs-write-stream-atomic: 1.0.10 362 | globby: 4.1.0 363 | graceful-fs: 4.2.10 364 | minimist: 1.2.6 365 | mkdirp: 0.5.6 366 | pify: 2.3.0 367 | dev: false 368 | 369 | /core-util-is/1.0.3: 370 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 371 | dev: false 372 | 373 | /css-tree/1.1.3: 374 | resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} 375 | engines: {node: '>=8.0.0'} 376 | dependencies: 377 | mdn-data: 2.0.14 378 | source-map: 0.6.1 379 | dev: false 380 | 381 | /dir-glob/3.0.1: 382 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 383 | engines: {node: '>=8'} 384 | dependencies: 385 | path-type: 4.0.0 386 | dev: false 387 | 388 | /esbuild-plugin-copy/2.1.1_esbuild@0.19.11: 389 | resolution: {integrity: sha512-Bk66jpevTcV8KMFzZI1P7MZKZ+uDcrZm2G2egZ2jNIvVnivDpodZI+/KnpL3Jnap0PBdIHU7HwFGB8r+vV5CVw==} 390 | peerDependencies: 391 | esbuild: '>= 0.14.0' 392 | dependencies: 393 | chalk: 4.1.2 394 | chokidar: 3.5.3 395 | esbuild: 0.19.11 396 | fs-extra: 10.1.0 397 | globby: 11.1.0 398 | dev: false 399 | 400 | /esbuild-plugin-sass/1.0.1_esbuild@0.19.11: 401 | resolution: {integrity: sha512-YFxjzD9Z1vz92QCJcAmCO15WVCUiOobw9ypdVeMsW+xa6S+zqryLUIh8d3fe/UkRHRO5PODZz/3xDAQuEXZwmQ==} 402 | peerDependencies: 403 | esbuild: '>=0.11.14' 404 | dependencies: 405 | css-tree: 1.1.3 406 | esbuild: 0.19.11 407 | fs-extra: 10.0.0 408 | sass: 1.47.0 409 | tmp: 0.2.1 410 | dev: false 411 | 412 | /esbuild/0.19.11: 413 | resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} 414 | engines: {node: '>=12'} 415 | hasBin: true 416 | requiresBuild: true 417 | optionalDependencies: 418 | '@esbuild/aix-ppc64': 0.19.11 419 | '@esbuild/android-arm': 0.19.11 420 | '@esbuild/android-arm64': 0.19.11 421 | '@esbuild/android-x64': 0.19.11 422 | '@esbuild/darwin-arm64': 0.19.11 423 | '@esbuild/darwin-x64': 0.19.11 424 | '@esbuild/freebsd-arm64': 0.19.11 425 | '@esbuild/freebsd-x64': 0.19.11 426 | '@esbuild/linux-arm': 0.19.11 427 | '@esbuild/linux-arm64': 0.19.11 428 | '@esbuild/linux-ia32': 0.19.11 429 | '@esbuild/linux-loong64': 0.19.11 430 | '@esbuild/linux-mips64el': 0.19.11 431 | '@esbuild/linux-ppc64': 0.19.11 432 | '@esbuild/linux-riscv64': 0.19.11 433 | '@esbuild/linux-s390x': 0.19.11 434 | '@esbuild/linux-x64': 0.19.11 435 | '@esbuild/netbsd-x64': 0.19.11 436 | '@esbuild/openbsd-x64': 0.19.11 437 | '@esbuild/sunos-x64': 0.19.11 438 | '@esbuild/win32-arm64': 0.19.11 439 | '@esbuild/win32-ia32': 0.19.11 440 | '@esbuild/win32-x64': 0.19.11 441 | dev: false 442 | 443 | /fast-glob/3.2.11: 444 | resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} 445 | engines: {node: '>=8.6.0'} 446 | dependencies: 447 | '@nodelib/fs.stat': 2.0.5 448 | '@nodelib/fs.walk': 1.2.8 449 | glob-parent: 5.1.2 450 | merge2: 1.4.1 451 | micromatch: 4.0.5 452 | dev: false 453 | 454 | /fastq/1.13.0: 455 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 456 | dependencies: 457 | reusify: 1.0.4 458 | dev: false 459 | 460 | /fill-range/7.0.1: 461 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 462 | engines: {node: '>=8'} 463 | dependencies: 464 | to-regex-range: 5.0.1 465 | dev: false 466 | 467 | /fs-extra/10.0.0: 468 | resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==} 469 | engines: {node: '>=12'} 470 | dependencies: 471 | graceful-fs: 4.2.10 472 | jsonfile: 6.1.0 473 | universalify: 2.0.0 474 | dev: false 475 | 476 | /fs-extra/10.1.0: 477 | resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} 478 | engines: {node: '>=12'} 479 | dependencies: 480 | graceful-fs: 4.2.10 481 | jsonfile: 6.1.0 482 | universalify: 2.0.0 483 | dev: false 484 | 485 | /fs-write-stream-atomic/1.0.10: 486 | resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} 487 | dependencies: 488 | graceful-fs: 4.2.10 489 | iferr: 0.1.5 490 | imurmurhash: 0.1.4 491 | readable-stream: 2.3.7 492 | dev: false 493 | 494 | /fs.realpath/1.0.0: 495 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 496 | dev: false 497 | 498 | /fsevents/2.3.2: 499 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 500 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 501 | os: [darwin] 502 | requiresBuild: true 503 | dev: false 504 | optional: true 505 | 506 | /glob-parent/5.1.2: 507 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 508 | engines: {node: '>= 6'} 509 | dependencies: 510 | is-glob: 4.0.3 511 | dev: false 512 | 513 | /glob/6.0.4: 514 | resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} 515 | dependencies: 516 | inflight: 1.0.6 517 | inherits: 2.0.4 518 | minimatch: 3.1.2 519 | once: 1.4.0 520 | path-is-absolute: 1.0.1 521 | dev: false 522 | 523 | /glob/7.2.3: 524 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 525 | dependencies: 526 | fs.realpath: 1.0.0 527 | inflight: 1.0.6 528 | inherits: 2.0.4 529 | minimatch: 3.1.2 530 | once: 1.4.0 531 | path-is-absolute: 1.0.1 532 | dev: false 533 | 534 | /globby/11.1.0: 535 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 536 | engines: {node: '>=10'} 537 | dependencies: 538 | array-union: 2.1.0 539 | dir-glob: 3.0.1 540 | fast-glob: 3.2.11 541 | ignore: 5.2.0 542 | merge2: 1.4.1 543 | slash: 3.0.0 544 | dev: false 545 | 546 | /globby/4.1.0: 547 | resolution: {integrity: sha512-JPDtMSr0bt25W64q792rvlrSwIaZwqUAhqdYKSr57Wh/xBcQ5JDWLM85ndn+Q1WdBQXLb9YGCl0QN/T0HpqU0A==} 548 | engines: {node: '>=0.10.0'} 549 | dependencies: 550 | array-union: 1.0.2 551 | arrify: 1.0.1 552 | glob: 6.0.4 553 | object-assign: 4.1.1 554 | pify: 2.3.0 555 | pinkie-promise: 2.0.1 556 | dev: false 557 | 558 | /graceful-fs/4.2.10: 559 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 560 | dev: false 561 | 562 | /has-flag/4.0.0: 563 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 564 | engines: {node: '>=8'} 565 | dev: false 566 | 567 | /iferr/0.1.5: 568 | resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} 569 | dev: false 570 | 571 | /ignore/5.2.0: 572 | resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} 573 | engines: {node: '>= 4'} 574 | dev: false 575 | 576 | /immutable/4.1.0: 577 | resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==} 578 | dev: false 579 | 580 | /imurmurhash/0.1.4: 581 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 582 | engines: {node: '>=0.8.19'} 583 | dev: false 584 | 585 | /inflight/1.0.6: 586 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 587 | dependencies: 588 | once: 1.4.0 589 | wrappy: 1.0.2 590 | dev: false 591 | 592 | /inherits/2.0.4: 593 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 594 | dev: false 595 | 596 | /is-binary-path/2.1.0: 597 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 598 | engines: {node: '>=8'} 599 | dependencies: 600 | binary-extensions: 2.2.0 601 | dev: false 602 | 603 | /is-extglob/2.1.1: 604 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 605 | engines: {node: '>=0.10.0'} 606 | dev: false 607 | 608 | /is-glob/4.0.3: 609 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 610 | engines: {node: '>=0.10.0'} 611 | dependencies: 612 | is-extglob: 2.1.1 613 | dev: false 614 | 615 | /is-number/7.0.0: 616 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 617 | engines: {node: '>=0.12.0'} 618 | dev: false 619 | 620 | /isarray/1.0.0: 621 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 622 | dev: false 623 | 624 | /jsonfile/6.1.0: 625 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 626 | dependencies: 627 | universalify: 2.0.0 628 | optionalDependencies: 629 | graceful-fs: 4.2.10 630 | dev: false 631 | 632 | /mdn-data/2.0.14: 633 | resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} 634 | dev: false 635 | 636 | /merge2/1.4.1: 637 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 638 | engines: {node: '>= 8'} 639 | dev: false 640 | 641 | /micromatch/4.0.5: 642 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 643 | engines: {node: '>=8.6'} 644 | dependencies: 645 | braces: 3.0.2 646 | picomatch: 2.3.1 647 | dev: false 648 | 649 | /minimatch/3.1.2: 650 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 651 | dependencies: 652 | brace-expansion: 1.1.11 653 | dev: false 654 | 655 | /minimist/1.2.6: 656 | resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} 657 | dev: false 658 | 659 | /mkdirp/0.5.6: 660 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 661 | hasBin: true 662 | dependencies: 663 | minimist: 1.2.6 664 | dev: false 665 | 666 | /monkey-around/2.3.0: 667 | resolution: {integrity: sha512-QWcCUWjqE/MCk9cXlSKZ1Qc486LD439xw/Ak8Nt6l2PuL9+yrc9TJakt7OHDuOqPRYY4nTWBAEFKn32PE/SfXA==} 668 | dev: false 669 | 670 | /normalize-path/3.0.0: 671 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 672 | engines: {node: '>=0.10.0'} 673 | dev: false 674 | 675 | /object-assign/4.1.1: 676 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 677 | engines: {node: '>=0.10.0'} 678 | dev: false 679 | 680 | /once/1.4.0: 681 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 682 | dependencies: 683 | wrappy: 1.0.2 684 | dev: false 685 | 686 | /path-is-absolute/1.0.1: 687 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 688 | engines: {node: '>=0.10.0'} 689 | dev: false 690 | 691 | /path-type/4.0.0: 692 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 693 | engines: {node: '>=8'} 694 | dev: false 695 | 696 | /picomatch/2.3.1: 697 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 698 | engines: {node: '>=8.6'} 699 | dev: false 700 | 701 | /pify/2.3.0: 702 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 703 | engines: {node: '>=0.10.0'} 704 | dev: false 705 | 706 | /pinkie-promise/2.0.1: 707 | resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} 708 | engines: {node: '>=0.10.0'} 709 | dependencies: 710 | pinkie: 2.0.4 711 | dev: false 712 | 713 | /pinkie/2.0.4: 714 | resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} 715 | engines: {node: '>=0.10.0'} 716 | dev: false 717 | 718 | /process-nextick-args/2.0.1: 719 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 720 | dev: false 721 | 722 | /queue-microtask/1.2.3: 723 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 724 | dev: false 725 | 726 | /readable-stream/2.3.7: 727 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} 728 | dependencies: 729 | core-util-is: 1.0.3 730 | inherits: 2.0.4 731 | isarray: 1.0.0 732 | process-nextick-args: 2.0.1 733 | safe-buffer: 5.1.2 734 | string_decoder: 1.1.1 735 | util-deprecate: 1.0.2 736 | dev: false 737 | 738 | /readdirp/3.6.0: 739 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 740 | engines: {node: '>=8.10.0'} 741 | dependencies: 742 | picomatch: 2.3.1 743 | dev: false 744 | 745 | /reusify/1.0.4: 746 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 747 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 748 | dev: false 749 | 750 | /rimraf/3.0.2: 751 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 752 | hasBin: true 753 | dependencies: 754 | glob: 7.2.3 755 | dev: false 756 | 757 | /run-parallel/1.2.0: 758 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 759 | dependencies: 760 | queue-microtask: 1.2.3 761 | dev: false 762 | 763 | /safe-buffer/5.1.2: 764 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 765 | dev: false 766 | 767 | /sass/1.47.0: 768 | resolution: {integrity: sha512-GtXwvwgD7/6MLUZPnlA5/8cdRgC9SzT5kAnnJMRmEZQFRE3J56Foswig4NyyyQGsnmNvg6EUM/FP0Pe9Y2zywQ==} 769 | engines: {node: '>=8.9.0'} 770 | hasBin: true 771 | dependencies: 772 | chokidar: 3.5.3 773 | immutable: 4.1.0 774 | source-map-js: 1.0.2 775 | dev: false 776 | 777 | /slash/3.0.0: 778 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 779 | engines: {node: '>=8'} 780 | dev: false 781 | 782 | /source-map-js/1.0.2: 783 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 784 | engines: {node: '>=0.10.0'} 785 | dev: false 786 | 787 | /source-map/0.6.1: 788 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 789 | engines: {node: '>=0.10.0'} 790 | dev: false 791 | 792 | /string_decoder/1.1.1: 793 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 794 | dependencies: 795 | safe-buffer: 5.1.2 796 | dev: false 797 | 798 | /supports-color/7.2.0: 799 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 800 | engines: {node: '>=8'} 801 | dependencies: 802 | has-flag: 4.0.0 803 | dev: false 804 | 805 | /tmp/0.2.1: 806 | resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} 807 | engines: {node: '>=8.17.0'} 808 | dependencies: 809 | rimraf: 3.0.2 810 | dev: false 811 | 812 | /to-regex-range/5.0.1: 813 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 814 | engines: {node: '>=8.0'} 815 | dependencies: 816 | is-number: 7.0.0 817 | dev: false 818 | 819 | /universalify/2.0.0: 820 | resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} 821 | engines: {node: '>= 10.0.0'} 822 | dev: false 823 | 824 | /util-deprecate/1.0.2: 825 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 826 | dev: false 827 | 828 | /wrappy/1.0.2: 829 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 830 | dev: false 831 | -------------------------------------------------------------------------------- /publish-plugin.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -e # Fail on unhandled errors 3 | 4 | PLUGIN_NAME=$(jq -r .id manifest.json) 5 | PLUGIN_NAME=${PLUGIN_NAME:-${GITHUB_REPOSITORY##*/}} 6 | 7 | TAG_NAME=${GITHUB_REF##*/} 8 | MANIFEST_VERSION=$(jq -r .version manifest.json) 9 | MANIFEST_FILE=manifest.json 10 | 11 | BUILD_DIR=dist 12 | if [[ -d build && ! -d dist ]]; then 13 | BUILD_DIR=build 14 | fi 15 | 16 | # Check if beta manifest is newer: if so, use that for the release 17 | # (so betas can be made public later and have the right version number) 18 | # 19 | if [[ -f manifest-beta.json ]]; then 20 | BETA_VERSION=$(jq -r .version manifest-beta.json) 21 | if jq --arg v1 "$BETA_VERSION" --arg v2 "$MANIFEST_VERSION" -ne '($v1|split(".")) > ($v2|split("."))' >/dev/null; then 22 | MANIFEST_VERSION="$BETA_VERSION" 23 | MANIFEST_FILE=manifest-beta.json 24 | cp manifest-beta.json manifest.json 25 | fi 26 | fi 27 | 28 | if [[ "$MANIFEST_VERSION" != "$TAG_NAME" ]]; then 29 | echo "ERROR: Commit is tagged '$TAG_NAME' but $MANIFEST_FILE version is '$MANIFEST_VERSION'" 30 | exit 1 31 | fi 32 | 33 | "$PACKAGER" install 34 | "$PACKAGER" "${BUILD_SCRIPT}" 35 | 36 | mkdir "${PLUGIN_NAME}" 37 | 38 | assets=() 39 | for f in main.js manifest.json styles.css; do 40 | if [[ "$f" != manifest.json && -f "$BUILD_DIR/$f" && ! -f "$f" ]]; then 41 | mv "$BUILD_DIR"/$f $f; 42 | fi 43 | if [[ -f $f ]]; then 44 | cp $f "${PLUGIN_NAME}/" 45 | assets+=("$f") 46 | fi 47 | done 48 | 49 | zip -r "$PLUGIN_NAME".zip "$PLUGIN_NAME" 50 | gh release create "$TAG_NAME" -t "$TAG_NAME" -n "### $COMMIT_MESSAGE" 51 | gh release upload --clobber "$TAG_NAME" "${assets[@]}" "$PLUGIN_NAME".zip 52 | --------------------------------------------------------------------------------