84 lines
2.5 KiB
JavaScript
84 lines
2.5 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Assembles build/app and build/service from the sources in this repository.
|
|
*
|
|
* There is no bundler and there are no runtime dependencies: the frontend talks
|
|
* to the Luna bus through PalmServiceBridge and the service uses the
|
|
* webos-service module provided by the TV itself. The only thing this script
|
|
* does is copy files and substitute the __APP_ID__ / __SERVICE_ID__ /
|
|
* __VERSION__ / __TITLE__ placeholders, so that the application id lives in
|
|
* exactly one place (the "name" field of package.json).
|
|
*/
|
|
'use strict';
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const root = path.resolve(__dirname, '..');
|
|
const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));
|
|
|
|
const vars = {
|
|
__APP_ID__: pkg.name,
|
|
__SERVICE_ID__: `${pkg.name}.service`,
|
|
__VERSION__: pkg.version,
|
|
__TITLE__: pkg.title,
|
|
};
|
|
|
|
const TEXT_EXTENSIONS = ['.js', '.json', '.html', '.css', '.txt', '.sh'];
|
|
|
|
function substitute(contents) {
|
|
return Object.keys(vars).reduce(
|
|
(acc, key) => acc.split(key).join(vars[key]),
|
|
contents,
|
|
);
|
|
}
|
|
|
|
function copy(src, dst) {
|
|
fs.mkdirSync(path.dirname(dst), { recursive: true });
|
|
if (TEXT_EXTENSIONS.includes(path.extname(src))) {
|
|
fs.writeFileSync(dst, substitute(fs.readFileSync(src, 'utf8')));
|
|
} else {
|
|
fs.copyFileSync(src, dst);
|
|
}
|
|
}
|
|
|
|
function copyTree(src, dst) {
|
|
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
const from = path.join(src, entry.name);
|
|
const to = path.join(dst, entry.name);
|
|
if (entry.isDirectory()) {
|
|
copyTree(from, to);
|
|
} else {
|
|
copy(from, to);
|
|
}
|
|
}
|
|
}
|
|
|
|
const build = path.join(root, 'build');
|
|
fs.rmSync(build, { recursive: true, force: true });
|
|
|
|
// Application (frontend)
|
|
const appDir = path.join(build, 'app');
|
|
copyTree(path.join(root, 'app'), appDir);
|
|
copy(path.join(root, 'appinfo.json'), path.join(appDir, 'appinfo.json'));
|
|
copy(path.join(root, 'assets', 'icon.png'), path.join(appDir, 'icon.png'));
|
|
copy(path.join(root, 'assets', 'largeIcon.png'), path.join(appDir, 'largeIcon.png'));
|
|
|
|
// JS service
|
|
const serviceDir = path.join(build, 'service');
|
|
copyTree(path.join(root, 'service'), serviceDir);
|
|
fs.writeFileSync(
|
|
path.join(serviceDir, 'services.json'),
|
|
`${JSON.stringify(
|
|
{
|
|
id: vars.__SERVICE_ID__,
|
|
description: `${pkg.title} service`,
|
|
services: [{ name: vars.__SERVICE_ID__ }],
|
|
},
|
|
null,
|
|
2,
|
|
)}\n`,
|
|
);
|
|
|
|
console.log(`Built ${vars.__APP_ID__} ${vars.__VERSION__} into ${build}`);
|