@alexmitchell/melondb 0.0.0-stage → 0.1.1

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.
@@ -0,0 +1,227 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMelon = void 0;
4
+ const watermelondb_1 = require("@nozbe/watermelondb");
5
+ const randomId_1 = require("@nozbe/watermelondb/utils/common/randomId");
6
+ const createWatermelon_1 = require("./createWatermelon");
7
+ const sanitizeCircular_1 = require("./sanitizeCircular");
8
+ const createMelon = (params) => {
9
+ const logging = params.logging ?? true;
10
+ if (params.idGenerator) {
11
+ (0, randomId_1.setGenerator)(params.idGenerator);
12
+ }
13
+ const watermelon = (0, createWatermelon_1.createWatermelon)(params);
14
+ /**
15
+ * Enhance a component with observable data while keeping strong type safety.
16
+ *
17
+ * @template Injected - Props injected into the component by the enhancer.
18
+ * @template Query - Props required by the enhancer (used to trigger observables).
19
+ * @template Props - Additional props required by the component (not used by the enhancer).
20
+ */
21
+ const enhance = (enhancer, Component) => {
22
+ return enhancer(Component);
23
+ };
24
+ const get = (tableName) => {
25
+ return watermelon.get(tableName);
26
+ };
27
+ const getRowById = async (tableName, id) => {
28
+ try {
29
+ const rows = await get(tableName).query(watermelondb_1.Q.where("id", id)).fetch();
30
+ return rows[0] ?? null;
31
+ }
32
+ catch {
33
+ if (logging) {
34
+ console.error("[🍈 MelonDB] Cannot find row:", tableName, id);
35
+ }
36
+ return null;
37
+ }
38
+ };
39
+ const insert = async (tableName, data) => {
40
+ return await watermelon.write(async () => {
41
+ const collection = get(tableName);
42
+ const record = await collection.create((record) => {
43
+ Object.assign(record, data);
44
+ });
45
+ return record.id;
46
+ });
47
+ };
48
+ const insertBatch = async (tableName, data) => {
49
+ return await watermelon.write(async () => {
50
+ const collection = get(tableName);
51
+ const newRows = data.map((row) => collection.prepareCreate((record) => {
52
+ Object.assign(record, row);
53
+ }));
54
+ await watermelon.batch(newRows);
55
+ });
56
+ };
57
+ const updateRow = async (model, updater) => {
58
+ return await watermelon.write(() => model.update(updater));
59
+ };
60
+ /**
61
+ * Update one column inside a write transaction.
62
+ * If the model has an `updatedDate` field, it is set to now (ISO string).
63
+ */
64
+ const updateColumn = (model, property, value) => {
65
+ return model.database.write(() => {
66
+ return model.update((row) => {
67
+ row[property] = value;
68
+ if ("updatedDate" in row) {
69
+ row.updatedDate = new Date().toISOString();
70
+ }
71
+ });
72
+ });
73
+ };
74
+ /**
75
+ * Update several columns in one write transaction.
76
+ * If the model has an `updatedDate` field, it is set to now (ISO string).
77
+ */
78
+ const updateColumns = (model, columns) => {
79
+ return model.database.write(() => {
80
+ return model.update((row) => {
81
+ columns.forEach(({ property, value }) => {
82
+ row[property] = value;
83
+ });
84
+ if ("updatedDate" in row) {
85
+ row.updatedDate = new Date().toISOString();
86
+ }
87
+ });
88
+ });
89
+ };
90
+ const deleteRow = async (row) => {
91
+ await watermelon.write(async () => {
92
+ await row.markAsDeleted();
93
+ });
94
+ };
95
+ const deleteRowById = async (tableName, id) => {
96
+ if (!id) {
97
+ return;
98
+ }
99
+ const row = await getRowById(tableName, id);
100
+ if (!row) {
101
+ return;
102
+ }
103
+ return await deleteRow(row);
104
+ };
105
+ const deleteBatch = async (rows) => {
106
+ if (rows.length === 0) {
107
+ return;
108
+ }
109
+ await rows[0].collection.database.write(async () => {
110
+ for (const row of rows) {
111
+ await row.markAsDeleted();
112
+ }
113
+ });
114
+ };
115
+ /**
116
+ * Soft-delete every row in a table (`markAsDeleted`) in one write transaction.
117
+ */
118
+ const deleteTable = async (tableName) => {
119
+ await watermelon.write(async () => {
120
+ const collection = watermelon.collections.get(tableName);
121
+ const records = await collection.query().fetch();
122
+ if (records.length === 0) {
123
+ return;
124
+ }
125
+ for (const record of records) {
126
+ await record.markAsDeleted();
127
+ }
128
+ });
129
+ };
130
+ /**
131
+ * Permanently destroy every row in a table, in batched writes.
132
+ */
133
+ const emptyTable = async (tableName, batchSize = 500) => {
134
+ await watermelon.write(async () => {
135
+ const collection = watermelon.collections.get(tableName);
136
+ const records = await collection.query().fetch();
137
+ if (records.length === 0) {
138
+ return;
139
+ }
140
+ for (let i = 0; i < records.length; i += batchSize) {
141
+ const chunk = records.slice(i, i + batchSize);
142
+ const prepared = chunk.map((r) => r.prepareDestroyPermanently());
143
+ await watermelon.batch(prepared);
144
+ }
145
+ });
146
+ };
147
+ const getRowCount = async (tableName) => {
148
+ return await get(tableName).query().fetchCount();
149
+ };
150
+ const logRowCount = async (tableName) => {
151
+ const count = await getRowCount(tableName);
152
+ console.log(`[🍈 MelonDB] Total ${tableName} rows in DB: ${count}`);
153
+ };
154
+ const logAllRows = async (tableName) => {
155
+ const rows = await get(tableName).query().fetch();
156
+ for (const row of rows) {
157
+ console.log(JSON.stringify((0, sanitizeCircular_1.sanitizeCircular)(row)));
158
+ }
159
+ };
160
+ // Observers must unmount before unsafeResetDatabase — see WatermelonDB #102
161
+ let databaseAvailable = true;
162
+ const databaseAvailableListeners = new Set();
163
+ const getDatabaseAvailable = () => databaseAvailable;
164
+ const subscribeDatabaseAvailable = (listener) => {
165
+ databaseAvailableListeners.add(listener);
166
+ return () => {
167
+ databaseAvailableListeners.delete(listener);
168
+ };
169
+ };
170
+ const setDatabaseAvailable = (available) => {
171
+ if (databaseAvailable === available) {
172
+ return;
173
+ }
174
+ databaseAvailable = available;
175
+ databaseAvailableListeners.forEach((listener) => listener(available));
176
+ };
177
+ /**
178
+ * Reset the database safely: flip `databaseAvailable` to false first so UI
179
+ * that subscribes can unmount observers, then call `unsafeResetDatabase`.
180
+ */
181
+ const resetDatabase = async () => {
182
+ setDatabaseAvailable(false);
183
+ await new Promise((resolve) => {
184
+ requestAnimationFrame(() => {
185
+ requestAnimationFrame(() => resolve());
186
+ });
187
+ });
188
+ // Yield a macrotask so React can finish unmounting observers before we wipe the DB.
189
+ await new Promise((resolve) => setTimeout(resolve, 0));
190
+ try {
191
+ await watermelon.write(async () => {
192
+ await watermelon.unsafeResetDatabase();
193
+ if (logging) {
194
+ console.log("[🍈 MelonDB] Database reset");
195
+ }
196
+ });
197
+ }
198
+ finally {
199
+ setDatabaseAvailable(true);
200
+ }
201
+ };
202
+ return {
203
+ /** Underlying WatermelonDB `Database` instance. */
204
+ db: watermelon,
205
+ enhance,
206
+ get,
207
+ getRowById,
208
+ insert,
209
+ insertBatch,
210
+ updateRow,
211
+ updateColumn,
212
+ updateColumns,
213
+ deleteRow,
214
+ deleteRowById,
215
+ deleteBatch,
216
+ deleteTable,
217
+ emptyTable,
218
+ getRowCount,
219
+ logRowCount,
220
+ logAllRows,
221
+ resetDatabase,
222
+ getDatabaseAvailable,
223
+ subscribeDatabaseAvailable,
224
+ };
225
+ };
226
+ exports.createMelon = createMelon;
227
+ //# sourceMappingURL=createMelon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMelon.js","sourceRoot":"","sources":["../src/createMelon.ts"],"names":[],"mappings":";;;AACA,sDAA2D;AAC3D,wEAAyE;AACzE,yDAAwE;AACxE,yDAAsD;AAW/C,MAAM,WAAW,GAAG,CAIzB,MAAmB,EACnB,EAAE;IAGF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;IACvC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,IAAA,uBAAY,EAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,mCAAgB,EAAC,MAAM,CAAC,CAAC;IAE5C;;;;;;OAMG;IACH,MAAM,OAAO,GAAG,CACd,QAEiC,EACjC,SAA0C,EACZ,EAAE;QAChC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,CAAuB,SAAY,EAAE,EAAE;QACjD,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAA0C,CAAC;IAC5E,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,EAAwB,SAAY,EAAE,EAAU,EAAE,EAAE;QAC1E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,gBAAC,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,EAClB,SAAY,EACZ,IAAkB,EACD,EAAE;QACnB,OAAO,MAAM,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YACvC,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;gBAChD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EACvB,SAAY,EACZ,IAAoB,EACpB,EAAE;QACF,OAAO,MAAM,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YACvC,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/B,UAAU,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE;gBAClC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC7B,CAAC,CAAC,CACH,CAAC;YACF,MAAM,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,EACrB,KAAqB,EACrB,OAAsC,EACtC,EAAE;QACF,OAAO,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF;;;OAGG;IACH,MAAM,YAAY,GAAG,CACnB,KAAQ,EACR,QAAW,EACX,KAAQ,EACR,EAAE;QACF,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE;YAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC1B,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;gBACtB,IAAI,aAAa,IAAI,GAAG,EAAE,CAAC;oBACzB,GAAG,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC7C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF;;;OAGG;IACH,MAAM,aAAa,GAAG,CACpB,KAAQ,EACR,OAAoC,EACpC,EAAE;QACF,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE;YAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC1B,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;oBACtC,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;gBACxB,CAAC,CAAC,CAAC;gBACH,IAAI,aAAa,IAAI,GAAG,EAAE,CAAC;oBACzB,GAAG,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC7C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,EAAmB,GAAM,EAAE,EAAE;QAClD,MAAM,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,EACzB,SAAY,EACZ,EAAsB,EACtB,EAAE;QACF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QACD,OAAO,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EAAmB,IAAS,EAAE,EAAE;QACvD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YACjD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF;;OAEG;IACH,MAAM,WAAW,GAAG,KAAK,EAAwB,SAAY,EAAE,EAAE;QAC/D,MAAM,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;YAEjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF;;OAEG;IACH,MAAM,UAAU,GAAG,KAAK,EACtB,SAAY,EACZ,SAAS,GAAG,GAAG,EACf,EAAE;QACF,MAAM,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;YAEjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;gBACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;gBAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,yBAAyB,EAAE,CAAC,CAAC;gBACjE,MAAM,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EAAE,SAAqB,EAAE,EAAE;QAClD,OAAO,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,CAAC;IACnD,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EAAE,SAAqB,EAAE,EAAE;QAClD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,sBAAsB,SAAS,gBAAgB,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,EAAE,SAAqB,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;QAClD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAA,mCAAgB,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC;IAEF,4EAA4E;IAC5E,IAAI,iBAAiB,GAAG,IAAI,CAAC;IAC7B,MAAM,0BAA0B,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE3E,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,iBAAiB,CAAC;IAErD,MAAM,0BAA0B,GAAG,CACjC,QAAsC,EACtC,EAAE;QACF,0BAA0B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,GAAG,EAAE;YACV,0BAA0B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,CAAC,SAAkB,EAAE,EAAE;QAClD,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,iBAAiB,GAAG,SAAS,CAAC;QAC9B,0BAA0B,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC;IAEF;;;OAGG;IACH,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;QAC/B,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,qBAAqB,CAAC,GAAG,EAAE;gBACzB,qBAAqB,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,oFAAoF;QACpF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAE7D,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;gBAChC,MAAM,UAAU,CAAC,mBAAmB,EAAE,CAAC;gBACvC,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,mDAAmD;QACnD,EAAE,EAAE,UAAU;QACd,OAAO;QACP,GAAG;QACH,UAAU;QACV,MAAM;QACN,WAAW;QACX,SAAS;QACT,YAAY;QACZ,aAAa;QACb,SAAS;QACT,aAAa;QACb,WAAW;QACX,WAAW;QACX,UAAU;QACV,WAAW;QACX,WAAW;QACX,UAAU;QACV,aAAa;QACb,oBAAoB;QACpB,0BAA0B;KAC3B,CAAC;AACJ,CAAC,CAAC;AA1RW,QAAA,WAAW,eA0RtB"}
@@ -0,0 +1,16 @@
1
+ import { Database } from '@nozbe/watermelondb';
2
+ import { DatabaseProps } from '@nozbe/watermelondb/Database';
3
+ import { AppSchemaSpec } from '@nozbe/watermelondb/Schema';
4
+ import { SchemaMigrationsSpec } from '@nozbe/watermelondb/Schema/migrations';
5
+ export type WatermelonParams = {
6
+ version: AppSchemaSpec['version'];
7
+ tables: AppSchemaSpec['tables'];
8
+ migrations: SchemaMigrationsSpec['migrations'];
9
+ modelClasses: DatabaseProps['modelClasses'];
10
+ };
11
+ /**
12
+ * Create a WatermelonDB `Database` with the usual schema + migrations setup,
13
+ * and a platform adapter (SQLite on native, LokiJS on web).
14
+ */
15
+ export declare const createWatermelon: ({ version, tables, migrations, modelClasses, }: WatermelonParams) => Database;
16
+ //# sourceMappingURL=createWatermelon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createWatermelon.d.ts","sourceRoot":"","sources":["../src/createWatermelon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAEL,oBAAoB,EACrB,MAAM,uCAAuC,CAAA;AAG9C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IACjC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC/B,UAAU,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAA;IAC9C,YAAY,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;CAC5C,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,gDAK9B,gBAAgB,aAgBlB,CAAA"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWatermelon = void 0;
4
+ const watermelondb_1 = require("@nozbe/watermelondb");
5
+ const migrations_1 = require("@nozbe/watermelondb/Schema/migrations");
6
+ const createAdapter_1 = require("./createAdapter");
7
+ /**
8
+ * Create a WatermelonDB `Database` with the usual schema + migrations setup,
9
+ * and a platform adapter (SQLite on native, LokiJS on web).
10
+ */
11
+ const createWatermelon = ({ version, tables, migrations, modelClasses, }) => {
12
+ const schema = (0, watermelondb_1.appSchema)({
13
+ version,
14
+ tables,
15
+ });
16
+ const migrationConfig = (0, migrations_1.schemaMigrations)({
17
+ migrations,
18
+ });
19
+ const adapter = (0, createAdapter_1.createAdapter)({ schema, migrations: migrationConfig });
20
+ return new watermelondb_1.Database({
21
+ adapter,
22
+ modelClasses,
23
+ });
24
+ };
25
+ exports.createWatermelon = createWatermelon;
26
+ //# sourceMappingURL=createWatermelon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createWatermelon.js","sourceRoot":"","sources":["../src/createWatermelon.ts"],"names":[],"mappings":";;;AAAA,sDAAyD;AAGzD,sEAG8C;AAC9C,mDAA+C;AAS/C;;;GAGG;AACI,MAAM,gBAAgB,GAAG,CAAC,EAC/B,OAAO,EACP,MAAM,EACN,UAAU,EACV,YAAY,GACK,EAAE,EAAE;IACrB,MAAM,MAAM,GAAG,IAAA,wBAAS,EAAC;QACvB,OAAO;QACP,MAAM;KACP,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,IAAA,6BAAgB,EAAC;QACvC,UAAU;KACX,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,IAAA,6BAAa,EAAC,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC,CAAA;IAEtE,OAAO,IAAI,uBAAQ,CAAC;QAClB,OAAO;QACP,YAAY;KACb,CAAC,CAAA;AACJ,CAAC,CAAA;AArBY,QAAA,gBAAgB,oBAqB5B"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ export { createMelon } from "./createMelon";
2
+ export type { Melon, MelonParams } from "./createMelon";
3
+ export { createWatermelon } from "./createWatermelon";
4
+ export type { WatermelonParams } from "./createWatermelon";
5
+ export { createAdapter } from "./createAdapter";
6
+ export { cleanRow } from "./cleanRow";
7
+ export type { DirtyRaw } from "./cleanRow";
8
+ export { sanitizeCircular } from "./sanitizeCircular";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sanitizeCircular = exports.cleanRow = exports.createAdapter = exports.createWatermelon = exports.createMelon = void 0;
4
+ var createMelon_1 = require("./createMelon");
5
+ Object.defineProperty(exports, "createMelon", { enumerable: true, get: function () { return createMelon_1.createMelon; } });
6
+ var createWatermelon_1 = require("./createWatermelon");
7
+ Object.defineProperty(exports, "createWatermelon", { enumerable: true, get: function () { return createWatermelon_1.createWatermelon; } });
8
+ var createAdapter_1 = require("./createAdapter");
9
+ Object.defineProperty(exports, "createAdapter", { enumerable: true, get: function () { return createAdapter_1.createAdapter; } });
10
+ var cleanRow_1 = require("./cleanRow");
11
+ Object.defineProperty(exports, "cleanRow", { enumerable: true, get: function () { return cleanRow_1.cleanRow; } });
12
+ var sanitizeCircular_1 = require("./sanitizeCircular");
13
+ Object.defineProperty(exports, "sanitizeCircular", { enumerable: true, get: function () { return sanitizeCircular_1.sanitizeCircular; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,6CAA4C;AAAnC,0GAAA,WAAW,OAAA;AAGpB,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AAGzB,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AAEtB,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AAGjB,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Strip circular WatermelonDB model references so rows can be logged or
3
+ * JSON.stringified during debugging.
4
+ */
5
+ export declare const sanitizeCircular: (obj: unknown, seen?: WeakSet<object>) => unknown;
6
+ //# sourceMappingURL=sanitizeCircular.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizeCircular.d.ts","sourceRoot":"","sources":["../src/sanitizeCircular.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,KAAK,OAAO,EACZ,sBAA4B,KAC3B,OAkEF,CAAA"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sanitizeCircular = void 0;
4
+ const watermelondb_1 = require("@nozbe/watermelondb");
5
+ /**
6
+ * Strip circular WatermelonDB model references so rows can be logged or
7
+ * JSON.stringified during debugging.
8
+ */
9
+ const sanitizeCircular = (obj, seen = new WeakSet()) => {
10
+ if (obj === null || obj === undefined) {
11
+ return obj;
12
+ }
13
+ if (typeof obj !== 'object') {
14
+ return obj;
15
+ }
16
+ if (seen.has(obj)) {
17
+ return '[Circular Reference]';
18
+ }
19
+ if (obj instanceof watermelondb_1.Model) {
20
+ seen.add(obj);
21
+ const plain = {};
22
+ for (const key in obj) {
23
+ if (key !== '_raw' && key !== 'collection' && key !== 'database') {
24
+ try {
25
+ const value = obj[key];
26
+ if (typeof value !== 'function') {
27
+ plain[key] = (0, exports.sanitizeCircular)(value, seen);
28
+ }
29
+ }
30
+ catch {
31
+ // Skip properties that throw on access
32
+ }
33
+ }
34
+ }
35
+ if ('_raw' in obj && typeof obj._raw === 'object') {
36
+ const raw = obj._raw;
37
+ for (const key in raw) {
38
+ if (key !== '_status' && key !== '_changed' && key !== 'id') {
39
+ plain[key] = (0, exports.sanitizeCircular)(raw[key], seen);
40
+ }
41
+ }
42
+ }
43
+ plain._modelType = obj.constructor.name;
44
+ if ('id' in obj) {
45
+ plain.id = obj.id;
46
+ }
47
+ return plain;
48
+ }
49
+ if (Array.isArray(obj)) {
50
+ seen.add(obj);
51
+ return obj.map((item) => (0, exports.sanitizeCircular)(item, seen));
52
+ }
53
+ seen.add(obj);
54
+ const sanitized = {};
55
+ for (const key in obj) {
56
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
57
+ try {
58
+ sanitized[key] = (0, exports.sanitizeCircular)(obj[key], seen);
59
+ }
60
+ catch {
61
+ sanitized[key] = '[Error accessing property]';
62
+ }
63
+ }
64
+ }
65
+ return sanitized;
66
+ };
67
+ exports.sanitizeCircular = sanitizeCircular;
68
+ //# sourceMappingURL=sanitizeCircular.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizeCircular.js","sourceRoot":"","sources":["../src/sanitizeCircular.ts"],"names":[],"mappings":";;;AAAA,sDAA2C;AAE3C;;;GAGG;AACI,MAAM,gBAAgB,GAAG,CAC9B,GAAY,EACZ,OAAO,IAAI,OAAO,EAAU,EACnB,EAAE;IACX,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,IAAI,IAAI,CAAC,GAAG,CAAC,GAAa,CAAC,EAAE,CAAC;QAC5B,OAAO,sBAAsB,CAAA;IAC/B,CAAC;IAED,IAAI,GAAG,YAAY,oBAAK,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,MAAM,KAAK,GAA4B,EAAE,CAAA;QAEzC,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBACjE,IAAI,CAAC;oBACH,MAAM,KAAK,GAAI,GAA0C,CAAC,GAAG,CAAC,CAAA;oBAC9D,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;wBAChC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAA,wBAAgB,EAAC,KAAK,EAAE,IAAI,CAAC,CAAA;oBAC5C,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,uCAAuC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,MAAM,IAAI,GAAG,IAAI,OAAQ,GAA0B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1E,MAAM,GAAG,GAAI,GAAyC,CAAC,IAAI,CAAA;YAC3D,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;gBACtB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;oBAC5D,KAAK,CAAC,GAAG,CAAC,GAAG,IAAA,wBAAgB,EAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAA;QACvC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;YAChB,KAAK,CAAC,EAAE,GAAI,GAAwB,CAAC,EAAE,CAAA;QACzC,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,wBAAgB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACxD,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,GAAa,CAAC,CAAA;IACvB,MAAM,SAAS,GAA4B,EAAE,CAAA;IAC7C,KAAK,MAAM,GAAG,IAAI,GAA8B,EAAE,CAAC;QACjD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC;gBACH,SAAS,CAAC,GAAG,CAAC,GAAG,IAAA,wBAAgB,EAC9B,GAA+B,CAAC,GAAG,CAAC,EACrC,IAAI,CACL,CAAA;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,CAAC,GAAG,CAAC,GAAG,4BAA4B,CAAA;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AArEY,QAAA,gBAAgB,oBAqE5B"}
package/package.json CHANGED
@@ -1,6 +1,58 @@
1
1
  {
2
2
  "name": "@alexmitchell/melondb",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.1",
4
+ "private": false,
5
+ "description": "Typed helpers for WatermelonDB: less write() boilerplate, safer collection access, safer database resets.",
6
+ "license": "MIT",
7
+ "author": "Alex Mitchell",
8
+ "keywords": [
9
+ "watermelondb",
10
+ "react-native",
11
+ "expo",
12
+ "sqlite",
13
+ "offline",
14
+ "database",
15
+ "typescript"
16
+ ],
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/AlexanderDMitchell/melondb.git"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/AlexanderDMitchell/melondb/issues"
23
+ },
24
+ "homepage": "https://github.com/AlexanderDMitchell/melondb#readme",
25
+ "main": "./lib/index.js",
26
+ "types": "./lib/index.d.ts",
27
+ "react-native": "./src/index.ts",
28
+ "source": "./src/index.ts",
29
+ "files": [
30
+ "lib",
31
+ "src",
32
+ "LICENSE",
33
+ "README.md"
34
+ ],
35
+ "scripts": {
36
+ "build": "tsc -p tsconfig.build.json",
37
+ "typecheck": "tsc --noEmit",
38
+ "prepublishOnly": "npm run build",
39
+ "clean": "rm -rf lib"
40
+ },
41
+ "peerDependencies": {
42
+ "@nozbe/watermelondb": ">=0.27.0",
43
+ "react": ">=18.0.0"
44
+ },
45
+ "devDependencies": {
46
+ "@nozbe/watermelondb": "^0.28.0",
47
+ "@types/react": "~19.2.2",
48
+ "react": "19.2.3",
49
+ "typescript": "~5.9.0"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "sideEffects": [
55
+ "./src/index.ts",
56
+ "./lib/index.js"
57
+ ]
58
+ }
@@ -0,0 +1,22 @@
1
+ export type DirtyRaw = {
2
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3
+ [key: string]: any
4
+ }
5
+
6
+ /**
7
+ * Build a mapper that strips WatermelonDB meta fields (`_status`, `_changed`)
8
+ * from a model's `_raw` and optionally merges extra fields.
9
+ *
10
+ * Useful when exporting rows to JSON, PDF, or a remote API.
11
+ */
12
+ export const cleanRow = (changes: DirtyRaw = {}) => {
13
+ return (row?: DirtyRaw): DirtyRaw | undefined => {
14
+ if (!row) {
15
+ return undefined
16
+ }
17
+
18
+ const { _status, _changed, ...rest } = row._raw
19
+
20
+ return { ...rest, ...changes }
21
+ }
22
+ }
@@ -0,0 +1,7 @@
1
+ import SQLiteAdapter from "@nozbe/watermelondb/adapters/sqlite";
2
+ import { SQLiteAdapterOptions } from "@nozbe/watermelondb/adapters/sqlite/type";
3
+
4
+ /** Native (iOS / Android) SQLite adapter. */
5
+ export const createAdapter = (options: SQLiteAdapterOptions) => {
6
+ return new SQLiteAdapter(options);
7
+ };
@@ -0,0 +1,12 @@
1
+ import LokiJSAdapter, {
2
+ LokiAdapterOptions,
3
+ } from '@nozbe/watermelondb/adapters/lokijs'
4
+
5
+ /** Web adapter (LokiJS + IndexedDB). Metro/webpack resolve this via `.web.ts`. */
6
+ export const createAdapter = (options: LokiAdapterOptions) => {
7
+ return new LokiJSAdapter({
8
+ useWebWorker: false,
9
+ useIncrementalIndexedDB: true,
10
+ ...options,
11
+ })
12
+ }