@bitblit/ratchet-node-only 4.0.405-alpha → 4.0.407-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/lib/index.mjs +1 -1
  2. package/package.json +2 -2
package/lib/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import e from"fs";import{GlobalRatchet as t,RequireRatchet as r,Logger as s,ErrorRatchet as n,StringRatchet as a,EsmRatchet as i,BooleanRatchet as o,MapRatchet as l}from"@bitblit/ratchet-common";import{DateTime as c}from"luxon";import u from"path";import m from"cross-fetch";import f from"util";import d from"child_process";import{parse as g}from"csv-parse";import{stringify as h}from"csv-stringify";import{Readable as p,Writable as b}from"stream";class y{constructor(){}static buildInformation(){return{version:"405",hash:"5f161922fcda1ba1c49f85f07bd92ae45bf18592",branch:"alpha-2024-06-29-1",tag:"alpha-2024-06-29-1",timeBuiltISO:"2024-06-29T19:47:15-0700",notes:"No notes"}}}class C{static DEFAULT_TIME_FORMAT="yyyy-MM-dd HH:mm:ss a z";static DEFAULT_TIME_ZONE="America/Los_Angeles";static createTestingCiRunInformation(e=C.DEFAULT_TIME_ZONE){const t=(new Date).toISOString();return{buildNumber:"Test_buildNumberVar_"+t,localTime:c.local().setZone(e).toFormat(C.DEFAULT_TIME_FORMAT),branch:"Test_branchVar_"+t,tag:"Test_tagVar_"+t,commitHash:"Test_hashVar_"+t,userName:"Test_userNameVar_"+t,projectName:"Test_projectNameVar_"+t}}static createDefaultCircleCiRunInformation(e=C.DEFAULT_TIME_ZONE){return{buildNumber:t.fetchGlobalVar("CIRCLE_BUILD_NUM"),branch:t.fetchGlobalVar("CIRCLE_BRANCH"),tag:t.fetchGlobalVar("CIRCLE_TAG"),commitHash:t.fetchGlobalVar("CIRCLE_SHA1"),localTime:c.local().setZone(e).toFormat(C.DEFAULT_TIME_FORMAT),userName:t.fetchGlobalVar("CIRCLE_USERNAME"),projectName:t.fetchGlobalVar("CIRCLE_PROJECT_REPONAME")}}static createDefaultGithubActionsRunInformation(e=C.DEFAULT_TIME_ZONE){return{buildNumber:t.fetchGlobalVar("GITHUB_RUN_NUMBER"),branch:t.fetchGlobalVar("GITHUB_REF_NAME"),tag:t.fetchGlobalVar("GITHUB_REF_NAME"),commitHash:t.fetchGlobalVar("GITHUB_SHA"),localTime:c.local().setZone(e).toFormat(C.DEFAULT_TIME_FORMAT),userName:t.fetchGlobalVar("GITHUB_ACTOR"),projectName:t.fetchGlobalVar("GITHUB_REPOSITORY")}}}class A{static async process(t,a,i="405",o="alpha-2024-06-29-1",l="5f161922fcda1ba1c49f85f07bd92ae45bf18592",c="alpha-2024-06-29-1",u="LOCAL-TIME"){if(r.notNullOrUndefined(a,"cfg"),r.notNullOrUndefined(a.buildNumber,"cfg.buildNumber"),r.notNullOrUndefined(a.localTime,"cfg.localTime"),!t)throw new Error("fileNames must be defined");0===t.length&&s.warn("Warning - no files supplied to process"),a.buildNumber||n.throwFormattedErr("%s env var not set - apparently not in a CI environment",a.buildNumber),s.info("Processing files %j with run info %j",a);let m=0;return t.forEach((t=>{if(e.existsSync(t))try{let r=e.readFileSync(t).toString();r=r.split(i).join(a.buildNumber),r=r.split(o).join(a.branch||""),r=r.split(l).join(a.commitHash||""),r=r.split(c).join(a.tag||""),r=r.split(u).join(a.localTime||""),e.writeFileSync(t,r),m++}catch(e){s.error("Error processing %s , continuing: %s",t,e,e)}else s.error("Could not find file %s to process, continuing",t)})),m}static extractFileNames(){let e=[];return process&&process.argv&&process.argv.length>3&&(e=process.argv.slice(3)),e}static extractVariableConfig(e){let t=null;const r=a.trimToEmpty(e).toLowerCase();switch(r){case"circleci":t=C.createDefaultCircleCiRunInformation();break;case"github":t=C.createDefaultGithubActionsRunInformation();break;case"test":t=C.createTestingCiRunInformation();break;default:n.throwFormattedErr("Unrecognized env var config type : %s",r)}return s.info("Using variable config : %j",t),t}static async runFromCliArgs(e){return e.length>1?A.process(e.slice(1),A.extractVariableConfig(e[0])):(s.infoP("Usage : apply-ci-env-variables-to-files {file1} {file2} ..."),-1)}}class T{static isCalledFromCLI(e,t=!1){let r=!1;for(let s=0;e&&s<e.length&&!r;s++)r=null!==T.indexOfCommandArgument(e[s],t);return r}static argsAfterCommand(e,t=!1){let r=null;if(process?.argv?.length&&e?.length){let s=null;for(let r=0;r<e.length&&null===s;r++)s=T.indexOfCommandArgument(e[r],t);r=null!==s?process.argv.slice(s+1,process.argv.length):null}return r}static isCalledFromCLISingle(e,t=!1){return T.isCalledFromCLI([e],t)}static indexOfCommandArgument(e,t=!1){const r=process.argv.map((r=>!t&&r===e||t&&-1!==r.indexOf(e))).indexOf(!0);return-1===r?null:r}}class O{async findAndExecuteHandler(e=!1){let t=null;const r=T.argsAfterCommand(["version"],e);if(r)console.log("Version : "+JSON.stringify(this.fetchVersionInfo())),console.log("Process: "+JSON.stringify(process?.argv)+" VersionArgs: "+JSON.stringify(r));else{const e=this.fetchHandlerMap(),r=Object.keys(e);let s=null;for(let n=0;n<r.length&&!t;n++)s=T.argsAfterCommand([r[n],r[n]+".js"]),s&&(t=e[r[n]]);t?(console.debug("Running command with args "+JSON.stringify(s)),await t(s)):(console.log("Unrecognized command : ",process.argv),console.log("Valid commands are : ",Object.keys(e)))}}}class E{static async process(t,r,n=null){if(!t)throw new Error("fileNames must be defined");if(!r)throw new Error("outClassName must be defined");0===t.length&&s.warn("Warning - no files supplied to process");const a=[];t.forEach((e=>E.processFilename(e,a))),s.info("Generating class %s from files %j (output file: %s)",r,a,n);let i="/** \n";i+="* Holder for the constants to be used by consumers \n",i+="* Moves it into code so that it can survive a trip through WebPack \n",i+="*/ \n\n",i+="export class "+r+" { \n",i+=" public static readonly VALUES:Record<string, string> = { \n";for(let t=0;t<a.length;t++){let r=a[t].substring(a[t].lastIndexOf("/")+1);r=r.substring(r.lastIndexOf("\\")+1);const s=e.readFileSync(a[t]).toString();i+=t>0?",":"",i+='"'+r+'":'+JSON.stringify(s)+"\n"}return i+="}; \n",i+="}",n&&(s.info("Writing to %s",n),e.writeFileSync(n,i)),i}static processFilename(t,n){if(r.notNullOrUndefined(n,"targetArrayInPlace"),e.existsSync(t)){const r=e.statSync(t);if(r.isDirectory()){const r=e.readdirSync(t);s.info("Found %d files in %s to process",r.length,t),r.forEach((e=>E.processFilename(u.join(t,e),n)))}else r.isFile()?n.push(t):s.error("Skipping - neither file nor directory : %s",t)}else s.warn("Could not find file %s",t)}static async runFromCliArgs(e){if(e.length<3)return s.infoP("Usage: ratchet-files-to-static-class {outFileName} {outClassName} {file0} ... {fileN}"),null;{const e=T.indexOfCommandArgument("files-to-static-class"),t=process.argv[e+1],r=process.argv[e+2],n=process.argv.slice(e+3);return s.info("Running FilesToStaticClass from command line arguments Target: %s TargetClass: %s InFiles: %j",t,r,n),E.process(n,r,t)}}}class N{static SPLIT_CHARACTER="<##>";static PRETTY_FORMAT=["%h","%H","%s","%f","%b","%at","%ct","%an","%ae","%cn","%ce","%N",""];static async executeCommand(e,t){let r=i.fetchDirName(import.meta.url);return t&&t.dst&&(r=t.dst),new Promise(((t,s)=>{d.exec(e,{cwd:r},((e,r,n)=>{""===r&&s("this does not look like a git repo"),n&&s(n),t(r)}))}))}static getCommandString(e){return'git log -1 --pretty=format:"'+N.PRETTY_FORMAT.join(e)+'" && git rev-parse --abbrev-ref HEAD && git tag --contains HEAD'}static async getLastCommitSwallowException(e={}){let t=null;try{t=await this.getLastCommit(e)}catch(e){s.warn("Failed to fetch git data : %s",e,e)}return t}static async getLastCommit(e={}){const t=N.getCommandString(N.SPLIT_CHARACTER),r=(await N.executeCommand(t,e)).split(N.SPLIT_CHARACTER),s=r[r.length-1].split("\n").filter((e=>e)),n=s[0],a=s.slice(1);return{shortHash:r[0],hash:r[1],subject:r[2],sanitizedSubject:r[3],body:r[4],authoredOn:r[5],committedOn:r[6],author:{name:r[7],email:r[8]},committer:{name:r[9],email:r[10]},notes:r[11],branch:n,tags:a}}}class _{static async process(e,t="America/Los_Angeles"){if(!e)throw new Error("slackHookUrl must be defined");const r=C.createDefaultGithubActionsRunInformation(),i=C.createDefaultCircleCiRunInformation(),o=C.createTestingCiRunInformation(),l=r.buildNumber||i.buildNumber||o.buildNumber,u=r.userName||i.userName||o.userName,d=r.projectName||i.projectName||o.projectName,g=r.branch||i.branch||o.branch||"",h=r.tag||i.tag||o.tag||"",p=r.commitHash||i.commitHash||o.commitHash||"",b=c.local().setZone(t).toFormat("MMMM Do yyyy, h:mm:ss a z"),y=await N.getLastCommitSwallowException();if(!l||!u||!d)throw n.fErr("Missing at least one of build number, username, or repo name environmental variables : Github : %j CircleCi: %j Testing: %j",r,i,o);let A=f.format("%s performed release %s on %s at %s",u,h+" "+g,d,b);y&&y.subject&&(A+="\n\n"+y.subject),s.info('Sending slack notification "%s" with build %s, branch %s, tag %s, sha %s, time: %s, url: %s',A,l,g,h,p,b,a.obscure(e,2));const T=await m(e,{method:"POST",mode:"cors",cache:"no-cache",headers:{"Content-Type":"application/json"},redirect:"follow",body:JSON.stringify({text:A})}),O=await T.text();return s.info("Slack returned : %s",O),O}static async runFromCliArgs(e){s.info("Running PublishCiReleaseToSlack from command line arguments");const t=e?.length?e[0]:null;return t?_.process(t):(s.infoP("Usage : ratchet-publish-circle-ci-release-to-slack {hookUrl} ..."),null)}}class S{static async process(t,r=!1,n=!1){let a=0;if(!t||0===t.trim().length)throw new Error("folder must be defined");if(!e.existsSync(t))throw new Error(t+" does not exist");if(!e.statSync(t).isDirectory())throw new Error(t+" is not a folder");const i=e.readdirSync(t);for(let o=0;o<i.length;o++){const l=u.join(t,i[o]),c=e.statSync(l);if(c.isFile()){const r=Date.now()+"_"+a,c=i[o].lastIndexOf("."),m=c>-1?r+i[o].substring(c):r,f=u.join(t,m);n?s.info("Would have renamed %s to %s",l,f):(s.info("Renaming %s to %s",l,f),e.renameSync(l,f)),a++}else c.isDirectory()?r?a+=await S.process(l,r,n):s.info("Ignoring %s - folder, and recursive not specified",l):s.info("Ignoring %s - neither file nor folder",l)}return a}static async runFromCliArgs(e){if(3!==e.length)return s.infoP("Usage: ratchet-unique-file-rename {folder} {recursive} {dryrun}"),s.infoP(e.length),null;{const e=T.indexOfCommandArgument("unique-file-rename"),t=process.argv[e+1],r=o.parseBool(process.argv[e+2]),n=o.parseBool(process.argv[e+3]);return s.info("Running UniqueFileName from command line arguments Folder: %s Recursive: %s DryRun: %s",t,r,n),a.safeString(S.process(t,r,n))}}}class R extends O{fetchHandlerMap(){return{"apply-ci-env-variables-to-files":A.runFromCliArgs,"files-to-static-class":E.runFromCliArgs,"publish-ci-release-to-slack":_.runFromCliArgs,"unique-file-rename":S.runFromCliArgs}}fetchVersionInfo(){return y.buildInformation()}}class w{static defaultParseOptions(){return{delimiter:",",columns:!0}}static defaultStringifyOptions(){return{header:!0}}static async stringParse(e,t,r=w.defaultParseOptions()){return w.streamParse(p.from(e),t,r)}static async streamParse(e,t,r=w.defaultParseOptions()){return new Promise(((s,n)=>{const a=[],i=g(r);i.on("readable",(()=>{let e=i.read();for(;e;){const r=t(e);r&&a.push(r),e=i.read()}})),i.on("error",(e=>{n(e)})),i.on("end",(()=>{s(a)})),e.pipe(i)}))}static async fileParse(t,r){const s=e.createReadStream(t);return w.streamParse(s,r)}static async generateCsvData(e,t=w.defaultStringifyOptions()){s.silly("Converting %d items into csv file",e.length);return new Promise(((r,s)=>{h(e,t,(function(e,t){e?s(e):r(t)}))}))}static async generateComparison(t,n,a){r.notNullOrUndefined(t,"file1"),r.notNullOrUndefined(n,"file2"),r.notNullOrUndefined(a,"keyField"),s.info("Created csv compare with files %s and %s keyed on %s",t,n,a);let i=await this.streamParse(e.createReadStream(t),(e=>{}));i=i.map((e=>{const t={};return Object.keys(e).forEach((r=>{t[r.trim()]=e[r]})),t}));const o=l.mapByUniqueProperty(i,a);let c=await this.streamParse(e.createReadStream(n),(e=>{}));c=c.map((e=>{const t={};return Object.keys(e).forEach((r=>{t[r.trim()]=e[r]})),t}));const u=l.mapByUniqueProperty(c,a),m=[],f=[],d=[];Array.from(o.keys()).forEach((e=>{u.has(e)?d.push(e):m.push(e)})),Array.from(u.keys()).forEach((e=>{o.has(e)||f.push(e)}));return{file1Data:o,file2Data:u,file1OnlyKeys:m,file2OnlyKeys:f,bothFilesKeys:d}}static async streamObjectsToCsv(e,t,n){r.notNullOrUndefined(e,"srcSubject"),r.notNullOrUndefined(t,"output");const a=n||w.defaultStringifyOptions();s.silly("Running pipe to csv output : %j",a);let i=0;return new Promise(((r,n)=>{const o=h(a);o.on("error",(e=>{l&&l.unsubscribe(),n(e)})),o.on("finish",(()=>{l&&l.unsubscribe(),r(i)})),o.pipe(t);const l=e.subscribe((e=>{s.debug("Adding %j to csv",e),i++,o.write(e)}),(e=>{s.error("Error generating : %s",e),n(e)}),(()=>{s.debug("Finished"),o.end()}))}))}static defaultParseFunction(e){return e}}class v extends b{_val=[];constructor(){super()}_write(e,t,r){e&&this._val.push(e),r()}get value(){return Buffer.concat(this._val)}}class F extends p{_object;constructor(e,t={}){super(e instanceof Buffer||"string"==typeof e?t:{objectMode:!0}),this._object=e}_read(){this.push(this._object),this._object=null}}class I{constructor(){}static readableToBufferSync(e){const t=[];let r=e.read();for(;r;)t.push(r),r=e.read();return Buffer.concat(t)}static stringToReadable(e){return new p({read(){this.push(e),this.push(null)}})}static anyToStringReadable(e){return null==e?I.stringToReadable(null):I.stringToReadable(a.safeString(e))}static webReadableStreamToNodeReadable(e){const t=e.getReader(),r=new p;return t.read().then((async({value:e,done:s})=>{for(;!s;)r.push(e),({done:s,value:e}=await t.read());r.push(null)})),r}static webWritableStreamToNodeWriteable(e){const t=e.getWriter(),r=new b;return r._write=(e,r,s)=>{t.write(e),s()},r._final=e=>{t.close(),e()},r}}class L extends b{_val="";constructor(){super()}_write(e,t,r){this._val+=e?e.toString():"",r()}get value(){return this._val}}export{O as AbstractRatchetCliHandler,A as ApplyCiEnvVariablesToFiles,v as BufferWritable,C as CiRunInformationUtil,T as CliRatchet,w as CsvRatchet,E as FilesToStaticClass,N as GitRatchet,F as MultiStream,I as NodeStreamRatchet,_ as PublishCiReleaseToSlack,R as RatchetCliHandler,y as RatchetNodeOnlyInfo,L as StringWritable,S as UniqueFileRename};
1
+ import e from"fs";import{GlobalRatchet as t,RequireRatchet as r,Logger as s,ErrorRatchet as n,StringRatchet as a,EsmRatchet as i,BooleanRatchet as o,MapRatchet as l}from"@bitblit/ratchet-common";import{DateTime as c}from"luxon";import u from"path";import m from"cross-fetch";import f from"util";import d from"child_process";import{parse as g}from"csv-parse";import{stringify as h}from"csv-stringify";import{Readable as p,Writable as b}from"stream";class y{constructor(){}static buildInformation(){return{version:"407",hash:"6086aaafe0725f18f85722ae54d33d097df2916d",branch:"alpha-2024-06-29-3",tag:"alpha-2024-06-29-3",timeBuiltISO:"2024-06-29T21:01:31-0700",notes:"No notes"}}}class C{static DEFAULT_TIME_FORMAT="yyyy-MM-dd HH:mm:ss a z";static DEFAULT_TIME_ZONE="America/Los_Angeles";static createTestingCiRunInformation(e=C.DEFAULT_TIME_ZONE){const t=(new Date).toISOString();return{buildNumber:"Test_buildNumberVar_"+t,localTime:c.local().setZone(e).toFormat(C.DEFAULT_TIME_FORMAT),branch:"Test_branchVar_"+t,tag:"Test_tagVar_"+t,commitHash:"Test_hashVar_"+t,userName:"Test_userNameVar_"+t,projectName:"Test_projectNameVar_"+t}}static createDefaultCircleCiRunInformation(e=C.DEFAULT_TIME_ZONE){return{buildNumber:t.fetchGlobalVar("CIRCLE_BUILD_NUM"),branch:t.fetchGlobalVar("CIRCLE_BRANCH"),tag:t.fetchGlobalVar("CIRCLE_TAG"),commitHash:t.fetchGlobalVar("CIRCLE_SHA1"),localTime:c.local().setZone(e).toFormat(C.DEFAULT_TIME_FORMAT),userName:t.fetchGlobalVar("CIRCLE_USERNAME"),projectName:t.fetchGlobalVar("CIRCLE_PROJECT_REPONAME")}}static createDefaultGithubActionsRunInformation(e=C.DEFAULT_TIME_ZONE){return{buildNumber:t.fetchGlobalVar("GITHUB_RUN_NUMBER"),branch:t.fetchGlobalVar("GITHUB_REF_NAME"),tag:t.fetchGlobalVar("GITHUB_REF_NAME"),commitHash:t.fetchGlobalVar("GITHUB_SHA"),localTime:c.local().setZone(e).toFormat(C.DEFAULT_TIME_FORMAT),userName:t.fetchGlobalVar("GITHUB_ACTOR"),projectName:t.fetchGlobalVar("GITHUB_REPOSITORY")}}}class A{static async process(t,a,i="407",o="alpha-2024-06-29-3",l="6086aaafe0725f18f85722ae54d33d097df2916d",c="alpha-2024-06-29-3",u="LOCAL-TIME"){if(r.notNullOrUndefined(a,"cfg"),r.notNullOrUndefined(a.buildNumber,"cfg.buildNumber"),r.notNullOrUndefined(a.localTime,"cfg.localTime"),!t)throw new Error("fileNames must be defined");0===t.length&&s.warn("Warning - no files supplied to process"),a.buildNumber||n.throwFormattedErr("%s env var not set - apparently not in a CI environment",a.buildNumber),s.info("Processing files %j with run info %j",a);let m=0;return t.forEach((t=>{if(e.existsSync(t))try{let r=e.readFileSync(t).toString();r=r.split(i).join(a.buildNumber),r=r.split(o).join(a.branch||""),r=r.split(l).join(a.commitHash||""),r=r.split(c).join(a.tag||""),r=r.split(u).join(a.localTime||""),e.writeFileSync(t,r),m++}catch(e){s.error("Error processing %s , continuing: %s",t,e,e)}else s.error("Could not find file %s to process, continuing",t)})),m}static extractFileNames(){let e=[];return process&&process.argv&&process.argv.length>3&&(e=process.argv.slice(3)),e}static extractVariableConfig(e){let t=null;const r=a.trimToEmpty(e).toLowerCase();switch(r){case"circleci":t=C.createDefaultCircleCiRunInformation();break;case"github":t=C.createDefaultGithubActionsRunInformation();break;case"test":t=C.createTestingCiRunInformation();break;default:n.throwFormattedErr("Unrecognized env var config type : %s",r)}return s.info("Using variable config : %j",t),t}static async runFromCliArgs(e){return e.length>1?A.process(e.slice(1),A.extractVariableConfig(e[0])):(s.infoP("Usage : apply-ci-env-variables-to-files {file1} {file2} ..."),-1)}}class T{static isCalledFromCLI(e,t=!1){let r=!1;for(let s=0;e&&s<e.length&&!r;s++)r=null!==T.indexOfCommandArgument(e[s],t);return r}static argsAfterCommand(e,t=!1){let r=null;if(process?.argv?.length&&e?.length){let s=null;for(let r=0;r<e.length&&null===s;r++)s=T.indexOfCommandArgument(e[r],t);r=null!==s?process.argv.slice(s+1,process.argv.length):null}return r}static isCalledFromCLISingle(e,t=!1){return T.isCalledFromCLI([e],t)}static indexOfCommandArgument(e,t=!1){const r=process.argv.map((r=>!t&&r===e||t&&-1!==r.indexOf(e))).indexOf(!0);return-1===r?null:r}}class O{async findAndExecuteHandler(e=!1){let t=null;const r=T.argsAfterCommand(["version"],e);if(r)console.log("Version : "+JSON.stringify(this.fetchVersionInfo())),console.log("Process: "+JSON.stringify(process?.argv)+" VersionArgs: "+JSON.stringify(r));else{const e=this.fetchHandlerMap(),r=Object.keys(e);let s=null;for(let n=0;n<r.length&&!t;n++)s=T.argsAfterCommand([r[n],r[n]+".js"]),s&&(t=e[r[n]]);t?(console.debug("Running command with args "+JSON.stringify(s)),await t(s)):(console.log("Unrecognized command : ",process.argv),console.log("Valid commands are : ",Object.keys(e)))}}}class E{static async process(t,r,n=null){if(!t)throw new Error("fileNames must be defined");if(!r)throw new Error("outClassName must be defined");0===t.length&&s.warn("Warning - no files supplied to process");const a=[];t.forEach((e=>E.processFilename(e,a))),s.info("Generating class %s from files %j (output file: %s)",r,a,n);let i="/** \n";i+="* Holder for the constants to be used by consumers \n",i+="* Moves it into code so that it can survive a trip through WebPack \n",i+="*/ \n\n",i+="export class "+r+" { \n",i+=" public static readonly VALUES:Record<string, string> = { \n";for(let t=0;t<a.length;t++){let r=a[t].substring(a[t].lastIndexOf("/")+1);r=r.substring(r.lastIndexOf("\\")+1);const s=e.readFileSync(a[t]).toString();i+=t>0?",":"",i+='"'+r+'":'+JSON.stringify(s)+"\n"}return i+="}; \n",i+="}",n&&(s.info("Writing to %s",n),e.writeFileSync(n,i)),i}static processFilename(t,n){if(r.notNullOrUndefined(n,"targetArrayInPlace"),e.existsSync(t)){const r=e.statSync(t);if(r.isDirectory()){const r=e.readdirSync(t);s.info("Found %d files in %s to process",r.length,t),r.forEach((e=>E.processFilename(u.join(t,e),n)))}else r.isFile()?n.push(t):s.error("Skipping - neither file nor directory : %s",t)}else s.warn("Could not find file %s",t)}static async runFromCliArgs(e){if(e.length<3)return s.infoP("Usage: ratchet-files-to-static-class {outFileName} {outClassName} {file0} ... {fileN}"),null;{const e=T.indexOfCommandArgument("files-to-static-class"),t=process.argv[e+1],r=process.argv[e+2],n=process.argv.slice(e+3);return s.info("Running FilesToStaticClass from command line arguments Target: %s TargetClass: %s InFiles: %j",t,r,n),E.process(n,r,t)}}}class N{static SPLIT_CHARACTER="<##>";static PRETTY_FORMAT=["%h","%H","%s","%f","%b","%at","%ct","%an","%ae","%cn","%ce","%N",""];static async executeCommand(e,t){let r=i.fetchDirName(import.meta.url);return t&&t.dst&&(r=t.dst),new Promise(((t,s)=>{d.exec(e,{cwd:r},((e,r,n)=>{""===r&&s("this does not look like a git repo"),n&&s(n),t(r)}))}))}static getCommandString(e){return'git log -1 --pretty=format:"'+N.PRETTY_FORMAT.join(e)+'" && git rev-parse --abbrev-ref HEAD && git tag --contains HEAD'}static async getLastCommitSwallowException(e={}){let t=null;try{t=await this.getLastCommit(e)}catch(e){s.warn("Failed to fetch git data : %s",e,e)}return t}static async getLastCommit(e={}){const t=N.getCommandString(N.SPLIT_CHARACTER),r=(await N.executeCommand(t,e)).split(N.SPLIT_CHARACTER),s=r[r.length-1].split("\n").filter((e=>e)),n=s[0],a=s.slice(1);return{shortHash:r[0],hash:r[1],subject:r[2],sanitizedSubject:r[3],body:r[4],authoredOn:r[5],committedOn:r[6],author:{name:r[7],email:r[8]},committer:{name:r[9],email:r[10]},notes:r[11],branch:n,tags:a}}}class _{static async process(e,t="America/Los_Angeles"){if(!e)throw new Error("slackHookUrl must be defined");const r=C.createDefaultGithubActionsRunInformation(),i=C.createDefaultCircleCiRunInformation(),o=C.createTestingCiRunInformation(),l=r.buildNumber||i.buildNumber||o.buildNumber,u=r.userName||i.userName||o.userName,d=r.projectName||i.projectName||o.projectName,g=r.branch||i.branch||o.branch||"",h=r.tag||i.tag||o.tag||"",p=r.commitHash||i.commitHash||o.commitHash||"",b=c.local().setZone(t).toFormat("MMMM Do yyyy, h:mm:ss a z"),y=await N.getLastCommitSwallowException();if(!l||!u||!d)throw n.fErr("Missing at least one of build number, username, or repo name environmental variables : Github : %j CircleCi: %j Testing: %j",r,i,o);let A=f.format("%s performed release %s on %s at %s",u,h+" "+g,d,b);y&&y.subject&&(A+="\n\n"+y.subject),s.info('Sending slack notification "%s" with build %s, branch %s, tag %s, sha %s, time: %s, url: %s',A,l,g,h,p,b,a.obscure(e,2));const T=await m(e,{method:"POST",mode:"cors",cache:"no-cache",headers:{"Content-Type":"application/json"},redirect:"follow",body:JSON.stringify({text:A})}),O=await T.text();return s.info("Slack returned : %s",O),O}static async runFromCliArgs(e){s.info("Running PublishCiReleaseToSlack from command line arguments");const t=e?.length?e[0]:null;return t?_.process(t):(s.infoP("Usage : ratchet-publish-circle-ci-release-to-slack {hookUrl} ..."),null)}}class S{static async process(t,r=!1,n=!1){let a=0;if(!t||0===t.trim().length)throw new Error("folder must be defined");if(!e.existsSync(t))throw new Error(t+" does not exist");if(!e.statSync(t).isDirectory())throw new Error(t+" is not a folder");const i=e.readdirSync(t);for(let o=0;o<i.length;o++){const l=u.join(t,i[o]),c=e.statSync(l);if(c.isFile()){const r=Date.now()+"_"+a,c=i[o].lastIndexOf("."),m=c>-1?r+i[o].substring(c):r,f=u.join(t,m);n?s.info("Would have renamed %s to %s",l,f):(s.info("Renaming %s to %s",l,f),e.renameSync(l,f)),a++}else c.isDirectory()?r?a+=await S.process(l,r,n):s.info("Ignoring %s - folder, and recursive not specified",l):s.info("Ignoring %s - neither file nor folder",l)}return a}static async runFromCliArgs(e){if(3!==e.length)return s.infoP("Usage: ratchet-unique-file-rename {folder} {recursive} {dryrun}"),s.infoP(e.length),null;{const e=T.indexOfCommandArgument("unique-file-rename"),t=process.argv[e+1],r=o.parseBool(process.argv[e+2]),n=o.parseBool(process.argv[e+3]);return s.info("Running UniqueFileName from command line arguments Folder: %s Recursive: %s DryRun: %s",t,r,n),a.safeString(S.process(t,r,n))}}}class R extends O{fetchHandlerMap(){return{"apply-ci-env-variables-to-files":A.runFromCliArgs,"files-to-static-class":E.runFromCliArgs,"publish-ci-release-to-slack":_.runFromCliArgs,"unique-file-rename":S.runFromCliArgs}}fetchVersionInfo(){return y.buildInformation()}}class w{static defaultParseOptions(){return{delimiter:",",columns:!0}}static defaultStringifyOptions(){return{header:!0}}static async stringParse(e,t,r=w.defaultParseOptions()){return w.streamParse(p.from(e),t,r)}static async streamParse(e,t,r=w.defaultParseOptions()){return new Promise(((s,n)=>{const a=[],i=g(r);i.on("readable",(()=>{let e=i.read();for(;e;){const r=t(e);r&&a.push(r),e=i.read()}})),i.on("error",(e=>{n(e)})),i.on("end",(()=>{s(a)})),e.pipe(i)}))}static async fileParse(t,r){const s=e.createReadStream(t);return w.streamParse(s,r)}static async generateCsvData(e,t=w.defaultStringifyOptions()){s.silly("Converting %d items into csv file",e.length);return new Promise(((r,s)=>{h(e,t,(function(e,t){e?s(e):r(t)}))}))}static async generateComparison(t,n,a){r.notNullOrUndefined(t,"file1"),r.notNullOrUndefined(n,"file2"),r.notNullOrUndefined(a,"keyField"),s.info("Created csv compare with files %s and %s keyed on %s",t,n,a);let i=await this.streamParse(e.createReadStream(t),(e=>{}));i=i.map((e=>{const t={};return Object.keys(e).forEach((r=>{t[r.trim()]=e[r]})),t}));const o=l.mapByUniqueProperty(i,a);let c=await this.streamParse(e.createReadStream(n),(e=>{}));c=c.map((e=>{const t={};return Object.keys(e).forEach((r=>{t[r.trim()]=e[r]})),t}));const u=l.mapByUniqueProperty(c,a),m=[],f=[],d=[];Array.from(o.keys()).forEach((e=>{u.has(e)?d.push(e):m.push(e)})),Array.from(u.keys()).forEach((e=>{o.has(e)||f.push(e)}));return{file1Data:o,file2Data:u,file1OnlyKeys:m,file2OnlyKeys:f,bothFilesKeys:d}}static async streamObjectsToCsv(e,t,n){r.notNullOrUndefined(e,"srcSubject"),r.notNullOrUndefined(t,"output");const a=n||w.defaultStringifyOptions();s.silly("Running pipe to csv output : %j",a);let i=0;return new Promise(((r,n)=>{const o=h(a);o.on("error",(e=>{l&&l.unsubscribe(),n(e)})),o.on("finish",(()=>{l&&l.unsubscribe(),r(i)})),o.pipe(t);const l=e.subscribe((e=>{s.debug("Adding %j to csv",e),i++,o.write(e)}),(e=>{s.error("Error generating : %s",e),n(e)}),(()=>{s.debug("Finished"),o.end()}))}))}static defaultParseFunction(e){return e}}class v extends b{_val=[];constructor(){super()}_write(e,t,r){e&&this._val.push(e),r()}get value(){return Buffer.concat(this._val)}}class F extends p{_object;constructor(e,t={}){super(e instanceof Buffer||"string"==typeof e?t:{objectMode:!0}),this._object=e}_read(){this.push(this._object),this._object=null}}class I{constructor(){}static readableToBufferSync(e){const t=[];let r=e.read();for(;r;)t.push(r),r=e.read();return Buffer.concat(t)}static stringToReadable(e){return new p({read(){this.push(e),this.push(null)}})}static anyToStringReadable(e){return null==e?I.stringToReadable(null):I.stringToReadable(a.safeString(e))}static webReadableStreamToNodeReadable(e){const t=e.getReader(),r=new p;return t.read().then((async({value:e,done:s})=>{for(;!s;)r.push(e),({done:s,value:e}=await t.read());r.push(null)})),r}static webWritableStreamToNodeWriteable(e){const t=e.getWriter(),r=new b;return r._write=(e,r,s)=>{t.write(e),s()},r._final=e=>{t.close(),e()},r}}class L extends b{_val="";constructor(){super()}_write(e,t,r){this._val+=e?e.toString():"",r()}get value(){return this._val}}export{O as AbstractRatchetCliHandler,A as ApplyCiEnvVariablesToFiles,v as BufferWritable,C as CiRunInformationUtil,T as CliRatchet,w as CsvRatchet,E as FilesToStaticClass,N as GitRatchet,F as MultiStream,I as NodeStreamRatchet,_ as PublishCiReleaseToSlack,R as RatchetCliHandler,y as RatchetNodeOnlyInfo,L as StringWritable,S as UniqueFileRename};
2
2
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitblit/ratchet-node-only",
3
- "version": "4.0.405-alpha",
3
+ "version": "4.0.407-alpha",
4
4
  "description": "Ratchet tools for use on node-only",
5
5
  "note-on-side-effects": "Technically the entries in 'bin' below might be side effects, but they are called explicitly",
6
6
  "sideEffects": false,
@@ -56,7 +56,7 @@
56
56
  },
57
57
  "license": "Apache-2.0",
58
58
  "dependencies": {
59
- "@bitblit/ratchet-common": "4.0.405-alpha",
59
+ "@bitblit/ratchet-common": "4.0.407-alpha",
60
60
  "csv": "6.3.9",
61
61
  "rxjs": "7.8.1"
62
62
  },