@inflector/aura 0.2.13 → 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.
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAS,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAKlE,cAAM,WAAW,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAChD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAI3C,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wvBAsBD;IACF,MAAM;;ovBAgBJ;IACF,MAAM;;wvBAgBJ;IACF,GAAG,GAAI,QAAQ,QAAQ,CAAC,IAAI,CAAC,gvBAiB3B;IACF,OAAO,GAAI,QAAQ,QAAQ,CAAC,IAAI,CAAC,EAAE,gvBAiBjC;IACF,MAAM,GAAI,QAAQ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;;wvBAiBpC;IACF,KAAK;;4BAgBH;IACF,KAAK;;6BAgBH;IACF,SAAS,GACP,UACI,CAAC,CAAC,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,CAAA;KAAE,KAAK,GAAG,CAAC,GACnD,CAAC,CAAC,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,EACxD,QAAQ,GAAG,EACX,OAAO,OAAO,gBAgCd;CACH;AAED,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,EAC3E,WAAW,MAAM,EACjB,QAAQ,CAAC,QAEe,CAAC,kCAW1B,CAAC"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
package/dist/database.js CHANGED
@@ -8,75 +8,53 @@ class RemoteTable {
8
8
  this.Name = name;
9
9
  this.WorkSpace = workspace;
10
10
  }
11
+ post(body) {
12
+ return axios.post(`/api/db/${this.WorkSpace}/${this.Name}`, body, { withCredentials: true }).then(r => r.data);
13
+ }
11
14
  Get = () => {
12
15
  return createFluentBuilder(async (data) => {
13
- return (await axios.post(`/api/db/${this.WorkSpace}/${this.Name}`, {
14
- operation: "Get",
15
- settings: data,
16
- }, { withCredentials: true })).data;
16
+ return this.post({ operation: "Get", settings: data });
17
17
  });
18
18
  };
19
19
  GetOne = () => {
20
20
  return createFluentBuilder(async (data) => {
21
- return (await axios.post(`/api/db/${this.WorkSpace}/${this.Name}`, {
22
- operation: "GetOne",
23
- settings: data,
24
- }, { withCredentials: true })).data;
21
+ return this.post({ operation: "GetOne", settings: data });
25
22
  });
26
23
  };
27
24
  Delete = () => {
28
25
  return createFluentBuilder(async (data) => {
29
- return (await axios.post(`/api/db/${this.WorkSpace}/${this.Name}`, {
26
+ return this.post({
30
27
  operation: "Delete",
31
28
  settings: { ...data, returning: true },
32
- }, { withCredentials: true })).data;
29
+ });
33
30
  });
34
31
  };
35
- Add = (record) => {
36
- return createFluentBuilder(async () => {
37
- return (await axios.post(`/api/db/${this.WorkSpace}/${this.Name}`, {
38
- operation: "Add",
39
- settings: {
40
- returning: true,
41
- },
42
- data: record,
43
- }, { withCredentials: true })).data;
44
- });
45
- };
46
- AddMany = (record) => {
47
- return createFluentBuilder(async () => {
48
- return (await axios.post(`/api/db/${this.WorkSpace}/${this.Name}`, {
32
+ Insert = (record) => {
33
+ return createFluentBuilder(async (data) => {
34
+ return this.post({
49
35
  operation: "AddMany",
50
- settings: {
51
- returning: true,
52
- },
53
- data: record,
54
- }, { withCredentials: true })).data;
36
+ settings: { returning: data.returning ?? true },
37
+ data: Array.isArray(record) ? record : [record],
38
+ });
55
39
  });
56
40
  };
57
41
  Update = (record) => {
58
42
  return createFluentBuilder(async (data) => {
59
- return (await axios.post(`/api/db/${this.WorkSpace}/${this.Name}`, {
43
+ return this.post({
60
44
  operation: "Update",
61
- settings: { ...data, returning: true },
45
+ settings: { ...data, returning: data.returning ?? true },
62
46
  data: record,
63
- }, { withCredentials: true })).data;
47
+ });
64
48
  });
65
49
  };
66
50
  Count = () => {
67
51
  return createFluentBuilder(async (data) => {
68
- return (await axios.post(`/api/db/${this.WorkSpace}/${this.Name}`, {
69
- operation: "Count",
70
- settings: data,
71
- }, { withCredentials: true })).data;
52
+ return this.post({ operation: "Count", settings: data });
72
53
  });
73
54
  };
74
55
  Exist = () => {
75
56
  return createFluentBuilder(async (data) => {
76
- return (await axios.post(`/api/db/${this.WorkSpace}/${this.Name}`, {
77
- operation: "Exist",
78
- settings: data,
79
- }, { withCredentials: true })).data;
57
+ return this.post({ operation: "Exist", settings: data });
80
58
  });
81
59
  };
82
60
  Subscribe = (callback, where, init) => {
@@ -86,34 +64,26 @@ class RemoteTable {
86
64
  if (init)
87
65
  params.push("init=true");
88
66
  const query = params.length ? "?" + params.join("&") : "";
89
- const tableName = this.Name;
90
67
  const url = `/api/db/${this.WorkSpace}/${this.Name}${query}`;
91
- const source = new SSE(url, {
92
- withCredentials: true,
93
- });
94
- source.addEventListener(tableName, (event) => {
68
+ const source = new SSE(url, { withCredentials: true });
69
+ source.addEventListener(this.Name, (event) => {
95
70
  try {
96
71
  const { op, data } = JSON.parse(event.data);
97
72
  callback({ action: op, data });
98
73
  }
99
- catch (e) {
100
- // Ignore parse errors
101
- }
74
+ catch (_) { }
102
75
  });
103
76
  source.addEventListener("error", (error) => {
104
77
  console.error("SSE stream error:", error);
105
78
  });
106
79
  source.stream();
107
- return () => {
108
- source.close();
109
- };
80
+ return () => source.close();
110
81
  };
111
82
  }
112
83
  export const AuraDatabase = (workspace, tables) => {
113
84
  const Tables = {};
114
85
  for (const key in tables) {
115
86
  if (Object.prototype.hasOwnProperty.call(tables, key)) {
116
- // @ts-ignore
117
87
  Tables[key] = new RemoteTable(key, workspace);
118
88
  }
119
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/hooks/react.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,IAAI,CAAA;AAI3C,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;AAkB5B,wBAAgB,QAAQ,CACtB,IAAI,SAAS,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAElF,KAAK,EAAE,IAAI,EACX,OAAO,CAAC,EAAE;IACR,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;CACnE,GAiDc,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAChD;AAED,wBAAgB,SAAS,CACvB,IAAI,SAAS,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAElF,KAAK,EAAE,IAAI,EACX,OAAO,EAAE;IACP,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;CACnE,GAyCc,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CACnD;AAED,eAAO,MAAM,OAAO,GAAI,UAAU,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;;;;;;;;;aAGjF,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,UAAU,GAAG,QAGvC,CAAA"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/hooks/react.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,IAAI,CAAA;AAI3C,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;AAkB5B,wBAAgB,QAAQ,CACtB,IAAI,SAAS,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAElF,KAAK,EAAE,IAAI,EACX,OAAO,CAAC,EAAE;IACR,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;CACnE,GA0Dc,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAChD;AAED,wBAAgB,SAAS,CACvB,IAAI,SAAS,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAElF,KAAK,EAAE,IAAI,EACX,OAAO,EAAE;IACP,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;CACnE,GA6Cc,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CACnD;AAED,eAAO,MAAM,OAAO,GAAI,UAAU,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;;;;;;;;;aAGjF,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,UAAU,GAAG,QAGvC,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { useStore } from '@nanostores/react';
2
- import { useEffect, useState } from 'react';
2
+ import { useEffect, useState, useRef } from 'react';
3
3
  function deepEqual(a, b) {
4
4
  if (a === b)
5
5
  return true;
@@ -19,61 +19,71 @@ function deepEqual(a, b) {
19
19
  }
20
20
  export function useTable(table, Options) {
21
21
  const [data, setData] = useState([]);
22
+ // 1. Keep the ref logic
22
23
  const whereString = JSON.stringify(Options?.where);
23
- useEffect(() => {
24
- // 1. Reset data immediately when the where condition changes
24
+ const whereRef = useRef(whereString);
25
+ // 2. Cleanup: If the filter changed, clear the state immediately
26
+ // This happens during render to prevent showing old data
27
+ if (whereRef.current !== whereString) {
28
+ whereRef.current = whereString;
25
29
  setData([]);
30
+ }
31
+ useEffect(() => {
26
32
  const unsubscribe = table.Subscribe((event) => {
27
33
  setData((prev) => {
34
+ // Helper to prevent duplicates (The "Upsert" logic)
35
+ const merge = (existing, incoming) => {
36
+ const incomingItems = Array.isArray(incoming) ? incoming : [incoming];
37
+ const filtered = existing.filter((ex) => !incomingItems.some((inc) => deepEqual(ex, inc)));
38
+ return [...filtered, ...incomingItems];
39
+ };
28
40
  switch (event.action) {
29
41
  case 'Get':
30
- // 2. Replace the state for 'Get' (initial load)
31
- // instead of appending to prevent duplicates on reconnections/re-runs
32
- return Array.isArray(event.data) ? event.data : [event.data];
33
42
  case 'Add':
34
- return [...prev, event.data];
35
43
  case 'AddMany':
36
- return [...prev, ...event.data];
44
+ return merge(prev, event.data);
37
45
  case 'Delete':
38
- return prev.filter((x) => !event.data.some((d) => deepEqual(d, x)));
46
+ const toDelete = Array.isArray(event.data) ? event.data : [event.data];
47
+ return prev.filter((x) => !toDelete.some((d) => deepEqual(d, x)));
39
48
  case 'Update':
49
+ const updates = Array.isArray(event.data) ? event.data : [event.data];
40
50
  return prev.map((item) => {
41
- const update = event.data.find((d) => deepEqual(d.old, item));
42
- return update ? update.new : item;
51
+ const found = updates.find((d) => deepEqual(d.old, item));
52
+ return found ? found.new : item;
43
53
  });
44
54
  default:
45
55
  return prev;
46
56
  }
47
57
  });
48
58
  }, Options?.where, true);
49
- return () => {
50
- unsubscribe();
51
- };
59
+ return () => unsubscribe();
52
60
  }, [table, whereString]);
53
61
  return data;
54
62
  }
55
63
  export function useRecord(table, Options) {
56
64
  const [data, setData] = useState(undefined);
65
+ // Ref logic for single record
57
66
  const whereString = JSON.stringify(Options.where);
58
- useEffect(() => {
59
- // Reset data when the query changes
67
+ const whereRef = useRef(whereString);
68
+ if (whereRef.current !== whereString) {
69
+ whereRef.current = whereString;
60
70
  setData(undefined);
71
+ }
72
+ useEffect(() => {
61
73
  const unsubscribe = table.Subscribe((event) => {
62
74
  setData((prev) => {
63
75
  switch (event.action) {
64
76
  case 'Get':
65
77
  case 'Add':
66
- // For a single record, Get/Add always replaces
67
- return event.data;
78
+ return Array.isArray(event.data) ? event.data[0] : event.data;
68
79
  case 'Delete':
69
- if (event.data.old && deepEqual(event.data.old, prev))
70
- return undefined;
71
- return prev;
80
+ const deleteList = Array.isArray(event.data) ? event.data : [event.data];
81
+ const isMatch = deleteList.some(d => deepEqual(d, prev) || deepEqual(d.old, prev));
82
+ return isMatch ? undefined : prev;
72
83
  case 'Update':
73
- const update = event.data.find((d) => deepEqual(d.old, prev));
74
- if (update)
75
- return update.new;
76
- return prev;
84
+ const updates = Array.isArray(event.data) ? event.data : [event.data];
85
+ const match = updates.find((d) => deepEqual(d.old, prev));
86
+ return match ? match.new : prev;
77
87
  default:
78
88
  return prev;
79
89
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inflector/aura",
3
- "version": "0.2.13",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -35,7 +35,6 @@
35
35
  "@nanostores/react": "^1.0.0"
36
36
  },
37
37
  "dependencies": {
38
- "@inflector/optima": "1.1.0",
39
38
  "@types/react": "^19.2.10",
40
39
  "axios": "^1.13.2",
41
40
  "better-auth": "^1.4.16",