@anysoftinc/anydb-sdk 0.3.0 → 0.5.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.
Files changed (45) hide show
  1. package/README.md +43 -0
  2. package/dist/anydb.datascript.core.js +336 -0
  3. package/dist/anydb.datascript.rules.js +29 -0
  4. package/dist/anydb.datascript.schema.js +35 -0
  5. package/dist/auth.d.ts +28 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +52 -0
  8. package/dist/client.d.ts +1 -0
  9. package/dist/client.d.ts.map +1 -1
  10. package/dist/client.js +59 -0
  11. package/dist/cljs.core.js +38752 -0
  12. package/dist/cljs.reader.js +450 -0
  13. package/dist/cljs.tools.reader.edn.js +945 -0
  14. package/dist/cljs.tools.reader.impl.commons.js +205 -0
  15. package/dist/cljs.tools.reader.impl.errors.js +429 -0
  16. package/dist/cljs.tools.reader.impl.inspect.js +170 -0
  17. package/dist/cljs.tools.reader.impl.utils.js +413 -0
  18. package/dist/cljs.tools.reader.js +1815 -0
  19. package/dist/cljs.tools.reader.reader_types.js +826 -0
  20. package/dist/cljs_env.js +7672 -0
  21. package/dist/clojure.data.js +307 -0
  22. package/dist/clojure.edn.js +107 -0
  23. package/dist/clojure.set.js +394 -0
  24. package/dist/clojure.string.js +490 -0
  25. package/dist/clojure.walk.js +144 -0
  26. package/dist/datascript-backend.js +2 -2
  27. package/dist/datascript.built_ins.js +680 -0
  28. package/dist/datascript.conn.js +814 -0
  29. package/dist/datascript.core.js +1285 -0
  30. package/dist/datascript.db.js +4058 -0
  31. package/dist/datascript.impl.entity.js +588 -0
  32. package/dist/datascript.lru.js +213 -0
  33. package/dist/datascript.parser.js +8598 -0
  34. package/dist/datascript.pull_api.js +2287 -0
  35. package/dist/datascript.pull_parser.js +865 -0
  36. package/dist/datascript.query.js +2785 -0
  37. package/dist/datascript.serialize.js +352 -0
  38. package/dist/datascript.storage.js +50 -0
  39. package/dist/datascript.util.js +82 -0
  40. package/dist/extend_clj.core.js +134 -0
  41. package/dist/me.tonsky.persistent_sorted_set.arrays.js +54 -0
  42. package/dist/me.tonsky.persistent_sorted_set.js +2485 -0
  43. package/dist/nextauth-adapter.d.ts.map +1 -1
  44. package/dist/nextauth-adapter.js +8 -11
  45. package/package.json +10 -4
package/README.md CHANGED
@@ -115,6 +115,19 @@ SchemaBuilder and DatomicUtils have been removed in v2. Use plain tx maps with k
115
115
 
116
116
  Utility helpers for tempids and entity builders were removed in v2.
117
117
 
118
+ ### Idempotent Schema Install
119
+
120
+ Use `ensureAttributes(db, schemaEntities)` to install attribute idents exactly once per database alias. It checks which idents already exist and only transacts the missing ones.
121
+
122
+ ```ts
123
+ import { ensureAttributes, kw } from "@anysoftinc/anydb-sdk";
124
+
125
+ await ensureAttributes(db, [
126
+ { "db/ident": kw("person/name"), "db/valueType": kw("db.type/string"), "db/cardinality": kw("db.cardinality/one") },
127
+ { "db/ident": kw("person/age"), "db/valueType": kw("db.type/long"), "db/cardinality": kw("db.cardinality/one") },
128
+ ]);
129
+ ```
130
+
118
131
  ## Advanced Features
119
132
 
120
133
  ### EDN Data Types
@@ -201,6 +214,36 @@ export default NextAuth({
201
214
  });
202
215
  ```
203
216
 
217
+ ## Auth Helpers (Server-side)
218
+
219
+ Issue AnyDB-compatible HS256 tokens and normalize subjects consistently across apps:
220
+
221
+ ```ts
222
+ import { createServiceTokenProvider, signFromSessionClaims } from "@anysoftinc/anydb-sdk/auth";
223
+
224
+ // 1) Service token provider (e.g., for adapters/bootstrap)
225
+ const getServiceToken = createServiceTokenProvider({
226
+ secret: process.env.JWT_SECRET!,
227
+ storageAlias: "dev",
228
+ dbName: "app",
229
+ iss: "my-app-service",
230
+ ttlSeconds: 3600,
231
+ });
232
+
233
+ // Use with DatomicClient
234
+ // new DatomicClient({ baseUrl, getAuthToken: getServiceToken })
235
+
236
+ // 2) Per-user token from NextAuth claims (re-signs JWS for AnyDB)
237
+ const token = signFromSessionClaims({
238
+ claims: nextAuthClaims, // from next-auth/jwt getToken()
239
+ secret: process.env.JWT_SECRET!,
240
+ storageAlias: "dev",
241
+ dbName: "app",
242
+ iss: "my-app-auth",
243
+ ttlSeconds: 900,
244
+ });
245
+ ```
246
+
204
247
  ## Error Handling
205
248
 
206
249
  The SDK provides detailed error information:
@@ -0,0 +1,336 @@
1
+ var $CLJS = require("./cljs_env");
2
+ var $jscomp = $CLJS.$jscomp;
3
+ var COMPILED = false;
4
+ require("./cljs.core.js");
5
+ require("./datascript.core.js");
6
+ require("./clojure.edn.js");
7
+ require("./clojure.string.js");
8
+ require("./anydb.datascript.schema.js");
9
+ require("./anydb.datascript.rules.js");
10
+ var anydb=$CLJS.anydb || ($CLJS.anydb = {});
11
+ var clojure=$CLJS.clojure || ($CLJS.clojure = {});
12
+ var cljs=$CLJS.cljs || ($CLJS.cljs = {});
13
+ var goog=$CLJS.goog || ($CLJS.goog = {});
14
+ var datascript=$CLJS.datascript || ($CLJS.datascript = {});
15
+ var me=$CLJS.me || ($CLJS.me = {});
16
+ var extend_clj=$CLJS.extend_clj || ($CLJS.extend_clj = {});
17
+
18
+ $CLJS.SHADOW_ENV.setLoaded("anydb.datascript.core.js");
19
+
20
+ goog.provide('anydb.datascript.core');
21
+ if((typeof anydb !== 'undefined') && (typeof anydb.datascript !== 'undefined') && (typeof anydb.datascript.core !== 'undefined') && (typeof anydb.datascript.core.db_registry !== 'undefined')){
22
+ } else {
23
+ anydb.datascript.core.db_registry = cljs.core.atom.cljs$core$IFn$_invoke$arity$1(cljs.core.PersistentArrayMap.EMPTY);
24
+ }
25
+ anydb.datascript.core.schema_attributes = new cljs.core.PersistentHashSet(null, new cljs.core.PersistentArrayMap(null, 9, [new cljs.core.Keyword("db","index","db/index",-1531680669),null,new cljs.core.Keyword("db","unique","db/unique",329396388),null,new cljs.core.Keyword("db","valueType","db/valueType",1827971944),null,new cljs.core.Keyword("db","noHistory","db/noHistory",-1975127444),null,new cljs.core.Keyword("db","isComponent","db/isComponent",423352398),null,new cljs.core.Keyword("db","fulltext","db/fulltext",-1432910705),null,new cljs.core.Keyword("db","cardinality","db/cardinality",-104975659),null,new cljs.core.Keyword("db","doc","db/doc",1913350069),null,new cljs.core.Keyword("db","ident","db/ident",-737096),null], null), null);
26
+ /**
27
+ * Detect if a transaction contains schema attribute changes
28
+ */
29
+ anydb.datascript.core.detect_schema_changes = (function anydb$datascript$core$detect_schema_changes(tx_data){
30
+ return cljs.core.some((function (datom_or_map){
31
+ var attrs = ((cljs.core.map_QMARK_(datom_or_map))?cljs.core.keys(datom_or_map):new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"a","a",-2123407586).cljs$core$IFn$_invoke$arity$1(datom_or_map)], null));
32
+ return cljs.core.some(anydb.datascript.core.schema_attributes,attrs);
33
+ }),tx_data);
34
+ });
35
+ /**
36
+ * Extract schema map from current database for recreation
37
+ */
38
+ anydb.datascript.core.extract_schema_from_db = (function anydb$datascript$core$extract_schema_from_db(db){
39
+ var schema_datoms = datascript.core.datoms.cljs$core$IFn$_invoke$arity$2(db,new cljs.core.Keyword(null,"aevt","aevt",-585148059));
40
+ return cljs.core.into.cljs$core$IFn$_invoke$arity$2(cljs.core.PersistentArrayMap.EMPTY,cljs.core.map.cljs$core$IFn$_invoke$arity$2((function (attr_map){
41
+ return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword("db","ident","db/ident",-737096).cljs$core$IFn$_invoke$arity$1(attr_map),cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2(attr_map,new cljs.core.Keyword("db","ident","db/ident",-737096))], null);
42
+ }),cljs.core.filter.cljs$core$IFn$_invoke$arity$2((function (p1__15283_SHARP_){
43
+ return cljs.core.contains_QMARK_(p1__15283_SHARP_,new cljs.core.Keyword("db","ident","db/ident",-737096));
44
+ }),cljs.core.map.cljs$core$IFn$_invoke$arity$2((function (p__15284){
45
+ var vec__15285 = p__15284;
46
+ var _ = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__15285,(0),null);
47
+ var datoms = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__15285,(1),null);
48
+ return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (acc,p__15288){
49
+ var map__15289 = p__15288;
50
+ var map__15289__$1 = cljs.core.__destructure_map(map__15289);
51
+ var a = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__15289__$1,new cljs.core.Keyword(null,"a","a",-2123407586));
52
+ var v = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__15289__$1,new cljs.core.Keyword(null,"v","v",21465059));
53
+ return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(acc,a,v);
54
+ }),cljs.core.PersistentArrayMap.EMPTY,datoms);
55
+ }),cljs.core.group_by(new cljs.core.Keyword(null,"e","e",1381269198),cljs.core.filter.cljs$core$IFn$_invoke$arity$2((function (p1__15282_SHARP_){
56
+ var G__15290 = new cljs.core.Keyword(null,"a","a",-2123407586).cljs$core$IFn$_invoke$arity$1(p1__15282_SHARP_);
57
+ return (anydb.datascript.core.schema_attributes.cljs$core$IFn$_invoke$arity$1 ? anydb.datascript.core.schema_attributes.cljs$core$IFn$_invoke$arity$1(G__15290) : anydb.datascript.core.schema_attributes.call(null,G__15290));
58
+ }),schema_datoms))))));
59
+ });
60
+ /**
61
+ * Check for schema changes and recreate connection if needed
62
+ */
63
+ anydb.datascript.core.migrate_schema_if_needed = (function anydb$datascript$core$migrate_schema_if_needed(db_alias,conn,tx_data){
64
+ if(cljs.core.truth_(anydb.datascript.core.detect_schema_changes(tx_data))){
65
+ var old_db = datascript.core.db(conn);
66
+ var old_schema = anydb.datascript.core.extract_schema_from_db(old_db);
67
+ var all_datoms = cljs.core.vec(datascript.core.datoms.cljs$core$IFn$_invoke$arity$2(old_db,new cljs.core.Keyword(null,"eavt","eavt",-666437073)));
68
+ var temp_conn = (datascript.core.create_conn.cljs$core$IFn$_invoke$arity$1 ? datascript.core.create_conn.cljs$core$IFn$_invoke$arity$1(old_schema) : datascript.core.create_conn.call(null,old_schema));
69
+ var _ = (datascript.core.transact_BANG_.cljs$core$IFn$_invoke$arity$2 ? datascript.core.transact_BANG_.cljs$core$IFn$_invoke$arity$2(temp_conn,tx_data) : datascript.core.transact_BANG_.call(null,temp_conn,tx_data));
70
+ var new_schema = anydb.datascript.core.extract_schema_from_db(datascript.core.db(temp_conn));
71
+ var new_conn = (datascript.core.create_conn.cljs$core$IFn$_invoke$arity$1 ? datascript.core.create_conn.cljs$core$IFn$_invoke$arity$1(new_schema) : datascript.core.create_conn.call(null,new_schema));
72
+ var non_schema_datoms_15309 = cljs.core.remove.cljs$core$IFn$_invoke$arity$2((function (p1__15291_SHARP_){
73
+ var G__15292 = new cljs.core.Keyword(null,"a","a",-2123407586).cljs$core$IFn$_invoke$arity$1(p1__15291_SHARP_);
74
+ return (anydb.datascript.core.schema_attributes.cljs$core$IFn$_invoke$arity$1 ? anydb.datascript.core.schema_attributes.cljs$core$IFn$_invoke$arity$1(G__15292) : anydb.datascript.core.schema_attributes.call(null,G__15292));
75
+ }),all_datoms);
76
+ if(cljs.core.seq(non_schema_datoms_15309)){
77
+ var G__15293_15310 = new_conn;
78
+ var G__15294_15311 = cljs.core.mapv.cljs$core$IFn$_invoke$arity$2((function (p__15295){
79
+ var map__15296 = p__15295;
80
+ var map__15296__$1 = cljs.core.__destructure_map(map__15296);
81
+ var e = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__15296__$1,new cljs.core.Keyword(null,"e","e",1381269198));
82
+ var a = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__15296__$1,new cljs.core.Keyword(null,"a","a",-2123407586));
83
+ var v = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__15296__$1,new cljs.core.Keyword(null,"v","v",21465059));
84
+ return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword("db","add","db/add",235286841),e,a,v], null);
85
+ }),non_schema_datoms_15309);
86
+ (datascript.core.transact_BANG_.cljs$core$IFn$_invoke$arity$2 ? datascript.core.transact_BANG_.cljs$core$IFn$_invoke$arity$2(G__15293_15310,G__15294_15311) : datascript.core.transact_BANG_.call(null,G__15293_15310,G__15294_15311));
87
+ } else {
88
+ }
89
+
90
+ (datascript.core.transact_BANG_.cljs$core$IFn$_invoke$arity$2 ? datascript.core.transact_BANG_.cljs$core$IFn$_invoke$arity$2(new_conn,tx_data) : datascript.core.transact_BANG_.call(null,new_conn,tx_data));
91
+
92
+ cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4(anydb.datascript.core.db_registry,cljs.core.assoc,db_alias,new_conn);
93
+
94
+ return new_conn;
95
+ } else {
96
+ (datascript.core.transact_BANG_.cljs$core$IFn$_invoke$arity$2 ? datascript.core.transact_BANG_.cljs$core$IFn$_invoke$arity$2(conn,tx_data) : datascript.core.transact_BANG_.call(null,conn,tx_data));
97
+
98
+ return conn;
99
+ }
100
+ });
101
+ /**
102
+ * Get or create a DataScript connection for a database alias
103
+ */
104
+ anydb.datascript.core.get_or_create_conn = (function anydb$datascript$core$get_or_create_conn(db_alias){
105
+ var or__5002__auto__ = cljs.core.get.cljs$core$IFn$_invoke$arity$2(cljs.core.deref(anydb.datascript.core.db_registry),db_alias);
106
+ if(cljs.core.truth_(or__5002__auto__)){
107
+ return or__5002__auto__;
108
+ } else {
109
+ var initial_schema = anydb.datascript.schema.get_initial_schema();
110
+ var conn = (datascript.core.create_conn.cljs$core$IFn$_invoke$arity$1 ? datascript.core.create_conn.cljs$core$IFn$_invoke$arity$1(initial_schema) : datascript.core.create_conn.call(null,initial_schema));
111
+ cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4(anydb.datascript.core.db_registry,cljs.core.assoc,db_alias,conn);
112
+
113
+ return conn;
114
+ }
115
+ });
116
+ /**
117
+ * List all currently active DataScript databases
118
+ */
119
+ anydb.datascript.core.list_databases = (function anydb$datascript$core$list_databases(){
120
+ return cljs.core.vec(cljs.core.keys(cljs.core.deref(anydb.datascript.core.db_registry)));
121
+ });
122
+ /**
123
+ * Delete a DataScript database (remove from registry)
124
+ */
125
+ anydb.datascript.core.delete_database = (function anydb$datascript$core$delete_database(db_alias){
126
+ if(cljs.core.contains_QMARK_(cljs.core.deref(anydb.datascript.core.db_registry),db_alias)){
127
+ cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$3(anydb.datascript.core.db_registry,cljs.core.dissoc,db_alias);
128
+
129
+ return new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"db-deleted","db-deleted",1500904071),db_alias], null);
130
+ } else {
131
+ return null;
132
+ }
133
+ });
134
+ /**
135
+ * Execute transaction on DataScript database with schema migration
136
+ */
137
+ anydb.datascript.core.transact = (function anydb$datascript$core$transact(db_alias,tx_data){
138
+ var conn = anydb.datascript.core.get_or_create_conn(db_alias);
139
+ var old_db = datascript.core.db(conn);
140
+ var updated_conn = anydb.datascript.core.migrate_schema_if_needed(db_alias,conn,tx_data);
141
+ var new_db = datascript.core.db(updated_conn);
142
+ var tx_report = cljs.core.deref(datascript.core.transact.cljs$core$IFn$_invoke$arity$2(updated_conn,cljs.core.PersistentVector.EMPTY));
143
+ return new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"db-before","db-before",-553691536),old_db,new cljs.core.Keyword(null,"db-after","db-after",-571884666),new_db,new cljs.core.Keyword(null,"tx-data","tx-data",934159761),new cljs.core.Keyword(null,"tx-data","tx-data",934159761).cljs$core$IFn$_invoke$arity$1(tx_report),new cljs.core.Keyword(null,"tempids","tempids",1767509089),new cljs.core.Keyword(null,"tempids","tempids",1767509089).cljs$core$IFn$_invoke$arity$1(tx_report)], null);
144
+ });
145
+ /**
146
+ * Execute Datalog query on DataScript database
147
+ */
148
+ anydb.datascript.core.query = (function anydb$datascript$core$query(var_args){
149
+ var args__5732__auto__ = [];
150
+ var len__5726__auto___15312 = arguments.length;
151
+ var i__5727__auto___15313 = (0);
152
+ while(true){
153
+ if((i__5727__auto___15313 < len__5726__auto___15312)){
154
+ args__5732__auto__.push((arguments[i__5727__auto___15313]));
155
+
156
+ var G__15314 = (i__5727__auto___15313 + (1));
157
+ i__5727__auto___15313 = G__15314;
158
+ continue;
159
+ } else {
160
+ }
161
+ break;
162
+ }
163
+
164
+ var argseq__5733__auto__ = ((((2) < args__5732__auto__.length))?(new cljs.core.IndexedSeq(args__5732__auto__.slice((2)),(0),null)):null);
165
+ return anydb.datascript.core.query.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__5733__auto__);
166
+ });
167
+
168
+ (anydb.datascript.core.query.cljs$core$IFn$_invoke$arity$variadic = (function (q,db_alias,args){
169
+ var conn = anydb.datascript.core.get_or_create_conn(db_alias);
170
+ var db = datascript.core.db(conn);
171
+ return cljs.core.apply.cljs$core$IFn$_invoke$arity$4(datascript.core.q,q,db,args);
172
+ }));
173
+
174
+ (anydb.datascript.core.query.cljs$lang$maxFixedArity = (2));
175
+
176
+ /** @this {Function} */
177
+ (anydb.datascript.core.query.cljs$lang$applyTo = (function (seq15297){
178
+ var G__15298 = cljs.core.first(seq15297);
179
+ var seq15297__$1 = cljs.core.next(seq15297);
180
+ var G__15299 = cljs.core.first(seq15297__$1);
181
+ var seq15297__$2 = cljs.core.next(seq15297__$1);
182
+ var self__5711__auto__ = this;
183
+ return self__5711__auto__.cljs$core$IFn$_invoke$arity$variadic(G__15298,G__15299,seq15297__$2);
184
+ }));
185
+
186
+ /**
187
+ * Get entity by ID from DataScript database
188
+ */
189
+ anydb.datascript.core.entity = (function anydb$datascript$core$entity(db_alias,entity_id){
190
+ var conn = anydb.datascript.core.get_or_create_conn(db_alias);
191
+ var db = datascript.core.db(conn);
192
+ return (datascript.core.entity.cljs$core$IFn$_invoke$arity$2 ? datascript.core.entity.cljs$core$IFn$_invoke$arity$2(db,entity_id) : datascript.core.entity.call(null,db,entity_id));
193
+ });
194
+ /**
195
+ * Get datoms from DataScript database
196
+ */
197
+ anydb.datascript.core.datoms = (function anydb$datascript$core$datoms(var_args){
198
+ var args__5732__auto__ = [];
199
+ var len__5726__auto___15315 = arguments.length;
200
+ var i__5727__auto___15316 = (0);
201
+ while(true){
202
+ if((i__5727__auto___15316 < len__5726__auto___15315)){
203
+ args__5732__auto__.push((arguments[i__5727__auto___15316]));
204
+
205
+ var G__15317 = (i__5727__auto___15316 + (1));
206
+ i__5727__auto___15316 = G__15317;
207
+ continue;
208
+ } else {
209
+ }
210
+ break;
211
+ }
212
+
213
+ var argseq__5733__auto__ = ((((2) < args__5732__auto__.length))?(new cljs.core.IndexedSeq(args__5732__auto__.slice((2)),(0),null)):null);
214
+ return anydb.datascript.core.datoms.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__5733__auto__);
215
+ });
216
+
217
+ (anydb.datascript.core.datoms.cljs$core$IFn$_invoke$arity$variadic = (function (db_alias,index,components){
218
+ var conn = anydb.datascript.core.get_or_create_conn(db_alias);
219
+ var db = datascript.core.db(conn);
220
+ return cljs.core.apply.cljs$core$IFn$_invoke$arity$4(datascript.core.datoms,db,index,components);
221
+ }));
222
+
223
+ (anydb.datascript.core.datoms.cljs$lang$maxFixedArity = (2));
224
+
225
+ /** @this {Function} */
226
+ (anydb.datascript.core.datoms.cljs$lang$applyTo = (function (seq15300){
227
+ var G__15301 = cljs.core.first(seq15300);
228
+ var seq15300__$1 = cljs.core.next(seq15300);
229
+ var G__15302 = cljs.core.first(seq15300__$1);
230
+ var seq15300__$2 = cljs.core.next(seq15300__$1);
231
+ var self__5711__auto__ = this;
232
+ return self__5711__auto__.cljs$core$IFn$_invoke$arity$variadic(G__15301,G__15302,seq15300__$2);
233
+ }));
234
+
235
+ anydb.datascript.core.createDatabase = (function anydb$datascript$core$createDatabase(db_alias){
236
+ anydb.datascript.core.get_or_create_conn(db_alias);
237
+
238
+ return new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"db-created","db-created",1312908662),db_alias], null);
239
+ });
240
+ anydb.datascript.core.listDatabases = (function anydb$datascript$core$listDatabases(){
241
+ return cljs.core.clj__GT_js(anydb.datascript.core.list_databases());
242
+ });
243
+ anydb.datascript.core.deleteDatabase = (function anydb$datascript$core$deleteDatabase(db_alias){
244
+ return cljs.core.clj__GT_js(anydb.datascript.core.delete_database(db_alias));
245
+ });
246
+ anydb.datascript.core.transactData = (function anydb$datascript$core$transactData(db_alias,tx_data_edn){
247
+ var tx_data = clojure.edn.read_string.cljs$core$IFn$_invoke$arity$1(tx_data_edn);
248
+ return cljs.core.clj__GT_js(anydb.datascript.core.transact(db_alias,tx_data));
249
+ });
250
+ anydb.datascript.core.queryData = (function anydb$datascript$core$queryData(var_args){
251
+ var args__5732__auto__ = [];
252
+ var len__5726__auto___15318 = arguments.length;
253
+ var i__5727__auto___15319 = (0);
254
+ while(true){
255
+ if((i__5727__auto___15319 < len__5726__auto___15318)){
256
+ args__5732__auto__.push((arguments[i__5727__auto___15319]));
257
+
258
+ var G__15320 = (i__5727__auto___15319 + (1));
259
+ i__5727__auto___15319 = G__15320;
260
+ continue;
261
+ } else {
262
+ }
263
+ break;
264
+ }
265
+
266
+ var argseq__5733__auto__ = ((((2) < args__5732__auto__.length))?(new cljs.core.IndexedSeq(args__5732__auto__.slice((2)),(0),null)):null);
267
+ return anydb.datascript.core.queryData.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__5733__auto__);
268
+ });
269
+ goog.exportSymbol('anydb.datascript.core.queryData', anydb.datascript.core.queryData);
270
+
271
+ (anydb.datascript.core.queryData.cljs$core$IFn$_invoke$arity$variadic = (function (q_edn,db_alias,args_edn){
272
+ var q = clojure.edn.read_string.cljs$core$IFn$_invoke$arity$1(q_edn);
273
+ var args = cljs.core.map.cljs$core$IFn$_invoke$arity$2(clojure.edn.read_string,args_edn);
274
+ return cljs.core.clj__GT_js(cljs.core.apply.cljs$core$IFn$_invoke$arity$4(anydb.datascript.core.query,q,db_alias,args));
275
+ }));
276
+
277
+ (anydb.datascript.core.queryData.cljs$lang$maxFixedArity = (2));
278
+
279
+ /** @this {Function} */
280
+ (anydb.datascript.core.queryData.cljs$lang$applyTo = (function (seq15303){
281
+ var G__15304 = cljs.core.first(seq15303);
282
+ var seq15303__$1 = cljs.core.next(seq15303);
283
+ var G__15305 = cljs.core.first(seq15303__$1);
284
+ var seq15303__$2 = cljs.core.next(seq15303__$1);
285
+ var self__5711__auto__ = this;
286
+ return self__5711__auto__.cljs$core$IFn$_invoke$arity$variadic(G__15304,G__15305,seq15303__$2);
287
+ }));
288
+
289
+ anydb.datascript.core.getEntity = (function anydb$datascript$core$getEntity(db_alias,entity_id){
290
+ return cljs.core.clj__GT_js(anydb.datascript.core.entity(db_alias,entity_id));
291
+ });
292
+ anydb.datascript.core.getDatoms = (function anydb$datascript$core$getDatoms(var_args){
293
+ var args__5732__auto__ = [];
294
+ var len__5726__auto___15321 = arguments.length;
295
+ var i__5727__auto___15322 = (0);
296
+ while(true){
297
+ if((i__5727__auto___15322 < len__5726__auto___15321)){
298
+ args__5732__auto__.push((arguments[i__5727__auto___15322]));
299
+
300
+ var G__15323 = (i__5727__auto___15322 + (1));
301
+ i__5727__auto___15322 = G__15323;
302
+ continue;
303
+ } else {
304
+ }
305
+ break;
306
+ }
307
+
308
+ var argseq__5733__auto__ = ((((2) < args__5732__auto__.length))?(new cljs.core.IndexedSeq(args__5732__auto__.slice((2)),(0),null)):null);
309
+ return anydb.datascript.core.getDatoms.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__5733__auto__);
310
+ });
311
+ goog.exportSymbol('anydb.datascript.core.getDatoms', anydb.datascript.core.getDatoms);
312
+
313
+ (anydb.datascript.core.getDatoms.cljs$core$IFn$_invoke$arity$variadic = (function (db_alias,index,components){
314
+ return cljs.core.clj__GT_js(cljs.core.apply.cljs$core$IFn$_invoke$arity$4(anydb.datascript.core.datoms,db_alias,cljs.core.keyword.cljs$core$IFn$_invoke$arity$1(index),components));
315
+ }));
316
+
317
+ (anydb.datascript.core.getDatoms.cljs$lang$maxFixedArity = (2));
318
+
319
+ /** @this {Function} */
320
+ (anydb.datascript.core.getDatoms.cljs$lang$applyTo = (function (seq15306){
321
+ var G__15307 = cljs.core.first(seq15306);
322
+ var seq15306__$1 = cljs.core.next(seq15306);
323
+ var G__15308 = cljs.core.first(seq15306__$1);
324
+ var seq15306__$2 = cljs.core.next(seq15306__$1);
325
+ var self__5711__auto__ = this;
326
+ return self__5711__auto__.cljs$core$IFn$_invoke$arity$variadic(G__15307,G__15308,seq15306__$2);
327
+ }));
328
+
329
+ Object.defineProperty(module.exports, "createDatabase", { enumerable: true, get: function() { return anydb.datascript.core.createDatabase; } });
330
+ Object.defineProperty(module.exports, "listDatabases", { enumerable: true, get: function() { return anydb.datascript.core.listDatabases; } });
331
+ Object.defineProperty(module.exports, "deleteDatabase", { enumerable: true, get: function() { return anydb.datascript.core.deleteDatabase; } });
332
+ Object.defineProperty(module.exports, "transactData", { enumerable: true, get: function() { return anydb.datascript.core.transactData; } });
333
+ Object.defineProperty(module.exports, "queryData", { enumerable: true, get: function() { return anydb.datascript.core.queryData; } });
334
+ Object.defineProperty(module.exports, "getEntity", { enumerable: true, get: function() { return anydb.datascript.core.getEntity; } });
335
+ Object.defineProperty(module.exports, "getDatoms", { enumerable: true, get: function() { return anydb.datascript.core.getDatoms; } });
336
+ //# sourceMappingURL=anydb.datascript.core.js.map
@@ -0,0 +1,29 @@
1
+ var $CLJS = require("./cljs_env");
2
+ var $jscomp = $CLJS.$jscomp;
3
+ var COMPILED = false;
4
+ require("./cljs.core.js");
5
+ var anydb=$CLJS.anydb || ($CLJS.anydb = {});
6
+ var clojure=$CLJS.clojure || ($CLJS.clojure = {});
7
+ var cljs=$CLJS.cljs || ($CLJS.cljs = {});
8
+ var goog=$CLJS.goog || ($CLJS.goog = {});
9
+ var datascript=$CLJS.datascript || ($CLJS.datascript = {});
10
+ var me=$CLJS.me || ($CLJS.me = {});
11
+ var extend_clj=$CLJS.extend_clj || ($CLJS.extend_clj = {});
12
+
13
+ $CLJS.SHADOW_ENV.setLoaded("anydb.datascript.rules.js");
14
+
15
+ goog.provide('anydb.datascript.rules');
16
+ /**
17
+ * Create ABAC filter - for now just allow everything for development
18
+ */
19
+ anydb.datascript.rules.make_abac_filter = (function anydb$datascript$rules$make_abac_filter(db,subject,action){
20
+ return cljs.core.constantly(true);
21
+ });
22
+ /**
23
+ * Find policies - placeholder for development
24
+ */
25
+ anydb.datascript.rules.find_policies = (function anydb$datascript$rules$find_policies(db,subject,action){
26
+ return cljs.core.PersistentVector.EMPTY;
27
+ });
28
+
29
+ //# sourceMappingURL=anydb.datascript.rules.js.map
@@ -0,0 +1,35 @@
1
+ var $CLJS = require("./cljs_env");
2
+ var $jscomp = $CLJS.$jscomp;
3
+ var COMPILED = false;
4
+ require("./cljs.core.js");
5
+ var anydb=$CLJS.anydb || ($CLJS.anydb = {});
6
+ var clojure=$CLJS.clojure || ($CLJS.clojure = {});
7
+ var cljs=$CLJS.cljs || ($CLJS.cljs = {});
8
+ var goog=$CLJS.goog || ($CLJS.goog = {});
9
+ var datascript=$CLJS.datascript || ($CLJS.datascript = {});
10
+ var me=$CLJS.me || ($CLJS.me = {});
11
+ var extend_clj=$CLJS.extend_clj || ($CLJS.extend_clj = {});
12
+
13
+ $CLJS.SHADOW_ENV.setLoaded("anydb.datascript.schema.js");
14
+
15
+ goog.provide('anydb.datascript.schema');
16
+ /**
17
+ * Base schema with essential Datomic attributes
18
+ */
19
+ anydb.datascript.schema.base_schema = cljs.core.PersistentHashMap.fromArrays([new cljs.core.Keyword("db","index","db/index",-1531680669),new cljs.core.Keyword("db","unique","db/unique",329396388),new cljs.core.Keyword("db","valueType","db/valueType",1827971944),new cljs.core.Keyword("db","noHistory","db/noHistory",-1975127444),new cljs.core.Keyword("db","isComponent","db/isComponent",423352398),new cljs.core.Keyword("db","fulltext","db/fulltext",-1432910705),new cljs.core.Keyword("db","cardinality","db/cardinality",-104975659),new cljs.core.Keyword("db","doc","db/doc",1913350069),new cljs.core.Keyword("db","ident","db/ident",-737096)],[cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("db","unique","db/unique",329396388),new cljs.core.Keyword("db.unique","identity","db.unique/identity",1675950722)], null)]);
20
+ /**
21
+ * Authentication schema matching Datomic version
22
+ */
23
+ anydb.datascript.schema.auth_schema = cljs.core.PersistentHashMap.fromArrays([new cljs.core.Keyword("anydb.auth.account.v1","expires-at","anydb.auth.account.v1/expires-at",606383524),new cljs.core.Keyword("anydb.auth.session.v1","user-id","anydb.auth.session.v1/user-id",-1474562396),new cljs.core.Keyword("anydb.auth.user.v1","email","anydb.auth.user.v1/email",408674374),new cljs.core.Keyword("anydb.auth.account.v1","provider-account-id","anydb.auth.account.v1/provider-account-id",354659754),new cljs.core.Keyword("anydb.auth.account.v1","type","anydb.auth.account.v1/type",2122210282),new cljs.core.Keyword("anydb.auth.account.v1","user-id","anydb.auth.account.v1/user-id",858502027),new cljs.core.Keyword("anydb.auth.vtoken.v1","expires","anydb.auth.vtoken.v1/expires",-1415084052),new cljs.core.Keyword("anydb.auth.account.v1","token-type","anydb.auth.account.v1/token-type",230053326),new cljs.core.Keyword("anydb.auth.account.v1","scope","anydb.auth.account.v1/scope",626022544),new cljs.core.Keyword("anydb.auth.account.v1","id-token","anydb.auth.account.v1/id-token",-1438219888),new cljs.core.Keyword("anydb.auth.vtoken.v1","id","anydb.auth.vtoken.v1/id",85885712),new cljs.core.Keyword("anydb.auth.session.v1","session-token","anydb.auth.session.v1/session-token",1759289457),new cljs.core.Keyword("anydb.auth.vtoken.v1","identifier","anydb.auth.vtoken.v1/identifier",765319474),new cljs.core.Keyword("anydb.auth.user.v1","email-verified","anydb.auth.user.v1/email-verified",-1060690478),new cljs.core.Keyword("anydb.auth.user.v1","name","anydb.auth.user.v1/name",837523829),new cljs.core.Keyword("anydb.auth.vtoken.v1","token","anydb.auth.vtoken.v1/token",560685717),new cljs.core.Keyword("anydb.auth.account.v1","id","anydb.auth.account.v1/id",-306231562),new cljs.core.Keyword("anydb.auth.account.v1","access-token","anydb.auth.account.v1/access-token",411190071),new cljs.core.Keyword("anydb.auth.user.v1","id","anydb.auth.user.v1/id",424050968),new cljs.core.Keyword("anydb.auth.account.v1","session-state","anydb.auth.account.v1/session-state",-1912084678),new cljs.core.Keyword("anydb.auth.session.v1","expires","anydb.auth.session.v1/expires",-375846693),new cljs.core.Keyword("anydb.auth.user.v1","image","anydb.auth.user.v1/image",813147164),new cljs.core.Keyword("anydb.auth.account.v1","refresh-token","anydb.auth.account.v1/refresh-token",50087070),new cljs.core.Keyword("anydb.auth.account.v1","provider","anydb.auth.account.v1/provider",763211294),new cljs.core.Keyword("anydb.auth.session.v1","id","anydb.auth.session.v1/id",1999569887)],[cljs.core.PersistentArrayMap.EMPTY,new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("db","valueType","db/valueType",1827971944),new cljs.core.Keyword("db.type","ref","db.type/ref",-1728373079)], null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("db","unique","db/unique",329396388),new cljs.core.Keyword("db.unique","identity","db.unique/identity",1675950722)], null),cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("db","valueType","db/valueType",1827971944),new cljs.core.Keyword("db.type","ref","db.type/ref",-1728373079)], null),cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("db","unique","db/unique",329396388),new cljs.core.Keyword("db.unique","identity","db.unique/identity",1675950722)], null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("db","unique","db/unique",329396388),new cljs.core.Keyword("db.unique","identity","db.unique/identity",1675950722)], null),cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("db","unique","db/unique",329396388),new cljs.core.Keyword("db.unique","identity","db.unique/identity",1675950722)], null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("db","unique","db/unique",329396388),new cljs.core.Keyword("db.unique","identity","db.unique/identity",1675950722)], null),cljs.core.PersistentArrayMap.EMPTY,new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("db","unique","db/unique",329396388),new cljs.core.Keyword("db.unique","identity","db.unique/identity",1675950722)], null),cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("db","unique","db/unique",329396388),new cljs.core.Keyword("db.unique","identity","db.unique/identity",1675950722)], null)]);
24
+ /**
25
+ * ABAC policy schema
26
+ */
27
+ anydb.datascript.schema.policy_schema = cljs.core.PersistentHashMap.fromArrays([new cljs.core.Keyword("anydb.policy.v1","condition","anydb.policy.v1/condition",157767879),new cljs.core.Keyword("anydb.policy.v1","resources","anydb.policy.v1/resources",-1155158966),new cljs.core.Keyword("anydb.policy.v1","subject","anydb.policy.v1/subject",1575700076),new cljs.core.Keyword("anydb.effect.v1","allow","anydb.effect.v1/allow",-215888429),new cljs.core.Keyword("anydb.action.v1","read","anydb.action.v1/read",186721782),new cljs.core.Keyword("anydb.effect.v1","deny","anydb.effect.v1/deny",-87231945),new cljs.core.Keyword("anydb.system.v1","subject","anydb.system.v1/subject",-1423265001),new cljs.core.Keyword("anydb.policy.v1","effect","anydb.policy.v1/effect",1118373528),new cljs.core.Keyword("anydb.action.v1","write","anydb.action.v1/write",707273535),new cljs.core.Keyword("anydb.policy.v1","actions","anydb.policy.v1/actions",1038406495)],[cljs.core.PersistentArrayMap.EMPTY,new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("db","cardinality","db/cardinality",-104975659),new cljs.core.Keyword("db.cardinality","many","db.cardinality/many",772806234)], null),cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,cljs.core.PersistentArrayMap.EMPTY,new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("db","cardinality","db/cardinality",-104975659),new cljs.core.Keyword("db.cardinality","many","db.cardinality/many",772806234)], null)]);
28
+ /**
29
+ * Get complete initial schema for DataScript
30
+ */
31
+ anydb.datascript.schema.get_initial_schema = (function anydb$datascript$schema$get_initial_schema(){
32
+ return cljs.core.merge.cljs$core$IFn$_invoke$arity$variadic(cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([anydb.datascript.schema.base_schema,anydb.datascript.schema.auth_schema,anydb.datascript.schema.policy_schema], 0));
33
+ });
34
+
35
+ //# sourceMappingURL=anydb.datascript.schema.js.map
package/dist/auth.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ export interface SignAnyDBTokenOptions {
2
+ secret: string;
3
+ sub: string;
4
+ aud: string;
5
+ iss?: string;
6
+ ttlSeconds?: number;
7
+ iat?: number;
8
+ }
9
+ export declare function signAnyDBToken(opts: SignAnyDBTokenOptions): string;
10
+ export interface ServiceTokenProviderOptions {
11
+ secret: string;
12
+ storageAlias: string;
13
+ dbName: string;
14
+ iss?: string;
15
+ ttlSeconds?: number;
16
+ sub?: string;
17
+ }
18
+ export declare function createServiceTokenProvider(opts: ServiceTokenProviderOptions): () => string;
19
+ export interface SignFromSessionClaimsOptions {
20
+ claims: Record<string, any>;
21
+ secret: string;
22
+ storageAlias: string;
23
+ dbName: string;
24
+ iss?: string;
25
+ ttlSeconds?: number;
26
+ }
27
+ export declare function signFromSessionClaims(opts: SignFromSessionClaimsOptions): string;
28
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAgBlE;AAKD,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,2BAA2B,GAChC,MAAM,MAAM,CAQd;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,4BAA4B,GACjC,MAAM,CAUR"}
package/dist/auth.js ADDED
@@ -0,0 +1,52 @@
1
+ // Auth utilities for issuing AnyDB-compatible JWS tokens and normalizing subjects
2
+ // Server-only: depends on Node's crypto for HMAC-SHA256
3
+ import { createHmac } from "crypto";
4
+ function base64url(input) {
5
+ const buf = Buffer.isBuffer(input) ? input : Buffer.from(input);
6
+ return buf
7
+ .toString("base64")
8
+ .replace(/=/g, "")
9
+ .replace(/\+/g, "-")
10
+ .replace(/\//g, "_");
11
+ }
12
+ function hmacSha256(data, secret) {
13
+ return createHmac("sha256", secret).update(data).digest();
14
+ }
15
+ function nowSeconds() {
16
+ return Math.floor(Date.now() / 1000);
17
+ }
18
+ export function signAnyDBToken(opts) {
19
+ const iat = opts.iat ?? nowSeconds();
20
+ const exp = iat + (opts.ttlSeconds ?? 15 * 60);
21
+ const header = { alg: "HS256", typ: "JWT" };
22
+ const payload = {
23
+ sub: opts.sub,
24
+ aud: opts.aud,
25
+ iss: opts.iss || "anydb-sdk",
26
+ iat,
27
+ exp,
28
+ };
29
+ const hB64 = base64url(JSON.stringify(header));
30
+ const pB64 = base64url(JSON.stringify(payload));
31
+ const signingInput = `${hB64}.${pB64}`;
32
+ const sig = base64url(hmacSha256(signingInput, opts.secret));
33
+ return `${signingInput}.${sig}`;
34
+ }
35
+ export function createServiceTokenProvider(opts) {
36
+ const iss = opts.iss || "anydb-sdk-service";
37
+ const ttl = opts.ttlSeconds ?? 60 * 60;
38
+ const aud = `${opts.storageAlias}/${opts.dbName}`;
39
+ const sub = opts.sub || "[:db/ident :anydb.system.v1/subject]";
40
+ return () => signAnyDBToken({ secret: opts.secret, sub, aud, iss, ttlSeconds: ttl });
41
+ }
42
+ export function signFromSessionClaims(opts) {
43
+ const iss = opts.iss || "anydb-sdk-auth";
44
+ const ttl = opts.ttlSeconds ?? 15 * 60;
45
+ const aud = `${opts.storageAlias}/${opts.dbName}`;
46
+ const rawSub = opts.claims?.sub;
47
+ if (typeof rawSub !== "string" || !rawSub.trim()) {
48
+ throw new Error("Invalid session: missing or invalid 'sub' in claims");
49
+ }
50
+ const sub = rawSub;
51
+ return signAnyDBToken({ secret: opts.secret, sub, aud, iss, ttlSeconds: ttl });
52
+ }
package/dist/client.d.ts CHANGED
@@ -113,4 +113,5 @@ export declare function createAnyDBClient(client: DatomicClient, storageAlias: s
113
113
  export declare function pluckFirstColumn(rows: any[][]): any[];
114
114
  export { shouldUseDataScript, isDataScriptAvailable };
115
115
  export default DatomicClient;
116
+ export declare function ensureAttributes(db: AnyDBClient, schemaEntities: Array<Record<string, any>>): Promise<void>;
116
117
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -363,3 +363,62 @@ export function pluckFirstColumn(rows) {
363
363
  // Re-export DataScript helpers for consumers that need feature-detection
364
364
  export { shouldUseDataScript, isDataScriptAvailable };
365
365
  export default DatomicClient;
366
+ // ===== Schema helpers (idempotent ensure) =====
367
+ const __ensuredIdentsCache = new Map();
368
+ function getDbAliasCached(db) {
369
+ return db.info().then((info) => info["db/alias"]);
370
+ }
371
+ function extractIdentName(entity) {
372
+ const identVal = entity["db/ident"];
373
+ if (!identVal)
374
+ return null;
375
+ if (typeof identVal === "string")
376
+ return identVal.startsWith(":") ? identVal.slice(1) : identVal;
377
+ if (typeof identVal === "object" && identVal && identVal._type === "keyword") {
378
+ return identVal.value;
379
+ }
380
+ return null;
381
+ }
382
+ export async function ensureAttributes(db, schemaEntities) {
383
+ const alias = await getDbAliasCached(db);
384
+ const cached = __ensuredIdentsCache.get(alias) || new Set();
385
+ // Compute desired idents
386
+ const desired = schemaEntities
387
+ .map(extractIdentName)
388
+ .filter((v) => Boolean(v));
389
+ // Filter out those already ensured in this process
390
+ const toCheck = desired.filter((n) => !cached.has(n));
391
+ if (toCheck.length === 0)
392
+ return;
393
+ // Determine which exist already in DB
394
+ const existing = new Set();
395
+ for (const ident of toCheck) {
396
+ try {
397
+ const q = {
398
+ find: [sym("?e")],
399
+ where: [
400
+ [sym("?e"), kw("db/ident"), kw(ident)],
401
+ ],
402
+ };
403
+ const rows = await db.query(q);
404
+ if (Array.isArray(rows) && rows.length > 0)
405
+ existing.add(ident);
406
+ }
407
+ catch (_) {
408
+ // ignore transient errors
409
+ }
410
+ }
411
+ const missing = toCheck.filter((n) => !existing.has(n));
412
+ if (missing.length > 0) {
413
+ const tx = schemaEntities.filter((e) => {
414
+ const n = extractIdentName(e);
415
+ return n != null && missing.includes(n);
416
+ });
417
+ if (tx.length > 0) {
418
+ await db.transact(tx);
419
+ }
420
+ }
421
+ // Update cache
422
+ const updated = new Set([...cached, ...toCheck]);
423
+ __ensuredIdentsCache.set(alias, updated);
424
+ }