@asaidimu/anansi 1.2.3 → 1.2.4
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 +12 -12
- package/index.d.cts +114 -112
- package/index.d.ts +114 -112
- package/index.js +12 -12
- package/package.json +1 -1
package/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var ce=Object.create;var T=Object.defineProperty;var pe=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var de=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 me(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(de(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 d=E(s),c=e?`${e}/${d}`:`/${d}`;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 d=E(s),c=e?`${e}/${d}`:`/${d}`;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.name}`,value:r.definition});break;case"removeField":e.push({op:"remove",path:`/fields/${r.name}`});break;case"modifyField":{let n=`/fields/${r.name}`;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.name}/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,m)=>{let u=[];switch(f.type){case"string":typeof c!="string"&&u.push({message:`Expected type string but received ${typeof c}.`,path:m});break;case"number":typeof c!="number"&&u.push({message:`Expected type number but received ${typeof c}.`,path:m});break;case"boolean":typeof c!="boolean"&&u.push({message:`Expected type boolean but received ${typeof c}.`,path:m});break;case"array":Array.isArray(c)?f.itemsType?c.forEach((y,w)=>{u.push(...e(y,`Array: ${l}`,{type:f.itemsType,nestedSchema:f.nestedSchema},[...m,w]))}):u.push({message:`Expected itemsType for array ${l}`,path:m}):u.push({message:`Expected an array but received ${typeof c}.`,path:m});break;case"object":if(typeof c!="object"||c===null)u.push({message:`Expected an object but received ${c===null?"null":typeof c}.`,path:m});else if(f.nestedSchema){let y={name:f.description?`${f.description}-schema`:"nested-schema",version:"1.0",fields:f.nestedSchema};u.push(...d(y,c,m))}break;case"dynamic":break;default:u.push({message:`Unknown field type: ${f.type}`,path:m});break}return u},n=(c,l,f,m)=>{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:m}):u.push({message:`Missing predicate for constraint: ${y.name}`,path:m})}),u},a=(c,l,f,m,u)=>[...e(f,c,l,u),...n(c,l,m,u)],i=(c,l,f)=>{if("operator"in c)return p(c.operator,c.rules.map(u=>i(u,l,f)));let m=t[c.predicate];return m?c.type==="schema"?m({data:l,field:c.field,arguments:c.parameters}):m({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,d=(c,l,f=[])=>{let m=[];for(let[u,y]of Object.entries(c.fields))y.required&&l[u]===void 0&&m.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&&m.push(...a(u,y,w,l,[...f,u]))}return c.constraints&&c.constraints.forEach(u=>{i(u,l)||m.push({message:`Schema constraint failed: ${s(u)}`,path:f})}),m};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=d(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({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()}),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"),name:o.z.string(),definition:D}),o.z.object({type:o.z.literal("removeField"),name:o.z.string()}),o.z.object({type:o.z.literal("modifyField"),name: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"),name: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.name))throw new Error(`Cannot add previously removed field: ${i.name}`);if(t.has(i.name))throw new Error(`Cannot add already modified field: ${i.name}`);if(a.has(i.name))throw new Error(`Cannot add deprecated field: ${i.name}`);n.add(i.name);break;case"removeField":if(n.has(i.name))throw new Error(`Cannot remove newly added field: ${i.name}`);if(t.has(i.name))throw new Error(`Cannot remove modified field: ${i.name}`);if(a.has(i.name))throw new Error(`Cannot remove field that is being deprecated: ${i.name}`);e.add(i.name);break;case"modifyField":if(e.has(i.name))throw new Error(`Cannot modify removed field: ${i.name}`);if(n.has(i.name))throw new Error(`Cannot modify newly added field: ${i.name}`);if(a.has(i.name))throw new Error(`Cannot modify field that is being deprecated: ${i.name}`);t.add(i.name);break;case"deprecateField":if(e.has(i.name))throw new Error(`Cannot deprecate removed field: ${i.name}`);if(n.has(i.name))throw new Error(`Cannot deprecate newly added field: ${i.name}`);if(t.has(i.name))throw new Error(`Cannot deprecate modified field: ${i.name}`);a.add(i.name);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,d]=e(t);return n-p||a-s||i-d}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=(m=>(m.INVALID_SCHEMA="INVALID_SCHEMA",m.INVALID_MIGRATION="INVALID_MIGRATION",m.CHECKSUM_MISMATCH="CHECKSUM_MISMATCH",m.TIMEOUT="TIMEOUT",m.MEMORY_LIMIT="MEMORY_LIMIT",m.CONCURRENT_OPERATION="CONCURRENT_OPERATION",m.TRANSFORM_ERROR="TRANSFORM_ERROR",m.VERSION_NOT_FOUND="VERSION_NOT_FOUND",m.CIRCULAR_DEPENDENCY="CIRCULAR_DEPENDENCY",m.STREAM_ERROR="STREAM_ERROR",m.ROLLBACK_ERROR="ROLLBACK_ERROR",m.MISSING_TRANSFORM="MISSING_TRANSFORM",m))(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((d,c)=>{let l=e==="forward"?c.changes:c.rollback||[];return this.applySchemaChanges(d,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(d){throw new h("Failed to apply patch","INVALID_SCHEMA",n,d)}},{...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,d)=>d.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:d})=>p.pipeThrough(new TransformStream({async transform(c,l){try{let f=await d(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",name:n,definition:a}),e.push({type:"removeField",name:n})},removeField:n=>{t.push({type:"removeField",name:n});let a=r.fields[n];a&&e.push({type:"addField",name:n,definition:a})},modifyField:(n,a)=>{t.push({type:"modifyField",name:n,changes:a});let i=r.fields[n];e.push({type:"modifyField",name:n,changes:i})},deprecateField:n=>{t.push({type:"deprecateField",name:n}),e.push({type:"modifyField",name: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+=`
|
|
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
2
|
export interface ${i} {
|
|
3
3
|
${K(a.nestedSchema,i)}
|
|
4
4
|
}`;let p=q(a.nestedSchema,i);p&&(e+=`
|
|
@@ -14,28 +14,28 @@ ${p}`)}return e}function K(r,t){return Object.entries(r).map(([e,n])=>{let a=[];
|
|
|
14
14
|
${K(r.fields,t)}
|
|
15
15
|
}`;let n=q(r.fields,t);return n&&(e+=`
|
|
16
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(
|
|
18
|
-
- Parameters: ${JSON.stringify(
|
|
19
|
-
- Error: ${
|
|
20
|
-
`),i=s=>{let
|
|
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||""}
|
|
18
|
+
- Parameters: ${JSON.stringify(m.parameters)}
|
|
19
|
+
- 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
21
|
${s.conditions.map(c=>` ${i(c)}`).join(`
|
|
22
22
|
`)}
|
|
23
|
-
]`),
|
|
23
|
+
]`),m},p=(s,m=1)=>{let c="#".repeat(m+2);return Object.entries(s).map(([l,f])=>{let d=`${c} ${l} (${f.type})
|
|
24
24
|
|
|
25
|
-
`;return
|
|
25
|
+
`;return d+=`**Required:** ${f.required?"Yes":"No"}
|
|
26
26
|
|
|
27
|
-
`,f.description&&(
|
|
27
|
+
`,f.description&&(d+=`**Description:** ${f.description}
|
|
28
28
|
|
|
29
|
-
`),f.itemsType&&(
|
|
29
|
+
`),f.itemsType&&(d+=`**Item Type:** ${f.itemsType}
|
|
30
30
|
|
|
31
|
-
`),f.nestedSchema&&(
|
|
31
|
+
`),f.nestedSchema&&(d+=p(f.nestedSchema,m+1)),d}).join(`
|
|
32
32
|
`)};e.push(`# ${r.name} Schema (Version ${r.version})`),r.description&&e.push(`
|
|
33
33
|
${r.description}
|
|
34
34
|
`),e.push("## Metadata"),e.push(`- **Dependencies:** ${r.dependencies?.join(", ")||"None"}`),e.push(`- **Created:** ${new Date().toISOString()}
|
|
35
35
|
`),e.push(`## Fields
|
|
36
|
-
`),e.push("| Name | Type | Required | Default | Description | Deprecated | Unique | Constraints |"),e.push("|------|------|----------|---------|-------------|------------|--------|-------------|");for(let[s,
|
|
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
37
|
### Nested Schema: ${s}
|
|
38
|
-
`),e.push(p(
|
|
38
|
+
`),e.push(p(m.nestedSchema)))}),e.push(`
|
|
39
39
|
## Indexes
|
|
40
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(`
|
|
41
41
|
## Constraints
|