@ez4/database 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,3 +1,15 @@
1
1
  # EZ4: Database
2
2
 
3
3
  It uses the power of [reflection](../reflection/) to provide an API which determines how to build and connect database components.
4
+
5
+ ## Getting started
6
+
7
+ #### Install
8
+
9
+ ```sh
10
+ npm install @ez4/database -D
11
+ ```
12
+
13
+ ## License
14
+
15
+ MIT License
package/dist/library.cjs CHANGED
@@ -1,65 +1,65 @@
1
- "use strict";var P=Object.defineProperty;var me=Object.getOwnPropertyDescriptor;var le=Object.getOwnPropertyNames;var ce=Object.prototype.hasOwnProperty;var ue=(e,t)=>{for(var r in t)P(e,r,{get:t[r],enumerable:!0})},be=(e,t,r,o)=>{if(t&&
2
- typeof t=="object"||typeof t=="function")for(let a of le(t))!ce.call(e,a)&&a!==r&&
3
- P(e,a,{get:()=>t[a],enumerable:!(o=me(t,a))||o.enumerable});return e};var fe=e=>be(P({},"__esModule",{value:!0}),e);var ve={};ue(ve,{IncompleteHandlerError:()=>j,IncompleteServiceError:()=>y,IncompleteStreamError:()=>D,
4
- IncompleteTableError:()=>g,IncorrectIndexesTypeError:()=>x,IncorrectSchemaTypeError:()=>I,
5
- InvalidIndexReferenceError:()=>h,InvalidIndexTypeError:()=>M,InvalidIndexesTypeError:()=>S,
6
- InvalidSchemaTypeError:()=>v,ServiceType:()=>E,getDatabaseServices:()=>R,getDatabaseTable:()=>H,
7
- getTableSchema:()=>C,isDatabaseService:()=>Te,registerTriggers:()=>he});module.exports=
8
- fe(ve);var ne=require("@ez4/common/library"),ie=require("@ez4/schema/library"),pe=require("@ez4/project/library");var c=require("@ez4/common/library"),ae=require("@ez4/reflection");var E="@ez4/database",Te=e=>e.type===E;var V=require("@ez4/common/library"),y=class extends V.IncompleteTypeError{constructor(t,r){
9
- super("Incomplete database service",t,r)}};var T=require("@ez4/common/library"),d=require("@ez4/reflection");var N=require("@ez4/common/library"),g=class extends N.IncompleteTypeError{constructor(t,r){
10
- super("Incomplete database table",t,r)}};var u=require("@ez4/common/library"),S=class extends u.InvalidTypeError{constructor(t){
11
- super("Invalid table indexes type",void 0,"Database.Indexes",t)}},x=class extends u.IncorrectTypeError{constructor(r,o){
12
- super("Incorrect table indexes type",r,"Database.Indexes",o);this.schemaType=r}},
13
- M=class extends u.TypeError{constructor(r,o){super(`Invalid index type, ${r} mus\
14
- t follow one of the Index options.`,o);this.indexName=r}},h=class extends u.TypeError{constructor(r,o){
15
- super(`Invalid index reference, ${r} must be valid column.`,o);this.indexName=r}};var p=require("@ez4/common/library"),k=require("@ez4/reflection"),A=e=>(0,p.isClassDeclaration)(
16
- e)&&(0,p.hasHeritageType)(e,"Database.Service"),q=e=>(0,p.isModelDeclaration)(e)&&
1
+ "use strict";var w=Object.defineProperty;var me=Object.getOwnPropertyDescriptor;var le=Object.getOwnPropertyNames;var ce=Object.prototype.hasOwnProperty;var ue=(e,t)=>{for(var r in t)w(e,r,{get:t[r],enumerable:!0})},be=(e,t,r,a)=>{if(t&&
2
+ typeof t=="object"||typeof t=="function")for(let o of le(t))!ce.call(e,o)&&o!==r&&
3
+ w(e,o,{get:()=>t[o],enumerable:!(a=me(t,o))||a.enumerable});return e};var fe=e=>be(w({},"__esModule",{value:!0}),e);var ve={};ue(ve,{IncompleteHandlerError:()=>j,IncompleteServiceError:()=>y,IncompleteStreamError:()=>D,
4
+ IncompleteTableError:()=>x,IncorrectIndexesTypeError:()=>S,IncorrectSchemaTypeError:()=>I,
5
+ InvalidIndexReferenceError:()=>h,InvalidIndexTypeError:()=>M,InvalidIndexesTypeError:()=>g,
6
+ InvalidSchemaTypeError:()=>v,ServiceType:()=>E,getDatabaseServices:()=>H,getDatabaseTable:()=>C,
7
+ getTableSchema:()=>R,isDatabaseService:()=>Te,registerTriggers:()=>he});module.exports=
8
+ fe(ve);var ne=require("@ez4/common/library"),ie=require("@ez4/schema/library"),pe=require("@ez4/project/library");var c=require("@ez4/common/library"),oe=require("@ez4/reflection");var E="@ez4/database",Te=e=>e.type===E;var q=require("@ez4/common/library"),y=class extends q.IncompleteTypeError{constructor(t,r){
9
+ super("Incomplete database service",t,r)}};var T=require("@ez4/common/library"),d=require("@ez4/reflection");var F=require("@ez4/common/library"),x=class extends F.IncompleteTypeError{constructor(t,r){
10
+ super("Incomplete database table",t,r)}};var u=require("@ez4/common/library"),g=class extends u.InvalidTypeError{constructor(t){
11
+ super("Invalid table indexes type",void 0,"Database.Indexes",t)}},S=class extends u.IncorrectTypeError{constructor(r,a){
12
+ super("Incorrect table indexes type",r,"Database.Indexes",a);this.schemaType=r}},
13
+ M=class extends u.TypeError{constructor(r,a){super(`Invalid index type, ${r} mus\
14
+ t follow one of the Index options.`,a);this.indexName=r}},h=class extends u.TypeError{constructor(r,a){
15
+ super(`Invalid index reference, ${r} must be valid column.`,a);this.indexName=r}};var p=require("@ez4/common/library"),A=require("@ez4/reflection"),P=e=>(0,p.isClassDeclaration)(
16
+ e)&&(0,p.hasHeritageType)(e,"Database.Service"),V=e=>(0,p.isModelDeclaration)(e)&&
17
17
  (0,p.hasHeritageType)(e,"Database.Table"),U=e=>(0,p.hasHeritageType)(e,"Database\
18
18
  .Schema"),$=e=>(0,p.hasHeritageType)(e,"Database.Indexes"),_=e=>(0,p.isModelDeclaration)(
19
- e)&&(0,p.hasHeritageType)(e,"Database.Stream"),B=e=>(0,k.isTypeCallback)(e)||(0,k.isTypeFunction)(
20
- e);var w=require("@ez4/reflection"),J=require("@ez4/common/library"),z=require("@ez4/schema/library");var O=require("@ez4/common/library"),v=class extends O.InvalidTypeError{constructor(t){
21
- super("Invalid table schema type",void 0,"Database.Schema",t)}},I=class extends O.IncorrectTypeError{constructor(r,o){
22
- super("Incorrect table schema type",r,"Database.Schema",o);this.schemaType=r}};var C=(e,t,r,o)=>{if(!(0,w.isTypeReference)(e))return G(e,t,r,o);let a=r[e.path];
23
- return a?G(a,t,r,o):null},G=(e,t,r,o)=>(0,w.isTypeObject)(e)?(0,z.getObjectSchema)(
24
- e,r):(0,J.isModelDeclaration)(e)?U(e)?(0,z.getObjectSchema)(e,r):(o.push(new I(e.
25
- name,e.file)),null):(o.push(new v(t.file)),null);var m=require("@ez4/common/library"),b=require("@ez4/reflection");var W=(e,t,r,o)=>{if(!(0,b.isTypeReference)(e))return K(e,t,o);let a=r[e.path];return a?
26
- K(a,t,o):null},K=(e,t,r)=>(0,b.isTypeObject)(e)?Q(e,(0,m.getObjectMembers)(e),r):
27
- (0,m.isModelDeclaration)(e)?$(e)?Q(e,(0,m.getModelMembers)(e),r):(r.push(new x(e.
28
- name,e.file)),null):(r.push(new S(t.file)),null),Q=(e,t,r)=>{let o={};for(let a of t){
29
- if(!(0,b.isModelProperty)(a))continue;let s=a.name,i=(0,m.getPropertyString)(a);
30
- switch(i){case"primary":case"regular":case"unique":case"ttl":o[s]=i;break;default:
31
- return r.push(new M(s,e.file)),null}}return o};var l=require("@ez4/common/library"),f=require("@ez4/reflection");var X=require("@ez4/common/library"),D=class extends X.IncompleteTypeError{constructor(t,r){
19
+ e)&&(0,p.hasHeritageType)(e,"Database.Stream"),B=e=>(0,A.isTypeCallback)(e)||(0,A.isTypeFunction)(
20
+ e);var O=require("@ez4/reflection"),J=require("@ez4/common/library"),z=require("@ez4/schema/library");var k=require("@ez4/common/library"),v=class extends k.InvalidTypeError{constructor(t){
21
+ super("Invalid table schema type",void 0,"Database.Schema",t)}},I=class extends k.IncorrectTypeError{constructor(r,a){
22
+ super("Incorrect table schema type",r,"Database.Schema",a);this.schemaType=r}};var R=(e,t,r,a)=>{if(!(0,O.isTypeReference)(e))return G(e,t,r,a);let o=r[e.path];
23
+ return o?G(o,t,r,a):null},G=(e,t,r,a)=>(0,O.isTypeObject)(e)?(0,z.getObjectSchema)(
24
+ e,r):(0,J.isModelDeclaration)(e)?U(e)?(0,z.getObjectSchema)(e,r):(a.push(new I(e.
25
+ name,e.file)),null):(a.push(new v(t.file)),null);var m=require("@ez4/common/library"),b=require("@ez4/reflection");var W=(e,t,r,a)=>{if(!(0,b.isTypeReference)(e))return K(e,t,a);let o=r[e.path];return o?
26
+ K(o,t,a):null},K=(e,t,r)=>(0,b.isTypeObject)(e)?Q(e,(0,m.getObjectMembers)(e),r):
27
+ (0,m.isModelDeclaration)(e)?$(e)?Q(e,(0,m.getModelMembers)(e),r):(r.push(new S(e.
28
+ name,e.file)),null):(r.push(new g(t.file)),null),Q=(e,t,r)=>{let a={};for(let o of t){
29
+ if(!(0,b.isModelProperty)(o))continue;let s=o.name,i=(0,m.getPropertyString)(o);
30
+ switch(i){case"primary":case"regular":case"unique":case"ttl":a[s]=i;break;default:
31
+ return r.push(new M(s,e.file)),null}}return a};var l=require("@ez4/common/library"),f=require("@ez4/reflection");var X=require("@ez4/common/library"),D=class extends X.IncompleteTypeError{constructor(t,r){
32
32
  super("Incomplete table stream",t,r)}};var Y=require("@ez4/common/library"),j=class extends Y.IncompleteTypeError{constructor(t,r){
33
- super("Incomplete stream handler",t,r)}};var Z=(e,t,r)=>{if(!B(e))return null;let o={},a=new Set(["name","file","change"]);
34
- return e.description&&(o.description=e.description),(o.name=e.name)&&a.delete("n\
35
- ame"),(o.file=e.file)&&a.delete("file"),e.parameters&&a.delete("change"),a.size===
36
- 0&&de(o)?o:(r.push(new j([...a],e.file)),null)},de=e=>!!e.name&&!!e.file;var re=(e,t,r)=>{if(!(0,f.isTypeReference)(e))return L(e,t,r);let o=t[e.path];return o?
37
- L(o,t,r):null},ye=e=>!!e.handler,L=(e,t,r)=>_(e)?ee(e,(0,l.getModelMembers)(e),t,
38
- r):(0,f.isTypeObject)(e)?ee(e,(0,l.getObjectMembers)(e),t,r):null,ee=(e,t,r,o)=>{
39
- let a={},s=new Set(["handler"]);for(let i of t)if((0,f.isModelProperty)(i))switch(i.
40
- name){case"timeout":case"memory":{let n=(0,l.getPropertyNumber)(i);n!=null&&(a[i.
41
- name]=n);break}case"handler":a.handler=Z(i.value,r,o);break;case"variables":a.variables=
42
- (0,l.getLinkedVariables)(i,o);break}return ye(a)?a:(o.push(new D([...s],e.file)),
43
- null)};var H=(e,t,r)=>{if(!(0,d.isTypeReference)(e))return te(e,t,r);let o=t[e.path];return o?
44
- te(o,t,r):null},ge=e=>!!e.name&&!!e.schema&&!!e.indexes,te=(e,t,r)=>q(e)?oe(e,(0,T.getModelMembers)(
45
- e),t,r):(0,d.isTypeObject)(e)?oe(e,(0,T.getObjectMembers)(e),t,r):null,oe=(e,t,r,o)=>{
46
- let a={},s=new Set(["name","schema","indexes"]);for(let n of t)if((0,d.isModelProperty)(
47
- n))switch(n.name){case"name":(a.name=(0,T.getPropertyString)(n))&&s.delete(n.name);
48
- break;case"schema":{(a.schema=C(n.value,e,r,o))&&s.delete(n.name);break}case"ind\
49
- exes":{(a.indexes=W(n.value,e,r,o))&&s.delete(n.name);break}case"stream":{a.stream=
50
- re(n.value,r,o);break}}if(!ge(a))return o.push(new g([...s],e.file)),null;let i=Se(
51
- e,a.indexes,a.schema);return i.length?(o.push(...i),null):a},Se=(e,t,r)=>{let o=r.
52
- properties,a=[];for(let s in t)for(let i of s.split(":"))o[i]||a.push(new h(s,e.
53
- file));return a};var R=e=>{let t={},r=[];for(let o in e){let a=e[o];if(!A(a))continue;let s={type:E},
54
- i=new Set(["tables"]);s.name=a.name;for(let n of(0,c.getModelMembers)(a))if((0,ae.isModelProperty)(
33
+ super("Incomplete stream handler",t,r)}};var Z=(e,t,r)=>{if(!B(e))return null;let a={},o=new Set(["name","file","change"]);
34
+ return e.description&&(a.description=e.description),(a.name=e.name)&&o.delete("n\
35
+ ame"),(a.file=e.file)&&o.delete("file"),e.parameters&&o.delete("change"),o.size===
36
+ 0&&de(a)?a:(r.push(new j([...o],e.file)),null)},de=e=>!!e.name&&!!e.file;var re=(e,t,r)=>{if(!(0,f.isTypeReference)(e))return L(e,t,r);let a=t[e.path];return a?
37
+ L(a,t,r):null},ye=e=>!!e.handler,L=(e,t,r)=>_(e)?ee(e,(0,l.getModelMembers)(e),t,
38
+ r):(0,f.isTypeObject)(e)?ee(e,(0,l.getObjectMembers)(e),t,r):null,ee=(e,t,r,a)=>{
39
+ let o={},s=new Set(["handler"]);for(let i of t)if((0,f.isModelProperty)(i))switch(i.
40
+ name){case"timeout":case"memory":{let n=(0,l.getPropertyNumber)(i);n!=null&&(o[i.
41
+ name]=n);break}case"handler":o.handler=Z(i.value,r,a);break;case"variables":o.variables=
42
+ (0,l.getLinkedVariables)(i,a);break}return ye(o)?o:(a.push(new D([...s],e.file)),
43
+ null)};var C=(e,t,r)=>{if(!(0,d.isTypeReference)(e))return te(e,t,r);let a=t[e.path];return a?
44
+ te(a,t,r):null},xe=e=>!!e.name&&!!e.schema&&!!e.indexes,te=(e,t,r)=>V(e)?ae(e,(0,T.getModelMembers)(
45
+ e),t,r):(0,d.isTypeObject)(e)?ae(e,(0,T.getObjectMembers)(e),t,r):null,ae=(e,t,r,a)=>{
46
+ let o={},s=new Set(["name","schema","indexes"]);for(let n of t)if((0,d.isModelProperty)(
47
+ n))switch(n.name){case"name":(o.name=(0,T.getPropertyString)(n))&&s.delete(n.name);
48
+ break;case"schema":{(o.schema=R(n.value,e,r,a))&&s.delete(n.name);break}case"ind\
49
+ exes":{(o.indexes=W(n.value,e,r,a))&&s.delete(n.name);break}case"stream":{o.stream=
50
+ re(n.value,r,a);break}}if(!xe(o))return a.push(new x([...s],e.file)),null;let i=ge(
51
+ e,o.indexes,o.schema);return i.length?(a.push(...i),null):o},ge=(e,t,r)=>{let a=r.
52
+ properties,o=[];for(let s in t)for(let i of s.split(":"))a[i]||o.push(new h(s,e.
53
+ file));return o};var H=e=>{let t={},r=[];for(let a in e){let o=e[a];if(!P(o))continue;let s={type:E},
54
+ i=new Set(["tables"]);s.name=o.name;for(let n of(0,c.getModelMembers)(o))if((0,oe.isModelProperty)(
55
55
  n))switch(n.name){case"tables":(s.tables=Me(n,e,r))&&i.delete(n.name);break;case"\
56
56
  variables":s.variables=(0,c.getLinkedVariables)(n,r);break;case"services":s.services=
57
- (0,c.getLinkedServices)(n,e,r);break}if(!xe(s)){r.push(new y([...i],a.file));continue}
58
- t[a.name]=s}return{services:t,errors:r}},xe=e=>!!e.name&&!!e.tables,Me=(e,t,r)=>{
59
- let o=(0,c.getPropertyTuple)(e)??[],a=[];for(let s of o){let i=H(s,t,r);i&&a.push(
60
- i)}return a};var se=e=>A(e)?e.name:null;var F=!1,he=()=>(F||((0,ne.registerTriggers)(),(0,ie.registerTriggers)(),(0,pe.createTrigger)(
61
- "@ez4/database",{"metadata:getServices":R,"metadata:getLinkedService":se}),F=!0),
62
- F);0&&(module.exports={IncompleteHandlerError,IncompleteServiceError,IncompleteStreamError,
57
+ (0,c.getLinkedServices)(n,e,r);break}if(!Se(s)){r.push(new y([...i],o.file));continue}
58
+ t[o.name]=s}return{services:t,errors:r}},Se=e=>!!e.name&&!!e.tables,Me=(e,t,r)=>{
59
+ let a=(0,c.getPropertyTuple)(e)??[],o=[];for(let s of a){let i=C(s,t,r);i&&o.push(
60
+ i)}return o};var se=e=>P(e)?e.name:null;var N=!1,he=()=>(N||((0,ne.registerTriggers)(),(0,ie.registerTriggers)(),(0,pe.createTrigger)(
61
+ "@ez4/database",{"metadata:getServices":H,"metadata:getLinkedService":se}),N=!0),
62
+ N);0&&(module.exports={IncompleteHandlerError,IncompleteServiceError,IncompleteStreamError,
63
63
  IncompleteTableError,IncorrectIndexesTypeError,IncorrectSchemaTypeError,InvalidIndexReferenceError,
64
64
  InvalidIndexTypeError,InvalidIndexesTypeError,InvalidSchemaTypeError,ServiceType,
65
65
  getDatabaseServices,getDatabaseTable,getTableSchema,isDatabaseService,registerTriggers});
package/dist/library.mjs CHANGED
@@ -1,56 +1,56 @@
1
- import{registerTriggers as He}from"@ez4/common/library";import{registerTriggers as Re}from"@ez4/schema/library";
2
- import{createTrigger as Fe}from"@ez4/project/library";import{getLinkedServices as ke,getLinkedVariables as Ae,getModelMembers as Oe,getPropertyTuple as we}from"@ez4/common/library";
3
- import{isModelProperty as Pe}from"@ez4/reflection";var x="@ez4/database",Ve=e=>e.type===x;import{IncompleteTypeError as B}from"@ez4/common/library";var m=class extends B{constructor(t,r){
4
- super("Incomplete database service",t,r)}};import{getModelMembers as xe,getObjectMembers as Me,getPropertyString as he}from"@ez4/common/library";
1
+ import{registerTriggers as Ce}from"@ez4/common/library";import{registerTriggers as He}from"@ez4/schema/library";
2
+ import{createTrigger as Ne}from"@ez4/project/library";import{getLinkedServices as Ae,getLinkedVariables as Pe,getModelMembers as ke,getPropertyTuple as Oe}from"@ez4/common/library";
3
+ import{isModelProperty as we}from"@ez4/reflection";var S="@ez4/database",qe=e=>e.type===S;import{IncompleteTypeError as B}from"@ez4/common/library";var m=class extends B{constructor(t,r){
4
+ super("Incomplete database service",t,r)}};import{getModelMembers as Se,getObjectMembers as Me,getPropertyString as he}from"@ez4/common/library";
5
5
  import{isModelProperty as ve,isTypeObject as Ie,isTypeReference as De}from"@ez4/reflection";import{IncompleteTypeError as G}from"@ez4/common/library";var l=class extends G{constructor(t,r){
6
6
  super("Incomplete database table",t,r)}};import{IncorrectTypeError as J,InvalidTypeError as K,TypeError as h}from"@ez4/common/library";
7
7
  var c=class extends K{constructor(t){super("Invalid table indexes type",void 0,"\
8
- Database.Indexes",t)}},u=class extends J{constructor(r,o){super("Incorrect table\
9
- indexes type",r,"Database.Indexes",o);this.schemaType=r}},b=class extends h{constructor(r,o){
10
- super(`Invalid index type, ${r} must follow one of the Index options.`,o);this.indexName=
11
- r}},f=class extends h{constructor(r,o){super(`Invalid index reference, ${r} must\
12
- be valid column.`,o);this.indexName=r}};import{hasHeritageType as p,isClassDeclaration as Q,isModelDeclaration as v}from"@ez4/common/library";
8
+ Database.Indexes",t)}},u=class extends J{constructor(r,a){super("Incorrect table\
9
+ indexes type",r,"Database.Indexes",a);this.schemaType=r}},b=class extends h{constructor(r,a){
10
+ super(`Invalid index type, ${r} must follow one of the Index options.`,a);this.indexName=
11
+ r}},f=class extends h{constructor(r,a){super(`Invalid index reference, ${r} must\
12
+ be valid column.`,a);this.indexName=r}};import{hasHeritageType as p,isClassDeclaration as Q,isModelDeclaration as v}from"@ez4/common/library";
13
13
  import{isTypeCallback as W,isTypeFunction as X}from"@ez4/reflection";var T=e=>Q(
14
14
  e)&&p(e,"Database.Service"),I=e=>v(e)&&p(e,"Database.Table"),D=e=>p(e,"Database.\
15
- Schema"),j=e=>p(e,"Database.Indexes"),E=e=>v(e)&&p(e,"Database.Stream"),k=e=>W(e)||
15
+ Schema"),j=e=>p(e,"Database.Indexes"),E=e=>v(e)&&p(e,"Database.Stream"),A=e=>W(e)||
16
16
  X(e);import{isTypeObject as L,isTypeReference as ee}from"@ez4/reflection";import{isModelDeclaration as re}from"@ez4/common/library";
17
- import{getObjectSchema as A}from"@ez4/schema/library";import{IncorrectTypeError as Y,InvalidTypeError as Z}from"@ez4/common/library";var d=class extends Z{constructor(t){
18
- super("Invalid table schema type",void 0,"Database.Schema",t)}},y=class extends Y{constructor(r,o){
19
- super("Incorrect table schema type",r,"Database.Schema",o);this.schemaType=r}};var w=(e,t,r,o)=>{if(!ee(e))return O(e,t,r,o);let a=r[e.path];return a?O(a,t,r,o):
20
- null},O=(e,t,r,o)=>L(e)?A(e,r):re(e)?D(e)?A(e,r):(o.push(new y(e.name,e.file)),null):
21
- (o.push(new d(t.file)),null);import{isModelDeclaration as te,getModelMembers as oe,getObjectMembers as ae,getPropertyString as se}from"@ez4/common/library";
22
- import{isModelProperty as ne,isTypeObject as ie,isTypeReference as pe}from"@ez4/reflection";var C=(e,t,r,o)=>{if(!pe(e))return P(e,t,o);let a=r[e.path];return a?P(a,t,o):null},
23
- P=(e,t,r)=>ie(e)?z(e,ae(e),r):te(e)?j(e)?z(e,oe(e),r):(r.push(new u(e.name,e.file)),
24
- null):(r.push(new c(t.file)),null),z=(e,t,r)=>{let o={};for(let a of t){if(!ne(a))
25
- continue;let s=a.name,i=se(a);switch(i){case"primary":case"regular":case"unique":case"\
26
- ttl":o[s]=i;break;default:return r.push(new b(s,e.file)),null}}return o};import{getLinkedVariables as ue,getModelMembers as be,getObjectMembers as fe,getPropertyNumber as Te}from"@ez4/common/library";
27
- import{isModelProperty as de,isTypeObject as ye,isTypeReference as ge}from"@ez4/reflection";import{IncompleteTypeError as me}from"@ez4/common/library";var g=class extends me{constructor(t,r){
28
- super("Incomplete table stream",t,r)}};import{IncompleteTypeError as le}from"@ez4/common/library";var S=class extends le{constructor(t,r){
29
- super("Incomplete stream handler",t,r)}};var H=(e,t,r)=>{if(!k(e))return null;let o={},a=new Set(["name","file","change"]);
30
- return e.description&&(o.description=e.description),(o.name=e.name)&&a.delete("n\
31
- ame"),(o.file=e.file)&&a.delete("file"),e.parameters&&a.delete("change"),a.size===
32
- 0&&ce(o)?o:(r.push(new S([...a],e.file)),null)},ce=e=>!!e.name&&!!e.file;var V=(e,t,r)=>{if(!ge(e))return R(e,t,r);let o=t[e.path];return o?R(o,t,r):null},
33
- Se=e=>!!e.handler,R=(e,t,r)=>E(e)?F(e,be(e),t,r):ye(e)?F(e,fe(e),t,r):null,F=(e,t,r,o)=>{
34
- let a={},s=new Set(["handler"]);for(let i of t)if(de(i))switch(i.name){case"time\
35
- out":case"memory":{let n=Te(i);n!=null&&(a[i.name]=n);break}case"handler":a.handler=
36
- H(i.value,r,o);break;case"variables":a.variables=ue(i,o);break}return Se(a)?a:(o.
37
- push(new g([...s],e.file)),null)};var U=(e,t,r)=>{if(!De(e))return N(e,t,r);let o=t[e.path];return o?N(o,t,r):null},
38
- je=e=>!!e.name&&!!e.schema&&!!e.indexes,N=(e,t,r)=>I(e)?q(e,xe(e),t,r):Ie(e)?q(e,
39
- Me(e),t,r):null,q=(e,t,r,o)=>{let a={},s=new Set(["name","schema","indexes"]);for(let n of t)
40
- if(ve(n))switch(n.name){case"name":(a.name=he(n))&&s.delete(n.name);break;case"s\
41
- chema":{(a.schema=w(n.value,e,r,o))&&s.delete(n.name);break}case"indexes":{(a.indexes=
42
- C(n.value,e,r,o))&&s.delete(n.name);break}case"stream":{a.stream=V(n.value,r,o);
43
- break}}if(!je(a))return o.push(new l([...s],e.file)),null;let i=Ee(e,a.indexes,a.
44
- schema);return i.length?(o.push(...i),null):a},Ee=(e,t,r)=>{let o=r.properties,a=[];
45
- for(let s in t)for(let i of s.split(":"))o[i]||a.push(new f(s,e.file));return a};var $=e=>{let t={},r=[];for(let o in e){let a=e[o];if(!T(a))continue;let s={type:x},
46
- i=new Set(["tables"]);s.name=a.name;for(let n of Oe(a))if(Pe(n))switch(n.name){case"\
47
- tables":(s.tables=Ce(n,e,r))&&i.delete(n.name);break;case"variables":s.variables=
48
- Ae(n,r);break;case"services":s.services=ke(n,e,r);break}if(!ze(s)){r.push(new m(
49
- [...i],a.file));continue}t[a.name]=s}return{services:t,errors:r}},ze=e=>!!e.name&&
50
- !!e.tables,Ce=(e,t,r)=>{let o=we(e)??[],a=[];for(let s of o){let i=U(s,t,r);i&&a.
51
- push(i)}return a};var _=e=>T(e)?e.name:null;var M=!1,Kr=()=>(M||(He(),Re(),Fe("@ez4/database",{"metadata:getServices":$,"met\
52
- adata:getLinkedService":_}),M=!0),M);export{S as IncompleteHandlerError,m as IncompleteServiceError,g as IncompleteStreamError,
17
+ import{getObjectSchema as P}from"@ez4/schema/library";import{IncorrectTypeError as Y,InvalidTypeError as Z}from"@ez4/common/library";var d=class extends Z{constructor(t){
18
+ super("Invalid table schema type",void 0,"Database.Schema",t)}},y=class extends Y{constructor(r,a){
19
+ super("Incorrect table schema type",r,"Database.Schema",a);this.schemaType=r}};var O=(e,t,r,a)=>{if(!ee(e))return k(e,t,r,a);let o=r[e.path];return o?k(o,t,r,a):
20
+ null},k=(e,t,r,a)=>L(e)?P(e,r):re(e)?D(e)?P(e,r):(a.push(new y(e.name,e.file)),null):
21
+ (a.push(new d(t.file)),null);import{isModelDeclaration as te,getModelMembers as ae,getObjectMembers as oe,getPropertyString as se}from"@ez4/common/library";
22
+ import{isModelProperty as ne,isTypeObject as ie,isTypeReference as pe}from"@ez4/reflection";var R=(e,t,r,a)=>{if(!pe(e))return w(e,t,a);let o=r[e.path];return o?w(o,t,a):null},
23
+ w=(e,t,r)=>ie(e)?z(e,oe(e),r):te(e)?j(e)?z(e,ae(e),r):(r.push(new u(e.name,e.file)),
24
+ null):(r.push(new c(t.file)),null),z=(e,t,r)=>{let a={};for(let o of t){if(!ne(o))
25
+ continue;let s=o.name,i=se(o);switch(i){case"primary":case"regular":case"unique":case"\
26
+ ttl":a[s]=i;break;default:return r.push(new b(s,e.file)),null}}return a};import{getLinkedVariables as ue,getModelMembers as be,getObjectMembers as fe,getPropertyNumber as Te}from"@ez4/common/library";
27
+ import{isModelProperty as de,isTypeObject as ye,isTypeReference as xe}from"@ez4/reflection";import{IncompleteTypeError as me}from"@ez4/common/library";var x=class extends me{constructor(t,r){
28
+ super("Incomplete table stream",t,r)}};import{IncompleteTypeError as le}from"@ez4/common/library";var g=class extends le{constructor(t,r){
29
+ super("Incomplete stream handler",t,r)}};var C=(e,t,r)=>{if(!A(e))return null;let a={},o=new Set(["name","file","change"]);
30
+ return e.description&&(a.description=e.description),(a.name=e.name)&&o.delete("n\
31
+ ame"),(a.file=e.file)&&o.delete("file"),e.parameters&&o.delete("change"),o.size===
32
+ 0&&ce(a)?a:(r.push(new g([...o],e.file)),null)},ce=e=>!!e.name&&!!e.file;var q=(e,t,r)=>{if(!xe(e))return H(e,t,r);let a=t[e.path];return a?H(a,t,r):null},
33
+ ge=e=>!!e.handler,H=(e,t,r)=>E(e)?N(e,be(e),t,r):ye(e)?N(e,fe(e),t,r):null,N=(e,t,r,a)=>{
34
+ let o={},s=new Set(["handler"]);for(let i of t)if(de(i))switch(i.name){case"time\
35
+ out":case"memory":{let n=Te(i);n!=null&&(o[i.name]=n);break}case"handler":o.handler=
36
+ C(i.value,r,a);break;case"variables":o.variables=ue(i,a);break}return ge(o)?o:(a.
37
+ push(new x([...s],e.file)),null)};var U=(e,t,r)=>{if(!De(e))return F(e,t,r);let a=t[e.path];return a?F(a,t,r):null},
38
+ je=e=>!!e.name&&!!e.schema&&!!e.indexes,F=(e,t,r)=>I(e)?V(e,Se(e),t,r):Ie(e)?V(e,
39
+ Me(e),t,r):null,V=(e,t,r,a)=>{let o={},s=new Set(["name","schema","indexes"]);for(let n of t)
40
+ if(ve(n))switch(n.name){case"name":(o.name=he(n))&&s.delete(n.name);break;case"s\
41
+ chema":{(o.schema=O(n.value,e,r,a))&&s.delete(n.name);break}case"indexes":{(o.indexes=
42
+ R(n.value,e,r,a))&&s.delete(n.name);break}case"stream":{o.stream=q(n.value,r,a);
43
+ break}}if(!je(o))return a.push(new l([...s],e.file)),null;let i=Ee(e,o.indexes,o.
44
+ schema);return i.length?(a.push(...i),null):o},Ee=(e,t,r)=>{let a=r.properties,o=[];
45
+ for(let s in t)for(let i of s.split(":"))a[i]||o.push(new f(s,e.file));return o};var $=e=>{let t={},r=[];for(let a in e){let o=e[a];if(!T(o))continue;let s={type:S},
46
+ i=new Set(["tables"]);s.name=o.name;for(let n of ke(o))if(we(n))switch(n.name){case"\
47
+ tables":(s.tables=Re(n,e,r))&&i.delete(n.name);break;case"variables":s.variables=
48
+ Pe(n,r);break;case"services":s.services=Ae(n,e,r);break}if(!ze(s)){r.push(new m(
49
+ [...i],o.file));continue}t[o.name]=s}return{services:t,errors:r}},ze=e=>!!e.name&&
50
+ !!e.tables,Re=(e,t,r)=>{let a=Oe(e)??[],o=[];for(let s of a){let i=U(s,t,r);i&&o.
51
+ push(i)}return o};var _=e=>T(e)?e.name:null;var M=!1,Kr=()=>(M||(Ce(),He(),Ne("@ez4/database",{"metadata:getServices":$,"met\
52
+ adata:getLinkedService":_}),M=!0),M);export{g as IncompleteHandlerError,m as IncompleteServiceError,x as IncompleteStreamError,
53
53
  l as IncompleteTableError,u as IncorrectIndexesTypeError,y as IncorrectSchemaTypeError,
54
54
  f as InvalidIndexReferenceError,b as InvalidIndexTypeError,c as InvalidIndexesTypeError,
55
- d as InvalidSchemaTypeError,x as ServiceType,$ as getDatabaseServices,U as getDatabaseTable,
56
- w as getTableSchema,Ve as isDatabaseService,Kr as registerTriggers};
55
+ d as InvalidSchemaTypeError,S as ServiceType,$ as getDatabaseServices,U as getDatabaseTable,
56
+ O as getTableSchema,qe as isDatabaseService,Kr as registerTriggers};
package/dist/main.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var o=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var l=(r,t)=>{for(var m in t)o(r,m,{get:t[m],enumerable:!0})},S=(r,t,m,a)=>{if(t&&
2
- typeof t=="object"||typeof t=="function")for(let e of c(t))!T.call(r,e)&&e!==m&&
3
- o(r,e,{get:()=>t[e],enumerable:!(a=s(t,e))||a.enumerable});return r};var x=r=>S(o({},"__esModule",{value:!0}),r);var d={};l(d,{Database:()=>n,Index:()=>p,StreamType:()=>i});module.exports=x(d);var n;(r=>{})(n||={});var p=(e=>(e.Primary="primary",e.Regular="regular",e.Unique="unique",e.TTL="ttl",
4
- e))(p||{});var i=(a=>(a.Insert="insert",a.Update="update",a.Delete="delete",a))(i||{});0&&(module.exports={Database,Index,StreamType});
1
+ "use strict";var s=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var d=(r,t)=>{for(var n in t)s(r,n,{get:t[n],enumerable:!0})},y=(r,t,n,a)=>{if(t&&
2
+ typeof t=="object"||typeof t=="function")for(let e of T(t))!x.call(r,e)&&e!==n&&
3
+ s(r,e,{get:()=>t[e],enumerable:!(a=i(t,e))||a.enumerable});return r};var c=r=>y(s({},"__esModule",{value:!0}),r);var l={};d(l,{Database:()=>o,Index:()=>m,StreamType:()=>p});module.exports=c(l);var o;(r=>{})(o||={});var m=(e=>(e.Primary="primary",e.Regular="regular",e.Unique="unique",e.TTL="ttl",
4
+ e))(m||{});var p=(a=>(a.Insert="insert",a.Update="update",a.Delete="delete",a))(p||{});0&&(module.exports={Database,Index,StreamType});
package/dist/main.d.ts CHANGED
@@ -1,5 +1,6 @@
1
+ export * from './services/query.js';
1
2
  export * from './services/client.js';
2
- export * from './services/helpers.js';
3
3
  export * from './services/database.js';
4
4
  export * from './services/indexes.js';
5
- export * from './services/stream.js';
5
+ export * from './services/schemas.js';
6
+ export * from './services/streams.js';
package/dist/main.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var r;(o=>{})(r||={});var a=(e=>(e.Primary="primary",e.Regular="regular",e.Unique="unique",e.TTL="ttl",
2
- e))(a||{});var m=(t=>(t.Insert="insert",t.Update="update",t.Delete="delete",t))(m||{});export{r as Database,a as Index,m as StreamType};
1
+ var r;(s=>{})(r||={});var a=(e=>(e.Primary="primary",e.Regular="regular",e.Unique="unique",e.TTL="ttl",
2
+ e))(a||{});var n=(t=>(t.Insert="insert",t.Update="update",t.Delete="delete",t))(n||{});export{r as Database,a as Index,n as StreamType};
@@ -1,6 +1,7 @@
1
- import type { AnyObject, PartialProperties, PartialObject, DeepPartial } from '@ez4/utils';
2
- import type { TableSchemas } from './helpers.js';
1
+ import type { TableIndexes } from './indexes.js';
2
+ import type { TableSchemas } from './schemas.js';
3
3
  import type { Database } from './database.js';
4
+ import type { Query } from './query.js';
4
5
  /**
5
6
  * Database client.
6
7
  */
@@ -14,110 +15,23 @@ export type Client<T extends Database.Service<any>> = ClientTables<T> & {
14
15
  */
15
16
  rawQuery(query: string, values?: unknown[]): Promise<Record<string, unknown>[]>;
16
17
  };
18
+ /**
19
+ * Client tables.
20
+ */
17
21
  export type ClientTables<T extends Database.Service<any>> = {
18
- [P in keyof TableSchemas<T>]: TableSchemas<T>[P] extends Database.Schema ? Table<TableSchemas<T>[P]> : never;
22
+ [P in keyof TableSchemas<T>]: TableSchemas<T>[P] extends Database.Schema ? Table<TableSchemas<T>[P], P extends keyof TableIndexes<T> ? TableIndexes<T>[P] extends string ? TableIndexes<T>[P] : never : never> : never;
19
23
  };
20
- export interface Table<T extends Database.Schema> {
24
+ /**
25
+ * Client table.
26
+ */
27
+ export interface Table<T extends Database.Schema, I extends string | never> {
21
28
  insertOne(query: Query.InsertOneInput<T>): Promise<Query.InsertOneResult>;
22
- findOne<U extends Query.SelectInput<T>>(query: Query.FindOneInput<T, U>): Promise<Query.FindOneResult<T, U>>;
23
- upsertOne<U extends Query.SelectInput<T>>(query: Query.UpsertOneInput<T, U>): Promise<Query.UpsertOneResult<T, U>>;
24
- updateMany<U extends Query.SelectInput<T>>(query: Query.UpdateManyInput<T, U>): Promise<Query.UpdateManyResult<T, U>>;
25
- findMany<U extends Query.SelectInput<T>>(query: Query.FindManyInput<T, U>): Promise<Query.FindManyResult<T, U>>;
26
- deleteMany<U extends Query.SelectInput<T>>(query: Query.DeleteManyInput<T, U>): Promise<Query.DeleteManyResult<T, U>>;
27
- }
28
- export declare namespace Query {
29
- type InsertOneInput<T extends Database.Schema> = {
30
- data: T;
31
- };
32
- type FindOneInput<T extends Database.Schema, S extends Database.Schema> = {
33
- select: S;
34
- where: WhereInput<T>;
35
- };
36
- type UpsertOneInput<T extends Database.Schema, S extends Database.Schema> = {
37
- select?: S;
38
- insert: T;
39
- update: DeepPartial<T>;
40
- where: WhereInput<T>;
41
- };
42
- type UpdateManyInput<T extends Database.Schema, S extends Database.Schema> = {
43
- select?: S;
44
- data: DeepPartial<T>;
45
- where?: WhereInput<T>;
46
- cursor?: number | string;
47
- limit?: number;
48
- };
49
- type FindManyInput<T extends Database.Schema, S extends Database.Schema> = {
50
- select: S;
51
- where?: WhereInput<T>;
52
- cursor?: number | string;
53
- limit?: number;
54
- };
55
- type DeleteManyInput<T extends Database.Schema, S extends Database.Schema> = {
56
- select?: S;
57
- where?: WhereInput<T>;
58
- cursor?: number | string;
59
- limit?: number;
60
- };
61
- type InsertOneResult = void;
62
- type FindOneResult<T extends Database.Schema, S extends AnyObject> = Record<T, S> | undefined;
63
- type UpsertOneResult<T extends Database.Schema, S extends AnyObject> = FindOneResult<T, S> | undefined;
64
- type UpdateManyResult<T extends Database.Schema, S extends AnyObject> = Record<T, S>[];
65
- type FindManyResult<T extends Database.Schema, S extends AnyObject> = {
66
- records: Record<T, S>[];
67
- cursor?: number | string;
68
- };
69
- type DeleteManyResult<T extends Database.Schema, S extends AnyObject> = Record<T, S>[];
70
- type Record<T extends Database.Schema, S extends AnyObject> = PartialObject<T, S, false>;
71
- type SelectInput<T extends Database.Schema> = PartialProperties<T>;
72
- type WhereInput<T extends Database.Schema> = WhereFields<T> & WhereNot<T> & WhereAnd<T> & WhereOr<T>;
73
- type WhereFields<T extends Database.Schema> = {
74
- [P in keyof T]?: T[P] extends AnyObject ? WhereFields<T[P]> : T[P] | WhereOperations<T[P]>;
75
- };
76
- type WhereNot<T extends Database.Schema> = {
77
- NOT?: WhereInput<T> | WhereAnd<T> | WhereOr<T>;
78
- };
79
- type WhereAnd<T extends Database.Schema> = {
80
- AND?: (WhereInput<T> | WhereOr<T> | WhereNot<T>)[];
81
- };
82
- type WhereOr<T extends Database.Schema> = {
83
- OR?: (WhereInput<T> | WhereAnd<T> | WhereNot<T>)[];
84
- };
85
- type WhereOperations<T> = WhereNegate<T> | WhereEqual<T> | WhereGreaterThan<T> | WhereGreaterThanOrEqual<T> | WhereLessThan<T> | WhereLessThanOrEqual<T> | WhereIn<T> | WhereBetween<T> | WhereIsMissing | WhereIsNull | WhereStartsWith | WhereContains;
86
- type WhereOperators = keyof (WhereNegate<any> & WhereEqual<any> & WhereGreaterThan<any> & WhereGreaterThanOrEqual<any> & WhereLessThan<any> & WhereLessThanOrEqual<any> & WhereIn<any> & WhereBetween<any> & WhereIsMissing & WhereIsNull & WhereStartsWith & WhereContains);
87
- type WhereNegate<T> = {
88
- not: T | WhereOperations<T>;
89
- };
90
- type WhereEqual<T> = {
91
- equal: T;
92
- };
93
- type WhereGreaterThan<T> = {
94
- gt: T;
95
- };
96
- type WhereGreaterThanOrEqual<T> = {
97
- gte: T;
98
- };
99
- type WhereLessThan<T> = {
100
- lt: T;
101
- };
102
- type WhereLessThanOrEqual<T> = {
103
- lte: T;
104
- };
105
- type WhereIn<T> = {
106
- isIn: T[];
107
- };
108
- type WhereBetween<T> = {
109
- isBetween: [T, T];
110
- };
111
- type WhereIsMissing = {
112
- isMissing: boolean;
113
- };
114
- type WhereIsNull = {
115
- isNull: boolean;
116
- };
117
- type WhereStartsWith = {
118
- startsWith: string;
119
- };
120
- type WhereContains = {
121
- contains: string;
122
- };
29
+ updateOne<S extends Query.SelectInput<T>>(query: Query.UpdateOneInput<T, S, I>): Promise<Query.UpdateOneResult<T, S>>;
30
+ findOne<S extends Query.SelectInput<T>>(query: Query.FindOneInput<T, S, I>): Promise<Query.FindOneResult<T, S>>;
31
+ upsertOne<S extends Query.SelectInput<T>>(query: Query.UpsertOneInput<T, S, I>): Promise<Query.UpsertOneResult<T, S>>;
32
+ deleteOne<S extends Query.SelectInput<T>>(query: Query.DeleteOneInput<T, S, I>): Promise<Query.DeleteOneResult<T, S>>;
33
+ insertMany(query: Query.InsertManyInput<T>): Promise<Query.InsertManyResult>;
34
+ updateMany<S extends Query.SelectInput<T>>(query: Query.UpdateManyInput<T, S>): Promise<Query.UpdateManyResult<T, S>>;
35
+ findMany<S extends Query.SelectInput<T>>(query: Query.FindManyInput<T, S>): Promise<Query.FindManyResult<T, S>>;
36
+ deleteMany<S extends Query.SelectInput<T>>(query: Query.DeleteManyInput<T, S>): Promise<Query.DeleteManyResult<T, S>>;
123
37
  }
@@ -1,9 +1,9 @@
1
1
  import type { Service } from '@ez4/common';
2
2
  import type { LinkedVariables } from '@ez4/project/library';
3
+ import type { StreamChange } from './streams.js';
3
4
  import type { TableTypes } from './helpers.js';
4
- import type { StreamChange } from './stream.js';
5
- import type { Index } from './indexes.js';
6
5
  import type { Client } from './client.js';
6
+ import type { Index } from './indexes.js';
7
7
  /**
8
8
  * Provide all contracts for a self-managed database service.
9
9
  */
@@ -4,27 +4,9 @@ import type { Database } from './database.js';
4
4
  * Given an array of schemas `T`, it returns an union of `Database.Table` for each schema.
5
5
  */
6
6
  export type TableTypes<T extends Database.Schema[]> = IsAny<T> extends true ? any : IsArrayEmpty<T> extends true ? Database.Table<Database.Schema> : Database.Table<T[0]> | TableTypes<ArrayRest<T>>;
7
- /**
8
- * Given a database service `T`, it returns a map containing all its tables and schemas.
9
- */
10
- export type TableSchemas<T extends Database.Service<any>> = MergeTables<ServiceTables<T>>;
11
7
  /**
12
8
  * Given a database service `T`, it returns all its table types.
13
9
  */
14
- type ServiceTables<T> = T extends {
10
+ export type DatabaseTables<T> = T extends {
15
11
  tables: infer U;
16
12
  } ? U : [];
17
- /**
18
- * Given a list of database tables `T`, it returns an object containing all table names and schemas.
19
- */
20
- type MergeTables<T extends Database.Table[]> = IsArrayEmpty<T> extends true ? {} : TableRecord<T[0]> & MergeTables<ArrayRest<T>>;
21
- /**
22
- * Given a database table `T`, it returns a table record containing its `name` and `schema`.
23
- */
24
- type TableRecord<T> = T extends {
25
- name: infer N;
26
- schema: infer S;
27
- } ? N extends string ? {
28
- [P in N]: S;
29
- } : {} : {};
30
- export {};
@@ -1,3 +1,6 @@
1
+ import type { ArrayRest, IsArrayEmpty } from '@ez4/utils';
2
+ import type { DatabaseTables } from './helpers.js';
3
+ import type { Database } from './database.js';
1
4
  /**
2
5
  * All supported index types.
3
6
  */
@@ -7,3 +10,32 @@ export declare const enum Index {
7
10
  Unique = "unique",
8
11
  TTL = "ttl"
9
12
  }
13
+ /**
14
+ * Given an index name `T`, it produces the decomposed index names.
15
+ */
16
+ export type DecomposeIndexName<T> = T extends `${infer L}:${infer R}` ? L | DecomposeIndexName<R> : T;
17
+ /**
18
+ * Given an index object `T`, it produces an index object containing only unique indexes.
19
+ */
20
+ export type UniqueIndexes<T> = {
21
+ [P in keyof T as T[P] extends Index.Primary | Index.Unique ? P : never]: T[P];
22
+ };
23
+ /**
24
+ * Given a database service `T`, it produces an object containing all tables with indexes.
25
+ */
26
+ export type TableIndexes<T extends Database.Service<any>> = MergeIndexes<DatabaseTables<T>>;
27
+ /**
28
+ * Given a list of tables with indexes `T`, it produces an object containing all primary
29
+ * indexes mapped by table name.
30
+ */
31
+ type MergeIndexes<T extends Database.Table[]> = IsArrayEmpty<T> extends true ? {} : TableIndex<T[0]> & MergeIndexes<ArrayRest<T>>;
32
+ /**
33
+ * Given a database table `T`, it produces an object containing all the primary index names.
34
+ */
35
+ type TableIndex<T> = T extends {
36
+ name: infer N;
37
+ indexes: infer I;
38
+ } ? N extends string ? {
39
+ [P in N]: DecomposeIndexName<keyof UniqueIndexes<I>>;
40
+ } : {} : {};
41
+ export {};
@@ -0,0 +1,115 @@
1
+ import type { AnyObject, PartialProperties, PartialObject, DeepPartial } from '@ez4/utils';
2
+ import type { Database } from './database.js';
3
+ export declare namespace Query {
4
+ type InsertOneInput<T extends Database.Schema> = {
5
+ data: T;
6
+ };
7
+ type UpdateOneInput<T extends Database.Schema, S extends Database.Schema, I extends string | never> = {
8
+ select?: S;
9
+ data: DeepPartial<T>;
10
+ where: WhereInput<T, I>;
11
+ };
12
+ type FindOneInput<T extends Database.Schema, S extends Database.Schema, I extends string | never> = {
13
+ select: S;
14
+ where: WhereInput<T, I>;
15
+ };
16
+ type UpsertOneInput<T extends Database.Schema, S extends Database.Schema, I extends string | never> = {
17
+ select?: S;
18
+ insert: T;
19
+ update: DeepPartial<T>;
20
+ where: WhereInput<T, I>;
21
+ };
22
+ type DeleteOneInput<T extends Database.Schema, S extends Database.Schema, I extends string | never> = {
23
+ select?: S;
24
+ where: WhereInput<T, I>;
25
+ };
26
+ type InsertManyInput<T extends Database.Schema> = {
27
+ data: T[];
28
+ };
29
+ type UpdateManyInput<T extends Database.Schema, S extends Database.Schema> = {
30
+ select?: S;
31
+ data: DeepPartial<T>;
32
+ where?: WhereInput<T>;
33
+ limit?: number;
34
+ };
35
+ type FindManyInput<T extends Database.Schema, S extends Database.Schema> = {
36
+ select: S;
37
+ where?: WhereInput<T>;
38
+ cursor?: number | string;
39
+ limit?: number;
40
+ };
41
+ type DeleteManyInput<T extends Database.Schema, S extends Database.Schema> = {
42
+ select?: S;
43
+ where?: WhereInput<T>;
44
+ limit?: number;
45
+ };
46
+ type InsertOneResult = void;
47
+ type UpdateOneResult<T extends Database.Schema, S extends AnyObject> = FindOneResult<T, S> | undefined;
48
+ type FindOneResult<T extends Database.Schema, S extends AnyObject> = Record<T, S> | undefined;
49
+ type UpsertOneResult<T extends Database.Schema, S extends AnyObject> = FindOneResult<T, S> | undefined;
50
+ type DeleteOneResult<T extends Database.Schema, S extends AnyObject> = FindOneResult<T, S> | undefined;
51
+ type InsertManyResult = void;
52
+ type UpdateManyResult<T extends Database.Schema, S extends AnyObject> = Record<T, S>[];
53
+ type FindManyResult<T extends Database.Schema, S extends AnyObject> = {
54
+ records: Record<T, S>[];
55
+ cursor?: number | string;
56
+ };
57
+ type DeleteManyResult<T extends Database.Schema, S extends AnyObject> = Record<T, S>[];
58
+ type Record<T extends Database.Schema, S extends AnyObject> = PartialObject<T, S, false>;
59
+ type SelectInput<T extends Database.Schema> = PartialProperties<T>;
60
+ type WhereInput<T extends Database.Schema, I extends string | never = never> = WhereFields<T, I> & WhereNot<T, I> & WhereAnd<T, I> & WhereOr<T, I>;
61
+ type WhereRequiredFields<T extends Database.Schema, I extends string | never> = {
62
+ [P in I]: P extends keyof T ? T[P] extends AnyObject ? WhereFields<T[P], I> : T[P] | WhereOperations<T[P]> : never;
63
+ };
64
+ type WhereOptionalFields<T extends Database.Schema, I extends string | never> = {
65
+ [P in Exclude<keyof T, I>]?: T[P] extends AnyObject ? WhereFields<T[P], I> : T[P] | WhereOperations<T[P]>;
66
+ };
67
+ type WhereFields<T extends Database.Schema, I extends string | never> = WhereRequiredFields<T, I> & WhereOptionalFields<T, I>;
68
+ type WhereNot<T extends Database.Schema, I extends string | never> = {
69
+ NOT?: WhereInput<T, I> | WhereAnd<T, I> | WhereOr<T, I>;
70
+ };
71
+ type WhereAnd<T extends Database.Schema, I extends string | never> = {
72
+ AND?: (WhereInput<T, I> | WhereOr<T, I> | WhereNot<T, I>)[];
73
+ };
74
+ type WhereOr<T extends Database.Schema, I extends string | never> = {
75
+ OR?: (WhereInput<T, I> | WhereAnd<T, I> | WhereNot<T, I>)[];
76
+ };
77
+ type WhereOperations<T> = WhereNegate<T> | WhereEqual<T> | WhereGreaterThan<T> | WhereGreaterThanOrEqual<T> | WhereLessThan<T> | WhereLessThanOrEqual<T> | WhereIn<T> | WhereBetween<T> | WhereIsMissing | WhereIsNull | WhereStartsWith | WhereContains;
78
+ type WhereOperators = keyof (WhereNegate<any> & WhereEqual<any> & WhereGreaterThan<any> & WhereGreaterThanOrEqual<any> & WhereLessThan<any> & WhereLessThanOrEqual<any> & WhereIn<any> & WhereBetween<any> & WhereIsMissing & WhereIsNull & WhereStartsWith & WhereContains);
79
+ type WhereNegate<T> = {
80
+ not: T | WhereOperations<T>;
81
+ };
82
+ type WhereEqual<T> = {
83
+ equal: T;
84
+ };
85
+ type WhereGreaterThan<T> = {
86
+ gt: T;
87
+ };
88
+ type WhereGreaterThanOrEqual<T> = {
89
+ gte: T;
90
+ };
91
+ type WhereLessThan<T> = {
92
+ lt: T;
93
+ };
94
+ type WhereLessThanOrEqual<T> = {
95
+ lte: T;
96
+ };
97
+ type WhereIn<T> = {
98
+ isIn: T[];
99
+ };
100
+ type WhereBetween<T> = {
101
+ isBetween: [T, T];
102
+ };
103
+ type WhereIsMissing = {
104
+ isMissing: boolean;
105
+ };
106
+ type WhereIsNull = {
107
+ isNull: boolean;
108
+ };
109
+ type WhereStartsWith = {
110
+ startsWith: string;
111
+ };
112
+ type WhereContains = {
113
+ contains: string;
114
+ };
115
+ }
@@ -0,0 +1,22 @@
1
+ import type { ArrayRest, IsArrayEmpty } from '@ez4/utils';
2
+ import type { DatabaseTables } from './helpers.js';
3
+ import type { Database } from './database.js';
4
+ /**
5
+ * Given a database service `T`, it produces an object containing all tables with schemas.
6
+ */
7
+ export type TableSchemas<T extends Database.Service<any>> = MergeTables<DatabaseTables<T>>;
8
+ /**
9
+ * Given a list of tables with schema `T`, it produces an object containing all schemas
10
+ * mapped by table name.
11
+ */
12
+ type MergeTables<T extends Database.Table[]> = IsArrayEmpty<T> extends true ? {} : TableSchema<T[0]> & MergeTables<ArrayRest<T>>;
13
+ /**
14
+ * Given a database table `T`, it produces an object containing the `schema`.
15
+ */
16
+ type TableSchema<T> = T extends {
17
+ name: infer N;
18
+ schema: infer S;
19
+ } ? N extends string ? {
20
+ [P in N]: S;
21
+ } : {} : {};
22
+ export {};
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Stream change for `insert`, `update` or `delete` operations.
3
+ */
4
+ export type StreamChange<T> = StreamInsertChange<T> | StreamUpdateChange<T> | StreamDeleteChange<T>;
5
+ /**
6
+ * Stream change for an `insert` operation.
7
+ */
8
+ export type StreamInsertChange<T> = {
9
+ type: StreamType.Insert;
10
+ record: T;
11
+ };
12
+ /**
13
+ * Stream change for an `update` operation.
14
+ */
15
+ export type StreamUpdateChange<T> = {
16
+ type: StreamType.Update;
17
+ oldRecord: T;
18
+ newRecord: T;
19
+ };
20
+ /**
21
+ * Stream change for an `delete` operation.
22
+ */
23
+ export type StreamDeleteChange<T> = {
24
+ type: StreamType.Delete;
25
+ record: T;
26
+ };
27
+ /**
28
+ * Stream change types.
29
+ */
30
+ export declare const enum StreamType {
31
+ Insert = "insert",
32
+ Update = "update",
33
+ Delete = "delete"
34
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ez4/database",
3
3
  "description": "EZ4: Components to build database services",
4
- "version": "0.2.1",
4
+ "version": "0.3.0",
5
5
  "author": "Silas B.",
6
6
  "license": "MIT",
7
7
  "type": "module",
@@ -31,10 +31,10 @@
31
31
  "live:publish": "npm run test && npm publish --access public"
32
32
  },
33
33
  "dependencies": {
34
- "@ez4/common": "^0.2.0",
35
- "@ez4/project": "^0.2.0",
36
- "@ez4/reflection": "^0.2.0",
37
- "@ez4/schema": "^0.2.0",
38
- "@ez4/utils": "^0.2.0"
34
+ "@ez4/common": "^0.3.0",
35
+ "@ez4/project": "^0.3.0",
36
+ "@ez4/reflection": "^0.3.0",
37
+ "@ez4/schema": "^0.3.0",
38
+ "@ez4/utils": "^0.3.0"
39
39
  }
40
40
  }