imports working?!

sdl
Marcus 2021-05-06 23:05:36 -04:00
parent bac6e4cfb8
commit 2a0ffec1f6
11 changed files with 405 additions and 213 deletions

6
.editorconfig 100644
View File

@ -0,0 +1,6 @@
[*]
indent_style = tab
indent_size = 2
[*.ne]
indent_style = spaces

View File

@ -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) {

View File

@ -18,5 +18,6 @@ export default class Module {
space: '',
last: '',
full: ''
}
};
imports = {}
}

View File

@ -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;
}

View File

@ -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] } } %}
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}`] } %}
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 %}

View File

@ -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"
}
}

51
run.js
View File

@ -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';
@ -38,16 +39,21 @@ function createParser() {
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
@ -77,16 +83,17 @@ function createParser() {
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;
@ -110,6 +117,8 @@ function parseModule(location) {
module.name.last = name;
module.name.full = name;
try {
for (const item of parsed) {
switch (item.type) {
case 'link': {
@ -139,8 +148,26 @@ function parseModule(location) {
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.
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;
}
}
}
} catch (e) {
console.error(e);
if (debug) {
console.log(JSON.stringify(parsed, null, 2));
}
}

View File

@ -3,6 +3,6 @@ namespace xyz.places.places;
required link world;
link[] roads;
ping [[
]]
ping {
console.log('Ping!', new Date().getTime());
}

8
test/main.v 100644
View File

@ -0,0 +1,8 @@
namespace xyz.places;
singleton;
import 'terminal-kit' as terminalkit;
restore {
terminalkit.terminal.cyan('~Welcome to Vogue~\n');
}

View File

@ -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();
}
]]
}

308
yarn.lock
View File

@ -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"