volleyballsimtypes 0.0.469 → 0.0.471
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/src/api/index.d.ts +1 -1
- package/dist/cjs/src/data/models/tactics.d.ts +3 -3
- package/dist/cjs/src/data/models/tactics.js +3 -4
- package/dist/cjs/src/data/transformers/lineup-preset.js +4 -7
- package/dist/cjs/src/data/transformers/lineup-preset.test.js +9 -7
- package/dist/cjs/src/data/transformers/rally-event-injury.test.js +52 -0
- package/dist/cjs/src/data/transformers/rally-event.d.ts +1 -0
- package/dist/cjs/src/data/transformers/rally-event.js +24 -5
- package/dist/cjs/src/data/transformers/tactics.js +28 -4
- package/dist/cjs/src/service/event/block.js +2 -2
- package/dist/cjs/src/service/event/in-play-event.d.ts +7 -1
- package/dist/cjs/src/service/event/in-play-event.js +2 -1
- package/dist/cjs/src/service/event/reception.js +2 -2
- package/dist/cjs/src/service/event/schemas/block.z.d.ts +7 -0
- package/dist/cjs/src/service/event/schemas/block.z.js +3 -1
- package/dist/cjs/src/service/event/schemas/incident.z.d.ts +9 -0
- package/dist/cjs/src/service/event/schemas/incident.z.js +11 -0
- package/dist/cjs/src/service/event/schemas/reception.z.d.ts +7 -0
- package/dist/cjs/src/service/event/schemas/reception.z.js +3 -1
- package/dist/cjs/src/service/event/schemas/serve.z.d.ts +7 -0
- package/dist/cjs/src/service/event/schemas/serve.z.js +3 -1
- package/dist/cjs/src/service/event/schemas/set.z.d.ts +7 -0
- package/dist/cjs/src/service/event/schemas/set.z.js +3 -1
- package/dist/cjs/src/service/event/schemas/spike.z.d.ts +7 -0
- package/dist/cjs/src/service/event/schemas/spike.z.js +3 -1
- package/dist/cjs/src/service/event/serve.js +2 -2
- package/dist/cjs/src/service/event/set.js +2 -2
- package/dist/cjs/src/service/event/spike.js +2 -2
- package/dist/cjs/src/service/team/schemas/injury-replacement.z.test.js +28 -2
- package/dist/cjs/src/service/team/schemas/tactics.z.d.ts +1 -1
- package/dist/cjs/src/service/team/schemas/tactics.z.js +12 -4
- package/dist/cjs/src/service/team/schemas/team.z.d.ts +1 -1
- package/dist/cjs/src/service/team/tactics.d.ts +2 -2
- package/dist/cjs/src/service/team/tactics.js +2 -2
- package/dist/esm/src/api/index.d.ts +1 -1
- package/dist/esm/src/data/models/tactics.d.ts +3 -3
- package/dist/esm/src/data/models/tactics.js +3 -4
- package/dist/esm/src/data/transformers/lineup-preset.js +4 -7
- package/dist/esm/src/data/transformers/lineup-preset.test.js +9 -7
- package/dist/esm/src/data/transformers/rally-event-injury.test.js +54 -2
- package/dist/esm/src/data/transformers/rally-event.d.ts +1 -0
- package/dist/esm/src/data/transformers/rally-event.js +24 -5
- package/dist/esm/src/data/transformers/tactics.js +28 -4
- package/dist/esm/src/service/event/block.js +2 -2
- package/dist/esm/src/service/event/in-play-event.d.ts +7 -1
- package/dist/esm/src/service/event/in-play-event.js +2 -1
- package/dist/esm/src/service/event/reception.js +2 -2
- package/dist/esm/src/service/event/schemas/block.z.d.ts +7 -0
- package/dist/esm/src/service/event/schemas/block.z.js +3 -1
- package/dist/esm/src/service/event/schemas/incident.z.d.ts +9 -0
- package/dist/esm/src/service/event/schemas/incident.z.js +8 -0
- package/dist/esm/src/service/event/schemas/reception.z.d.ts +7 -0
- package/dist/esm/src/service/event/schemas/reception.z.js +3 -1
- package/dist/esm/src/service/event/schemas/serve.z.d.ts +7 -0
- package/dist/esm/src/service/event/schemas/serve.z.js +3 -1
- package/dist/esm/src/service/event/schemas/set.z.d.ts +7 -0
- package/dist/esm/src/service/event/schemas/set.z.js +3 -1
- package/dist/esm/src/service/event/schemas/spike.z.d.ts +7 -0
- package/dist/esm/src/service/event/schemas/spike.z.js +3 -1
- package/dist/esm/src/service/event/serve.js +2 -2
- package/dist/esm/src/service/event/set.js +2 -2
- package/dist/esm/src/service/event/spike.js +2 -2
- package/dist/esm/src/service/team/schemas/injury-replacement.z.test.js +28 -2
- package/dist/esm/src/service/team/schemas/tactics.z.d.ts +1 -1
- package/dist/esm/src/service/team/schemas/tactics.z.js +12 -4
- package/dist/esm/src/service/team/schemas/team.z.d.ts +1 -1
- package/dist/esm/src/service/team/tactics.d.ts +2 -2
- package/dist/esm/src/service/team/tactics.js +2 -2
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { TraitEnum } from '../../player';
|
|
3
|
+
import { EventIncidentSchema } from './incident.z';
|
|
3
4
|
const spikeTypeValues = [0, 1, 2, 3, 4, 5];
|
|
4
5
|
const spikeFailureValues = [0, 1, 2, 3, 4];
|
|
5
6
|
const courtTargetValues = Array.from({ length: 13 }, (_, i) => i);
|
|
@@ -9,5 +10,6 @@ export const SpikeInputSchema = z.object({
|
|
|
9
10
|
target: z.number().int().refine((v) => courtTargetValues.includes(v), { message: 'INVALID_COURT_TARGET' }),
|
|
10
11
|
activeTraits: z.array(z.enum(Object.values(TraitEnum))).default([]),
|
|
11
12
|
failure: z.number().int().refine((v) => spikeFailureValues.includes(v), { message: 'INVALID_SPIKE_FAILURE' }),
|
|
12
|
-
type: z.number().int().refine((v) => spikeTypeValues.includes(v), { message: 'INVALID_SPIKE_TYPE' })
|
|
13
|
+
type: z.number().int().refine((v) => spikeTypeValues.includes(v), { message: 'INVALID_SPIKE_TYPE' }),
|
|
14
|
+
incident: EventIncidentSchema.optional()
|
|
13
15
|
});
|
|
@@ -30,8 +30,8 @@ export class Serve extends InPlayEvent {
|
|
|
30
30
|
}
|
|
31
31
|
return new Serve(result.data);
|
|
32
32
|
}
|
|
33
|
-
constructor({ score, playerId, target, failure, type, activeTraits }) {
|
|
34
|
-
super({ score, playerId, target, activeTraits, eventType });
|
|
33
|
+
constructor({ score, playerId, target, failure, type, activeTraits, incident }) {
|
|
34
|
+
super({ score, playerId, target, activeTraits, incident, eventType });
|
|
35
35
|
this.type = type;
|
|
36
36
|
this.failure = failure;
|
|
37
37
|
}
|
|
@@ -28,8 +28,8 @@ export class Set extends InPlayEvent {
|
|
|
28
28
|
}
|
|
29
29
|
return new Set(result.data);
|
|
30
30
|
}
|
|
31
|
-
constructor({ score, playerId, target, failure, type, activeTraits }) {
|
|
32
|
-
super({ score, playerId, target, activeTraits, eventType });
|
|
31
|
+
constructor({ score, playerId, target, failure, type, activeTraits, incident }) {
|
|
32
|
+
super({ score, playerId, target, activeTraits, incident, eventType });
|
|
33
33
|
this.type = type;
|
|
34
34
|
this.failure = failure;
|
|
35
35
|
}
|
|
@@ -32,8 +32,8 @@ export class Spike extends InPlayEvent {
|
|
|
32
32
|
}
|
|
33
33
|
return new Spike(result.data);
|
|
34
34
|
}
|
|
35
|
-
constructor({ score, playerId, target, failure, type, activeTraits }) {
|
|
36
|
-
super({ score, playerId, target, activeTraits, eventType });
|
|
35
|
+
constructor({ score, playerId, target, failure, type, activeTraits, incident }) {
|
|
36
|
+
super({ score, playerId, target, activeTraits, incident, eventType });
|
|
37
37
|
this.type = type;
|
|
38
38
|
this.failure = failure;
|
|
39
39
|
}
|
|
@@ -30,14 +30,40 @@ describe('TacticsInputSchema — injuryReplacements (owner rules 2026-07-03)', (
|
|
|
30
30
|
...overrides
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
|
-
it('defaults to
|
|
33
|
+
it('defaults to an empty knock map / empty replacements', () => {
|
|
34
34
|
const res = TacticsInputSchema.safeParse(baseInput());
|
|
35
35
|
expect(res.success).toBe(true);
|
|
36
36
|
if (res.success) {
|
|
37
|
-
expect(res.data.
|
|
37
|
+
expect(res.data.replaceKnockedImmediately).toEqual({});
|
|
38
38
|
expect(res.data.injuryReplacements).toEqual([]);
|
|
39
39
|
}
|
|
40
40
|
});
|
|
41
|
+
it('accepts a starter-keyed replaceKnockedImmediately map', () => {
|
|
42
|
+
const res = TacticsInputSchema.safeParse(baseInput({
|
|
43
|
+
replaceKnockedImmediately: { [p1.id]: false, [p3.id]: true }
|
|
44
|
+
}));
|
|
45
|
+
expect(res.success).toBe(true);
|
|
46
|
+
if (res.success) {
|
|
47
|
+
expect(res.data.replaceKnockedImmediately).toEqual({ [p1.id]: false, [p3.id]: true });
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
it('rejects a replaceKnockedImmediately key that is not a court starter', () => {
|
|
51
|
+
for (const outsider of [benchA, libero, reserveA]) {
|
|
52
|
+
const res = TacticsInputSchema.safeParse(baseInput({
|
|
53
|
+
replaceKnockedImmediately: { [outsider.id]: false }
|
|
54
|
+
}));
|
|
55
|
+
expect(res.success).toBe(false);
|
|
56
|
+
if (!res.success) {
|
|
57
|
+
expect(res.error.issues.some(issue => issue.message === 'REPLACE_KNOCKED_KEY_NOT_A_STARTER')).toBe(true);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
it('rejects a non-boolean replaceKnockedImmediately value', () => {
|
|
62
|
+
const res = TacticsInputSchema.safeParse(baseInput({
|
|
63
|
+
replaceKnockedImmediately: { [p1.id]: 'off' }
|
|
64
|
+
}));
|
|
65
|
+
expect(res.success).toBe(false);
|
|
66
|
+
});
|
|
41
67
|
it('accepts a bench replacement with a reserve backfill', () => {
|
|
42
68
|
const res = TacticsInputSchema.safeParse(baseInput({
|
|
43
69
|
injuryReplacements: [{ starter: p1, replacement: benchA, benchBackfill: reserveA }]
|
|
@@ -123,7 +123,7 @@ export declare const TacticsInputSchema: z.ZodObject<{
|
|
|
123
123
|
rotation: z.ZodNumber;
|
|
124
124
|
order: z.ZodArray<z.ZodCustom<Player, Player>>;
|
|
125
125
|
}, z.core.$strip>>>>;
|
|
126
|
-
|
|
126
|
+
replaceKnockedImmediately: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodBoolean>>;
|
|
127
127
|
injuryReplacements: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
128
128
|
starter: z.ZodCustom<Player, Player>;
|
|
129
129
|
replacement: z.ZodCustom<Player, Player>;
|
|
@@ -78,10 +78,11 @@ export const TacticsInputSchema = z.object({
|
|
|
78
78
|
// validated with the same cross-field rules as the flat fields (see superRefine below).
|
|
79
79
|
systemSets: z.array(systemSetSchema).max(5).optional(),
|
|
80
80
|
offensivePreferenceSets: z.array(z.array(offensivePreferenceSchema)).max(5).optional(),
|
|
81
|
-
// Injuries. Defaults keep every existing Tactics.create({...}) call valid.
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
|
|
81
|
+
// Injuries. Defaults keep every existing Tactics.create({...}) call valid. replaceKnockedImmediately is
|
|
82
|
+
// PER STARTER (owner order 2026-07-05): keyed by starter id, missing key = ON; keys validated against the
|
|
83
|
+
// lineup in the superRefine below. injuryReplacements is the per-starter explicit replacement mapping
|
|
84
|
+
// (owner rules: followed verbatim, bench-only auto fallback, reserves never auto-promoted).
|
|
85
|
+
replaceKnockedImmediately: z.record(z.string(), z.boolean()).default({}),
|
|
85
86
|
injuryReplacements: z.array(z.object({
|
|
86
87
|
starter: playerInstanceSchema,
|
|
87
88
|
replacement: playerInstanceSchema,
|
|
@@ -184,6 +185,13 @@ export const TacticsInputSchema = z.object({
|
|
|
184
185
|
}
|
|
185
186
|
}
|
|
186
187
|
}
|
|
188
|
+
// Per-starter knock toggle: every key must be a configured court starter (bench/reserve/libero players
|
|
189
|
+
// follow the slot they occupy, so they never carry their own key).
|
|
190
|
+
for (const starterId of Object.keys(data.replaceKnockedImmediately)) {
|
|
191
|
+
if (!starterIds.has(starterId)) {
|
|
192
|
+
ctx.addIssue({ code: 'custom', message: 'REPLACE_KNOCKED_KEY_NOT_A_STARTER', path: ['replaceKnockedImmediately'] });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
187
195
|
// Injury replacements (owner rules 2026-07-03). starter = a court starter, at most one entry each.
|
|
188
196
|
// replacement = a bench player or a reserve (never another starter, the libero, or the L2). benchBackfill
|
|
189
197
|
// only when the replacement came from the bench, and must be a RESERVE (outside the whole lineup, not the
|
|
@@ -131,7 +131,7 @@ export declare const TeamInputSchema: z.ZodObject<{
|
|
|
131
131
|
rotation: z.ZodNumber;
|
|
132
132
|
order: z.ZodArray<z.ZodCustom<Player, Player>>;
|
|
133
133
|
}, z.core.$strip>>>>;
|
|
134
|
-
|
|
134
|
+
replaceKnockedImmediately: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodBoolean>>;
|
|
135
135
|
injuryReplacements: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
136
136
|
starter: z.ZodCustom<Player, Player>;
|
|
137
137
|
replacement: z.ZodCustom<Player, Player>;
|
|
@@ -34,7 +34,7 @@ export interface TacticsOpts {
|
|
|
34
34
|
readonly offensivePreferences: OffensivePreference[];
|
|
35
35
|
readonly systemSets?: SystemSet[];
|
|
36
36
|
readonly offensivePreferenceSets?: OffensivePreference[][];
|
|
37
|
-
readonly
|
|
37
|
+
readonly replaceKnockedImmediately: Record<string, boolean>;
|
|
38
38
|
readonly injuryReplacements: InjuryReplacement[];
|
|
39
39
|
}
|
|
40
40
|
export declare class Tactics {
|
|
@@ -51,7 +51,7 @@ export declare class Tactics {
|
|
|
51
51
|
readonly offensivePreferences: OffensivePreference[];
|
|
52
52
|
readonly systemSets?: SystemSet[];
|
|
53
53
|
readonly offensivePreferenceSets?: OffensivePreference[][];
|
|
54
|
-
readonly
|
|
54
|
+
readonly replaceKnockedImmediately: Record<string, boolean>;
|
|
55
55
|
readonly injuryReplacements: InjuryReplacement[];
|
|
56
56
|
static create(input: unknown): Tactics;
|
|
57
57
|
private constructor();
|
|
@@ -15,7 +15,7 @@ export class Tactics {
|
|
|
15
15
|
}
|
|
16
16
|
return new Tactics(result.data);
|
|
17
17
|
}
|
|
18
|
-
constructor({ lineup, liberoReplacements, receiveRotationOffset = false, designatedSubs = [], substitutionBand = EnergyBand.TIRED, secondLibero, liberoSub, liberoReplacementSets, rotationSystem = RotationSystemEnum.SIX_ZERO, designatedSetters = [], offensivePreferences = [], systemSets, offensivePreferenceSets,
|
|
18
|
+
constructor({ lineup, liberoReplacements, receiveRotationOffset = false, designatedSubs = [], substitutionBand = EnergyBand.TIRED, secondLibero, liberoSub, liberoReplacementSets, rotationSystem = RotationSystemEnum.SIX_ZERO, designatedSetters = [], offensivePreferences = [], systemSets, offensivePreferenceSets, replaceKnockedImmediately = {}, injuryReplacements = [] }) {
|
|
19
19
|
this.lineup = lineup;
|
|
20
20
|
this.liberoReplacements = liberoReplacements;
|
|
21
21
|
this.receiveRotationOffset = receiveRotationOffset;
|
|
@@ -29,7 +29,7 @@ export class Tactics {
|
|
|
29
29
|
this.offensivePreferences = offensivePreferences;
|
|
30
30
|
this.systemSets = systemSets;
|
|
31
31
|
this.offensivePreferenceSets = offensivePreferenceSets;
|
|
32
|
-
this.
|
|
32
|
+
this.replaceKnockedImmediately = replaceKnockedImmediately;
|
|
33
33
|
this.injuryReplacements = injuryReplacements;
|
|
34
34
|
}
|
|
35
35
|
findPlayerInLineup(id) {
|