@ai-matrx/records 0.80.2 → 0.80.7
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/CHANGELOG.md +29 -0
- package/README.md +19 -0
- package/dist/app-table/index.cjs +100 -23
- package/dist/app-table/index.cjs.map +1 -1
- package/dist/app-table/index.d.cts +7 -7
- package/dist/app-table/index.d.ts +7 -7
- package/dist/app-table/index.js +100 -23
- package/dist/app-table/index.js.map +1 -1
- package/dist/{client-DKKRZKNw.d.ts → client-D1LTezMZ.d.ts} +10 -5
- package/dist/{client-BfNJEpar.d.cts → client-DLIKeBWF.d.cts} +10 -5
- package/dist/core/index.cjs +115 -31
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +22 -12
- package/dist/core/index.d.ts +22 -12
- package/dist/core/index.js +115 -31
- package/dist/core/index.js.map +1 -1
- package/dist/data/index.cjs +100 -23
- package/dist/data/index.cjs.map +1 -1
- package/dist/data/index.d.cts +7 -7
- package/dist/data/index.d.ts +7 -7
- package/dist/data/index.js +100 -23
- package/dist/data/index.js.map +1 -1
- package/dist/{declareTable-CzLMdOSy.d.cts → declareTable-02uao-5n.d.cts} +4 -4
- package/dist/{declareTable-Cg522Sk0.d.ts → declareTable-C5FlIS0z.d.ts} +4 -4
- package/dist/{field-DJAvDExi.d.ts → field-BIJiFPc0.d.ts} +1 -1
- package/dist/{field-DCXU6k9i.d.cts → field-snQG2jMq.d.cts} +1 -1
- package/dist/index.cjs +12 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -7
- package/dist/index.d.ts +7 -7
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/memory/index.cjs +5 -0
- package/dist/memory/index.cjs.map +1 -1
- package/dist/memory/index.d.cts +6 -6
- package/dist/memory/index.d.ts +6 -6
- package/dist/memory/index.js +5 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/{ports-Kpc-RihV.d.ts → ports-Y5gLbCXe.d.ts} +1 -1
- package/dist/{ports-DaHUjVg7.d.cts → ports-y1QNfM80.d.cts} +1 -1
- package/dist/react/index.cjs +107 -27
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +31 -1
- package/dist/react/index.d.ts +31 -1
- package/dist/react/index.js +107 -27
- package/dist/react/index.js.map +1 -1
- package/dist/realtime/index.d.cts +2 -2
- package/dist/realtime/index.d.ts +2 -2
- package/dist/{record-DCaOJbhA.d.cts → record-1yDCn169.d.cts} +26 -1
- package/dist/{record-DCaOJbhA.d.ts → record-1yDCn169.d.ts} +26 -1
- package/dist/{subscription-C_hNjbaR.d.cts → subscription-B_WaT-kr.d.cts} +1 -1
- package/dist/{subscription-B9znK2dw.d.ts → subscription-CUok1vAm.d.ts} +1 -1
- package/dist/{table-kind-B9RBUmSb.d.ts → table-kind-COmkYYkc.d.ts} +3 -3
- package/dist/{table-kind-DXktQGzR.d.cts → table-kind-LodkBhCZ.d.cts} +3 -3
- package/dist/templates/index.cjs +70 -6
- package/dist/templates/index.cjs.map +1 -1
- package/dist/templates/index.d.cts +26 -10
- package/dist/templates/index.d.ts +26 -10
- package/dist/templates/index.js +70 -6
- package/dist/templates/index.js.map +1 -1
- package/dist/{types-DuyBN2im.d.cts → types-BJGTxu3Y.d.cts} +2 -2
- package/dist/{types-b-VGi15H.d.ts → types-C5-AaPa6.d.ts} +2 -2
- package/dist/{types-CHEFgCu1.d.ts → types-CU_Tn2Np.d.ts} +2 -2
- package/dist/{types-CD2HoaZt.d.cts → types-yBZLtxrZ.d.cts} +2 -2
- package/dist/use-cases/index.cjs.map +1 -1
- package/dist/use-cases/index.d.cts +5 -5
- package/dist/use-cases/index.d.ts +5 -5
- package/dist/use-cases/index.js.map +1 -1
- package/dist/{validate-CubFFxpu.d.cts → validate-CE6qpJIb.d.cts} +1 -1
- package/dist/{validate-BEfYwBpA.d.ts → validate-Rz9djP6H.d.ts} +1 -1
- package/package.json +1 -1
package/dist/data/index.cjs
CHANGED
|
@@ -238,6 +238,32 @@ function takePrimedTablePageBundle(organizationId, tableId, viewId) {
|
|
|
238
238
|
return Date.now() - held.at < PRIMED_TTL_MS ? held.answer : null;
|
|
239
239
|
}
|
|
240
240
|
|
|
241
|
+
// src/core/recordChanges.ts
|
|
242
|
+
var listeners = /* @__PURE__ */ new Set();
|
|
243
|
+
function announceRecordChanged(recordId) {
|
|
244
|
+
for (const listener of [...listeners]) {
|
|
245
|
+
try {
|
|
246
|
+
listener(recordId);
|
|
247
|
+
} catch (thrown) {
|
|
248
|
+
console.error("[@ai-matrx/records] a record-change listener threw", thrown);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function onRecordChanged(listener) {
|
|
253
|
+
listeners.add(listener);
|
|
254
|
+
return () => listeners.delete(listener);
|
|
255
|
+
}
|
|
256
|
+
var tableListeners = /* @__PURE__ */ new Set();
|
|
257
|
+
function announceTableStructureChanged(tableId) {
|
|
258
|
+
for (const listener of [...tableListeners]) {
|
|
259
|
+
try {
|
|
260
|
+
listener(tableId);
|
|
261
|
+
} catch (thrown) {
|
|
262
|
+
console.error("[@ai-matrx/records] a table-structure listener threw", thrown);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
241
267
|
// src/archive.ts
|
|
242
268
|
var DEFAULT_ARCHIVE_LANE = "org";
|
|
243
269
|
|
|
@@ -1107,21 +1133,25 @@ var STORE_DOORS = [
|
|
|
1107
1133
|
{ name: "form_declare", args: "p_organization_id uuid, p_table_id uuid, p_title text, p_questions jsonb, p_presentation jsonb DEFAULT '{}'::jsonb, p_submission_cap integer DEFAULT NULL::integer, p_quarantine_rule_id uuid DEFAULT NULL::uuid, p_notify_rule_id uuid DEFAULT NULL::uuid, p_form_id uuid DEFAULT NULL::uuid, p_slug text DEFAULT NULL::text", returns: "uuid", security: "definer" },
|
|
1108
1134
|
{ name: "form_draft_read", args: "p_form_id uuid, p_secret text", returns: "TABLE(answers jsonb, saved_at timestamp with time zone, expires_at timestamp with time zone, state text, message text)", security: "definer" },
|
|
1109
1135
|
{ name: "form_draft_save", args: "p_form_id uuid, p_answers jsonb, p_secret text DEFAULT NULL::text, p_bucket text DEFAULT NULL::text, p_origin text DEFAULT NULL::text", returns: "TABLE(draft_secret text, saved_at timestamp with time zone, expires_at timestamp with time zone, state text, message text)", security: "definer" },
|
|
1136
|
+
{ name: "form_knobs", args: "p_organization_id uuid", returns: "jsonb", security: "definer" },
|
|
1110
1137
|
{ name: "form_look_options", args: "p_organization_id uuid, p_presentation jsonb DEFAULT '{}'::jsonb", returns: "jsonb", security: "definer" },
|
|
1111
1138
|
{ name: "form_notify", args: "p_organization_id uuid, p_form_id uuid, p_record_id uuid, p_submission_id uuid", returns: "uuid", security: "invoker" },
|
|
1112
1139
|
{ name: "form_preview_asks", args: "p_organization_id uuid, p_table_id uuid, p_questions jsonb, p_values jsonb", returns: "TABLE(field_key text, asked boolean, decided boolean, said text)", security: "definer" },
|
|
1113
1140
|
{ name: "form_preview_route", args: "p_organization_id uuid, p_table_id uuid, p_questions jsonb, p_endings jsonb, p_values jsonb", returns: "jsonb", security: "definer" },
|
|
1114
1141
|
{ name: "form_public", args: "p_form_id uuid", returns: "TABLE(form_id uuid, organization_id uuid, table_id uuid, title text, presentation jsonb, fields jsonb, honeypot_key text, state text, message text)", security: "definer" },
|
|
1115
1142
|
{ name: "form_public_asks", args: "p_form_id uuid, p_values jsonb, p_secret text DEFAULT NULL::text, p_origin text DEFAULT NULL::text", returns: "TABLE(field_key text, asked boolean, decided boolean, said text)", security: "definer" },
|
|
1143
|
+
{ name: "form_public_options", args: "p_form_id uuid", returns: "jsonb", security: "definer" },
|
|
1116
1144
|
{ name: "form_public_route", args: "p_form_id uuid, p_values jsonb", returns: "jsonb", security: "definer" },
|
|
1117
1145
|
{ name: "form_redirect_domains", args: "p_organization_id uuid", returns: "text[]", security: "invoker" },
|
|
1118
1146
|
{ name: "form_redirect_refusal", args: "p_organization_id uuid, p_url text", returns: "text", security: "invoker" },
|
|
1147
|
+
{ name: "form_respondent_copy", args: "p_organization_id uuid, p_form_id uuid, p_record_id uuid, p_submission_id uuid", returns: "jsonb", security: "definer" },
|
|
1119
1148
|
{ name: "form_restore", args: "p_organization_id uuid, p_form_id uuid", returns: "jsonb", security: "definer" },
|
|
1120
1149
|
{ name: "form_results", args: "p_organization_id uuid, p_form_id uuid", returns: "jsonb", security: "definer" },
|
|
1121
1150
|
{ name: "form_slug", args: "p_organization_id uuid, p_title text, p_form_id uuid DEFAULT NULL::uuid", returns: "text", security: "invoker" },
|
|
1122
1151
|
{ name: "form_submit", args: "p_form_id uuid, p_origin text, p_payload jsonb, p_bucket text, p_honeypot text DEFAULT NULL::text, p_client_key text DEFAULT NULL::text", returns: "TABLE(submission_id uuid, record_id uuid, state text, message text)", security: "definer" },
|
|
1123
1152
|
{ name: "form_theme_options", args: "", returns: "jsonb", security: "invoker" },
|
|
1124
1153
|
{ name: "form_visit", args: "p_form_id uuid, p_visit text, p_event text, p_field text DEFAULT NULL::text", returns: "text", security: "definer" },
|
|
1154
|
+
{ name: "form_visit_admit", args: "p_form_id uuid, p_bucket text", returns: "boolean", security: "definer" },
|
|
1125
1155
|
{ name: "forms", args: "p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid", returns: "TABLE(form_id uuid, table_id uuid, title text, slug text, published_at timestamp with time zone, closed_at timestamp with time zone, submission_cap integer, responses bigint, in_table bigint, held bigint, rejected bigint, state text, quarantine_rule_id uuid, notify_rule_id uuid, presentation jsonb)", security: "definer" },
|
|
1126
1156
|
{ name: "forms_archived", args: "p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 100", returns: "TABLE(form_id uuid, table_id uuid, table_name text, kind text, title text, slug text, archived_at timestamp with time zone, archived_by uuid, table_archived boolean, can_restore boolean)", security: "definer" },
|
|
1127
1157
|
{ name: "formula_compile_sql", args: "p_organization_id uuid, p_expr jsonb, p_values_sql text", returns: "text", security: "invoker" },
|
|
@@ -1389,6 +1419,7 @@ var STORE_DOORS = [
|
|
|
1389
1419
|
{ name: "record_filter_sql", args: "p_organization_id uuid, p_table_id uuid, p_filter jsonb", returns: "text", security: "invoker" },
|
|
1390
1420
|
{ name: "record_headers", args: "p_organization_id uuid, p_ids uuid[]", returns: "TABLE(id uuid, table_id uuid, created_at timestamp with time zone, updated_at timestamp with time zone, version integer, deleted_at timestamp with time zone, mine boolean, created_by uuid)", security: "definer" },
|
|
1391
1421
|
{ name: "record_history", args: "p_organization_id uuid, p_record_id uuid, p_limit integer DEFAULT 200, p_offset integer DEFAULT 0", returns: "TABLE(version integer, occurred_at timestamp with time zone, operation text, operation_label text, actor jsonb, changes jsonb, migration_id uuid, undoable boolean)", security: "definer" },
|
|
1422
|
+
{ name: "record_page_bundle", args: "p_organization_id uuid, p_record_id uuid", returns: "jsonb", security: "invoker" },
|
|
1392
1423
|
{ name: "record_platform_keys", args: "", returns: "text[]", security: "invoker" },
|
|
1393
1424
|
{ name: "record_relation_edges", args: "p_organization_id uuid, p_id uuid, p_table_id uuid, p_data_class text, p_data jsonb, p_deleted_at timestamp with time zone", returns: "TABLE(target_id uuid, edge_role text, field_id uuid, ord integer)", security: "invoker" },
|
|
1394
1425
|
{ name: "record_reparent", args: "p_organization_id uuid, p_record_id uuid, p_parent_id uuid", returns: "void", security: "definer" },
|
|
@@ -2054,6 +2085,7 @@ var DOORS = {
|
|
|
2054
2085
|
formPreviewRoute: "form_preview_route",
|
|
2055
2086
|
/** TYPEFORM-DUP: views, starts, completions, drop-off and answers per question. */
|
|
2056
2087
|
formResults: "form_results",
|
|
2088
|
+
formKnobs: "form_knobs",
|
|
2057
2089
|
formLookOptions: "form_look_options",
|
|
2058
2090
|
// PRODUCTS row 14 — "let clients book a 30-minute consult". A booking page IS an
|
|
2059
2091
|
// `anon_form`, so it is opened and closed by `anonPublish` like any other; this is
|
|
@@ -2485,28 +2517,6 @@ var DRILL_DOORS = {
|
|
|
2485
2517
|
rows: "drill_rows"
|
|
2486
2518
|
};
|
|
2487
2519
|
|
|
2488
|
-
// src/core/recordChanges.ts
|
|
2489
|
-
var listeners = /* @__PURE__ */ new Set();
|
|
2490
|
-
function announceRecordChanged(recordId) {
|
|
2491
|
-
for (const listener of [...listeners]) {
|
|
2492
|
-
try {
|
|
2493
|
-
listener(recordId);
|
|
2494
|
-
} catch (thrown) {
|
|
2495
|
-
console.error("[@ai-matrx/records] a record-change listener threw", thrown);
|
|
2496
|
-
}
|
|
2497
|
-
}
|
|
2498
|
-
}
|
|
2499
|
-
var tableListeners = /* @__PURE__ */ new Set();
|
|
2500
|
-
function announceTableStructureChanged(tableId) {
|
|
2501
|
-
for (const listener of [...tableListeners]) {
|
|
2502
|
-
try {
|
|
2503
|
-
listener(tableId);
|
|
2504
|
-
} catch (thrown) {
|
|
2505
|
-
console.error("[@ai-matrx/records] a table-structure listener threw", thrown);
|
|
2506
|
-
}
|
|
2507
|
-
}
|
|
2508
|
-
}
|
|
2509
|
-
|
|
2510
2520
|
// src/core/query.ts
|
|
2511
2521
|
var DEFAULT_PAGE_SIZE = 50;
|
|
2512
2522
|
function planQuery(query) {
|
|
@@ -2626,8 +2636,68 @@ function createRecordsClient(given) {
|
|
|
2626
2636
|
} catch {
|
|
2627
2637
|
}
|
|
2628
2638
|
}
|
|
2639
|
+
const RECORD_OPENERS = /* @__PURE__ */ new Set(["read_record", "record_row_controls", "record_history", "comment_thread", "computed_provenance"]);
|
|
2640
|
+
const recordFlights = /* @__PURE__ */ new Map();
|
|
2641
|
+
const recordAsked = /* @__PURE__ */ new Map();
|
|
2642
|
+
let recordChangesHeard = false;
|
|
2643
|
+
function bundleRecordOf(door, args) {
|
|
2644
|
+
if (RECORD_OPENERS.has(door)) return typeof args["p_record_id"] === "string" ? args["p_record_id"] : null;
|
|
2645
|
+
const ids = args["p_ids"];
|
|
2646
|
+
const one = Array.isArray(ids) && ids.length === 1 && typeof ids[0] === "string" ? ids[0] : null;
|
|
2647
|
+
if (door === "record_headers") return one;
|
|
2648
|
+
if (door === "my_levels" && args["p_type"] === "record") return one;
|
|
2649
|
+
return null;
|
|
2650
|
+
}
|
|
2651
|
+
async function fillRecordBundle(recordId) {
|
|
2652
|
+
if (!recordChangesHeard) {
|
|
2653
|
+
recordChangesHeard = true;
|
|
2654
|
+
onRecordChanged((changed) => {
|
|
2655
|
+
recordAsked.delete(changed);
|
|
2656
|
+
for (const key of [...bundleParts.keys()]) if (key.includes(changed)) bundleParts.delete(key);
|
|
2657
|
+
});
|
|
2658
|
+
}
|
|
2659
|
+
try {
|
|
2660
|
+
const usable = (r) => r !== null && !r.error && r.data !== null && typeof r.data === "object" && Array.isArray(r.data.parts);
|
|
2661
|
+
const primedAnswer = takePrimedTablePageBundle(org, `record:${recordId}`, null);
|
|
2662
|
+
let response = primedAnswer ? await primedAnswer : null;
|
|
2663
|
+
if (!usable(response)) {
|
|
2664
|
+
response = await config.dataSource.rpc("record_page_bundle", { p_organization_id: org, p_record_id: recordId }, { schema });
|
|
2665
|
+
}
|
|
2666
|
+
if (!usable(response)) return;
|
|
2667
|
+
const now = Date.now();
|
|
2668
|
+
for (const part of response.data.parts) {
|
|
2669
|
+
if (part.error !== void 0 || part.data === void 0) continue;
|
|
2670
|
+
bundleParts.set(bundleKey(part.door, part.args), { data: part.data, at: now });
|
|
2671
|
+
}
|
|
2672
|
+
} catch {
|
|
2673
|
+
}
|
|
2674
|
+
}
|
|
2675
|
+
async function fromRecordBundle(door, args) {
|
|
2676
|
+
if (!doorReady(config, "record_page_bundle")) return void 0;
|
|
2677
|
+
const recordId = bundleRecordOf(door, args);
|
|
2678
|
+
if (!recordId) return void 0;
|
|
2679
|
+
const opener = RECORD_OPENERS.has(door);
|
|
2680
|
+
if (!opener && !recordFlights.has(recordId) && !recordAsked.has(recordId)) return void 0;
|
|
2681
|
+
const asked = recordAsked.get(recordId);
|
|
2682
|
+
const fresh = asked !== void 0 && Date.now() - asked < BUNDLE_TTL_MS;
|
|
2683
|
+
if (!fresh && opener) {
|
|
2684
|
+
recordAsked.set(recordId, Date.now());
|
|
2685
|
+
const flight2 = fillRecordBundle(recordId).finally(() => recordFlights.delete(recordId));
|
|
2686
|
+
recordFlights.set(recordId, flight2);
|
|
2687
|
+
}
|
|
2688
|
+
const flight = recordFlights.get(recordId);
|
|
2689
|
+
if (flight) await flight;
|
|
2690
|
+
const key = bundleKey(door, args);
|
|
2691
|
+
const held = bundleParts.get(key);
|
|
2692
|
+
if (!held) return opener ? null : void 0;
|
|
2693
|
+
bundleParts.delete(key);
|
|
2694
|
+
return Date.now() - held.at < BUNDLE_TTL_MS ? { data: held.data } : null;
|
|
2695
|
+
}
|
|
2629
2696
|
async function fromBundle(door, args) {
|
|
2630
|
-
if (!config.dataSource.opensInOneCall
|
|
2697
|
+
if (!config.dataSource.opensInOneCall) return null;
|
|
2698
|
+
const fromRecord = await fromRecordBundle(door, args);
|
|
2699
|
+
if (fromRecord !== void 0) return fromRecord;
|
|
2700
|
+
if (!doorReady(config, "table_page_bundle")) return null;
|
|
2631
2701
|
const tableId = bundleTableOf(door, args);
|
|
2632
2702
|
if (tableId) {
|
|
2633
2703
|
const asked = bundleAsked.get(tableId);
|
|
@@ -4072,6 +4142,13 @@ function createRecordsClient(given) {
|
|
|
4072
4142
|
"formResults"
|
|
4073
4143
|
);
|
|
4074
4144
|
},
|
|
4145
|
+
async formKnobs() {
|
|
4146
|
+
return callDoor(
|
|
4147
|
+
DOORS.formKnobs,
|
|
4148
|
+
{ p_organization_id: org },
|
|
4149
|
+
"formKnobs"
|
|
4150
|
+
);
|
|
4151
|
+
},
|
|
4075
4152
|
async formLookOptions(args) {
|
|
4076
4153
|
return callDoor(
|
|
4077
4154
|
DOORS.formLookOptions,
|