@finbheara/archive-client 0.5.0 → 0.7.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/README.md CHANGED
@@ -20,7 +20,7 @@ type declarations (`.d.ts`), so a TypeScript project needs Bun's types (`"types"
20
20
  `bunx idq <verb>`.
21
21
 
22
22
  The version is 0.x while the API settles: a minor bump may break, so pin a minor
23
- (`"@finbheara/archive-client": "0.5.x"`).
23
+ (`"@finbheara/archive-client": "0.7.x"`).
24
24
 
25
25
  ## Configuration
26
26
 
@@ -85,12 +85,14 @@ c.features; // [{ feature: "dancers", state: "full" | "missing", missing: [...
85
85
  | `staff` | `staff.teacher`, `staff.adjudicator` | 260 |
86
86
  | `majors.order` | `majors.competitions` | 260 |
87
87
  | `feises`, `comps` | `feises.find`, `feises.series`, `comps.*`, `registrations.resolve` | 265 |
88
+ | `comps.dance` | the `dance` a comp of `comps.*` carries: null, never refused, without it | 270 |
88
89
  | `results.stream`, `majors.stream` | `results.stream`, `results.entries` | 255 |
89
90
  | `feises.dates` | `feises.dates` | 245 |
90
91
  | `dancers.records` | `dancers.records` | 215 |
91
92
  | `dancers.years` | `dancers.years` | 245 |
92
93
  | `majors.tabs` | `majors.tabulated` | 215 |
93
94
  | `teams` | `teams.results`, `teams.rosters`, `teams.resultRosters` | 260 |
95
+ | `teams.fields` | the fields `teams.results` (`age`, `gender`, `printed_status`) and `teams.rosters` (`dance`, `school_printed_as_of`, a member's `gender`) carry; absent, never refused, without it | 266 |
94
96
  | `events` | `events.years` | 260 |
95
97
 
96
98
  A spec is `pinned` (the default: the user-local pin, else the latest), `latest`, a cut number
@@ -301,8 +303,9 @@ competition beside its own fields: `competition`, `event`, `year`, `tier`, `comp
301
303
  `feis_date_hi`. Its own: `address`, `section`, `card`, `place`, `place_printed`, `tie`,
302
304
  `relative_place`, `atts`, `withdrawn`, `qualifier`, `name_printed`, `name`, `school_printed`,
303
305
  `school_loc`, `school_id`, `dancer_id`, `dancer_scope`, `yob`, `yob_printed`, `points_printed`,
304
- `platform_dancer_id`, `primary_source`. Rows come in the release's own order, a competition's
305
- rows together.
306
+ `platform_dancer_id`, `primary_source`, and its key in the release, `file` and `line` (one
307
+ `(file, line)` is one row, where an `address` may carry one row per section). Rows come in the
308
+ release's own order, a competition's rows together.
306
309
 
307
310
  The scopes: `majors` reads the majors (tiers T1 to T3), `transcribed` the transcribed rows of
308
311
  every tier, `platform` every row a results platform published, `all` every row.
@@ -328,11 +331,12 @@ await rel.majors.tabulated({ min_true_round: 3 }); // the majors addresses m
328
331
 
329
332
  ```ts
330
333
  const r = await rel.teams.results({ event: "<event>", year: 2024 });
331
- r.results; // [{ address, competition, event, year, comp_no, title, category, hands, letter, label,
332
- // school_printed, school_id, place, place_printed, tie, competitors, atts, ... }]
334
+ r.results; // [{ address, competition, event, year, comp_no, title, category, hands, age, gender,
335
+ // letter, label, school_printed, school_id, place, place_printed, printed_status, tie,
336
+ // competitors, atts, ... }]
333
337
  const t = await rel.teams.rosters({ event: "<event>", year: 2024 });
334
338
  t.teams; // [{ team, kind, event, year, comp_no, title, team_index, seq, school_id, school_printed,
335
- // members: [{ seq, name_printed, name, yob, dancer_id, dancer_scope }] }]
339
+ // school_printed_as_of, dance, members: [{ seq, name_printed, name, yob, gender, dancer_id, dancer_scope }] }]
336
340
  const j = await rel.teams.resultRosters({ event: "<event>", year: 2024 });
337
341
  j.joins; // [{ team, result_address, join_kind, via_split, roster_index, result_letter, ... }]
338
342
  const e = await rel.events.years({ event: "<event>" });
@@ -347,7 +351,21 @@ roster team met the results (`exact`, `card`, `branch`) or why it did not (`no-r
347
351
  `no-school`, `no-roster`, `multi-team-unjoined`), and `result_address` is null where none joined.
348
352
  An event-year's dates are a window (`date_lo`, `date_hi`) with how fine it is (`resolution`:
349
353
  `day`, `month`, `calendar`) and what it is read from (`source`), and `place` is a place-tree node
350
- where the release knows one. A field the source left empty is null. The rows are read once per
354
+ where the release knows one. A team result's `age` and `gender` are the competition's band and sex
355
+ as the release reads them, `printed_status` the row's printed status cell verbatim. A roster
356
+ team's `school_id` is its members' own school that year. Its `school_printed` is the school a
357
+ registration system held for it on `school_printed_as_of`, often years later, so a rename or a move
358
+ since shows there and it says nothing about the school that year. Its `dance` is the dance it was
359
+ entered for, and a member's `gender` is printed only as `M`:
360
+ the source withholds every other print, so null says nothing about a dancer's sex. A field the
361
+ source left empty is null.
362
+
363
+ THOSE NEWER FIELDS ARE ABSENT, NEVER NULL, ON A RELEASE THAT DOES NOT CARRY THEM: a team result's
364
+ `age`, `gender`, `printed_status`, a roster team's `school_printed_as_of`, `dance` and a member's
365
+ `gender` (feature `teams.fields`, see the table above). Absent means "this release does not carry it", null
366
+ means the release carries the field and has no value. `teams.results` and `teams.rosters` answer on
367
+ every release the `teams` feature names, and `(await rel.capability("teams.fields")).state` says which shape
368
+ a release has. The rows are read once per
351
369
  release into the `teams` and `events` indexes.
352
370
 
353
371
  ## Teachers and adjudicators
@@ -371,6 +389,8 @@ c.level; // "OC" (FF, BG, AB, NV, PW, PC, OC), c.feis_level 700
371
389
  c.age; // "U10", c.population "mixed", c.canonical "710OC", c.title, c.competition
372
390
  c.age_source; // "printed" | "title" | "code" | "merged" | null, c.age_printed "U10" as printed
373
391
  c.second; // true for a second chance or a supplementary comp beside the main one
392
+ c.dance; // "reel", "light-jig", "single-jig", "slip-jig", "treble-jig", "hornpipe",
393
+ // "treble-reel", "traditional-set", "set-dance", or null where the release names none
374
394
  c.from; // { feis_ids: ["fweb:ABC25"], year: 2025 } where an earlier year answered
375
395
  c.check; // "unchecked", or what the caller's `title` says about the earlier comp
376
396
  c.syllabus_source; // "results": what the syllabus the answer read is read from
@@ -413,6 +433,10 @@ QuickFeis numbers its own and-over championships (`15 & over` prelim `616PC`, `1
413
433
  `719OC`). An and-over code is then the same string as an `Under N + 1` one, and `age` (`O18`)
414
434
  tells them apart. An adult band, a range and a grade render none.
415
435
 
436
+ `dance` is the release's own `competitions.dance`, read there off the platform's dance field, its
437
+ level field and the title, in that order: one dance or none, never a word read here. A release
438
+ older than the column answers null for every comp, and `rel.capability("comps.dance")` says which.
439
+
416
440
  `age` is the release's reading, and `age_source` says where it was read. A `merged` comp (a
417
441
  platform's comps merged into one, `710OCM` with no `710OC` beside it) prints one member's band,
418
442
  so its `age` is the union of its members' (`U12` for `710OCM - U10 Open Champion` where the next
@@ -135,7 +135,7 @@ var COLUMNS = `r.address AS address, r.competition AS competition, c.event AS ev
135
135
  r.school_loc AS school_loc, r.school_id AS school_id, r.dancer_id AS dancer_id, r.yob AS yob,
136
136
  r.yob_printed AS yob_printed, r.points_printed AS points_printed,
137
137
  r.platform_dancer_id AS platform_dancer_id, r.primary_source AS primary_source,
138
- r.file AS file`;
138
+ r.file AS file, r.line AS line`;
139
139
  var TRANSCRIBED = "('transcript', 'manifested')";
140
140
  var scopeDb = (s) => s === "majors" ? "majors" : "results";
141
141
  function streamSql(q) {
@@ -191,7 +191,7 @@ function feisDates(db) {
191
191
  }
192
192
  var text = (v) => v === null || v === "" ? null : v;
193
193
  function rowOf(r, dates) {
194
- const { file: _file, atts, withdrawn, ...rest } = r;
194
+ const { atts, withdrawn, ...rest } = r;
195
195
  const d = dates.get(r.event);
196
196
  return {
197
197
  ...rest,
@@ -871,7 +871,7 @@ CREATE TABLE comp(
871
871
  code TEXT NOT NULL, code_fold TEXT NOT NULL, title TEXT, age TEXT, gender TEXT,
872
872
  feis_level INTEGER, round TEXT, platform TEXT NOT NULL, captures INTEGER NOT NULL,
873
873
  file TEXT NOT NULL, line INTEGER NOT NULL, age_source TEXT, age_printed TEXT,
874
- gender_source TEXT, level_printed TEXT, dance_printed TEXT
874
+ gender_source TEXT, level_printed TEXT, dance_printed TEXT, dance TEXT
875
875
  );
876
876
  `;
877
877
  var INDEXES = [
@@ -883,12 +883,13 @@ var OPTIONAL = [
883
883
  "age_printed",
884
884
  "gender_source",
885
885
  "level_printed",
886
- "dance_printed"
886
+ "dance_printed",
887
+ "dance"
887
888
  ];
888
889
  var fold = (code) => code.trim().toLowerCase();
889
890
  var compsIndex = {
890
891
  name: "comps",
891
- version: "2",
892
+ version: "3",
892
893
  inputs: ["results"],
893
894
  says: "every competition by its feis and its own code, with its series and year",
894
895
  build(rel, out) {
@@ -901,12 +902,12 @@ var compsIndex = {
901
902
  const captures = new Map;
902
903
  for (const r of src.query("SELECT competition, count(*) AS n FROM competitions GROUP BY competition").all())
903
904
  captures.set(r.competition, r.n);
904
- const put = out.prepare("INSERT OR IGNORE INTO comp VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
905
+ const put = out.prepare("INSERT OR IGNORE INTO comp VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
905
906
  const has = new Set(src.query("PRAGMA table_info(competitions)").all().map((r) => r.name));
906
907
  const opt = (col) => has.has(col) ? col : `NULL AS ${col}`;
907
908
  for (const c of src.query(`SELECT competition, event, year, comp_no, title, age, gender, feis_level, round, source, file, line, ${OPTIONAL.map(opt).join(", ")} FROM competitions WHERE comp_no IS NOT NULL AND trim(comp_no) != '' ORDER BY file, line`).iterate()) {
908
909
  const f = brand.get(c.event);
909
- put.run(c.competition, c.event, f?.brand ?? null, c.year ?? f?.year ?? null, c.comp_no.trim(), fold(c.comp_no), c.title, c.age, c.gender, c.feis_level, c.round, c.source, captures.get(c.competition) ?? 1, c.file, c.line, c.age_source, c.age_printed, c.gender_source, c.level_printed, c.dance_printed);
910
+ put.run(c.competition, c.event, f?.brand ?? null, c.year ?? f?.year ?? null, c.comp_no.trim(), fold(c.comp_no), c.title, c.age, c.gender, c.feis_level, c.round, c.source, captures.get(c.competition) ?? 1, c.file, c.line, c.age_source, c.age_printed, c.gender_source, c.level_printed, c.dance_printed, c.dance);
910
911
  }
911
912
  for (const s of INDEXES)
912
913
  out.run(s);
@@ -933,6 +934,7 @@ function compOf(r, codes = []) {
933
934
  age_printed: r.age_printed ?? null,
934
935
  population: pop === "" ? null : pop,
935
936
  second,
937
+ dance: r.dance ?? null,
936
938
  round,
937
939
  canonical: canonicalOf2(lv, r.age),
938
940
  platform: r.platform,
@@ -1834,12 +1836,13 @@ CREATE TABLE event_year(event_year TEXT PRIMARY KEY, event TEXT NOT NULL, year I
1834
1836
  CREATE TABLE result(address TEXT PRIMARY KEY, competition TEXT, event TEXT, year INTEGER,
1835
1837
  card TEXT, comp_no TEXT, title TEXT, category TEXT, hands INTEGER, letter TEXT, label TEXT,
1836
1838
  name_printed TEXT, school_printed TEXT, school_loc TEXT, school_id TEXT, place INTEGER,
1837
- place_printed TEXT, tie INTEGER, competitors INTEGER, atts TEXT, ord INTEGER);
1839
+ place_printed TEXT, tie INTEGER, competitors INTEGER, atts TEXT, age TEXT, gender TEXT,
1840
+ printed_status TEXT, ord INTEGER);
1838
1841
  CREATE TABLE roster_team(team TEXT PRIMARY KEY, kind TEXT, event TEXT, year INTEGER,
1839
1842
  comp_no TEXT, title TEXT, team_index TEXT, seq INTEGER, school_id TEXT, school_printed TEXT,
1840
- ord INTEGER);
1843
+ dance TEXT, school_printed_as_of TEXT, ord INTEGER);
1841
1844
  CREATE TABLE roster_member(team TEXT, seq INTEGER, name_printed TEXT, name TEXT, yob INTEGER,
1842
- dancer_id INTEGER, ord INTEGER);
1845
+ dancer_id INTEGER, gender TEXT, ord INTEGER);
1843
1846
  CREATE TABLE result_roster(team TEXT, event TEXT, year INTEGER, comp_no TEXT, school_id TEXT,
1844
1847
  result_address TEXT, join_kind TEXT, via_split INTEGER, roster_teams INTEGER,
1845
1848
  result_teams INTEGER, roster_index TEXT, result_letter TEXT, ord INTEGER);
@@ -1863,7 +1866,7 @@ async function readTables(rel, tables) {
1863
1866
  }
1864
1867
  var teamsIndex = {
1865
1868
  name: "teams",
1866
- version: "1",
1869
+ version: "2",
1867
1870
  inputs: TEAM_TABLES.map(tableAsset),
1868
1871
  says: "the team results, the roster teams with their members, and how they join, by event-year",
1869
1872
  load: (rel) => readTables(rel, TEAM_TABLES),
@@ -1881,18 +1884,18 @@ var teamsIndex = {
1881
1884
  ey.set(k, { event, year });
1882
1885
  putEy.run(k, event, year);
1883
1886
  }
1884
- const putR = out.prepare("INSERT OR IGNORE INTO result VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
1887
+ const putR = out.prepare("INSERT OR IGNORE INTO result VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
1885
1888
  let ord = 0;
1886
1889
  for (const r of t.team_results)
1887
- putR.run(str(r.address), str(r.slug), str(r.event), num(r.year), str(r.card), str(r.comp_no), str(r.title), str(r.category), num(r.hands), str(r.letter), str(r.label), str(r.name_printed), str(r.school_printed), str(r.school_loc), str(r.school_id), num(r.place), str(r.place_printed), num(r.tie), num(r.competitors), JSON.stringify(strs(r.atts)), ord++);
1888
- const putT = out.prepare("INSERT OR IGNORE INTO roster_team VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
1890
+ putR.run(str(r.address), str(r.slug), str(r.event), num(r.year), str(r.card), str(r.comp_no), str(r.title), str(r.category), num(r.hands), str(r.letter), str(r.label), str(r.name_printed), str(r.school_printed), str(r.school_loc), str(r.school_id), num(r.place), str(r.place_printed), num(r.tie), num(r.competitors), JSON.stringify(strs(r.atts)), str(r.age), str(r.gender), JSON.stringify(strs(r.printed_status)), ord++);
1891
+ const putT = out.prepare("INSERT OR IGNORE INTO roster_team VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
1889
1892
  for (const r of t.roster_teams) {
1890
1893
  const e = ey.get(str(r.event_year) ?? "");
1891
- putT.run(str(r.team), str(r.kind), e?.event ?? null, num(r.year) ?? e?.year ?? null, str(r.comp_no), str(r.title), str(r.team_index), num(r.seq), str(r.school_id), str(r.school_print_materialized), ord++);
1894
+ putT.run(str(r.team), str(r.kind), e?.event ?? null, num(r.year) ?? e?.year ?? null, str(r.comp_no), str(r.title), str(r.team_index), num(r.seq), str(r.school_id), str(r.school_print_materialized), str(r.dance), str(r.school_print_as_of), ord++);
1892
1895
  }
1893
- const putM = out.prepare("INSERT INTO roster_member VALUES (?, ?, ?, ?, ?, ?, ?)");
1896
+ const putM = out.prepare("INSERT INTO roster_member VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
1894
1897
  for (const r of t.roster_members)
1895
- putM.run(str(r.team), num(r.seq), typeof r.name_printed === "string" ? r.name_printed : "", str(r.name), num(r.yob), num(r.dancer_id), ord++);
1898
+ putM.run(str(r.team), num(r.seq), typeof r.name_printed === "string" ? r.name_printed : "", str(r.name), num(r.yob), num(r.dancer_id), str(r.gender), ord++);
1896
1899
  const putJ = out.prepare("INSERT INTO result_roster VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
1897
1900
  for (const r of t.team_result_rosters) {
1898
1901
  const e = ey.get(str(r.event_year) ?? "");
@@ -1947,27 +1950,37 @@ class TeamFinder2 {
1947
1950
  db() {
1948
1951
  return this.rel.indexDb("teams");
1949
1952
  }
1953
+ async hasFields() {
1954
+ return (await this.rel.capability("teams.fields")).state === "full";
1955
+ }
1950
1956
  async results(q = {}) {
1951
1957
  const db = await this.db();
1958
+ const fields = await this.hasFields();
1952
1959
  const w = whereOf(q);
1953
1960
  const rows = db.query(`SELECT address, competition, event, year, card, comp_no, title, category, hands, letter,
1954
1961
  label, name_printed, school_printed, school_loc, school_id, place, place_printed, tie,
1955
- competitors, atts
1962
+ competitors, atts${fields ? ", age, gender, printed_status" : ""}
1956
1963
  FROM result${w.sql} ORDER BY year, event, competition, place IS NULL, place, ord`).all(...w.args);
1957
1964
  return {
1958
1965
  tag: this.rel.tag,
1959
1966
  asked: q,
1960
- results: rows.map((r) => ({ ...r, atts: JSON.parse(r.atts) }))
1967
+ results: rows.map(({ printed_status, ...r }) => ({
1968
+ ...r,
1969
+ atts: JSON.parse(r.atts),
1970
+ ...printed_status === undefined ? {} : { printed_status: JSON.parse(printed_status ?? "[]") }
1971
+ }))
1961
1972
  };
1962
1973
  }
1963
1974
  async rosters(q = {}) {
1964
1975
  const db = await this.db();
1976
+ const fields = await this.hasFields();
1965
1977
  const w = whereOf(q, "t.");
1966
1978
  const teams = db.query(`SELECT team, kind, event, year, comp_no, title, team_index, seq, school_id, school_printed
1979
+ ${fields ? ", school_printed_as_of, dance" : ""}
1967
1980
  FROM roster_team t${w.sql} ORDER BY year, event, ord`).all(...w.args);
1968
1981
  const members = new Map;
1969
1982
  for (const m of db.query(`SELECT m.team AS team, m.seq AS seq, m.name_printed AS name_printed, m.name AS name,
1970
- m.yob AS yob, m.dancer_id AS dancer_id
1983
+ m.yob AS yob, m.dancer_id AS dancer_id${fields ? ", m.gender AS gender" : ""}
1971
1984
  FROM roster_member m JOIN roster_team t ON t.team = m.team${w.sql}
1972
1985
  ORDER BY m.team, m.seq, m.ord`).all(...w.args)) {
1973
1986
  const { team, ...rest } = m;
@@ -2498,6 +2511,12 @@ var FEATURES2 = [
2498
2511
  since: 265,
2499
2512
  calls: "comps.resolve, comps.syllabus, comps.syllabusFor, registrations.resolve (the comps index)"
2500
2513
  },
2514
+ {
2515
+ feature: "comps.dance",
2516
+ needs: ["results:competitions.dance"],
2517
+ since: 270,
2518
+ calls: "the `dance` a comp of comps.resolve, comps.syllabus and comps.syllabusFor carries: null, never refused, on a release without it"
2519
+ },
2501
2520
  {
2502
2521
  feature: "results.stream",
2503
2522
  needs: [
@@ -2624,6 +2643,19 @@ var FEATURES2 = [
2624
2643
  since: 260,
2625
2644
  calls: "teams.results, teams.rosters, teams.resultRosters (the teams index)"
2626
2645
  },
2646
+ {
2647
+ feature: "teams.fields",
2648
+ needs: [
2649
+ "table:team_results.age",
2650
+ "table:team_results.gender",
2651
+ "table:team_results.printed_status",
2652
+ "table:roster_teams.dance",
2653
+ "table:roster_teams.school_print_as_of",
2654
+ "table:roster_members.gender"
2655
+ ],
2656
+ since: 266,
2657
+ calls: "the fields teams.results (age, gender, printed_status) and teams.rosters (dance, school_printed_as_of, a member's gender) carry where present: absent, never refused, on a release without them"
2658
+ },
2627
2659
  {
2628
2660
  feature: "events",
2629
2661
  needs: [
package/dist/cli.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  nameOrderOf,
5
5
  openRelease2,
6
6
  releases2
7
- } from "./chunks/index-8gna56w2.js";
7
+ } from "./chunks/index-4ph8n4ga.js";
8
8
  import"./chunks/index-hne1wadw.js";
9
9
  import"./chunks/index-hghdy980.js";
10
10
 
package/dist/index.js CHANGED
@@ -45,7 +45,7 @@ import {
45
45
  openCached2,
46
46
  ReleaseManager2,
47
47
  releases2
48
- } from "./chunks/index-8gna56w2.js";
48
+ } from "./chunks/index-4ph8n4ga.js";
49
49
  import {
50
50
  cacheRoot2,
51
51
  repoOf2
@@ -2,6 +2,7 @@ import { type AgeRelation } from "@finbheara/domain/age";
2
2
  import { type Population, type PopulationRelation } from "@finbheara/domain/title";
3
3
  import type { IndexBuilder } from "./indexes.js";
4
4
  import type { Release } from "./release.js";
5
+ export type CompDance = "reel" | "light-jig" | "single-jig" | "slip-jig" | "treble-jig" | "hornpipe" | "treble-reel" | "traditional-set" | "set-dance";
5
6
  export type CompKind = "championship" | "grade" | "unrated";
6
7
  export type CompSource = "syllabus" | "prior-year" | "title";
7
8
  export type SyllabusSource = "syllabus-document" | "results";
@@ -19,6 +20,7 @@ export interface Comp {
19
20
  age_printed: string | null;
20
21
  population: Population | null;
21
22
  second: boolean;
23
+ dance: CompDance | null;
22
24
  round: string | null;
23
25
  canonical: string | null;
24
26
  platform: string;
@@ -115,6 +117,7 @@ interface CompRow {
115
117
  gender_source?: string | null;
116
118
  level_printed?: string | null;
117
119
  dance_printed?: string | null;
120
+ dance?: string | null;
118
121
  }
119
122
  export declare function compOf(r: CompRow, codes?: readonly string[]): Comp;
120
123
  export declare function canonicalOf(level: number | null, age: string | null): string | null;
@@ -2,7 +2,7 @@ export { type AssetPlan, DATABASES, type DatabaseName, type LandedFile, type Rec
2
2
  export { sha256File, unzstdTo } from "./bytes.js";
3
3
  export { type AgeAsked, type AgeEvidence, type DancerAnswer, type DancerBulkRecord, type DancerCandidate, type DancerQuery, type DancerRecord, DancerResolver, type DancerSchool, type DancerSearchQuery, type DancerYear, type ExcludedCandidate, FEIS_LOCAL_ID_FLOOR, type PopulationEvidence, type SchoolEvidence, readPopulation, } from "./dancers.js";
4
4
  export { NAME_LEVELS, type NameLevel, nameLevel } from "./dancers-names.js";
5
- export { type Comp, type CompAnswer, type CompKind, type CompQuery, CompResolver, type CompSource, type FeisPlace, type SyllabusAnswer, type SyllabusForAnswer, type SyllabusSource, type TitleCheck, canonicalOf, } from "./comps.js";
5
+ 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, } from "./comps.js";
6
6
  export { type ClientOptions, cacheRoot, repoOf } from "./config.js";
7
7
  export { type Feis, type FeisAnswer, FeisFinder, type FeisQuery, NO_CALENDAR, type Series, type SeriesAnswer, type SeriesInstance, type SeriesNext, } from "./feises.js";
8
8
  export { type IndexBuilder, type IndexFile, buildIndex, defaultBuilders, ensureIndex, indexKey, indexPath, isCurrent, listIndexes, } from "./indexes.js";
@@ -53,6 +53,8 @@ export interface StreamRow {
53
53
  points_printed: string | null;
54
54
  platform_dancer_id: string | null;
55
55
  primary_source: string | null;
56
+ file: string;
57
+ line: number;
56
58
  }
57
59
  export interface EntryRow extends StreamRow {
58
60
  recall_place: number | null;
@@ -25,6 +25,9 @@ export interface TeamResult {
25
25
  tie: number | null;
26
26
  competitors: number | null;
27
27
  atts: string[];
28
+ age?: string | null;
29
+ gender?: string | null;
30
+ printed_status?: string[];
28
31
  }
29
32
  export interface RosterMember {
30
33
  seq: number;
@@ -33,6 +36,7 @@ export interface RosterMember {
33
36
  yob: number | null;
34
37
  dancer_id: number | null;
35
38
  dancer_scope: "per-release" | "stable" | null;
39
+ gender?: string | null;
36
40
  }
37
41
  export interface RosterTeam {
38
42
  team: string;
@@ -45,6 +49,8 @@ export interface RosterTeam {
45
49
  seq: number | null;
46
50
  school_id: string | null;
47
51
  school_printed: string | null;
52
+ school_printed_as_of?: string | null;
53
+ dance?: string | null;
48
54
  members: RosterMember[];
49
55
  }
50
56
  export interface ResultRoster {
@@ -78,6 +84,7 @@ export declare class TeamFinder {
78
84
  private readonly rel;
79
85
  constructor(rel: Release);
80
86
  private db;
87
+ private hasFields;
81
88
  results(q?: EventYearQuery): Promise<{
82
89
  tag: string;
83
90
  asked: EventYearQuery;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@finbheara/archive-client",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "Open a versioned release of an Irish dance results archive: download, verify, decompress and cache it by tag, keep the cache, and resolve feises and schools against it",
5
5
  "keywords": ["irish-dance", "results", "release", "cache", "sqlite"],
6
6
  "license": "MIT",
@@ -44,8 +44,8 @@
44
44
  "prepublishOnly": "bun scripts/build.ts && bun ../../tools/checks/archive-client-tarball.ts"
45
45
  },
46
46
  "dependencies": {
47
- "@finbheara/domain": "0.49.0",
48
- "@finbheara/names": "0.22.0",
47
+ "@finbheara/domain": "0.50.0",
48
+ "@finbheara/names": "0.23.0",
49
49
  "hyparquet": "1.31.2"
50
50
  },
51
51
  "devDependencies": {