@rocicorp/zero 0.16.2025022601 → 0.17.2025022800
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/out/{chunk-7E4L5D3N.js → chunk-5BT5TJFM.js} +517 -3962
- package/out/chunk-5BT5TJFM.js.map +7 -0
- package/out/chunk-P3NUVEQJ.js +3578 -0
- package/out/chunk-P3NUVEQJ.js.map +7 -0
- package/out/pg.js +593 -0
- package/out/pg.js.map +7 -0
- package/out/react.js +1 -4
- package/out/react.js.map +2 -2
- package/out/shared/src/types.js +2 -0
- package/out/shared/src/types.js.map +1 -0
- package/out/solid.js +3 -2
- package/out/solid.js.map +1 -1
- package/out/z2s/src/compiler.d.ts +26 -0
- package/out/z2s/src/compiler.d.ts.map +1 -0
- package/out/z2s/src/compiler.js +155 -0
- package/out/z2s/src/compiler.js.map +1 -0
- package/out/z2s/src/sql.d.ts +12 -0
- package/out/z2s/src/sql.d.ts.map +1 -0
- package/out/z2s/src/sql.js +18 -0
- package/out/z2s/src/sql.js.map +1 -0
- package/out/zero/src/pg.d.ts +2 -0
- package/out/zero/src/pg.d.ts.map +1 -0
- package/out/zero/src/pg.js +3 -0
- package/out/zero/src/pg.js.map +1 -0
- package/out/zero-cache/src/auth/load-permissions.d.ts +2 -2
- package/out/zero-cache/src/auth/load-permissions.d.ts.map +1 -1
- package/out/zero-cache/src/auth/load-permissions.js +6 -7
- package/out/zero-cache/src/auth/load-permissions.js.map +1 -1
- package/out/zero-cache/src/auth/read-authorizer.d.ts.map +1 -1
- package/out/zero-cache/src/auth/read-authorizer.js +1 -1
- package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.d.ts +1 -1
- package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js +4 -2
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +1 -1
- package/out/zero-cache/src/config/zero-config.js +4 -4
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/scripts/deploy-permissions.js +5 -4
- package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -1
- package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/server/change-streamer.js +3 -2
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/main.d.ts.map +1 -1
- package/out/zero-cache/src/server/main.js +2 -1
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/multi/config.d.ts +1 -1
- package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/server/syncer.js +4 -3
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.d.ts +2 -2
- package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.js +10 -10
- package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/sync-schema.d.ts +1 -1
- package/out/zero-cache/src/services/change-source/custom/sync-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/sync-schema.js +2 -2
- package/out/zero-cache/src/services/change-source/custom/sync-schema.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js +14 -12
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +2 -2
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js +13 -9
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +11 -9
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts +2 -2
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.js +10 -10
- package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts +1 -3
- package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/published.js +1 -3
- package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +10 -12
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js +55 -51
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/validation.d.ts +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/validation.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/validation.js +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/sync-schema.d.ts +1 -1
- package/out/zero-cache/src/services/change-source/pg/sync-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/sync-schema.js +2 -2
- package/out/zero-cache/src/services/change-source/pg/sync-schema.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +1 -3
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts +2 -2
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +18 -14
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.js +5 -6
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.js +3 -3
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js +4 -3
- package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +3 -3
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +12 -4
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/row-record-cache.js +2 -2
- package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts +3 -3
- package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/cvr.js +39 -39
- package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/init.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/init.js +5 -5
- package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +4 -3
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.js +25 -23
- package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +12 -8
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-client/src/client/custom.d.ts +1 -1
- package/out/zero-client/src/client/custom.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.d.ts +1 -1
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/mod.d.ts +1 -0
- package/out/zero-client/src/mod.d.ts.map +1 -1
- package/out/zero-pg/src/custom.d.ts +42 -0
- package/out/zero-pg/src/custom.d.ts.map +1 -0
- package/out/zero-pg/src/custom.js +99 -0
- package/out/zero-pg/src/custom.js.map +1 -0
- package/out/zero-pg/src/db.d.ts +27 -0
- package/out/zero-pg/src/db.d.ts.map +1 -0
- package/out/zero-pg/src/db.js +2 -0
- package/out/zero-pg/src/db.js.map +1 -0
- package/out/zero-pg/src/logging.d.ts +3 -0
- package/out/zero-pg/src/logging.d.ts.map +1 -0
- package/out/zero-pg/src/logging.js +5 -0
- package/out/zero-pg/src/logging.js.map +1 -0
- package/out/zero-pg/src/mod.d.ts +5 -0
- package/out/zero-pg/src/mod.d.ts.map +1 -0
- package/out/zero-pg/src/mod.js +2 -0
- package/out/zero-pg/src/mod.js.map +1 -0
- package/out/zero-pg/src/query.d.ts +22 -0
- package/out/zero-pg/src/query.d.ts.map +1 -0
- package/out/zero-pg/src/query.js +54 -0
- package/out/zero-pg/src/query.js.map +1 -0
- package/out/zero-pg/src/web.d.ts +16 -0
- package/out/zero-pg/src/web.d.ts.map +1 -0
- package/out/zero-pg/src/web.js +115 -0
- package/out/zero-pg/src/web.js.map +1 -0
- package/out/zero-react/src/use-zero.d.ts +5 -4
- package/out/zero-react/src/use-zero.d.ts.map +1 -1
- package/out/zero.js +2 -1
- package/out/zql/src/ivm/exists.d.ts.map +1 -1
- package/out/zql/src/ivm/exists.js +43 -23
- package/out/zql/src/ivm/exists.js.map +1 -1
- package/out/zql/src/mutate/custom.js +10 -0
- package/out/zql/src/mutate/custom.js.map +1 -0
- package/out/zql/src/query/query-impl.d.ts +2 -2
- package/out/zql/src/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.js +1 -1
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zql/src/query/query.d.ts +1 -1
- package/out/zql/src/query/query.d.ts.map +1 -1
- package/out/zql/src/query/static-query.d.ts +1 -1
- package/out/zql/src/query/static-query.d.ts.map +1 -1
- package/out/zql/src/query/static-query.js +3 -3
- package/out/zql/src/query/static-query.js.map +1 -1
- package/package.json +5 -1
- package/out/chunk-7E4L5D3N.js.map +0 -7
package/out/pg.js
ADDED
|
@@ -0,0 +1,593 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AbstractQuery,
|
|
3
|
+
first,
|
|
4
|
+
parse,
|
|
5
|
+
pushBodySchema,
|
|
6
|
+
splitMutatorKey,
|
|
7
|
+
valita_exports
|
|
8
|
+
} from "./chunk-P3NUVEQJ.js";
|
|
9
|
+
import "./chunk-HARIWJ2J.js";
|
|
10
|
+
import {
|
|
11
|
+
assert,
|
|
12
|
+
must
|
|
13
|
+
} from "./chunk-Q6D7EOS6.js";
|
|
14
|
+
import "./chunk-424PT5DM.js";
|
|
15
|
+
|
|
16
|
+
// ../zero-pg/src/web.ts
|
|
17
|
+
import "@rocicorp/logger";
|
|
18
|
+
|
|
19
|
+
// ../zero-pg/src/logging.ts
|
|
20
|
+
import { LogContext, consoleLogSink } from "@rocicorp/logger";
|
|
21
|
+
function createLogContext(level) {
|
|
22
|
+
return new LogContext(level, {}, consoleLogSink);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// ../z2s/src/sql.ts
|
|
26
|
+
import baseSql from "@databases/sql";
|
|
27
|
+
import {
|
|
28
|
+
escapePostgresIdentifier,
|
|
29
|
+
escapeSQLiteIdentifier
|
|
30
|
+
} from "@databases/escape-identifier";
|
|
31
|
+
var pgFormat = {
|
|
32
|
+
escapeIdentifier: (str) => escapePostgresIdentifier(str),
|
|
33
|
+
formatValue: (value, index) => ({ placeholder: `$${index + 1}`, value })
|
|
34
|
+
};
|
|
35
|
+
function formatPg(sql2) {
|
|
36
|
+
return sql2.format(pgFormat);
|
|
37
|
+
}
|
|
38
|
+
var sql = baseSql.default;
|
|
39
|
+
|
|
40
|
+
// ../z2s/src/compiler.ts
|
|
41
|
+
function compile(ast, format) {
|
|
42
|
+
return select(ast, format, void 0);
|
|
43
|
+
}
|
|
44
|
+
function select(ast, format, correlation) {
|
|
45
|
+
const selectionSet = related(ast.related ?? [], format, ast.table);
|
|
46
|
+
selectionSet.push(sql`*`);
|
|
47
|
+
return sql`SELECT ${sql.join(selectionSet, ",")} FROM ${sql.ident(
|
|
48
|
+
ast.table
|
|
49
|
+
)} ${ast.where ? sql`WHERE ${where(ast.where, ast.table)}` : sql``} ${correlation ? sql`${ast.where ? sql`AND` : sql`WHERE`} (${correlation})` : sql``} ${orderBy(ast.orderBy)} ${format?.singular ? limit(1) : limit(ast.limit)}`;
|
|
50
|
+
}
|
|
51
|
+
function orderBy(orderBy2) {
|
|
52
|
+
if (!orderBy2) {
|
|
53
|
+
return sql``;
|
|
54
|
+
}
|
|
55
|
+
return sql`ORDER BY ${sql.join(
|
|
56
|
+
orderBy2.map(
|
|
57
|
+
([col, dir]) => dir === "asc" ? sql`${sql.ident(col)} ASC` : sql`${sql.ident(col)} DESC`
|
|
58
|
+
),
|
|
59
|
+
", "
|
|
60
|
+
)}`;
|
|
61
|
+
}
|
|
62
|
+
function limit(limit2) {
|
|
63
|
+
if (!limit2) {
|
|
64
|
+
return sql``;
|
|
65
|
+
}
|
|
66
|
+
return sql`LIMIT ${sql.value(limit2)}`;
|
|
67
|
+
}
|
|
68
|
+
function related(relationships, format, parentTable) {
|
|
69
|
+
return relationships.map(
|
|
70
|
+
(relationship) => relationshipSubquery(
|
|
71
|
+
relationship,
|
|
72
|
+
format?.relationships[must(relationship.subquery.alias)],
|
|
73
|
+
parentTable
|
|
74
|
+
)
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
function relationshipSubquery(relationship, format, parentTable) {
|
|
78
|
+
if (relationship.hidden) {
|
|
79
|
+
const [join, lastAlias, lastLimit] = makeJunctionJoin(relationship);
|
|
80
|
+
return sql`(
|
|
81
|
+
SELECT ${format?.singular ? sql`` : sql`COALESCE(array_agg`}(row_to_json(${sql.ident(`inner_${relationship.subquery.alias}`)})) ${format?.singular ? sql`` : sql`, ARRAY[]::json[])`} FROM (SELECT ${sql.ident(lastAlias)}.* FROM ${join} WHERE (${correlate(
|
|
82
|
+
parentTable,
|
|
83
|
+
relationship.correlation.parentField,
|
|
84
|
+
relationship.subquery.table,
|
|
85
|
+
relationship.correlation.childField
|
|
86
|
+
)}) ${relationship.subquery.where ? sql`AND ${where(
|
|
87
|
+
relationship.subquery.where,
|
|
88
|
+
relationship.subquery.table
|
|
89
|
+
)}` : sql``} ${orderBy(relationship.subquery.orderBy)} ${format?.singular ? limit(1) : limit(lastLimit)} ) ${sql.ident(`inner_${relationship.subquery.alias}`)}
|
|
90
|
+
) as ${sql.ident(relationship.subquery.alias)}`;
|
|
91
|
+
}
|
|
92
|
+
return sql`(
|
|
93
|
+
SELECT ${format?.singular ? sql`` : sql`array_agg`}(row_to_json(${sql.ident(
|
|
94
|
+
`inner_${relationship.subquery.alias}`
|
|
95
|
+
)})) FROM (${select(
|
|
96
|
+
relationship.subquery,
|
|
97
|
+
format,
|
|
98
|
+
correlate(
|
|
99
|
+
parentTable,
|
|
100
|
+
relationship.correlation.parentField,
|
|
101
|
+
relationship.subquery.table,
|
|
102
|
+
relationship.correlation.childField
|
|
103
|
+
)
|
|
104
|
+
)}) ${sql.ident(`inner_${relationship.subquery.alias}`)}
|
|
105
|
+
) as ${sql.ident(relationship.subquery.alias)}`;
|
|
106
|
+
}
|
|
107
|
+
function pullTablesForJunction(relationship, tables = []) {
|
|
108
|
+
tables.push([
|
|
109
|
+
relationship.subquery.table,
|
|
110
|
+
relationship.correlation,
|
|
111
|
+
relationship.subquery.limit
|
|
112
|
+
]);
|
|
113
|
+
assert(
|
|
114
|
+
relationship.subquery.related?.length || 0 <= 1,
|
|
115
|
+
"Too many related tables for a junction edge"
|
|
116
|
+
);
|
|
117
|
+
for (const subRelationship of relationship.subquery.related ?? []) {
|
|
118
|
+
pullTablesForJunction(subRelationship, tables);
|
|
119
|
+
}
|
|
120
|
+
return tables;
|
|
121
|
+
}
|
|
122
|
+
function makeJunctionJoin(relationship) {
|
|
123
|
+
const participatingTables = pullTablesForJunction(relationship);
|
|
124
|
+
const ret = [];
|
|
125
|
+
function alias(index) {
|
|
126
|
+
if (index === 0) {
|
|
127
|
+
return participatingTables[0][0];
|
|
128
|
+
}
|
|
129
|
+
return `table_${index}`;
|
|
130
|
+
}
|
|
131
|
+
for (const [table, _correlation] of participatingTables) {
|
|
132
|
+
if (ret.length === 0) {
|
|
133
|
+
ret.push(sql.ident(table));
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
ret.push(
|
|
137
|
+
sql` JOIN ${sql.ident(table)} as ${sql.ident(
|
|
138
|
+
alias(ret.length)
|
|
139
|
+
)} ON ${correlate(
|
|
140
|
+
alias(ret.length - 1),
|
|
141
|
+
participatingTables[ret.length][1].parentField,
|
|
142
|
+
alias(ret.length),
|
|
143
|
+
participatingTables[ret.length][1].childField
|
|
144
|
+
)}`
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
return [
|
|
148
|
+
sql.join(ret, ""),
|
|
149
|
+
alias(ret.length - 1),
|
|
150
|
+
participatingTables[participatingTables.length - 1][2]
|
|
151
|
+
];
|
|
152
|
+
}
|
|
153
|
+
function where(condition, parentTable) {
|
|
154
|
+
if (!condition) {
|
|
155
|
+
return sql``;
|
|
156
|
+
}
|
|
157
|
+
switch (condition.type) {
|
|
158
|
+
case "and":
|
|
159
|
+
return sql`(${sql.join(
|
|
160
|
+
condition.conditions.map((c) => where(c, parentTable)),
|
|
161
|
+
" AND "
|
|
162
|
+
)})`;
|
|
163
|
+
case "or":
|
|
164
|
+
return sql`(${sql.join(
|
|
165
|
+
condition.conditions.map((c) => where(c, parentTable)),
|
|
166
|
+
" OR "
|
|
167
|
+
)})`;
|
|
168
|
+
case "correlatedSubquery":
|
|
169
|
+
return exists(condition, parentTable);
|
|
170
|
+
case "simple":
|
|
171
|
+
return simple(condition);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function simple(condition) {
|
|
175
|
+
switch (condition.op) {
|
|
176
|
+
case "!=":
|
|
177
|
+
case "<":
|
|
178
|
+
case "<=":
|
|
179
|
+
case "=":
|
|
180
|
+
case ">":
|
|
181
|
+
case ">=":
|
|
182
|
+
case "ILIKE":
|
|
183
|
+
case "LIKE":
|
|
184
|
+
case "NOT ILIKE":
|
|
185
|
+
case "NOT LIKE":
|
|
186
|
+
return sql`${valuePosition(condition.left)} ${sql.__dangerous__rawValue(
|
|
187
|
+
condition.op
|
|
188
|
+
)} ${valuePosition(condition.right)}`;
|
|
189
|
+
case "NOT IN":
|
|
190
|
+
case "IN":
|
|
191
|
+
return any(condition);
|
|
192
|
+
case "IS":
|
|
193
|
+
case "IS NOT":
|
|
194
|
+
return distinctFrom(condition);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function distinctFrom(condition) {
|
|
198
|
+
return sql`${valuePosition(condition.left)} ${condition.op === "IS" ? sql`IS NOT DISTINCT FROM` : sql`IS DISTINCT FROM`} ${valuePosition(condition.right)}`;
|
|
199
|
+
}
|
|
200
|
+
function any(condition) {
|
|
201
|
+
return sql`${valuePosition(condition.left)} ${condition.op === "IN" ? sql`= ANY` : sql`!= ANY`} (${valuePosition(condition.right)})`;
|
|
202
|
+
}
|
|
203
|
+
function valuePosition(value) {
|
|
204
|
+
switch (value.type) {
|
|
205
|
+
case "column":
|
|
206
|
+
return sql.ident(value.name);
|
|
207
|
+
case "literal":
|
|
208
|
+
return sql.value(value.value);
|
|
209
|
+
case "static":
|
|
210
|
+
throw new Error(
|
|
211
|
+
"Static parameters must be bound to a value before compiling to SQL"
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function exists(condition, parentTable) {
|
|
216
|
+
switch (condition.op) {
|
|
217
|
+
case "EXISTS":
|
|
218
|
+
return sql`EXISTS (${select(
|
|
219
|
+
condition.related.subquery,
|
|
220
|
+
void 0,
|
|
221
|
+
correlate(
|
|
222
|
+
parentTable,
|
|
223
|
+
condition.related.correlation.parentField,
|
|
224
|
+
condition.related.subquery.table,
|
|
225
|
+
condition.related.correlation.childField
|
|
226
|
+
)
|
|
227
|
+
)})`;
|
|
228
|
+
case "NOT EXISTS":
|
|
229
|
+
return sql`NOT EXISTS (${select(
|
|
230
|
+
condition.related.subquery,
|
|
231
|
+
void 0,
|
|
232
|
+
void 0
|
|
233
|
+
)})`;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function correlate(parentTable, parentColumns, childTable, childColumns) {
|
|
237
|
+
return sql.join(
|
|
238
|
+
zip(parentColumns, childColumns).map(
|
|
239
|
+
([parentColumn, childColumn]) => sql`${sql.ident(parentTable)}.${sql.ident(parentColumn)} = ${sql.ident(
|
|
240
|
+
childTable
|
|
241
|
+
)}.${sql.ident(childColumn)}`
|
|
242
|
+
),
|
|
243
|
+
" AND "
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
function zip(a1, a2) {
|
|
247
|
+
assert(a1.length === a2.length);
|
|
248
|
+
const result = [];
|
|
249
|
+
for (let i = 0; i < a1.length; i++) {
|
|
250
|
+
result.push([a1[i], a2[i]]);
|
|
251
|
+
}
|
|
252
|
+
return result;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// ../zero-pg/src/query.ts
|
|
256
|
+
function makeSchemaQuery(schema) {
|
|
257
|
+
class SchemaQueryHandler {
|
|
258
|
+
#dbTransaction;
|
|
259
|
+
constructor(dbTransaction) {
|
|
260
|
+
this.#dbTransaction = dbTransaction;
|
|
261
|
+
}
|
|
262
|
+
get(target, prop) {
|
|
263
|
+
if (prop in target) {
|
|
264
|
+
return target[prop];
|
|
265
|
+
}
|
|
266
|
+
const q = new Z2SQuery(schema, prop, this.#dbTransaction);
|
|
267
|
+
target[prop] = q;
|
|
268
|
+
return q;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return (dbTransaction) => new Proxy({}, new SchemaQueryHandler(dbTransaction));
|
|
272
|
+
}
|
|
273
|
+
var Z2SQuery = class _Z2SQuery extends AbstractQuery {
|
|
274
|
+
#dbTransaction;
|
|
275
|
+
#query;
|
|
276
|
+
constructor(schema, tableName, dbTransaction, ast = { table: tableName }, format) {
|
|
277
|
+
super(schema, tableName, ast, void 0, format);
|
|
278
|
+
this.#dbTransaction = dbTransaction;
|
|
279
|
+
}
|
|
280
|
+
_system = "permissions";
|
|
281
|
+
_newQuery(schema, tableName, ast, ttl, format) {
|
|
282
|
+
assert(ttl === void 0, "TTL is not supported in Z2S");
|
|
283
|
+
return new _Z2SQuery(schema, tableName, this.#dbTransaction, ast, format);
|
|
284
|
+
}
|
|
285
|
+
async run() {
|
|
286
|
+
const sqlQuery = this.#query ?? formatPg(compile(this._completeAst(), this.format));
|
|
287
|
+
this.#query = sqlQuery;
|
|
288
|
+
const result = await this.#dbTransaction.query(
|
|
289
|
+
sqlQuery.text,
|
|
290
|
+
sqlQuery.values
|
|
291
|
+
);
|
|
292
|
+
if (Array.isArray(result)) {
|
|
293
|
+
return result;
|
|
294
|
+
}
|
|
295
|
+
if (this.format.singular) {
|
|
296
|
+
return first(result);
|
|
297
|
+
}
|
|
298
|
+
return [...result];
|
|
299
|
+
}
|
|
300
|
+
preload() {
|
|
301
|
+
throw new Error("Z2SQuery cannot be preloaded");
|
|
302
|
+
}
|
|
303
|
+
materialize() {
|
|
304
|
+
throw new Error("Z2SQuery cannot be materialized");
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
// ../zero-pg/src/web.ts
|
|
309
|
+
function pgZeroSchema(shardID) {
|
|
310
|
+
return `zero_${shardID}`;
|
|
311
|
+
}
|
|
312
|
+
var PushProcessor = class {
|
|
313
|
+
#dbConnectionProvider;
|
|
314
|
+
#customMutatorDefs;
|
|
315
|
+
#lc;
|
|
316
|
+
#shardID;
|
|
317
|
+
#mutate;
|
|
318
|
+
#query;
|
|
319
|
+
constructor(shardID, schema, dbConnectionProvider, customMutatorDefs) {
|
|
320
|
+
this.#shardID = shardID;
|
|
321
|
+
this.#dbConnectionProvider = dbConnectionProvider;
|
|
322
|
+
this.#customMutatorDefs = customMutatorDefs;
|
|
323
|
+
this.#lc = createLogContext("info");
|
|
324
|
+
this.#mutate = makeSchemaCRUD(schema);
|
|
325
|
+
this.#query = makeSchemaQuery(schema);
|
|
326
|
+
}
|
|
327
|
+
async process(headers, body) {
|
|
328
|
+
const req = parse(body, pushBodySchema);
|
|
329
|
+
const connection = await this.#dbConnectionProvider();
|
|
330
|
+
if (req.pushVersion !== 1) {
|
|
331
|
+
return {
|
|
332
|
+
error: "unsupported-push-version"
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
const responses = [];
|
|
336
|
+
for (const m of req.mutations) {
|
|
337
|
+
const res = await this.#processMutation(connection, headers, req, m);
|
|
338
|
+
responses.push(res);
|
|
339
|
+
if ("error" in res.result) {
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return {
|
|
344
|
+
mutations: responses
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
async #processMutation(dbConnection, headers, req, m) {
|
|
348
|
+
try {
|
|
349
|
+
return await this.#processMutationImpl(
|
|
350
|
+
dbConnection,
|
|
351
|
+
headers,
|
|
352
|
+
req,
|
|
353
|
+
m,
|
|
354
|
+
false
|
|
355
|
+
);
|
|
356
|
+
} catch (e) {
|
|
357
|
+
const ret = await this.#processMutationImpl(
|
|
358
|
+
dbConnection,
|
|
359
|
+
headers,
|
|
360
|
+
req,
|
|
361
|
+
m,
|
|
362
|
+
true
|
|
363
|
+
);
|
|
364
|
+
if ("error" in ret.result) {
|
|
365
|
+
return ret;
|
|
366
|
+
}
|
|
367
|
+
return {
|
|
368
|
+
id: ret.id,
|
|
369
|
+
result: {
|
|
370
|
+
error: "app",
|
|
371
|
+
details: e instanceof Error ? e.message : "exception was not of type `Error`"
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
#processMutationImpl(dbConnection, headers, req, m, errorMode) {
|
|
377
|
+
if (m.type === "crud") {
|
|
378
|
+
throw new Error(
|
|
379
|
+
"crud mutators are deprecated in favor of custom mutators."
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
const pgSchema = pgZeroSchema(this.#shardID);
|
|
383
|
+
return dbConnection.transaction(async (dbTx) => {
|
|
384
|
+
const id = {
|
|
385
|
+
clientID: m.clientID,
|
|
386
|
+
id: m.id
|
|
387
|
+
};
|
|
388
|
+
const client = first(
|
|
389
|
+
await dbTx.query(
|
|
390
|
+
`select * from "${pgSchema}"."clients" where "clientID" = $1`,
|
|
391
|
+
[m.clientID]
|
|
392
|
+
)
|
|
393
|
+
);
|
|
394
|
+
const lmid = client?.lastMutationID ?? 0n;
|
|
395
|
+
const expected = lmid + 1n;
|
|
396
|
+
if (m.id < expected) {
|
|
397
|
+
this.#lc.warn?.(`Mutation ${m.id} already processed. Skipping.`);
|
|
398
|
+
return { id, result: {} };
|
|
399
|
+
}
|
|
400
|
+
if (m.id > expected) {
|
|
401
|
+
return {
|
|
402
|
+
id,
|
|
403
|
+
result: {
|
|
404
|
+
error: "ooo-mutation"
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
if (!errorMode) {
|
|
409
|
+
await this.#dispatchMutation(dbTx, headers, m);
|
|
410
|
+
}
|
|
411
|
+
if (expected === 1n) {
|
|
412
|
+
await dbTx.query(
|
|
413
|
+
`insert into "${pgSchema}"."clients" ("clientGroupID", "clientID", "lastMutationID") values ($1, $2, $3)`,
|
|
414
|
+
[req.clientGroupID, m.clientID, expected]
|
|
415
|
+
);
|
|
416
|
+
} else {
|
|
417
|
+
await dbTx.query(
|
|
418
|
+
`update "${pgSchema}"."clients" set "lastMutationID" = $1 where "clientID" = $2 and "clientGroupID" = $3`,
|
|
419
|
+
[expected, m.clientID, req.clientGroupID]
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
return {
|
|
423
|
+
id,
|
|
424
|
+
result: {}
|
|
425
|
+
};
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
#dispatchMutation(dbTx, headers, m) {
|
|
429
|
+
const zeroTx = new TransactionImpl(
|
|
430
|
+
dbTx,
|
|
431
|
+
headers.authorization,
|
|
432
|
+
m.clientID,
|
|
433
|
+
m.id,
|
|
434
|
+
this.#mutate(dbTx),
|
|
435
|
+
this.#query(dbTx)
|
|
436
|
+
);
|
|
437
|
+
const [namespace, name] = splitMutatorKey(m.name);
|
|
438
|
+
return this.#customMutatorDefs[namespace][name](zeroTx, m.args);
|
|
439
|
+
}
|
|
440
|
+
};
|
|
441
|
+
|
|
442
|
+
// ../zero-pg/src/custom.ts
|
|
443
|
+
function createPushHandler({
|
|
444
|
+
schema,
|
|
445
|
+
dbConnectionProvider,
|
|
446
|
+
mutators,
|
|
447
|
+
shardID
|
|
448
|
+
}) {
|
|
449
|
+
const processor = new PushProcessor(
|
|
450
|
+
shardID ?? "0",
|
|
451
|
+
schema,
|
|
452
|
+
dbConnectionProvider,
|
|
453
|
+
mutators
|
|
454
|
+
);
|
|
455
|
+
return (headers, body) => processor.process(headers, body);
|
|
456
|
+
}
|
|
457
|
+
var TransactionImpl = class {
|
|
458
|
+
location = "server";
|
|
459
|
+
reason = "authoritative";
|
|
460
|
+
dbTransaction;
|
|
461
|
+
token;
|
|
462
|
+
clientID;
|
|
463
|
+
mutationID;
|
|
464
|
+
mutate;
|
|
465
|
+
query;
|
|
466
|
+
constructor(dbTransaction, token, clientID, mutationID, mutate, query) {
|
|
467
|
+
this.dbTransaction = dbTransaction;
|
|
468
|
+
this.token = token;
|
|
469
|
+
this.clientID = clientID;
|
|
470
|
+
this.mutationID = mutationID;
|
|
471
|
+
this.mutate = mutate;
|
|
472
|
+
this.query = query;
|
|
473
|
+
}
|
|
474
|
+
};
|
|
475
|
+
var dbTxSymbol = Symbol();
|
|
476
|
+
function makeSchemaCRUD(schema) {
|
|
477
|
+
const schemaCRUDs = {};
|
|
478
|
+
for (const tableSchema of Object.values(schema.tables)) {
|
|
479
|
+
schemaCRUDs[tableSchema.name] = makeTableCRUD(tableSchema);
|
|
480
|
+
}
|
|
481
|
+
class CRUDHandler {
|
|
482
|
+
#dbTransaction;
|
|
483
|
+
constructor(dbTransaction) {
|
|
484
|
+
this.#dbTransaction = dbTransaction;
|
|
485
|
+
}
|
|
486
|
+
get(target, prop) {
|
|
487
|
+
if (prop in target) {
|
|
488
|
+
return target[prop];
|
|
489
|
+
}
|
|
490
|
+
const txHolder = {
|
|
491
|
+
[dbTxSymbol]: this.#dbTransaction
|
|
492
|
+
};
|
|
493
|
+
target[prop] = Object.fromEntries(
|
|
494
|
+
Object.entries(schemaCRUDs[prop]).map(([name, method]) => [
|
|
495
|
+
name,
|
|
496
|
+
method.bind(txHolder)
|
|
497
|
+
])
|
|
498
|
+
);
|
|
499
|
+
return target[prop];
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
return (dbTransaction) => new Proxy({}, new CRUDHandler(dbTransaction));
|
|
503
|
+
}
|
|
504
|
+
function makeTableCRUD(schema) {
|
|
505
|
+
return {
|
|
506
|
+
async insert(value) {
|
|
507
|
+
const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);
|
|
508
|
+
const stmt = formatPg(
|
|
509
|
+
sql`INSERT INTO ${sql.ident(serverName(schema))} (${sql.join(
|
|
510
|
+
targetedColumns.map(([, serverName2]) => sql.ident(serverName2)),
|
|
511
|
+
","
|
|
512
|
+
)}) VALUES (${sql.join(
|
|
513
|
+
Object.values(value).map((v) => sql.value(v)),
|
|
514
|
+
", "
|
|
515
|
+
)})`
|
|
516
|
+
);
|
|
517
|
+
const tx = this[dbTxSymbol];
|
|
518
|
+
await tx.query(stmt.text, stmt.values);
|
|
519
|
+
},
|
|
520
|
+
async upsert(value) {
|
|
521
|
+
const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);
|
|
522
|
+
const primaryKeyColumns = origAndServerNamesFor(
|
|
523
|
+
schema.primaryKey,
|
|
524
|
+
schema
|
|
525
|
+
);
|
|
526
|
+
const stmt = formatPg(
|
|
527
|
+
sql`INSERT INTO ${sql.ident(serverName(schema))} (${sql.join(
|
|
528
|
+
targetedColumns.map(([, serverName2]) => sql.ident(serverName2)),
|
|
529
|
+
","
|
|
530
|
+
)}) VALUES (${sql.join(
|
|
531
|
+
Object.values(value).map((v) => sql.value(v)),
|
|
532
|
+
", "
|
|
533
|
+
)}) ON CONFLICT (${sql.join(
|
|
534
|
+
primaryKeyColumns.map(([, serverName2]) => sql.ident(serverName2)),
|
|
535
|
+
", "
|
|
536
|
+
)}) DO UPDATE SET ${sql.join(
|
|
537
|
+
Object.entries(value).map(
|
|
538
|
+
([col, val]) => sql`${sql.ident(
|
|
539
|
+
schema.columns[col].serverName ?? col
|
|
540
|
+
)} = ${sql.value(val)}`
|
|
541
|
+
),
|
|
542
|
+
", "
|
|
543
|
+
)}`
|
|
544
|
+
);
|
|
545
|
+
const tx = this[dbTxSymbol];
|
|
546
|
+
await tx.query(stmt.text, stmt.values);
|
|
547
|
+
},
|
|
548
|
+
async update(value) {
|
|
549
|
+
const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);
|
|
550
|
+
const stmt = formatPg(
|
|
551
|
+
sql`UPDATE ${sql.ident(serverName(schema))} SET ${sql.join(
|
|
552
|
+
targetedColumns.map(
|
|
553
|
+
([origName, serverName2]) => sql`${sql.ident(serverName2)} = ${sql.value(value[origName])}`
|
|
554
|
+
),
|
|
555
|
+
", "
|
|
556
|
+
)} WHERE ${primaryKeyClause(schema, value)}`
|
|
557
|
+
);
|
|
558
|
+
const tx = this[dbTxSymbol];
|
|
559
|
+
await tx.query(stmt.text, stmt.values);
|
|
560
|
+
},
|
|
561
|
+
async delete(value) {
|
|
562
|
+
const stmt = formatPg(
|
|
563
|
+
sql`DELETE FROM ${sql.ident(
|
|
564
|
+
serverName(schema)
|
|
565
|
+
)} WHERE ${primaryKeyClause(schema, value)}`
|
|
566
|
+
);
|
|
567
|
+
const tx = this[dbTxSymbol];
|
|
568
|
+
await tx.query(stmt.text, stmt.values);
|
|
569
|
+
}
|
|
570
|
+
};
|
|
571
|
+
}
|
|
572
|
+
function serverName(x) {
|
|
573
|
+
return x.serverName ?? x.name;
|
|
574
|
+
}
|
|
575
|
+
function primaryKeyClause(schema, row) {
|
|
576
|
+
const primaryKey = origAndServerNamesFor(schema.primaryKey, schema);
|
|
577
|
+
return sql`${sql.join(
|
|
578
|
+
primaryKey.map(
|
|
579
|
+
([origName, serverName2]) => sql`${sql.ident(serverName2)} = ${sql.value(row[origName])}`
|
|
580
|
+
),
|
|
581
|
+
" AND "
|
|
582
|
+
)}`;
|
|
583
|
+
}
|
|
584
|
+
function origAndServerNamesFor(originalNames, schema) {
|
|
585
|
+
return originalNames.map((name) => {
|
|
586
|
+
const col = schema.columns[name];
|
|
587
|
+
return [name, col.serverName ?? name];
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
export {
|
|
591
|
+
createPushHandler
|
|
592
|
+
};
|
|
593
|
+
//# sourceMappingURL=pg.js.map
|
package/out/pg.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../zero-pg/src/web.ts", "../../zero-pg/src/logging.ts", "../../z2s/src/sql.ts", "../../z2s/src/compiler.ts", "../../zero-pg/src/query.ts", "../../zero-pg/src/custom.ts"],
|
|
4
|
+
"sourcesContent": ["import type {ReadonlyJSONObject} from '../../shared/src/json.ts';\nimport type {\n Mutation,\n MutationResponse,\n PushBody,\n PushResponse,\n} from '../../zero-protocol/src/push.ts';\nimport type {Schema} from '../../zero-schema/src/builder/schema-builder.ts';\nimport type {ConnectionProvider, DBConnection, DBTransaction} from './db.ts';\nimport * as v from '../../shared/src/valita.ts';\nimport {pushBodySchema} from '../../zero-protocol/src/push.ts';\nimport {\n makeSchemaCRUD,\n TransactionImpl,\n type CustomMutatorDefs,\n} from './custom.ts';\nimport {first} from '../../shared/src/iterables.ts';\nimport {LogContext} from '@rocicorp/logger';\nimport {createLogContext} from './logging.ts';\nimport {\n splitMutatorKey,\n type SchemaCRUD,\n type SchemaQuery,\n} from '../../zql/src/mutate/custom.ts';\nimport {makeSchemaQuery} from './query.ts';\n\nexport type PushHandler = (\n headers: Headers,\n body: ReadonlyJSONObject,\n) => Promise<PushResponse>;\n\ntype Headers = {authorization?: string | undefined};\n\nfunction pgZeroSchema(shardID: string) {\n return `zero_${shardID}`;\n}\n\nexport class PushProcessor<\n S extends Schema,\n TDBTransaction,\n MD extends CustomMutatorDefs<S, TDBTransaction>,\n> {\n readonly #dbConnectionProvider: ConnectionProvider<TDBTransaction>;\n readonly #customMutatorDefs: MD;\n readonly #lc: LogContext;\n readonly #shardID: string;\n readonly #mutate: (dbTransaction: DBTransaction<unknown>) => SchemaCRUD<S>;\n readonly #query: (dbTransaction: DBTransaction<unknown>) => SchemaQuery<S>;\n\n constructor(\n shardID: string,\n schema: S,\n dbConnectionProvider: ConnectionProvider<TDBTransaction>,\n customMutatorDefs: MD,\n ) {\n this.#shardID = shardID;\n this.#dbConnectionProvider = dbConnectionProvider;\n this.#customMutatorDefs = customMutatorDefs;\n this.#lc = createLogContext('info');\n this.#mutate = makeSchemaCRUD(schema);\n this.#query = makeSchemaQuery(schema);\n }\n\n async process(\n headers: Headers,\n body: ReadonlyJSONObject,\n ): Promise<PushResponse> {\n const req = v.parse(body, pushBodySchema);\n const connection = await this.#dbConnectionProvider();\n\n if (req.pushVersion !== 1) {\n return {\n error: 'unsupported-push-version',\n };\n }\n\n const responses: MutationResponse[] = [];\n for (const m of req.mutations) {\n const res = await this.#processMutation(connection, headers, req, m);\n responses.push(res);\n if ('error' in res.result) {\n break;\n }\n }\n\n return {\n mutations: responses,\n };\n }\n\n async #processMutation(\n dbConnection: DBConnection<TDBTransaction>,\n headers: Headers,\n req: PushBody,\n m: Mutation,\n ): Promise<MutationResponse> {\n try {\n return await this.#processMutationImpl(\n dbConnection,\n headers,\n req,\n m,\n false,\n );\n } catch (e) {\n const ret = await this.#processMutationImpl(\n dbConnection,\n headers,\n req,\n m,\n true,\n );\n if ('error' in ret.result) {\n return ret;\n }\n return {\n id: ret.id,\n result: {\n error: 'app',\n details:\n e instanceof Error\n ? e.message\n : 'exception was not of type `Error`',\n },\n };\n }\n }\n\n #processMutationImpl(\n dbConnection: DBConnection<TDBTransaction>,\n headers: Headers,\n req: PushBody,\n m: Mutation,\n errorMode: boolean,\n ): Promise<MutationResponse> {\n if (m.type === 'crud') {\n throw new Error(\n 'crud mutators are deprecated in favor of custom mutators.',\n );\n }\n const pgSchema = pgZeroSchema(this.#shardID);\n\n return dbConnection.transaction(async (dbTx): Promise<MutationResponse> => {\n const id = {\n clientID: m.clientID,\n id: m.id,\n } as const;\n const client = first(\n await dbTx.query(\n `select * from \"${pgSchema}\".\"clients\" where \"clientID\" = $1`,\n [m.clientID],\n ),\n ) as {lastMutationID: bigint} | undefined;\n const lmid = client?.lastMutationID ?? 0n;\n const expected = lmid + 1n;\n\n if (m.id < expected) {\n this.#lc.warn?.(`Mutation ${m.id} already processed. Skipping.`);\n return {id, result: {}};\n }\n if (m.id > expected) {\n // if m.id is 1, then client can interpret this like client-not-found\n // and nuke client state.\n return {\n id,\n result: {\n error: 'ooo-mutation',\n },\n };\n }\n\n if (!errorMode) {\n await this.#dispatchMutation(dbTx, headers, m);\n }\n\n if (expected === 1n) {\n await dbTx.query(\n `insert into \"${pgSchema}\".\"clients\" (\"clientGroupID\", \"clientID\", \"lastMutationID\") values ($1, $2, $3)`,\n [req.clientGroupID, m.clientID, expected],\n );\n } else {\n await dbTx.query(\n `update \"${pgSchema}\".\"clients\" set \"lastMutationID\" = $1 where \"clientID\" = $2 and \"clientGroupID\" = $3`,\n [expected, m.clientID, req.clientGroupID],\n );\n }\n\n return {\n id,\n result: {},\n };\n });\n }\n\n #dispatchMutation(\n dbTx: DBTransaction<TDBTransaction>,\n headers: Headers,\n m: Mutation,\n ): Promise<void> {\n const zeroTx = new TransactionImpl(\n dbTx,\n headers.authorization,\n m.clientID,\n m.id,\n this.#mutate(dbTx),\n this.#query(dbTx),\n );\n\n const [namespace, name] = splitMutatorKey(m.name);\n return this.#customMutatorDefs[namespace][name](zeroTx, m.args);\n }\n}\n", "import {LogContext, consoleLogSink, type LogLevel} from '@rocicorp/logger';\n\nexport function createLogContext(level: LogLevel): LogContext {\n return new LogContext(level, {}, consoleLogSink);\n}\n", "import type {SQLQuery, FormatConfig} from '@databases/sql';\nimport baseSql from '@databases/sql';\nimport {\n escapePostgresIdentifier,\n escapeSQLiteIdentifier,\n} from '@databases/escape-identifier';\n\nconst pgFormat: FormatConfig = {\n escapeIdentifier: str => escapePostgresIdentifier(str),\n formatValue: (value, index) => ({placeholder: `$${index + 1}`, value}),\n};\n\nconst sqliteFormat: FormatConfig = {\n escapeIdentifier: str => escapeSQLiteIdentifier(str),\n formatValue: value => ({placeholder: '?', value}),\n};\n\nexport function formatPg(sql: SQLQuery) {\n return sql.format(pgFormat);\n}\n\nexport function formatSqlite(sql: SQLQuery) {\n return sql.format(sqliteFormat);\n}\n\nexport const sql = baseSql.default;\n", "import {assert} from '../../shared/src/asserts.ts';\nimport {must} from '../../shared/src/must.ts';\nimport type {\n CorrelatedSubqueryCondition,\n Correlation,\n Ordering,\n ValuePosition,\n} from '../../zero-protocol/src/ast.ts';\nimport {\n type AST,\n type Condition,\n type CorrelatedSubquery,\n type SimpleCondition,\n} from '../../zero-protocol/src/ast.ts';\nimport type {Format} from '../../zql/src/ivm/view.ts';\nimport {sql} from './sql.ts';\nimport type {SQLQuery} from '@databases/sql';\n\n/**\n * Compiles to the Postgres dialect of SQL\n * - IS, IS NOT can only compare against `NULL`, `TRUE`, `FALSE` so use\n * `IS DISTINCT FROM` and `IS NOT DISTINCT FROM` instead\n * - IN is changed to ANY to allow binding array literals\n * - subqueries are aggregated using PG's `array_agg` and `row_to_json` functions\n */\nexport function compile(ast: AST, format?: Format | undefined) {\n return select(ast, format, undefined);\n}\n\nexport function select(\n ast: AST,\n format: Format | undefined,\n correlation: SQLQuery | undefined,\n) {\n const selectionSet = related(ast.related ?? [], format, ast.table);\n selectionSet.push(sql`*`);\n return sql`SELECT ${sql.join(selectionSet, ',')} FROM ${sql.ident(\n ast.table,\n )} ${ast.where ? sql`WHERE ${where(ast.where, ast.table)}` : sql``} ${\n correlation\n ? sql`${ast.where ? sql`AND` : sql`WHERE`} (${correlation})`\n : sql``\n } ${orderBy(ast.orderBy)} ${format?.singular ? limit(1) : limit(ast.limit)}`;\n}\n\nexport function orderBy(orderBy: Ordering | undefined): SQLQuery {\n if (!orderBy) {\n return sql``;\n }\n return sql`ORDER BY ${sql.join(\n orderBy.map(([col, dir]) =>\n dir === 'asc' ? sql`${sql.ident(col)} ASC` : sql`${sql.ident(col)} DESC`,\n ),\n ', ',\n )}`;\n}\n\nexport function limit(limit: number | undefined): SQLQuery {\n if (!limit) {\n return sql``;\n }\n return sql`LIMIT ${sql.value(limit)}`;\n}\n\nexport function related(\n relationships: readonly CorrelatedSubquery[],\n format: Format | undefined,\n parentTable: string,\n): SQLQuery[] {\n return relationships.map(relationship =>\n relationshipSubquery(\n relationship,\n format?.relationships[must(relationship.subquery.alias)],\n parentTable,\n ),\n );\n}\n\nfunction relationshipSubquery(\n relationship: CorrelatedSubquery,\n format: Format | undefined,\n parentTable: string,\n) {\n if (relationship.hidden) {\n const [join, lastAlias, lastLimit] = makeJunctionJoin(relationship);\n return sql`(\n SELECT ${\n format?.singular ? sql`` : sql`COALESCE(array_agg`\n }(row_to_json(${sql.ident(`inner_${relationship.subquery.alias}`)})) ${\n format?.singular ? sql`` : sql`, ARRAY[]::json[])`\n } FROM (SELECT ${sql.ident(lastAlias)}.* FROM ${join} WHERE (${correlate(\n parentTable,\n relationship.correlation.parentField,\n relationship.subquery.table,\n relationship.correlation.childField,\n )}) ${\n relationship.subquery.where\n ? sql`AND ${where(\n relationship.subquery.where,\n relationship.subquery.table,\n )}`\n : sql``\n } ${orderBy(relationship.subquery.orderBy)} ${\n format?.singular ? limit(1) : limit(lastLimit)\n } ) ${sql.ident(`inner_${relationship.subquery.alias}`)}\n ) as ${sql.ident(relationship.subquery.alias)}`;\n }\n return sql`(\n SELECT ${format?.singular ? sql`` : sql`array_agg`}(row_to_json(${sql.ident(\n `inner_${relationship.subquery.alias}`,\n )})) FROM (${select(\n relationship.subquery,\n format,\n correlate(\n parentTable,\n relationship.correlation.parentField,\n relationship.subquery.table,\n relationship.correlation.childField,\n ),\n )}) ${sql.ident(`inner_${relationship.subquery.alias}`)}\n ) as ${sql.ident(relationship.subquery.alias)}`;\n}\n\nexport function pullTablesForJunction(\n relationship: CorrelatedSubquery,\n tables: [string, Correlation, number | undefined][] = [],\n) {\n tables.push([\n relationship.subquery.table,\n relationship.correlation,\n relationship.subquery.limit,\n ]);\n assert(\n relationship.subquery.related?.length || 0 <= 1,\n 'Too many related tables for a junction edge',\n );\n for (const subRelationship of relationship.subquery.related ?? []) {\n pullTablesForJunction(subRelationship, tables);\n }\n return tables;\n}\n\nexport function makeJunctionJoin(\n relationship: CorrelatedSubquery,\n): [join: SQLQuery, lastAlis: string, lastLimit: number | undefined] {\n const participatingTables = pullTablesForJunction(relationship);\n const ret: SQLQuery[] = [];\n\n function alias(index: number) {\n if (index === 0) {\n return participatingTables[0][0];\n }\n return `table_${index}`;\n }\n\n for (const [table, _correlation] of participatingTables) {\n if (ret.length === 0) {\n ret.push(sql.ident(table));\n continue;\n }\n ret.push(\n sql` JOIN ${sql.ident(table)} as ${sql.ident(\n alias(ret.length),\n )} ON ${correlate(\n alias(ret.length - 1),\n participatingTables[ret.length][1].parentField,\n alias(ret.length),\n participatingTables[ret.length][1].childField,\n )}`,\n );\n }\n\n return [\n sql.join(ret, ''),\n alias(ret.length - 1),\n participatingTables[participatingTables.length - 1][2],\n ] as const;\n}\n\nexport function where(\n condition: Condition | undefined,\n parentTable: string,\n): SQLQuery {\n if (!condition) {\n return sql``;\n }\n\n switch (condition.type) {\n case 'and':\n return sql`(${sql.join(\n condition.conditions.map(c => where(c, parentTable)),\n ' AND ',\n )})`;\n case 'or':\n return sql`(${sql.join(\n condition.conditions.map(c => where(c, parentTable)),\n ' OR ',\n )})`;\n case 'correlatedSubquery':\n return exists(condition, parentTable);\n case 'simple':\n return simple(condition);\n }\n}\n\nexport function simple(condition: SimpleCondition): SQLQuery {\n switch (condition.op) {\n case '!=':\n case '<':\n case '<=':\n case '=':\n case '>':\n case '>=':\n case 'ILIKE':\n case 'LIKE':\n case 'NOT ILIKE':\n case 'NOT LIKE':\n return sql`${valuePosition(condition.left)} ${sql.__dangerous__rawValue(\n condition.op,\n )} ${valuePosition(condition.right)}`;\n case 'NOT IN':\n case 'IN':\n return any(condition);\n case 'IS':\n case 'IS NOT':\n return distinctFrom(condition);\n }\n}\n\nexport function distinctFrom(condition: SimpleCondition): SQLQuery {\n return sql`${valuePosition(condition.left)} ${\n condition.op === 'IS' ? sql`IS NOT DISTINCT FROM` : sql`IS DISTINCT FROM`\n } ${valuePosition(condition.right)}`;\n}\n\nexport function any(condition: SimpleCondition): SQLQuery {\n return sql`${valuePosition(condition.left)} ${\n condition.op === 'IN' ? sql`= ANY` : sql`!= ANY`\n } (${valuePosition(condition.right)})`;\n}\n\nexport function valuePosition(value: ValuePosition): SQLQuery {\n switch (value.type) {\n case 'column':\n return sql.ident(value.name);\n case 'literal':\n return sql.value(value.value);\n case 'static':\n throw new Error(\n 'Static parameters must be bound to a value before compiling to SQL',\n );\n }\n}\n\nexport function exists(\n condition: CorrelatedSubqueryCondition,\n parentTable: string,\n): SQLQuery {\n switch (condition.op) {\n case 'EXISTS':\n return sql`EXISTS (${select(\n condition.related.subquery,\n undefined,\n correlate(\n parentTable,\n condition.related.correlation.parentField,\n condition.related.subquery.table,\n condition.related.correlation.childField,\n ),\n )})`;\n case 'NOT EXISTS':\n return sql`NOT EXISTS (${select(\n condition.related.subquery,\n undefined,\n undefined,\n )})`;\n }\n}\n\nexport function correlate(\n parentTable: string,\n parentColumns: readonly string[],\n childTable: string,\n childColumns: readonly string[],\n) {\n return sql.join(\n zip(parentColumns, childColumns).map(\n ([parentColumn, childColumn]) =>\n sql`${sql.ident(parentTable)}.${sql.ident(parentColumn)} = ${sql.ident(\n childTable,\n )}.${sql.ident(childColumn)}`,\n ),\n ' AND ',\n );\n}\n\nfunction zip<T>(a1: readonly T[], a2: readonly T[]): [T, T][] {\n assert(a1.length === a2.length);\n const result: [T, T][] = [];\n for (let i = 0; i < a1.length; i++) {\n result.push([a1[i], a2[i]]);\n }\n return result;\n}\n", "import type {Schema} from '../../zero-schema/src/builder/schema-builder.ts';\nimport type {SchemaQuery} from '../../zql/src/mutate/custom.ts';\nimport type {DBTransaction} from './db.ts';\nimport type {AST} from '../../zero-protocol/src/ast.ts';\nimport type {Format} from '../../zql/src/ivm/view.ts';\nimport {AbstractQuery} from '../../zql/src/query/query-impl.ts';\nimport type {HumanReadable, PullRow, Query} from '../../zql/src/query/query.ts';\nimport type {TypedView} from '../../zql/src/query/typed-view.ts';\nimport {formatPg} from '../../z2s/src/sql.ts';\nimport {compile} from '../../z2s/src/compiler.ts';\nimport {assert} from '../../shared/src/asserts.ts';\nimport {first} from '../../shared/src/iterables.ts';\n\nexport function makeSchemaQuery<S extends Schema>(\n schema: S,\n): (dbTransaction: DBTransaction<unknown>) => SchemaQuery<S> {\n class SchemaQueryHandler {\n readonly #dbTransaction: DBTransaction<unknown>;\n constructor(dbTransaction: DBTransaction<unknown>) {\n this.#dbTransaction = dbTransaction;\n }\n\n get(\n target: Record<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Omit<Query<S, string, any>, 'materialize' | 'preload'>\n >,\n prop: string,\n ) {\n if (prop in target) {\n return target[prop];\n }\n\n const q = new Z2SQuery(schema, prop, this.#dbTransaction);\n target[prop] = q;\n return q;\n }\n }\n\n return (dbTransaction: DBTransaction<unknown>) =>\n new Proxy({}, new SchemaQueryHandler(dbTransaction)) as SchemaQuery<S>;\n}\n\nexport class Z2SQuery<\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n TReturn = PullRow<TTable, TSchema>,\n> extends AbstractQuery<TSchema, TTable, TReturn> {\n readonly #dbTransaction: DBTransaction<unknown>;\n #query:\n | {\n text: string;\n values: unknown[];\n }\n | undefined;\n\n constructor(\n schema: TSchema,\n tableName: TTable,\n dbTransaction: DBTransaction<unknown>,\n ast: AST = {table: tableName},\n format?: Format | undefined,\n ) {\n super(schema, tableName, ast, undefined, format);\n this.#dbTransaction = dbTransaction;\n }\n\n protected readonly _system = 'permissions';\n\n protected _newQuery<\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n TReturn,\n >(\n schema: TSchema,\n tableName: TTable,\n ast: AST,\n ttl: number | undefined,\n format: Format | undefined,\n ): Query<TSchema, TTable, TReturn> {\n assert(ttl === undefined, 'TTL is not supported in Z2S');\n return new Z2SQuery(schema, tableName, this.#dbTransaction, ast, format);\n }\n\n async run(): Promise<HumanReadable<TReturn>> {\n const sqlQuery =\n this.#query ?? formatPg(compile(this._completeAst(), this.format));\n this.#query = sqlQuery;\n const result = await this.#dbTransaction.query(\n sqlQuery.text,\n sqlQuery.values,\n );\n\n if (Array.isArray(result)) {\n return result as HumanReadable<TReturn>;\n }\n\n if (this.format.singular) {\n return first(result) as HumanReadable<TReturn>;\n }\n\n return [...result] as HumanReadable<TReturn>;\n }\n\n preload(): {\n cleanup: () => void;\n complete: Promise<void>;\n } {\n throw new Error('Z2SQuery cannot be preloaded');\n }\n\n materialize(): TypedView<HumanReadable<TReturn>> {\n throw new Error('Z2SQuery cannot be materialized');\n }\n}\n", "import type {ReadonlyJSONValue} from '../../shared/src/json.ts';\nimport type {Schema} from '../../zero-schema/src/builder/schema-builder.ts';\nimport type {TableSchema} from '../../zero-schema/src/table-schema.ts';\nimport type {\n SchemaCRUD,\n SchemaQuery,\n TableCRUD,\n TransactionBase,\n} from '../../zql/src/mutate/custom.ts';\nimport type {ConnectionProvider, DBTransaction} from './db.ts';\nimport {PushProcessor, type PushHandler} from './web.ts';\nimport {formatPg, sql} from '../../z2s/src/sql.ts';\n\nexport interface Transaction<S extends Schema, TWrappedTransaction>\n extends TransactionBase<S> {\n readonly location: 'server';\n readonly reason: 'authoritative';\n readonly dbTransaction: DBTransaction<TWrappedTransaction>;\n readonly token: string | undefined;\n}\n\nexport type CustomMutatorDefs<S extends Schema, TDBTransaction> = {\n readonly [Table in keyof S['tables']]?: {\n readonly [key: string]: CustomMutatorImpl<S, TDBTransaction>;\n };\n} & {\n [namespace: string]: {\n [key: string]: CustomMutatorImpl<S, TDBTransaction>;\n };\n};\n\nexport type CustomMutatorImpl<S extends Schema, TDBTransaction> = (\n tx: Transaction<S, TDBTransaction>,\n args: ReadonlyJSONValue,\n) => Promise<void>;\n\ntype Options<\n S extends Schema,\n TDBTransaction,\n MD extends CustomMutatorDefs<S, TDBTransaction>,\n> = {\n schema: S;\n dbConnectionProvider: ConnectionProvider<TDBTransaction>;\n mutators: MD;\n shardID?: string;\n};\n\nexport function createPushHandler<\n S extends Schema,\n TDBTransaction,\n MD extends CustomMutatorDefs<S, TDBTransaction>,\n>({\n schema,\n dbConnectionProvider,\n mutators,\n shardID,\n}: Options<S, TDBTransaction, MD>): PushHandler {\n const processor = new PushProcessor(\n shardID ?? '0',\n schema,\n dbConnectionProvider,\n mutators,\n );\n return (headers, body) => processor.process(headers, body);\n}\n\nexport class TransactionImpl<S extends Schema, TWrappedTransaction>\n implements Transaction<S, TWrappedTransaction>\n{\n readonly location = 'server';\n readonly reason = 'authoritative';\n readonly dbTransaction: DBTransaction<TWrappedTransaction>;\n readonly token: string | undefined;\n readonly clientID: string;\n readonly mutationID: number;\n readonly mutate: SchemaCRUD<S>;\n readonly query: SchemaQuery<S>;\n\n constructor(\n dbTransaction: DBTransaction<TWrappedTransaction>,\n token: string | undefined,\n clientID: string,\n mutationID: number,\n mutate: SchemaCRUD<S>,\n query: SchemaQuery<S>,\n ) {\n this.dbTransaction = dbTransaction;\n this.token = token;\n this.clientID = clientID;\n this.mutationID = mutationID;\n this.mutate = mutate;\n this.query = query;\n }\n}\n\nconst dbTxSymbol = Symbol();\ntype WithHiddenTx = {[dbTxSymbol]: DBTransaction<unknown>};\n\nexport function makeSchemaCRUD<S extends Schema>(\n schema: S,\n): (dbTransaction: DBTransaction<unknown>) => SchemaCRUD<S> {\n const schemaCRUDs: Record<string, TableCRUD<TableSchema>> = {};\n for (const tableSchema of Object.values(schema.tables)) {\n schemaCRUDs[tableSchema.name] = makeTableCRUD(tableSchema);\n }\n\n /**\n * For users with very large schemas it is expensive to re-create\n * all the CRUD mutators for each transaction. Instead, we create\n * them all once up-front and then bind them to the transaction\n * as requested.\n */\n class CRUDHandler {\n readonly #dbTransaction: DBTransaction<unknown>;\n constructor(dbTransaction: DBTransaction<unknown>) {\n this.#dbTransaction = dbTransaction;\n }\n\n get(target: Record<string, TableCRUD<TableSchema>>, prop: string) {\n if (prop in target) {\n return target[prop];\n }\n\n const txHolder: WithHiddenTx = {\n [dbTxSymbol]: this.#dbTransaction,\n };\n target[prop] = Object.fromEntries(\n Object.entries(schemaCRUDs[prop]).map(([name, method]) => [\n name,\n method.bind(txHolder),\n ]),\n ) as TableCRUD<TableSchema>;\n\n return target[prop];\n }\n }\n\n return (dbTransaction: DBTransaction<unknown>) =>\n new Proxy({}, new CRUDHandler(dbTransaction)) as SchemaCRUD<S>;\n}\n\nfunction makeTableCRUD(schema: TableSchema): TableCRUD<TableSchema> {\n return {\n async insert(this: WithHiddenTx, value) {\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const stmt = formatPg(\n sql`INSERT INTO ${sql.ident(serverName(schema))} (${sql.join(\n targetedColumns.map(([, serverName]) => sql.ident(serverName)),\n ',',\n )}) VALUES (${sql.join(\n Object.values(value).map(v => sql.value(v)),\n ', ',\n )})`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async upsert(this: WithHiddenTx, value) {\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const primaryKeyColumns = origAndServerNamesFor(\n schema.primaryKey,\n schema,\n );\n const stmt = formatPg(\n sql`INSERT INTO ${sql.ident(serverName(schema))} (${sql.join(\n targetedColumns.map(([, serverName]) => sql.ident(serverName)),\n ',',\n )}) VALUES (${sql.join(\n Object.values(value).map(v => sql.value(v)),\n ', ',\n )}) ON CONFLICT (${sql.join(\n primaryKeyColumns.map(([, serverName]) => sql.ident(serverName)),\n ', ',\n )}) DO UPDATE SET ${sql.join(\n Object.entries(value).map(\n ([col, val]) =>\n sql`${sql.ident(\n schema.columns[col].serverName ?? col,\n )} = ${sql.value(val)}`,\n ),\n ', ',\n )}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async update(this: WithHiddenTx, value) {\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const stmt = formatPg(\n sql`UPDATE ${sql.ident(serverName(schema))} SET ${sql.join(\n targetedColumns.map(\n ([origName, serverName]) =>\n sql`${sql.ident(serverName)} = ${sql.value(value[origName])}`,\n ),\n ', ',\n )} WHERE ${primaryKeyClause(schema, value)}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async delete(this: WithHiddenTx, value) {\n const stmt = formatPg(\n sql`DELETE FROM ${sql.ident(\n serverName(schema),\n )} WHERE ${primaryKeyClause(schema, value)}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n };\n}\n\nfunction serverName(x: {name: string; serverName?: string | undefined}) {\n return x.serverName ?? x.name;\n}\n\nfunction primaryKeyClause(schema: TableSchema, row: Record<string, unknown>) {\n const primaryKey = origAndServerNamesFor(schema.primaryKey, schema);\n return sql`${sql.join(\n primaryKey.map(\n ([origName, serverName]) =>\n sql`${sql.ident(serverName)} = ${sql.value(row[origName])}`,\n ),\n ' AND ',\n )}`;\n}\n\nfunction origAndServerNamesFor(\n originalNames: readonly string[],\n schema: TableSchema,\n): [origName: string, serverName: string][] {\n return originalNames.map(name => {\n const col = schema.columns[name];\n return [name, col.serverName ?? name] as const;\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["sql", "orderBy", "limit", "serverName"]
|
|
7
|
+
}
|