diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..3d88f8a --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,14 @@ +name: Lint + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 16 + - run: npm i + - run: npm run lint diff --git a/full-icu.js b/full-icu.js index 2dff5ff..2792d86 100644 --- a/full-icu.js +++ b/full-icu.js @@ -1,91 +1,90 @@ // Copyright (C) 2015 IBM Corporation and Others. All Rights Reserved. -//var process = require('process'); -//console.dir(process.env); +// var process = require('process'); +// console.dir(process.env); -var fs = require('fs'); -var path = require('path'); +const fs = require('fs') +const path = require('path') -if(!process || !process.versions || !process.versions.node) { - throw Error('Sorry- don’t know what version of Node you are on.'); +if (!process || !process.versions || !process.versions.node) { + throw Error('Sorry- don’t know what version of Node you are on.') } -var nodever = module.exports.nodever = process.versions.node; +const nodever = module.exports.nodever = process.versions.node -var nodesplit = nodever.split('.'); +const nodesplit = nodever.split('.') -var node_maj = module.exports.node_maj = nodesplit[0]; -var node_min = module.exports.node_min = nodesplit[1]; +const major = module.exports.node_maj = nodesplit[0] +const minor = module.exports.node_min = nodesplit[1] -if((node_maj == 0) && (node_min < 12)) { - module.exports.oldNode = true; -} else if(process.config.variables.v8_enable_i18n_support === 0) { - module.exports.noi18n = true; +if ((major === 0) && (minor < 12)) { + module.exports.oldNode = true +} else if (process.config.variables.v8_enable_i18n_support === 0) { + module.exports.noi18n = true } else { - - /* - Commented until https://github.com/nodejs/node/issues/3460 is fixed. - - if( node_maj >= 7 ) { - if( nodever === '7.0.0-pre' ) { - module.exports.nodeDetectIcu = 'maybe'; - } else { - module.exports.nodeDetectIcu = true; - } - } - */ - - if(!process.config.variables.icu_small) { - module.exports.icu_small = false; - // not going to work.. - if(process.config.variables.icu_gyp_path === 'tools/icu/icu-system.gyp') { - // this will be the case under homebrew, redhat/fedora, others.. - module.exports.icu_system = true; - } - } else { - module.exports.icu_small = true; - } - - var icuver; - var icuend = 'l'; - - if(process.versions.icu) { - icuver = process.versions.icu; // Thanks https://github.com/nodejs/node/issues/3089 - } else { - icuver = process.config.variables.icu_ver_major; // only get the major - } - - if(!icuver) { - throw Error('Cannot determine Node’s ICU version!'); - } else { - module.exports.icuver = icuver; - } - - // get 'major' number - var icumaj = module.exports.icumaj = icuver.split('.')[0]; - - if(process.config.variables.icu_endianness) { - icuend = process.config.variables.icu_endianness.toLowerCase(); - } - - if( (icuend.length != 1) || ("lbe".indexOf(icuend) == -1)) { - throw Error('Don’t know what to make of endianness “'+icuend+'” - expected l, b, or e'); - } else { - module.exports.icuend = icuend; - } - - var icupkg = module.exports.icupkg = "icu4c-data@" + icumaj+icuend; - - var icudat = module.exports.icudat = "icudt"+icumaj+icuend+".dat"; - - var haveDat = module.exports.haveDat = function haveDat(d) { - if(!d) d = path.resolve(__dirname, icudat); - return fs.existsSync(d); - } - - var datPath = module.exports.datPath = function datPath(d) { - if(!d) d = path.resolve(__dirname, icudat); - if(haveDat(d)) return fs.realpathSync(d); - throw Error('Does not exist: ' + fs.realpathSync(d)); - } + /* + Commented until https://github.com/nodejs/node/issues/3460 is fixed. + + if( major >= 7 ) { + if( nodever === '7.0.0-pre' ) { + module.exports.nodeDetectIcu = 'maybe'; + } else { + module.exports.nodeDetectIcu = true; + } + } + */ + + if (!process.config.variables.icu_small) { + module.exports.icu_small = false + // not going to work.. + if (process.config.variables.icu_gyp_path === 'tools/icu/icu-system.gyp') { + // this will be the case under homebrew, redhat/fedora, others.. + module.exports.icu_system = true + } + } else { + module.exports.icu_small = true + } + + let icuver + let icuend = 'l' + + if (process.versions.icu) { + icuver = process.versions.icu // Thanks https://github.com/nodejs/node/issues/3089 + } else { + icuver = process.config.variables.icu_ver_major // only get the major + } + + if (!icuver) { + throw Error('Cannot determine Node’s ICU version!') + } else { + module.exports.icuver = icuver + } + + // get 'major' number + const icumaj = module.exports.icumaj = icuver.split('.')[0] + + if (process.config.variables.icu_endianness) { + icuend = process.config.variables.icu_endianness.toLowerCase() + } + + if ((icuend.length !== 1) || ('lbe'.indexOf(icuend) === -1)) { + throw Error('Don’t know what to make of endianness “' + icuend + '” - expected l, b, or e') + } else { + module.exports.icuend = icuend + } + + module.exports.icupkg = 'icu4c-data@' + icumaj + icuend + + const icudat = module.exports.icudat = 'icudt' + icumaj + icuend + '.dat' + + const haveDat = module.exports.haveDat = function haveDat (d) { + if (!d) d = path.resolve(__dirname, icudat) + return fs.existsSync(d) + } + + module.exports.datPath = function datPath (d) { + if (!d) d = path.resolve(__dirname, icudat) + if (haveDat(d)) return fs.realpathSync(d) + throw Error('Does not exist: ' + fs.realpathSync(d)) + } } diff --git a/install-spawn.js b/install-spawn.js index 0f5611d..1a4bb4d 100644 --- a/install-spawn.js +++ b/install-spawn.js @@ -2,88 +2,86 @@ // Install by using spawn -var path = require('path'); -var fs = require('fs'); -var child_process = require('child_process'); +const path = require('path') +const fs = require('fs') +const spawnSync = require('child_process').spawnSync -var isglobal = process.env.npm_config_global === 'true'; -var npmrc = '.npmrc'; -var npmrcPath = path.resolve(process.env.INIT_CWD, npmrc); +const isglobal = process.env.npm_config_global === 'true' +const npmrc = '.npmrc' +const npmrcPath = path.resolve(process.env.INIT_CWD, npmrc) // uses semver regex from https://semver.org/ -const YARN_REGEX = /yarn(-(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)?((.*cli)?\.c?js)?$/; +const YARN_REGEX = /yarn(-(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)?((.*cli)?\.c?js)?$/ -module.exports = function npmInstallNpm(fullIcu, advice) { - var icupkg = fullIcu.icupkg; - var icudat = fullIcu.icudat; +module.exports = function npmInstallNpm (fullIcu, advice) { + const icupkg = fullIcu.icupkg + const icudat = fullIcu.icudat - var cmdPath = nodePath = process.env.npm_node_execpath; + let cmdPath = process.env.npm_node_execpath - var npmPath = process.env.npm_execpath; + const npmPath = process.env.npm_execpath - var args; + let args + if (YARN_REGEX.test(npmPath)) { + console.log('Looks like you are using yarn…') + args = [npmPath, 'add', icupkg, '--no-lockfile', '--ignore-scripts'] + } else if (npmPath) { + args = [npmPath, 'install', icupkg] + } else { + // attempt to launch npm. + // do not try yarn here + console.log('(Hmm… doesn’t look like NPM called us. Let’s try calling NPM.)') + cmdPath = 'npm' + args = ['install', icupkg] + } - if (YARN_REGEX.test(npmPath) ) { - console.log('Looks like you are using yarn…'); - installVerb = 'add'; - args = [ npmPath, 'add', icupkg, '--no-lockfile', '--ignore-scripts' ]; - } else if(npmPath) { - args = [ npmPath, 'install', icupkg ]; - } else { - // attempt to launch npm. - // do not try yarn here - console.log('(Hmm… doesn’t look like NPM called us. Let’s try calling NPM.)'); - cmdPath = 'npm'; - args = [ 'install', icupkg ]; - } + if (fs.existsSync(npmrcPath)) { + try { + fs.linkSync(npmrcPath, npmrc) + } catch (e) { + fs.symlinkSync(npmrcPath, npmrc) + } + } - if(fs.existsSync(npmrcPath)) { - try { - fs.linkSync(npmrcPath, npmrc); - } catch(e) { - fs.symlinkSync(npmrcPath, npmrc); - } - } + console.log('full-icu$', cmdPath, args.join(' ')) + const spawned = spawnSync(cmdPath, args, { stdio: 'inherit' }) - console.log('full-icu$', cmdPath, args.join(' ')); - var spawned = child_process.spawnSync(cmdPath, args, { stdio: 'inherit' }); + if (fs.existsSync(npmrc)) { + try { + fs.unlinkSync(npmrc) + } catch (e) { + } + } - if(fs.existsSync(npmrc)) { - try { - fs.unlinkSync(npmrc); - } catch(e) { - } - } - - if(spawned.error) { - throw(spawned.error); - } else if(spawned.status !== 0) { - throw(Error(cmdPath + ' ' + args.join(' ') + ' --> status ' + spawned.status)); - } else { - var datPath; - if(isglobal) { - datPath = path.join('..','icu4c-data',icudat); - } else { - datPath = path.join('node_modules','icu4c-data',icudat); - } - if(fs.existsSync(icudat)) { - console.log(' √ ' + icudat + " (existing link?)"); - } else if(!fs.existsSync(datPath)) { - console.log(' • ' + ' (no ' + icudat + ' at ‘' + datPath+'’)'); - } else { - try { - fs.linkSync(datPath, icudat); - console.log(' √ ' + icudat + " (link)"); - } catch(e) { - fs.symlinkSync(datPath, icudat); - console.log(' √ ' + icudat + " (symlink)"); - } - } - if(!fullIcu.haveDat()) { - throw Error('Somehow failed to install ' + icudat); - } else { - advice(); - } - } -}; + if (spawned.error) { + throw (spawned.error) + } else if (spawned.status !== 0) { + throw (Error(cmdPath + ' ' + args.join(' ') + ' --> status ' + spawned.status)) + } else { + let datPath + if (isglobal) { + datPath = path.join('..', 'icu4c-data', icudat) + } else { + datPath = path.join('node_modules', 'icu4c-data', icudat) + } + if (fs.existsSync(icudat)) { + console.log(' √ ' + icudat + ' (existing link?)') + } else if (!fs.existsSync(datPath)) { + console.log(' • ' + ' (no ' + icudat + ' at ‘' + datPath + '’)') + } else { + try { + fs.linkSync(datPath, icudat) + console.log(' √ ' + icudat + ' (link)') + } catch (e) { + fs.symlinkSync(datPath, icudat) + console.log(' √ ' + icudat + ' (symlink)') + } + } + if (!fullIcu.haveDat()) { + throw Error('Somehow failed to install ' + icudat) + } else { + advice() + } + } +} diff --git a/node-icu-data.js b/node-icu-data.js index ab38a16..db2f2dd 100644 --- a/node-icu-data.js +++ b/node-icu-data.js @@ -1,11 +1,10 @@ #!/usr/bin/env node // Copyright (C) 2015 IBM Corporation and Others. All Rights Reserved. -var fullIcu = require('./full-icu'); +const fullIcu = require('./full-icu') -if(!fullIcu.datPath) { - throw Error('Full data path not available'); +if (!fullIcu.datPath) { + throw Error('Full data path not available') } else { - console.log(fullIcu.datPath()); + console.log(fullIcu.datPath()) } - diff --git a/package.json b/package.json index 834bc00..000b6e7 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "1.3.5-0", "description": "install 'full-icu' data for your current node", "scripts": { + "lint": "standard", "postinstall": "node postinstall.js" }, "keywords": [ @@ -20,5 +21,8 @@ }, "bugs": { "url": "https://github.com/unicode-org/full-icu-npm/issues" + }, + "devDependencies": { + "standard": "^16.0.3" } } diff --git a/postinstall.js b/postinstall.js index 27e44c7..c4241b4 100644 --- a/postinstall.js +++ b/postinstall.js @@ -1,74 +1,73 @@ // Copyright (C) 2015 IBM Corporation and Others. All Rights Reserved. -var fs = require('fs'); -var path = require('path'); -var fullIcu = require('./full-icu'); +const fs = require('fs') +const path = require('path') +const fullIcu = require('./full-icu') +const myname = process.env.npm_package_name || 'full-icu' -var myname = process.env.npm_package_name || 'full-icu'; - -function exit(reason) { - console.log(reason); - process.exit(0); +function exit (reason) { + console.log(reason) + process.exit(0) } if (fullIcu.oldNode) { - exit('Not sure how to handle node < 0.12. Exitting.'); + exit('Not sure how to handle node < 0.12. Exitting.') } else if (fullIcu.noi18n) { - exit('Note: Your node was not compiled with i18n support. Nothing to do, Exitting.'); + exit('Note: Your node was not compiled with i18n support. Nothing to do, Exitting.') } else if (fullIcu.icu_system) { - exit('Note: Your node was compiled to link against an ' + - 'externally-provided ICU, so the locale data is not customizable ' + - 'through this script. Exitting.'); + exit('Note: Your node was compiled to link against an ' + + 'externally-provided ICU, so the locale data is not customizable ' + + 'through this script. Exitting.') } else if (!fullIcu.icu_small) { - // maybe already full icu, or some as-yet-unforseen case. - exit('Note: Your node was not compiled with the ‘small-icu’ case,' + - ' so the ICU data is not customizable through this script. Exitting.'); -} else if( fullIcu.icumaj < 54 ) { - // This is kind of a sanity check that the ICU version is correct. - // ICU 54 was what Node v0.12 started with. - throw Error('Don’t know how to work with ICU version ' + fullIcu.icumaj + ', sorry.'); + // maybe already full icu, or some as-yet-unforseen case. + exit('Note: Your node was not compiled with the ‘small-icu’ case,' + + ' so the ICU data is not customizable through this script. Exitting.') +} else if (fullIcu.icumaj < 54) { + // This is kind of a sanity check that the ICU version is correct. + // ICU 54 was what Node v0.12 started with. + throw Error('Don’t know how to work with ICU version ' + fullIcu.icumaj + ', sorry.') } -var cwd = fs.realpathSync('.'); +const cwd = fs.realpathSync('.') -var isglobal = process.env.npm_config_global === 'true'; +const isglobal = process.env.npm_config_global === 'true' -var relpath = isglobal ? cwd : path.join('node_modules',myname); +const relpath = isglobal ? cwd : path.join('node_modules', myname) -function advice() { - if( fullIcu.nodeDetectIcu ) { - console.log('Note: If you manually copy ' + path.join(relpath,fullIcu.icudat) + ' to the directory ' + - path.normalize(path.join(relpath,'..','.node-icu')) - + ' node will automatically detect this data.'); - if(fullIcu.nodeDetectIcu === 'maybe') { - console.log(' - at least when https://github.com/nodejs/node/issues/3460 lands'); - } - } +function advice () { + if (fullIcu.nodeDetectIcu) { + console.log('Note: If you manually copy ' + path.join(relpath, fullIcu.icudat) + ' to the directory ' + + path.normalize(path.join(relpath, '..', '.node-icu')) + + ' node will automatically detect this data.') + if (fullIcu.nodeDetectIcu === 'maybe') { + console.log(' - at least when https://github.com/nodejs/node/issues/3460 lands') + } + } - if(fullIcu.nodeDetectIcu !== true) { - console.log('Node will use this ICU datafile if the environment variable NODE_ICU_DATA is set to “'+relpath+'”'); - console.log('or with node --icu-data-dir='+relpath+' YOURAPP.js' ); + if (fullIcu.nodeDetectIcu !== true) { + console.log('Node will use this ICU datafile if the environment variable NODE_ICU_DATA is set to “' + relpath + '”') + console.log('or with node --icu-data-dir=' + relpath + ' YOURAPP.js') - var asJson = {scripts: { start: "node --icu-data-dir="+relpath + " YOURAPP.js" }}; - console.log(" For package.json:"); - console.log(JSON.stringify(asJson)); - } - console.log(""); - console.log("By the way, if you have full data, running this in node:"); - // 9E8 is 10 days into January, so TimeZone independent - console.log("> new Intl.DateTimeFormat('es',{month:'long'}).format(new Date(9E8));"); - console.log("... will show “enero”. If it shows “January” you don't have full data."); + const asJson = { scripts: { start: 'node --icu-data-dir=' + relpath + ' YOURAPP.js' } } + console.log(' For package.json:') + console.log(JSON.stringify(asJson)) + } + console.log('') + console.log('By the way, if you have full data, running this in node:') + // 9E8 is 10 days into January, so TimeZone independent + console.log("> new Intl.DateTimeFormat('es',{month:'long'}).format(new Date(9E8));") + console.log("... will show “enero”. If it shows “January” you don't have full data.") } // install by using spawn -var npmInstall = require('./install-spawn'); +const npmInstall = require('./install-spawn') -if(fs.existsSync(fullIcu.icudat)) { - console.log('√ ' + fullIcu.icudat + ' Already there (for Node ' + fullIcu.nodever + ' and small-icu ' + fullIcu.icuver + ')'); - advice(); +if (fs.existsSync(fullIcu.icudat)) { + console.log('√ ' + fullIcu.icudat + ' Already there (for Node ' + fullIcu.nodever + ' and small-icu ' + fullIcu.icuver + ')') + advice() } else { - console.log('npm install ' + fullIcu.icupkg + ' (Node ' + fullIcu.nodever + ' and small-icu ' + fullIcu.icuver + ') -> ' + fullIcu.icudat); - npmInstall(fullIcu, advice); + console.log('npm install ' + fullIcu.icupkg + ' (Node ' + fullIcu.nodever + ' and small-icu ' + fullIcu.icuver + ') -> ' + fullIcu.icudat) + npmInstall(fullIcu, advice) } -console.log('News: Please see https://github.com/icu-project/full-icu-npm/issues/6'); +console.log('News: Please see https://github.com/icu-project/full-icu-npm/issues/6')