From 56722b6d41914636549c7ee68830a45eeac58585 Mon Sep 17 00:00:00 2001 From: Futago-za Ryuu Date: Sat, 16 Nov 2019 18:06:38 +0000 Subject: [PATCH] Rebuild the website as a SSR static site --- .codecov.yml | 1 + .eslintignore | 4 +- .gitignore | 3 +- .nowignore | 19 +- now.json | 18 +- package.json | 10 +- packages/pegjs/.npmignore | 1 - tools/publish-dev/package.json | 2 +- tools/publish-dev/publish.js | 3 - webpack.config.js | 12 -- website/README.md | 13 ++ website/{ => assets}/css/benchmark.css | 0 website/{ => assets}/css/common.css | 0 website/{ => assets}/css/content.css | 0 website/{ => assets}/css/layout-default.css | 0 website/{ => assets}/css/layout-online.css | 0 website/{ => assets}/css/test.css | 0 website/{ => assets}/favicon.ico | Bin website/{ => assets}/img/rule.png | Bin .../img/spinner-16x16-progress.gif | Bin website/{ => assets}/img/spinner-48x48.gif | Bin website/{ => assets}/js/online.js | 12 +- .../vendor/codemirror/codemirror.css | 0 .../vendor/codemirror/codemirror.js | 0 website/{ => assets}/vendor/jsdump/jsDump.js | 0 website/{ => assets}/vendor/pegjs/peg.js | 0 website/export.js | 35 ++++ website/export.utils.js | 190 ++++++++++++++++++ website/package.json | 11 +- website/pages/development/benchmark.js | 61 ++++++ website/pages/development/index.js | 40 ++++ website/pages/development/test.js | 44 ++++ website/pages/development/try.js | 29 +++ .../documentation.html} | 0 website/pages/documentation.js | 10 + website/pages/index.js | 61 ++++++ .../arithmetics.pegjs => pages/online.js} | 16 +- website/templates/article.js | 19 ++ website/templates/editor.html | 86 ++++++++ website/templates/editor.js | 40 ++++ website/templates/html.js | 89 ++++++++ website/views/benchmark.ejs | 30 --- website/views/development.ejs | 28 --- website/views/index.ejs | 39 ---- website/views/layout-online.ejs | 53 ----- website/views/layout.ejs | 61 ------ website/views/online.ejs | 95 --------- website/views/test.ejs | 16 -- website/webpack.config.js | 3 + yarn.lock | 121 ++++++++++- 50 files changed, 901 insertions(+), 374 deletions(-) delete mode 100644 packages/pegjs/.npmignore create mode 100644 website/README.md rename website/{ => assets}/css/benchmark.css (100%) rename website/{ => assets}/css/common.css (100%) rename website/{ => assets}/css/content.css (100%) rename website/{ => assets}/css/layout-default.css (100%) rename website/{ => assets}/css/layout-online.css (100%) rename website/{ => assets}/css/test.css (100%) rename website/{ => assets}/favicon.ico (100%) rename website/{ => assets}/img/rule.png (100%) rename website/{ => assets}/img/spinner-16x16-progress.gif (100%) rename website/{ => assets}/img/spinner-48x48.gif (100%) rename website/{ => assets}/js/online.js (95%) rename website/{ => assets}/vendor/codemirror/codemirror.css (100%) rename website/{ => assets}/vendor/codemirror/codemirror.js (100%) rename website/{ => assets}/vendor/jsdump/jsDump.js (100%) rename website/{ => assets}/vendor/pegjs/peg.js (100%) create mode 100644 website/export.js create mode 100644 website/export.utils.js create mode 100644 website/pages/development/benchmark.js create mode 100644 website/pages/development/index.js create mode 100644 website/pages/development/test.js create mode 100644 website/pages/development/try.js rename website/{views/documentation.ejs => pages/documentation.html} (100%) create mode 100644 website/pages/documentation.js create mode 100644 website/pages/index.js rename website/{vendor/pegjs/arithmetics.pegjs => pages/online.js} (77%) create mode 100644 website/templates/article.js create mode 100644 website/templates/editor.html create mode 100644 website/templates/editor.js create mode 100644 website/templates/html.js delete mode 100644 website/views/benchmark.ejs delete mode 100644 website/views/development.ejs delete mode 100644 website/views/index.ejs delete mode 100644 website/views/layout-online.ejs delete mode 100644 website/views/layout.ejs delete mode 100644 website/views/online.ejs delete mode 100644 website/views/test.ejs create mode 100644 website/webpack.config.js diff --git a/.codecov.yml b/.codecov.yml index a0fb6d0..57c6519 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -6,6 +6,7 @@ ignore: - "**/*/dist/*.js" - "**/*.{spec,test}.js" - "**/*.eslintrc.js" + - "{public,website}/**/*.js" parsers: javascript: diff --git a/.eslintignore b/.eslintignore index 46c5e0c..f67e064 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,8 +1,8 @@ !.eslintrc.js /.idea /.nyc_output +/public /packages/pegjs/dist /coverage node_modules -/website/*/** -/dist +/website/assets diff --git a/.gitignore b/.gitignore index b56d362..29480f9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,11 @@ /.idea /packages/pegjs/dist /packages/pegjs/.npmrc -/dist +/public /examples/*.js node_modules /coverage /.nyc_output -/website/js/*-bundle.js /*.log /sh.exe.stackdump /test/junit-results.xml diff --git a/.nowignore b/.nowignore index ba58a53..6c9c6b5 100644 --- a/.nowignore +++ b/.nowignore @@ -1,9 +1,12 @@ -.github -.idea -.nyc_output -coverage -dist +/.github +/.idea +/.nyc_output +/coverage node_modules -.eslint* -.nycrc -azure-pipelines.yml +/public +/.codecov.yml +/.eslint* +/.nycrc +/CHANGELOG.md +/tsconfig.json +/README.md diff --git a/now.json b/now.json index fd6e198..a95cd6c 100644 --- a/now.json +++ b/now.json @@ -1,13 +1,21 @@ { "version": 2, - "name": "pegjs-next-website", + "name": "pegjs", "alias": [ - "next.pegjs.org" + "pegjs.org", + "www.pegjs.org" ], - "builds": [ + "routes": [ { - "src": "package.json", - "use": "@now/static-build" + "handle": "filesystem" + }, + { + "src": "/", + "dest": "/index.html" + }, + { + "src": "/([^\\.*]+)", + "dest": "/$1.html" } ] } diff --git a/package.json b/package.json index acc3d2c..91ef843 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,10 @@ "name": "pegjs-dev", "private": true, "workspaces": [ - "docs", "packages/*", "tools/*", - "test" + "test", + "website" ], "scripts": { "lint": "eslint --ext .js .", @@ -13,10 +13,10 @@ "benchmark": "node tools/benchmark", "build-parser": "pegjs -c src/pegjs.config.js", "build-dist": "bundle", - "watch-dist": "bundle --watch", - "clean": "rimraf packages/pegjs/dist examples/*.js", + "build-website": "node website/export", + "clean": "rimraf public packages/pegjs/dist examples/*.js", "impact": "node tools/impact master", - "now-build": "npm run build-docs", + "build": "node website/export --fresh", "test": "nyc mocha", "coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov" }, diff --git a/packages/pegjs/.npmignore b/packages/pegjs/.npmignore deleted file mode 100644 index 57bb056..0000000 --- a/packages/pegjs/.npmignore +++ /dev/null @@ -1 +0,0 @@ -dist/*-bundle.min.js diff --git a/tools/publish-dev/package.json b/tools/publish-dev/package.json index c6f838f..c33b8fa 100644 --- a/tools/publish-dev/package.json +++ b/tools/publish-dev/package.json @@ -1,5 +1,5 @@ { "name": "@pegjs/publish-dev", - "version": "2.2.0", + "version": "2.3.0", "private": true } diff --git a/tools/publish-dev/publish.js b/tools/publish-dev/publish.js index d65e150..13f1048 100644 --- a/tools/publish-dev/publish.js +++ b/tools/publish-dev/publish.js @@ -10,7 +10,6 @@ function publish( id ) { const packagejson = require.resolve( id + "/package.json" ); const directory = path.dirname( packagejson ); - const npmignore = path.join( directory, ".npmignore" ); const npmrc = path.join( directory, ".npmrc" ); // variabes @@ -63,8 +62,6 @@ function publish( id ) { fs.writeFileSync( npmrc, `//registry.npmjs.org/:_authToken=${ NPM_TOKEN }` ); - if ( fs.existsSync( npmignore ) ) fs.unlinkSync( npmignore ); - // publish @dev exec( "npm publish --tag=dev" ); diff --git a/webpack.config.js b/webpack.config.js index 9c143c9..8225c98 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -43,16 +43,4 @@ module.exports = [ } ), - /* https://unpkg.com/pegjs@dev/dist/*-bundle.min.js */ - target( { - - entry: { - "benchmark": require.resolve( "@pegjs/benchmark-suite/browser.stub.js" ), - "test": require.resolve( "@pegjs/spec-suite/browser.stub.js" ), - }, - library: [ "peg", "[name]" ], - output: "packages/pegjs/dist/[name]-bundle.min.js", - - } ), - ]; diff --git a/website/README.md b/website/README.md new file mode 100644 index 0000000..2514dbe --- /dev/null +++ b/website/README.md @@ -0,0 +1,13 @@ +This directory contains content used to generate the [PEG.js website](https://pegjs.org/). + +### [assets](./assets) + +Static files that will be served by Zeit's CDN. + +### [pages](./pages), [templates](./templates) + +Contains scripts, source files & templates used to generate the actual pages served on the website. + +### [export.js](./export.js) + +Running this script will build a static site, deployable via `now` diff --git a/website/css/benchmark.css b/website/assets/css/benchmark.css similarity index 100% rename from website/css/benchmark.css rename to website/assets/css/benchmark.css diff --git a/website/css/common.css b/website/assets/css/common.css similarity index 100% rename from website/css/common.css rename to website/assets/css/common.css diff --git a/website/css/content.css b/website/assets/css/content.css similarity index 100% rename from website/css/content.css rename to website/assets/css/content.css diff --git a/website/css/layout-default.css b/website/assets/css/layout-default.css similarity index 100% rename from website/css/layout-default.css rename to website/assets/css/layout-default.css diff --git a/website/css/layout-online.css b/website/assets/css/layout-online.css similarity index 100% rename from website/css/layout-online.css rename to website/assets/css/layout-online.css diff --git a/website/css/test.css b/website/assets/css/test.css similarity index 100% rename from website/css/test.css rename to website/assets/css/test.css diff --git a/website/favicon.ico b/website/assets/favicon.ico similarity index 100% rename from website/favicon.ico rename to website/assets/favicon.ico diff --git a/website/img/rule.png b/website/assets/img/rule.png similarity index 100% rename from website/img/rule.png rename to website/assets/img/rule.png diff --git a/website/img/spinner-16x16-progress.gif b/website/assets/img/spinner-16x16-progress.gif similarity index 100% rename from website/img/spinner-16x16-progress.gif rename to website/assets/img/spinner-16x16-progress.gif diff --git a/website/img/spinner-48x48.gif b/website/assets/img/spinner-48x48.gif similarity index 100% rename from website/img/spinner-48x48.gif rename to website/assets/img/spinner-48x48.gif diff --git a/website/js/online.js b/website/assets/js/online.js similarity index 95% rename from website/js/online.js rename to website/assets/js/online.js index c0cd6a1..546bda4 100644 --- a/website/js/online.js +++ b/website/assets/js/online.js @@ -3,6 +3,7 @@ $(document).ready(function() { var MS_IN_S = 1000; var parser; + var parserSource = null; var buildAndParseTimer = null; var parseTimer = null; @@ -51,7 +52,7 @@ $(document).ready(function() { try { var timeBefore = (new Date).getTime(); - var parserSource = peg.generate(getGrammar(), { + parserSource = peg.generate(getGrammar(), { cache: $("#option-cache").is(":checked"), optimize: $("#option-optimize").val(), output: "source" @@ -69,7 +70,6 @@ $(document).ready(function() { timeAfter - timeBefore )); $("#input").removeAttr("disabled"); - $("#parser-source").val($("#parser-var").val() + " = " + parserSource + ";\n"); $("#parser-var").removeAttr("disabled"); $("#option-cache").removeAttr("disabled"); $("#option-optimize").removeAttr("disabled"); @@ -200,6 +200,14 @@ $(document).ready(function() { .keyup(scheduleParse) .keypress(scheduleParse); + $( "#parser-download" ) + .click(function(){ + + var blob = new Blob( [ $( "#parser-var" ).val() + " = " + parserSource + ";\n" ], { type: "application/javascript" } ); + window.saveAs( blob, "parser.js" ); + + }); + doLayout(); $(window).resize(doLayout); diff --git a/website/vendor/codemirror/codemirror.css b/website/assets/vendor/codemirror/codemirror.css similarity index 100% rename from website/vendor/codemirror/codemirror.css rename to website/assets/vendor/codemirror/codemirror.css diff --git a/website/vendor/codemirror/codemirror.js b/website/assets/vendor/codemirror/codemirror.js similarity index 100% rename from website/vendor/codemirror/codemirror.js rename to website/assets/vendor/codemirror/codemirror.js diff --git a/website/vendor/jsdump/jsDump.js b/website/assets/vendor/jsdump/jsDump.js similarity index 100% rename from website/vendor/jsdump/jsDump.js rename to website/assets/vendor/jsdump/jsDump.js diff --git a/website/vendor/pegjs/peg.js b/website/assets/vendor/pegjs/peg.js similarity index 100% rename from website/vendor/pegjs/peg.js rename to website/assets/vendor/pegjs/peg.js diff --git a/website/export.js b/website/export.js new file mode 100644 index 0000000..71e96b3 --- /dev/null +++ b/website/export.js @@ -0,0 +1,35 @@ +"use strict"; + +const { bluebird, fs, expand, refresh } = require( "./export.utils" ); + +( async () => { + + // Copy static content + await fs.copy( expand( "website/assets" ), expand( "public" ) ); + + // Generate pages + await bluebird.each( fs.glob( "pages/**/*.js", __dirname ), async input => { + + const output = input + .replace( expand( "website/pages" ), expand( "public" ) ) + .slice( 0, -3 ) + ".html"; + + await refresh( input, output, async () => { + + let page = require( input ); + + if ( typeof page === "function" ) page = await bluebird.method( page )(); + + await fs.ensureDir( fs.dirname( output ) ); + await fs.writeFile( output, page.trim() ); + + } ); + + } ); + +} )().catch( err => { + + console.trace( err ); + process.exit( 1 ); + +} ); diff --git a/website/export.utils.js b/website/export.utils.js new file mode 100644 index 0000000..fbb2486 --- /dev/null +++ b/website/export.utils.js @@ -0,0 +1,190 @@ +"use strict"; + +const bluebird = require( "bluebird" ); +const BundlerTarget = require( "@pegjs/bundler/target" ); +const cp = require( "@futagoza/child-process" ); +const fse = require( "fs-extra-plus" ); +const isSourceNewer = require( "@tache/is-source-newer" ); +const path = require( "path" ); + +/** + * This flag can be used to: + * + * 1. Force building content even if it hasn't changed. + * 2. Delete and write content instead of overwriting. + */ + +const FRESH_BUILD = process.argv.includes( "--fresh" ); + +/** + * A conveniant object that has the following merged: + * + * - The `fs-extra-plus` module + * - The `path` module + * - Custom overwrides of the above 2 modules + * + * @type {path & fse} + */ + +const fs = Object.assign( {}, path, fse, { + + copy( source, target, opts ) { + + return refresh( source, target, async () => { + + if ( FRESH_BUILD ) await fse.remove( target ); + + await fse.copy( source, target, opts ); + + } ); + + }, + +} ); + +/** + * A bundler wrapper that simplfies bundler interaction across child process's via async functions. + */ + +const Bundler = { + + /** + * The CLI argument used to get/set a script that actually contains the bundles config. + */ + + argv: "--get-config-from", + + /** + * The CLI used to run the actual bundler. + */ + + cli: require.resolve( "@pegjs/bundler/bundler.js" ), + + /** + * The property exported from a script that contains the bundler's config. + */ + + property: Symbol( "BundlerConfig" ), + + /** + * This method must be called from a bundler's `*.js` config file to get the actual config. + */ + + load() { + + const { argv } = process; + + return require( argv[ argv.indexOf( Bundler.argv ) + 1 ] )[ Bundler.property ]; + + }, + + /** + * This will create an async function that first executes the bundler if required, then calls `next` + * + * @template T + * @param {{check?: string, config: {}, cwd?: string, next: () => T, script: string, targets?: {}[]}} param0 + */ + + create( { check, config, cwd = __dirname, next, script, targets } ) { + + if ( targets && ! config ) config = targets[ 0 ]; + + /** @returns {Promise} */ + + async function executer() { + + const run = () => cp.run( "node", [ Bundler.cli, Bundler.argv, script ], { cwd } ); + + await check ? refresh( check, config.output, run ) : run(); + + return bluebird.method( next )(); + + } + + Object.defineProperty( executer, Bundler.property, { + get: () => targets || [ BundlerTarget( config ) ], + } ); + + return executer; + + }, + + /** + * A wrapper function to help create a configuration for the bundler. + */ + + target: BundlerTarget, + +}; + +/** + * Helps to cleanly get the full filesystem path of `p`. + * + * @param {string} p The path to expand + * @param {string|string[]} cwd The current working directory (prepended to `p`) + */ + +function expand( p = ".", cwd = [ __dirname, ".." ] ) { + + let resolved = expand.cache[ p ]; + + if ( ! resolved ) { + + if ( typeof cwd === "string" ) cwd = [ cwd ]; + + const right = p + .replace( "\\", "/" ) + .split( "/" ); + + resolved = path.join( ...cwd, ...right ); + + expand.cache[ p ] = resolved; + + } + + return resolved; + +} + +/** + * A cache of the expaneded paths. + * + * @type {{ [key: string]: string }} + */ + +expand.cache = {}; + +/** + * Will execute `cb` if `source` is newer then `target`. Can be used to only build changed files. + * + * _NOTE:_ If the `--fresh` flag is defined, this will always call `cb` + * + * @template T + * @param {string} source The source file or directory + * @param {string} target The generated output + * @param {(paths:{ source:string, target:string })=>Promise} cb Called if `source` is newer. + */ + +async function refresh( source, target, cb ) { + + const paths = { source, target }; + + return FRESH_BUILD || await isSourceNewer( paths ) + ? cb( paths ) + : Promise.resolve(); + +} + +module.exports = { + + FRESH_BUILD, + + bluebird, + cp, + fs, + + Bundler, + expand, + refresh, + +}; diff --git a/website/package.json b/website/package.json index 1505afe..3ead3bd 100644 --- a/website/package.json +++ b/website/package.json @@ -1,12 +1,11 @@ { "name": "@pegjs/website", - "version": "1.3.0", + "version": "2.0.0", "private": true, "dependencies": { - "body-parser": "1.19.0", - "ejs": "2.7.2", - "express": "4.17.1", - "express-layout": "0.1.0", - "morgan": "1.9.1" + "@futagoza/child-process": "1.0.0", + "@tache/is-source-newer": "1.0.0-beta.5", + "bluebird": "3.7.1", + "fs-extra-plus": "0.5.11" } } diff --git a/website/pages/development/benchmark.js b/website/pages/development/benchmark.js new file mode 100644 index 0000000..d283984 --- /dev/null +++ b/website/pages/development/benchmark.js @@ -0,0 +1,61 @@ +"use strict"; + +const { Bundler, expand } = require( "../../export.utils" ); + +const template = require( "../../templates/article" ); + +module.exports = Bundler.create( { + + script: __filename, + check: expand( "tools/benchmark" ), + config: { + + entry: expand( "tools/benchmark/browser.stub.js" ), + library: [ "peg", "benchmark" ], + output: expand( "public/js/benchmark-bundle.min.js" ), + + }, + + next() { + + return template( { + title: "Benchmark", + content: ` + + + +
+ + times + + + + + +
+ + + + + + + + + + + +
TestInput SizeAverage Parse TimeAverage Parse Speed
No results available yet.
+ + + + + + `, + } ); + + }, + +} ); diff --git a/website/pages/development/index.js b/website/pages/development/index.js new file mode 100644 index 0000000..e5c5e7c --- /dev/null +++ b/website/pages/development/index.js @@ -0,0 +1,40 @@ +"use strict"; + +const template = require( "../../templates/article" ); + +module.exports = template( { + title: "Development", + content: ` + +

Development

+ + + +

PEG.js is currently maintained by Futago-za Ryuu. + Since it's inception in 2010, PEG.js was + maintained by David Majda (@dmajda), + until May 2017.

+ +

The Bower package is maintained by + Michel Krämer + (@michelkraemer).

+ +

You are welcome to contribute code. Unless your contribution is really + trivial you should get in touch with me first — this can prevent wasted + effort on both sides. You can send code both as a patch or a GitHub pull + request.

+ +

Note that PEG.js is still very much work in progress. There are no + compatibility guarantees until version 1.0.

+ + `, +} ); diff --git a/website/pages/development/test.js b/website/pages/development/test.js new file mode 100644 index 0000000..9c28317 --- /dev/null +++ b/website/pages/development/test.js @@ -0,0 +1,44 @@ +"use strict"; + +const { Bundler, expand } = require( "../../export.utils" ); + +const template = require( "../../templates/article" ); + +module.exports = Bundler.create( { + + script: __filename, + check: expand( "test" ), + config: { + + entry: expand( "test/browser.stub.js" ), + library: [ "peg", "test" ], + output: expand( "public/js/test-bundle.min.js" ), + + }, + + next() { + + return template( { + title: "Test", + content: ` + +
+ + + + + + `, + } ); + + }, + +} ); diff --git a/website/pages/development/try.js b/website/pages/development/try.js new file mode 100644 index 0000000..f33378e --- /dev/null +++ b/website/pages/development/try.js @@ -0,0 +1,29 @@ +"use strict"; + +const { Bundler, fs, expand } = require( "../../export.utils" ); + +const template = require( "../../templates/editor" ); + +module.exports = Bundler.create( { + + script: __filename, + check: expand( "packages" ), + config: { + + entry: require.resolve( "pegjs" ), + library: "peg", + output: expand( "public/js/peg-bundle.min.js" ), + + }, + + async next() { + + return template( { + title: "Try Development Version", + lib: "/js/peg-bundle.min.js", + input: await fs.readFile( expand( "examples/arithmetics.pegjs" ), "utf8" ), + } ); + + }, + +} ); diff --git a/website/views/documentation.ejs b/website/pages/documentation.html similarity index 100% rename from website/views/documentation.ejs rename to website/pages/documentation.html diff --git a/website/pages/documentation.js b/website/pages/documentation.js new file mode 100644 index 0000000..fbbd658 --- /dev/null +++ b/website/pages/documentation.js @@ -0,0 +1,10 @@ +"use strict"; + +const { fs, expand } = require( "../export.utils" ); + +const template = require( "../templates/article" ); + +module.exports = async () => template( { + title: "Documentation", + content: await fs.readFile( expand( "documentation.html", __dirname ), "utf8" ), +} ); diff --git a/website/pages/index.js b/website/pages/index.js new file mode 100644 index 0000000..8e430bd --- /dev/null +++ b/website/pages/index.js @@ -0,0 +1,61 @@ +"use strict"; + +const template = require( "../templates/article" ); + +module.exports = template( { + title: "Home", + content: ` + + + +
+

+ PEG.js is a simple parser generator for JavaScript that produces fast + parsers with excellent error reporting. You can use it to process complex data + or computer languages and build transformers, interpreters, compilers and + other tools easily. +

+ +

Features

+ +
    +
  • Simple and expressive grammar syntax
  • + +
  • Integrates both lexical and syntactical analysis
  • + +
  • Parsers have excellent error reporting out of the box
  • + +
  • + Based on parsing + expression grammar formalism — more powerful than traditional LL(k) + and LR(k) parsers +
  • + +
  • + Usable from your browser, from the command + line, or via JavaScript API +
  • +
+
+ + `, +} ); diff --git a/website/vendor/pegjs/arithmetics.pegjs b/website/pages/online.js similarity index 77% rename from website/vendor/pegjs/arithmetics.pegjs rename to website/pages/online.js index 7d4dea8..c644bed 100644 --- a/website/vendor/pegjs/arithmetics.pegjs +++ b/website/pages/online.js @@ -1,3 +1,9 @@ +"use strict"; + +const template = require( "../templates/editor" ); + +const input = ` + // Simple Arithmetics Grammar // ========================== // @@ -27,4 +33,12 @@ Integer "integer" = _ [0-9]+ { return parseInt(text(), 10); } _ "whitespace" - = [ \t\n\r]* + = [ \\t\\n\\r]* + +`; + +module.exports = () => template( { + title: "Online Version", + lib: "/vendor/pegjs/peg.js", + input: input.trim(), +} ); diff --git a/website/templates/article.js b/website/templates/article.js new file mode 100644 index 0000000..84f7c8e --- /dev/null +++ b/website/templates/article.js @@ -0,0 +1,19 @@ +"use strict"; + +const template = require( "./html" ); + +module.exports = ( { content, ga, layout, title } = {} ) => { + + content = ` + +
+ + ${ content } + +
+ + `; + + return template( { content, ga, layout, title } ); + +}; diff --git a/website/templates/editor.html b/website/templates/editor.html new file mode 100644 index 0000000..a385115 --- /dev/null +++ b/website/templates/editor.html @@ -0,0 +1,86 @@ + + + + + +
+ + + + + + + + + + +
+

+ 1 +
Write your PEG.js grammar
+

+
+
+ +
+
+
Loading...
+
+
+ + + + + + + + + + + + + + + + + + + +
+

+ 2 +
Test the generated parser with some input
+

+
+
+ +
+
+
Parser not available.
+
+

Output

+
Output not available.
+
+

+ 3 +
Download the parser code
+

+
+ +
+ + +
+ + + + +
+
+
+
diff --git a/website/templates/editor.js b/website/templates/editor.js new file mode 100644 index 0000000..2381321 --- /dev/null +++ b/website/templates/editor.js @@ -0,0 +1,40 @@ +"use strict"; + +const { fs, expand } = require( "../export.utils" ); + +const template = require( "./html" ); + +module.exports = async ( { ga, input, lib, layout, title } = {} ) => { + + const EDITOR_VIEW = await fs.readFile( expand( "editor.html", __dirname ), "utf8" ); + + const content = ` + +
Loading...
+ +
+ + ${ EDITOR_VIEW.replace( "$$DEFAULT_INPUT", input ) } + +
+ + + + + + + + + `; + + return template( { + bodyStart: "", + bodyEnd: "", + content, + ga, + head: ``, + layout: layout || "online", + title, + } ); + +}; diff --git a/website/templates/html.js b/website/templates/html.js new file mode 100644 index 0000000..15bee79 --- /dev/null +++ b/website/templates/html.js @@ -0,0 +1,89 @@ +"use strict"; + +const defaultEnd = ` + + +`; + +function menuItem( title, url, text ) { + + const className = title === text ? " class=\"current\"" : ""; + + return `${ text }`; + +} + +module.exports = ( { + bodyStart = "
", + bodyEnd = " " + defaultEnd.trimLeft(), + content = "", + ga = "UA-100728112-1", + head = "", + layout = "default", + title = null, +} = {} ) => ` + + + + + + + + + + + ${ title && title !== "Home" ? title + " » " : "" }PEG.js – Parser Generator for JavaScript + + + + + + ${ head } + + + + ${ bodyStart } + + + + + ${ content.trim() } + + ${ bodyEnd } + + + + + + +`.trim(); diff --git a/website/views/benchmark.ejs b/website/views/benchmark.ejs deleted file mode 100644 index fc56298..0000000 --- a/website/views/benchmark.ejs +++ /dev/null @@ -1,30 +0,0 @@ - - -
- - times - - - - - -
- - - - - - - - - - - -
TestInput SizeAverage Parse TimeAverage Parse Speed
No results available yet.
- - - - diff --git a/website/views/development.ejs b/website/views/development.ejs deleted file mode 100644 index b03b231..0000000 --- a/website/views/development.ejs +++ /dev/null @@ -1,28 +0,0 @@ -

Development

- - - -

PEG.js is currently maintained by Futago-za Ryuu. -Since it's inception in 2010, PEG.js was -maintained by David Majda (@dmajda), -until May 2017.

- -

The Bower package is maintained by -Michel Krämer -(@michelkraemer).

- -

You are welcome to contribute code. Unless your contribution is really -trivial you should get in touch with me first — this can prevent wasted -effort on both sides. You can send code both as a patch or a GitHub pull -request.

- -

Note that PEG.js is still very much work in progress. There are no -compatibility guarantees until version 1.0.

diff --git a/website/views/index.ejs b/website/views/index.ejs deleted file mode 100644 index 945ca32..0000000 --- a/website/views/index.ejs +++ /dev/null @@ -1,39 +0,0 @@ - - -
-

PEG.js is a simple parser generator for JavaScript that produces fast - parsers with excellent error reporting. You can use it to process complex data - or computer languages and build transformers, interpreters, compilers and - other tools easily.

- -

Features

- -
    -
  • Simple and expressive grammar syntax
  • - -
  • Integrates both lexical and syntactical analysis
  • - -
  • Parsers have excellent error reporting out of the box
  • - -
  • Based on parsing - expression grammar formalism — more powerful than traditional - LL(k) and LR(k) parsers
  • - -
  • Usable from your browser, - from the command line, or via JavaScript API
  • -
-
diff --git a/website/views/layout-online.ejs b/website/views/layout-online.ejs deleted file mode 100644 index 520f260..0000000 --- a/website/views/layout-online.ejs +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - <%- title ? title + " » " : "" %>PEG.js – Parser Generator for JavaScript - - - - - - - - - - - -
-
Loading...
-
- -
- <%- body %> -
- - - - diff --git a/website/views/layout.ejs b/website/views/layout.ejs deleted file mode 100644 index f57686e..0000000 --- a/website/views/layout.ejs +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - <%- title ? title + " » " : "" %>PEG.js – Parser Generator for JavaScript - - - - - - - -
- - - - -
- <%- body %> -
- - -
- - - - diff --git a/website/views/online.ejs b/website/views/online.ejs deleted file mode 100644 index f1dcaf1..0000000 --- a/website/views/online.ejs +++ /dev/null @@ -1,95 +0,0 @@ - - - - - -
- - - - - - - - - - -
-

- 1 -
Write your PEG.js grammar
-

-
-
- -
-
-
Loading...
-
-
- - - - - - - - - - - - - - - - - - - -
-

- 2 -
Test the generated parser with some input
-

-
-
- -
-
-
Parser not available.
-
-

Output

-
Output not available.
-
-

- 3 -
Download the parser code
-

-
-
- - -
- - -
- - - - -
-
- -
-
- - - - - - diff --git a/website/views/test.ejs b/website/views/test.ejs deleted file mode 100644 index 7510e42..0000000 --- a/website/views/test.ejs +++ /dev/null @@ -1,16 +0,0 @@ -
- - - - - diff --git a/website/webpack.config.js b/website/webpack.config.js new file mode 100644 index 0000000..72468be --- /dev/null +++ b/website/webpack.config.js @@ -0,0 +1,3 @@ +"use strict"; + +module.exports = require( "./export.utils" ).Bundler.load(); diff --git a/yarn.lock b/yarn.lock index 2a50088..afdcf33 100644 --- a/yarn.lock +++ b/yarn.lock @@ -650,6 +650,13 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@futagoza/child-process@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@futagoza/child-process/-/child-process-1.0.0.tgz#5f5c7308fb238c7b05d359c8ba4e368fdc12d95b" + integrity sha512-im8iWE7eNHM+Bz9awPDdY4gD/1sC+VIpPgo3Fcu9n/oPb9Up1A01jCbKqgknZYvjdlPGTYp6/bDr0R5w8xfH+g== + dependencies: + any-promise "1.3.0" + "@futagoza/eslint-config-core@11.2.0": version "11.2.0" resolved "https://registry.yarnpkg.com/@futagoza/eslint-config-core/-/eslint-config-core-11.2.0.tgz#d34e88b371999011823bd1e8dbb8f0a4a3e883da" @@ -718,6 +725,27 @@ "@futagoza/eslint-config-node" "11.2.0" "@futagoza/eslint-config-typescript" "11.2.0" +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + "@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.6.0.tgz#ec7670432ae9c8eb710400d112c201a362d83393" @@ -747,16 +775,33 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== +"@tache/is-source-newer@1.0.0-beta.5": + version "1.0.0-beta.5" + resolved "https://registry.yarnpkg.com/@tache/is-source-newer/-/is-source-newer-1.0.0-beta.5.tgz#444759691122df730650bf30b673fbb865eb67a2" + integrity sha512-v+dlPkYift8jyxLoyS5KOqczEcCINBmswp8OiXnH1h03CuWsY6nSU3E+yAf5hruqlhac6UYCbvWimu0M5+f9og== + "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== +"@types/fs-extra@^8.0.0": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.0.1.tgz#a2378d6e7e8afea1564e44aafa2e207dadf77686" + integrity sha512-J00cVDALmi/hJOYsunyT52Hva5TnJeKP5yd1r+mH/ZU0mbYZflR0Z5kw5kITtKTRYMhm1JMClOFYdHnQszEvqw== + dependencies: + "@types/node" "*" + "@types/json-schema@^7.0.3": version "7.0.3" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== +"@types/node@*": + version "12.12.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.7.tgz#01e4ea724d9e3bd50d90c11fd5980ba317d8fa11" + integrity sha512-E6Zn0rffhgd130zbCbAr/JdXfXkoOUFAKNs/rF8qnafSJ8KYaA/j3oz7dcwal+lYjLA7xvdd5J4wdYpCTlP8+w== + "@types/node@8": version "8.10.59" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.59.tgz#9e34261f30183f9777017a13d185dfac6b899e04" @@ -1046,6 +1091,11 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +any-promise@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -1220,7 +1270,7 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== -bluebird@^3.5.5: +bluebird@3.7.1, bluebird@^3.5.5: version "3.7.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== @@ -2232,6 +2282,17 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-glob@^3.0.4: + version "3.1.0" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.0.tgz#77375a7e3e6f6fc9b18f061cddd28b8d1eec75ae" + integrity sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -2242,6 +2303,13 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastq@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" + integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + dependencies: + reusify "^1.0.0" + figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -2351,6 +2419,24 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +fs-extra-plus@0.5.11: + version "0.5.11" + resolved "https://registry.yarnpkg.com/fs-extra-plus/-/fs-extra-plus-0.5.11.tgz#32e998d5ac1501937a0d4201cac5f79e2b73de56" + integrity sha512-IpAkV1hAUvQH+QIGFi04yIWGANudCipWZ17yeqZcN8TSNCI+REJakTQTvbchhH1xBM1FkhKU6qpjZ3owbvbUXA== + dependencies: + "@types/fs-extra" "^8.0.0" + fast-glob "^3.0.4" + fs-extra "^8.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" @@ -2428,7 +2514,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0: +glob-parent@^5.0.0, glob-parent@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== @@ -2471,7 +2557,7 @@ globals@^11.1.0, globals@^11.7.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== @@ -3041,6 +3127,13 @@ json5@^2.1.0: dependencies: minimist "^1.2.0" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + just-extend@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" @@ -3216,6 +3309,11 @@ merge-source-map@^1.1.0: dependencies: source-map "^0.6.1" +merge2@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -3235,7 +3333,7 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.0: +micromatch@^4.0.0, micromatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== @@ -4203,6 +4301,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +reusify@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -4239,6 +4342,11 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -4926,6 +5034,11 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"