@mnaoumov/obsidian-lib 6.3.0 → 7.0.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 (42) hide show
  1. package/data-stores/data-store-replica/package.json +6 -0
  2. package/data-stores/data-store-seeds/package.json +6 -0
  3. package/data-stores/data-store-transport/package.json +6 -0
  4. package/data-stores/index/package.json +6 -0
  5. package/data-stores/local-data-store/package.json +6 -0
  6. package/data-stores/package.json +6 -0
  7. package/data-stores/shared-data-store/package.json +6 -0
  8. package/dist/lib/cjs/__merged.cjs +22 -1
  9. package/dist/lib/cjs/__merged.d.cts +5 -0
  10. package/dist/lib/cjs/data-stores/data-store-replica.cjs +263 -0
  11. package/dist/lib/cjs/data-stores/data-store-replica.d.cts +112 -0
  12. package/dist/lib/cjs/data-stores/data-store-seeds.cjs +204 -0
  13. package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +133 -0
  14. package/dist/lib/cjs/data-stores/data-store-transport.cjs +347 -0
  15. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +125 -0
  16. package/dist/lib/cjs/data-stores/index.cjs +120 -0
  17. package/dist/lib/cjs/data-stores/index.d.cts +6 -0
  18. package/dist/lib/cjs/data-stores/local-data-store.cjs +258 -0
  19. package/dist/lib/cjs/data-stores/local-data-store.d.cts +119 -0
  20. package/dist/lib/cjs/data-stores/shared-data-store.cjs +431 -0
  21. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +137 -0
  22. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  23. package/dist/lib/cjs/index.cjs +4 -1
  24. package/dist/lib/cjs/index.d.cts +1 -0
  25. package/dist/lib/esm/__merged.d.mts +5 -0
  26. package/dist/lib/esm/__merged.mjs +21 -1
  27. package/dist/lib/esm/data-stores/data-store-replica.d.mts +112 -0
  28. package/dist/lib/esm/data-stores/data-store-replica.mjs +173 -0
  29. package/dist/lib/esm/data-stores/data-store-seeds.d.mts +133 -0
  30. package/dist/lib/esm/data-stores/data-store-seeds.mjs +115 -0
  31. package/dist/lib/esm/data-stores/data-store-transport.d.mts +125 -0
  32. package/dist/lib/esm/data-stores/data-store-transport.mjs +259 -0
  33. package/dist/lib/esm/data-stores/index.d.mts +6 -0
  34. package/dist/lib/esm/data-stores/index.mjs +18 -0
  35. package/dist/lib/esm/data-stores/local-data-store.d.mts +119 -0
  36. package/dist/lib/esm/data-stores/local-data-store.mjs +170 -0
  37. package/dist/lib/esm/data-stores/shared-data-store.d.mts +137 -0
  38. package/dist/lib/esm/data-stores/shared-data-store.mjs +346 -0
  39. package/dist/lib/esm/generated-during-build.mjs +1 -1
  40. package/dist/lib/esm/index.d.mts +1 -0
  41. package/dist/lib/esm/index.mjs +3 -1
  42. package/package.json +38 -17
@@ -0,0 +1,120 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function patchObsidianRequire() {
6
+ const originalRequire = require;
7
+ if (!originalRequire || originalRequire.__isPatched) {
8
+ return;
9
+ }
10
+ require = Object.assign(
11
+ (id) => requirePatched(id),
12
+ originalRequire,
13
+ {
14
+ __isPatched: true
15
+ }
16
+ );
17
+ function extractDefault(module) {
18
+ return module && module.__esModule && "default" in module ? module.default : module;
19
+ }
20
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
21
+ "@codemirror/autocomplete",
22
+ "@codemirror/collab",
23
+ "@codemirror/commands",
24
+ "@codemirror/language",
25
+ "@codemirror/lint",
26
+ "@codemirror/search",
27
+ "@codemirror/state",
28
+ "@codemirror/text",
29
+ "@codemirror/view",
30
+ "@lezer/common",
31
+ "@lezer/highlight",
32
+ "@lezer/lr",
33
+ "obsidian"
34
+ ]);
35
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
36
+ "@codemirror/closebrackets",
37
+ "@codemirror/comment",
38
+ "@codemirror/fold",
39
+ "@codemirror/gutter",
40
+ "@codemirror/highlight",
41
+ "@codemirror/history",
42
+ "@codemirror/matchbrackets",
43
+ "@codemirror/panel",
44
+ "@codemirror/rangeset",
45
+ "@codemirror/rectangular-selection",
46
+ "@codemirror/stream-parser",
47
+ "@codemirror/tooltip"
48
+ ]);
49
+ function requirePatched(id) {
50
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
51
+ return originalRequire?.(id);
52
+ }
53
+ const app = globalThis.app;
54
+ if (app?.isMobile) {
55
+ if (id === "process" || id === "node:process") {
56
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
57
+ return process;
58
+ }
59
+ } else {
60
+ const module = originalRequire?.(id);
61
+ if (module) {
62
+ return extractDefault(module);
63
+ }
64
+ }
65
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
66
+ return {};
67
+ }
68
+ })();
69
+
70
+ "use strict";
71
+ var __create = Object.create;
72
+ var __defProp = Object.defineProperty;
73
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
74
+ var __getOwnPropNames = Object.getOwnPropertyNames;
75
+ var __getProtoOf = Object.getPrototypeOf;
76
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
77
+ var __export = (target, all) => {
78
+ for (var name in all)
79
+ __defProp(target, name, { get: all[name], enumerable: true });
80
+ };
81
+ var __copyProps = (to, from, except, desc) => {
82
+ if (from && typeof from === "object" || typeof from === "function") {
83
+ for (let key of __getOwnPropNames(from))
84
+ if (!__hasOwnProp.call(to, key) && key !== except)
85
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
86
+ }
87
+ return to;
88
+ };
89
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
90
+ // If the importer is in node compatibility mode or this is not an ESM
91
+ // file that has been converted to a CommonJS file using a Babel-
92
+ // compatible transform (i.e. "__esModule" has not been set), then set
93
+ // "default" to the CommonJS "module.exports" for node compatibility.
94
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
95
+ mod
96
+ ));
97
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
98
+ var data_stores_exports = {};
99
+ __export(data_stores_exports, {
100
+ "data-store-replica": () => data_store_replica,
101
+ "data-store-seeds": () => data_store_seeds,
102
+ "data-store-transport": () => data_store_transport,
103
+ "local-data-store": () => local_data_store,
104
+ "shared-data-store": () => shared_data_store
105
+ });
106
+ module.exports = __toCommonJS(data_stores_exports);
107
+ var data_store_replica = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./data-store-replica.cjs')), 1);
108
+ var data_store_seeds = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./data-store-seeds.cjs')), 1);
109
+ var data_store_transport = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./data-store-transport.cjs')), 1);
110
+ var local_data_store = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./local-data-store.cjs')), 1);
111
+ var shared_data_store = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./shared-data-store.cjs')), 1);
112
+ // Annotate the CommonJS export names for ESM import in node:
113
+ 0 && (module.exports = {
114
+ "data-store-replica": null,
115
+ "data-store-seeds": null,
116
+ "data-store-transport": null,
117
+ "local-data-store": null,
118
+ "shared-data-store": null
119
+ });
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2RhdGEtc3RvcmUtcmVwbGljYScgZnJvbSAnLi9kYXRhLXN0b3JlLXJlcGxpY2EudHMnO1xuZXhwb3J0ICogYXMgJ2RhdGEtc3RvcmUtc2VlZHMnIGZyb20gJy4vZGF0YS1zdG9yZS1zZWVkcy50cyc7XG5leHBvcnQgKiBhcyAnZGF0YS1zdG9yZS10cmFuc3BvcnQnIGZyb20gJy4vZGF0YS1zdG9yZS10cmFuc3BvcnQudHMnO1xuZXhwb3J0ICogYXMgJ2xvY2FsLWRhdGEtc3RvcmUnIGZyb20gJy4vbG9jYWwtZGF0YS1zdG9yZS50cyc7XG5leHBvcnQgKiBhcyAnc2hhcmVkLWRhdGEtc3RvcmUnIGZyb20gJy4vc2hhcmVkLWRhdGEtc3RvcmUudHMnO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBLDhCQUFBQTtBQUFBLEVBQUEsMEJBQUFDO0FBQUEsRUFBQSw4QkFBQUM7QUFBQSxFQUFBLDBCQUFBQztBQUFBLEVBQUEsMkJBQUFDO0FBQUE7QUFBQTtBQUVBLElBQUFKLHFCQUFzQztBQUN0QyxJQUFBQyxtQkFBb0M7QUFDcEMsSUFBQUMsdUJBQXdDO0FBQ3hDLElBQUFDLG1CQUFvQztBQUNwQyxJQUFBQyxvQkFBcUM7IiwibmFtZXMiOlsiZGF0YS1zdG9yZS1yZXBsaWNhIiwiZGF0YS1zdG9yZS1zZWVkcyIsImRhdGEtc3RvcmUtdHJhbnNwb3J0IiwibG9jYWwtZGF0YS1zdG9yZSIsInNoYXJlZC1kYXRhLXN0b3JlIl19
@@ -0,0 +1,6 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ export * as 'data-store-replica' from './data-store-replica.cjs';
3
+ export * as 'data-store-seeds' from './data-store-seeds.cjs';
4
+ export * as 'data-store-transport' from './data-store-transport.cjs';
5
+ export * as 'local-data-store' from './local-data-store.cjs';
6
+ export * as 'shared-data-store' from './shared-data-store.cjs';
@@ -0,0 +1,258 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function patchObsidianRequire() {
6
+ const originalRequire = require;
7
+ if (!originalRequire || originalRequire.__isPatched) {
8
+ return;
9
+ }
10
+ require = Object.assign(
11
+ (id) => requirePatched(id),
12
+ originalRequire,
13
+ {
14
+ __isPatched: true
15
+ }
16
+ );
17
+ function extractDefault(module) {
18
+ return module && module.__esModule && "default" in module ? module.default : module;
19
+ }
20
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
21
+ "@codemirror/autocomplete",
22
+ "@codemirror/collab",
23
+ "@codemirror/commands",
24
+ "@codemirror/language",
25
+ "@codemirror/lint",
26
+ "@codemirror/search",
27
+ "@codemirror/state",
28
+ "@codemirror/text",
29
+ "@codemirror/view",
30
+ "@lezer/common",
31
+ "@lezer/highlight",
32
+ "@lezer/lr",
33
+ "obsidian"
34
+ ]);
35
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
36
+ "@codemirror/closebrackets",
37
+ "@codemirror/comment",
38
+ "@codemirror/fold",
39
+ "@codemirror/gutter",
40
+ "@codemirror/highlight",
41
+ "@codemirror/history",
42
+ "@codemirror/matchbrackets",
43
+ "@codemirror/panel",
44
+ "@codemirror/rangeset",
45
+ "@codemirror/rectangular-selection",
46
+ "@codemirror/stream-parser",
47
+ "@codemirror/tooltip"
48
+ ]);
49
+ function requirePatched(id) {
50
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
51
+ return originalRequire?.(id);
52
+ }
53
+ const app = globalThis.app;
54
+ if (app?.isMobile) {
55
+ if (id === "process" || id === "node:process") {
56
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
57
+ return process;
58
+ }
59
+ } else {
60
+ const module = originalRequire?.(id);
61
+ if (module) {
62
+ return extractDefault(module);
63
+ }
64
+ }
65
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
66
+ return {};
67
+ }
68
+ })();
69
+
70
+ "use strict";
71
+ var __defProp = Object.defineProperty;
72
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
73
+ var __getOwnPropNames = Object.getOwnPropertyNames;
74
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
75
+ var __export = (target, all) => {
76
+ for (var name in all)
77
+ __defProp(target, name, { get: all[name], enumerable: true });
78
+ };
79
+ var __copyProps = (to, from, except, desc) => {
80
+ if (from && typeof from === "object" || typeof from === "function") {
81
+ for (let key of __getOwnPropNames(from))
82
+ if (!__hasOwnProp.call(to, key) && key !== except)
83
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
84
+ }
85
+ return to;
86
+ };
87
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
88
+ var local_data_store_exports = {};
89
+ __export(local_data_store_exports, {
90
+ LocalDataStore: () => LocalDataStore
91
+ });
92
+ module.exports = __toCommonJS(local_data_store_exports);
93
+ class LocalDataStore {
94
+ constructor(database) {
95
+ this.database = database;
96
+ }
97
+ database;
98
+ /**
99
+ * Opens an isolated database. Writes resolve only once their transaction commits.
100
+ *
101
+ * @param params - Store identity and optional IndexedDB implementation.
102
+ * @returns The connected store; close it when its owner unloads.
103
+ */
104
+ static async open(params) {
105
+ const name = `obsidian-lib:${JSON.stringify([params.vaultId, params.pluginId, params.storeId])}`;
106
+ const request = (params.factory ?? indexedDB).open(name, 1);
107
+ return await new Promise((resolve, reject) => {
108
+ request.onupgradeneeded = () => {
109
+ request.result.createObjectStore("records");
110
+ };
111
+ request.addEventListener("error", () => {
112
+ reject(new Error("Could not open local data store", { cause: request.error }));
113
+ });
114
+ request.onsuccess = () => {
115
+ const database = request.result;
116
+ database.onversionchange = () => {
117
+ database.close();
118
+ };
119
+ resolve(new LocalDataStore(database));
120
+ };
121
+ });
122
+ }
123
+ /**
124
+ * Deletes every record in this store only.
125
+ *
126
+ * @returns A promise that resolves after commit.
127
+ */
128
+ async clear() {
129
+ await this.run("readwrite", (store) => store.clear());
130
+ }
131
+ /**
132
+ * Closes this connection without deleting its records.
133
+ */
134
+ close() {
135
+ this.database.close();
136
+ }
137
+ /**
138
+ * Commits several record changes atomically without serializing the rest of the database.
139
+ *
140
+ * @param params - Writes and deletions in one transaction.
141
+ * @returns A promise that resolves only after all changes commit.
142
+ */
143
+ async commit(params) {
144
+ await this.run("readwrite", (store) => {
145
+ for (const key of params.removedKeys ?? []) {
146
+ store.delete(key);
147
+ }
148
+ for (const [key, value] of params.entries) {
149
+ store.put(value, key);
150
+ }
151
+ return store.count();
152
+ });
153
+ }
154
+ /**
155
+ * Deletes a record.
156
+ *
157
+ * @param key - Record key.
158
+ * @returns A promise that resolves after commit.
159
+ */
160
+ async delete(key) {
161
+ await this.run("readwrite", (store) => store.delete(key));
162
+ }
163
+ /**
164
+ * Reads all records in key order.
165
+ *
166
+ * @returns Detached key/value pairs.
167
+ */
168
+ async entries() {
169
+ const records = [];
170
+ await this.run("readonly", (store) => {
171
+ const request = store.openCursor();
172
+ request.onsuccess = () => {
173
+ const cursor = request.result;
174
+ if (!cursor) {
175
+ return;
176
+ }
177
+ if (typeof cursor.key !== "string") {
178
+ throw new TypeError("Local data-store key is not a string");
179
+ }
180
+ records.push([cursor.key, cursor.value]);
181
+ cursor.continue();
182
+ };
183
+ return request;
184
+ });
185
+ return records;
186
+ }
187
+ /**
188
+ * Serializes a shared-store operation across connections, windows and bundled library copies.
189
+ *
190
+ * @typeParam T - Callback result.
191
+ * @param callback - Work performed while holding this database's Web Lock.
192
+ * @returns The callback result after releasing the lock.
193
+ */
194
+ async exclusive(callback) {
195
+ return await window.navigator.locks.request(this.database.name, callback);
196
+ }
197
+ /**
198
+ * Reads a record.
199
+ *
200
+ * @param key - Record key.
201
+ * @returns Its value, or `undefined` when absent.
202
+ */
203
+ async get(key) {
204
+ return await this.run("readonly", (store) => store.get(key));
205
+ }
206
+ /**
207
+ * Initializes a record once, atomically across connections.
208
+ *
209
+ * @param key - Record key.
210
+ * @param value - Value used only when the key is absent.
211
+ * @returns The existing or newly committed value.
212
+ */
213
+ async getOrCreate(key, value) {
214
+ return await this.run("readwrite", (store) => {
215
+ const request = store.get(key);
216
+ request.onsuccess = () => {
217
+ if (request.result === void 0) {
218
+ store.put(value, key);
219
+ }
220
+ };
221
+ return request;
222
+ }).then((existing) => existing === void 0 ? value : existing);
223
+ }
224
+ /**
225
+ * Writes a structured-cloneable value.
226
+ *
227
+ * @param key - Record key.
228
+ * @param value - Value to persist.
229
+ * @returns A promise that resolves after commit.
230
+ */
231
+ async set(key, value) {
232
+ await this.run("readwrite", (store) => store.put(value, key));
233
+ }
234
+ async run(mode, action) {
235
+ return await new Promise((resolve, reject) => {
236
+ const transaction = this.database.transaction("records", mode);
237
+ let request;
238
+ try {
239
+ request = action(transaction.objectStore("records"));
240
+ } catch (error) {
241
+ transaction.abort();
242
+ reject(error instanceof Error ? error : new Error("Local data-store transaction failed", { cause: error }));
243
+ return;
244
+ }
245
+ transaction.oncomplete = () => {
246
+ resolve(request.result);
247
+ };
248
+ transaction.addEventListener("abort", () => {
249
+ reject(new Error("Local data-store transaction aborted", { cause: transaction.error }));
250
+ });
251
+ });
252
+ }
253
+ }
254
+ // Annotate the CommonJS export names for ESM import in node:
255
+ 0 && (module.exports = {
256
+ LocalDataStore
257
+ });
258
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9sb2NhbC1kYXRhLXN0b3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGVzZSBhcmUgT2JzaWRpYW4gcmVuZGVyZXIgV2ViIEFQSXMsIG5vdCBOb2RlIGJ1aWx0aW5zLiAqL1xuLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlY29yZC1iYXNlZCBkZXZpY2UtbG9jYWwgcGVyc2lzdGVuY2UsIGlzb2xhdGVkIGJ5IHZhdWx0LCBwbHVnaW4gYW5kIHN0b3JlLlxuICovXG5cbi8qKlxuICogQXRvbWljIG11dGF0aW9ucyBvZiBhIGxvY2FsIHJlY29yZCBzdG9yZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbERhdGFTdG9yZUNvbW1pdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBLZXkvdmFsdWUgcGFpcnMgdG8gd3JpdGUuXG4gICAqL1xuICByZWFkb25seSBlbnRyaWVzOiByZWFkb25seSAocmVhZG9ubHkgW3N0cmluZywgdW5rbm93bl0pW107XG4gIC8qKlxuICAgKiBLZXlzIHJlbW92ZWQgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMgdGhlIHdyaXRlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYFtdYFxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZlZEtleXM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBvcGVuaW5nIGEgbG9jYWwgc3RvcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxEYXRhU3RvcmVPcGVuUGFyYW1zIHtcbiAgLyoqXG4gICAqIEluZGV4ZWREQiBpbXBsZW1lbnRhdGlvbiwgaW5qZWN0YWJsZSBmb3IgdGVzdHMuXG4gICAqL1xuICByZWFkb25seSBmYWN0b3J5PzogSURCRmFjdG9yeTtcbiAgLyoqXG4gICAqIFBsdWdpbiBtYW5pZmVzdCBpZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdG9yZSBuYW1lIGFuZCBzY2hlbWEgdmVyc2lvbiBjaG9zZW4gYnkgdGhlIGNvbnN1bWVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RhYmxlLCBkZXZpY2UtbG9jYWwgdmF1bHQgaWRlbnRpdHk7IG5ldmVyIHRoZSB2YXVsdCBkaXNwbGF5IG5hbWUuXG4gICAqL1xuICByZWFkb25seSB2YXVsdElkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBsb2NhbCBzdG9yZSBob2xkcyBzdHJ1Y3R1cmVkLWNsb25lYWJsZSB2YWx1ZXM7IGl0IG5ldmVyIHdyaXRlcyB0byB0aGUgdmF1bHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NhbERhdGFTdG9yZSB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkYXRhYmFzZTogSURCRGF0YWJhc2UpIHt9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGFuIGlzb2xhdGVkIGRhdGFiYXNlLiBXcml0ZXMgcmVzb2x2ZSBvbmx5IG9uY2UgdGhlaXIgdHJhbnNhY3Rpb24gY29tbWl0cy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFN0b3JlIGlkZW50aXR5IGFuZCBvcHRpb25hbCBJbmRleGVkREIgaW1wbGVtZW50YXRpb24uXG4gICAqIEByZXR1cm5zIFRoZSBjb25uZWN0ZWQgc3RvcmU7IGNsb3NlIGl0IHdoZW4gaXRzIG93bmVyIHVubG9hZHMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIG9wZW4ocGFyYW1zOiBMb2NhbERhdGFTdG9yZU9wZW5QYXJhbXMpOiBQcm9taXNlPExvY2FsRGF0YVN0b3JlPiB7XG4gICAgY29uc3QgbmFtZSA9IGBvYnNpZGlhbi1saWI6JHtKU09OLnN0cmluZ2lmeShbcGFyYW1zLnZhdWx0SWQsIHBhcmFtcy5wbHVnaW5JZCwgcGFyYW1zLnN0b3JlSWRdKX1gO1xuICAgIGNvbnN0IHJlcXVlc3QgPSAocGFyYW1zLmZhY3RvcnkgPz8gaW5kZXhlZERCKS5vcGVuKG5hbWUsIDEpO1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVxdWVzdC5yZXN1bHQuY3JlYXRlT2JqZWN0U3RvcmUoJ3JlY29yZHMnKTtcbiAgICAgIH07XG4gICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCk6IHZvaWQgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdDb3VsZCBub3Qgb3BlbiBsb2NhbCBkYXRhIHN0b3JlJywgeyBjYXVzZTogcmVxdWVzdC5lcnJvciB9KSk7XG4gICAgICB9KTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBkYXRhYmFzZSA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgICBkYXRhYmFzZS5vbnZlcnNpb25jaGFuZ2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgZGF0YWJhc2UuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVzb2x2ZShuZXcgTG9jYWxEYXRhU3RvcmUoZGF0YWJhc2UpKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBldmVyeSByZWNvcmQgaW4gdGhpcyBzdG9yZSBvbmx5LlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5ydW4oJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4gc3RvcmUuY2xlYXIoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoaXMgY29ubmVjdGlvbiB3aXRob3V0IGRlbGV0aW5nIGl0cyByZWNvcmRzLlxuICAgKi9cbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YWJhc2UuY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21taXRzIHNldmVyYWwgcmVjb3JkIGNoYW5nZXMgYXRvbWljYWxseSB3aXRob3V0IHNlcmlhbGl6aW5nIHRoZSByZXN0IG9mIHRoZSBkYXRhYmFzZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFdyaXRlcyBhbmQgZGVsZXRpb25zIGluIG9uZSB0cmFuc2FjdGlvbi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25seSBhZnRlciBhbGwgY2hhbmdlcyBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29tbWl0KHBhcmFtczogTG9jYWxEYXRhU3RvcmVDb21taXRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJ1bigncmVhZHdyaXRlJywgKHN0b3JlKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXJhbXMucmVtb3ZlZEtleXMgPz8gW10pIHtcbiAgICAgICAgc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBwYXJhbXMuZW50cmllcykge1xuICAgICAgICBzdG9yZS5wdXQodmFsdWUsIGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RvcmUuY291bnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGEgcmVjb3JkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmRlbGV0ZShrZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbGwgcmVjb3JkcyBpbiBrZXkgb3JkZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIERldGFjaGVkIGtleS92YWx1ZSBwYWlycy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnRyaWVzKCk6IFByb21pc2U8W3N0cmluZywgdW5rbm93bl1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXTtcbiAgICBhd2FpdCB0aGlzLnJ1bigncmVhZG9ubHknLCAoc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5vcGVuQ3Vyc29yKCk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgY3Vyc29yID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgIGlmICghY3Vyc29yKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjdXJzb3Iua2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0xvY2FsIGRhdGEtc3RvcmUga2V5IGlzIG5vdCBhIHN0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHJlY29yZHMucHVzaChbY3Vyc29yLmtleSwgY3Vyc29yLnZhbHVlXSk7XG4gICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH0pO1xuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBzaGFyZWQtc3RvcmUgb3BlcmF0aW9uIGFjcm9zcyBjb25uZWN0aW9ucywgd2luZG93cyBhbmQgYnVuZGxlZCBsaWJyYXJ5IGNvcGllcy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBXb3JrIHBlcmZvcm1lZCB3aGlsZSBob2xkaW5nIHRoaXMgZGF0YWJhc2UncyBXZWIgTG9jay5cbiAgICogQHJldHVybnMgVGhlIGNhbGxiYWNrIHJlc3VsdCBhZnRlciByZWxlYXNpbmcgdGhlIGxvY2suXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhjbHVzaXZlPFQ+KGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIGF3YWl0IHdpbmRvdy5uYXZpZ2F0b3IubG9ja3MucmVxdWVzdCh0aGlzLmRhdGFiYXNlLm5hbWUsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHJlY29yZC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkuXG4gICAqIEByZXR1cm5zIEl0cyB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuPHVua25vd24+KCdyZWFkb25seScsIChzdG9yZSkgPT4gc3RvcmUuZ2V0KGtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGEgcmVjb3JkIG9uY2UsIGF0b21pY2FsbHkgYWNyb3NzIGNvbm5lY3Rpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleS5cbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdXNlZCBvbmx5IHdoZW4gdGhlIGtleSBpcyBhYnNlbnQuXG4gICAqIEByZXR1cm5zIFRoZSBleGlzdGluZyBvciBuZXdseSBjb21taXR0ZWQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0T3JDcmVhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuPHVua25vd24+KCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAocmVxdWVzdC5yZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHN0b3JlLnB1dCh2YWx1ZSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH0pLnRoZW4oKGV4aXN0aW5nKSA9PiBleGlzdGluZyA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBleGlzdGluZyk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgc3RydWN0dXJlZC1jbG9uZWFibGUgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBSZWNvcmQga2V5LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBwZXJzaXN0LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLnB1dCh2YWx1ZSwga2V5KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bjxUPihtb2RlOiBJREJUcmFuc2FjdGlvbk1vZGUsIGFjdGlvbjogKHN0b3JlOiBJREJPYmplY3RTdG9yZSkgPT4gSURCUmVxdWVzdDxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24oJ3JlY29yZHMnLCBtb2RlKTtcbiAgICAgIGxldCByZXF1ZXN0OiBJREJSZXF1ZXN0PFQ+O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVxdWVzdCA9IGFjdGlvbih0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgncmVjb3JkcycpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmFib3J0KCk7XG4gICAgICAgIHJlamVjdChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoJ0xvY2FsIGRhdGEtc3RvcmUgdHJhbnNhY3Rpb24gZmFpbGVkJywgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzdWx0KTtcbiAgICAgIH07XG4gICAgICB0cmFuc2FjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignTG9jYWwgZGF0YS1zdG9yZSB0cmFuc2FjdGlvbiBhYm9ydGVkJywgeyBjYXVzZTogdHJhbnNhY3Rpb24uZXJyb3IgfSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdETyxNQUFNLGVBQWU7QUFBQSxFQUNsQixZQUE2QixVQUF1QjtBQUF2QjtBQUFBLEVBQXdCO0FBQUEsRUFBeEI7QUFBQTtB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
@@ -0,0 +1,119 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /// <reference lib="dom" />
3
+ /**
4
+ * @file
5
+ *
6
+ * Record-based device-local persistence, isolated by vault, plugin and store.
7
+ */
8
+ /**
9
+ * Atomic mutations of a local record store.
10
+ */
11
+ export interface LocalDataStoreCommitParams {
12
+ /**
13
+ * Key/value pairs to write.
14
+ */
15
+ readonly entries: readonly (readonly [string, unknown])[];
16
+ /**
17
+ * Keys removed in the same transaction as the writes.
18
+ *
19
+ * @default `[]`
20
+ */
21
+ readonly removedKeys?: readonly string[];
22
+ }
23
+ /**
24
+ * Parameters for opening a local store.
25
+ */
26
+ export interface LocalDataStoreOpenParams {
27
+ /**
28
+ * IndexedDB implementation, injectable for tests.
29
+ */
30
+ readonly factory?: IDBFactory;
31
+ /**
32
+ * Plugin manifest id.
33
+ */
34
+ readonly pluginId: string;
35
+ /**
36
+ * Store name and schema version chosen by the consumer.
37
+ */
38
+ readonly storeId: string;
39
+ /**
40
+ * Stable, device-local vault identity; never the vault display name.
41
+ */
42
+ readonly vaultId: string;
43
+ }
44
+ /**
45
+ * A local store holds structured-cloneable values; it never writes to the vault.
46
+ */
47
+ export declare class LocalDataStore {
48
+ private readonly database;
49
+ private constructor();
50
+ /**
51
+ * Opens an isolated database. Writes resolve only once their transaction commits.
52
+ *
53
+ * @param params - Store identity and optional IndexedDB implementation.
54
+ * @returns The connected store; close it when its owner unloads.
55
+ */
56
+ static open(params: LocalDataStoreOpenParams): Promise<LocalDataStore>;
57
+ /**
58
+ * Deletes every record in this store only.
59
+ *
60
+ * @returns A promise that resolves after commit.
61
+ */
62
+ clear(): Promise<void>;
63
+ /**
64
+ * Closes this connection without deleting its records.
65
+ */
66
+ close(): void;
67
+ /**
68
+ * Commits several record changes atomically without serializing the rest of the database.
69
+ *
70
+ * @param params - Writes and deletions in one transaction.
71
+ * @returns A promise that resolves only after all changes commit.
72
+ */
73
+ commit(params: LocalDataStoreCommitParams): Promise<void>;
74
+ /**
75
+ * Deletes a record.
76
+ *
77
+ * @param key - Record key.
78
+ * @returns A promise that resolves after commit.
79
+ */
80
+ delete(key: string): Promise<void>;
81
+ /**
82
+ * Reads all records in key order.
83
+ *
84
+ * @returns Detached key/value pairs.
85
+ */
86
+ entries(): Promise<[string, unknown][]>;
87
+ /**
88
+ * Serializes a shared-store operation across connections, windows and bundled library copies.
89
+ *
90
+ * @typeParam T - Callback result.
91
+ * @param callback - Work performed while holding this database's Web Lock.
92
+ * @returns The callback result after releasing the lock.
93
+ */
94
+ exclusive<T>(callback: () => Promise<T>): Promise<T>;
95
+ /**
96
+ * Reads a record.
97
+ *
98
+ * @param key - Record key.
99
+ * @returns Its value, or `undefined` when absent.
100
+ */
101
+ get(key: string): Promise<unknown>;
102
+ /**
103
+ * Initializes a record once, atomically across connections.
104
+ *
105
+ * @param key - Record key.
106
+ * @param value - Value used only when the key is absent.
107
+ * @returns The existing or newly committed value.
108
+ */
109
+ getOrCreate(key: string, value: unknown): Promise<unknown>;
110
+ /**
111
+ * Writes a structured-cloneable value.
112
+ *
113
+ * @param key - Record key.
114
+ * @param value - Value to persist.
115
+ * @returns A promise that resolves after commit.
116
+ */
117
+ set(key: string, value: unknown): Promise<void>;
118
+ private run;
119
+ }