one-way-git-sync 6.0.26 → 6.0.28

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/dist/index.js +2 -2
  2. package/package.json +33 -29
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import e from"node:fs";import t from"node:path";import{hideBin as o}from"yargs/helpers";import i from"yargs/yargs";import{pino as r}from"pino";import a from"node:child_process";import n from"node:fs/promises";import{copy as s}from"fs-extra";import c from"micromatch";import{simpleGit as d}from"simple-git";const m=r({transport:{target:"pino-pretty",options:{colorize:!0}}});const l=t.join("node_modules",".temp","sync-git-repo");const g={dest:{type:"string",alias:"d",describe:"A URL of a destination git repository.",demand:!0},prefix:{type:"string",alias:"p",describe:"A prefix of a commit hash used to generate a commit title, e.g. 'sync <prefix>/<hash>'.\n A typical value is like 'https://github.com/WillBooster/one-way-git-sync/commits'"},branch:{type:"string",alias:"b",describe:"Specify branch of destination repo."},tag:{type:"string",alias:"t",describe:"Specify tag to be created in destination repo."},"tag-hash":{type:"boolean",describe:"Create version+hash tag (e.g. v1.31.5-2-gcdde507). It should be a unique tag."},"tag-version":{type:"boolean",describe:"Create version tag (e.g. v1.31.5). It could be a non-unique tag."},"ignore-patterns":{type:"array",alias:"i",describe:"Exclude the files whose path matches one of the given patterns.\n The patterns are processed by micromatch (https://github.com/micromatch/micromatch).\n You may specify the option multiple times. Default value is \"-i .git -i .github -i node_modules -i '.renovaterc.*' -i '.renovate.*'\"",default:[".git",".github","node_modules",".renovaterc.*","renovate.*"]},dry:{type:"boolean",describe:"Enable dry-run mode."},force:{type:"boolean",describe:"Force to overwrite the destination git repository."},verbose:{type:"boolean",alias:"v",describe:"Show details logs."}},p=await i(o(process.argv)).scriptName("one-way-git-sync").options(g).middleware(e=>{m.level=e.verbose?"trace":"info"}).strict().version(function(){let o=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(o,"package.json"));)o=t.dirname(o);return JSON.parse(e.readFileSync(t.join(o,"package.json"),"utf8")).version}()).help().argv;await async function(e){await n.mkdir(l,{recursive:!0});const o=await n.mkdtemp(t.join(l,"repo-")),i=await async function(e,o,i=process.cwd()){const r={"--single-branch":null};o.force||(r["--depth"]=1);o.branch&&(r["--branch"]=o.branch);try{await d(i).clone(o.dest,e,r)}catch{delete r["--branch"],delete r["--single-branch"],await d(i).clone(o.dest,e,r),d(e).checkout(["-b",o.branch])}m.debug(`Cloned destination repo on ${e}`);const l=d(e);let g=[];try{g=function(e){if(0===e.all.length)return m.debug("No commit history"),[];for(const t of e.all){const[e,...o]=t.message.replaceAll(/[()]/g,"").split(/[\s/]/);if("sync"===e&&o.length>0)return[t.message,o.at(-1)]}return m.debug(`No sync commit: ${e.all[0].message}`),[]}(await l.log())}catch{}const[p,h]=g;if(h)m.debug(`Extracted a valid commit: ${h}`),m.debug(`(${p})`);else if(!o.force)return m.error("No valid commit in destination repo"),!1;const u=d(i);let f;try{f=await u.log(h?{from:h,to:"HEAD","--first-parent":void 0}:void 0)}catch(e){return m.error(`Failed to get source commit history: ${e.stack}`),!1}const b=f.latest?.hash;if(!b)return m.info("No synchronizable commit"),!0;const y=[...new Set([...o["ignore-patterns"].map(String),".git"])];let[w,v]=await Promise.all([n.readdir(e),n.readdir(i)]);w=c.not(w,y),v=c.not(v,y),m.debug("destFiles: %o",w),m.debug("srcFiles: %o",v);for(const o of w)await n.rm(t.join(e,o),{recursive:!0,force:!0});for(const o of v)await s(t.join(i,o),t.join(e,o));await l.add("-A");let $="";if(o["tag-hash"]||o["tag-version"]){const e="git describe --tags --always "+(o["tag-version"]?"--abbrev=0":"");$=a.execSync(e,{cwd:i}).toString().trim()}let j=o.prefix??await async function(e){const t=(await e.getRemotes(!0)).find(e=>"origin"===e.name),o=t?.refs?.fetch??t?.refs?.push;if("string"==typeof o&&o.includes("github.com")){const e=o.split("/"),t=e.at(-2),i=e.at(-1)?.replace(/.git$/,"");if(t&&i)return`https://github.com/${t}/${i}/commits`}}(u)??"";j&&!j.endsWith("/")&&(j+="/");const x=`${j}${b}`,S=$?`sync ${$} (${x})`:`sync ${x}`,k=h?f.all.map(e=>`* ${e.message}`).join("\n\n"):`Replace all the files with those of ${o.dest} due to missing sync commit.`;try{const e=await l.commit(`${S}\n\n${k}`);m.debug("Created a commit: %o",e),m.debug(S),m.debug(` with body: ${k}`)}catch(e){return m.error(`Failed to commit changes: ${e.stack}`),!1}const F=$||o.tag;if(F)try{await l.addTag(F),m.debug(`Created a tag: ${F}`)}catch{m.warn(`Failed to create a tag: ${F}`)}if(o.dry)return m.debug("Finished dry run"),!0;try{await(o.branch?l.push("origin",o.branch):l.push()),F&&await l.push({"--tags":null})}catch(e){return m.error(`Failed to push the commit: ${e.stack}`),!1}return m.debug("Pushed the commit"),!0}(o,e);process.exit(i?0:1)}(p);
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvc3luYy50cyIsIi4uL3NyYy95YXJnc09wdGlvbnMudHMiLCIuLi9zcmMvaW5kZXgudHMiLCIuLi9zcmMvZ2l0SHViLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBpbm8gfSBmcm9tICdwaW5vJztcblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IHBpbm8oe1xuICB0cmFuc3BvcnQ6IHtcbiAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXG4gICAgb3B0aW9uczoge1xuICAgICAgY29sb3JpemU6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvcHkgfSBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgbWljcm9tYXRjaCBmcm9tICdtaWNyb21hdGNoJztcbmltcG9ydCB0eXBlIHsgTG9nUmVzdWx0LCBPcHRpb25zLCBTaW1wbGVHaXQsIFRhc2tPcHRpb25zIH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZ2V0R2l0SHViQ29tbWl0c1VybCB9IGZyb20gJy4vZ2l0SHViLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgeWFyZ3NPcHRpb25zIH0gZnJvbSAnLi95YXJnc09wdGlvbnMuanMnO1xuXG5jb25zdCBzeW5jRGlyUGF0aCA9IHBhdGguam9pbignbm9kZV9tb2R1bGVzJywgJy50ZW1wJywgJ3N5bmMtZ2l0LXJlcG8nKTtcblxuZXhwb3J0IHR5cGUgWWFyZ3NPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zPjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN5bmMob3B0czogWWFyZ3NPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLm1rZGlyKHN5bmNEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZGlyUGF0aCA9IGF3YWl0IGZzLm1rZHRlbXAocGF0aC5qb2luKHN5bmNEaXJQYXRoLCAncmVwby0nKSk7XG4gIGNvbnN0IHJldCA9IGF3YWl0IHN5bmNDb3JlKGRpclBhdGgsIG9wdHMpO1xuICAvLyBhd2FpdCBmcy5ybShkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIHByb2Nlc3MuZXhpdChyZXQgPyAwIDogMSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzeW5jQ29yZShcbiAgZGVzdFJlcG9QYXRoOiBzdHJpbmcsXG4gIG9wdHM6IFlhcmdzT3B0aW9ucyxcbiAgc3JjUmVwb1BhdGggPSBwcm9jZXNzLmN3ZCgpXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tbnVsbFxuICBjb25zdCBjbG9uZU9wdHM6IE9wdGlvbnMgPSB7ICctLXNpbmdsZS1icmFuY2gnOiBudWxsIH07XG4gIGlmICghb3B0cy5mb3JjZSkge1xuICAgIGNsb25lT3B0c1snLS1kZXB0aCddID0gMTtcbiAgfVxuICBpZiAob3B0cy5icmFuY2gpIHtcbiAgICBjbG9uZU9wdHNbJy0tYnJhbmNoJ10gPSBvcHRzLmJyYW5jaDtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IHNpbXBsZUdpdChzcmNSZXBvUGF0aCkuY2xvbmUob3B0cy5kZXN0LCBkZXN0UmVwb1BhdGgsIGNsb25lT3B0cyk7XG4gIH0gY2F0Y2gge1xuICAgIGRlbGV0ZSBjbG9uZU9wdHNbJy0tYnJhbmNoJ107XG4gICAgZGVsZXRlIGNsb25lT3B0c1snLS1zaW5nbGUtYnJhbmNoJ107XG4gICAgYXdhaXQgc2ltcGxlR2l0KHNyY1JlcG9QYXRoKS5jbG9uZShvcHRzLmRlc3QsIGRlc3RSZXBvUGF0aCwgY2xvbmVPcHRzKTtcbiAgICBzaW1wbGVHaXQoZGVzdFJlcG9QYXRoKS5jaGVja291dChbJy1iJywgb3B0cy5icmFuY2hdIGFzIFRhc2tPcHRpb25zKTtcbiAgfVxuICBsb2dnZXIuZGVidWcoYENsb25lZCBkZXN0aW5hdGlvbiByZXBvIG9uICR7ZGVzdFJlcG9QYXRofWApO1xuXG4gIGNvbnN0IGRzdEdpdDogU2ltcGxlR2l0ID0gc2ltcGxlR2l0KGRlc3RSZXBvUGF0aCk7XG4gIGxldCBjb21taXRIYXNoUmVzdWx0OiBbc3RyaW5nLCBzdHJpbmddIHwgW10gPSBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkc3RMb2cgPSBhd2FpdCBkc3RHaXQubG9nKCk7XG4gICAgY29tbWl0SGFzaFJlc3VsdCA9IGV4dHJhY3RDb21taXRIYXNoKGRzdExvZyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICBjb25zdCBbaGVhZCwgZnJvbV0gPSBjb21taXRIYXNoUmVzdWx0O1xuICBpZiAoZnJvbSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgRXh0cmFjdGVkIGEgdmFsaWQgY29tbWl0OiAke2Zyb219YCk7XG4gICAgbG9nZ2VyLmRlYnVnKGAoJHtoZWFkfSlgKTtcbiAgfSBlbHNlIGlmICghb3B0cy5mb3JjZSkge1xuICAgIGxvZ2dlci5lcnJvcignTm8gdmFsaWQgY29tbWl0IGluIGRlc3RpbmF0aW9uIHJlcG8nKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBzcmNHaXQ6IFNpbXBsZUdpdCA9IHNpbXBsZUdpdChzcmNSZXBvUGF0aCk7XG4gIGxldCBzcmNMb2c6IExvZ1Jlc3VsdDtcbiAgdHJ5IHtcbiAgICAvLyAnLS1maXJzdC1wYXJlbnQnIGhpZGVzIGNoaWxkcmVuIGNvbW1pdHMgb2YgbWVyZ2UgY29tbWl0c1xuICAgIHNyY0xvZyA9IGF3YWl0IHNyY0dpdC5sb2coZnJvbSA/IHsgZnJvbSwgdG86ICdIRUFEJywgJy0tZmlyc3QtcGFyZW50JzogdW5kZWZpbmVkIH0gOiB1bmRlZmluZWQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGdldCBzb3VyY2UgY29tbWl0IGhpc3Rvcnk6ICR7KGVycm9yIGFzIEVycm9yKS5zdGFja31gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBsYXRlc3RIYXNoID0gc3JjTG9nLmxhdGVzdD8uaGFzaDtcbiAgaWYgKCFsYXRlc3RIYXNoKSB7XG4gICAgbG9nZ2VyLmluZm8oJ05vIHN5bmNocm9uaXphYmxlIGNvbW1pdCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gRm9yY2UgdG8gaWdub3JlIC5naXQgZGlyZWN0b3J5XG4gIGNvbnN0IGlnbm9yZVBhdHRlcm5zID0gWy4uLm5ldyBTZXQoWy4uLm9wdHNbJ2lnbm9yZS1wYXR0ZXJucyddLm1hcChTdHJpbmcpLCAnLmdpdCddKV07XG4gIGxldCBbZGVzdEZpbGVzLCBzcmNGaWxlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbZnMucmVhZGRpcihkZXN0UmVwb1BhdGgpLCBmcy5yZWFkZGlyKHNyY1JlcG9QYXRoKV0pO1xuICBkZXN0RmlsZXMgPSBtaWNyb21hdGNoLm5vdChkZXN0RmlsZXMsIGlnbm9yZVBhdHRlcm5zKTtcbiAgc3JjRmlsZXMgPSBtaWNyb21hdGNoLm5vdChzcmNGaWxlcywgaWdub3JlUGF0dGVybnMpO1xuICBsb2dnZXIuZGVidWcoJ2Rlc3RGaWxlczogJW8nLCBkZXN0RmlsZXMpO1xuICBsb2dnZXIuZGVidWcoJ3NyY0ZpbGVzOiAlbycsIHNyY0ZpbGVzKTtcbiAgZm9yIChjb25zdCBkZXN0RmlsZSBvZiBkZXN0RmlsZXMpIHtcbiAgICBhd2FpdCBmcy5ybShwYXRoLmpvaW4oZGVzdFJlcG9QYXRoLCBkZXN0RmlsZSksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuICBmb3IgKGNvbnN0IHNyY0ZpbGUgb2Ygc3JjRmlsZXMpIHtcbiAgICBhd2FpdCBjb3B5KHBhdGguam9pbihzcmNSZXBvUGF0aCwgc3JjRmlsZSksIHBhdGguam9pbihkZXN0UmVwb1BhdGgsIHNyY0ZpbGUpKTtcbiAgfVxuICBhd2FpdCBkc3RHaXQuYWRkKCctQScpO1xuXG4gIGxldCBzcmNUYWcgPSAnJztcbiAgaWYgKG9wdHNbJ3RhZy1oYXNoJ10gfHwgb3B0c1sndGFnLXZlcnNpb24nXSkge1xuICAgIC8vIGUuZy4gYC0tYWJicmV2PTBgIGNoYW5nZXMgYHYxLjMxLjUtMi1nY2RkZTUwN2AgdG8gYHYxLjMxLjVgXG4gICAgY29uc3QgZGVzY3JpYmVDb21tYW5kID0gYGdpdCBkZXNjcmliZSAtLXRhZ3MgLS1hbHdheXMgJHtvcHRzWyd0YWctdmVyc2lvbiddID8gJy0tYWJicmV2PTAnIDogJyd9YDtcbiAgICBzcmNUYWcgPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKGRlc2NyaWJlQ29tbWFuZCwgeyBjd2Q6IHNyY1JlcG9QYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICB9XG4gIGxldCBwcmVmaXggPSBvcHRzLnByZWZpeCA/PyAoYXdhaXQgZ2V0R2l0SHViQ29tbWl0c1VybChzcmNHaXQpKSA/PyAnJztcbiAgaWYgKHByZWZpeCAmJiAhcHJlZml4LmVuZHNXaXRoKCcvJykpIHtcbiAgICBwcmVmaXggKz0gJy8nO1xuICB9XG4gIGNvbnN0IGxpbmsgPSBgJHtwcmVmaXh9JHtsYXRlc3RIYXNofWA7XG4gIGNvbnN0IHRpdGxlID0gc3JjVGFnID8gYHN5bmMgJHtzcmNUYWd9ICgke2xpbmt9KWAgOiBgc3luYyAke2xpbmt9YDtcbiAgY29uc3QgYm9keSA9IGZyb21cbiAgICA/IHNyY0xvZy5hbGwubWFwKChsKSA9PiBgKiAke2wubWVzc2FnZX1gKS5qb2luKCdcXG5cXG4nKVxuICAgIDogYFJlcGxhY2UgYWxsIHRoZSBmaWxlcyB3aXRoIHRob3NlIG9mICR7b3B0cy5kZXN0fSBkdWUgdG8gbWlzc2luZyBzeW5jIGNvbW1pdC5gO1xuICB0cnkge1xuICAgIGNvbnN0IHJldCA9IGF3YWl0IGRzdEdpdC5jb21taXQoYCR7dGl0bGV9XFxuXFxuJHtib2R5fWApO1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ3JlYXRlZCBhIGNvbW1pdDogJW9gLCByZXQpO1xuICAgIGxvZ2dlci5kZWJ1Zyh0aXRsZSk7XG4gICAgbG9nZ2VyLmRlYnVnKGAgIHdpdGggYm9keTogJHtib2R5fWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNvbW1pdCBjaGFuZ2VzOiAkeyhlcnJvciBhcyBFcnJvcikuc3RhY2t9YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZGVzdFRhZyA9IHNyY1RhZyB8fCBvcHRzLnRhZztcbiAgaWYgKGRlc3RUYWcpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZHN0R2l0LmFkZFRhZyhkZXN0VGFnKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQ3JlYXRlZCBhIHRhZzogJHtkZXN0VGFnfWApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWdub3JlIHRoZSBlcnJvciBzaW5jZSBgLS1hYmJyZXY9MGAgbWF5IHlpZWxkIGEgdGFnIHRoYXQgYWxyZWFkeSBleGlzdHNcbiAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gY3JlYXRlIGEgdGFnOiAke2Rlc3RUYWd9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdHMuZHJ5KSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdGaW5pc2hlZCBkcnkgcnVuJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IChvcHRzLmJyYW5jaCA/IGRzdEdpdC5wdXNoKCdvcmlnaW4nLCBvcHRzLmJyYW5jaCkgOiBkc3RHaXQucHVzaCgpKTtcbiAgICBpZiAoZGVzdFRhZykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tbnVsbFxuICAgICAgYXdhaXQgZHN0R2l0LnB1c2goeyAnLS10YWdzJzogbnVsbCB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcHVzaCB0aGUgY29tbWl0OiAkeyhlcnJvciBhcyBFcnJvcikuc3RhY2t9YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdQdXNoZWQgdGhlIGNvbW1pdCcpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdENvbW1pdEhhc2gobG9nUmVzdWx0OiBMb2dSZXN1bHQpOiBbc3RyaW5nLCBzdHJpbmddIHwgW10ge1xuICBpZiAobG9nUmVzdWx0LmFsbC5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZGVidWcoJ05vIGNvbW1pdCBoaXN0b3J5Jyk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZm9yIChjb25zdCBsb2cgb2YgbG9nUmVzdWx0LmFsbCkge1xuICAgIGNvbnN0IFtoZWFkLCAuLi53b3Jkc10gPSBsb2cubWVzc2FnZS5yZXBsYWNlQWxsKC9bKCldL2csICcnKS5zcGxpdCgvW1xccy9dLyk7XG4gICAgaWYgKGhlYWQgPT09ICdzeW5jJyAmJiB3b3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gW2xvZy5tZXNzYWdlLCB3b3Jkcy5hdCgtMSkgYXMgc3RyaW5nXTtcbiAgICB9XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBObyBzeW5jIGNvbW1pdDogJHtsb2dSZXN1bHQuYWxsWzBdLm1lc3NhZ2V9YCk7XG4gIHJldHVybiBbXTtcbn1cbiIsImV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnMgPSB7XG4gIGRlc3Q6IHtcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2QnLFxuICAgIGRlc2NyaWJlOiAnQSBVUkwgb2YgYSBkZXN0aW5hdGlvbiBnaXQgcmVwb3NpdG9yeS4nLFxuICAgIGRlbWFuZDogdHJ1ZSxcbiAgfSxcbiAgcHJlZml4OiB7XG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdwJyxcbiAgICBkZXNjcmliZTogYEEgcHJlZml4IG9mIGEgY29tbWl0IGhhc2ggdXNlZCB0byBnZW5lcmF0ZSBhIGNvbW1pdCB0aXRsZSwgZS5nLiAnc3luYyA8cHJlZml4Pi88aGFzaD4nLlxuICAgICAgICAgICAgICAgQSB0eXBpY2FsIHZhbHVlIGlzIGxpa2UgJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9vbmUtd2F5LWdpdC1zeW5jL2NvbW1pdHMnYCxcbiAgfSxcbiAgYnJhbmNoOiB7XG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdiJyxcbiAgICBkZXNjcmliZTogJ1NwZWNpZnkgYnJhbmNoIG9mIGRlc3RpbmF0aW9uIHJlcG8uJyxcbiAgfSxcbiAgdGFnOiB7XG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd0JyxcbiAgICBkZXNjcmliZTogJ1NwZWNpZnkgdGFnIHRvIGJlIGNyZWF0ZWQgaW4gZGVzdGluYXRpb24gcmVwby4nLFxuICB9LFxuICAndGFnLWhhc2gnOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlc2NyaWJlOiAnQ3JlYXRlIHZlcnNpb24raGFzaCB0YWcgKGUuZy4gdjEuMzEuNS0yLWdjZGRlNTA3KS4gSXQgc2hvdWxkIGJlIGEgdW5pcXVlIHRhZy4nLFxuICB9LFxuICAndGFnLXZlcnNpb24nOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlc2NyaWJlOiAnQ3JlYXRlIHZlcnNpb24gdGFnIChlLmcuIHYxLjMxLjUpLiBJdCBjb3VsZCBiZSBhIG5vbi11bmlxdWUgdGFnLicsXG4gIH0sXG4gICdpZ25vcmUtcGF0dGVybnMnOiB7XG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2knLFxuICAgIGRlc2NyaWJlOiBgRXhjbHVkZSB0aGUgZmlsZXMgd2hvc2UgcGF0aCBtYXRjaGVzIG9uZSBvZiB0aGUgZ2l2ZW4gcGF0dGVybnMuXG4gICAgICAgICAgICAgICBUaGUgcGF0dGVybnMgYXJlIHByb2Nlc3NlZCBieSBtaWNyb21hdGNoIChodHRwczovL2dpdGh1Yi5jb20vbWljcm9tYXRjaC9taWNyb21hdGNoKS5cbiAgICAgICAgICAgICAgIFlvdSBtYXkgc3BlY2lmeSB0aGUgb3B0aW9uIG11bHRpcGxlIHRpbWVzLiBEZWZhdWx0IHZhbHVlIGlzIFwiLWkgLmdpdCAtaSAuZ2l0aHViIC1pIG5vZGVfbW9kdWxlcyAtaSAnLnJlbm92YXRlcmMuKicgLWkgJy5yZW5vdmF0ZS4qJ1wiYCxcbiAgICBkZWZhdWx0OiBbJy5naXQnLCAnLmdpdGh1YicsICdub2RlX21vZHVsZXMnLCAnLnJlbm92YXRlcmMuKicsICdyZW5vdmF0ZS4qJ10sXG4gIH0sXG4gIGRyeToge1xuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZXNjcmliZTogJ0VuYWJsZSBkcnktcnVuIG1vZGUuJyxcbiAgfSxcbiAgZm9yY2U6IHtcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVzY3JpYmU6ICdGb3JjZSB0byBvdmVyd3JpdGUgdGhlIGRlc3RpbmF0aW9uIGdpdCByZXBvc2l0b3J5LicsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgICBkZXNjcmliZTogJ1Nob3cgZGV0YWlscyBsb2dzLicsXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzL3lhcmdzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgc3luYyB9IGZyb20gJy4vc3luYy5qcyc7XG5pbXBvcnQgeyB5YXJnc09wdGlvbnMgfSBmcm9tICcuL3lhcmdzT3B0aW9ucy5qcyc7XG5cbmNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCdvbmUtd2F5LWdpdC1zeW5jJylcbiAgLm9wdGlvbnMoeWFyZ3NPcHRpb25zKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGxvZ2dlci5sZXZlbCA9IGFyZ3YudmVyYm9zZSA/ICd0cmFjZScgOiAnaW5mbyc7XG4gIH0pXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxuYXdhaXQgc3luYyhhcmd2KTtcbiIsImltcG9ydCB0eXBlIHsgU2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRHaXRIdWJDb21taXRzVXJsKGdpdDogU2ltcGxlR2l0KTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnM/LmZldGNoID8/IG9yaWdpbj8ucmVmcz8ucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnICYmIHJlbW90ZVVybC5pbmNsdWRlcygnZ2l0aHViLmNvbScpKSB7XG4gICAgY29uc3Qgd29yZHMgPSByZW1vdGVVcmwuc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSB3b3Jkcy5hdCgtMik7XG4gICAgY29uc3QgbmFtZSA9IHdvcmRzLmF0KC0xKT8ucmVwbGFjZSgvLmdpdCQvLCAnJyk7XG4gICAgaWYgKG9yZyAmJiBuYW1lKSByZXR1cm4gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke29yZ30vJHtuYW1lfS9jb21taXRzYDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImxvZ2dlciIsInBpbm8iLCJ0cmFuc3BvcnQiLCJ0YXJnZXQiLCJvcHRpb25zIiwiY29sb3JpemUiLCJzeW5jRGlyUGF0aCIsInBhdGgiLCJqb2luIiwieWFyZ3NPcHRpb25zIiwiZGVzdCIsInR5cGUiLCJhbGlhcyIsImRlc2NyaWJlIiwiZGVtYW5kIiwicHJlZml4IiwiYnJhbmNoIiwidGFnIiwiZGVmYXVsdCIsImRyeSIsImZvcmNlIiwidmVyYm9zZSIsImFyZ3YiLCJ5YXJncyIsImhpZGVCaW4iLCJwcm9jZXNzIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJsZXZlbCIsInN0cmljdCIsInZlcnNpb24iLCJwYWNrYWdlSnNvbkRpciIsImRpcm5hbWUiLCJVUkwiLCJ1cmwiLCJwYXRobmFtZSIsImZzIiwiZXhpc3RzU3luYyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsImdldFZlcnNpb24iLCJoZWxwIiwiYXN5bmMiLCJvcHRzIiwibWtkaXIiLCJyZWN1cnNpdmUiLCJkaXJQYXRoIiwibWtkdGVtcCIsInJldCIsImRlc3RSZXBvUGF0aCIsInNyY1JlcG9QYXRoIiwiY3dkIiwiY2xvbmVPcHRzIiwic2ltcGxlR2l0IiwiY2xvbmUiLCJjaGVja291dCIsImRlYnVnIiwiZHN0R2l0IiwiY29tbWl0SGFzaFJlc3VsdCIsImxvZ1Jlc3VsdCIsImFsbCIsImxlbmd0aCIsImxvZyIsImhlYWQiLCJ3b3JkcyIsIm1lc3NhZ2UiLCJyZXBsYWNlQWxsIiwic3BsaXQiLCJhdCIsImV4dHJhY3RDb21taXRIYXNoIiwiZnJvbSIsImVycm9yIiwic3JjR2l0Iiwic3JjTG9nIiwidG8iLCJ1bmRlZmluZWQiLCJzdGFjayIsImxhdGVzdEhhc2giLCJsYXRlc3QiLCJoYXNoIiwiaW5mbyIsImlnbm9yZVBhdHRlcm5zIiwiU2V0IiwibWFwIiwiU3RyaW5nIiwiZGVzdEZpbGVzIiwic3JjRmlsZXMiLCJQcm9taXNlIiwicmVhZGRpciIsIm1pY3JvbWF0Y2giLCJub3QiLCJkZXN0RmlsZSIsInJtIiwic3JjRmlsZSIsImNvcHkiLCJhZGQiLCJzcmNUYWciLCJkZXNjcmliZUNvbW1hbmQiLCJjaGlsZF9wcm9jZXNzIiwiZXhlY1N5bmMiLCJ0b1N0cmluZyIsInRyaW0iLCJnaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiZmluZCIsInIiLCJuYW1lIiwicmVtb3RlVXJsIiwicmVmcyIsImZldGNoIiwicHVzaCIsImluY2x1ZGVzIiwib3JnIiwicmVwbGFjZSIsImdldEdpdEh1YkNvbW1pdHNVcmwiLCJlbmRzV2l0aCIsImxpbmsiLCJ0aXRsZSIsImJvZHkiLCJsIiwiY29tbWl0IiwiZGVzdFRhZyIsImFkZFRhZyIsIndhcm4iLCJzeW5jQ29yZSIsImV4aXQiLCJzeW5jIl0sIm1hcHBpbmdzIjoia1RBRU8sTUFBTUEsRUFBU0MsRUFBSyxDQUN6QkMsVUFBVyxDQUNUQyxPQUFRLGNBQ1JDLFFBQVMsQ0FDUEMsVUFBVSxNQ1FoQixNQUFNQyxFQUFjQyxFQUFLQyxLQUFLLGVBQWdCLFFBQVMsaUJDZGhELE1B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
1
+ import e from"node:fs";import t from"node:path";import{hideBin as i}from"yargs/helpers";import o from"yargs/yargs";import{pino as r}from"pino";import a from"node:child_process";import n from"node:fs/promises";import{copy as s}from"fs-extra";import c from"micromatch";import{simpleGit as d}from"simple-git";const m=r({transport:{target:"pino-pretty",options:{colorize:!0}}});const l=t.join("node_modules",".temp","sync-git-repo");const g={dest:{type:"string",alias:"d",describe:"A URL of a destination git repository.",demand:!0},prefix:{type:"string",alias:"p",describe:"A prefix of a commit hash used to generate a commit title, e.g. 'sync <prefix>/<hash>'.\n A typical value is like 'https://github.com/WillBooster/one-way-git-sync/commits'"},branch:{type:"string",alias:"b",describe:"Specify branch of destination repo."},tag:{type:"string",alias:"t",describe:"Specify tag to be created in destination repo."},"tag-hash":{type:"boolean",describe:"Create version+hash tag (e.g. v1.31.5-2-gcdde507). It should be a unique tag."},"tag-version":{type:"boolean",describe:"Create version tag (e.g. v1.31.5). It could be a non-unique tag."},"ignore-patterns":{type:"array",alias:"i",describe:"Exclude the files whose path matches one of the given patterns.\n The patterns are processed by micromatch (https://github.com/micromatch/micromatch).\n You may specify the option multiple times. Default value is \"-i .git -i .github -i node_modules -i '.renovaterc.*' -i '.renovate.*'\"",default:[".git",".github","node_modules",".renovaterc.*","renovate.*"]},dry:{type:"boolean",describe:"Enable dry-run mode."},force:{type:"boolean",describe:"Force to overwrite the destination git repository."},verbose:{type:"boolean",alias:"v",describe:"Show details logs."}},p=await o(i(process.argv)).scriptName("one-way-git-sync").options(g).middleware(e=>{m.level=e.verbose?"trace":"info"}).strict().version(function(){let i=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(i,"package.json"));)i=t.dirname(i);return JSON.parse(e.readFileSync(t.join(i,"package.json"),"utf8")).version}()).help().argv;await async function(e){await n.mkdir(l,{recursive:!0});const i=await n.mkdtemp(t.join(l,"repo-")),o=await async function(e,i,o=process.cwd()){const r={"--single-branch":null};i.force||(r["--depth"]=1);i.branch&&(r["--branch"]=i.branch);try{await d(o).clone(i.dest,e,r)}catch{delete r["--branch"],delete r["--single-branch"],await d(o).clone(i.dest,e,r),await d(e).checkout(["-b",i.branch])}m.debug(`Cloned destination repo on ${e}`);const l=d(e);let g=[];try{g=function(e){if(0===e.all.length)return m.debug("No commit history"),[];for(const t of e.all){const[e,...i]=t.message.replaceAll(/[()]/g,"").split(/[\s/]/);if("sync"===e&&i.length>0)return[t.message,i.at(-1)]}const[t]=e.all;t&&m.debug(`No sync commit: ${t.message}`);return[]}(await l.log())}catch{}const[p,h]=g;if(h)m.debug(`Extracted a valid commit: ${h}`),m.debug(`(${p})`);else if(!i.force)return m.error("No valid commit in destination repo"),!1;const u=d(o);let f;try{f=await u.log(h?{from:h,to:"HEAD","--first-parent":void 0}:void 0)}catch(e){return m.error(`Failed to get source commit history: ${e.stack}`),!1}const b=f.latest?.hash;if(!b)return m.info("No synchronizable commit"),!0;const y=[...new Set([...i["ignore-patterns"].map(String),".git"])];let[w,v]=await Promise.all([n.readdir(e),n.readdir(o)]);w=c.not(w,y),v=c.not(v,y),m.debug("destFiles: %o",w),m.debug("srcFiles: %o",v);for(const i of w)await n.rm(t.join(e,i),{recursive:!0,force:!0});for(const i of v)await s(t.join(o,i),t.join(e,i));await l.add("-A");let $="";if(i["tag-hash"]||i["tag-version"]){const e="git describe --tags --always "+(i["tag-version"]?"--abbrev=0":"");$=a.execSync(e,{cwd:o}).toString().trim()}let j=i.prefix??await async function(e){const t=(await e.getRemotes(!0)).find(e=>"origin"===e.name);if(!t)return;let i=t.refs.fetch;if(i||(i=t.refs.push),"string"==typeof i&&i.includes("github.com")){const e=i.split("/"),t=e.at(-2),o=e.at(-1)?.replace(/.git$/,"");if(t&&o)return`https://github.com/${t}/${o}/commits`}}(u)??"";j&&!j.endsWith("/")&&(j+="/");const x=`${j}${b}`,S=$?`sync ${$} (${x})`:`sync ${x}`,k=h?f.all.map(e=>`* ${e.message}`).join("\n\n"):`Replace all the files with those of ${i.dest} due to missing sync commit.`;try{const e=await l.commit(`${S}\n\n${k}`);m.debug("Created a commit: %o",e),m.debug(S),m.debug(` with body: ${k}`)}catch(e){return m.error(`Failed to commit changes: ${e.stack}`),!1}const F=$||i.tag;if(F)try{await l.addTag(F),m.debug(`Created a tag: ${F}`)}catch{m.warn(`Failed to create a tag: ${F}`)}if(i.dry)return m.debug("Finished dry run"),!0;try{await(i.branch?l.push("origin",i.branch):l.push()),F&&await l.push({"--tags":null})}catch(e){return m.error(`Failed to push the commit: ${e.stack}`),!1}return m.debug("Pushed the commit"),!0}(i,e);process.exit(o?0:1)}(p);
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvc3luYy50cyIsIi4uL3NyYy95YXJnc09wdGlvbnMudHMiLCIuLi9zcmMvaW5kZXgudHMiLCIuLi9zcmMvZ2l0SHViLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBpbm8gfSBmcm9tICdwaW5vJztcblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IHBpbm8oe1xuICB0cmFuc3BvcnQ6IHtcbiAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXG4gICAgb3B0aW9uczoge1xuICAgICAgY29sb3JpemU6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvcHkgfSBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgbWljcm9tYXRjaCBmcm9tICdtaWNyb21hdGNoJztcbmltcG9ydCB0eXBlIHsgTG9nUmVzdWx0LCBPcHRpb25zLCBTaW1wbGVHaXQsIFRhc2tPcHRpb25zIH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZ2V0R2l0SHViQ29tbWl0c1VybCB9IGZyb20gJy4vZ2l0SHViLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgeWFyZ3NPcHRpb25zIH0gZnJvbSAnLi95YXJnc09wdGlvbnMuanMnO1xuXG5jb25zdCBzeW5jRGlyUGF0aCA9IHBhdGguam9pbignbm9kZV9tb2R1bGVzJywgJy50ZW1wJywgJ3N5bmMtZ2l0LXJlcG8nKTtcblxuZXhwb3J0IHR5cGUgWWFyZ3NPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zPjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN5bmMob3B0czogWWFyZ3NPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLm1rZGlyKHN5bmNEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZGlyUGF0aCA9IGF3YWl0IGZzLm1rZHRlbXAocGF0aC5qb2luKHN5bmNEaXJQYXRoLCAncmVwby0nKSk7XG4gIGNvbnN0IHJldCA9IGF3YWl0IHN5bmNDb3JlKGRpclBhdGgsIG9wdHMpO1xuICAvLyBhd2FpdCBmcy5ybShkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIHByb2Nlc3MuZXhpdChyZXQgPyAwIDogMSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzeW5jQ29yZShcbiAgZGVzdFJlcG9QYXRoOiBzdHJpbmcsXG4gIG9wdHM6IFlhcmdzT3B0aW9ucyxcbiAgc3JjUmVwb1BhdGggPSBwcm9jZXNzLmN3ZCgpXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tbnVsbFxuICBjb25zdCBjbG9uZU9wdHM6IE9wdGlvbnMgPSB7ICctLXNpbmdsZS1icmFuY2gnOiBudWxsIH07XG4gIGlmICghb3B0cy5mb3JjZSkge1xuICAgIGNsb25lT3B0c1snLS1kZXB0aCddID0gMTtcbiAgfVxuICBpZiAob3B0cy5icmFuY2gpIHtcbiAgICBjbG9uZU9wdHNbJy0tYnJhbmNoJ10gPSBvcHRzLmJyYW5jaDtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IHNpbXBsZUdpdChzcmNSZXBvUGF0aCkuY2xvbmUob3B0cy5kZXN0LCBkZXN0UmVwb1BhdGgsIGNsb25lT3B0cyk7XG4gIH0gY2F0Y2gge1xuICAgIGRlbGV0ZSBjbG9uZU9wdHNbJy0tYnJhbmNoJ107XG4gICAgZGVsZXRlIGNsb25lT3B0c1snLS1zaW5nbGUtYnJhbmNoJ107XG4gICAgYXdhaXQgc2ltcGxlR2l0KHNyY1JlcG9QYXRoKS5jbG9uZShvcHRzLmRlc3QsIGRlc3RSZXBvUGF0aCwgY2xvbmVPcHRzKTtcbiAgICBhd2FpdCBzaW1wbGVHaXQoZGVzdFJlcG9QYXRoKS5jaGVja291dChbJy1iJywgb3B0cy5icmFuY2hdIGFzIFRhc2tPcHRpb25zKTtcbiAgfVxuICBsb2dnZXIuZGVidWcoYENsb25lZCBkZXN0aW5hdGlvbiByZXBvIG9uICR7ZGVzdFJlcG9QYXRofWApO1xuXG4gIGNvbnN0IGRzdEdpdDogU2ltcGxlR2l0ID0gc2ltcGxlR2l0KGRlc3RSZXBvUGF0aCk7XG4gIGxldCBjb21taXRIYXNoUmVzdWx0OiBbc3RyaW5nLCBzdHJpbmddIHwgW10gPSBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkc3RMb2cgPSBhd2FpdCBkc3RHaXQubG9nKCk7XG4gICAgY29tbWl0SGFzaFJlc3VsdCA9IGV4dHJhY3RDb21taXRIYXNoKGRzdExvZyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICBjb25zdCBbaGVhZCwgZnJvbV0gPSBjb21taXRIYXNoUmVzdWx0O1xuICBpZiAoZnJvbSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgRXh0cmFjdGVkIGEgdmFsaWQgY29tbWl0OiAke2Zyb219YCk7XG4gICAgbG9nZ2VyLmRlYnVnKGAoJHtoZWFkfSlgKTtcbiAgfSBlbHNlIGlmICghb3B0cy5mb3JjZSkge1xuICAgIGxvZ2dlci5lcnJvcignTm8gdmFsaWQgY29tbWl0IGluIGRlc3RpbmF0aW9uIHJlcG8nKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBzcmNHaXQ6IFNpbXBsZUdpdCA9IHNpbXBsZUdpdChzcmNSZXBvUGF0aCk7XG4gIGxldCBzcmNMb2c6IExvZ1Jlc3VsdDtcbiAgdHJ5IHtcbiAgICAvLyAnLS1maXJzdC1wYXJlbnQnIGhpZGVzIGNoaWxkcmVuIGNvbW1pdHMgb2YgbWVyZ2UgY29tbWl0c1xuICAgIHNyY0xvZyA9IGF3YWl0IHNyY0dpdC5sb2coZnJvbSA/IHsgZnJvbSwgdG86ICdIRUFEJywgJy0tZmlyc3QtcGFyZW50JzogdW5kZWZpbmVkIH0gOiB1bmRlZmluZWQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGdldCBzb3VyY2UgY29tbWl0IGhpc3Rvcnk6ICR7KGVycm9yIGFzIEVycm9yKS5zdGFja31gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBsYXRlc3RIYXNoID0gc3JjTG9nLmxhdGVzdD8uaGFzaDtcbiAgaWYgKCFsYXRlc3RIYXNoKSB7XG4gICAgbG9nZ2VyLmluZm8oJ05vIHN5bmNocm9uaXphYmxlIGNvbW1pdCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gRm9yY2UgdG8gaWdub3JlIC5naXQgZGlyZWN0b3J5XG4gIGNvbnN0IGlnbm9yZVBhdHRlcm5zID0gWy4uLm5ldyBTZXQoWy4uLm9wdHNbJ2lnbm9yZS1wYXR0ZXJucyddLm1hcChTdHJpbmcpLCAnLmdpdCddKV07XG4gIGxldCBbZGVzdEZpbGVzLCBzcmNGaWxlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbZnMucmVhZGRpcihkZXN0UmVwb1BhdGgpLCBmcy5yZWFkZGlyKHNyY1JlcG9QYXRoKV0pO1xuICBkZXN0RmlsZXMgPSBtaWNyb21hdGNoLm5vdChkZXN0RmlsZXMsIGlnbm9yZVBhdHRlcm5zKTtcbiAgc3JjRmlsZXMgPSBtaWNyb21hdGNoLm5vdChzcmNGaWxlcywgaWdub3JlUGF0dGVybnMpO1xuICBsb2dnZXIuZGVidWcoJ2Rlc3RGaWxlczogJW8nLCBkZXN0RmlsZXMpO1xuICBsb2dnZXIuZGVidWcoJ3NyY0ZpbGVzOiAlbycsIHNyY0ZpbGVzKTtcbiAgZm9yIChjb25zdCBkZXN0RmlsZSBvZiBkZXN0RmlsZXMpIHtcbiAgICBhd2FpdCBmcy5ybShwYXRoLmpvaW4oZGVzdFJlcG9QYXRoLCBkZXN0RmlsZSksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuICBmb3IgKGNvbnN0IHNyY0ZpbGUgb2Ygc3JjRmlsZXMpIHtcbiAgICBhd2FpdCBjb3B5KHBhdGguam9pbihzcmNSZXBvUGF0aCwgc3JjRmlsZSksIHBhdGguam9pbihkZXN0UmVwb1BhdGgsIHNyY0ZpbGUpKTtcbiAgfVxuICBhd2FpdCBkc3RHaXQuYWRkKCctQScpO1xuXG4gIGxldCBzcmNUYWcgPSAnJztcbiAgaWYgKG9wdHNbJ3RhZy1oYXNoJ10gfHwgb3B0c1sndGFnLXZlcnNpb24nXSkge1xuICAgIC8vIGUuZy4gYC0tYWJicmV2PTBgIGNoYW5nZXMgYHYxLjMxLjUtMi1nY2RkZTUwN2AgdG8gYHYxLjMxLjVgXG4gICAgY29uc3QgZGVzY3JpYmVDb21tYW5kID0gYGdpdCBkZXNjcmliZSAtLXRhZ3MgLS1hbHdheXMgJHtvcHRzWyd0YWctdmVyc2lvbiddID8gJy0tYWJicmV2PTAnIDogJyd9YDtcbiAgICBzcmNUYWcgPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKGRlc2NyaWJlQ29tbWFuZCwgeyBjd2Q6IHNyY1JlcG9QYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICB9XG4gIGxldCBwcmVmaXggPSBvcHRzLnByZWZpeCA/PyAoYXdhaXQgZ2V0R2l0SHViQ29tbWl0c1VybChzcmNHaXQpKSA/PyAnJztcbiAgaWYgKHByZWZpeCAmJiAhcHJlZml4LmVuZHNXaXRoKCcvJykpIHtcbiAgICBwcmVmaXggKz0gJy8nO1xuICB9XG4gIGNvbnN0IGxpbmsgPSBgJHtwcmVmaXh9JHtsYXRlc3RIYXNofWA7XG4gIGNvbnN0IHRpdGxlID0gc3JjVGFnID8gYHN5bmMgJHtzcmNUYWd9ICgke2xpbmt9KWAgOiBgc3luYyAke2xpbmt9YDtcbiAgY29uc3QgYm9keSA9IGZyb21cbiAgICA/IHNyY0xvZy5hbGwubWFwKChsKSA9PiBgKiAke2wubWVzc2FnZX1gKS5qb2luKCdcXG5cXG4nKVxuICAgIDogYFJlcGxhY2UgYWxsIHRoZSBmaWxlcyB3aXRoIHRob3NlIG9mICR7b3B0cy5kZXN0fSBkdWUgdG8gbWlzc2luZyBzeW5jIGNvbW1pdC5gO1xuICB0cnkge1xuICAgIGNvbnN0IHJldCA9IGF3YWl0IGRzdEdpdC5jb21taXQoYCR7dGl0bGV9XFxuXFxuJHtib2R5fWApO1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ3JlYXRlZCBhIGNvbW1pdDogJW9gLCByZXQpO1xuICAgIGxvZ2dlci5kZWJ1Zyh0aXRsZSk7XG4gICAgbG9nZ2VyLmRlYnVnKGAgIHdpdGggYm9keTogJHtib2R5fWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNvbW1pdCBjaGFuZ2VzOiAkeyhlcnJvciBhcyBFcnJvcikuc3RhY2t9YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZGVzdFRhZyA9IHNyY1RhZyB8fCBvcHRzLnRhZztcbiAgaWYgKGRlc3RUYWcpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZHN0R2l0LmFkZFRhZyhkZXN0VGFnKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQ3JlYXRlZCBhIHRhZzogJHtkZXN0VGFnfWApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWdub3JlIHRoZSBlcnJvciBzaW5jZSBgLS1hYmJyZXY9MGAgbWF5IHlpZWxkIGEgdGFnIHRoYXQgYWxyZWFkeSBleGlzdHNcbiAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gY3JlYXRlIGEgdGFnOiAke2Rlc3RUYWd9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdHMuZHJ5KSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdGaW5pc2hlZCBkcnkgcnVuJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IChvcHRzLmJyYW5jaCA/IGRzdEdpdC5wdXNoKCdvcmlnaW4nLCBvcHRzLmJyYW5jaCkgOiBkc3RHaXQucHVzaCgpKTtcbiAgICBpZiAoZGVzdFRhZykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tbnVsbFxuICAgICAgYXdhaXQgZHN0R2l0LnB1c2goeyAnLS10YWdzJzogbnVsbCB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcHVzaCB0aGUgY29tbWl0OiAkeyhlcnJvciBhcyBFcnJvcikuc3RhY2t9YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdQdXNoZWQgdGhlIGNvbW1pdCcpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdENvbW1pdEhhc2gobG9nUmVzdWx0OiBMb2dSZXN1bHQpOiBbc3RyaW5nLCBzdHJpbmddIHwgW10ge1xuICBpZiAobG9nUmVzdWx0LmFsbC5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZGVidWcoJ05vIGNvbW1pdCBoaXN0b3J5Jyk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZm9yIChjb25zdCBsb2cgb2YgbG9nUmVzdWx0LmFsbCkge1xuICAgIGNvbnN0IFtoZWFkLCAuLi53b3Jkc10gPSBsb2cubWVzc2FnZS5yZXBsYWNlQWxsKC9bKCldL2csICcnKS5zcGxpdCgvW1xccy9dLyk7XG4gICAgaWYgKGhlYWQgPT09ICdzeW5jJyAmJiB3b3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gW2xvZy5tZXNzYWdlLCB3b3Jkcy5hdCgtMSkgYXMgc3RyaW5nXTtcbiAgICB9XG4gIH1cbiAgY29uc3QgW2ZpcnN0TG9nXSA9IGxvZ1Jlc3VsdC5hbGw7XG4gIGlmIChmaXJzdExvZykge1xuICAgIGxvZ2dlci5kZWJ1ZyhgTm8gc3luYyBjb21taXQ6ICR7Zmlyc3RMb2cubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gW107XG59XG4iLCJleHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zID0ge1xuICBkZXN0OiB7XG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdkJyxcbiAgICBkZXNjcmliZTogJ0EgVVJMIG9mIGEgZGVzdGluYXRpb24gZ2l0IHJlcG9zaXRvcnkuJyxcbiAgICBkZW1hbmQ6IHRydWUsXG4gIH0sXG4gIHByZWZpeDoge1xuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAncCcsXG4gICAgZGVzY3JpYmU6IGBBIHByZWZpeCBvZiBhIGNvbW1pdCBoYXNoIHVzZWQgdG8gZ2VuZXJhdGUgYSBjb21taXQgdGl0bGUsIGUuZy4gJ3N5bmMgPHByZWZpeD4vPGhhc2g+Jy5cbiAgICAgICAgICAgICAgIEEgdHlwaWNhbCB2YWx1ZSBpcyBsaWtlICdodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvb25lLXdheS1naXQtc3luYy9jb21taXRzJ2AsXG4gIH0sXG4gIGJyYW5jaDoge1xuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYicsXG4gICAgZGVzY3JpYmU6ICdTcGVjaWZ5IGJyYW5jaCBvZiBkZXN0aW5hdGlvbiByZXBvLicsXG4gIH0sXG4gIHRhZzoge1xuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndCcsXG4gICAgZGVzY3JpYmU6ICdTcGVjaWZ5IHRhZyB0byBiZSBjcmVhdGVkIGluIGRlc3RpbmF0aW9uIHJlcG8uJyxcbiAgfSxcbiAgJ3RhZy1oYXNoJzoge1xuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZXNjcmliZTogJ0NyZWF0ZSB2ZXJzaW9uK2hhc2ggdGFnIChlLmcuIHYxLjMxLjUtMi1nY2RkZTUwNykuIEl0IHNob3VsZCBiZSBhIHVuaXF1ZSB0YWcuJyxcbiAgfSxcbiAgJ3RhZy12ZXJzaW9uJzoge1xuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZXNjcmliZTogJ0NyZWF0ZSB2ZXJzaW9uIHRhZyAoZS5nLiB2MS4zMS41KS4gSXQgY291bGQgYmUgYSBub24tdW5pcXVlIHRhZy4nLFxuICB9LFxuICAnaWdub3JlLXBhdHRlcm5zJzoge1xuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdpJyxcbiAgICBkZXNjcmliZTogYEV4Y2x1ZGUgdGhlIGZpbGVzIHdob3NlIHBhdGggbWF0Y2hlcyBvbmUgb2YgdGhlIGdpdmVuIHBhdHRlcm5zLlxuICAgICAgICAgICAgICAgVGhlIHBhdHRlcm5zIGFyZSBwcm9jZXNzZWQgYnkgbWljcm9tYXRjaCAoaHR0cHM6Ly9naXRodWIuY29tL21pY3JvbWF0Y2gvbWljcm9tYXRjaCkuXG4gICAgICAgICAgICAgICBZb3UgbWF5IHNwZWNpZnkgdGhlIG9wdGlvbiBtdWx0aXBsZSB0aW1lcy4gRGVmYXVsdCB2YWx1ZSBpcyBcIi1pIC5naXQgLWkgLmdpdGh1YiAtaSBub2RlX21vZHVsZXMgLWkgJy5yZW5vdmF0ZXJjLionIC1pICcucmVub3ZhdGUuKidcImAsXG4gICAgZGVmYXVsdDogWycuZ2l0JywgJy5naXRodWInLCAnbm9kZV9tb2R1bGVzJywgJy5yZW5vdmF0ZXJjLionLCAncmVub3ZhdGUuKiddLFxuICB9LFxuICBkcnk6IHtcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVzY3JpYmU6ICdFbmFibGUgZHJ5LXJ1biBtb2RlLicsXG4gIH0sXG4gIGZvcmNlOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlc2NyaWJlOiAnRm9yY2UgdG8gb3ZlcndyaXRlIHRoZSBkZXN0aW5hdGlvbiBnaXQgcmVwb3NpdG9yeS4nLFxuICB9LFxuICB2ZXJib3NlOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndicsXG4gICAgZGVzY3JpYmU6ICdTaG93IGRldGFpbHMgbG9ncy4nLFxuICB9LFxufSBhcyBjb25zdDtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncy95YXJncyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IHN5bmMgfSBmcm9tICcuL3N5bmMuanMnO1xuaW1wb3J0IHsgeWFyZ3NPcHRpb25zIH0gZnJvbSAnLi95YXJnc09wdGlvbnMuanMnO1xuXG5jb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnb25lLXdheS1naXQtc3luYycpXG4gIC5vcHRpb25zKHlhcmdzT3B0aW9ucylcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBsb2dnZXIubGV2ZWwgPSBhcmd2LnZlcmJvc2UgPyAndHJhY2UnIDogJ2luZm8nO1xuICB9KVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmF3YWl0IHN5bmMoYXJndik7XG4iLCJpbXBvcnQgdHlwZSB7IFNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0R2l0SHViQ29tbWl0c1VybChnaXQ6IFNpbXBsZUdpdCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgaWYgKCFvcmlnaW4pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IHJlbW90ZVVybDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3JpZ2luLnJlZnMuZmV0Y2g7XG4gIGlmICghcmVtb3RlVXJsKSB7XG4gICAgcmVtb3RlVXJsID0gb3JpZ2luLnJlZnMucHVzaDtcbiAgfVxuICBpZiAodHlwZW9mIHJlbW90ZVVybCA9PT0gJ3N0cmluZycgJiYgcmVtb3RlVXJsLmluY2x1ZGVzKCdnaXRodWIuY29tJykpIHtcbiAgICBjb25zdCB3b3JkcyA9IHJlbW90ZVVybC5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IHdvcmRzLmF0KC0yKTtcbiAgICBjb25zdCBuYW1lID0gd29yZHMuYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKTtcbiAgICBpZiAob3JnICYmIG5hbWUpIHJldHVybiBgaHR0cHM6Ly9naXRodWIuY29tLyR7b3JnfS8ke25hbWV9L2NvbW1pdHNgO1xuICB9XG59XG4iXSwibmFtZXMiOlsibG9nZ2VyIiwicGlubyIsInRyYW5zcG9ydCIsInRhcmdldCIsIm9wdGlvbnMiLCJjb2xvcml6ZSIsInN5bmNEaXJQYXRoIiwicGF0aCIsImpvaW4iLCJ5YXJnc09wdGlvbnMiLCJkZXN0IiwidHlwZSIsImFsaWFzIiwiZGVzY3JpYmUiLCJkZW1hbmQiLCJwcmVmaXgiLCJicmFuY2giLCJ0YWciLCJkZWZhdWx0IiwiZHJ5IiwiZm9yY2UiLCJ2ZXJib3NlIiwiYXJndiIsInlhcmdzIiwiaGlkZUJpbiIsInByb2Nlc3MiLCJzY3JpcHROYW1lIiwibWlkZGxld2FyZSIsImxldmVsIiwic3RyaWN0IiwidmVyc2lvbiIsInBhY2thZ2VKc29uRGlyIiwiZGlybmFtZSIsIlVSTCIsInVybCIsInBhdGhuYW1lIiwiZnMiLCJleGlzdHNTeW5jIiwiSlNPTiIsInBhcnNlIiwicmVhZEZpbGVTeW5jIiwiZ2V0VmVyc2lvbiIsImhlbHAiLCJhc3luYyIsIm9wdHMiLCJta2RpciIsInJlY3Vyc2l2ZSIsImRpclBhdGgiLCJta2R0ZW1wIiwicmV0IiwiZGVzdFJlcG9QYXRoIiwic3JjUmVwb1BhdGgiLCJjd2QiLCJjbG9uZU9wdHMiLCJzaW1wbGVHaXQiLCJjbG9uZSIsImNoZWNrb3V0IiwiZGVidWciLCJkc3RHaXQiLCJjb21taXRIYXNoUmVzdWx0IiwibG9nUmVzdWx0IiwiYWxsIiwibGVuZ3RoIiwibG9nIiwiaGVhZCIsIndvcmRzIiwibWVzc2FnZSIsInJlcGxhY2VBbGwiLCJzcGxpdCIsImF0IiwiZmlyc3RMb2ciLCJleHRyYWN0Q29tbWl0SGFzaCIsImZyb20iLCJlcnJvciIsInNyY0dpdCIsInNyY0xvZyIsInRvIiwidW5kZWZpbmVkIiwic3RhY2siLCJsYXRlc3RIYXNoIiwibGF0ZXN0IiwiaGFzaCIsImluZm8iLCJpZ25vcmVQYXR0ZXJucyIsIlNldCIsIm1hcCIsIlN0cmluZyIsImRlc3RGaWxlcyIsInNyY0ZpbGVzIiwiUHJvbWlzZSIsInJlYWRkaXIiLCJtaWNyb21hdGNoIiwibm90IiwiZGVzdEZpbGUiLCJybSIsInNyY0ZpbGUiLCJjb3B5IiwiYWRkIiwic3JjVGFnIiwiZGVzY3JpYmVDb21tYW5kIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwidG9TdHJpbmciLCJ0cmltIiwiZ2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsImZpbmQiLCJyIiwibmFtZSIsInJlbW90ZVVybCIsInJlZnMiLCJmZXRjaCIsInB1c2giLCJpbmNsdWRlcyIsIm9yZyIsInJlcGxhY2UiLCJnZXRHaXRIdWJDb21taXRzVXJsIiwiZW5kc1dpdGgiLCJsaW5rIiwidGl0bGUiLCJib2R5IiwibCIsImNvbW1pdCIsImRlc3RUYWciLCJhZGRUYWci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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "one-way-git-sync",
3
- "version": "6.0.26",
3
+ "version": "6.0.28",
4
4
  "description": "A tool for synchronizing a destination git repository with a source git repository SAFELY.",
5
5
  "keywords": [
6
6
  "git",
@@ -17,15 +17,17 @@
17
17
  ],
18
18
  "scripts": {
19
19
  "build": "build-ts app",
20
+ "check-all-for-ai": "yarn check-for-ai && yarn test",
21
+ "check-for-ai": "yarn install > /dev/null && yarn format > /dev/null 2> /dev/null || true && yarn lint-fix --quiet && yarn typecheck",
20
22
  "cleanup": "yarn format && yarn lint-fix",
21
23
  "format": "sort-package-json && yarn prettify",
22
24
  "_postinstall": "husky || true",
23
- "lint": "eslint --color \"./{scripts,src,tests}/**/*.{cjs,cts,js,jsx,mjs,mts,ts,tsx}\"",
25
+ "lint": "eslint --color",
24
26
  "lint-fix": "yarn lint --fix",
25
27
  "prepack": "pinst --disable",
26
28
  "postpack": "pinst --enable",
27
29
  "prepare": "husky || true",
28
- "prettify": "prettier --cache --color --write \"**/{.*/,}*.{cjs,css,cts,htm,html,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}\" \"!**/test-fixtures/**\"",
30
+ "prettify": "prettier --cache --color --write \"**/{.*/,}*.{cjs,css,cts,htm,html,java,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}\" \"!**/test{-,/}fixtures/**\" || true",
29
31
  "release": "yarn build && semantic-release",
30
32
  "start": "build-ts run src/index.ts --",
31
33
  "start-prod": "yarn build && yarn one-way-git-sync",
@@ -34,44 +36,46 @@
34
36
  },
35
37
  "prettier": "@willbooster/prettier-config",
36
38
  "dependencies": {
37
- "fs-extra": "11.3.1",
39
+ "fs-extra": "11.3.2",
38
40
  "micromatch": "4.0.8",
39
- "pino": "9.9.0",
40
- "pino-pretty": "13.1.1",
41
- "simple-git": "3.28.0",
42
- "yargs": "17.7.2"
41
+ "pino": "10.1.0",
42
+ "pino-pretty": "13.1.2",
43
+ "simple-git": "3.30.0",
44
+ "yargs": "18.0.0"
43
45
  },
44
46
  "devDependencies": {
45
- "@types/eslint": "8.56.11",
47
+ "@types/eslint": "9.6.1",
46
48
  "@types/fs-extra": "11.0.4",
47
- "@types/micromatch": "4.0.9",
48
- "@types/semantic-release": "20.0.6",
49
- "@types/yargs": "17.0.33",
50
- "@typescript-eslint/eslint-plugin": "8.39.1",
51
- "@typescript-eslint/parser": "8.39.1",
52
- "@willbooster/eslint-config-ts": "10.6.1",
53
- "@willbooster/prettier-config": "9.1.3",
54
- "build-ts": "13.2.3",
55
- "conventional-changelog-conventionalcommits": "8.0.0",
56
- "eslint": "8.57.0",
49
+ "@types/micromatch": "4.0.10",
50
+ "@types/yargs": "17.0.35",
51
+ "@willbooster/eslint-config-ts": "11.4.10",
52
+ "@willbooster/prettier-config": "10.2.1",
53
+ "build-ts": "17.0.2",
54
+ "conventional-changelog-conventionalcommits": "9.1.0",
55
+ "eslint": "9.39.1",
56
+ "eslint-config-flat-gitignore": "2.1.0",
57
57
  "eslint-config-prettier": "10.1.8",
58
- "eslint-import-resolver-typescript": "3.10.1",
59
- "eslint-plugin-import": "2.32.0",
58
+ "eslint-import-resolver-typescript": "4.4.4",
59
+ "eslint-plugin-import-x": "4.16.1",
60
60
  "eslint-plugin-sort-class-members": "1.21.0",
61
61
  "eslint-plugin-sort-destructure-keys": "2.0.0",
62
- "eslint-plugin-unicorn": "56.0.1",
62
+ "eslint-plugin-unicorn": "62.0.0",
63
+ "eslint-plugin-unused-imports": "4.3.0",
64
+ "globals": "16.5.0",
63
65
  "husky": "9.1.7",
64
- "lint-staged": "15.5.2",
66
+ "lint-staged": "16.2.6",
65
67
  "pinst": "3.0.0",
66
68
  "prettier": "3.6.2",
67
- "semantic-release": "24.2.7",
68
- "sort-package-json": "2.15.1",
69
- "typescript": "5.9.2",
70
- "vitest": "3.2.4"
69
+ "prettier-plugin-java": "2.7.7",
70
+ "semantic-release": "25.0.2",
71
+ "sort-package-json": "3.4.0",
72
+ "typescript": "5.9.3",
73
+ "typescript-eslint": "8.47.0",
74
+ "vitest": "4.0.10"
71
75
  },
72
- "packageManager": "yarn@4.9.2",
76
+ "packageManager": "yarn@4.11.0",
73
77
  "engines": {
74
- "node": ">=18"
78
+ "node": ">=24"
75
79
  },
76
80
  "publishConfig": {
77
81
  "access": "public"