Skip to content

Commit

Permalink
remove getArgs in favor of node:util.parseArgs (#476)
Browse files Browse the repository at this point in the history
* remove getArgs

* kebab-case to camelCase

* update app/deployment
  • Loading branch information
Casheeew authored Dec 29, 2023
1 parent 1e254fd commit 39eeed8
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 91 deletions.
6 changes: 3 additions & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ Several command line arguments are available for these scripts:
- `--all` - Builds all targets specified in [manifest-variants.json](dev/data/manifest-variants.json).
- `--default` - Restores the default manifest file.
- `--manifest <target>` - Overwrites `ext/manifest.json` with the manifest variant for the specified build target.
- `--dry-run` - Runs the full build process (excluding zip building), checking that the configuration is valid.
- `--dry-run-build-zip` - If `--dry-run` is also specified, zip building will also be performed in memory; no files are created.
- `--yomitan-version <version>` - Sets the version number in the extension manifest. Defaults to 0.0.0.0 if not set.
- `--dryRun` - Runs the full build process (excluding zip building), checking that the configuration is valid.
- `--dryRunBuildZip` - If `--dryRun` is also specified, zip building will also be performed in memory; no files are created.
- `--version <version>` - Sets the version number in the extension manifest. Defaults to 0.0.0.0 if not set.

If no arguments are specified, the command is equivalent to `build.bat --all`.

Expand Down
56 changes: 37 additions & 19 deletions dev/bin/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ import path from 'path';
import readline from 'readline';
import {buildLibs} from '../build-libs.js';
import {ManifestUtil} from '../manifest-util.js';
import {getAllFiles, getArgs, testMain} from '../util.js';
import {getAllFiles, testMain} from '../util.js';
import {parseArgs} from 'util';

const dirname = path.dirname(fileURLToPath(import.meta.url));

Expand Down Expand Up @@ -218,24 +219,42 @@ function ensureFilesExist(directory, files) {
}
}


/**
* @param {string[]} argv
*/
export async function main(argv) {
const args = getArgs(argv, new Map(/** @type {[key: string, value: (boolean|null|number|string|string[])][]} */ ([
['all', false],
['default', false],
['manifest', null],
['dry-run', false],
['dry-run-build-zip', false],
['yomitan-version', '0.0.0.0'],
[null, []]
])));

const dryRun = /** @type {boolean} */ (args.get('dry-run'));
const dryRunBuildZip = /** @type {boolean} */ (args.get('dry-run-build-zip'));
const yomitanVersion = /** @type {string} */ (args.get('yomitan-version'));
/** @type {import('util').ParseArgsConfig['options']} */
const parseArgsConfigOptions = {
all: {
type: 'boolean',
default: false
},
default: {
type: 'boolean',
default: false
},
manifest: {
type: 'string'
},
dryRun: {
type: 'boolean',
default: false
},
dryRunBuildZip: {
type: 'boolean',
default: false
},
version: {
type: 'string',
default: '0.0.0.0'
}
};

const {values: args} = parseArgs({args: argv, options: parseArgsConfigOptions});

const dryRun = /** @type {boolean} */ (args.dryRun);
const dryRunBuildZip = /** @type {boolean} */ (args.dryRunBuildZip);
const yomitanVersion = /** @type {string} */ (args.version);

const manifestUtil = new ManifestUtil();

Expand All @@ -247,14 +266,13 @@ export async function main(argv) {
try {
await buildLibs();
const variantNames = /** @type {string[]} */ ((
argv.length === 0 || args.get('all') ?
manifestUtil.getVariants().filter(({buildable}) => buildable !== false).map(({name}) => name) :
args.get(null)
argv.length === 0 || args.all ?
manifestUtil.getVariants().filter(({buildable}) => buildable !== false).map(({name}) => name) : []
));
await build(buildDir, extDir, manifestUtil, variantNames, manifestPath, dryRun, dryRunBuildZip, yomitanVersion);
} finally {
// Restore manifest
const manifestName = /** @type {?string} */ ((!args.get('default') && args.get('manifest') !== null) ? args.get('manifest') : null);
const manifestName = /** @type {?string} */ ((!args.default && typeof args.manifest !== 'undefined') ? args.manifest : null);
const restoreManifest = manifestUtil.getManifest(manifestName);
process.stdout.write('Restoring manifest...\n');
if (!dryRun) {
Expand Down
68 changes: 0 additions & 68 deletions dev/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,74 +21,6 @@ import JSZip from 'jszip';
import path from 'path';
import {parseJson} from './json.js';

/**
* @param {string[]} args
* @param {Map<?string, (boolean|null|number|string|string[])>} argMap
* @returns {Map<?string, (boolean|null|number|string|string[])>}
*/
export function getArgs(args, argMap) {
let key = null;
let canKey = true;
let onKey = false;
for (const arg of args) {
onKey = false;

if (canKey && arg.startsWith('--')) {
if (arg.length === 2) {
canKey = false;
key = null;
onKey = false;
} else {
key = arg.substring(2);
onKey = true;
}
}

const target = argMap.get(key);

switch (typeof target) {
case 'boolean':
argMap.set(key, true);
key = null;
break;
case 'number':
argMap.set(key, target + 1);
key = null;
break;
case 'string':
if (!onKey) {
argMap.set(key, arg);
key = null;
}
break;
case 'object':
if (target === null) {
if (!onKey) {
argMap.set(key, arg);
key = null;
}
return argMap;
} else if (Array.isArray(target)) {
if (!onKey) {
target.push(arg);
key = null;
}
return argMap;
} else {
console.error(`Unknown argument: ${arg}`);
key = null;
}
break;
default:
console.error(`Unknown argument: ${arg}`);
key = null;
break;
}
}

return argMap;
}

/**
* @param {string} baseDirectory
* @param {?(fileName: string, isDirectory: boolean) => boolean} predicate
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"test-ts-test": "npx tsc --noEmit --project test/jsconfig.json",
"test-code": "vitest run",
"test-code-write": "vitest run --config test/data/vitest.write.config.json",
"test-build": "node ./dev/bin/build.js --dry-run --all",
"test-build": "node ./dev/bin/build.js --dryRun --all",
"license-report": "license-report --output=html --only=prod --fields=name --fields=installedVersion --fields=licenseType --fields=link --html.cssFile=dev/data/legal-npm.css > ext/legal-npm.html",
"license-report-markdown": "license-report --output=markdown --only=prod --fields=name --fields=installedVersion --fields=licenseType --fields=link"
},
Expand Down

0 comments on commit 39eeed8

Please sign in to comment.