@asaidimu/anansi 1.3.0 → 1.3.2
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 +60 -38
- package/index.d.cts +79 -57
- package/index.d.ts +79 -57
- package/index.js +60 -38
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -1,46 +1,68 @@
|
|
|
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(n,t){super(n);this.operation=t;this.name="JsonPatchError"}};function U(r){let e=Ce(r);return e===""?[]:e.substring(1).split("/").map($e)}function Ce(r){return r===""||r==="/"?"":r.startsWith("/")?"/"+r.substring(1).split("/").map(G).join("/"):"/"+r.split(".").map(G).join("/")}function G(r){return r.replace(/~/g,"~0").replace(/\//g,"~1")}function $e(r){return r.replace(/~1/g,"/").replace(/~0/g,"~")}var F=new Map;function B(r,e){let n=r;for(let t of e){if(n===null||typeof n!="object")throw new O(`Invalid path - parent not found at ${t}`);if(Array.isArray(n)){let a=t==="-"?n.length:parseInt(t);if(isNaN(a)||a<0||a>n.length)throw new O(`Invalid array index: ${t}`);n=n[a]}else{if(!n.hasOwnProperty(t))throw new O(`Property ${t} not found`);n=n[t]}}return n}function q(r,e){let n=F.get(e)||U(e);if(F.set(e,n),n.length===0)return r;let t=B(r,n.slice(0,-1)),a=n[n.length-1];if(Array.isArray(t)){let i=parseInt(a);if(isNaN(i)||i<0||i>=t.length)throw new O(`Invalid array index: ${a}`);return t[i]}return t[a]}function Te(r,e,n){let t=F.get(e)||U(e);F.set(e,t);let a=B(r,t.slice(0,-1)),i=t[t.length-1];return Array.isArray(a)?a.splice(0,a.length,...a.filter(m=>m!==n)):a[i]===n&&delete a[i],r}function H(r,e,n){let t=F.get(e)||U(e);if(F.set(e,t),t.length===0)return n;let a=t.slice(0,-1),i=t[t.length-1],m=B(r,a);if(Array.isArray(m))if(i==="-")m.push(n);else{let s=parseInt(i);if(s<0||s>m.length)throw new O(`Invalid array index: ${i}`);m.splice(s,0,n)}else m[i]=n;return r}function K(r,e){let n=F.get(e)||U(e);if(F.set(e,n),n.length===0)return;let t=B(r,n.slice(0,-1)),a=n[n.length-1];if(Array.isArray(t)){let i=parseInt(a);t.splice(i,1)}else delete t[a];return r}function Y(r,e){let n=JSON.parse(JSON.stringify(r));for(let t of e)try{switch(t.op){case"add":n=H(n,t.path,t.value);break;case"remove":n=K(n,t.path);break;case"removeValue":n=Te(n,t.path,t.value);break;case"replace":n=H(K(n,t.path),t.path,t.value);break;case"copy":{let a=q(n,t.from);n=H(n,t.path,JSON.parse(JSON.stringify(a)));break}case"move":{let a=q(n,t.from);n=H(n,t.path,a),n=K(n,t.from);break}case"test":{let a=q(n,t.path);if(JSON.stringify(a)!==JSON.stringify(t.value))throw new O("Test operation failed");break}default:throw new O(`Unsupported operation: ${t.op}`)}}catch(a){throw a instanceof O&&(a.operation=t),a}return n}function Ke(r,e){let n=[];return Q(r,e,"",n),n}function Q(r,e,n,t){if(r!==e){if(typeof r!=typeof e||Array.isArray(r)!==Array.isArray(e)){t.push({op:"replace",path:n,value:e});return}typeof r=="object"&&r!==null?Array.isArray(r)?xe(r,e,n,t):Ee(r,e,n,t):r!==e&&t.push({op:"replace",path:n,value:e})}}function xe(r,e,n,t){let a=Math.max(r.length,e.length);for(let i=0;i<a;i++){let m=`${n}/${i}`;i>=r.length?t.push({op:"add",path:`${n}/-`,value:e[i]}):i>=e.length?t.push({op:"remove",path:m}):Q(r[i],e[i],m,t)}}function Ee(r,e,n,t){let a=new Set,i=Object.keys(r),m=Object.keys(e);for(let s of i){let f=G(s),p=n?`${n}/${f}`:`/${f}`;e.hasOwnProperty(s)?(Q(r[s],e[s],p,t),a.add(s)):t.push({op:"remove",path:p})}for(let s of m)if(!a.has(s)){let f=G(s),p=n?`${n}/${f}`:`/${f}`;t.push({op:"add",path:p,value:e[s]})}}function se(r,e){let n=[];switch(r.type){case"addField":n.push({op:"add",path:`/fields/${r.id}`,value:r.definition});break;case"removeField":n.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)?n.push({op:"replace",path:`${t}/${a}`,value:i}):n.push({op:"replace",path:`${t}/${a}`,value:i})});break}case"deprecateField":n.push({op:"add",path:`/fields/${r.id}/deprecated`,value:!0});break;case"addIndex":e.indexes||n.push({op:"add",path:"/indexes",value:[]}),n.push({op:"add",path:"/indexes/-",value:r.definition});break;case"removeIndex":{let t=e.indexes?.findIndex(a=>a.name===r.name);t!==void 0&&t>=0&&n.push({op:"remove",path:`/indexes/${t}`});break}case"modifyIndex":{let t=e.indexes?.findIndex(a=>a.name===r.name);t!==void 0&&t>=0&&Object.entries(r.changes).forEach(([a,i])=>{n.push({op:"replace",path:`/indexes/${t}/${a}`,value:i})});break}case"addConstraint":e.constraints||n.push({op:"add",path:"/constraints",value:[]}),Array.isArray(r.constraint)?r.constraint.forEach(t=>{n.push({op:"add",path:"/constraints/-",value:t})}):n.push({op:"add",path:"/constraints/-",value:r.constraint});break;case"removeConstraint":{let t=e.constraints?.findIndex(a=>Array.isArray(a)?a.some(i=>i.name===r.name):a.name===r.name);t!==void 0&&t>=0&&n.push({op:"remove",path:`/constraints/${t}`});break}case"modifyConstraint":{let t=Ie(e,r.name);t&&Object.entries(r.changes).forEach(([a,i])=>{n.push({op:"replace",path:`${t}/${a}`,value:i})});break}}return n}function Ie(r,e){if(!r.constraints)return null;for(let n=0;n<r.constraints.length;n++){let t=r.constraints[n];if(t.name===e)return`/constraints/${n}`;if(ce(t)){let a=pe(t.rules,e);if(a)return`/constraints/${n}${a}`}}return null}function ce(r){return r&&"operator"in r&&"rules"in r}function pe(r,e){for(let n=0;n<r.length;n++){let t=r[n];if("name"in t&&t.name===e)return`/rules/${n}`;if(ce(t)){let a=pe(t.rules,e);if(a)return`/rules/${n}${a}`}}return null}function me(r,e){let n={...r};return W(r)&&W(e)&&Object.keys(e).forEach(t=>{W(e[t])?t in r?n[t]=me(r[t],e[t]):Object.assign(n,{[t]:e[t]}):Object.assign(n,{[t]:e[t]})}),n}function W(r){return r&&typeof r=="object"&&!Array.isArray(r)}function Re(r,e){let n=(p,u,h,l)=>{let y=[];switch(h.type){case"string":typeof p!="string"&&y.push({message:`Expected type string but received ${typeof p}.`,path:l});break;case"number":typeof p!="number"&&y.push({message:`Expected type number but received ${typeof p}.`,path:l});break;case"boolean":typeof p!="boolean"&&y.push({message:`Expected type boolean but received ${typeof p}.`,path:l});break;case"array":Array.isArray(p)?h.itemsType?p.forEach(($,k)=>{y.push(...n($,`Array: ${u}`,{name:h.name,type:h.itemsType,nestedSchema:h.nestedSchema},[...l,k]))}):y.push({message:`Expected itemsType for array ${u}`,path:l}):y.push({message:`Expected an array but received ${typeof p}.`,path:l});break;case"object":if(typeof p!="object"||p===null)y.push({message:`Expected an object but received ${p===null?"null":typeof p}.`,path:l});else if(h.nestedSchema){let $={name:h.description?`${h.description}-schema`:"nested-schema",version:"1.0",fields:h.nestedSchema};y.push(...f($,p,l))}break;case"dynamic":break;default:y.push({message:`Unknown field type: ${h.type}`,path:l});break}return y},t=(p,u,h,l)=>{let y=[];return u.constraints&&u.constraints.forEach($=>{let k=e[$.predicate];k?($.type==="schema"?k({data:h,arguments:$.parameters}):k({data:h,field:p,arguments:$.parameters}))||y.push({message:`Constraint '${$.name}' failed for field '${p}'.`,path:l}):y.push({message:`Missing predicate for constraint: ${$.name}`,path:l})}),y},a=(p,u,h,l,y)=>[...n(h,p,u,y),...t(p,u,l,y)],i=(p,u,h)=>{if("operator"in p)return m(p.operator,p.rules.map(y=>i(y,u,h)));let l=e[p.predicate];return l?p.type==="schema"?l({data:u,field:p.field,arguments:p.parameters}):l({data:u,field:h,arguments:p.parameters}):!1},m=(p,u)=>{switch(p){case"and":return u.every(Boolean);case"or":return u.some(Boolean);case"not":return u.length===1?!u[0]:!1;case"nor":return!u.some(Boolean);case"xor":return u.filter(Boolean).length===1;default:return console.error(`Unknown logical operator: ${p}`),!1}},s=p=>"operator"in p?`(${p.rules.map(s).join(` ${p.operator} `)})`:p.name,f=(p,u,h=[])=>{let l=[];for(let[y,$]of Object.entries(p.fields))$.required&&u[y]===void 0&&l.push({message:`Field '${y}' is required.`,path:[...h,y]});for(let[y,$]of Object.entries(p.fields)){let k=u[y];k!==void 0&&l.push(...a(y,$,k,u,[...h,y]))}return p.constraints&&p.constraints.forEach(y=>{i(y,u)||l.push({message:`Schema constraint failed: ${s(y)}`,path:h})}),l};return{"~standard":{version:1,vendor:"@asaidimu/anansi",validate:p=>{if(typeof p!="object"||p===null)return{issues:[{message:"Value must be a non-null object",path:[]}]};let u=f(r,p);return u.length===0?{value:p}:{issues:u}}}}}import{z as o}from"zod";var j=class extends Error{constructor(n,t){super(n);this.errors=t;this.name="SchemaValidationError"}};var le=o.enum(["and","or","not","nor","xor"]),de=o.enum(["string","number","boolean","array","object","dynamic"]),ke=o.enum(["normal","unique","btree","hash","spatial","fulltext","gi","expression","composite"]),De=o.custom(()=>!0),V=o.object({type:o.string().optional(),name:o.string(),predicate:o.string().optional(),parameters:De.optional(),description:o.string().optional(),field:o.string().optional(),errorMessage:o.string().optional()}),ee=o.object({operator:le,rules:o.array(o.union([V,o.lazy(()=>ee)]))}),z=o.object({name:o.string(),type:de,required:o.boolean().optional(),constraints:o.array(V).optional(),default:o.any().optional(),itemsType:de.optional(),nestedSchema:o.record(o.lazy(()=>z)).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()}),fe=o.object({operator:le,field:o.string(),value:o.any().optional(),conditions:o.array(o.lazy(()=>fe)).optional()}),Z=o.object({fields:o.array(o.string()),type:ke,unique:o.boolean().optional(),partial:fe.optional(),description:o.string().optional(),order:o.enum(["asc","desc"]).optional(),name:o.string().optional()}),Oe=o.array(o.union([V,ee])),Me=o.object({name:o.string(),version:o.string(),description:o.string().optional(),fields:o.record(z),indexes:o.array(Z).optional(),constraints:Oe.optional(),metadata:o.record(o.any()).optional(),dependencies:o.array(o.string()).optional(),migrations:o.array(o.any()).optional()}),X=o.union([o.object({type:o.literal("addField"),id:o.string(),definition:z}),o.object({type:o.literal("removeField"),id:o.string()}),o.object({type:o.literal("modifyField"),id:o.string(),changes:z.partial()}),o.object({type:o.literal("addIndex"),definition:Z}),o.object({type:o.literal("removeIndex"),name:o.string()}),o.object({type:o.literal("modifyIndex"),name:o.string(),changes:Z.partial()}),o.object({type:o.literal("addConstraint"),constraint:o.union([V,ee])}),o.object({type:o.literal("removeConstraint"),name:o.string()}),o.object({type:o.literal("modifyConstraint"),name:o.string(),changes:V.partial()}),o.object({type:o.literal("deprecateField"),id:o.string()})]),Pe=o.object({id:o.string(),schemaVersion:o.string(),changes:o.array(X),description:o.string(),status:o.enum(["pending","applied","failed"]),rollback:o.array(X).optional(),transform:o.unknown(),createdAt:o.string(),checksum:o.string().optional()});function ue(r){try{return Pe.parse(r),!0}catch(e){throw new j("Invalid migration definition",e)}}function he(r){try{return X.parse(r),!0}catch(e){throw new j("Invalid schema definition",e)}}function te(r){try{return Me.parse(r),!0}catch(e){throw new j("Invalid schema definition",e)}}var nt=te;var M=async r=>{if(typeof window<"u"&&crypto.subtle){let n=new TextEncoder().encode(r),t=await crypto.subtle.digest("SHA-256",n);return Array.from(new Uint8Array(t)).map(i=>i.toString(16).padStart(2,"0")).join("")}else{let{createHash:e}=await import("crypto");return e("sha256").update(r).digest("hex")}};function Fe(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)$/);if(!e)throw new Error(`Invalid version format: ${r}. Expected format: major.minor.patch`);return{major:parseInt(e[1],10),minor:parseInt(e[2],10),patch:parseInt(e[3],10)}}function Ae(r,e){if(e&&"field"in r&&r.field){let n=e.fields[r.field];if(n)return n.type}if("parameters"in r){let n=r.parameters;if(n instanceof RegExp||Array.isArray(n)&&typeof n[0]=="string")return"string";if(typeof n=="number"||Array.isArray(n)&&typeof n[0]=="number")return"number";if(typeof n=="boolean")return"boolean";if(typeof n=="object"&&n!==null){if("minItems"in n||"maxItems"in n)return"array";if("schema"in n)return"object"}}}function Ne(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 je(r,e,n){switch(n){case"string":if(r instanceof RegExp&&e instanceof RegExp)return r.source!==e.source;if(Array.isArray(r)&&Array.isArray(e))return e.length<r.length||!r.every(t=>e.includes(t));break;case"number":if(typeof r=="object"&&typeof e=="object"&&"precision"in r&&"precision"in e)return e.precision<r.precision||(e.scale??0)<(r.scale??0);if(Array.isArray(r)&&Array.isArray(e))return e.length<r.length||!r.every(t=>e.includes(t));break;case"array":if(typeof r=="object"&&typeof e=="object"&&"minItems"in r&&"maxItems"in r&&"minItems"in e&&"maxItems"in e)return e.minItems>r.minItems||e.maxItems<r.maxItems;break;case"object":if(typeof r=="object"&&typeof e=="object"&&"schema"in r&&"schema"in e)return Object.keys(e.schema).length>Object.keys(r.schema).length;break}return!1}function Ve(r,e){let n={or:1,xor:2,and:3,not:4,nor:4};return!!(e.operator&&n[e.operator]>n[r.operator]||e.rules&&e.rules.length>r.rules.length)}function Je(r,e,n){if(!e)return!0;if("rules"in e&&"rules"in r)return Ve(e,r);if("predicate"in r&&r.predicate!==void 0)return!0;if("parameters"in r&&r.parameters!==void 0){let t=Ae(e,n);return t?je(e.parameters,r.parameters,t):!0}return!1}function _e(r,e){switch(r.type){case"removeField":case"removeIndex":return"major";case"modifyField":return Ne(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 n=e?.constraints?.find(t=>"name"in t&&t.name===r.name);return Je(r.changes,n,e)?"major":"minor";case"addField":case"addIndex":case"deprecateField":return"minor";default:throw new Error(`Unhandled change type: ${JSON.stringify(r)}`)}}function Le(r){let e=new Set,n=new Set,t=new Set,a=new Set;for(let i of r)switch(i.type){case"addField":if(n.has(i.id))throw new Error(`Cannot add previously removed field: ${i.id}`);if(e.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(e.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}`);n.add(i.id);break;case"modifyField":if(n.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}`);e.add(i.id);break;case"deprecateField":if(n.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(e.has(i.id))throw new Error(`Cannot deprecate modified field: ${i.id}`);a.add(i.id);break}}function He(r){let e=new Set,n=new Set,t=new Set;for(let a of r)switch(a.type){case"addConstraint":let i=a.constraint,m=("name"in i,i.name);if(n.has(m))throw new Error(`Cannot add previously removed constraint: ${m}`);if(e.has(m))throw new Error(`Cannot add already modified constraint: ${m}`);t.add(m);break;case"removeConstraint":if(t.has(a.name))throw new Error(`Cannot remove newly added constraint: ${a.name}`);if(e.has(a.name))throw new Error(`Cannot remove modified constraint: ${a.name}`);n.add(a.name);break;case"modifyConstraint":if(n.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}`);e.add(a.name);break}}function ye(r,e,n){if(e.length===0)throw new Error("No changes provided");Le(e),He(e);let t=Fe(r),a="patch";for(let i of e){let m=_e(i,n);if(m==="major"){a="major";break}else m==="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 P(r,e){let n=p=>p.split(".").map(u=>parseInt(u,10)||0),[t,a,i]=n(r),[m,s,f]=n(e);return t-m||a-s||i-f}function it(r){return r.sort(P)}var S=class extends Error{constructor(n,t,a,i){super(n);this.code=t;this.migrationId=a;this.cause=i;this.name="MigrationError"}},Ge=(l=>(l.INVALID_SCHEMA="INVALID_SCHEMA",l.INVALID_MIGRATION="INVALID_MIGRATION",l.CHECKSUM_MISMATCH="CHECKSUM_MISMATCH",l.TIMEOUT="TIMEOUT",l.MEMORY_LIMIT="MEMORY_LIMIT",l.CONCURRENT_OPERATION="CONCURRENT_OPERATION",l.TRANSFORM_ERROR="TRANSFORM_ERROR",l.VERSION_NOT_FOUND="VERSION_NOT_FOUND",l.CIRCULAR_DEPENDENCY="CIRCULAR_DEPENDENCY",l.STREAM_ERROR="STREAM_ERROR",l.ROLLBACK_ERROR="ROLLBACK_ERROR",l.MISSING_TRANSFORM="MISSING_TRANSFORM",l))(Ge||{}),ge=class r{currentSchema;history=[];migrations=[];isProcessing=!1;constructor(e,n,t){try{if(!te(e))throw new S("Invalid initial schema","INVALID_SCHEMA");if(this.currentSchema=e,n){if(!n.every(a=>ue(a)))throw new S("Invalid migration configuration","INVALID_MIGRATION");this.migrations=n.sort((a,i)=>P(a.schemaVersion,i.schemaVersion))}t&&(this.history=t.sort((a,i)=>P(a.version,i.version)))}catch(a){throw a instanceof S?a:new S("Failed to initialize MigrationEngine","INVALID_SCHEMA",void 0,a)}}data(){return{schema:this.currentSchema,history:this.history,migrations:this.migrations}}async generateChecksum(e){try{let n=JSON.stringify({id:e.id,schemaVersion:e.schemaVersion,changes:e.changes,description:e.description,rollback:e.rollback,createdAt:e.createdAt});return await M(n)}catch(n){throw new S("Checksum generation failed","CHECKSUM_MISMATCH",e.id,n)}}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=>he(t))}catch(t){throw new S("Invalid schema changes","INVALID_MIGRATION",void 0,t)}let n={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:""};n.checksum=await this.generateChecksum(n),this.migrations.push(n)}async dryRun(e,n,t){if(this.isProcessing)throw new S("Concurrent operation","CONCURRENT_OPERATION");try{this.isProcessing=!0;let a={...this.currentSchema},i=this.getRelevantMigrations(n,t),m=i.reduce((f,p)=>{let u=n==="forward"?p.changes:p.rollback||[];return this.applySchemaChanges(f,u,p.id)},a),s=await r.processMigrationList(e,n,i);return{newSchema:m,dataPreview:s}}catch(a){throw a instanceof S?a:new S("Dry run failed","INVALID_SCHEMA",void 0,a)}finally{this.isProcessing=!1}}getRelevantMigrations(e,n){return[...this.migrations].filter(t=>{let a=e==="forward"?"pending":"applied",i=n?P(t.schemaVersion,n)>=0:!0;return t.status===a&&i}).sort((t,a)=>e==="forward"?t.id.localeCompare(a.id):a.id.localeCompare(t.id))}applySchemaChanges(e,n,t){try{let a=ye(e.version,n);return n.map(m=>{try{return se(m,e)}catch(s){throw new S("Invalid schema change","INVALID_SCHEMA",t,s)}}).reduce((m,s)=>{try{return Y(m,s)}catch(f){throw new S("Failed to apply patch","INVALID_SCHEMA",t,f)}},{...e,version:a})}catch(a){throw a instanceof S?a:new S("Schema update failed","INVALID_SCHEMA",t,a)}}async prepareMigration(){let e=this.migrations.filter(n=>n.status==="pending");return await this.validateMigrations(e),e}async migrate(e){if(this.isProcessing)throw new S("Concurrent operation","CONCURRENT_OPERATION");let n=await this.prepareMigration();try{this.isProcessing=!0,this.transformSchema("forward");let t=await r.processMigrationList(e,"forward",n);return this.markMigrationsApplied(n),t}finally{this.isProcessing=!1}}async validateMigrations(e){await Promise.all(e.map(async n=>{let t=await this.generateChecksum(n);if(n.checksum!==t)throw new S("Checksum mismatch","CHECKSUM_MISMATCH",n.id)}))}markMigrationsApplied(e){this.migrations=this.migrations.map(n=>e.some(t=>t.id===n.id)?{...n,status:"applied"}:n)}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,n){if(this.isProcessing)throw new S("Concurrent operation","CONCURRENT_OPERATION");try{let t=this.history.findIndex(s=>s.version===e);if(t===-1)throw new Error(`Version ${e} not found in history`);let a=this.migrations.filter(s=>s.schemaVersion===e&&s.status==="applied").sort((s,f)=>f.id.localeCompare(s.id)),i=this.history.length-t;if(i<0)return n;for(let s=0;s<i;s++)this.transformSchema("backward");let m=await r.processMigrationList(n,"backward",a);return this.migrations=this.migrations.map(s=>s.schemaVersion===e&&s.status==="applied"?{...s,status:"pending"}:s),m}finally{this.isProcessing=!1}}static async processMigrationList(e,n,t){return(await Promise.all(t.map(async m=>{try{let s=await this.resolveTransform(m,n);return{migration:m,transform:s}}catch(s){throw new S(`Failed to resolve transform for migration ${m.id}`,"TRANSFORM_ERROR",m.id,s)}}))).filter(m=>!!m.transform).reduce((m,{migration:s,transform:f})=>m.pipeThrough(new TransformStream({async transform(p,u){try{let h=await f(p);u.enqueue(h)}catch(h){u.error(new S(`Data transformation failed for migration ${s.id}`,"TRANSFORM_ERROR",s.id,h))}}})),e)}static async resolveTransform(e,n){return e.transform?typeof e.transform=="string"?e.transform.startsWith("http://")||e.transform.startsWith("https://")?this.resolveRemoteTransform(e.transform,n):this.resolveLocalTransform(e.transform,n):e.transform[n]:null}static async resolveRemoteTransform(e,n){try{let t=await fetch(e);if(!t.ok)throw new S(`Failed to fetch transform module: ${e}`,"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[n]}else{let{runInNewContext:i}=await import("vm"),m={module:{exports:{}},console};return i(a,m,e),m.module.exports[n]}}catch(t){throw new S(`Failed to load remote transform module: ${e}`,"TRANSFORM_ERROR",void 0,t)}}static async resolveLocalTransform(e,n){try{return(await import(e)).default[n]}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 n=this.migrations.filter(t=>t.status==="pending").flatMap(t=>t.changes);if(!n.length)return;this.history.push(structuredClone(this.currentSchema)),this.currentSchema=n.reduce((t,a)=>this.applySchemaChanges(t,[a]),this.currentSchema)}catch(n){throw n instanceof S?n:new S("Schema transformation failed","INVALID_SCHEMA",void 0,n)}}};var Ue=r=>{let e=[],n=[];return{addField:(t,a)=>{e.push({type:"addField",id:t,definition:a}),n.push({type:"removeField",id:t})},removeField:t=>{e.push({type:"removeField",id:t});let a=r.fields[t];a&&n.push({type:"addField",id:t,definition:a})},modifyField:(t,a)=>{e.push({type:"modifyField",id:t,changes:a});let i=r.fields[t];n.push({type:"modifyField",id:t,changes:i})},deprecateField:t=>{e.push({type:"deprecateField",id:t}),n.push({type:"modifyField",id:t,changes:{deprecated:!1}})},addIndex:t=>{e.push({type:"addIndex",definition:t}),n.push({type:"removeIndex",name:t.name})},removeIndex:t=>{e.push({type:"removeIndex",name:t});let a=r.indexes?.find(i=>i.name===t);a&&n.push({type:"addIndex",definition:a})},modifyIndex:(t,a)=>{e.push({type:"modifyIndex",name:t,changes:a});let i=r.indexes?.find(m=>m.name===t);i&&n.push({type:"modifyIndex",name:t,changes:i})},addConstraint:t=>{e.push({type:"addConstraint",constraint:t}),n.push({type:"removeConstraint",name:t.name})},removeConstraint:t=>{e.push({type:"removeConstraint",name:t});let a=r.constraints?.find(i=>"name"in i&&i.name===t);a&&n.push({type:"addConstraint",constraint:a})},modifyConstraint:(t,a)=>{e.push({type:"modifyConstraint",name:t,changes:a});let i=r.constraints?.find(m=>"name"in m&&m.name===t);i&&n.push({type:"modifyConstraint",name:t,changes:i})},changes:()=>({migrate:e,rollback:n})}};import Be from"@isomorphic-git/lightning-fs";import{Buffer as ze}from"buffer";import d from"isomorphic-git";import N from"isomorphic-git/http/web";async function we({token:r,repoConfig:e}){try{let n=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 ${r}`,"Content-Type":"application/json"},body:JSON.stringify(e),redirect:"follow"});if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);return await n.json()}catch(n){throw console.error("Error creating repository:",n),n}}function ne(r){let e=r.toString(),n=e.substring(e.indexOf("(")+1,e.indexOf(")")),t=e.substring(e.indexOf("{")+1,e.lastIndexOf("}")).trim();return JSON.stringify({params:n,body:t})}function Se(r){let{params:e,body:n}=JSON.parse(r),t=Object.getPrototypeOf(function*(){}).constructor;return new t(e,n)}function J(r){let e=r.toString(),n=e.substring(e.indexOf("(")+1,e.indexOf(")")),t=e.substring(e.indexOf("{")+1,e.lastIndexOf("}")).trim();return JSON.stringify({params:n,body:t})}function _(r){let{params:e,body:n}=JSON.parse(r);return new Function(e,n)}function A(r,e,n){let t=new URL(r);return t.username=e,t.password=n,t.toString()}window.Buffer=ze;async function Ht(r,e="/registry",n="https://cors.isomorphic-git.org"){let t=new Be(e),a=t.promises,i="main";async function m(){await a.mkdir(e),await d.init({fs:t,dir:e,defaultBranch:i}),await a.writeFile(`${e}/registry.json`,JSON.stringify({schemas:{},created:new Date().toISOString(),updated:new Date().toISOString()})),await d.add({fs:t,dir:e,filepath:"registry.json"}),await a.writeFile(`${e}/registry.lock`,JSON.stringify({hashes:[],updated:new Date().toISOString()})),await d.add({fs:t,dir:e,filepath:"registry.lock"}),await d.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:"initial commit"}),await we({token:r.password,repoConfig:{name:r.repository,private:!0}}),await d.addRemote({fs:t,dir:e,remote:"origin",url:`https://github.com/${r.username}/${r.repository}.git`}),await d.push({fs:t,dir:e,http:N,remote:"origin",url:A(`https://github.com/${r.username}/${r.repository}.git`,r.username,r.password),corsProxy:n,ref:i,onAuth:()=>({username:r.username,password:r.password})})}async function s(){await d.clone({fs:t,dir:e,http:N,corsProxy:n,url:A(`https://github.com/${r.username}/${r.repository}.git`,r.username,r.password),onAuth:()=>({username:r.username}),singleBranch:!0,depth:1})}async function f(c){await d.branch({fs:t,dir:e,ref:c.name,checkout:!0});let v=[c.name,`${c.name}/migrations`];for(let g of v)await a.mkdir(`${e}/${g}`);let T=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 a.writeFile(`${e}/${c.name}/migrations/.nomedia`,"");for(let{hash:g,content:w}of T)await a.writeFile(`${e}/${c.name}/migrations/${g}.json`,w);let E=JSON.stringify({...c,migrations:[],mock:c.mock?ne(c.mock):null}),C=await M(E);await a.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:T.map(({id:g})=>g),changelog:[],predicates:[]}],migrations:T.reduce((g,{hash:w,checksum:I,id:L})=>(g[L]={hash:w,checksum:I},g),{})};await a.writeFile(`${e}/${c.name}/index.json`,JSON.stringify(b)),await d.add({fs:t,dir:e,filepath:c.name}),await d.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`chore: created schema: ${c.name}`}),await d.tag({fs:t,dir:e,ref:`${c.name}-${c.version}`}),await d.push({fs:t,http:N,dir:e,corsProxy:n,remote:"origin",ref:c.name,url:A(`https://github.com/${r.username}/${r.repository}.git`,r.username,r.password),onAuth:()=>({username:r.username,password:r.password})}),await d.checkout({fs:t,dir:e,ref:i}),await d.merge({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},theirs:`${c.name}`,message:`add schema: ${c.name}`}),await d.checkout({fs:t,dir:e,ref:i});let R=JSON.parse((await a.readFile(`${e}/registry.json`)).toString());R.updated=new Date().toISOString(),R.schemas[c.name]={name:c.name,version:c.version,description:c.description||"",created:new Date().toISOString(),updated:new Date().toISOString()},await a.writeFile(`${e}/registry.json`,JSON.stringify(R));let x=(await d.listFiles({fs:t,dir:e})).filter(g=>g!=="registry.lock"),D=await Promise.all(x.map(async g=>[g,await M(g)]));await a.writeFile(`${e}/registry.lock`,JSON.stringify({updated:new Date().toISOString(),hashes:D})),await d.add({fs:t,dir:e,filepath:"registry.lock"}),await d.add({fs:t,dir:e,filepath:"registry.json"}),await d.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`fix: created schema: ${c.name}`}),await $(!1)}async function p(c){await d.checkout({fs:t,dir:e,ref:c.name}),await d.pull({fs:t,dir:e,http:N,remote:"origin",corsProxy:n,ref:c.name,author:{name:"bot",email:"bot@registry.domain"},fastForwardOnly:!0,url:A(`https://github.com/${r.username}/${r.repository}.git`,r.username,r.password),onAuth:()=>({username:r.username,password:r.password})});let v=await Promise.all((c.migrations||[]).map(async w=>{let I={...w};return w.transform&&typeof w.transform!="string"&&(I.transform={forward:J(w.transform.forward),backward:J(w.transform.backward)}),I=JSON.stringify(I),{hash:await M(I),checksum:w.checksum,content:I,id:w.id}}));for(let{hash:w,content:I}of v)await a.writeFile(`${e}/${c.name}/migrations/${w}.json`,I);let T=JSON.stringify({...c,migrations:[],mock:c.mock?ne(c.mock):null}),E=await M(T);await a.writeFile(`${e}/${c.name}/schema.json`,T);let C=`${e}/${c.name}/index.json`,b=JSON.parse((await a.readFile(C)).toString()),R={version:c.version,hash:E,date:new Date().toISOString(),description:c.description||"",migrations:v.map(({id:w})=>w),changelog:[],predicates:[]};b.history.push(R),b.migrations={...b.migrations,...v.reduce((w,{hash:I,checksum:L,id:ve})=>(w[ve]={hash:I,checksum:L},w),{})},await a.writeFile(C,JSON.stringify(b)),await d.add({fs:t,dir:e,filepath:c.name}),await d.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`chore: updated schema: ${c.name} to version ${c.version}`}),await d.tag({fs:t,dir:e,ref:`${c.name}-${c.version}`}),await d.push({fs:t,http:N,dir:e,corsProxy:n,remote:"origin",ref:i,url:A(`https://github.com/${r.username}/${r.repository}.git`,r.username,r.password),onAuth:()=>({username:r.username,password:r.password})}),await d.checkout({fs:t,dir:e,ref:i}),await d.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 x=JSON.parse((await a.readFile(`${e}/registry.json`)).toString());x.updated=new Date().toISOString(),x.schemas[c.name]={name:c.name,version:c.version,description:c.description||"",created:x.schemas[c.name]?.created||new Date().toISOString(),updated:new Date().toISOString()},await a.writeFile(`${e}/registry.json`,JSON.stringify(x));let D=(await d.listFiles({fs:t,dir:e})).filter(w=>w!=="registry.lock"),g=await Promise.all(D.map(async w=>[w,await M(w)]));await a.writeFile(`${e}/registry.lock`,JSON.stringify({updated:new Date().toISOString(),hashes:g})),await d.add({fs:t,dir:e,filepath:"registry.lock"}),await d.add({fs:t,dir:e,filepath:"registry.json"}),await d.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`fix: updated schema: ${c.name} to version ${c.version}`}),await d.checkout({fs:t,dir:e,ref:i}),await $(!1)}async function u(c){await d.checkout({fs:t,dir:e,ref:i,force:!0}),await d.deleteBranch({fs:t,dir:e,ref:c});let v=JSON.parse((await a.readFile(`${e}/registry.json`)).toString());delete v.schemas[c],v.updated=new Date().toISOString(),await a.writeFile(`${e}/registry.json`,JSON.stringify(v));let T=(await d.listFiles({fs:t,dir:e})).filter(C=>C!=="registry.lock"),E=await Promise.all(T.map(async C=>[C,await M(C)]));await a.writeFile(`${e}/registry.lock`,JSON.stringify({updated:new Date().toISOString(),hashes:E})),await d.add({fs:t,dir:e,filepath:"registry.json"}),await d.add({fs:t,dir:e,filepath:"registry.lock"}),await d.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`chore: deleted schema: ${c}`})}async function h(){await d.checkout({fs:t,dir:e,ref:i,force:!0});let c=JSON.parse((await a.readFile(`${e}/registry.json`)).toString());return Object.entries(c.schemas).map(([T,{version:E}])=>({name:T,version:E}))}async function l(c,v,T=!1){if(await d.checkout({fs:t,dir:e,ref:i,force:!0}),!JSON.parse((await a.readFile(`${e}/registry.json`)).toString()).schemas[c])return null;let C=c;v&&(C=await d.resolveRef({fs:t,dir:e,ref:`${c}-${v}`})),await d.checkout({fs:t,dir:e,ref:C,force:!0});let b=JSON.parse((await a.readFile(`${e}/${c}/schema.json`)).toString());if(b.mock&&(b.mock=Se(b.mock)),T){let R=await Promise.all((await a.readdir(`${e}/${c}/migrations`)).filter(x=>x!==".nomedia").map(async x=>(await a.readFile(`${e}/${c}/migrations/${x}`)).toString()));b.migrations=R.map(x=>{let D=JSON.parse(x);return D.transform={forward:_(D.transform.forward),backward:_(D.transform.backward)},D})}return await d.checkout({fs:t,dir:e,ref:i,force:!0}),b}async function y(c){return await d.checkout({fs:t,dir:e,ref:i,force:!0}),JSON.parse(c?(await a.readFile(`${e}/${c}/index.json`)).toString():(await a.readFile(`${e}/registry.json`)).toString())}async function $(c=!0){c&&await d.pull({fs:t,dir:e,http:N,remote:"origin",corsProxy:n,ref:i,author:{name:"bot",email:"bot@registry.domain"},fastForwardOnly:!0,url:A(`https://github.com/${r.username}/${r.repository}.git`,r.username,r.password),onAuth:()=>({username:r.username,password:r.password})}),await d.push({fs:t,http:N,dir:e,corsProxy:n,remote:"origin",ref:i,url:A(`https://github.com/${r.username}/${r.repository}.git`,r.username,r.password),onAuth:()=>({username:r.username,password:r.password})})}async function k(c,v){throw new Error("predicates not implemented")}async function oe(c,v){await d.checkout({fs:t,dir:e,ref:i,force:!0});let T=JSON.parse((await a.readFile(`${e}/registry.json`)).toString());if(!T.schemas[c])return[];let E=v||T.schemas[c].version,C=JSON.parse((await a.readFile(`${e}/${c}/index.json`)).toString()),b=[];for(let R of Object.keys(C.migrations)){let{hash:x}=C.migrations[R],D=`${e}/${c}/migrations/${x}.json`,g=JSON.parse((await a.readFile(D)).toString());P(g.schemaVersion,E)<=0&&(g.transform={forward:_(g.transform.forward),backward:_(g.transform.backward)},b.push(g))}return b.sort((R,x)=>P(R.schemaVersion,x.schemaVersion))}async function be(c){if(await d.checkout({fs:t,dir:e,ref:i,force:!0}),!JSON.parse((await a.readFile(`${e}/registry.json`)).toString()).schemas[c])return[];let T=JSON.parse((await a.readFile(`${e}/${c}/index.json`)).toString()),E=[];for(let C of T.history){let b=await l(c,C.version,!0);b&&E.push(b)}return E.sort((C,b)=>P(C.version,b.version))}return{init:m,clone:s,create:f,update:p,delete:u,list:h,schema:l,stats:y,sync:$,predicates:k,migrations:oe,history:be}}function qe(r,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?`${`${e}ItemsItem`}[]`:`${r.itemsType}[]`:"any[]";case"object":return r.nestedSchema?`${e}${ie(r.name)}`:"Record<string, any>";case"dynamic":return"any";default:return"any"}}function re(r,e){let n="";for(let[t,a]of Object.entries(r))if(a.type==="object"&&a.nestedSchema){let i=`${e}${ie(t)}`;n+=`
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
`
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
${
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
${
|
|
1
|
+
import{createEventBus as It}from"@asaidimu/events";import{createEventBus as ut}from"@asaidimu/events";import{createMatcher as yt,createPaginator as gt,createProjector as wt,createSorter as St}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 Y(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 W(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=Y(r,t.path);break;case"removeValue":r=$e(r,t.path,t.value);break;case"replace":r=H(Y(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=Y(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 ze(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,l)=>{let y=[];switch(u.type){case"string":typeof d!="string"&&y.push({message:`Expected type string but received ${typeof d}.`,path:l});break;case"number":typeof d!="number"&&y.push({message:`Expected type number but received ${typeof d}.`,path:l});break;case"boolean":typeof d!="boolean"&&y.push({message:`Expected type boolean but received ${typeof d}.`,path:l});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},[...l,k]))}):y.push({message:`Expected itemsType for array ${h}`,path:l}):y.push({message:`Expected an array but received ${typeof d}.`,path:l});break;case"object":if(typeof d!="object"||d===null)y.push({message:`Expected an object but received ${d===null?"null":typeof d}.`,path:l});else if(u.nestedSchema){let $={name:u.description?`${u.description}-schema`:"nested-schema",version:"1.0",fields:u.nestedSchema};y.push(...m($,d,l))}break;case"dynamic":break;default:y.push({message:`Unknown field type: ${u.type}`,path:l});break}return y},t=(d,h,u,l)=>{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:l}):y.push({message:`Missing predicate for constraint: ${$.name}`,path:l})}),y},i=(d,h,u,l,y)=>[...r(u,d,h,y),...t(d,h,l,y)],a=(d,h,u)=>{if("operator"in d)return p(d.operator,d.rules.map(y=>a(y,h,u)));let l=e[d.predicate];return l?d.type==="schema"?l({data:h,field:d.field,arguments:d.parameters}):l({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 l=[];for(let[y,$]of Object.entries(d.fields))$.required&&h[y]===void 0&&l.push({message:`Field '${y}' is required.`,path:[...u,y]});for(let[y,$]of Object.entries(d.fields)){let k=h[y];k!==void 0&&l.push(...i(y,$,k,h,[...u,y]))}return d.constraints&&d.constraints.forEach(y=>{a(y,h)||l.push({message:`Schema constraint failed: ${o(y)}`,path:u})}),l};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)]))}),q=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(()=>q)).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(q),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:q}),s.object({type:s.literal("removeField"),id:s.string()}),s.object({type:s.literal("modifyField"),id:s.string(),changes:q.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 fe(n){try{return Me.parse(n),!0}catch(e){throw new N("Invalid migration definition",e)}}function le(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 tt=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 _e(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 Je(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");Je(e),Le(e);let t=Fe(n),i="patch";for(let a of e){let p=_e(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 it(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=(l=>(l.INVALID_SCHEMA="INVALID_SCHEMA",l.INVALID_MIGRATION="INVALID_MIGRATION",l.CHECKSUM_MISMATCH="CHECKSUM_MISMATCH",l.TIMEOUT="TIMEOUT",l.MEMORY_LIMIT="MEMORY_LIMIT",l.CONCURRENT_OPERATION="CONCURRENT_OPERATION",l.TRANSFORM_ERROR="TRANSFORM_ERROR",l.VERSION_NOT_FOUND="VERSION_NOT_FOUND",l.CIRCULAR_DEPENDENCY="CIRCULAR_DEPENDENCY",l.STREAM_ERROR="STREAM_ERROR",l.ROLLBACK_ERROR="ROLLBACK_ERROR",l.MISSING_TRANSFORM="MISSING_TRANSFORM",l))(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=>fe(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=>le(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 W(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 f 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 _(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 J(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 Lt(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 f.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 f.add({fs:t,dir:e,filepath:"registry.json"}),await i.writeFile(`${e}/registry.lock`,JSON.stringify({hashes:[],updated:new Date().toISOString()})),await f.add({fs:t,dir:e,filepath:"registry.lock"}),await f.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 f.addRemote({fs:t,dir:e,remote:"origin",url:`https://github.com/${n.username}/${n.repository}.git`}),await f.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 f.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 f.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:_(g.transform.forward),backward:_(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 f.add({fs:t,dir:e,filepath:c.name}),await f.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`chore: created schema: ${c.name}`}),await f.tag({fs:t,dir:e,ref:`${c.name}-${c.version}`}),await f.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 f.checkout({fs:t,dir:e,ref:a}),await f.merge({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},theirs:`${c.name}`,message:`add schema: ${c.name}`}),await f.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 f.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 f.add({fs:t,dir:e,filepath:"registry.lock"}),await f.add({fs:t,dir:e,filepath:"registry.json"}),await f.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 f.checkout({fs:t,dir:e,ref:c.name}),await f.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:_(w.transform.forward),backward:_(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 f.add({fs:t,dir:e,filepath:c.name}),await f.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`chore: updated schema: ${c.name} to version ${c.version}`}),await f.tag({fs:t,dir:e,ref:`${c.name}-${c.version}`}),await f.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 f.checkout({fs:t,dir:e,ref:a}),await f.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 f.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 f.add({fs:t,dir:e,filepath:"registry.lock"}),await f.add({fs:t,dir:e,filepath:"registry.json"}),await f.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`fix: updated schema: ${c.name} to version ${c.version}`}),await f.checkout({fs:t,dir:e,ref:a}),await $(!1)}async function h(c){await f.checkout({fs:t,dir:e,ref:a,force:!0}),await f.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 f.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 f.add({fs:t,dir:e,filepath:"registry.json"}),await f.add({fs:t,dir:e,filepath:"registry.lock"}),await f.commit({fs:t,dir:e,author:{name:"bot",email:"bot@registry.domain"},message:`chore: deleted schema: ${c}`})}async function u(){await f.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 l(c,v,x=!1){if(await f.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 f.resolveRef({fs:t,dir:e,ref:`${c}-${v}`})),await f.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:J(D.transform.forward),backward:J(D.transform.backward)},D})}return await f.checkout({fs:t,dir:e,ref:a,force:!0}),b}async function y(c){return await f.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 f.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 f.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 f.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:J(g.transform.forward),backward:J(g.transform.backward)},b.push(g))}return b.sort((I,T)=>F(I.schemaVersion,T.schemaVersion))}async function Se(c){if(await f.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 l(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:l,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
|
+
`;qe(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 l=we(u,o,i),y=u.required===!1?"?":"";t+=` ${u.name}${y}: ${l};
|
|
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+=` ${m.name}${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 qe(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}${z(p.name)}`;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(p.name)}`;e.set(o,{fields:p.nestedSchema,description:`Item type for ${p.name} 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":return n.itemsType?n.itemsType==="object"&&n.nestedSchema?`Array<${`${e}${z(n.name)}`}>`:`${n.itemsType}[]`:"any[]";case"object":return n.nestedSchema?`${e}${z(n.name)}`:n.reference?n.reference.schema:"Record<string, any>";case"dynamic":return"any";default:return"any"}}function z(n=""){return n.split(/[-_\s]/).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join("")}function zt(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||""}
|
|
40
|
+
- Parameters: ${JSON.stringify(m.parameters)}
|
|
41
|
+
- Error: ${m.errorMessage||"None"}`).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
|
-
]`),
|
|
45
|
+
]`),m},p=(o,m=1)=>{let d="#".repeat(m+2);return Object.entries(o).map(([h,u])=>{let l=`${d} ${h} (${u.type})
|
|
24
46
|
|
|
25
|
-
`;return l+=`**Required:** ${
|
|
47
|
+
`;return l+=`**Required:** ${u.required?"Yes":"No"}
|
|
26
48
|
|
|
27
|
-
`,
|
|
49
|
+
`,u.description&&(l+=`**Description:** ${u.description}
|
|
28
50
|
|
|
29
|
-
`),
|
|
51
|
+
`),u.itemsType&&(l+=`**Item Type:** ${u.itemsType}
|
|
30
52
|
|
|
31
|
-
`),
|
|
32
|
-
`)};
|
|
33
|
-
${
|
|
34
|
-
`),
|
|
35
|
-
`),
|
|
36
|
-
`),
|
|
37
|
-
### Nested Schema: ${
|
|
38
|
-
`),
|
|
53
|
+
`),u.nestedSchema&&(l+=p(u.nestedSchema,m+1)),l}).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
|
-
`),
|
|
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
|
-
`),
|
|
64
|
+
`),n.constraints&&r.push("### Schema-level Constraints"),r.push(`
|
|
43
65
|
## Migrations
|
|
44
|
-
`),
|
|
45
|
-
<!-- Error generating mock data -->`)}return
|
|
46
|
-
`)}export{O as JsonPatchError,
|
|
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,W as applyPatch,ue as calculateNextVersion,F as compareSemanticVersions,ze as createPatch,Lt as createRegistry,Ge as createSchemaMigrationHelper,Re as createStandardSchemaValidator,ce as deepMerge,Yt as docgen,M as generateSHA256Hash,zt as generateValidationInterface,ve as normalizePath,ae as schemaChangeToPatch,qt as schemaToTypes,it as sortSemanticVars,tt as validate,fe as validateMigration,le as validateSchemaChange,ne as validateSchemaDefinition};
|