diff --git a/.yarn/sdks/eslint/package.json b/.yarn/sdks/eslint/package.json index b9b9de3..8e25b10 100644 --- a/.yarn/sdks/eslint/package.json +++ b/.yarn/sdks/eslint/package.json @@ -1,6 +1,6 @@ { "name": "eslint", - "version": "7.19.0-pnpify", + "version": "7.26.0-pnpify", "main": "./lib/api.js", "type": "commonjs" } diff --git a/.yarn/sdks/typescript/package.json b/.yarn/sdks/typescript/package.json index 86d93a2..27270c7 100644 --- a/.yarn/sdks/typescript/package.json +++ b/.yarn/sdks/typescript/package.json @@ -1,6 +1,6 @@ { "name": "typescript", - "version": "4.2.2-pnpify", + "version": "4.2.4-pnpify", "main": "./lib/typescript.js", "type": "commonjs" } diff --git a/.yarnrc.yml b/.yarnrc.yml index dc14234..94ee55c 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -3,3 +3,6 @@ npmRegistries: npmAuthToken: "${NPM_PUBLISH_TOKEN:-invalid}" yarnPath: .yarn/releases/yarn-3.0.0-rc.2.cjs + +plugins: + - ./bundles/@yarnpkg/plugin-semver-up.js diff --git a/README.md b/README.md index ce9f1d7..ed21b19 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,54 @@ Yarn Berry plugin to update dependencies. +## Usage + +```sh +yarn semver up --config semver-up.json +``` + +Define a `semver-up.json` config file like so: + +```json +{ + "rules": [ + ["@babel/*", { + "maxPackageUpdates": false, + "preserveSemVerRange": true + }] + ], + "maxRulesApplied": 1 +} +``` + +"rules" takes an array of tuples of the form `[Package Name Glob, Config]`. You can set a default rule group via a wildcard like so: + +```json +{ + "rules": [ + ["@babel/*", { + "preserveSemVerRange": false + }], + ["*", { + "preserveSemVerRange": true + }], + ], + "maxRulesApplied": 1 +} +``` + +The rules are ordered by precedence. The first rule that matches is used when grouping packages. + +If you set `maxPackageUpdates` for a group, you can limit the number of packages within that group that are allowed to be updated. It defaults to "false" which means no limit. + +If you set `maxRulesApplied`, you can limit how many groups to update. It defaults to `1` with the idea that we want to keep pull requests constrainted to related dependencies. You can disable it by setting `maxRulesApplied` to false, thus removing the limit. + +You can use dry run mode to not commit changes to the package.jsons. + +```sh +yarn semver up --config semver-up.json --dry-run +``` + ## Contributors diff --git a/bundles/@yarnpkg/plugin-semver-up.js b/bundles/@yarnpkg/plugin-semver-up.js index 7f5fc9e..1390d2f 100644 --- a/bundles/@yarnpkg/plugin-semver-up.js +++ b/bundles/@yarnpkg/plugin-semver-up.js @@ -1,6 +1,27 @@ /* eslint-disable */ module.exports = { name: "@yarnpkg/plugin-semver-up", -factory: function (require) {var plugin;(()=>{"use strict";var e={d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{default:()=>a});const r=require("@yarnpkg/core"),n=require("clipanion");class o extends n.Command{async execute(){try{const e=await r.Configuration.find(this.context.cwd,this.context.plugins),{project:t}=await r.Project.find(e,this.context.cwd);return await t.restoreInstallState(),this.context.stdout.write("Done\n"),0}catch(e){return this.context.stderr.write(String(e)+"\n"),1}}}o.paths=[["semver","up"]],o.usage=n.Command.Usage({description:"",details:"",examples:[]});const a={hooks:{},commands:[o]};plugin=t})();return plugin; +factory: function (require) {var plugin;(()=>{"use strict";var e={110:(e,t,n)=>{const r=n(633),o=n(273),s=n(274),a=n(626),i=(e,t={})=>{let n=[];if(Array.isArray(e))for(let r of e){let e=i.create(r,t);Array.isArray(e)?n.push(...e):n.push(e)}else n=[].concat(i.create(e,t));return t&&!0===t.expand&&!0===t.nodupes&&(n=[...new Set(n)]),n};i.parse=(e,t={})=>a(e,t),i.stringify=(e,t={})=>r("string"==typeof e?i.parse(e,t):e,t),i.compile=(e,t={})=>("string"==typeof e&&(e=i.parse(e,t)),o(e,t)),i.expand=(e,t={})=>{"string"==typeof e&&(e=i.parse(e,t));let n=s(e,t);return!0===t.noempty&&(n=n.filter(Boolean)),!0===t.nodupes&&(n=[...new Set(n)]),n},i.create=(e,t={})=>""===e||e.length<3?[e]:!0!==t.expand?i.compile(e,t):i.expand(e,t),e.exports=i},273:(e,t,n)=>{const r=n(618),o=n(183);e.exports=(e,t={})=>{let n=(e,s={})=>{let a=o.isInvalidBrace(s),i=!0===e.invalid&&!0===t.escapeInvalid,u=!0===a||!0===i,p=!0===t.escapeInvalid?"\\":"",l="";if(!0===e.isOpen)return p+e.value;if(!0===e.isClose)return p+e.value;if("open"===e.type)return u?p+e.value:"(";if("close"===e.type)return u?p+e.value:")";if("comma"===e.type)return"comma"===e.prev.type?"":u?e.value:"|";if(e.value)return e.value;if(e.nodes&&e.ranges>0){let n=o.reduce(e.nodes),s=r(...n,{...t,wrap:!1,toRegex:!0});if(0!==s.length)return n.length>1&&s.length>1?`(${s})`:s}if(e.nodes)for(let t of e.nodes)l+=n(t,e);return l};return n(e)}},151:e=>{e.exports={MAX_LENGTH:65536,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:"\n",CHAR_NO_BREAK_SPACE:" ",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:"\t",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\ufeff"}},274:(e,t,n)=>{const r=n(618),o=n(633),s=n(183),a=(e="",t="",n=!1)=>{let r=[];if(e=[].concat(e),!(t=[].concat(t)).length)return e;if(!e.length)return n?s.flatten(t).map(e=>`{${e}}`):t;for(let o of e)if(Array.isArray(o))for(let e of o)r.push(a(e,t,n));else for(let e of t)!0===n&&"string"==typeof e&&(e=`{${e}}`),r.push(Array.isArray(e)?a(o,e,n):o+e);return s.flatten(r)};e.exports=(e,t={})=>{let n=void 0===t.rangeLimit?1e3:t.rangeLimit,i=(e,u={})=>{e.queue=[];let p=u,l=u.queue;for(;"brace"!==p.type&&"root"!==p.type&&p.parent;)p=p.parent,l=p.queue;if(e.invalid||e.dollar)return void l.push(a(l.pop(),o(e,t)));if("brace"===e.type&&!0!==e.invalid&&2===e.nodes.length)return void l.push(a(l.pop(),["{}"]));if(e.nodes&&e.ranges>0){let i=s.reduce(e.nodes);if(s.exceedsLimit(...i,t.step,n))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let u=r(...i,t);return 0===u.length&&(u=o(e,t)),l.push(a(l.pop(),u)),void(e.nodes=[])}let c=s.encloseBrace(e),f=e.queue,g=e;for(;"brace"!==g.type&&"root"!==g.type&&g.parent;)g=g.parent,f=g.queue;for(let t=0;t{const r=n(633),{MAX_LENGTH:o,CHAR_BACKSLASH:s,CHAR_BACKTICK:a,CHAR_COMMA:i,CHAR_DOT:u,CHAR_LEFT_PARENTHESES:p,CHAR_RIGHT_PARENTHESES:l,CHAR_LEFT_CURLY_BRACE:c,CHAR_RIGHT_CURLY_BRACE:f,CHAR_LEFT_SQUARE_BRACKET:g,CHAR_RIGHT_SQUARE_BRACKET:A,CHAR_DOUBLE_QUOTE:R,CHAR_SINGLE_QUOTE:h,CHAR_NO_BREAK_SPACE:d,CHAR_ZERO_WIDTH_NOBREAK_SPACE:_}=n(151);e.exports=(e,t={})=>{if("string"!=typeof e)throw new TypeError("Expected a string");let n=t||{},y="number"==typeof n.maxLength?Math.min(o,n.maxLength):o;if(e.length>y)throw new SyntaxError(`Input length (${e.length}), exceeds max characters (${y})`);let E,C={type:"root",input:e,nodes:[]},x=[C],S=C,v=C,b=0,m=e.length,H=0,T=0;const L=()=>e[H++],$=e=>{if("text"===e.type&&"dot"===v.type&&(v.type="text"),!v||"text"!==v.type||"text"!==e.type)return S.nodes.push(e),e.parent=S,e.prev=v,v=e,e;v.value+=e.value};for($({type:"bos"});H0){if(S.ranges>0){S.ranges=0;let e=S.nodes.shift();S.nodes=[e,{type:"text",value:r(S)}]}$({type:"comma",value:E}),S.commas++}else if(E===u&&T>0&&0===S.commas){let e=S.nodes;if(0===T||0===e.length){$({type:"text",value:E});continue}if("dot"===v.type){if(S.range=[],v.value+=E,v.type="range",3!==S.nodes.length&&5!==S.nodes.length){S.invalid=!0,S.ranges=0,v.type="text";continue}S.ranges++,S.args=[];continue}if("range"===v.type){e.pop();let t=e[e.length-1];t.value+=v.value+E,v=t,S.ranges--;continue}$({type:"dot",value:E})}else $({type:"text",value:E});else{if("brace"!==S.type){$({type:"text",value:E});continue}let e="close";S=x.pop(),S.close=!0,$({type:e,value:E}),T--,S=x[x.length-1]}else{T++;let e=v.value&&"$"===v.value.slice(-1)||!0===S.dollar;S=$({type:"brace",open:!0,close:!1,dollar:e,depth:T,commas:0,ranges:0,nodes:[]}),x.push(S),$({type:"open",value:E})}else{let e,n=E;for(!0!==t.keepQuotes&&(E="");H{e.nodes||("open"===e.type&&(e.isOpen=!0),"close"===e.type&&(e.isClose=!0),e.nodes||(e.type="text"),e.invalid=!0)});let e=x[x.length-1],t=e.nodes.indexOf(S);e.nodes.splice(t,1,...S.nodes)}}while(x.length>0);return $({type:"eos"}),C}},633:(e,t,n)=>{const r=n(183);e.exports=(e,t={})=>{let n=(e,o={})=>{let s=t.escapeInvalid&&r.isInvalidBrace(o),a=!0===e.invalid&&!0===t.escapeInvalid,i="";if(e.value)return(s||a)&&r.isOpenOrClose(e)?"\\"+e.value:e.value;if(e.value)return e.value;if(e.nodes)for(let t of e.nodes)i+=n(t);return i};return n(e)}},183:(e,t)=>{t.isInteger=e=>"number"==typeof e?Number.isInteger(e):"string"==typeof e&&""!==e.trim()&&Number.isInteger(Number(e)),t.find=(e,t)=>e.nodes.find(e=>e.type===t),t.exceedsLimit=(e,n,r=1,o)=>!1!==o&&(!(!t.isInteger(e)||!t.isInteger(n))&&(Number(n)-Number(e))/Number(r)>=o),t.escapeNode=(e,t=0,n)=>{let r=e.nodes[t];r&&(n&&r.type===n||"open"===r.type||"close"===r.type)&&!0!==r.escaped&&(r.value="\\"+r.value,r.escaped=!0)},t.encloseBrace=e=>"brace"===e.type&&(e.commas>>0+e.ranges>>0==0&&(e.invalid=!0,!0)),t.isInvalidBrace=e=>"brace"===e.type&&(!(!0!==e.invalid&&!e.dollar)||(e.commas>>0+e.ranges>>0==0||!0!==e.open||!0!==e.close)&&(e.invalid=!0,!0)),t.isOpenOrClose=e=>"open"===e.type||"close"===e.type||(!0===e.open||!0===e.close),t.reduce=e=>e.reduce((e,t)=>("text"===t.type&&e.push(t.value),"range"===t.type&&(t.type="text"),e),[]),t.flatten=(...e)=>{const t=[],n=e=>{for(let r=0;r{ +/*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + */ +const r=n(669),o=n(716),s=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),a=e=>"number"==typeof e||"string"==typeof e&&""!==e,i=e=>Number.isInteger(+e),u=e=>{let t=""+e,n=-1;if("-"===t[0]&&(t=t.slice(1)),"0"===t)return!1;for(;"0"===t[++n];);return n>0},p=(e,t,n)=>{if(t>0){let n="-"===e[0]?"-":"";n&&(e=e.slice(1)),e=n+e.padStart(n?t-1:t,"0")}return!1===n?String(e):e},l=(e,t)=>{let n="-"===e[0]?"-":"";for(n&&(e=e.slice(1),t--);e.length{if(n)return o(e,t,{wrap:!1,...r});let s=String.fromCharCode(e);return e===t?s:`[${s}-${String.fromCharCode(t)}]`},f=(e,t,n)=>{if(Array.isArray(e)){let t=!0===n.wrap,r=n.capture?"":"?:";return t?`(${r}${e.join("|")})`:e.join("|")}return o(e,t,n)},g=(...e)=>new RangeError("Invalid range arguments: "+r.inspect(...e)),A=(e,t,n)=>{if(!0===n.strictRanges)throw g([e,t]);return[]},R=(e,t,n=1,r={})=>{let o=Number(e),s=Number(t);if(!Number.isInteger(o)||!Number.isInteger(s)){if(!0===r.strictRanges)throw g([e,t]);return[]}0===o&&(o=0),0===s&&(s=0);let a=o>s,i=String(e),A=String(t),R=String(n);n=Math.max(Math.abs(n),1);let h=u(i)||u(A)||u(R),d=h?Math.max(i.length,A.length,R.length):0,_=!1===h&&!1===((e,t,n)=>"string"==typeof e||"string"==typeof t||!0===n.stringify)(e,t,r),y=r.transform||(e=>t=>!0===e?Number(t):String(t))(_);if(r.toRegex&&1===n)return c(l(e,d),l(t,d),!0,r);let E={negatives:[],positives:[]},C=[],x=0;for(;a?o>=s:o<=s;)!0===r.toRegex&&n>1?E[(S=o)<0?"negatives":"positives"].push(Math.abs(S)):C.push(p(y(o,x),d,_)),o=a?o-n:o+n,x++;var S;return!0===r.toRegex?n>1?((e,t)=>{e.negatives.sort((e,t)=>et?1:0),e.positives.sort((e,t)=>et?1:0);let n,r=t.capture?"":"?:",o="",s="";return e.positives.length&&(o=e.positives.join("|")),e.negatives.length&&(s=`-(${r}${e.negatives.join("|")})`),n=o&&s?`${o}|${s}`:o||s,t.wrap?`(${r}${n})`:n})(E,r):f(C,null,{wrap:!1,...r}):C},h=(e,t,n,r={})=>{if(null==t&&a(e))return[e];if(!a(e)||!a(t))return A(e,t,r);if("function"==typeof n)return h(e,t,1,{transform:n});if(s(n))return h(e,t,0,n);let o={...r};return!0===o.capture&&(o.wrap=!0),n=n||o.step||1,i(n)?i(e)&&i(t)?R(e,t,n,o):((e,t,n=1,r={})=>{if(!i(e)&&e.length>1||!i(t)&&t.length>1)return A(e,t,r);let o=r.transform||(e=>String.fromCharCode(e)),s=(""+e).charCodeAt(0),a=(""+t).charCodeAt(0),u=s>a,p=Math.min(s,a),l=Math.max(s,a);if(r.toRegex&&1===n)return c(p,l,!1,r);let g=[],R=0;for(;u?s>=a:s<=a;)g.push(o(s,R)),s=u?s-n:s+n,R++;return!0===r.toRegex?f(g,null,{wrap:!1,options:r}):g})(e,t,Math.max(Math.abs(n),1),o):null==n||s(n)?h(e,t,1,n):((e,t)=>{if(!0===t.strictRanges)throw new TypeError(`Expected step "${e}" to be a number`);return[]})(n,o)};e.exports=h},175:e=>{ +/*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */ +e.exports=function(e){return"number"==typeof e?e-e==0:"string"==typeof e&&""!==e.trim()&&(Number.isFinite?Number.isFinite(+e):isFinite(+e))}},461:(e,t,n)=>{const r=n(669),o=n(110),s=n(173),a=n(689),i=e=>""===e||"./"===e,u=(e,t,n)=>{t=[].concat(t),e=[].concat(e);let r=new Set,o=new Set,a=new Set,i=0,u=e=>{a.add(e.output),n&&n.onResult&&n.onResult(e)};for(let a=0;a!r.has(e));if(n&&0===p.length){if(!0===n.failglob)throw new Error(`No matches found for "${t.join(", ")}"`);if(!0===n.nonull||!0===n.nullglob)return n.unescape?t.map(e=>e.replace(/\\/g,"")):t}return p};u.match=u,u.matcher=(e,t)=>s(e,t),u.any=u.isMatch=(e,t,n)=>s(t,n)(e),u.not=(e,t,n={})=>{t=[].concat(t).map(String);let r=new Set,o=[],s=u(e,t,{...n,onResult:e=>{n.onResult&&n.onResult(e),o.push(e.output)}});for(let e of o)s.includes(e)||r.add(e);return[...r]},u.contains=(e,t,n)=>{if("string"!=typeof e)throw new TypeError(`Expected a string: "${r.inspect(e)}"`);if(Array.isArray(t))return t.some(t=>u.contains(e,t,n));if("string"==typeof t){if(i(e)||i(t))return!1;if(e.includes(t)||e.startsWith("./")&&e.slice(2).includes(t))return!0}return u.isMatch(e,t,{...n,contains:!0})},u.matchKeys=(e,t,n)=>{if(!a.isObject(e))throw new TypeError("Expected the first argument to be an object");let r=u(Object.keys(e),t,n),o={};for(let t of r)o[t]=e[t];return o},u.some=(e,t,n)=>{let r=[].concat(e);for(let e of[].concat(t)){let t=s(String(e),n);if(r.some(e=>t(e)))return!0}return!1},u.every=(e,t,n)=>{let r=[].concat(e);for(let e of[].concat(t)){let t=s(String(e),n);if(!r.every(e=>t(e)))return!1}return!0},u.all=(e,t,n)=>{if("string"!=typeof e)throw new TypeError(`Expected a string: "${r.inspect(e)}"`);return[].concat(t).every(t=>s(t,n)(e))},u.capture=(e,t,n)=>{let r=a.isWindows(n),o=s.makeRe(String(e),{...n,capture:!0}).exec(r?a.toPosixSlashes(t):t);if(o)return o.slice(1).map(e=>void 0===e?"":e)},u.makeRe=(...e)=>s.makeRe(...e),u.scan=(...e)=>s.scan(...e),u.parse=(e,t)=>{let n=[];for(let r of[].concat(e||[]))for(let e of o(String(r),t))n.push(s.parse(e,t));return n},u.braces=(e,t)=>{if("string"!=typeof e)throw new TypeError("Expected a string");return t&&!0===t.nobrace||!/\{.*\}/.test(e)?[e]:o(e,t)},u.braceExpand=(e,t)=>{if("string"!=typeof e)throw new TypeError("Expected a string");return u.braces(e,{...t,expand:!0})},e.exports=u},173:(e,t,n)=>{e.exports=n(843)},201:(e,t,n)=>{const r=n(622),o={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR:"(?=.)",QMARK:"[^/]",END_ANCHOR:"(?:\\/|$)",DOTS_SLASH:"\\.{1,2}(?:\\/|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|\\/)\\.{1,2}(?:\\/|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:\\/|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:\\/|$))",QMARK_NO_DOT:"[^.\\/]",STAR:"[^/]*?",START_ANCHOR:"(?:^|\\/)"},s={...o,SLASH_LITERAL:"[\\\\/]",QMARK:"[^\\\\/]",STAR:"[^\\\\/]*?",DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)"};e.exports={MAX_LENGTH:65536,POSIX_REGEX_SOURCE:{alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"},REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:r.sep,extglobChars:e=>({"!":{type:"negate",open:"(?:(?!(?:",close:`))${e.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}),globChars:e=>!0===e?s:o}},198:(e,t,n)=>{const r=n(201),o=n(689),{MAX_LENGTH:s,POSIX_REGEX_SOURCE:a,REGEX_NON_SPECIAL_CHARS:i,REGEX_SPECIAL_CHARS_BACKREF:u,REPLACEMENTS:p}=r,l=(e,t)=>{if("function"==typeof t.expandRange)return t.expandRange(...e,t);e.sort();const n=`[${e.join("-")}]`;try{new RegExp(n)}catch(t){return e.map(e=>o.escapeRegex(e)).join("..")}return n},c=(e,t)=>`Missing ${e}: "${t}" - use "\\\\${t}" to match literal characters`,f=(e,t)=>{if("string"!=typeof e)throw new TypeError("Expected a string");e=p[e]||e;const n={...t},f="number"==typeof n.maxLength?Math.min(s,n.maxLength):s;let g=e.length;if(g>f)throw new SyntaxError(`Input length: ${g}, exceeds maximum allowed length: ${f}`);const A={type:"bos",value:"",output:n.prepend||""},R=[A],h=n.capture?"":"?:",d=o.isWindows(t),_=r.globChars(d),y=r.extglobChars(_),{DOT_LITERAL:E,PLUS_LITERAL:C,SLASH_LITERAL:x,ONE_CHAR:S,DOTS_SLASH:v,NO_DOT:b,NO_DOT_SLASH:m,NO_DOTS_SLASH:H,QMARK:T,QMARK_NO_DOT:L,STAR:$,START_ANCHOR:O}=_,w=e=>`(${h}(?:(?!${O}${e.dot?v:E}).)*?)`,k=n.dot?"":b,N=n.dot?T:L;let I=!0===n.bash?w(n):$;n.capture&&(I=`(${I})`),"boolean"==typeof n.noext&&(n.noextglob=n.noext);const M={input:e,index:-1,start:0,dot:!0===n.dot,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:R};e=o.removePrefix(e,M),g=e.length;const P=[],B=[],U=[];let D,G=A;const K=()=>M.index===g-1,F=M.peek=(t=1)=>e[M.index+t],Q=M.advance=()=>e[++M.index],W=()=>e.slice(M.index+1),j=(e="",t=0)=>{M.consumed+=e,M.index+=t},X=e=>{M.output+=null!=e.output?e.output:e.value,j(e.value)},q=()=>{let e=1;for(;"!"===F()&&("("!==F(2)||"?"===F(3));)Q(),M.start++,e++;return e%2!=0&&(M.negated=!0,M.start++,!0)},Z=e=>{M[e]++,U.push(e)},Y=e=>{M[e]--,U.pop()},V=e=>{if("globstar"===G.type){const t=M.braces>0&&("comma"===e.type||"brace"===e.type),n=!0===e.extglob||P.length&&("pipe"===e.type||"paren"===e.type);"slash"===e.type||"paren"===e.type||t||n||(M.output=M.output.slice(0,-G.output.length),G.type="star",G.value="*",G.output=I,M.output+=G.output)}if(P.length&&"paren"!==e.type&&!y[e.value]&&(P[P.length-1].inner+=e.value),(e.value||e.output)&&X(e),G&&"text"===G.type&&"text"===e.type)return G.value+=e.value,void(G.output=(G.output||"")+e.value);e.prev=G,R.push(e),G=e},z=(e,t)=>{const r={...y[t],conditions:1,inner:""};r.prev=G,r.parens=M.parens,r.output=M.output;const o=(n.capture?"(":"")+r.open;Z("parens"),V({type:e,value:t,output:M.output?"":S}),V({type:"paren",extglob:!0,value:Q(),output:o}),P.push(r)},J=e=>{let t=e.close+(n.capture?")":"");if("negate"===e.type){let r=I;e.inner&&e.inner.length>1&&e.inner.includes("/")&&(r=w(n)),(r!==I||K()||/^\)+$/.test(W()))&&(t=e.close=")$))"+r),"bos"===e.prev.type&&(M.negatedExtglob=!0)}V({type:"paren",extglob:!0,value:D,output:t}),Y("parens")};if(!1!==n.fastpaths&&!/(^[*!]|[/()[\]{}"])/.test(e)){let r=!1,s=e.replace(u,(e,t,n,o,s,a)=>"\\"===o?(r=!0,e):"?"===o?t?t+o+(s?T.repeat(s.length):""):0===a?N+(s?T.repeat(s.length):""):T.repeat(n.length):"."===o?E.repeat(n.length):"*"===o?t?t+o+(s?I:""):I:t?e:"\\"+e);return!0===r&&(s=!0===n.unescape?s.replace(/\\/g,""):s.replace(/\\+/g,e=>e.length%2==0?"\\\\":e?"\\":"")),s===e&&!0===n.contains?(M.output=e,M):(M.output=o.wrapOutput(s,M,t),M)}for(;!K();){if(D=Q(),"\0"===D)continue;if("\\"===D){const e=F();if("/"===e&&!0!==n.bash)continue;if("."===e||";"===e)continue;if(!e){D+="\\",V({type:"text",value:D});continue}const t=/^\\+/.exec(W());let r=0;if(t&&t[0].length>2&&(r=t[0].length,M.index+=r,r%2!=0&&(D+="\\")),!0===n.unescape?D=Q()||"":D+=Q()||"",0===M.brackets){V({type:"text",value:D});continue}}if(M.brackets>0&&("]"!==D||"["===G.value||"[^"===G.value)){if(!1!==n.posix&&":"===D){const e=G.value.slice(1);if(e.includes("[")&&(G.posix=!0,e.includes(":"))){const e=G.value.lastIndexOf("["),t=G.value.slice(0,e),n=G.value.slice(e+2),r=a[n];if(r){G.value=t+r,M.backtrack=!0,Q(),A.output||1!==R.indexOf(G)||(A.output=S);continue}}}("["===D&&":"!==F()||"-"===D&&"]"===F())&&(D="\\"+D),"]"!==D||"["!==G.value&&"[^"!==G.value||(D="\\"+D),!0===n.posix&&"!"===D&&"["===G.value&&(D="^"),G.value+=D,X({value:D});continue}if(1===M.quotes&&'"'!==D){D=o.escapeRegex(D),G.value+=D,X({value:D});continue}if('"'===D){M.quotes=1===M.quotes?0:1,!0===n.keepQuotes&&V({type:"text",value:D});continue}if("("===D){Z("parens"),V({type:"paren",value:D});continue}if(")"===D){if(0===M.parens&&!0===n.strictBrackets)throw new SyntaxError(c("opening","("));const e=P[P.length-1];if(e&&M.parens===e.parens+1){J(P.pop());continue}V({type:"paren",value:D,output:M.parens?")":"\\)"}),Y("parens");continue}if("["===D){if(!0!==n.nobracket&&W().includes("]"))Z("brackets");else{if(!0!==n.nobracket&&!0===n.strictBrackets)throw new SyntaxError(c("closing","]"));D="\\"+D}V({type:"bracket",value:D});continue}if("]"===D){if(!0===n.nobracket||G&&"bracket"===G.type&&1===G.value.length){V({type:"text",value:D,output:"\\"+D});continue}if(0===M.brackets){if(!0===n.strictBrackets)throw new SyntaxError(c("opening","["));V({type:"text",value:D,output:"\\"+D});continue}Y("brackets");const e=G.value.slice(1);if(!0===G.posix||"^"!==e[0]||e.includes("/")||(D="/"+D),G.value+=D,X({value:D}),!1===n.literalBrackets||o.hasRegexChars(e))continue;const t=o.escapeRegex(G.value);if(M.output=M.output.slice(0,-G.value.length),!0===n.literalBrackets){M.output+=t,G.value=t;continue}G.value=`(${h}${t}|${G.value})`,M.output+=G.value;continue}if("{"===D&&!0!==n.nobrace){Z("braces");const e={type:"brace",value:D,output:"(",outputIndex:M.output.length,tokensIndex:M.tokens.length};B.push(e),V(e);continue}if("}"===D){const e=B[B.length-1];if(!0===n.nobrace||!e){V({type:"text",value:D,output:D});continue}let t=")";if(!0===e.dots){const e=R.slice(),r=[];for(let t=e.length-1;t>=0&&(R.pop(),"brace"!==e[t].type);t--)"dots"!==e[t].type&&r.unshift(e[t].value);t=l(r,n),M.backtrack=!0}if(!0!==e.comma&&!0!==e.dots){const n=M.output.slice(0,e.outputIndex),r=M.tokens.slice(e.tokensIndex);e.value=e.output="\\{",D=t="\\}",M.output=n;for(const e of r)M.output+=e.output||e.value}V({type:"brace",value:D,output:t}),Y("braces"),B.pop();continue}if("|"===D){P.length>0&&P[P.length-1].conditions++,V({type:"text",value:D});continue}if(","===D){let e=D;const t=B[B.length-1];t&&"braces"===U[U.length-1]&&(t.comma=!0,e="|"),V({type:"comma",value:D,output:e});continue}if("/"===D){if("dot"===G.type&&M.index===M.start+1){M.start=M.index+1,M.consumed="",M.output="",R.pop(),G=A;continue}V({type:"slash",value:D,output:x});continue}if("."===D){if(M.braces>0&&"dot"===G.type){"."===G.value&&(G.output=E);const e=B[B.length-1];G.type="dots",G.output+=D,G.value+=D,e.dots=!0;continue}if(M.braces+M.parens===0&&"bos"!==G.type&&"slash"!==G.type){V({type:"text",value:D,output:E});continue}V({type:"dot",value:D,output:E});continue}if("?"===D){if(!(G&&"("===G.value)&&!0!==n.noextglob&&"("===F()&&"?"!==F(2)){z("qmark",D);continue}if(G&&"paren"===G.type){const e=F();let t=D;if("<"===e&&!o.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");("("===G.value&&!/[!=<:]/.test(e)||"<"===e&&!/<([!=]|\w+>)/.test(W()))&&(t="\\"+D),V({type:"text",value:D,output:t});continue}if(!0!==n.dot&&("slash"===G.type||"bos"===G.type)){V({type:"qmark",value:D,output:L});continue}V({type:"qmark",value:D,output:T});continue}if("!"===D){if(!0!==n.noextglob&&"("===F()&&("?"!==F(2)||!/[!=<:]/.test(F(3)))){z("negate",D);continue}if(!0!==n.nonegate&&0===M.index){q();continue}}if("+"===D){if(!0!==n.noextglob&&"("===F()&&"?"!==F(2)){z("plus",D);continue}if(G&&"("===G.value||!1===n.regex){V({type:"plus",value:D,output:C});continue}if(G&&("bracket"===G.type||"paren"===G.type||"brace"===G.type)||M.parens>0){V({type:"plus",value:D});continue}V({type:"plus",value:C});continue}if("@"===D){if(!0!==n.noextglob&&"("===F()&&"?"!==F(2)){V({type:"at",extglob:!0,value:D,output:""});continue}V({type:"text",value:D});continue}if("*"!==D){"$"!==D&&"^"!==D||(D="\\"+D);const e=i.exec(W());e&&(D+=e[0],M.index+=e[0].length),V({type:"text",value:D});continue}if(G&&("globstar"===G.type||!0===G.star)){G.type="star",G.star=!0,G.value+=D,G.output=I,M.backtrack=!0,M.globstar=!0,j(D);continue}let t=W();if(!0!==n.noextglob&&/^\([^?]/.test(t)){z("star",D);continue}if("star"===G.type){if(!0===n.noglobstar){j(D);continue}const r=G.prev,o=r.prev,s="slash"===r.type||"bos"===r.type,a=o&&("star"===o.type||"globstar"===o.type);if(!0===n.bash&&(!s||t[0]&&"/"!==t[0])){V({type:"star",value:D,output:""});continue}const i=M.braces>0&&("comma"===r.type||"brace"===r.type),u=P.length&&("pipe"===r.type||"paren"===r.type);if(!s&&"paren"!==r.type&&!i&&!u){V({type:"star",value:D,output:""});continue}for(;"/**"===t.slice(0,3);){const n=e[M.index+4];if(n&&"/"!==n)break;t=t.slice(3),j("/**",3)}if("bos"===r.type&&K()){G.type="globstar",G.value+=D,G.output=w(n),M.output=G.output,M.globstar=!0,j(D);continue}if("slash"===r.type&&"bos"!==r.prev.type&&!a&&K()){M.output=M.output.slice(0,-(r.output+G.output).length),r.output="(?:"+r.output,G.type="globstar",G.output=w(n)+(n.strictSlashes?")":"|$)"),G.value+=D,M.globstar=!0,M.output+=r.output+G.output,j(D);continue}if("slash"===r.type&&"bos"!==r.prev.type&&"/"===t[0]){const e=void 0!==t[1]?"|$":"";M.output=M.output.slice(0,-(r.output+G.output).length),r.output="(?:"+r.output,G.type="globstar",G.output=`${w(n)}${x}|${x}${e})`,G.value+=D,M.output+=r.output+G.output,M.globstar=!0,j(D+Q()),V({type:"slash",value:"/",output:""});continue}if("bos"===r.type&&"/"===t[0]){G.type="globstar",G.value+=D,G.output=`(?:^|${x}|${w(n)}${x})`,M.output=G.output,M.globstar=!0,j(D+Q()),V({type:"slash",value:"/",output:""});continue}M.output=M.output.slice(0,-G.output.length),G.type="globstar",G.output=w(n),G.value+=D,M.output+=G.output,M.globstar=!0,j(D);continue}const r={type:"star",value:D,output:I};!0!==n.bash?!G||"bracket"!==G.type&&"paren"!==G.type||!0!==n.regex?(M.index!==M.start&&"slash"!==G.type&&"dot"!==G.type||("dot"===G.type?(M.output+=m,G.output+=m):!0===n.dot?(M.output+=H,G.output+=H):(M.output+=k,G.output+=k),"*"!==F()&&(M.output+=S,G.output+=S)),V(r)):(r.output=D,V(r)):(r.output=".*?","bos"!==G.type&&"slash"!==G.type||(r.output=k+r.output),V(r))}for(;M.brackets>0;){if(!0===n.strictBrackets)throw new SyntaxError(c("closing","]"));M.output=o.escapeLast(M.output,"["),Y("brackets")}for(;M.parens>0;){if(!0===n.strictBrackets)throw new SyntaxError(c("closing",")"));M.output=o.escapeLast(M.output,"("),Y("parens")}for(;M.braces>0;){if(!0===n.strictBrackets)throw new SyntaxError(c("closing","}"));M.output=o.escapeLast(M.output,"{"),Y("braces")}if(!0===n.strictSlashes||"star"!==G.type&&"bracket"!==G.type||V({type:"maybe_slash",value:"",output:x+"?"}),!0===M.backtrack){M.output="";for(const e of M.tokens)M.output+=null!=e.output?e.output:e.value,e.suffix&&(M.output+=e.suffix)}return M};f.fastpaths=(e,t)=>{const n={...t},a="number"==typeof n.maxLength?Math.min(s,n.maxLength):s,i=e.length;if(i>a)throw new SyntaxError(`Input length: ${i}, exceeds maximum allowed length: ${a}`);e=p[e]||e;const u=o.isWindows(t),{DOT_LITERAL:l,SLASH_LITERAL:c,ONE_CHAR:f,DOTS_SLASH:g,NO_DOT:A,NO_DOTS:R,NO_DOTS_SLASH:h,STAR:d,START_ANCHOR:_}=r.globChars(u),y=n.dot?R:A,E=n.dot?h:A,C=n.capture?"":"?:";let x=!0===n.bash?".*?":d;n.capture&&(x=`(${x})`);const S=e=>!0===e.noglobstar?x:`(${C}(?:(?!${_}${e.dot?g:l}).)*?)`,v=e=>{switch(e){case"*":return`${y}${f}${x}`;case".*":return`${l}${f}${x}`;case"*.*":return`${y}${x}${l}${f}${x}`;case"*/*":return`${y}${x}${c}${f}${E}${x}`;case"**":return y+S(n);case"**/*":return`(?:${y}${S(n)}${c})?${E}${f}${x}`;case"**/*.*":return`(?:${y}${S(n)}${c})?${E}${x}${l}${f}${x}`;case"**/.*":return`(?:${y}${S(n)}${c})?${l}${f}${x}`;default:{const t=/^(.*?)\.(\w+)$/.exec(e);if(!t)return;const n=v(t[1]);if(!n)return;return n+l+t[2]}}},b=o.removePrefix(e,{negated:!1,prefix:""});let m=v(b);return m&&!0!==n.strictSlashes&&(m+=c+"?"),m},e.exports=f},843:(e,t,n)=>{const r=n(622),o=n(148),s=n(198),a=n(689),i=n(201),u=(e,t,n=!1)=>{if(Array.isArray(e)){const r=e.map(e=>u(e,t,n));return e=>{for(const t of r){const n=t(e);if(n)return n}return!1}}const r=(o=e)&&"object"==typeof o&&!Array.isArray(o)&&e.tokens&&e.input;var o;if(""===e||"string"!=typeof e&&!r)throw new TypeError("Expected pattern to be a non-empty string");const s=t||{},i=a.isWindows(t),p=r?u.compileRe(e,t):u.makeRe(e,t,!1,!0),l=p.state;delete p.state;let c=()=>!1;if(s.ignore){const e={...t,ignore:null,onMatch:null,onResult:null};c=u(s.ignore,e,n)}const f=(n,r=!1)=>{const{isMatch:o,match:a,output:f}=u.test(n,p,t,{glob:e,posix:i}),g={glob:e,state:l,regex:p,posix:i,input:n,output:f,match:a,isMatch:o};return"function"==typeof s.onResult&&s.onResult(g),!1===o?(g.isMatch=!1,!!r&&g):c(n)?("function"==typeof s.onIgnore&&s.onIgnore(g),g.isMatch=!1,!!r&&g):("function"==typeof s.onMatch&&s.onMatch(g),!r||g)};return n&&(f.state=l),f};u.test=(e,t,n,{glob:r,posix:o}={})=>{if("string"!=typeof e)throw new TypeError("Expected input to be a string");if(""===e)return{isMatch:!1,output:""};const s=n||{},i=s.format||(o?a.toPosixSlashes:null);let p=e===r,l=p&&i?i(e):e;return!1===p&&(l=i?i(e):e,p=l===r),!1!==p&&!0!==s.capture||(p=!0===s.matchBase||!0===s.basename?u.matchBase(e,t,n,o):t.exec(l)),{isMatch:Boolean(p),match:p,output:l}},u.matchBase=(e,t,n,o=a.isWindows(n))=>(t instanceof RegExp?t:u.makeRe(t,n)).test(r.basename(e)),u.isMatch=(e,t,n)=>u(t,n)(e),u.parse=(e,t)=>Array.isArray(e)?e.map(e=>u.parse(e,t)):s(e,{...t,fastpaths:!1}),u.scan=(e,t)=>o(e,t),u.compileRe=(e,t,n=!1,r=!1)=>{if(!0===n)return e.output;const o=t||{},s=o.contains?"":"^",a=o.contains?"":"$";let i=`${s}(?:${e.output})${a}`;e&&!0===e.negated&&(i=`^(?!${i}).*$`);const p=u.toRegex(i,t);return!0===r&&(p.state=e),p},u.makeRe=(e,t,n=!1,r=!1)=>{if(!e||"string"!=typeof e)throw new TypeError("Expected a non-empty string");const o=t||{};let a,i={negated:!1,fastpaths:!0},p="";return e.startsWith("./")&&(e=e.slice(2),p=i.prefix="./"),!1===o.fastpaths||"."!==e[0]&&"*"!==e[0]||(a=s.fastpaths(e,t)),void 0===a?(i=s(e,t),i.prefix=p+(i.prefix||"")):i.output=a,u.compileRe(i,t,n,r)},u.toRegex=(e,t)=>{try{const n=t||{};return new RegExp(e,n.flags||(n.nocase?"i":""))}catch(e){if(t&&!0===t.debug)throw e;return/$^/}},u.constants=i,e.exports=u},148:(e,t,n)=>{const r=n(689),{CHAR_ASTERISK:o,CHAR_AT:s,CHAR_BACKWARD_SLASH:a,CHAR_COMMA:i,CHAR_DOT:u,CHAR_EXCLAMATION_MARK:p,CHAR_FORWARD_SLASH:l,CHAR_LEFT_CURLY_BRACE:c,CHAR_LEFT_PARENTHESES:f,CHAR_LEFT_SQUARE_BRACKET:g,CHAR_PLUS:A,CHAR_QUESTION_MARK:R,CHAR_RIGHT_CURLY_BRACE:h,CHAR_RIGHT_PARENTHESES:d,CHAR_RIGHT_SQUARE_BRACKET:_}=n(201),y=e=>e===l||e===a,E=e=>{!0!==e.isPrefix&&(e.depth=e.isGlobstar?1/0:1)};e.exports=(e,t)=>{const n=t||{},C=e.length-1,x=!0===n.parts||!0===n.scanToEnd,S=[],v=[],b=[];let m,H,T=e,L=-1,$=0,O=0,w=!1,k=!1,N=!1,I=!1,M=!1,P=!1,B=!1,U=!1,D=!1,G=0,K={value:"",depth:0,isGlob:!1};const F=()=>L>=C,Q=()=>(m=H,T.charCodeAt(++L));for(;L0&&(j=T.slice(0,$),T=T.slice($),O-=$),W&&!0===N&&O>0?(W=T.slice(0,O),X=T.slice(O)):!0===N?(W="",X=T):W=T,W&&""!==W&&"/"!==W&&W!==T&&y(W.charCodeAt(W.length-1))&&(W=W.slice(0,-1)),!0===n.unescape&&(X&&(X=r.removeBackslashes(X)),W&&!0===B&&(W=r.removeBackslashes(W)));const q={prefix:j,input:e,start:$,base:W,glob:X,isBrace:w,isBracket:k,isGlob:N,isExtglob:I,isGlobstar:M,negated:U};if(!0===n.tokens&&(q.maxDepth=0,y(H)||v.push(K),q.tokens=v),!0===n.parts||!0===n.tokens){let t;for(let r=0;r{const r=n(622),o="win32"===process.platform,{REGEX_BACKSLASH:s,REGEX_REMOVE_BACKSLASH:a,REGEX_SPECIAL_CHARS:i,REGEX_SPECIAL_CHARS_GLOBAL:u}=n(201);t.isObject=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),t.hasRegexChars=e=>i.test(e),t.isRegexChar=e=>1===e.length&&t.hasRegexChars(e),t.escapeRegex=e=>e.replace(u,"\\$1"),t.toPosixSlashes=e=>e.replace(s,"/"),t.removeBackslashes=e=>e.replace(a,e=>"\\"===e?"":e),t.supportsLookbehinds=()=>{const e=process.version.slice(1).split(".").map(Number);return 3===e.length&&e[0]>=9||8===e[0]&&e[1]>=10},t.isWindows=e=>e&&"boolean"==typeof e.windows?e.windows:!0===o||"\\"===r.sep,t.escapeLast=(e,n,r)=>{const o=e.lastIndexOf(n,r);return-1===o?e:"\\"===e[o-1]?t.escapeLast(e,n,o-1):`${e.slice(0,o)}\\${e.slice(o)}`},t.removePrefix=(e,t={})=>{let n=e;return n.startsWith("./")&&(n=n.slice(2),t.prefix="./"),n},t.wrapOutput=(e,t={},n={})=>{let r=`${n.contains?"":"^"}(?:${e})${n.contains?"":"$"}`;return!0===t.negated&&(r=`(?:^(?!${r}).*$)`),r}},716:(e,t,n)=>{ +/*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */ +const r=n(175),o=(e,t,n)=>{if(!1===r(e))throw new TypeError("toRegexRange: expected the first argument to be a number");if(void 0===t||e===t)return String(e);if(!1===r(t))throw new TypeError("toRegexRange: expected the second argument to be a number.");let s={relaxZeros:!0,...n};"boolean"==typeof s.strictZeros&&(s.relaxZeros=!1===s.strictZeros);let u=e+":"+t+"="+String(s.relaxZeros)+String(s.shorthand)+String(s.capture)+String(s.wrap);if(o.cache.hasOwnProperty(u))return o.cache[u].result;let p=Math.min(e,t),l=Math.max(e,t);if(1===Math.abs(p-l)){let n=e+"|"+t;return s.capture?`(${n})`:!1===s.wrap?n:`(?:${n})`}let c=A(e)||A(t),f={min:e,max:t,a:p,b:l},g=[],R=[];if(c&&(f.isPadded=c,f.maxLen=String(f.max).length),p<0){R=a(l<0?Math.abs(l):1,Math.abs(p),f,s),p=f.a=0}return l>=0&&(g=a(p,l,f,s)),f.negatives=R,f.positives=g,f.result=function(e,t,n){let r=i(e,t,"-",!1,n)||[],o=i(t,e,"",!1,n)||[],s=i(e,t,"-?",!0,n)||[];return r.concat(s).concat(o).join("|")}(R,g,s),!0===s.capture?f.result=`(${f.result})`:!1!==s.wrap&&g.length+R.length>1&&(f.result=`(?:${f.result})`),o.cache[u]=f,f.result};function s(e,t,n){if(e===t)return{pattern:e,count:[],digits:0};let r=function(e,t){let n=[];for(let r=0;r1&&o.count.pop(),o.count.push(u.count[0]),o.string=o.pattern+f(o.count),p=t+1)}return i}function i(e,t,n,r,o){let s=[];for(let o of e){let{string:e}=o;r||p(t,"string",e)||s.push(n+e),r&&p(t,"string",e)&&s.push(n+e)}return s}function u(e,t){return e>t?1:t>e?-1:0}function p(e,t,n){return e.some(e=>e[t]===n)}function l(e,t){return Number(String(e).slice(0,-t)+"9".repeat(t))}function c(e,t){return e-e%Math.pow(10,t)}function f(e){let[t=0,n=""]=e;return n||t>1?`{${t+(n?","+n:"")}}`:""}function g(e,t,n){return`[${e}${t-e==1?"":"-"}${t}]`}function A(e){return/^-?(0+)\d/.test(e)}function R(e,t,n){if(!t.isPadded)return e;let r=Math.abs(t.maxLen-String(e).length),o=!1!==n.relaxZeros;switch(r){case 0:return"";case 1:return o?"0?":"0";case 2:return o?"0{0,2}":"00";default:return o?`0{0,${r}}`:`0{${r}}`}}o.cache={},o.clearCache=()=>o.cache={},e.exports=o},622:e=>{e.exports=require("path")},669:e=>{e.exports=require("util")}},t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};(()=>{n.r(r),n.d(r,{default:()=>l});const e=require("@yarnpkg/core"),t=require("@yarnpkg/fslib"),o=require("@yarnpkg/plugin-essentials"),s=require("clipanion");var a=n(461),i=n.n(a);const u={maxPackageUpdates:!1,preserveSemVerRange:!0};class p extends s.Command{constructor(){super(...arguments),this.configFilename=s.Option.String("--config","semver-up.json"),this.dryRun=s.Option.Boolean("--dry-run",!1)}async execute(){try{const t=await e.Configuration.find(this.context.cwd,this.context.plugins),{project:n}=await e.Project.find(t,this.context.cwd),r=await e.Cache.find(t);await n.restoreInstallState();const o=await this.parseConfigFile(),s=n.topLevelWorkspace,a=async e=>{let t,a;await e.startTimerPromise("Processing Semver Up Rules",{skipIfEmpty:!1},async()=>{t=await this.getRulesWithPackages({config:o,workspace:s})}),await e.startTimerPromise("Finding Updates",{skipIfEmpty:!1},async()=>{a=await this.findUpdateCandidates({workspace:s,rulesWithPackages:t,cache:r})}),await e.startTimerPromise("Staging Updates",{skipIfEmpty:!1},async()=>{await this.applyUpdates({config:o,workspace:s,rulesWithUpdates:a,report:e})}),this.dryRun||await n.install({cache:r,report:e})};return(await e.StreamReport.start({configuration:t,stdout:this.context.stdout},a)).exitCode()}catch(e){return this.context.stderr.write(String(e)+"\n"),1}}async parseConfigFile(){var n,r;const o=t.ppath.resolve(t.ppath.cwd(),t.npath.toPortablePath(this.configFilename));let s={};try{s=e.miscUtils.dynamicRequireNoCache(o)}catch(e){this.context.stdout.write(this.configFilename+" file not detected, using default config\n")}return{rules:(null!==(n=null==s?void 0:s.rules)&&void 0!==n?n:[]).map(([e,t])=>[e,{...u,...t}]),maxRulesApplied:null!==(r=null==s?void 0:s.maxRulesApplied)&&void 0!==r?r:1}}async getRulesWithPackages({config:t,workspace:n}){const r=n.manifest,o=t.rules.map(([e,t])=>[e,{rule:t,packages:new Set}]),s=[...r.dependencies.entries(),...r.devDependencies.entries()];for(const[t,n]of s){const r=o.find(([t])=>i()([e.structUtils.stringifyIdent(n)],t).length>0);r&&r[1].packages.add(t)}return o}async findUpdateCandidates({workspace:t,rulesWithPackages:n,cache:r}){const s=new Map([...t.manifest.dependencies.entries(),...t.manifest.devDependencies.entries()]),a=new Map;for(const[i,{rule:u,packages:p}]of n){const n=new Map;for(const a of p){const i=s.get(a);if(!i)continue;const p=e.structUtils.convertToIdent(i),l=await o.suggestUtils.fetchDescriptorFrom(p,u.preserveSemVerRange?null==i?void 0:i.range:"latest",{project:t.project,workspace:t,preserveModifier:!0,cache:r});l&&i.range!==l.range&&n.set(p.identHash,l)}n.size&&a.set(i,n)}return a}async applyUpdates({config:t,rulesWithUpdates:n,workspace:r,report:o}){const s=new Map(t.rules);let a=0;for(const[i,u]of n.entries()){const n=s.get(i);if(!n)continue;if(t.maxRulesApplied&&a>=t.maxRulesApplied)break;let p=0;for(const[t,s]of u.entries()){if(n.maxPackageUpdates&&p>=n.maxPackageUpdates)break;const a=e.structUtils.stringifyIdent(e.structUtils.convertToIdent(s));for(const n of["dependencies","devDependencies"]){const u=r.manifest.getForScope(n),l=u.get(t);l&&(u.set(t,s),p+=1,o.reportInfo(e.MessageName.UNNAMED,`[${i}] ${a}: ${l.range} -> ${s.range}`))}}p&&(a+=1)}}}p.paths=[["semver","up"]],p.usage=s.Command.Usage({description:"",details:"",examples:[]});const l={hooks:{},commands:[p]}})(),plugin=r})();return plugin; } }; \ No newline at end of file diff --git a/package.json b/package.json index 92bdadb..f17b387 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "@tophat/conventional-changelog-config": "^0.0.9", "@tophat/eslint-config": "^0.7.0", "@types/jest": "^26.0.20", + "@types/micromatch": "^4.0.1", "@typescript-eslint/eslint-plugin": "^4.23.0", "@typescript-eslint/parser": "^4.23.0", "@yarnpkg/builder": "^3.0.0-rc.2", @@ -75,10 +76,14 @@ }, "dependencies": { "@types/node": "^14.0.0", + "@yarnpkg/cli": "^3.0.0-rc.2", "@yarnpkg/core": "^3.0.0-rc.2", "@yarnpkg/fslib": "^2.5.0-rc.2", "@yarnpkg/libzip": "^2.2.1", + "@yarnpkg/plugin-essentials": "^3.0.0-rc.2", + "@yarnpkg/plugin-npm": "^2.5.0-rc.2", "clipanion": "^3.0.0-rc.12", + "micromatch": "^4.0.4", "typescript": "~4.2.4" } } diff --git a/semver-up.json b/semver-up.json new file mode 100644 index 0000000..c7627a5 --- /dev/null +++ b/semver-up.json @@ -0,0 +1,9 @@ +{ + "rules": [ + ["@babel/*", { + "maxPackageUpdates": false, + "preserveSemVerRange": true + }] + ], + "maxRulesApplied": 1 +} diff --git a/src/index.ts b/src/index.ts index 73f298d..13a2c55 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,48 @@ -import { CommandContext, Configuration, Plugin, Project } from '@yarnpkg/core' -import { Command, Usage } from 'clipanion' +import { + Cache, + CommandContext, + Configuration, + Descriptor, + IdentHash, + MessageName, + Plugin, + Project, + StreamReport, + Workspace, + miscUtils, + structUtils, +} from '@yarnpkg/core' +import { npath, ppath } from '@yarnpkg/fslib' +import { suggestUtils } from '@yarnpkg/plugin-essentials' +import { Command, Option, Usage } from 'clipanion' +import micromatch from 'micromatch' + +interface RuleConfig { + // How many packages in the group to update. If false, do not impose a limit + maxPackageUpdates: number | false + // Whether to keep the upper limit of the semver range, or allow exceeding + preserveSemVerRange: boolean +} + +type RuleGlob = string + +interface Config { + rules: Array<[RuleGlob, RuleConfig]> + + // Defaults to 1, though can be false to apply no limit + maxRulesApplied: number | false +} + +type RulesWithPackages = Array< + [RuleGlob, { rule: RuleConfig; packages: Set }] +> + +type RulesWithUpdates = Map> + +const ruleConfigDefaults: RuleConfig = { + maxPackageUpdates: false, + preserveSemVerRange: true, +} class SemverUpCommand extends Command { static paths = [['semver', 'up']] @@ -10,6 +53,10 @@ class SemverUpCommand extends Command { examples: [], }) + configFilename: string = Option.String('--config', 'semver-up.json') + + dryRun: boolean = Option.Boolean('--dry-run', false) + async execute(): Promise { try { const configuration = await Configuration.find( @@ -20,16 +67,247 @@ class SemverUpCommand extends Command { configuration, this.context.cwd, ) + const cache = await Cache.find(configuration) await project.restoreInstallState() - this.context.stdout.write('Done\n') - return 0 + const config = await this.parseConfigFile() + const workspace = project.topLevelWorkspace + + const pipeline = async (report: StreamReport) => { + let rulesWithPackages: RulesWithPackages + + await report.startTimerPromise( + 'Processing Semver Up Rules', + { skipIfEmpty: false }, + async () => { + rulesWithPackages = await this.getRulesWithPackages({ + config, + workspace, + }) + }, + ) + + let rulesWithUpdates: RulesWithUpdates + + await report.startTimerPromise( + 'Finding Updates', + { skipIfEmpty: false }, + async () => { + rulesWithUpdates = await this.findUpdateCandidates({ + workspace, + rulesWithPackages, + cache, + }) + }, + ) + + await report.startTimerPromise( + 'Staging Updates', + { skipIfEmpty: false }, + async () => { + await this.applyUpdates({ + config, + workspace, + rulesWithUpdates, + report, + }) + }, + ) + + if (!this.dryRun) { + await project.install({ cache, report }) + } + } + + const report = await StreamReport.start( + { configuration, stdout: this.context.stdout }, + pipeline, + ) + + return report.exitCode() } catch (err) { this.context.stderr.write(`${String(err)}\n`) return 1 } } + + async parseConfigFile(): Promise { + const configPPath = ppath.resolve( + ppath.cwd(), + npath.toPortablePath(this.configFilename), + ) + + let configFromFile: Record = {} + try { + configFromFile = miscUtils.dynamicRequireNoCache(configPPath) + } catch (e) { + this.context.stdout.write( + `${this.configFilename} file not detected, using default config\n`, + ) + } + + const rulesFromFile = (configFromFile?.rules ?? []) as Array< + [RuleGlob, Partial] + > + + const config: Config = { + rules: rulesFromFile.map(([ruleGlob, rule]) => [ + ruleGlob, + { ...ruleConfigDefaults, ...rule }, + ]), + maxRulesApplied: + (configFromFile?.maxRulesApplied as number | undefined) ?? 1, + } + + return config + } + + async getRulesWithPackages({ + config, + workspace, + }: { + config: Config + workspace: Workspace + }): Promise { + const manifest = workspace.manifest + + const ruleBuckets: RulesWithPackages = config.rules.map( + ([ruleGlob, rule]) => [ruleGlob, { rule, packages: new Set() }], + ) + + const allDependencies = [ + ...manifest.dependencies.entries(), + ...manifest.devDependencies.entries(), + ] + + for (const [identHash, descriptor] of allDependencies) { + const bucket = ruleBuckets.find( + ([ruleGlob]) => + micromatch( + [structUtils.stringifyIdent(descriptor)], + ruleGlob, + ).length > 0, + ) + if (bucket) { + bucket[1].packages.add(identHash) + } + } + + return ruleBuckets + } + + async findUpdateCandidates({ + workspace, + rulesWithPackages, + cache, + }: { + workspace: Workspace + rulesWithPackages: RulesWithPackages + cache: Cache + }): Promise { + const descriptors: Map = new Map([ + ...workspace.manifest.dependencies.entries(), + ...workspace.manifest.devDependencies.entries(), + ]) + + const groups: RulesWithUpdates = new Map() + + for (const [ruleGlob, { rule, packages }] of rulesWithPackages) { + const updates = new Map() + + for (const pkg of packages) { + const oldDescriptor = descriptors.get(pkg) + if (!oldDescriptor) continue + + const ident = structUtils.convertToIdent(oldDescriptor) + const newDescriptor = await suggestUtils.fetchDescriptorFrom( + ident, + rule.preserveSemVerRange ? oldDescriptor?.range : 'latest', + { + project: workspace.project, + workspace, + preserveModifier: true, + cache, + }, + ) + + if ( + newDescriptor && + oldDescriptor.range !== newDescriptor.range + ) { + updates.set(ident.identHash, newDescriptor) + } + } + + if (updates.size) { + groups.set(ruleGlob, updates) + } + } + + return groups + } + + async applyUpdates({ + config, + rulesWithUpdates, + workspace, + report, + }: { + config: Config + rulesWithUpdates: RulesWithUpdates + workspace: Workspace + report: StreamReport + }): Promise { + const globToRule = new Map(config.rules) + + let rulesAppliedCount = 0 + for (const [ruleGlob, updates] of rulesWithUpdates.entries()) { + const rule = globToRule.get(ruleGlob) + if (!rule) continue + + if ( + config.maxRulesApplied && + rulesAppliedCount >= config.maxRulesApplied + ) { + break + } + + let ruleUpdateCount = 0 + for (const [identHash, descriptor] of updates.entries()) { + if ( + rule.maxPackageUpdates && + ruleUpdateCount >= rule.maxPackageUpdates + ) { + break + } + + const stringifiedIdent = structUtils.stringifyIdent( + structUtils.convertToIdent(descriptor), + ) + + for (const dependencyScope of [ + 'dependencies', + 'devDependencies', + ]) { + const dependencies = workspace.manifest.getForScope( + dependencyScope, + ) + const oldDescriptor = dependencies.get(identHash) + if (!oldDescriptor) continue + dependencies.set(identHash, descriptor) + ruleUpdateCount += 1 + + report.reportInfo( + MessageName.UNNAMED, + `[${ruleGlob}] ${stringifiedIdent}: ${oldDescriptor.range} -> ${descriptor.range}`, + ) + } + } + + if (ruleUpdateCount) rulesAppliedCount += 1 + } + } } const plugin: Plugin = { diff --git a/yarn.lock b/yarn.lock index e4100ff..e6df233 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1935,13 +1935,17 @@ __metadata: "@tophat/conventional-changelog-config": ^0.0.9 "@tophat/eslint-config": ^0.7.0 "@types/jest": ^26.0.20 + "@types/micromatch": ^4.0.1 "@types/node": ^14.0.0 "@typescript-eslint/eslint-plugin": ^4.23.0 "@typescript-eslint/parser": ^4.23.0 "@yarnpkg/builder": ^3.0.0-rc.2 + "@yarnpkg/cli": ^3.0.0-rc.2 "@yarnpkg/core": ^3.0.0-rc.2 "@yarnpkg/fslib": ^2.5.0-rc.2 "@yarnpkg/libzip": ^2.2.1 + "@yarnpkg/plugin-essentials": ^3.0.0-rc.2 + "@yarnpkg/plugin-npm": ^2.5.0-rc.2 "@yarnpkg/pnpify": ^3.0.0-rc.3 all-contributors-cli: ^6.20.0 babel-jest: ^26.6.3 @@ -1960,6 +1964,7 @@ __metadata: jest: ^26.6.3 jest-junit: ^12.0.0 lint-staged: ^11.0.0 + micromatch: ^4.0.4 prettier: ^2.2.1 typescript: ~4.2.4 yaml-validator: ^3.0.1 @@ -2007,6 +2012,13 @@ __metadata: languageName: node linkType: hard +"@types/braces@npm:*": + version: 3.0.0 + resolution: "@types/braces@npm:3.0.0" + checksum: 4f2a99b04cd5141d2c64051e002447c6ef243dc90855b5293c4f3b02ca65435c7ed1ae647497ff0f253fbf0105af31b7190ebbe88e121b1c435f3c58cacc96df + languageName: node + linkType: hard + "@types/cacheable-request@npm:^6.0.1": version: 6.0.1 resolution: "@types/cacheable-request@npm:6.0.1" @@ -2127,6 +2139,15 @@ __metadata: languageName: node linkType: hard +"@types/micromatch@npm:^4.0.1": + version: 4.0.1 + resolution: "@types/micromatch@npm:4.0.1" + dependencies: + "@types/braces": "*" + checksum: 4f9fea285778c579055c83fbb025f576c3adc9541ec89e12f1e192e53c0885a04d1a5863b44001606f01964f12b26f8b08b033c06de11ca9de78d58e7a672850 + languageName: node + linkType: hard + "@types/minimist@npm:^1.2.0": version: 1.2.1 resolution: "@types/minimist@npm:1.2.1" @@ -5701,20 +5722,20 @@ __metadata: linkType: hard "fsevents@^2.1.2, fsevents@~2.3.1": - version: 2.3.1 - resolution: "fsevents@npm:2.3.1" + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" dependencies: node-gyp: latest - checksum: 7992dac7961be985b3c3c64d79f4489278ab179da2cdc190a88085e3526ab6fa0fb1b78d94ab8669649208a0728fdd2dab1f4b522566ace132b687b5e6a341a1 + checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f languageName: node linkType: hard "fsevents@patch:fsevents@^2.1.2#~builtin, fsevents@patch:fsevents@~2.3.1#~builtin": - version: 2.3.1 - resolution: "fsevents@patch:fsevents@npm%3A2.3.1#~builtin::version=2.3.1&hash=1cc4b2" + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=1cc4b2" dependencies: node-gyp: latest - checksum: 69e026dbd99b1e2fe52cbd80c7697f62a2f7f79c5175e99f21c26b7aecc47d979bdbb8af56c5e4eeeeaf66a0f84a0198c60008ed21998a57b147d0ca5dc0d496 + checksum: 78db9daf1f6526a49cefee3917cc988f62dc7f25b5dd80ad6de4ffc4af7f0cab7491ac737626ff53e482a111bc53aac9e411fe3602458eca36f6a003ecf69c16 languageName: node linkType: hard