@blue-labs/repository-generator 2.0.0-rc.9 → 3.1.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.
- package/dist/bin/blue-repo-generator.js +1 -1
- package/dist/bin/blue-repo-generator.mjs +1 -1
- package/dist/generateRepository-BwxSxjH3.js +1 -0
- package/dist/generateRepository-C2IfsNUG.mjs +688 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/lib/core/blueIds.d.ts +3 -3
- package/dist/lib/core/blueIds.d.ts.map +1 -1
- package/dist/lib/core/contractValidation.d.ts +4 -0
- package/dist/lib/core/contractValidation.d.ts.map +1 -0
- package/dist/lib/core/diff.d.ts +2 -2
- package/dist/lib/core/diff.d.ts.map +1 -1
- package/dist/lib/core/discovery.d.ts.map +1 -1
- package/dist/lib/core/internalTypes.d.ts +2 -2
- package/dist/lib/core/internalTypes.d.ts.map +1 -1
- package/dist/lib/core/repoDoc.d.ts.map +1 -1
- package/dist/lib/core/utils.d.ts +3 -3
- package/dist/lib/core/utils.d.ts.map +1 -1
- package/dist/lib/core/versions.d.ts.map +1 -1
- package/dist/lib/generateRepository.d.ts.map +1 -1
- package/dist/lib/types.d.ts +2 -20
- package/dist/lib/types.d.ts.map +1 -1
- package/package.json +6 -4
- package/dist/generateRepository-BAWUEf72.mjs +0 -583
- package/dist/generateRepository-Dg6UVHvd.js +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";const c=require("fs"),a=require("path"),f=require("../generateRepository-
|
|
2
|
+
"use strict";const c=require("fs"),a=require("path"),f=require("../generateRepository-BwxSxjH3.js");function u(e){const o=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(o,t,r.get?r:{enumerable:!0,get:()=>e[t]})}}return o.default=e,Object.freeze(o)}const l=u(c),i=u(a);function d(e){const o={repoRoot:process.cwd(),blueRepository:"BlueRepository.blue",verbose:!1,json:!1,failOnDiff:!0};for(let t=0;t<e.length;t++){const r=e[t];switch(r){case"--repo-root":o.repoRoot=e[++t];break;case"--blue-repository":o.blueRepository=e[++t];break;case"--mode":o.mode=e[++t];break;case"--verbose":o.verbose=!0;break;case"--json":o.json=!0;break;case"--allow-diff":o.failOnDiff=!1;break;default:throw new Error(`Unknown argument: ${r}`)}}if(!o.mode||o.mode!=="check"&&o.mode!=="write")throw new Error('Missing or invalid --mode (expected "check" or "write").');return o}function s(e,o){e&&console.log(JSON.stringify(o,null,2))}function p(){try{const e=d(process.argv.slice(2)),o=i.resolve(e.repoRoot),t=i.resolve(o,e.blueRepository),r=f.generateRepository({repoRoot:o,blueRepositoryPath:t,verbose:e.verbose}),n=r.existingYaml!==void 0&&r.existingYaml===r.yaml;if(e.mode==="check"){if(!r.existingYaml){if(s(e.json,{repoBlueId:r.currentRepoBlueId,changed:!0,reason:"BlueRepository.blue is missing."}),e.failOnDiff)throw new Error("BlueRepository.blue is missing. Run with --mode write to create it.");console.warn("BlueRepository.blue is missing. Run with --mode write.");return}if(!n){if(s(e.json,{repoBlueId:r.currentRepoBlueId,changed:!0,reason:"BlueRepository.blue is out of date."}),e.failOnDiff)throw new Error("BlueRepository.blue is out of date. Run with --mode write.");console.warn("BlueRepository.blue is out of date. Run with --mode write.");return}console.log("BlueRepository.blue is up to date."),s(e.json,{repoBlueId:r.currentRepoBlueId,changed:!1});return}if(!r.existingYaml||r.changed)l.mkdirSync(i.dirname(t),{recursive:!0}),l.writeFileSync(t,r.yaml,"utf8"),e.verbose&&console.info(`Wrote BlueRepository.blue with RepoBlueId ${r.currentRepoBlueId}`);else if(n)e.verbose&&console.info("No changes detected; BlueRepository.blue left untouched.");else throw new Error("RepoBlueId is unchanged but BlueRepository.blue differs. Please revert manual edits or regenerate from a clean state.");console.log(r.currentRepoBlueId),s(e.json,{repoBlueId:r.currentRepoBlueId,changed:r.changed||!n})}catch(e){const o=e instanceof Error?e.message:"Unknown error encountered.";console.error(o),process.exit(1)}}p();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const T=require("path"),E=require("fs"),w=require("@blue-labs/language"),y=require("@blue-labs/repository-contract"),U=require("fast-json-patch"),q=require("js-yaml");function F(e){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:()=>e[t]})}}return r.default=e,Object.freeze(r)}const M=F(T),N=new Set([...w.Properties.CORE_TYPES]),h=w.Properties.CORE_TYPE_NAME_TO_BLUE_ID_MAP,R="Blue Repository",l={Dev:"dev",Stable:"stable"},L=new Set([".git",".github",".husky","node_modules",".nx",".vscode",".idea"]);function Y(e){const r=E.readdirSync(e,{withFileTypes:!0}),t=new Map;for(const n of r){if(!n.isDirectory()||L.has(n.name))continue;const s=T.join(e,n.name),o=x(s);if(o.length!==0)for(const i of o){const c=i.endsWith(".dev.blue")?l.Dev:l.Stable,a=W(i),u=G(a,i),f=`${n.name}/${u}`,p=t.get(f);if(p)throw p.status!==c?new Error(`Type ${f} has both stable and dev definitions (${p.filePath} and ${i}).`):new Error(`Type ${f} is defined multiple times (${p.filePath} and ${i}).`);const g=z(a,i);t.set(f,{packageName:n.name,typeName:u,status:c,content:a,filePath:i,references:g})}}return t}function W(e){const r=E.readFileSync(e,"utf8"),t=w.yamlBlueParse(r);if(!$(t))throw new Error(`Type file ${e} must contain a YAML object.`);return t}function G(e,r){if(!$(e)||typeof e.name!="string")throw new Error(`Type file ${r} is missing required "name" field.`);return e.name}function x(e){const r=E.readdirSync(e,{withFileTypes:!0}),t=[];for(const n of r){if(n.isDirectory()){t.push(...x(T.join(e,n.name)));continue}(n.name.endsWith(".blue")||n.name.endsWith(".dev.blue"))&&t.push(T.join(e,n.name))}return t}function z(e,r){const t=new Set,n=s=>{if(Array.isArray(s)){s.forEach(i=>n(i));return}if(!$(s))return;const o=i=>{if(typeof i=="string"&&!N.has(i)){if(!i.includes("/"))throw new Error(`Invalid type reference "${i}" in ${r}. Use <Package>/<Type> for non-primitive references.`);t.add(i)}};o(s.type),o(s.itemType),o(s.keyType),o(s.valueType),Object.values(s).forEach(i=>n(i))};return n(e),t}function $(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function J(e){const r=new Map;for(const[t,n]of e){const s=new Set;for(const o of n.references){if(!e.has(o))throw new Error(`Type ${t} references unknown alias ${o}. Ensure the target type exists.`);s.add(o)}r.set(t,s)}return r}function H(e){const r=[],t=new Map,n=(s,o)=>{const i=t.get(s);if(i==="visited")return;if(i==="visiting"){const a=[...o,s].join(" -> ");throw new Error(`Circular type dependency detected: ${a}`)}t.set(s,"visiting"),o.push(s);const c=e.get(s)||new Set;for(const a of c)n(a,o);o.pop(),t.set(s,"visited"),r.push(s)};for(const s of e.keys())t.has(s)||n(s,[]);return r}function K(e,r){const t=new Map,n=s=>{if(t.has(s))return t.get(s)??!1;const o=e.get(s)||new Set;for(const i of o){const c=r.get(i);if(c&&(c.status===l.Dev||n(i)))return t.set(s,!0),!0}return t.set(s,!1),!1};for(const[s,o]of r)if(o.status===l.Stable&&n(s))throw new Error(`Stable type ${s} depends on a dev type. Stable types may only depend on other stable types.`)}function d(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function b(e){return d(e)?Object.getPrototypeOf(e)===Object.prototype:!1}function B(e){if(Array.isArray(e))return e.map(r=>B(r));if(b(e)){const r={};for(const[t,n]of Object.entries(e))r[t]=B(n);return r}return e}function P(e){return e.map(r=>({repositoryVersionIndex:r.repositoryVersionIndex,typeBlueId:r.typeBlueId,attributesAdded:[...r.attributesAdded]}))}function Q(e,r){const t=new Map,n=new Map;for(const s of e){const o=r.get(s);if(!o)continue;const i=k(B(o.content),t),c=O(i),a=N.has(o.typeName)?X(o.typeName):w.BlueIdCalculator.INSTANCE.calculateSync(c);t.set(s,a),n.set(s,c)}return{aliasToBlueId:t,aliasToPreprocessed:n}}function k(e,r,t=!1,n=!1){if(Array.isArray(e))return e.map(o=>k(o,r,t,n));if(!d(e))return e;const s={};for(const[o,i]of Object.entries(e)){const c=n||o===y.OBJECT_CONTRACTS;if((o==="type"||o==="itemType"||o==="keyType"||o==="valueType")&&typeof i=="string"&&!(t&&c)){if(N.has(i)){const a=h[i];if(!a)throw new Error(`Missing primitive BlueId for ${i}.`);s[o]={blueId:a}}else{const a=i,u=r.get(a);if(!u)throw new Error(`Missing BlueId for alias ${a}.`);s[o]={blueId:u}}continue}s[o]=k(i,r,t,c)}return s}function O(e,r=!1){if(Array.isArray(e))return{items:e.map(n=>O(n))};if(b(e)){if(ee(e))return{blueId:e.blueId};const t=te(e),n={};for(const[s,o]of Object.entries(e)){if(D(o)){re(s,t)?n[s]=o:n[s]=V(o);continue}n[s]=O(o,t)}return n}return D(e)?r?e:V(e):e}function X(e){const r=h[e];if(!r)throw new Error(`Missing primitive BlueId for ${e}.`);return r}function V(e){const r=Z(e),t={value:e};return r&&(t.type={blueId:r}),t}function Z(e){return typeof e=="string"?h.Text:typeof e=="boolean"?h.Boolean:typeof e=="number"?Number.isInteger(e)?h.Integer:h.Double:null}function D(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"}function ee(e){const r=Object.entries(e);return r.length===1&&r[0]?.[0]==="blueId"&&typeof r[0]?.[1]=="string"}function te(e){return Object.prototype.hasOwnProperty.call(e,"type")||Object.prototype.hasOwnProperty.call(e,"itemType")||Object.prototype.hasOwnProperty.call(e,"keyType")||Object.prototype.hasOwnProperty.call(e,"valueType")}const ne=new Set(["name","description","blueId"]);function re(e,r){return!!(ne.has(e)||r&&e==="value")}const j=new Set(Object.values(h)),se=new Set(["type","itemType","valueType","keyType"]),oe=new Set(["name","description"]),m={Unchanged:"unchanged",NonBreaking:"non-breaking",Breaking:"breaking"};function ie(e,r,t,n,s){const o=U.compare(e,r);if(o.length===0)return{status:m.Unchanged,attributesAdded:[]};const i=[];let c=!1;for(const a of o){if(fe(a,e,s)){c=!0;continue}if(a.op!=="add")return{status:m.Breaking,attributesAdded:[]};if(!ce(a))return{status:m.Breaking,attributesAdded:[]};i.push(a.path)}return i.length===0&&!c?{status:m.Breaking,attributesAdded:[]}:(i.length>0&&ae(i,t,n),{status:m.NonBreaking,attributesAdded:i})}function ae(e,r,t){for(const n of e)try{y.validateAttributesAddedPointer(n)}catch(s){throw new Error(`Invalid attribute pointer "${n}" for ${r}/${t}: ${s.message}`)}}function ce(e){if(e.op!=="add")return!1;const r=C(e.path);if(r.length===0)return!1;const t=r.at(-1);return t&&/^\d+$/.test(t)||t&&se.has(t)||r.some(n=>y.RESERVED_ATTRIBUTES_POINTER_SEGMENTS.has(n))?!1:d(e.value)?!ue(e.value):t?oe.has(t):!1}function C(e){try{return y.parsePointer(e)}catch{return[]}}function ue(e){const r=[e];for(;r.length;){const t=r.pop();if(t){if(Object.prototype.hasOwnProperty.call(t,"value")||Object.prototype.hasOwnProperty.call(t,"items"))return!0;if(Object.prototype.hasOwnProperty.call(t,y.OBJECT_SCHEMA)){const n=t[y.OBJECT_SCHEMA];if(d(n)&&n.required===!0)return!0}for(const[n,s]of Object.entries(t))n!==y.OBJECT_SCHEMA&&d(s)&&r.push(s)}}return!1}function fe(e,r,t){if(e.op!=="replace"||typeof e.path!="string")return!1;const n=C(e.path);if(n.length<2)return!1;const s=n.at(-1),o=n.at(-2);if(!(s==="blueId"&&o!==void 0&&(o==="type"||o==="itemType"||o==="keyType"||o==="valueType")))return!1;const i=pe(r,n),c=typeof i=="string"?i:d(i)&&typeof i.blueId=="string"?i.blueId:null,a=typeof e.value=="string"?e.value:d(e.value)&&typeof e.value.blueId=="string"?e.value.blueId:null;if(c&&j.has(c)||a&&j.has(a)||!c||!a)return!1;const u=t.get(c),f=t.get(a);if(!u||!f)return!1;for(const p of u)if(f.has(p))return!0;return!1}function pe(e,r){let t=e;for(const n of r)if(Array.isArray(t)){const s=Number(n);if(Number.isNaN(s)||s<0||s>=t.length)return;t=t[s]}else if(d(t))t=t[n];else return;return t}function le(e){const r=new Map;if(!e)return r;for(const t of e.packages||[]){if(typeof t.name!="string")continue;const n=new Map;for(const s of t.types||[]){const o=s.content,i=b(o)&&typeof o.name=="string"?o.name:void 0;i&&n.set(i,s)}r.set(t.name,n)}return r}function de(e,r){for(const[t,n]of r)for(const[s,o]of n){const i=`${t}/${s}`;if(!e.has(i)&&o.status===l.Stable)throw new Error(`Stable type ${i} was removed. Breaking changes require a new logical type name.`)}}function ye({discovered:e,previousTypes:r,aliasToBlueId:t,aliasToPreprocessed:n,nextRepoVersionIndex:s}){const o=new Map,i=ge(r,t);for(const[c,a]of e){const u=t.get(c);if(!u)throw new Error(`Failed to compute BlueId for type ${c}.`);const f=r.get(a.packageName)?.get(a.typeName)??null;if(f&&f.status===l.Stable&&a.status===l.Dev)throw new Error(`Type ${c} was stable previously and cannot be downgraded to dev. Use a new logical name instead.`);const p=n.get(c)??a.content,g=a.status===l.Dev?me({blueId:u,nextRepoVersionIndex:s,previousType:f}):!f||f.status===l.Dev?he({blueId:u,nextRepoVersionIndex:s}):be({alias:c,blueId:u,nextRepoVersionIndex:s,previousType:f,currentContent:p,packageName:a.packageName,typeName:a.typeName,blueIdAliases:i});g.content=p,g.status=a.status;const I=o.get(a.packageName)??[];I.push(g),o.set(a.packageName,I)}return o}function ge(e,r){const t=new Map,n=(s,o)=>{const i=t.get(s);if(i){i.add(o);return}t.set(s,new Set([o]))};for(const[s,o]of e)for(const[i,c]of o){const a=`${s}/${i}`;for(const u of c.versions??[])typeof u.typeBlueId=="string"&&n(u.typeBlueId,a)}for(const[s,o]of r)n(o,s);return t}function me({blueId:e,nextRepoVersionIndex:r,previousType:t}){const n=t&&t.status===l.Dev?t:null,s=n?.versions?.length===1?n.versions[0]:null,o=s&&s.typeBlueId===e;return{status:l.Dev,content:{},versions:o&&n?.versions?P(n.versions):[{repositoryVersionIndex:r,typeBlueId:e,attributesAdded:[]}]}}function he({blueId:e,nextRepoVersionIndex:r}){return{status:l.Stable,content:{},versions:[{repositoryVersionIndex:r,typeBlueId:e,attributesAdded:[]}]}}function be({alias:e,blueId:r,nextRepoVersionIndex:t,previousType:n,currentContent:s,packageName:o,typeName:i,blueIdAliases:c}){if(!b(n.content))throw new Error(`Type ${e} has non-object content; cannot compute diff for stable versioning.`);const a=ie(n.content,s,o,i,c);if(a.status===m.Unchanged){const u=P(n.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:l.Stable,content:{},versions:u}}if(a.status===m.NonBreaking)return{status:l.Stable,content:{},versions:[...P(n.versions||[]),{repositoryVersionIndex:t,typeBlueId:r,attributesAdded:a.attributesAdded}]};throw new Error(`Breaking change detected in stable type ${e}. Introduce a new type name for breaking changes.`)}function we(e){return Array.from(e.entries()).map(([r,t])=>({name:r,types:t.map(n=>({...n,versions:[...n.versions].sort((s,o)=>s.repositoryVersionIndex-o.repositoryVersionIndex)})).sort((n,s)=>{const o=b(n.content)&&typeof n.content.name=="string"?n.content.name:"",i=b(s.content)&&typeof s.content.name=="string"?s.content.name:"";return o.localeCompare(i)})})).sort((r,t)=>r.name.localeCompare(t.name))}function Ie(e){return w.BlueIdCalculator.INSTANCE.calculateSync(e)}function Ee(e,r,t){const n=r?.repositoryVersions.at(-1),s=!n||n!==t,o=r?.repositoryVersions?[...r.repositoryVersions]:[];return s&&o.push(t),{document:{name:R,packages:e,repositoryVersions:o},changed:s}}function ve(e,r,t){const n={name:R,repositoryVersions:r,packages:Te(e,t)};y.validateNoCycles(n),y.validateStableDoesNotDependOnDev(n)}function Te(e,r){const t={};for(const n of e){const s=Ae(n.name,r),o={},i={};for(const c of n.types){const a=c.versions?.[c.versions.length-1]?.typeBlueId;if(!a)throw new Error(`Type ${n.name} is missing a current BlueId in versions.`);const u=Se(c);o[a]={status:c.status,name:u,versions:c.versions??[]},i[a]=c.content}t[n.name]={name:n.name,aliases:s,typesMeta:o,contents:i,schemas:{}}}return t}function Ae(e,r){const t={},n=`${e}/`;return r.forEach((s,o)=>{o.startsWith(n)&&(t[o]=s)}),t}function Se(e){const r=b(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 Be(e){if(!E.existsSync(e))return{previous:null};const r=E.readFileSync(e,"utf8"),t=w.yamlBlueParse(r);if(!t||!d(t))throw new Error("Existing BlueRepository.blue is not a valid object.");const n=t,s=n.packages,o=n.repositoryVersions,i=Array.isArray(s)&&s.every(p=>d(p)&&typeof p.name=="string"&&Array.isArray(p.types)),c=Array.isArray(o)&&o.every(p=>typeof p=="string");if(!i||!c)throw new Error("Invalid BlueRepository.blue structure: expected { packages: BluePackage[], repositoryVersions: string[] }");const a=s,u=o,f={name:typeof n.name=="string"?n.name:R,packages:a,repositoryVersions:u};return{existingYaml:r,previous:f}}function Pe(e){return q.dump(e,{lineWidth:-1})}function ke(e){const r=M.resolve(e.repoRoot),t=M.resolve(e.blueRepositoryPath),{existingYaml:n,previous:s}=Be(t),o=Y(r),i=le(s);de(o,i);const c=J(o),a=H(c);K(c,o);const{aliasToBlueId:u,aliasToPreprocessed:f}=Q(a,o),p=s?s.repositoryVersions.length:0,g=ye({discovered:o,previousTypes:i,aliasToBlueId:u,aliasToPreprocessed:f,nextRepoVersionIndex:p}),I=we(g),A=Ie(I),{document:v,changed:S}=Ee(I,s,A);ve(v.packages,v.repositoryVersions,u);const _=Pe(v);if(s&&!S&&n&&n!==_)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} (${S?"changed":"unchanged"})`),{document:v,currentRepoBlueId:A,previousRepoBlueId:s?.repositoryVersions.at(-1),changed:S||!n,yaml:_,existingYaml:n}}exports.generateRepository=ke;
|