From bed27fcb15f33b988efffbc4cc0a2ac88c302f93 Mon Sep 17 00:00:00 2001 From: Eli Kogan-Wang Date: Tue, 6 May 2025 12:40:30 +0200 Subject: [PATCH] Fix broken NPM bundle by publishing in ES-Module format --- karma.conf.js => karma.conf.cjs | 0 package.json | 27 ++-- po/po2js | 6 +- po/xgettext-html | 8 +- utils/convert.js | 140 -------------------- utils/{genkeysymdef.js => genkeysymdef.cjs} | 0 6 files changed, 24 insertions(+), 157 deletions(-) rename karma.conf.js => karma.conf.cjs (100%) delete mode 100755 utils/convert.js rename utils/{genkeysymdef.js => genkeysymdef.cjs} (100%) diff --git a/karma.conf.js b/karma.conf.cjs similarity index 100% rename from karma.conf.js rename to karma.conf.cjs diff --git a/package.json b/package.json index bfe16a54..2802edf9 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,32 @@ { "name": "@novnc/novnc", - "version": "1.6.0", + "version": "1.6.1-alpha.1", "description": "An HTML5 VNC client", - "browser": "lib/rfb", - "directories": { - "lib": "lib", - "doc": "docs", - "test": "tests" - }, + "type": "module", "files": [ - "lib", + "core", + "vendor", "AUTHORS", "VERSION", "docs/API.md", "docs/LIBRARY.md", "docs/LICENSE*" ], + "exports": { + ".": "./core/rfb.js", + "./lib/*": "./core/*.js", + "./lib/*.js": "./core/*.js", + "./core/*": "./core/*.js", + "./core/*.js": "./core/*.js", + "./lib/vendor/*": "./vendor/*.js", + "./lib/vendor/*.js": "./vendor/*.js", + "./vendor/*": "./vendor/*.js", + "./vendor/*.js": "./vendor/*.js", + "./package.json": "./package.json" + }, "scripts": { "lint": "eslint app core po/po2js po/xgettext-html tests utils", - "test": "karma start karma.conf.js", - "prepublish": "node ./utils/convert.js --clean" + "test": "karma start karma.conf.cjs" }, "repository": { "type": "git", diff --git a/po/po2js b/po/po2js index 6347e1ea..38effd30 100755 --- a/po/po2js +++ b/po/po2js @@ -17,9 +17,9 @@ * along with this program. If not, see . */ -const { program } = require('commander'); -const fs = require('fs'); -const pofile = require("pofile"); +import { program } from 'commander'; +import fs from 'fs'; +import pofile from "pofile"; program .argument('') diff --git a/po/xgettext-html b/po/xgettext-html index f5ba57cc..3fcaacd4 100755 --- a/po/xgettext-html +++ b/po/xgettext-html @@ -5,9 +5,9 @@ * Licensed under MPL 2.0 (see LICENSE.txt) */ -const { program } = require('commander'); -const jsdom = require("jsdom"); -const fs = require("fs"); +import { program } from 'commander'; +import jsdom from 'jsdom'; +import fs from 'fs'; program .argument('') @@ -106,7 +106,7 @@ let output = ""; for (let str in strings) { output += "#:"; - for (location in strings[str]) { + for (let location in strings[str]) { output += " " + location; } output += "\n"; diff --git a/utils/convert.js b/utils/convert.js deleted file mode 100755 index 617f4ed6..00000000 --- a/utils/convert.js +++ /dev/null @@ -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: 'commonjs' } ] - ], - 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); diff --git a/utils/genkeysymdef.js b/utils/genkeysymdef.cjs similarity index 100% rename from utils/genkeysymdef.js rename to utils/genkeysymdef.cjs