@finbheara/archive-client 0.24.0 → 0.26.0

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/cli.js CHANGED
@@ -21,7 +21,7 @@ import {
21
21
  latestCheck2,
22
22
  within,
23
23
  staleWarning2
24
- } from "./chunks/index-vsk6837c.js";
24
+ } from "./chunks/index-8mwx3n9j.js";
25
25
  import"./chunks/index-hghdy980.js";
26
26
 
27
27
  var USAGE_HEADER = "usage: idq <verb> [--cache <dir>] [--repo <owner/name>] [--json] [--live]";
@@ -285,6 +285,61 @@ var VERBS = [
285
285
  " or later (default 3)"
286
286
  ]
287
287
  },
288
+ {
289
+ verb: "tabs",
290
+ value: ["--release", "--comp", "--address", "--round", "--event", "--year", "--tier"],
291
+ bool: ["--stream"],
292
+ usage: [
293
+ " tabs [--release <spec>] --comp <competition> | --address <address> [--round <r>]",
294
+ " a marks sheet (or one card of it): every seat's mark,",
295
+ " place and points, with the judge",
296
+ " tabs --stream [--release <spec>] [--comp <c,...>] [--event <e,...>]",
297
+ " [--year <y> | --year <from>..<to>] [--tier <t,...>]",
298
+ " every cell of every sheet named, one JSON line each"
299
+ ]
300
+ },
301
+ {
302
+ verb: "panels",
303
+ value: ["--release", "--comp"],
304
+ bool: [],
305
+ usage: [
306
+ " panels [--release <spec>] [--comp <competition>]",
307
+ " who sat a major's competition (every one's, with no --comp)"
308
+ ]
309
+ },
310
+ {
311
+ verb: "feis-panels",
312
+ value: ["--release", "--address", "--platform"],
313
+ bool: [],
314
+ usage: [
315
+ " feis-panels [--release <spec>] [--address <feis competition>] [--platform <p>]",
316
+ " who sat a feis's competition (fweb:ABC24.105)"
317
+ ]
318
+ },
319
+ {
320
+ verb: "register",
321
+ value: ["--release", "--year", "--td"],
322
+ bool: [],
323
+ usage: [
324
+ " register [--release <spec>] [--year <y>] [--td <TD number>]",
325
+ " the adjudicator register's rows: category, country,",
326
+ " region, geohash, per year"
327
+ ]
328
+ },
329
+ {
330
+ verb: "schools",
331
+ value: ["--release", "--event", "--year", "--school"],
332
+ bool: ["--prints", "--redirects", "--lineage", "--associations"],
333
+ usage: [
334
+ " schools [--release <spec>] every school the registry lists: display, regions, places",
335
+ " schools --prints [--release <spec>] [--event <e>] [--year <y>]",
336
+ " the (print, school_id) pairs the rows attach, per event-year",
337
+ " schools --redirects | --lineage [--release <spec>]",
338
+ " the retired ids; the lineage edges",
339
+ " schools --associations [--release <spec>] [--school <school_id>]",
340
+ " the people a directory lists beside a school"
341
+ ]
342
+ },
288
343
  {
289
344
  verb: "teams",
290
345
  value: ["--release", "--event", "--year"],
@@ -305,6 +360,32 @@ var VERBS = [
305
360
  " each event-year's dates and place"
306
361
  ]
307
362
  },
363
+ {
364
+ verb: "upcoming",
365
+ value: [
366
+ "--release",
367
+ "--state",
368
+ "--feis",
369
+ "--from",
370
+ "--to",
371
+ "--entrants",
372
+ "--version",
373
+ "--brand"
374
+ ],
375
+ bool: ["--feises"],
376
+ usage: [
377
+ " upcoming [--release <spec>] [--state pending,results,passed,withdrawn] [--feis <id>]",
378
+ " [--from <date>] [--to <date>]",
379
+ " the competitor lists' fields, each with its state, version",
380
+ " and competition reading; --feis a feis, series or",
381
+ " occurrence id",
382
+ " upcoming --entrants <field_id> [--version <capture id>]",
383
+ " a field's rows (default its current version): each",
384
+ " registrant's arm and candidates",
385
+ " upcoming --feises [--state upcoming|no-results] [--brand <series>] [--from <date>] [--to <date>]",
386
+ " the feis-index's occurrences the release holds no results of"
387
+ ]
388
+ },
308
389
  {
309
390
  verb: "teacher",
310
391
  value: ["--release"],
@@ -662,6 +743,27 @@ function streamQueryOf(p) {
662
743
  q.primary = true;
663
744
  return q;
664
745
  }
746
+ function tabStreamQueryOf(p) {
747
+ const q = {};
748
+ const comp = p.flags.get("--comp");
749
+ if (comp !== undefined)
750
+ q.competition = listOf(comp);
751
+ const event = p.flags.get("--event");
752
+ if (event !== undefined)
753
+ q.event = listOf(event);
754
+ const tier = p.flags.get("--tier");
755
+ if (tier !== undefined)
756
+ q.tier = listOf(tier);
757
+ const year = p.flags.get("--year");
758
+ if (year !== undefined) {
759
+ const m = /^(\d{4})\.\.(\d{4})$/.exec(year);
760
+ q.year = m === null ? Number(year) : [Number(m[1]), Number(m[2])];
761
+ if (typeof q.year === "number" && !Number.isInteger(q.year))
762
+ throw new Error(`--year takes a year or <from>..<to>, not "${year}"`);
763
+ }
764
+ return q;
765
+ }
766
+ var tabLine = (t) => ` ${t.address} ${t.round} seat ${t.seat_index}/${t.panel_size} ${t.judge_clrg ?? t.judge_id ?? "-"} ${t.judge_name_printed ?? "-"} mark ${t.mark_printed ?? "-"} place ${t.place_printed ?? "-"}${t.tie === 1 ? "=" : ""} points ${t.points_printed ?? "-"}`;
665
767
  function eventYearOf(p) {
666
768
  const event = p.flags.get("--event");
667
769
  const year = p.flags.get("--year");
@@ -683,8 +785,14 @@ var ANSWERING = new Set([
683
785
  "records",
684
786
  "feis-dates",
685
787
  "tabulated",
788
+ "tabs",
789
+ "panels",
790
+ "feis-panels",
791
+ "register",
792
+ "schools",
686
793
  "teams",
687
794
  "events",
795
+ "upcoming",
688
796
  "teacher",
689
797
  "adjudicator",
690
798
  "comp",
@@ -951,7 +1059,7 @@ async function main(argv, io = {}) {
951
1059
  say(` ${i.year ?? "?"} ${i.date_lo ?? "?"} ${i.feis_ids.join(", ")}`);
952
1060
  }
953
1061
  if (a.arm === "unique")
954
- say(` next: ${a.next === null ? `unknown (${a.next_why ?? ""})` : `${a.next.feis_id ?? "?"} ${a.next.date}`}`);
1062
+ say(` next: ${a.next === null ? `unknown (${a.next_why ?? ""})` : `${a.next.feis_id ?? "?"} ${a.next.date} ${a.next.occurrence_id} (${a.next.hosts.map((h) => h.source).join(",")}; ${a.next.series_basis})`}`);
955
1063
  });
956
1064
  rel.close();
957
1065
  return a.arm === "none" ? 1 : 0;
@@ -1163,6 +1271,145 @@ async function main(argv, io = {}) {
1163
1271
  rel.close();
1164
1272
  }
1165
1273
  }
1274
+ case "tabs": {
1275
+ const stream = p.bools.has("--stream");
1276
+ const tq = stream ? tabStreamQueryOf(p) : null;
1277
+ const comp = p.flags.get("--comp");
1278
+ const address = p.flags.get("--address");
1279
+ if (!stream && comp === undefined && address === undefined) {
1280
+ log("tabs --comp <competition> | --address <address> [--round <r>], or tabs --stream");
1281
+ return 2;
1282
+ }
1283
+ const rel = await open(spec, { ...opts, assets: [] });
1284
+ try {
1285
+ if (tq !== null) {
1286
+ let n = 0;
1287
+ for await (const t of rel.tabs.stream(tq)) {
1288
+ say(JSON.stringify(t));
1289
+ n++;
1290
+ }
1291
+ log(`${n} cell(s) in ${rel.tag}`);
1292
+ return n === 0 ? 1 : 0;
1293
+ }
1294
+ const round = p.flags.get("--round");
1295
+ const a = await rel.tabs.query({
1296
+ ...address !== undefined ? { address } : { competition: comp },
1297
+ ...round !== undefined ? { round } : {}
1298
+ });
1299
+ out(a, () => {
1300
+ for (const t of a.rows)
1301
+ say(tabLine(t));
1302
+ say(`${a.rows.length} cell(s) in ${a.tag}`);
1303
+ });
1304
+ return a.rows.length === 0 ? 1 : 0;
1305
+ } finally {
1306
+ rel.close();
1307
+ }
1308
+ }
1309
+ case "panels": {
1310
+ const rel = await open(spec, { ...opts, assets: [] });
1311
+ try {
1312
+ const comp = p.flags.get("--comp");
1313
+ const a = await rel.panels.query(comp !== undefined ? { competition: comp } : {});
1314
+ out(a, () => {
1315
+ for (const s of a.seats)
1316
+ say(` ${s.competition} ${s.panel} ${s.round} seat ${s.seat_index} ${s.judge_clrg ?? s.judge_id ?? "-"} ${s.judge_name_printed ?? "-"}${s.judge_unmatched === null ? "" : ` (${s.judge_unmatched})`}`);
1317
+ say(`${a.seats.length} seat(s) in ${a.tag}`);
1318
+ });
1319
+ return a.seats.length === 0 ? 1 : 0;
1320
+ } finally {
1321
+ rel.close();
1322
+ }
1323
+ }
1324
+ case "feis-panels": {
1325
+ const rel = await open(spec, { ...opts, assets: [] });
1326
+ try {
1327
+ const address = p.flags.get("--address");
1328
+ const platform = p.flags.get("--platform");
1329
+ const a = await rel.feisPanels.query({
1330
+ ...address !== undefined ? { address } : {},
1331
+ ...platform !== undefined ? { platform } : {}
1332
+ });
1333
+ out(a, () => {
1334
+ for (const s of a.seats)
1335
+ say(` ${s.address} ${s.round} seat ${s.seat_index}/${s.panel_size} ${s.judge_clrg ?? s.judge_id ?? "-"} ${s.judge_name_printed}${s.judge_basis === null ? "" : ` (${s.judge_basis})`}`);
1336
+ say(`${a.seats.length} seat(s) in ${a.tag}`);
1337
+ });
1338
+ return a.seats.length === 0 ? 1 : 0;
1339
+ } finally {
1340
+ rel.close();
1341
+ }
1342
+ }
1343
+ case "register": {
1344
+ const rel = await open(spec, { ...opts, assets: [] });
1345
+ try {
1346
+ const year = p.flags.get("--year");
1347
+ const td = p.flags.get("--td");
1348
+ const a = await rel.staff.adjudicators({
1349
+ ...year !== undefined ? { year: Number(year) } : {},
1350
+ ...td !== undefined ? { judge_clrg: Number(td) } : {}
1351
+ });
1352
+ out(a, () => {
1353
+ for (const r of a.rows)
1354
+ say(` ${r.judge_clrg} ${r.year} ${r.cat} ${r.name_printed} ${r.country_code ?? r.country} ${r.region_code ?? r.region} ${r.geohash ?? "-"}`);
1355
+ say(`${a.rows.length} register row(s) in ${a.tag}`);
1356
+ });
1357
+ return a.rows.length === 0 ? 1 : 0;
1358
+ } finally {
1359
+ rel.close();
1360
+ }
1361
+ }
1362
+ case "schools": {
1363
+ const rel = await open(spec, { ...opts, assets: [] });
1364
+ try {
1365
+ if (p.bools.has("--prints")) {
1366
+ const a = await rel.schools.prints(eventYearOf(p));
1367
+ out(a, () => {
1368
+ for (const x of a.prints)
1369
+ say(` ${x.year ?? "?"} ${x.event} ${x.school_id} "${x.print}" ${x.rows} rows`);
1370
+ say(`${a.prints.length} pair(s) in ${a.tag}`);
1371
+ });
1372
+ return a.prints.length === 0 ? 1 : 0;
1373
+ }
1374
+ if (p.bools.has("--redirects")) {
1375
+ const a = await rel.schools.redirects();
1376
+ out(a, () => {
1377
+ for (const r of a.redirects)
1378
+ say(` ${r.old_id} -> ${r.new_id} ${r.kind}${r.since === null ? "" : ` since ${r.since}`}`);
1379
+ say(`${a.redirects.length} redirect(s) in ${a.tag}`);
1380
+ });
1381
+ return a.redirects.length === 0 ? 1 : 0;
1382
+ }
1383
+ if (p.bools.has("--lineage")) {
1384
+ const a = await rel.schools.lineage();
1385
+ out(a, () => {
1386
+ for (const e of a.edges)
1387
+ say(` ${e.id} ${e.direction} ${e.other} ${e.shape} ${e.year ?? "?"}${e.provisional ? " provisional" : ""}`);
1388
+ say(`${a.edges.length} edge end(s) in ${a.tag}`);
1389
+ });
1390
+ return a.edges.length === 0 ? 1 : 0;
1391
+ }
1392
+ if (p.bools.has("--associations")) {
1393
+ const school = p.flags.get("--school");
1394
+ const a = await rel.schools.associations(school !== undefined ? { school_id: school } : {});
1395
+ out(a, () => {
1396
+ for (const x of a.associations)
1397
+ say(` ${x.school_id ?? "(no id)"} "${x.school_printed ?? ""}" ${x.person_printed} (${x.person_type ?? "-"}${x.credentials === null ? "" : `, ${x.credentials}`}) ${x.date ?? "-"} ${x.src_type ?? ""}`);
1398
+ say(`${a.associations.length} association(s) in ${a.tag}`);
1399
+ });
1400
+ return a.associations.length === 0 ? 1 : 0;
1401
+ }
1402
+ const a = await rel.schools.list();
1403
+ out(a, () => {
1404
+ for (const s of a.schools)
1405
+ say(` ${s.school_id} ${s.display} ${s.regions.join(",") || "-"} ${s.places.join(",") || "-"}`);
1406
+ say(`${a.schools.length} school(s) in ${a.tag}`);
1407
+ });
1408
+ return a.schools.length === 0 ? 1 : 0;
1409
+ } finally {
1410
+ rel.close();
1411
+ }
1412
+ }
1166
1413
  case "teams": {
1167
1414
  const rel = await open(spec, { ...opts, assets: [] });
1168
1415
  try {
@@ -1213,6 +1460,60 @@ async function main(argv, io = {}) {
1213
1460
  rel.close();
1214
1461
  }
1215
1462
  }
1463
+ case "upcoming": {
1464
+ const rel = await open(spec, { ...opts, assets: [] });
1465
+ try {
1466
+ const from = p.flags.get("--from");
1467
+ const to = p.flags.get("--to");
1468
+ const range = {
1469
+ ...from !== undefined ? { from } : {},
1470
+ ...to !== undefined ? { to } : {}
1471
+ };
1472
+ const state = p.flags.get("--state");
1473
+ const fieldId = p.flags.get("--entrants");
1474
+ if (fieldId !== undefined) {
1475
+ const version = p.flags.get("--version");
1476
+ const a = await rel.upcoming.entrants({
1477
+ field_id: fieldId,
1478
+ ...version !== undefined ? { version } : {}
1479
+ });
1480
+ out(a, () => {
1481
+ for (const e of a.entrants)
1482
+ say(` ${e.arm ?? "-"} ${e.candidates.map((c) => c.dancer_id).join(",") || "-"} "${e.name_printed ?? ""}" ${e.school_id ?? "(no id)"} "${e.school_printed ?? ""}"${e.flags.length > 0 ? ` [${e.flags.join(",")}]` : ""}`);
1483
+ say(`${a.entrants.length} row(s) of ${a.field?.field_id ?? fieldId} version ${a.version ?? "-"}${a.why !== undefined ? ` (${a.why})` : ""} in ${a.tag}`);
1484
+ });
1485
+ return a.entrants.length === 0 ? 1 : 0;
1486
+ }
1487
+ if (p.bools.has("--feises")) {
1488
+ const brand = p.flags.get("--brand");
1489
+ const a = await rel.upcoming.feises({
1490
+ ...state !== undefined ? { state } : {},
1491
+ ...brand !== undefined ? { brand } : {},
1492
+ ...range
1493
+ });
1494
+ out(a, () => {
1495
+ for (const f of a.feises)
1496
+ say(` ${f.date_lo} ${f.occurrence_id} "${f.name_printed}" ${f.feis_brand_id ?? "(no series)"} (${f.series_basis}) ${f.hosts.map((h) => h.feis_id ?? `${h.source}:${h.host_id}`).join(", ")} [${f.state}]`);
1497
+ say(`${a.feises.length} feis occurrence(s) in ${a.tag}`);
1498
+ });
1499
+ return a.feises.length === 0 ? 1 : 0;
1500
+ }
1501
+ const feis = p.flags.get("--feis");
1502
+ const a = await rel.upcoming.fields({
1503
+ ...state !== undefined ? { state: state.split(",") } : {},
1504
+ ...feis !== undefined ? { feis } : {},
1505
+ ...range
1506
+ });
1507
+ out(a, () => {
1508
+ for (const f of a.fields)
1509
+ say(` ${f.date_lo ?? "?"} ${f.field_id} ${f.state} ${f.entrants} row(s) v${f.version} ${f.feis_brand_id ?? "(no series)"} ${f.comp === null ? "" : f.comp.arm === "none" ? "comp unread" : `${f.comp.level ?? "?"} ${f.comp.age ?? "?"} ${f.comp.population ?? ""}`}`);
1510
+ say(`${a.fields.length} field(s) in ${a.tag}`);
1511
+ });
1512
+ return a.fields.length === 0 ? 1 : 0;
1513
+ } finally {
1514
+ rel.close();
1515
+ }
1516
+ }
1216
1517
  case "teacher":
1217
1518
  case "adjudicator": {
1218
1519
  if (rest.length === 0) {
@@ -1320,5 +1621,6 @@ export {
1320
1621
  parseArgs,
1321
1622
  renderUsage,
1322
1623
  streamQueryOf,
1624
+ tabStreamQueryOf,
1323
1625
  valueFlags
1324
1626
  };
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ import {
7
7
  NAME_LEVELS2,
8
8
  nameLevel2,
9
9
  NO_CALENDAR2,
10
+ NO_UPCOMING2,
10
11
  FeisFinder2,
11
12
  ADVANCEMENT_DANCES2,
12
13
  entryRank2,
@@ -24,6 +25,9 @@ import {
24
25
  syllabusSourceOf2,
25
26
  canonicalOf2,
26
27
  CompResolver2,
28
+ TabFinder2,
29
+ PanelFinder2,
30
+ FeisPanelFinder2,
27
31
  StaffFinder2,
28
32
  TeamFinder2,
29
33
  EventFinder2,
@@ -46,6 +50,8 @@ import {
46
50
  FEATURES2,
47
51
  capabilityOf2,
48
52
  needsRelease2,
53
+ FIELD_STATES2,
54
+ UpcomingFinder2,
49
55
  resolveTag2,
50
56
  Release2,
51
57
  openRelease2,
@@ -68,7 +74,7 @@ import {
68
74
  readLatestCheck2,
69
75
  latestCheck2,
70
76
  staleWarning2
71
- } from "./chunks/index-vsk6837c.js";
77
+ } from "./chunks/index-8mwx3n9j.js";
72
78
  import {
73
79
  cacheRoot2,
74
80
  repoOf2
@@ -92,7 +98,9 @@ export {
92
98
  EventFinder2 as EventFinder,
93
99
  FEATURES2 as FEATURES,
94
100
  FEIS_LOCAL_ID_FLOOR2 as FEIS_LOCAL_ID_FLOOR,
101
+ FIELD_STATES2 as FIELD_STATES,
95
102
  FeisFinder2 as FeisFinder,
103
+ FeisPanelFinder2 as FeisPanelFinder,
96
104
  LATEST_CHECK_BUDGET_MS2 as LATEST_CHECK_BUDGET_MS,
97
105
  LATEST_CHECK_MS2 as LATEST_CHECK_MS,
98
106
  LINEAGE_FILE2 as LINEAGE_FILE,
@@ -100,13 +108,17 @@ export {
100
108
  MajorsFinder2 as MajorsFinder,
101
109
  NAME_LEVELS2 as NAME_LEVELS,
102
110
  NO_CALENDAR2 as NO_CALENDAR,
111
+ NO_UPCOMING2 as NO_UPCOMING,
112
+ PanelFinder2 as PanelFinder,
103
113
  RegistrationResolver2 as RegistrationResolver,
104
114
  Release2 as Release,
105
115
  ReleaseManager2 as ReleaseManager,
106
116
  ResultFinder2 as ResultFinder,
107
117
  SchoolResolver2 as SchoolResolver,
108
118
  StaffFinder2 as StaffFinder,
119
+ TabFinder2 as TabFinder,
109
120
  TeamFinder2 as TeamFinder,
121
+ UpcomingFinder2 as UpcomingFinder,
110
122
  buildIndex2 as buildIndex,
111
123
  buildTag2 as buildTag,
112
124
  cacheRoot2 as cacheRoot,
@@ -3,6 +3,7 @@ import { type FreshnessFloor } from "./freshness.js";
3
3
  import { type LocalBuild } from "./local.js";
4
4
  import type { OpenOptions } from "./release.js";
5
5
  import type { StreamQuery } from "./stream.js";
6
+ import type { TabStreamQuery } from "./tabs.js";
6
7
  export { GLOBAL_FLAGS, USAGE_FOOTER, USAGE_HEADER, VERBS, type VerbSpec, renderUsage, valueFlags, } from "./cli-spec.js";
7
8
  export declare const USAGE: string;
8
9
  export interface Parsed {
@@ -20,6 +21,7 @@ type Line<T> = {
20
21
  };
21
22
  export declare function jsonLines<T>(text: string, check: (v: T) => string | null): Line<T>[];
22
23
  export declare function streamQueryOf(p: Parsed): StreamQuery;
24
+ export declare function tabStreamQueryOf(p: Parsed): TabStreamQuery;
23
25
  export interface LocalIO {
24
26
  builds: () => readonly LocalBuild[];
25
27
  }
@@ -1,5 +1,6 @@
1
1
  import type { IndexBuilder } from "./indexes.js";
2
2
  import type { Release } from "./release.js";
3
+ import type { UpcomingHost } from "./upcoming.js";
3
4
  export interface Feis {
4
5
  feis_id: string;
5
6
  source: string;
@@ -53,6 +54,12 @@ export interface Series {
53
54
  export interface SeriesNext {
54
55
  feis_id: string | null;
55
56
  date: string;
57
+ date_hi: string | null;
58
+ occurrence_id: string;
59
+ name_printed: string;
60
+ hosts: UpcomingHost[];
61
+ captured_id: string;
62
+ series_basis: string;
56
63
  }
57
64
  export interface SeriesAnswer {
58
65
  tag: string;
@@ -74,6 +81,7 @@ export interface SeriesAnswer {
74
81
  why?: string;
75
82
  }
76
83
  export declare const NO_CALENDAR = "the release holds a feis-year once its results are captured and carries no calendar of scheduled feiseanna";
84
+ export declare const NO_UPCOMING = "the release's feis-index lists no occurrence of the series dated on or after the cut's day";
77
85
  export declare class FeisFinder {
78
86
  private readonly rel;
79
87
  constructor(rel: Release);
@@ -88,5 +96,6 @@ export declare class FeisFinder {
88
96
  find(q: FeisQuery): Promise<FeisAnswer>;
89
97
  codeStem(token: string, stem: string): Promise<string[]>;
90
98
  seriesOf(brand: string): Promise<Series>;
99
+ nextOf(brand: string): Promise<Pick<SeriesAnswer, "next" | "next_why">>;
91
100
  series(q: string): Promise<SeriesAnswer>;
92
101
  }
@@ -5,7 +5,7 @@ export { NAME_LEVELS, type NameLevel, nameLevel } from "./dancers-names.js";
5
5
  export { ADVANCEMENT_DANCES, type DancerGrades, type DancerLevelAnswer, type DancerLevelQuery, type LevelRange, } from "./dancer-level.js";
6
6
  export { type Comp, type CompAnswer, type CompDance, type CompKind, type CompQuery, CompResolver, type CompSource, type FeisPlace, type SyllabusAnswer, type SyllabusForAnswer, type SyllabusSource, type TitleCheck, canonicalOf, syllabusSourceOf, } from "./comps.js";
7
7
  export { type ClientOptions, cacheRoot, repoOf } from "./config.js";
8
- export { type Feis, type FeisAnswer, FeisFinder, type FeisQuery, NO_CALENDAR, type Series, type SeriesAnswer, type SeriesInstance, type SeriesNext, } from "./feises.js";
8
+ export { type Feis, type FeisAnswer, FeisFinder, type FeisQuery, NO_CALENDAR, NO_UPCOMING, type Series, type SeriesAnswer, type SeriesInstance, type SeriesNext, } from "./feises.js";
9
9
  export { type IndexBuilder, type IndexFile, buildIndex, defaultBuilders, ensureIndex, indexKey, indexPath, isCurrent, listIndexes, } from "./indexes.js";
10
10
  export { type CutVersion, LOCAL_DIR, type LocalBuild, type PickedBuild, buildTag, incomplete, localRoot, newerThan, openBuild, pickBuild, releaseVersion, sweepBuilds, } from "./local.js";
11
11
  export { type CachedRelease, DEFAULT_KEEP, type ReleaseList, ReleaseManager, type RemovalPlan, type UseResult, releases, } from "./manager.js";
@@ -16,10 +16,13 @@ export { type Remote, type RemoteAsset, fallbackRemote, ghRemote, httpsRemote, s
16
16
  export { type OpenOptions, Release, openCached, openRelease, resolveTag, } from "./release.js";
17
17
  export { type MajorCompetition, type MajorEvent, MajorsFinder, type ResultAnswer, ResultFinder, type ResultQuery, type ResultRow, } from "./results.js";
18
18
  export { type DancerAnswerLike, type DancerQueryLike, type DancerResolverLike, type DancerUnavailable, type RegistrationRow, type ResolvedDancer, RegistrationResolver, type ResolvedRegistration, dancerResolverOf, youngest, } from "./registrations.js";
19
+ export type { LineageEdge, ObservedAssociation, RegistrySchool, SchoolPrint, SchoolRedirect, } from "./school-bulk.js";
19
20
  export { type SchoolAnswer, type SchoolCandidate, type SchoolQuery, SchoolResolver, type SchoolRung, readsSpanishNames, type SpanishNames, } from "./schools.js";
20
21
  export { LINEAGE_FILE, type SchoolLineAnswer, type SchoolLinksAnswer, linksOfLineage, releaseSchoolGraph, } from "./school-links.js";
21
22
  export type { LineCandidate, LinkPath, LinkPolicy, LinkQuery, LinkStep, PathFlags, SchoolLink, StepFlags, StepPolicy, } from "@finbheara/domain/school-graph";
22
23
  export { type Capability, FEATURES, type Feature, type SchemaProbe, capabilityOf, columnsOf, needsRelease, } from "./schema.js";
23
24
  export { type EntryRow, type StreamQuery, type StreamRow, type StreamScope, entryRank, } from "./stream.js";
25
+ export { type FeisPanelSeat, FeisPanelFinder, PanelFinder, type PanelSeat, type RegisterRow, type TabAnswer, TabFinder, type TabQuery, type TabRow, type TabStreamQuery, } from "./tabs.js";
24
26
  export { EventFinder, type EventYear, type EventYearQuery, type ResultRoster, type RosterMember, type RosterTeam, TeamFinder, type TeamResult, } from "./teams.js";
27
+ export { type EntrantCandidate, FIELD_STATES, type FieldComp, type FieldState, type UpcomingEntrant, type UpcomingEntrantAnswer, type UpcomingEntrantQuery, type UpcomingFeis, type UpcomingFeisAnswer, type UpcomingFeisQuery, type UpcomingFeisState, type UpcomingField, type UpcomingFieldAnswer, type UpcomingFieldQuery, UpcomingFinder, type UpcomingHost, } from "./upcoming.js";
25
28
  export { ARCHIVE_TAG, type ArchiveTag, type ReleaseSpec, compareTagsNewestFirst, cutOf, parseArchiveTag, parseReleaseSpec, pickTag, renderArchiveTag, } from "./tag.js";
@@ -2,6 +2,7 @@ import { type StaffRole } from "@finbheara/domain/noun-index";
2
2
  import { type NameLevel } from "./dancers-names.js";
3
3
  import type { IndexBuilder } from "./indexes.js";
4
4
  import type { Release } from "./release.js";
5
+ import { type RegisterRow } from "./tabs.js";
5
6
  export interface Taught {
6
7
  school_id: string;
7
8
  school: string | null;
@@ -59,6 +60,17 @@ export declare class StaffFinder {
59
60
  constructor(rel: Release);
60
61
  teacher(asked: string): Promise<StaffAnswer>;
61
62
  adjudicator(asked: string): Promise<StaffAnswer>;
63
+ adjudicators(q?: {
64
+ year?: number;
65
+ judge_clrg?: number;
66
+ }): Promise<{
67
+ tag: string;
68
+ asked: {
69
+ year?: number;
70
+ judge_clrg?: number;
71
+ };
72
+ rows: RegisterRow[];
73
+ }>;
62
74
  private find;
63
75
  private person;
64
76
  private taughtWhere;
@@ -11,8 +11,10 @@ import { type Remote } from "./remote.js";
11
11
  import { MajorsFinder, ResultFinder } from "./results.js";
12
12
  import { type Capability } from "./schema.js";
13
13
  import { type SchoolReaderChoice, SchoolResolver } from "./schools.js";
14
+ import { FeisPanelFinder, PanelFinder, TabFinder } from "./tabs.js";
14
15
  import { type ReleaseSpec } from "./tag.js";
15
16
  import { EventFinder, TeamFinder } from "./teams.js";
17
+ import { UpcomingFinder } from "./upcoming.js";
16
18
  export interface OpenOptions extends ClientOptions {
17
19
  assets?: readonly string[];
18
20
  remote?: Remote;
@@ -44,6 +46,10 @@ export declare class Release {
44
46
  readonly registrations: RegistrationResolver;
45
47
  readonly teams: TeamFinder;
46
48
  readonly events: EventFinder;
49
+ readonly upcoming: UpcomingFinder;
50
+ readonly tabs: TabFinder;
51
+ readonly panels: PanelFinder;
52
+ readonly feisPanels: FeisPanelFinder;
47
53
  private readonly opts;
48
54
  private readonly handles;
49
55
  private remoteAssets;
@@ -0,0 +1,80 @@
1
+ import type { Release } from "./release.js";
2
+ export interface RegistrySchool {
3
+ school_id: string;
4
+ display: string;
5
+ regions: string[];
6
+ places: string[];
7
+ }
8
+ export interface SchoolPrint {
9
+ event: string;
10
+ year: number | null;
11
+ print: string;
12
+ school_id: string;
13
+ rows: number;
14
+ }
15
+ export interface SchoolRedirect {
16
+ old_id: string;
17
+ new_id: string;
18
+ kind: string;
19
+ since: number | null;
20
+ }
21
+ export interface LineageEdge {
22
+ id: string;
23
+ direction: string;
24
+ other: string;
25
+ shape: string;
26
+ year: number | null;
27
+ provisional: boolean;
28
+ decision: string | null;
29
+ confidence: number | null;
30
+ }
31
+ export interface ObservedAssociation {
32
+ at: string;
33
+ seq: number;
34
+ date: string | null;
35
+ person: string | null;
36
+ person_printed: string;
37
+ reading: string | null;
38
+ person_type: string | null;
39
+ credentials: string | null;
40
+ caption: string | null;
41
+ school_printed: string | null;
42
+ school_id: string | null;
43
+ association_type: string | null;
44
+ src_type: string | null;
45
+ src: string | null;
46
+ candidate_school_id: string | null;
47
+ candidate_rung: string | null;
48
+ }
49
+ export declare function registrySchools(rel: Release): Promise<{
50
+ tag: string;
51
+ schools: RegistrySchool[];
52
+ }>;
53
+ export declare function schoolPrints(rel: Release, q: {
54
+ event?: string;
55
+ year?: number;
56
+ }): Promise<{
57
+ tag: string;
58
+ asked: {
59
+ event?: string;
60
+ year?: number;
61
+ };
62
+ prints: SchoolPrint[];
63
+ }>;
64
+ export declare function schoolRedirects(rel: Release): Promise<{
65
+ tag: string;
66
+ redirects: SchoolRedirect[];
67
+ }>;
68
+ export declare function schoolLineage(rel: Release): Promise<{
69
+ tag: string;
70
+ edges: LineageEdge[];
71
+ }>;
72
+ export declare function observedAssociations(rel: Release, q: {
73
+ school_id?: string;
74
+ }): Promise<{
75
+ tag: string;
76
+ asked: {
77
+ school_id?: string;
78
+ };
79
+ associations: ObservedAssociation[];
80
+ }>;
@@ -1,6 +1,7 @@
1
1
  import { type SchoolNameParser } from "@finbheara/domain/school";
2
2
  import type { IndexBuilder } from "./indexes.js";
3
3
  import type { Release } from "./release.js";
4
+ import { type LineageEdge, type ObservedAssociation, type RegistrySchool, type SchoolPrint, type SchoolRedirect } from "./school-bulk.js";
4
5
  import { type LinkQuery, type SchoolLineAnswer, type SchoolLinksAnswer } from "./school-links.js";
5
6
  export type SchoolRung = "id" | "redirect" | "print" | "sn3" | "realWords";
6
7
  export interface SchoolCandidate {
@@ -57,5 +58,37 @@ export declare class SchoolResolver {
57
58
  constructor(rel: Release);
58
59
  links(a: string, b: string, q?: LinkQuery): Promise<SchoolLinksAnswer>;
59
60
  line(a: string, q?: LinkQuery): Promise<SchoolLineAnswer>;
61
+ list(): Promise<{
62
+ tag: string;
63
+ schools: RegistrySchool[];
64
+ }>;
65
+ prints(q?: {
66
+ event?: string;
67
+ year?: number;
68
+ }): Promise<{
69
+ tag: string;
70
+ asked: {
71
+ event?: string;
72
+ year?: number;
73
+ };
74
+ prints: SchoolPrint[];
75
+ }>;
76
+ redirects(): Promise<{
77
+ tag: string;
78
+ redirects: SchoolRedirect[];
79
+ }>;
80
+ lineage(): Promise<{
81
+ tag: string;
82
+ edges: LineageEdge[];
83
+ }>;
84
+ associations(q?: {
85
+ school_id?: string;
86
+ }): Promise<{
87
+ tag: string;
88
+ asked: {
89
+ school_id?: string;
90
+ };
91
+ associations: ObservedAssociation[];
92
+ }>;
60
93
  resolve(asked: string, q?: SchoolQuery): Promise<SchoolAnswer>;
61
94
  }