web-idb-client 1.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 (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +230 -0
  3. package/dist/client/index.d.ts +7 -0
  4. package/dist/client/index.js +12 -0
  5. package/dist/client/index.js.map +1 -0
  6. package/dist/client/indexed-db-client.d.ts +40 -0
  7. package/dist/client/indexed-db-client.js +211 -0
  8. package/dist/client/indexed-db-client.js.map +1 -0
  9. package/dist/client/mutations.d.ts +12 -0
  10. package/dist/client/mutations.js +3 -0
  11. package/dist/client/mutations.js.map +1 -0
  12. package/dist/client/store.d.ts +42 -0
  13. package/dist/client/store.js +356 -0
  14. package/dist/client/store.js.map +1 -0
  15. package/dist/client/transaction.d.ts +14 -0
  16. package/dist/client/transaction.js +37 -0
  17. package/dist/client/transaction.js.map +1 -0
  18. package/dist/errors/index.d.ts +15 -0
  19. package/dist/errors/index.js +35 -0
  20. package/dist/errors/index.js.map +1 -0
  21. package/dist/index.d.ts +10 -0
  22. package/dist/index.js +33 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/liveQuery/index.d.ts +31 -0
  25. package/dist/liveQuery/index.js +216 -0
  26. package/dist/liveQuery/index.js.map +1 -0
  27. package/dist/migrate/diff.d.ts +28 -0
  28. package/dist/migrate/diff.js +89 -0
  29. package/dist/migrate/diff.js.map +1 -0
  30. package/dist/migrate/helpers.d.ts +29 -0
  31. package/dist/migrate/helpers.js +89 -0
  32. package/dist/migrate/helpers.js.map +1 -0
  33. package/dist/migrate/index.d.ts +6 -0
  34. package/dist/migrate/index.js +14 -0
  35. package/dist/migrate/index.js.map +1 -0
  36. package/dist/migrate/upgrade.d.ts +19 -0
  37. package/dist/migrate/upgrade.js +123 -0
  38. package/dist/migrate/upgrade.js.map +1 -0
  39. package/dist/query/order.d.ts +8 -0
  40. package/dist/query/order.js +30 -0
  41. package/dist/query/order.js.map +1 -0
  42. package/dist/query/where.d.ts +17 -0
  43. package/dist/query/where.js +106 -0
  44. package/dist/query/where.js.map +1 -0
  45. package/dist/relation/define-relation.d.ts +49 -0
  46. package/dist/relation/define-relation.js +101 -0
  47. package/dist/relation/define-relation.js.map +1 -0
  48. package/dist/relation/index.d.ts +3 -0
  49. package/dist/relation/index.js +14 -0
  50. package/dist/relation/index.js.map +1 -0
  51. package/dist/relation/load-related.d.ts +21 -0
  52. package/dist/relation/load-related.js +54 -0
  53. package/dist/relation/load-related.js.map +1 -0
  54. package/dist/schema/define-db.d.ts +5 -0
  55. package/dist/schema/define-db.js +41 -0
  56. package/dist/schema/define-db.js.map +1 -0
  57. package/dist/schema/define-store.d.ts +17 -0
  58. package/dist/schema/define-store.js +95 -0
  59. package/dist/schema/define-store.js.map +1 -0
  60. package/dist/schema/fields.d.ts +75 -0
  61. package/dist/schema/fields.js +90 -0
  62. package/dist/schema/fields.js.map +1 -0
  63. package/dist/schema/index.d.ts +5 -0
  64. package/dist/schema/index.js +22 -0
  65. package/dist/schema/index.js.map +1 -0
  66. package/dist/schema/infer.d.ts +131 -0
  67. package/dist/schema/infer.js +3 -0
  68. package/dist/schema/infer.js.map +1 -0
  69. package/dist/schema/infer.test-types.d.ts +11 -0
  70. package/dist/schema/infer.test-types.js +80 -0
  71. package/dist/schema/infer.test-types.js.map +1 -0
  72. package/dist/schema/types.d.ts +55 -0
  73. package/dist/schema/types.js +3 -0
  74. package/dist/schema/types.js.map +1 -0
  75. package/dist/utils/assert-keys.d.ts +3 -0
  76. package/dist/utils/assert-keys.js +15 -0
  77. package/dist/utils/assert-keys.js.map +1 -0
  78. package/dist/utils/boolean-codec.d.ts +23 -0
  79. package/dist/utils/boolean-codec.js +149 -0
  80. package/dist/utils/boolean-codec.js.map +1 -0
  81. package/dist/utils/index.d.ts +5 -0
  82. package/dist/utils/index.js +16 -0
  83. package/dist/utils/index.js.map +1 -0
  84. package/dist/utils/key-range.d.ts +14 -0
  85. package/dist/utils/key-range.js +157 -0
  86. package/dist/utils/key-range.js.map +1 -0
  87. package/dist/utils/promisify.d.ts +2 -0
  88. package/dist/utils/promisify.js +29 -0
  89. package/dist/utils/promisify.js.map +1 -0
  90. package/dist/utils/type-utils.d.ts +2 -0
  91. package/dist/utils/type-utils.js +3 -0
  92. package/dist/utils/type-utils.js.map +1 -0
  93. package/package.json +71 -0
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encodeWhereForStorage = exports.decodeRowFromStorage = exports.encodeRowForStorage = exports.decodeBooleanFromStorage = exports.encodeBooleanForStorage = void 0;
4
+ function isRangeFilter(value) {
5
+ return (typeof value === 'object' &&
6
+ value !== null &&
7
+ !(value instanceof Date) &&
8
+ !(value instanceof IDBKeyRange) &&
9
+ !Array.isArray(value) &&
10
+ ('equals' in value ||
11
+ 'gt' in value ||
12
+ 'gte' in value ||
13
+ 'lt' in value ||
14
+ 'lte' in value ||
15
+ 'above' in value ||
16
+ 'aboveOrEqual' in value ||
17
+ 'below' in value ||
18
+ 'belowOrEqual' in value ||
19
+ 'startsWith' in value ||
20
+ 'between' in value));
21
+ }
22
+ /** App boolean → IDB key (0 | 1). Passes through 0/1; leaves other values alone. */
23
+ function encodeBooleanForStorage(value) {
24
+ if (typeof value === 'boolean') {
25
+ return value ? 1 : 0;
26
+ }
27
+ return value;
28
+ }
29
+ exports.encodeBooleanForStorage = encodeBooleanForStorage;
30
+ /**
31
+ * IDB value → app boolean.
32
+ * Accepts 0/1 and legacy true/false so old rows still decode.
33
+ */
34
+ function decodeBooleanFromStorage(value) {
35
+ if (typeof value === 'boolean') {
36
+ return value;
37
+ }
38
+ return value === 1;
39
+ }
40
+ exports.decodeBooleanFromStorage = decodeBooleanFromStorage;
41
+ function fieldKind(store, fieldName) {
42
+ var _a;
43
+ return (_a = store.fields[fieldName]) === null || _a === void 0 ? void 0 : _a.meta.kind;
44
+ }
45
+ function encodeWhereValue(kind, value) {
46
+ if (kind !== 'boolean') {
47
+ return value;
48
+ }
49
+ if (value instanceof IDBKeyRange) {
50
+ return value;
51
+ }
52
+ if (isRangeFilter(value)) {
53
+ const next = Object.assign({}, value);
54
+ const keys = [
55
+ 'equals',
56
+ 'gt',
57
+ 'gte',
58
+ 'lt',
59
+ 'lte',
60
+ 'above',
61
+ 'aboveOrEqual',
62
+ 'below',
63
+ 'belowOrEqual',
64
+ ];
65
+ for (const key of keys) {
66
+ if (next[key] !== undefined) {
67
+ next[key] = encodeBooleanForStorage(next[key]);
68
+ }
69
+ }
70
+ if (next.between !== undefined) {
71
+ const [lower, upper, lowerOpen, upperOpen] = next.between;
72
+ next.between =
73
+ lowerOpen !== undefined || upperOpen !== undefined
74
+ ? [
75
+ encodeBooleanForStorage(lower),
76
+ encodeBooleanForStorage(upper),
77
+ Boolean(lowerOpen),
78
+ Boolean(upperOpen),
79
+ ]
80
+ : [
81
+ encodeBooleanForStorage(lower),
82
+ encodeBooleanForStorage(upper),
83
+ ];
84
+ }
85
+ return next;
86
+ }
87
+ return encodeBooleanForStorage(value);
88
+ }
89
+ /**
90
+ * Encode boolean fields in a row before writing to IndexedDB.
91
+ * App API stays `boolean`; storage / index keys are `0 | 1`.
92
+ */
93
+ function encodeRowForStorage(store, row) {
94
+ const out = Object.assign({}, row);
95
+ for (const [name, field] of Object.entries(store.fields)) {
96
+ if (field.meta.kind !== 'boolean' || !(name in out)) {
97
+ continue;
98
+ }
99
+ const value = out[name];
100
+ if (value === undefined) {
101
+ continue;
102
+ }
103
+ out[name] = encodeBooleanForStorage(value);
104
+ }
105
+ return out;
106
+ }
107
+ exports.encodeRowForStorage = encodeRowForStorage;
108
+ /**
109
+ * Decode boolean fields after reading from IndexedDB.
110
+ * Treats both `0|1` and legacy `true|false` as boolean.
111
+ */
112
+ function decodeRowFromStorage(store, row) {
113
+ const out = Object.assign({}, row);
114
+ for (const [name, field] of Object.entries(store.fields)) {
115
+ if (field.meta.kind !== 'boolean' || !(name in out)) {
116
+ continue;
117
+ }
118
+ const value = out[name];
119
+ if (value === undefined) {
120
+ continue;
121
+ }
122
+ out[name] = decodeBooleanFromStorage(value);
123
+ }
124
+ return out;
125
+ }
126
+ exports.decodeRowFromStorage = decodeRowFromStorage;
127
+ /** Encode boolean parts of a where clause before resolving to IDBKeyRange. */
128
+ function encodeWhereForStorage(store, where) {
129
+ if (!where) {
130
+ return where;
131
+ }
132
+ const keys = Object.keys(where);
133
+ if (keys.length === 0) {
134
+ return where;
135
+ }
136
+ const out = {};
137
+ for (const key of keys) {
138
+ const value = where[key];
139
+ const namedCompound = store.indexes.find((i) => i.name === key && Array.isArray(i.keyPath));
140
+ if (namedCompound && Array.isArray(namedCompound.keyPath) && Array.isArray(value)) {
141
+ out[key] = namedCompound.keyPath.map((fieldName, i) => encodeWhereValue(fieldKind(store, fieldName), value[i]));
142
+ continue;
143
+ }
144
+ out[key] = encodeWhereValue(fieldKind(store, key), value);
145
+ }
146
+ return out;
147
+ }
148
+ exports.encodeWhereForStorage = encodeWhereForStorage;
149
+ //# sourceMappingURL=boolean-codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boolean-codec.js","sourceRoot":"","sources":["../../src/utils/boolean-codec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { decodeBooleanFromStorage, decodeRowFromStorage, encodeBooleanForStorage, encodeRowForStorage, encodeWhereForStorage, } from './boolean-codec';
2
+ export type { StoredBoolean } from './boolean-codec';
3
+ export { toKeyRange, toOptionalKeyRange } from './key-range';
4
+ export { promisifyRequest, transactionDone } from './promisify';
5
+ export type { Expect } from './type-utils';
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transactionDone = exports.promisifyRequest = exports.toOptionalKeyRange = exports.toKeyRange = exports.encodeWhereForStorage = exports.encodeRowForStorage = exports.encodeBooleanForStorage = exports.decodeRowFromStorage = exports.decodeBooleanFromStorage = void 0;
4
+ var boolean_codec_1 = require("./boolean-codec");
5
+ Object.defineProperty(exports, "decodeBooleanFromStorage", { enumerable: true, get: function () { return boolean_codec_1.decodeBooleanFromStorage; } });
6
+ Object.defineProperty(exports, "decodeRowFromStorage", { enumerable: true, get: function () { return boolean_codec_1.decodeRowFromStorage; } });
7
+ Object.defineProperty(exports, "encodeBooleanForStorage", { enumerable: true, get: function () { return boolean_codec_1.encodeBooleanForStorage; } });
8
+ Object.defineProperty(exports, "encodeRowForStorage", { enumerable: true, get: function () { return boolean_codec_1.encodeRowForStorage; } });
9
+ Object.defineProperty(exports, "encodeWhereForStorage", { enumerable: true, get: function () { return boolean_codec_1.encodeWhereForStorage; } });
10
+ var key_range_1 = require("./key-range");
11
+ Object.defineProperty(exports, "toKeyRange", { enumerable: true, get: function () { return key_range_1.toKeyRange; } });
12
+ Object.defineProperty(exports, "toOptionalKeyRange", { enumerable: true, get: function () { return key_range_1.toOptionalKeyRange; } });
13
+ var promisify_1 = require("./promisify");
14
+ Object.defineProperty(exports, "promisifyRequest", { enumerable: true, get: function () { return promisify_1.promisifyRequest; } });
15
+ Object.defineProperty(exports, "transactionDone", { enumerable: true, get: function () { return promisify_1.transactionDone; } });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,iDAMyB;AALvB,yHAAA,wBAAwB,OAAA;AACxB,qHAAA,oBAAoB,OAAA;AACpB,wHAAA,uBAAuB,OAAA;AACvB,oHAAA,mBAAmB,OAAA;AACnB,sHAAA,qBAAqB,OAAA;AAGvB,yCAA6D;AAApD,uGAAA,UAAU,OAAA;AAAE,+GAAA,kBAAkB,OAAA;AACvC,yCAAgE;AAAvD,6GAAA,gBAAgB,OAAA;AAAE,4GAAA,eAAe,OAAA"}
@@ -0,0 +1,14 @@
1
+ import type { WhereValueInterface } from '../schema/infer';
2
+ /** Build an IDBKeyRange (or exact key) from a where value. */
3
+ export declare function toKeyRange(value: WhereValueInterface): IDBKeyRange | IDBValidKey;
4
+ /**
5
+ * Normalize a resolved key / range for IDB APIs that accept
6
+ * `IDBKeyRange | undefined` (`getAll`, `openCursor`, `count`).
7
+ */
8
+ export declare function toOptionalKeyRange(keyRange: IDBKeyRange | IDBValidKey | undefined): IDBKeyRange | undefined;
9
+ /**
10
+ * Build a compound (multi-part) key or key range.
11
+ * Exact parts only → equality tuple.
12
+ * Exact prefix + range on the **last** part → IDBKeyRange over that suffix.
13
+ */
14
+ export declare function toCompoundKeyRange(parts: readonly unknown[]): IDBKeyRange | IDBValidKey;
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toCompoundKeyRange = exports.toOptionalKeyRange = exports.toKeyRange = void 0;
4
+ const errors_1 = require("../errors");
5
+ function isRangeFilter(value) {
6
+ return (typeof value === 'object' &&
7
+ value !== null &&
8
+ !(value instanceof Date) &&
9
+ !(value instanceof IDBKeyRange) &&
10
+ !Array.isArray(value) &&
11
+ ('equals' in value ||
12
+ 'gt' in value ||
13
+ 'gte' in value ||
14
+ 'lt' in value ||
15
+ 'lte' in value ||
16
+ 'above' in value ||
17
+ 'aboveOrEqual' in value ||
18
+ 'below' in value ||
19
+ 'belowOrEqual' in value ||
20
+ 'startsWith' in value ||
21
+ 'between' in value));
22
+ }
23
+ function startsWithRange(prefix) {
24
+ // Classic IndexedDB prefix range (Dexie-style).
25
+ return IDBKeyRange.bound(prefix, `${prefix}\uffff`, false, false);
26
+ }
27
+ /** Build an IDBKeyRange (or exact key) from a where value. */
28
+ function toKeyRange(value) {
29
+ var _a, _b, _c, _d, _e, _f;
30
+ if (value instanceof IDBKeyRange) {
31
+ return value;
32
+ }
33
+ if (isRangeFilter(value)) {
34
+ if (value.equals !== undefined) {
35
+ return IDBKeyRange.only(value.equals);
36
+ }
37
+ if (value.startsWith !== undefined) {
38
+ if (typeof value.startsWith !== 'string') {
39
+ throw new errors_1.IndexedDbError('QUERY_INVALID', 'startsWith is only supported for string keys');
40
+ }
41
+ return startsWithRange(value.startsWith);
42
+ }
43
+ if (value.between !== undefined) {
44
+ const [lower, upper, lowerOpen = false, upperOpen = false] = value.between;
45
+ return IDBKeyRange.bound(lower, upper, lowerOpen, upperOpen);
46
+ }
47
+ const lower = (_c = (_b = (_a = value.gte) !== null && _a !== void 0 ? _a : value.aboveOrEqual) !== null && _b !== void 0 ? _b : value.gt) !== null && _c !== void 0 ? _c : value.above;
48
+ const upper = (_f = (_e = (_d = value.lte) !== null && _d !== void 0 ? _d : value.belowOrEqual) !== null && _e !== void 0 ? _e : value.lt) !== null && _f !== void 0 ? _f : value.below;
49
+ const lowerOpen = value.gte === undefined &&
50
+ value.aboveOrEqual === undefined &&
51
+ (value.gt !== undefined || value.above !== undefined);
52
+ const upperOpen = value.lte === undefined &&
53
+ value.belowOrEqual === undefined &&
54
+ (value.lt !== undefined || value.below !== undefined);
55
+ if (lower !== undefined && upper !== undefined) {
56
+ return IDBKeyRange.bound(lower, upper, lowerOpen, upperOpen);
57
+ }
58
+ if (lower !== undefined) {
59
+ return IDBKeyRange.lowerBound(lower, lowerOpen);
60
+ }
61
+ if (upper !== undefined) {
62
+ return IDBKeyRange.upperBound(upper, upperOpen);
63
+ }
64
+ throw new errors_1.IndexedDbError('QUERY_INVALID', 'Range filter must include at least one bound');
65
+ }
66
+ return value;
67
+ }
68
+ exports.toKeyRange = toKeyRange;
69
+ /**
70
+ * Normalize a resolved key / range for IDB APIs that accept
71
+ * `IDBKeyRange | undefined` (`getAll`, `openCursor`, `count`).
72
+ */
73
+ function toOptionalKeyRange(keyRange) {
74
+ if (keyRange === undefined) {
75
+ return undefined;
76
+ }
77
+ if (keyRange instanceof IDBKeyRange) {
78
+ return keyRange;
79
+ }
80
+ return IDBKeyRange.only(keyRange);
81
+ }
82
+ exports.toOptionalKeyRange = toOptionalKeyRange;
83
+ /** Sentinel greater than any non-array IDB key (number/date/string/binary). */
84
+ const COMPOUND_UPPER_SENTINEL = [];
85
+ function isRangeFilterPart(value) {
86
+ return isRangeFilter(value);
87
+ }
88
+ /**
89
+ * Build a compound (multi-part) key or key range.
90
+ * Exact parts only → equality tuple.
91
+ * Exact prefix + range on the **last** part → IDBKeyRange over that suffix.
92
+ */
93
+ function toCompoundKeyRange(parts) {
94
+ var _a, _b, _c, _d, _e, _f;
95
+ if (parts.length === 0) {
96
+ throw new errors_1.IndexedDbError('QUERY_INVALID', 'Compound key must have at least one part');
97
+ }
98
+ const rangeIndexes = parts
99
+ .map((part, i) => (isRangeFilterPart(part) ? i : -1))
100
+ .filter((i) => i >= 0);
101
+ if (rangeIndexes.length === 0) {
102
+ return parts.map((part) => {
103
+ const key = toKeyRange(part);
104
+ if (key instanceof IDBKeyRange) {
105
+ throw new errors_1.IndexedDbError('QUERY_INVALID', 'Compound where values must be exact keys, not ranges');
106
+ }
107
+ return key;
108
+ });
109
+ }
110
+ if (rangeIndexes.length > 1 || rangeIndexes[0] !== parts.length - 1) {
111
+ throw new errors_1.IndexedDbError('QUERY_INVALID', 'Only the last compound key part may be a range; earlier parts must be exact keys');
112
+ }
113
+ const prefix = parts.slice(0, -1).map((part) => {
114
+ const key = toKeyRange(part);
115
+ if (key instanceof IDBKeyRange) {
116
+ throw new errors_1.IndexedDbError('QUERY_INVALID', 'Only the last compound key part may be a range; earlier parts must be exact keys');
117
+ }
118
+ return key;
119
+ });
120
+ const last = parts[parts.length - 1];
121
+ if (last.equals !== undefined) {
122
+ return [...prefix, last.equals];
123
+ }
124
+ if (last.startsWith !== undefined) {
125
+ if (typeof last.startsWith !== 'string') {
126
+ throw new errors_1.IndexedDbError('QUERY_INVALID', 'startsWith is only supported for string keys');
127
+ }
128
+ const lo = [...prefix, last.startsWith];
129
+ const hi = [...prefix, `${last.startsWith}\uffff`];
130
+ return IDBKeyRange.bound(lo, hi, false, false);
131
+ }
132
+ if (last.between !== undefined) {
133
+ const [lower, upper, lowerOpen = false, upperOpen = false] = last.between;
134
+ return IDBKeyRange.bound([...prefix, lower], [...prefix, upper], lowerOpen, upperOpen);
135
+ }
136
+ const lowerRaw = (_c = (_b = (_a = last.gte) !== null && _a !== void 0 ? _a : last.aboveOrEqual) !== null && _b !== void 0 ? _b : last.gt) !== null && _c !== void 0 ? _c : last.above;
137
+ const upperRaw = (_f = (_e = (_d = last.lte) !== null && _d !== void 0 ? _d : last.belowOrEqual) !== null && _e !== void 0 ? _e : last.lt) !== null && _f !== void 0 ? _f : last.below;
138
+ const lowerOpen = last.gte === undefined &&
139
+ last.aboveOrEqual === undefined &&
140
+ (last.gt !== undefined || last.above !== undefined);
141
+ const upperOpen = last.lte === undefined &&
142
+ last.belowOrEqual === undefined &&
143
+ (last.lt !== undefined || last.below !== undefined);
144
+ if (lowerRaw === undefined && upperRaw === undefined) {
145
+ throw new errors_1.IndexedDbError('QUERY_INVALID', 'Range filter must include at least one bound');
146
+ }
147
+ const lower = lowerRaw !== undefined
148
+ ? [...prefix, lowerRaw]
149
+ : [...prefix];
150
+ const upper = upperRaw !== undefined
151
+ ? [...prefix, upperRaw]
152
+ : [...prefix, COMPOUND_UPPER_SENTINEL];
153
+ const upperOpenEffective = upperRaw !== undefined ? upperOpen : true;
154
+ return IDBKeyRange.bound(lower, upper, lowerOpen, upperOpenEffective);
155
+ }
156
+ exports.toCompoundKeyRange = toCompoundKeyRange;
157
+ //# sourceMappingURL=key-range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-range.js","sourceRoot":"","sources":["../../src/utils/key-range.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function promisifyRequest<T>(request: IDBRequest<T>): Promise<T>;
2
+ export declare function transactionDone(tx: IDBTransaction): Promise<void>;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transactionDone = exports.promisifyRequest = void 0;
4
+ const errors_1 = require("../errors");
5
+ function promisifyRequest(request) {
6
+ return new Promise((resolve, reject) => {
7
+ request.onsuccess = () => resolve(request.result);
8
+ request.onerror = () => {
9
+ var _a, _b;
10
+ return reject(new errors_1.IndexedDbError('TRANSACTION_FAILED', (_b = (_a = request.error) === null || _a === void 0 ? void 0 : _a.message) !== null && _b !== void 0 ? _b : 'IndexedDB request failed'));
11
+ };
12
+ });
13
+ }
14
+ exports.promisifyRequest = promisifyRequest;
15
+ function transactionDone(tx) {
16
+ return new Promise((resolve, reject) => {
17
+ tx.oncomplete = () => resolve();
18
+ tx.onerror = () => {
19
+ var _a, _b;
20
+ return reject(new errors_1.IndexedDbError('TRANSACTION_FAILED', (_b = (_a = tx.error) === null || _a === void 0 ? void 0 : _a.message) !== null && _b !== void 0 ? _b : 'IndexedDB transaction failed'));
21
+ };
22
+ tx.onabort = () => {
23
+ var _a, _b;
24
+ return reject(new errors_1.IndexedDbError('TRANSACTION_FAILED', (_b = (_a = tx.error) === null || _a === void 0 ? void 0 : _a.message) !== null && _b !== void 0 ? _b : 'IndexedDB transaction aborted'));
25
+ };
26
+ });
27
+ }
28
+ exports.transactionDone = transactionDone;
29
+ //# sourceMappingURL=promisify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promisify.js","sourceRoot":"","sources":["../../src/utils/promisify.ts"],"names":[],"mappings":";;;AAAA,sCAA2C;AAE3C,SAAgB,gBAAgB,CAAI,OAAsB;IACxD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE;;YACrB,OAAA,MAAM,CACJ,IAAI,uBAAc,CAChB,oBAAoB,EACpB,MAAA,MAAA,OAAO,CAAC,KAAK,0CAAE,OAAO,mCAAI,0BAA0B,CACrD,CACF,CAAA;SAAA,CAAC;IACN,CAAC,CAAC,CAAC;AACL,CAAC;AAXD,4CAWC;AAED,SAAgB,eAAe,CAAC,EAAkB;IAChD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,EAAE,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAChC,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;;YAChB,OAAA,MAAM,CACJ,IAAI,uBAAc,CAChB,oBAAoB,EACpB,MAAA,MAAA,EAAE,CAAC,KAAK,0CAAE,OAAO,mCAAI,8BAA8B,CACpD,CACF,CAAA;SAAA,CAAC;QACJ,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;;YAChB,OAAA,MAAM,CACJ,IAAI,uBAAc,CAChB,oBAAoB,EACpB,MAAA,MAAA,EAAE,CAAC,KAAK,0CAAE,OAAO,mCAAI,+BAA+B,CACrD,CACF,CAAA;SAAA,CAAC;IACN,CAAC,CAAC,CAAC;AACL,CAAC;AAlBD,0CAkBC"}
@@ -0,0 +1,2 @@
1
+ /** Compile-time assert that A is assignable to B and B to A (approx). */
2
+ export type Expect<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=type-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-utils.js","sourceRoot":"","sources":["../../src/utils/type-utils.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "web-idb-client",
3
+ "version": "1.0.0",
4
+ "description": "Browser-only typed IndexedDB client with a Prisma-like store API and schema-in-TypeScript factories.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ },
12
+ "./liveQuery": {
13
+ "types": "./dist/liveQuery/index.d.ts",
14
+ "default": "./dist/liveQuery/index.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "prepare": "npm run build",
24
+ "format": "npx prettier \"src/**/*.{js,jsx,ts,tsx}\" --write",
25
+ "typecheck": "tsc --noEmit",
26
+ "test": "vitest run",
27
+ "test:watch": "vitest",
28
+ "ci": "npm run typecheck && npm test && npm run demo:build && npm run relations:build",
29
+ "demo:dev": "npm --prefix examples/todo run dev",
30
+ "demo:build": "npm --prefix examples/todo run build",
31
+ "demo:preview": "npm --prefix examples/todo run preview",
32
+ "relations:dev": "npm --prefix examples/relations run dev",
33
+ "relations:build": "npm --prefix examples/relations run build",
34
+ "prepublishOnly": "npm run build",
35
+ "version:patch": "npm version patch && git push origin main && git push origin $(npm version --json | jq -r '.[]')",
36
+ "version:minor": "npm version minor && git push origin main && git push origin $(npm version --json | jq -r '.[]')",
37
+ "version:major": "npm version major && git push origin main && git push origin $(npm version --json | jq -r '.[]')",
38
+ "publish:patch": "npm run version:patch && npm publish",
39
+ "publish:minor": "npm run version:minor && npm publish",
40
+ "publish:major": "npm run version:major && npm publish"
41
+ },
42
+ "keywords": [
43
+ "indexeddb",
44
+ "orm",
45
+ "client",
46
+ "database",
47
+ "browser",
48
+ "storage",
49
+ "typescript"
50
+ ],
51
+ "author": "Sergey Azarov <your-email@example.com>",
52
+ "license": "MIT",
53
+ "repository": {
54
+ "type": "git",
55
+ "url": "git+https://github.com/azarov-serge/indexed-db-client.git"
56
+ },
57
+ "bugs": {
58
+ "url": "https://github.com/azarov-serge/indexed-db-client/issues"
59
+ },
60
+ "homepage": "https://github.com/azarov-serge/indexed-db-client#readme",
61
+ "devDependencies": {
62
+ "@typescript-eslint/parser": "7.2.0",
63
+ "eslint": "8.57.0",
64
+ "fake-indexeddb": "^6.0.0",
65
+ "husky": "9.0.11",
66
+ "lint-staged": "15.2.2",
67
+ "prettier": "3.2.5",
68
+ "typescript": "5.1.6",
69
+ "vitest": "^2.1.8"
70
+ }
71
+ }