beyond
Version:
The Full Stack Universal Typescript Framework
124 lines (98 loc) • 3.18 kB
JavaScript
const DynamicProcessor = global.utils.DynamicProcessor();
const mformat = require('beyond/mformat');
const { equal } = global.utils;
module.exports = class extends DynamicProcessor {
get dp() {
return 'project.config';
}
#project;
#distribution;
#local;
#errors = [];
get errors() {
return this.#errors;
}
get valid() {
return !this.errors.length;
}
#code;
get code() {
return this.#code;
}
#declaration;
get declaration() {
return this.#declaration;
}
constructor(project, distribution, local) {
super();
this.#project = project;
this.#distribution = distribution;
this.#local = local;
super.setup(
new Map([
['project', { child: project }],
['hosts', { child: new (require('./hosts'))(project, distribution, local) }],
])
);
}
#previous;
_preapred(require) {
require(this.#project.template.global);
}
_process() {
const project = this.children.get('project').child;
const hosts = this.children.get('hosts').child;
if (!project.processed || !hosts.processed) {
throw new Error('Project is not ready. Wait for the .ready property before calling this property.');
}
this.#errors = [];
this.#code = undefined;
if (!project.valid) {
this.#errors = project.errors.slice();
return;
}
const config = {
package: project.package,
version: project.version,
languages: project.languages,
routing: project.routing,
environment: this.#distribution.environment,
};
this.#project.template.global.valid && (config['global.css'] = true);
this.#local && (config.local = this.#distribution.name);
// Routing configuration
(() => {
config.routing.mode === 'pathname' && delete config.routing.mode;
config.routing.ssr === false && delete config.routing.ssr;
!Object.entries(config.routing).length && delete config.routing;
})();
// Layout configuration
(() => {
const distribution = this.#distribution;
const { platform } = distribution;
platforms.webAndMobileAndSSR.includes(platform) && (config.layout = project.layout);
})();
config.params = (() => {
const distribution = this.#distribution;
const { environment } = distribution;
const { environments } = global.utils;
const { platform } = distribution;
let params = typeof project.params === 'object' ? project.params : {};
params = Object.assign({}, params, params[environment]);
environments.forEach(environment => delete params[environment]);
params = Object.assign(params, params[platform]);
platforms.all.forEach(platform => delete params[platform]);
return params;
})();
hosts.ssr && (config.ssr = hosts.ssr);
hosts.backend && (config.backend = hosts.backend);
// Check if project configuration has changed
if (equal((this.#previous = config))) return false;
this.#previous = config;
let code = `export default ${JSON.stringify(config)};\n`;
const { mode } = this.#distribution.bundles;
({ code } = mformat({ code, mode }));
this.#code = code;
this.#declaration = require('./declaration');
}
};