jazz-tools 2.0.0-alpha.21 → 2.0.0-alpha.22
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.
- package/bin/docs-index.db +0 -0
- package/bin/docs-index.txt +1624 -542
- package/bin/jazz-tools.js +19 -40
- package/bin/native/jazz-tools-darwin-arm64 +0 -0
- package/bin/native/jazz-tools-darwin-x64 +0 -0
- package/bin/native/jazz-tools-linux-arm64 +0 -0
- package/bin/native/jazz-tools-linux-x64 +0 -0
- package/bin/native/jazz-tools-windows-x64.exe +0 -0
- package/dist/backend/create-jazz-context.d.ts +31 -6
- package/dist/backend/create-jazz-context.d.ts.map +1 -1
- package/dist/backend/create-jazz-context.js +35 -5
- package/dist/backend/create-jazz-context.js.map +1 -1
- package/dist/backend/create-jazz-context.test.js +61 -6
- package/dist/backend/create-jazz-context.test.js.map +1 -1
- package/dist/cli.d.ts +29 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +648 -246
- package/dist/cli.js.map +1 -1
- package/dist/cli.test.js +512 -297
- package/dist/cli.test.js.map +1 -1
- package/dist/codegen/schema-reader.d.ts.map +1 -1
- package/dist/codegen/schema-reader.js +6 -1
- package/dist/codegen/schema-reader.js.map +1 -1
- package/dist/dev-tools/dev-tools.d.ts.map +1 -1
- package/dist/dev-tools/dev-tools.js +61 -13
- package/dist/dev-tools/dev-tools.js.map +1 -1
- package/dist/dev-tools/dev-tools.test.js +166 -0
- package/dist/dev-tools/dev-tools.test.js.map +1 -1
- package/dist/dev-tools/extension-panel.d.ts.map +1 -1
- package/dist/dev-tools/extension-panel.js +30 -7
- package/dist/dev-tools/extension-panel.js.map +1 -1
- package/dist/dev-tools/protocol.d.ts +49 -1
- package/dist/dev-tools/protocol.d.ts.map +1 -1
- package/dist/dev-tools/protocol.js +3 -0
- package/dist/dev-tools/protocol.js.map +1 -1
- package/dist/drivers/index.d.ts +1 -1
- package/dist/drivers/index.d.ts.map +1 -1
- package/dist/drivers/schema-wire.d.ts.map +1 -1
- package/dist/drivers/schema-wire.js +12 -1
- package/dist/drivers/schema-wire.js.map +1 -1
- package/dist/drivers/schema-wire.test.d.ts +2 -0
- package/dist/drivers/schema-wire.test.d.ts.map +1 -0
- package/dist/drivers/schema-wire.test.js +31 -0
- package/dist/drivers/schema-wire.test.js.map +1 -0
- package/dist/drivers/types.d.ts +2 -0
- package/dist/drivers/types.d.ts.map +1 -1
- package/dist/dsl.d.ts +139 -95
- package/dist/dsl.d.ts.map +1 -1
- package/dist/dsl.js +64 -8
- package/dist/dsl.js.map +1 -1
- package/dist/dsl.test.js +78 -8
- package/dist/dsl.test.js.map +1 -1
- package/dist/index.d.ts +32 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -3
- package/dist/index.js.map +1 -1
- package/dist/magic-columns.d.ts +3 -1
- package/dist/magic-columns.d.ts.map +1 -1
- package/dist/magic-columns.js +20 -4
- package/dist/magic-columns.js.map +1 -1
- package/dist/mcp/build-index.test.js +1 -1
- package/dist/migrations.d.ts +126 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +112 -0
- package/dist/migrations.js.map +1 -0
- package/dist/permissions/index.test.js +35 -0
- package/dist/permissions/index.test.js.map +1 -1
- package/dist/react-native/create-jazz-client.test.js +62 -42
- package/dist/react-native/create-jazz-client.test.js.map +1 -1
- package/dist/react-native/jazz-rn-runtime-adapter.d.ts +18 -3
- package/dist/react-native/jazz-rn-runtime-adapter.d.ts.map +1 -1
- package/dist/react-native/jazz-rn-runtime-adapter.js +110 -6
- package/dist/react-native/jazz-rn-runtime-adapter.js.map +1 -1
- package/dist/react-native/jazz-rn-runtime-adapter.test.js +149 -4
- package/dist/react-native/jazz-rn-runtime-adapter.test.js.map +1 -1
- package/dist/reconcile-array.d.ts +29 -0
- package/dist/reconcile-array.d.ts.map +1 -0
- package/dist/reconcile-array.js +110 -0
- package/dist/reconcile-array.js.map +1 -0
- package/dist/reconcile-array.test.d.ts +2 -0
- package/dist/reconcile-array.test.d.ts.map +1 -0
- package/dist/reconcile-array.test.js +118 -0
- package/dist/reconcile-array.test.js.map +1 -0
- package/dist/runtime/client.d.ts +24 -20
- package/dist/runtime/client.d.ts.map +1 -1
- package/dist/runtime/client.for-request.test.js +8 -8
- package/dist/runtime/client.for-request.test.js.map +1 -1
- package/dist/runtime/client.js +58 -25
- package/dist/runtime/client.js.map +1 -1
- package/dist/runtime/client.mutations.test.js +72 -1
- package/dist/runtime/client.mutations.test.js.map +1 -1
- package/dist/runtime/cloud-server.integration.test.js +145 -88
- package/dist/runtime/cloud-server.integration.test.js.map +1 -1
- package/dist/runtime/db.d.ts +3 -7
- package/dist/runtime/db.d.ts.map +1 -1
- package/dist/runtime/db.js +16 -14
- package/dist/runtime/db.js.map +1 -1
- package/dist/runtime/db.schema-order.test.js +8 -8
- package/dist/runtime/db.schema-order.test.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/napi.integration.test.js +113 -136
- package/dist/runtime/napi.integration.test.js.map +1 -1
- package/dist/runtime/query-adapter.d.ts.map +1 -1
- package/dist/runtime/query-adapter.js +22 -2
- package/dist/runtime/query-adapter.js.map +1 -1
- package/dist/runtime/query-adapter.test.js +81 -5
- package/dist/runtime/query-adapter.test.js.map +1 -1
- package/dist/runtime/row-transformer.js +2 -2
- package/dist/runtime/row-transformer.js.map +1 -1
- package/dist/runtime/row-transformer.test.js +9 -9
- package/dist/runtime/row-transformer.test.js.map +1 -1
- package/dist/runtime/schema-fetch.d.ts +103 -1
- package/dist/runtime/schema-fetch.d.ts.map +1 -1
- package/dist/runtime/schema-fetch.js +106 -0
- package/dist/runtime/schema-fetch.js.map +1 -1
- package/dist/runtime/sync-transport.d.ts.map +1 -1
- package/dist/runtime/sync-transport.js +15 -0
- package/dist/runtime/sync-transport.js.map +1 -1
- package/dist/runtime/sync-transport.test.js +33 -0
- package/dist/runtime/sync-transport.test.js.map +1 -1
- package/dist/runtime/value-converter.d.ts +9 -6
- package/dist/runtime/value-converter.d.ts.map +1 -1
- package/dist/runtime/value-converter.js +22 -9
- package/dist/runtime/value-converter.js.map +1 -1
- package/dist/runtime/value-converter.test.js +32 -26
- package/dist/runtime/value-converter.test.js.map +1 -1
- package/dist/schema-loader.d.ts +14 -0
- package/dist/schema-loader.d.ts.map +1 -0
- package/dist/schema-loader.js +217 -0
- package/dist/schema-loader.js.map +1 -0
- package/dist/schema-permissions.d.ts +8 -0
- package/dist/schema-permissions.d.ts.map +1 -0
- package/dist/schema-permissions.js +266 -0
- package/dist/schema-permissions.js.map +1 -0
- package/dist/schema-permissions.test.d.ts +2 -0
- package/dist/schema-permissions.test.d.ts.map +1 -0
- package/dist/schema-permissions.test.js +43 -0
- package/dist/schema-permissions.test.js.map +1 -0
- package/dist/schema.d.ts +11 -9
- package/dist/schema.d.ts.map +1 -1
- package/dist/svelte/context.svelte.test.js +50 -0
- package/dist/svelte/rune-patterns.svelte.test.js +301 -0
- package/dist/svelte/test-helpers.svelte.js +14 -0
- package/dist/svelte/use-all.svelte.d.ts.map +1 -1
- package/dist/svelte/use-all.svelte.js +7 -1
- package/dist/testing/fixtures/basic/schema.d.ts +11 -0
- package/dist/testing/fixtures/basic/schema.d.ts.map +1 -0
- package/dist/testing/fixtures/basic/schema.js +10 -0
- package/dist/testing/fixtures/basic/schema.js.map +1 -0
- package/dist/testing/index.d.ts +2 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +2 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/index.test.js +109 -9
- package/dist/testing/index.test.js.map +1 -1
- package/dist/testing/local-jazz-server.d.ts +2 -0
- package/dist/testing/local-jazz-server.d.ts.map +1 -1
- package/dist/testing/local-jazz-server.js +21 -51
- package/dist/testing/local-jazz-server.js.map +1 -1
- package/dist/testing/policy-test-app.d.ts.map +1 -1
- package/dist/testing/policy-test-app.js +71 -3
- package/dist/testing/policy-test-app.js.map +1 -1
- package/dist/typed-app.d.ts +364 -0
- package/dist/typed-app.d.ts.map +1 -0
- package/dist/{testing/fixtures/basic/app.js → typed-app.js} +118 -30
- package/dist/typed-app.js.map +1 -0
- package/dist/vue/use-all.d.ts +2 -2
- package/dist/vue/use-all.d.ts.map +1 -1
- package/dist/vue/use-all.js +9 -3
- package/dist/vue/use-all.js.map +1 -1
- package/dist/vue/use-all.test.js +137 -0
- package/dist/vue/use-all.test.js.map +1 -1
- package/package.json +15 -13
- package/dist/codegen/codegen.test.d.ts +0 -2
- package/dist/codegen/codegen.test.d.ts.map +0 -1
- package/dist/codegen/codegen.test.js +0 -1134
- package/dist/codegen/codegen.test.js.map +0 -1
- package/dist/codegen/index.d.ts +0 -18
- package/dist/codegen/index.d.ts.map +0 -1
- package/dist/codegen/index.js +0 -22
- package/dist/codegen/index.js.map +0 -1
- package/dist/codegen/query-builder-generator.d.ts +0 -26
- package/dist/codegen/query-builder-generator.d.ts.map +0 -1
- package/dist/codegen/query-builder-generator.js +0 -377
- package/dist/codegen/query-builder-generator.js.map +0 -1
- package/dist/codegen/type-generator.d.ts +0 -30
- package/dist/codegen/type-generator.d.ts.map +0 -1
- package/dist/codegen/type-generator.js +0 -368
- package/dist/codegen/type-generator.js.map +0 -1
- package/dist/runtime/napi.fjall.db.all.integration.test.d.ts +0 -2
- package/dist/runtime/napi.fjall.db.all.integration.test.d.ts.map +0 -1
- package/dist/runtime/napi.fjall.db.all.integration.test.js +0 -76
- package/dist/runtime/napi.fjall.db.all.integration.test.js.map +0 -1
- package/dist/runtime/napi.fjall.db.subscribeAll.integration.test.d.ts +0 -2
- package/dist/runtime/napi.fjall.db.subscribeAll.integration.test.d.ts.map +0 -1
- package/dist/runtime/napi.fjall.db.subscribeAll.integration.test.js +0 -47
- package/dist/runtime/napi.fjall.db.subscribeAll.integration.test.js.map +0 -1
- package/dist/runtime/napi.fjall.test-helpers.d.ts +0 -34
- package/dist/runtime/napi.fjall.test-helpers.d.ts.map +0 -1
- package/dist/runtime/napi.fjall.test-helpers.js +0 -172
- package/dist/runtime/napi.fjall.test-helpers.js.map +0 -1
- package/dist/sql-gen.d.ts +0 -5
- package/dist/sql-gen.d.ts.map +0 -1
- package/dist/sql-gen.js +0 -234
- package/dist/sql-gen.js.map +0 -1
- package/dist/sql-gen.test.d.ts +0 -2
- package/dist/sql-gen.test.d.ts.map +0 -1
- package/dist/sql-gen.test.js +0 -481
- package/dist/sql-gen.test.js.map +0 -1
- package/dist/svelte/context.test.d.ts +0 -2
- package/dist/svelte/context.test.d.ts.map +0 -1
- package/dist/svelte/context.test.js +0 -55
- package/dist/svelte/use-all.test.d.ts +0 -2
- package/dist/svelte/use-all.test.d.ts.map +0 -1
- package/dist/svelte/use-all.test.js +0 -147
- package/dist/testing/fixtures/basic/app.d.ts +0 -59
- package/dist/testing/fixtures/basic/app.d.ts.map +0 -1
- package/dist/testing/fixtures/basic/app.js.map +0 -1
- package/dist/testing/fixtures/basic/current.d.ts +0 -2
- package/dist/testing/fixtures/basic/current.d.ts.map +0 -1
- package/dist/testing/fixtures/basic/current.js +0 -6
- package/dist/testing/fixtures/basic/current.js.map +0 -1
|
@@ -8,6 +8,7 @@ import { fileURLToPath } from "node:url";
|
|
|
8
8
|
import { beforeAll, describe, expect, it, vi } from "vitest";
|
|
9
9
|
import { serializeRuntimeSchema } from "../drivers/schema-wire.js";
|
|
10
10
|
import { translateQuery } from "./query-adapter.js";
|
|
11
|
+
import { loadCompiledSchema } from "../schema-loader.js";
|
|
11
12
|
import { pushSchemaCatalogue, startLocalJazzServer } from "../testing/local-jazz-server.js";
|
|
12
13
|
import { createNapiRuntime, loadNapiModule } from "./testing/napi-runtime-test-utils.js";
|
|
13
14
|
const JWT_KID = "napi-test-kid";
|
|
@@ -29,86 +30,13 @@ const TIMESTAMP_SCHEMA = {
|
|
|
29
30
|
],
|
|
30
31
|
},
|
|
31
32
|
};
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
{ name: "done", column_type: { type: "Boolean" }, nullable: false },
|
|
40
|
-
{ name: "description", column_type: { type: "Text" }, nullable: true },
|
|
41
|
-
{
|
|
42
|
-
name: "parent",
|
|
43
|
-
column_type: { type: "Uuid" },
|
|
44
|
-
nullable: true,
|
|
45
|
-
references: "todos",
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
name: "project",
|
|
49
|
-
column_type: { type: "Uuid" },
|
|
50
|
-
nullable: true,
|
|
51
|
-
references: "projects",
|
|
52
|
-
},
|
|
53
|
-
{ name: "owner_id", column_type: { type: "Text" }, nullable: false },
|
|
54
|
-
],
|
|
55
|
-
policies: {
|
|
56
|
-
select: {
|
|
57
|
-
using: {
|
|
58
|
-
type: "Cmp",
|
|
59
|
-
column: "owner_id",
|
|
60
|
-
op: "Eq",
|
|
61
|
-
value: {
|
|
62
|
-
type: "SessionRef",
|
|
63
|
-
path: ["user_id"],
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
insert: {
|
|
68
|
-
with_check: {
|
|
69
|
-
type: "Cmp",
|
|
70
|
-
column: "owner_id",
|
|
71
|
-
op: "Eq",
|
|
72
|
-
value: {
|
|
73
|
-
type: "SessionRef",
|
|
74
|
-
path: ["user_id"],
|
|
75
|
-
},
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
update: {
|
|
79
|
-
using: {
|
|
80
|
-
type: "Cmp",
|
|
81
|
-
column: "owner_id",
|
|
82
|
-
op: "Eq",
|
|
83
|
-
value: {
|
|
84
|
-
type: "SessionRef",
|
|
85
|
-
path: ["user_id"],
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
with_check: {
|
|
89
|
-
type: "Cmp",
|
|
90
|
-
column: "owner_id",
|
|
91
|
-
op: "Eq",
|
|
92
|
-
value: {
|
|
93
|
-
type: "SessionRef",
|
|
94
|
-
path: ["user_id"],
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
delete: {
|
|
99
|
-
using: {
|
|
100
|
-
type: "Cmp",
|
|
101
|
-
column: "owner_id",
|
|
102
|
-
op: "Eq",
|
|
103
|
-
value: {
|
|
104
|
-
type: "SessionRef",
|
|
105
|
-
path: ["user_id"],
|
|
106
|
-
},
|
|
107
|
-
},
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
};
|
|
33
|
+
let todoServerWasmSchemaPromise = null;
|
|
34
|
+
async function loadTodoServerWasmSchema() {
|
|
35
|
+
if (!todoServerWasmSchemaPromise) {
|
|
36
|
+
todoServerWasmSchemaPromise = loadCompiledSchema(TODO_SERVER_SCHEMA_DIR).then((compiled) => compiled.wasmSchema);
|
|
37
|
+
}
|
|
38
|
+
return await todoServerWasmSchemaPromise;
|
|
39
|
+
}
|
|
112
40
|
const simpleTodosTable = {
|
|
113
41
|
_table: "todos",
|
|
114
42
|
_schema: TEST_SCHEMA,
|
|
@@ -135,30 +63,34 @@ const timestampProjectsTable = {
|
|
|
135
63
|
_rowType: undefined,
|
|
136
64
|
_initType: undefined,
|
|
137
65
|
};
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
66
|
+
function makePolicyTodosTable(schema) {
|
|
67
|
+
return {
|
|
68
|
+
_table: "todos",
|
|
69
|
+
_schema: schema,
|
|
70
|
+
_rowType: undefined,
|
|
71
|
+
_initType: undefined,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function makeAllPolicyTodosQuery(schema) {
|
|
75
|
+
return {
|
|
76
|
+
_table: "todos",
|
|
77
|
+
_schema: schema,
|
|
78
|
+
_rowType: undefined,
|
|
79
|
+
_build() {
|
|
80
|
+
return JSON.stringify({
|
|
81
|
+
table: "todos",
|
|
82
|
+
conditions: [],
|
|
83
|
+
includes: {},
|
|
84
|
+
orderBy: [],
|
|
85
|
+
offset: 0,
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function makePolicyTodoByIdQuery(schema, id) {
|
|
159
91
|
return {
|
|
160
92
|
_table: "todos",
|
|
161
|
-
_schema:
|
|
93
|
+
_schema: schema,
|
|
162
94
|
_rowType: undefined,
|
|
163
95
|
_build() {
|
|
164
96
|
return JSON.stringify({
|
|
@@ -172,7 +104,7 @@ function policyTodoByIdQuery(id) {
|
|
|
172
104
|
};
|
|
173
105
|
}
|
|
174
106
|
const BASIC_SCHEMA_DIR = fileURLToPath(new URL("../testing/fixtures/basic", import.meta.url));
|
|
175
|
-
const TODO_SERVER_SCHEMA_DIR = fileURLToPath(new URL("../../../../examples/todo-server-ts
|
|
107
|
+
const TODO_SERVER_SCHEMA_DIR = fileURLToPath(new URL("../../../../examples/todo-server-ts", import.meta.url));
|
|
176
108
|
beforeAll(async () => {
|
|
177
109
|
await loadNapiModule();
|
|
178
110
|
});
|
|
@@ -463,19 +395,19 @@ describe("NAPI integration", () => {
|
|
|
463
395
|
const updatedOversizedTitle = "y".repeat(45_000);
|
|
464
396
|
const queryJson = translateQuery(allTodosQuery._build(), TEST_SCHEMA);
|
|
465
397
|
try {
|
|
466
|
-
const insertedRow = runtime.insert("todos",
|
|
467
|
-
{ type: "Text", value: oversizedTitle },
|
|
468
|
-
{ type: "Boolean", value: false },
|
|
469
|
-
|
|
398
|
+
const insertedRow = runtime.insert("todos", {
|
|
399
|
+
title: { type: "Text", value: oversizedTitle },
|
|
400
|
+
done: { type: "Boolean", value: false },
|
|
401
|
+
});
|
|
470
402
|
let rows = await runtime.query(queryJson);
|
|
471
403
|
expect(rows).toHaveLength(1);
|
|
472
404
|
expect(rows[0]).toMatchObject({ id: insertedRow.id });
|
|
473
405
|
expect(rows[0]?.values[0]).toEqual({ type: "Text", value: oversizedTitle });
|
|
474
406
|
expect(rows[0]?.values[1]).toEqual({ type: "Boolean", value: false });
|
|
475
|
-
const secondRow = runtime.insert("todos",
|
|
476
|
-
{ type: "Text", value: "kept title" },
|
|
477
|
-
{ type: "Boolean", value: false },
|
|
478
|
-
|
|
407
|
+
const secondRow = runtime.insert("todos", {
|
|
408
|
+
title: { type: "Text", value: "kept title" },
|
|
409
|
+
done: { type: "Boolean", value: false },
|
|
410
|
+
});
|
|
479
411
|
runtime.update(secondRow.id, {
|
|
480
412
|
title: { type: "Text", value: updatedOversizedTitle },
|
|
481
413
|
});
|
|
@@ -543,10 +475,10 @@ describe("NAPI integration", () => {
|
|
|
543
475
|
call[1][1] === clientId &&
|
|
544
476
|
hasPayloadKind(call[1][2], "QuerySettled"))).toBe(true);
|
|
545
477
|
}, { timeout: 15_000 });
|
|
546
|
-
const insertedRow = runtime.insert("todos",
|
|
547
|
-
{ type: "Text", value: "client-synced-item" },
|
|
548
|
-
{ type: "Boolean", value: false },
|
|
549
|
-
|
|
478
|
+
const insertedRow = runtime.insert("todos", {
|
|
479
|
+
title: { type: "Text", value: "client-synced-item" },
|
|
480
|
+
done: { type: "Boolean", value: false },
|
|
481
|
+
});
|
|
550
482
|
await vi.waitFor(() => {
|
|
551
483
|
expect(rawCalls.some((call) => isNestedOutboxCall(call) &&
|
|
552
484
|
call[1][0] === "client" &&
|
|
@@ -564,6 +496,7 @@ describe("NAPI integration", () => {
|
|
|
564
496
|
context = createJazzContext({
|
|
565
497
|
appId: `napi-backend-sync-${randomUUID()}`,
|
|
566
498
|
app: { wasmSchema: TEST_SCHEMA },
|
|
499
|
+
permissions: {},
|
|
567
500
|
driver: { type: "memory" },
|
|
568
501
|
serverUrl: captureServer.baseUrl,
|
|
569
502
|
backendSecret: "napi-backend-secret",
|
|
@@ -604,6 +537,7 @@ describe("NAPI integration", () => {
|
|
|
604
537
|
context = createJazzContext({
|
|
605
538
|
appId: `napi-backend-reconnect-${randomUUID()}`,
|
|
606
539
|
app: { wasmSchema: TEST_SCHEMA },
|
|
540
|
+
permissions: {},
|
|
607
541
|
driver: { type: "memory" },
|
|
608
542
|
serverUrl: captureServer.baseUrl,
|
|
609
543
|
backendSecret: "napi-backend-secret",
|
|
@@ -657,9 +591,12 @@ describe("NAPI integration", () => {
|
|
|
657
591
|
env: "test",
|
|
658
592
|
userBranch: "main",
|
|
659
593
|
});
|
|
594
|
+
const todoServerSchema = await loadTodoServerWasmSchema();
|
|
595
|
+
const policyTodosTable = makePolicyTodosTable(todoServerSchema);
|
|
660
596
|
context = createJazzContext({
|
|
661
597
|
appId,
|
|
662
|
-
app: { wasmSchema:
|
|
598
|
+
app: { wasmSchema: todoServerSchema },
|
|
599
|
+
permissions: {},
|
|
663
600
|
driver: { type: "memory" },
|
|
664
601
|
serverUrl: server.url,
|
|
665
602
|
backendSecret,
|
|
@@ -667,6 +604,7 @@ describe("NAPI integration", () => {
|
|
|
667
604
|
userBranch: "main",
|
|
668
605
|
tier: "worker",
|
|
669
606
|
});
|
|
607
|
+
await settleAsyncSyncWork();
|
|
670
608
|
const backendDb = context.asBackend();
|
|
671
609
|
const aliceDb = context.forSession({
|
|
672
610
|
user_id: "alice",
|
|
@@ -676,32 +614,38 @@ describe("NAPI integration", () => {
|
|
|
676
614
|
title: "session-created-item",
|
|
677
615
|
done: false,
|
|
678
616
|
description: "created via forSession",
|
|
679
|
-
|
|
617
|
+
ownerId: "alice",
|
|
680
618
|
}, { tier: "edge" }), 10_000, "session insert timed out");
|
|
681
619
|
await vi.waitFor(async () => {
|
|
682
|
-
expect(await withTimeout(backendDb.one(
|
|
620
|
+
expect(await withTimeout(backendDb.one(makePolicyTodoByIdQuery(todoServerSchema, createdTodo.id), {
|
|
621
|
+
tier: "edge",
|
|
622
|
+
}), 10_000, "backend session read timed out")).toMatchObject({
|
|
683
623
|
id: createdTodo.id,
|
|
684
624
|
title: "session-created-item",
|
|
685
625
|
done: false,
|
|
686
|
-
|
|
626
|
+
ownerId: "alice",
|
|
687
627
|
});
|
|
688
628
|
}, { timeout: 20_000 });
|
|
689
629
|
await expect(aliceDb.insertDurable(policyTodosTable, {
|
|
690
630
|
title: "session-policy-denied",
|
|
691
631
|
done: false,
|
|
692
632
|
description: "",
|
|
693
|
-
|
|
633
|
+
ownerId: "bob",
|
|
694
634
|
}, { tier: "edge" })).rejects.toThrow();
|
|
695
635
|
await withTimeout(aliceDb.updateDurable(policyTodosTable, createdTodo.id, { done: true }, { tier: "edge" }), 10_000, "session update timed out");
|
|
696
636
|
await vi.waitFor(async () => {
|
|
697
|
-
expect(await withTimeout(backendDb.one(
|
|
637
|
+
expect(await withTimeout(backendDb.one(makePolicyTodoByIdQuery(todoServerSchema, createdTodo.id), {
|
|
638
|
+
tier: "edge",
|
|
639
|
+
}), 10_000, "backend session update read timed out")).toMatchObject({
|
|
698
640
|
id: createdTodo.id,
|
|
699
641
|
done: true,
|
|
700
642
|
});
|
|
701
643
|
}, { timeout: 20_000 });
|
|
702
644
|
await withTimeout(aliceDb.deleteDurable(policyTodosTable, createdTodo.id, { tier: "edge" }), 10_000, "session delete timed out");
|
|
703
645
|
await vi.waitFor(async () => {
|
|
704
|
-
expect(await withTimeout(backendDb.one(
|
|
646
|
+
expect(await withTimeout(backendDb.one(makePolicyTodoByIdQuery(todoServerSchema, createdTodo.id), {
|
|
647
|
+
tier: "edge",
|
|
648
|
+
}), 10_000, "backend session delete read timed out")).toBeNull();
|
|
705
649
|
}, { timeout: 20_000 });
|
|
706
650
|
}
|
|
707
651
|
finally {
|
|
@@ -734,9 +678,13 @@ describe("NAPI integration", () => {
|
|
|
734
678
|
env: "test",
|
|
735
679
|
userBranch: "main",
|
|
736
680
|
});
|
|
681
|
+
const todoServerSchema = await loadTodoServerWasmSchema();
|
|
682
|
+
const policyTodosTable = makePolicyTodosTable(todoServerSchema);
|
|
683
|
+
const allPolicyTodosQuery = makeAllPolicyTodosQuery(todoServerSchema);
|
|
737
684
|
context = createJazzContext({
|
|
738
685
|
appId,
|
|
739
|
-
app: { wasmSchema:
|
|
686
|
+
app: { wasmSchema: todoServerSchema },
|
|
687
|
+
permissions: {},
|
|
740
688
|
driver: { type: "memory" },
|
|
741
689
|
serverUrl: server.url,
|
|
742
690
|
backendSecret,
|
|
@@ -757,14 +705,14 @@ describe("NAPI integration", () => {
|
|
|
757
705
|
title: "request-created-item",
|
|
758
706
|
done: false,
|
|
759
707
|
description: "created via forRequest",
|
|
760
|
-
|
|
708
|
+
ownerId: "request-user",
|
|
761
709
|
}, { tier: "edge" }), 10_000, "request insert timed out");
|
|
762
710
|
await vi.waitFor(async () => {
|
|
763
711
|
expect(await withTimeout(requestDb.all(allPolicyTodosQuery, { tier: "edge" }), 10_000, "request-scoped read timed out")).toEqual([
|
|
764
712
|
expect.objectContaining({
|
|
765
713
|
id: createdTodo.id,
|
|
766
714
|
title: "request-created-item",
|
|
767
|
-
|
|
715
|
+
ownerId: "request-user",
|
|
768
716
|
}),
|
|
769
717
|
]);
|
|
770
718
|
}, { timeout: 20_000 });
|
|
@@ -772,13 +720,15 @@ describe("NAPI integration", () => {
|
|
|
772
720
|
title: "request-policy-denied",
|
|
773
721
|
done: false,
|
|
774
722
|
description: "",
|
|
775
|
-
|
|
723
|
+
ownerId: "someone-else",
|
|
776
724
|
}, { tier: "edge" })).rejects.toThrow();
|
|
777
725
|
await vi.waitFor(async () => {
|
|
778
|
-
expect(await withTimeout(backendDb.one(
|
|
726
|
+
expect(await withTimeout(backendDb.one(makePolicyTodoByIdQuery(todoServerSchema, createdTodo.id), {
|
|
727
|
+
tier: "edge",
|
|
728
|
+
}), 10_000, "backend request read timed out")).toMatchObject({
|
|
779
729
|
id: createdTodo.id,
|
|
780
730
|
title: "request-created-item",
|
|
781
|
-
|
|
731
|
+
ownerId: "request-user",
|
|
782
732
|
});
|
|
783
733
|
}, { timeout: 20_000 });
|
|
784
734
|
}
|
|
@@ -818,9 +768,13 @@ describe("NAPI integration", () => {
|
|
|
818
768
|
env: "test",
|
|
819
769
|
userBranch: "main",
|
|
820
770
|
});
|
|
771
|
+
const todoServerSchema = await loadTodoServerWasmSchema();
|
|
772
|
+
const policyTodosTable = makePolicyTodosTable(todoServerSchema);
|
|
773
|
+
const allPolicyTodosQuery = makeAllPolicyTodosQuery(todoServerSchema);
|
|
821
774
|
bobContext = createJazzContext({
|
|
822
775
|
appId,
|
|
823
|
-
app: { wasmSchema:
|
|
776
|
+
app: { wasmSchema: todoServerSchema },
|
|
777
|
+
permissions: {},
|
|
824
778
|
driver: { type: "memory" },
|
|
825
779
|
serverUrl: server.url,
|
|
826
780
|
jwtToken: signJwt({ sub: "bob", claims: {} }, JWT_SECRET),
|
|
@@ -830,7 +784,8 @@ describe("NAPI integration", () => {
|
|
|
830
784
|
});
|
|
831
785
|
carolContext = createJazzContext({
|
|
832
786
|
appId,
|
|
833
|
-
app: { wasmSchema:
|
|
787
|
+
app: { wasmSchema: todoServerSchema },
|
|
788
|
+
permissions: {},
|
|
834
789
|
driver: { type: "memory" },
|
|
835
790
|
serverUrl: server.url,
|
|
836
791
|
jwtToken: signJwt({ sub: "carol", claims: {} }, JWT_SECRET),
|
|
@@ -840,7 +795,8 @@ describe("NAPI integration", () => {
|
|
|
840
795
|
});
|
|
841
796
|
aliceContext = createJazzContext({
|
|
842
797
|
appId,
|
|
843
|
-
app: { wasmSchema:
|
|
798
|
+
app: { wasmSchema: todoServerSchema },
|
|
799
|
+
permissions: {},
|
|
844
800
|
driver: { type: "memory" },
|
|
845
801
|
serverUrl: server.url,
|
|
846
802
|
jwtToken: signJwt({ sub: "alice", claims: {} }, JWT_SECRET),
|
|
@@ -850,7 +806,8 @@ describe("NAPI integration", () => {
|
|
|
850
806
|
});
|
|
851
807
|
readerContext = createJazzContext({
|
|
852
808
|
appId,
|
|
853
|
-
app: { wasmSchema:
|
|
809
|
+
app: { wasmSchema: todoServerSchema },
|
|
810
|
+
permissions: {},
|
|
854
811
|
driver: { type: "memory" },
|
|
855
812
|
serverUrl: server.url,
|
|
856
813
|
backendSecret,
|
|
@@ -858,6 +815,7 @@ describe("NAPI integration", () => {
|
|
|
858
815
|
userBranch: "main",
|
|
859
816
|
tier: "worker",
|
|
860
817
|
});
|
|
818
|
+
await settleAsyncSyncWork();
|
|
861
819
|
const bobWriter = bobContext.db();
|
|
862
820
|
const carolWriter = carolContext.db();
|
|
863
821
|
const aliceWriter = aliceContext.db();
|
|
@@ -865,19 +823,19 @@ describe("NAPI integration", () => {
|
|
|
865
823
|
title: "bob-item",
|
|
866
824
|
done: false,
|
|
867
825
|
description: "",
|
|
868
|
-
|
|
826
|
+
ownerId: "bob",
|
|
869
827
|
}, { tier: "edge" }), 10_000, "bob writer create timed out");
|
|
870
828
|
await withTimeout(carolWriter.insertDurable(policyTodosTable, {
|
|
871
829
|
title: "carol-item",
|
|
872
830
|
done: false,
|
|
873
831
|
description: "",
|
|
874
|
-
|
|
832
|
+
ownerId: "carol",
|
|
875
833
|
}, { tier: "edge" }), 10_000, "carol writer create timed out");
|
|
876
834
|
await withTimeout(aliceWriter.insertDurable(policyTodosTable, {
|
|
877
835
|
title: "alice-item",
|
|
878
836
|
done: false,
|
|
879
837
|
description: "",
|
|
880
|
-
|
|
838
|
+
ownerId: "alice",
|
|
881
839
|
}, { tier: "edge" }), 10_000, "alice writer create timed out");
|
|
882
840
|
const readerBackend = readerContext.asBackend();
|
|
883
841
|
const aliceSessionDb = readerContext.forSession({
|
|
@@ -941,6 +899,7 @@ describe("NAPI integration", () => {
|
|
|
941
899
|
writerContext = createJazzContext({
|
|
942
900
|
appId,
|
|
943
901
|
app: { wasmSchema: TEST_SCHEMA },
|
|
902
|
+
permissions: {},
|
|
944
903
|
driver: { type: "memory" },
|
|
945
904
|
serverUrl: server.url,
|
|
946
905
|
backendSecret,
|
|
@@ -948,10 +907,12 @@ describe("NAPI integration", () => {
|
|
|
948
907
|
readerContext = createJazzContext({
|
|
949
908
|
appId,
|
|
950
909
|
app: { wasmSchema: TEST_SCHEMA },
|
|
910
|
+
permissions: {},
|
|
951
911
|
driver: { type: "memory" },
|
|
952
912
|
serverUrl: server.url,
|
|
953
913
|
backendSecret,
|
|
954
914
|
});
|
|
915
|
+
await settleAsyncSyncWork();
|
|
955
916
|
const writer = writerContext.asBackend();
|
|
956
917
|
const reader = readerContext.asBackend();
|
|
957
918
|
await waitForQueryRows(reader, allTodosQuery, (rows) => rows.length === 0);
|
|
@@ -975,7 +936,20 @@ describe("NAPI integration", () => {
|
|
|
975
936
|
const updatedRow = rowsAfterUpdate.find((row) => row.id === rowId);
|
|
976
937
|
expect(updatedRow?.done).toBe(true);
|
|
977
938
|
await writer.deleteDurable(simpleTodosTable, rowId, { tier: "edge" });
|
|
978
|
-
await
|
|
939
|
+
await settleAsyncSyncWork();
|
|
940
|
+
await waitForQueryRows(writer, allTodosQuery, (rows) => !rows.some((row) => row.id === rowId));
|
|
941
|
+
await readerContext.shutdown();
|
|
942
|
+
readerContext = createJazzContext({
|
|
943
|
+
appId,
|
|
944
|
+
app: { wasmSchema: TEST_SCHEMA },
|
|
945
|
+
permissions: {},
|
|
946
|
+
driver: { type: "memory" },
|
|
947
|
+
serverUrl: server.url,
|
|
948
|
+
backendSecret,
|
|
949
|
+
});
|
|
950
|
+
await settleAsyncSyncWork();
|
|
951
|
+
const refreshedReader = readerContext.asBackend();
|
|
952
|
+
await waitForQueryRows(refreshedReader, allTodosQuery, (rows) => !rows.some((row) => row.id === rowId));
|
|
979
953
|
}
|
|
980
954
|
finally {
|
|
981
955
|
if (writerContext) {
|
|
@@ -999,6 +973,7 @@ describe("NAPI integration", () => {
|
|
|
999
973
|
writerContext = createJazzContext({
|
|
1000
974
|
appId,
|
|
1001
975
|
app: { wasmSchema: TEST_SCHEMA },
|
|
976
|
+
permissions: {},
|
|
1002
977
|
driver: { type: "persistent", dataPath },
|
|
1003
978
|
});
|
|
1004
979
|
const writer = writerContext.db();
|
|
@@ -1014,6 +989,7 @@ describe("NAPI integration", () => {
|
|
|
1014
989
|
reopenedContext = createJazzContext({
|
|
1015
990
|
appId,
|
|
1016
991
|
app: { wasmSchema: TEST_SCHEMA },
|
|
992
|
+
permissions: {},
|
|
1017
993
|
driver: { type: "persistent", dataPath },
|
|
1018
994
|
});
|
|
1019
995
|
const reopened = reopenedContext.db();
|
|
@@ -1045,6 +1021,7 @@ describe("NAPI integration", () => {
|
|
|
1045
1021
|
context = createJazzContext({
|
|
1046
1022
|
appId: randomUUID(),
|
|
1047
1023
|
app: { wasmSchema: TIMESTAMP_SCHEMA },
|
|
1024
|
+
permissions: {},
|
|
1048
1025
|
driver: { type: "persistent", dataPath },
|
|
1049
1026
|
});
|
|
1050
1027
|
await expect(context.db().insertDurable(timestampProjectsTable, {
|