This repository has been archived on 2023-11-14. You can view files and clone it, but cannot push or open issues/pull-requests.
vogue/Module.js

89 lines
1.8 KiB
JavaScript
Raw Normal View History

2021-05-02 17:42:04 -04:00
export default class Module {
links = {
required: {
single: [],
arrays: []
},
optional: {
single: [],
arrays: []
}
};
globals = [];
functions = [];
identifiers = {};
name = {
space: '',
last: '',
full: ''
2021-05-06 23:05:36 -04:00
};
imports = {};
variables = {
cold: [],
warm: []
}
2021-05-10 23:13:17 -04:00
async link() {
}
static async create(location) {
const module = new Module();
const ast = createAst(location);
const name = parse(location).name;
module.name.last = name;
module.name.full = name;
log.ast('='.repeat(80));
log.ast(location);
log.ast(ast);
try {
// move module whole loop ass bitch into module.
for (const item of ast) {
if ('name' in item && item.name in module.identifiers)
throw new Error('Identifier ' + item.name + ' already declared!');
module.identifiers[item.name] = item.type;
if(item.type in module) {
await module[item.type](item);
}
if (item.type === 'link') {
module.links
[item.required ? 'required' : 'optional']
[item.array ? 'arrays' : 'single']
.push(item.name);
} else if (item.type === 'namespace') {
module.name.space = item.namespace;
module.name.full = module.name.space + '.' + module.name.last;
} else if (item.type === 'restore') {
module.functions.restore = item.block;
} else if (item.type === 'function') {
module.functions[item.name] = item.block;
} else if (item.type === 'import') {
const imported = await import(item.importName);
if('default' in imported) module.imports[item.name] = imported.default;
else module.imports[item.name] = imported;
} else if (item.type === 'variable') {
module.variables[item.persist ? 'cold' : 'warm'].push(item.name);
}
}
} catch (e) {
console.error(e);
}
}
}