@chipmobilesdk/rn-local-db 0.2.0 → 0.2.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.
Files changed (84) hide show
  1. package/CHANGELOG.md +122 -102
  2. package/README.md +728 -728
  3. package/package.json +59 -62
  4. package/skills/sdk-rn-local-db/SKILL.md +0 -1
  5. package/src/adapter/budgets.ts +67 -67
  6. package/src/adapter/collection.ts +303 -298
  7. package/src/adapter/deletion.ts +252 -252
  8. package/src/adapter/index.ts +64 -68
  9. package/src/adapter/lifecycle.ts +517 -520
  10. package/src/adapter/transaction.ts +71 -71
  11. package/src/artifacts/availability.ts +67 -67
  12. package/src/artifacts/cascade.ts +114 -114
  13. package/src/artifacts/paths.ts +29 -29
  14. package/src/artifacts/reconcile.ts +63 -63
  15. package/src/artifacts/store.ts +334 -345
  16. package/src/contract/adapter.ts +76 -78
  17. package/src/contract/attachment.ts +75 -78
  18. package/src/contract/backup.ts +28 -28
  19. package/src/contract/config.ts +54 -54
  20. package/src/contract/encryption.ts +34 -34
  21. package/src/contract/errors.ts +76 -76
  22. package/src/contract/migration.ts +42 -42
  23. package/src/contract/query.ts +81 -81
  24. package/src/contract/record.ts +46 -51
  25. package/src/contract/schema.ts +36 -36
  26. package/src/contract/scope.ts +36 -36
  27. package/src/contract/transaction.ts +52 -54
  28. package/src/crypto/chunked-cipher.ts +153 -150
  29. package/src/crypto/derive.ts +64 -64
  30. package/src/crypto/key-provider.ts +78 -78
  31. package/src/crypto/provider.ts +81 -81
  32. package/src/diagnostics/dev-log.ts +112 -108
  33. package/src/diagnostics/errors.ts +62 -66
  34. package/src/diagnostics/faults.ts +58 -64
  35. package/src/diagnostics/map-native.ts +108 -106
  36. package/src/diagnostics/redact.ts +137 -141
  37. package/src/index.ts +80 -110
  38. package/src/migration/executor.ts +132 -136
  39. package/src/migration/ledger.ts +95 -97
  40. package/src/migration/validate-chain.ts +65 -65
  41. package/src/platform/backup-android-verify.ts +88 -88
  42. package/src/platform/backup-ios.ts +48 -48
  43. package/src/platform/bytes.ts +144 -144
  44. package/src/platform/fs.ts +89 -89
  45. package/src/platform/location.ts +135 -135
  46. package/src/query/budgets.ts +54 -54
  47. package/src/query/compare.ts +91 -91
  48. package/src/query/cursor.ts +100 -100
  49. package/src/query/filter.ts +82 -82
  50. package/src/query/paginate.ts +51 -51
  51. package/src/query/sort.ts +55 -56
  52. package/src/query/validate.ts +171 -171
  53. package/src/schema/declare.ts +42 -45
  54. package/src/schema/validate-config.ts +158 -158
  55. package/src/scope/hash.ts +131 -134
  56. package/src/scope/normalize.ts +83 -90
  57. package/src/scope/validate.ts +83 -83
  58. package/src/sqlite/adapter.ts +26 -26
  59. package/src/sqlite/batch.ts +242 -242
  60. package/src/sqlite/catalog.ts +105 -108
  61. package/src/sqlite/connection.ts +227 -227
  62. package/src/sqlite/index-coverage.ts +54 -56
  63. package/src/sqlite/native.ts +83 -83
  64. package/src/sqlite/row-codec.ts +217 -221
  65. package/src/sqlite/sql-builder.ts +244 -244
  66. package/src/sqlite/transaction-queue.ts +87 -87
  67. package/src/sqlite/transactions.ts +33 -33
  68. package/src/sqlite/values.ts +24 -24
  69. package/src/testing/conformance/attachments.ts +138 -136
  70. package/src/testing/conformance/encryption.ts +150 -150
  71. package/src/testing/conformance/index.ts +161 -161
  72. package/src/testing/conformance/lifecycle.ts +99 -99
  73. package/src/testing/conformance/migrations.ts +177 -177
  74. package/src/testing/conformance/queries.ts +204 -167
  75. package/src/testing/conformance/records.ts +169 -169
  76. package/src/testing/conformance/scopes.ts +86 -88
  77. package/src/testing/conformance/transactions.ts +149 -149
  78. package/src/testing/faults.ts +21 -21
  79. package/src/testing/index.ts +17 -21
  80. package/src/testing/memory-adapter/collection.ts +214 -219
  81. package/src/testing/memory-adapter/index.ts +510 -492
  82. package/src/testing/memory-adapter/migrations.ts +117 -119
  83. package/src/testing/memory-adapter/reset.ts +50 -50
  84. package/src/testing/memory-adapter/store.ts +128 -134
package/package.json CHANGED
@@ -1,62 +1,59 @@
1
- {
2
- "name": "@chipmobilesdk/rn-local-db",
3
- "version": "0.2.0",
4
- "private": false,
5
- "license": "UNLICENSED",
6
- "main": "src/index.ts",
7
- "types": "src/index.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./src/index.ts",
11
- "react-native": "./src/index.ts",
12
- "default": "./src/index.ts"
13
- },
14
- "./testing": {
15
- "types": "./src/testing/index.ts",
16
- "react-native": "./src/testing/index.ts",
17
- "default": "./src/testing/index.ts"
18
- }
19
- },
20
- "files": [
21
- "src/index.ts",
22
- "src/adapter",
23
- "src/artifacts",
24
- "src/contract",
25
- "src/crypto",
26
- "src/diagnostics",
27
- "src/migration",
28
- "src/platform",
29
- "src/query",
30
- "src/schema",
31
- "src/scope",
32
- "src/sqlite",
33
- "src/testing",
34
- "skills",
35
- "README.md",
36
- "CHANGELOG.md"
37
- ],
38
- "sideEffects": false,
39
- "scripts": {
40
- "typecheck": "tsc -p tsconfig.json --noEmit",
41
- "pack:dry-run": "npm pack --dry-run"
42
- },
43
- "peerDependencies": {
44
- "@dr.pogodin/react-native-fs": ">=2.39.2",
45
- "@op-engineering/op-sqlite": ">=17.1.0",
46
- "react": ">=19",
47
- "react-native": ">=0.85",
48
- "react-native-quick-crypto": ">=1.0.0"
49
- },
50
- "peerDependenciesMeta": {
51
- "react-native-quick-crypto": {
52
- "optional": true
53
- }
54
- },
55
- "engines": {
56
- "node": ">=22.11.0"
57
- },
58
- "publishConfig": {
59
- "access": "public",
60
- "registry": "https://registry.npmjs.org/"
61
- }
62
- }
1
+ {
2
+ "name": "@chipmobilesdk/rn-local-db",
3
+ "version": "0.2.1",
4
+ "private": false,
5
+ "license": "UNLICENSED",
6
+ "main": "src/index.ts",
7
+ "types": "src/index.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./src/index.ts",
11
+ "react-native": "./src/index.ts",
12
+ "default": "./src/index.ts"
13
+ },
14
+ "./testing": {
15
+ "types": "./src/testing/index.ts",
16
+ "react-native": "./src/testing/index.ts",
17
+ "default": "./src/testing/index.ts"
18
+ }
19
+ },
20
+ "files": [
21
+ "src/index.ts",
22
+ "src/adapter",
23
+ "src/artifacts",
24
+ "src/contract",
25
+ "src/crypto",
26
+ "src/diagnostics",
27
+ "src/migration",
28
+ "src/platform",
29
+ "src/query",
30
+ "src/schema",
31
+ "src/scope",
32
+ "src/sqlite",
33
+ "src/testing",
34
+ "skills",
35
+ "README.md",
36
+ "CHANGELOG.md"
37
+ ],
38
+ "sideEffects": false,
39
+ "scripts": {
40
+ "typecheck": "tsc -p tsconfig.json --noEmit",
41
+ "pack:check": "npm pack --dry-run"
42
+ },
43
+ "peerDependencies": {
44
+ "@dr.pogodin/react-native-fs": ">=2.39.2",
45
+ "@op-engineering/op-sqlite": ">=17.1.0",
46
+ "react": ">=19",
47
+ "react-native": ">=0.85",
48
+ "react-native-quick-crypto": ">=1.0.0"
49
+ },
50
+ "peerDependenciesMeta": {
51
+ "react-native-quick-crypto": {
52
+ "optional": true
53
+ }
54
+ },
55
+ "publishConfig": {
56
+ "access": "public",
57
+ "registry": "https://registry.npmjs.org/"
58
+ }
59
+ }
@@ -3,7 +3,6 @@ name: sdk-rn-local-db
3
3
  description: "Offline SQLite storage via @chipmobilesdk/rn-local-db: schemas, scoped data, queries, transactions, migrations, attachments, encryption. Use when persisting data locally, writing a migration, deleting a user's data, or handling sign-out data retention."
4
4
  metadata:
5
5
  package: "@chipmobilesdk/rn-local-db"
6
- packageVersion: "0.1.0"
7
6
  user-invocable: true
8
7
  disable-model-invocation: false
9
8
  ---
@@ -1,67 +1,67 @@
1
- /**
2
- * Where the FR-088 budgets are actually enforced.
3
- *
4
- * The checks live in `query/budgets.ts` so both adapters share them; this
5
- * module is the adapter-layer entry point, and exists so there is one place
6
- * to answer "which budgets are hard?" — per-record size, batch size, page
7
- * size, and artifact size, each with a typed error (FR-088a).
8
- *
9
- * The rest are soft by design. Exceeding 100,000 records in a collection is
10
- * slow, not an error, and refusing the 100,001st write would destroy data an
11
- * app already holds. Degraded behavior is documented in the README instead.
12
- */
13
-
14
- import { Budgets } from '../contract/config';
15
- import { DiagnosticCodes } from '../contract/errors';
16
- import type { StorableRecordData } from '../contract/record';
17
- import { raise } from '../diagnostics/errors';
18
- import {
19
- assertArtifactWithinBudget,
20
- assertBatchWithinBudget,
21
- assertRecordWithinBudget,
22
- serializedSize,
23
- } from '../query/budgets';
24
-
25
- export {
26
- assertArtifactWithinBudget,
27
- assertBatchWithinBudget,
28
- assertRecordWithinBudget,
29
- serializedSize,
30
- };
31
-
32
- /**
33
- * Concurrently open handles.
34
- *
35
- * Each one holds a native connection and its write-ahead log, so an app that
36
- * leaks handles runs out of file descriptors rather than slowing down. Eight
37
- * is generous for the multi-identity case FR-008b describes and low enough
38
- * that a leak surfaces during development instead of in the field.
39
- */
40
- let openHandles = 0;
41
-
42
- export function acquireHandleSlot(): void {
43
- if (openHandles >= Budgets.MAX_OPEN_HANDLES) {
44
- raise(DiagnosticCodes.OPEN_FAILED, {
45
- message: 'too many database handles are open',
46
- detail: { count: openHandles, limit: Budgets.MAX_OPEN_HANDLES },
47
- });
48
- }
49
- openHandles += 1;
50
- }
51
-
52
- export function releaseHandleSlot(): void {
53
- openHandles = Math.max(0, openHandles - 1);
54
- }
55
-
56
- export function openHandleCount(): number {
57
- return openHandles;
58
- }
59
-
60
- /** Between tests, and after a `deleteDatabase` that invalidated every handle. */
61
- export function resetHandleSlots(): void {
62
- openHandles = 0;
63
- }
64
-
65
- export function assertWritable(collection: string, data: StorableRecordData): void {
66
- assertRecordWithinBudget(collection, data);
67
- }
1
+ /**
2
+ * Where the FR-088 budgets are actually enforced.
3
+ *
4
+ * The checks live in `query/budgets.ts` so both adapters share them; this
5
+ * module is the adapter-layer entry point, and exists so there is one place
6
+ * to answer "which budgets are hard?" — per-record size, batch size, page
7
+ * size, and artifact size, each with a typed error (FR-088a).
8
+ *
9
+ * The rest are soft by design. Exceeding 100,000 records in a collection is
10
+ * slow, not an error, and refusing the 100,001st write would destroy data an
11
+ * app already holds. Degraded behavior is documented in the README instead.
12
+ */
13
+
14
+ import { Budgets } from '../contract/config';
15
+ import { DiagnosticCodes } from '../contract/errors';
16
+ import type { StorableRecordData } from '../contract/record';
17
+ import { raise } from '../diagnostics/errors';
18
+ import {
19
+ assertArtifactWithinBudget,
20
+ assertBatchWithinBudget,
21
+ assertRecordWithinBudget,
22
+ serializedSize,
23
+ } from '../query/budgets';
24
+
25
+ export {
26
+ assertArtifactWithinBudget,
27
+ assertBatchWithinBudget,
28
+ assertRecordWithinBudget,
29
+ serializedSize,
30
+ };
31
+
32
+ /**
33
+ * Concurrently open handles.
34
+ *
35
+ * Each one holds a native connection and its write-ahead log, so an app that
36
+ * leaks handles runs out of file descriptors rather than slowing down. Eight
37
+ * is generous for the multi-identity case FR-008b describes and low enough
38
+ * that a leak surfaces during development instead of in the field.
39
+ */
40
+ let openHandles = 0;
41
+
42
+ export function acquireHandleSlot(): void {
43
+ if (openHandles >= Budgets.MAX_OPEN_HANDLES) {
44
+ raise(DiagnosticCodes.OPEN_FAILED, {
45
+ message: 'too many database handles are open',
46
+ detail: { count: openHandles, limit: Budgets.MAX_OPEN_HANDLES },
47
+ });
48
+ }
49
+ openHandles += 1;
50
+ }
51
+
52
+ export function releaseHandleSlot(): void {
53
+ openHandles = Math.max(0, openHandles - 1);
54
+ }
55
+
56
+ export function openHandleCount(): number {
57
+ return openHandles;
58
+ }
59
+
60
+ /** Between tests, and after a `deleteDatabase` that invalidated every handle. */
61
+ export function resetHandleSlots(): void {
62
+ openHandles = 0;
63
+ }
64
+
65
+ export function assertWritable(collection: string, data: StorableRecordData): void {
66
+ assertRecordWithinBudget(collection, data);
67
+ }