@asaidimu/anansi 1.2.4 → 1.3.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.
package/index.cjs CHANGED
@@ -1,46 +1,68 @@
1
- "use strict";var ce=Object.create;var T=Object.defineProperty;var pe=Object.getOwnPropertyDescriptor;var de=Object.getOwnPropertyNames;var me=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty;var fe=(r,t)=>{for(var e in t)T(r,e,{get:t[e],enumerable:!0})},Q=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of de(t))!le.call(r,a)&&a!==e&&T(r,a,{get:()=>t[a],enumerable:!(n=pe(t,a))||n.enumerable});return r};var C=(r,t,e)=>(e=r!=null?ce(me(r)):{},Q(t||!r||!r.__esModule?T(e,"default",{value:r,enumerable:!0}):e,r)),ue=r=>Q(T({},"__esModule",{value:!0}),r);var Ue={};fe(Ue,{JsonPatchError:()=>g,MigrationEngine:()=>z,MigrationError:()=>h,MigrationErrorCode:()=>ie,MigrationSchema:()=>ae,applyPatch:()=>k,calculateNextVersion:()=>B,compareSemanticVersions:()=>b,createPatch:()=>ge,createSchemaMigrationHelper:()=>oe,createStandardSchemaValidator:()=>ee,deepMerge:()=>J,docgen:()=>Ge,generateSHA256Hash:()=>M,normalizePath:()=>W,schemaChangeToPatch:()=>j,schemaToTypes:()=>He,sortSemanticVars:()=>Ae,validate:()=>xe,validateMigration:()=>G,validateSchemaChange:()=>U,validateSchemaDefinition:()=>O});module.exports=ue(Ue);var je=require("@asaidimu/events");var Ne=require("@asaidimu/events"),P=require("@asaidimu/query");var g=class extends Error{constructor(e,n){super(e);this.operation=n;this.name="JsonPatchError"}};function I(r){let t=W(r);return t===""?[]:t.substring(1).split("/").map(he)}function W(r){return r===""||r==="/"?"":r.startsWith("/")?"/"+r.substring(1).split("/").map(E).join("/"):"/"+r.split(".").map(E).join("/")}function E(r){return r.replace(/~/g,"~0").replace(/\//g,"~1")}function he(r){return r.replace(/~1/g,"/").replace(/~0/g,"~")}var S=new Map;function R(r,t){let e=r;for(let n of t){if(e===null||typeof e!="object")throw new g(`Invalid path - parent not found at ${n}`);if(Array.isArray(e)){let a=n==="-"?e.length:parseInt(n);if(isNaN(a)||a<0||a>e.length)throw new g(`Invalid array index: ${n}`);e=e[a]}else{if(!e.hasOwnProperty(n))throw new g(`Property ${n} not found`);e=e[n]}}return e}function F(r,t){let e=S.get(t)||I(t);if(S.set(t,e),e.length===0)return r;let n=R(r,e.slice(0,-1)),a=e[e.length-1];if(Array.isArray(n)){let i=parseInt(a);if(isNaN(i)||i<0||i>=n.length)throw new g(`Invalid array index: ${a}`);return n[i]}return n[a]}function ye(r,t,e){let n=S.get(t)||I(t);S.set(t,n);let a=R(r,n.slice(0,-1)),i=n[n.length-1];return Array.isArray(a)?a.splice(0,a.length,...a.filter(p=>p!==e)):a[i]===e&&delete a[i],r}function x(r,t,e){let n=S.get(t)||I(t);if(S.set(t,n),n.length===0)return e;let a=n.slice(0,-1),i=n[n.length-1],p=R(r,a);if(Array.isArray(p))if(i==="-")p.push(e);else{let s=parseInt(i);if(s<0||s>p.length)throw new g(`Invalid array index: ${i}`);p.splice(s,0,e)}else p[i]=e;return r}function A(r,t){let e=S.get(t)||I(t);if(S.set(t,e),e.length===0)return;let n=R(r,e.slice(0,-1)),a=e[e.length-1];if(Array.isArray(n)){let i=parseInt(a);n.splice(i,1)}else delete n[a];return r}function k(r,t){let e=JSON.parse(JSON.stringify(r));for(let n of t)try{switch(n.op){case"add":e=x(e,n.path,n.value);break;case"remove":e=A(e,n.path);break;case"removeValue":e=ye(e,n.path,n.value);break;case"replace":e=x(A(e,n.path),n.path,n.value);break;case"copy":{let a=F(e,n.from);e=x(e,n.path,JSON.parse(JSON.stringify(a)));break}case"move":{let a=F(e,n.from);e=x(e,n.path,a),e=A(e,n.from);break}case"test":{let a=F(e,n.path);if(JSON.stringify(a)!==JSON.stringify(n.value))throw new g("Test operation failed");break}default:throw new g(`Unsupported operation: ${n.op}`)}}catch(a){throw a instanceof g&&(a.operation=n),a}return e}function ge(r,t){let e=[];return N(r,t,"",e),e}function N(r,t,e,n){if(r!==t){if(typeof r!=typeof t||Array.isArray(r)!==Array.isArray(t)){n.push({op:"replace",path:e,value:t});return}typeof r=="object"&&r!==null?Array.isArray(r)?we(r,t,e,n):Se(r,t,e,n):r!==t&&n.push({op:"replace",path:e,value:t})}}function we(r,t,e,n){let a=Math.max(r.length,t.length);for(let i=0;i<a;i++){let p=`${e}/${i}`;i>=r.length?n.push({op:"add",path:`${e}/-`,value:t[i]}):i>=t.length?n.push({op:"remove",path:p}):N(r[i],t[i],p,n)}}function Se(r,t,e,n){let a=new Set,i=Object.keys(r),p=Object.keys(t);for(let s of i){let m=E(s),c=e?`${e}/${m}`:`/${m}`;t.hasOwnProperty(s)?(N(r[s],t[s],c,n),a.add(s)):n.push({op:"remove",path:c})}for(let s of p)if(!a.has(s)){let m=E(s),c=e?`${e}/${m}`:`/${m}`;n.push({op:"add",path:c,value:t[s]})}}function j(r,t){let e=[];switch(r.type){case"addField":e.push({op:"add",path:`/fields/${r.id}`,value:r.definition});break;case"removeField":e.push({op:"remove",path:`/fields/${r.id}`});break;case"modifyField":{let n=`/fields/${r.id}`;Object.entries(r.changes).forEach(([a,i])=>{typeof i=="object"&&i!==null&&!Array.isArray(i)?e.push({op:"replace",path:`${n}/${a}`,value:i}):e.push({op:"replace",path:`${n}/${a}`,value:i})});break}case"deprecateField":e.push({op:"add",path:`/fields/${r.id}/deprecated`,value:!0});break;case"addIndex":t.indexes||e.push({op:"add",path:"/indexes",value:[]}),e.push({op:"add",path:"/indexes/-",value:r.definition});break;case"removeIndex":{let n=t.indexes?.findIndex(a=>a.name===r.name);n!==void 0&&n>=0&&e.push({op:"remove",path:`/indexes/${n}`});break}case"modifyIndex":{let n=t.indexes?.findIndex(a=>a.name===r.name);n!==void 0&&n>=0&&Object.entries(r.changes).forEach(([a,i])=>{e.push({op:"replace",path:`/indexes/${n}/${a}`,value:i})});break}case"addConstraint":t.constraints||e.push({op:"add",path:"/constraints",value:[]}),Array.isArray(r.constraint)?r.constraint.forEach(n=>{e.push({op:"add",path:"/constraints/-",value:n})}):e.push({op:"add",path:"/constraints/-",value:r.constraint});break;case"removeConstraint":{let n=t.constraints?.findIndex(a=>Array.isArray(a)?a.some(i=>i.name===r.name):a.name===r.name);n!==void 0&&n>=0&&e.push({op:"remove",path:`/constraints/${n}`});break}case"modifyConstraint":{let n=be(t,r.name);n&&Object.entries(r.changes).forEach(([a,i])=>{e.push({op:"replace",path:`${n}/${a}`,value:i})});break}}return e}function be(r,t){if(!r.constraints)return null;for(let e=0;e<r.constraints.length;e++){let n=r.constraints[e];if(n.name===t)return`/constraints/${e}`;if(Z(n)){let a=X(n.rules,t);if(a)return`/constraints/${e}${a}`}}return null}function Z(r){return r&&"operator"in r&&"rules"in r}function X(r,t){for(let e=0;e<r.length;e++){let n=r[e];if("name"in n&&n.name===t)return`/rules/${e}`;if(Z(n)){let a=X(n.rules,t);if(a)return`/rules/${e}${a}`}}return null}function J(r,t){let e={...r};return V(r)&&V(t)&&Object.keys(t).forEach(n=>{V(t[n])?n in r?e[n]=J(r[n],t[n]):Object.assign(e,{[n]:t[n]}):Object.assign(e,{[n]:t[n]})}),e}function V(r){return r&&typeof r=="object"&&!Array.isArray(r)}function ee(r,t){let e=(c,l,f,d)=>{let u=[];switch(f.type){case"string":typeof c!="string"&&u.push({message:`Expected type string but received ${typeof c}.`,path:d});break;case"number":typeof c!="number"&&u.push({message:`Expected type number but received ${typeof c}.`,path:d});break;case"boolean":typeof c!="boolean"&&u.push({message:`Expected type boolean but received ${typeof c}.`,path:d});break;case"array":Array.isArray(c)?f.itemsType?c.forEach((y,w)=>{u.push(...e(y,`Array: ${l}`,{name:f.name,type:f.itemsType,nestedSchema:f.nestedSchema},[...d,w]))}):u.push({message:`Expected itemsType for array ${l}`,path:d}):u.push({message:`Expected an array but received ${typeof c}.`,path:d});break;case"object":if(typeof c!="object"||c===null)u.push({message:`Expected an object but received ${c===null?"null":typeof c}.`,path:d});else if(f.nestedSchema){let y={name:f.description?`${f.description}-schema`:"nested-schema",version:"1.0",fields:f.nestedSchema};u.push(...m(y,c,d))}break;case"dynamic":break;default:u.push({message:`Unknown field type: ${f.type}`,path:d});break}return u},n=(c,l,f,d)=>{let u=[];return l.constraints&&l.constraints.forEach(y=>{let w=t[y.predicate];w?(y.type==="schema"?w({data:f,arguments:y.parameters}):w({data:f,field:c,arguments:y.parameters}))||u.push({message:`Constraint '${y.name}' failed for field '${c}'.`,path:d}):u.push({message:`Missing predicate for constraint: ${y.name}`,path:d})}),u},a=(c,l,f,d,u)=>[...e(f,c,l,u),...n(c,l,d,u)],i=(c,l,f)=>{if("operator"in c)return p(c.operator,c.rules.map(u=>i(u,l,f)));let d=t[c.predicate];return d?c.type==="schema"?d({data:l,field:c.field,arguments:c.parameters}):d({data:l,field:f,arguments:c.parameters}):!1},p=(c,l)=>{switch(c){case"and":return l.every(Boolean);case"or":return l.some(Boolean);case"not":return l.length===1?!l[0]:!1;case"nor":return!l.some(Boolean);case"xor":return l.filter(Boolean).length===1;default:return console.error(`Unknown logical operator: ${c}`),!1}},s=c=>"operator"in c?`(${c.rules.map(s).join(` ${c.operator} `)})`:c.name,m=(c,l,f=[])=>{let d=[];for(let[u,y]of Object.entries(c.fields))y.required&&l[u]===void 0&&d.push({message:`Field '${u}' is required.`,path:[...f,u]});for(let[u,y]of Object.entries(c.fields)){let w=l[u];w!==void 0&&d.push(...a(u,y,w,l,[...f,u]))}return c.constraints&&c.constraints.forEach(u=>{i(u,l)||d.push({message:`Schema constraint failed: ${s(u)}`,path:f})}),d};return{"~standard":{version:1,vendor:"@asaidimu/anansi",validate:c=>{if(typeof c!="object"||c===null)return{issues:[{message:"Value must be a non-null object",path:[]}]};let l=m(r,c);return l.length===0?{value:c}:{issues:l}}}}}var o=require("zod");var v=class extends Error{constructor(e,n){super(e);this.errors=n;this.name="SchemaValidationError"}};var ne=o.z.enum(["and","or","not","nor","xor"]),te=o.z.enum(["string","number","boolean","array","object","dynamic"]),ve=o.z.enum(["normal","unique","btree","hash","spatial","fulltext","gi","expression","composite"]),Ce=o.z.custom(()=>!0),$=o.z.object({type:o.z.string().optional(),name:o.z.string(),predicate:o.z.string().optional(),parameters:Ce.optional(),description:o.z.string().optional(),field:o.z.string().optional(),errorMessage:o.z.string().optional()}),H=o.z.object({operator:ne,rules:o.z.array(o.z.union([$,o.z.lazy(()=>H)]))}),D=o.z.object({name:o.z.string(),type:te,required:o.z.boolean().optional(),constraints:o.z.array($).optional(),default:o.z.any().optional(),itemsType:te.optional(),nestedSchema:o.z.record(o.z.lazy(()=>D)).optional(),deprecated:o.z.boolean().optional(),reference:o.z.object({schema:o.z.string(),field:o.z.string()}).optional(),description:o.z.string().optional(),unique:o.z.boolean().optional(),metadata:o.z.any().optional()}),re=o.z.object({operator:ne,field:o.z.string(),value:o.z.any().optional(),conditions:o.z.array(o.z.lazy(()=>re)).optional()}),_=o.z.object({fields:o.z.array(o.z.string()),type:ve,unique:o.z.boolean().optional(),partial:re.optional(),description:o.z.string().optional(),order:o.z.enum(["asc","desc"]).optional(),name:o.z.string().optional()}),$e=o.z.array(o.z.union([$,H])),Te=o.z.object({name:o.z.string(),version:o.z.string(),description:o.z.string().optional(),fields:o.z.record(D),indexes:o.z.array(_).optional(),constraints:$e.optional(),metadata:o.z.record(o.z.any()).optional(),dependencies:o.z.array(o.z.string()).optional(),migrations:o.z.array(o.z.any()).optional()}),L=o.z.union([o.z.object({type:o.z.literal("addField"),id:o.z.string(),definition:D}),o.z.object({type:o.z.literal("removeField"),id:o.z.string()}),o.z.object({type:o.z.literal("modifyField"),id:o.z.string(),changes:D.partial()}),o.z.object({type:o.z.literal("addIndex"),definition:_}),o.z.object({type:o.z.literal("removeIndex"),name:o.z.string()}),o.z.object({type:o.z.literal("modifyIndex"),name:o.z.string(),changes:_.partial()}),o.z.object({type:o.z.literal("addConstraint"),constraint:o.z.union([$,H])}),o.z.object({type:o.z.literal("removeConstraint"),name:o.z.string()}),o.z.object({type:o.z.literal("modifyConstraint"),name:o.z.string(),changes:$.partial()}),o.z.object({type:o.z.literal("deprecateField"),id:o.z.string()})]),ae=o.z.object({id:o.z.string(),schemaVersion:o.z.string(),changes:o.z.array(L),description:o.z.string(),status:o.z.enum(["pending","applied","failed"]),rollback:o.z.array(L).optional(),transform:o.z.unknown(),createdAt:o.z.string(),checksum:o.z.string().optional()});function G(r){try{return ae.parse(r),!0}catch(t){throw new v("Invalid migration definition",t)}}function U(r){try{return L.parse(r),!0}catch(t){throw new v("Invalid schema definition",t)}}function O(r){try{return Te.parse(r),!0}catch(t){throw new v("Invalid schema definition",t)}}var xe=O;var M=async r=>{if(typeof window<"u"&&crypto.subtle){let e=new TextEncoder().encode(r),n=await crypto.subtle.digest("SHA-256",e);return Array.from(new Uint8Array(n)).map(i=>i.toString(16).padStart(2,"0")).join("")}else{let{createHash:t}=await import("crypto");return t("sha256").update(r).digest("hex")}};function Ee(r){let t=r.match(/^(\d+)\.(\d+)\.(\d+)$/);if(!t)throw new Error(`Invalid version format: ${r}. Expected format: major.minor.patch`);return{major:parseInt(t[1],10),minor:parseInt(t[2],10),patch:parseInt(t[3],10)}}function Ie(r,t){if(t&&"field"in r&&r.field){let e=t.fields[r.field];if(e)return e.type}if("parameters"in r){let e=r.parameters;if(e instanceof RegExp||Array.isArray(e)&&typeof e[0]=="string")return"string";if(typeof e=="number"||Array.isArray(e)&&typeof e[0]=="number")return"number";if(typeof e=="boolean")return"boolean";if(typeof e=="object"&&e!==null){if("minItems"in e||"maxItems"in e)return"array";if("schema"in e)return"object"}}}function Re(r){return r.required===!0||r.type!==void 0||r.itemsType!==void 0||r.nestedSchema!==void 0||r.reference!==void 0||r.unique===!0}function ke(r,t,e){switch(e){case"string":if(r instanceof RegExp&&t instanceof RegExp)return r.source!==t.source;if(Array.isArray(r)&&Array.isArray(t))return t.length<r.length||!r.every(n=>t.includes(n));break;case"number":if(typeof r=="object"&&typeof t=="object"&&"precision"in r&&"precision"in t)return t.precision<r.precision||(t.scale??0)<(r.scale??0);if(Array.isArray(r)&&Array.isArray(t))return t.length<r.length||!r.every(n=>t.includes(n));break;case"array":if(typeof r=="object"&&typeof t=="object"&&"minItems"in r&&"maxItems"in r&&"minItems"in t&&"maxItems"in t)return t.minItems>r.minItems||t.maxItems<r.maxItems;break;case"object":if(typeof r=="object"&&typeof t=="object"&&"schema"in r&&"schema"in t)return Object.keys(t.schema).length>Object.keys(r.schema).length;break}return!1}function De(r,t){let e={or:1,xor:2,and:3,not:4,nor:4};return!!(t.operator&&e[t.operator]>e[r.operator]||t.rules&&t.rules.length>r.rules.length)}function Oe(r,t,e){if(!t)return!0;if("rules"in t&&"rules"in r)return De(t,r);if("predicate"in r&&r.predicate!==void 0)return!0;if("parameters"in r&&r.parameters!==void 0){let n=Ie(t,e);return n?ke(t.parameters,r.parameters,n):!0}return!1}function Me(r,t){switch(r.type){case"removeField":case"removeIndex":return"major";case"modifyField":return Re(r.changes)?"major":r.changes.deprecated?"minor":"patch";case"modifyIndex":return r.changes.unique!==void 0||r.changes.fields!==void 0?"major":"minor";case"addConstraint":return"major";case"removeConstraint":return"minor";case"modifyConstraint":let e=t?.constraints?.find(n=>"name"in n&&n.name===r.name);return Oe(r.changes,e,t)?"major":"minor";case"addField":case"addIndex":case"deprecateField":return"minor";default:throw new Error(`Unhandled change type: ${JSON.stringify(r)}`)}}function Pe(r){let t=new Set,e=new Set,n=new Set,a=new Set;for(let i of r)switch(i.type){case"addField":if(e.has(i.id))throw new Error(`Cannot add previously removed field: ${i.id}`);if(t.has(i.id))throw new Error(`Cannot add already modified field: ${i.id}`);if(a.has(i.id))throw new Error(`Cannot add deprecated field: ${i.id}`);n.add(i.id);break;case"removeField":if(n.has(i.id))throw new Error(`Cannot remove newly added field: ${i.id}`);if(t.has(i.id))throw new Error(`Cannot remove modified field: ${i.id}`);if(a.has(i.id))throw new Error(`Cannot remove field that is being deprecated: ${i.id}`);e.add(i.id);break;case"modifyField":if(e.has(i.id))throw new Error(`Cannot modify removed field: ${i.id}`);if(n.has(i.id))throw new Error(`Cannot modify newly added field: ${i.id}`);if(a.has(i.id))throw new Error(`Cannot modify field that is being deprecated: ${i.id}`);t.add(i.id);break;case"deprecateField":if(e.has(i.id))throw new Error(`Cannot deprecate removed field: ${i.id}`);if(n.has(i.id))throw new Error(`Cannot deprecate newly added field: ${i.id}`);if(t.has(i.id))throw new Error(`Cannot deprecate modified field: ${i.id}`);a.add(i.id);break}}function Fe(r){let t=new Set,e=new Set,n=new Set;for(let a of r)switch(a.type){case"addConstraint":let i=a.constraint,p=("name"in i,i.name);if(e.has(p))throw new Error(`Cannot add previously removed constraint: ${p}`);if(t.has(p))throw new Error(`Cannot add already modified constraint: ${p}`);n.add(p);break;case"removeConstraint":if(n.has(a.name))throw new Error(`Cannot remove newly added constraint: ${a.name}`);if(t.has(a.name))throw new Error(`Cannot remove modified constraint: ${a.name}`);e.add(a.name);break;case"modifyConstraint":if(e.has(a.name))throw new Error(`Cannot modify removed constraint: ${a.name}`);if(n.has(a.name))throw new Error(`Cannot modify newly added constraint: ${a.name}`);t.add(a.name);break}}function B(r,t,e){if(t.length===0)throw new Error("No changes provided");Pe(t),Fe(t);let n=Ee(r),a="patch";for(let i of t){let p=Me(i,e);if(p==="major"){a="major";break}else p==="minor"&&a==="patch"&&(a="minor")}switch(a){case"major":return`${n.major+1}.0.0`;case"minor":return`${n.major}.${n.minor+1}.0`;case"patch":return`${n.major}.${n.minor}.${n.patch+1}`}}function b(r,t){let e=c=>c.split(".").map(l=>parseInt(l,10)||0),[n,a,i]=e(r),[p,s,m]=e(t);return n-p||a-s||i-m}function Ae(r){return r.sort(b)}var h=class extends Error{constructor(e,n,a,i){super(e);this.code=n;this.migrationId=a;this.cause=i;this.name="MigrationError"}},ie=(d=>(d.INVALID_SCHEMA="INVALID_SCHEMA",d.INVALID_MIGRATION="INVALID_MIGRATION",d.CHECKSUM_MISMATCH="CHECKSUM_MISMATCH",d.TIMEOUT="TIMEOUT",d.MEMORY_LIMIT="MEMORY_LIMIT",d.CONCURRENT_OPERATION="CONCURRENT_OPERATION",d.TRANSFORM_ERROR="TRANSFORM_ERROR",d.VERSION_NOT_FOUND="VERSION_NOT_FOUND",d.CIRCULAR_DEPENDENCY="CIRCULAR_DEPENDENCY",d.STREAM_ERROR="STREAM_ERROR",d.ROLLBACK_ERROR="ROLLBACK_ERROR",d.MISSING_TRANSFORM="MISSING_TRANSFORM",d))(ie||{}),z=class r{currentSchema;history=[];migrations=[];isProcessing=!1;constructor(t,e,n){try{if(!O(t))throw new h("Invalid initial schema","INVALID_SCHEMA");if(this.currentSchema=t,e){if(!e.every(a=>G(a)))throw new h("Invalid migration configuration","INVALID_MIGRATION");this.migrations=e.sort((a,i)=>b(a.schemaVersion,i.schemaVersion))}n&&(this.history=n.sort((a,i)=>b(a.version,i.version)))}catch(a){throw a instanceof h?a:new h("Failed to initialize MigrationEngine","INVALID_SCHEMA",void 0,a)}}data(){return{schema:this.currentSchema,history:this.history,migrations:this.migrations}}async generateChecksum(t){try{let e=JSON.stringify({id:t.id,schemaVersion:t.schemaVersion,changes:t.changes,description:t.description,rollback:t.rollback,createdAt:t.createdAt});return await M(e)}catch(e){throw new h("Checksum generation failed","CHECKSUM_MISMATCH",t.id,e)}}async add(t){if(this.isProcessing)throw new h("Concurrent operation","CONCURRENT_OPERATION");if(!t.changes?.length)throw new h("Migration must include changes","INVALID_MIGRATION");try{t.changes.forEach(n=>U(n))}catch(n){throw new h("Invalid schema changes","INVALID_MIGRATION",void 0,n)}let e={id:Date.now().toString(),schemaVersion:this.currentSchema.version,changes:t.changes,description:t.description,status:"pending",rollback:t.rollback,transform:t.transform,createdAt:new Date().toISOString(),checksum:""};e.checksum=await this.generateChecksum(e),this.migrations.push(e)}async dryRun(t,e,n){if(this.isProcessing)throw new h("Concurrent operation","CONCURRENT_OPERATION");try{this.isProcessing=!0;let a={...this.currentSchema},i=this.getRelevantMigrations(e,n),p=i.reduce((m,c)=>{let l=e==="forward"?c.changes:c.rollback||[];return this.applySchemaChanges(m,l,c.id)},a),s=await r.processMigrationList(t,e,i);return{newSchema:p,dataPreview:s}}catch(a){throw a instanceof h?a:new h("Dry run failed","INVALID_SCHEMA",void 0,a)}finally{this.isProcessing=!1}}getRelevantMigrations(t,e){return[...this.migrations].filter(n=>{let a=t==="forward"?"pending":"applied",i=e?b(n.schemaVersion,e)>=0:!0;return n.status===a&&i}).sort((n,a)=>t==="forward"?n.id.localeCompare(a.id):a.id.localeCompare(n.id))}applySchemaChanges(t,e,n){try{let a=B(t.version,e);return e.map(p=>{try{return j(p,t)}catch(s){throw new h("Invalid schema change","INVALID_SCHEMA",n,s)}}).reduce((p,s)=>{try{return k(p,s)}catch(m){throw new h("Failed to apply patch","INVALID_SCHEMA",n,m)}},{...t,version:a})}catch(a){throw a instanceof h?a:new h("Schema update failed","INVALID_SCHEMA",n,a)}}async prepareMigration(){let t=this.migrations.filter(e=>e.status==="pending");return await this.validateMigrations(t),t}async migrate(t){if(this.isProcessing)throw new h("Concurrent operation","CONCURRENT_OPERATION");let e=await this.prepareMigration();try{this.isProcessing=!0,this.transformSchema("forward");let n=await r.processMigrationList(t,"forward",e);return this.markMigrationsApplied(e),n}finally{this.isProcessing=!1}}async validateMigrations(t){await Promise.all(t.map(async e=>{let n=await this.generateChecksum(e);if(e.checksum!==n)throw new h("Checksum mismatch","CHECKSUM_MISMATCH",e.id)}))}markMigrationsApplied(t){this.migrations=this.migrations.map(e=>t.some(n=>n.id===e.id)?{...e,status:"applied"}:e)}async rollback(t){if(this.isProcessing)throw new h("Concurrent operation","CONCURRENT_OPERATION");return this.migrations.filter(n=>n.status==="applied").slice(-1)[0]?this.rollbackToVersion(this.history[this.history.length-1]?.version||this.currentSchema.version,t):t}async rollbackToVersion(t,e){if(this.isProcessing)throw new h("Concurrent operation","CONCURRENT_OPERATION");try{let n=this.history.findIndex(s=>s.version===t);if(n===-1)throw new Error(`Version ${t} not found in history`);let a=this.migrations.filter(s=>s.schemaVersion===t&&s.status==="applied").sort((s,m)=>m.id.localeCompare(s.id)),i=this.history.length-n;if(i<0)return e;for(let s=0;s<i;s++)this.transformSchema("backward");let p=await r.processMigrationList(e,"backward",a);return this.migrations=this.migrations.map(s=>s.schemaVersion===t&&s.status==="applied"?{...s,status:"pending"}:s),p}finally{this.isProcessing=!1}}static async processMigrationList(t,e,n){return(await Promise.all(n.map(async p=>{try{let s=await this.resolveTransform(p,e);return{migration:p,transform:s}}catch(s){throw new h(`Failed to resolve transform for migration ${p.id}`,"TRANSFORM_ERROR",p.id,s)}}))).filter(p=>!!p.transform).reduce((p,{migration:s,transform:m})=>p.pipeThrough(new TransformStream({async transform(c,l){try{let f=await m(c);l.enqueue(f)}catch(f){l.error(new h(`Data transformation failed for migration ${s.id}`,"TRANSFORM_ERROR",s.id,f))}}})),t)}static async resolveTransform(t,e){return t.transform?typeof t.transform=="string"?t.transform.startsWith("http://")||t.transform.startsWith("https://")?this.resolveRemoteTransform(t.transform,e):this.resolveLocalTransform(t.transform,e):t.transform[e]:null}static async resolveRemoteTransform(t,e){try{let n=await fetch(t);if(!n.ok)throw new h(`Failed to fetch transform module: ${t}`,"TRANSFORM_ERROR",void 0);let a=await n.text();if(typeof window<"u"){let i=new Blob([a],{type:"application/javascript"});return(await import(URL.createObjectURL(i))).default[e]}else{let{runInNewContext:i}=await import("vm"),p={module:{exports:{}},console};return i(a,p,t),p.module.exports[e]}}catch(n){throw new h(`Failed to load remote transform module: ${t}`,"TRANSFORM_ERROR",void 0,n)}}static async resolveLocalTransform(t,e){try{return(await import(t)).default[e]}catch(n){throw new h(`Failed to import local transform module: ${t}`,"TRANSFORM_ERROR",void 0,n)}}transformSchema(t){try{if(t==="backward"){let n=this.history.pop();if(!n)throw new Error("No previous version");this.currentSchema=n;return}let e=this.migrations.filter(n=>n.status==="pending").flatMap(n=>n.changes);if(!e.length)return;this.history.push(structuredClone(this.currentSchema)),this.currentSchema=e.reduce((n,a)=>this.applySchemaChanges(n,[a]),this.currentSchema)}catch(e){throw e instanceof h?e:new h("Schema transformation failed","INVALID_SCHEMA",void 0,e)}}};var oe=r=>{let t=[],e=[];return{addField:(n,a)=>{t.push({type:"addField",id:n,definition:a}),e.push({type:"removeField",id:n})},removeField:n=>{t.push({type:"removeField",id:n});let a=r.fields[n];a&&e.push({type:"addField",id:n,definition:a})},modifyField:(n,a)=>{t.push({type:"modifyField",id:n,changes:a});let i=r.fields[n];e.push({type:"modifyField",id:n,changes:i})},deprecateField:n=>{t.push({type:"deprecateField",id:n}),e.push({type:"modifyField",id:n,changes:{deprecated:!1}})},addIndex:n=>{t.push({type:"addIndex",definition:n}),e.push({type:"removeIndex",name:n.name})},removeIndex:n=>{t.push({type:"removeIndex",name:n});let a=r.indexes?.find(i=>i.name===n);a&&e.push({type:"addIndex",definition:a})},modifyIndex:(n,a)=>{t.push({type:"modifyIndex",name:n,changes:a});let i=r.indexes?.find(p=>p.name===n);i&&e.push({type:"modifyIndex",name:n,changes:i})},addConstraint:n=>{t.push({type:"addConstraint",constraint:n}),e.push({type:"removeConstraint",name:n.name})},removeConstraint:n=>{t.push({type:"removeConstraint",name:n});let a=r.constraints?.find(i=>"name"in i&&i.name===n);a&&e.push({type:"addConstraint",constraint:a})},modifyConstraint:(n,a)=>{t.push({type:"modifyConstraint",name:n,changes:a});let i=r.constraints?.find(p=>"name"in p&&p.name===n);i&&e.push({type:"modifyConstraint",name:n,changes:i})},changes:()=>({migrate:t,rollback:e})}};var Ve=C(require("@isomorphic-git/lightning-fs"),1),se=require("buffer"),Je=C(require("isomorphic-git"),1),_e=C(require("isomorphic-git/http/web"),1);window.Buffer=se.Buffer;function Le(r,t,e){switch(r.type){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return r.itemsType?r.itemsType==="object"&&r.nestedSchema?`${`${t}ItemsItem`}[]`:`${r.itemsType}[]`:"any[]";case"object":return r.nestedSchema?`${t}${Y(e)}`:"Record<string, any>";case"dynamic":return"any";default:return"any"}}function q(r,t){let e="";for(let[n,a]of Object.entries(r))if(a.type==="object"&&a.nestedSchema){let i=`${t}${Y(n)}`;e+=`
2
- export interface ${i} {
3
- ${K(a.nestedSchema,i)}
4
- }`;let p=q(a.nestedSchema,i);p&&(e+=`
5
- ${p}`)}else if(a.type==="array"&&a.itemsType==="object"&&a.nestedSchema){let i=`${t}ItemsItem`;e+=`
6
- export interface ${i} {
7
- ${K(a.nestedSchema,i)}
8
- }`;let p=q(a.nestedSchema,i);p&&(e+=`
9
- ${p}`)}return e}function K(r,t){return Object.entries(r).map(([e,n])=>{let a=[];n.description&&a.push(` /** ${n.description} */`),n.deprecated&&a.push(" /** @deprecated */");let i=n.required?"":"?",p=Le(n,t,e);return a.push(` ${e}${i}: ${p};`),a.join(`
10
- `)}).join(`
11
- `)}function Y(r){return r.charAt(0).toUpperCase()+r.slice(1)}function He(r){let t=Y(r.name),e=`// Generated from schema version ${r.version}
12
- `;r.description&&(e+=`/** ${r.description} */
13
- `),e+=`export interface ${t} {
14
- ${K(r.fields,t)}
15
- }`;let n=q(r.fields,t);return n&&(e+=`
16
- ${n}`),e+=`
17
- `,e}function Ge(r,t){let e=[],n=s=>s===void 0?"`None`":`\`${JSON.stringify(s,null,2)}\``,a=(s=[])=>s.map(m=>`- **${m.name}**: ${m.description||""}
1
+ "use strict";var Me=Object.create;var G=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var Ae=Object.getOwnPropertyNames;var Pe=Object.getPrototypeOf,je=Object.prototype.hasOwnProperty;var Ne=(t,e)=>{for(var r in e)G(t,r,{get:e[r],enumerable:!0})},ue=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ae(e))!je.call(t,i)&&i!==r&&G(t,i,{get:()=>e[i],enumerable:!(n=Fe(e,i))||n.enumerable});return t};var V=(t,e,r)=>(r=t!=null?Me(Pe(t)):{},ue(e||!t||!t.__esModule?G(r,"default",{value:t,enumerable:!0}):r,t)),Ve=t=>ue(G({},"__esModule",{value:!0}),t);var ut={};Ne(ut,{JsonPatchError:()=>k,MigrationEngine:()=>me,MigrationError:()=>S,MigrationErrorCode:()=>$e,MigrationSchema:()=>Ce,applyPatch:()=>K,calculateNextVersion:()=>de,compareSemanticVersions:()=>F,createPatch:()=>Le,createRegistry:()=>ct,createSchemaMigrationHelper:()=>xe,createStandardSchemaValidator:()=>we,deepMerge:()=>ie,docgen:()=>ft,generateSHA256Hash:()=>D,generateValidationInterface:()=>lt,normalizePath:()=>he,schemaChangeToPatch:()=>ne,schemaToTypes:()=>pt,sortSemanticVars:()=>at,validate:()=>We,validateMigration:()=>ce,validateSchemaChange:()=>pe,validateSchemaDefinition:()=>Y});module.exports=Ve(ut);var st=require("@asaidimu/events");var ot=require("@asaidimu/events"),Q=require("@asaidimu/query");var k=class extends Error{constructor(r,n){super(r);this.operation=n;this.name="JsonPatchError"}};function z(t){let e=he(t);return e===""?[]:e.substring(1).split("/").map(Je)}function he(t){return t===""||t==="/"?"":t.startsWith("/")?"/"+t.substring(1).split("/").map(B).join("/"):"/"+t.split(".").map(B).join("/")}function B(t){return t.replace(/~/g,"~0").replace(/\//g,"~1")}function Je(t){return t.replace(/~1/g,"/").replace(/~0/g,"~")}var A=new Map;function q(t,e){let r=t;for(let n of e){if(r===null||typeof r!="object")throw new k(`Invalid path - parent not found at ${n}`);if(Array.isArray(r)){let i=n==="-"?r.length:parseInt(n);if(isNaN(i)||i<0||i>r.length)throw new k(`Invalid array index: ${n}`);r=r[i]}else{if(!r.hasOwnProperty(n))throw new k(`Property ${n} not found`);r=r[n]}}return r}function X(t,e){let r=A.get(e)||z(e);if(A.set(e,r),r.length===0)return t;let n=q(t,r.slice(0,-1)),i=r[r.length-1];if(Array.isArray(n)){let a=parseInt(i);if(isNaN(a)||a<0||a>=n.length)throw new k(`Invalid array index: ${i}`);return n[a]}return n[i]}function _e(t,e,r){let n=A.get(e)||z(e);A.set(e,n);let i=q(t,n.slice(0,-1)),a=n[n.length-1];return Array.isArray(i)?i.splice(0,i.length,...i.filter(p=>p!==r)):i[a]===r&&delete i[a],t}function U(t,e,r){let n=A.get(e)||z(e);if(A.set(e,n),n.length===0)return r;let i=n.slice(0,-1),a=n[n.length-1],p=q(t,i);if(Array.isArray(p))if(a==="-")p.push(r);else{let o=parseInt(a);if(o<0||o>p.length)throw new k(`Invalid array index: ${a}`);p.splice(o,0,r)}else p[a]=r;return t}function ee(t,e){let r=A.get(e)||z(e);if(A.set(e,r),r.length===0)return;let n=q(t,r.slice(0,-1)),i=r[r.length-1];if(Array.isArray(n)){let a=parseInt(i);n.splice(a,1)}else delete n[i];return t}function K(t,e){let r=JSON.parse(JSON.stringify(t));for(let n of e)try{switch(n.op){case"add":r=U(r,n.path,n.value);break;case"remove":r=ee(r,n.path);break;case"removeValue":r=_e(r,n.path,n.value);break;case"replace":r=U(ee(r,n.path),n.path,n.value);break;case"copy":{let i=X(r,n.from);r=U(r,n.path,JSON.parse(JSON.stringify(i)));break}case"move":{let i=X(r,n.from);r=U(r,n.path,i),r=ee(r,n.from);break}case"test":{let i=X(r,n.path);if(JSON.stringify(i)!==JSON.stringify(n.value))throw new k("Test operation failed");break}default:throw new k(`Unsupported operation: ${n.op}`)}}catch(i){throw i instanceof k&&(i.operation=n),i}return r}function Le(t,e){let r=[];return te(t,e,"",r),r}function te(t,e,r,n){if(t!==e){if(typeof t!=typeof e||Array.isArray(t)!==Array.isArray(e)){n.push({op:"replace",path:r,value:e});return}typeof t=="object"&&t!==null?Array.isArray(t)?He(t,e,r,n):Ge(t,e,r,n):t!==e&&n.push({op:"replace",path:r,value:e})}}function He(t,e,r,n){let i=Math.max(t.length,e.length);for(let a=0;a<i;a++){let p=`${r}/${a}`;a>=t.length?n.push({op:"add",path:`${r}/-`,value:e[a]}):a>=e.length?n.push({op:"remove",path:p}):te(t[a],e[a],p,n)}}function Ge(t,e,r,n){let i=new Set,a=Object.keys(t),p=Object.keys(e);for(let o of a){let m=B(o),d=r?`${r}/${m}`:`/${m}`;e.hasOwnProperty(o)?(te(t[o],e[o],d,n),i.add(o)):n.push({op:"remove",path:d})}for(let o of p)if(!i.has(o)){let m=B(o),d=r?`${r}/${m}`:`/${m}`;n.push({op:"add",path:d,value:e[o]})}}function ne(t,e){let r=[];switch(t.type){case"addField":r.push({op:"add",path:`/fields/${t.id}`,value:t.definition});break;case"removeField":r.push({op:"remove",path:`/fields/${t.id}`});break;case"modifyField":{let n=`/fields/${t.id}`;Object.entries(t.changes).forEach(([i,a])=>{typeof a=="object"&&a!==null&&!Array.isArray(a)?r.push({op:"replace",path:`${n}/${i}`,value:a}):r.push({op:"replace",path:`${n}/${i}`,value:a})});break}case"deprecateField":r.push({op:"add",path:`/fields/${t.id}/deprecated`,value:!0});break;case"addIndex":e.indexes||r.push({op:"add",path:"/indexes",value:[]}),r.push({op:"add",path:"/indexes/-",value:t.definition});break;case"removeIndex":{let n=e.indexes?.findIndex(i=>i.name===t.name);n!==void 0&&n>=0&&r.push({op:"remove",path:`/indexes/${n}`});break}case"modifyIndex":{let n=e.indexes?.findIndex(i=>i.name===t.name);n!==void 0&&n>=0&&Object.entries(t.changes).forEach(([i,a])=>{r.push({op:"replace",path:`/indexes/${n}/${i}`,value:a})});break}case"addConstraint":e.constraints||r.push({op:"add",path:"/constraints",value:[]}),Array.isArray(t.constraint)?t.constraint.forEach(n=>{r.push({op:"add",path:"/constraints/-",value:n})}):r.push({op:"add",path:"/constraints/-",value:t.constraint});break;case"removeConstraint":{let n=e.constraints?.findIndex(i=>Array.isArray(i)?i.some(a=>a.name===t.name):i.name===t.name);n!==void 0&&n>=0&&r.push({op:"remove",path:`/constraints/${n}`});break}case"modifyConstraint":{let n=Ue(e,t.name);n&&Object.entries(t.changes).forEach(([i,a])=>{r.push({op:"replace",path:`${n}/${i}`,value:a})});break}}return r}function Ue(t,e){if(!t.constraints)return null;for(let r=0;r<t.constraints.length;r++){let n=t.constraints[r];if(n.name===e)return`/constraints/${r}`;if(ye(n)){let i=ge(n.rules,e);if(i)return`/constraints/${r}${i}`}}return null}function ye(t){return t&&"operator"in t&&"rules"in t}function ge(t,e){for(let r=0;r<t.length;r++){let n=t[r];if("name"in n&&n.name===e)return`/rules/${r}`;if(ye(n)){let i=ge(n.rules,e);if(i)return`/rules/${r}${i}`}}return null}function ie(t,e){let r={...t};return re(t)&&re(e)&&Object.keys(e).forEach(n=>{re(e[n])?n in t?r[n]=ie(t[n],e[n]):Object.assign(r,{[n]:e[n]}):Object.assign(r,{[n]:e[n]})}),r}function re(t){return t&&typeof t=="object"&&!Array.isArray(t)}function we(t,e){let r=(d,h,u,f)=>{let y=[];switch(u.type){case"string":typeof d!="string"&&y.push({message:`Expected type string but received ${typeof d}.`,path:f});break;case"number":typeof d!="number"&&y.push({message:`Expected type number but received ${typeof d}.`,path:f});break;case"boolean":typeof d!="boolean"&&y.push({message:`Expected type boolean but received ${typeof d}.`,path:f});break;case"array":Array.isArray(d)?u.itemsType?d.forEach(($,O)=>{y.push(...r($,`Array: ${h}`,{name:u.name,type:u.itemsType,nestedSchema:u.nestedSchema},[...f,O]))}):y.push({message:`Expected itemsType for array ${h}`,path:f}):y.push({message:`Expected an array but received ${typeof d}.`,path:f});break;case"object":if(typeof d!="object"||d===null)y.push({message:`Expected an object but received ${d===null?"null":typeof d}.`,path:f});else if(u.nestedSchema){let $={name:u.description?`${u.description}-schema`:"nested-schema",version:"1.0",fields:u.nestedSchema};y.push(...m($,d,f))}break;case"dynamic":break;default:y.push({message:`Unknown field type: ${u.type}`,path:f});break}return y},n=(d,h,u,f)=>{let y=[];return h.constraints&&h.constraints.forEach($=>{let O=e[$.predicate];O?($.type==="schema"?O({data:u,arguments:$.parameters}):O({data:u,field:d,arguments:$.parameters}))||y.push({message:`Constraint '${$.name}' failed for field '${d}'.`,path:f}):y.push({message:`Missing predicate for constraint: ${$.name}`,path:f})}),y},i=(d,h,u,f,y)=>[...r(u,d,h,y),...n(d,h,f,y)],a=(d,h,u)=>{if("operator"in d)return p(d.operator,d.rules.map(y=>a(y,h,u)));let f=e[d.predicate];return f?d.type==="schema"?f({data:h,field:d.field,arguments:d.parameters}):f({data:h,field:u,arguments:d.parameters}):!1},p=(d,h)=>{switch(d){case"and":return h.every(Boolean);case"or":return h.some(Boolean);case"not":return h.length===1?!h[0]:!1;case"nor":return!h.some(Boolean);case"xor":return h.filter(Boolean).length===1;default:return console.error(`Unknown logical operator: ${d}`),!1}},o=d=>"operator"in d?`(${d.rules.map(o).join(` ${d.operator} `)})`:d.name,m=(d,h,u=[])=>{let f=[];for(let[y,$]of Object.entries(d.fields))$.required&&h[y]===void 0&&f.push({message:`Field '${y}' is required.`,path:[...u,y]});for(let[y,$]of Object.entries(d.fields)){let O=h[y];O!==void 0&&f.push(...i(y,$,O,h,[...u,y]))}return d.constraints&&d.constraints.forEach(y=>{a(y,h)||f.push({message:`Schema constraint failed: ${o(y)}`,path:u})}),f};return{"~standard":{version:1,vendor:"@asaidimu/anansi",validate:d=>{if(typeof d!="object"||d===null)return{issues:[{message:"Value must be a non-null object",path:[]}]};let h=m(t,d);return h.length===0?{value:d}:{issues:h}}}}}var s=require("zod");var N=class extends Error{constructor(r,n){super(r);this.errors=n;this.name="SchemaValidationError"}};var be=s.z.enum(["and","or","not","nor","xor"]),Se=s.z.enum(["string","number","boolean","array","object","dynamic"]),Be=s.z.enum(["normal","unique","btree","hash","spatial","fulltext","gi","expression","composite"]),ze=s.z.custom(()=>!0),J=s.z.object({type:s.z.string().optional(),name:s.z.string(),predicate:s.z.string().optional(),parameters:ze.optional(),description:s.z.string().optional(),field:s.z.string().optional(),errorMessage:s.z.string().optional()}),se=s.z.object({operator:be,rules:s.z.array(s.z.union([J,s.z.lazy(()=>se)]))}),W=s.z.object({name:s.z.string(),type:Se,required:s.z.boolean().optional(),constraints:s.z.array(J).optional(),default:s.z.any().optional(),itemsType:Se.optional(),nestedSchema:s.z.record(s.z.lazy(()=>W)).optional(),deprecated:s.z.boolean().optional(),reference:s.z.object({schema:s.z.string(),field:s.z.string()}).optional(),description:s.z.string().optional(),unique:s.z.boolean().optional(),metadata:s.z.any().optional()}),ve=s.z.object({operator:be,field:s.z.string(),value:s.z.any().optional(),conditions:s.z.array(s.z.lazy(()=>ve)).optional()}),ae=s.z.object({fields:s.z.array(s.z.string()),type:Be,unique:s.z.boolean().optional(),partial:ve.optional(),description:s.z.string().optional(),order:s.z.enum(["asc","desc"]).optional(),name:s.z.string().optional()}),qe=s.z.array(s.z.union([J,se])),Ke=s.z.object({name:s.z.string(),version:s.z.string(),description:s.z.string().optional(),fields:s.z.record(W),indexes:s.z.array(ae).optional(),constraints:qe.optional(),metadata:s.z.record(s.z.any()).optional(),dependencies:s.z.array(s.z.string()).optional(),migrations:s.z.array(s.z.any()).optional()}),oe=s.z.union([s.z.object({type:s.z.literal("addField"),id:s.z.string(),definition:W}),s.z.object({type:s.z.literal("removeField"),id:s.z.string()}),s.z.object({type:s.z.literal("modifyField"),id:s.z.string(),changes:W.partial()}),s.z.object({type:s.z.literal("addIndex"),definition:ae}),s.z.object({type:s.z.literal("removeIndex"),name:s.z.string()}),s.z.object({type:s.z.literal("modifyIndex"),name:s.z.string(),changes:ae.partial()}),s.z.object({type:s.z.literal("addConstraint"),constraint:s.z.union([J,se])}),s.z.object({type:s.z.literal("removeConstraint"),name:s.z.string()}),s.z.object({type:s.z.literal("modifyConstraint"),name:s.z.string(),changes:J.partial()}),s.z.object({type:s.z.literal("deprecateField"),id:s.z.string()})]),Ce=s.z.object({id:s.z.string(),schemaVersion:s.z.string(),changes:s.z.array(oe),description:s.z.string(),status:s.z.enum(["pending","applied","failed"]),rollback:s.z.array(oe).optional(),transform:s.z.unknown(),createdAt:s.z.string(),checksum:s.z.string().optional()});function ce(t){try{return Ce.parse(t),!0}catch(e){throw new N("Invalid migration definition",e)}}function pe(t){try{return oe.parse(t),!0}catch(e){throw new N("Invalid schema definition",e)}}function Y(t){try{return Ke.parse(t),!0}catch(e){throw new N("Invalid schema definition",e)}}var We=Y;var D=async t=>{if(typeof window<"u"&&crypto.subtle){let r=new TextEncoder().encode(t),n=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(n)).map(a=>a.toString(16).padStart(2,"0")).join("")}else{let{createHash:e}=await import("crypto");return e("sha256").update(t).digest("hex")}};function Ye(t){let e=t.match(/^(\d+)\.(\d+)\.(\d+)$/);if(!e)throw new Error(`Invalid version format: ${t}. Expected format: major.minor.patch`);return{major:parseInt(e[1],10),minor:parseInt(e[2],10),patch:parseInt(e[3],10)}}function Qe(t,e){if(e&&"field"in t&&t.field){let r=e.fields[t.field];if(r)return r.type}if("parameters"in t){let r=t.parameters;if(r instanceof RegExp||Array.isArray(r)&&typeof r[0]=="string")return"string";if(typeof r=="number"||Array.isArray(r)&&typeof r[0]=="number")return"number";if(typeof r=="boolean")return"boolean";if(typeof r=="object"&&r!==null){if("minItems"in r||"maxItems"in r)return"array";if("schema"in r)return"object"}}}function Ze(t){return t.required===!0||t.type!==void 0||t.itemsType!==void 0||t.nestedSchema!==void 0||t.reference!==void 0||t.unique===!0}function Xe(t,e,r){switch(r){case"string":if(t instanceof RegExp&&e instanceof RegExp)return t.source!==e.source;if(Array.isArray(t)&&Array.isArray(e))return e.length<t.length||!t.every(n=>e.includes(n));break;case"number":if(typeof t=="object"&&typeof e=="object"&&"precision"in t&&"precision"in e)return e.precision<t.precision||(e.scale??0)<(t.scale??0);if(Array.isArray(t)&&Array.isArray(e))return e.length<t.length||!t.every(n=>e.includes(n));break;case"array":if(typeof t=="object"&&typeof e=="object"&&"minItems"in t&&"maxItems"in t&&"minItems"in e&&"maxItems"in e)return e.minItems>t.minItems||e.maxItems<t.maxItems;break;case"object":if(typeof t=="object"&&typeof e=="object"&&"schema"in t&&"schema"in e)return Object.keys(e.schema).length>Object.keys(t.schema).length;break}return!1}function et(t,e){let r={or:1,xor:2,and:3,not:4,nor:4};return!!(e.operator&&r[e.operator]>r[t.operator]||e.rules&&e.rules.length>t.rules.length)}function tt(t,e,r){if(!e)return!0;if("rules"in e&&"rules"in t)return et(e,t);if("predicate"in t&&t.predicate!==void 0)return!0;if("parameters"in t&&t.parameters!==void 0){let n=Qe(e,r);return n?Xe(e.parameters,t.parameters,n):!0}return!1}function nt(t,e){switch(t.type){case"removeField":case"removeIndex":return"major";case"modifyField":return Ze(t.changes)?"major":t.changes.deprecated?"minor":"patch";case"modifyIndex":return t.changes.unique!==void 0||t.changes.fields!==void 0?"major":"minor";case"addConstraint":return"major";case"removeConstraint":return"minor";case"modifyConstraint":let r=e?.constraints?.find(n=>"name"in n&&n.name===t.name);return tt(t.changes,r,e)?"major":"minor";case"addField":case"addIndex":case"deprecateField":return"minor";default:throw new Error(`Unhandled change type: ${JSON.stringify(t)}`)}}function rt(t){let e=new Set,r=new Set,n=new Set,i=new Set;for(let a of t)switch(a.type){case"addField":if(r.has(a.id))throw new Error(`Cannot add previously removed field: ${a.id}`);if(e.has(a.id))throw new Error(`Cannot add already modified field: ${a.id}`);if(i.has(a.id))throw new Error(`Cannot add deprecated field: ${a.id}`);n.add(a.id);break;case"removeField":if(n.has(a.id))throw new Error(`Cannot remove newly added field: ${a.id}`);if(e.has(a.id))throw new Error(`Cannot remove modified field: ${a.id}`);if(i.has(a.id))throw new Error(`Cannot remove field that is being deprecated: ${a.id}`);r.add(a.id);break;case"modifyField":if(r.has(a.id))throw new Error(`Cannot modify removed field: ${a.id}`);if(n.has(a.id))throw new Error(`Cannot modify newly added field: ${a.id}`);if(i.has(a.id))throw new Error(`Cannot modify field that is being deprecated: ${a.id}`);e.add(a.id);break;case"deprecateField":if(r.has(a.id))throw new Error(`Cannot deprecate removed field: ${a.id}`);if(n.has(a.id))throw new Error(`Cannot deprecate newly added field: ${a.id}`);if(e.has(a.id))throw new Error(`Cannot deprecate modified field: ${a.id}`);i.add(a.id);break}}function it(t){let e=new Set,r=new Set,n=new Set;for(let i of t)switch(i.type){case"addConstraint":let a=i.constraint,p=("name"in a,a.name);if(r.has(p))throw new Error(`Cannot add previously removed constraint: ${p}`);if(e.has(p))throw new Error(`Cannot add already modified constraint: ${p}`);n.add(p);break;case"removeConstraint":if(n.has(i.name))throw new Error(`Cannot remove newly added constraint: ${i.name}`);if(e.has(i.name))throw new Error(`Cannot remove modified constraint: ${i.name}`);r.add(i.name);break;case"modifyConstraint":if(r.has(i.name))throw new Error(`Cannot modify removed constraint: ${i.name}`);if(n.has(i.name))throw new Error(`Cannot modify newly added constraint: ${i.name}`);e.add(i.name);break}}function de(t,e,r){if(e.length===0)throw new Error("No changes provided");rt(e),it(e);let n=Ye(t),i="patch";for(let a of e){let p=nt(a,r);if(p==="major"){i="major";break}else p==="minor"&&i==="patch"&&(i="minor")}switch(i){case"major":return`${n.major+1}.0.0`;case"minor":return`${n.major}.${n.minor+1}.0`;case"patch":return`${n.major}.${n.minor}.${n.patch+1}`}}function F(t,e){let r=d=>d.split(".").map(h=>parseInt(h,10)||0),[n,i,a]=r(t),[p,o,m]=r(e);return n-p||i-o||a-m}function at(t){return t.sort(F)}var S=class extends Error{constructor(r,n,i,a){super(r);this.code=n;this.migrationId=i;this.cause=a;this.name="MigrationError"}},$e=(f=>(f.INVALID_SCHEMA="INVALID_SCHEMA",f.INVALID_MIGRATION="INVALID_MIGRATION",f.CHECKSUM_MISMATCH="CHECKSUM_MISMATCH",f.TIMEOUT="TIMEOUT",f.MEMORY_LIMIT="MEMORY_LIMIT",f.CONCURRENT_OPERATION="CONCURRENT_OPERATION",f.TRANSFORM_ERROR="TRANSFORM_ERROR",f.VERSION_NOT_FOUND="VERSION_NOT_FOUND",f.CIRCULAR_DEPENDENCY="CIRCULAR_DEPENDENCY",f.STREAM_ERROR="STREAM_ERROR",f.ROLLBACK_ERROR="ROLLBACK_ERROR",f.MISSING_TRANSFORM="MISSING_TRANSFORM",f))($e||{}),me=class t{currentSchema;history=[];migrations=[];isProcessing=!1;constructor(e,r,n){try{if(!Y(e))throw new S("Invalid initial schema","INVALID_SCHEMA");if(this.currentSchema=e,r){if(!r.every(i=>ce(i)))throw new S("Invalid migration configuration","INVALID_MIGRATION");this.migrations=r.sort((i,a)=>F(i.schemaVersion,a.schemaVersion))}n&&(this.history=n.sort((i,a)=>F(i.version,a.version)))}catch(i){throw i instanceof S?i:new S("Failed to initialize MigrationEngine","INVALID_SCHEMA",void 0,i)}}data(){return{schema:this.currentSchema,history:this.history,migrations:this.migrations}}async generateChecksum(e){try{let r=JSON.stringify({id:e.id,schemaVersion:e.schemaVersion,changes:e.changes,description:e.description,rollback:e.rollback,createdAt:e.createdAt});return await D(r)}catch(r){throw new S("Checksum generation failed","CHECKSUM_MISMATCH",e.id,r)}}async add(e){if(this.isProcessing)throw new S("Concurrent operation","CONCURRENT_OPERATION");if(!e.changes?.length)throw new S("Migration must include changes","INVALID_MIGRATION");try{e.changes.forEach(n=>pe(n))}catch(n){throw new S("Invalid schema changes","INVALID_MIGRATION",void 0,n)}let r={id:Date.now().toString(),schemaVersion:this.currentSchema.version,changes:e.changes,description:e.description,status:"pending",rollback:e.rollback,transform:e.transform,createdAt:new Date().toISOString(),checksum:""};r.checksum=await this.generateChecksum(r),this.migrations.push(r)}async dryRun(e,r,n){if(this.isProcessing)throw new S("Concurrent operation","CONCURRENT_OPERATION");try{this.isProcessing=!0;let i={...this.currentSchema},a=this.getRelevantMigrations(r,n),p=a.reduce((m,d)=>{let h=r==="forward"?d.changes:d.rollback||[];return this.applySchemaChanges(m,h,d.id)},i),o=await t.processMigrationList(e,r,a);return{newSchema:p,dataPreview:o}}catch(i){throw i instanceof S?i:new S("Dry run failed","INVALID_SCHEMA",void 0,i)}finally{this.isProcessing=!1}}getRelevantMigrations(e,r){return[...this.migrations].filter(n=>{let i=e==="forward"?"pending":"applied",a=r?F(n.schemaVersion,r)>=0:!0;return n.status===i&&a}).sort((n,i)=>e==="forward"?n.id.localeCompare(i.id):i.id.localeCompare(n.id))}applySchemaChanges(e,r,n){try{let i=de(e.version,r);return r.map(p=>{try{return ne(p,e)}catch(o){throw new S("Invalid schema change","INVALID_SCHEMA",n,o)}}).reduce((p,o)=>{try{return K(p,o)}catch(m){throw new S("Failed to apply patch","INVALID_SCHEMA",n,m)}},{...e,version:i})}catch(i){throw i instanceof S?i:new S("Schema update failed","INVALID_SCHEMA",n,i)}}async prepareMigration(){let e=this.migrations.filter(r=>r.status==="pending");return await this.validateMigrations(e),e}async migrate(e){if(this.isProcessing)throw new S("Concurrent operation","CONCURRENT_OPERATION");let r=await this.prepareMigration();try{this.isProcessing=!0,this.transformSchema("forward");let n=await t.processMigrationList(e,"forward",r);return this.markMigrationsApplied(r),n}finally{this.isProcessing=!1}}async validateMigrations(e){await Promise.all(e.map(async r=>{let n=await this.generateChecksum(r);if(r.checksum!==n)throw new S("Checksum mismatch","CHECKSUM_MISMATCH",r.id)}))}markMigrationsApplied(e){this.migrations=this.migrations.map(r=>e.some(n=>n.id===r.id)?{...r,status:"applied"}:r)}async rollback(e){if(this.isProcessing)throw new S("Concurrent operation","CONCURRENT_OPERATION");return this.migrations.filter(n=>n.status==="applied").slice(-1)[0]?this.rollbackToVersion(this.history[this.history.length-1]?.version||this.currentSchema.version,e):e}async rollbackToVersion(e,r){if(this.isProcessing)throw new S("Concurrent operation","CONCURRENT_OPERATION");try{let n=this.history.findIndex(o=>o.version===e);if(n===-1)throw new Error(`Version ${e} not found in history`);let i=this.migrations.filter(o=>o.schemaVersion===e&&o.status==="applied").sort((o,m)=>m.id.localeCompare(o.id)),a=this.history.length-n;if(a<0)return r;for(let o=0;o<a;o++)this.transformSchema("backward");let p=await t.processMigrationList(r,"backward",i);return this.migrations=this.migrations.map(o=>o.schemaVersion===e&&o.status==="applied"?{...o,status:"pending"}:o),p}finally{this.isProcessing=!1}}static async processMigrationList(e,r,n){return(await Promise.all(n.map(async p=>{try{let o=await this.resolveTransform(p,r);return{migration:p,transform:o}}catch(o){throw new S(`Failed to resolve transform for migration ${p.id}`,"TRANSFORM_ERROR",p.id,o)}}))).filter(p=>!!p.transform).reduce((p,{migration:o,transform:m})=>p.pipeThrough(new TransformStream({async transform(d,h){try{let u=await m(d);h.enqueue(u)}catch(u){h.error(new S(`Data transformation failed for migration ${o.id}`,"TRANSFORM_ERROR",o.id,u))}}})),e)}static async resolveTransform(e,r){return e.transform?typeof e.transform=="string"?e.transform.startsWith("http://")||e.transform.startsWith("https://")?this.resolveRemoteTransform(e.transform,r):this.resolveLocalTransform(e.transform,r):e.transform[r]:null}static async resolveRemoteTransform(e,r){try{let n=await fetch(e);if(!n.ok)throw new S(`Failed to fetch transform module: ${e}`,"TRANSFORM_ERROR",void 0);let i=await n.text();if(typeof window<"u"){let a=new Blob([i],{type:"application/javascript"});return(await import(URL.createObjectURL(a))).default[r]}else{let{runInNewContext:a}=await import("vm"),p={module:{exports:{}},console};return a(i,p,e),p.module.exports[r]}}catch(n){throw new S(`Failed to load remote transform module: ${e}`,"TRANSFORM_ERROR",void 0,n)}}static async resolveLocalTransform(e,r){try{return(await import(e)).default[r]}catch(n){throw new S(`Failed to import local transform module: ${e}`,"TRANSFORM_ERROR",void 0,n)}}transformSchema(e){try{if(e==="backward"){let n=this.history.pop();if(!n)throw new Error("No previous version");this.currentSchema=n;return}let r=this.migrations.filter(n=>n.status==="pending").flatMap(n=>n.changes);if(!r.length)return;this.history.push(structuredClone(this.currentSchema)),this.currentSchema=r.reduce((n,i)=>this.applySchemaChanges(n,[i]),this.currentSchema)}catch(r){throw r instanceof S?r:new S("Schema transformation failed","INVALID_SCHEMA",void 0,r)}}};var xe=t=>{let e=[],r=[];return{addField:(n,i)=>{e.push({type:"addField",id:n,definition:i}),r.push({type:"removeField",id:n})},removeField:n=>{e.push({type:"removeField",id:n});let i=t.fields[n];i&&r.push({type:"addField",id:n,definition:i})},modifyField:(n,i)=>{e.push({type:"modifyField",id:n,changes:i});let a=t.fields[n];r.push({type:"modifyField",id:n,changes:a})},deprecateField:n=>{e.push({type:"deprecateField",id:n}),r.push({type:"modifyField",id:n,changes:{deprecated:!1}})},addIndex:n=>{e.push({type:"addIndex",definition:n}),r.push({type:"removeIndex",name:n.name})},removeIndex:n=>{e.push({type:"removeIndex",name:n});let i=t.indexes?.find(a=>a.name===n);i&&r.push({type:"addIndex",definition:i})},modifyIndex:(n,i)=>{e.push({type:"modifyIndex",name:n,changes:i});let a=t.indexes?.find(p=>p.name===n);a&&r.push({type:"modifyIndex",name:n,changes:a})},addConstraint:n=>{e.push({type:"addConstraint",constraint:n}),r.push({type:"removeConstraint",name:n.name})},removeConstraint:n=>{e.push({type:"removeConstraint",name:n});let i=t.constraints?.find(a=>"name"in a&&a.name===n);i&&r.push({type:"addConstraint",constraint:i})},modifyConstraint:(n,i)=>{e.push({type:"modifyConstraint",name:n,changes:i});let a=t.constraints?.find(p=>"name"in p&&p.name===n);a&&r.push({type:"modifyConstraint",name:n,changes:a})},changes:()=>({migrate:e,rollback:r})}};var Re=V(require("@isomorphic-git/lightning-fs"),1),Ie=require("buffer"),l=V(require("isomorphic-git"),1),j=V(require("isomorphic-git/http/web"),1);async function Te({token:t,repoConfig:e}){try{let r=await fetch("https://api.github.com/user/repos",{method:"POST",headers:{"X-GitHub-Api-Version":"2022-11-28",Accept:"application/vnd.github+json",Authorization:`Bearer ${t}`,"Content-Type":"application/json"},body:JSON.stringify(e),redirect:"follow"});if(!r.ok)throw new Error(`HTTP error! status: ${r.status}`);return await r.json()}catch(r){throw console.error("Error creating repository:",r),r}}function le(t){let e=t.toString(),r=e.substring(e.indexOf("(")+1,e.indexOf(")")),n=e.substring(e.indexOf("{")+1,e.lastIndexOf("}")).trim();return JSON.stringify({params:r,body:n})}function Ee(t){let{params:e,body:r}=JSON.parse(t),n=Object.getPrototypeOf(function*(){}).constructor;return new n(e,r)}function _(t){let e=t.toString(),r=e.substring(e.indexOf("(")+1,e.indexOf(")")),n=e.substring(e.indexOf("{")+1,e.lastIndexOf("}")).trim();return JSON.stringify({params:r,body:n})}function L(t){let{params:e,body:r}=JSON.parse(t);return new Function(e,r)}function P(t,e,r){let n=new URL(t);return n.username=e,n.password=r,n.toString()}window.Buffer=Ie.Buffer;async function ct(t,e="/registry",r="https://cors.isomorphic-git.org"){let n=new Re.default(e),i=n.promises,a="main";async function p(){await i.mkdir(e),await l.default.init({fs:n,dir:e,defaultBranch:a}),await i.writeFile(`${e}/registry.json`,JSON.stringify({schemas:{},created:new Date().toISOString(),updated:new Date().toISOString()})),await l.default.add({fs:n,dir:e,filepath:"registry.json"}),await i.writeFile(`${e}/registry.lock`,JSON.stringify({hashes:[],updated:new Date().toISOString()})),await l.default.add({fs:n,dir:e,filepath:"registry.lock"}),await l.default.commit({fs:n,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:"initial commit"}),await Te({token:t.password,repoConfig:{name:t.repository,private:!0}}),await l.default.addRemote({fs:n,dir:e,remote:"origin",url:`https://github.com/${t.username}/${t.repository}.git`}),await l.default.push({fs:n,dir:e,http:j.default,remote:"origin",url:P(`https://github.com/${t.username}/${t.repository}.git`,t.username,t.password),corsProxy:r,ref:a,onAuth:()=>({username:t.username,password:t.password})})}async function o(){await l.default.clone({fs:n,dir:e,http:j.default,corsProxy:r,url:P(`https://github.com/${t.username}/${t.repository}.git`,t.username,t.password),onAuth:()=>({username:t.username}),singleBranch:!0,depth:1})}async function m(c){await l.default.branch({fs:n,dir:e,ref:c.name,checkout:!0});let v=[c.name,`${c.name}/migrations`];for(let g of v)await i.mkdir(`${e}/${g}`);let x=await Promise.all((c.migrations||[]).map(async g=>{let w={...g};return g.transform&&typeof g.transform!="string"&&(w.transform={forward:_(g.transform.forward),backward:_(g.transform.backward)}),w=JSON.stringify(w),{hash:await D(w),checksum:g.checksum,content:w,id:g.id}}));await i.writeFile(`${e}/${c.name}/migrations/.nomedia`,"");for(let{hash:g,content:w}of x)await i.writeFile(`${e}/${c.name}/migrations/${g}.json`,w);let E=JSON.stringify({...c,migrations:[],mock:c.mock?le(c.mock):null}),C=await D(E);await i.writeFile(`${e}/${c.name}/schema.json`,E);let b={schema:c.name,version:c.version,history:[{version:c.version,hash:C,date:new Date().toISOString(),description:c.description||"",migrations:x.map(({id:g})=>g),changelog:[],predicates:[]}],migrations:x.reduce((g,{hash:w,checksum:R,id:H})=>(g[H]={hash:w,checksum:R},g),{})};await i.writeFile(`${e}/${c.name}/index.json`,JSON.stringify(b)),await l.default.add({fs:n,dir:e,filepath:c.name}),await l.default.commit({fs:n,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`chore: created schema: ${c.name}`}),await l.default.tag({fs:n,dir:e,ref:`${c.name}-${c.version}`}),await l.default.push({fs:n,http:j.default,dir:e,corsProxy:r,remote:"origin",ref:c.name,url:P(`https://github.com/${t.username}/${t.repository}.git`,t.username,t.password),onAuth:()=>({username:t.username,password:t.password})}),await l.default.checkout({fs:n,dir:e,ref:a}),await l.default.merge({fs:n,dir:e,author:{name:"bot",email:"bot@registry.domain"},theirs:`${c.name}`,message:`add schema: ${c.name}`}),await l.default.checkout({fs:n,dir:e,ref:a});let I=JSON.parse((await i.readFile(`${e}/registry.json`)).toString());I.updated=new Date().toISOString(),I.schemas[c.name]={name:c.name,version:c.version,description:c.description||"",created:new Date().toISOString(),updated:new Date().toISOString()},await i.writeFile(`${e}/registry.json`,JSON.stringify(I));let T=(await l.default.listFiles({fs:n,dir:e})).filter(g=>g!=="registry.lock"),M=await Promise.all(T.map(async g=>[g,await D(g)]));await i.writeFile(`${e}/registry.lock`,JSON.stringify({updated:new Date().toISOString(),hashes:M})),await l.default.add({fs:n,dir:e,filepath:"registry.lock"}),await l.default.add({fs:n,dir:e,filepath:"registry.json"}),await l.default.commit({fs:n,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`fix: created schema: ${c.name}`}),await $(!1)}async function d(c){await l.default.checkout({fs:n,dir:e,ref:c.name}),await l.default.pull({fs:n,dir:e,http:j.default,remote:"origin",corsProxy:r,ref:c.name,author:{name:"bot",email:"bot@registry.domain"},fastForwardOnly:!0,url:P(`https://github.com/${t.username}/${t.repository}.git`,t.username,t.password),onAuth:()=>({username:t.username,password:t.password})});let v=await Promise.all((c.migrations||[]).map(async w=>{let R={...w};return w.transform&&typeof w.transform!="string"&&(R.transform={forward:_(w.transform.forward),backward:_(w.transform.backward)}),R=JSON.stringify(R),{hash:await D(R),checksum:w.checksum,content:R,id:w.id}}));for(let{hash:w,content:R}of v)await i.writeFile(`${e}/${c.name}/migrations/${w}.json`,R);let x=JSON.stringify({...c,migrations:[],mock:c.mock?le(c.mock):null}),E=await D(x);await i.writeFile(`${e}/${c.name}/schema.json`,x);let C=`${e}/${c.name}/index.json`,b=JSON.parse((await i.readFile(C)).toString()),I={version:c.version,hash:E,date:new Date().toISOString(),description:c.description||"",migrations:v.map(({id:w})=>w),changelog:[],predicates:[]};b.history.push(I),b.migrations={...b.migrations,...v.reduce((w,{hash:R,checksum:H,id:Oe})=>(w[Oe]={hash:R,checksum:H},w),{})},await i.writeFile(C,JSON.stringify(b)),await l.default.add({fs:n,dir:e,filepath:c.name}),await l.default.commit({fs:n,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`chore: updated schema: ${c.name} to version ${c.version}`}),await l.default.tag({fs:n,dir:e,ref:`${c.name}-${c.version}`}),await l.default.push({fs:n,http:j.default,dir:e,corsProxy:r,remote:"origin",ref:a,url:P(`https://github.com/${t.username}/${t.repository}.git`,t.username,t.password),onAuth:()=>({username:t.username,password:t.password})}),await l.default.checkout({fs:n,dir:e,ref:a}),await l.default.merge({fs:n,dir:e,author:{name:"bot",email:"bot@registry.domain"},theirs:`${c.name}`,message:`update schema: ${c.name} to version ${c.version}`});let T=JSON.parse((await i.readFile(`${e}/registry.json`)).toString());T.updated=new Date().toISOString(),T.schemas[c.name]={name:c.name,version:c.version,description:c.description||"",created:T.schemas[c.name]?.created||new Date().toISOString(),updated:new Date().toISOString()},await i.writeFile(`${e}/registry.json`,JSON.stringify(T));let M=(await l.default.listFiles({fs:n,dir:e})).filter(w=>w!=="registry.lock"),g=await Promise.all(M.map(async w=>[w,await D(w)]));await i.writeFile(`${e}/registry.lock`,JSON.stringify({updated:new Date().toISOString(),hashes:g})),await l.default.add({fs:n,dir:e,filepath:"registry.lock"}),await l.default.add({fs:n,dir:e,filepath:"registry.json"}),await l.default.commit({fs:n,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`fix: updated schema: ${c.name} to version ${c.version}`}),await l.default.checkout({fs:n,dir:e,ref:a}),await $(!1)}async function h(c){await l.default.checkout({fs:n,dir:e,ref:a,force:!0}),await l.default.deleteBranch({fs:n,dir:e,ref:c});let v=JSON.parse((await i.readFile(`${e}/registry.json`)).toString());delete v.schemas[c],v.updated=new Date().toISOString(),await i.writeFile(`${e}/registry.json`,JSON.stringify(v));let x=(await l.default.listFiles({fs:n,dir:e})).filter(C=>C!=="registry.lock"),E=await Promise.all(x.map(async C=>[C,await D(C)]));await i.writeFile(`${e}/registry.lock`,JSON.stringify({updated:new Date().toISOString(),hashes:E})),await l.default.add({fs:n,dir:e,filepath:"registry.json"}),await l.default.add({fs:n,dir:e,filepath:"registry.lock"}),await l.default.commit({fs:n,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`chore: deleted schema: ${c}`})}async function u(){await l.default.checkout({fs:n,dir:e,ref:a,force:!0});let c=JSON.parse((await i.readFile(`${e}/registry.json`)).toString());return Object.entries(c.schemas).map(([x,{version:E}])=>({name:x,version:E}))}async function f(c,v,x=!1){if(await l.default.checkout({fs:n,dir:e,ref:a,force:!0}),!JSON.parse((await i.readFile(`${e}/registry.json`)).toString()).schemas[c])return null;let C=c;v&&(C=await l.default.resolveRef({fs:n,dir:e,ref:`${c}-${v}`})),await l.default.checkout({fs:n,dir:e,ref:C,force:!0});let b=JSON.parse((await i.readFile(`${e}/${c}/schema.json`)).toString());if(b.mock&&(b.mock=Ee(b.mock)),x){let I=await Promise.all((await i.readdir(`${e}/${c}/migrations`)).filter(T=>T!==".nomedia").map(async T=>(await i.readFile(`${e}/${c}/migrations/${T}`)).toString()));b.migrations=I.map(T=>{let M=JSON.parse(T);return M.transform={forward:L(M.transform.forward),backward:L(M.transform.backward)},M})}return await l.default.checkout({fs:n,dir:e,ref:a,force:!0}),b}async function y(c){return await l.default.checkout({fs:n,dir:e,ref:a,force:!0}),JSON.parse(c?(await i.readFile(`${e}/${c}/index.json`)).toString():(await i.readFile(`${e}/registry.json`)).toString())}async function $(c=!0){c&&await l.default.pull({fs:n,dir:e,http:j.default,remote:"origin",corsProxy:r,ref:a,author:{name:"bot",email:"bot@registry.domain"},fastForwardOnly:!0,url:P(`https://github.com/${t.username}/${t.repository}.git`,t.username,t.password),onAuth:()=>({username:t.username,password:t.password})}),await l.default.push({fs:n,http:j.default,dir:e,corsProxy:r,remote:"origin",ref:a,url:P(`https://github.com/${t.username}/${t.repository}.git`,t.username,t.password),onAuth:()=>({username:t.username,password:t.password})})}async function O(c,v){throw new Error("predicates not implemented")}async function fe(c,v){await l.default.checkout({fs:n,dir:e,ref:a,force:!0});let x=JSON.parse((await i.readFile(`${e}/registry.json`)).toString());if(!x.schemas[c])return[];let E=v||x.schemas[c].version,C=JSON.parse((await i.readFile(`${e}/${c}/index.json`)).toString()),b=[];for(let I of Object.keys(C.migrations)){let{hash:T}=C.migrations[I],M=`${e}/${c}/migrations/${T}.json`,g=JSON.parse((await i.readFile(M)).toString());F(g.schemaVersion,E)<=0&&(g.transform={forward:L(g.transform.forward),backward:L(g.transform.backward)},b.push(g))}return b.sort((I,T)=>F(I.schemaVersion,T.schemaVersion))}async function De(c){if(await l.default.checkout({fs:n,dir:e,ref:a,force:!0}),!JSON.parse((await i.readFile(`${e}/registry.json`)).toString()).schemas[c])return[];let x=JSON.parse((await i.readFile(`${e}/${c}/index.json`)).toString()),E=[];for(let C of x.history){let b=await f(c,C.version,!0);b&&E.push(b)}return E.sort((C,b)=>F(C.version,b.version))}return{init:p,clone:o,create:m,update:d,delete:h,list:u,schema:f,stats:y,sync:$,predicates:O,migrations:fe,history:De}}function pt(t,e=!0,r=!0){let n="",i=new Map,a=o=>!e||!o?"":`/**
2
+ * ${o}
3
+ */
4
+ `;dt(t,i);for(let[o,m]of i.entries()){if(o===t.name)continue;n+=a(m.description),n+=`${r?"export ":""}type ${o} = {
5
+ `;for(let[h,u]of Object.entries(m.fields)){u.description&&e&&(n+=` /**
6
+ * ${u.description}
7
+ */
8
+ `),u.deprecated&&(n+=` /** @deprecated */
9
+ `);let f=ke(u,o,i),y=u.required===!1?"?":"";n+=` ${h}${y}: ${f};
10
+ `}n+=`};
11
+
12
+ `}n+=a(t.description);let p=r?"export ":"";n+=`${p}type ${t.name} = {
13
+ `;for(let[o,m]of Object.entries(t.fields)){m.description&&e&&(n+=` /**
14
+ * ${m.description}
15
+ */
16
+ `),m.deprecated&&(n+=` /** @deprecated */
17
+ `);let d=ke(m,t.name,i),h=m.required===!1?"?":"";n+=` ${o}${h}: ${d};
18
+ `}if(n+=`};
19
+
20
+ `,t.indexes&&t.indexes.length>0){n+=a(`Available indexes for ${t.name}`),n+=`${p}enum ${t.name}IndexNames {
21
+ `;for(let o of t.indexes)n+=` ${o.name} = "${o.name}",
22
+ `;n+=`}
23
+
24
+ `}return n}function dt(t,e){e.set(t.name,{fields:t.fields,description:t.description});function r(n,i){for(let[a,p]of Object.entries(n)){if(p.type==="object"&&p.nestedSchema){let o=`${i}${Z(a)}`;e.set(o,{fields:p.nestedSchema,description:p.description}),r(p.nestedSchema,o)}if(p.type==="array"&&p.itemsType==="object"&&p.nestedSchema){let o=`${i}${Z(a)}`;e.set(o,{fields:p.nestedSchema,description:`Item type for ${a} array in ${i}`}),r(p.nestedSchema,o)}}}r(t.fields,t.name)}function ke(t,e,r){switch(t.type){case"string":if(t.constraints){let n=t.constraints.find(i=>i.predicate==="enum"||i.predicate==="oneOf");if(n&&Array.isArray(n.parameters))return n.parameters.map(i=>typeof i=="string"?`"${i}"`:String(i)).join(" | ")}return"string";case"number":return"number";case"boolean":return"boolean";case"array":if(t.itemsType)if(t.itemsType==="object"&&t.nestedSchema){let n=mt(t.name);return`Array<${`${e}${Z(n)}`}>`}else return`${t.itemsType}[]`;return"any[]";case"object":return t.nestedSchema?`${e}${Z(t.name)}`:t.reference?t.reference.schema:"Record<string, any>";case"dynamic":return"any";default:return"any"}}function Z(t){return t.split(/[-_\s]/).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join("")}function mt(t){let e={people:"person",children:"child",geese:"goose",mice:"mouse",men:"man",women:"woman",teeth:"tooth",feet:"foot"};return e[t]?e[t]:t.endsWith("ies")?t.slice(0,-3)+"y":t.endsWith("ses")||t.endsWith("xes")||t.endsWith("ches")||t.endsWith("shes")||t.endsWith("zzes")?t.slice(0,-2):t.endsWith("s")&&t.length>1&&!t.endsWith("ss")?t.slice(0,-1):t}function lt(t,e=!0){let n=`${e?"export ":""}interface ${t.name}Validator {
25
+ `;return n+=` /**
26
+ * Validates a ${t.name} object against all schema constraints
27
+ * @param data The data to validate
28
+ * @returns Validation result with any errors
29
+ */
30
+ `,n+=` validate(data: ${t.name}): { valid: boolean; errors: Array<{ field: string; message: string }> };
31
+
32
+ `,n+=` /**
33
+ * Checks if the given object conforms to the ${t.name} type structure
34
+ * @param data The object to check
35
+ * @returns Whether the object matches the expected structure
36
+ */
37
+ `,n+=` isType(data: any): data is ${t.name};
38
+ `,n+=`}
39
+ `,n}function ft(t,e){let r=[],n=o=>o===void 0?"`None`":`\`${JSON.stringify(o,null,2)}\``,i=(o=[])=>o.map(m=>`- **${m.name}**: ${m.description||""}
18
40
  - Parameters: ${JSON.stringify(m.parameters)}
19
41
  - Error: ${m.errorMessage||"None"}`).join(`
20
- `),i=s=>{let m=`**${s.field}** ${s.operator}`;return s.value!==void 0&&(m+=` ${JSON.stringify(s.value)}`),s.conditions&&(m+=` [
21
- ${s.conditions.map(c=>` ${i(c)}`).join(`
42
+ `),a=o=>{let m=`**${o.field}** ${o.operator}`;return o.value!==void 0&&(m+=` ${JSON.stringify(o.value)}`),o.conditions&&(m+=` [
43
+ ${o.conditions.map(d=>` ${a(d)}`).join(`
22
44
  `)}
23
- ]`),m},p=(s,m=1)=>{let c="#".repeat(m+2);return Object.entries(s).map(([l,f])=>{let d=`${c} ${l} (${f.type})
45
+ ]`),m},p=(o,m=1)=>{let d="#".repeat(m+2);return Object.entries(o).map(([h,u])=>{let f=`${d} ${h} (${u.type})
24
46
 
25
- `;return d+=`**Required:** ${f.required?"Yes":"No"}
47
+ `;return f+=`**Required:** ${u.required?"Yes":"No"}
26
48
 
27
- `,f.description&&(d+=`**Description:** ${f.description}
49
+ `,u.description&&(f+=`**Description:** ${u.description}
28
50
 
29
- `),f.itemsType&&(d+=`**Item Type:** ${f.itemsType}
51
+ `),u.itemsType&&(f+=`**Item Type:** ${u.itemsType}
30
52
 
31
- `),f.nestedSchema&&(d+=p(f.nestedSchema,m+1)),d}).join(`
32
- `)};e.push(`# ${r.name} Schema (Version ${r.version})`),r.description&&e.push(`
33
- ${r.description}
34
- `),e.push("## Metadata"),e.push(`- **Dependencies:** ${r.dependencies?.join(", ")||"None"}`),e.push(`- **Created:** ${new Date().toISOString()}
35
- `),e.push(`## Fields
36
- `),e.push("| Name | Type | Required | Default | Description | Deprecated | Unique | Constraints |"),e.push("|------|------|----------|---------|-------------|------------|--------|-------------|");for(let[s,m]of Object.entries(r.fields))e.push([s,m.type,m.required?"Yes":"No",n(m.default),m.description?.replace(/\n/g," ")||"",m.deprecated?"Yes":"No",m.unique?"Yes":"No",m.constraints?.length||0].join("|"));Object.entries(r.fields).forEach(([s,m])=>{m.nestedSchema&&(e.push(`
37
- ### Nested Schema: ${s}
38
- `),e.push(p(m.nestedSchema)))}),e.push(`
53
+ `),u.nestedSchema&&(f+=p(u.nestedSchema,m+1)),f}).join(`
54
+ `)};r.push(`# ${t.name} Schema (Version ${t.version})`),t.description&&r.push(`
55
+ ${t.description}
56
+ `),r.push("## Metadata"),r.push(`- **Dependencies:** ${t.dependencies?.join(", ")||"None"}`),r.push(`- **Created:** ${new Date().toISOString()}
57
+ `),r.push(`## Fields
58
+ `),r.push("| Name | Type | Required | Default | Description | Deprecated | Unique | Constraints |"),r.push("|------|------|----------|---------|-------------|------------|--------|-------------|");for(let[o,m]of Object.entries(t.fields))r.push([o,m.type,m.required?"Yes":"No",n(m.default),m.description?.replace(/\n/g," ")||"",m.deprecated?"Yes":"No",m.unique?"Yes":"No",m.constraints?.length||0].join("|"));Object.entries(t.fields).forEach(([o,m])=>{m.nestedSchema&&(r.push(`
59
+ ### Nested Schema: ${o}
60
+ `),r.push(p(m.nestedSchema)))}),r.push(`
39
61
  ## Indexes
40
- `),e.push("| Name | Type | Fields | Unique | Order | Partial Condition | Description |"),e.push("|------|------|--------|--------|-------|-------------------|-------------|");for(let s of r.indexes||[])e.push([s.name,s.type,s.fields.join(", "),s.unique?"Yes":"No",s.order||"asc",s.partial?i(s.partial):"None",s.description||""].join("|"));e.push(`
62
+ `),r.push("| Name | Type | Fields | Unique | Order | Partial Condition | Description |"),r.push("|------|------|--------|--------|-------|-------------------|-------------|");for(let o of t.indexes||[])r.push([o.name,o.type,o.fields.join(", "),o.unique?"Yes":"No",o.order||"asc",o.partial?a(o.partial):"None",o.description||""].join("|"));r.push(`
41
63
  ## Constraints
42
- `),r.constraints&&e.push("### Schema-level Constraints"),e.push(`
64
+ `),t.constraints&&r.push("### Schema-level Constraints"),r.push(`
43
65
  ## Migrations
44
- `),e.push("| ID | Description | Status | Changes |"),e.push("|----|-------------|--------|---------|");for(let s of r.migrations||[])e.push([s.id,s.description,s.status,s.changes.length].join("|"));if(r.mock&&t?.faker)try{let s=r.mock(t.faker).next().value;e.push("\n## Example Data\n```json\n"+JSON.stringify(s,null,2)+"\n```")}catch{e.push(`
45
- <!-- Error generating mock data -->`)}return e.join(`
46
- `)}0&&(module.exports={JsonPatchError,MigrationEngine,MigrationError,MigrationErrorCode,MigrationSchema,applyPatch,calculateNextVersion,compareSemanticVersions,createPatch,createSchemaMigrationHelper,createStandardSchemaValidator,deepMerge,docgen,generateSHA256Hash,normalizePath,schemaChangeToPatch,schemaToTypes,sortSemanticVars,validate,validateMigration,validateSchemaChange,validateSchemaDefinition});
66
+ `),r.push("| ID | Description | Status | Changes |"),r.push("|----|-------------|--------|---------|");for(let o of t.migrations||[])r.push([o.id,o.description,o.status,o.changes.length].join("|"));if(t.mock&&e?.faker)try{let o=t.mock(e.faker).next().value;r.push("\n## Example Data\n```json\n"+JSON.stringify(o,null,2)+"\n```")}catch{r.push(`
67
+ <!-- Error generating mock data -->`)}return r.join(`
68
+ `)}0&&(module.exports={JsonPatchError,MigrationEngine,MigrationError,MigrationErrorCode,MigrationSchema,applyPatch,calculateNextVersion,compareSemanticVersions,createPatch,createRegistry,createSchemaMigrationHelper,createStandardSchemaValidator,deepMerge,docgen,generateSHA256Hash,generateValidationInterface,normalizePath,schemaChangeToPatch,schemaToTypes,sortSemanticVars,validate,validateMigration,validateSchemaChange,validateSchemaDefinition});
package/index.d.cts CHANGED
@@ -821,6 +821,16 @@ interface SchemaRegistry {
821
821
  history(name: string): Promise<SchemaDefinition[]>;
822
822
  }
823
823
 
824
+ /**
825
+ * Creates and returns a new SchemaRegistry instance.
826
+ * @returns {Promise<SchemaRegistry>} A promise that resolves to the SchemaRegistry instance.
827
+ */
828
+ declare function createRegistry(credentials: {
829
+ username: string;
830
+ password: string;
831
+ repository: string;
832
+ }, dir?: string, proxy?: string): Promise<SchemaRegistry>;
833
+
824
834
  /**
825
835
  * @fileoverview Provides a MigrationEngine class that handles schema migrations,
826
836
  * including validation, checksum generation, and migration application.
@@ -1829,11 +1839,29 @@ declare const generateSHA256Hash: (input: string) => Promise<string>;
1829
1839
  declare function deepMerge<T extends object>(target: T, update: Partial<T>): T;
1830
1840
 
1831
1841
  /**
1832
- * Converts a schema definition into TypeScript type definitions
1833
- * @param schema - The schema definition
1834
- * @returns A string containing all type definitions
1842
+ * Converts a SchemaDefinition to TypeScript type definitions
1843
+ *
1844
+ * This function analyzes a schema definition and generates appropriate TypeScript
1845
+ * type declarations. It handles nested objects, arrays, references, and all primitive types
1846
+ * defined in the schema system.
1847
+ *
1848
+ * @param {SchemaDefinition} schema - The schema definition to convert to TypeScript types
1849
+ * @param {boolean} [includeComments=true] - Whether to include JSDoc comments from schema descriptions
1850
+ * @param {boolean} [exportTypes=true] - Whether to export the generated types
1851
+ * @returns {string} TypeScript type definitions as a string
1852
+ */
1853
+ declare function schemaToTypes(schema: SchemaDefinition, includeComments?: boolean, exportTypes?: boolean): string;
1854
+ /**
1855
+ * Generates a TypeScript interface for validating schema data
1856
+ *
1857
+ * This function creates a validation interface with methods that
1858
+ * correspond to the schema constraints.
1859
+ *
1860
+ * @param {SchemaDefinition} schema - The schema definition
1861
+ * @param {boolean} [exportType=true] - Whether to export the generated interface
1862
+ * @returns {string} TypeScript interface definition for validation
1835
1863
  */
1836
- declare function schemaToTypes(schema: SchemaDefinition): string;
1864
+ declare function generateValidationInterface(schema: SchemaDefinition, exportType?: boolean): string;
1837
1865
 
1838
1866
  /**
1839
1867
  * Creates a Standard Schema validator that conforms to the StandardSchemaV1 interface.
@@ -1882,4 +1910,4 @@ declare function docgen(schema: SchemaDefinition, options?: {
1882
1910
  faker?: Faker;
1883
1911
  }): string;
1884
1912
 
1885
- export { type Constraint, type ConstraintGroup, type ConstraintParameters, type ConstraintsMap, type DataTransform, type FieldDefinition, type FieldType, type FunctionMap, type IndexDefinition, type IndexType, JsonPatchError, type LogicalOperator, type Migration, MigrationEngine, type MigrationEngineInterface, MigrationError, MigrationErrorCode, type MigrationMetadata, MigrationSchema, type PartialIndexCondition, type PatchOperation, type Persistence, type PersistenceCollection, type PersistenceEvent, type PersistenceEventType, type PersistenceTransaction, type Predicate, type PredicateMap, type PredicateName, type PredicateParameters, type RegistryLock, type RegistryMetadata, type Schema, type SchemaChange, type SchemaConstraint, type SchemaDefinition, type SchemaEvent, type SchemaEventType, type SchemaIndex, type SchemaMetadata, type SchemaMigrationHelper, type SchemaRegistry, type SchemaVersion, type TransformFunction, applyPatch, calculateNextVersion, compareSemanticVersions, createPatch, createSchemaMigrationHelper, createStandardSchemaValidator, deepMerge, docgen, generateSHA256Hash, normalizePath, schemaChangeToPatch, schemaToTypes, sortSemanticVars, validate, validateMigration, validateSchemaChange, validateSchemaDefinition };
1913
+ export { type Constraint, type ConstraintGroup, type ConstraintParameters, type ConstraintsMap, type DataTransform, type FieldDefinition, type FieldType, type FunctionMap, type IndexDefinition, type IndexType, JsonPatchError, type LogicalOperator, type Migration, MigrationEngine, type MigrationEngineInterface, MigrationError, MigrationErrorCode, type MigrationMetadata, MigrationSchema, type PartialIndexCondition, type PatchOperation, type Persistence, type PersistenceCollection, type PersistenceEvent, type PersistenceEventType, type PersistenceTransaction, type Predicate, type PredicateMap, type PredicateName, type PredicateParameters, type RegistryLock, type RegistryMetadata, type Schema, type SchemaChange, type SchemaConstraint, type SchemaDefinition, type SchemaEvent, type SchemaEventType, type SchemaIndex, type SchemaMetadata, type SchemaMigrationHelper, type SchemaRegistry, type SchemaVersion, type TransformFunction, applyPatch, calculateNextVersion, compareSemanticVersions, createPatch, createRegistry, createSchemaMigrationHelper, createStandardSchemaValidator, deepMerge, docgen, generateSHA256Hash, generateValidationInterface, normalizePath, schemaChangeToPatch, schemaToTypes, sortSemanticVars, validate, validateMigration, validateSchemaChange, validateSchemaDefinition };
package/index.d.ts CHANGED
@@ -821,6 +821,16 @@ interface SchemaRegistry {
821
821
  history(name: string): Promise<SchemaDefinition[]>;
822
822
  }
823
823
 
824
+ /**
825
+ * Creates and returns a new SchemaRegistry instance.
826
+ * @returns {Promise<SchemaRegistry>} A promise that resolves to the SchemaRegistry instance.
827
+ */
828
+ declare function createRegistry(credentials: {
829
+ username: string;
830
+ password: string;
831
+ repository: string;
832
+ }, dir?: string, proxy?: string): Promise<SchemaRegistry>;
833
+
824
834
  /**
825
835
  * @fileoverview Provides a MigrationEngine class that handles schema migrations,
826
836
  * including validation, checksum generation, and migration application.
@@ -1829,11 +1839,29 @@ declare const generateSHA256Hash: (input: string) => Promise<string>;
1829
1839
  declare function deepMerge<T extends object>(target: T, update: Partial<T>): T;
1830
1840
 
1831
1841
  /**
1832
- * Converts a schema definition into TypeScript type definitions
1833
- * @param schema - The schema definition
1834
- * @returns A string containing all type definitions
1842
+ * Converts a SchemaDefinition to TypeScript type definitions
1843
+ *
1844
+ * This function analyzes a schema definition and generates appropriate TypeScript
1845
+ * type declarations. It handles nested objects, arrays, references, and all primitive types
1846
+ * defined in the schema system.
1847
+ *
1848
+ * @param {SchemaDefinition} schema - The schema definition to convert to TypeScript types
1849
+ * @param {boolean} [includeComments=true] - Whether to include JSDoc comments from schema descriptions
1850
+ * @param {boolean} [exportTypes=true] - Whether to export the generated types
1851
+ * @returns {string} TypeScript type definitions as a string
1852
+ */
1853
+ declare function schemaToTypes(schema: SchemaDefinition, includeComments?: boolean, exportTypes?: boolean): string;
1854
+ /**
1855
+ * Generates a TypeScript interface for validating schema data
1856
+ *
1857
+ * This function creates a validation interface with methods that
1858
+ * correspond to the schema constraints.
1859
+ *
1860
+ * @param {SchemaDefinition} schema - The schema definition
1861
+ * @param {boolean} [exportType=true] - Whether to export the generated interface
1862
+ * @returns {string} TypeScript interface definition for validation
1835
1863
  */
1836
- declare function schemaToTypes(schema: SchemaDefinition): string;
1864
+ declare function generateValidationInterface(schema: SchemaDefinition, exportType?: boolean): string;
1837
1865
 
1838
1866
  /**
1839
1867
  * Creates a Standard Schema validator that conforms to the StandardSchemaV1 interface.
@@ -1882,4 +1910,4 @@ declare function docgen(schema: SchemaDefinition, options?: {
1882
1910
  faker?: Faker;
1883
1911
  }): string;
1884
1912
 
1885
- export { type Constraint, type ConstraintGroup, type ConstraintParameters, type ConstraintsMap, type DataTransform, type FieldDefinition, type FieldType, type FunctionMap, type IndexDefinition, type IndexType, JsonPatchError, type LogicalOperator, type Migration, MigrationEngine, type MigrationEngineInterface, MigrationError, MigrationErrorCode, type MigrationMetadata, MigrationSchema, type PartialIndexCondition, type PatchOperation, type Persistence, type PersistenceCollection, type PersistenceEvent, type PersistenceEventType, type PersistenceTransaction, type Predicate, type PredicateMap, type PredicateName, type PredicateParameters, type RegistryLock, type RegistryMetadata, type Schema, type SchemaChange, type SchemaConstraint, type SchemaDefinition, type SchemaEvent, type SchemaEventType, type SchemaIndex, type SchemaMetadata, type SchemaMigrationHelper, type SchemaRegistry, type SchemaVersion, type TransformFunction, applyPatch, calculateNextVersion, compareSemanticVersions, createPatch, createSchemaMigrationHelper, createStandardSchemaValidator, deepMerge, docgen, generateSHA256Hash, normalizePath, schemaChangeToPatch, schemaToTypes, sortSemanticVars, validate, validateMigration, validateSchemaChange, validateSchemaDefinition };
1913
+ export { type Constraint, type ConstraintGroup, type ConstraintParameters, type ConstraintsMap, type DataTransform, type FieldDefinition, type FieldType, type FunctionMap, type IndexDefinition, type IndexType, JsonPatchError, type LogicalOperator, type Migration, MigrationEngine, type MigrationEngineInterface, MigrationError, MigrationErrorCode, type MigrationMetadata, MigrationSchema, type PartialIndexCondition, type PatchOperation, type Persistence, type PersistenceCollection, type PersistenceEvent, type PersistenceEventType, type PersistenceTransaction, type Predicate, type PredicateMap, type PredicateName, type PredicateParameters, type RegistryLock, type RegistryMetadata, type Schema, type SchemaChange, type SchemaConstraint, type SchemaDefinition, type SchemaEvent, type SchemaEventType, type SchemaIndex, type SchemaMetadata, type SchemaMigrationHelper, type SchemaRegistry, type SchemaVersion, type TransformFunction, applyPatch, calculateNextVersion, compareSemanticVersions, createPatch, createRegistry, createSchemaMigrationHelper, createStandardSchemaValidator, deepMerge, docgen, generateSHA256Hash, generateValidationInterface, normalizePath, schemaChangeToPatch, schemaToTypes, sortSemanticVars, validate, validateMigration, validateSchemaChange, validateSchemaDefinition };
package/index.js CHANGED
@@ -1,46 +1,68 @@
1
- import{createEventBus as it}from"@asaidimu/events";import{createEventBus as Be}from"@asaidimu/events";import{createMatcher as qe,createPaginator as Ke,createProjector as Ye,createSorter as Qe}from"@asaidimu/query";var g=class extends Error{constructor(e,t){super(e);this.operation=t;this.name="JsonPatchError"}};function x(r){let n=Z(r);return n===""?[]:n.substring(1).split("/").map(X)}function Z(r){return r===""||r==="/"?"":r.startsWith("/")?"/"+r.substring(1).split("/").map(T).join("/"):"/"+r.split(".").map(T).join("/")}function T(r){return r.replace(/~/g,"~0").replace(/\//g,"~1")}function X(r){return r.replace(/~1/g,"/").replace(/~0/g,"~")}var S=new Map;function E(r,n){let e=r;for(let t of n){if(e===null||typeof e!="object")throw new g(`Invalid path - parent not found at ${t}`);if(Array.isArray(e)){let a=t==="-"?e.length:parseInt(t);if(isNaN(a)||a<0||a>e.length)throw new g(`Invalid array index: ${t}`);e=e[a]}else{if(!e.hasOwnProperty(t))throw new g(`Property ${t} not found`);e=e[t]}}return e}function R(r,n){let e=S.get(n)||x(n);if(S.set(n,e),e.length===0)return r;let t=E(r,e.slice(0,-1)),a=e[e.length-1];if(Array.isArray(t)){let i=parseInt(a);if(isNaN(i)||i<0||i>=t.length)throw new g(`Invalid array index: ${a}`);return t[i]}return t[a]}function ee(r,n,e){let t=S.get(n)||x(n);S.set(n,t);let a=E(r,t.slice(0,-1)),i=t[t.length-1];return Array.isArray(a)?a.splice(0,a.length,...a.filter(p=>p!==e)):a[i]===e&&delete a[i],r}function $(r,n,e){let t=S.get(n)||x(n);if(S.set(n,t),t.length===0)return e;let a=t.slice(0,-1),i=t[t.length-1],p=E(r,a);if(Array.isArray(p))if(i==="-")p.push(e);else{let s=parseInt(i);if(s<0||s>p.length)throw new g(`Invalid array index: ${i}`);p.splice(s,0,e)}else p[i]=e;return r}function k(r,n){let e=S.get(n)||x(n);if(S.set(n,e),e.length===0)return;let t=E(r,e.slice(0,-1)),a=e[e.length-1];if(Array.isArray(t)){let i=parseInt(a);t.splice(i,1)}else delete t[a];return r}function D(r,n){let e=JSON.parse(JSON.stringify(r));for(let t of n)try{switch(t.op){case"add":e=$(e,t.path,t.value);break;case"remove":e=k(e,t.path);break;case"removeValue":e=ee(e,t.path,t.value);break;case"replace":e=$(k(e,t.path),t.path,t.value);break;case"copy":{let a=R(e,t.from);e=$(e,t.path,JSON.parse(JSON.stringify(a)));break}case"move":{let a=R(e,t.from);e=$(e,t.path,a),e=k(e,t.from);break}case"test":{let a=R(e,t.path);if(JSON.stringify(a)!==JSON.stringify(t.value))throw new g("Test operation failed");break}default:throw new g(`Unsupported operation: ${t.op}`)}}catch(a){throw a instanceof g&&(a.operation=t),a}return e}function Te(r,n){let e=[];return O(r,n,"",e),e}function O(r,n,e,t){if(r!==n){if(typeof r!=typeof n||Array.isArray(r)!==Array.isArray(n)){t.push({op:"replace",path:e,value:n});return}typeof r=="object"&&r!==null?Array.isArray(r)?te(r,n,e,t):ne(r,n,e,t):r!==n&&t.push({op:"replace",path:e,value:n})}}function te(r,n,e,t){let a=Math.max(r.length,n.length);for(let i=0;i<a;i++){let p=`${e}/${i}`;i>=r.length?t.push({op:"add",path:`${e}/-`,value:n[i]}):i>=n.length?t.push({op:"remove",path:p}):O(r[i],n[i],p,t)}}function ne(r,n,e,t){let a=new Set,i=Object.keys(r),p=Object.keys(n);for(let s of i){let m=T(s),c=e?`${e}/${m}`:`/${m}`;n.hasOwnProperty(s)?(O(r[s],n[s],c,t),a.add(s)):t.push({op:"remove",path:c})}for(let s of p)if(!a.has(s)){let m=T(s),c=e?`${e}/${m}`:`/${m}`;t.push({op:"add",path:c,value:n[s]})}}function L(r,n){let e=[];switch(r.type){case"addField":e.push({op:"add",path:`/fields/${r.id}`,value:r.definition});break;case"removeField":e.push({op:"remove",path:`/fields/${r.id}`});break;case"modifyField":{let t=`/fields/${r.id}`;Object.entries(r.changes).forEach(([a,i])=>{typeof i=="object"&&i!==null&&!Array.isArray(i)?e.push({op:"replace",path:`${t}/${a}`,value:i}):e.push({op:"replace",path:`${t}/${a}`,value:i})});break}case"deprecateField":e.push({op:"add",path:`/fields/${r.id}/deprecated`,value:!0});break;case"addIndex":n.indexes||e.push({op:"add",path:"/indexes",value:[]}),e.push({op:"add",path:"/indexes/-",value:r.definition});break;case"removeIndex":{let t=n.indexes?.findIndex(a=>a.name===r.name);t!==void 0&&t>=0&&e.push({op:"remove",path:`/indexes/${t}`});break}case"modifyIndex":{let t=n.indexes?.findIndex(a=>a.name===r.name);t!==void 0&&t>=0&&Object.entries(r.changes).forEach(([a,i])=>{e.push({op:"replace",path:`/indexes/${t}/${a}`,value:i})});break}case"addConstraint":n.constraints||e.push({op:"add",path:"/constraints",value:[]}),Array.isArray(r.constraint)?r.constraint.forEach(t=>{e.push({op:"add",path:"/constraints/-",value:t})}):e.push({op:"add",path:"/constraints/-",value:r.constraint});break;case"removeConstraint":{let t=n.constraints?.findIndex(a=>Array.isArray(a)?a.some(i=>i.name===r.name):a.name===r.name);t!==void 0&&t>=0&&e.push({op:"remove",path:`/constraints/${t}`});break}case"modifyConstraint":{let t=re(n,r.name);t&&Object.entries(r.changes).forEach(([a,i])=>{e.push({op:"replace",path:`${t}/${a}`,value:i})});break}}return e}function re(r,n){if(!r.constraints)return null;for(let e=0;e<r.constraints.length;e++){let t=r.constraints[e];if(t.name===n)return`/constraints/${e}`;if(H(t)){let a=G(t.rules,n);if(a)return`/constraints/${e}${a}`}}return null}function H(r){return r&&"operator"in r&&"rules"in r}function G(r,n){for(let e=0;e<r.length;e++){let t=r[e];if("name"in t&&t.name===n)return`/rules/${e}`;if(H(t)){let a=G(t.rules,n);if(a)return`/rules/${e}${a}`}}return null}function U(r,n){let e={...r};return M(r)&&M(n)&&Object.keys(n).forEach(t=>{M(n[t])?t in r?e[t]=U(r[t],n[t]):Object.assign(e,{[t]:n[t]}):Object.assign(e,{[t]:n[t]})}),e}function M(r){return r&&typeof r=="object"&&!Array.isArray(r)}function ae(r,n){let e=(c,l,f,d)=>{let u=[];switch(f.type){case"string":typeof c!="string"&&u.push({message:`Expected type string but received ${typeof c}.`,path:d});break;case"number":typeof c!="number"&&u.push({message:`Expected type number but received ${typeof c}.`,path:d});break;case"boolean":typeof c!="boolean"&&u.push({message:`Expected type boolean but received ${typeof c}.`,path:d});break;case"array":Array.isArray(c)?f.itemsType?c.forEach((y,w)=>{u.push(...e(y,`Array: ${l}`,{name:f.name,type:f.itemsType,nestedSchema:f.nestedSchema},[...d,w]))}):u.push({message:`Expected itemsType for array ${l}`,path:d}):u.push({message:`Expected an array but received ${typeof c}.`,path:d});break;case"object":if(typeof c!="object"||c===null)u.push({message:`Expected an object but received ${c===null?"null":typeof c}.`,path:d});else if(f.nestedSchema){let y={name:f.description?`${f.description}-schema`:"nested-schema",version:"1.0",fields:f.nestedSchema};u.push(...m(y,c,d))}break;case"dynamic":break;default:u.push({message:`Unknown field type: ${f.type}`,path:d});break}return u},t=(c,l,f,d)=>{let u=[];return l.constraints&&l.constraints.forEach(y=>{let w=n[y.predicate];w?(y.type==="schema"?w({data:f,arguments:y.parameters}):w({data:f,field:c,arguments:y.parameters}))||u.push({message:`Constraint '${y.name}' failed for field '${c}'.`,path:d}):u.push({message:`Missing predicate for constraint: ${y.name}`,path:d})}),u},a=(c,l,f,d,u)=>[...e(f,c,l,u),...t(c,l,d,u)],i=(c,l,f)=>{if("operator"in c)return p(c.operator,c.rules.map(u=>i(u,l,f)));let d=n[c.predicate];return d?c.type==="schema"?d({data:l,field:c.field,arguments:c.parameters}):d({data:l,field:f,arguments:c.parameters}):!1},p=(c,l)=>{switch(c){case"and":return l.every(Boolean);case"or":return l.some(Boolean);case"not":return l.length===1?!l[0]:!1;case"nor":return!l.some(Boolean);case"xor":return l.filter(Boolean).length===1;default:return console.error(`Unknown logical operator: ${c}`),!1}},s=c=>"operator"in c?`(${c.rules.map(s).join(` ${c.operator} `)})`:c.name,m=(c,l,f=[])=>{let d=[];for(let[u,y]of Object.entries(c.fields))y.required&&l[u]===void 0&&d.push({message:`Field '${u}' is required.`,path:[...f,u]});for(let[u,y]of Object.entries(c.fields)){let w=l[u];w!==void 0&&d.push(...a(u,y,w,l,[...f,u]))}return c.constraints&&c.constraints.forEach(u=>{i(u,l)||d.push({message:`Schema constraint failed: ${s(u)}`,path:f})}),d};return{"~standard":{version:1,vendor:"@asaidimu/anansi",validate:c=>{if(typeof c!="object"||c===null)return{issues:[{message:"Value must be a non-null object",path:[]}]};let l=m(r,c);return l.length===0?{value:c}:{issues:l}}}}}import{z as o}from"zod";var b=class extends Error{constructor(e,t){super(e);this.errors=t;this.name="SchemaValidationError"}};var z=o.enum(["and","or","not","nor","xor"]),B=o.enum(["string","number","boolean","array","object","dynamic"]),ie=o.enum(["normal","unique","btree","hash","spatial","fulltext","gi","expression","composite"]),oe=o.custom(()=>!0),C=o.object({type:o.string().optional(),name:o.string(),predicate:o.string().optional(),parameters:oe.optional(),description:o.string().optional(),field:o.string().optional(),errorMessage:o.string().optional()}),A=o.object({operator:z,rules:o.array(o.union([C,o.lazy(()=>A)]))}),I=o.object({name:o.string(),type:B,required:o.boolean().optional(),constraints:o.array(C).optional(),default:o.any().optional(),itemsType:B.optional(),nestedSchema:o.record(o.lazy(()=>I)).optional(),deprecated:o.boolean().optional(),reference:o.object({schema:o.string(),field:o.string()}).optional(),description:o.string().optional(),unique:o.boolean().optional(),metadata:o.any().optional()}),q=o.object({operator:z,field:o.string(),value:o.any().optional(),conditions:o.array(o.lazy(()=>q)).optional()}),P=o.object({fields:o.array(o.string()),type:ie,unique:o.boolean().optional(),partial:q.optional(),description:o.string().optional(),order:o.enum(["asc","desc"]).optional(),name:o.string().optional()}),se=o.array(o.union([C,A])),ce=o.object({name:o.string(),version:o.string(),description:o.string().optional(),fields:o.record(I),indexes:o.array(P).optional(),constraints:se.optional(),metadata:o.record(o.any()).optional(),dependencies:o.array(o.string()).optional(),migrations:o.array(o.any()).optional()}),F=o.union([o.object({type:o.literal("addField"),id:o.string(),definition:I}),o.object({type:o.literal("removeField"),id:o.string()}),o.object({type:o.literal("modifyField"),id:o.string(),changes:I.partial()}),o.object({type:o.literal("addIndex"),definition:P}),o.object({type:o.literal("removeIndex"),name:o.string()}),o.object({type:o.literal("modifyIndex"),name:o.string(),changes:P.partial()}),o.object({type:o.literal("addConstraint"),constraint:o.union([C,A])}),o.object({type:o.literal("removeConstraint"),name:o.string()}),o.object({type:o.literal("modifyConstraint"),name:o.string(),changes:C.partial()}),o.object({type:o.literal("deprecateField"),id:o.string()})]),pe=o.object({id:o.string(),schemaVersion:o.string(),changes:o.array(F),description:o.string(),status:o.enum(["pending","applied","failed"]),rollback:o.array(F).optional(),transform:o.unknown(),createdAt:o.string(),checksum:o.string().optional()});function K(r){try{return pe.parse(r),!0}catch(n){throw new b("Invalid migration definition",n)}}function Y(r){try{return F.parse(r),!0}catch(n){throw new b("Invalid schema definition",n)}}function N(r){try{return ce.parse(r),!0}catch(n){throw new b("Invalid schema definition",n)}}var Me=N;var j=async r=>{if(typeof window<"u"&&crypto.subtle){let e=new TextEncoder().encode(r),t=await crypto.subtle.digest("SHA-256",e);return Array.from(new Uint8Array(t)).map(i=>i.toString(16).padStart(2,"0")).join("")}else{let{createHash:n}=await import("crypto");return n("sha256").update(r).digest("hex")}};function de(r){let n=r.match(/^(\d+)\.(\d+)\.(\d+)$/);if(!n)throw new Error(`Invalid version format: ${r}. Expected format: major.minor.patch`);return{major:parseInt(n[1],10),minor:parseInt(n[2],10),patch:parseInt(n[3],10)}}function me(r,n){if(n&&"field"in r&&r.field){let e=n.fields[r.field];if(e)return e.type}if("parameters"in r){let e=r.parameters;if(e instanceof RegExp||Array.isArray(e)&&typeof e[0]=="string")return"string";if(typeof e=="number"||Array.isArray(e)&&typeof e[0]=="number")return"number";if(typeof e=="boolean")return"boolean";if(typeof e=="object"&&e!==null){if("minItems"in e||"maxItems"in e)return"array";if("schema"in e)return"object"}}}function le(r){return r.required===!0||r.type!==void 0||r.itemsType!==void 0||r.nestedSchema!==void 0||r.reference!==void 0||r.unique===!0}function fe(r,n,e){switch(e){case"string":if(r instanceof RegExp&&n instanceof RegExp)return r.source!==n.source;if(Array.isArray(r)&&Array.isArray(n))return n.length<r.length||!r.every(t=>n.includes(t));break;case"number":if(typeof r=="object"&&typeof n=="object"&&"precision"in r&&"precision"in n)return n.precision<r.precision||(n.scale??0)<(r.scale??0);if(Array.isArray(r)&&Array.isArray(n))return n.length<r.length||!r.every(t=>n.includes(t));break;case"array":if(typeof r=="object"&&typeof n=="object"&&"minItems"in r&&"maxItems"in r&&"minItems"in n&&"maxItems"in n)return n.minItems>r.minItems||n.maxItems<r.maxItems;break;case"object":if(typeof r=="object"&&typeof n=="object"&&"schema"in r&&"schema"in n)return Object.keys(n.schema).length>Object.keys(r.schema).length;break}return!1}function ue(r,n){let e={or:1,xor:2,and:3,not:4,nor:4};return!!(n.operator&&e[n.operator]>e[r.operator]||n.rules&&n.rules.length>r.rules.length)}function he(r,n,e){if(!n)return!0;if("rules"in n&&"rules"in r)return ue(n,r);if("predicate"in r&&r.predicate!==void 0)return!0;if("parameters"in r&&r.parameters!==void 0){let t=me(n,e);return t?fe(n.parameters,r.parameters,t):!0}return!1}function ye(r,n){switch(r.type){case"removeField":case"removeIndex":return"major";case"modifyField":return le(r.changes)?"major":r.changes.deprecated?"minor":"patch";case"modifyIndex":return r.changes.unique!==void 0||r.changes.fields!==void 0?"major":"minor";case"addConstraint":return"major";case"removeConstraint":return"minor";case"modifyConstraint":let e=n?.constraints?.find(t=>"name"in t&&t.name===r.name);return he(r.changes,e,n)?"major":"minor";case"addField":case"addIndex":case"deprecateField":return"minor";default:throw new Error(`Unhandled change type: ${JSON.stringify(r)}`)}}function ge(r){let n=new Set,e=new Set,t=new Set,a=new Set;for(let i of r)switch(i.type){case"addField":if(e.has(i.id))throw new Error(`Cannot add previously removed field: ${i.id}`);if(n.has(i.id))throw new Error(`Cannot add already modified field: ${i.id}`);if(a.has(i.id))throw new Error(`Cannot add deprecated field: ${i.id}`);t.add(i.id);break;case"removeField":if(t.has(i.id))throw new Error(`Cannot remove newly added field: ${i.id}`);if(n.has(i.id))throw new Error(`Cannot remove modified field: ${i.id}`);if(a.has(i.id))throw new Error(`Cannot remove field that is being deprecated: ${i.id}`);e.add(i.id);break;case"modifyField":if(e.has(i.id))throw new Error(`Cannot modify removed field: ${i.id}`);if(t.has(i.id))throw new Error(`Cannot modify newly added field: ${i.id}`);if(a.has(i.id))throw new Error(`Cannot modify field that is being deprecated: ${i.id}`);n.add(i.id);break;case"deprecateField":if(e.has(i.id))throw new Error(`Cannot deprecate removed field: ${i.id}`);if(t.has(i.id))throw new Error(`Cannot deprecate newly added field: ${i.id}`);if(n.has(i.id))throw new Error(`Cannot deprecate modified field: ${i.id}`);a.add(i.id);break}}function we(r){let n=new Set,e=new Set,t=new Set;for(let a of r)switch(a.type){case"addConstraint":let i=a.constraint,p=("name"in i,i.name);if(e.has(p))throw new Error(`Cannot add previously removed constraint: ${p}`);if(n.has(p))throw new Error(`Cannot add already modified constraint: ${p}`);t.add(p);break;case"removeConstraint":if(t.has(a.name))throw new Error(`Cannot remove newly added constraint: ${a.name}`);if(n.has(a.name))throw new Error(`Cannot remove modified constraint: ${a.name}`);e.add(a.name);break;case"modifyConstraint":if(e.has(a.name))throw new Error(`Cannot modify removed constraint: ${a.name}`);if(t.has(a.name))throw new Error(`Cannot modify newly added constraint: ${a.name}`);n.add(a.name);break}}function Q(r,n,e){if(n.length===0)throw new Error("No changes provided");ge(n),we(n);let t=de(r),a="patch";for(let i of n){let p=ye(i,e);if(p==="major"){a="major";break}else p==="minor"&&a==="patch"&&(a="minor")}switch(a){case"major":return`${t.major+1}.0.0`;case"minor":return`${t.major}.${t.minor+1}.0`;case"patch":return`${t.major}.${t.minor}.${t.patch+1}`}}function v(r,n){let e=c=>c.split(".").map(l=>parseInt(l,10)||0),[t,a,i]=e(r),[p,s,m]=e(n);return t-p||a-s||i-m}function Ae(r){return r.sort(v)}var h=class extends Error{constructor(e,t,a,i){super(e);this.code=t;this.migrationId=a;this.cause=i;this.name="MigrationError"}},Se=(d=>(d.INVALID_SCHEMA="INVALID_SCHEMA",d.INVALID_MIGRATION="INVALID_MIGRATION",d.CHECKSUM_MISMATCH="CHECKSUM_MISMATCH",d.TIMEOUT="TIMEOUT",d.MEMORY_LIMIT="MEMORY_LIMIT",d.CONCURRENT_OPERATION="CONCURRENT_OPERATION",d.TRANSFORM_ERROR="TRANSFORM_ERROR",d.VERSION_NOT_FOUND="VERSION_NOT_FOUND",d.CIRCULAR_DEPENDENCY="CIRCULAR_DEPENDENCY",d.STREAM_ERROR="STREAM_ERROR",d.ROLLBACK_ERROR="ROLLBACK_ERROR",d.MISSING_TRANSFORM="MISSING_TRANSFORM",d))(Se||{}),W=class r{currentSchema;history=[];migrations=[];isProcessing=!1;constructor(n,e,t){try{if(!N(n))throw new h("Invalid initial schema","INVALID_SCHEMA");if(this.currentSchema=n,e){if(!e.every(a=>K(a)))throw new h("Invalid migration configuration","INVALID_MIGRATION");this.migrations=e.sort((a,i)=>v(a.schemaVersion,i.schemaVersion))}t&&(this.history=t.sort((a,i)=>v(a.version,i.version)))}catch(a){throw a instanceof h?a:new h("Failed to initialize MigrationEngine","INVALID_SCHEMA",void 0,a)}}data(){return{schema:this.currentSchema,history:this.history,migrations:this.migrations}}async generateChecksum(n){try{let e=JSON.stringify({id:n.id,schemaVersion:n.schemaVersion,changes:n.changes,description:n.description,rollback:n.rollback,createdAt:n.createdAt});return await j(e)}catch(e){throw new h("Checksum generation failed","CHECKSUM_MISMATCH",n.id,e)}}async add(n){if(this.isProcessing)throw new h("Concurrent operation","CONCURRENT_OPERATION");if(!n.changes?.length)throw new h("Migration must include changes","INVALID_MIGRATION");try{n.changes.forEach(t=>Y(t))}catch(t){throw new h("Invalid schema changes","INVALID_MIGRATION",void 0,t)}let e={id:Date.now().toString(),schemaVersion:this.currentSchema.version,changes:n.changes,description:n.description,status:"pending",rollback:n.rollback,transform:n.transform,createdAt:new Date().toISOString(),checksum:""};e.checksum=await this.generateChecksum(e),this.migrations.push(e)}async dryRun(n,e,t){if(this.isProcessing)throw new h("Concurrent operation","CONCURRENT_OPERATION");try{this.isProcessing=!0;let a={...this.currentSchema},i=this.getRelevantMigrations(e,t),p=i.reduce((m,c)=>{let l=e==="forward"?c.changes:c.rollback||[];return this.applySchemaChanges(m,l,c.id)},a),s=await r.processMigrationList(n,e,i);return{newSchema:p,dataPreview:s}}catch(a){throw a instanceof h?a:new h("Dry run failed","INVALID_SCHEMA",void 0,a)}finally{this.isProcessing=!1}}getRelevantMigrations(n,e){return[...this.migrations].filter(t=>{let a=n==="forward"?"pending":"applied",i=e?v(t.schemaVersion,e)>=0:!0;return t.status===a&&i}).sort((t,a)=>n==="forward"?t.id.localeCompare(a.id):a.id.localeCompare(t.id))}applySchemaChanges(n,e,t){try{let a=Q(n.version,e);return e.map(p=>{try{return L(p,n)}catch(s){throw new h("Invalid schema change","INVALID_SCHEMA",t,s)}}).reduce((p,s)=>{try{return D(p,s)}catch(m){throw new h("Failed to apply patch","INVALID_SCHEMA",t,m)}},{...n,version:a})}catch(a){throw a instanceof h?a:new h("Schema update failed","INVALID_SCHEMA",t,a)}}async prepareMigration(){let n=this.migrations.filter(e=>e.status==="pending");return await this.validateMigrations(n),n}async migrate(n){if(this.isProcessing)throw new h("Concurrent operation","CONCURRENT_OPERATION");let e=await this.prepareMigration();try{this.isProcessing=!0,this.transformSchema("forward");let t=await r.processMigrationList(n,"forward",e);return this.markMigrationsApplied(e),t}finally{this.isProcessing=!1}}async validateMigrations(n){await Promise.all(n.map(async e=>{let t=await this.generateChecksum(e);if(e.checksum!==t)throw new h("Checksum mismatch","CHECKSUM_MISMATCH",e.id)}))}markMigrationsApplied(n){this.migrations=this.migrations.map(e=>n.some(t=>t.id===e.id)?{...e,status:"applied"}:e)}async rollback(n){if(this.isProcessing)throw new h("Concurrent operation","CONCURRENT_OPERATION");return this.migrations.filter(t=>t.status==="applied").slice(-1)[0]?this.rollbackToVersion(this.history[this.history.length-1]?.version||this.currentSchema.version,n):n}async rollbackToVersion(n,e){if(this.isProcessing)throw new h("Concurrent operation","CONCURRENT_OPERATION");try{let t=this.history.findIndex(s=>s.version===n);if(t===-1)throw new Error(`Version ${n} not found in history`);let a=this.migrations.filter(s=>s.schemaVersion===n&&s.status==="applied").sort((s,m)=>m.id.localeCompare(s.id)),i=this.history.length-t;if(i<0)return e;for(let s=0;s<i;s++)this.transformSchema("backward");let p=await r.processMigrationList(e,"backward",a);return this.migrations=this.migrations.map(s=>s.schemaVersion===n&&s.status==="applied"?{...s,status:"pending"}:s),p}finally{this.isProcessing=!1}}static async processMigrationList(n,e,t){return(await Promise.all(t.map(async p=>{try{let s=await this.resolveTransform(p,e);return{migration:p,transform:s}}catch(s){throw new h(`Failed to resolve transform for migration ${p.id}`,"TRANSFORM_ERROR",p.id,s)}}))).filter(p=>!!p.transform).reduce((p,{migration:s,transform:m})=>p.pipeThrough(new TransformStream({async transform(c,l){try{let f=await m(c);l.enqueue(f)}catch(f){l.error(new h(`Data transformation failed for migration ${s.id}`,"TRANSFORM_ERROR",s.id,f))}}})),n)}static async resolveTransform(n,e){return n.transform?typeof n.transform=="string"?n.transform.startsWith("http://")||n.transform.startsWith("https://")?this.resolveRemoteTransform(n.transform,e):this.resolveLocalTransform(n.transform,e):n.transform[e]:null}static async resolveRemoteTransform(n,e){try{let t=await fetch(n);if(!t.ok)throw new h(`Failed to fetch transform module: ${n}`,"TRANSFORM_ERROR",void 0);let a=await t.text();if(typeof window<"u"){let i=new Blob([a],{type:"application/javascript"});return(await import(URL.createObjectURL(i))).default[e]}else{let{runInNewContext:i}=await import("vm"),p={module:{exports:{}},console};return i(a,p,n),p.module.exports[e]}}catch(t){throw new h(`Failed to load remote transform module: ${n}`,"TRANSFORM_ERROR",void 0,t)}}static async resolveLocalTransform(n,e){try{return(await import(n)).default[e]}catch(t){throw new h(`Failed to import local transform module: ${n}`,"TRANSFORM_ERROR",void 0,t)}}transformSchema(n){try{if(n==="backward"){let t=this.history.pop();if(!t)throw new Error("No previous version");this.currentSchema=t;return}let e=this.migrations.filter(t=>t.status==="pending").flatMap(t=>t.changes);if(!e.length)return;this.history.push(structuredClone(this.currentSchema)),this.currentSchema=e.reduce((t,a)=>this.applySchemaChanges(t,[a]),this.currentSchema)}catch(e){throw e instanceof h?e:new h("Schema transformation failed","INVALID_SCHEMA",void 0,e)}}};var be=r=>{let n=[],e=[];return{addField:(t,a)=>{n.push({type:"addField",id:t,definition:a}),e.push({type:"removeField",id:t})},removeField:t=>{n.push({type:"removeField",id:t});let a=r.fields[t];a&&e.push({type:"addField",id:t,definition:a})},modifyField:(t,a)=>{n.push({type:"modifyField",id:t,changes:a});let i=r.fields[t];e.push({type:"modifyField",id:t,changes:i})},deprecateField:t=>{n.push({type:"deprecateField",id:t}),e.push({type:"modifyField",id:t,changes:{deprecated:!1}})},addIndex:t=>{n.push({type:"addIndex",definition:t}),e.push({type:"removeIndex",name:t.name})},removeIndex:t=>{n.push({type:"removeIndex",name:t});let a=r.indexes?.find(i=>i.name===t);a&&e.push({type:"addIndex",definition:a})},modifyIndex:(t,a)=>{n.push({type:"modifyIndex",name:t,changes:a});let i=r.indexes?.find(p=>p.name===t);i&&e.push({type:"modifyIndex",name:t,changes:i})},addConstraint:t=>{n.push({type:"addConstraint",constraint:t}),e.push({type:"removeConstraint",name:t.name})},removeConstraint:t=>{n.push({type:"removeConstraint",name:t});let a=r.constraints?.find(i=>"name"in i&&i.name===t);a&&e.push({type:"addConstraint",constraint:a})},modifyConstraint:(t,a)=>{n.push({type:"modifyConstraint",name:t,changes:a});let i=r.constraints?.find(p=>"name"in p&&p.name===t);i&&e.push({type:"modifyConstraint",name:t,changes:i})},changes:()=>({migrate:n,rollback:e})}};import St from"@isomorphic-git/lightning-fs";import{Buffer as ve}from"buffer";import Ct from"isomorphic-git";import Tt from"isomorphic-git/http/web";window.Buffer=ve;function Ce(r,n,e){switch(r.type){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return r.itemsType?r.itemsType==="object"&&r.nestedSchema?`${`${n}ItemsItem`}[]`:`${r.itemsType}[]`:"any[]";case"object":return r.nestedSchema?`${n}${_(e)}`:"Record<string, any>";case"dynamic":return"any";default:return"any"}}function V(r,n){let e="";for(let[t,a]of Object.entries(r))if(a.type==="object"&&a.nestedSchema){let i=`${n}${_(t)}`;e+=`
2
- export interface ${i} {
3
- ${J(a.nestedSchema,i)}
4
- }`;let p=V(a.nestedSchema,i);p&&(e+=`
5
- ${p}`)}else if(a.type==="array"&&a.itemsType==="object"&&a.nestedSchema){let i=`${n}ItemsItem`;e+=`
6
- export interface ${i} {
7
- ${J(a.nestedSchema,i)}
8
- }`;let p=V(a.nestedSchema,i);p&&(e+=`
9
- ${p}`)}return e}function J(r,n){return Object.entries(r).map(([e,t])=>{let a=[];t.description&&a.push(` /** ${t.description} */`),t.deprecated&&a.push(" /** @deprecated */");let i=t.required?"":"?",p=Ce(t,n,e);return a.push(` ${e}${i}: ${p};`),a.join(`
10
- `)}).join(`
11
- `)}function _(r){return r.charAt(0).toUpperCase()+r.slice(1)}function Ot(r){let n=_(r.name),e=`// Generated from schema version ${r.version}
12
- `;r.description&&(e+=`/** ${r.description} */
13
- `),e+=`export interface ${n} {
14
- ${J(r.fields,n)}
15
- }`;let t=V(r.fields,n);return t&&(e+=`
16
- ${t}`),e+=`
17
- `,e}function Pt(r,n){let e=[],t=s=>s===void 0?"`None`":`\`${JSON.stringify(s,null,2)}\``,a=(s=[])=>s.map(m=>`- **${m.name}**: ${m.description||""}
1
+ import{createEventBus as kt}from"@asaidimu/events";import{createEventBus as ht}from"@asaidimu/events";import{createMatcher as gt,createPaginator as wt,createProjector as St,createSorter as bt}from"@asaidimu/query";var O=class extends Error{constructor(r,t){super(r);this.operation=t;this.name="JsonPatchError"}};function U(n){let e=ve(n);return e===""?[]:e.substring(1).split("/").map(Ce)}function ve(n){return n===""||n==="/"?"":n.startsWith("/")?"/"+n.substring(1).split("/").map(G).join("/"):"/"+n.split(".").map(G).join("/")}function G(n){return n.replace(/~/g,"~0").replace(/\//g,"~1")}function Ce(n){return n.replace(/~1/g,"/").replace(/~0/g,"~")}var A=new Map;function B(n,e){let r=n;for(let t of e){if(r===null||typeof r!="object")throw new O(`Invalid path - parent not found at ${t}`);if(Array.isArray(r)){let i=t==="-"?r.length:parseInt(t);if(isNaN(i)||i<0||i>r.length)throw new O(`Invalid array index: ${t}`);r=r[i]}else{if(!r.hasOwnProperty(t))throw new O(`Property ${t} not found`);r=r[t]}}return r}function K(n,e){let r=A.get(e)||U(e);if(A.set(e,r),r.length===0)return n;let t=B(n,r.slice(0,-1)),i=r[r.length-1];if(Array.isArray(t)){let a=parseInt(i);if(isNaN(a)||a<0||a>=t.length)throw new O(`Invalid array index: ${i}`);return t[a]}return t[i]}function $e(n,e,r){let t=A.get(e)||U(e);A.set(e,t);let i=B(n,t.slice(0,-1)),a=t[t.length-1];return Array.isArray(i)?i.splice(0,i.length,...i.filter(p=>p!==r)):i[a]===r&&delete i[a],n}function H(n,e,r){let t=A.get(e)||U(e);if(A.set(e,t),t.length===0)return r;let i=t.slice(0,-1),a=t[t.length-1],p=B(n,i);if(Array.isArray(p))if(a==="-")p.push(r);else{let o=parseInt(a);if(o<0||o>p.length)throw new O(`Invalid array index: ${a}`);p.splice(o,0,r)}else p[a]=r;return n}function W(n,e){let r=A.get(e)||U(e);if(A.set(e,r),r.length===0)return;let t=B(n,r.slice(0,-1)),i=r[r.length-1];if(Array.isArray(t)){let a=parseInt(i);t.splice(a,1)}else delete t[i];return n}function Y(n,e){let r=JSON.parse(JSON.stringify(n));for(let t of e)try{switch(t.op){case"add":r=H(r,t.path,t.value);break;case"remove":r=W(r,t.path);break;case"removeValue":r=$e(r,t.path,t.value);break;case"replace":r=H(W(r,t.path),t.path,t.value);break;case"copy":{let i=K(r,t.from);r=H(r,t.path,JSON.parse(JSON.stringify(i)));break}case"move":{let i=K(r,t.from);r=H(r,t.path,i),r=W(r,t.from);break}case"test":{let i=K(r,t.path);if(JSON.stringify(i)!==JSON.stringify(t.value))throw new O("Test operation failed");break}default:throw new O(`Unsupported operation: ${t.op}`)}}catch(i){throw i instanceof O&&(i.operation=t),i}return r}function Ke(n,e){let r=[];return Q(n,e,"",r),r}function Q(n,e,r,t){if(n!==e){if(typeof n!=typeof e||Array.isArray(n)!==Array.isArray(e)){t.push({op:"replace",path:r,value:e});return}typeof n=="object"&&n!==null?Array.isArray(n)?xe(n,e,r,t):Te(n,e,r,t):n!==e&&t.push({op:"replace",path:r,value:e})}}function xe(n,e,r,t){let i=Math.max(n.length,e.length);for(let a=0;a<i;a++){let p=`${r}/${a}`;a>=n.length?t.push({op:"add",path:`${r}/-`,value:e[a]}):a>=e.length?t.push({op:"remove",path:p}):Q(n[a],e[a],p,t)}}function Te(n,e,r,t){let i=new Set,a=Object.keys(n),p=Object.keys(e);for(let o of a){let m=G(o),d=r?`${r}/${m}`:`/${m}`;e.hasOwnProperty(o)?(Q(n[o],e[o],d,t),i.add(o)):t.push({op:"remove",path:d})}for(let o of p)if(!i.has(o)){let m=G(o),d=r?`${r}/${m}`:`/${m}`;t.push({op:"add",path:d,value:e[o]})}}function ae(n,e){let r=[];switch(n.type){case"addField":r.push({op:"add",path:`/fields/${n.id}`,value:n.definition});break;case"removeField":r.push({op:"remove",path:`/fields/${n.id}`});break;case"modifyField":{let t=`/fields/${n.id}`;Object.entries(n.changes).forEach(([i,a])=>{typeof a=="object"&&a!==null&&!Array.isArray(a)?r.push({op:"replace",path:`${t}/${i}`,value:a}):r.push({op:"replace",path:`${t}/${i}`,value:a})});break}case"deprecateField":r.push({op:"add",path:`/fields/${n.id}/deprecated`,value:!0});break;case"addIndex":e.indexes||r.push({op:"add",path:"/indexes",value:[]}),r.push({op:"add",path:"/indexes/-",value:n.definition});break;case"removeIndex":{let t=e.indexes?.findIndex(i=>i.name===n.name);t!==void 0&&t>=0&&r.push({op:"remove",path:`/indexes/${t}`});break}case"modifyIndex":{let t=e.indexes?.findIndex(i=>i.name===n.name);t!==void 0&&t>=0&&Object.entries(n.changes).forEach(([i,a])=>{r.push({op:"replace",path:`/indexes/${t}/${i}`,value:a})});break}case"addConstraint":e.constraints||r.push({op:"add",path:"/constraints",value:[]}),Array.isArray(n.constraint)?n.constraint.forEach(t=>{r.push({op:"add",path:"/constraints/-",value:t})}):r.push({op:"add",path:"/constraints/-",value:n.constraint});break;case"removeConstraint":{let t=e.constraints?.findIndex(i=>Array.isArray(i)?i.some(a=>a.name===n.name):i.name===n.name);t!==void 0&&t>=0&&r.push({op:"remove",path:`/constraints/${t}`});break}case"modifyConstraint":{let t=Ee(e,n.name);t&&Object.entries(n.changes).forEach(([i,a])=>{r.push({op:"replace",path:`${t}/${i}`,value:a})});break}}return r}function Ee(n,e){if(!n.constraints)return null;for(let r=0;r<n.constraints.length;r++){let t=n.constraints[r];if(t.name===e)return`/constraints/${r}`;if(oe(t)){let i=se(t.rules,e);if(i)return`/constraints/${r}${i}`}}return null}function oe(n){return n&&"operator"in n&&"rules"in n}function se(n,e){for(let r=0;r<n.length;r++){let t=n[r];if("name"in t&&t.name===e)return`/rules/${r}`;if(oe(t)){let i=se(t.rules,e);if(i)return`/rules/${r}${i}`}}return null}function ce(n,e){let r={...n};return Z(n)&&Z(e)&&Object.keys(e).forEach(t=>{Z(e[t])?t in n?r[t]=ce(n[t],e[t]):Object.assign(r,{[t]:e[t]}):Object.assign(r,{[t]:e[t]})}),r}function Z(n){return n&&typeof n=="object"&&!Array.isArray(n)}function Re(n,e){let r=(d,h,u,f)=>{let y=[];switch(u.type){case"string":typeof d!="string"&&y.push({message:`Expected type string but received ${typeof d}.`,path:f});break;case"number":typeof d!="number"&&y.push({message:`Expected type number but received ${typeof d}.`,path:f});break;case"boolean":typeof d!="boolean"&&y.push({message:`Expected type boolean but received ${typeof d}.`,path:f});break;case"array":Array.isArray(d)?u.itemsType?d.forEach(($,k)=>{y.push(...r($,`Array: ${h}`,{name:u.name,type:u.itemsType,nestedSchema:u.nestedSchema},[...f,k]))}):y.push({message:`Expected itemsType for array ${h}`,path:f}):y.push({message:`Expected an array but received ${typeof d}.`,path:f});break;case"object":if(typeof d!="object"||d===null)y.push({message:`Expected an object but received ${d===null?"null":typeof d}.`,path:f});else if(u.nestedSchema){let $={name:u.description?`${u.description}-schema`:"nested-schema",version:"1.0",fields:u.nestedSchema};y.push(...m($,d,f))}break;case"dynamic":break;default:y.push({message:`Unknown field type: ${u.type}`,path:f});break}return y},t=(d,h,u,f)=>{let y=[];return h.constraints&&h.constraints.forEach($=>{let k=e[$.predicate];k?($.type==="schema"?k({data:u,arguments:$.parameters}):k({data:u,field:d,arguments:$.parameters}))||y.push({message:`Constraint '${$.name}' failed for field '${d}'.`,path:f}):y.push({message:`Missing predicate for constraint: ${$.name}`,path:f})}),y},i=(d,h,u,f,y)=>[...r(u,d,h,y),...t(d,h,f,y)],a=(d,h,u)=>{if("operator"in d)return p(d.operator,d.rules.map(y=>a(y,h,u)));let f=e[d.predicate];return f?d.type==="schema"?f({data:h,field:d.field,arguments:d.parameters}):f({data:h,field:u,arguments:d.parameters}):!1},p=(d,h)=>{switch(d){case"and":return h.every(Boolean);case"or":return h.some(Boolean);case"not":return h.length===1?!h[0]:!1;case"nor":return!h.some(Boolean);case"xor":return h.filter(Boolean).length===1;default:return console.error(`Unknown logical operator: ${d}`),!1}},o=d=>"operator"in d?`(${d.rules.map(o).join(` ${d.operator} `)})`:d.name,m=(d,h,u=[])=>{let f=[];for(let[y,$]of Object.entries(d.fields))$.required&&h[y]===void 0&&f.push({message:`Field '${y}' is required.`,path:[...u,y]});for(let[y,$]of Object.entries(d.fields)){let k=h[y];k!==void 0&&f.push(...i(y,$,k,h,[...u,y]))}return d.constraints&&d.constraints.forEach(y=>{a(y,h)||f.push({message:`Schema constraint failed: ${o(y)}`,path:u})}),f};return{"~standard":{version:1,vendor:"@asaidimu/anansi",validate:d=>{if(typeof d!="object"||d===null)return{issues:[{message:"Value must be a non-null object",path:[]}]};let h=m(n,d);return h.length===0?{value:d}:{issues:h}}}}}import{z as s}from"zod";var N=class extends Error{constructor(r,t){super(r);this.errors=t;this.name="SchemaValidationError"}};var de=s.enum(["and","or","not","nor","xor"]),pe=s.enum(["string","number","boolean","array","object","dynamic"]),Ie=s.enum(["normal","unique","btree","hash","spatial","fulltext","gi","expression","composite"]),ke=s.custom(()=>!0),V=s.object({type:s.string().optional(),name:s.string(),predicate:s.string().optional(),parameters:ke.optional(),description:s.string().optional(),field:s.string().optional(),errorMessage:s.string().optional()}),te=s.object({operator:de,rules:s.array(s.union([V,s.lazy(()=>te)]))}),z=s.object({name:s.string(),type:pe,required:s.boolean().optional(),constraints:s.array(V).optional(),default:s.any().optional(),itemsType:pe.optional(),nestedSchema:s.record(s.lazy(()=>z)).optional(),deprecated:s.boolean().optional(),reference:s.object({schema:s.string(),field:s.string()}).optional(),description:s.string().optional(),unique:s.boolean().optional(),metadata:s.any().optional()}),me=s.object({operator:de,field:s.string(),value:s.any().optional(),conditions:s.array(s.lazy(()=>me)).optional()}),X=s.object({fields:s.array(s.string()),type:Ie,unique:s.boolean().optional(),partial:me.optional(),description:s.string().optional(),order:s.enum(["asc","desc"]).optional(),name:s.string().optional()}),De=s.array(s.union([V,te])),Oe=s.object({name:s.string(),version:s.string(),description:s.string().optional(),fields:s.record(z),indexes:s.array(X).optional(),constraints:De.optional(),metadata:s.record(s.any()).optional(),dependencies:s.array(s.string()).optional(),migrations:s.array(s.any()).optional()}),ee=s.union([s.object({type:s.literal("addField"),id:s.string(),definition:z}),s.object({type:s.literal("removeField"),id:s.string()}),s.object({type:s.literal("modifyField"),id:s.string(),changes:z.partial()}),s.object({type:s.literal("addIndex"),definition:X}),s.object({type:s.literal("removeIndex"),name:s.string()}),s.object({type:s.literal("modifyIndex"),name:s.string(),changes:X.partial()}),s.object({type:s.literal("addConstraint"),constraint:s.union([V,te])}),s.object({type:s.literal("removeConstraint"),name:s.string()}),s.object({type:s.literal("modifyConstraint"),name:s.string(),changes:V.partial()}),s.object({type:s.literal("deprecateField"),id:s.string()})]),Me=s.object({id:s.string(),schemaVersion:s.string(),changes:s.array(ee),description:s.string(),status:s.enum(["pending","applied","failed"]),rollback:s.array(ee).optional(),transform:s.unknown(),createdAt:s.string(),checksum:s.string().optional()});function le(n){try{return Me.parse(n),!0}catch(e){throw new N("Invalid migration definition",e)}}function fe(n){try{return ee.parse(n),!0}catch(e){throw new N("Invalid schema definition",e)}}function ne(n){try{return Oe.parse(n),!0}catch(e){throw new N("Invalid schema definition",e)}}var nt=ne;var M=async n=>{if(typeof window<"u"&&crypto.subtle){let r=new TextEncoder().encode(n),t=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(t)).map(a=>a.toString(16).padStart(2,"0")).join("")}else{let{createHash:e}=await import("crypto");return e("sha256").update(n).digest("hex")}};function Fe(n){let e=n.match(/^(\d+)\.(\d+)\.(\d+)$/);if(!e)throw new Error(`Invalid version format: ${n}. Expected format: major.minor.patch`);return{major:parseInt(e[1],10),minor:parseInt(e[2],10),patch:parseInt(e[3],10)}}function Ae(n,e){if(e&&"field"in n&&n.field){let r=e.fields[n.field];if(r)return r.type}if("parameters"in n){let r=n.parameters;if(r instanceof RegExp||Array.isArray(r)&&typeof r[0]=="string")return"string";if(typeof r=="number"||Array.isArray(r)&&typeof r[0]=="number")return"number";if(typeof r=="boolean")return"boolean";if(typeof r=="object"&&r!==null){if("minItems"in r||"maxItems"in r)return"array";if("schema"in r)return"object"}}}function Pe(n){return n.required===!0||n.type!==void 0||n.itemsType!==void 0||n.nestedSchema!==void 0||n.reference!==void 0||n.unique===!0}function je(n,e,r){switch(r){case"string":if(n instanceof RegExp&&e instanceof RegExp)return n.source!==e.source;if(Array.isArray(n)&&Array.isArray(e))return e.length<n.length||!n.every(t=>e.includes(t));break;case"number":if(typeof n=="object"&&typeof e=="object"&&"precision"in n&&"precision"in e)return e.precision<n.precision||(e.scale??0)<(n.scale??0);if(Array.isArray(n)&&Array.isArray(e))return e.length<n.length||!n.every(t=>e.includes(t));break;case"array":if(typeof n=="object"&&typeof e=="object"&&"minItems"in n&&"maxItems"in n&&"minItems"in e&&"maxItems"in e)return e.minItems>n.minItems||e.maxItems<n.maxItems;break;case"object":if(typeof n=="object"&&typeof e=="object"&&"schema"in n&&"schema"in e)return Object.keys(e.schema).length>Object.keys(n.schema).length;break}return!1}function Ne(n,e){let r={or:1,xor:2,and:3,not:4,nor:4};return!!(e.operator&&r[e.operator]>r[n.operator]||e.rules&&e.rules.length>n.rules.length)}function Ve(n,e,r){if(!e)return!0;if("rules"in e&&"rules"in n)return Ne(e,n);if("predicate"in n&&n.predicate!==void 0)return!0;if("parameters"in n&&n.parameters!==void 0){let t=Ae(e,r);return t?je(e.parameters,n.parameters,t):!0}return!1}function Je(n,e){switch(n.type){case"removeField":case"removeIndex":return"major";case"modifyField":return Pe(n.changes)?"major":n.changes.deprecated?"minor":"patch";case"modifyIndex":return n.changes.unique!==void 0||n.changes.fields!==void 0?"major":"minor";case"addConstraint":return"major";case"removeConstraint":return"minor";case"modifyConstraint":let r=e?.constraints?.find(t=>"name"in t&&t.name===n.name);return Ve(n.changes,r,e)?"major":"minor";case"addField":case"addIndex":case"deprecateField":return"minor";default:throw new Error(`Unhandled change type: ${JSON.stringify(n)}`)}}function _e(n){let e=new Set,r=new Set,t=new Set,i=new Set;for(let a of n)switch(a.type){case"addField":if(r.has(a.id))throw new Error(`Cannot add previously removed field: ${a.id}`);if(e.has(a.id))throw new Error(`Cannot add already modified field: ${a.id}`);if(i.has(a.id))throw new Error(`Cannot add deprecated field: ${a.id}`);t.add(a.id);break;case"removeField":if(t.has(a.id))throw new Error(`Cannot remove newly added field: ${a.id}`);if(e.has(a.id))throw new Error(`Cannot remove modified field: ${a.id}`);if(i.has(a.id))throw new Error(`Cannot remove field that is being deprecated: ${a.id}`);r.add(a.id);break;case"modifyField":if(r.has(a.id))throw new Error(`Cannot modify removed field: ${a.id}`);if(t.has(a.id))throw new Error(`Cannot modify newly added field: ${a.id}`);if(i.has(a.id))throw new Error(`Cannot modify field that is being deprecated: ${a.id}`);e.add(a.id);break;case"deprecateField":if(r.has(a.id))throw new Error(`Cannot deprecate removed field: ${a.id}`);if(t.has(a.id))throw new Error(`Cannot deprecate newly added field: ${a.id}`);if(e.has(a.id))throw new Error(`Cannot deprecate modified field: ${a.id}`);i.add(a.id);break}}function Le(n){let e=new Set,r=new Set,t=new Set;for(let i of n)switch(i.type){case"addConstraint":let a=i.constraint,p=("name"in a,a.name);if(r.has(p))throw new Error(`Cannot add previously removed constraint: ${p}`);if(e.has(p))throw new Error(`Cannot add already modified constraint: ${p}`);t.add(p);break;case"removeConstraint":if(t.has(i.name))throw new Error(`Cannot remove newly added constraint: ${i.name}`);if(e.has(i.name))throw new Error(`Cannot remove modified constraint: ${i.name}`);r.add(i.name);break;case"modifyConstraint":if(r.has(i.name))throw new Error(`Cannot modify removed constraint: ${i.name}`);if(t.has(i.name))throw new Error(`Cannot modify newly added constraint: ${i.name}`);e.add(i.name);break}}function ue(n,e,r){if(e.length===0)throw new Error("No changes provided");_e(e),Le(e);let t=Fe(n),i="patch";for(let a of e){let p=Je(a,r);if(p==="major"){i="major";break}else p==="minor"&&i==="patch"&&(i="minor")}switch(i){case"major":return`${t.major+1}.0.0`;case"minor":return`${t.major}.${t.minor+1}.0`;case"patch":return`${t.major}.${t.minor}.${t.patch+1}`}}function F(n,e){let r=d=>d.split(".").map(h=>parseInt(h,10)||0),[t,i,a]=r(n),[p,o,m]=r(e);return t-p||i-o||a-m}function at(n){return n.sort(F)}var S=class extends Error{constructor(r,t,i,a){super(r);this.code=t;this.migrationId=i;this.cause=a;this.name="MigrationError"}},He=(f=>(f.INVALID_SCHEMA="INVALID_SCHEMA",f.INVALID_MIGRATION="INVALID_MIGRATION",f.CHECKSUM_MISMATCH="CHECKSUM_MISMATCH",f.TIMEOUT="TIMEOUT",f.MEMORY_LIMIT="MEMORY_LIMIT",f.CONCURRENT_OPERATION="CONCURRENT_OPERATION",f.TRANSFORM_ERROR="TRANSFORM_ERROR",f.VERSION_NOT_FOUND="VERSION_NOT_FOUND",f.CIRCULAR_DEPENDENCY="CIRCULAR_DEPENDENCY",f.STREAM_ERROR="STREAM_ERROR",f.ROLLBACK_ERROR="ROLLBACK_ERROR",f.MISSING_TRANSFORM="MISSING_TRANSFORM",f))(He||{}),he=class n{currentSchema;history=[];migrations=[];isProcessing=!1;constructor(e,r,t){try{if(!ne(e))throw new S("Invalid initial schema","INVALID_SCHEMA");if(this.currentSchema=e,r){if(!r.every(i=>le(i)))throw new S("Invalid migration configuration","INVALID_MIGRATION");this.migrations=r.sort((i,a)=>F(i.schemaVersion,a.schemaVersion))}t&&(this.history=t.sort((i,a)=>F(i.version,a.version)))}catch(i){throw i instanceof S?i:new S("Failed to initialize MigrationEngine","INVALID_SCHEMA",void 0,i)}}data(){return{schema:this.currentSchema,history:this.history,migrations:this.migrations}}async generateChecksum(e){try{let r=JSON.stringify({id:e.id,schemaVersion:e.schemaVersion,changes:e.changes,description:e.description,rollback:e.rollback,createdAt:e.createdAt});return await M(r)}catch(r){throw new S("Checksum generation failed","CHECKSUM_MISMATCH",e.id,r)}}async add(e){if(this.isProcessing)throw new S("Concurrent operation","CONCURRENT_OPERATION");if(!e.changes?.length)throw new S("Migration must include changes","INVALID_MIGRATION");try{e.changes.forEach(t=>fe(t))}catch(t){throw new S("Invalid schema changes","INVALID_MIGRATION",void 0,t)}let r={id:Date.now().toString(),schemaVersion:this.currentSchema.version,changes:e.changes,description:e.description,status:"pending",rollback:e.rollback,transform:e.transform,createdAt:new Date().toISOString(),checksum:""};r.checksum=await this.generateChecksum(r),this.migrations.push(r)}async dryRun(e,r,t){if(this.isProcessing)throw new S("Concurrent operation","CONCURRENT_OPERATION");try{this.isProcessing=!0;let i={...this.currentSchema},a=this.getRelevantMigrations(r,t),p=a.reduce((m,d)=>{let h=r==="forward"?d.changes:d.rollback||[];return this.applySchemaChanges(m,h,d.id)},i),o=await n.processMigrationList(e,r,a);return{newSchema:p,dataPreview:o}}catch(i){throw i instanceof S?i:new S("Dry run failed","INVALID_SCHEMA",void 0,i)}finally{this.isProcessing=!1}}getRelevantMigrations(e,r){return[...this.migrations].filter(t=>{let i=e==="forward"?"pending":"applied",a=r?F(t.schemaVersion,r)>=0:!0;return t.status===i&&a}).sort((t,i)=>e==="forward"?t.id.localeCompare(i.id):i.id.localeCompare(t.id))}applySchemaChanges(e,r,t){try{let i=ue(e.version,r);return r.map(p=>{try{return ae(p,e)}catch(o){throw new S("Invalid schema change","INVALID_SCHEMA",t,o)}}).reduce((p,o)=>{try{return Y(p,o)}catch(m){throw new S("Failed to apply patch","INVALID_SCHEMA",t,m)}},{...e,version:i})}catch(i){throw i instanceof S?i:new S("Schema update failed","INVALID_SCHEMA",t,i)}}async prepareMigration(){let e=this.migrations.filter(r=>r.status==="pending");return await this.validateMigrations(e),e}async migrate(e){if(this.isProcessing)throw new S("Concurrent operation","CONCURRENT_OPERATION");let r=await this.prepareMigration();try{this.isProcessing=!0,this.transformSchema("forward");let t=await n.processMigrationList(e,"forward",r);return this.markMigrationsApplied(r),t}finally{this.isProcessing=!1}}async validateMigrations(e){await Promise.all(e.map(async r=>{let t=await this.generateChecksum(r);if(r.checksum!==t)throw new S("Checksum mismatch","CHECKSUM_MISMATCH",r.id)}))}markMigrationsApplied(e){this.migrations=this.migrations.map(r=>e.some(t=>t.id===r.id)?{...r,status:"applied"}:r)}async rollback(e){if(this.isProcessing)throw new S("Concurrent operation","CONCURRENT_OPERATION");return this.migrations.filter(t=>t.status==="applied").slice(-1)[0]?this.rollbackToVersion(this.history[this.history.length-1]?.version||this.currentSchema.version,e):e}async rollbackToVersion(e,r){if(this.isProcessing)throw new S("Concurrent operation","CONCURRENT_OPERATION");try{let t=this.history.findIndex(o=>o.version===e);if(t===-1)throw new Error(`Version ${e} not found in history`);let i=this.migrations.filter(o=>o.schemaVersion===e&&o.status==="applied").sort((o,m)=>m.id.localeCompare(o.id)),a=this.history.length-t;if(a<0)return r;for(let o=0;o<a;o++)this.transformSchema("backward");let p=await n.processMigrationList(r,"backward",i);return this.migrations=this.migrations.map(o=>o.schemaVersion===e&&o.status==="applied"?{...o,status:"pending"}:o),p}finally{this.isProcessing=!1}}static async processMigrationList(e,r,t){return(await Promise.all(t.map(async p=>{try{let o=await this.resolveTransform(p,r);return{migration:p,transform:o}}catch(o){throw new S(`Failed to resolve transform for migration ${p.id}`,"TRANSFORM_ERROR",p.id,o)}}))).filter(p=>!!p.transform).reduce((p,{migration:o,transform:m})=>p.pipeThrough(new TransformStream({async transform(d,h){try{let u=await m(d);h.enqueue(u)}catch(u){h.error(new S(`Data transformation failed for migration ${o.id}`,"TRANSFORM_ERROR",o.id,u))}}})),e)}static async resolveTransform(e,r){return e.transform?typeof e.transform=="string"?e.transform.startsWith("http://")||e.transform.startsWith("https://")?this.resolveRemoteTransform(e.transform,r):this.resolveLocalTransform(e.transform,r):e.transform[r]:null}static async resolveRemoteTransform(e,r){try{let t=await fetch(e);if(!t.ok)throw new S(`Failed to fetch transform module: ${e}`,"TRANSFORM_ERROR",void 0);let i=await t.text();if(typeof window<"u"){let a=new Blob([i],{type:"application/javascript"});return(await import(URL.createObjectURL(a))).default[r]}else{let{runInNewContext:a}=await import("vm"),p={module:{exports:{}},console};return a(i,p,e),p.module.exports[r]}}catch(t){throw new S(`Failed to load remote transform module: ${e}`,"TRANSFORM_ERROR",void 0,t)}}static async resolveLocalTransform(e,r){try{return(await import(e)).default[r]}catch(t){throw new S(`Failed to import local transform module: ${e}`,"TRANSFORM_ERROR",void 0,t)}}transformSchema(e){try{if(e==="backward"){let t=this.history.pop();if(!t)throw new Error("No previous version");this.currentSchema=t;return}let r=this.migrations.filter(t=>t.status==="pending").flatMap(t=>t.changes);if(!r.length)return;this.history.push(structuredClone(this.currentSchema)),this.currentSchema=r.reduce((t,i)=>this.applySchemaChanges(t,[i]),this.currentSchema)}catch(r){throw r instanceof S?r:new S("Schema transformation failed","INVALID_SCHEMA",void 0,r)}}};var Ge=n=>{let e=[],r=[];return{addField:(t,i)=>{e.push({type:"addField",id:t,definition:i}),r.push({type:"removeField",id:t})},removeField:t=>{e.push({type:"removeField",id:t});let i=n.fields[t];i&&r.push({type:"addField",id:t,definition:i})},modifyField:(t,i)=>{e.push({type:"modifyField",id:t,changes:i});let a=n.fields[t];r.push({type:"modifyField",id:t,changes:a})},deprecateField:t=>{e.push({type:"deprecateField",id:t}),r.push({type:"modifyField",id:t,changes:{deprecated:!1}})},addIndex:t=>{e.push({type:"addIndex",definition:t}),r.push({type:"removeIndex",name:t.name})},removeIndex:t=>{e.push({type:"removeIndex",name:t});let i=n.indexes?.find(a=>a.name===t);i&&r.push({type:"addIndex",definition:i})},modifyIndex:(t,i)=>{e.push({type:"modifyIndex",name:t,changes:i});let a=n.indexes?.find(p=>p.name===t);a&&r.push({type:"modifyIndex",name:t,changes:a})},addConstraint:t=>{e.push({type:"addConstraint",constraint:t}),r.push({type:"removeConstraint",name:t.name})},removeConstraint:t=>{e.push({type:"removeConstraint",name:t});let i=n.constraints?.find(a=>"name"in a&&a.name===t);i&&r.push({type:"addConstraint",constraint:i})},modifyConstraint:(t,i)=>{e.push({type:"modifyConstraint",name:t,changes:i});let a=n.constraints?.find(p=>"name"in p&&p.name===t);a&&r.push({type:"modifyConstraint",name:t,changes:a})},changes:()=>({migrate:e,rollback:r})}};import Ue from"@isomorphic-git/lightning-fs";import{Buffer as Be}from"buffer";import l from"isomorphic-git";import j from"isomorphic-git/http/web";async function ye({token:n,repoConfig:e}){try{let r=await fetch("https://api.github.com/user/repos",{method:"POST",headers:{"X-GitHub-Api-Version":"2022-11-28",Accept:"application/vnd.github+json",Authorization:`Bearer ${n}`,"Content-Type":"application/json"},body:JSON.stringify(e),redirect:"follow"});if(!r.ok)throw new Error(`HTTP error! status: ${r.status}`);return await r.json()}catch(r){throw console.error("Error creating repository:",r),r}}function re(n){let e=n.toString(),r=e.substring(e.indexOf("(")+1,e.indexOf(")")),t=e.substring(e.indexOf("{")+1,e.lastIndexOf("}")).trim();return JSON.stringify({params:r,body:t})}function ge(n){let{params:e,body:r}=JSON.parse(n),t=Object.getPrototypeOf(function*(){}).constructor;return new t(e,r)}function J(n){let e=n.toString(),r=e.substring(e.indexOf("(")+1,e.indexOf(")")),t=e.substring(e.indexOf("{")+1,e.lastIndexOf("}")).trim();return JSON.stringify({params:r,body:t})}function _(n){let{params:e,body:r}=JSON.parse(n);return new Function(e,r)}function P(n,e,r){let t=new URL(n);return t.username=e,t.password=r,t.toString()}window.Buffer=Be;async function Ht(n,e="/registry",r="https://cors.isomorphic-git.org"){let t=new Ue(e),i=t.promises,a="main";async function p(){await i.mkdir(e),await l.init({fs:t,dir:e,defaultBranch:a}),await i.writeFile(`${e}/registry.json`,JSON.stringify({schemas:{},created:new Date().toISOString(),updated:new Date().toISOString()})),await l.add({fs:t,dir:e,filepath:"registry.json"}),await i.writeFile(`${e}/registry.lock`,JSON.stringify({hashes:[],updated:new Date().toISOString()})),await l.add({fs:t,dir:e,filepath:"registry.lock"}),await l.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:"initial commit"}),await ye({token:n.password,repoConfig:{name:n.repository,private:!0}}),await l.addRemote({fs:t,dir:e,remote:"origin",url:`https://github.com/${n.username}/${n.repository}.git`}),await l.push({fs:t,dir:e,http:j,remote:"origin",url:P(`https://github.com/${n.username}/${n.repository}.git`,n.username,n.password),corsProxy:r,ref:a,onAuth:()=>({username:n.username,password:n.password})})}async function o(){await l.clone({fs:t,dir:e,http:j,corsProxy:r,url:P(`https://github.com/${n.username}/${n.repository}.git`,n.username,n.password),onAuth:()=>({username:n.username}),singleBranch:!0,depth:1})}async function m(c){await l.branch({fs:t,dir:e,ref:c.name,checkout:!0});let v=[c.name,`${c.name}/migrations`];for(let g of v)await i.mkdir(`${e}/${g}`);let x=await Promise.all((c.migrations||[]).map(async g=>{let w={...g};return g.transform&&typeof g.transform!="string"&&(w.transform={forward:J(g.transform.forward),backward:J(g.transform.backward)}),w=JSON.stringify(w),{hash:await M(w),checksum:g.checksum,content:w,id:g.id}}));await i.writeFile(`${e}/${c.name}/migrations/.nomedia`,"");for(let{hash:g,content:w}of x)await i.writeFile(`${e}/${c.name}/migrations/${g}.json`,w);let E=JSON.stringify({...c,migrations:[],mock:c.mock?re(c.mock):null}),C=await M(E);await i.writeFile(`${e}/${c.name}/schema.json`,E);let b={schema:c.name,version:c.version,history:[{version:c.version,hash:C,date:new Date().toISOString(),description:c.description||"",migrations:x.map(({id:g})=>g),changelog:[],predicates:[]}],migrations:x.reduce((g,{hash:w,checksum:R,id:L})=>(g[L]={hash:w,checksum:R},g),{})};await i.writeFile(`${e}/${c.name}/index.json`,JSON.stringify(b)),await l.add({fs:t,dir:e,filepath:c.name}),await l.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`chore: created schema: ${c.name}`}),await l.tag({fs:t,dir:e,ref:`${c.name}-${c.version}`}),await l.push({fs:t,http:j,dir:e,corsProxy:r,remote:"origin",ref:c.name,url:P(`https://github.com/${n.username}/${n.repository}.git`,n.username,n.password),onAuth:()=>({username:n.username,password:n.password})}),await l.checkout({fs:t,dir:e,ref:a}),await l.merge({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},theirs:`${c.name}`,message:`add schema: ${c.name}`}),await l.checkout({fs:t,dir:e,ref:a});let I=JSON.parse((await i.readFile(`${e}/registry.json`)).toString());I.updated=new Date().toISOString(),I.schemas[c.name]={name:c.name,version:c.version,description:c.description||"",created:new Date().toISOString(),updated:new Date().toISOString()},await i.writeFile(`${e}/registry.json`,JSON.stringify(I));let T=(await l.listFiles({fs:t,dir:e})).filter(g=>g!=="registry.lock"),D=await Promise.all(T.map(async g=>[g,await M(g)]));await i.writeFile(`${e}/registry.lock`,JSON.stringify({updated:new Date().toISOString(),hashes:D})),await l.add({fs:t,dir:e,filepath:"registry.lock"}),await l.add({fs:t,dir:e,filepath:"registry.json"}),await l.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`fix: created schema: ${c.name}`}),await $(!1)}async function d(c){await l.checkout({fs:t,dir:e,ref:c.name}),await l.pull({fs:t,dir:e,http:j,remote:"origin",corsProxy:r,ref:c.name,author:{name:"bot",email:"bot@registry.domain"},fastForwardOnly:!0,url:P(`https://github.com/${n.username}/${n.repository}.git`,n.username,n.password),onAuth:()=>({username:n.username,password:n.password})});let v=await Promise.all((c.migrations||[]).map(async w=>{let R={...w};return w.transform&&typeof w.transform!="string"&&(R.transform={forward:J(w.transform.forward),backward:J(w.transform.backward)}),R=JSON.stringify(R),{hash:await M(R),checksum:w.checksum,content:R,id:w.id}}));for(let{hash:w,content:R}of v)await i.writeFile(`${e}/${c.name}/migrations/${w}.json`,R);let x=JSON.stringify({...c,migrations:[],mock:c.mock?re(c.mock):null}),E=await M(x);await i.writeFile(`${e}/${c.name}/schema.json`,x);let C=`${e}/${c.name}/index.json`,b=JSON.parse((await i.readFile(C)).toString()),I={version:c.version,hash:E,date:new Date().toISOString(),description:c.description||"",migrations:v.map(({id:w})=>w),changelog:[],predicates:[]};b.history.push(I),b.migrations={...b.migrations,...v.reduce((w,{hash:R,checksum:L,id:be})=>(w[be]={hash:R,checksum:L},w),{})},await i.writeFile(C,JSON.stringify(b)),await l.add({fs:t,dir:e,filepath:c.name}),await l.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`chore: updated schema: ${c.name} to version ${c.version}`}),await l.tag({fs:t,dir:e,ref:`${c.name}-${c.version}`}),await l.push({fs:t,http:j,dir:e,corsProxy:r,remote:"origin",ref:a,url:P(`https://github.com/${n.username}/${n.repository}.git`,n.username,n.password),onAuth:()=>({username:n.username,password:n.password})}),await l.checkout({fs:t,dir:e,ref:a}),await l.merge({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},theirs:`${c.name}`,message:`update schema: ${c.name} to version ${c.version}`});let T=JSON.parse((await i.readFile(`${e}/registry.json`)).toString());T.updated=new Date().toISOString(),T.schemas[c.name]={name:c.name,version:c.version,description:c.description||"",created:T.schemas[c.name]?.created||new Date().toISOString(),updated:new Date().toISOString()},await i.writeFile(`${e}/registry.json`,JSON.stringify(T));let D=(await l.listFiles({fs:t,dir:e})).filter(w=>w!=="registry.lock"),g=await Promise.all(D.map(async w=>[w,await M(w)]));await i.writeFile(`${e}/registry.lock`,JSON.stringify({updated:new Date().toISOString(),hashes:g})),await l.add({fs:t,dir:e,filepath:"registry.lock"}),await l.add({fs:t,dir:e,filepath:"registry.json"}),await l.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`fix: updated schema: ${c.name} to version ${c.version}`}),await l.checkout({fs:t,dir:e,ref:a}),await $(!1)}async function h(c){await l.checkout({fs:t,dir:e,ref:a,force:!0}),await l.deleteBranch({fs:t,dir:e,ref:c});let v=JSON.parse((await i.readFile(`${e}/registry.json`)).toString());delete v.schemas[c],v.updated=new Date().toISOString(),await i.writeFile(`${e}/registry.json`,JSON.stringify(v));let x=(await l.listFiles({fs:t,dir:e})).filter(C=>C!=="registry.lock"),E=await Promise.all(x.map(async C=>[C,await M(C)]));await i.writeFile(`${e}/registry.lock`,JSON.stringify({updated:new Date().toISOString(),hashes:E})),await l.add({fs:t,dir:e,filepath:"registry.json"}),await l.add({fs:t,dir:e,filepath:"registry.lock"}),await l.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`chore: deleted schema: ${c}`})}async function u(){await l.checkout({fs:t,dir:e,ref:a,force:!0});let c=JSON.parse((await i.readFile(`${e}/registry.json`)).toString());return Object.entries(c.schemas).map(([x,{version:E}])=>({name:x,version:E}))}async function f(c,v,x=!1){if(await l.checkout({fs:t,dir:e,ref:a,force:!0}),!JSON.parse((await i.readFile(`${e}/registry.json`)).toString()).schemas[c])return null;let C=c;v&&(C=await l.resolveRef({fs:t,dir:e,ref:`${c}-${v}`})),await l.checkout({fs:t,dir:e,ref:C,force:!0});let b=JSON.parse((await i.readFile(`${e}/${c}/schema.json`)).toString());if(b.mock&&(b.mock=ge(b.mock)),x){let I=await Promise.all((await i.readdir(`${e}/${c}/migrations`)).filter(T=>T!==".nomedia").map(async T=>(await i.readFile(`${e}/${c}/migrations/${T}`)).toString()));b.migrations=I.map(T=>{let D=JSON.parse(T);return D.transform={forward:_(D.transform.forward),backward:_(D.transform.backward)},D})}return await l.checkout({fs:t,dir:e,ref:a,force:!0}),b}async function y(c){return await l.checkout({fs:t,dir:e,ref:a,force:!0}),JSON.parse(c?(await i.readFile(`${e}/${c}/index.json`)).toString():(await i.readFile(`${e}/registry.json`)).toString())}async function $(c=!0){c&&await l.pull({fs:t,dir:e,http:j,remote:"origin",corsProxy:r,ref:a,author:{name:"bot",email:"bot@registry.domain"},fastForwardOnly:!0,url:P(`https://github.com/${n.username}/${n.repository}.git`,n.username,n.password),onAuth:()=>({username:n.username,password:n.password})}),await l.push({fs:t,http:j,dir:e,corsProxy:r,remote:"origin",ref:a,url:P(`https://github.com/${n.username}/${n.repository}.git`,n.username,n.password),onAuth:()=>({username:n.username,password:n.password})})}async function k(c,v){throw new Error("predicates not implemented")}async function ie(c,v){await l.checkout({fs:t,dir:e,ref:a,force:!0});let x=JSON.parse((await i.readFile(`${e}/registry.json`)).toString());if(!x.schemas[c])return[];let E=v||x.schemas[c].version,C=JSON.parse((await i.readFile(`${e}/${c}/index.json`)).toString()),b=[];for(let I of Object.keys(C.migrations)){let{hash:T}=C.migrations[I],D=`${e}/${c}/migrations/${T}.json`,g=JSON.parse((await i.readFile(D)).toString());F(g.schemaVersion,E)<=0&&(g.transform={forward:_(g.transform.forward),backward:_(g.transform.backward)},b.push(g))}return b.sort((I,T)=>F(I.schemaVersion,T.schemaVersion))}async function Se(c){if(await l.checkout({fs:t,dir:e,ref:a,force:!0}),!JSON.parse((await i.readFile(`${e}/registry.json`)).toString()).schemas[c])return[];let x=JSON.parse((await i.readFile(`${e}/${c}/index.json`)).toString()),E=[];for(let C of x.history){let b=await f(c,C.version,!0);b&&E.push(b)}return E.sort((C,b)=>F(C.version,b.version))}return{init:p,clone:o,create:m,update:d,delete:h,list:u,schema:f,stats:y,sync:$,predicates:k,migrations:ie,history:Se}}function qt(n,e=!0,r=!0){let t="",i=new Map,a=o=>!e||!o?"":`/**
2
+ * ${o}
3
+ */
4
+ `;ze(n,i);for(let[o,m]of i.entries()){if(o===n.name)continue;t+=a(m.description),t+=`${r?"export ":""}type ${o} = {
5
+ `;for(let[h,u]of Object.entries(m.fields)){u.description&&e&&(t+=` /**
6
+ * ${u.description}
7
+ */
8
+ `),u.deprecated&&(t+=` /** @deprecated */
9
+ `);let f=we(u,o,i),y=u.required===!1?"?":"";t+=` ${h}${y}: ${f};
10
+ `}t+=`};
11
+
12
+ `}t+=a(n.description);let p=r?"export ":"";t+=`${p}type ${n.name} = {
13
+ `;for(let[o,m]of Object.entries(n.fields)){m.description&&e&&(t+=` /**
14
+ * ${m.description}
15
+ */
16
+ `),m.deprecated&&(t+=` /** @deprecated */
17
+ `);let d=we(m,n.name,i),h=m.required===!1?"?":"";t+=` ${o}${h}: ${d};
18
+ `}if(t+=`};
19
+
20
+ `,n.indexes&&n.indexes.length>0){t+=a(`Available indexes for ${n.name}`),t+=`${p}enum ${n.name}IndexNames {
21
+ `;for(let o of n.indexes)t+=` ${o.name} = "${o.name}",
22
+ `;t+=`}
23
+
24
+ `}return t}function ze(n,e){e.set(n.name,{fields:n.fields,description:n.description});function r(t,i){for(let[a,p]of Object.entries(t)){if(p.type==="object"&&p.nestedSchema){let o=`${i}${q(a)}`;e.set(o,{fields:p.nestedSchema,description:p.description}),r(p.nestedSchema,o)}if(p.type==="array"&&p.itemsType==="object"&&p.nestedSchema){let o=`${i}${q(a)}`;e.set(o,{fields:p.nestedSchema,description:`Item type for ${a} array in ${i}`}),r(p.nestedSchema,o)}}}r(n.fields,n.name)}function we(n,e,r){switch(n.type){case"string":if(n.constraints){let t=n.constraints.find(i=>i.predicate==="enum"||i.predicate==="oneOf");if(t&&Array.isArray(t.parameters))return t.parameters.map(i=>typeof i=="string"?`"${i}"`:String(i)).join(" | ")}return"string";case"number":return"number";case"boolean":return"boolean";case"array":if(n.itemsType)if(n.itemsType==="object"&&n.nestedSchema){let t=qe(n.name);return`Array<${`${e}${q(t)}`}>`}else return`${n.itemsType}[]`;return"any[]";case"object":return n.nestedSchema?`${e}${q(n.name)}`:n.reference?n.reference.schema:"Record<string, any>";case"dynamic":return"any";default:return"any"}}function q(n){return n.split(/[-_\s]/).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join("")}function qe(n){let e={people:"person",children:"child",geese:"goose",mice:"mouse",men:"man",women:"woman",teeth:"tooth",feet:"foot"};return e[n]?e[n]:n.endsWith("ies")?n.slice(0,-3)+"y":n.endsWith("ses")||n.endsWith("xes")||n.endsWith("ches")||n.endsWith("shes")||n.endsWith("zzes")?n.slice(0,-2):n.endsWith("s")&&n.length>1&&!n.endsWith("ss")?n.slice(0,-1):n}function Kt(n,e=!0){let t=`${e?"export ":""}interface ${n.name}Validator {
25
+ `;return t+=` /**
26
+ * Validates a ${n.name} object against all schema constraints
27
+ * @param data The data to validate
28
+ * @returns Validation result with any errors
29
+ */
30
+ `,t+=` validate(data: ${n.name}): { valid: boolean; errors: Array<{ field: string; message: string }> };
31
+
32
+ `,t+=` /**
33
+ * Checks if the given object conforms to the ${n.name} type structure
34
+ * @param data The object to check
35
+ * @returns Whether the object matches the expected structure
36
+ */
37
+ `,t+=` isType(data: any): data is ${n.name};
38
+ `,t+=`}
39
+ `,t}function Yt(n,e){let r=[],t=o=>o===void 0?"`None`":`\`${JSON.stringify(o,null,2)}\``,i=(o=[])=>o.map(m=>`- **${m.name}**: ${m.description||""}
18
40
  - Parameters: ${JSON.stringify(m.parameters)}
19
41
  - Error: ${m.errorMessage||"None"}`).join(`
20
- `),i=s=>{let m=`**${s.field}** ${s.operator}`;return s.value!==void 0&&(m+=` ${JSON.stringify(s.value)}`),s.conditions&&(m+=` [
21
- ${s.conditions.map(c=>` ${i(c)}`).join(`
42
+ `),a=o=>{let m=`**${o.field}** ${o.operator}`;return o.value!==void 0&&(m+=` ${JSON.stringify(o.value)}`),o.conditions&&(m+=` [
43
+ ${o.conditions.map(d=>` ${a(d)}`).join(`
22
44
  `)}
23
- ]`),m},p=(s,m=1)=>{let c="#".repeat(m+2);return Object.entries(s).map(([l,f])=>{let d=`${c} ${l} (${f.type})
45
+ ]`),m},p=(o,m=1)=>{let d="#".repeat(m+2);return Object.entries(o).map(([h,u])=>{let f=`${d} ${h} (${u.type})
24
46
 
25
- `;return d+=`**Required:** ${f.required?"Yes":"No"}
47
+ `;return f+=`**Required:** ${u.required?"Yes":"No"}
26
48
 
27
- `,f.description&&(d+=`**Description:** ${f.description}
49
+ `,u.description&&(f+=`**Description:** ${u.description}
28
50
 
29
- `),f.itemsType&&(d+=`**Item Type:** ${f.itemsType}
51
+ `),u.itemsType&&(f+=`**Item Type:** ${u.itemsType}
30
52
 
31
- `),f.nestedSchema&&(d+=p(f.nestedSchema,m+1)),d}).join(`
32
- `)};e.push(`# ${r.name} Schema (Version ${r.version})`),r.description&&e.push(`
33
- ${r.description}
34
- `),e.push("## Metadata"),e.push(`- **Dependencies:** ${r.dependencies?.join(", ")||"None"}`),e.push(`- **Created:** ${new Date().toISOString()}
35
- `),e.push(`## Fields
36
- `),e.push("| Name | Type | Required | Default | Description | Deprecated | Unique | Constraints |"),e.push("|------|------|----------|---------|-------------|------------|--------|-------------|");for(let[s,m]of Object.entries(r.fields))e.push([s,m.type,m.required?"Yes":"No",t(m.default),m.description?.replace(/\n/g," ")||"",m.deprecated?"Yes":"No",m.unique?"Yes":"No",m.constraints?.length||0].join("|"));Object.entries(r.fields).forEach(([s,m])=>{m.nestedSchema&&(e.push(`
37
- ### Nested Schema: ${s}
38
- `),e.push(p(m.nestedSchema)))}),e.push(`
53
+ `),u.nestedSchema&&(f+=p(u.nestedSchema,m+1)),f}).join(`
54
+ `)};r.push(`# ${n.name} Schema (Version ${n.version})`),n.description&&r.push(`
55
+ ${n.description}
56
+ `),r.push("## Metadata"),r.push(`- **Dependencies:** ${n.dependencies?.join(", ")||"None"}`),r.push(`- **Created:** ${new Date().toISOString()}
57
+ `),r.push(`## Fields
58
+ `),r.push("| Name | Type | Required | Default | Description | Deprecated | Unique | Constraints |"),r.push("|------|------|----------|---------|-------------|------------|--------|-------------|");for(let[o,m]of Object.entries(n.fields))r.push([o,m.type,m.required?"Yes":"No",t(m.default),m.description?.replace(/\n/g," ")||"",m.deprecated?"Yes":"No",m.unique?"Yes":"No",m.constraints?.length||0].join("|"));Object.entries(n.fields).forEach(([o,m])=>{m.nestedSchema&&(r.push(`
59
+ ### Nested Schema: ${o}
60
+ `),r.push(p(m.nestedSchema)))}),r.push(`
39
61
  ## Indexes
40
- `),e.push("| Name | Type | Fields | Unique | Order | Partial Condition | Description |"),e.push("|------|------|--------|--------|-------|-------------------|-------------|");for(let s of r.indexes||[])e.push([s.name,s.type,s.fields.join(", "),s.unique?"Yes":"No",s.order||"asc",s.partial?i(s.partial):"None",s.description||""].join("|"));e.push(`
62
+ `),r.push("| Name | Type | Fields | Unique | Order | Partial Condition | Description |"),r.push("|------|------|--------|--------|-------|-------------------|-------------|");for(let o of n.indexes||[])r.push([o.name,o.type,o.fields.join(", "),o.unique?"Yes":"No",o.order||"asc",o.partial?a(o.partial):"None",o.description||""].join("|"));r.push(`
41
63
  ## Constraints
42
- `),r.constraints&&e.push("### Schema-level Constraints"),e.push(`
64
+ `),n.constraints&&r.push("### Schema-level Constraints"),r.push(`
43
65
  ## Migrations
44
- `),e.push("| ID | Description | Status | Changes |"),e.push("|----|-------------|--------|---------|");for(let s of r.migrations||[])e.push([s.id,s.description,s.status,s.changes.length].join("|"));if(r.mock&&n?.faker)try{let s=r.mock(n.faker).next().value;e.push("\n## Example Data\n```json\n"+JSON.stringify(s,null,2)+"\n```")}catch{e.push(`
45
- <!-- Error generating mock data -->`)}return e.join(`
46
- `)}export{g as JsonPatchError,W as MigrationEngine,h as MigrationError,Se as MigrationErrorCode,pe as MigrationSchema,D as applyPatch,Q as calculateNextVersion,v as compareSemanticVersions,Te as createPatch,be as createSchemaMigrationHelper,ae as createStandardSchemaValidator,U as deepMerge,Pt as docgen,j as generateSHA256Hash,Z as normalizePath,L as schemaChangeToPatch,Ot as schemaToTypes,Ae as sortSemanticVars,Me as validate,K as validateMigration,Y as validateSchemaChange,N as validateSchemaDefinition};
66
+ `),r.push("| ID | Description | Status | Changes |"),r.push("|----|-------------|--------|---------|");for(let o of n.migrations||[])r.push([o.id,o.description,o.status,o.changes.length].join("|"));if(n.mock&&e?.faker)try{let o=n.mock(e.faker).next().value;r.push("\n## Example Data\n```json\n"+JSON.stringify(o,null,2)+"\n```")}catch{r.push(`
67
+ <!-- Error generating mock data -->`)}return r.join(`
68
+ `)}export{O as JsonPatchError,he as MigrationEngine,S as MigrationError,He as MigrationErrorCode,Me as MigrationSchema,Y as applyPatch,ue as calculateNextVersion,F as compareSemanticVersions,Ke as createPatch,Ht as createRegistry,Ge as createSchemaMigrationHelper,Re as createStandardSchemaValidator,ce as deepMerge,Yt as docgen,M as generateSHA256Hash,Kt as generateValidationInterface,ve as normalizePath,ae as schemaChangeToPatch,qt as schemaToTypes,at as sortSemanticVars,nt as validate,le as validateMigration,fe as validateSchemaChange,ne as validateSchemaDefinition};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asaidimu/anansi",
3
- "version": "1.2.4",
3
+ "version": "1.3.1",
4
4
  "description": "A toolkit for advanced data modelling",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",