Refactored CLI to be a separate package #24

Merged
garrettluu merged 2 commits from master into master 2020-06-19 22:30:35 +00:00
7 changed files with 181 additions and 109 deletions
Showing only changes of commit e1d0f22609 - Show all commits

@ -1,98 +0,0 @@
#!/usr/bin/env node
/* js-codepage (C) 2014-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2 ft=javascript: */
/* eslint-env node */
var codepage = require('../');
require('exit-on-epipe');
var fs = require('fs'), program/*:any*/ = (require('commander')/*:any*/);
program
.version(codepage.version)
.usage('[options] <file>')
.option('-f, --from-code <code>', 'codepage of input (default 65001 utf8)')
.option('-t, --to-code <code>', 'codepage of output (default 65001 utf8)')
.option('-o, --output <file>', 'output file (<file>.<to> if specified)')
.option('-B, --bom', 'write BOM (for unicode codepages)')
.option('-F, --force', 'force writing to stdout for non-utf8 codepages')
.option('-l, --list', 'List supported codepages');
program.on('--help', function() {
console.log(' Codepage descriptions can be found in the README');
console.log(' http://oss.sheetjs.com/js-codepage/README.md');
console.log(' Support email: dev.codepage@sheetjs.com');
});
program.parse(process.argv);
if(program.list) {
var l/*:Array<number>*/ = [];
Object.keys(codepage).forEach(function(x) { if(parseInt(x, 10) == +x) l.push(+x); });
Object.keys(codepage.utils.magic).forEach(function(x) { if(parseInt(x, 10) == +x && +x != 16969) l.push(+x); });
l.sort(function(a,b) { return a-b; }).forEach(function(x) { console.log(x); });
process.exit();
}
var fr = +program.fromCode || 65001;
var to = +program.toCode || 65001;
var f = program.args[0];
var o = program.output;
if(!process.stdin.isTTY) f = f || "-";
if(f !== "-" && !fs.existsSync(f)) {
console.error('codepage: must specify a filename');
process.exit(13);
}
function concat(func) {
// $FlowIgnore
var writable = require('stream').Writable();
var buf = [];
writable._write = function(chunk, e, cb) { buf.push(chunk); cb(); };
writable._writev = function(chunks, cb) { chunks.forEach(function(c) { buf.push(c.chunk); cb(); }); };
writable.on('finish', function() { func(Buffer.concat(buf)); });
return writable;
}
if(f === "-") process.stdin.pipe(concat(process_text));
else process_text(fs.readFileSync(f));
function process_text(text/*:Buffer*/) {
var dec/*:Buffer*/ = (codepage.utils.decode(fr, text)/*:any*/);
var bom/*:Array<Buffer>*/ = [];
bom[1200] = new Buffer([0xFF, 0xFE]);
bom[1201] = new Buffer([0xFE, 0xFF]);
bom[12000] = new Buffer([0xFF, 0xFE, 0x00, 0x00]);
bom[12001] = new Buffer([0x00, 0x00, 0xFE, 0xFF]);
bom[16969] = new Buffer([0x69, 0x69]);
bom[65000] = new Buffer([0x2B, 0x2F, 0x76, 0x2B]);
bom[65001] = new Buffer([0xEF, 0xBB, 0xBF]);
var mybom = (program.bom && bom[to] ? bom[to] : "");
var out/*:any*/ = to === 65001 ? dec.toString('utf8') : codepage.utils.encode(to, dec);
/* if output file is specified */
if(o) writefile(o, out, mybom);
/* utf8 -> print to stdout */
else if(to === 65001) logit(out, mybom);
/* stdout piped to process -> print */
else if(!process.stdout.isTTY) logit(out, mybom);
/* forced */
else if(program.force) logit(out, mybom);
/* input file specified -> write to file */
else if(f !== "-") writefile(f + "." + to, out, mybom);
else {
console.error('codepage: use force (-F, --force) to print ' + to + ' codes');
process.exit(14);
}
}
function logit(out/*:Buffer*/, bom) {
process.stdout.write(bom);
process.stdout.write(out);
}
function writefile(o, out/*:Buffer*/, bom) {
fs.writeFileSync(o, bom);
fs.appendFileSync(o, out);
}

@ -3,19 +3,17 @@
"version": "1.14.0",
"author": "SheetJS",
"description": "pure-JS library to handle codepages",
"keywords": [ "codepage", "iconv", "convert", "strings" ],
"bin": {
"codepage": "./bin/codepage.njs"
},
"keywords": [
"codepage",
"iconv",
"convert",
"strings"
],
"main": "cputils.js",
"types": "types",
"browser": {
"buffer": "false"
},
"dependencies": {
"commander": "~2.14.1",
"exit-on-epipe": "~1.0.1"
},
"devDependencies": {
"voc": "~1.1.0",
"mocha": "~2.5.3",
@ -26,7 +24,10 @@
"dtslint": "^0.1.2",
"typescript": "2.2.0"
},
"repository": { "type":"git", "url":"git://github.com/SheetJS/js-codepage.git"},
"repository": {
"type": "git",
"url": "git://github.com/SheetJS/js-codepage.git"
},
"scripts": {
"pretest": "git submodule init && git submodule update",
"test": "make test",
@ -61,7 +62,11 @@
"dist/sbcs.full.js",
"dist/cpexcel.full.js"
],
"bugs": { "url": "https://github.com/SheetJS/js-codepage/issues" },
"bugs": {
"url": "https://github.com/SheetJS/js-codepage/issues"
},
"license": "Apache-2.0",
"engines": { "node": ">=0.8" }
"engines": {
"node": ">=0.8"
}
}

1
packages/codepage-cli/.gitignore vendored Normal file

@ -0,0 +1 @@
node_modules/

@ -0,0 +1,7 @@
#!/usr/bin/env node
/* js-codepage (C) 2014-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2 ft=javascript: */
/* eslint-env node */
var cli = require('../');
cli();

@ -0,0 +1,102 @@
#!/usr/bin/env node
/* js-codepage (C) 2014-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2 ft=javascript: */
/* eslint-env node */
var codepage = require('codepage');
require('exit-on-epipe');
var fs = require('fs'), program/*:any*/ = (require('commander')/*:any*/);
function run() {
program
.version(codepage.version)
.usage('[options] <file>')
.option('-f, --from-code <code>', 'codepage of input (default 65001 utf8)')
.option('-t, --to-code <code>', 'codepage of output (default 65001 utf8)')
.option('-o, --output <file>', 'output file (<file>.<to> if specified)')
.option('-B, --bom', 'write BOM (for unicode codepages)')
.option('-F, --force', 'force writing to stdout for non-utf8 codepages')
.option('-l, --list', 'List supported codepages');
program.on('--help', function () {
console.log(' Codepage descriptions can be found in the README');
console.log(' http://oss.sheetjs.com/js-codepage/README.md');
console.log(' Support email: dev.codepage@sheetjs.com');
});
program.parse(process.argv);
if (program.list) {
var l/*:Array<number>*/ = [];
Object.keys(codepage).forEach(function (x) { if (parseInt(x, 10) == +x) l.push(+x); });
Object.keys(codepage.utils.magic).forEach(function (x) { if (parseInt(x, 10) == +x && +x != 16969) l.push(+x); });
l.sort(function (a, b) { return a - b; }).forEach(function (x) { console.log(x); });
process.exit();
}
var fr = +program.fromCode || 65001;
var to = +program.toCode || 65001;
var f = program.args[0];
var o = program.output;
if (!process.stdin.isTTY) f = f || "-";
if (f !== "-" && !fs.existsSync(f)) {
console.error('codepage: must specify a filename');
process.exit(13);
}
function concat(func) {
// $FlowIgnore
var writable = require('stream').Writable();
var buf = [];
writable._write = function (chunk, e, cb) { buf.push(chunk); cb(); };
writable._writev = function (chunks, cb) { chunks.forEach(function (c) { buf.push(c.chunk); cb(); }); };
writable.on('finish', function () { func(Buffer.concat(buf)); });
return writable;
}
if (f === "-") process.stdin.pipe(concat(process_text));
else process_text(fs.readFileSync(f));
function process_text(text/*:Buffer*/) {
var dec/*:Buffer*/ = (codepage.utils.decode(fr, text)/*:any*/);
var bom/*:Array<Buffer>*/ = [];
bom[1200] = new Buffer([0xFF, 0xFE]);
bom[1201] = new Buffer([0xFE, 0xFF]);
bom[12000] = new Buffer([0xFF, 0xFE, 0x00, 0x00]);
bom[12001] = new Buffer([0x00, 0x00, 0xFE, 0xFF]);
bom[16969] = new Buffer([0x69, 0x69]);
bom[65000] = new Buffer([0x2B, 0x2F, 0x76, 0x2B]);
bom[65001] = new Buffer([0xEF, 0xBB, 0xBF]);
var mybom = (program.bom && bom[to] ? bom[to] : "");
var out/*:any*/ = to === 65001 ? dec.toString('utf8') : codepage.utils.encode(to, dec);
/* if output file is specified */
if (o) writefile(o, out, mybom);
/* utf8 -> print to stdout */
else if (to === 65001) logit(out, mybom);
/* stdout piped to process -> print */
else if (!process.stdout.isTTY) logit(out, mybom);
/* forced */
else if (program.force) logit(out, mybom);
/* input file specified -> write to file */
else if (f !== "-") writefile(f + "." + to, out, mybom);
else {
console.error('codepage: use force (-F, --force) to print ' + to + ' codes');
process.exit(14);
}
}
function logit(out/*:Buffer*/, bom) {
process.stdout.write(bom);
process.stdout.write(out);
}
function writefile(o, out/*:Buffer*/, bom) {
fs.writeFileSync(o, bom);
fs.appendFileSync(o, out);
}
}
module.exports = run;

39
packages/codepage-cli/package-lock.json generated Normal file

@ -0,0 +1,39 @@
{
"name": "codepage-cli",
"version": "1.0.3",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"codepage": {
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz",
"integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=",
"requires": {
"commander": "~2.14.1",
"exit-on-epipe": "~1.0.1"
},
"dependencies": {
"commander": {
"version": "2.14.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
"integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
}
}
},
"commander": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
"integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="
},
"exit-on-epipe": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
"integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
},
"fs": {
"version": "0.0.1-security",
"resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
"integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ="
}
}
}

@ -0,0 +1,16 @@
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
{
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
"name": "codepage-cli",
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
"version": "1.0.4",
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
"description": "CLI for js-codepage",
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
"main": "index.js",
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
"bin": {
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
"codepage-cli": "./bin/codepage.njs"
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
},
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
"author": "Garrett Luu",
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
"license": "Apache-2.0",
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
"dependencies": {
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
"codepage": "^1.14.0",
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
"commander": "^5.1.0",
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
"exit-on-epipe": "^1.0.1"
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
}
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.
}
srijonsaha commented 2020-06-18 23:06:24 +00:00 (Migrated from github.com)
Review

Might be worth removing the test script if there are no tests.

Might be worth removing the test script if there are no tests.