diff --git a/.gitignore b/.gitignore index 2ccbe465..b0a5c349 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /node_modules/ +/dist/ diff --git a/npm-scripts.js b/npm-scripts.js index 7414f889..7fb1eb85 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -3,50 +3,59 @@ const path = require('path'); const process = require('process'); const { execSync } = require('child_process'); const { version } = require('./package.json'); +const pkg = require('./package.json'); +const { resolve } = require("path"); +const { build } = require("esbuild"); +const { readFile, writeFile } = require("fs/promises"); const task = process.argv.slice(2).join(' '); const ESLINT_PATHS = [ 'src', 'test' ].join(' '); +const rootDir = "./"; +const outDir = "./dist"; // eslint-disable-next-line no-console console.log(`npm-scripts.js [INFO] running task "${task}"`); -switch (task) -{ - case 'grammar': { - grammar(); - - break; - } - - case 'lint': { - lint(); - - break; - } - - case 'test': { - test(); - - break; - } - - case 'release': { - lint(); - test(); - executeCmd(`git commit -am '${version}'`); - executeCmd(`git tag -a ${version} -m '${version}'`); - executeCmd('git push origin master && git push origin --tags'); - executeCmd('npm publish'); - - // eslint-disable-next-line no-console - console.log('update tryit-jssip and JsSIP website'); - - break; - } - - default: { - throw new TypeError(`unknown task "${task}"`); +async function main() { + switch (task) + { + case 'grammar': { + grammar(); + break; + } + + case 'lint': { + lint(); + break; + } + + case 'test': { + test(); + break; + } + + case 'build': { + await buildMin(rootDir, outDir); + break; + } + + case 'release': { + lint(); + test(); + executeCmd(`git commit -am '${version}'`); + executeCmd(`git tag -a ${version} -m '${version}'`); + executeCmd('git push origin master && git push origin --tags'); + executeCmd('npm publish'); + + // eslint-disable-next-line no-console + console.log('update tryit-jssip and JsSIP website'); + break; + } + + default: { + throw new TypeError(`unknown task "${task}"`); + } } } @@ -93,6 +102,41 @@ function grammar() logInfo('grammar done'); } + +// Build a Minified version of JsSIP into /dist/ for publishing +async function buildMin(rootDir, outDir) { + const entry = resolve(rootDir, "src/JsSIP.js"); + const outfile = resolve(outDir, "jssip.min.js"); + const banner = `/*! + * JsSIP ${pkg.version} + * ${pkg.description} + * Copyright: 2012-${new Date().getFullYear()} ${pkg.contributors.join(' ')} + * Homepage: ${pkg.homepage} + * License: ${pkg.license} + */`; + + await build({ + entryPoints: [entry], + outfile, + bundle: true, + minify: true, + sourcemap: false, + // https://esbuild.github.io/api/#global-name + format: "iife", + globalName: "JsSIP", + platform: "browser", + target: ["es2015"], + // Make the generated output a single line + supported: { + "template-literal": false, + }, + // Add a banner + banner: { + js: banner, + }, + }); +} + function executeCmd(command) { // eslint-disable-next-line no-console @@ -114,3 +158,8 @@ function logInfo(...args) // eslint-disable-next-line no-console console.log(`npm-scripts.mjs \x1b[36m[INFO] [${task}]\x1b[0m`, ...args); } + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/package.json b/package.json index e7c6c147..798e9ca7 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@eslint/js": "^9.39.2", "@types/debug": "^4.1.12", "@types/events": "^3.0.3", + "esbuild": "^0.27.2", "eslint": "^9.39.1", "eslint-plugin-jest": "^29.12.1", "globals": "^17.0.0", @@ -45,6 +46,7 @@ "scripts": { "lint": "node npm-scripts.js lint", "test": "node npm-scripts.js test", + "build": "node npm-scripts.js build", "release": "node npm-scripts.js release" } }