@sportsdataverse/sdvplot 0.1.0 → 0.2.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/NOTICE.md +15 -0
- package/README.md +84 -8
- package/dist/chartjs-surface.d.ts +2 -2
- package/dist/chartjs-surface.js +2 -2
- package/dist/chartjs-surface.js.map +1 -1
- package/dist/chartjs.d.ts +32 -2
- package/dist/chartjs.js +7 -4
- package/dist/chartjs.js.map +1 -1
- package/dist/chunk-57WFSI4Q.js +128 -0
- package/dist/chunk-57WFSI4Q.js.map +1 -0
- package/dist/{chunk-KKH6ABMA.js → chunk-7ULOCCFL.js} +94 -4
- package/dist/chunk-7ULOCCFL.js.map +1 -0
- package/dist/chunk-AMXASQHT.js +120 -0
- package/dist/chunk-AMXASQHT.js.map +1 -0
- package/dist/chunk-B2MP37SR.js +175 -0
- package/dist/chunk-B2MP37SR.js.map +1 -0
- package/dist/{chunk-NLPH2VZT.js → chunk-DYMUVE6K.js} +4 -4
- package/dist/{chunk-NLPH2VZT.js.map → chunk-DYMUVE6K.js.map} +1 -1
- package/dist/{chunk-QY65DUEF.js → chunk-H2C3FMMA.js} +4 -10
- package/dist/chunk-H2C3FMMA.js.map +1 -0
- package/dist/{chunk-JJFTD4VB.js → chunk-J4P4HDBF.js} +4 -4
- package/dist/{chunk-JJFTD4VB.js.map → chunk-J4P4HDBF.js.map} +1 -1
- package/dist/chunk-M3XD2OSN.js +132 -0
- package/dist/chunk-M3XD2OSN.js.map +1 -0
- package/dist/{chunk-OKEE4AH6.js → chunk-OIILARXI.js} +3 -3
- package/dist/{chunk-OKEE4AH6.js.map → chunk-OIILARXI.js.map} +1 -1
- package/dist/chunk-RPVVJY74.js +170 -0
- package/dist/chunk-RPVVJY74.js.map +1 -0
- package/dist/chunk-UL5M6KDE.js +205 -0
- package/dist/chunk-UL5M6KDE.js.map +1 -0
- package/dist/chunk-WQT4IVLX.js +10 -0
- package/dist/chunk-WQT4IVLX.js.map +1 -0
- package/dist/{chunk-TAXO3VXH.js → chunk-ZAEQXFJM.js} +3 -3
- package/dist/{chunk-TAXO3VXH.js.map → chunk-ZAEQXFJM.js.map} +1 -1
- package/dist/cytoscape.d.ts +188 -0
- package/dist/cytoscape.js +219 -0
- package/dist/cytoscape.js.map +1 -0
- package/dist/d3.d.ts +3 -3
- package/dist/d3.js +6 -6
- package/dist/d3.js.map +1 -1
- package/dist/deckgl.d.ts +232 -0
- package/dist/deckgl.js +197 -0
- package/dist/deckgl.js.map +1 -0
- package/dist/echarts.js +5 -5
- package/dist/g2.d.ts +251 -0
- package/dist/g2.js +102 -0
- package/dist/g2.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -5
- package/dist/lightweight-charts.d.ts +217 -0
- package/dist/lightweight-charts.js +155 -0
- package/dist/lightweight-charts.js.map +1 -0
- package/dist/maplibre.d.ts +271 -0
- package/dist/maplibre.js +175 -0
- package/dist/maplibre.js.map +1 -0
- package/dist/mui.d.ts +338 -0
- package/dist/mui.js +184 -0
- package/dist/mui.js.map +1 -0
- package/dist/nivo.d.ts +193 -0
- package/dist/nivo.js +8 -0
- package/dist/nivo.js.map +1 -0
- package/dist/perspective.d.ts +198 -0
- package/dist/perspective.js +171 -0
- package/dist/perspective.js.map +1 -0
- package/dist/placement-UWkqUzpa.d.ts +32 -0
- package/dist/plot.d.ts +7 -5
- package/dist/plot.js +9 -8
- package/dist/plot.js.map +1 -1
- package/dist/plotly.js +5 -5
- package/dist/react.d.ts +279 -3
- package/dist/react.js +364 -6
- package/dist/react.js.map +1 -1
- package/dist/recharts.d.ts +162 -0
- package/dist/recharts.js +8 -0
- package/dist/recharts.js.map +1 -0
- package/dist/shadcn.d.ts +83 -0
- package/dist/shadcn.js +88 -0
- package/dist/shadcn.js.map +1 -0
- package/dist/shots.js +3 -2
- package/dist/shots.js.map +1 -1
- package/dist/surface-TR7YFJW3.js +4 -0
- package/dist/surface-TR7YFJW3.js.map +1 -0
- package/dist/surfaces-MIG7HOFU.js +6 -0
- package/dist/surfaces-MIG7HOFU.js.map +1 -0
- package/dist/surfaces-W-odWLpT.d.ts +47 -0
- package/dist/svelte/HeadshotMark.svelte +25 -0
- package/dist/svelte/HeadshotMark.svelte.d.ts +10 -0
- package/dist/svelte/HeadshotMark.svelte.d.ts.map +1 -0
- package/dist/svelte/LogoMark.svelte +25 -0
- package/dist/svelte/LogoMark.svelte.d.ts +10 -0
- package/dist/svelte/LogoMark.svelte.d.ts.map +1 -0
- package/dist/svelte/Marks.svelte +25 -0
- package/dist/svelte/Marks.svelte.d.ts +10 -0
- package/dist/svelte/Marks.svelte.d.ts.map +1 -0
- package/dist/svelte/Surface.svelte +29 -0
- package/dist/svelte/Surface.svelte.d.ts +9 -0
- package/dist/svelte/Surface.svelte.d.ts.map +1 -0
- package/dist/svelte/SurfaceBackdrop.svelte +26 -0
- package/dist/svelte/SurfaceBackdrop.svelte.d.ts +11 -0
- package/dist/svelte/SurfaceBackdrop.svelte.d.ts.map +1 -0
- package/dist/svelte/index.d.ts +13 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +11 -0
- package/dist/svelte-core.d.ts +139 -0
- package/dist/svelte-core.js +123 -0
- package/dist/svelte-core.js.map +1 -0
- package/dist/tanstack.d.ts +240 -0
- package/dist/tanstack.js +110 -0
- package/dist/tanstack.js.map +1 -0
- package/dist/testing.js +4 -5
- package/dist/testing.js.map +1 -1
- package/dist/three.d.ts +223 -0
- package/dist/three.js +50 -0
- package/dist/three.js.map +1 -0
- package/dist/{tiers-B6pUBPcE.d.ts → tiers-BN4md-GB.d.ts} +2 -30
- package/dist/unovis.d.ts +127 -0
- package/dist/unovis.js +108 -0
- package/dist/unovis.js.map +1 -0
- package/dist/uplot.d.ts +120 -0
- package/dist/uplot.js +110 -0
- package/dist/uplot.js.map +1 -0
- package/dist/vega.js +5 -5
- package/dist/victory.d.ts +107 -0
- package/dist/victory.js +38 -0
- package/dist/victory.js.map +1 -0
- package/package.json +218 -6
- package/dist/chunk-KKH6ABMA.js.map +0 -1
- package/dist/chunk-QY65DUEF.js.map +0 -1
- package/dist/chunk-RMT2GMFH.js +0 -97
- package/dist/chunk-RMT2GMFH.js.map +0 -1
- package/dist/chunk-SEBO35DV.js +0 -76
- package/dist/chunk-SEBO35DV.js.map +0 -1
- package/dist/chunk-TDNBAEQB.js +0 -105
- package/dist/chunk-TDNBAEQB.js.map +0 -1
- package/dist/surfaces-ChaD9nei.d.ts +0 -38
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sportsdataverse/sdvplot",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Team identity, colors, logos and headshots for SportsDataverse plots — TypeScript port of sdvplot/sdvplotR",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -14,7 +14,26 @@
|
|
|
14
14
|
"observable-plot",
|
|
15
15
|
"d3",
|
|
16
16
|
"chartjs",
|
|
17
|
-
"react"
|
|
17
|
+
"react",
|
|
18
|
+
"recharts",
|
|
19
|
+
"shadcn",
|
|
20
|
+
"mui",
|
|
21
|
+
"mui-x-charts",
|
|
22
|
+
"uplot",
|
|
23
|
+
"nivo",
|
|
24
|
+
"victory",
|
|
25
|
+
"deck.gl",
|
|
26
|
+
"cytoscape",
|
|
27
|
+
"threejs",
|
|
28
|
+
"react-three-fiber",
|
|
29
|
+
"lightweight-charts",
|
|
30
|
+
"g2",
|
|
31
|
+
"ant-design-charts",
|
|
32
|
+
"tanstack-charts",
|
|
33
|
+
"maplibre",
|
|
34
|
+
"maps",
|
|
35
|
+
"unovis",
|
|
36
|
+
"perspective"
|
|
18
37
|
],
|
|
19
38
|
"homepage": "https://plot.sportsdataverse.org",
|
|
20
39
|
"bugs": "https://github.com/sportsdataverse/sdvplot-js/issues",
|
|
@@ -84,34 +103,190 @@
|
|
|
84
103
|
"types": "./dist/echarts.d.ts",
|
|
85
104
|
"import": "./dist/echarts.js"
|
|
86
105
|
},
|
|
106
|
+
"./recharts": {
|
|
107
|
+
"types": "./dist/recharts.d.ts",
|
|
108
|
+
"import": "./dist/recharts.js"
|
|
109
|
+
},
|
|
110
|
+
"./shadcn": {
|
|
111
|
+
"types": "./dist/shadcn.d.ts",
|
|
112
|
+
"import": "./dist/shadcn.js"
|
|
113
|
+
},
|
|
114
|
+
"./mui": {
|
|
115
|
+
"types": "./dist/mui.d.ts",
|
|
116
|
+
"import": "./dist/mui.js"
|
|
117
|
+
},
|
|
118
|
+
"./uplot": {
|
|
119
|
+
"types": "./dist/uplot.d.ts",
|
|
120
|
+
"import": "./dist/uplot.js"
|
|
121
|
+
},
|
|
122
|
+
"./svelte": {
|
|
123
|
+
"types": "./dist/svelte/index.d.ts",
|
|
124
|
+
"svelte": "./dist/svelte/index.js"
|
|
125
|
+
},
|
|
126
|
+
"./nivo": {
|
|
127
|
+
"types": "./dist/nivo.d.ts",
|
|
128
|
+
"import": "./dist/nivo.js"
|
|
129
|
+
},
|
|
130
|
+
"./victory": {
|
|
131
|
+
"types": "./dist/victory.d.ts",
|
|
132
|
+
"import": "./dist/victory.js"
|
|
133
|
+
},
|
|
134
|
+
"./deckgl": {
|
|
135
|
+
"types": "./dist/deckgl.d.ts",
|
|
136
|
+
"import": "./dist/deckgl.js"
|
|
137
|
+
},
|
|
138
|
+
"./cytoscape": {
|
|
139
|
+
"types": "./dist/cytoscape.d.ts",
|
|
140
|
+
"import": "./dist/cytoscape.js"
|
|
141
|
+
},
|
|
142
|
+
"./three": {
|
|
143
|
+
"types": "./dist/three.d.ts",
|
|
144
|
+
"import": "./dist/three.js"
|
|
145
|
+
},
|
|
146
|
+
"./lightweight-charts": {
|
|
147
|
+
"types": "./dist/lightweight-charts.d.ts",
|
|
148
|
+
"import": "./dist/lightweight-charts.js"
|
|
149
|
+
},
|
|
150
|
+
"./g2": {
|
|
151
|
+
"types": "./dist/g2.d.ts",
|
|
152
|
+
"import": "./dist/g2.js"
|
|
153
|
+
},
|
|
154
|
+
"./tanstack": {
|
|
155
|
+
"types": "./dist/tanstack.d.ts",
|
|
156
|
+
"import": "./dist/tanstack.js"
|
|
157
|
+
},
|
|
158
|
+
"./maplibre": {
|
|
159
|
+
"types": "./dist/maplibre.d.ts",
|
|
160
|
+
"import": "./dist/maplibre.js"
|
|
161
|
+
},
|
|
162
|
+
"./unovis": {
|
|
163
|
+
"types": "./dist/unovis.d.ts",
|
|
164
|
+
"import": "./dist/unovis.js"
|
|
165
|
+
},
|
|
166
|
+
"./perspective": {
|
|
167
|
+
"types": "./dist/perspective.d.ts",
|
|
168
|
+
"import": "./dist/perspective.js"
|
|
169
|
+
},
|
|
87
170
|
"./package.json": "./package.json"
|
|
88
171
|
},
|
|
89
172
|
"peerDependencies": {
|
|
173
|
+
"@antv/component": ">=2.1.12",
|
|
174
|
+
"@antv/g2": ">=5.4.8",
|
|
175
|
+
"@deck.gl/core": ">=9.4.0",
|
|
176
|
+
"@deck.gl/layers": ">=9.4.0",
|
|
177
|
+
"@deck.gl/mapbox": ">=9.4.0",
|
|
178
|
+
"@mui/x-charts": ">=9.15.0",
|
|
179
|
+
"@nivo/bump": ">=0.99",
|
|
180
|
+
"@nivo/chord": ">=0.99",
|
|
181
|
+
"@nivo/core": ">=0.99",
|
|
182
|
+
"@nivo/swarmplot": ">=0.99",
|
|
90
183
|
"@observablehq/plot": ">=0.6.16",
|
|
184
|
+
"@perspective-dev/viewer": ">=5.5.1",
|
|
185
|
+
"@react-three/fiber": ">=9.8.1",
|
|
91
186
|
"@resvg/resvg-js": ">=2.6",
|
|
92
187
|
"@sportsdataverse/sporty": "^0",
|
|
188
|
+
"@tanstack/charts": ">=1.1.0",
|
|
189
|
+
"@unovis/ts": ">=1.7.1",
|
|
93
190
|
"chart.js": ">=4.4",
|
|
191
|
+
"cytoscape": ">=3.34.3",
|
|
94
192
|
"d3": ">=7",
|
|
95
|
-
"
|
|
193
|
+
"layerchart": ">=2.5.1",
|
|
194
|
+
"lightweight-charts": ">=5.2.1",
|
|
195
|
+
"maplibre-gl": ">=6.14.0",
|
|
196
|
+
"react": ">=18",
|
|
197
|
+
"recharts": ">=3.8",
|
|
198
|
+
"svelte": ">=5.57",
|
|
199
|
+
"three": ">=0.186.1",
|
|
200
|
+
"uplot": ">=1.6.31",
|
|
201
|
+
"victory": ">=37.3.6"
|
|
96
202
|
},
|
|
97
203
|
"peerDependenciesMeta": {
|
|
204
|
+
"@antv/component": {
|
|
205
|
+
"optional": true
|
|
206
|
+
},
|
|
207
|
+
"@antv/g2": {
|
|
208
|
+
"optional": true
|
|
209
|
+
},
|
|
210
|
+
"@deck.gl/core": {
|
|
211
|
+
"optional": true
|
|
212
|
+
},
|
|
213
|
+
"@deck.gl/layers": {
|
|
214
|
+
"optional": true
|
|
215
|
+
},
|
|
216
|
+
"@deck.gl/mapbox": {
|
|
217
|
+
"optional": true
|
|
218
|
+
},
|
|
219
|
+
"@mui/x-charts": {
|
|
220
|
+
"optional": true
|
|
221
|
+
},
|
|
222
|
+
"@nivo/bump": {
|
|
223
|
+
"optional": true
|
|
224
|
+
},
|
|
225
|
+
"@nivo/chord": {
|
|
226
|
+
"optional": true
|
|
227
|
+
},
|
|
228
|
+
"@nivo/core": {
|
|
229
|
+
"optional": true
|
|
230
|
+
},
|
|
231
|
+
"@nivo/swarmplot": {
|
|
232
|
+
"optional": true
|
|
233
|
+
},
|
|
98
234
|
"@observablehq/plot": {
|
|
99
235
|
"optional": true
|
|
100
236
|
},
|
|
237
|
+
"@perspective-dev/viewer": {
|
|
238
|
+
"optional": true
|
|
239
|
+
},
|
|
240
|
+
"@react-three/fiber": {
|
|
241
|
+
"optional": true
|
|
242
|
+
},
|
|
101
243
|
"@resvg/resvg-js": {
|
|
102
244
|
"optional": true
|
|
103
245
|
},
|
|
104
246
|
"@sportsdataverse/sporty": {
|
|
105
247
|
"optional": true
|
|
106
248
|
},
|
|
249
|
+
"@tanstack/charts": {
|
|
250
|
+
"optional": true
|
|
251
|
+
},
|
|
252
|
+
"@unovis/ts": {
|
|
253
|
+
"optional": true
|
|
254
|
+
},
|
|
107
255
|
"chart.js": {
|
|
108
256
|
"optional": true
|
|
109
257
|
},
|
|
258
|
+
"cytoscape": {
|
|
259
|
+
"optional": true
|
|
260
|
+
},
|
|
110
261
|
"d3": {
|
|
111
262
|
"optional": true
|
|
112
263
|
},
|
|
264
|
+
"layerchart": {
|
|
265
|
+
"optional": true
|
|
266
|
+
},
|
|
267
|
+
"lightweight-charts": {
|
|
268
|
+
"optional": true
|
|
269
|
+
},
|
|
270
|
+
"maplibre-gl": {
|
|
271
|
+
"optional": true
|
|
272
|
+
},
|
|
113
273
|
"react": {
|
|
114
274
|
"optional": true
|
|
275
|
+
},
|
|
276
|
+
"recharts": {
|
|
277
|
+
"optional": true
|
|
278
|
+
},
|
|
279
|
+
"svelte": {
|
|
280
|
+
"optional": true
|
|
281
|
+
},
|
|
282
|
+
"three": {
|
|
283
|
+
"optional": true
|
|
284
|
+
},
|
|
285
|
+
"uplot": {
|
|
286
|
+
"optional": true
|
|
287
|
+
},
|
|
288
|
+
"victory": {
|
|
289
|
+
"optional": true
|
|
115
290
|
}
|
|
116
291
|
},
|
|
117
292
|
"repository": {
|
|
@@ -124,31 +299,68 @@
|
|
|
124
299
|
"provenance": true
|
|
125
300
|
},
|
|
126
301
|
"devDependencies": {
|
|
302
|
+
"@antv/component": "2.1.12",
|
|
303
|
+
"@antv/g2": "5.4.8",
|
|
304
|
+
"@deck.gl/core": "9.4.0",
|
|
305
|
+
"@deck.gl/layers": "9.4.0",
|
|
306
|
+
"@deck.gl/mapbox": "9.4.0",
|
|
307
|
+
"@emotion/react": "11.14.0",
|
|
308
|
+
"@emotion/styled": "11.14.1",
|
|
309
|
+
"@mui/material": "9.5.0",
|
|
310
|
+
"@mui/system": "9.5.0",
|
|
311
|
+
"@mui/x-charts": "9.15.0",
|
|
127
312
|
"@napi-rs/canvas": "^1.0.10",
|
|
313
|
+
"@nivo/bump": "0.99.0",
|
|
314
|
+
"@nivo/chord": "0.99.0",
|
|
315
|
+
"@nivo/core": "0.99.0",
|
|
316
|
+
"@nivo/swarmplot": "0.99.0",
|
|
128
317
|
"@observablehq/plot": "^0.6.17",
|
|
318
|
+
"@perspective-dev/client": "5.5.1",
|
|
319
|
+
"@perspective-dev/server": "5.5.1",
|
|
320
|
+
"@perspective-dev/viewer": "5.5.1",
|
|
321
|
+
"@react-three/fiber": "9.8.1",
|
|
322
|
+
"@react-three/test-renderer": "9.1.1",
|
|
129
323
|
"@resvg/resvg-js": "^2.6.2",
|
|
324
|
+
"@sveltejs/package": "2.5.8",
|
|
325
|
+
"@sveltejs/vite-plugin-svelte": "4.0.4",
|
|
326
|
+
"@tanstack/charts": "1.1.0",
|
|
130
327
|
"@testing-library/dom": "^10.4.2",
|
|
131
328
|
"@testing-library/jest-dom": "^7.0.1",
|
|
132
329
|
"@testing-library/react": "^16.3.3",
|
|
330
|
+
"@testing-library/svelte": "5.4.2",
|
|
133
331
|
"@types/d3": "^7.4.3",
|
|
134
332
|
"@types/jsdom": "^21.1.7",
|
|
135
333
|
"@types/plotly.js": "^3.0.15",
|
|
136
334
|
"@types/react": "^19.3.0",
|
|
137
335
|
"@types/react-dom": "^19.3.0",
|
|
336
|
+
"@types/three": "0.186.0",
|
|
337
|
+
"@unovis/ts": "1.7.1",
|
|
138
338
|
"chart.js": "4.5.1",
|
|
339
|
+
"cytoscape": "3.34.3",
|
|
139
340
|
"d3": "^7.9.0",
|
|
140
341
|
"echarts": "^6.1.0",
|
|
141
342
|
"jsdom": "^26.1.0",
|
|
343
|
+
"layerchart": "2.5.1",
|
|
344
|
+
"lightweight-charts": "5.2.1",
|
|
142
345
|
"linkedom": "^0.18",
|
|
346
|
+
"maplibre-gl": "6.14.0",
|
|
143
347
|
"react": "^19.3.0",
|
|
348
|
+
"react-chartjs-2": "5.3.1",
|
|
144
349
|
"react-dom": "^19.3.0",
|
|
350
|
+
"react-is": "^19.3.0",
|
|
351
|
+
"recharts": "3.10.1",
|
|
352
|
+
"svelte": "5.57.1",
|
|
353
|
+
"svelte-check": "4.7.6",
|
|
354
|
+
"three": "0.186.1",
|
|
355
|
+
"uplot": "1.6.32",
|
|
145
356
|
"vega": "^6.4.0",
|
|
146
357
|
"vega-lite": "^6.4.3",
|
|
147
|
-
"
|
|
358
|
+
"victory": "37.3.6",
|
|
359
|
+
"@sportsdataverse/sporty": "^0.2.0"
|
|
148
360
|
},
|
|
149
361
|
"scripts": {
|
|
150
|
-
"build": "tsup",
|
|
151
|
-
"typecheck": "tsc -p tsconfig.json",
|
|
362
|
+
"build": "tsup && svelte-package -i src/svelte -o dist/svelte --tsconfig ./tsconfig.svelte.json && node ../../tools/svelte-dts.mjs dist/svelte",
|
|
363
|
+
"typecheck": "tsc -p tsconfig.json && tsc -p tsconfig.unovis.json && svelte-check --tsconfig ./tsconfig.svelte.json --fail-on-warnings",
|
|
152
364
|
"test": "vitest run",
|
|
153
365
|
"api:report": "node ../../tools/api-extractor-all.mjs --local",
|
|
154
366
|
"api:check": "node ../../tools/api-extractor-all.mjs",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rank.ts","../src/manifest.ts","../src/marks.ts"],"names":[],"mappings":"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","file":"chunk-KKH6ABMA.js","sourcesContent":["/** Source preference, best first; unknown sources rank 5. Shared by the shard generator and the lazy full-manifest path. */\nexport const SOURCE_RANK: Readonly<Record<string, number>> = {\n espn: 0,\n nflverse: 1,\n nhl: 1,\n mlbstatic: 1,\n fox: 1,\n hockeytech: 2,\n cricinfo: 2,\n \"ncaa.com\": 3,\n \"nwhl.co\": 4,\n shiftstats: 4,\n wayback: 4,\n \"aaf.com\": 5,\n \"aaf-strip-crop\": 6,\n};\n\nexport interface Rankable {\n source_rank: number;\n valid_from: number | null;\n valid_to: number | null;\n first_seen: string;\n sha256: string;\n}\nconst desc = <T extends string | number>(a: T | null, b: T | null): number =>\n a === b ? 0 : a === null ? 1 : b === null ? -1 : a < b ? 1 : -1;\n/** Python `_ranked`: source_rank asc, open-ended (valid_to null) first, valid_to desc, first_seen desc, valid_from desc, sha256 asc; nulls last. */\nexport function compareMarks(a: Rankable, b: Rankable): number {\n return (\n a.source_rank - b.source_rank ||\n Number(a.valid_to !== null) - Number(b.valid_to !== null) ||\n desc(a.valid_to, b.valid_to) ||\n desc(a.first_seen, b.first_seen) ||\n desc(a.valid_from, b.valid_from) ||\n (a.sha256 < b.sha256 ? -1 : a.sha256 > b.sha256 ? 1 : 0)\n );\n}\n","import { type Alias, type MarkRow, archiveUrl } from \"./data/index.js\";\nimport { DownloadError } from \"./errors.js\";\nimport { SOURCE_RANK, compareMarks } from \"./rank.js\";\n\nexport const MANIFEST_URL = \"https://sdv.nyc3.cdn.digitaloceanspaces.com/assets/public/manifest/marks.csv\";\n\nexport interface ManifestRow {\n level: string;\n league: string;\n entity_id: string;\n mark_type: string;\n variant: string;\n valid_from: string;\n valid_to: string;\n source: string;\n sha256: string;\n ext: string;\n width: string;\n height: string;\n archive_url: string;\n first_seen: string;\n}\n\n/** archive_url reaches the web adapters' HTML (Python drops rows failing SAFE_URL); a row must carry exactly the content-addressed URL the loader derives, or it is dropped. */\nexport const safeArchive = (m: Pick<ManifestRow, \"archive_url\" | \"sha256\" | \"ext\">): boolean =>\n /^[0-9a-f]{64}$/.test(m.sha256) &&\n /^[a-z0-9]+$/.test(m.ext) &&\n m.archive_url === archiveUrl(m.sha256, m.ext);\n\n/** RFC 4180 over the whole text (quoted commas, doubled quotes, embedded newlines; CRLF or LF); rows keyed by header name. */\nexport function parseManifestCsv(text: string): ManifestRow[] {\n const src = text.replace(/^\\uFEFF/, \"\"); // a BOM would make the first header \"\\uFEFFlevel\" and drop every row\n const records: string[][] = [];\n let rec: string[] = [];\n let cur = \"\";\n let q = false;\n const endRecord = (): void => {\n rec.push(cur);\n cur = \"\";\n if (rec.length > 1 || rec[0] !== \"\") records.push(rec);\n rec = [];\n };\n for (let i = 0; i < src.length; i++) {\n const c = src[i] as string;\n if (q) {\n if (c !== '\"') cur += c;\n else if (src[i + 1] === '\"') {\n cur += '\"';\n i++;\n } else q = false;\n } else if (c === '\"') q = true;\n else if (c === \",\") {\n rec.push(cur);\n cur = \"\";\n } else if (c === \"\\n\") endRecord();\n else if (c === \"\\r\" && src[i + 1] === \"\\n\") continue;\n else cur += c;\n }\n if (cur !== \"\" || rec.length > 0) endRecord();\n const header = records[0] ?? [];\n return records.slice(1).map((f) => {\n const r: Record<string, string> = {};\n header.forEach((h, i) => {\n r[h] = f[i] ?? \"\";\n });\n return r as unknown as ManifestRow;\n });\n}\n\nconst int = (s: string): number | null => (s === \"\" ? null : Number.parseInt(s, 10));\nconst key = (source: string, id: string): string => `${source}:${id}`.trim().toLowerCase();\n\n/** mark aliases: key → (team_id, union range), unique team mappings only. */\nexport function markAliases(\n aliases: readonly Alias[],\n): Map<string, { team_id: string; from: number | null; to: number | null }> {\n const by = new Map<\n string,\n { teams: Set<string>; from: number | null; to: number | null; anyOpenFrom: boolean; anyOpenTo: boolean }\n >();\n for (const a of aliases) {\n if (a.id_system !== \"mark\") continue;\n const k = a.value.trim().toLowerCase();\n const e = by.get(k) ?? {\n teams: new Set<string>(),\n from: null,\n to: null,\n anyOpenFrom: false,\n anyOpenTo: false,\n };\n e.teams.add(a.team_id);\n if (a.valid_from === null) e.anyOpenFrom = true;\n else e.from = e.from === null ? a.valid_from : Math.min(e.from, a.valid_from);\n if (a.valid_to === null) e.anyOpenTo = true;\n else e.to = e.to === null ? a.valid_to : Math.max(e.to, a.valid_to);\n by.set(k, e);\n }\n const out = new Map<string, { team_id: string; from: number | null; to: number | null }>();\n for (const [k, e] of by)\n if (e.teams.size === 1)\n out.set(k, {\n team_id: [...e.teams][0] as string,\n from: e.anyOpenFrom ? null : e.from,\n to: e.anyOpenTo ? null : e.to,\n });\n return out;\n}\n\n/** Alias-mapped, safe-URL-filtered, ranked marks of one league; `archive_url` is derived, never copied. Not deduped. */\nexport function manifestMarks(\n league: string,\n rows: readonly ManifestRow[],\n aliases: readonly Alias[],\n): MarkRow[] {\n const ma = markAliases(aliases);\n const out: MarkRow[] = [];\n for (const m of rows) {\n if (m.level !== \"team\" || m.league !== league || !safeArchive(m)) continue;\n const a = ma.get(key(m.source, m.entity_id));\n if (!a) continue;\n const vf = int(m.valid_from);\n const vt = int(m.valid_to);\n out.push({\n team_id: a.team_id,\n mark_type: m.mark_type as \"logo\" | \"wordmark\",\n variant: m.variant,\n valid_from: vf === null ? a.from : a.from === null ? vf : Math.max(vf, a.from), // pl.max_horizontal (nulls ignored)\n valid_to: vt === null ? a.to : a.to === null ? vt : Math.min(vt, a.to), // pl.min_horizontal\n source: m.source,\n first_seen: m.first_seen,\n sha256: m.sha256,\n ext: m.ext,\n width: int(m.width),\n height: int(m.height),\n source_rank: SOURCE_RANK[m.source] ?? 5, // after height: the shard generator's JSON key order\n archive_url: archiveUrl(m.sha256, m.ext),\n });\n }\n return out.sort(compareMarks);\n}\n\nlet cached: Promise<ManifestRow[]> | undefined;\nexport function resetManifestCache(): void {\n cached = undefined;\n}\n/** The CDN manifest, fetched once per process (a failure is not cached). */\nexport function fetchManifest(o: { fetch?: typeof fetch } = {}): Promise<ManifestRow[]> {\n const f = o.fetch ?? globalThis.fetch;\n cached ??= (async () => {\n const r = await f(MANIFEST_URL);\n if (!r.ok)\n throw new DownloadError(\n `manifest download failed: ${MANIFEST_URL} answered ${r.status}`,\n MANIFEST_URL,\n r.status,\n );\n return parseManifestCsv(await r.text());\n })().catch((e: unknown) => {\n cached = undefined;\n throw e;\n });\n return cached;\n}\n","import { VARIANTS } from \"./data/index.js\";\nimport type { League, LeagueData, MarkRow } from \"./data/index.js\";\nimport { InputError, UnresolvedTeamError, warn } from \"./errors.js\";\nimport { getLeagueSync, loadLeague } from \"./index-data.js\";\nimport { fetchManifest, manifestMarks } from \"./manifest.js\";\nimport { normSeason } from \"./normalize.js\";\nimport { type ResolveOptions, type Value, resolveSync } from \"./resolve.js\";\nimport type { IdSystem, MarkType, SeasonInput, Variant } from \"./types.js\";\n\nexport interface SelectOptions {\n season?: SeasonInput;\n variant?: Variant;\n markType?: MarkType;\n}\nexport interface LogoUrlOptions extends SelectOptions {\n idSystem?: IdSystem;\n strict?: boolean;\n}\n\n/** Drops undefined values (exactOptionalPropertyTypes). */\nconst ro = (o: {\n season?: SeasonInput;\n idSystem?: IdSystem | undefined;\n strict?: boolean | undefined;\n}): ResolveOptions => Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined));\n\nconst repr = (v: Value): string => (typeof v === \"string\" ? `'${v}'` : String(v));\n\nconst covers = (lo: number | null, hi: number | null, s: number): boolean =>\n (lo === null || s >= lo) && (hi === null || s <= hi);\n\nfunction checkMarkType(markType: string): void {\n if (markType !== \"logo\" && markType !== \"wordmark\")\n throw new InputError(`markType must be \"logo\" or \"wordmark\", got ${JSON.stringify(markType)}`);\n}\nfunction checkVariant(variant: string, league: League, d: LeagueData): void {\n if (variant === \"default\" || variant === \"dark\") return;\n if ((VARIANTS as readonly string[]).includes(variant)) return;\n const known = [...new Set(d.marks.map((m) => m.variant))].sort();\n throw new InputError(\n `unknown variant ${JSON.stringify(variant)} for ${league}; use \"default\", \"dark\" or one of ${known.join(\", \")}`,\n );\n}\n\n/** Port of `select_mark` (post-preload): requested variant, then (keeping polarity) default / polarity variants, then any; within each, season-covering rows (dated before open-ended), else the best row. Rows are already ranked best-first. */\nexport function selectMarkSync(team: Value, league: League, o: SelectOptions = {}): MarkRow | undefined {\n const markType = o.markType ?? \"logo\";\n const variant = o.variant ?? \"default\";\n checkMarkType(markType);\n const s = normSeason(o.season, league);\n const d = getLeagueSync(league);\n checkVariant(variant, league, d);\n const teamId = resolveSync(team, league, { season: s });\n if (teamId === undefined) return undefined;\n const rows = d.marks.filter((r) => r.team_id === teamId && r.mark_type === markType);\n const side = variant === \"dark\" ? \"dark\" : \"light\";\n const polarity = (v: string): boolean => v === `on_${side}` || v.endsWith(`_on_${side}`);\n const requested = (v: string): boolean => v === variant;\n const dflt = (v: string): boolean => v === \"default\";\n const order = side === \"dark\" ? [requested, polarity, dflt] : [requested, dflt, polarity];\n for (const keep of [...order, null]) {\n const found = keep ? rows.filter((r) => keep(r.variant)) : rows;\n if (s !== null) {\n const covering = found.filter((r) => covers(r.valid_from, r.valid_to, s));\n const dated = covering.filter((r) => r.valid_from !== null || r.valid_to !== null);\n for (const set of [dated, covering]) if (set.length) return set[0];\n }\n if (found.length) return found[0];\n }\n return undefined;\n}\nexport async function selectMark(\n team: Value,\n league: League,\n o: SelectOptions = {},\n): Promise<MarkRow | undefined> {\n await loadLeague(league);\n return selectMarkSync(team, league, o);\n}\n\n/** Port of `logo_url` (post-preload): archive URL of the team's logo/wordmark for the season; `undefined` for an unknown team (the resolver warns) or when no mark of that type exists (one warning). */\nexport function logoUrlSync(team: Value, league: League, o: LogoUrlOptions = {}): string | undefined {\n const markType = o.markType ?? \"logo\";\n checkMarkType(markType);\n checkVariant(o.variant ?? \"default\", league, getLeagueSync(league));\n const teamId = resolveSync(team, league, ro({ season: o.season, idSystem: o.idSystem, strict: o.strict }));\n if (teamId === undefined) return undefined;\n const row = selectMarkSync(teamId, league, o);\n if (row === undefined) {\n warn(`marks:${league}:${teamId}:${markType}`, `no ${markType} archived for ${repr(team)} (${league})`);\n return undefined;\n }\n return row.archive_url;\n}\n/**\n * Archive URL of a team's logo (or wordmark, `markType`) for the season, loading the league first; `undefined` for an\n * unknown team (the resolver warns) or when no mark of that type is archived (one warning).\n *\n * @example\n * ```ts\n * import { logoUrl } from \"@sportsdataverse/sdvplot\";\n *\n * await logoUrl(\"KC\", \"nfl\", { markType: \"wordmark\" });\n * ```\n */\nexport async function logoUrl(\n team: Value,\n league: League,\n o: LogoUrlOptions = {},\n): Promise<string | undefined> {\n await loadLeague(league);\n return logoUrlSync(team, league, o);\n}\n\n/**\n * Every archived mark for one team, best first (logos and wordmarks, every variant and source).\n * Default: the committed shard (deduped, ranked rows). `full: true` fetches the CDN manifest lazily (once per process)\n * and returns every manifest row for the team, including rows the shard dedupe dropped; a failed download throws\n * `DownloadError`. Both paths filter on the team only. `fetch` overrides the global fetch for the manifest download.\n * Throws `UnresolvedTeamError` when the team is null or does not resolve (strict, as Python).\n */\nexport async function marks(\n team: Value,\n league: League,\n o: { season?: SeasonInput; idSystem?: IdSystem; full?: boolean; fetch?: typeof fetch } = {},\n): Promise<readonly MarkRow[]> {\n const d = await loadLeague(league);\n const teamId = resolveSync(team, league, ro({ season: o.season, idSystem: o.idSystem, strict: true }));\n if (teamId === undefined) throw new UnresolvedTeamError(`marks() needs a team, got ${String(team)}`);\n if (!o.full) return d.marks.filter((r) => r.team_id === teamId);\n const fo = o.fetch === undefined ? {} : { fetch: o.fetch };\n return manifestMarks(league, await fetchManifest(fo), d.aliases).filter((r) => r.team_id === teamId);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shots/aggregate.ts","../src/shots/diff.ts","../src/content-id.ts","../src/shots/signature.ts"],"names":["R","lerp"],"mappings":"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","file":"chunk-QY65DUEF.js","sourcesContent":["// Cell aggregations, ported from blazing-the-nets `main` lib/data/aggregate.ts (@31427b8). Pure; the parity gate\n// is fixtures/shots/oracle.json (hexagons). Squares (J38) run the same code on `squarebin`'s lattice.\nimport { BASKETBALL_ZONES, type BasketballZone, basketballZoneOf } from \"@sportsdataverse/sporty\";\nimport { type Binner, type BinnerOptions, type Lattice, binner } from \"../bins/index.js\";\n\n/** A number is a hexagon radius (the parity default); an object is any lattice, squares included (J38). */\nconst latticeOf = (cell: number | BinnerOptions): Binner =>\n binner(typeof cell === \"number\" ? { radius: cell } : cell);\n\n/**\n * One field-goal attempt, as the `nba_stats_shots` release ships it: `x_legacy`/`y_legacy` in tenths of a foot,\n * hoop at the origin, y toward half court; `shot_distance` in ROUNDED feet. Map other schemas once, first.\n */\nexport interface ShotRow {\n readonly x_legacy: number;\n readonly y_legacy: number;\n readonly shot_distance: number;\n /** 2 or 3; zones read it (the scorer's call, not the coordinates). */\n readonly shot_value: number;\n /** `\"Made\"` or `\"Missed\"`. */\n readonly shot_result: string;\n}\n\n/** Attempts, makes and FG% (`makes / attempts`, null with no attempts): the counts every shot aggregate carries. */\nexport interface Split {\n readonly attempts: number;\n readonly makes: number;\n readonly fgPct: number | null;\n}\n\n/** @internal */\nexport const made = (s: ShotRow): boolean => s.shot_result === \"Made\"; // aggregate.ts:14\n/** @internal */\nexport const split = (attempts: number, makes: number): Split => ({\n attempts,\n makes,\n fgPct: attempts > 0 ? makes / attempts : null,\n}); // aggregate.ts:16-18\n\n/** The shot's zone (sporty, legacy tenths). */\nexport const shotZone = (s: ShotRow): BasketballZone =>\n basketballZoneOf(s.x_legacy, s.y_legacy, s.shot_value, { scale: 10 });\n\n/**\n * Inside the sidelines and in front of the baseline (aggregate.ts:81-84); releases carry a few impossible points.\n * Also finite: `main` lets `y_legacy = Infinity` through. x's bound already rejects NaN and ±Infinity.\n */\nconst onCourt = (s: ShotRow): boolean =>\n Math.abs(s.x_legacy) <= 250 && s.y_legacy >= -52.5 && Number.isFinite(s.y_legacy);\n\n/** One cell of `binShots`: its centre, counts, mean shot distance and majority zone. */\nexport interface CellBin extends Split {\n /** Cell centre, legacy tenths. */\n readonly x: number;\n readonly y: number;\n readonly meanDistance: number;\n /** The zone most of the cell's attempts fall in (first seen wins a tie). */\n readonly zone: BasketballZone;\n}\n\n/**\n * Bin shots in DATA space (legacy tenths), dropping off-court points (aggregate.ts:86-104) and points with a\n * non-finite coordinate (`main` lets `y_legacy = Infinity` through). `cell` is a hexagon\n * radius (10 = a 1 ft hex) or any `binner` lattice, e.g. `{ shape: \"square\", side: 15 }`. Bins come out in\n * first-seen order (d3-hexbin's, for hexagons).\n *\n * @example\n * ```ts\n * import { binShots } from \"@sportsdataverse/sdvplot/shots\";\n *\n * // Brooklyn shots from the sportsdataverse-data nba_stats_shots release, 2025-26\n * const shots = [\n * { x_legacy: -1, y_legacy: 7, shot_distance: 1, shot_value: 2, shot_result: \"Made\" },\n * { x_legacy: 0, y_legacy: 0, shot_distance: 0, shot_value: 2, shot_result: \"Missed\" },\n * { x_legacy: -44, y_legacy: 252, shot_distance: 26, shot_value: 3, shot_result: \"Made\" },\n * ];\n * binShots(shots, 15);\n * binShots(shots, { shape: \"square\", side: 15 });\n * ```\n */\nexport function binShots(shots: readonly ShotRow[], cell: number | BinnerOptions): CellBin[] {\n const bins = latticeOf(cell).bins(shots.filter(onCourt), {\n x: (s) => s.x_legacy,\n y: (s) => s.y_legacy,\n });\n return bins.map((b) => {\n let distance = 0;\n let makes = 0;\n const zones = new Map<BasketballZone, number>();\n for (const s of b) {\n distance += s.shot_distance;\n if (made(s)) makes += 1;\n const z = shotZone(s);\n zones.set(z, (zones.get(z) ?? 0) + 1);\n }\n let zone: BasketballZone = \"mid_range\";\n let most = -1;\n for (const [z, n] of zones) {\n if (n > most) {\n zone = z;\n most = n;\n }\n }\n return { x: b.x, y: b.y, ...split(b.length, makes), meanDistance: distance / b.length, zone };\n });\n}\n\n/**\n * League attempts behind a cell's league rate before it falls back to the zone, and the colour prior: one number for\n * both (aggregate.ts:106-110). It is blazing-the-nets' tunable, set in its commit 25c3ab9f (\"shrunk colours\"), not a\n * derived or measured constant; `cellsVsLeague`'s `minLeague`, `shrunkDiff`'s `k` and `signaturePoints`' `prior`\n * override it per call.\n */\nexport const LEAGUE_PRIOR_ATTEMPTS = 25;\n\n/**\n * FG% minus the league rate `league`, shrunk toward it by a `k`-attempt prior: `(makes + k*L)/(attempts + k) - L`\n * (aggregate.ts:112-119). `k = 0` is the raw difference (blazing-the-nets `master`). For colour, not labels.\n *\n * @example\n * ```ts\n * import { LEAGUE_PRIOR_ATTEMPTS, shrunkDiff } from \"@sportsdataverse/sdvplot/shots\";\n *\n * // Brooklyn 2025-26, the radius-15 hexagon centred (77.9, 45): 4 of 4, where the league made 270 of 636\n * shrunkDiff(4, 4, 270 / 636, LEAGUE_PRIOR_ATTEMPTS); // +0.08, not the raw +0.58\n * ```\n */\nexport function shrunkDiff(\n makes: number,\n attempts: number,\n league: number,\n k: number = LEAGUE_PRIOR_ATTEMPTS,\n): number {\n return (makes + k * league) / (attempts + k) - league;\n}\n\n/** One league cell in a `LeagueIndex`: centre (legacy tenths), attempts and FG%. */\nexport interface LeagueCell {\n readonly x: number;\n readonly y: number;\n readonly attempts: number;\n readonly fgPct: number | null;\n}\n/**\n * A season's league cells and zone rates on one lattice (`{ radius }` for hexagons, `{ shape: \"square\", side }`):\n * plain JSON, computed once (aggregate.ts:125-146). blazing-the-nets names the cells `hexes`; here they are `cells`\n * for either shape, so map that key when loading its JSON.\n */\nexport type LeagueIndex = Lattice & {\n readonly cells: readonly LeagueCell[];\n readonly zones: Readonly<Record<BasketballZone, Split>>;\n};\n/** A player cell with the league FG% it is compared to (`cellsVsLeague`, `cellsVsDistance`); null with no league figure. */\nexport interface CellVsLeague extends CellBin {\n readonly leagueFgPct: number | null;\n}\n\n/**\n * The league index every player chart compares against (aggregate.ts:140-146), on a hexagon radius or any `binner`\n * lattice; it stores the resolved lattice, so `equalArea` becomes the square's `side`.\n *\n * @example\n * ```ts\n * import { leagueIndex } from \"@sportsdataverse/sdvplot/shots\";\n *\n * // Brooklyn shots from the sportsdataverse-data nba_stats_shots release, 2025-26\n * const shots = [\n * { x_legacy: -1, y_legacy: 7, shot_distance: 1, shot_value: 2, shot_result: \"Made\" },\n * { x_legacy: 0, y_legacy: 0, shot_distance: 0, shot_value: 2, shot_result: \"Missed\" },\n * { x_legacy: -44, y_legacy: 252, shot_distance: 26, shot_value: 3, shot_result: \"Made\" },\n * ];\n * leagueIndex(shots, 15).cells;\n * ```\n */\nexport function leagueIndex(league: readonly ShotRow[], cell: number | BinnerOptions): LeagueIndex {\n const { lattice } = latticeOf(cell);\n return {\n ...lattice,\n cells: binShots(league, lattice).map(({ x, y, attempts, fgPct }) => ({ x, y, attempts, fgPct })),\n zones: statsByZone(league),\n };\n}\n\nconst centres = new WeakMap<LeagueIndex, Map<string, LeagueCell>>();\n/**\n * Player cells with the league FG% of the SAME cell (the player is binned on the index's own lattice, so the\n * centres are equal); a cell the league shot fewer than `minLeague` times from falls back to its zone's league rate\n * (aggregate.ts:155-165; blazing-the-nets `main`).\n *\n * @example\n * ```ts\n * import { cellsVsLeague, leagueIndex } from \"@sportsdataverse/sdvplot/shots\";\n *\n * // Brooklyn shots from the sportsdataverse-data nba_stats_shots release, 2025-26\n * const made = { x_legacy: 0, y_legacy: 0, shot_distance: 0, shot_value: 2, shot_result: \"Made\" };\n * const missed = { ...made, shot_result: \"Missed\" };\n * cellsVsLeague([made], leagueIndex([made, missed], 15));\n * ```\n */\nexport function cellsVsLeague(\n player: readonly ShotRow[],\n league: LeagueIndex,\n minLeague: number = LEAGUE_PRIOR_ATTEMPTS,\n): CellVsLeague[] {\n let byCentre = centres.get(league);\n if (byCentre === undefined) {\n byCentre = new Map(league.cells.map((h) => [`${h.x},${h.y}`, h]));\n centres.set(league, byCentre);\n }\n const index = byCentre;\n return binShots(player, league).map((h) => {\n const l = index.get(`${h.x},${h.y}`);\n return { ...h, leagueFgPct: l && l.attempts >= minLeague ? l.fgPct : league.zones[h.zone].fgPct };\n });\n}\n\n/** How a cell's attempts set its size: `main` (sqrt to the 95th percentile) or `master` (linear, capped). */\nexport type SizeRule = \"sqrt-p95\" | \"linear-cap\";\n/** `sizeCells`' result: each cell's size, the cap, the size of any count, and the counts for a size key. */\nexport interface CellSizes {\n /** Size per cell in legacy tenths: a hexagon's circumradius, or a square's side. 0 hides a cell. */\n readonly r: readonly number[];\n /** Attempts at which size saturates. */\n readonly cap: number;\n /** The size of any attempt count, for a size key. */\n readonly size: (attempts: number) => number;\n /** A size key: 1, half the cap, the cap (blazing-the-nets `main` `lib/charts/hexShotChart.ts:199`). */\n readonly steps: readonly number[];\n}\n\n/** d3-array 3.2.4 `quantile` (src/quantile.js:10-20, R-7) over finite values; undefined when there are none. */\nfunction quantile(values: readonly number[], p: number): number | undefined {\n const v = values.filter((x) => x != null && !Number.isNaN(x)).sort((a, b) => a - b);\n const n = v.length;\n if (n === 0) return undefined;\n if (p <= 0 || n < 2) return v[0];\n if (p >= 1) return v[n - 1];\n const i = (n - 1) * p;\n const i0 = Math.floor(i);\n const v0 = v[i0] as number;\n const v1 = v[i0 + 1] as number;\n return v0 + (v1 - v0) * (i - i0);\n}\n\n/**\n * Frequency size for each cell (the dual encoding's size half; colour is `diffScale`), on the lattice's full cell\n * size `R` (a hexagon's radius, or a square's side; pass the index itself: `sizeCells(cells, index)`).\n * `\"sqrt-p95\"` (default, `main` `hexShotChart.ts:65-81`): a sqrt scale of attempts to `R`, capped at the 95th\n * percentile so one busy rim cell does not shrink the rest; area follows attempts for either shape.\n * `\"linear-cap\"` (`master` `Hexagon/index.js:22-30`): attempts in tenths, capped at `R`, cells under 2 attempts\n * hidden.\n *\n * @example\n * ```ts\n * import { binShots, sizeCells } from \"@sportsdataverse/sdvplot/shots\";\n *\n * // Brooklyn shots from the sportsdataverse-data nba_stats_shots release, 2025-26\n * const shots = [\n * { x_legacy: -1, y_legacy: 7, shot_distance: 1, shot_value: 2, shot_result: \"Made\" },\n * { x_legacy: 0, y_legacy: 0, shot_distance: 0, shot_value: 2, shot_result: \"Missed\" },\n * { x_legacy: -44, y_legacy: 252, shot_distance: 26, shot_value: 3, shot_result: \"Made\" },\n * ];\n * sizeCells(binShots(shots, 15), { radius: 15 }).r; // the 2-attempt rim cell is full size, the 1-attempt three smaller\n * ```\n */\nexport function sizeCells(\n cells: readonly { readonly attempts: number }[],\n o: BinnerOptions & { readonly rule?: SizeRule },\n): CellSizes {\n const R = binner(o).size; // throws InputError on a size that is not a finite number > 0\n let cap: number;\n let size: (a: number) => number;\n if ((o.rule ?? \"sqrt-p95\") === \"sqrt-p95\") {\n cap = Math.max(\n 2,\n Math.ceil(\n quantile(\n cells.map((h) => h.attempts),\n 0.95,\n ) ?? 2,\n ),\n );\n const top = Math.sqrt(cap);\n size = (a) => R * Math.min(1, Math.max(0, Math.sqrt(Math.max(0, a)) / top));\n } else {\n cap = R;\n size = (a) => (a > R ? R : a < 2 ? 0 : a);\n }\n return {\n r: cells.map((h) => size(h.attempts)),\n cap,\n size,\n steps: [1, Math.max(2, Math.round(cap / 2)), cap],\n };\n}\n\n/**\n * Attempts, makes and FG% per zone (aggregate.ts:269-277).\n *\n * @example\n * ```ts\n * import { statsByZone } from \"@sportsdataverse/sdvplot/shots\";\n *\n * // a Brooklyn corner three, 2025-26 (sportsdataverse-data nba_stats_shots)\n * statsByZone([{ x_legacy: 237, y_legacy: 34, shot_distance: 24, shot_value: 3, shot_result: \"Made\" }]);\n * ```\n */\nexport function statsByZone(shots: readonly ShotRow[]): Record<BasketballZone, Split> {\n const acc = new Map<BasketballZone, [number, number]>(BASKETBALL_ZONES.map((z) => [z, [0, 0]]));\n for (const s of shots) {\n const z = acc.get(shotZone(s));\n if (z === undefined) continue;\n z[0] += 1;\n if (made(s)) z[1] += 1;\n }\n return Object.fromEntries(\n BASKETBALL_ZONES.map((z) => {\n const [a, m] = acc.get(z) ?? [0, 0];\n return [z, split(a, m)];\n }),\n ) as Record<BasketballZone, Split>;\n}\n","// diffScale reproduces blazing-the-nets' diff colours with no d3 at runtime. \"rdbu\" = main lib/charts/theme.ts:47-64;\n// \"master\" = master src/components/HexShotchart/index.js:57-64. The RdBu ramp ports d3-scale-chromatic 3.1.0\n// src/diverging/RdBu.js:13 + src/ramp.js:3 and d3-interpolate 3.0.1 src/basis.js:1-19 + src/rgb.js:28-52 (ISC,\n// Mike Bostock; notice in NOTICE.md). Strings match d3-color's `rgb(r, g, b)` exactly.\nimport { InputError } from \"../errors.js\";\n\ntype Rgb = readonly [number, number, number];\nconst hex = (s: string): Rgb => [\n Number.parseInt(s.slice(0, 2), 16),\n Number.parseInt(s.slice(2, 4), 16),\n Number.parseInt(s.slice(4, 6), 16),\n];\nconst RDBU: readonly Rgb[] = (\n \"67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061\".match(/.{6}/g) ?? []\n).map(hex);\nconst MASTER: readonly Rgb[] = [\"8d0801\", \"bf0603\", \"f4d58d\", \"708d81\", \"195943\"].map(hex);\nconst MASTER_DOMAIN = [-0.99, -0.15, 0, 0.15, 0.99] as const;\nconst DARK_NEUTRAL: Rgb = [0x30, 0x30, 0x30]; // theme.ts:54\n\n/** d3-color's formatter: each channel rounded and clamped to 0-255. */\nconst clampi = (v: number): number => Math.max(0, Math.min(255, Math.round(v) || 0));\nconst fmt = (c: Rgb): string => `rgb(${clampi(c[0])}, ${clampi(c[1])}, ${clampi(c[2])})`;\n\nfunction basis(t1: number, v0: number, v1: number, v2: number, v3: number): number {\n const t2 = t1 * t1;\n const t3 = t2 * t1;\n return (\n ((1 - 3 * t1 + 3 * t2 - t3) * v0 +\n (4 - 6 * t2 + 3 * t3) * v1 +\n (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 +\n t3 * v3) /\n 6\n );\n}\nfunction spline(values: readonly number[], tIn: number): number {\n const n = values.length - 1;\n let t = tIn;\n let i: number;\n if (t <= 0) {\n t = 0;\n i = 0;\n } else if (t >= 1) {\n t = 1;\n i = n - 1;\n } else i = Math.floor(t * n);\n const v1 = values[i] as number;\n const v2 = values[i + 1] as number;\n const v0 = i > 0 ? (values[i - 1] as number) : 2 * v1 - v2;\n const v3 = i < n - 1 ? (values[i + 2] as number) : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n}\nconst channel = (k: 0 | 1 | 2): number[] => RDBU.map((c) => c[k]);\nconst R = channel(0);\nconst G = channel(1);\nconst B = channel(2);\n/** d3.interpolateRdBu(t), unrounded. */\nconst rdbu = (t: number): Rgb => [spline(R, t), spline(G, t), spline(B, t)];\n/** d3.interpolateRgb(a, b)(t). */\nconst lerp = (a: Rgb, b: Rgb, t: number): Rgb => [\n a[0] + t * (b[0] - a[0]),\n a[1] + t * (b[1] - a[1]),\n a[2] + t * (b[2] - a[2]),\n];\n/** A d3 piecewise scaleLinear over colours: bisectRight segment, unclamped t unless the input was clamped. */\nfunction piecewise(domain: readonly number[], range: readonly Rgb[], x: number): Rgb {\n let i = 1;\n while (i < domain.length - 1 && (domain[i] as number) <= x) i++;\n const a = domain[i - 1] as number;\n const b = domain[i] as number;\n return lerp(range[i - 1] as Rgb, range[i] as Rgb, (x - a) / (b - a));\n}\n\n/** The diff colours: `\"rdbu\"` (blazing-the-nets `main`, the default) or `\"master\"` (its 2021 five stops). */\nexport type DiffPalette = \"rdbu\" | \"master\";\n/** Options for `diffScale`. */\nexport interface DiffScaleOptions {\n /**\n * `\"rdbu\"` (default): RdBu reversed, above league red (blazing-the-nets `main`), clamped at `±domain`.\n * `\"master\"`: the 2021 five-stop red-yellow-green, UNCLAMPED like master's d3 `scaleLinear`: a diff past the end\n * stops (±0.99) extrapolates, each channel then clamped to 0-255. An infinite diff takes the end colour (d3 gives\n * `rgb(0, 0, 0)` for `Infinity` and `rgb(0, 255, 0)` for `-Infinity`).\n */\n palette?: DiffPalette;\n /** `\"dark\"` swaps RdBu's near-white centre for `#303030` so an average mark recedes (`theme.ts:52-58`). Ignored by `\"master\"`. */\n theme?: \"light\" | \"dark\";\n /** Saturation in FG% fraction, finite and above 0 (else InputError); default 0.15 (`theme.ts:29`). `\"master\"` keeps its own stops. */\n domain?: number;\n /** Colour for `null` (no league figure); default `var(--sdv-muted, #525252)`. */\n nullColor?: string;\n}\n/** A diff colour function plus the equivalent Plot colour-scale options (for fills and `Plot.legend`). */\nexport interface DiffScale {\n (diff: number | null): string;\n /** Diffs to place gradient stops at: 5 across [-D, D] (`theme.ts:127-130`), or `master`'s own 5 stops. */\n readonly stops: readonly number[];\n readonly plot: {\n readonly type: \"diverging\" | \"linear\";\n readonly domain: readonly number[];\n readonly range?: readonly string[];\n readonly scheme?: \"RdBu\";\n readonly reverse?: boolean;\n readonly pivot?: number;\n readonly interpolate?: \"rgb\";\n readonly clamp: boolean;\n };\n}\n\n/**\n * The FG%-vs-league colour: `diffScale()(0.05)`. Light RdBu, dark RdBu, or `master`'s palette; `null` is\n * `nullColor`. `.plot` is the same scale as Observable Plot `color` options, so `Plot.legend({ color: s.plot })`\n * draws the matching key.\n *\n * @example\n * ```ts\n * import { diffScale } from \"@sportsdataverse/sdvplot/shots\";\n *\n * diffScale({ theme: \"dark\" })(0.05);\n * ```\n */\nexport function diffScale(o: DiffScaleOptions = {}): DiffScale {\n const palette = o.palette ?? \"rdbu\";\n const D = o.domain ?? 0.15;\n if (!(Number.isFinite(D) && D > 0))\n throw new InputError(`diffScale domain must be a finite number > 0, got ${String(D)}`);\n const nullColor = o.nullColor ?? \"var(--sdv-muted, #525252)\";\n let colour: (d: number) => string;\n let plot: DiffScale[\"plot\"];\n let stops: readonly number[] = [0, 0.25, 0.5, 0.75, 1].map((t) => (t * 2 - 1) * D);\n if (palette === \"master\") {\n const range = MASTER.map(fmt);\n // Deliberate divergence from d3: ±Infinity takes the end colour, where d3 gives black (+) or green (-).\n colour = (d) =>\n Number.isFinite(d)\n ? fmt(piecewise(MASTER_DOMAIN, MASTER, d))\n : (range[d > 0 ? range.length - 1 : 0] as string);\n plot = { type: \"linear\", domain: MASTER_DOMAIN, range, interpolate: \"rgb\", clamp: false };\n stops = MASTER_DOMAIN;\n } else if (o.theme === \"dark\") {\n // theme.ts:55-58: the ends are d3's ROUNDED rgb() strings, re-parsed, so round before interpolating.\n const ends: readonly Rgb[] = [rdbu(0.85), DARK_NEUTRAL, rdbu(0.15)].map(\n (c): Rgb => [clampi(c[0]), clampi(c[1]), clampi(c[2])],\n );\n const domain = [-D, 0, D];\n colour = (d) => fmt(piecewise(domain, ends, Math.max(-D, Math.min(D, d))));\n plot = { type: \"linear\", domain, range: ends.map(fmt), interpolate: \"rgb\", clamp: true };\n } else {\n // theme.ts:49-51: scaleDiverging(t => interpolateRdBu(1 - t)).domain([-D, 0, D]).clamp(true).\n const k = 0.5 / D;\n colour = (d) => fmt(rdbu(1 - Math.max(0, Math.min(1, 0.5 + d * k))));\n plot = { type: \"diverging\", scheme: \"RdBu\", reverse: true, domain: [-D, D], pivot: 0, clamp: true };\n }\n const scale = (diff: number | null): string =>\n diff === null || Number.isNaN(diff) ? nullColor : colour(diff);\n return Object.assign(scale, { plot, stops });\n}\n","/** FNV-1a: an id that is a function of the content it names, stable across SSR, hydration and prerender. */\nexport function contentId(prefix: string, text: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < text.length; i++) h = Math.imul(h ^ text.charCodeAt(i), 0x01000193);\n return `${prefix}-${(h >>> 0).toString(36)}`;\n}\n","// signaturePoints ports blazing-the-nets `main` lib/charts/shootingSignature.ts:13-100 (@31427b8).\nimport { contentId } from \"../content-id.js\";\nimport { InputError } from \"../errors.js\";\nimport { LEAGUE_PRIOR_ATTEMPTS, shrunkDiff } from \"./aggregate.js\";\nimport type { DistanceVsLeague } from \"./distance.js\";\n\n/** Gaussian kernel smoothing (`:27-39`); with `weights`, a weighted local mean. `sigma` 0 = no smoothing. */\nexport function kernelSmooth(\n values: readonly number[],\n weights: readonly number[] | null,\n sigma: number,\n): number[] {\n if (sigma === 0) return [...values];\n const reach = Math.ceil(sigma * 3);\n return values.map((_, i) => {\n let num = 0;\n let den = 0;\n for (let j = Math.max(0, i - reach); j <= Math.min(values.length - 1, i + reach); j++) {\n const k = Math.exp(-((i - j) ** 2) / (2 * sigma * sigma)) * (weights ? (weights[j] ?? 0) : 1);\n num += k * (values[j] ?? 0);\n den += k;\n }\n return den > 0 ? num / den : 0;\n });\n}\n\n/** Gaussian kernel sums, weight 1 at the bin itself (`:42-51`): effective makes or attempts near each bin. */\nexport function kernelSum(values: readonly number[], sigma: number): number[] {\n if (sigma === 0) return [...values];\n const reach = Math.ceil(sigma * 3);\n return values.map((_, i) => {\n let sum = 0;\n for (let j = Math.max(0, i - reach); j <= Math.min(values.length - 1, i + reach); j++) {\n sum += Math.exp(-((i - j) ** 2) / (2 * sigma * sigma)) * (values[j] ?? 0);\n }\n return sum;\n });\n}\n\n/** One shooting-signature sample (`signaturePoints`): the input of the Plot `shootingSignature` and d3 `appendSignature`. */\nexport interface SignaturePoint {\n readonly distance: number;\n /** Effective makes / attempts near this distance; null (a gap in the ribbon) under `minAttempts`. */\n readonly fgPct: number | null;\n readonly leagueFgPct: number | null;\n readonly share: number;\n /** The colour value: `shrunkDiff(makes, attempts, league, prior)`, null in a gap. */\n readonly colourDiff: number | null;\n}\n\n/** Options for `signaturePoints`; `master` mode is `{ step: 1, smooth: false, minAttempts: 1, prior: 0 }`. */\nexport interface SignatureOptions {\n /** Feet between samples; default 0.25 (`:16`). `master` sampled each 1-ft bin. */\n step?: number;\n /** Kernel smoothing (sigma 0.9 ft for makes/attempts, 1 for share, 0.6 for league; `:17`, `:76-77`); default true. */\n smooth?: boolean;\n /** No ribbon past the last bin with this many attempts, nor where the effective attempts fall below it; default 5 (`:19-21`). */\n minAttempts?: number;\n /** Colour prior in attempts (`shrunkDiff` k); default 25. 0 = the raw difference (`master`). */\n prior?: number;\n}\n\n/**\n * The shooting signature's samples: FG% from separately kernel-summed makes and attempts (a stretch with no\n * shots is a gap, never 0%), the smoothed league FG% and shot share, and the shrunk colour value (`:69-100`).\n * Input: 1-ft bins from `vsLeague(fgPctByDistance(player), fgPctByDistance(league))`.\n *\n * @example\n * ```ts\n * import { fgPctByDistance, signaturePoints, vsLeague } from \"@sportsdataverse/sdvplot/shots\";\n *\n * // Brooklyn shots from the sportsdataverse-data nba_stats_shots release, 2025-26\n * const made = { x_legacy: 0, y_legacy: 0, shot_distance: 0, shot_value: 2, shot_result: \"Made\" };\n * const missed = { ...made, shot_result: \"Missed\" };\n * signaturePoints(vsLeague(fgPctByDistance([made]), fgPctByDistance([made, missed])), { minAttempts: 1 })[0];\n * ```\n */\nexport function signaturePoints(\n bins: readonly DistanceVsLeague[],\n o: SignatureOptions = {},\n): SignaturePoint[] {\n const step = o.step ?? 0.25;\n if (!(step > 0)) throw new InputError(`signaturePoints step must be > 0, got ${String(step)}`);\n const smooth = o.smooth ?? true;\n const min = o.minAttempts ?? 5;\n const prior = o.prior ?? LEAGUE_PRIOR_ATTEMPTS;\n const attempts = kernelSum(\n bins.map((b) => b.attempts),\n smooth ? 0.9 : 0,\n );\n const makes = kernelSum(\n bins.map((b) => b.makes),\n smooth ? 0.9 : 0,\n );\n const share = kernelSmooth(\n bins.map((b) => b.share),\n null,\n smooth ? 1 : 0,\n );\n const league = kernelSmooth(\n bins.map((b) => b.leagueFgPct ?? 0),\n bins.map((b) => (b.leagueFgPct === null ? 0 : 1)),\n smooth ? 0.6 : 0,\n );\n let end: number | null = null; // ribbonEnd (`:54-57`); a loop, not findLast (ES2023, outside the ES2022 lib)\n for (let i = bins.length - 1; i >= 0; i--) {\n const b = bins[i];\n if (b !== undefined && b.attempts >= min) {\n end = b.distance;\n break;\n }\n }\n const last = bins.length - 1;\n const lerp = (a: readonly number[], d: number): number => {\n const i = Math.min(Math.floor(d), last);\n const j = Math.min(i + 1, last);\n const ai = a[i] ?? 0;\n return ai + ((a[j] ?? 0) - ai) * (d - i);\n };\n return Array.from({ length: Math.round(last / step) + 1 }, (_, k) => {\n const d = k * step;\n const a = lerp(attempts, d);\n const m = lerp(makes, d);\n const hasLeague = bins[Math.min(Math.round(d), last)]?.leagueFgPct != null;\n const leagueFgPct = hasLeague ? lerp(league, d) : null;\n const ok = end !== null && d <= end && a >= min;\n return {\n distance: d,\n fgPct: ok ? m / a : null,\n leagueFgPct,\n share: lerp(share, d),\n colourDiff: ok && leagueFgPct !== null ? shrunkDiff(m, a, leagueFgPct, prior) : null,\n };\n });\n}\n\n/**\n * What the Plot and d3 signatures share, so the two cannot drift (`main` `shootingSignature.ts:126-131`, `:183-193`):\n * the busiest drawn share, the last distance, the gradient's stops (drawn samples about half a foot apart, as\n * percentages of [0, maxFt]) and its id for a pixel x range. The stops are thinned by spacing, not by index: `main`'s\n * 0.25-ft samples keep every other one (`:192`), and `master`'s 1-ft samples keep every foot, as master drew them\n * (`ShootingSignature/index.js:52-67`). The gradient is in user space (pixels), so the id hashes that range\n * with the colours: the same signature at two widths never shares one, and two signatures never steal each other's\n * (`master`'s fixed id did, `Gradient.js:10`). Internal: not exported from `sdvplot/shots`.\n */\n/**\n * The signature ribbon's accessible name, shared by the Plot mark and its d3 twin.\n * @internal\n */\nexport const SIGNATURE_NAME = \"shooting signature: FG% by distance against the league\";\n\nexport function signatureGradient(\n points: readonly SignaturePoint[],\n fill: (diff: number | null) => string,\n): {\n readonly maxShare: number;\n readonly maxFt: number;\n readonly stops: readonly (readonly [offset: number, colour: string])[];\n readonly id: (x1: string, x2: string) => string;\n} {\n const drawn = points.filter((p) => p.fgPct !== null);\n const maxFt = points.at(-1)?.distance ?? 0;\n const step = (points[1]?.distance ?? 0) - (points[0]?.distance ?? 0);\n const every = step > 0 ? Math.max(1, Math.round(0.5 / step)) : 1; // 2 for main's 0.25 ft, 1 for master's 1 ft\n const stops = drawn\n .filter((_, i) => i % every === 0)\n .map((p) => [maxFt ? (p.distance / maxFt) * 100 : 0, fill(p.colourDiff)] as const);\n const text = stops.map((s) => s.join(\" \")).join(\";\");\n return {\n maxShare: Math.max(0, ...drawn.map((p) => p.share)) || 1,\n maxFt,\n stops,\n id: (x1, x2) => contentId(\"sdv-signature\", `${x1} ${x2}|${text}`),\n };\n}\n"]}
|
package/dist/chunk-RMT2GMFH.js
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { selectMarkSync } from './chunk-KKH6ABMA.js';
|
|
2
|
-
import { getLeagueSync, ESPN_HEADSHOT_LEAGUES, headshotUrl, normValue, HEADSHOT_ASPECT, resolveSync, loadLeague, loadGsis } from './chunk-TAXO3VXH.js';
|
|
3
|
-
import { InputError, warn } from './chunk-E7G7VSLV.js';
|
|
4
|
-
|
|
5
|
-
// src/placement.ts
|
|
6
|
-
function placedName(p, league, raw) {
|
|
7
|
-
const team = p.mark === null ? void 0 : getLeagueSync(league).teams.find((t) => t.team_id === p.id);
|
|
8
|
-
return team?.abbr || team?.name || String(raw);
|
|
9
|
-
}
|
|
10
|
-
var real = (v) => typeof v === "number" && !Number.isNaN(v);
|
|
11
|
-
function checkHeight(height) {
|
|
12
|
-
if (!real(height) || !(height > 0 && height <= 1))
|
|
13
|
-
throw new InputError(`height is a fraction of the plot height in (0, 1], got ${String(height)}`);
|
|
14
|
-
return height;
|
|
15
|
-
}
|
|
16
|
-
function checkAlpha(alpha) {
|
|
17
|
-
if (!real(alpha) || !(alpha >= 0 && alpha <= 1))
|
|
18
|
-
throw new InputError(`alpha is an opacity in [0, 1], got ${String(alpha)}`);
|
|
19
|
-
return alpha;
|
|
20
|
-
}
|
|
21
|
-
var missing = (v) => v === null || v === void 0 || typeof v === "number" && Number.isNaN(v);
|
|
22
|
-
function skipped(league, reason, values, on) {
|
|
23
|
-
if (!on || values.length === 0) return;
|
|
24
|
-
const extra = values.length > 10 ? ` and ${values.length - 10} more` : "";
|
|
25
|
-
const shown = `${values.slice(0, 10).map(String).join(", ")}${extra}`;
|
|
26
|
-
warn(`place:${league}:${reason}:${shown}`, `skipped ${values.length} point(s) ${reason}: ${shown}`);
|
|
27
|
-
}
|
|
28
|
-
function placeSync(xs, ys, teams, o) {
|
|
29
|
-
const { league, kind = "logo", variant = "default", strict = false, warn: on = true } = o;
|
|
30
|
-
if (!(xs.length === ys.length && ys.length === teams.length))
|
|
31
|
-
throw new InputError(
|
|
32
|
-
`x, y and teams must have the same length, got ${xs.length}, ${ys.length} and ${teams.length}`
|
|
33
|
-
);
|
|
34
|
-
const out = [];
|
|
35
|
-
const missingXY = [];
|
|
36
|
-
if (kind === "headshot") {
|
|
37
|
-
if (!Object.hasOwn(ESPN_HEADSHOT_LEAGUES, league))
|
|
38
|
-
throw new InputError(
|
|
39
|
-
`no ESPN headshots for league ${JSON.stringify(league)}; supported: ${Object.keys(ESPN_HEADSHOT_LEAGUES).sort().join(", ")}`
|
|
40
|
-
);
|
|
41
|
-
const hl = league;
|
|
42
|
-
const gsis = o.idSystem === "gsis";
|
|
43
|
-
const noImage = [];
|
|
44
|
-
teams.forEach((pid, i) => {
|
|
45
|
-
if (missing(pid)) return;
|
|
46
|
-
if (missing(xs[i]) || missing(ys[i])) {
|
|
47
|
-
missingXY.push(pid);
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
const url = headshotUrl(pid, hl, { idSystem: gsis ? "gsis" : "espn" });
|
|
51
|
-
if (url === void 0) {
|
|
52
|
-
noImage.push(pid);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
const id = gsis ? String(pid).trim() : normValue(pid) ?? String(pid).trim();
|
|
56
|
-
out.push({ index: i, id, x: xs[i], y: ys[i], url, aspect: HEADSHOT_ASPECT, mark: null });
|
|
57
|
-
});
|
|
58
|
-
skipped(league, "with no headshot", noImage, on);
|
|
59
|
-
} else {
|
|
60
|
-
const seasons = Array.isArray(o.season) ? o.season : teams.map(() => o.season);
|
|
61
|
-
const ropts = { season: seasons, strict };
|
|
62
|
-
if (o.idSystem !== void 0) ropts.idSystem = o.idSystem;
|
|
63
|
-
const ids = resolveSync(teams, league, ropts);
|
|
64
|
-
const cache = /* @__PURE__ */ new Map();
|
|
65
|
-
const noMark = [];
|
|
66
|
-
teams.forEach((raw, i) => {
|
|
67
|
-
const id = ids[i];
|
|
68
|
-
if (id === void 0) return;
|
|
69
|
-
if (missing(xs[i]) || missing(ys[i])) {
|
|
70
|
-
missingXY.push(raw);
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
const k = `${id}|${String(seasons[i])}`;
|
|
74
|
-
if (!cache.has(k))
|
|
75
|
-
cache.set(k, selectMarkSync(id, league, { season: seasons[i], variant, markType: kind }));
|
|
76
|
-
const row = cache.get(k);
|
|
77
|
-
if (!row) {
|
|
78
|
-
noMark.push(raw);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
const aspect = row.width && row.height ? row.width / row.height : null;
|
|
82
|
-
out.push({ index: i, id, x: xs[i], y: ys[i], url: row.archive_url, aspect, mark: row });
|
|
83
|
-
});
|
|
84
|
-
skipped(league, `with no ${kind} archived`, noMark, on);
|
|
85
|
-
}
|
|
86
|
-
skipped(league, "with a missing x or y", missingXY, on);
|
|
87
|
-
return out;
|
|
88
|
-
}
|
|
89
|
-
async function place(xs, ys, teams, o) {
|
|
90
|
-
await loadLeague(o.league);
|
|
91
|
-
if (o.kind === "headshot" && o.idSystem === "gsis") await loadGsis();
|
|
92
|
-
return placeSync(xs, ys, teams, o);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export { checkAlpha, checkHeight, place, placeSync, placedName };
|
|
96
|
-
//# sourceMappingURL=chunk-RMT2GMFH.js.map
|
|
97
|
-
//# sourceMappingURL=chunk-RMT2GMFH.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/placement.ts"],"names":[],"mappings":"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","file":"chunk-RMT2GMFH.js","sourcesContent":["import type { MarkRow } from \"./data/index.js\";\nimport { InputError, warn } from \"./errors.js\";\nimport { ESPN_HEADSHOT_LEAGUES, HEADSHOT_ASPECT, headshotUrl, loadGsis } from \"./headshots.js\";\nimport type { EspnHeadshotLeague } from \"./headshots.js\";\nimport { getLeagueSync, loadLeague } from \"./index-data.js\";\nimport { selectMarkSync } from \"./marks.js\";\nimport { normValue } from \"./normalize.js\";\nimport { type ResolveOptions, type Value, resolveSync } from \"./resolve.js\";\nimport type { HeadshotIdSystem, IdSystem, League, SeasonInput, Variant } from \"./types.js\";\n\nexport type Kind = \"logo\" | \"wordmark\" | \"headshot\";\n/** One point to draw: the caller's own x/y, the image URL and its width / height ratio (null when unknown). `index` is the row's position in the input arrays (skipped rows leave gaps). */\nexport interface Placement {\n index: number;\n id: string;\n x: Value;\n y: Value;\n url: string;\n aspect: number | null;\n mark: MarkRow | null;\n}\nexport interface PlaceOptions {\n league: League;\n season?: SeasonInput | readonly SeasonInput[];\n kind?: Kind;\n variant?: Variant;\n /** Team id system for logos/wordmarks (default \"auto\"); \"espn\" or \"gsis\" for headshots (default \"espn\"). */\n idSystem?: IdSystem | HeadshotIdSystem;\n strict?: boolean;\n warn?: boolean;\n}\nexport { HEADSHOT_ASPECT };\n\n/**\n * What a placed image is named for (its accessible name, before the mark type): a logo's or wordmark's resolved team,\n * by abbreviation, else full name, whatever id system the caller keyed it by; `raw` (the caller's own value) only when\n * the team has neither. A headshot has no name source (no team row; the gsis map holds ids only), so it keeps `raw`.\n * Every renderer that names images goes through this one rule.\n * @internal\n */\nexport function placedName(p: Placement, league: League, raw: unknown): string {\n // ponytail: a linear scan of the league's teams per image (2,631 for soccer at most); index by team_id if it shows\n const team = p.mark === null ? undefined : getLeagueSync(league).teams.find((t) => t.team_id === p.id);\n return team?.abbr || team?.name || String(raw);\n}\n\nconst real = (v: unknown): v is number => typeof v === \"number\" && !Number.isNaN(v);\nexport function checkHeight(height: unknown): number {\n if (!real(height) || !(height > 0 && height <= 1))\n throw new InputError(`height is a fraction of the plot height in (0, 1], got ${String(height)}`);\n return height;\n}\nexport function checkAlpha(alpha: unknown): number {\n if (!real(alpha) || !(alpha >= 0 && alpha <= 1))\n throw new InputError(`alpha is an opacity in [0, 1], got ${String(alpha)}`);\n return alpha;\n}\n\nconst missing = (v: Value): boolean =>\n v === null || v === undefined || (typeof v === \"number\" && Number.isNaN(v));\nfunction skipped(league: string, reason: string, values: Value[], on: boolean): void {\n if (!on || values.length === 0) return;\n const extra = values.length > 10 ? ` and ${values.length - 10} more` : \"\";\n const shown = `${values.slice(0, 10).map(String).join(\", \")}${extra}`;\n warn(`place:${league}:${reason}:${shown}`, `skipped ${values.length} point(s) ${reason}: ${shown}`);\n}\n\n/** Port of `_placement.place` (post-preload): pairs each (x, y) with its team's mark or player's headshot, dropping and warning (once per reason) on rows that cannot be drawn. Needs `loadLeague(league)` (or `preloadAll()`) first; gsis headshots also need `loadGsis()`. */\nexport function placeSync(\n xs: readonly Value[],\n ys: readonly Value[],\n teams: readonly Value[],\n o: PlaceOptions,\n): Placement[] {\n const { league, kind = \"logo\", variant = \"default\", strict = false, warn: on = true } = o;\n if (!(xs.length === ys.length && ys.length === teams.length))\n throw new InputError(\n `x, y and teams must have the same length, got ${xs.length}, ${ys.length} and ${teams.length}`,\n );\n const out: Placement[] = [];\n const missingXY: Value[] = [];\n if (kind === \"headshot\") {\n if (!Object.hasOwn(ESPN_HEADSHOT_LEAGUES, league))\n throw new InputError(\n `no ESPN headshots for league ${JSON.stringify(league)}; supported: ${Object.keys(ESPN_HEADSHOT_LEAGUES).sort().join(\", \")}`,\n );\n const hl = league as EspnHeadshotLeague;\n const gsis = o.idSystem === \"gsis\";\n const noImage: Value[] = [];\n teams.forEach((pid, i) => {\n if (missing(pid)) return;\n if (missing(xs[i]) || missing(ys[i])) {\n missingXY.push(pid);\n return;\n }\n const url = headshotUrl(pid, hl, { idSystem: gsis ? \"gsis\" : \"espn\" });\n if (url === undefined) {\n noImage.push(pid);\n return;\n }\n const id = gsis ? String(pid).trim() : (normValue(pid) ?? String(pid).trim());\n out.push({ index: i, id, x: xs[i], y: ys[i], url, aspect: HEADSHOT_ASPECT, mark: null });\n });\n skipped(league, \"with no headshot\", noImage, on);\n } else {\n const seasons: readonly SeasonInput[] = Array.isArray(o.season)\n ? (o.season as readonly SeasonInput[])\n : teams.map(() => o.season as SeasonInput);\n const ropts: ResolveOptions = { season: seasons, strict };\n if (o.idSystem !== undefined) ropts.idSystem = o.idSystem as IdSystem;\n const ids = resolveSync(teams, league, ropts);\n const cache = new Map<string, MarkRow | undefined>();\n const noMark: Value[] = [];\n teams.forEach((raw, i) => {\n const id = ids[i];\n if (id === undefined) return; // the resolver already warned (once per call)\n if (missing(xs[i]) || missing(ys[i])) {\n missingXY.push(raw);\n return;\n }\n const k = `${id}|${String(seasons[i])}`;\n if (!cache.has(k))\n cache.set(k, selectMarkSync(id, league, { season: seasons[i], variant, markType: kind }));\n const row = cache.get(k);\n if (!row) {\n noMark.push(raw);\n return;\n }\n const aspect = row.width && row.height ? row.width / row.height : null;\n out.push({ index: i, id, x: xs[i], y: ys[i], url: row.archive_url, aspect, mark: row });\n });\n skipped(league, `with no ${kind} archived`, noMark, on);\n }\n skipped(league, \"with a missing x or y\", missingXY, on);\n return out;\n}\nexport async function place(\n xs: readonly Value[],\n ys: readonly Value[],\n teams: readonly Value[],\n o: PlaceOptions,\n): Promise<Placement[]> {\n await loadLeague(o.league);\n if (o.kind === \"headshot\" && o.idSystem === \"gsis\") await loadGsis();\n return placeSync(xs, ys, teams, o);\n}\n"]}
|