@xivdyetools/core 1.3.7

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.
Files changed (103) hide show
  1. package/LICENSE +37 -0
  2. package/README.md +400 -0
  3. package/dist/constants/index.d.ts +56 -0
  4. package/dist/constants/index.d.ts.map +1 -0
  5. package/dist/constants/index.js +103 -0
  6. package/dist/constants/index.js.map +1 -0
  7. package/dist/data/colors_xiv.json +3130 -0
  8. package/dist/data/locales/de.json +231 -0
  9. package/dist/data/locales/en.json +231 -0
  10. package/dist/data/locales/fr.json +231 -0
  11. package/dist/data/locales/ja.json +231 -0
  12. package/dist/data/locales/ko.json +233 -0
  13. package/dist/data/locales/zh.json +233 -0
  14. package/dist/data/presets.json +390 -0
  15. package/dist/index.d.ts +16 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +18 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/services/APIService.d.ts +246 -0
  20. package/dist/services/APIService.d.ts.map +1 -0
  21. package/dist/services/APIService.js +499 -0
  22. package/dist/services/APIService.js.map +1 -0
  23. package/dist/services/ColorService.d.ts +146 -0
  24. package/dist/services/ColorService.d.ts.map +1 -0
  25. package/dist/services/ColorService.js +209 -0
  26. package/dist/services/ColorService.js.map +1 -0
  27. package/dist/services/DyeService.d.ts +230 -0
  28. package/dist/services/DyeService.d.ts.map +1 -0
  29. package/dist/services/DyeService.js +326 -0
  30. package/dist/services/DyeService.js.map +1 -0
  31. package/dist/services/LocalizationService.d.ts +338 -0
  32. package/dist/services/LocalizationService.d.ts.map +1 -0
  33. package/dist/services/LocalizationService.js +449 -0
  34. package/dist/services/LocalizationService.js.map +1 -0
  35. package/dist/services/PaletteService.d.ts +137 -0
  36. package/dist/services/PaletteService.d.ts.map +1 -0
  37. package/dist/services/PaletteService.js +349 -0
  38. package/dist/services/PaletteService.js.map +1 -0
  39. package/dist/services/PresetService.d.ts +196 -0
  40. package/dist/services/PresetService.d.ts.map +1 -0
  41. package/dist/services/PresetService.js +261 -0
  42. package/dist/services/PresetService.js.map +1 -0
  43. package/dist/services/color/ColorAccessibility.d.ts +39 -0
  44. package/dist/services/color/ColorAccessibility.d.ts.map +1 -0
  45. package/dist/services/color/ColorAccessibility.js +71 -0
  46. package/dist/services/color/ColorAccessibility.js.map +1 -0
  47. package/dist/services/color/ColorConverter.d.ts +146 -0
  48. package/dist/services/color/ColorConverter.d.ts.map +1 -0
  49. package/dist/services/color/ColorConverter.js +393 -0
  50. package/dist/services/color/ColorConverter.js.map +1 -0
  51. package/dist/services/color/ColorManipulator.d.ts +36 -0
  52. package/dist/services/color/ColorManipulator.d.ts.map +1 -0
  53. package/dist/services/color/ColorManipulator.js +56 -0
  54. package/dist/services/color/ColorManipulator.js.map +1 -0
  55. package/dist/services/color/ColorblindnessSimulator.d.ts +35 -0
  56. package/dist/services/color/ColorblindnessSimulator.d.ts.map +1 -0
  57. package/dist/services/color/ColorblindnessSimulator.js +110 -0
  58. package/dist/services/color/ColorblindnessSimulator.js.map +1 -0
  59. package/dist/services/dye/DyeDatabase.d.ts +131 -0
  60. package/dist/services/dye/DyeDatabase.d.ts.map +1 -0
  61. package/dist/services/dye/DyeDatabase.js +367 -0
  62. package/dist/services/dye/DyeDatabase.js.map +1 -0
  63. package/dist/services/dye/DyeSearch.d.ts +55 -0
  64. package/dist/services/dye/DyeSearch.d.ts.map +1 -0
  65. package/dist/services/dye/DyeSearch.js +196 -0
  66. package/dist/services/dye/DyeSearch.js.map +1 -0
  67. package/dist/services/dye/HarmonyGenerator.d.ts +110 -0
  68. package/dist/services/dye/HarmonyGenerator.d.ts.map +1 -0
  69. package/dist/services/dye/HarmonyGenerator.js +221 -0
  70. package/dist/services/dye/HarmonyGenerator.js.map +1 -0
  71. package/dist/services/localization/LocaleLoader.d.ts +38 -0
  72. package/dist/services/localization/LocaleLoader.d.ts.map +1 -0
  73. package/dist/services/localization/LocaleLoader.js +83 -0
  74. package/dist/services/localization/LocaleLoader.js.map +1 -0
  75. package/dist/services/localization/LocaleRegistry.d.ts +73 -0
  76. package/dist/services/localization/LocaleRegistry.d.ts.map +1 -0
  77. package/dist/services/localization/LocaleRegistry.js +84 -0
  78. package/dist/services/localization/LocaleRegistry.js.map +1 -0
  79. package/dist/services/localization/TranslationProvider.d.ts +157 -0
  80. package/dist/services/localization/TranslationProvider.d.ts.map +1 -0
  81. package/dist/services/localization/TranslationProvider.js +289 -0
  82. package/dist/services/localization/TranslationProvider.js.map +1 -0
  83. package/dist/types/index.d.ts +409 -0
  84. package/dist/types/index.d.ts.map +1 -0
  85. package/dist/types/index.js +87 -0
  86. package/dist/types/index.js.map +1 -0
  87. package/dist/types/logger.d.ts +84 -0
  88. package/dist/types/logger.d.ts.map +1 -0
  89. package/dist/types/logger.js +54 -0
  90. package/dist/types/logger.js.map +1 -0
  91. package/dist/utils/index.d.ts +441 -0
  92. package/dist/utils/index.d.ts.map +1 -0
  93. package/dist/utils/index.js +577 -0
  94. package/dist/utils/index.js.map +1 -0
  95. package/dist/utils/kd-tree.d.ts +76 -0
  96. package/dist/utils/kd-tree.d.ts.map +1 -0
  97. package/dist/utils/kd-tree.js +195 -0
  98. package/dist/utils/kd-tree.js.map +1 -0
  99. package/dist/version.d.ts +11 -0
  100. package/dist/version.d.ts.map +1 -0
  101. package/dist/version.js +11 -0
  102. package/dist/version.js.map +1 -0
  103. package/package.json +84 -0
@@ -0,0 +1,195 @@
1
+ /**
2
+ * k-d Tree implementation for 3D color space (RGB)
3
+ * Per P-7: Spatial indexing for fast nearest neighbor search
4
+ *
5
+ * k-d tree provides O(log n) average case for nearest neighbor queries
6
+ * vs O(n) for linear search, significant improvement for color matching
7
+ */
8
+ /**
9
+ * k-d Tree node
10
+ */
11
+ class KDNode {
12
+ constructor(point, dimension) {
13
+ this.left = null;
14
+ this.right = null;
15
+ this.point = point;
16
+ this.dimension = dimension;
17
+ }
18
+ }
19
+ /**
20
+ * k-d Tree for 3D color space (RGB)
21
+ * Optimized for nearest neighbor search in color matching
22
+ */
23
+ export class KDTree {
24
+ /**
25
+ * Build k-d tree from array of points
26
+ * @param points - Array of 3D points (RGB colors)
27
+ */
28
+ constructor(points) {
29
+ this.root = null;
30
+ this.size = 0;
31
+ if (points.length > 0) {
32
+ // CORE-PERF-002: Use index-based construction to reduce memory allocations
33
+ // Instead of slicing point arrays (O(n) copy each time), we pass index arrays
34
+ // which are much smaller and reduce GC pressure
35
+ const indices = points.map((_, i) => i);
36
+ this.root = this.buildTreeOptimized(points, indices, 0);
37
+ this.size = points.length;
38
+ }
39
+ }
40
+ /**
41
+ * Recursively build k-d tree using index arrays
42
+ * CORE-PERF-002: Optimized to reduce temporary array allocations
43
+ * @param points - Full points array (never copied)
44
+ * @param indices - Indices into points array for current subtree
45
+ * @param depth - Current depth (determines splitting dimension)
46
+ */
47
+ buildTreeOptimized(points, indices, depth) {
48
+ if (indices.length === 0) {
49
+ return null;
50
+ }
51
+ if (indices.length === 1) {
52
+ return new KDNode(points[indices[0]], depth % 3);
53
+ }
54
+ // Select dimension to split on (alternate R, G, B)
55
+ const dimension = depth % 3;
56
+ // Sort indices by the value at that dimension (smaller allocations than sorting full points)
57
+ indices.sort((a, b) => {
58
+ const aPoint = points[a];
59
+ const bPoint = points[b];
60
+ const aVal = dimension === 0 ? aPoint.x : dimension === 1 ? aPoint.y : aPoint.z;
61
+ const bVal = dimension === 0 ? bPoint.x : dimension === 1 ? bPoint.y : bPoint.z;
62
+ return aVal - bVal;
63
+ });
64
+ // Find median
65
+ const median = Math.floor(indices.length / 2);
66
+ const medianPoint = points[indices[median]];
67
+ // Create node
68
+ const node = new KDNode(medianPoint, dimension);
69
+ // Recursively build left and right subtrees using index slices
70
+ // Index arrays are much smaller than point arrays (just numbers vs objects)
71
+ node.left = this.buildTreeOptimized(points, indices.slice(0, median), depth + 1);
72
+ node.right = this.buildTreeOptimized(points, indices.slice(median + 1), depth + 1);
73
+ return node;
74
+ }
75
+ /**
76
+ * Calculate Euclidean distance between two points
77
+ */
78
+ distance(p1, p2) {
79
+ const dx = p1.x - p2.x;
80
+ const dy = p1.y - p2.y;
81
+ const dz = p1.z - p2.z;
82
+ return Math.sqrt(dx * dx + dy * dy + dz * dz);
83
+ }
84
+ /**
85
+ * Find nearest neighbor to target point
86
+ * @param target - Target point to search for
87
+ * @param excludeData - Optional function to exclude certain data points
88
+ * @returns Nearest point or null if tree is empty
89
+ */
90
+ nearestNeighbor(target, excludeData) {
91
+ if (!this.root) {
92
+ return null;
93
+ }
94
+ const best = this.searchNearest(this.root, target, 0, null, excludeData);
95
+ return best?.point ?? null;
96
+ }
97
+ /**
98
+ * Recursive nearest neighbor search
99
+ */
100
+ searchNearest(node, target, depth, best, excludeData) {
101
+ if (!node) {
102
+ return best;
103
+ }
104
+ const dimension = node.dimension;
105
+ const nodeValue = dimension === 0 ? node.point.x : dimension === 1 ? node.point.y : node.point.z;
106
+ const targetValue = dimension === 0 ? target.x : dimension === 1 ? target.y : target.z;
107
+ // Check if current node is better
108
+ if (!excludeData || !excludeData(node.point.data)) {
109
+ const dist = this.distance(target, node.point);
110
+ if (!best || dist < best.distance) {
111
+ best = { point: node.point, distance: dist };
112
+ }
113
+ }
114
+ // Determine which side to search first
115
+ const isLeft = targetValue < nodeValue;
116
+ const nearChild = isLeft ? node.left : node.right;
117
+ const farChild = isLeft ? node.right : node.left;
118
+ // Search near side
119
+ if (nearChild) {
120
+ best = this.searchNearest(nearChild, target, depth + 1, best, excludeData);
121
+ }
122
+ // Check if we need to search far side
123
+ // Use <= to handle edge case where target is exactly on splitting plane
124
+ if (farChild && best) {
125
+ const axisDistance = Math.abs(targetValue - nodeValue);
126
+ if (axisDistance <= best.distance) {
127
+ best = this.searchNearest(farChild, target, depth + 1, best, excludeData);
128
+ }
129
+ }
130
+ return best;
131
+ }
132
+ /**
133
+ * Find all points within a distance threshold
134
+ * @param target - Target point
135
+ * @param maxDistance - Maximum distance
136
+ * @param excludeData - Optional function to exclude certain data points
137
+ * @returns Array of points within distance, sorted by distance
138
+ */
139
+ pointsWithinDistance(target, maxDistance, excludeData) {
140
+ if (!this.root) {
141
+ return [];
142
+ }
143
+ const results = [];
144
+ this.searchWithinDistance(this.root, target, 0, maxDistance, results, excludeData);
145
+ // Sort by distance
146
+ results.sort((a, b) => a.distance - b.distance);
147
+ return results;
148
+ }
149
+ /**
150
+ * Recursive search for points within distance
151
+ */
152
+ searchWithinDistance(node, target, depth, maxDistance, results, excludeData) {
153
+ if (!node) {
154
+ return;
155
+ }
156
+ const dimension = node.dimension;
157
+ const nodeValue = dimension === 0 ? node.point.x : dimension === 1 ? node.point.y : node.point.z;
158
+ const targetValue = dimension === 0 ? target.x : dimension === 1 ? target.y : target.z;
159
+ // Check if current node is within distance
160
+ if (!excludeData || !excludeData(node.point.data)) {
161
+ const dist = this.distance(target, node.point);
162
+ if (dist <= maxDistance) {
163
+ results.push({ point: node.point, distance: dist });
164
+ }
165
+ }
166
+ // Determine which side to search
167
+ const isLeft = targetValue < nodeValue;
168
+ const nearChild = isLeft ? node.left : node.right;
169
+ const farChild = isLeft ? node.right : node.left;
170
+ // Search near side
171
+ if (nearChild) {
172
+ this.searchWithinDistance(nearChild, target, depth + 1, maxDistance, results, excludeData);
173
+ }
174
+ // Check if we need to search far side
175
+ if (farChild) {
176
+ const axisDistance = Math.abs(targetValue - nodeValue);
177
+ if (axisDistance <= maxDistance) {
178
+ this.searchWithinDistance(farChild, target, depth + 1, maxDistance, results, excludeData);
179
+ }
180
+ }
181
+ }
182
+ /**
183
+ * Get tree size
184
+ */
185
+ getSize() {
186
+ return this.size;
187
+ }
188
+ /**
189
+ * Check if tree is empty
190
+ */
191
+ isEmpty() {
192
+ return this.size === 0;
193
+ }
194
+ }
195
+ //# sourceMappingURL=kd-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kd-tree.js","sourceRoot":"","sources":["../../src/utils/kd-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Auto-generated version file
3
+ * DO NOT EDIT MANUALLY - Generated from package.json during build
4
+ * @see scripts/generate-version.ts
5
+ */
6
+ /**
7
+ * Current library version
8
+ * Automatically synced with package.json version
9
+ */
10
+ export declare const VERSION = "1.3.7";
11
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Auto-generated version file
3
+ * DO NOT EDIT MANUALLY - Generated from package.json during build
4
+ * @see scripts/generate-version.ts
5
+ */
6
+ /**
7
+ * Current library version
8
+ * Automatically synced with package.json version
9
+ */
10
+ export const VERSION = '1.3.7';
11
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "@xivdyetools/core",
3
+ "version": "1.3.7",
4
+ "description": "Core color algorithms and dye database for XIV Dye Tools",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "files": [
9
+ "dist",
10
+ "README.md"
11
+ ],
12
+ "scripts": {
13
+ "build": "npm run build:version && npm run build:locales && tsc && npm run copy:locales",
14
+ "build:version": "tsx scripts/generate-version.ts",
15
+ "build:locales": "tsx scripts/build-locales.ts",
16
+ "copy:locales": "tsx scripts/copy-locales.ts",
17
+ "prebuild": "npm run build:locales",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "test:integration": "vitest run src/__tests__/integration",
21
+ "test:coverage": "vitest run --coverage",
22
+ "test:coverage:watch": "vitest --coverage",
23
+ "test:coverage:ui": "vitest --coverage --ui",
24
+ "test:threshold": "vitest run --coverage --reporter=verbose",
25
+ "lint": "eslint src --ext .ts",
26
+ "lint:fix": "eslint src --ext .ts --fix",
27
+ "format": "prettier --write \"src/**/*.ts\"",
28
+ "format:check": "prettier --check \"src/**/*.ts\"",
29
+ "type-check": "tsc --noEmit",
30
+ "docs": "typedoc",
31
+ "docs:watch": "typedoc --watch",
32
+ "prepublishOnly": "npm run build",
33
+ "prepare": "husky install || true"
34
+ },
35
+ "keywords": [
36
+ "ffxiv",
37
+ "final-fantasy-xiv",
38
+ "color",
39
+ "dye",
40
+ "harmony",
41
+ "accessibility",
42
+ "colorblind",
43
+ "color-theory",
44
+ "rgb",
45
+ "hsv",
46
+ "universalis"
47
+ ],
48
+ "author": "Flash Galatine",
49
+ "license": "MIT",
50
+ "homepage": "https://github.com/FlashGalatine/xivdyetools-core#readme",
51
+ "bugs": {
52
+ "url": "https://github.com/FlashGalatine/xivdyetools-core/issues"
53
+ },
54
+ "repository": {
55
+ "type": "git",
56
+ "url": "git+https://github.com/FlashGalatine/xivdyetools-core.git"
57
+ },
58
+ "devDependencies": {
59
+ "@types/node": "^20.10.0",
60
+ "@typescript-eslint/eslint-plugin": "^6.15.0",
61
+ "@typescript-eslint/parser": "^6.15.0",
62
+ "@vitest/coverage-v8": "^4.0.14",
63
+ "csv-parse": "^5.5.0",
64
+ "eslint": "^8.55.0",
65
+ "husky": "^8.0.3",
66
+ "lint-staged": "^15.2.0",
67
+ "prettier": "^3.1.1",
68
+ "tsx": "^4.7.0",
69
+ "typedoc": "^0.28.14",
70
+ "typedoc-plugin-markdown": "^4.9.0",
71
+ "typescript": "^5.3.2",
72
+ "vitest": "^4.0.13",
73
+ "yaml": "^2.3.4"
74
+ },
75
+ "engines": {
76
+ "node": ">=18.0.0"
77
+ },
78
+ "lint-staged": {
79
+ "*.ts": [
80
+ "eslint --fix",
81
+ "prettier --write"
82
+ ]
83
+ }
84
+ }