@blue-labs/repository-generator 4.1.2 → 5.0.0-rc.1

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-BHDjJhJX.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-BmCNamuV.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,6 +1,6 @@
1
+ export declare const PRIMITIVE_BLUE_IDS: Record<string, string>;
1
2
  export declare const PRIMITIVE_TYPES: Set<string>;
2
3
  export declare const SCALAR_PRIMITIVE_TYPES: Set<string>;
3
- export declare const PRIMITIVE_BLUE_IDS: Record<string, string>;
4
4
  export declare const RESERVED_LANGUAGE_KEYS: Set<string>;
5
5
  export declare const BLUE_REPOSITORY_NAME = "Blue Repository";
6
6
  export declare const BLUE_TYPE_STATUS: {
@@ -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,sBAAsB,aAEjC,CAAC;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CACZ,CAAC;AAE3C,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
+ {"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,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.2",
3
+ "version": "5.0.0-rc.1",
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.2",
9
- "@blue-labs/repository-contract": "4.1.2",
8
+ "@blue-labs/language": "5.0.0-rc.1",
9
+ "@blue-labs/repository-contract": "5.0.0-rc.1",
10
10
  "fast-json-patch": "3.1.1",
11
11
  "js-yaml": "4.1.0",
12
- "@blue-labs/shared-utils": "4.1.2"
12
+ "@blue-labs/shared-utils": "5.0.0-rc.1"
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"),B=require("@blue-labs/repository-contract"),W=require("fast-json-patch"),H=require("js-yaml");function K(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=K(T),V=new Set([...g.Properties.CORE_TYPES]),z=new Set([...g.Properties.BASIC_TYPES]),C=g.Properties.CORE_TYPE_NAME_TO_BLUE_ID_MAP,X=new Set(["name","description","type","itemType","keyType","valueType","value","items","blueId","blue","schema","mergePolicy","contracts"]),_="Blue Repository",h={Dev:"dev",Stable:"stable"},Z=new Set([".git",".github",".husky","node_modules",".nx",".vscode",".idea"]);function Q(e){const r=S.readdirSync(e,{withFileTypes:!0}),n=new Map;for(const t of r){if(!t.isDirectory()||Z.has(t.name))continue;const o=T.join(e,t.name),s=L(o);if(s.length!==0)for(const a of s){const c=a.endsWith(".dev.blue")?h.Dev:h.Stable,i=ee(a),f=te(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=ne(i,a);n.set(u,{packageName:t.name,typeName:f,status:c,content:i,filePath:a,references:y})}}return n}function ee(e){const r=S.readFileSync(e,"utf8"),n=g.yamlBlueParse(r);if(!k(n))throw new Error(`Type file ${e} must contain a YAML object.`);return re(n),n}function te(e,r){if(!k(e)||typeof e.name!="string")throw new Error(`Type file ${r} is missing required "name" field.`);return e.name}function L(e){const r=S.readdirSync(e,{withFileTypes:!0}),n=[];for(const t of r){if(t.isDirectory()){n.push(...L(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 ne(e,r){const n=new Set,t=o=>{if(Array.isArray(o)){o.forEach(a=>t(a));return}if(!k(o))return;const s=a=>{if(typeof a=="string"&&!V.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 re(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=>!X.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 oe(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 se(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 ie(e){const r=se(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 ae(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 $(e){return e.map(r=>({repositoryVersionIndex:r.repositoryVersionIndex,typeBlueId:r.typeBlueId,attributesAdded:[...r.attributesAdded]}))}const ce=/^\$\{([\s\S]*)\}$/;class ue{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"||!ce.test(e)?!1:e.indexOf("${")===e.lastIndexOf("${")}function fe(){return new g.MergingProcessors.SequentialMergingProcessor([new g.MergingProcessors.ValuePropagator,new ue,new g.MergingProcessors.TypeAssigner,new g.MergingProcessors.ListProcessor,new g.MergingProcessors.DictionaryProcessor,new g.MergingProcessors.MetadataPropagator,new g.MergingProcessors.BasicTypesVerifier])}const q="00000000000000000000000000000000000000000000";function le(e,r,n,t){const o=new Map,s=new Map,a=new Map,c=new g.Blue,i=g.createNodeProvider(l=>pe(l)?[new g.BlueNode().setReferenceBlueId(l)]:de(a,l).map(y=>c.jsonValueToNode(y))),u={blue:new g.Blue({nodeProvider:i,mergingProcessor:fe()}),contentByBlueId:a};for(const l of e){if(me(l,n)){ge({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&&ye({alias:y,type:m,previousTypes:t,aliasToBlueId:o,aliasToStorageContent:s,context:u})}return{aliasToBlueId:o,aliasToStorageContent:s}}function de(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 pe(e){return e===q||/^this#\d+$/.test(e)}function M(e,r,n=!1,t=!1){if(Array.isArray(e))return e.map(s=>M(s,r,n,t));if(!I(e))return e;const o={};for(const[s,a]of Object.entries(e)){const c=t||s===B.OBJECT_CONTRACTS;if((s==="type"||s==="itemType"||s==="keyType"||s==="valueType")&&typeof a=="string"&&!(n&&c)){if(V.has(a)){const i=C[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]=M(a,r,n,c)}return o}function ye({alias:e,type:r,previousTypes:n,aliasToBlueId:t,aliasToStorageContent:o,context:s}){const{node:a,storageContent:c}=N(r,m=>t.get(m),s.blue),i=V.has(r.typeName),f=i?ve(r.typeName):s.blue.calculateBlueIdSync(a),u=Y(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 ge({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=R(r,d),{node:v}=N(p,b=>a.has(b)?q:t.get(b),s.blue);return{alias:d,preliminaryBlueId:s.blue.calculateBlueIdSync(v)}});be(i),i.sort(Ie);const f=new Map;i.forEach(({alias:d},p)=>{f.set(d,p)});const u=new Map;for(const d of e){const p=R(r,d),v=N(p,b=>{if(!a.has(b))return t.get(b);const x=f.get(b);if(x===void 0)throw new Error(`Failed to resolve cyclic reference ${b}.`);return`this#${x}`},s.blue);u.set(d,v)}const l=he(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})}we(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 v=u.get(d);if(!v)throw new Error(`Failed to build cyclic content for type ${d}.`);const b=`${A}#${p}`;t.set(d,b),o.set(d,v.storageContent),s.blue.registerBlueIds({[d]:b})})}function me(e,r){if(e.length>1)return!0;const n=e[0];return n?r.get(n)?.has(n)??!1:!1}function N(e,r,n){const t=M(P(e.content),r),o=n.jsonValueToNode(t);return{node:o,storageContent:n.nodeToJson(o,"official")}}function R(e,r){const n=e.get(r);if(!n)throw new Error(`Unknown type alias ${r}.`);return n}function he(e,r,n,t){const o=new Map;for(const s of e){const a=R(r,s),c=t.get(s);if(!c)throw new Error(`Failed to build cyclic content for type ${s}.`);const i=Y(n,a,c.storageContent);if(!i)return null;o.set(s,i)}return o}function Y(e,r,n){const t=e.get(r.packageName)?.get(r.typeName),o=t?.versions?.at(-1)?.typeBlueId;return!o||!t||!w(t.content)||!O(t.content,n)?null:{blueId:o,content:P(t.content)}}function we(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 be(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 Ie(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(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]&&O(e[o],r[o]))}return!1}function ve(e){const r=C[e];if(!r)throw new Error(`Missing primitive BlueId for ${e}.`);return r}const U=new Set(Object.values(C)),Be=new Set(["type","itemType","valueType","keyType"]),Ee=new Set(["name","description"]),E={Unchanged:"unchanged",NonBreaking:"non-breaking",Breaking:"breaking"};function Ae(e,r,n,t,o){const s=W.compare(e,r);if(s.length===0)return{status:E.Unchanged,attributesAdded:[]};const a=[];let c=!1;for(const i of s){if(ke(i,e,o)){c=!0;continue}if(i.op!=="add")return{status:E.Breaking,attributesAdded:[]};if(!Te(i))return{status:E.Breaking,attributesAdded:[]};a.push(i.path)}return a.length===0&&!c?{status:E.Breaking,attributesAdded:[]}:(a.length>0&&Se(a,n,t),{status:E.NonBreaking,attributesAdded:a})}function Se(e,r,n){for(const t of e)try{B.validateAttributesAddedPointer(t)}catch(o){throw new Error(`Invalid attribute pointer "${t}" for ${r}/${n}: ${o.message}`)}}function Te(e){if(e.op!=="add")return!1;const r=J(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=>B.RESERVED_ATTRIBUTES_POINTER_SEGMENTS.has(t))?!1:I(e.value)?!Pe(e.value):n?Ee.has(n):!1}function J(e){try{return B.parsePointer(e)}catch{return[]}}function Pe(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,B.OBJECT_SCHEMA)){const t=n[B.OBJECT_SCHEMA];if(I(t)&&t.required===!0)return!0}for(const[t,o]of Object.entries(n))t!==B.OBJECT_SCHEMA&&I(o)&&r.push(o)}}return!1}function ke(e,r,n){if(e.op!=="replace"||typeof e.path!="string")return!1;const t=J(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=$e(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 $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(I(n))n=n[t];else return;return n}function Me(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 Ne(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 Re({discovered:e,previousTypes:r,aliasToBlueId:n,aliasToStorageContent:t,nextRepoVersionIndex:o}){const s=new Map,a=Oe(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?Ve({blueId:f,nextRepoVersionIndex:o,previousType:u}):!u||u.status===h.Dev?Ce({blueId:f,nextRepoVersionIndex:o}):_e({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 Oe(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 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 Ce({blueId:e,nextRepoVersionIndex:r}){return{status:h.Stable,content:{},versions:[{repositoryVersionIndex:r,typeBlueId:e,attributesAdded:[]}]}}function _e({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=Ae(t.content,o,s,a,c);if(i.status===E.Unchanged){const f=$(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:[...$(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 xe(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 De(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:_,packages:e,repositoryVersions:s},changed:o}}function je(e,r,n){const t={name:_,repositoryVersions:r,packages:Ue(e,n)};B.validateStableDoesNotDependOnDev(t)}function Ue(e,r){const n={};for(const t of e){const o=Fe(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=Le(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 Fe(e,r){const n={},t=`${e}/`;return r.forEach((o,s)=>{s.startsWith(t)&&(n[s]=o)}),n}function Le(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 qe(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:_,packages:i,repositoryVersions:f};return{existingYaml:r,previous:u}}function Ge(e){return H.dump(e,{lineWidth:-1})}function Ye(e){const r=D.resolve(e.repoRoot),n=D.resolve(e.blueRepositoryPath),{existingYaml:t,previous:o}=qe(n),s=Q(r),a=Me(o);Ne(s,a);const c=oe(s),i=ie(c);ae(c,s);const{aliasToBlueId:f,aliasToStorageContent:u}=le(i,s,c,a),l=o?o.repositoryVersions.length:0,y=Re({discovered:s,previousTypes:a,aliasToBlueId:f,aliasToStorageContent:u,nextRepoVersionIndex:l}),m=xe(y),A=o&&Je(o.packages,m)?o.repositoryVersions.at(-1)??F(m):F(m),{document:d,changed:p}=De(m,o,A);je(d.packages,d.repositoryVersions,f);const v=Ge(d);if(o&&!p&&t&&t!==v)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:v,existingYaml:t}}function Je(e,r){return JSON.stringify(e)===JSON.stringify(r)}exports.generateRepository=Ye;