diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..529b756 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,6 @@ +[*] +indent_style = tab +indent_size = 2 + +[*.ne] +indent_style = spaces \ No newline at end of file diff --git a/Instance.js b/Instance.js index 631e908..b2e48e1 100644 --- a/Instance.js +++ b/Instance.js @@ -6,16 +6,20 @@ export default class Instance extends Serializable { module = null; links = {} system = null; + context = null; // reconstruct context when we need it... - get context() { + createContext() { const ctx = {}; for(const name in this.links) { ctx[name] = this.links[name]; } + for(const name in this.module.imports) { + ctx[name] = this.module.imports[name]; + } // ctx.Instance = Instance; ctx.create = this.system.newInstance.bind(this.system); - return ctx; + this.context = ctx; }; constructor(module, location, parameters, system) { @@ -24,12 +28,27 @@ export default class Instance extends Serializable { this.location = location; this.system = system; for(const name of this.module.links.optional.arrays) this.links[name] = []; + this.createContext(); + + this._link = new Proxy(this, { + get(target, prop, receiver) { + if(prop === 'restore') return undefined; + if(prop in target.module.functions) { + return target.invokeInternal.bind(target, prop); + } + return undefined; + } + }); } invokeInternal(name, ...args) { const content = this.module.functions[name]; evalInContext(content, this.context); } + + get link () { + return this._link; + } } function evalInContext(js, context) { diff --git a/Module.js b/Module.js index a83903a..c387309 100644 --- a/Module.js +++ b/Module.js @@ -18,5 +18,6 @@ export default class Module { space: '', last: '', full: '' - } + }; + imports = {} } \ No newline at end of file diff --git a/System.js b/System.js index 099e5a6..90a3942 100644 --- a/System.js +++ b/System.js @@ -14,7 +14,7 @@ export default class System extends Serializable { try { mkdirSync(location); } catch {} - this.newInstance('xyz.places.world'); + this.newInstance('xyz.places.main'); } getModule(name) { @@ -25,17 +25,9 @@ export default class System extends Serializable { return new Instance(this.getModule(name), null, args, this); } - linkInstance(instance) { - return new Proxy(instance, { - get(target, prop, receiver) { - return target[prop]; - } - }); - } - newInstance(name, args = {}) { const instance = this.createInstance(name, args); - const link = this.linkInstance(instance); + const link = instance.link; instance.invokeInternal('restore'); return link; } diff --git a/grammar.ne b/grammar.ne index 3e5d36d..1102001 100644 --- a/grammar.ne +++ b/grammar.ne @@ -1,17 +1,31 @@ @lexer lexer PROGRAM -> _ STATEMENT:+ _ {% ([,stuff,]) => { return stuff } %} -STATEMENT -> _ LINK_DECLARATION _ %SEMICOLON:? {% ([,stuff]) => { return stuff } %} - | _ %RESTORE _ JS_BLOCK _ %SEMICOLON:? {% ([,,,block]) => { return { type: 'restore', block: block } } %} - | _ IDENTIFIER _ JS_BLOCK _ %SEMICOLON:? {% ([,name,,block]) => { return { type: 'function', name: name, block: block } } %} - | _ %NAMESPACE __ NAMESPACE _ %SEMICOLON:? {% ([,,,namespace]) => { return { type: 'namespace', namespace: namespace[0] } } %} -LINK_DECLARATION -> _ %LINK __ IDENTIFIER {% ([,,,id]) => {return{ type: 'link', array: false, required: false, name: id }} %} - | _ %LINK _ %ARRAY __ IDENTIFIER {% ([,,,,,id]) => {return{ type: 'link', array: true, required: false, name: id }} %} - | _ %REQUIRED __ %LINK __ IDENTIFIER {% ([,,,,,id]) => {return{ type: 'link', array: false, required: true, name: id }} %} - | _ %REQUIRED __ %LINK _ %ARRAY __ IDENTIFIER {% ([,,,,,,,id]) => {return{ type: 'link', array: true, required: true, name: id }} %} + +STATEMENT -> _ LINK_DECLARATION _ SEMICOLON {% ([,stuff]) => { return stuff } %} + | _ %RESTORE _ JS_BLOCK _ SEMICOLON {% ([,,,block]) => { return { type: 'restore', block: block } } %} + | _ IDENTIFIER _ JS_BLOCK _ SEMICOLON {% ([,name,,block]) => { return { type: 'function', name: name, block: block } } %} + | _ %NAMESPACE __ NAMESPACE _ SEMICOLON {% ([,,,namespace]) => { return { type: 'namespace', namespace: namespace[0] } } %} + | _ DIRECTIVE _ SEMICOLON {% ([,directive]) => { return { type: 'directive', value: directive }} %} + | _ %IMPORT __ STRING __ %AS __ IDENTIFIER _ SEMICOLON {% ([,,,moduleName,,,,identifier]) => { return { type: 'import', name: identifier, importName: moduleName }} %} + +DIRECTIVE -> _ %SINGLETON {% () => 'singleton' %} + | _ %KEEPALIVE {% () => 'keepalive' %} + +LINK_DECLARATION -> _ %LINK __ IDENTIFIER {% ([,,,id]) => { return { type: 'link', array: false, required: false, name: id }} %} + | _ %LINK _ %ARRAY __ IDENTIFIER {% ([,,,,,id]) => { return { type: 'link', array: true, required: false, name: id }} %} + | _ %REQUIRED __ %LINK __ IDENTIFIER {% ([,,,,,id]) => { return { type: 'link', array: false, required: true, name: id }} %} + | _ %REQUIRED __ %LINK _ %ARRAY __ IDENTIFIER {% ([,,,,,,,id]) => { return { type: 'link', array: true, required: true, name: id }} %} + NAMESPACE -> IDENTIFIER - | IDENTIFIER %DOTOP NAMESPACE {% ([a,,b]) => { return [`${a}.${b}`] } %} + | IDENTIFIER %DOTOP NAMESPACE {% ([a,,b]) => { return [`${a}.${b}`] } %} + +EOL -> SEMICOLON + | "\n" +STRING -> %STRING {% ([d]) => d.value.substring(1, d.value.length - 1) %} +SEMICOLON -> %SEMICOLON:? IDENTIFIER -> %IDENTIFIER {% ([id]) => id.value %} JS_BLOCK -> %JS_BLOCK {% ([block]) => minify(block.value.substring(2, block.value.length - 2)) %} + | %JS_BLOCK2 {% ([block]) => minify(block.value.substring(2, block.value.length - 2)) %} _ -> null | %SPACE {% () => undefined %} __ -> %SPACE {% () => undefined %} \ No newline at end of file diff --git a/package.json b/package.json index 8dfae3f..cefb1d4 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "lang", + "name": "vogue", "version": "1.0.0", "main": "index.js", "license": "MIT", @@ -9,13 +9,14 @@ }, "scripts": { "c": "nearleyc", - "test": "vogue test" + "test": "node run.js test" }, "dependencies": { "lodash": "^4.17.21", "moo": "^0.5.1", "nearley": "^2.20.1", "nedb": "^1.8.0", + "terminal-kit": "^2.1.0", "uglify-js": "^3.13.5" } } diff --git a/run.js b/run.js index 53919ec..7043ce4 100755 --- a/run.js +++ b/run.js @@ -1,17 +1,18 @@ #!/usr/bin/env node import { resolve, parse } from 'path'; -import { readFileSync, readdirSync, readFile, fstat, mkdirSync } from 'fs'; +import { readFileSync, readdirSync } from 'fs'; import nearley from 'nearley'; import compile from 'nearley/lib/compile.js'; import generate from 'nearley/lib/generate.js'; import nearleyGrammar from 'nearley/lib/nearley-language-bootstrapped.js'; import moo from 'moo'; const grammarFile = 'grammar.ne'; -// import Serializable from './Serializable.js'; +import _ from 'lodash'; +const { get, set } = _; import Module from './Module.js'; import System from './System.js'; -// import Instance from './Instance.js'; +const debug = true; // globals inside grammar context import minify from './minify.js'; @@ -23,81 +24,87 @@ Object.defineProperty(Array.prototype, 'empty', { }); function createParser() { - // Parse the grammar source into an AST - const grammarParser = new nearley.Parser(nearleyGrammar); - grammarParser.feed(readFileSync(grammarFile).toString()); - const grammarAst = grammarParser.results[0]; // TODO check for errors + // Parse the grammar source into an AST + const grammarParser = new nearley.Parser(nearleyGrammar); + grammarParser.feed(readFileSync(grammarFile).toString()); + const grammarAst = grammarParser.results[0]; // TODO check for errors - // Compile the AST into a set of rules - const grammarInfoObject = compile(grammarAst, {}); - // Generate JavaScript code from the rules - const grammarJs = generate(grammarInfoObject, "grammar"); + // Compile the AST into a set of rules + const grammarInfoObject = compile(grammarAst, {}); + // Generate JavaScript code from the rules + const grammarJs = generate(grammarInfoObject, "grammar"); - const lexer = moo.compile({ - LINK: 'link', - RESTORE: 'restore', - NAMESPACE: 'namespace', - REQUIRED: 'required', - ARRAY: '[]', - OBJECT: '{}', - DOTOP: '.', - JS_BLOCK: /\[\[[^]*?\n\]\]$/, - IDENTIFIER: /[a-zA-Z][a-zA-Z0-9]*/, - SPACE: {match: /\s+/, lineBreaks: true}, - SEMICOLON: ';' - }); + const lexer = moo.compile({ + LINK: 'link', + RESTORE: 'restore', + NAMESPACE: 'namespace', + REQUIRED: 'required', + SINGLETON: 'singleton', + KEEPALIVE: 'keepalive', + IMPORT: 'import', + AS: 'as', + STRING: /'(?:\\['\\]|[^\n'\\])*'/, + ARRAY: '[]', + OBJECT: '{}', + DOTOP: '.', + JS_BLOCK: /\[\[[^]*?\n\]\]$/, + JS_BLOCK2: /{[^]*?\n}$/, + IDENTIFIER: /[a-zA-Z][a-zA-Z0-9]*/, + SPACE: { match: /\s+/, lineBreaks: true }, + SEMICOLON: ';' + }); + // lexer.__proto__.formatError = function(token, message) { + // if (token == null) { + // // An undefined token indicates EOF + // var text = this.buffer.slice(this.index) + // var token = { + // text: text, + // offset: this.index, + // lineBreaks: text.indexOf('\n') === -1 ? 0 : 1, + // line: this.line, + // col: this.col, + // } + // } + // var start = Math.max(0, token.offset - token.col + 1) + // var eol = token.lineBreaks ? token.text.indexOf('\n') : token.text.length + // var firstLine = this.buffer.substring(start, token.offset + eol) + // message += " at line " + token.line + " col " + token.col + ":\n\n" + // message += " " + firstLine + "\n" + // message += " " + Array(token.col).join(" ") + "^" + // return message + // } - // lexer.__proto__.formatError = function(token, message) { - // if (token == null) { - // // An undefined token indicates EOF - // var text = this.buffer.slice(this.index) - // var token = { - // text: text, - // offset: this.index, - // lineBreaks: text.indexOf('\n') === -1 ? 0 : 1, - // line: this.line, - // col: this.col, - // } - // } - // var start = Math.max(0, token.offset - token.col + 1) - // var eol = token.lineBreaks ? token.text.indexOf('\n') : token.text.length - // var firstLine = this.buffer.substring(start, token.offset + eol) - // message += " at line " + token.line + " col " + token.col + ":\n\n" - // message += " " + firstLine + "\n" - // message += " " + Array(token.col).join(" ") + "^" - // return message - // } + // Pretend this is a CommonJS environment to catch exports from the grammar. + const module = { exports: {} }; + eval(grammarJs); - // Pretend this is a CommonJS environment to catch exports from the grammar. - const module = { exports: {} }; - eval(grammarJs); - - const grammar = module.exports; - return new nearley.Parser(nearley.Grammar.fromCompiled(grammar)) + const grammar = module.exports; + return new nearley.Parser(nearley.Grammar.fromCompiled(grammar)) } -import _ from 'lodash'; -const {get, set} = _; - const systemLocation = resolve(process.argv[2]); const entry = process.argv[3]; const modules = {}; -readdirSync(systemLocation).map(v => resolve(systemLocation, v)).map(parseModule); -const sys = new System(modules); -function parseModule(location) { +(async () => { + // TODO simplify this line gaddam + await Promise.all(readdirSync(systemLocation).map(v => resolve(systemLocation, v)).map(parseModule)); + const sys = new System(modules); +})() + +async function parseModule(location) { const parser = createParser(); const contents = readFileSync(location).toString(); const name = parse(location).name; // parser.reportError = function(token) { // return JSON.stringify(token, null, 2); - // var message = this.lexer.formatError(token, 'invalid syntax') + '\n'; - // message += 'Unexpected ' + (token.type ? token.type + ' token: ' : ''); - // message += - // JSON.stringify(token.value !== undefined ? token.value : token) + '\n'; - // return message; - // }; + // var message = this.lexer.formatError(token, 'invalid syntax') + '\n'; + // message += 'Unexpected ' + (token.type ? token.type + ' token: ' : ''); + // message += + // JSON.stringify(token.value !== undefined ? token.value : token) + '\n'; + // return message; + // }; try { parser.feed(contents); } catch (e) { @@ -110,37 +117,57 @@ function parseModule(location) { module.name.last = name; module.name.full = name; - for(const item of parsed) { - switch(item.type) { - case 'link': { - if(item.name in module.identifiers) - throw new Error('Identifier ' + item.name + ' already declared!'); - module.identifiers[item.name] = 'link'; - module.links - [item.required ? 'required' : 'optional'] - [item.array ? 'arrays' : 'single'] - .push(item.name); - break; + try { + + for (const item of parsed) { + switch (item.type) { + case 'link': { + if (item.name in module.identifiers) + throw new Error('Identifier ' + item.name + ' already declared!'); + module.identifiers[item.name] = 'link'; + module.links + [item.required ? 'required' : 'optional'] + [item.array ? 'arrays' : 'single'] + .push(item.name); + break; + } + case 'namespace': { + module.name.space = item.namespace; + module.name.full = module.name.space + '.' + module.name.last; + break; + } + case 'restore': { + if (item.name in module.identifiers) + throw new Error('Identifier ' + item.name + ' already declared!'); + module.identifiers['restore'] = 'function'; + module.functions['restore'] = item.block; + break; + } + case 'function': { + if (item.name in module.identifiers) + throw new Error('Identifier ' + item.name + ' already declared!'); + module.identifiers[item.name] = 'function'; + module.functions[item.name] = item.block; + break; + } + case 'import': { + if (item.name in module.identifiers) + throw new Error('Identifier ' + item.name + ' already declared!'); + const imported = await import(item.importName); + if('default' in imported) { + module.imports[item.name] = imported.default; + } else { + module.imports[item.name] = imported; + } + module.identifiers[item.name] = 'import'; + break; + } } - case 'namespace': { - module.name.space = item.namespace; - module.name.full = module.name.space + '.' + module.name.last; - break; - } - case 'restore': { - if(item.name in module.identifiers) - throw new Error('Identifier ' + item.name + ' already declared!'); - module.identifiers['restore'] = 'function'; - module.functions['restore'] = item.block; - break; - } - case 'function': { - if(item.name in module.identifiers) - throw new Error('Identifier ' + item.name + ' already declared!'); - module.identifiers[item.name] = 'function'; - module.functions[item.name] = item.block; - } //WE JUST ADDED THE FUNCION TO THE MODULE TEMPLATE. - // TODO ADD IT TO THE INSTANCE LEVEL, THEN CONTEXT, THEN LiNK PROXY. + } + } catch (e) { + console.error(e); + if (debug) { + console.log(JSON.stringify(parsed, null, 2)); } } diff --git a/test/forest.v b/test/forest.v index 5a06901..a3add75 100644 --- a/test/forest.v +++ b/test/forest.v @@ -3,6 +3,6 @@ namespace xyz.places.places; required link world; link[] roads; -ping [[ - -]] \ No newline at end of file +ping { + console.log('Ping!', new Date().getTime()); +} \ No newline at end of file diff --git a/test/main.v b/test/main.v new file mode 100644 index 0000000..ceb7907 --- /dev/null +++ b/test/main.v @@ -0,0 +1,8 @@ +namespace xyz.places; +singleton; + +import 'terminal-kit' as terminalkit; + +restore { + terminalkit.terminal.cyan('~Welcome to Vogue~\n'); +} \ No newline at end of file diff --git a/test/world.v b/test/world.v index 0b9b3ea..800cf65 100644 --- a/test/world.v +++ b/test/world.v @@ -4,7 +4,7 @@ link[] places; link place; link character; -restore [[ +restore { if(places.empty) { for(let i = 0; i < 3; i ++) { const place = create('xyz.places.places.forest', { @@ -17,4 +17,4 @@ restore [[ for(const place of places) { place.ping(); } -]] \ No newline at end of file +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index b4dbb59..5deb942 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,114 +2,238 @@ # yarn lockfile v1 -async@0.2.10: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= - -binary-search-tree@0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/binary-search-tree/-/binary-search-tree-0.2.5.tgz#7dbb3b210fdca082450dad2334c304af39bdc784" - integrity sha1-fbs7IQ/coIJFDa0jNMMErzm9x4Q= +"@cronvel/get-pixels@^3.4.0": + "resolved" "https://registry.npmjs.org/@cronvel/get-pixels/-/get-pixels-3.4.0.tgz" + "version" "3.4.0" dependencies: - underscore "~1.4.4" + "jpeg-js" "^0.4.1" + "ndarray" "^1.0.19" + "ndarray-pack" "^1.1.1" + "node-bitmap" "0.0.1" + "omggif" "^1.0.10" + "pngjs" "^5.0.0" -commander@^2.19.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +"async@0.2.10": + "resolved" "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + "version" "0.2.10" -discontinuous-range@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" - integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo= - -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= - -lie@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" - integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4= +"binary-search-tree@0.2.5": + "resolved" "https://registry.npmjs.org/binary-search-tree/-/binary-search-tree-0.2.5.tgz" + "version" "0.2.5" dependencies: - immediate "~3.0.5" + "underscore" "~1.4.4" -localforage@^1.3.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.9.0.tgz#f3e4d32a8300b362b4634cc4e066d9d00d2f09d1" - integrity sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g== +"chroma-js@^2.1.0": + "resolved" "https://registry.npmjs.org/chroma-js/-/chroma-js-2.1.1.tgz" + "version" "2.1.1" dependencies: - lie "3.1.1" + "cross-env" "^6.0.3" -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +"commander@^2.19.0": + "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + "version" "2.20.3" -minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== +"cross-env@^6.0.3": + "resolved" "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz" + "version" "6.0.3" dependencies: - minimist "^1.2.5" + "cross-spawn" "^7.0.0" -moo@^0.5.0, moo@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" - integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w== - -nearley@^2.20.1: - version "2.20.1" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474" - integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ== +"cross-spawn@^7.0.0": + "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + "version" "7.0.3" dependencies: - commander "^2.19.0" - moo "^0.5.0" - railroad-diagrams "^1.0.0" - randexp "0.4.6" + "path-key" "^3.1.0" + "shebang-command" "^2.0.0" + "which" "^2.0.1" -nedb@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/nedb/-/nedb-1.8.0.tgz#0e3502cd82c004d5355a43c9e55577bd7bd91d88" - integrity sha1-DjUCzYLABNU1WkPJ5VV3vXvZHYg= +"cwise-compiler@^1.1.2": + "resolved" "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz" + "version" "1.1.3" dependencies: - async "0.2.10" - binary-search-tree "0.2.5" - localforage "^1.3.0" - mkdirp "~0.5.1" - underscore "~1.4.4" + "uniq" "^1.0.0" -railroad-diagrams@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" - integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234= +"discontinuous-range@1.0.0": + "resolved" "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz" + "version" "1.0.0" -randexp@0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" - integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== +"immediate@~3.0.5": + "resolved" "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" + "version" "3.0.6" + +"iota-array@^1.0.0": + "resolved" "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz" + "version" "1.0.0" + +"is-buffer@^1.0.2": + "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "version" "1.1.6" + +"isexe@^2.0.0": + "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + "version" "2.0.0" + +"jpeg-js@^0.4.1": + "resolved" "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.3.tgz" + "version" "0.4.3" + +"lazyness@^1.2.0": + "resolved" "https://registry.npmjs.org/lazyness/-/lazyness-1.2.0.tgz" + "version" "1.2.0" + +"lie@3.1.1": + "resolved" "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz" + "version" "3.1.1" dependencies: - discontinuous-range "1.0.0" - ret "~0.1.10" + "immediate" "~3.0.5" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +"localforage@^1.3.0": + "resolved" "https://registry.npmjs.org/localforage/-/localforage-1.9.0.tgz" + "version" "1.9.0" + dependencies: + "lie" "3.1.1" -uglify-js@^3.13.5: - version "3.13.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.5.tgz#5d71d6dbba64cf441f32929b1efce7365bb4f113" - integrity sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw== +"lodash@^4.17.21": + "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + "version" "4.17.21" -underscore@~1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" - integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ= +"minimist@^1.2.5": + "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" + "version" "1.2.5" + +"mkdirp@~0.5.1": + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" + "version" "0.5.5" + dependencies: + "minimist" "^1.2.5" + +"moo@^0.5.0", "moo@^0.5.1": + "resolved" "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz" + "version" "0.5.1" + +"ndarray-pack@^1.1.1": + "resolved" "https://registry.npmjs.org/ndarray-pack/-/ndarray-pack-1.2.1.tgz" + "version" "1.2.1" + dependencies: + "cwise-compiler" "^1.1.2" + "ndarray" "^1.0.13" + +"ndarray@^1.0.13", "ndarray@^1.0.19": + "resolved" "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz" + "version" "1.0.19" + dependencies: + "iota-array" "^1.0.0" + "is-buffer" "^1.0.2" + +"nearley@^2.20.1": + "resolved" "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz" + "version" "2.20.1" + dependencies: + "commander" "^2.19.0" + "moo" "^0.5.0" + "railroad-diagrams" "^1.0.0" + "randexp" "0.4.6" + +"nedb@^1.8.0": + "resolved" "https://registry.npmjs.org/nedb/-/nedb-1.8.0.tgz" + "version" "1.8.0" + dependencies: + "async" "0.2.10" + "binary-search-tree" "0.2.5" + "localforage" "^1.3.0" + "mkdirp" "~0.5.1" + "underscore" "~1.4.4" + +"nextgen-events@^1.3.4": + "resolved" "https://registry.npmjs.org/nextgen-events/-/nextgen-events-1.3.4.tgz" + "version" "1.3.4" + +"node-bitmap@0.0.1": + "resolved" "https://registry.npmjs.org/node-bitmap/-/node-bitmap-0.0.1.tgz" + "version" "0.0.1" + +"omggif@^1.0.10": + "resolved" "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz" + "version" "1.0.10" + +"path-key@^3.1.0": + "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + "version" "3.1.1" + +"pngjs@^5.0.0": + "resolved" "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz" + "version" "5.0.0" + +"railroad-diagrams@^1.0.0": + "resolved" "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz" + "version" "1.0.0" + +"randexp@0.4.6": + "resolved" "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz" + "version" "0.4.6" + dependencies: + "discontinuous-range" "1.0.0" + "ret" "~0.1.10" + +"ret@~0.1.10": + "resolved" "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" + "version" "0.1.15" + +"setimmediate@^1.0.5": + "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + "version" "1.0.5" + +"seventh@^0.7.40": + "resolved" "https://registry.npmjs.org/seventh/-/seventh-0.7.40.tgz" + "version" "0.7.40" + dependencies: + "setimmediate" "^1.0.5" + +"shebang-command@^2.0.0": + "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "shebang-regex" "^3.0.0" + +"shebang-regex@^3.0.0": + "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + "version" "3.0.0" + +"string-kit@^0.12.0": + "resolved" "https://registry.npmjs.org/string-kit/-/string-kit-0.12.5.tgz" + "version" "0.12.5" + +"terminal-kit@^2.1.0": + "resolved" "https://registry.npmjs.org/terminal-kit/-/terminal-kit-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "@cronvel/get-pixels" "^3.4.0" + "chroma-js" "^2.1.0" + "lazyness" "^1.2.0" + "ndarray" "^1.0.19" + "nextgen-events" "^1.3.4" + "seventh" "^0.7.40" + "string-kit" "^0.12.0" + "tree-kit" "^0.7.0" + +"tree-kit@^0.7.0": + "resolved" "https://registry.npmjs.org/tree-kit/-/tree-kit-0.7.0.tgz" + "version" "0.7.0" + +"uglify-js@^3.13.5": + "resolved" "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz" + "version" "3.13.5" + +"underscore@~1.4.4": + "resolved" "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz" + "version" "1.4.4" + +"uniq@^1.0.0": + "resolved" "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" + "version" "1.0.1" + +"which@^2.0.1": + "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "isexe" "^2.0.0"