#!/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}`);