@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 +31 -7
- package/dist/chunks/{index-8gna56w2.js → index-4ph8n4ga.js} +52 -20
- package/dist/cli.js +1 -1
- package/dist/index.js +1 -1
- package/dist/types/comps.d.ts +3 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/stream.d.ts +2 -0
- package/dist/types/teams.d.ts +7 -0
- package/package.json +3 -3
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.
|
|
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
|
|
305
|
-
|
|
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,
|
|
332
|
-
// school_printed, school_id, place, place_printed,
|
|
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
|
|
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 {
|
|
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: "
|
|
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,
|
|
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: "
|
|
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((
|
|
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
package/dist/index.js
CHANGED
package/dist/types/comps.d.ts
CHANGED
|
@@ -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;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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";
|
package/dist/types/stream.d.ts
CHANGED
package/dist/types/teams.d.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
48
|
-
"@finbheara/names": "0.
|
|
47
|
+
"@finbheara/domain": "0.50.0",
|
|
48
|
+
"@finbheara/names": "0.23.0",
|
|
49
49
|
"hyparquet": "1.31.2"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|