UNPKG

everything-dev

Version:

A consolidated product package for building Module Federation apps with oRPC APIs.

1 lines • 5.89 kB
{"version":3,"file":"semver.mjs","names":[],"sources":["../../src/utils/semver.ts"],"sourcesContent":["const SEMVER_PATTERN =\n /^(?<core>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(?:-(?<prerelease>[0-9A-Za-z.-]+))?(?:\\+[\\w.-]+)?$/;\n\ninterface ParsedVersion {\n core: readonly number[];\n prerelease: readonly (number | string)[];\n}\n\nfunction parseVersion(version: string | undefined): ParsedVersion | null {\n if (!version) return null;\n const match = SEMVER_PATTERN.exec(version.trim().replace(/^[\\^~>=v]+/, \"\"));\n if (!match?.groups) return null;\n const prerelease = match.groups.prerelease\n ? match.groups.prerelease.split(\".\").map((id) => (/^\\d+$/.test(id) ? Number(id) : id))\n : [];\n return {\n core: [Number(match.groups.core), Number(match.groups.minor), Number(match.groups.patch)],\n prerelease,\n };\n}\n\nfunction comparePrerelease(a: ParsedVersion[\"prerelease\"], b: ParsedVersion[\"prerelease\"]): number {\n if (a.length === 0 && b.length === 0) return 0;\n if (a.length === 0) return 1;\n if (b.length === 0) return -1;\n const length = Math.max(a.length, b.length);\n for (let i = 0; i < length; i += 1) {\n const left = a[i];\n const right = b[i];\n if (left === undefined) return -1;\n if (right === undefined) return 1;\n if (typeof left === \"number\" && typeof right === \"number\") {\n if (left !== right) return left < right ? -1 : 1;\n } else if (typeof left === \"number\") {\n return -1;\n } else if (typeof right === \"number\") {\n return 1;\n } else if (left !== right) {\n return left < right ? -1 : 1;\n }\n }\n return 0;\n}\n\n/**\n * Semver-ordered comparison of two version strings: -1 when `a` is older than\n * `b`, 1 when newer, 0 when equal. Prerelease-aware per the semver spec\n * (\"2.0.0-rc.9\" < \"2.0.0-rc.10\" < \"2.0.0\"). Unparseable versions compare as\n * equal — a gate must never fire on versions it cannot order.\n */\nexport function compareSemver(a: string | undefined, b: string | undefined): number {\n const left = parseVersion(a);\n const right = parseVersion(b);\n if (!left || !right) return 0;\n for (let i = 0; i < left.core.length; i += 1) {\n if (left.core[i] !== right.core[i]) return left.core[i]! < right.core[i]! ? -1 : 1;\n }\n return comparePrerelease(left.prerelease, right.prerelease);\n}\n\n/**\n * Whether `version` satisfies `constraint`. Supported: exact (`=x.y.z` or bare\n * `x.y.z(-pre)`), caret, tilde, and `>` / `<` floors. A constraint with a\n * prerelease segment is satisfied by versions that order `>=` the constraint's\n * own prerelease (no identifier padding); a constraint without one is never\n * satisfied by a prerelease version. Unparseable constraint forms are\n * permissive (`true`) — remote manifests may carry shapes this module does not\n * model, and an unverifiable gate must not block.\n */\nexport function satisfiesConstraint(version: string, constraint: string): boolean {\n const trimmed = constraint.trim();\n if (!trimmed) return true;\n const match = /^(\\^|~|<|>|=)?\\s*v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?$/.exec(trimmed);\n if (!match) return true;\n const operator = match[1] ?? \"\";\n const floor = `${match[2]}.${match[3]}.${match[4]}${match[5] ? `-${match[5]}` : \"\"}`;\n const comparison = compareSemver(version, floor);\n if (!operator || operator === \"=\") return comparison === 0;\n if (operator === \"<\") return comparison < 0;\n if (operator === \">\") return comparison > 0;\n const subject = parseVersion(version);\n if (!subject) return false;\n if (!match[5] && subject.prerelease.length > 0) return false;\n if (match[5] && subject.prerelease.length === 0) return false;\n if (comparison < 0) return false;\n if (operator === \"~\") {\n return subject.core[0] === Number(match[2]) && subject.core[1] === Number(match[3]);\n }\n return subject.core[0] === Number(match[2]);\n}\n"],"mappings":";AAAA,MAAM,iBACJ;AAOF,SAAS,aAAa,SAAmD;CACvE,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,QAAQ,eAAe,KAAK,QAAQ,KAAK,CAAC,CAAC,QAAQ,cAAc,EAAE,CAAC;CAC1E,IAAI,CAAC,OAAO,QAAQ,OAAO;CAC3B,MAAM,aAAa,MAAM,OAAO,aAC5B,MAAM,OAAO,WAAW,MAAM,GAAG,CAAC,CAAC,KAAK,OAAQ,QAAQ,KAAK,EAAE,IAAI,OAAO,EAAE,IAAI,EAAG,IACnF,CAAC;CACL,OAAO;EACL,MAAM;GAAC,OAAO,MAAM,OAAO,IAAI;GAAG,OAAO,MAAM,OAAO,KAAK;GAAG,OAAO,MAAM,OAAO,KAAK;EAAC;EACxF;CACF;AACF;AAEA,SAAS,kBAAkB,GAAgC,GAAwC;CACjG,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GAAG,OAAO;CAC7C,IAAI,EAAE,WAAW,GAAG,OAAO;CAC3B,IAAI,EAAE,WAAW,GAAG,OAAO;CAC3B,MAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM;CAC1C,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;EAClC,MAAM,OAAO,EAAE;EACf,MAAM,QAAQ,EAAE;EAChB,IAAI,SAAS,QAAW,OAAO;EAC/B,IAAI,UAAU,QAAW,OAAO;EAChC,IAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAC/C;OAAI,SAAS,OAAO,OAAO,OAAO,QAAQ,KAAK;EAAC,OAC3C,IAAI,OAAO,SAAS,UACzB,OAAO;OACF,IAAI,OAAO,UAAU,UAC1B,OAAO;OACF,IAAI,SAAS,OAClB,OAAO,OAAO,QAAQ,KAAK;CAE/B;CACA,OAAO;AACT;;;;;;;AAQA,SAAgB,cAAc,GAAuB,GAA+B;CAClF,MAAM,OAAO,aAAa,CAAC;CAC3B,MAAM,QAAQ,aAAa,CAAC;CAC5B,IAAI,CAAC,QAAQ,CAAC,OAAO,OAAO;CAC5B,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,QAAQ,KAAK,GACzC,IAAI,KAAK,KAAK,OAAO,MAAM,KAAK,IAAI,OAAO,KAAK,KAAK,KAAM,MAAM,KAAK,KAAM,KAAK;CAEnF,OAAO,kBAAkB,KAAK,YAAY,MAAM,UAAU;AAC5D;;;;;;;;;;AAWA,SAAgB,oBAAoB,SAAiB,YAA6B;CAChF,MAAM,UAAU,WAAW,KAAK;CAChC,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,QAAQ,gEAAgE,KAAK,OAAO;CAC1F,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,WAAW,MAAM,MAAM;CAE7B,MAAM,aAAa,cAAc,SAAS,GADzB,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,MAAM,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,IACjC;CAC/C,IAAI,CAAC,YAAY,aAAa,KAAK,OAAO,eAAe;CACzD,IAAI,aAAa,KAAK,OAAO,aAAa;CAC1C,IAAI,aAAa,KAAK,OAAO,aAAa;CAC1C,MAAM,UAAU,aAAa,OAAO;CACpC,IAAI,CAAC,SAAS,OAAO;CACrB,IAAI,CAAC,MAAM,MAAM,QAAQ,WAAW,SAAS,GAAG,OAAO;CACvD,IAAI,MAAM,MAAM,QAAQ,WAAW,WAAW,GAAG,OAAO;CACxD,IAAI,aAAa,GAAG,OAAO;CAC3B,IAAI,aAAa,KACf,OAAO,QAAQ,KAAK,OAAO,OAAO,MAAM,EAAE,KAAK,QAAQ,KAAK,OAAO,OAAO,MAAM,EAAE;CAEpF,OAAO,QAAQ,KAAK,OAAO,OAAO,MAAM,EAAE;AAC5C"}