beyond
Version:
The Full Stack Universal Typescript Framework
91 lines (75 loc) • 3.52 kB
JavaScript
const p = require('path');
const {utils: {fs}, platforms: {webAndMobile}} = global;
module.exports = async function (builder, module, {npm, platform, bundles}, paths) {
if (!!npm || !webAndMobile.includes(platform)) {
return module.externals;
}
builder.emit('message', 'Copying external resources');
const {application} = builder;
const uiSpecs = {
cwd: application.path, // The working directory
temp: p.join(application.path, '.beyond/uimport/temp'),
cache: p.join(process.cwd(), '.beyond/uimport'),
versions: true
};
const processed = new Set();
const generate = async items => {
const packages = new Map();
let arr = [];
for (const item of items) {
const identifier = typeof item === 'object' ? `${item.id}.js` : item;
if (processed.has(identifier)) continue;
const {code, errors, pkg, version, subpath, dependencies, css} =
await require('uimport')(identifier, bundles.mode, uiSpecs);
if (errors) {
builder.emit('error', ` . Errors found on external "${identifier}": ${errors}`);
continue;
}
const name = `${pkg.name}@${version}` + (subpath && subpath !== '.' ? `/${subpath.slice(2)}.js` : '.js');
arr = arr.concat(dependencies, [name]);
packages.set(name, code);
if (css) {
const bundle = identifier.replace('.js', '.css');
const {code} = await require('uimport')(bundle, bundles.mode, uiSpecs);
const name = `${pkg.name}@${version}` + (subpath ? `/${subpath.slice(2)}.css` : '.css');
packages.set(name, code);
}
}
const promises = [];
packages.forEach((code, id) => {
builder.emit('message', ` . Building resource "${id}"`);
const path = p.join(paths.www, 'packages', id);
promises.push(fs.save(path, code));
processed.add(id);
});
await Promise.all(promises);
const uImport = [...new Set(arr)];
[...uImport.values()].length && await generate([...uImport.values()]);
}
const {all, client} = module.externals;
// Hack - Default dependencies of the index.html are added manually
all.forEach(item => {
if (item.startsWith('@beyond-js/kernel')) {
all.add('@beyond-js/kernel/transversals');
client.add('@beyond-js/kernel/transversals');
}
if (item.startsWith('@beyond-js/widgets')) {
const items = [
'@beyond-js/widgets/render', '@beyond-js/widgets/application', '@beyond-js/widgets/routing', '@beyond-js/widgets/layout'
];
items.forEach(item => {
all.add(item);
client.add(item);
});
}
});
// Hack to validate socket.io-client dependency and add it to build as external package
let packageJson = await fs.readFile(p.join(application.path, 'package.json'), 'utf8');
packageJson = JSON.parse(packageJson);
Object.keys(packageJson.dependencies).includes('socket.io-client') && all.add('socket.io-client');
const deps = [];
all.forEach(i => deps.push(`${i}.js`));
await generate(deps);
await require('./static')(processed, application, paths);
return {all: processed, client};
}