@hatk/hatk 0.0.1-alpha.83 → 0.0.1-alpha.85
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/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -1
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +201 -140
- package/dist/database/dialect.js +2 -2
- package/dist/database/fts.d.ts.map +1 -1
- package/dist/database/fts.js +6 -2
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/schema.js +6 -1
- package/dist/hooks.d.ts +8 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +24 -1
- package/dist/indexer.d.ts +4 -3
- package/dist/indexer.d.ts.map +1 -1
- package/dist/indexer.js +81 -64
- package/dist/oauth/service-describe.d.ts +18 -7
- package/dist/oauth/service-describe.d.ts.map +1 -1
- package/dist/oauth/service-describe.js +52 -5
- package/dist/opengraph.d.ts.map +1 -1
- package/dist/opengraph.js +16 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +68 -5
- package/dist/xrpc.d.ts.map +1 -1
- package/dist/xrpc.js +1 -1
- package/package.json +4 -2
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -40,7 +40,11 @@ export async function loadConfig(configPath) {
|
|
|
40
40
|
const database = env.DATABASE || parsed.database;
|
|
41
41
|
const config = {
|
|
42
42
|
relay: env.RELAY || parsed.relay || 'ws://localhost:2583',
|
|
43
|
-
relays: env.RELAYS
|
|
43
|
+
relays: env.RELAYS
|
|
44
|
+
? env.RELAYS.split(',')
|
|
45
|
+
.map((s) => s.trim())
|
|
46
|
+
.filter(Boolean)
|
|
47
|
+
: parsed.relays || [],
|
|
44
48
|
jetstream: env.JETSTREAM_URL ? { url: env.JETSTREAM_URL } : parsed.jetstream || null,
|
|
45
49
|
plc: env.DID_PLC_URL || parsed.plc || 'https://plc.directory',
|
|
46
50
|
port: parseInt(env.PORT || '') || parsed.port || 3000,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAkB,MAAM,aAAa,CAAA;AAC9D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAI1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAM1D,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AACD,wBAAgB,aAAa,IAAI,UAAU,CAE1C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAMD,wBAAsB,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAcnG;AAMD,wBAAsB,YAAY,CAChC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,WAAW,EAAE,EAC3B,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC,CAiJf;AAED,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAoED,wBAAsB,aAAa,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA6F3F;
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"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"}
|
package/dist/database/db.js
CHANGED
|
@@ -328,6 +328,15 @@ async function applyMigrationChanges(changes) {
|
|
|
328
328
|
for (const change of changes) {
|
|
329
329
|
const quotedTable = `"${change.table}"`;
|
|
330
330
|
const quotedColumn = `"${change.column}"`;
|
|
331
|
+
// Index naming mirrors generateCreateTableSQL and the 'add' branch below:
|
|
332
|
+
// the table name with dots replaced by underscores, then the column name.
|
|
333
|
+
const indexName = `idx_${change.table.replace(/\./g, '_')}_${change.column}`;
|
|
334
|
+
// SQLite refuses to drop a column an index still references ("error in
|
|
335
|
+
// index ... after drop column"), so any DROP COLUMN has to clear it first.
|
|
336
|
+
const dropColumn = async () => {
|
|
337
|
+
await run(`DROP INDEX IF EXISTS "${indexName}"`);
|
|
338
|
+
await run(`ALTER TABLE ${quotedTable} DROP COLUMN ${quotedColumn}`);
|
|
339
|
+
};
|
|
331
340
|
try {
|
|
332
341
|
switch (change.action) {
|
|
333
342
|
case 'add': {
|
|
@@ -335,17 +344,18 @@ async function applyMigrationChanges(changes) {
|
|
|
335
344
|
emit('migration', 'add_column', { table: change.table, column: change.column, type: change.type });
|
|
336
345
|
const schema = schemas.get(change.table);
|
|
337
346
|
if (schema?.refColumns.includes(change.column)) {
|
|
338
|
-
|
|
339
|
-
await run(`CREATE INDEX IF NOT EXISTS idx_${prefix}_${change.column} ON ${quotedTable}(${quotedColumn})`);
|
|
347
|
+
await run(`CREATE INDEX IF NOT EXISTS ${indexName} ON ${quotedTable}(${quotedColumn})`);
|
|
340
348
|
}
|
|
341
349
|
break;
|
|
342
350
|
}
|
|
343
351
|
case 'drop':
|
|
344
|
-
await
|
|
352
|
+
await dropColumn();
|
|
345
353
|
emit('migration', 'drop_column', { table: change.table, column: change.column });
|
|
346
354
|
break;
|
|
347
355
|
case 'retype':
|
|
348
|
-
|
|
356
|
+
// A ref column is always TEXT, so a type change means it stopped
|
|
357
|
+
// being one — the index goes with the old column and is not rebuilt.
|
|
358
|
+
await dropColumn();
|
|
349
359
|
await run(`ALTER TABLE ${quotedTable} ADD COLUMN ${quotedColumn} ${change.type}`);
|
|
350
360
|
emit('migration', 'retype_column', { table: change.table, column: change.column, type: change.type });
|
|
351
361
|
break;
|
|
@@ -737,6 +747,12 @@ export async function queryLabelsForUris(uris) {
|
|
|
737
747
|
}
|
|
738
748
|
return result;
|
|
739
749
|
}
|
|
750
|
+
/** Per-process token + counter, so concurrent calls never share a staging table. */
|
|
751
|
+
const STAGING_TOKEN = Math.floor(Math.random() * 0xffffff).toString(36);
|
|
752
|
+
let stagingCounter = 0;
|
|
753
|
+
function nextStagingId() {
|
|
754
|
+
return `${STAGING_TOKEN}_${(stagingCounter++).toString(36)}`;
|
|
755
|
+
}
|
|
740
756
|
export async function bulkInsertRecords(records) {
|
|
741
757
|
if (records.length === 0)
|
|
742
758
|
return 0;
|
|
@@ -752,171 +768,191 @@ export async function bulkInsertRecords(records) {
|
|
|
752
768
|
const schema = schemas.get(collection);
|
|
753
769
|
if (!schema)
|
|
754
770
|
continue;
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
...schema.columns.map((c) => {
|
|
763
|
-
const t = c.sqlType;
|
|
764
|
-
// Use TEXT for timestamp columns in staging (will cast on merge)
|
|
765
|
-
return `${q(c.name)} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
766
|
-
}),
|
|
767
|
-
];
|
|
768
|
-
await port.execute(`DROP TABLE IF EXISTS ${stagingTable}`, []);
|
|
769
|
-
await port.execute(`CREATE TABLE ${stagingTable} (${colDefs.join(', ')})`, []);
|
|
770
|
-
const inserter = await port.createBulkInserter(stagingTable, allCols);
|
|
771
|
-
const now = new Date().toISOString();
|
|
772
|
-
for (const rec of recs) {
|
|
773
|
-
try {
|
|
774
|
-
const values = [rec.uri, rec.cid, rec.did, now];
|
|
775
|
-
for (const col of schema.columns) {
|
|
776
|
-
values.push(resolveColumnValue(col, rec.record));
|
|
777
|
-
}
|
|
778
|
-
inserter.append(values);
|
|
779
|
-
inserted++;
|
|
780
|
-
}
|
|
781
|
-
catch {
|
|
782
|
-
// Skip bad records
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
await inserter.close();
|
|
786
|
-
// Merge into target, filtering rows that would violate NOT NULL
|
|
787
|
-
const selectCols = allCols.map((name) => {
|
|
788
|
-
const col = schema.columns.find((c) => q(c.name) === name);
|
|
789
|
-
if (name === 'indexed_at' || (col && (col.sqlType === 'TIMESTAMP' || col.sqlType === 'TIMESTAMPTZ'))) {
|
|
790
|
-
return `${dialect.tryCastTimestamp(name)} AS ${name}`;
|
|
791
|
-
}
|
|
771
|
+
// Staging tables are named per call, not per collection: runBackfill
|
|
772
|
+
// imports repos in parallel, so two workers on the same collection would
|
|
773
|
+
// otherwise drop and recreate each other's staging table mid-insert.
|
|
774
|
+
const stagingTables = [];
|
|
775
|
+
const stagingName = (suffix) => {
|
|
776
|
+
const name = `_staging_${collection.replace(/\./g, '_')}${suffix}_${nextStagingId()}`;
|
|
777
|
+
stagingTables.push(name);
|
|
792
778
|
return name;
|
|
793
|
-
}
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
}
|
|
804
|
-
}
|
|
805
|
-
const whereClause = notNullChecks.length ? ` WHERE ${notNullChecks.join(' AND ')}` : '';
|
|
806
|
-
await port.execute(`INSERT OR REPLACE INTO ${schema.tableName} (${allCols.join(', ')}) SELECT ${selectCols.join(', ')} FROM ${stagingTable}${whereClause}`, []);
|
|
807
|
-
await port.execute(`DROP TABLE ${stagingTable}`, []);
|
|
808
|
-
// Populate child tables
|
|
809
|
-
for (const child of schema.children) {
|
|
810
|
-
const childStagingTable = `_staging_${collection.replace(/\./g, '_')}__${child.fieldName}`;
|
|
811
|
-
const childColDefs = [
|
|
812
|
-
'parent_uri TEXT',
|
|
813
|
-
'parent_did TEXT',
|
|
814
|
-
...child.columns.map((c) => {
|
|
779
|
+
};
|
|
780
|
+
try {
|
|
781
|
+
const stagingTable = stagingName('');
|
|
782
|
+
const allCols = ['uri', 'cid', 'did', 'indexed_at', ...schema.columns.map((c) => q(c.name))];
|
|
783
|
+
const colDefs = [
|
|
784
|
+
'uri TEXT',
|
|
785
|
+
'cid TEXT',
|
|
786
|
+
'did TEXT',
|
|
787
|
+
'indexed_at TEXT',
|
|
788
|
+
...schema.columns.map((c) => {
|
|
815
789
|
const t = c.sqlType;
|
|
790
|
+
// Use TEXT for timestamp columns in staging (will cast on merge)
|
|
816
791
|
return `${q(c.name)} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
817
792
|
}),
|
|
818
793
|
];
|
|
819
|
-
|
|
820
|
-
await port.execute(`
|
|
821
|
-
|
|
822
|
-
const
|
|
794
|
+
await port.execute(`DROP TABLE IF EXISTS ${stagingTable}`, []);
|
|
795
|
+
await port.execute(`CREATE TABLE ${stagingTable} (${colDefs.join(', ')})`, []);
|
|
796
|
+
const inserter = await port.createBulkInserter(stagingTable, allCols);
|
|
797
|
+
const now = new Date().toISOString();
|
|
823
798
|
for (const rec of recs) {
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
try {
|
|
829
|
-
const values = [rec.uri, rec.did];
|
|
830
|
-
for (const col of child.columns) {
|
|
831
|
-
values.push(resolveRawColumnValue(col, item));
|
|
832
|
-
}
|
|
833
|
-
childInserter.append(values);
|
|
834
|
-
}
|
|
835
|
-
catch {
|
|
836
|
-
// Skip bad items
|
|
799
|
+
try {
|
|
800
|
+
const values = [rec.uri, rec.cid, rec.did, now];
|
|
801
|
+
for (const col of schema.columns) {
|
|
802
|
+
values.push(resolveColumnValue(col, rec.record));
|
|
837
803
|
}
|
|
804
|
+
inserter.append(values);
|
|
805
|
+
inserted++;
|
|
806
|
+
}
|
|
807
|
+
catch {
|
|
808
|
+
// Skip bad records
|
|
838
809
|
}
|
|
839
810
|
}
|
|
840
|
-
await
|
|
841
|
-
//
|
|
842
|
-
const
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
const col = child.columns.find((c) => q(c.name) === name);
|
|
846
|
-
if (col && (col.sqlType === 'TIMESTAMP' || col.sqlType === 'TIMESTAMPTZ')) {
|
|
811
|
+
await inserter.close();
|
|
812
|
+
// Merge into target, filtering rows that would violate NOT NULL
|
|
813
|
+
const selectCols = allCols.map((name) => {
|
|
814
|
+
const col = schema.columns.find((c) => q(c.name) === name);
|
|
815
|
+
if (name === 'indexed_at' || (col && (col.sqlType === 'TIMESTAMP' || col.sqlType === 'TIMESTAMPTZ'))) {
|
|
847
816
|
return `${dialect.tryCastTimestamp(name)} AS ${name}`;
|
|
848
817
|
}
|
|
849
818
|
return name;
|
|
850
819
|
});
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
820
|
+
const notNullChecks = ['uri IS NOT NULL', 'did IS NOT NULL'];
|
|
821
|
+
for (const col of schema.columns) {
|
|
822
|
+
if (col.notNull) {
|
|
823
|
+
if (col.sqlType === 'TIMESTAMP' || col.sqlType === 'TIMESTAMPTZ') {
|
|
824
|
+
notNullChecks.push(`${dialect.tryCastTimestamp(q(col.name))} IS NOT NULL`);
|
|
825
|
+
}
|
|
826
|
+
else {
|
|
827
|
+
notNullChecks.push(`${q(col.name)} IS NOT NULL`);
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
const whereClause = notNullChecks.length ? ` WHERE ${notNullChecks.join(' AND ')}` : '';
|
|
832
|
+
await port.execute(`INSERT OR REPLACE INTO ${schema.tableName} (${allCols.join(', ')}) SELECT ${selectCols.join(', ')} FROM ${stagingTable}${whereClause}`, []);
|
|
833
|
+
await port.execute(`DROP TABLE ${stagingTable}`, []);
|
|
834
|
+
// Populate child tables
|
|
835
|
+
for (const child of schema.children) {
|
|
836
|
+
const childStagingTable = stagingName(`__${child.fieldName}`);
|
|
837
|
+
const childColDefs = [
|
|
859
838
|
'parent_uri TEXT',
|
|
860
839
|
'parent_did TEXT',
|
|
861
|
-
...
|
|
840
|
+
...child.columns.map((c) => {
|
|
862
841
|
const t = c.sqlType;
|
|
863
842
|
return `${q(c.name)} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
864
843
|
}),
|
|
865
844
|
];
|
|
866
|
-
const
|
|
867
|
-
await port.execute(`DROP TABLE IF EXISTS ${
|
|
868
|
-
await port.execute(`CREATE TABLE ${
|
|
869
|
-
const
|
|
845
|
+
const childAllCols = ['parent_uri', 'parent_did', ...child.columns.map((c) => q(c.name))];
|
|
846
|
+
await port.execute(`DROP TABLE IF EXISTS ${childStagingTable}`, []);
|
|
847
|
+
await port.execute(`CREATE TABLE ${childStagingTable} (${childColDefs.join(', ')})`, []);
|
|
848
|
+
const childInserter = await port.createBulkInserter(childStagingTable, childAllCols);
|
|
870
849
|
for (const rec of recs) {
|
|
871
|
-
const
|
|
872
|
-
if (!
|
|
850
|
+
const items = rec.record[child.fieldName];
|
|
851
|
+
if (!Array.isArray(items))
|
|
873
852
|
continue;
|
|
874
|
-
|
|
875
|
-
continue;
|
|
876
|
-
if (branch.isArray && branch.arrayField) {
|
|
877
|
-
const items = resolveBranchData(unionValue, branch)[branch.arrayField];
|
|
878
|
-
if (!Array.isArray(items))
|
|
879
|
-
continue;
|
|
880
|
-
for (const item of items) {
|
|
881
|
-
try {
|
|
882
|
-
const values = [rec.uri, rec.did];
|
|
883
|
-
for (const col of branch.columns) {
|
|
884
|
-
values.push(resolveRawColumnValue(col, item));
|
|
885
|
-
}
|
|
886
|
-
branchInserter.append(values);
|
|
887
|
-
}
|
|
888
|
-
catch {
|
|
889
|
-
// Skip bad items
|
|
890
|
-
}
|
|
891
|
-
}
|
|
892
|
-
}
|
|
893
|
-
else {
|
|
853
|
+
for (const item of items) {
|
|
894
854
|
try {
|
|
895
|
-
const branchData = resolveBranchData(unionValue, branch);
|
|
896
855
|
const values = [rec.uri, rec.did];
|
|
897
|
-
for (const col of
|
|
898
|
-
values.push(resolveRawColumnValue(col,
|
|
856
|
+
for (const col of child.columns) {
|
|
857
|
+
values.push(resolveRawColumnValue(col, item));
|
|
899
858
|
}
|
|
900
|
-
|
|
859
|
+
childInserter.append(values);
|
|
901
860
|
}
|
|
902
861
|
catch {
|
|
903
|
-
// Skip bad
|
|
862
|
+
// Skip bad items
|
|
904
863
|
}
|
|
905
864
|
}
|
|
906
865
|
}
|
|
907
|
-
await
|
|
908
|
-
// Delete existing
|
|
866
|
+
await childInserter.close();
|
|
867
|
+
// Delete existing child rows for these URIs, then merge staging
|
|
909
868
|
const uriPlaceholders = recs.map((_, i) => `$${i + 1}`).join(',');
|
|
910
|
-
await port.execute(`DELETE FROM ${
|
|
911
|
-
const
|
|
912
|
-
const col =
|
|
869
|
+
await port.execute(`DELETE FROM ${child.tableName} WHERE parent_uri IN (${uriPlaceholders})`, recs.map((r) => r.uri));
|
|
870
|
+
const childSelectCols = childAllCols.map((name) => {
|
|
871
|
+
const col = child.columns.find((c) => q(c.name) === name);
|
|
913
872
|
if (col && (col.sqlType === 'TIMESTAMP' || col.sqlType === 'TIMESTAMPTZ')) {
|
|
914
873
|
return `${dialect.tryCastTimestamp(name)} AS ${name}`;
|
|
915
874
|
}
|
|
916
875
|
return name;
|
|
917
876
|
});
|
|
918
|
-
await port.execute(`INSERT INTO ${
|
|
919
|
-
await port.execute(`DROP TABLE ${
|
|
877
|
+
await port.execute(`INSERT INTO ${child.tableName} (${childAllCols.join(', ')}) SELECT ${childSelectCols.join(', ')} FROM ${childStagingTable} WHERE parent_uri IS NOT NULL`, []);
|
|
878
|
+
await port.execute(`DROP TABLE ${childStagingTable}`, []);
|
|
879
|
+
}
|
|
880
|
+
// Populate union branch tables
|
|
881
|
+
for (const union of schema.unions) {
|
|
882
|
+
for (const branch of union.branches) {
|
|
883
|
+
const branchStagingTable = stagingName(`__${toSnakeCase(union.fieldName)}_${branch.branchName}`);
|
|
884
|
+
const branchColDefs = [
|
|
885
|
+
'parent_uri TEXT',
|
|
886
|
+
'parent_did TEXT',
|
|
887
|
+
...branch.columns.map((c) => {
|
|
888
|
+
const t = c.sqlType;
|
|
889
|
+
return `${q(c.name)} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
890
|
+
}),
|
|
891
|
+
];
|
|
892
|
+
const branchAllCols = ['parent_uri', 'parent_did', ...branch.columns.map((c) => q(c.name))];
|
|
893
|
+
await port.execute(`DROP TABLE IF EXISTS ${branchStagingTable}`, []);
|
|
894
|
+
await port.execute(`CREATE TABLE ${branchStagingTable} (${branchColDefs.join(', ')})`, []);
|
|
895
|
+
const branchInserter = await port.createBulkInserter(branchStagingTable, branchAllCols);
|
|
896
|
+
for (const rec of recs) {
|
|
897
|
+
const unionValue = rec.record[union.fieldName];
|
|
898
|
+
if (!unionValue || typeof unionValue !== 'object')
|
|
899
|
+
continue;
|
|
900
|
+
if (unionValue.$type !== branch.type)
|
|
901
|
+
continue;
|
|
902
|
+
if (branch.isArray && branch.arrayField) {
|
|
903
|
+
const items = resolveBranchData(unionValue, branch)[branch.arrayField];
|
|
904
|
+
if (!Array.isArray(items))
|
|
905
|
+
continue;
|
|
906
|
+
for (const item of items) {
|
|
907
|
+
try {
|
|
908
|
+
const values = [rec.uri, rec.did];
|
|
909
|
+
for (const col of branch.columns) {
|
|
910
|
+
values.push(resolveRawColumnValue(col, item));
|
|
911
|
+
}
|
|
912
|
+
branchInserter.append(values);
|
|
913
|
+
}
|
|
914
|
+
catch {
|
|
915
|
+
// Skip bad items
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
else {
|
|
920
|
+
try {
|
|
921
|
+
const branchData = resolveBranchData(unionValue, branch);
|
|
922
|
+
const values = [rec.uri, rec.did];
|
|
923
|
+
for (const col of branch.columns) {
|
|
924
|
+
values.push(resolveRawColumnValue(col, branchData));
|
|
925
|
+
}
|
|
926
|
+
branchInserter.append(values);
|
|
927
|
+
}
|
|
928
|
+
catch {
|
|
929
|
+
// Skip bad records
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
await branchInserter.close();
|
|
934
|
+
// Delete existing branch rows for these URIs, then merge staging
|
|
935
|
+
const uriPlaceholders = recs.map((_, i) => `$${i + 1}`).join(',');
|
|
936
|
+
await port.execute(`DELETE FROM ${branch.tableName} WHERE parent_uri IN (${uriPlaceholders})`, recs.map((r) => r.uri));
|
|
937
|
+
const branchSelectCols = branchAllCols.map((name) => {
|
|
938
|
+
const col = branch.columns.find((c) => q(c.name) === name);
|
|
939
|
+
if (col && (col.sqlType === 'TIMESTAMP' || col.sqlType === 'TIMESTAMPTZ')) {
|
|
940
|
+
return `${dialect.tryCastTimestamp(name)} AS ${name}`;
|
|
941
|
+
}
|
|
942
|
+
return name;
|
|
943
|
+
});
|
|
944
|
+
await port.execute(`INSERT INTO ${branch.tableName} (${branchAllCols.join(', ')}) SELECT ${branchSelectCols.join(', ')} FROM ${branchStagingTable} WHERE parent_uri IS NOT NULL`, []);
|
|
945
|
+
await port.execute(`DROP TABLE ${branchStagingTable}`, []);
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
finally {
|
|
950
|
+
// Drop on the error path too, so a failed batch leaves nothing behind.
|
|
951
|
+
for (const name of stagingTables) {
|
|
952
|
+
try {
|
|
953
|
+
await port.execute(`DROP TABLE IF EXISTS ${name}`, []);
|
|
954
|
+
}
|
|
955
|
+
catch { }
|
|
920
956
|
}
|
|
921
957
|
}
|
|
922
958
|
}
|
|
@@ -961,6 +997,16 @@ export async function queryRecords(collection, opts = {}) {
|
|
|
961
997
|
if (!schema)
|
|
962
998
|
throw new Error(`Unknown collection: ${collection}`);
|
|
963
999
|
const { limit = 20, cursor, filters, sort = 'indexed_at', order = 'desc' } = opts;
|
|
1000
|
+
// `order` is interpolated into the ORDER BY clause, not bound as a
|
|
1001
|
+
// parameter, so it has to be an exact match rather than a trusted caller
|
|
1002
|
+
// value — anything else is SQL reaching the engine verbatim.
|
|
1003
|
+
const direction = String(order).toUpperCase();
|
|
1004
|
+
if (direction !== 'ASC' && direction !== 'DESC')
|
|
1005
|
+
throw new Error(`Invalid sort order: ${order}`);
|
|
1006
|
+
// SQLite (and DuckDB) read a negative LIMIT as unbounded, so an unchecked
|
|
1007
|
+
// -1 returns the entire table.
|
|
1008
|
+
if (!Number.isInteger(limit) || limit < 1)
|
|
1009
|
+
throw new Error(`Invalid limit: ${limit}`);
|
|
964
1010
|
// Validate sort field exists
|
|
965
1011
|
const sortCol = sort === 'indexed_at' ? 'indexed_at' : schema.columns.find((c) => c.originalName === sort || c.name === sort);
|
|
966
1012
|
const sortName = typeof sortCol === 'string' ? sortCol : sortCol?.name;
|
|
@@ -973,7 +1019,7 @@ export async function queryRecords(collection, opts = {}) {
|
|
|
973
1019
|
if (cursor) {
|
|
974
1020
|
const parsed = unpackCursor(cursor);
|
|
975
1021
|
if (parsed) {
|
|
976
|
-
const op =
|
|
1022
|
+
const op = direction === 'DESC' ? '<' : '>';
|
|
977
1023
|
const pSort1 = `$${paramIdx++}`;
|
|
978
1024
|
const pSort2 = `$${paramIdx++}`;
|
|
979
1025
|
const pCid = `$${paramIdx++}`;
|
|
@@ -996,7 +1042,7 @@ export async function queryRecords(collection, opts = {}) {
|
|
|
996
1042
|
let sql = `SELECT t.*, r.handle FROM ${schema.tableName} t LEFT JOIN _repos r ON t.did = r.did WHERE (r.status IS NULL OR r.status != 'takendown')`;
|
|
997
1043
|
if (conditions.length)
|
|
998
1044
|
sql += ' AND ' + conditions.join(' AND ');
|
|
999
|
-
sql += ` ORDER BY t.${sortName} ${
|
|
1045
|
+
sql += ` ORDER BY t.${sortName} ${direction}, t.cid ${direction} LIMIT $${paramIdx++}`;
|
|
1000
1046
|
params.push(limit + 1); // fetch one extra for cursor
|
|
1001
1047
|
const rows = await all(sql, params);
|
|
1002
1048
|
const hasMore = rows.length > limit;
|
|
@@ -1355,6 +1401,22 @@ export async function getChildRows(childTableName, parentUris) {
|
|
|
1355
1401
|
}
|
|
1356
1402
|
return result;
|
|
1357
1403
|
}
|
|
1404
|
+
/**
|
|
1405
|
+
* Normalize one stored column back to its record value. JSON columns are
|
|
1406
|
+
* written with JSON.stringify on insert, so they have to be parsed on the way
|
|
1407
|
+
* out — on child and union-branch rows just as much as on the main table.
|
|
1408
|
+
*/
|
|
1409
|
+
function decodeColumn(col, raw) {
|
|
1410
|
+
const val = normalizeValue(raw);
|
|
1411
|
+
if (!col.isJson || typeof val !== 'string')
|
|
1412
|
+
return val;
|
|
1413
|
+
try {
|
|
1414
|
+
return JSON.parse(val);
|
|
1415
|
+
}
|
|
1416
|
+
catch {
|
|
1417
|
+
return val;
|
|
1418
|
+
}
|
|
1419
|
+
}
|
|
1358
1420
|
export function reshapeRow(row, childData, unionData) {
|
|
1359
1421
|
if (!row)
|
|
1360
1422
|
return null;
|
|
@@ -1404,8 +1466,7 @@ export function reshapeRow(row, childData, unionData) {
|
|
|
1404
1466
|
value[child.fieldName] = childRows.map((cr) => {
|
|
1405
1467
|
const item = {};
|
|
1406
1468
|
for (const col of child.columns) {
|
|
1407
|
-
|
|
1408
|
-
item[col.originalName] = normalizeValue(raw);
|
|
1469
|
+
item[col.originalName] = decodeColumn(col, cr[col.name]);
|
|
1409
1470
|
}
|
|
1410
1471
|
return item;
|
|
1411
1472
|
});
|
|
@@ -1429,7 +1490,7 @@ export function reshapeRow(row, childData, unionData) {
|
|
|
1429
1490
|
const items = branchRows.map((br) => {
|
|
1430
1491
|
const item = {};
|
|
1431
1492
|
for (const col of branch.columns) {
|
|
1432
|
-
item[col.originalName] =
|
|
1493
|
+
item[col.originalName] = decodeColumn(col, br[col.name]);
|
|
1433
1494
|
}
|
|
1434
1495
|
return item;
|
|
1435
1496
|
});
|
|
@@ -1441,7 +1502,7 @@ export function reshapeRow(row, childData, unionData) {
|
|
|
1441
1502
|
const br = branchRows[0];
|
|
1442
1503
|
const props = {};
|
|
1443
1504
|
for (const col of branch.columns) {
|
|
1444
|
-
props[col.originalName] =
|
|
1505
|
+
props[col.originalName] = decodeColumn(col, br[col.name]);
|
|
1445
1506
|
}
|
|
1446
1507
|
if (branch.wrapperField) {
|
|
1447
1508
|
value[union.fieldName] = { $type: branch.type, [branch.wrapperField]: props };
|
package/dist/database/dialect.js
CHANGED
|
@@ -16,7 +16,7 @@ export const DUCKDB_DIALECT = {
|
|
|
16
16
|
upsertPrefix: 'INSERT OR REPLACE INTO',
|
|
17
17
|
jsonExtractString: (col, path) => `json_extract_string(${col}, '${path}')`,
|
|
18
18
|
jsonArrayStringAgg: (col, path) => `list_string_agg(json_extract_string(${col}, '${path}'))`,
|
|
19
|
-
listTablesQuery: `SELECT table_name FROM information_schema.tables WHERE table_schema = 'main' AND table_name NOT LIKE '\\_%' ESCAPE '
|
|
19
|
+
listTablesQuery: `SELECT table_name FROM information_schema.tables WHERE table_schema = 'main' AND table_name NOT LIKE '\\_%' ESCAPE '\\'`,
|
|
20
20
|
checkpointSQL: 'CHECKPOINT',
|
|
21
21
|
currentTimestamp: 'CURRENT_TIMESTAMP',
|
|
22
22
|
ilike: 'ILIKE',
|
|
@@ -48,7 +48,7 @@ export const SQLITE_DIALECT = {
|
|
|
48
48
|
jsonArrayStringAgg: (col, path) => {
|
|
49
49
|
return `(SELECT group_concat(je.value, ' ') FROM json_each(${col}, '${path}') je)`;
|
|
50
50
|
},
|
|
51
|
-
listTablesQuery: `SELECT name AS table_name FROM sqlite_master WHERE type='table' AND name NOT LIKE '\\_%' ESCAPE '
|
|
51
|
+
listTablesQuery: `SELECT name AS table_name FROM sqlite_master WHERE type='table' AND name NOT LIKE '\\_%' ESCAPE '\\'`,
|
|
52
52
|
checkpointSQL: null,
|
|
53
53
|
currentTimestamp: 'CURRENT_TIMESTAMP',
|
|
54
54
|
ilike: 'LIKE',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fts.d.ts","sourceRoot":"","sources":["../../src/database/fts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAuE5C,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAE3D;AAED,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAEjD;AAWD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAE7D;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAElE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvD;
|
|
1
|
+
{"version":3,"file":"fts.d.ts","sourceRoot":"","sources":["../../src/database/fts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAuE5C,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAE3D;AAED,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAEjD;AAWD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAE7D;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAElE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvD;AAqFD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBrE;AAED,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAehH;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAepF;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpF;AAokBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B5E"}
|
package/dist/database/fts.js
CHANGED
|
@@ -102,14 +102,18 @@ function computeFtsSchema(collection) {
|
|
|
102
102
|
const selectExprs = ['t.uri', 't.cid', 't.did', 't.indexed_at'];
|
|
103
103
|
const searchColNames = [];
|
|
104
104
|
for (const col of schema.columns) {
|
|
105
|
+
// A blob column holds {ref, mimeType, size} metadata — no searchable text.
|
|
106
|
+
// This has to be decided on isJson, not on sqlType: SQLite's jsonType is
|
|
107
|
+
// TEXT, so a blob column would otherwise fall into the plain-TEXT branch
|
|
108
|
+
// below and be indexed as raw JSON.
|
|
109
|
+
if (col.isJson && record?.properties?.[col.originalName]?.type === 'blob')
|
|
110
|
+
continue;
|
|
105
111
|
if (col.sqlType === 'TEXT') {
|
|
106
112
|
selectExprs.push(`t.${q(col.name)}`);
|
|
107
113
|
searchColNames.push(col.name);
|
|
108
114
|
}
|
|
109
115
|
else if (col.isJson && record?.properties) {
|
|
110
116
|
const prop = record.properties[col.originalName];
|
|
111
|
-
if (prop?.type === 'blob')
|
|
112
|
-
continue; // skip blobs
|
|
113
117
|
if (prop && lexicon) {
|
|
114
118
|
const derived = jsonSearchColumns(`t.${q(col.name)}`, prop, lexicon, dialect);
|
|
115
119
|
if (derived.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/database/schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG9C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,QAAQ,EAAE,gBAAgB,EAAE,CAAA;IAC5B,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;CACrB;AAGD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAGD,wBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtC;AA+CD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CASlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,CASxE;AAID,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAI9D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS,CAExD;AAED,wBAAgB,cAAc,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC,CAEtE;AAED,iFAAiF;AACjF,wBAAgB,eAAe,IAAI,GAAG,EAAE,CAEvC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/database/schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG9C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,QAAQ,EAAE,gBAAgB,EAAE,CAAA;IAC5B,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;CACrB;AAGD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAGD,wBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtC;AA+CD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CASlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,CASxE;AAID,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAI9D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS,CAExD;AAED,wBAAgB,cAAc,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC,CAEtE;AAED,iFAAiF;AACjF,wBAAgB,eAAe,IAAI,GAAG,EAAE,CAEvC;AA8HD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,GAAG,EACZ,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,OAAO,GAAE,UAA2B,GACnC,WAAW,CA+Gb;AAGD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,UAA2B,GAAG,MAAM,CAsExG;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,GAAE,UAA2B,GACnC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BrD"}
|
package/dist/database/schema.js
CHANGED
|
@@ -158,7 +158,10 @@ function resolveUnionBranch(ref, collection, fieldName, defs, lexicons, dialect)
|
|
|
158
158
|
let arrayField;
|
|
159
159
|
let wrapperField;
|
|
160
160
|
let propSource = branchDef.properties;
|
|
161
|
-
|
|
161
|
+
// `required` has to travel with propSource: once the columns come from the
|
|
162
|
+
// item (or wrapper target) def, the outer branch's `required` describes the
|
|
163
|
+
// wrapper property, not these columns.
|
|
164
|
+
let branchRequired = new Set(branchDef.required || []);
|
|
162
165
|
// Check for single-property wrapper patterns
|
|
163
166
|
const propEntries = Object.entries(branchDef.properties);
|
|
164
167
|
if (propEntries.length === 1) {
|
|
@@ -171,6 +174,7 @@ function resolveUnionBranch(ref, collection, fieldName, defs, lexicons, dialect)
|
|
|
171
174
|
isArray = true;
|
|
172
175
|
arrayField = onlyField;
|
|
173
176
|
propSource = itemDef.properties;
|
|
177
|
+
branchRequired = new Set(itemDef.required || []);
|
|
174
178
|
}
|
|
175
179
|
}
|
|
176
180
|
else if (onlyProp.type === 'ref' && onlyProp.ref) {
|
|
@@ -179,6 +183,7 @@ function resolveUnionBranch(ref, collection, fieldName, defs, lexicons, dialect)
|
|
|
179
183
|
if (refDef?.type === 'object' && refDef.properties) {
|
|
180
184
|
wrapperField = onlyField;
|
|
181
185
|
propSource = refDef.properties;
|
|
186
|
+
branchRequired = new Set(refDef.required || []);
|
|
182
187
|
}
|
|
183
188
|
}
|
|
184
189
|
}
|