Closed pmuellr closed 6 years ago
I was wondering about that...we might want to use browserify/webpack to create an app bundle with the private dependencies inlined.
@brycebaril do you have experience publishing CLI tools with currently-private code? My preference would be actually to open source those repos, but if we can't, we might need to bundle and obfuscate.
Or, we don't "publish" this, since it will only work for professional plans, and offer a curl | bash
installation path (like nsolid) instead of putting it on npm?
cc @cxreg
We're able to create a self contained bundle via
$ browserify --node --ignore-missing bin/ncm-ci.js | node
Usage
$ cd node-project
$ NCM_TOKEN=token ncm-ci
$ echo $?
And with light obfuscation:
$ browserify --node --ignore-missing -t [ uglifyify ] bin/ncm-ci.js | node
Usage
$ cd node-project
$ NCM_TOKEN=token ncm-ci
$ echo $?
$ head -n3 bundle.js
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
"use strict";const analyze=require("@ns-private/ncm-analyze-tree"),graphql=require("@ns-private/graphql"),chalk=require("chalk"),fetch=require("node-fetch");process.env.NCM_TOKEN||(console.error("\n Usage\n $ cd node-project\n $ NCM_TOKEN=token ncm-ci\n $ echo $?\n "),process.exit(1));const token=process.env.NCM_TOKEN,api={ncm:process.env.NCMAPI_URL||"https://api.nodesource.com/ncm2/api/v1",accounts:process.env.ACCOUNTSAPI_URL||"https://api.nodesource.com/accounts"},getWhitelist=async({organizationId:e})=>{const o=new Set,s=await graphql({token:token,url:api.ncm},"\n query($organizationId: String!) {\n policies(organizationId: $organizationId) {\n whitelist {\n name\n version\n }\n }\n }\n ",{organizationId:e});for(const e of s.policies)for(const s of e.whitelist)o.add(`${s.name}@${s.version}`);return o},getUserDetails=async()=>{const e=await fetch(`${api.accounts}/user/details`,{headers:{Authorization:`Bearer ${token}`}}),o=await e.json();return o.permissions&&o.permissions.includes("ncm:policy:read")&&o.permissions.includes("ncm:cert:read")||(console.error("Insufficient permissions. Your token needs at least:"),console.log("- ncm:policy:read"),console.log("- ncm:cert:read"),process.exit(1)),o},main=async()=>{const{orgId:e}=await getUserDetails(),o=await getWhitelist({organizationId:e}),s=await analyze({dir:process.cwd(),token:token}),t=require(`${process.cwd()}/package.json`),n={pass:new Set,whitelisted:new Set,fail:new Set};for(const e of s)if(e.published){(o.has(`${e.name}@${e.version}`)?n.whitelisted:e.score<=85?n.fail:n.pass).add(e)}if(console.log(`${chalk.bold("NCM")}`),console.log(`${chalk.grey.bold(t.name)} ${chalk.grey(`v${t.version}`)}`),console.log(`Pass: ${chalk(n.pass.size)}, Whitelisted: ${chalk(n.whitelisted.size)}, Fail: ${chalk(n.fail.size)}`),console.log(),console.log(` ${chalk.red.bold("L")}${chalk.grey("icense")}`),console.log(` ${chalk.red.bold("V")}${chalk.grey("ulnerability")}`),console.log(` ${chalk.red.bold("U")}${chalk.grey("nlicensed")}`),console.log(),n.fail.size){const e=[...n.fail].sort((e,o)=>e.name.localeCompare(o.name));for(const o of e)process.stdout.write(String(o.score||0).padStart(5)),process.stdout.write(" "),o.results.find(e=>"license"===e.name)?process.stdout.write(chalk.red.bold("L")):process.stdout.write(" "),o.vulnerabilities.length?process.stdout.write(chalk.red.bold("V")):process.stdout.write(" "),o.results.length||o.vulnerabilities.length?process.stdout.write(" "):process.stdout.write(chalk.red.bold("U")),process.stdout.write(" "),process.stdout.write(o.name),process.stdout.write(chalk.grey(` v${o.version} `)),process.stdout.write("\n");console.log(),process.exit(1)}else console.log(chalk.green(" All good!")),console.log(),process.exit(0)};main().catch(e=>{console.error(e),process.exit(1)});
More powerful tools like https://github.com/javascript-obfuscator/javascript-obfuscator can also be evaluated for stronger obfuscation:
$ npx javascript-obfuscatory bundle.js
$ cat bundle-obfuscated.js
var _0x4578=['./parser','LICENSE','PLUS','DOCUMENTREF','COLON','WITH','EXCEPTION','AND','OPEN','CLOSE','plus','and','recoverable','setInput','lexer','parser','yylloc','ranges','parseError','defaultActions','terminals_','showPosition','Parse\x20error\x20on\x20line\x20','\x0aExpecting\x20',',\x20got\x20\x27',':\x20Unexpected\x20','end\x20of\x20input','yylineno','Parse\x20Error:\x20multiple\x20actions\x20possible\x20at\x20state:\x20','yytext','yyleng','productions_','last_line','first_column','last_column','performAction','_input','_more','_backtrack','matched','conditionStack','INITIAL','offset','first_line','backtrack_lexer','.\x20You\x20can\x20only\x20invoke\x20reject()\x20in\x20the\x20lexer\x20when\x20the\x20lexer\x20is\x20of\x20the\x20backtracking\x20persuasion\x20(options.backtrack_lexer\x20=\x20true).\x0a','pastInput','upcomingInput','_currentRules','rules','test_match','.\x20Unrecognized\x20text.\x0a','conditions','begin','Parser','Usage:\x20','readFileSync','main','Glide','Abstyles','AFL-1.1','AFL-1.2','AFL-2.0','AFL-2.1','AFL-3.0','AMPAS','APL-1.0','Adobe-Glyph','AGPL-1.0','Afmparse','Aladdin','ANTLR-PD','Apache-1.0','Apache-1.1','AML','APSL-1.0','APSL-2.0','Artistic-1.0','Artistic-1.0-Perl','Artistic-1.0-cl8','AAL','Bahyph','Barr','BitTorrent-1.0','BitTorrent-1.1','Borceux','BSD-2-Clause-FreeBSD','BSD-2-Clause-NetBSD','BSD-3-Clause-Clear','BSD-4-Clause','BSD-Protection','BSD-Source-Code','BSD-3-Clause-Attribution','BSD-4-Clause-UC','bzip2-1.0.6','Caldera','CECILL-1.0','CECILL-1.1','CECILL-2.0','CECILL-2.1','CECILL-B','CECILL-C','ClArtistic','CNRI-Python','CDDL-1.1','CPL-1.0','CATOSL-1.1','Condor-1.1','CC-BY-1.0','CC-BY-2.5','CC-BY-4.0','CC-BY-ND-1.0','CC-BY-ND-2.0','CC-BY-ND-3.0','CC-BY-ND-4.0','CC-BY-NC-1.0','CC-BY-NC-3.0','CC-BY-NC-4.0','CC-BY-NC-ND-2.0','CC-BY-NC-ND-2.5','CC-BY-NC-SA-2.0','CC-BY-NC-SA-2.5','CC-BY-NC-SA-3.0','CC-BY-NC-SA-4.0','CC-BY-SA-2.0','CC-BY-SA-3.0','CC-BY-SA-4.0','CC0-1.0','Crossword','CUA-OPL-1.0','Cube','D-FSL-1.0','diffmark','DOC','DSDP','dvipdfm','ECL-2.0','eGenix','EFL-2.0','MIT-advertising','MIT-enna','EUPL-1.0','EUPL-1.1','Eurosym','Fair','MIT-feh','Frameworx-1.0','FTL','FSFAP','FSFUL','FSFULLR','Giftware','GL2PS','Glulxe','GFDL-1.1','GFDL-1.2','GPL-1.0','LGPL-2.1','LGPL-3.0','LGPL-2.0','gSOAP-1.3b','HaskellReport','IPL-1.0','ICU','ImageMagick','iMatix','Imlib2','IJG','Info-ZIP','Intel-ACPI','Intel','IPA','JasPer-2.0','JSON','LPPL-1.0','LPPL-1.3a','Latex2e','BSD-3-Clause-LBNL','Leptonica','Libpng','libtiff','LAL-1.3','LiLiQ-P-1.1','LiLiQ-Rplus-1.1','LiLiQ-R-1.1','LPL-1.02','LPL-1.0','MakeIndex','MTLL','MS-RL','MirOS','MITNFA','Motosoto','MPL-1.1','MPL-2.0','MPL-2.0-no-copyleft-exception','mpich2','Mup','NGPL','NOSL','NPL-1.1','Newsletr','Nokia','NLOD-1.0','NRL','NTP','Nunit','OCLC-2.0','ODbL-1.0','PDDL-1.0','OCCT-PL','OGTSL','OLDAP-1.1','OLDAP-1.3','OLDAP-2.0.1','OLDAP-2.1','OLDAP-2.2','OLDAP-2.2.1','OLDAP-2.4','OLDAP-2.5','OLDAP-2.6','OLDAP-2.8','OPL-1.0','OSL-1.0','OSL-2.0','OSL-3.0','OpenSSL','OSET-PL-2.1','PHP-3.0','PHP-3.01','Plexus','psfrag','Python-2.0','QPL-1.0','Qhull','Rdisc','RPL-1.5','RHeCos-1.1','RSCPL','RSA-MD','Ruby','SAX-PD','SCEA','SWL','SMPPL','Sendmail','SGI-B-2.0','OFL-1.0','OFL-1.1','SNIA','Spencer-86','Spencer-94','SMLNJ','SugarCRM-1.1.3','SISSL','SISSL-1.2','SPL-1.0','Watcom-1.0','TCL','TOSL','Unicode-TOU','UPL-1.0','NCSA','Vim','VOSTROM','VSL-1.0','W3C-19980720','W3C','Wsuipa','Xnet','X11','Xerox','XFree86-1.1','xinetd','XSkat','YPL-1.0','YPL-1.1','Zed','Zend-2.0','Zimbra-1.3','ZPL-1.1','ZPL-2.0','ZPL-2.1','eCos-2.0','GPL-2.0-with-autoconf-exception','GPL-2.0-with-bison-exception','GPL-2.0-with-classpath-exception','GPL-2.0-with-font-exception','GPL-2.0-with-GCC-exception','GPL-3.0-with-autoconf-exception','GPL-3.0-with-GCC-exception','StandardML-NJ','WXwindows','CIRCLECI','APPVEYOR','GITLAB_CI','truecolor','TERM_PROGRAM','TERM_PROGRAM_VERSION','spdx-expression-parse','spdx-correct','license\x20should\x20be\x20','\x22UNLICENSED\x22,\x20or\x20','DocumentRef','left','right','UNLICENSED','warnings','license\x20is\x20similar\x20to\x20the\x20valid\x20expression\x20\x22','need\x20wrapper\x20function','Cannot\x20find\x20module\x20\x27','code','call','exports','function','length','@ns-private/ncm-analyze-tree','@ns-private/graphql','node-fetch','env','NCM_TOKEN','NCMAPI_URL','https://api.nodesource.com/ncm2/api/v1','policies','whitelist','name','version','accounts','/user/details','Bearer\x20','json','permissions','includes','error','Insufficient\x20permissions.\x20Your\x20token\x20needs\x20at\x20least:','log','-\x20ncm:policy:read','cwd','published','whitelisted','fail','bold','NCM','grey','pass','size',',\x20Whitelisted:\x20',',\x20Fail:\x20','\x20\x20\x20\x20\x20\x20','red','\x20\x20\x20\x20\x20\x20\x20','ulnerability','\x20\x20\x20\x20\x20\x20\x20\x20','localeCompare','stdout','write','score','results','vulnerabilities','exit','\x20\x20All\x20good!','catch','undefined','util','read-package-tree','semver','@ns-private/universal-module-tree','map','add','/package-lock.json','valid','get','set','data','has','children','top','readFile','parse','entries','exec','package','{\x0a\x20\x20\x20\x20','\x0a\x20\x20\x20\x20\x20\x20pkg',':\x20package(name:\x20\x22','\x22)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20name\x0a\x20\x20\x20\x20\x20\x20\x20\x20published\x0a\x20\x20\x20\x20\x20\x20\x20\x20versions(version:\x20\x22','join','\x0a\x20\x20}','values','versions','value','string','token','request','object','test','NODE_DEBUG','prototype','slice','unshift','SEMVER','apply','SEMVER_SPEC_VERSION','2.0.0','src','0|[1-9]\x5cd*','[0-9]+','\x5cd*[a-zA-Z-][a-zA-Z0-9-]*',')\x5c.','(?:','(?:\x5c.',')*))','(?:-?(','[0-9A-Za-z-]+','(?:\x5c+(','[v=\x5cs]*','((?:<|>)?=?)','|x|X|\x5c*','[v=\x5cs]*(','(?:\x5c.(',')?)?','\x5cs*','(?:^|[^\x5cd])','(\x5cd{1,','(?:\x5c.(\x5cd{1,','}))?','(?:$|[^\x5cd])','(?:~>?)','(\x5cs*)','\x5cs+','$1~','\x5cs*(',')$|^$','\x5cs+-\x5cs+','\x5cs*$','(<|>)?=?\x5cs*\x5c*','clean','trim','replace','SemVer','loose','Invalid\x20Version:\x20','version\x20is\x20longer\x20than\x20','\x20characters','raw','major','patch','minor','Invalid\x20minor\x20version','Invalid\x20patch\x20version','prerelease','split','format','toString','compare','compareMain','comparePre','inc','premajor','pre','prepatch','number','push','invalid\x20increment\x20argument:\x20','diff','rcompareIdentifiers','rcompare','sort','rsort','neq','gte','lte','cmp','===','Invalid\x20operator:\x20','Comparator','comparator','operator','match','Invalid\x20comparator:\x20','Comparator.test','intersects','a\x20Comparator\x20is\x20required','parseRange','filter','Invalid\x20SemVer\x20Range:\x20','range','hyphen\x20replace','comparator\x20trim','a\x20Range\x20is\x20required','every','some','toComparators','comp','caret','xrange','toLowerCase','tilde','.0.0\x20<','.0.0','.0\x20<','replaceTilde\x20pr','charAt','tilde\x20return','replaceCaret\x20pr','replaceXRanges','xRange','xRange\x20return','satisfies','maxSatisfying','minSatisfying','forEach','ltr','gtr','Must\x20provide\x20a\x20hilo\x20val\x20of\x20\x22<\x22\x20or\x20\x22>\x22','>=0.0.0','coerce','/yarn.lock','requires','dependencies','TODO','keys','optionalDependencies','stat','defineProperty','__esModule','default','hasOwnProperty','path','done','next','MessageError','SecurityError','ProcessTermError','responseCode','readFirstAvailableStream','hardlinksWork','writeFilePreservingEol','getFileSizeOnDisk','walk','symlink','find','readJsonAndFile','readJson','readFileAny','hardlinkBulk','copyBulk','unlink','chmod','lstat','exists','mkdirp','rename','readdir','realpath','readlink','writeFile','open','lockQueue','constants','dest','type','onFresh','verbose','dirname','ignoreBasenames','indexOf','basename','isDirectory','isSymbolicLink','isFile','verboseFileSkipArtifact','fileDatesEqual','mtime','verboseFileSkip','verboseFileSkipSymlink','src\x20files\x20not\x20initialised','isArray','iterator','lang','verboseFileFolder','sep','pop','file','atime','mode','unsure\x20how\x20to\x20copy\x20this:\x20','artifactFiles','onDone','onProgress','splice','all','verboseFilePhantomExtraneous','delete','ino','link','onStart','possibleExtraneous','queue','verboseFileCopy','copyFile','resolve','linkname','removeDest','message','platform','win32','junction','relative','realpathSync','ENOENT','concat','blksize','EOL','test-file','random','makeTempDir','tmpdir','yarn-','now','createReadStream','X_OK','folder','skipped','copy','readFileRaw','normalizeOS','R_OK','W_OK','fs\x20lock','readFileBuffer','promisify','access','glob','charCodeAt','getCacheDir','getConfigDir','getDataDir','devDependencies','peerDependencies','resolutions','MANIFEST_FIELDS','SUPPORTED_NODE_VERSIONS','^4.8.0\x20||\x20^5.7.0\x20||\x20^6.2.2\x20||\x20>=8.0.0','https://registry.yarnpkg.com','YARN_DOCS','https://yarnpkg.com/en/docs/cli/','YARN_INSTALLER_SH','https://yarnpkg.com/install.sh','YARN_INSTALLER_MSI','https://yarnpkg.com/latest.msi','NETWORK_CONCURRENCY','CHILD_CONCURRENCY','_uid','getuid','.yarn-cache','PREFERRED_MODULE_CACHE_DIRECTORIES','CONFIG_DIRECTORY','DATA_DIRECTORY','global','execPath','YARN_BIN_PATH','bin','yarn.js','NODE_MODULES_FOLDER','node_modules','NODE_PACKAGE_JSON','package.json','DESTDIR','/usr/local','.yarn','META_FOLDER','.yarn-meta','INTEGRITY_FILENAME','.yarn-integrity','LOCKFILE_FILENAME','yarn.lock','METADATA_FILENAME','.yarn-metadata.json','TARBALL_FILENAME','.yarn-tarball.tgz','CLEAN_FILENAME','.yarnclean','NPM_LOCK_FILENAME','package-lock.json','NPM_SHRINKWRAP_FILENAME','npm-shrinkwrap.json','DEFAULT_INDENT','SINGLE_INSTANCE_PORT','SINGLE_INSTANCE_FILENAME','PATH','VERSION_COLOR_SCHEME','yellow','green','NODE_ENV','invariant\x20requires\x20an\x20error\x20message\x20argument','for\x20the\x20full\x20error\x20message\x20and\x20additional\x20helpful\x20warnings.','Invariant\x20Violation','framesToPop','crypto','Math','return\x20this','sortAlpha','removePrefix','addSuffix','camelCase','compareSortedArrays','sleep','min','startsWith','endsWith','wks','Symbol','Symbol.','store','stringify','implodeEntry','explodeEntry','normalizePattern','resolved','reference','hash','integrity','uid','registry','npm','isIntegrity','source','cache','parseResultType','hasEntriesExistWithoutIntegrity','fromDirectory','merge','info','warn','lockfileConflict','noLockfileFound','getLocked','removePattern','getLockfile','_remote','Package\x20is\x20missing\x20a\x20reference','Package\x20is\x20missing\x20a\x20remote','stream','setPrototypeOf','assert','2.5.7','latest','shift','from','alloc','allocUnsafe','Buffer','Argument\x20must\x20not\x20be\x20a\x20number','Argument\x20must\x20be\x20a\x20number','fill','allocUnsafeSlow','then','virtual','inherits','home','homedir','/usr/local/share','\x20is\x20not\x20a\x20function!','Accessors\x20not\x20supported!','events','Transform','sha256','sha384','sha512','isHash','strict','algorithm','digest','options','base64','hex','toJSON','hexDigest','pickAlgorithm','reduce','single','fromHex','algorithms','createHash','update','Promise','pipe','end','checkData','assign','No\x20valid\x20integrity\x20hashes\x20to\x20check\x20against','EINTEGRITY','\x0a\x20\x20Found:\x20','EBADSIZE','found','sri',':\x20Wanted\x20','.\x20(','expected','checkStream','verified','integrityStream','stream\x20size\x20mismatch\x20when\x20checking\x20','emit','\x20integrity\x20checksum\x20failed\x20when\x20using\x20',':\x20wanted\x20','md5','whirlpool','sha1','sha3-256','sha3-512','sha3_256','sha3_384','GLOBSTAR','(?:(?!(?:','))[^/]*?)','[^/]','(?:(?!(?:\x5c/|^)(?:\x5c.{1,2})($|\x5c/)).)*?','(?:(?!(?:\x5c/|^)\x5c.).)*?','().*{}+?[]^$\x5c!','defaults','minimatch','Minimatch','glob\x20pattern\x20string\x20required','nocomment','negate','comment','make','debug','pattern','empty','braceExpand','globParts','parseNegate','nonegate','substr','undefined\x20pattern','nobrace','pattern\x20is\x20too\x20long','nocase','dot','(?!(?:^|\x5c/)\x5c.{1,2}(?:$|\x5c/))','(?!\x5c.)','%s\x09%s\x20%s\x20%j','%s\x09%s\x20%s\x20%j\x20<--\x20stateChar','call\x20clearStateChar\x20%j','close','plType\x20%j\x20%j','reEnd','reStart','setting\x20tail','tail=%j\x0a\x20\x20\x20%s','(?=.)','_src','makeRe','regexp','noglobstar','^(?:','^(?!','nonull','matchOne','flipNegate','matchOne\x20loop','**\x20at\x20the\x20end','\x0aglobstar\x20while','globstar\x20found\x20match!','dot\x20detected!','\x0a>>>\x20no\x20match,\x20partial?','pattern\x20match','wtf?','\x5c$&','proto','once','onceStrict','called','Function\x20wrapped\x20with\x20`once`','onceError','buffer','Can\x27t\x20call\x20method\x20on\x20\x20','document','createElement','promise','Bad\x20Promise\x20constructor','reject','toStringTag','ceil','floor','EventEmitter','alphasort','alphasorti','childrenIgnored','callback\x20provided\x20to\x20sync\x20glob','sync','GlobSync','hasMagic','noprocess','Glob','matches','_processing','_emitQueue','_processQueue','paused','nextTick','_finish','aborted','_didRealpath','_realpath','_realpathSet','create','_makeAbs','syscall','_mark','mark','makeAbs','abort','pause','resume','_emitMatch','_process','_processSimple','_processReaddir','_processReaddir2','_glob','nomount','root','absolute','nodir','statCache','_readdirInGlobStar','follow','_readdir','lstat ','FILE','readdir ','symlinks','_readdirEntries','_readdirError','\x20invalid\x20cwd\x20','UNKNOWN','silent','glob\x20error','_processGlobStar','_processGlobStar2','_stat','_processSimple2','maxLength','DIR','stat ','_stat2','ENOTDIR','posix','tty','lockfile','BOOLEAN','EOF','COMMENT','INDENT','INVALID','NUMBER','COMMA','newline','Invalid\x20number\x20of\x20spaces','indent','invalid','boolean','colon','comma','eof','comments','tokens','fileLoc','onComment','LOCKFILE_VERSION','Can\x27t\x20install\x20from\x20a\x20lockfile\x20of\x20version\x20','\x20as\x20you\x27re\x20on\x20an\x20old\x20yarn\x20version\x20that\x20only\x20supports\x20','.\x20Run\x20`$\x20yarn\x20self-update`\x20to\x20upgrade\x20to\x20the\x20latest\x20version.','expected\x20a\x20token','No\x20more\x20tokens','unexpected','Unexpected\x20token','col','eat','Expected\x20a\x20key','Expected\x20string','Invalid\x20value\x20type','Unknown\x20token:\x20','=======','<<<<<<<','yarn','concurrencyQueue','maxConcurrency','runningCount','alias','first','stuckTick','bind','stuckTimer','unref','The\x20','without\x20any\x20activity\x20with\x201\x20worker:\x20','running','stillActive','warnedStuck','\x20blocking\x20queue\x20finally\x20resolved.\x20Nothing\x20to\x20worry\x20about.','factory','shiftConcurrencyQueue','maybePushConcurrencyQueue','Undefined','Null','Object','callee','Arguments','constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf','documentElement','\x20Iterator','constructor','__core-js_shared__','pure','©\x202018\x20Denis\x20Pushkarev\x20(zloirock.ru)','species','process','setImmediate','clearImmediate','MessageChannel','Dispatch','onreadystatechange','port2','onmessage','postMessage','addEventListener','script','removeChild','Symbol(','disable','enable','enabled','humanize','instances','names','skips','formatters','colors','abs','prev','curr','formatArgs','namespace','useColors','color','destroy','init','save','.*?','stack','monkeypatch','unmonkeypatch','ELOOP','ENOMEM','ENAMETOOLONG','setopts','ownProp','finish','isIgnored','ignore','/**','matchBase','**/','realpathCache','nounique','nosort','changedCwd','cwdAbs','globSet','matcher','gmatcher','0777','umask','mkdir','mkdirSync','statSync','propertyIsEnumerable','String','unknown','BSD-2-Clause','📦🐈\x20Fast,\x20reliable,\x20and\x20secure\x20dependency\x20management.','^2.2.4','^6.26.0','^3.0.0','^4.0.0','^2.1.0','^2.9.0','^1.0.0','^7.1.1','^1.4.0','^0.8.0','^3.0.1','^2.2.0','^2.0.0','^1.0.10','^1.2.0','^0.5.1','^1.6.1','^1.2.1','^0.11.2','^1.0.7','^2.87.0','^5.1.0','^5.3.0','^1.16.0','^7.2.3','^6.2.5','^2.0.3','^1.6.0','^6.23.0','^6.0.0','^6.5.0','^4.3.0','^22.0.0','^2.35.0','^2.6.2','^21.0.0','^2.1.2','^7.1.0','^0.0.24','^0.10.0','^7.0.0','^2.0.1','^3.0.7','^5.0.0','^22.4.4','^0.12.6','^3.0.4','^1.5.2','^2.1.0-beta.25','^1.14.2','>=4.0.0','yarnpkg/yarn','./bin/yarn.js','gulp\x20build','node\x20./scripts/build-webpack.js','powershell\x20./scripts/build-chocolatey.ps1','./scripts/build-deb.sh','scripts\x5cbuild-windows-installer.bat','git-release-notes\x20$(git\x20describe\x20--tags\x20--abbrev=0\x20$(git\x20describe\x20--tags\x20--abbrev=0)^)..$(git\x20describe\x20--tags\x20--abbrev=0)\x20scripts/changelog.md','yarn\x20jsinspect\x20./src','eslint\x20src\x20__tests__\x20--fix','./scripts/release-branch.sh','yarn\x20lint\x20&&\x20yarn\x20test-only','node\x20--max_old_space_size=4096\x20node_modules/jest/bin/jest.js\x20--verbose','node\x20--inspect-brk\x20--max_old_space_size=4096\x20node_modules/jest/bin/jest.js\x20--runInBand\x20--verbose','node\x20--max_old_space_size=4096\x20node_modules/jest/bin/jest.js\x20--coverage\x20--verbose','git-cz','src/**/*.js','node','__tests__/fixtures/','dist/','__tests__/(fixtures|__mocks__)/','_(temp|mock|install|init|helpers).js$','packages/pkg-tests','./node_modules/cz-conventional-changelog','true','false','topLevel','#\x20THIS\x20IS\x20AN\x20AUTOGENERATED\x20FILE.\x20DO\x20NOT\x20EDIT\x20THIS\x20FILE\x20DIRECTLY.','#\x20yarn\x20lockfile\x20v','#\x20yarn\x20v','futimes','getTime','isFakeRoot','isRootUser','FAKEROOTKEY','.config','.cache','Data','XDG_DATA_HOME','Local','Yarn','Cache','XDG_CACHE_HOME','Library','Caches','Config','XDG_CONFIG_HOME','LOCALAPPDATA',' SLASH',' OPEN',' CLOSE',' COMMA','body','post','\x5c{\x5c}','max','fromCharCode','toUpperCase','\x20is\x20not\x20iterable!','BREAK','Array','return','MutationObserver','WebKitMutationObserver','domain','enter','navigator','standalone','createTextNode','observe','iframe','display','appendChild','javascript:','contentWindow','document.F=Object','/script','defineProperties','IE_PROTO','valueOf','Can\x27t\x20convert\x20object\x20to\x20primitive\x20value','userAgent','TypeError','6.6','Chrome/66','Promise-chain\x20cycle','unhandledRejection','onunhandledrejection','Unhandled\x20promise\x20rejection','Promise\x20can\x27t\x20be\x20resolved\x20itself','C
we decided to just open source all of this :)
Presumably
ncm-ci
will be going public some day, so we'll need to remove the private deps we currently have:https://github.com/nodesource/ncm-ci/blob/b5ff75811657b03b2a06034e0f92ab5f802d0565/package.json#L15-L16
There's also
@ns-private/check-deps
in dev deps.