dzql 0.6.3 → 0.6.6

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 (41) hide show
  1. package/README.md +33 -0
  2. package/docs/for_ai.md +14 -18
  3. package/docs/project-setup.md +15 -14
  4. package/package.json +28 -6
  5. package/src/cli/codegen/client.ts +5 -6
  6. package/src/cli/codegen/subscribable_store.ts +5 -5
  7. package/src/runtime/ws.ts +16 -15
  8. package/.env.sample +0 -28
  9. package/compose.yml +0 -28
  10. package/dist/client/index.ts +0 -1
  11. package/dist/client/stores/useMyProfileStore.ts +0 -114
  12. package/dist/client/stores/useOrgDashboardStore.ts +0 -131
  13. package/dist/client/stores/useVenueDetailStore.ts +0 -117
  14. package/dist/client/ws.ts +0 -716
  15. package/dist/db/migrations/000_core.sql +0 -92
  16. package/dist/db/migrations/20260101T235039268Z_schema.sql +0 -3020
  17. package/dist/db/migrations/20260101T235039268Z_subscribables.sql +0 -371
  18. package/dist/runtime/manifest.json +0 -1562
  19. package/examples/blog.ts +0 -50
  20. package/examples/invalid.ts +0 -18
  21. package/examples/venues.js +0 -485
  22. package/tests/client.test.ts +0 -38
  23. package/tests/codegen.test.ts +0 -71
  24. package/tests/compiler.test.ts +0 -45
  25. package/tests/graph_rules.test.ts +0 -173
  26. package/tests/integration/db.test.ts +0 -174
  27. package/tests/integration/e2e.test.ts +0 -65
  28. package/tests/integration/features.test.ts +0 -922
  29. package/tests/integration/full_stack.test.ts +0 -262
  30. package/tests/integration/setup.ts +0 -45
  31. package/tests/ir.test.ts +0 -32
  32. package/tests/namespace.test.ts +0 -395
  33. package/tests/permissions.test.ts +0 -55
  34. package/tests/pinia.test.ts +0 -48
  35. package/tests/realtime.test.ts +0 -22
  36. package/tests/runtime.test.ts +0 -80
  37. package/tests/subscribable_gen.test.ts +0 -72
  38. package/tests/subscribable_reactivity.test.ts +0 -258
  39. package/tests/venues_gen.test.ts +0 -25
  40. package/tsconfig.json +0 -20
  41. package/tsconfig.tsbuildinfo +0 -1
@@ -1,371 +0,0 @@
1
- -- ============================================================================
2
- -- Subscribable: venue_detail
3
- -- Root Entity: venues
4
- -- Scope Tables: venues, organisations, sites, allocations
5
- -- Generated: 2026-01-01T23:50:39.267Z
6
- -- ============================================================================
7
-
8
- CREATE OR REPLACE FUNCTION dzql_v2.venue_detail_can_subscribe(
9
- p_user_id INT,
10
- p_params JSONB
11
- ) RETURNS BOOLEAN
12
- LANGUAGE plpgsql
13
- STABLE
14
- SECURITY DEFINER
15
- SET search_path = dzql_v2, public
16
- AS $$
17
- DECLARE
18
- v_venue_id int;
19
- v_root RECORD;
20
- BEGIN
21
- -- Extract parameters
22
- v_venue_id := (p_params->>'venue_id')::int;
23
-
24
- -- Fetch root entity
25
- SELECT * INTO v_root
26
- FROM venues
27
- WHERE id = v_venue_id;
28
-
29
- IF NOT FOUND THEN
30
- RETURN FALSE;
31
- END IF;
32
-
33
- -- Check permissions
34
- RETURN (
35
- p_user_id IS NOT NULL -- Fallback: multi-level paths not yet supported
36
- );
37
- END;
38
- $$;
39
-
40
- CREATE OR REPLACE FUNCTION dzql_v2.get_venue_detail(
41
- p_params JSONB,
42
- p_user_id INT
43
- ) RETURNS JSONB
44
- LANGUAGE plpgsql
45
- SECURITY DEFINER
46
- SET search_path = dzql_v2, public
47
- AS $$
48
- DECLARE
49
- v_venue_id int;
50
- v_data JSONB;
51
- BEGIN
52
- -- Extract parameters
53
- v_venue_id := (p_params->>'venue_id')::int;
54
-
55
- -- Check access control
56
- IF NOT dzql_v2.venue_detail_can_subscribe(p_user_id, p_params) THEN
57
- RAISE EXCEPTION 'permission_denied';
58
- END IF;
59
-
60
- -- Build document with root and all relations
61
- SELECT jsonb_build_object(
62
- 'venues', row_to_json(root.*),
63
- 'org', (
64
- SELECT row_to_json(rel.*)
65
- FROM organisations rel
66
- WHERE rel.id = root.org_id
67
- ),
68
- 'sites', COALESCE((
69
- SELECT jsonb_agg(
70
- to_jsonb(rel.*) || jsonb_build_object(
71
- 'allocations', COALESCE((
72
- SELECT jsonb_agg(row_to_json(nested.*))
73
- FROM allocations nested
74
- WHERE nested.site_id = rel.id
75
- ), '[]'::jsonb))
76
- )
77
- FROM sites rel
78
- WHERE rel.venue_id = root.id
79
- ), '[]'::jsonb)
80
- )
81
- INTO v_data
82
- FROM venues root
83
- WHERE root.id = v_venue_id;
84
-
85
- -- Return data with embedded schema for atomic updates
86
- RETURN jsonb_build_object(
87
- 'data', v_data,
88
- 'schema', '{"root":"venues","paths":{"venues":".","organisations":"org","sites":"sites","allocations":"sites.allocations"},"scopeTables":["venues","organisations","sites","allocations"]}'::jsonb
89
- );
90
- END;
91
- $$;
92
-
93
- CREATE OR REPLACE FUNCTION dzql_v2.venue_detail_affected_keys(
94
- p_table TEXT,
95
- p_op TEXT,
96
- p_data JSONB
97
- ) RETURNS TEXT[]
98
- LANGUAGE plpgsql
99
- IMMUTABLE
100
- AS $$
101
- DECLARE
102
- v_keys TEXT[];
103
- BEGIN
104
- CASE p_table
105
- WHEN 'venues' THEN
106
- RETURN ARRAY['venue_detail:' || (p_data->>'id')];
107
- WHEN 'organisations' THEN
108
- RETURN ARRAY['venue_detail:' || (p_data->>'venue_id')];
109
- WHEN 'sites' THEN
110
- RETURN ARRAY['venue_detail:' || (p_data->>'venue_id')];
111
- WHEN 'allocations' THEN
112
- -- Nested: traverse via sites
113
- SELECT ARRAY_AGG('venue_detail:' || parent.venue_id)
114
- INTO v_keys
115
- FROM sites parent
116
- WHERE parent.id = (p_data->>'site_id')::int;
117
- RETURN COALESCE(v_keys, ARRAY[]::text[]);
118
- ELSE
119
- RETURN ARRAY[]::text[];
120
- END CASE;
121
- END;
122
- $$;
123
-
124
- -- ============================================================================
125
- -- Subscribable: org_dashboard
126
- -- Root Entity: organisations
127
- -- Scope Tables: organisations, venues, sites, products, packages, brands, artwork
128
- -- Generated: 2026-01-01T23:50:39.267Z
129
- -- ============================================================================
130
-
131
- CREATE OR REPLACE FUNCTION dzql_v2.org_dashboard_can_subscribe(
132
- p_user_id INT,
133
- p_params JSONB
134
- ) RETURNS BOOLEAN
135
- LANGUAGE plpgsql
136
- STABLE
137
- SECURITY DEFINER
138
- SET search_path = dzql_v2, public
139
- AS $$
140
- DECLARE
141
- v_org_id int;
142
- v_root RECORD;
143
- BEGIN
144
- -- Extract parameters
145
- v_org_id := (p_params->>'org_id')::int;
146
-
147
- -- Fetch root entity
148
- SELECT * INTO v_root
149
- FROM organisations
150
- WHERE id = v_org_id;
151
-
152
- IF NOT FOUND THEN
153
- RETURN FALSE;
154
- END IF;
155
-
156
- -- Check permissions
157
- RETURN (
158
- EXISTS (SELECT 1 FROM acts_for WHERE acts_for.org_id = v_root.id AND acts_for.user_id = p_user_id AND acts_for.active)
159
- );
160
- END;
161
- $$;
162
-
163
- CREATE OR REPLACE FUNCTION dzql_v2.get_org_dashboard(
164
- p_params JSONB,
165
- p_user_id INT
166
- ) RETURNS JSONB
167
- LANGUAGE plpgsql
168
- SECURITY DEFINER
169
- SET search_path = dzql_v2, public
170
- AS $$
171
- DECLARE
172
- v_org_id int;
173
- v_data JSONB;
174
- BEGIN
175
- -- Extract parameters
176
- v_org_id := (p_params->>'org_id')::int;
177
-
178
- -- Check access control
179
- IF NOT dzql_v2.org_dashboard_can_subscribe(p_user_id, p_params) THEN
180
- RAISE EXCEPTION 'permission_denied';
181
- END IF;
182
-
183
- -- Build document with root and all relations
184
- SELECT jsonb_build_object(
185
- 'organisations', row_to_json(root.*),
186
- 'venues', COALESCE((
187
- SELECT jsonb_agg(
188
- to_jsonb(rel.*) || jsonb_build_object(
189
- 'sites', COALESCE((
190
- SELECT jsonb_agg(row_to_json(nested.*))
191
- FROM sites nested
192
- WHERE nested.venue_id = rel.id
193
- ), '[]'::jsonb))
194
- )
195
- FROM venues rel
196
- WHERE rel.org_id = v_org_id
197
- ), '[]'::jsonb),
198
- 'products', COALESCE((
199
- SELECT jsonb_agg(row_to_json(rel.*))
200
- FROM products rel
201
- WHERE rel.org_id = v_org_id
202
- ), '[]'::jsonb),
203
- 'packages', COALESCE((
204
- SELECT jsonb_agg(row_to_json(rel.*))
205
- FROM packages rel
206
- WHERE rel.owner_org_id = v_org_id
207
- ), '[]'::jsonb),
208
- 'brands', COALESCE((
209
- SELECT jsonb_agg(
210
- to_jsonb(rel.*) || jsonb_build_object(
211
- 'artwork', COALESCE((
212
- SELECT jsonb_agg(row_to_json(nested.*))
213
- FROM artwork nested
214
- WHERE nested.brand_id = rel.id
215
- ), '[]'::jsonb))
216
- )
217
- FROM brands rel
218
- WHERE rel.org_id = v_org_id
219
- ), '[]'::jsonb)
220
- )
221
- INTO v_data
222
- FROM organisations root
223
- WHERE root.id = v_org_id;
224
-
225
- -- Return data with embedded schema for atomic updates
226
- RETURN jsonb_build_object(
227
- 'data', v_data,
228
- 'schema', '{"root":"organisations","paths":{"organisations":".","venues":"venues","sites":"venues.sites","products":"products","packages":"packages","brands":"brands","artwork":"brands.artwork"},"scopeTables":["organisations","venues","sites","products","packages","brands","artwork"]}'::jsonb
229
- );
230
- END;
231
- $$;
232
-
233
- CREATE OR REPLACE FUNCTION dzql_v2.org_dashboard_affected_keys(
234
- p_table TEXT,
235
- p_op TEXT,
236
- p_data JSONB
237
- ) RETURNS TEXT[]
238
- LANGUAGE plpgsql
239
- IMMUTABLE
240
- AS $$
241
- DECLARE
242
- v_keys TEXT[];
243
- BEGIN
244
- CASE p_table
245
- WHEN 'organisations' THEN
246
- RETURN ARRAY['org_dashboard:' || (p_data->>'id')];
247
- WHEN 'venues' THEN
248
- RETURN ARRAY['org_dashboard:' || (p_data->>'org_id')];
249
- WHEN 'sites' THEN
250
- -- Nested: traverse via venues
251
- SELECT ARRAY_AGG('org_dashboard:' || parent.organisation_id)
252
- INTO v_keys
253
- FROM venues parent
254
- WHERE parent.id = (p_data->>'venue_id')::int;
255
- RETURN COALESCE(v_keys, ARRAY[]::text[]);
256
- WHEN 'products' THEN
257
- RETURN ARRAY['org_dashboard:' || (p_data->>'org_id')];
258
- WHEN 'packages' THEN
259
- RETURN ARRAY['org_dashboard:' || (p_data->>'owner_org_id')];
260
- WHEN 'brands' THEN
261
- RETURN ARRAY['org_dashboard:' || (p_data->>'org_id')];
262
- WHEN 'artwork' THEN
263
- -- Nested: traverse via brands
264
- SELECT ARRAY_AGG('org_dashboard:' || parent.organisation_id)
265
- INTO v_keys
266
- FROM brands parent
267
- WHERE parent.id = (p_data->>'brand_id')::int;
268
- RETURN COALESCE(v_keys, ARRAY[]::text[]);
269
- ELSE
270
- RETURN ARRAY[]::text[];
271
- END CASE;
272
- END;
273
- $$;
274
-
275
- -- ============================================================================
276
- -- Subscribable: my_profile
277
- -- Root Entity: users
278
- -- Scope Tables: users, acts_for, organisations
279
- -- Generated: 2026-01-01T23:50:39.267Z
280
- -- ============================================================================
281
-
282
- CREATE OR REPLACE FUNCTION dzql_v2.my_profile_can_subscribe(
283
- p_user_id INT,
284
- p_params JSONB
285
- ) RETURNS BOOLEAN
286
- LANGUAGE plpgsql
287
- STABLE
288
- SECURITY DEFINER
289
- SET search_path = dzql_v2, public
290
- AS $$
291
- BEGIN
292
- RETURN TRUE; -- Public access
293
- END;
294
- $$;
295
-
296
- CREATE OR REPLACE FUNCTION dzql_v2.get_my_profile(
297
- p_params JSONB,
298
- p_user_id INT
299
- ) RETURNS JSONB
300
- LANGUAGE plpgsql
301
- SECURITY DEFINER
302
- SET search_path = dzql_v2, public
303
- AS $$
304
- DECLARE
305
-
306
- v_data JSONB;
307
- BEGIN
308
- -- Extract parameters
309
-
310
-
311
- -- Check access control
312
- IF NOT dzql_v2.my_profile_can_subscribe(p_user_id, p_params) THEN
313
- RAISE EXCEPTION 'permission_denied';
314
- END IF;
315
-
316
- -- Build document with root and all relations
317
- SELECT jsonb_build_object(
318
- 'users', jsonb_build_object('id', root.id, 'name', root.name, 'email', root.email, 'created_at', root.created_at),
319
- 'memberships', COALESCE((
320
- SELECT jsonb_agg(
321
- to_jsonb(rel.*) || jsonb_build_object(
322
- 'org', (
323
- SELECT row_to_json(nested.*)
324
- FROM organisations nested
325
- WHERE nested.id = rel.org_id
326
- ))
327
- )
328
- FROM acts_for rel
329
- WHERE rel.user_id = p_user_id
330
- ), '[]'::jsonb)
331
- )
332
- INTO v_data
333
- FROM users root
334
- WHERE root.id = p_user_id;
335
-
336
- -- Return data with embedded schema for atomic updates
337
- RETURN jsonb_build_object(
338
- 'data', v_data,
339
- 'schema', '{"root":"users","paths":{"users":".","acts_for":"memberships","organisations":"memberships.org"},"scopeTables":["users","acts_for","organisations"]}'::jsonb
340
- );
341
- END;
342
- $$;
343
-
344
- CREATE OR REPLACE FUNCTION dzql_v2.my_profile_affected_keys(
345
- p_table TEXT,
346
- p_op TEXT,
347
- p_data JSONB
348
- ) RETURNS TEXT[]
349
- LANGUAGE plpgsql
350
- IMMUTABLE
351
- AS $$
352
- DECLARE
353
- v_keys TEXT[];
354
- BEGIN
355
- CASE p_table
356
- WHEN 'users' THEN
357
- RETURN ARRAY['my_profile:' || (p_data->>'id')];
358
- WHEN 'acts_for' THEN
359
- RETURN ARRAY['my_profile:' || (p_data->>'user_id')];
360
- WHEN 'organisations' THEN
361
- -- Nested: traverse via acts_for
362
- SELECT ARRAY_AGG('my_profile:' || parent.user_id)
363
- INTO v_keys
364
- FROM acts_for parent
365
- WHERE parent.id = (p_data->>'acts_for_id')::int;
366
- RETURN COALESCE(v_keys, ARRAY[]::text[]);
367
- ELSE
368
- RETURN ARRAY[]::text[];
369
- END CASE;
370
- END;
371
- $$;