@xivdyetools/types 1.0.0 → 1.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/README.md CHANGED
@@ -94,6 +94,7 @@ import { Dye, LocalizedDye, DyeWithDistance, DyeDatabase } from '@xivdyetools/ty
94
94
  // Full dye object
95
95
  const dye: Dye = {
96
96
  itemID: 5729,
97
+ stainID: 1, // Game's internal stain table ID (null for Facewear dyes)
97
98
  id: 1,
98
99
  name: 'Snow White',
99
100
  hex: '#FFFFFF',
@@ -267,6 +268,20 @@ import { CommunityPreset, PresetFilters, ModerationResult } from '@xivdyetools/t
267
268
  | `isOk(result)` | Type guard for successful Result |
268
269
  | `isErr(result)` | Type guard for error Result |
269
270
 
271
+ ## Connect With Me
272
+
273
+ **Flash Galatine** | Balmung (Crystal)
274
+
275
+ 🎮 **FFXIV**: [Lodestone Character](https://na.finalfantasyxiv.com/lodestone/character/7677106/)
276
+ 📝 **Blog**: [Project Galatine](https://blog.projectgalatine.com/)
277
+ 💻 **GitHub**: [@FlashGalatine](https://github.com/FlashGalatine)
278
+ 🐦 **X / Twitter**: [@AsheJunius](https://x.com/AsheJunius)
279
+ 📺 **Twitch**: [flashgalatine](https://www.twitch.tv/flashgalatine)
280
+ 🌐 **BlueSky**: [projectgalatine.com](https://bsky.app/profile/projectgalatine.com)
281
+ ❤️ **Patreon**: [ProjectGalatine](https://patreon.com/ProjectGalatine)
282
+ ☕ **Ko-Fi**: [flashgalatine](https://ko-fi.com/flashgalatine)
283
+ 💬 **Discord**: [Join Server](https://discord.gg/5VUSKTZCe5)
284
+
270
285
  ## License
271
286
 
272
- MIT
287
+ MIT © 2025 Flash Galatine
@@ -4,6 +4,23 @@
4
4
  * Branded types prevent accidental type confusion between similar types.
5
5
  * For example, a DyeId cannot be accidentally used where a plain number is expected.
6
6
  *
7
+ * ## TYPES-101: Runtime Validation Limitation
8
+ *
9
+ * **Important:** Branded types in TypeScript rely on runtime validation via helper
10
+ * functions. The type system cannot enforce that all values are created through
11
+ * these helpers. Developers can bypass validation using type assertions:
12
+ *
13
+ * ```typescript
14
+ * // UNSAFE: Bypasses validation
15
+ * const unsafeHex = "#invalid" as HexColor;
16
+ *
17
+ * // SAFE: Uses validation
18
+ * const safeHex = createHexColor("#FF0000");
19
+ * ```
20
+ *
21
+ * **Best Practice:** Always use the `create*` helper functions to ensure values
22
+ * are validated. Never use type assertions (`as HexColor`) to create branded values.
23
+ *
7
24
  * @module color/branded
8
25
  */
9
26
  /**
@@ -38,7 +55,12 @@ export declare function createHexColor(hex: string): HexColor;
38
55
  * Dye ID (branded type for type safety)
39
56
  *
40
57
  * Prevents accidental mixing of dye IDs with other numeric values.
41
- * Valid dye IDs range from 1 to 200 in FFXIV.
58
+ * Valid dye IDs include:
59
+ * - Regular FFXIV dye IDs: 1-200
60
+ * - Synthetic IDs for Facewear dyes: negative numbers <= -1000
61
+ *
62
+ * Synthetic IDs are generated by DyeDatabase for Facewear dyes that
63
+ * lack real itemIDs in the game data.
42
64
  */
43
65
  export type DyeId = number & {
44
66
  readonly __brand: 'DyeId';
@@ -46,14 +68,19 @@ export type DyeId = number & {
46
68
  /**
47
69
  * Helper to create branded DyeId type with validation
48
70
  *
49
- * @param id - Numeric dye ID (must be 1-200)
71
+ * TYPES-102: Updated to accept synthetic negative IDs for Facewear dyes.
72
+ * Synthetic IDs are generated as -(1000 + nameHash) to avoid collision
73
+ * with real item IDs.
74
+ *
75
+ * @param id - Numeric dye ID (1-200 for regular, <= -1000 for synthetic)
50
76
  * @returns Branded DyeId or null if invalid
51
77
  *
52
78
  * @example
53
79
  * ```typescript
54
- * const dyeId = createDyeId(1); // Returns 1 as DyeId
55
- * const invalid = createDyeId(0); // Returns null
56
- * const bad = createDyeId(999); // Returns null
80
+ * const dyeId = createDyeId(1); // Returns 1 as DyeId
81
+ * const synthetic = createDyeId(-1500); // Returns -1500 as DyeId (Facewear)
82
+ * const invalid = createDyeId(0); // Returns null
83
+ * const bad = createDyeId(999); // Returns null
57
84
  * ```
58
85
  */
59
86
  export declare function createDyeId(id: number): DyeId | null;
@@ -1 +1 @@
1
- {"version":3,"file":"branded.d.ts","sourceRoot":"","sources":["../../src/color/branded.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC;AAEjE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAWpD;AAED;;;;;GAKG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAE3D;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAKpD;AAED;;;;GAIG;AACH,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;AAEvD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAI1C;AAED;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC;AAErE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAG/D"}
1
+ {"version":3,"file":"branded.d.ts","sourceRoot":"","sources":["../../src/color/branded.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC;AAEjE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAWpD;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAE3D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAWpD;AAED;;;;GAIG;AACH,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;AAEvD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAI1C;AAED;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC;AAErE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAG/D"}
@@ -4,6 +4,23 @@
4
4
  * Branded types prevent accidental type confusion between similar types.
5
5
  * For example, a DyeId cannot be accidentally used where a plain number is expected.
6
6
  *
7
+ * ## TYPES-101: Runtime Validation Limitation
8
+ *
9
+ * **Important:** Branded types in TypeScript rely on runtime validation via helper
10
+ * functions. The type system cannot enforce that all values are created through
11
+ * these helpers. Developers can bypass validation using type assertions:
12
+ *
13
+ * ```typescript
14
+ * // UNSAFE: Bypasses validation
15
+ * const unsafeHex = "#invalid" as HexColor;
16
+ *
17
+ * // SAFE: Uses validation
18
+ * const safeHex = createHexColor("#FF0000");
19
+ * ```
20
+ *
21
+ * **Best Practice:** Always use the `create*` helper functions to ensure values
22
+ * are validated. Never use type assertions (`as HexColor`) to create branded values.
23
+ *
7
24
  * @module color/branded
8
25
  */
9
26
  /**
@@ -36,18 +53,29 @@ export function createHexColor(hex) {
36
53
  /**
37
54
  * Helper to create branded DyeId type with validation
38
55
  *
39
- * @param id - Numeric dye ID (must be 1-200)
56
+ * TYPES-102: Updated to accept synthetic negative IDs for Facewear dyes.
57
+ * Synthetic IDs are generated as -(1000 + nameHash) to avoid collision
58
+ * with real item IDs.
59
+ *
60
+ * @param id - Numeric dye ID (1-200 for regular, <= -1000 for synthetic)
40
61
  * @returns Branded DyeId or null if invalid
41
62
  *
42
63
  * @example
43
64
  * ```typescript
44
- * const dyeId = createDyeId(1); // Returns 1 as DyeId
45
- * const invalid = createDyeId(0); // Returns null
46
- * const bad = createDyeId(999); // Returns null
65
+ * const dyeId = createDyeId(1); // Returns 1 as DyeId
66
+ * const synthetic = createDyeId(-1500); // Returns -1500 as DyeId (Facewear)
67
+ * const invalid = createDyeId(0); // Returns null
68
+ * const bad = createDyeId(999); // Returns null
47
69
  * ```
48
70
  */
49
71
  export function createDyeId(id) {
50
- if (!Number.isInteger(id) || id < 1 || id > 200) {
72
+ if (!Number.isInteger(id)) {
73
+ return null;
74
+ }
75
+ // TYPES-102: Accept regular IDs (1-200) or synthetic Facewear IDs (<= -1000)
76
+ const isRegularId = id >= 1 && id <= 200;
77
+ const isSyntheticId = id <= -1000;
78
+ if (!isRegularId && !isSyntheticId) {
51
79
  return null;
52
80
  }
53
81
  return id;
@@ -1 +1 @@
1
- {"version":3,"file":"branded.js","sourceRoot":"","sources":["../../src/color/branded.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,2CAA2C;IAC3C,IAAI,CAAC,oCAAoC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,oCAAoC,CAAC,CAAC;IACxF,CAAC;IACD,iEAAiE;IACjE,MAAM,UAAU,GACd,GAAG,CAAC,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE;QACzE,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IACxB,OAAO,UAAsB,CAAC;AAChC,CAAC;AAUD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAW,CAAC;AACrB,CAAC;AASD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,2BAA2B;IAC3B,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAC7C,OAAO,UAAiB,CAAC;AAC3B,CAAC;AASD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IACvD,OAAO,OAAqB,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"branded.js","sourceRoot":"","sources":["../../src/color/branded.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAYH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,2CAA2C;IAC3C,IAAI,CAAC,oCAAoC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,oCAAoC,CAAC,CAAC;IACxF,CAAC;IACD,iEAAiE;IACjE,MAAM,UAAU,GACd,GAAG,CAAC,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE;QACzE,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IACxB,OAAO,UAAsB,CAAC;AAChC,CAAC;AAeD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,6EAA6E;IAC7E,MAAM,WAAW,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC;IACzC,MAAM,aAAa,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC;IAClC,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAW,CAAC;AACrB,CAAC;AASD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,2BAA2B;IAC3B,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAC7C,OAAO,UAAiB,CAAC;AAC3B,CAAC;AASD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IACvD,OAAO,OAAqB,CAAC;AAC/B,CAAC"}
package/dist/dye/dye.d.ts CHANGED
@@ -3,6 +3,15 @@
3
3
  *
4
4
  * FFXIV dye object definitions with color and metadata.
5
5
  *
6
+ * ## TYPES-103: Field Presence Guarantee
7
+ *
8
+ * All fields in the `Dye` interface are required and non-nullable.
9
+ * The dye database (`xivdyetools-core`) ensures complete data initialization.
10
+ *
11
+ * **For consumers:** You can safely access all Dye fields without null checks.
12
+ * If you're receiving dye data from external sources (JSON APIs, user input),
13
+ * validate the data matches the interface before casting to `Dye`.
14
+ *
6
15
  * @module dye/dye
7
16
  */
8
17
  import type { RGB, HSV } from '../color/rgb.js';
@@ -15,6 +24,21 @@ import type { RGB, HSV } from '../color/rgb.js';
15
24
  export interface Dye {
16
25
  /** FFXIV item ID */
17
26
  itemID: number;
27
+ /**
28
+ * Game's internal stain table ID (1-125).
29
+ *
30
+ * This is the ID used in the game's Stain Excel table and by plugins
31
+ * like Glamourer and Mare Synchronos. Unlike itemID, stainID may shift
32
+ * when new dyes are added to the game.
33
+ *
34
+ * **Note:** Facewear dyes do not have stainIDs (null).
35
+ *
36
+ * **Recommendation:** Use `itemID` for stable references. Use `stainID`
37
+ * only when interfacing with plugins or datamined content.
38
+ *
39
+ * @since 2.1.0
40
+ */
41
+ stainID: number | null;
18
42
  /** Unique dye ID (1-200) */
19
43
  id: number;
20
44
  /** English dye name */
@@ -1 +1 @@
1
- {"version":3,"file":"dye.d.ts","sourceRoot":"","sources":["../../src/dye/dye.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,WAAW,GAAG;IAClB,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAC;IAEf,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAC;IAEX,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IAEb,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IAEZ,+BAA+B;IAC/B,GAAG,EAAE,GAAG,CAAC;IAET,+BAA+B;IAC/B,GAAG,EAAE,GAAG,CAAC;IAET,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IAEjB,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IAEpB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IAEH,qCAAqC;IACrC,UAAU,EAAE,OAAO,CAAC;IAEpB,mCAAmC;IACnC,QAAQ,EAAE,OAAO,CAAC;IAElB,uCAAuC;IACvC,MAAM,EAAE,OAAO,CAAC;IAEhB,wDAAwD;IACxD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAa,SAAQ,GAAG;IACvC,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAgB,SAAQ,GAAG;IAC1C,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;CAClB"}
1
+ {"version":3,"file":"dye.d.ts","sourceRoot":"","sources":["../../src/dye/dye.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,WAAW,GAAG;IAClB,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAC;IAEf;;;;;;;;;;;;;OAaG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvB,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAC;IAEX,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IAEb,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IAEZ,+BAA+B;IAC/B,GAAG,EAAE,GAAG,CAAC;IAET,+BAA+B;IAC/B,GAAG,EAAE,GAAG,CAAC;IAET,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IAEjB,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IAEpB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IAEH,qCAAqC;IACrC,UAAU,EAAE,OAAO,CAAC;IAEpB,mCAAmC;IACnC,QAAQ,EAAE,OAAO,CAAC;IAElB,uCAAuC;IACvC,MAAM,EAAE,OAAO,CAAC;IAEhB,wDAAwD;IACxD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAa,SAAQ,GAAG;IACvC,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAgB,SAAQ,GAAG;IAC1C,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;CAClB"}
package/dist/dye/dye.js CHANGED
@@ -3,6 +3,15 @@
3
3
  *
4
4
  * FFXIV dye object definitions with color and metadata.
5
5
  *
6
+ * ## TYPES-103: Field Presence Guarantee
7
+ *
8
+ * All fields in the `Dye` interface are required and non-nullable.
9
+ * The dye database (`xivdyetools-core`) ensures complete data initialization.
10
+ *
11
+ * **For consumers:** You can safely access all Dye fields without null checks.
12
+ * If you're receiving dye data from external sources (JSON APIs, user input),
13
+ * validate the data matches the interface before casting to `Dye`.
14
+ *
6
15
  * @module dye/dye
7
16
  */
8
17
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"dye.js","sourceRoot":"","sources":["../../src/dye/dye.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
1
+ {"version":3,"file":"dye.js","sourceRoot":"","sources":["../../src/dye/dye.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
@@ -12,8 +12,14 @@ import type { Dye } from '../dye/dye.js';
12
12
  export type PresetCategory = 'jobs' | 'grand-companies' | 'seasons' | 'events' | 'aesthetics' | 'community';
13
13
  /**
14
14
  * Status of a preset submission in the moderation workflow
15
+ *
16
+ * - `pending`: Awaiting moderation review
17
+ * - `approved`: Approved and visible in listings
18
+ * - `rejected`: Rejected by moderator
19
+ * - `flagged`: Auto-flagged by content moderation
20
+ * - `hidden`: Hidden due to user ban (restored on unban)
15
21
  */
16
- export type PresetStatus = 'pending' | 'approved' | 'rejected' | 'flagged';
22
+ export type PresetStatus = 'pending' | 'approved' | 'rejected' | 'flagged' | 'hidden';
17
23
  /**
18
24
  * Sort options for preset listings
19
25
  */
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/preset/core.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEzC;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,iBAAiB,GACjB,SAAS,GACT,QAAQ,GACR,YAAY,GACZ,WAAW,CAAC;AAEhB;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3E;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IAEb,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IAEpB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAErB,oDAAoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,gCAAgC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,EAAE,EAAE,MAAM,CAAC;IAEX,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IAEb,sCAAsC;IACtC,QAAQ,EAAE,cAAc,CAAC;IAEzB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IAEpB,sCAAsC;IACtC,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,sBAAsB;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,+DAA+D;IAC/D,YAAY,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAEhB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IAEpB,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAEjD,0BAA0B;IAC1B,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/preset/core.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEzC;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,iBAAiB,GACjB,SAAS,GACT,QAAQ,GACR,YAAY,GACZ,WAAW,CAAC;AAEhB;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IAEb,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IAEpB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAErB,oDAAoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,gCAAgC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,EAAE,EAAE,MAAM,CAAC;IAEX,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IAEb,sCAAsC;IACtC,QAAQ,EAAE,cAAc,CAAC;IAEzB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IAEpB,sCAAsC;IACtC,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,sBAAsB;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,+DAA+D;IAC/D,YAAY,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAEhB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IAEpB,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAEjD,0BAA0B;IAC1B,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xivdyetools/types",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "Shared TypeScript type definitions for the xivdyetools ecosystem",
5
5
  "author": "XIV Dye Tools",
6
6
  "license": "MIT",
@@ -50,11 +50,16 @@
50
50
  "build": "tsc -p tsconfig.build.json",
51
51
  "type-check": "tsc --noEmit",
52
52
  "clean": "rimraf dist",
53
- "prepublishOnly": "npm run clean && npm run build"
53
+ "prepublishOnly": "npm run clean && npm run build",
54
+ "test": "vitest run",
55
+ "test:watch": "vitest",
56
+ "test:coverage": "vitest run --coverage"
54
57
  },
55
58
  "devDependencies": {
56
- "typescript": "^5.3.2",
57
- "rimraf": "^5.0.5"
59
+ "@vitest/coverage-v8": "^4.0.15",
60
+ "rimraf": "^5.0.5",
61
+ "typescript": "^5.9.3",
62
+ "vitest": "^4.0.15"
58
63
  },
59
64
  "engines": {
60
65
  "node": ">=18.0.0"