Migrate scripts to ES modules and update related configurations
This commit is contained in:
parent
62201022ab
commit
27973d9ccd
|
@ -62,7 +62,7 @@ export default [
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
files: ["po/po2js.cjs", "po/xgettext-html.cjs"],
|
files: ["po/po2js.js", "po/xgettext-html.js"],
|
||||||
languageOptions: {
|
languageOptions: {
|
||||||
globals: {
|
globals: {
|
||||||
...globals.node,
|
...globals.node,
|
||||||
|
|
|
@ -18,9 +18,9 @@
|
||||||
"docs/LICENSE*"
|
"docs/LICENSE*"
|
||||||
],
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "eslint app core po/po2js.cjs po/xgettext-html.cjs tests utils",
|
"lint": "eslint app core po/po2js.js po/xgettext-html.js tests utils",
|
||||||
"test": "karma start karma.conf.cjs",
|
"test": "karma start karma.conf.cjs",
|
||||||
"prepare": "node ./utils/convert.cjs --clean"
|
"prepare": "node ./utils/build.js --clean"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|
|
@ -15,7 +15,7 @@ update-js: $(JSONFILES)
|
||||||
%.po: FORCE
|
%.po: FORCE
|
||||||
msgmerge --update --lang=$* $@ noVNC.pot
|
msgmerge --update --lang=$* $@ noVNC.pot
|
||||||
../app/locale/%.json: FORCE
|
../app/locale/%.json: FORCE
|
||||||
./po2js.cjs $*.po $@
|
./po2js.js $*.po $@
|
||||||
|
|
||||||
update-pot:
|
update-pot:
|
||||||
xgettext --output=noVNC.js.pot \
|
xgettext --output=noVNC.js.pot \
|
||||||
|
@ -29,7 +29,7 @@ update-pot:
|
||||||
../app/*.js \
|
../app/*.js \
|
||||||
../core/*.js \
|
../core/*.js \
|
||||||
../core/input/*.js
|
../core/input/*.js
|
||||||
./xgettext-html.cjs --output=noVNC.html.pot \
|
./xgettext-html.js --output=noVNC.html.pot \
|
||||||
../vnc.html
|
../vnc.html
|
||||||
msgcat --output-file=noVNC.pot \
|
msgcat --output-file=noVNC.pot \
|
||||||
--sort-by-file noVNC.js.pot noVNC.html.pot
|
--sort-by-file noVNC.js.pot noVNC.html.pot
|
||||||
|
|
|
@ -17,9 +17,9 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const { program } = require('commander');
|
import { program } from 'commander';
|
||||||
const fs = require('fs');
|
import fs from 'fs';
|
||||||
const pofile = require("pofile");
|
import pofile from "pofile";
|
||||||
|
|
||||||
program
|
program
|
||||||
.argument('<input>')
|
.argument('<input>')
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
* Licensed under MPL 2.0 (see LICENSE.txt)
|
* Licensed under MPL 2.0 (see LICENSE.txt)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const { program } = require('commander');
|
import { program } from 'commander';
|
||||||
const jsdom = require("jsdom");
|
import jsdom from 'jsdom';
|
||||||
const fs = require("fs");
|
import fs from 'fs';
|
||||||
|
|
||||||
program
|
program
|
||||||
.argument('<INPUT...>')
|
.argument('<INPUT...>')
|
|
@ -0,0 +1,74 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
import fs from "fs";
|
||||||
|
import path from "path";
|
||||||
|
import fse from "fs-extra";
|
||||||
|
import { program } from "commander";
|
||||||
|
import { ensureDir } from "fs-extra";
|
||||||
|
import { fileURLToPath } from "url";
|
||||||
|
|
||||||
|
program
|
||||||
|
.option("--clean", "clear the lib folder before building")
|
||||||
|
.parse(process.argv);
|
||||||
|
|
||||||
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||||
|
|
||||||
|
// the various important paths
|
||||||
|
const paths = {
|
||||||
|
main: path.resolve(__dirname, ".."),
|
||||||
|
core: path.resolve(__dirname, "..", "core"),
|
||||||
|
vendor: path.resolve(__dirname, "..", "vendor"),
|
||||||
|
libDirBase: path.resolve(__dirname, "..", "lib"),
|
||||||
|
};
|
||||||
|
|
||||||
|
// walkDir *recursively* walks directories trees,
|
||||||
|
// calling the callback for all normal files found.
|
||||||
|
const walkDir = async (basePath, cb, filter) => {
|
||||||
|
const files = await fs.promises.readdir(basePath);
|
||||||
|
const paths = files.map((filename) => path.join(basePath, filename));
|
||||||
|
return Promise.all(
|
||||||
|
paths.map(async (filepath) => {
|
||||||
|
const stats = await fs.promises.lstat(filepath);
|
||||||
|
if (filter !== undefined && !filter(filepath, stats)) return;
|
||||||
|
if (stats.isSymbolicLink()) return;
|
||||||
|
if (stats.isFile()) return cb(filepath);
|
||||||
|
if (stats.isDirectory()) return walkDir(filepath, cb, filter);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const makeLibFiles = async () => {
|
||||||
|
fse.ensureDirSync(paths.libDirBase);
|
||||||
|
const outFiles = [];
|
||||||
|
|
||||||
|
const handleDir = async (vendorRewrite, inPathBase, filename) => {
|
||||||
|
const outPath = path.join(
|
||||||
|
paths.libDirBase,
|
||||||
|
path.relative(inPathBase, filename)
|
||||||
|
);
|
||||||
|
if (path.extname(filename) !== ".js") {
|
||||||
|
return; // skip non-javascript files
|
||||||
|
}
|
||||||
|
await ensureDir(path.dirname(outPath));
|
||||||
|
await fs.promises.copyFile(filename, outPath);
|
||||||
|
console.log(`Writing ${outPath}`);
|
||||||
|
outFiles.push(`${outPath}`);
|
||||||
|
};
|
||||||
|
const handler = handleDir.bind(null, false, paths.main);
|
||||||
|
await walkDir(paths.vendor, handler);
|
||||||
|
const handler2 = handleDir.bind(null, true, paths.core);
|
||||||
|
await walkDir(paths.core, handler2);
|
||||||
|
return outFiles;
|
||||||
|
};
|
||||||
|
const options = program.opts();
|
||||||
|
if (options.clean) {
|
||||||
|
console.log(`Removing ${paths.libDirBase}`);
|
||||||
|
fse.removeSync(paths.libDirBase);
|
||||||
|
}
|
||||||
|
makeLibFiles()
|
||||||
|
.then((outFiles) => {
|
||||||
|
console.log(`Converted ${outFiles.length} files`);
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.error(`Failure converting modules: ${err}`);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
|
@ -1,140 +0,0 @@
|
||||||
#!/usr/bin/env node
|
|
||||||
|
|
||||||
const path = require('path');
|
|
||||||
const { program } = require('commander');
|
|
||||||
const fs = require('fs');
|
|
||||||
const fse = require('fs-extra');
|
|
||||||
const babel = require('@babel/core');
|
|
||||||
|
|
||||||
program
|
|
||||||
.option('-m, --with-source-maps [type]', 'output source maps when not generating a bundled app (type may be empty for external source maps, inline for inline source maps, or both) ')
|
|
||||||
.option('--clean', 'clear the lib folder before building')
|
|
||||||
.parse(process.argv);
|
|
||||||
|
|
||||||
// the various important paths
|
|
||||||
const paths = {
|
|
||||||
main: path.resolve(__dirname, '..'),
|
|
||||||
core: path.resolve(__dirname, '..', 'core'),
|
|
||||||
vendor: path.resolve(__dirname, '..', 'vendor'),
|
|
||||||
libDirBase: path.resolve(__dirname, '..', 'lib'),
|
|
||||||
};
|
|
||||||
|
|
||||||
// util.promisify requires Node.js 8.x, so we have our own
|
|
||||||
function promisify(original) {
|
|
||||||
return function promiseWrap() {
|
|
||||||
const args = Array.prototype.slice.call(arguments);
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
original.apply(this, args.concat((err, value) => {
|
|
||||||
if (err) return reject(err);
|
|
||||||
resolve(value);
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
const writeFile = promisify(fs.writeFile);
|
|
||||||
|
|
||||||
const readdir = promisify(fs.readdir);
|
|
||||||
const lstat = promisify(fs.lstat);
|
|
||||||
|
|
||||||
const ensureDir = promisify(fse.ensureDir);
|
|
||||||
|
|
||||||
const babelTransformFile = promisify(babel.transformFile);
|
|
||||||
|
|
||||||
// walkDir *recursively* walks directories trees,
|
|
||||||
// calling the callback for all normal files found.
|
|
||||||
function walkDir(basePath, cb, filter) {
|
|
||||||
return readdir(basePath)
|
|
||||||
.then((files) => {
|
|
||||||
const paths = files.map(filename => path.join(basePath, filename));
|
|
||||||
return Promise.all(paths.map(filepath => lstat(filepath)
|
|
||||||
.then((stats) => {
|
|
||||||
if (filter !== undefined && !filter(filepath, stats)) return;
|
|
||||||
|
|
||||||
if (stats.isSymbolicLink()) return;
|
|
||||||
if (stats.isFile()) return cb(filepath);
|
|
||||||
if (stats.isDirectory()) return walkDir(filepath, cb, filter);
|
|
||||||
})));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeLibFiles(sourceMaps) {
|
|
||||||
// NB: we need to make a copy of babelOpts, since babel sets some defaults on it
|
|
||||||
const babelOpts = () => ({
|
|
||||||
plugins: [],
|
|
||||||
presets: [
|
|
||||||
[ '@babel/preset-env',
|
|
||||||
{ modules: false } ]
|
|
||||||
],
|
|
||||||
ast: false,
|
|
||||||
sourceMaps: sourceMaps,
|
|
||||||
});
|
|
||||||
|
|
||||||
fse.ensureDirSync(paths.libDirBase);
|
|
||||||
|
|
||||||
const outFiles = [];
|
|
||||||
|
|
||||||
const handleDir = (vendorRewrite, inPathBase, filename) => Promise.resolve()
|
|
||||||
.then(() => {
|
|
||||||
const outPath = path.join(paths.libDirBase, path.relative(inPathBase, filename));
|
|
||||||
|
|
||||||
if (path.extname(filename) !== '.js') {
|
|
||||||
return; // skip non-javascript files
|
|
||||||
}
|
|
||||||
return Promise.resolve()
|
|
||||||
.then(() => ensureDir(path.dirname(outPath)))
|
|
||||||
.then(() => {
|
|
||||||
const opts = babelOpts();
|
|
||||||
// Adjust for the fact that we move the core files relative
|
|
||||||
// to the vendor directory
|
|
||||||
if (vendorRewrite) {
|
|
||||||
opts.plugins.push(["import-redirect",
|
|
||||||
{"root": paths.libDirBase,
|
|
||||||
"redirect": { "vendor/(.+)": "./vendor/$1"}}]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return babelTransformFile(filename, opts)
|
|
||||||
.then((res) => {
|
|
||||||
console.log(`Writing ${outPath}`);
|
|
||||||
const {map} = res;
|
|
||||||
let {code} = res;
|
|
||||||
if (sourceMaps === true) {
|
|
||||||
// append URL for external source map
|
|
||||||
code += `\n//# sourceMappingURL=${path.basename(outPath)}.map\n`;
|
|
||||||
}
|
|
||||||
outFiles.push(`${outPath}`);
|
|
||||||
return writeFile(outPath, code)
|
|
||||||
.then(() => {
|
|
||||||
if (sourceMaps === true || sourceMaps === 'both') {
|
|
||||||
console.log(` and ${outPath}.map`);
|
|
||||||
outFiles.push(`${outPath}.map`);
|
|
||||||
return writeFile(`${outPath}.map`, JSON.stringify(map));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
Promise.resolve()
|
|
||||||
.then(() => {
|
|
||||||
const handler = handleDir.bind(null, false, paths.main);
|
|
||||||
return walkDir(paths.vendor, handler);
|
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
const handler = handleDir.bind(null, true, paths.core);
|
|
||||||
return walkDir(paths.core, handler);
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
console.error(`Failure converting modules: ${err}`);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
let options = program.opts();
|
|
||||||
|
|
||||||
if (options.clean) {
|
|
||||||
console.log(`Removing ${paths.libDirBase}`);
|
|
||||||
fse.removeSync(paths.libDirBase);
|
|
||||||
}
|
|
||||||
|
|
||||||
makeLibFiles(options.withSourceMaps);
|
|
Loading…
Reference in New Issue