@blue-labs/repository-generator 4.1.1 → 5.0.0-rc.0

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.
@@ -0,0 +1 @@
1
+ "use strict";const T=require("path"),S=require("fs"),y=require("@blue-labs/language"),v=require("@blue-labs/repository-contract"),H=require("fast-json-patch"),K=require("js-yaml");function X(e){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const t=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,t.get?t:{enumerable:!0,get:()=>e[n]})}}return r.default=e,Object.freeze(r)}const j=X(T),N={...y.Properties.CORE_TYPE_NAME_TO_BLUE_ID_MAP,...y.BUILTIN_RUNTIME_TYPE_NAME_TO_BLUE_ID_MAP},V=new Set(Object.keys(N)),Z=new Set([...y.Properties.BASIC_TYPES]),Q=new Set(["name","description","type","itemType","keyType","valueType","value","items","blueId","blue","schema","mergePolicy","contracts"]),x="Blue Repository",h={Dev:"dev",Stable:"stable"},ee=new Set([".git",".github",".husky","node_modules",".nx",".vscode",".idea"]);function te(e){const r=S.readdirSync(e,{withFileTypes:!0}),n=new Map;for(const t of r){if(!t.isDirectory()||ee.has(t.name))continue;const o=T.join(e,t.name),s=q(o);if(s.length!==0)for(const i of s){const a=i.endsWith(".dev.blue")?h.Dev:h.Stable,c=ne(i),l=re(c,i),u=`${t.name}/${l}`,f=n.get(u);if(f)throw f.status!==a?new Error(`Type ${u} has both stable and dev definitions (${f.filePath} and ${i}).`):new Error(`Type ${u} is defined multiple times (${f.filePath} and ${i}).`);const g=oe(c,i);n.set(u,{packageName:t.name,typeName:l,status:a,content:c,filePath:i,references:g})}}return n}function ne(e){const r=S.readFileSync(e,"utf8"),n=y.yamlBlueParse(r);if(!k(n))throw new Error(`Type file ${e} must contain a YAML object.`);return se(n),n}function re(e,r){if(!k(e)||typeof e.name!="string")throw new Error(`Type file ${r} is missing required "name" field.`);return e.name}function q(e){const r=S.readdirSync(e,{withFileTypes:!0}),n=[];for(const t of r){if(t.isDirectory()){n.push(...q(T.join(e,t.name)));continue}(t.name.endsWith(".blue")||t.name.endsWith(".dev.blue"))&&n.push(T.join(e,t.name))}return n}function oe(e,r){const n=new Set,t=o=>{if(Array.isArray(o)){o.forEach(i=>t(i));return}if(!k(o))return;const s=i=>{if(typeof i=="string"&&!V.has(i)){if(!i.includes("/"))throw new Error(`Invalid type reference "${i}" in ${r}. Use <Package>/<Type> for non-primitive references.`);n.add(i)}};s(o.type),s(o.itemType),s(o.keyType),s(o.valueType),Object.values(o).forEach(i=>t(i))};return t(e),n}function se(e){const r=n=>{if(Array.isArray(n)){n.forEach(t=>r(t));return}if(k(n)){if(typeof n.type=="string"&&Z.has(n.type)){const t=Object.keys(n).find(o=>!Q.has(o));if(t!==void 0)throw new Error(`"${t}" is not an allowed fields here`)}Object.entries(n).filter(([t])=>t!=="schema").forEach(([,t])=>r(t))}};r(e)}function k(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ie(e){const r=new Map;for(const[n,t]of e){const o=new Set;for(const s of t.references){if(!e.has(s))throw new Error(`Type ${n} references unknown alias ${s}. Ensure the target type exists.`);o.add(s)}r.set(n,o)}return r}function ce(e){const r=[],n=new Map,t=new Map,o=[],s=new Set;let i=0;const a=c=>{n.set(c,i),t.set(c,i),i+=1,o.push(c),s.add(c);for(const u of e.get(c)??[]){if(!n.has(u)){a(u),t.set(c,Math.min(t.get(c)??0,t.get(u)??0));continue}s.has(u)&&t.set(c,Math.min(t.get(c)??0,n.get(u)??0))}if(t.get(c)!==n.get(c))return;const l=[];for(;o.length>0;){const u=o.pop();if(!u||(s.delete(u),l.push(u),u===c))break}r.push(l.sort((u,f)=>u.localeCompare(f)))};for(const c of e.keys())n.has(c)||a(c);return r}function ae(e){const r=ce(e),n=new Map;r.forEach((a,c)=>{a.forEach(l=>n.set(l,c))});const t=new Map;r.forEach((a,c)=>t.set(c,new Set));for(const[a,c]of e){const l=n.get(a);if(l!==void 0)for(const u of c){const f=n.get(u);f!==void 0&&f!==l&&t.get(l)?.add(f)}}const o=[],s=new Set,i=a=>{if(!s.has(a)){s.add(a);for(const c of t.get(a)??[])i(c);o.push(a)}};for(const a of t.keys())i(a);return o.map(a=>r[a]??[])}function ue(e,r){const n=new Map,t=(o,s=new Set)=>{if(n.has(o))return n.get(o)??!1;if(s.has(o))return!1;s.add(o);const i=e.get(o)||new Set;for(const a of i){const c=r.get(a);if(c&&(c.status===h.Dev||t(a,s)))return s.delete(o),n.set(o,!0),!0}return s.delete(o),n.set(o,!1),!1};for(const[o,s]of r)if(s.status===h.Stable&&t(o))throw new Error(`Stable type ${o} depends on a dev type. Stable types may only depend on other stable types.`)}function b(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function I(e){return b(e)?Object.getPrototypeOf(e)===Object.prototype:!1}function P(e){if(Array.isArray(e))return e.map(r=>P(r));if(I(e)){const r={};for(const[n,t]of Object.entries(e))r[n]=P(t);return r}return e}function $(e){return e.map(r=>({repositoryVersionIndex:r.repositoryVersionIndex,typeBlueId:r.typeBlueId,attributesAdded:[...r.attributesAdded]}))}const le=/^\$\{([\s\S]*)\}$/;class fe{process(r,n){const t=n.getValue();if(U(t)){const o=n.clone();return o.setValue(t),o.setProperties(void 0),o.setItems(void 0),o.setType(void 0),o}return r}postProcess(r,n){const t=n.getValue();if(U(t)&&r.getValue()!==t){const o=r.clone();return o.setValue(t),o}return r}}function U(e){return typeof e!="string"||!le.test(e)?!1:e.indexOf("${")===e.lastIndexOf("${")}function de(){return new y.MergingProcessors.SequentialMergingProcessor([new y.MergingProcessors.ValuePropagator,new fe,new y.MergingProcessors.TypeAssigner,new y.MergingProcessors.ListProcessor,new y.MergingProcessors.DictionaryProcessor,new y.MergingProcessors.MetadataPropagator,new y.MergingProcessors.BasicTypesVerifier])}function Y(e){return y.canonicalizeRepositoryContent(e)}function M(e){return Y(e)}const G="00000000000000000000000000000000000000000000";function pe(e,r,n,t){const o=new Map,s=new Map,i=new Map(Object.entries(y.BUILTIN_RUNTIME_TYPE_CONTENT_BY_BLUE_ID)),a=new y.Blue,c=y.createNodeProvider(f=>ge(f)?[new y.BlueNode().setReferenceBlueId(f)]:ye(i,f).map(g=>a.jsonValueToNode(Y(g)))),u={blue:new y.Blue({nodeProvider:y.NodeProviderWrapper.unverified(c),mergingProcessor:de()}),contentByBlueId:i};for(const f of e){if(we(f,n)){he({component:f,discovered:r,previousTypes:t,aliasToBlueId:o,aliasToStorageContent:s,context:u});continue}const g=f[0];if(!g)continue;const m=r.get(g);m&&me({alias:g,type:m,previousTypes:t,aliasToBlueId:o,aliasToStorageContent:s,context:u})}return{aliasToBlueId:o,aliasToStorageContent:s}}function ye(e,r){const n=J(r);if(n===void 0)return[];const t=e.get(n.baseBlueId);if(t===void 0)return[];if(n.index===void 0)return Array.isArray(t)?t:[t];if(!Array.isArray(t))return n.index===0?[t]:[];const o=t[n.index];return o===void 0?[]:[o]}function J(e){const r=e.indexOf("#");if(r===-1)return{baseBlueId:e};const n=e.slice(0,r),t=e.slice(r+1),o=Number(t);if(!(!Number.isInteger(o)||o<0))return{baseBlueId:n,index:o}}function ge(e){return e===G||/^this#\d+$/.test(e)}function _(e,r,n=!1,t=!1){if(Array.isArray(e))return e.map(s=>_(s,r,n,t));if(!b(e))return e;const o={};for(const[s,i]of Object.entries(e)){const a=t||s===v.OBJECT_CONTRACTS;if((s==="type"||s==="itemType"||s==="keyType"||s==="valueType")&&typeof i=="string"&&!(n&&a)){if(V.has(i)){const c=N[i];if(!c)throw new Error(`Missing primitive BlueId for ${i}.`);o[s]={blueId:c}}else{const c=i,l=r(c);if(!l)throw new Error(`Missing BlueId for alias ${c}.`);o[s]={blueId:l}}continue}o[s]=_(i,r,n,a)}return o}function me({alias:e,type:r,previousTypes:n,aliasToBlueId:t,aliasToStorageContent:o,context:s}){const{node:i,storageContent:a}=R(r,m=>t.get(m),s.blue),c=V.has(r.typeName),l=c?Be(r.typeName):s.blue.calculateBlueIdSync(i),u=W(n,r,a),f=u?.blueId??l,g=u?.content??a;t.set(e,f),o.set(e,g),c||s.contentByBlueId.set(f,g),s.blue.registerBlueIds({[e]:f})}function he({component:e,discovered:r,previousTypes:n,aliasToBlueId:t,aliasToStorageContent:o,context:s}){const i=new Set(e),a=new Map;e.forEach((d,p)=>a.set(d,p));const c=e.map(d=>{const p=C(r,d),{node:E}=R(p,w=>i.has(w)?G:t.get(w),s.blue);return{alias:d,preliminaryBlueId:y.BlueIdCalculator.calculateBlueIdAllowingCyclicPlaceholdersSync(E)}});Ee(c),c.sort(ve);const l=new Map;c.forEach(({alias:d},p)=>{l.set(d,p)});const u=new Map;for(const d of e){const p=C(r,d),E=R(p,w=>{if(!i.has(w))return t.get(w);const D=l.get(w);if(D===void 0)throw new Error(`Failed to resolve cyclic reference ${w}.`);return`this#${D}`},s.blue);u.set(d,E)}const f=Ie(e,r,n,u);if(f){for(const d of e){const p=f.get(d);if(!p)throw new Error(`Failed to preserve cyclic BlueId for type ${d}.`);t.set(d,p.blueId),o.set(d,p.content),s.blue.registerBlueIds({[d]:p.blueId})}be(s.contentByBlueId,f);return}const g=c.map(({alias:d})=>{const p=u.get(d);if(!p)throw new Error(`Failed to build cyclic content for type ${d}.`);return p.node}),m=c.map(({alias:d})=>{const p=u.get(d);if(!p)throw new Error(`Failed to build cyclic content for type ${d}.`);return p.storageContent}),A=s.blue.calculateBlueIdSync(g);s.contentByBlueId.set(A,m),c.forEach(({alias:d},p)=>{const E=u.get(d);if(!E)throw new Error(`Failed to build cyclic content for type ${d}.`);const w=`${A}#${p}`;t.set(d,w),o.set(d,E.storageContent),s.blue.registerBlueIds({[d]:w})})}function we(e,r){if(e.length>1)return!0;const n=e[0];return n?r.get(n)?.has(n)??!1:!1}function R(e,r,n){const t=_(P(e.content),r);try{const o=n.jsonValueToNode(t),s=M(n.nodeToJson(o,"official"));return{node:o,storageContent:s}}catch(o){const s=o instanceof Error?o.message:"Unknown error encountered.";throw new Error(`Failed to build ${e.filePath}: ${s}`)}}function C(e,r){const n=e.get(r);if(!n)throw new Error(`Unknown type alias ${r}.`);return n}function Ie(e,r,n,t){const o=new Map;for(const s of e){const i=C(r,s),a=t.get(s);if(!a)throw new Error(`Failed to build cyclic content for type ${s}.`);const c=W(n,i,a.storageContent);if(!c)return null;o.set(s,c)}return o}function W(e,r,n){const t=e.get(r.packageName)?.get(r.typeName),o=t?.versions?.at(-1)?.typeBlueId;if(!o||!t||!I(t.content))return null;const s=M(t.content);return O(s,n)?{blueId:o,content:P(s)}:null}function be(e,r){const n=new Map;for(const{blueId:t,content:o}of r.values()){const s=J(t);if(!s||s.index===void 0){e.set(t,o);continue}const i=n.get(s.baseBlueId)??[];i.push({index:s.index,content:o}),n.set(s.baseBlueId,i)}for(const[t,o]of n){const i=[...o].sort((a,c)=>a.index-c.index).map((a,c)=>{if(a.index!==c)throw new Error(`Cyclic repository content for ${t} is missing index ${c}.`);return a.content});e.set(t,i)}}function Ee(e){const r=new Map;for(const n of e){const t=r.get(n.preliminaryBlueId);if(t)throw new Error(`Direct cyclic type set has ambiguous canonical ordering: ${t} and ${n.alias} share preliminary BlueId '${n.preliminaryBlueId}'.`);r.set(n.preliminaryBlueId,n.alias)}}function ve(e,r){return e.preliminaryBlueId<r.preliminaryBlueId?-1:e.preliminaryBlueId>r.preliminaryBlueId?1:0}function O(e,r){if(e===r)return!0;if(Array.isArray(e)||Array.isArray(r))return!Array.isArray(e)||!Array.isArray(r)||e.length!==r.length?!1:e.every((n,t)=>O(n,r[t]));if(I(e)||I(r)){if(!I(e)||!I(r))return!1;const n=Object.keys(e).sort(),t=Object.keys(r).sort();return n.length!==t.length?!1:n.every((o,s)=>o===t[s]&&O(e[o],r[o]))}return!1}function Be(e){const r=N[e];if(!r)throw new Error(`Missing primitive BlueId for ${e}.`);return r}const L=new Set(Object.values(N)),Ae=new Set(["type","itemType","valueType","keyType"]),Se=new Set(["name","description"]),B={Unchanged:"unchanged",NonBreaking:"non-breaking",Breaking:"breaking"};function Te(e,r,n,t,o){const s=H.compare(e,r);if(s.length===0)return{status:B.Unchanged,attributesAdded:[]};const i=[];let a=!1;for(const c of s){if(Me(c,e,o)){a=!0;continue}if(c.op!=="add")return{status:B.Breaking,attributesAdded:[]};if(!Ne(c))return{status:B.Breaking,attributesAdded:[]};i.push(c.path)}return i.length===0&&!a?{status:B.Breaking,attributesAdded:[]}:(i.length>0&&Pe(i,n,t),{status:B.NonBreaking,attributesAdded:i})}function Pe(e,r,n){for(const t of e)try{v.validateAttributesAddedPointer(t)}catch(o){throw new Error(`Invalid attribute pointer "${t}" for ${r}/${n}: ${o.message}`)}}function Ne(e){if(e.op!=="add")return!1;const r=z(e.path);if(r.length===0)return!1;const n=r.at(-1);return n&&/^\d+$/.test(n)||n&&Ae.has(n)||r.some(t=>v.RESERVED_ATTRIBUTES_POINTER_SEGMENTS.has(t))?!1:b(e.value)?!ke(e.value):n?Se.has(n):!1}function z(e){try{return v.parsePointer(e)}catch{return[]}}function ke(e){const r=[e];for(;r.length;){const n=r.pop();if(n){if(Object.prototype.hasOwnProperty.call(n,"value")||Object.prototype.hasOwnProperty.call(n,"items"))return!0;if(Object.prototype.hasOwnProperty.call(n,v.OBJECT_SCHEMA)){const t=n[v.OBJECT_SCHEMA];if(b(t)&&t.required===!0)return!0}for(const[t,o]of Object.entries(n))t!==v.OBJECT_SCHEMA&&b(o)&&r.push(o)}}return!1}function Me(e,r,n){if(e.op!=="replace"||typeof e.path!="string")return!1;const t=z(e.path);if(t.length<2)return!1;const o=t.at(-1),s=t.at(-2);if(!(o==="blueId"&&s!==void 0&&(s==="type"||s==="itemType"||s==="keyType"||s==="valueType")))return!1;const i=$e(r,t),a=typeof i=="string"?i:b(i)&&typeof i.blueId=="string"?i.blueId:null,c=typeof e.value=="string"?e.value:b(e.value)&&typeof e.value.blueId=="string"?e.value.blueId:null;if(a&&L.has(a)||c&&L.has(c)||!a||!c)return!1;const l=n.get(a),u=n.get(c);if(!l||!u)return!1;for(const f of l)if(u.has(f))return!0;return!1}function $e(e,r){let n=e;for(const t of r)if(Array.isArray(n)){const o=Number(t);if(Number.isNaN(o)||o<0||o>=n.length)return;n=n[o]}else if(b(n))n=n[t];else return;return n}function _e(e){const r=new Map;if(!e)return r;for(const n of e.packages||[]){if(typeof n.name!="string")continue;const t=new Map;for(const o of n.types||[]){const s=o.content,i=I(s)?M(s):s,a=I(i)&&typeof i.name=="string"?i.name:void 0;a&&t.set(a,{...o,content:i})}r.set(n.name,t)}return r}function Re(e,r){for(const[n,t]of r)for(const[o,s]of t){const i=`${n}/${o}`;if(!e.has(i)&&s.status===h.Stable)throw new Error(`Stable type ${i} was removed. Breaking changes require a new logical type name.`)}}function Ce({discovered:e,previousTypes:r,aliasToBlueId:n,aliasToStorageContent:t,nextRepoVersionIndex:o}){const s=new Map,i=Oe(r,n);for(const[a,c]of e){const l=n.get(a);if(!l)throw new Error(`Failed to compute BlueId for type ${a}.`);const u=r.get(c.packageName)?.get(c.typeName)??null;if(u&&u.status===h.Stable&&c.status===h.Dev)throw new Error(`Type ${a} was stable previously and cannot be downgraded to dev. Use a new logical name instead.`);const f=t.get(a)??c.content,g=c.status===h.Dev?Ve({blueId:l,nextRepoVersionIndex:o,previousType:u}):!u||u.status===h.Dev?xe({blueId:l,nextRepoVersionIndex:o}):De({alias:a,blueId:l,nextRepoVersionIndex:o,previousType:u,currentContent:f,packageName:c.packageName,typeName:c.typeName,blueIdAliases:i});g.content=f,g.status=c.status;const m=s.get(c.packageName)??[];m.push(g),s.set(c.packageName,m)}return s}function Oe(e,r){const n=new Map,t=(o,s)=>{const i=n.get(o);if(i){i.add(s);return}n.set(o,new Set([s]))};for(const[o,s]of e)for(const[i,a]of s){const c=`${o}/${i}`;for(const l of a.versions??[])typeof l.typeBlueId=="string"&&t(l.typeBlueId,c)}for(const[o,s]of r)t(s,o);return n}function Ve({blueId:e,nextRepoVersionIndex:r,previousType:n}){const t=n&&n.status===h.Dev?n:null,o=t?.versions?.length===1?t.versions[0]:null,s=o&&o.typeBlueId===e;return{status:h.Dev,content:{},versions:s&&t?.versions?$(t.versions):[{repositoryVersionIndex:r,typeBlueId:e,attributesAdded:[]}]}}function xe({blueId:e,nextRepoVersionIndex:r}){return{status:h.Stable,content:{},versions:[{repositoryVersionIndex:r,typeBlueId:e,attributesAdded:[]}]}}function De({alias:e,blueId:r,nextRepoVersionIndex:n,previousType:t,currentContent:o,packageName:s,typeName:i,blueIdAliases:a}){if(!I(t.content))throw new Error(`Type ${e} has non-object content; cannot compute diff for stable versioning.`);const c=M(t.content),l=Te(c,o,s,i,a);if(l.status===B.Unchanged){const u=$(t.versions||[]),f=u.at(-1);if(f&&f.typeBlueId!==r)throw new Error(`Type ${e} content is unchanged but BlueId differs from previous metadata.`);return{status:h.Stable,content:{},versions:u}}if(l.status===B.NonBreaking)return{status:h.Stable,content:{},versions:[...$(t.versions||[]),{repositoryVersionIndex:n,typeBlueId:r,attributesAdded:l.attributesAdded}]};throw new Error(`Breaking change detected in stable type ${e}. Introduce a new type name for breaking changes.`)}function je(e){return Array.from(e.entries()).map(([r,n])=>({name:r,types:n.map(t=>({...t,versions:[...t.versions].sort((o,s)=>o.repositoryVersionIndex-s.repositoryVersionIndex)})).sort((t,o)=>{const s=I(t.content)&&typeof t.content.name=="string"?t.content.name:"",i=I(o.content)&&typeof o.content.name=="string"?o.content.name:"";return s.localeCompare(i)})})).sort((r,n)=>r.name.localeCompare(n.name))}function F(e){return y.BlueIdCalculator.INSTANCE.calculateAllowingCyclicPlaceholdersSync(e)}function Ue(e,r,n){const t=r?.repositoryVersions.at(-1),o=!t||t!==n,s=r?.repositoryVersions?[...r.repositoryVersions]:[];return o&&s.push(n),{document:{name:x,packages:e,repositoryVersions:s},changed:o}}function Le(e,r,n){const t={name:x,repositoryVersions:r,packages:Fe(e,n)};v.validateStableDoesNotDependOnDev(t)}function Fe(e,r){const n={};for(const t of e){const o=qe(t.name,r),s={},i={};for(const a of t.types){const c=a.versions?.[a.versions.length-1]?.typeBlueId;if(!c)throw new Error(`Type ${t.name} is missing a current BlueId in versions.`);const l=Ye(a);s[c]={status:a.status,name:l,versions:a.versions??[]},i[c]=a.content}n[t.name]={name:t.name,aliases:o,typesMeta:s,contents:i,schemas:{}}}return n}function qe(e,r){const n={},t=`${e}/`;return r.forEach((o,s)=>{s.startsWith(t)&&(n[s]=o)}),n}function Ye(e){const r=I(e.content)&&typeof e.content.name=="string"?e.content.name:null;if(!r)throw new Error('Type content is missing required "name" field.');return r}function Ge(e){if(!S.existsSync(e))return{previous:null};const r=S.readFileSync(e,"utf8"),n=y.yamlBlueParse(r);if(!n||!b(n))throw new Error("Existing BlueRepository.blue is not a valid object.");const t=n,o=t.packages,s=t.repositoryVersions,i=Array.isArray(o)&&o.every(f=>b(f)&&typeof f.name=="string"&&Array.isArray(f.types)),a=Array.isArray(s)&&s.every(f=>typeof f=="string");if(!i||!a)throw new Error("Invalid BlueRepository.blue structure: expected { packages: BluePackage[], repositoryVersions: string[] }");const c=o,l=s,u={name:typeof t.name=="string"?t.name:x,packages:c,repositoryVersions:l};return{existingYaml:r,previous:u}}function Je(e){return K.dump(e,{lineWidth:-1})}function We(e){const r=j.resolve(e.repoRoot),n=j.resolve(e.blueRepositoryPath),{existingYaml:t,previous:o}=Ge(n),s=te(r),i=_e(o);Re(s,i);const a=ie(s),c=ae(a);ue(a,s);const{aliasToBlueId:l,aliasToStorageContent:u}=pe(c,s,a,i),f=o?o.repositoryVersions.length:0,g=Ce({discovered:s,previousTypes:i,aliasToBlueId:l,aliasToStorageContent:u,nextRepoVersionIndex:f}),m=je(g),A=o&&ze(o.packages,m)?o.repositoryVersions.at(-1)??F(m):F(m),{document:d,changed:p}=Ue(m,o,A);Le(d.packages,d.repositoryVersions,l);const E=Je(d),w=t!==void 0&&t===E;return e.verbose&&console.info(`[repository-generator] RepoBlueId: ${A} (${p?"changed":"unchanged"})`),{document:d,currentRepoBlueId:A,previousRepoBlueId:o?.repositoryVersions.at(-1),changed:p||!w,yaml:E,existingYaml:t}}function ze(e,r){return JSON.stringify(e)===JSON.stringify(r)}exports.generateRepository=We;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./generateRepository-DUT9zf8k.js");exports.generateRepository=e.generateRepository;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./generateRepository-n6pGl-dC.js");exports.generateRepository=e.generateRepository;
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { g as r } from "./generateRepository-B7eem2l_.mjs";
1
+ import { g as r } from "./generateRepository-BIy5RMGX.mjs";
2
2
  export {
3
3
  r as generateRepository
4
4
  };
@@ -1,4 +1,4 @@
1
- import { BlueNode, MergingProcessor } from '@blue-labs/language';
1
+ import { BlueNode, MergingProcessor } from '../../../libs/language/src/index.ts';
2
2
  export declare class ExpressionPreserver implements MergingProcessor {
3
3
  process(target: BlueNode, source: BlueNode): BlueNode;
4
4
  postProcess(target: BlueNode, source: BlueNode): BlueNode;
@@ -1,4 +1,4 @@
1
- import { JsonValue } from '@blue-labs/shared-utils';
1
+ import { JsonValue } from '../../../libs/shared/utils/src/index.ts';
2
2
  import { Alias, DiscoveredType, JsonMap, PackageTypeMap } from './internalTypes';
3
3
  import { AliasComponent, DependencyGraph } from './graph';
4
4
  export declare const ZERO_BLUE_ID = "00000000000000000000000000000000000000000000";
@@ -1 +1 @@
1
- {"version":3,"file":"blueIds.d.ts","sourceRoot":"","sources":["../../../src/lib/core/blueIds.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,KAAK,EACL,cAAc,EACd,OAAO,EACP,cAAc,EACf,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/D,eAAO,MAAM,YAAY,iDAAiD,CAAC;AAiB3E,wBAAgB,cAAc,CAC5B,cAAc,EAAE,cAAc,EAAE,EAChC,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,EACtC,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,cAAc,GAC5B;IACD,aAAa,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAClC,qBAAqB,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;CAC5C,CAoDA;AAED,wBAAgB,4BAA4B,CAC1C,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,EAC/C,MAAM,EAAE,MAAM,GACb,SAAS,EAAE,CAqBb;AAwBD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EACjC,aAAa,UAAQ,EACrB,cAAc,UAAQ,GACrB,SAAS,CAOX"}
1
+ {"version":3,"file":"blueIds.d.ts","sourceRoot":"","sources":["../../../src/lib/core/blueIds.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,KAAK,EACL,cAAc,EACd,OAAO,EACP,cAAc,EACf,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/D,eAAO,MAAM,YAAY,iDAAiD,CAAC;AAiB3E,wBAAgB,cAAc,CAC5B,cAAc,EAAE,cAAc,EAAE,EAChC,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,EACtC,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,cAAc,GAC5B;IACD,aAAa,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAClC,qBAAqB,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;CAC5C,CAyDA;AAED,wBAAgB,4BAA4B,CAC1C,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,EAC/C,MAAM,EAAE,MAAM,GACb,SAAS,EAAE,CAqBb;AAwBD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EACjC,aAAa,UAAQ,EACrB,cAAc,UAAQ,GACrB,SAAS,CAOX"}
@@ -0,0 +1,2 @@
1
+ export { BUILTIN_RUNTIME_TYPE_CONTENT_BY_BLUE_ID, BUILTIN_RUNTIME_TYPE_NAME_TO_BLUE_ID_MAP, } from '../../../libs/language/src/index.ts';
2
+ //# sourceMappingURL=builtinRuntimeTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtinRuntimeTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/core/builtinRuntimeTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uCAAuC,EACvC,wCAAwC,GACzC,MAAM,qBAAqB,CAAC"}
@@ -1,5 +1,7 @@
1
- export declare const PRIMITIVE_TYPES: Set<string>;
2
1
  export declare const PRIMITIVE_BLUE_IDS: Record<string, string>;
2
+ export declare const PRIMITIVE_TYPES: Set<string>;
3
+ export declare const SCALAR_PRIMITIVE_TYPES: Set<string>;
4
+ export declare const RESERVED_LANGUAGE_KEYS: Set<string>;
3
5
  export declare const BLUE_REPOSITORY_NAME = "Blue Repository";
4
6
  export declare const BLUE_TYPE_STATUS: {
5
7
  readonly Dev: "dev";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/core/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,aAA8C,CAAC;AAC3E,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CACZ,CAAC;AAE3C,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AAEtD,eAAO,MAAM,gBAAgB;;;CAGnB,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAC/B,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAE3D,eAAO,MAAM,oBAAoB,aAQ/B,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/core/constants.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGrD,CAAC;AACF,eAAO,MAAM,eAAe,aAAmD,CAAC;AAChF,eAAO,MAAM,sBAAsB,aAEjC,CAAC;AAEH,eAAO,MAAM,sBAAsB,aAcjC,CAAC;AAEH,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AAEtD,eAAO,MAAM,gBAAgB;;;CAGnB,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAC/B,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAE3D,eAAO,MAAM,oBAAoB,aAQ/B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/lib/core/discovery.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAW,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAOjE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAgD1E"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/lib/core/discovery.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAW,KAAK,EAAE,MAAM,iBAAiB,CAAC;AASjE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAgD1E"}
@@ -1,4 +1,4 @@
1
- import { JsonValue } from '@blue-labs/shared-utils';
1
+ import { JsonValue } from '../../../libs/shared/utils/src/index.ts';
2
2
  import { BlueTypeMetadata } from '../types';
3
3
  import { BlueTypeStatusLiteral } from './constants';
4
4
  export type PackageName = string;
@@ -1,3 +1,3 @@
1
- import { MergingProcessor } from '@blue-labs/language';
1
+ import { MergingProcessor } from '../../../libs/language/src/index.ts';
2
2
  export declare function createRepositoryGeneratorMergingProcessor(): MergingProcessor;
3
3
  //# sourceMappingURL=mergingProcessor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repoDoc.d.ts","sourceRoot":"","sources":["../../../src/lib/core/repoDoc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAE/D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAO9C,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,GAC/C,WAAW,EAAE,CAwBf;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAMjE;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,WAAW,EAAE,EACvB,QAAQ,EAAE,sBAAsB,GAAG,IAAI,EACvC,iBAAiB,EAAE,MAAM,GACxB;IAAE,QAAQ,EAAE,sBAAsB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAmBxD"}
1
+ {"version":3,"file":"repoDoc.d.ts","sourceRoot":"","sources":["../../../src/lib/core/repoDoc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAE/D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,GAC/C,WAAW,EAAE,CAwBf;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAMjE;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,WAAW,EAAE,EACvB,QAAQ,EAAE,sBAAsB,GAAG,IAAI,EACvC,iBAAiB,EAAE,MAAM,GACxB;IAAE,QAAQ,EAAE,sBAAsB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAmBxD"}
@@ -0,0 +1,5 @@
1
+ import { JsonValue } from '../../../libs/shared/utils/src/index.ts';
2
+ import { JsonMap } from './internalTypes';
3
+ export declare function canonicalizeRepositoryStorageContent(content: JsonValue): JsonValue;
4
+ export declare function canonicalizeRepositoryStorageMap(content: JsonMap): JsonMap;
5
+ //# sourceMappingURL=repositoryContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryContent.d.ts","sourceRoot":"","sources":["../../../src/lib/core/repositoryContent.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,SAAS,GACjB,SAAS,CAEX;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAE1E"}
@@ -1,4 +1,4 @@
1
- import { JsonValue } from '@blue-labs/shared-utils';
1
+ import { JsonValue } from '../../../libs/shared/utils/src/index.ts';
2
2
  import { BlueTypeVersion } from '../types';
3
3
  export declare function isRecord(value: unknown): value is Record<string, unknown>;
4
4
  export declare function isPlainObject(value: unknown): value is Record<string, JsonValue>;
@@ -1 +1 @@
1
- {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../../src/lib/core/versions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,EACL,KAAK,EACL,cAAc,EACd,OAAO,EACP,cAAc,EAEd,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAKzB,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,GACtC,cAAc,CA0BhB;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,EACtC,aAAa,EAAE,cAAc,QAe9B;AAED,UAAU,iBAAiB;IACzB,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACvC,aAAa,EAAE,cAAc,CAAC;IAC9B,aAAa,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAClC,qBAAqB,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,EAC5B,UAAU,EACV,aAAa,EACb,aAAa,EACb,qBAAqB,EACrB,oBAAoB,GACrB,EAAE,iBAAiB,GAAG,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAkD1D"}
1
+ {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../../src/lib/core/versions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,EACL,KAAK,EACL,cAAc,EACd,OAAO,EACP,cAAc,EAEd,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAMzB,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,GACtC,cAAc,CA8BhB;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,EACtC,aAAa,EAAE,cAAc,QAe9B;AAED,UAAU,iBAAiB;IACzB,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACvC,aAAa,EAAE,cAAc,CAAC;IAC9B,aAAa,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAClC,qBAAqB,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,EAC5B,UAAU,EACV,aAAa,EACb,aAAa,EACb,qBAAqB,EACrB,oBAAoB,GACrB,EAAE,iBAAiB,GAAG,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAkD1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"generateRepository.d.ts","sourceRoot":"","sources":["../../src/lib/generateRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAqB9E,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,wBAAwB,CA2E1B"}
1
+ {"version":3,"file":"generateRepository.d.ts","sourceRoot":"","sources":["../../src/lib/generateRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAqB9E,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,wBAAwB,CAsE1B"}
@@ -1,6 +1,6 @@
1
- import { BlueRepositoryDocument } from '@blue-labs/repository-contract';
1
+ import { BlueRepositoryDocument } from '../../libs/repository-contract/src/index.ts';
2
2
  import { BlueTypeStatusLiteral } from './core/constants';
3
- export type { BluePackage, BlueRepositoryDocument, BlueTypeMetadata, BlueTypeVersion, } from '@blue-labs/repository-contract';
3
+ export type { BluePackage, BlueRepositoryDocument, BlueTypeMetadata, BlueTypeVersion, } from '../../libs/repository-contract/src/index.ts';
4
4
  export type BlueTypeStatus = BlueTypeStatusLiteral;
5
5
  export type GeneratorMode = 'check' | 'write';
6
6
  export interface GenerateRepositoryOptions {
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@blue-labs/repository-generator",
3
- "version": "4.1.1",
3
+ "version": "5.0.0-rc.0",
4
4
  "bin": {
5
5
  "blue-repo-generator": "./dist/bin/blue-repo-generator.mjs"
6
6
  },
7
7
  "dependencies": {
8
- "@blue-labs/language": "4.1.1",
9
- "@blue-labs/repository-contract": "4.1.1",
8
+ "@blue-labs/language": "5.0.0-rc.0",
9
+ "@blue-labs/repository-contract": "5.0.0-rc.0",
10
10
  "fast-json-patch": "3.1.1",
11
11
  "js-yaml": "4.1.0",
12
- "@blue-labs/shared-utils": "4.1.1"
12
+ "@blue-labs/shared-utils": "5.0.0-rc.0"
13
13
  },
14
14
  "main": "./dist/index.js",
15
15
  "module": "./dist/index.mjs",
@@ -1 +0,0 @@
1
- "use strict";const T=require("path"),S=require("fs"),g=require("@blue-labs/language"),v=require("@blue-labs/repository-contract"),Y=require("fast-json-patch"),H=require("js-yaml");function z(e){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const t=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,t.get?t:{enumerable:!0,get:()=>e[n]})}}return r.default=e,Object.freeze(r)}const D=z(T),O=new Set([...g.Properties.CORE_TYPES]),V=g.Properties.CORE_TYPE_NAME_TO_BLUE_ID_MAP,C="Blue Repository",h={Dev:"dev",Stable:"stable"},K=new Set([".git",".github",".husky","node_modules",".nx",".vscode",".idea"]);function X(e){const r=S.readdirSync(e,{withFileTypes:!0}),n=new Map;for(const t of r){if(!t.isDirectory()||K.has(t.name))continue;const o=T.join(e,t.name),s=q(o);if(s.length!==0)for(const a of s){const c=a.endsWith(".dev.blue")?h.Dev:h.Stable,i=Z(a),f=Q(i,a),u=`${t.name}/${f}`,l=n.get(u);if(l)throw l.status!==c?new Error(`Type ${u} has both stable and dev definitions (${l.filePath} and ${a}).`):new Error(`Type ${u} is defined multiple times (${l.filePath} and ${a}).`);const y=ee(i,a);n.set(u,{packageName:t.name,typeName:f,status:c,content:i,filePath:a,references:y})}}return n}function Z(e){const r=S.readFileSync(e,"utf8"),n=g.yamlBlueParse(r);if(!x(n))throw new Error(`Type file ${e} must contain a YAML object.`);return n}function Q(e,r){if(!x(e)||typeof e.name!="string")throw new Error(`Type file ${r} is missing required "name" field.`);return e.name}function q(e){const r=S.readdirSync(e,{withFileTypes:!0}),n=[];for(const t of r){if(t.isDirectory()){n.push(...q(T.join(e,t.name)));continue}(t.name.endsWith(".blue")||t.name.endsWith(".dev.blue"))&&n.push(T.join(e,t.name))}return n}function ee(e,r){const n=new Set,t=o=>{if(Array.isArray(o)){o.forEach(a=>t(a));return}if(!x(o))return;const s=a=>{if(typeof a=="string"&&!O.has(a)){if(!a.includes("/"))throw new Error(`Invalid type reference "${a}" in ${r}. Use <Package>/<Type> for non-primitive references.`);n.add(a)}};s(o.type),s(o.itemType),s(o.keyType),s(o.valueType),Object.values(o).forEach(a=>t(a))};return t(e),n}function x(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function te(e){const r=new Map;for(const[n,t]of e){const o=new Set;for(const s of t.references){if(!e.has(s))throw new Error(`Type ${n} references unknown alias ${s}. Ensure the target type exists.`);o.add(s)}r.set(n,o)}return r}function ne(e){const r=[],n=new Map,t=new Map,o=[],s=new Set;let a=0;const c=i=>{n.set(i,a),t.set(i,a),a+=1,o.push(i),s.add(i);for(const u of e.get(i)??[]){if(!n.has(u)){c(u),t.set(i,Math.min(t.get(i)??0,t.get(u)??0));continue}s.has(u)&&t.set(i,Math.min(t.get(i)??0,n.get(u)??0))}if(t.get(i)!==n.get(i))return;const f=[];for(;o.length>0;){const u=o.pop();if(!u||(s.delete(u),f.push(u),u===i))break}r.push(f.sort((u,l)=>u.localeCompare(l)))};for(const i of e.keys())n.has(i)||c(i);return r}function re(e){const r=ne(e),n=new Map;r.forEach((c,i)=>{c.forEach(f=>n.set(f,i))});const t=new Map;r.forEach((c,i)=>t.set(i,new Set));for(const[c,i]of e){const f=n.get(c);if(f!==void 0)for(const u of i){const l=n.get(u);l!==void 0&&l!==f&&t.get(f)?.add(l)}}const o=[],s=new Set,a=c=>{if(!s.has(c)){s.add(c);for(const i of t.get(c)??[])a(i);o.push(c)}};for(const c of t.keys())a(c);return o.map(c=>r[c]??[])}function oe(e,r){const n=new Map,t=(o,s=new Set)=>{if(n.has(o))return n.get(o)??!1;if(s.has(o))return!1;s.add(o);const a=e.get(o)||new Set;for(const c of a){const i=r.get(c);if(i&&(i.status===h.Dev||t(c,s)))return s.delete(o),n.set(o,!0),!0}return s.delete(o),n.set(o,!1),!1};for(const[o,s]of r)if(s.status===h.Stable&&t(o))throw new Error(`Stable type ${o} depends on a dev type. Stable types may only depend on other stable types.`)}function I(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function w(e){return I(e)?Object.getPrototypeOf(e)===Object.prototype:!1}function P(e){if(Array.isArray(e))return e.map(r=>P(r));if(w(e)){const r={};for(const[n,t]of Object.entries(e))r[n]=P(t);return r}return e}function k(e){return e.map(r=>({repositoryVersionIndex:r.repositoryVersionIndex,typeBlueId:r.typeBlueId,attributesAdded:[...r.attributesAdded]}))}const se=/^\$\{([\s\S]*)\}$/;class ie{process(r,n){const t=n.getValue();if(j(t)){const o=n.clone();return o.setValue(t),o.setProperties(void 0),o.setItems(void 0),o.setType(void 0),o}return r}postProcess(r,n){const t=n.getValue();if(j(t)&&r.getValue()!==t){const o=r.clone();return o.setValue(t),o}return r}}function j(e){return typeof e!="string"||!se.test(e)?!1:e.indexOf("${")===e.lastIndexOf("${")}function ae(){return new g.MergingProcessors.SequentialMergingProcessor([new g.MergingProcessors.ValuePropagator,new ie,new g.MergingProcessors.TypeAssigner,new g.MergingProcessors.ListProcessor,new g.MergingProcessors.DictionaryProcessor,new g.MergingProcessors.MetadataPropagator,new g.MergingProcessors.BasicTypesVerifier])}const L="00000000000000000000000000000000000000000000";function ce(e,r,n,t){const o=new Map,s=new Map,a=new Map,c=new g.Blue,i=g.createNodeProvider(l=>fe(l)?[new g.BlueNode().setReferenceBlueId(l)]:ue(a,l).map(y=>c.jsonValueToNode(y))),u={blue:new g.Blue({nodeProvider:i,mergingProcessor:ae()}),contentByBlueId:a};for(const l of e){if(pe(l,n)){de({component:l,discovered:r,previousTypes:t,aliasToBlueId:o,aliasToStorageContent:s,context:u});continue}const y=l[0];if(!y)continue;const m=r.get(y);m&&le({alias:y,type:m,previousTypes:t,aliasToBlueId:o,aliasToStorageContent:s,context:u})}return{aliasToBlueId:o,aliasToStorageContent:s}}function ue(e,r){const n=G(r);if(n===void 0)return[];const t=e.get(n.baseBlueId);if(t===void 0)return[];if(n.index===void 0)return Array.isArray(t)?t:[t];if(!Array.isArray(t))return n.index===0?[t]:[];const o=t[n.index];return o===void 0?[]:[o]}function G(e){const r=e.indexOf("#");if(r===-1)return{baseBlueId:e};const n=e.slice(0,r),t=e.slice(r+1),o=Number(t);if(!(!Number.isInteger(o)||o<0))return{baseBlueId:n,index:o}}function fe(e){return e===L||/^this#\d+$/.test(e)}function $(e,r,n=!1,t=!1){if(Array.isArray(e))return e.map(s=>$(s,r,n,t));if(!I(e))return e;const o={};for(const[s,a]of Object.entries(e)){const c=t||s===v.OBJECT_CONTRACTS;if((s==="type"||s==="itemType"||s==="keyType"||s==="valueType")&&typeof a=="string"&&!(n&&c)){if(O.has(a)){const i=V[a];if(!i)throw new Error(`Missing primitive BlueId for ${a}.`);o[s]={blueId:i}}else{const i=a,f=r(i);if(!f)throw new Error(`Missing BlueId for alias ${i}.`);o[s]={blueId:f}}continue}o[s]=$(a,r,n,c)}return o}function le({alias:e,type:r,previousTypes:n,aliasToBlueId:t,aliasToStorageContent:o,context:s}){const{node:a,storageContent:c}=M(r,m=>t.get(m),s.blue),i=O.has(r.typeName),f=i?we(r.typeName):s.blue.calculateBlueIdSync(a),u=J(n,r,c),l=u?.blueId??f,y=u?.content??c;t.set(e,l),o.set(e,y),i||s.contentByBlueId.set(l,y),s.blue.registerBlueIds({[e]:l})}function de({component:e,discovered:r,previousTypes:n,aliasToBlueId:t,aliasToStorageContent:o,context:s}){const a=new Set(e),c=new Map;e.forEach((d,p)=>c.set(d,p));const i=e.map(d=>{const p=N(r,d),{node:B}=M(p,b=>a.has(b)?L:t.get(b),s.blue);return{alias:d,preliminaryBlueId:s.blue.calculateBlueIdSync(B)}});me(i),i.sort(he);const f=new Map;i.forEach(({alias:d},p)=>{f.set(d,p)});const u=new Map;for(const d of e){const p=N(r,d),B=M(p,b=>{if(!a.has(b))return t.get(b);const _=f.get(b);if(_===void 0)throw new Error(`Failed to resolve cyclic reference ${b}.`);return`this#${_}`},s.blue);u.set(d,B)}const l=ye(e,r,n,u);if(l){for(const d of e){const p=l.get(d);if(!p)throw new Error(`Failed to preserve cyclic BlueId for type ${d}.`);t.set(d,p.blueId),o.set(d,p.content),s.blue.registerBlueIds({[d]:p.blueId})}ge(s.contentByBlueId,l);return}const y=i.map(({alias:d})=>{const p=u.get(d);if(!p)throw new Error(`Failed to build cyclic content for type ${d}.`);return p.node}),m=i.map(({alias:d})=>{const p=u.get(d);if(!p)throw new Error(`Failed to build cyclic content for type ${d}.`);return p.storageContent}),A=s.blue.calculateBlueIdSync(y);s.contentByBlueId.set(A,m),i.forEach(({alias:d},p)=>{const B=u.get(d);if(!B)throw new Error(`Failed to build cyclic content for type ${d}.`);const b=`${A}#${p}`;t.set(d,b),o.set(d,B.storageContent),s.blue.registerBlueIds({[d]:b})})}function pe(e,r){if(e.length>1)return!0;const n=e[0];return n?r.get(n)?.has(n)??!1:!1}function M(e,r,n){const t=$(P(e.content),r),o=n.jsonValueToNode(t);return{node:o,storageContent:n.nodeToJson(o,"official")}}function N(e,r){const n=e.get(r);if(!n)throw new Error(`Unknown type alias ${r}.`);return n}function ye(e,r,n,t){const o=new Map;for(const s of e){const a=N(r,s),c=t.get(s);if(!c)throw new Error(`Failed to build cyclic content for type ${s}.`);const i=J(n,a,c.storageContent);if(!i)return null;o.set(s,i)}return o}function J(e,r,n){const t=e.get(r.packageName)?.get(r.typeName),o=t?.versions?.at(-1)?.typeBlueId;return!o||!t||!w(t.content)||!R(t.content,n)?null:{blueId:o,content:P(t.content)}}function ge(e,r){const n=new Map;for(const{blueId:t,content:o}of r.values()){const s=G(t);if(!s||s.index===void 0){e.set(t,o);continue}const a=n.get(s.baseBlueId)??[];a.push({index:s.index,content:o}),n.set(s.baseBlueId,a)}for(const[t,o]of n){const a=[...o].sort((c,i)=>c.index-i.index).map((c,i)=>{if(c.index!==i)throw new Error(`Cyclic repository content for ${t} is missing index ${i}.`);return c.content});e.set(t,a)}}function me(e){const r=new Map;for(const n of e){const t=r.get(n.preliminaryBlueId);if(t)throw new Error(`Direct cyclic type set has ambiguous canonical ordering: ${t} and ${n.alias} share preliminary BlueId '${n.preliminaryBlueId}'.`);r.set(n.preliminaryBlueId,n.alias)}}function he(e,r){return e.preliminaryBlueId<r.preliminaryBlueId?-1:e.preliminaryBlueId>r.preliminaryBlueId?1:0}function R(e,r){if(e===r)return!0;if(Array.isArray(e)||Array.isArray(r))return!Array.isArray(e)||!Array.isArray(r)||e.length!==r.length?!1:e.every((n,t)=>R(n,r[t]));if(w(e)||w(r)){if(!w(e)||!w(r))return!1;const n=Object.keys(e).sort(),t=Object.keys(r).sort();return n.length!==t.length?!1:n.every((o,s)=>o===t[s]&&R(e[o],r[o]))}return!1}function we(e){const r=V[e];if(!r)throw new Error(`Missing primitive BlueId for ${e}.`);return r}const U=new Set(Object.values(V)),be=new Set(["type","itemType","valueType","keyType"]),Ie=new Set(["name","description"]),E={Unchanged:"unchanged",NonBreaking:"non-breaking",Breaking:"breaking"};function Be(e,r,n,t,o){const s=Y.compare(e,r);if(s.length===0)return{status:E.Unchanged,attributesAdded:[]};const a=[];let c=!1;for(const i of s){if(Se(i,e,o)){c=!0;continue}if(i.op!=="add")return{status:E.Breaking,attributesAdded:[]};if(!Ee(i))return{status:E.Breaking,attributesAdded:[]};a.push(i.path)}return a.length===0&&!c?{status:E.Breaking,attributesAdded:[]}:(a.length>0&&ve(a,n,t),{status:E.NonBreaking,attributesAdded:a})}function ve(e,r,n){for(const t of e)try{v.validateAttributesAddedPointer(t)}catch(o){throw new Error(`Invalid attribute pointer "${t}" for ${r}/${n}: ${o.message}`)}}function Ee(e){if(e.op!=="add")return!1;const r=W(e.path);if(r.length===0)return!1;const n=r.at(-1);return n&&/^\d+$/.test(n)||n&&be.has(n)||r.some(t=>v.RESERVED_ATTRIBUTES_POINTER_SEGMENTS.has(t))?!1:I(e.value)?!Ae(e.value):n?Ie.has(n):!1}function W(e){try{return v.parsePointer(e)}catch{return[]}}function Ae(e){const r=[e];for(;r.length;){const n=r.pop();if(n){if(Object.prototype.hasOwnProperty.call(n,"value")||Object.prototype.hasOwnProperty.call(n,"items"))return!0;if(Object.prototype.hasOwnProperty.call(n,v.OBJECT_SCHEMA)){const t=n[v.OBJECT_SCHEMA];if(I(t)&&t.required===!0)return!0}for(const[t,o]of Object.entries(n))t!==v.OBJECT_SCHEMA&&I(o)&&r.push(o)}}return!1}function Se(e,r,n){if(e.op!=="replace"||typeof e.path!="string")return!1;const t=W(e.path);if(t.length<2)return!1;const o=t.at(-1),s=t.at(-2);if(!(o==="blueId"&&s!==void 0&&(s==="type"||s==="itemType"||s==="keyType"||s==="valueType")))return!1;const a=Te(r,t),c=typeof a=="string"?a:I(a)&&typeof a.blueId=="string"?a.blueId:null,i=typeof e.value=="string"?e.value:I(e.value)&&typeof e.value.blueId=="string"?e.value.blueId:null;if(c&&U.has(c)||i&&U.has(i)||!c||!i)return!1;const f=n.get(c),u=n.get(i);if(!f||!u)return!1;for(const l of f)if(u.has(l))return!0;return!1}function Te(e,r){let n=e;for(const t of r)if(Array.isArray(n)){const o=Number(t);if(Number.isNaN(o)||o<0||o>=n.length)return;n=n[o]}else if(I(n))n=n[t];else return;return n}function Pe(e){const r=new Map;if(!e)return r;for(const n of e.packages||[]){if(typeof n.name!="string")continue;const t=new Map;for(const o of n.types||[]){const s=o.content,a=w(s)&&typeof s.name=="string"?s.name:void 0;a&&t.set(a,o)}r.set(n.name,t)}return r}function ke(e,r){for(const[n,t]of r)for(const[o,s]of t){const a=`${n}/${o}`;if(!e.has(a)&&s.status===h.Stable)throw new Error(`Stable type ${a} was removed. Breaking changes require a new logical type name.`)}}function $e({discovered:e,previousTypes:r,aliasToBlueId:n,aliasToStorageContent:t,nextRepoVersionIndex:o}){const s=new Map,a=Me(r,n);for(const[c,i]of e){const f=n.get(c);if(!f)throw new Error(`Failed to compute BlueId for type ${c}.`);const u=r.get(i.packageName)?.get(i.typeName)??null;if(u&&u.status===h.Stable&&i.status===h.Dev)throw new Error(`Type ${c} was stable previously and cannot be downgraded to dev. Use a new logical name instead.`);const l=t.get(c)??i.content,y=i.status===h.Dev?Ne({blueId:f,nextRepoVersionIndex:o,previousType:u}):!u||u.status===h.Dev?Re({blueId:f,nextRepoVersionIndex:o}):Oe({alias:c,blueId:f,nextRepoVersionIndex:o,previousType:u,currentContent:l,packageName:i.packageName,typeName:i.typeName,blueIdAliases:a});y.content=l,y.status=i.status;const m=s.get(i.packageName)??[];m.push(y),s.set(i.packageName,m)}return s}function Me(e,r){const n=new Map,t=(o,s)=>{const a=n.get(o);if(a){a.add(s);return}n.set(o,new Set([s]))};for(const[o,s]of e)for(const[a,c]of s){const i=`${o}/${a}`;for(const f of c.versions??[])typeof f.typeBlueId=="string"&&t(f.typeBlueId,i)}for(const[o,s]of r)t(s,o);return n}function Ne({blueId:e,nextRepoVersionIndex:r,previousType:n}){const t=n&&n.status===h.Dev?n:null,o=t?.versions?.length===1?t.versions[0]:null,s=o&&o.typeBlueId===e;return{status:h.Dev,content:{},versions:s&&t?.versions?k(t.versions):[{repositoryVersionIndex:r,typeBlueId:e,attributesAdded:[]}]}}function Re({blueId:e,nextRepoVersionIndex:r}){return{status:h.Stable,content:{},versions:[{repositoryVersionIndex:r,typeBlueId:e,attributesAdded:[]}]}}function Oe({alias:e,blueId:r,nextRepoVersionIndex:n,previousType:t,currentContent:o,packageName:s,typeName:a,blueIdAliases:c}){if(!w(t.content))throw new Error(`Type ${e} has non-object content; cannot compute diff for stable versioning.`);const i=Be(t.content,o,s,a,c);if(i.status===E.Unchanged){const f=k(t.versions||[]),u=f.at(-1);if(u&&u.typeBlueId!==r)throw new Error(`Type ${e} content is unchanged but BlueId differs from previous metadata.`);return{status:h.Stable,content:{},versions:f}}if(i.status===E.NonBreaking)return{status:h.Stable,content:{},versions:[...k(t.versions||[]),{repositoryVersionIndex:n,typeBlueId:r,attributesAdded:i.attributesAdded}]};throw new Error(`Breaking change detected in stable type ${e}. Introduce a new type name for breaking changes.`)}function Ve(e){return Array.from(e.entries()).map(([r,n])=>({name:r,types:n.map(t=>({...t,versions:[...t.versions].sort((o,s)=>o.repositoryVersionIndex-s.repositoryVersionIndex)})).sort((t,o)=>{const s=w(t.content)&&typeof t.content.name=="string"?t.content.name:"",a=w(o.content)&&typeof o.content.name=="string"?o.content.name:"";return s.localeCompare(a)})})).sort((r,n)=>r.name.localeCompare(n.name))}function F(e){return g.BlueIdCalculator.INSTANCE.calculateSync(e)}function Ce(e,r,n){const t=r?.repositoryVersions.at(-1),o=!t||t!==n,s=r?.repositoryVersions?[...r.repositoryVersions]:[];return o&&s.push(n),{document:{name:C,packages:e,repositoryVersions:s},changed:o}}function xe(e,r,n){const t={name:C,repositoryVersions:r,packages:_e(e,n)};v.validateStableDoesNotDependOnDev(t)}function _e(e,r){const n={};for(const t of e){const o=De(t.name,r),s={},a={};for(const c of t.types){const i=c.versions?.[c.versions.length-1]?.typeBlueId;if(!i)throw new Error(`Type ${t.name} is missing a current BlueId in versions.`);const f=je(c);s[i]={status:c.status,name:f,versions:c.versions??[]},a[i]=c.content}n[t.name]={name:t.name,aliases:o,typesMeta:s,contents:a,schemas:{}}}return n}function De(e,r){const n={},t=`${e}/`;return r.forEach((o,s)=>{s.startsWith(t)&&(n[s]=o)}),n}function je(e){const r=w(e.content)&&typeof e.content.name=="string"?e.content.name:null;if(!r)throw new Error('Type content is missing required "name" field.');return r}function Ue(e){if(!S.existsSync(e))return{previous:null};const r=S.readFileSync(e,"utf8"),n=g.yamlBlueParse(r);if(!n||!I(n))throw new Error("Existing BlueRepository.blue is not a valid object.");const t=n,o=t.packages,s=t.repositoryVersions,a=Array.isArray(o)&&o.every(l=>I(l)&&typeof l.name=="string"&&Array.isArray(l.types)),c=Array.isArray(s)&&s.every(l=>typeof l=="string");if(!a||!c)throw new Error("Invalid BlueRepository.blue structure: expected { packages: BluePackage[], repositoryVersions: string[] }");const i=o,f=s,u={name:typeof t.name=="string"?t.name:C,packages:i,repositoryVersions:f};return{existingYaml:r,previous:u}}function Fe(e){return H.dump(e,{lineWidth:-1})}function qe(e){const r=D.resolve(e.repoRoot),n=D.resolve(e.blueRepositoryPath),{existingYaml:t,previous:o}=Ue(n),s=X(r),a=Pe(o);ke(s,a);const c=te(s),i=re(c);oe(c,s);const{aliasToBlueId:f,aliasToStorageContent:u}=ce(i,s,c,a),l=o?o.repositoryVersions.length:0,y=$e({discovered:s,previousTypes:a,aliasToBlueId:f,aliasToStorageContent:u,nextRepoVersionIndex:l}),m=Ve(y),A=o&&Le(o.packages,m)?o.repositoryVersions.at(-1)??F(m):F(m),{document:d,changed:p}=Ce(m,o,A);xe(d.packages,d.repositoryVersions,f);const B=Fe(d);if(o&&!p&&t&&t!==B)throw new Error("BlueRepository.blue content differs from regenerated output while RepoBlueId is unchanged. Please revert manual edits or rerun in write mode.");return e.verbose&&console.info(`[repository-generator] RepoBlueId: ${A} (${p?"changed":"unchanged"})`),{document:d,currentRepoBlueId:A,previousRepoBlueId:o?.repositoryVersions.at(-1),changed:p||!t,yaml:B,existingYaml:t}}function Le(e,r){return JSON.stringify(e)===JSON.stringify(r)}exports.generateRepository=qe;