@fgv/ts-res-ui-components 5.0.0-10

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 (231) hide show
  1. package/.rush/temp/03c8b056281d9db0a97d8a6e25eea798a160d393.tar.log +271 -0
  2. package/.rush/temp/chunked-rush-logs/ts-res-ui-components.build.chunks.jsonl +9 -0
  3. package/.rush/temp/operation/build/all.log +9 -0
  4. package/.rush/temp/operation/build/log-chunks.jsonl +9 -0
  5. package/.rush/temp/operation/build/state.json +3 -0
  6. package/.rush/temp/shrinkwrap-deps.json +1111 -0
  7. package/README.md +18 -0
  8. package/REFACTORING_PLAN.md +171 -0
  9. package/config/jest.config.json +16 -0
  10. package/config/jest.setup.js +64 -0
  11. package/config/rig.json +16 -0
  12. package/lib/components/common/QualifierContextControl.d.ts +14 -0
  13. package/lib/components/common/QualifierContextControl.d.ts.map +1 -0
  14. package/lib/components/common/QualifierContextControl.js +78 -0
  15. package/lib/components/common/QualifierContextControl.js.map +1 -0
  16. package/lib/components/common/ResourceListView.d.ts +11 -0
  17. package/lib/components/common/ResourceListView.d.ts.map +1 -0
  18. package/lib/components/common/ResourceListView.js +20 -0
  19. package/lib/components/common/ResourceListView.js.map +1 -0
  20. package/lib/components/common/ResourceTreeView.d.ts +12 -0
  21. package/lib/components/common/ResourceTreeView.d.ts.map +1 -0
  22. package/lib/components/common/ResourceTreeView.js +162 -0
  23. package/lib/components/common/ResourceTreeView.js.map +1 -0
  24. package/lib/components/forms/HierarchyEditor.d.ts +10 -0
  25. package/lib/components/forms/HierarchyEditor.d.ts.map +1 -0
  26. package/lib/components/forms/HierarchyEditor.js +106 -0
  27. package/lib/components/forms/HierarchyEditor.js.map +1 -0
  28. package/lib/components/forms/QualifierEditForm.d.ts +11 -0
  29. package/lib/components/forms/QualifierEditForm.d.ts.map +1 -0
  30. package/lib/components/forms/QualifierEditForm.js +181 -0
  31. package/lib/components/forms/QualifierEditForm.js.map +1 -0
  32. package/lib/components/forms/QualifierTypeEditForm.d.ts +10 -0
  33. package/lib/components/forms/QualifierTypeEditForm.d.ts.map +1 -0
  34. package/lib/components/forms/QualifierTypeEditForm.js +172 -0
  35. package/lib/components/forms/QualifierTypeEditForm.js.map +1 -0
  36. package/lib/components/forms/ResourceTypeEditForm.d.ts +10 -0
  37. package/lib/components/forms/ResourceTypeEditForm.d.ts.map +1 -0
  38. package/lib/components/forms/ResourceTypeEditForm.js +188 -0
  39. package/lib/components/forms/ResourceTypeEditForm.js.map +1 -0
  40. package/lib/components/forms/index.d.ts +9 -0
  41. package/lib/components/forms/index.d.ts.map +1 -0
  42. package/lib/components/forms/index.js +5 -0
  43. package/lib/components/forms/index.js.map +1 -0
  44. package/lib/components/orchestrator/ResourceOrchestrator.d.ts +14 -0
  45. package/lib/components/orchestrator/ResourceOrchestrator.d.ts.map +1 -0
  46. package/lib/components/orchestrator/ResourceOrchestrator.js +278 -0
  47. package/lib/components/orchestrator/ResourceOrchestrator.js.map +1 -0
  48. package/lib/components/views/CompiledView/index.d.ts +5 -0
  49. package/lib/components/views/CompiledView/index.d.ts.map +1 -0
  50. package/lib/components/views/CompiledView/index.js +595 -0
  51. package/lib/components/views/CompiledView/index.js.map +1 -0
  52. package/lib/components/views/ConfigurationView/index.d.ts +5 -0
  53. package/lib/components/views/ConfigurationView/index.d.ts.map +1 -0
  54. package/lib/components/views/ConfigurationView/index.js +363 -0
  55. package/lib/components/views/ConfigurationView/index.js.map +1 -0
  56. package/lib/components/views/FilterView/index.d.ts +5 -0
  57. package/lib/components/views/FilterView/index.d.ts.map +1 -0
  58. package/lib/components/views/FilterView/index.js +463 -0
  59. package/lib/components/views/FilterView/index.js.map +1 -0
  60. package/lib/components/views/ImportView/index.d.ts +5 -0
  61. package/lib/components/views/ImportView/index.d.ts.map +1 -0
  62. package/lib/components/views/ImportView/index.js +514 -0
  63. package/lib/components/views/ImportView/index.js.map +1 -0
  64. package/lib/components/views/ResolutionView/EditableJsonView.d.ts +21 -0
  65. package/lib/components/views/ResolutionView/EditableJsonView.d.ts.map +1 -0
  66. package/lib/components/views/ResolutionView/EditableJsonView.js +109 -0
  67. package/lib/components/views/ResolutionView/EditableJsonView.js.map +1 -0
  68. package/lib/components/views/ResolutionView/ResolutionEditControls.d.ts +19 -0
  69. package/lib/components/views/ResolutionView/ResolutionEditControls.d.ts.map +1 -0
  70. package/lib/components/views/ResolutionView/ResolutionEditControls.js +82 -0
  71. package/lib/components/views/ResolutionView/ResolutionEditControls.js.map +1 -0
  72. package/lib/components/views/ResolutionView/index.d.ts +5 -0
  73. package/lib/components/views/ResolutionView/index.d.ts.map +1 -0
  74. package/lib/components/views/ResolutionView/index.js +255 -0
  75. package/lib/components/views/ResolutionView/index.js.map +1 -0
  76. package/lib/components/views/SourceView/index.d.ts +5 -0
  77. package/lib/components/views/SourceView/index.d.ts.map +1 -0
  78. package/lib/components/views/SourceView/index.js +316 -0
  79. package/lib/components/views/SourceView/index.js.map +1 -0
  80. package/lib/components/views/ZipLoaderView/index.d.ts +5 -0
  81. package/lib/components/views/ZipLoaderView/index.d.ts.map +1 -0
  82. package/lib/components/views/ZipLoaderView/index.js +313 -0
  83. package/lib/components/views/ZipLoaderView/index.js.map +1 -0
  84. package/lib/hooks/useConfigurationState.d.ts +46 -0
  85. package/lib/hooks/useConfigurationState.d.ts.map +1 -0
  86. package/lib/hooks/useConfigurationState.js +239 -0
  87. package/lib/hooks/useConfigurationState.js.map +1 -0
  88. package/lib/hooks/useFilterState.d.ts +7 -0
  89. package/lib/hooks/useFilterState.d.ts.map +1 -0
  90. package/lib/hooks/useFilterState.js +80 -0
  91. package/lib/hooks/useFilterState.js.map +1 -0
  92. package/lib/hooks/useResolutionState.d.ts +8 -0
  93. package/lib/hooks/useResolutionState.d.ts.map +1 -0
  94. package/lib/hooks/useResolutionState.js +253 -0
  95. package/lib/hooks/useResolutionState.js.map +1 -0
  96. package/lib/hooks/useResourceData.d.ts +19 -0
  97. package/lib/hooks/useResourceData.d.ts.map +1 -0
  98. package/lib/hooks/useResourceData.js +368 -0
  99. package/lib/hooks/useResourceData.js.map +1 -0
  100. package/lib/hooks/useViewState.d.ts +10 -0
  101. package/lib/hooks/useViewState.d.ts.map +1 -0
  102. package/lib/hooks/useViewState.js +29 -0
  103. package/lib/hooks/useViewState.js.map +1 -0
  104. package/lib/index.d.ts +27 -0
  105. package/lib/index.d.ts.map +1 -0
  106. package/lib/index.js +34 -0
  107. package/lib/index.js.map +1 -0
  108. package/lib/test/helpers/testDataLoader.d.ts +37 -0
  109. package/lib/test/helpers/testDataLoader.d.ts.map +1 -0
  110. package/lib/test/helpers/testDataLoader.js +171 -0
  111. package/lib/test/helpers/testDataLoader.js.map +1 -0
  112. package/lib/test/unit/utils/configurationUtils.test.d.ts +2 -0
  113. package/lib/test/unit/utils/configurationUtils.test.d.ts.map +1 -0
  114. package/lib/test/unit/utils/configurationUtils.test.js +497 -0
  115. package/lib/test/unit/utils/configurationUtils.test.js.map +1 -0
  116. package/lib/test/unit/utils/fileProcessing.test.d.ts +2 -0
  117. package/lib/test/unit/utils/fileProcessing.test.d.ts.map +1 -0
  118. package/lib/test/unit/utils/fileProcessing.test.js +321 -0
  119. package/lib/test/unit/utils/fileProcessing.test.js.map +1 -0
  120. package/lib/test/unit/utils/filterResources.test.d.ts +2 -0
  121. package/lib/test/unit/utils/filterResources.test.d.ts.map +1 -0
  122. package/lib/test/unit/utils/filterResources.test.js +403 -0
  123. package/lib/test/unit/utils/filterResources.test.js.map +1 -0
  124. package/lib/test/unit/utils/resolutionEditing.test.d.ts +2 -0
  125. package/lib/test/unit/utils/resolutionEditing.test.d.ts.map +1 -0
  126. package/lib/test/unit/utils/resolutionEditing.test.js +439 -0
  127. package/lib/test/unit/utils/resolutionEditing.test.js.map +1 -0
  128. package/lib/test/unit/utils/resolutionUtils.test.d.ts +2 -0
  129. package/lib/test/unit/utils/resolutionUtils.test.d.ts.map +1 -0
  130. package/lib/test/unit/utils/resolutionUtils.test.js +397 -0
  131. package/lib/test/unit/utils/resolutionUtils.test.js.map +1 -0
  132. package/lib/test/unit/utils/tsResIntegration.test.d.ts +2 -0
  133. package/lib/test/unit/utils/tsResIntegration.test.d.ts.map +1 -0
  134. package/lib/test/unit/utils/tsResIntegration.test.js +376 -0
  135. package/lib/test/unit/utils/tsResIntegration.test.js.map +1 -0
  136. package/lib/types/index.d.ts +251 -0
  137. package/lib/types/index.d.ts.map +1 -0
  138. package/lib/types/index.js +2 -0
  139. package/lib/types/index.js.map +1 -0
  140. package/lib/utils/configurationUtils.d.ts +74 -0
  141. package/lib/utils/configurationUtils.d.ts.map +1 -0
  142. package/lib/utils/configurationUtils.js +359 -0
  143. package/lib/utils/configurationUtils.js.map +1 -0
  144. package/lib/utils/fileProcessing.d.ts +18 -0
  145. package/lib/utils/fileProcessing.d.ts.map +1 -0
  146. package/lib/utils/fileProcessing.js +142 -0
  147. package/lib/utils/fileProcessing.js.map +1 -0
  148. package/lib/utils/filterResources.d.ts +38 -0
  149. package/lib/utils/filterResources.d.ts.map +1 -0
  150. package/lib/utils/filterResources.js +153 -0
  151. package/lib/utils/filterResources.js.map +1 -0
  152. package/lib/utils/resolutionEditing.d.ts +58 -0
  153. package/lib/utils/resolutionEditing.d.ts.map +1 -0
  154. package/lib/utils/resolutionEditing.js +246 -0
  155. package/lib/utils/resolutionEditing.js.map +1 -0
  156. package/lib/utils/resolutionUtils.d.ts +28 -0
  157. package/lib/utils/resolutionUtils.d.ts.map +1 -0
  158. package/lib/utils/resolutionUtils.js +216 -0
  159. package/lib/utils/resolutionUtils.js.map +1 -0
  160. package/lib/utils/tsResIntegration.d.ts +71 -0
  161. package/lib/utils/tsResIntegration.d.ts.map +1 -0
  162. package/lib/utils/tsResIntegration.js +294 -0
  163. package/lib/utils/tsResIntegration.js.map +1 -0
  164. package/lib/utils/zipLoader/browserZipLoader.d.ts +48 -0
  165. package/lib/utils/zipLoader/browserZipLoader.d.ts.map +1 -0
  166. package/lib/utils/zipLoader/browserZipLoader.js +247 -0
  167. package/lib/utils/zipLoader/browserZipLoader.js.map +1 -0
  168. package/lib/utils/zipLoader/index.d.ts +8 -0
  169. package/lib/utils/zipLoader/index.d.ts.map +1 -0
  170. package/lib/utils/zipLoader/index.js +13 -0
  171. package/lib/utils/zipLoader/index.js.map +1 -0
  172. package/lib/utils/zipLoader/nodeZipBuilder.d.ts +55 -0
  173. package/lib/utils/zipLoader/nodeZipBuilder.d.ts.map +1 -0
  174. package/lib/utils/zipLoader/nodeZipBuilder.js +98 -0
  175. package/lib/utils/zipLoader/nodeZipBuilder.js.map +1 -0
  176. package/lib/utils/zipLoader/types.d.ts +139 -0
  177. package/lib/utils/zipLoader/types.d.ts.map +1 -0
  178. package/lib/utils/zipLoader/types.js +2 -0
  179. package/lib/utils/zipLoader/types.js.map +1 -0
  180. package/lib/utils/zipLoader/zipUtils.d.ts +53 -0
  181. package/lib/utils/zipLoader/zipUtils.d.ts.map +1 -0
  182. package/lib/utils/zipLoader/zipUtils.js +229 -0
  183. package/lib/utils/zipLoader/zipUtils.js.map +1 -0
  184. package/package.json +69 -0
  185. package/rush-logs/ts-res-ui-components.build.cache.log +3 -0
  186. package/rush-logs/ts-res-ui-components.build.log +9 -0
  187. package/src/components/common/QualifierContextControl.tsx +151 -0
  188. package/src/components/common/ResourceListView.tsx +63 -0
  189. package/src/components/common/ResourceTreeView.tsx +271 -0
  190. package/src/components/forms/HierarchyEditor.tsx +204 -0
  191. package/src/components/forms/QualifierEditForm.tsx +355 -0
  192. package/src/components/forms/QualifierTypeEditForm.tsx +347 -0
  193. package/src/components/forms/ResourceTypeEditForm.tsx +331 -0
  194. package/src/components/forms/index.ts +11 -0
  195. package/src/components/orchestrator/ResourceOrchestrator.tsx +372 -0
  196. package/src/components/views/CompiledView/index.tsx +922 -0
  197. package/src/components/views/ConfigurationView/index.tsx +800 -0
  198. package/src/components/views/FilterView/index.tsx +825 -0
  199. package/src/components/views/ImportView/index.tsx +717 -0
  200. package/src/components/views/ResolutionView/EditableJsonView.tsx +214 -0
  201. package/src/components/views/ResolutionView/ResolutionEditControls.tsx +170 -0
  202. package/src/components/views/ResolutionView/index.tsx +591 -0
  203. package/src/components/views/SourceView/index.tsx +536 -0
  204. package/src/components/views/ZipLoaderView/index.tsx +485 -0
  205. package/src/hooks/useConfigurationState.ts +374 -0
  206. package/src/hooks/useFilterState.ts +97 -0
  207. package/src/hooks/useResolutionState.ts +355 -0
  208. package/src/hooks/useResourceData.ts +467 -0
  209. package/src/hooks/useViewState.ts +44 -0
  210. package/src/index.ts +45 -0
  211. package/src/test/helpers/testDataLoader.ts +195 -0
  212. package/src/test/unit/utils/configurationUtils.test.ts +630 -0
  213. package/src/test/unit/utils/fileProcessing.test.ts +391 -0
  214. package/src/test/unit/utils/filterResources.test.ts +574 -0
  215. package/src/test/unit/utils/resolutionEditing.test.ts +556 -0
  216. package/src/test/unit/utils/resolutionUtils.test.ts +521 -0
  217. package/src/test/unit/utils/tsResIntegration.test.ts +433 -0
  218. package/src/types/index.ts +322 -0
  219. package/src/utils/configurationUtils.ts +424 -0
  220. package/src/utils/fileProcessing.ts +160 -0
  221. package/src/utils/filterResources.ts +206 -0
  222. package/src/utils/resolutionEditing.ts +319 -0
  223. package/src/utils/resolutionUtils.ts +289 -0
  224. package/src/utils/tsResIntegration.ts +440 -0
  225. package/src/utils/zipLoader/browserZipLoader.ts +319 -0
  226. package/src/utils/zipLoader/index.ts +26 -0
  227. package/src/utils/zipLoader/nodeZipBuilder.ts +153 -0
  228. package/src/utils/zipLoader/types.ts +175 -0
  229. package/src/utils/zipLoader/zipUtils.ts +266 -0
  230. package/temp/build/typescript/ts_gZid87Hu.json +1 -0
  231. package/tsconfig.json +15 -0
@@ -0,0 +1,139 @@
1
+ import { Result } from '@fgv/ts-utils';
2
+ import { Config } from '@fgv/ts-res';
3
+ import { ImportedDirectory, ImportedFile, ProcessedResources } from '../../types';
4
+ /**
5
+ * ZIP manifest metadata structure
6
+ */
7
+ export interface ZipManifest {
8
+ timestamp: string;
9
+ input?: {
10
+ type: 'file' | 'directory';
11
+ originalPath: string;
12
+ archivePath: string;
13
+ };
14
+ config?: {
15
+ type: 'file';
16
+ originalPath: string;
17
+ archivePath: string;
18
+ };
19
+ }
20
+ /**
21
+ * Options for creating ZIP archives
22
+ */
23
+ export interface ZipArchiveOptions {
24
+ /** Output directory for the ZIP file */
25
+ outputDir?: string;
26
+ /** Custom filename (without extension) */
27
+ filename?: string;
28
+ /** Compression level (0-9) */
29
+ compressionLevel?: number;
30
+ /** Include configuration file */
31
+ includeConfig?: boolean;
32
+ /** Custom configuration to include */
33
+ config?: Config.Model.ISystemConfiguration;
34
+ }
35
+ /**
36
+ * Result of ZIP archive creation
37
+ */
38
+ export interface ZipArchiveResult {
39
+ /** Path to the created ZIP file */
40
+ filePath: string;
41
+ /** Size of the ZIP file in bytes */
42
+ fileSize: number;
43
+ /** Generated manifest */
44
+ manifest: ZipManifest;
45
+ /** Timestamp when created */
46
+ timestamp: string;
47
+ }
48
+ /**
49
+ * Options for loading ZIP archives
50
+ */
51
+ export interface ZipLoadOptions {
52
+ /** Whether to auto-apply configuration found in ZIP */
53
+ autoApplyConfig?: boolean;
54
+ /** Whether to auto-process resources after loading */
55
+ autoProcessResources?: boolean;
56
+ /** Custom configuration to use instead of ZIP config */
57
+ overrideConfig?: Config.Model.ISystemConfiguration;
58
+ }
59
+ /**
60
+ * Result of ZIP loading operation
61
+ */
62
+ export interface ZipLoadResult {
63
+ /** Manifest from the ZIP */
64
+ manifest: ZipManifest | null;
65
+ /** Configuration found in ZIP */
66
+ config: Config.Model.ISystemConfiguration | null;
67
+ /** Loaded files */
68
+ files: ImportedFile[];
69
+ /** Loaded directory structure */
70
+ directory: ImportedDirectory | null;
71
+ /** File tree for direct processing */
72
+ fileTree?: any;
73
+ /** Processed resources if auto-processing was enabled */
74
+ processedResources: ProcessedResources | null;
75
+ }
76
+ /**
77
+ * ZIP loading progress stages
78
+ */
79
+ export type ZipLoadingStage = 'reading-file' | 'parsing-zip' | 'loading-manifest' | 'loading-config' | 'extracting-files' | 'processing-resources' | 'complete';
80
+ /**
81
+ * Progress callback for ZIP operations
82
+ */
83
+ export interface ZipProgressCallback {
84
+ (stage: ZipLoadingStage, progress: number, message?: string): void;
85
+ }
86
+ /**
87
+ * ZIP builder interface (Node.js environment)
88
+ */
89
+ export interface IZipBuilder {
90
+ /**
91
+ * Create ZIP from files
92
+ */
93
+ createFromFiles(files: ImportedFile[], options?: ZipArchiveOptions): Promise<Result<ZipArchiveResult>>;
94
+ /**
95
+ * Create ZIP from directory
96
+ */
97
+ createFromDirectory(directory: ImportedDirectory, options?: ZipArchiveOptions): Promise<Result<ZipArchiveResult>>;
98
+ /**
99
+ * Create ZIP from file system path
100
+ */
101
+ createFromPath(path: string, options?: ZipArchiveOptions): Promise<Result<ZipArchiveResult>>;
102
+ }
103
+ /**
104
+ * ZIP loader interface (Browser environment)
105
+ */
106
+ export interface IZipLoader {
107
+ /**
108
+ * Load ZIP from File object
109
+ */
110
+ loadFromFile(file: File, options?: ZipLoadOptions, onProgress?: ZipProgressCallback): Promise<Result<ZipLoadResult>>;
111
+ /**
112
+ * Load ZIP from ArrayBuffer
113
+ */
114
+ loadFromBuffer(buffer: ArrayBuffer, options?: ZipLoadOptions, onProgress?: ZipProgressCallback): Promise<Result<ZipLoadResult>>;
115
+ /**
116
+ * Load ZIP from URL
117
+ */
118
+ loadFromUrl(url: string, options?: ZipLoadOptions, onProgress?: ZipProgressCallback): Promise<Result<ZipLoadResult>>;
119
+ }
120
+ /**
121
+ * File item within a ZIP archive
122
+ */
123
+ export interface ZipFileItem {
124
+ name: string;
125
+ path: string;
126
+ size: number;
127
+ isDirectory: boolean;
128
+ lastModified?: Date;
129
+ content?: string | ArrayBuffer;
130
+ }
131
+ /**
132
+ * ZIP file tree representation
133
+ */
134
+ export interface ZipFileTree {
135
+ files: Map<string, ZipFileItem>;
136
+ directories: Set<string>;
137
+ root: string;
138
+ }
139
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/zipLoader/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/zipLoader/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Result } from '@fgv/ts-utils';\nimport { Config } from '@fgv/ts-res';\nimport { ImportedDirectory, ImportedFile, ProcessedResources } from '../../types';\n\n/**\n * ZIP manifest metadata structure\n */\nexport interface ZipManifest {\n timestamp: string;\n input?: {\n type: 'file' | 'directory';\n originalPath: string;\n archivePath: string;\n };\n config?: {\n type: 'file';\n originalPath: string;\n archivePath: string;\n };\n}\n\n/**\n * Options for creating ZIP archives\n */\nexport interface ZipArchiveOptions {\n /** Output directory for the ZIP file */\n outputDir?: string;\n /** Custom filename (without extension) */\n filename?: string;\n /** Compression level (0-9) */\n compressionLevel?: number;\n /** Include configuration file */\n includeConfig?: boolean;\n /** Custom configuration to include */\n config?: Config.Model.ISystemConfiguration;\n}\n\n/**\n * Result of ZIP archive creation\n */\nexport interface ZipArchiveResult {\n /** Path to the created ZIP file */\n filePath: string;\n /** Size of the ZIP file in bytes */\n fileSize: number;\n /** Generated manifest */\n manifest: ZipManifest;\n /** Timestamp when created */\n timestamp: string;\n}\n\n/**\n * Options for loading ZIP archives\n */\nexport interface ZipLoadOptions {\n /** Whether to auto-apply configuration found in ZIP */\n autoApplyConfig?: boolean;\n /** Whether to auto-process resources after loading */\n autoProcessResources?: boolean;\n /** Custom configuration to use instead of ZIP config */\n overrideConfig?: Config.Model.ISystemConfiguration;\n}\n\n/**\n * Result of ZIP loading operation\n */\nexport interface ZipLoadResult {\n /** Manifest from the ZIP */\n manifest: ZipManifest | null;\n /** Configuration found in ZIP */\n config: Config.Model.ISystemConfiguration | null;\n /** Loaded files */\n files: ImportedFile[];\n /** Loaded directory structure */\n directory: ImportedDirectory | null;\n /** File tree for direct processing */\n fileTree?: any; // FileTree.FileTree from ts-utils\n /** Processed resources if auto-processing was enabled */\n processedResources: ProcessedResources | null;\n}\n\n/**\n * ZIP loading progress stages\n */\nexport type ZipLoadingStage =\n | 'reading-file'\n | 'parsing-zip'\n | 'loading-manifest'\n | 'loading-config'\n | 'extracting-files'\n | 'processing-resources'\n | 'complete';\n\n/**\n * Progress callback for ZIP operations\n */\nexport interface ZipProgressCallback {\n (stage: ZipLoadingStage, progress: number, message?: string): void;\n}\n\n/**\n * ZIP builder interface (Node.js environment)\n */\nexport interface IZipBuilder {\n /**\n * Create ZIP from files\n */\n createFromFiles(files: ImportedFile[], options?: ZipArchiveOptions): Promise<Result<ZipArchiveResult>>;\n\n /**\n * Create ZIP from directory\n */\n createFromDirectory(\n directory: ImportedDirectory,\n options?: ZipArchiveOptions\n ): Promise<Result<ZipArchiveResult>>;\n\n /**\n * Create ZIP from file system path\n */\n createFromPath(path: string, options?: ZipArchiveOptions): Promise<Result<ZipArchiveResult>>;\n}\n\n/**\n * ZIP loader interface (Browser environment)\n */\nexport interface IZipLoader {\n /**\n * Load ZIP from File object\n */\n loadFromFile(\n file: File,\n options?: ZipLoadOptions,\n onProgress?: ZipProgressCallback\n ): Promise<Result<ZipLoadResult>>;\n\n /**\n * Load ZIP from ArrayBuffer\n */\n loadFromBuffer(\n buffer: ArrayBuffer,\n options?: ZipLoadOptions,\n onProgress?: ZipProgressCallback\n ): Promise<Result<ZipLoadResult>>;\n\n /**\n * Load ZIP from URL\n */\n loadFromUrl(\n url: string,\n options?: ZipLoadOptions,\n onProgress?: ZipProgressCallback\n ): Promise<Result<ZipLoadResult>>;\n}\n\n/**\n * File item within a ZIP archive\n */\nexport interface ZipFileItem {\n name: string;\n path: string;\n size: number;\n isDirectory: boolean;\n lastModified?: Date;\n content?: string | ArrayBuffer;\n}\n\n/**\n * ZIP file tree representation\n */\nexport interface ZipFileTree {\n files: Map<string, ZipFileItem>;\n directories: Set<string>;\n root: string;\n}\n"]}
@@ -0,0 +1,53 @@
1
+ import { Result } from '@fgv/ts-utils';
2
+ import { Config } from '@fgv/ts-res';
3
+ import { ZipManifest, ZipFileTree } from './types';
4
+ import { ImportedDirectory, ImportedFile } from '../../types';
5
+ /**
6
+ * Generate a timestamp-based filename for ZIP archives
7
+ */
8
+ export declare function generateZipFilename(customName?: string): string;
9
+ /**
10
+ * Create a ZIP manifest object
11
+ */
12
+ export declare function createManifest(inputType: 'file' | 'directory', originalPath: string, archivePath: string, configPath?: string): ZipManifest;
13
+ /**
14
+ * Parse and validate a ZIP manifest
15
+ */
16
+ export declare function parseManifest(manifestData: string): Result<ZipManifest>;
17
+ /**
18
+ * Parse and validate configuration JSON
19
+ */
20
+ export declare function parseConfiguration(configData: string): Result<Config.Model.ISystemConfiguration>;
21
+ /**
22
+ * Convert ZIP file tree to ImportedFiles array
23
+ */
24
+ export declare function zipTreeToFiles(tree: ZipFileTree): ImportedFile[];
25
+ /**
26
+ * Convert ZIP file tree to ImportedDirectory structure
27
+ */
28
+ export declare function zipTreeToDirectory(tree: ZipFileTree): ImportedDirectory | null;
29
+ /**
30
+ * Normalize path separators for cross-platform compatibility
31
+ */
32
+ export declare function normalizePath(path: string): string;
33
+ /**
34
+ * Extract directory name from a file path
35
+ */
36
+ export declare function getDirectoryName(path: string): string;
37
+ /**
38
+ * Create a safe filename by removing invalid characters
39
+ */
40
+ export declare function sanitizeFilename(filename: string): string;
41
+ /**
42
+ * Format file size in human readable format
43
+ */
44
+ export declare function formatFileSize(bytes: number): string;
45
+ /**
46
+ * Validate ZIP file extension
47
+ */
48
+ export declare function isZipFile(filename: string): boolean;
49
+ /**
50
+ * Extract base name from filename (without extension)
51
+ */
52
+ export declare function getBaseName(filename: string): string;
53
+ //# sourceMappingURL=zipUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zipUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/zipLoader/zipUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAe,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,GAAG,WAAW,EAC/B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,WAAW,CAmBb;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAiCvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAchG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,EAAE,CAehE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,iBAAiB,GAAG,IAAI,CA6D9E;AA4BD;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIpD"}
@@ -0,0 +1,229 @@
1
+ import { succeed, fail } from '@fgv/ts-utils';
2
+ /**
3
+ * Generate a timestamp-based filename for ZIP archives
4
+ */
5
+ export function generateZipFilename(customName) {
6
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').replace('T', '_').slice(0, -5);
7
+ return customName ? `${customName}-${timestamp}.zip` : `ts-res-bundle-${timestamp}.zip`;
8
+ }
9
+ /**
10
+ * Create a ZIP manifest object
11
+ */
12
+ export function createManifest(inputType, originalPath, archivePath, configPath) {
13
+ const manifest = {
14
+ timestamp: new Date().toISOString(),
15
+ input: {
16
+ type: inputType,
17
+ originalPath,
18
+ archivePath
19
+ }
20
+ };
21
+ if (configPath) {
22
+ manifest.config = {
23
+ type: 'file',
24
+ originalPath: configPath,
25
+ archivePath: 'config.json'
26
+ };
27
+ }
28
+ return manifest;
29
+ }
30
+ /**
31
+ * Parse and validate a ZIP manifest
32
+ */
33
+ export function parseManifest(manifestData) {
34
+ try {
35
+ const parsed = JSON.parse(manifestData);
36
+ // Basic validation
37
+ if (!parsed.timestamp || typeof parsed.timestamp !== 'string') {
38
+ return fail('Invalid manifest: missing or invalid timestamp');
39
+ }
40
+ // Validate input section if present
41
+ if (parsed.input) {
42
+ if (!parsed.input.type || !['file', 'directory'].includes(parsed.input.type)) {
43
+ return fail('Invalid manifest: invalid input type');
44
+ }
45
+ if (!parsed.input.originalPath || !parsed.input.archivePath) {
46
+ return fail('Invalid manifest: missing input paths');
47
+ }
48
+ }
49
+ // Validate config section if present
50
+ if (parsed.config) {
51
+ if (parsed.config.type !== 'file') {
52
+ return fail('Invalid manifest: invalid config type');
53
+ }
54
+ if (!parsed.config.originalPath || !parsed.config.archivePath) {
55
+ return fail('Invalid manifest: missing config paths');
56
+ }
57
+ }
58
+ return succeed(parsed);
59
+ }
60
+ catch (error) {
61
+ return fail(`Failed to parse manifest: ${error instanceof Error ? error.message : String(error)}`);
62
+ }
63
+ }
64
+ /**
65
+ * Parse and validate configuration JSON
66
+ */
67
+ export function parseConfiguration(configData) {
68
+ try {
69
+ const parsed = JSON.parse(configData);
70
+ // Basic validation - check for expected properties
71
+ if (typeof parsed !== 'object' || parsed === null) {
72
+ return fail('Invalid configuration: not an object');
73
+ }
74
+ // More detailed validation could be added here using ts-res validators
75
+ return succeed(parsed);
76
+ }
77
+ catch (error) {
78
+ return fail(`Failed to parse configuration: ${error instanceof Error ? error.message : String(error)}`);
79
+ }
80
+ }
81
+ /**
82
+ * Convert ZIP file tree to ImportedFiles array
83
+ */
84
+ export function zipTreeToFiles(tree) {
85
+ const files = [];
86
+ for (const [path, item] of Array.from(tree.files.entries())) {
87
+ if (!item.isDirectory && item.content && typeof item.content === 'string') {
88
+ files.push({
89
+ name: item.name,
90
+ path: path,
91
+ content: item.content,
92
+ type: getFileType(item.name)
93
+ });
94
+ }
95
+ }
96
+ return files;
97
+ }
98
+ /**
99
+ * Convert ZIP file tree to ImportedDirectory structure
100
+ */
101
+ export function zipTreeToDirectory(tree) {
102
+ if (tree.files.size === 0) {
103
+ return null;
104
+ }
105
+ // Build directory structure
106
+ const directories = new Map();
107
+ const rootDir = {
108
+ name: tree.root || 'root',
109
+ files: [],
110
+ subdirectories: []
111
+ };
112
+ directories.set('', rootDir);
113
+ // Process all paths to build directory structure
114
+ for (const [path, item] of Array.from(tree.files.entries())) {
115
+ const pathParts = path.split('/').filter((part) => part.length > 0);
116
+ if (pathParts.length === 0)
117
+ continue;
118
+ // Ensure all parent directories exist
119
+ let currentPath = '';
120
+ for (let i = 0; i < pathParts.length - 1; i++) {
121
+ const parentPath = currentPath;
122
+ currentPath = currentPath ? `${currentPath}/${pathParts[i]}` : pathParts[i];
123
+ if (!directories.has(currentPath)) {
124
+ const newDir = {
125
+ name: pathParts[i],
126
+ files: [],
127
+ subdirectories: []
128
+ };
129
+ directories.set(currentPath, newDir);
130
+ // Add to parent directory
131
+ const parentDir = directories.get(parentPath);
132
+ if (parentDir) {
133
+ parentDir.subdirectories = parentDir.subdirectories || [];
134
+ parentDir.subdirectories.push(newDir);
135
+ }
136
+ }
137
+ }
138
+ // Add file to its parent directory
139
+ if (!item.isDirectory && item.content && typeof item.content === 'string') {
140
+ const fileName = pathParts[pathParts.length - 1];
141
+ const parentPath = pathParts.length > 1 ? pathParts.slice(0, -1).join('/') : '';
142
+ const parentDir = directories.get(parentPath);
143
+ if (parentDir) {
144
+ parentDir.files.push({
145
+ name: fileName,
146
+ path: path,
147
+ content: item.content,
148
+ type: getFileType(fileName)
149
+ });
150
+ }
151
+ }
152
+ }
153
+ return rootDir;
154
+ }
155
+ /**
156
+ * Get file type based on extension
157
+ */
158
+ function getFileType(filename) {
159
+ const ext = filename.toLowerCase().split('.').pop();
160
+ switch (ext) {
161
+ case 'json':
162
+ return 'application/json';
163
+ case 'yaml':
164
+ case 'yml':
165
+ return 'application/yaml';
166
+ case 'xml':
167
+ return 'application/xml';
168
+ case 'txt':
169
+ return 'text/plain';
170
+ case 'md':
171
+ return 'text/markdown';
172
+ case 'js':
173
+ return 'application/javascript';
174
+ case 'ts':
175
+ return 'application/typescript';
176
+ default:
177
+ return 'application/octet-stream';
178
+ }
179
+ }
180
+ /**
181
+ * Normalize path separators for cross-platform compatibility
182
+ */
183
+ export function normalizePath(path) {
184
+ return path.replace(/\\/g, '/').replace(/\/+/g, '/');
185
+ }
186
+ /**
187
+ * Extract directory name from a file path
188
+ */
189
+ export function getDirectoryName(path) {
190
+ const normalized = normalizePath(path);
191
+ const parts = normalized.split('/');
192
+ return parts[parts.length - 1] || 'archive';
193
+ }
194
+ /**
195
+ * Create a safe filename by removing invalid characters
196
+ */
197
+ export function sanitizeFilename(filename) {
198
+ return filename
199
+ .replace(/[<>:"/\\|?*]/g, '_')
200
+ .replace(/\s+/g, '_')
201
+ .replace(/_+/g, '_')
202
+ .trim();
203
+ }
204
+ /**
205
+ * Format file size in human readable format
206
+ */
207
+ export function formatFileSize(bytes) {
208
+ if (bytes === 0)
209
+ return '0 B';
210
+ const sizes = ['B', 'KB', 'MB', 'GB'];
211
+ const i = Math.floor(Math.log(bytes) / Math.log(1024));
212
+ const size = bytes / Math.pow(1024, i);
213
+ return `${size.toFixed(i === 0 ? 0 : 1)} ${sizes[i]}`;
214
+ }
215
+ /**
216
+ * Validate ZIP file extension
217
+ */
218
+ export function isZipFile(filename) {
219
+ return filename.toLowerCase().endsWith('.zip');
220
+ }
221
+ /**
222
+ * Extract base name from filename (without extension)
223
+ */
224
+ export function getBaseName(filename) {
225
+ const name = filename.split('/').pop() || filename;
226
+ const dotIndex = name.lastIndexOf('.');
227
+ return dotIndex > 0 ? name.substring(0, dotIndex) : name;
228
+ }
229
+ //# sourceMappingURL=zipUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zipUtils.js","sourceRoot":"","sources":["../../../src/utils/zipLoader/zipUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { Result, succeed, fail } from '@fgv/ts-utils';\nimport { Config } from '@fgv/ts-res';\nimport { ZipManifest, ZipFileItem, ZipFileTree } from './types';\nimport { ImportedDirectory, ImportedFile } from '../../types';\n\n/**\n * Generate a timestamp-based filename for ZIP archives\n */\nexport function generateZipFilename(customName?: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').replace('T', '_').slice(0, -5);\n return customName ? `${customName}-${timestamp}.zip` : `ts-res-bundle-${timestamp}.zip`;\n}\n\n/**\n * Create a ZIP manifest object\n */\nexport function createManifest(\n inputType: 'file' | 'directory',\n originalPath: string,\n archivePath: string,\n configPath?: string\n): ZipManifest {\n const manifest: ZipManifest = {\n timestamp: new Date().toISOString(),\n input: {\n type: inputType,\n originalPath,\n archivePath\n }\n };\n\n if (configPath) {\n manifest.config = {\n type: 'file',\n originalPath: configPath,\n archivePath: 'config.json'\n };\n }\n\n return manifest;\n}\n\n/**\n * Parse and validate a ZIP manifest\n */\nexport function parseManifest(manifestData: string): Result<ZipManifest> {\n try {\n const parsed = JSON.parse(manifestData);\n\n // Basic validation\n if (!parsed.timestamp || typeof parsed.timestamp !== 'string') {\n return fail('Invalid manifest: missing or invalid timestamp');\n }\n\n // Validate input section if present\n if (parsed.input) {\n if (!parsed.input.type || !['file', 'directory'].includes(parsed.input.type)) {\n return fail('Invalid manifest: invalid input type');\n }\n if (!parsed.input.originalPath || !parsed.input.archivePath) {\n return fail('Invalid manifest: missing input paths');\n }\n }\n\n // Validate config section if present\n if (parsed.config) {\n if (parsed.config.type !== 'file') {\n return fail('Invalid manifest: invalid config type');\n }\n if (!parsed.config.originalPath || !parsed.config.archivePath) {\n return fail('Invalid manifest: missing config paths');\n }\n }\n\n return succeed(parsed as ZipManifest);\n } catch (error) {\n return fail(`Failed to parse manifest: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Parse and validate configuration JSON\n */\nexport function parseConfiguration(configData: string): Result<Config.Model.ISystemConfiguration> {\n try {\n const parsed = JSON.parse(configData);\n\n // Basic validation - check for expected properties\n if (typeof parsed !== 'object' || parsed === null) {\n return fail('Invalid configuration: not an object');\n }\n\n // More detailed validation could be added here using ts-res validators\n return succeed(parsed as Config.Model.ISystemConfiguration);\n } catch (error) {\n return fail(`Failed to parse configuration: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Convert ZIP file tree to ImportedFiles array\n */\nexport function zipTreeToFiles(tree: ZipFileTree): ImportedFile[] {\n const files: ImportedFile[] = [];\n\n for (const [path, item] of Array.from(tree.files.entries())) {\n if (!item.isDirectory && item.content && typeof item.content === 'string') {\n files.push({\n name: item.name,\n path: path,\n content: item.content,\n type: getFileType(item.name)\n });\n }\n }\n\n return files;\n}\n\n/**\n * Convert ZIP file tree to ImportedDirectory structure\n */\nexport function zipTreeToDirectory(tree: ZipFileTree): ImportedDirectory | null {\n if (tree.files.size === 0) {\n return null;\n }\n\n // Build directory structure\n const directories = new Map<string, ImportedDirectory>();\n const rootDir: ImportedDirectory = {\n name: tree.root || 'root',\n files: [],\n subdirectories: []\n };\n directories.set('', rootDir);\n\n // Process all paths to build directory structure\n for (const [path, item] of Array.from(tree.files.entries())) {\n const pathParts = path.split('/').filter((part: string) => part.length > 0);\n\n if (pathParts.length === 0) continue;\n\n // Ensure all parent directories exist\n let currentPath = '';\n for (let i = 0; i < pathParts.length - 1; i++) {\n const parentPath = currentPath;\n currentPath = currentPath ? `${currentPath}/${pathParts[i]}` : pathParts[i];\n\n if (!directories.has(currentPath)) {\n const newDir: ImportedDirectory = {\n name: pathParts[i],\n files: [],\n subdirectories: []\n };\n directories.set(currentPath, newDir);\n\n // Add to parent directory\n const parentDir = directories.get(parentPath);\n if (parentDir) {\n parentDir.subdirectories = parentDir.subdirectories || [];\n parentDir.subdirectories.push(newDir);\n }\n }\n }\n\n // Add file to its parent directory\n if (!item.isDirectory && item.content && typeof item.content === 'string') {\n const fileName = pathParts[pathParts.length - 1];\n const parentPath = pathParts.length > 1 ? pathParts.slice(0, -1).join('/') : '';\n const parentDir = directories.get(parentPath);\n\n if (parentDir) {\n parentDir.files.push({\n name: fileName,\n path: path,\n content: item.content,\n type: getFileType(fileName)\n });\n }\n }\n }\n\n return rootDir;\n}\n\n/**\n * Get file type based on extension\n */\nfunction getFileType(filename: string): string {\n const ext = filename.toLowerCase().split('.').pop();\n switch (ext) {\n case 'json':\n return 'application/json';\n case 'yaml':\n case 'yml':\n return 'application/yaml';\n case 'xml':\n return 'application/xml';\n case 'txt':\n return 'text/plain';\n case 'md':\n return 'text/markdown';\n case 'js':\n return 'application/javascript';\n case 'ts':\n return 'application/typescript';\n default:\n return 'application/octet-stream';\n }\n}\n\n/**\n * Normalize path separators for cross-platform compatibility\n */\nexport function normalizePath(path: string): string {\n return path.replace(/\\\\/g, '/').replace(/\\/+/g, '/');\n}\n\n/**\n * Extract directory name from a file path\n */\nexport function getDirectoryName(path: string): string {\n const normalized = normalizePath(path);\n const parts = normalized.split('/');\n return parts[parts.length - 1] || 'archive';\n}\n\n/**\n * Create a safe filename by removing invalid characters\n */\nexport function sanitizeFilename(filename: string): string {\n return filename\n .replace(/[<>:\"/\\\\|?*]/g, '_')\n .replace(/\\s+/g, '_')\n .replace(/_+/g, '_')\n .trim();\n}\n\n/**\n * Format file size in human readable format\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n const size = bytes / Math.pow(1024, i);\n\n return `${size.toFixed(i === 0 ? 0 : 1)} ${sizes[i]}`;\n}\n\n/**\n * Validate ZIP file extension\n */\nexport function isZipFile(filename: string): boolean {\n return filename.toLowerCase().endsWith('.zip');\n}\n\n/**\n * Extract base name from filename (without extension)\n */\nexport function getBaseName(filename: string): string {\n const name = filename.split('/').pop() || filename;\n const dotIndex = name.lastIndexOf('.');\n return dotIndex > 0 ? name.substring(0, dotIndex) : name;\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@fgv/ts-res-ui-components",
3
+ "version": "5.0.0-10",
4
+ "description": "Reusable React components for ts-res resource visualization and management",
5
+ "main": "lib/index.js",
6
+ "types": "lib/index.d.ts",
7
+ "sideEffects": false,
8
+ "keywords": [
9
+ "typescript",
10
+ "react",
11
+ "components",
12
+ "ts-res",
13
+ "resource-management",
14
+ "ui"
15
+ ],
16
+ "author": "Erik Fortune",
17
+ "license": "MIT",
18
+ "bugs": {
19
+ "url": "https://github.com/ErikFortune/fgv/issues"
20
+ },
21
+ "homepage": "https://github.com/ErikFortune/fgv/tree/main/libraries/ts-res-ui-components#readme",
22
+ "dependencies": {
23
+ "@heroicons/react": "~2.2.0",
24
+ "jszip": "~3.10.1",
25
+ "tslib": "^2.8.1",
26
+ "json-edit-react": "~1.28.2",
27
+ "@fgv/ts-res": "5.0.0-10",
28
+ "@fgv/ts-utils": "5.0.0-10",
29
+ "@fgv/ts-json": "5.0.0-10",
30
+ "@fgv/ts-json-base": "5.0.0-10"
31
+ },
32
+ "peerDependencies": {
33
+ "react": ">=18.0.0",
34
+ "react-dom": ">=18.0.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/react": "~19.1.8",
38
+ "@types/react-dom": "~19.1.6",
39
+ "react": "~19.1.0",
40
+ "@types/jest": "^29.5.14",
41
+ "@types/node": "^20.14.9",
42
+ "@typescript-eslint/eslint-plugin": "^7.14.1",
43
+ "@typescript-eslint/parser": "^7.14.1",
44
+ "eslint": "^8.57.0",
45
+ "eslint-plugin-import": "^2.32.0",
46
+ "eslint-plugin-node": "^11.1.0",
47
+ "eslint-plugin-promise": "^6.2.0",
48
+ "eslint-plugin-react": "^7.34.0",
49
+ "eslint-plugin-react-hooks": "^4.6.0",
50
+ "jest": "^29.7.0",
51
+ "react-dom": "~19.1.0",
52
+ "rimraf": "^5.0.7",
53
+ "ts-jest": "^29.4.0",
54
+ "typescript": "^5.7.3",
55
+ "@rushstack/heft": "~0.74.0",
56
+ "@rushstack/heft-web-rig": "~0.29.0",
57
+ "@rushstack/eslint-config": "~4.4.0",
58
+ "@rushstack/heft-jest-plugin": "~0.16.9",
59
+ "@fgv/ts-utils-jest": "5.0.0-10"
60
+ },
61
+ "scripts": {
62
+ "build": "heft build --clean",
63
+ "clean": "heft clean",
64
+ "test": "heft test --clean",
65
+ "lint": "eslint src --ext .ts,.tsx",
66
+ "fixlint": "eslint src --ext .ts,.tsx --fix",
67
+ "coverage": "jest --coverage"
68
+ }
69
+ }
@@ -0,0 +1,3 @@
1
+ Caching build output folders: lib, lib-commonjs, temp, .rush/temp/operation/build
2
+ Successfully set cache entry.
3
+ Cache key: 03c8b056281d9db0a97d8a6e25eea798a160d393
@@ -0,0 +1,9 @@
1
+ Invoking: heft build --clean
2
+ ---- build started ----
3
+ [build:set-browserslist-ignore-old-data-env-var] Setting environment variable BROWSERSLIST_IGNORE_OLD_DATA=1
4
+ [build:sass] Starting...
5
+ [build:sass] No SCSS files to process.
6
+ [build:typescript] Using TypeScript version 5.8.3
7
+ [build:webpack] No Webpack configuration found
8
+ ---- build finished (9.286s) ----
9
+ -------------------- Finished (9.291s) --------------------