@vertebr/admin 0.1.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 (48) hide show
  1. package/dist/database/configStore.d.ts +10 -0
  2. package/dist/database/configStore.d.ts.map +1 -0
  3. package/dist/database/configStore.js +34 -0
  4. package/dist/database/configStore.js.map +1 -0
  5. package/dist/database/connector.d.ts +31 -0
  6. package/dist/database/connector.d.ts.map +1 -0
  7. package/dist/database/connector.js +187 -0
  8. package/dist/database/connector.js.map +1 -0
  9. package/dist/database/firestore.d.ts +71 -0
  10. package/dist/database/firestore.d.ts.map +1 -0
  11. package/dist/database/firestore.js +115 -0
  12. package/dist/database/firestore.js.map +1 -0
  13. package/dist/database/index.d.ts +8 -0
  14. package/dist/database/index.d.ts.map +1 -0
  15. package/dist/database/index.js +20 -0
  16. package/dist/database/index.js.map +1 -0
  17. package/dist/database/memory.d.ts +12 -0
  18. package/dist/database/memory.d.ts.map +1 -0
  19. package/dist/database/memory.js +116 -0
  20. package/dist/database/memory.js.map +1 -0
  21. package/dist/database/mongo.d.ts +41 -0
  22. package/dist/database/mongo.d.ts.map +1 -0
  23. package/dist/database/mongo.js +151 -0
  24. package/dist/database/mongo.js.map +1 -0
  25. package/dist/database/postgres.d.ts +46 -0
  26. package/dist/database/postgres.d.ts.map +1 -0
  27. package/dist/database/postgres.js +262 -0
  28. package/dist/database/postgres.js.map +1 -0
  29. package/dist/database/types.d.ts +70 -0
  30. package/dist/database/types.d.ts.map +1 -0
  31. package/dist/database/types.js +3 -0
  32. package/dist/database/types.js.map +1 -0
  33. package/dist/index.d.ts +210 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +650 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/schema.d.ts +18 -0
  38. package/dist/schema.d.ts.map +1 -0
  39. package/dist/schema.js +4 -0
  40. package/dist/schema.js.map +1 -0
  41. package/dist/store.d.ts +12 -0
  42. package/dist/store.d.ts.map +1 -0
  43. package/dist/store.js +36 -0
  44. package/dist/store.js.map +1 -0
  45. package/package.json +45 -0
  46. package/static/assets/index-CSsz_d7k.css +1 -0
  47. package/static/assets/index-D5rhtylJ.js +52 -0
  48. package/static/index.html +29 -0
@@ -0,0 +1,10 @@
1
+ import type { ConfigStore } from "../store";
2
+ import type { DatabaseAdapterResolver } from "./types";
3
+ /**
4
+ * Persist Vertebr controls through a host database adapter
5
+ * (Firestore, Postgres, …) instead of a custom store implementation.
6
+ */
7
+ export declare function adapterConfigStore(adapter: DatabaseAdapterResolver, options?: {
8
+ collection?: string;
9
+ }): ConfigStore;
10
+ //# sourceMappingURL=configStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configStore.d.ts","sourceRoot":"","sources":["../../src/database/configStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,KAAK,EAAmB,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAYxE;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,uBAAuB,EAChC,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC,WAAW,CAwBb"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.adapterConfigStore = adapterConfigStore;
4
+ async function resolveAdapter(resolver, ctx) {
5
+ if (typeof resolver === "function") {
6
+ return resolver(ctx ?? { env: "default", request: null });
7
+ }
8
+ return resolver;
9
+ }
10
+ /**
11
+ * Persist Vertebr controls through a host database adapter
12
+ * (Firestore, Postgres, …) instead of a custom store implementation.
13
+ */
14
+ function adapterConfigStore(adapter, options) {
15
+ const collection = options?.collection ?? "vertebr_configs";
16
+ return {
17
+ async get(id, env) {
18
+ const db = await resolveAdapter(adapter, { env, request: null });
19
+ const doc = await db.get(collection, id);
20
+ if (!doc)
21
+ return null;
22
+ const { id: _id, updatedAt: _updatedAt, ...value } = doc;
23
+ return value;
24
+ },
25
+ async set(id, env, value) {
26
+ const db = await resolveAdapter(adapter, { env, request: null });
27
+ await db.set(collection, id, {
28
+ ...value,
29
+ updatedAt: new Date().toISOString(),
30
+ }, { merge: true });
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=configStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configStore.js","sourceRoot":"","sources":["../../src/database/configStore.ts"],"names":[],"mappings":";;AAkBA,gDA2BC;AAzCD,KAAK,UAAU,cAAc,CAC3B,QAAiC,EACjC,GAAoB;IAEpB,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAChC,OAAgC,EAChC,OAAiC;IAEjC,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,iBAAiB,CAAC;IAE5D,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG;YACf,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,GAAG,GAAG,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK;YACtB,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,MAAM,EAAE,CAAC,GAAG,CACV,UAAU,EACV,EAAE,EACF;gBACE,GAAG,KAAK;gBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,EACD,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { Connector } from "../index";
2
+ import type { HandlerContext } from "../schema";
3
+ import type { CollectionResourceDefinition, DatabaseAdapterResolver, DatabaseDoc, DatabaseListOptions } from "./types";
4
+ export type DatabaseConnectorOptions = {
5
+ id?: string;
6
+ /**
7
+ * Default database for all collections.
8
+ * Pass a function to resolve per-environment (Firestore ALS, etc.).
9
+ */
10
+ adapter: DatabaseAdapterResolver;
11
+ collections: CollectionResourceDefinition[];
12
+ };
13
+ /**
14
+ * Opt-in database connector — maps host collections/tables to Vertebr resources.
15
+ *
16
+ * @example
17
+ * vertebrAdmin.use(databaseConnector({
18
+ * adapter: firestoreAdapter({ getDb }),
19
+ * collections: [{
20
+ * id: "products",
21
+ * label: "Products",
22
+ * collection: "products",
23
+ * schema: { name: { type: "string" } },
24
+ * permissions: { update: true },
25
+ * }],
26
+ * }));
27
+ */
28
+ export declare function databaseConnector(options: DatabaseConnectorOptions): Connector;
29
+ export declare function adapterCount(adapter: DatabaseAdapterResolver, collection: string, ctx: HandlerContext, listOptions?: DatabaseListOptions): Promise<number>;
30
+ export declare function adapterList(adapter: DatabaseAdapterResolver, collection: string, ctx: HandlerContext, listOptions?: DatabaseListOptions): Promise<DatabaseDoc[]>;
31
+ //# sourceMappingURL=connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../../src/database/connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAsC,MAAM,UAAU,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EACV,4BAA4B,EAE5B,uBAAuB,EACvB,WAAW,EACX,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,OAAO,EAAE,uBAAuB,CAAC;IACjC,WAAW,EAAE,4BAA4B,EAAE,CAAC;CAC7C,CAAC;AAgMF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,wBAAwB,GAChC,SAAS,CASX;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,uBAAuB,EAChC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,cAAc,EACnB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,uBAAuB,EAChC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,cAAc,EACnB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,WAAW,EAAE,CAAC,CAGxB"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.databaseConnector = databaseConnector;
4
+ exports.adapterCount = adapterCount;
5
+ exports.adapterList = adapterList;
6
+ async function resolveAdapter(resolver, ctx) {
7
+ if (typeof resolver === "function") {
8
+ return resolver(ctx);
9
+ }
10
+ return resolver;
11
+ }
12
+ async function resolveListOptions(def, ctx) {
13
+ if (!def.listOptions)
14
+ return undefined;
15
+ if (typeof def.listOptions === "function") {
16
+ return def.listOptions(ctx);
17
+ }
18
+ return def.listOptions;
19
+ }
20
+ async function ensureSeeded(adapter, def, ctx) {
21
+ if (!def.seed)
22
+ return;
23
+ const existing = await adapter.list(def.collection, { limit: 1 });
24
+ if (existing.length > 0)
25
+ return;
26
+ const seeds = await def.seed(ctx);
27
+ for (const seed of seeds) {
28
+ const { id, ...rest } = seed;
29
+ await adapter.set(def.collection, id, {
30
+ ...rest,
31
+ updatedAt: new Date().toISOString(),
32
+ }, { merge: true });
33
+ }
34
+ }
35
+ async function loadDocs(defaultAdapter, def, ctx) {
36
+ const adapter = await resolveAdapter(def.adapter ?? defaultAdapter, ctx);
37
+ await ensureSeeded(adapter, def, ctx);
38
+ const options = await resolveListOptions(def, ctx);
39
+ return adapter.list(def.collection, options);
40
+ }
41
+ function collectionToResource(defaultAdapter, def) {
42
+ const idField = def.idField ?? "id";
43
+ const canCreate = def.permissions?.create ?? false;
44
+ const canUpdate = def.permissions?.update ?? false;
45
+ const canDelete = def.permissions?.delete ?? false;
46
+ const actions = def.actions
47
+ ? Object.fromEntries(Object.entries(def.actions).map(([key, action]) => [
48
+ key,
49
+ {
50
+ label: action.label,
51
+ input: action.input,
52
+ run: (row, input, ctx) => action.run(row, input, ctx),
53
+ },
54
+ ]))
55
+ : undefined;
56
+ return {
57
+ id: def.id,
58
+ label: def.label,
59
+ schema: def.schema,
60
+ permissions: {
61
+ create: canCreate,
62
+ update: canUpdate,
63
+ delete: canDelete,
64
+ },
65
+ actions,
66
+ list: async (ctx) => {
67
+ const docs = await loadDocs(defaultAdapter, def, ctx);
68
+ const rows = [];
69
+ for (const doc of docs) {
70
+ const mapped = def.map ? await def.map(doc, ctx) : doc;
71
+ rows.push({
72
+ ...mapped,
73
+ [idField]: mapped[idField] ?? doc.id,
74
+ id: mapped.id ?? doc.id,
75
+ });
76
+ }
77
+ return rows;
78
+ },
79
+ get: async (id, ctx) => {
80
+ const adapter = await resolveAdapter(def.adapter ?? defaultAdapter, ctx);
81
+ await ensureSeeded(adapter, def, ctx);
82
+ const doc = await adapter.get(def.collection, id);
83
+ if (!doc)
84
+ return undefined;
85
+ const mapped = def.map ? await def.map(doc, ctx) : doc;
86
+ return {
87
+ ...mapped,
88
+ [idField]: mapped[idField] ?? doc.id,
89
+ id: mapped.id ?? doc.id,
90
+ };
91
+ },
92
+ create: canCreate
93
+ ? async (input, ctx) => {
94
+ const adapter = await resolveAdapter(def.adapter ?? defaultAdapter, ctx);
95
+ const prepared = def.prepareWrite
96
+ ? await def.prepareWrite({ ...input }, ctx)
97
+ : { ...input };
98
+ const explicitId = typeof prepared[idField] === "string"
99
+ ? String(prepared[idField])
100
+ : typeof prepared.id === "string"
101
+ ? String(prepared.id)
102
+ : undefined;
103
+ const { id: _drop, ...rest } = prepared;
104
+ const created = await adapter.create(def.collection, {
105
+ ...rest,
106
+ updatedAt: new Date().toISOString(),
107
+ }, explicitId);
108
+ const mapped = def.map ? await def.map(created, ctx) : created;
109
+ return {
110
+ ...mapped,
111
+ [idField]: mapped[idField] ?? created.id,
112
+ id: mapped.id ?? created.id,
113
+ };
114
+ }
115
+ : undefined,
116
+ update: canUpdate
117
+ ? async (id, input, ctx) => {
118
+ const adapter = await resolveAdapter(def.adapter ?? defaultAdapter, ctx);
119
+ const current = await adapter.get(def.collection, id);
120
+ if (!current) {
121
+ throw new Error(`Document "${id}" not found in ${def.collection}`);
122
+ }
123
+ const prepared = def.prepareWrite
124
+ ? await def.prepareWrite({ ...input }, ctx)
125
+ : { ...input };
126
+ delete prepared.id;
127
+ if (idField !== "id")
128
+ delete prepared[idField];
129
+ const next = {
130
+ ...current,
131
+ ...prepared,
132
+ updatedAt: new Date().toISOString(),
133
+ };
134
+ const { id: _id, ...write } = next;
135
+ await adapter.set(def.collection, id, write, { merge: true });
136
+ const mapped = def.map
137
+ ? await def.map({ id, ...write }, ctx)
138
+ : { id, ...write };
139
+ return {
140
+ ...mapped,
141
+ [idField]: mapped[idField] ?? id,
142
+ id: mapped.id ?? id,
143
+ };
144
+ }
145
+ : undefined,
146
+ remove: canDelete
147
+ ? async (id, ctx) => {
148
+ const adapter = await resolveAdapter(def.adapter ?? defaultAdapter, ctx);
149
+ await adapter.remove(def.collection, id);
150
+ }
151
+ : undefined,
152
+ };
153
+ }
154
+ /**
155
+ * Opt-in database connector — maps host collections/tables to Vertebr resources.
156
+ *
157
+ * @example
158
+ * vertebrAdmin.use(databaseConnector({
159
+ * adapter: firestoreAdapter({ getDb }),
160
+ * collections: [{
161
+ * id: "products",
162
+ * label: "Products",
163
+ * collection: "products",
164
+ * schema: { name: { type: "string" } },
165
+ * permissions: { update: true },
166
+ * }],
167
+ * }));
168
+ */
169
+ function databaseConnector(options) {
170
+ return {
171
+ id: options.id ?? "database",
172
+ register(admin) {
173
+ for (const collection of options.collections) {
174
+ admin.resource(collectionToResource(options.adapter, collection));
175
+ }
176
+ },
177
+ };
178
+ }
179
+ async function adapterCount(adapter, collection, ctx, listOptions) {
180
+ const db = await resolveAdapter(adapter, ctx);
181
+ return db.count(collection, listOptions);
182
+ }
183
+ async function adapterList(adapter, collection, ctx, listOptions) {
184
+ const db = await resolveAdapter(adapter, ctx);
185
+ return db.list(collection, listOptions);
186
+ }
187
+ //# sourceMappingURL=connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.js","sourceRoot":"","sources":["../../src/database/connector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import type { DatabaseAdapter, DatabaseWhere } from "./types";
2
+ /**
3
+ * Minimal Firestore surface we depend on — duck-typed so @vertebr/admin
4
+ * does not require firebase-admin as a runtime dependency.
5
+ */
6
+ export type FirestoreLike = {
7
+ collection: (name: string) => {
8
+ doc: (id?: string) => {
9
+ id: string;
10
+ get: () => Promise<{
11
+ exists: boolean | (() => boolean);
12
+ id: string;
13
+ data: () => Record<string, unknown> | undefined;
14
+ }>;
15
+ set: (value: Record<string, unknown>, options?: {
16
+ merge?: boolean;
17
+ }) => Promise<unknown>;
18
+ delete: () => Promise<unknown>;
19
+ };
20
+ add: (value: Record<string, unknown>) => Promise<{
21
+ id: string;
22
+ }>;
23
+ limit: (n: number) => FirestoreQueryLike;
24
+ where: (field: string, op: string, value: unknown) => FirestoreQueryLike;
25
+ orderBy: (field: string, direction?: string) => FirestoreQueryLike;
26
+ get: () => Promise<{
27
+ docs: FirestoreDocSnap[];
28
+ }>;
29
+ count: () => {
30
+ get: () => Promise<{
31
+ data: () => {
32
+ count: number;
33
+ };
34
+ }>;
35
+ };
36
+ };
37
+ };
38
+ type FirestoreDocSnap = {
39
+ id: string;
40
+ data: () => Record<string, unknown> | undefined;
41
+ };
42
+ type FirestoreQueryLike = {
43
+ limit: (n: number) => FirestoreQueryLike;
44
+ where: (field: string, op: string, value: unknown) => FirestoreQueryLike;
45
+ orderBy: (field: string, direction?: string) => FirestoreQueryLike;
46
+ get: () => Promise<{
47
+ docs: FirestoreDocSnap[];
48
+ }>;
49
+ count: () => {
50
+ get: () => Promise<{
51
+ data: () => {
52
+ count: number;
53
+ };
54
+ }>;
55
+ };
56
+ };
57
+ export type FirestoreAdapterOptions = {
58
+ /**
59
+ * Return the Firestore instance for the current call.
60
+ * Use ALS / env switching here so Vertebr stays DB-agnostic.
61
+ */
62
+ getDb: () => FirestoreLike | Promise<FirestoreLike>;
63
+ };
64
+ /**
65
+ * Opt-in Firestore adapter. The host app supplies `getDb()` — Vertebr
66
+ * never initializes Firebase on its own.
67
+ */
68
+ export declare function firestoreAdapter(options: FirestoreAdapterOptions): DatabaseAdapter;
69
+ export declare function whereEq(field: string, value: unknown): DatabaseWhere;
70
+ export {};
71
+ //# sourceMappingURL=firestore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firestore.d.ts","sourceRoot":"","sources":["../../src/database/firestore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.firestoreAdapter = firestoreAdapter;
4
+ exports.whereEq = whereEq;
5
+ function existsFlag(exists) {
6
+ if (typeof exists === "function")
7
+ return exists();
8
+ return Boolean(exists);
9
+ }
10
+ function serializeValue(value) {
11
+ if (value == null)
12
+ return value;
13
+ if (value instanceof Date)
14
+ return value.toISOString();
15
+ if (typeof value === "object" &&
16
+ value !== null &&
17
+ "toDate" in value &&
18
+ typeof value.toDate === "function") {
19
+ try {
20
+ return value.toDate().toISOString();
21
+ }
22
+ catch {
23
+ return value;
24
+ }
25
+ }
26
+ if (Array.isArray(value))
27
+ return value.map(serializeValue);
28
+ if (typeof value === "object") {
29
+ const out = {};
30
+ for (const [key, entry] of Object.entries(value)) {
31
+ out[key] = serializeValue(entry);
32
+ }
33
+ return out;
34
+ }
35
+ return value;
36
+ }
37
+ function toDoc(snap) {
38
+ const data = serializeValue(snap.data() ?? {});
39
+ return { id: snap.id, ...data };
40
+ }
41
+ function applyQuery(collection, options) {
42
+ let query = collection;
43
+ for (const clause of options?.where ?? []) {
44
+ query = query.where(clause.field, clause.op, clause.value);
45
+ }
46
+ if (options?.orderBy) {
47
+ query = query.orderBy(options.orderBy.field, options.orderBy.direction ?? "asc");
48
+ }
49
+ if (options?.limit != null) {
50
+ query = query.limit(options.limit);
51
+ }
52
+ return query;
53
+ }
54
+ /**
55
+ * Opt-in Firestore adapter. The host app supplies `getDb()` — Vertebr
56
+ * never initializes Firebase on its own.
57
+ */
58
+ function firestoreAdapter(options) {
59
+ async function db() {
60
+ return options.getDb();
61
+ }
62
+ return {
63
+ async list(collection, listOptions) {
64
+ const firestore = await db();
65
+ const snap = await applyQuery(firestore.collection(collection), listOptions).get();
66
+ return snap.docs.map(toDoc);
67
+ },
68
+ async get(collection, id) {
69
+ const firestore = await db();
70
+ const snap = await firestore.collection(collection).doc(id).get();
71
+ if (!existsFlag(snap.exists))
72
+ return null;
73
+ return toDoc(snap);
74
+ },
75
+ async set(collection, id, value, setOptions) {
76
+ const firestore = await db();
77
+ await firestore
78
+ .collection(collection)
79
+ .doc(id)
80
+ .set(value, { merge: setOptions?.merge ?? true });
81
+ },
82
+ async create(collection, value, id) {
83
+ const firestore = await db();
84
+ if (id) {
85
+ await firestore.collection(collection).doc(id).set(value, {
86
+ merge: true,
87
+ });
88
+ return { id, ...value };
89
+ }
90
+ const ref = await firestore.collection(collection).add(value);
91
+ return { id: ref.id, ...value };
92
+ },
93
+ async remove(collection, id) {
94
+ const firestore = await db();
95
+ await firestore.collection(collection).doc(id).delete();
96
+ },
97
+ async count(collection, listOptions) {
98
+ const firestore = await db();
99
+ try {
100
+ const agg = await applyQuery(firestore.collection(collection), listOptions)
101
+ .count()
102
+ .get();
103
+ return agg.data().count;
104
+ }
105
+ catch {
106
+ const snap = await applyQuery(firestore.collection(collection), listOptions).get();
107
+ return snap.docs.length;
108
+ }
109
+ },
110
+ };
111
+ }
112
+ function whereEq(field, value) {
113
+ return { field, op: "==", value };
114
+ }
115
+ //# sourceMappingURL=firestore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firestore.js","sourceRoot":"","sources":["../../src/database/firestore.ts"],"names":[],"mappings":";;AAiIA,4CAoEC;AAED,0BAEC;AAjJD,SAAS,UAAU,CACjB,MAA6C;IAE7C,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,MAAM,EAAE,CAAC;IAClD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IACtD,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,QAAQ,IAAI,KAAK;QACjB,OAAQ,KAA8B,CAAC,MAAM,KAAK,UAAU,EAC5D,CAAC;QACD,IAAI,CAAC;YACH,OAAQ,KAAgC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CACvC,KAAgC,CACjC,EAAE,CAAC;YACF,GAAG,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,KAAK,CAAC,IAAsB;IACnC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAA4B,CAAC;IAC1E,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,UAAU,CACjB,UAAmD,EACnD,OAA6B;IAE7B,IAAI,KAAK,GAAuB,UAA2C,CAAC;IAE5E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;QAC1C,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,KAAK,GAAG,KAAK,CAAC,OAAO,CACnB,OAAO,CAAC,OAAO,CAAC,KAAK,EACrB,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,KAAK,CACnC,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC;QAC3B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAUD;;;GAGG;AACH,SAAgB,gBAAgB,CAC9B,OAAgC;IAEhC,KAAK,UAAU,EAAE;QACf,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW;YAChC,MAAM,SAAS,GAAG,MAAM,EAAE,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,MAAM,UAAU,CAC3B,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,EAChC,WAAW,CACZ,CAAC,GAAG,EAAE,CAAC;YACR,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE;YACtB,MAAM,SAAS,GAAG,MAAM,EAAE,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;YAClE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU;YACzC,MAAM,SAAS,GAAG,MAAM,EAAE,EAAE,CAAC;YAC7B,MAAM,SAAS;iBACZ,UAAU,CAAC,UAAU,CAAC;iBACtB,GAAG,CAAC,EAAE,CAAC;iBACP,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;YAChC,MAAM,SAAS,GAAG,MAAM,EAAE,EAAE,CAAC;YAC7B,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE;oBACxD,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;gBACH,OAAO,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC;YAC1B,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9D,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC;QAClC,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE;YACzB,MAAM,SAAS,GAAG,MAAM,EAAE,EAAE,CAAC;YAC7B,MAAM,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1D,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,WAAW;YACjC,MAAM,SAAS,GAAG,MAAM,EAAE,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,EAChC,WAAW,CACZ;qBACE,KAAK,EAAE;qBACP,GAAG,EAAE,CAAC;gBACT,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,GAAG,MAAM,UAAU,CAC3B,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,EAChC,WAAW,CACZ,CAAC,GAAG,EAAE,CAAC;gBACR,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,OAAO,CAAC,KAAa,EAAE,KAAc;IACnD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type { CollectionResourceDefinition, DatabaseAdapter, DatabaseAdapterResolver, DatabaseDoc, DatabaseListOptions, DatabaseWhere, } from "./types";
2
+ export { firestoreAdapter, whereEq, type FirestoreAdapterOptions, type FirestoreLike, } from "./firestore";
3
+ export { postgresAdapter, postgresJsonbTableDDL, type PostgresAdapterMode, type PostgresAdapterOptions, type PostgresQueryable, } from "./postgres";
4
+ export { mongoAdapter, type MongoAdapterOptions, type MongoCollectionLike, type MongoCursorLike, type MongoDbLike, } from "./mongo";
5
+ export { memoryAdapter, type MemoryAdapterOptions, } from "./memory";
6
+ export { databaseConnector, adapterCount, adapterList, type DatabaseConnectorOptions, } from "./connector";
7
+ export { adapterConfigStore } from "./configStore";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,4BAA4B,EAC5B,eAAe,EACf,uBAAuB,EACvB,WAAW,EACX,mBAAmB,EACnB,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,gBAAgB,EAChB,OAAO,EACP,KAAK,uBAAuB,EAC5B,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,WAAW,GACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,GAC1B,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,KAAK,wBAAwB,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.adapterConfigStore = exports.adapterList = exports.adapterCount = exports.databaseConnector = exports.memoryAdapter = exports.mongoAdapter = exports.postgresJsonbTableDDL = exports.postgresAdapter = exports.whereEq = exports.firestoreAdapter = void 0;
4
+ var firestore_1 = require("./firestore");
5
+ Object.defineProperty(exports, "firestoreAdapter", { enumerable: true, get: function () { return firestore_1.firestoreAdapter; } });
6
+ Object.defineProperty(exports, "whereEq", { enumerable: true, get: function () { return firestore_1.whereEq; } });
7
+ var postgres_1 = require("./postgres");
8
+ Object.defineProperty(exports, "postgresAdapter", { enumerable: true, get: function () { return postgres_1.postgresAdapter; } });
9
+ Object.defineProperty(exports, "postgresJsonbTableDDL", { enumerable: true, get: function () { return postgres_1.postgresJsonbTableDDL; } });
10
+ var mongo_1 = require("./mongo");
11
+ Object.defineProperty(exports, "mongoAdapter", { enumerable: true, get: function () { return mongo_1.mongoAdapter; } });
12
+ var memory_1 = require("./memory");
13
+ Object.defineProperty(exports, "memoryAdapter", { enumerable: true, get: function () { return memory_1.memoryAdapter; } });
14
+ var connector_1 = require("./connector");
15
+ Object.defineProperty(exports, "databaseConnector", { enumerable: true, get: function () { return connector_1.databaseConnector; } });
16
+ Object.defineProperty(exports, "adapterCount", { enumerable: true, get: function () { return connector_1.adapterCount; } });
17
+ Object.defineProperty(exports, "adapterList", { enumerable: true, get: function () { return connector_1.adapterList; } });
18
+ var configStore_1 = require("./configStore");
19
+ Object.defineProperty(exports, "adapterConfigStore", { enumerable: true, get: function () { return configStore_1.adapterConfigStore; } });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":";;;AAQA,yCAKqB;AAJnB,6GAAA,gBAAgB,OAAA;AAChB,oGAAA,OAAO,OAAA;AAIT,uCAMoB;AALlB,2GAAA,eAAe,OAAA;AACf,iHAAA,qBAAqB,OAAA;AAKvB,iCAMiB;AALf,qGAAA,YAAY,OAAA;AAMd,mCAGkB;AAFhB,uGAAA,aAAa,OAAA;AAGf,yCAKqB;AAJnB,8GAAA,iBAAiB,OAAA;AACjB,yGAAA,YAAY,OAAA;AACZ,wGAAA,WAAW,OAAA;AAGb,6CAAmD;AAA1C,iHAAA,kBAAkB,OAAA"}
@@ -0,0 +1,12 @@
1
+ import type { DatabaseAdapter } from "./types";
2
+ type MemoryStore = Map<string, Map<string, Record<string, unknown>>>;
3
+ export type MemoryAdapterOptions = {
4
+ /** Optional shared store so multiple adapters can share state in tests. */
5
+ store?: MemoryStore;
6
+ };
7
+ /**
8
+ * In-memory adapter for local demos and tests — no external DB required.
9
+ */
10
+ export declare function memoryAdapter(options?: MemoryAdapterOptions): DatabaseAdapter;
11
+ export {};
12
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/database/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,SAAS,CAAC;AAEjB,KAAK,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAyErE,MAAM,MAAM,oBAAoB,GAAG;IACjC,2EAA2E;IAC3E,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,GAAE,oBAAyB,GACjC,eAAe,CAkEjB"}