@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 @@
1
+ {"version":3,"file":"tsResIntegration.js","sourceRoot":"","sources":["../../src/utils/tsResIntegration.ts"],"names":[],"mappings":"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","sourcesContent":["import { Result, succeed, fail, FileTree } from '@fgv/ts-utils';\nimport {\n QualifierTypes,\n Qualifiers,\n ResourceTypes,\n Resources,\n Import,\n Runtime,\n ResourceJson,\n Config\n} from '@fgv/ts-res';\nimport { ImportedDirectory, ImportedFile } from '../types';\n\n/**\n * Get the default system configuration from ts-res library\n */\nexport function getDefaultSystemConfiguration(): Config.Model.ISystemConfiguration {\n return Config.getPredefinedDeclaration('default').orDefault({\n // Fallback configuration if predefined default is not available\n name: 'Browser Default Configuration',\n description: 'Fallback default configuration for ts-res browser tool',\n qualifierTypes: [\n {\n name: 'language',\n systemType: 'language',\n configuration: {\n allowContextList: true\n }\n },\n {\n name: 'territory',\n systemType: 'territory',\n configuration: {\n allowContextList: false\n }\n }\n ],\n qualifiers: [\n {\n name: 'currentTerritory',\n token: 'geo',\n typeName: 'territory',\n defaultPriority: 850\n },\n {\n name: 'language',\n token: 'lang',\n typeName: 'language',\n defaultPriority: 800\n }\n ],\n resourceTypes: [\n {\n name: 'json',\n typeName: 'json'\n }\n ]\n });\n}\n\n/**\n * Create a simple context provider from qualifier values\n */\nexport function createSimpleContext(\n qualifiers: Qualifiers.IReadOnlyQualifierCollector,\n values: Record<string, string | undefined>\n): Result<Runtime.ValidatingSimpleContextQualifierProvider> {\n return Runtime.ValidatingSimpleContextQualifierProvider.create({\n qualifiers\n }).withErrorFormat((e) => `Failed to create context: ${e}`);\n}\n\n/**\n * Convert ImportedDirectory to FileTree format\n */\nexport function convertImportedDirectoryToFileTree(directory: ImportedDirectory): FileTree.FileTree {\n // Convert files to IInMemoryFile format and flatten the directory structure\n const flattenFiles = (\n dir: ImportedDirectory,\n parentPath: string = ''\n ): Array<{ path: string; contents: string }> => {\n const files: Array<{ path: string; contents: string }> = [];\n\n // Add files from current directory\n if (dir.files) {\n dir.files.forEach((file) => {\n const filePath = parentPath ? `${parentPath}/${file.name}` : file.name;\n files.push({\n path: filePath,\n contents: file.content\n });\n });\n }\n\n // Recursively process subdirectories\n if (dir.subdirectories) {\n dir.subdirectories.forEach((subdir) => {\n const subdirPath = parentPath ? `${parentPath}/${subdir.name}` : subdir.name;\n files.push(...flattenFiles(subdir, subdirPath));\n });\n }\n\n return files;\n };\n\n const inMemoryFiles = flattenFiles(directory);\n\n console.log('[convertImportedDirectoryToFileTree] Converting directory to FileTree:', {\n directoryName: directory.name,\n directoryPath: directory.path,\n numFiles: directory.files?.length || 0,\n numSubdirs: directory.subdirectories?.length || 0,\n totalFlattenedFiles: inMemoryFiles.length,\n sampleFiles: inMemoryFiles.slice(0, 3).map((f) => f.path)\n });\n\n // Use ts-res's inMemory FileTree utility\n return FileTree.inMemory(inMemoryFiles).orThrow((msg) => `Failed to create file tree: ${msg}`);\n}\n\n/**\n * Create ts-res system from configuration\n */\nexport function createTsResSystemFromConfig(systemConfig?: Config.Model.ISystemConfiguration): Result<{\n qualifierTypes: QualifierTypes.ReadOnlyQualifierTypeCollector;\n qualifiers: Qualifiers.IReadOnlyQualifierCollector;\n resourceTypes: ResourceTypes.ReadOnlyResourceTypeCollector;\n resourceManager: Resources.ResourceManagerBuilder;\n importManager: Import.ImportManager;\n contextQualifierProvider: Runtime.ValidatingSimpleContextQualifierProvider;\n}> {\n const configToUse = systemConfig ?? getDefaultSystemConfiguration();\n\n return Config.SystemConfiguration.create(configToUse)\n .onSuccess((systemConfiguration) => {\n return Resources.ResourceManagerBuilder.create({\n qualifiers: systemConfiguration.qualifiers,\n resourceTypes: systemConfiguration.resourceTypes\n })\n .withErrorFormat((e) => `Failed to create resource manager: ${e}`)\n .onSuccess((resourceManager) => {\n return Import.ImportManager.create({\n resources: resourceManager\n })\n .withErrorFormat((e) => `Failed to create import manager: ${e}`)\n .onSuccess((importManager) => {\n return Runtime.ValidatingSimpleContextQualifierProvider.create({\n qualifiers: systemConfiguration.qualifiers\n })\n .withErrorFormat((e) => `Failed to create context qualifier provider: ${e}`)\n .onSuccess((contextQualifierProvider) => {\n return succeed({\n qualifierTypes: systemConfiguration.qualifierTypes,\n qualifiers: systemConfiguration.qualifiers,\n resourceTypes: systemConfiguration.resourceTypes,\n resourceManager,\n importManager,\n contextQualifierProvider\n });\n });\n });\n });\n })\n .withErrorFormat((e) => `Failed to create ts-res system: ${e}`);\n}\n\n/**\n * Process imported files using the ts-res system\n */\nexport function processImportedFiles(\n files: ImportedFile[],\n systemConfig?: Config.Model.ISystemConfiguration\n): Result<{\n system: {\n qualifierTypes: QualifierTypes.ReadOnlyQualifierTypeCollector;\n qualifiers: Qualifiers.IReadOnlyQualifierCollector;\n resourceTypes: ResourceTypes.ReadOnlyResourceTypeCollector;\n resourceManager: Resources.ResourceManagerBuilder;\n importManager: Import.ImportManager;\n contextQualifierProvider: Runtime.ValidatingSimpleContextQualifierProvider;\n };\n compiledCollection: ResourceJson.Compiled.ICompiledResourceCollection;\n resolver: Runtime.ResourceResolver;\n resourceCount: number;\n summary: {\n totalResources: number;\n resourceIds: string[];\n errorCount: number;\n warnings: string[];\n };\n}> {\n if (files.length === 0) {\n return fail('No files provided for processing');\n }\n\n return createTsResSystemFromConfig(systemConfig)\n .onSuccess<{\n system: {\n qualifierTypes: QualifierTypes.ReadOnlyQualifierTypeCollector;\n qualifiers: Qualifiers.IReadOnlyQualifierCollector;\n resourceTypes: ResourceTypes.ReadOnlyResourceTypeCollector;\n resourceManager: Resources.ResourceManagerBuilder;\n importManager: Import.ImportManager;\n contextQualifierProvider: Runtime.ValidatingSimpleContextQualifierProvider;\n };\n compiledCollection: ResourceJson.Compiled.ICompiledResourceCollection;\n resolver: Runtime.ResourceResolver;\n resourceCount: number;\n summary: {\n totalResources: number;\n resourceIds: string[];\n errorCount: number;\n warnings: string[];\n };\n }>((tsResSystem) => {\n // Convert ImportedFile[] to IInMemoryFile[] format\n const inMemoryFiles = files.map((file) => ({\n path: file.path || file.name,\n contents: file.content\n }));\n\n return FileTree.inMemory(inMemoryFiles)\n .onSuccess((fileTree) => {\n return Import.ImportManager.create({\n fileTree,\n resources: tsResSystem.resourceManager\n });\n })\n .onSuccess((importManager) => {\n // Import each file using its filesystem path\n for (const file of files) {\n const importResult = importManager.importFromFileSystem(file.path || file.name);\n if (importResult.isFailure()) {\n return fail(`Failed to import file ${file.path || file.name}: ${importResult.message}`);\n }\n }\n\n // Finalize processing\n const updatedSystem = {\n ...tsResSystem,\n importManager\n };\n return finalizeProcessing(updatedSystem);\n });\n })\n .withErrorFormat((message) => `processImportedFiles failed: ${message}`);\n}\n\n/**\n * Process imported directory using the ts-res system\n */\nexport function processImportedDirectory(\n directory: ImportedDirectory,\n systemConfig?: Config.Model.ISystemConfiguration\n): Result<{\n system: {\n qualifierTypes: QualifierTypes.ReadOnlyQualifierTypeCollector;\n qualifiers: Qualifiers.IReadOnlyQualifierCollector;\n resourceTypes: ResourceTypes.ReadOnlyResourceTypeCollector;\n resourceManager: Resources.ResourceManagerBuilder;\n importManager: Import.ImportManager;\n contextQualifierProvider: Runtime.ValidatingSimpleContextQualifierProvider;\n };\n compiledCollection: ResourceJson.Compiled.ICompiledResourceCollection;\n resolver: Runtime.ResourceResolver;\n resourceCount: number;\n summary: {\n totalResources: number;\n resourceIds: string[];\n errorCount: number;\n warnings: string[];\n };\n}> {\n return createTsResSystemFromConfig(systemConfig)\n .onSuccess<{\n system: {\n qualifierTypes: QualifierTypes.ReadOnlyQualifierTypeCollector;\n qualifiers: Qualifiers.IReadOnlyQualifierCollector;\n resourceTypes: ResourceTypes.ReadOnlyResourceTypeCollector;\n resourceManager: Resources.ResourceManagerBuilder;\n importManager: Import.ImportManager;\n contextQualifierProvider: Runtime.ValidatingSimpleContextQualifierProvider;\n };\n compiledCollection: ResourceJson.Compiled.ICompiledResourceCollection;\n resolver: Runtime.ResourceResolver;\n resourceCount: number;\n summary: {\n totalResources: number;\n resourceIds: string[];\n errorCount: number;\n warnings: string[];\n };\n }>((tsResSystem) => {\n // Convert directory to file tree\n const fileTree = convertImportedDirectoryToFileTree(directory);\n\n return Import.ImportManager.create({\n fileTree,\n resources: tsResSystem.resourceManager\n }).onSuccess((importManager) => {\n // Simply try to import from the filesystem root\n // The ImportManager will handle finding and importing all resources\n console.log('[tsResIntegration] Starting resource import from FileTree');\n\n const importResult = importManager.importFromFileSystem('/');\n if (importResult.isFailure()) {\n console.warn(`[tsResIntegration] Failed to import from root, trying individual files`);\n\n // If root import fails, try to import files individually\n // We'll recursively traverse the tree using the FileTree API\n let importedCount = 0;\n const failedImports: Array<{ file: string; error: string }> = [];\n\n const importDirectory = (dirPath: string): void => {\n const dirResult = fileTree.getDirectory(dirPath);\n if (dirResult.isSuccess()) {\n const dir = dirResult.value;\n const childrenResult = dir.getChildren();\n if (childrenResult.isSuccess()) {\n for (const child of childrenResult.value) {\n if (child.type === 'file' && child.name.endsWith('.json')) {\n console.log(`[tsResIntegration] Importing file: ${child.absolutePath}`);\n const fileImportResult = importManager.importFromFileSystem(child.absolutePath);\n if (fileImportResult.isSuccess()) {\n importedCount++;\n console.log(`[tsResIntegration] Successfully imported ${child.absolutePath}`);\n } else {\n console.warn(\n `[tsResIntegration] Failed to import ${child.absolutePath}: ${fileImportResult.message}`\n );\n failedImports.push({ file: child.absolutePath, error: fileImportResult.message });\n }\n } else if (child.type === 'directory') {\n importDirectory(child.absolutePath);\n }\n }\n }\n }\n };\n\n // Start from root\n importDirectory('/');\n\n // Also try without leading slash\n if (importedCount === 0) {\n importDirectory('');\n }\n\n console.log(`[tsResIntegration] Import complete. Imported ${importedCount} files`);\n\n if (importedCount === 0 && failedImports.length > 0) {\n // Create a summary of unique errors\n const errorSummary = new Map<string, string[]>();\n failedImports.forEach(({ file, error }) => {\n // Extract the main error (e.g., \"invalid item: role: not found\")\n const mainError = error.split('\\n')[0];\n if (!errorSummary.has(mainError)) {\n errorSummary.set(mainError, []);\n }\n errorSummary.get(mainError)!.push(file);\n });\n\n let errorMessage = `Failed to import resources. Missing qualifiers in configuration:\\n`;\n errorSummary.forEach((files, error) => {\n errorMessage += `- ${error} (${files.length} file${files.length > 1 ? 's' : ''})\\n`;\n });\n\n return fail(errorMessage);\n } else if (importedCount === 0) {\n return fail(`No resource files found in ${directory.name}`);\n }\n } else {\n console.log('[tsResIntegration] Successfully imported resources from root');\n }\n\n // Finalize processing\n const updatedSystem = {\n ...tsResSystem,\n importManager\n };\n return finalizeProcessing(updatedSystem);\n });\n })\n .withErrorFormat((message) => `processImportedDirectory failed: ${message}`);\n}\n\n/**\n * Finalizes processing and creates compiled resources\n */\nfunction finalizeProcessing(system: {\n qualifierTypes: QualifierTypes.ReadOnlyQualifierTypeCollector;\n qualifiers: Qualifiers.IReadOnlyQualifierCollector;\n resourceTypes: ResourceTypes.ReadOnlyResourceTypeCollector;\n resourceManager: Resources.ResourceManagerBuilder;\n importManager: Import.ImportManager;\n contextQualifierProvider: Runtime.ValidatingSimpleContextQualifierProvider;\n}): Result<{\n system: typeof system;\n compiledCollection: ResourceJson.Compiled.ICompiledResourceCollection;\n resolver: Runtime.ResourceResolver;\n resourceCount: number;\n summary: {\n totalResources: number;\n resourceIds: string[];\n errorCount: number;\n warnings: string[];\n };\n}> {\n return system.resourceManager\n .getCompiledResourceCollection({ includeMetadata: true })\n .onSuccess((compiledCollection: ResourceJson.Compiled.ICompiledResourceCollection) => {\n // Create resolver directly without CompiledResourceCollection manager\n return Runtime.ResourceResolver.create({\n resourceManager: system.resourceManager,\n qualifierTypes: system.qualifierTypes,\n contextQualifierProvider: system.contextQualifierProvider\n }).onSuccess((resolver) => {\n // Create summary\n const resourceIds = Array.from(system.resourceManager.resources.keys());\n const summary = {\n totalResources: resourceIds.length,\n resourceIds,\n errorCount: 0,\n warnings: [] as string[]\n };\n\n return succeed({\n system,\n compiledCollection,\n resolver,\n resourceCount: resourceIds.length,\n summary\n });\n });\n })\n .withErrorFormat((message) => `Failed to finalize processing: ${message}`);\n}\n\n// Note: createCompiledResourceCollectionManager was removed as part of the refactoring\n// We now always use ResourceManagerBuilder as the primary data structure\n"]}
@@ -0,0 +1,48 @@
1
+ import { Result } from '@fgv/ts-utils';
2
+ import { IZipLoader, ZipLoadOptions, ZipLoadResult, ZipProgressCallback } from './types';
3
+ /**
4
+ * Browser-based ZIP loader implementation
5
+ */
6
+ export declare class BrowserZipLoader implements IZipLoader {
7
+ /**
8
+ * Load ZIP from File object
9
+ */
10
+ loadFromFile(file: File, options?: ZipLoadOptions, onProgress?: ZipProgressCallback): Promise<Result<ZipLoadResult>>;
11
+ /**
12
+ * Load ZIP from ArrayBuffer
13
+ */
14
+ loadFromBuffer(buffer: ArrayBuffer, options?: ZipLoadOptions, onProgress?: ZipProgressCallback): Promise<Result<ZipLoadResult>>;
15
+ /**
16
+ * Load ZIP from URL
17
+ */
18
+ loadFromUrl(url: string, options?: ZipLoadOptions, onProgress?: ZipProgressCallback): Promise<Result<ZipLoadResult>>;
19
+ /**
20
+ * Build file tree from JSZip instance
21
+ */
22
+ private buildFileTree;
23
+ /**
24
+ * Load manifest from ZIP
25
+ */
26
+ private loadManifest;
27
+ /**
28
+ * Load configuration from ZIP
29
+ */
30
+ private loadConfiguration;
31
+ /**
32
+ * Find common root directory from file paths
33
+ */
34
+ private findCommonRoot;
35
+ }
36
+ /**
37
+ * Create a new browser ZIP loader instance
38
+ */
39
+ export declare function createBrowserZipLoader(): IZipLoader;
40
+ /**
41
+ * Convenience function to load ZIP from File with default options
42
+ */
43
+ export declare function loadZipFile(file: File, options?: ZipLoadOptions, onProgress?: ZipProgressCallback): Promise<Result<ZipLoadResult>>;
44
+ /**
45
+ * Convenience function to load ZIP from URL with default options
46
+ */
47
+ export declare function loadZipFromUrl(url: string, options?: ZipLoadOptions, onProgress?: ZipProgressCallback): Promise<Result<ZipLoadResult>>;
48
+ //# sourceMappingURL=browserZipLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browserZipLoader.d.ts","sourceRoot":"","sources":["../../../src/utils/zipLoader/browserZipLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,UAAU,EACV,cAAc,EACd,aAAa,EACb,mBAAmB,EAIpB,MAAM,SAAS,CAAC;AA8BjB;;GAEG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IACjD;;OAEG;IACG,YAAY,CAChB,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,cAAmB,EAC5B,UAAU,CAAC,EAAE,mBAAmB,GAC/B,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAejC;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,cAAmB,EAC5B,UAAU,CAAC,EAAE,mBAAmB,GAC/B,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAmEjC;;OAEG;IACG,WAAW,CACf,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,cAAmB,EAC5B,UAAU,CAAC,EAAE,mBAAmB,GAC/B,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAuBjC;;OAEG;YACW,aAAa;IAkD3B;;OAEG;YACW,YAAY;IAiB1B;;OAEG;YACW,iBAAiB;IAqB/B;;OAEG;IACH,OAAO,CAAC,cAAc;CAkBvB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,UAAU,CAEnD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,cAAc,EACxB,UAAU,CAAC,EAAE,mBAAmB,GAC/B,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAGhC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,cAAc,EACxB,UAAU,CAAC,EAAE,mBAAmB,GAC/B,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAGhC"}
@@ -0,0 +1,247 @@
1
+ import { succeed, fail } from '@fgv/ts-utils';
2
+ import { parseManifest, parseConfiguration, zipTreeToFiles, zipTreeToDirectory, isZipFile } from './zipUtils';
3
+ import { processImportedFiles, processImportedDirectory } from '../tsResIntegration';
4
+ // Dynamic import for JSZip to support both Node.js and browser environments
5
+ let JSZip = null;
6
+ /**
7
+ * Get JSZip instance (assumes JSZip is available)
8
+ */
9
+ function getJSZip() {
10
+ if (JSZip)
11
+ return JSZip;
12
+ // Check if JSZip is globally available
13
+ if (typeof window !== 'undefined' && window.JSZip) {
14
+ JSZip = window.JSZip;
15
+ return JSZip;
16
+ }
17
+ // Try to get JSZip from require/import (will work in bundled environments)
18
+ try {
19
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
20
+ JSZip = require('jszip');
21
+ return JSZip;
22
+ }
23
+ catch (error) {
24
+ throw new Error('JSZip is not available. Please install jszip as a dependency: npm install jszip');
25
+ }
26
+ }
27
+ /**
28
+ * Browser-based ZIP loader implementation
29
+ */
30
+ export class BrowserZipLoader {
31
+ /**
32
+ * Load ZIP from File object
33
+ */
34
+ async loadFromFile(file, options = {}, onProgress) {
35
+ onProgress?.('reading-file', 0, `Reading file: ${file.name}`);
36
+ if (!isZipFile(file.name)) {
37
+ return fail(`File ${file.name} is not a ZIP file`);
38
+ }
39
+ const buffer = await file.arrayBuffer().catch((error) => {
40
+ throw new Error(`Failed to read file: ${error instanceof Error ? error.message : String(error)}`);
41
+ });
42
+ onProgress?.('reading-file', 100, 'File read complete');
43
+ return this.loadFromBuffer(buffer, options, onProgress);
44
+ }
45
+ /**
46
+ * Load ZIP from ArrayBuffer
47
+ */
48
+ async loadFromBuffer(buffer, options = {}, onProgress) {
49
+ onProgress?.('parsing-zip', 0, 'Parsing ZIP archive');
50
+ const JSZipClass = getJSZip();
51
+ const zip = new JSZipClass();
52
+ const loadedZip = await zip.loadAsync(buffer).catch((error) => {
53
+ throw new Error(`Failed to parse ZIP: ${error instanceof Error ? error.message : String(error)}`);
54
+ });
55
+ onProgress?.('parsing-zip', 100, 'ZIP archive parsed');
56
+ // Build file tree
57
+ const fileTree = await this.buildFileTree(loadedZip, onProgress);
58
+ // Load manifest
59
+ onProgress?.('loading-manifest', 0, 'Loading manifest');
60
+ const manifest = await this.loadManifest(loadedZip);
61
+ onProgress?.('loading-manifest', 100, 'Manifest loaded');
62
+ // Load configuration
63
+ onProgress?.('loading-config', 0, 'Loading configuration');
64
+ const config = await this.loadConfiguration(loadedZip, options);
65
+ onProgress?.('loading-config', 100, 'Configuration loaded');
66
+ // Extract files and directory structure
67
+ onProgress?.('extracting-files', 0, 'Extracting files');
68
+ const files = zipTreeToFiles(fileTree);
69
+ const directory = zipTreeToDirectory(fileTree);
70
+ onProgress?.('extracting-files', 100, `Extracted ${files.length} files`);
71
+ // Process resources if requested
72
+ let processedResources = null;
73
+ if (options.autoProcessResources) {
74
+ onProgress?.('processing-resources', 0, 'Processing resources');
75
+ const configToUse = options.overrideConfig || config;
76
+ if (directory) {
77
+ const processResult = await processImportedDirectory(directory, configToUse || undefined);
78
+ if (processResult.isSuccess()) {
79
+ processedResources = processResult.value;
80
+ }
81
+ else {
82
+ throw new Error(`Failed to process resources from directory: ${processResult.message}`);
83
+ }
84
+ }
85
+ else if (files.length > 0) {
86
+ const processResult = await processImportedFiles(files, configToUse || undefined);
87
+ if (processResult.isSuccess()) {
88
+ processedResources = processResult.value;
89
+ }
90
+ else {
91
+ throw new Error(`Failed to process resources from files: ${processResult.message}`);
92
+ }
93
+ }
94
+ onProgress?.('processing-resources', 100, 'Resources processed');
95
+ }
96
+ onProgress?.('complete', 100, 'ZIP loading complete');
97
+ return succeed({
98
+ manifest,
99
+ config: options.overrideConfig || config,
100
+ files,
101
+ directory,
102
+ processedResources
103
+ });
104
+ }
105
+ /**
106
+ * Load ZIP from URL
107
+ */
108
+ async loadFromUrl(url, options = {}, onProgress) {
109
+ onProgress?.('reading-file', 0, `Fetching from URL: ${url}`);
110
+ const response = await fetch(url).catch((error) => {
111
+ throw new Error(`Failed to fetch ZIP from URL: ${error instanceof Error ? error.message : String(error)}`);
112
+ });
113
+ if (!response.ok) {
114
+ return fail(`Failed to fetch ZIP from URL: ${response.status} ${response.statusText}`);
115
+ }
116
+ const buffer = await response.arrayBuffer().catch((error) => {
117
+ throw new Error(`Failed to read response buffer: ${error instanceof Error ? error.message : String(error)}`);
118
+ });
119
+ onProgress?.('reading-file', 100, 'URL fetch complete');
120
+ return this.loadFromBuffer(buffer, options, onProgress);
121
+ }
122
+ /**
123
+ * Build file tree from JSZip instance
124
+ */
125
+ async buildFileTree(zip, onProgress) {
126
+ const files = new Map();
127
+ const directories = new Set();
128
+ const zipFiles = Object.keys(zip.files);
129
+ let processed = 0;
130
+ // Pre-load all file contents for performance
131
+ for (const filename of zipFiles) {
132
+ const zipEntry = zip.files[filename];
133
+ if (zipEntry.dir) {
134
+ directories.add(filename);
135
+ files.set(filename, {
136
+ name: filename
137
+ .split('/')
138
+ .filter((p) => p)
139
+ .pop() || filename,
140
+ path: filename,
141
+ size: 0,
142
+ isDirectory: true,
143
+ lastModified: zipEntry.date
144
+ });
145
+ }
146
+ else {
147
+ // Load file content
148
+ const content = await zipEntry.async('string');
149
+ files.set(filename, {
150
+ name: filename.split('/').pop() || filename,
151
+ path: filename,
152
+ size: content.length,
153
+ isDirectory: false,
154
+ lastModified: zipEntry.date,
155
+ content
156
+ });
157
+ }
158
+ processed++;
159
+ const progress = Math.round((processed / zipFiles.length) * 100);
160
+ onProgress?.('extracting-files', progress, `Processing ${filename}`);
161
+ }
162
+ return {
163
+ files,
164
+ directories,
165
+ root: this.findCommonRoot(Array.from(files.keys()))
166
+ };
167
+ }
168
+ /**
169
+ * Load manifest from ZIP
170
+ */
171
+ async loadManifest(zip) {
172
+ const manifestFile = zip.files['manifest.json'];
173
+ if (!manifestFile) {
174
+ return null;
175
+ }
176
+ const manifestData = await manifestFile.async('string').catch((error) => {
177
+ console.warn('Failed to read manifest file:', error);
178
+ return null;
179
+ });
180
+ if (!manifestData)
181
+ return null;
182
+ const parseResult = parseManifest(manifestData);
183
+ return parseResult.orDefault() ?? null;
184
+ }
185
+ /**
186
+ * Load configuration from ZIP
187
+ */
188
+ async loadConfiguration(zip, options) {
189
+ if (options.overrideConfig) {
190
+ return options.overrideConfig;
191
+ }
192
+ const configFile = zip.files['config.json'];
193
+ if (!configFile) {
194
+ return null;
195
+ }
196
+ const configData = await configFile.async('string').catch((error) => {
197
+ console.warn('Failed to read config file:', error);
198
+ return null;
199
+ });
200
+ if (!configData)
201
+ return null;
202
+ const parseResult = parseConfiguration(configData);
203
+ return parseResult.orDefault() ?? null;
204
+ }
205
+ /**
206
+ * Find common root directory from file paths
207
+ */
208
+ findCommonRoot(paths) {
209
+ if (paths.length === 0)
210
+ return '';
211
+ if (paths.length === 1)
212
+ return paths[0].split('/')[0] || '';
213
+ const parts = paths[0].split('/');
214
+ let commonLength = 0;
215
+ for (let i = 0; i < parts.length; i++) {
216
+ const part = parts[i];
217
+ if (paths.every((path) => path.split('/')[i] === part)) {
218
+ commonLength = i + 1;
219
+ }
220
+ else {
221
+ break;
222
+ }
223
+ }
224
+ return parts.slice(0, commonLength).join('/');
225
+ }
226
+ }
227
+ /**
228
+ * Create a new browser ZIP loader instance
229
+ */
230
+ export function createBrowserZipLoader() {
231
+ return new BrowserZipLoader();
232
+ }
233
+ /**
234
+ * Convenience function to load ZIP from File with default options
235
+ */
236
+ export async function loadZipFile(file, options, onProgress) {
237
+ const loader = createBrowserZipLoader();
238
+ return loader.loadFromFile(file, options, onProgress);
239
+ }
240
+ /**
241
+ * Convenience function to load ZIP from URL with default options
242
+ */
243
+ export async function loadZipFromUrl(url, options, onProgress) {
244
+ const loader = createBrowserZipLoader();
245
+ return loader.loadFromUrl(url, options, onProgress);
246
+ }
247
+ //# sourceMappingURL=browserZipLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browserZipLoader.js","sourceRoot":"","sources":["../../../src/utils/zipLoader/browserZipLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAUtD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9G,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAGrF,4EAA4E;AAC5E,IAAI,KAAK,GAAQ,IAAI,CAAC;AAEtB;;GAEG;AACH,SAAS,QAAQ;IACf,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,uCAAuC;IACvC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAK,MAAc,CAAC,KAAK,EAAE,CAAC;QAC3D,KAAK,GAAI,MAAc,CAAC,KAAK,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2EAA2E;IAC3E,IAAI,CAAC;QACH,8DAA8D;QAC9D,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;IACrG,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAC3B;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,IAAU,EACV,UAA0B,EAAE,EAC5B,UAAgC;QAEhC,UAAU,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,iBAAiB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,oBAAoB,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACtD,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC,CAAC,CAAC;QACH,UAAU,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;QAExD,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,MAAmB,EACnB,UAA0B,EAAE,EAC5B,UAAgC;QAEhC,UAAU,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAEtD,MAAM,UAAU,GAAG,QAAQ,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAU,EAAE,EAAE;YACjE,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC,CAAC,CAAC;QAEH,UAAU,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;QAEvD,kBAAkB;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAEjE,gBAAgB;QAChB,UAAU,EAAE,CAAC,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACpD,UAAU,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC;QAEzD,qBAAqB;QACrB,UAAU,EAAE,CAAC,gBAAgB,EAAE,CAAC,EAAE,uBAAuB,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChE,UAAU,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE,sBAAsB,CAAC,CAAC;QAE5D,wCAAwC;QACxC,UAAU,EAAE,CAAC,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/C,UAAU,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE,aAAa,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAEzE,iCAAiC;QACjC,IAAI,kBAAkB,GAA8B,IAAI,CAAC;QACzD,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;YACjC,UAAU,EAAE,CAAC,sBAAsB,EAAE,CAAC,EAAE,sBAAsB,CAAC,CAAC;YAEhE,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,IAAI,MAAM,CAAC;YAErD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAAC,SAAS,EAAE,WAAW,IAAI,SAAS,CAAC,CAAC;gBAC1F,IAAI,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC;oBAC9B,kBAAkB,GAAG,aAAa,CAAC,KAAK,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,+CAA+C,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1F,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,KAAK,EAAE,WAAW,IAAI,SAAS,CAAC,CAAC;gBAClF,IAAI,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC;oBAC9B,kBAAkB,GAAG,aAAa,CAAC,KAAK,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,2CAA2C,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;gBACtF,CAAC;YACH,CAAC;YAED,UAAU,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAC;QACnE,CAAC;QAED,UAAU,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,sBAAsB,CAAC,CAAC;QAEtD,OAAO,OAAO,CAAC;YACb,QAAQ;YACR,MAAM,EAAE,OAAO,CAAC,cAAc,IAAI,MAAM;YACxC,KAAK;YACL,SAAS;YACT,kBAAkB;SACnB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,GAAW,EACX,UAA0B,EAAE,EAC5B,UAAgC;QAEhC,UAAU,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,sBAAsB,GAAG,EAAE,CAAC,CAAC;QAE7D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAChD,MAAM,IAAI,KAAK,CACb,iCAAiC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC1F,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,iCAAiC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1D,MAAM,IAAI,KAAK,CACb,mCAAmC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5F,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,UAAU,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;QAExD,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,GAAQ,EAAE,UAAgC;QACpE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC7C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QAEtC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,6CAA6C;QAC7C,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAErC,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC;gBACjB,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC1B,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;oBAClB,IAAI,EACF,QAAQ;yBACL,KAAK,CAAC,GAAG,CAAC;yBACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;yBAChB,GAAG,EAAE,IAAI,QAAQ;oBACtB,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC;oBACP,WAAW,EAAE,IAAI;oBACjB,YAAY,EAAE,QAAQ,CAAC,IAAI;iBAC5B,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,oBAAoB;gBACpB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAE/C,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;oBAClB,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ;oBAC3C,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,OAAO,CAAC,MAAM;oBACpB,WAAW,EAAE,KAAK;oBAClB,YAAY,EAAE,QAAQ,CAAC,IAAI;oBAC3B,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;YAED,SAAS,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;YACjE,UAAU,EAAE,CAAC,kBAAkB,EAAE,QAAQ,EAAE,cAAc,QAAQ,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,OAAO;YACL,KAAK;YACL,WAAW;YACX,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;SACpD,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,GAAQ;QACjC,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAChD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAAU,EAAE,EAAE;YAC3E,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAE/B,MAAM,WAAW,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAChD,OAAO,WAAW,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAAC,GAAQ,EAAE,OAAuB;QAC/D,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC,cAAc,CAAC;QAChC,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAAU,EAAE,EAAE;YACvE,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAE7B,MAAM,WAAW,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,WAAW,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAAe;QACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE5D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;gBACvD,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,gBAAgB,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAU,EACV,OAAwB,EACxB,UAAgC;IAEhC,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;IACxC,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,OAAwB,EACxB,UAAgC;IAEhC,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;IACxC,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AACtD,CAAC","sourcesContent":["import { Result, succeed, fail } from '@fgv/ts-utils';\nimport {\n IZipLoader,\n ZipLoadOptions,\n ZipLoadResult,\n ZipProgressCallback,\n ZipFileTree,\n ZipFileItem,\n ZipLoadingStage\n} from './types';\nimport { parseManifest, parseConfiguration, zipTreeToFiles, zipTreeToDirectory, isZipFile } from './zipUtils';\nimport { processImportedFiles, processImportedDirectory } from '../tsResIntegration';\nimport { ProcessedResources } from '../../types';\n\n// Dynamic import for JSZip to support both Node.js and browser environments\nlet JSZip: any = null;\n\n/**\n * Get JSZip instance (assumes JSZip is available)\n */\nfunction getJSZip(): any {\n if (JSZip) return JSZip;\n\n // Check if JSZip is globally available\n if (typeof window !== 'undefined' && (window as any).JSZip) {\n JSZip = (window as any).JSZip;\n return JSZip;\n }\n\n // Try to get JSZip from require/import (will work in bundled environments)\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n JSZip = require('jszip');\n return JSZip;\n } catch (error) {\n throw new Error('JSZip is not available. Please install jszip as a dependency: npm install jszip');\n }\n}\n\n/**\n * Browser-based ZIP loader implementation\n */\nexport class BrowserZipLoader implements IZipLoader {\n /**\n * Load ZIP from File object\n */\n async loadFromFile(\n file: File,\n options: ZipLoadOptions = {},\n onProgress?: ZipProgressCallback\n ): Promise<Result<ZipLoadResult>> {\n onProgress?.('reading-file', 0, `Reading file: ${file.name}`);\n\n if (!isZipFile(file.name)) {\n return fail(`File ${file.name} is not a ZIP file`);\n }\n\n const buffer = await file.arrayBuffer().catch((error) => {\n throw new Error(`Failed to read file: ${error instanceof Error ? error.message : String(error)}`);\n });\n onProgress?.('reading-file', 100, 'File read complete');\n\n return this.loadFromBuffer(buffer, options, onProgress);\n }\n\n /**\n * Load ZIP from ArrayBuffer\n */\n async loadFromBuffer(\n buffer: ArrayBuffer,\n options: ZipLoadOptions = {},\n onProgress?: ZipProgressCallback\n ): Promise<Result<ZipLoadResult>> {\n onProgress?.('parsing-zip', 0, 'Parsing ZIP archive');\n\n const JSZipClass = getJSZip();\n const zip = new JSZipClass();\n const loadedZip = await zip.loadAsync(buffer).catch((error: any) => {\n throw new Error(`Failed to parse ZIP: ${error instanceof Error ? error.message : String(error)}`);\n });\n\n onProgress?.('parsing-zip', 100, 'ZIP archive parsed');\n\n // Build file tree\n const fileTree = await this.buildFileTree(loadedZip, onProgress);\n\n // Load manifest\n onProgress?.('loading-manifest', 0, 'Loading manifest');\n const manifest = await this.loadManifest(loadedZip);\n onProgress?.('loading-manifest', 100, 'Manifest loaded');\n\n // Load configuration\n onProgress?.('loading-config', 0, 'Loading configuration');\n const config = await this.loadConfiguration(loadedZip, options);\n onProgress?.('loading-config', 100, 'Configuration loaded');\n\n // Extract files and directory structure\n onProgress?.('extracting-files', 0, 'Extracting files');\n const files = zipTreeToFiles(fileTree);\n const directory = zipTreeToDirectory(fileTree);\n onProgress?.('extracting-files', 100, `Extracted ${files.length} files`);\n\n // Process resources if requested\n let processedResources: ProcessedResources | null = null;\n if (options.autoProcessResources) {\n onProgress?.('processing-resources', 0, 'Processing resources');\n\n const configToUse = options.overrideConfig || config;\n\n if (directory) {\n const processResult = await processImportedDirectory(directory, configToUse || undefined);\n if (processResult.isSuccess()) {\n processedResources = processResult.value;\n } else {\n throw new Error(`Failed to process resources from directory: ${processResult.message}`);\n }\n } else if (files.length > 0) {\n const processResult = await processImportedFiles(files, configToUse || undefined);\n if (processResult.isSuccess()) {\n processedResources = processResult.value;\n } else {\n throw new Error(`Failed to process resources from files: ${processResult.message}`);\n }\n }\n\n onProgress?.('processing-resources', 100, 'Resources processed');\n }\n\n onProgress?.('complete', 100, 'ZIP loading complete');\n\n return succeed({\n manifest,\n config: options.overrideConfig || config,\n files,\n directory,\n processedResources\n });\n }\n\n /**\n * Load ZIP from URL\n */\n async loadFromUrl(\n url: string,\n options: ZipLoadOptions = {},\n onProgress?: ZipProgressCallback\n ): Promise<Result<ZipLoadResult>> {\n onProgress?.('reading-file', 0, `Fetching from URL: ${url}`);\n\n const response = await fetch(url).catch((error) => {\n throw new Error(\n `Failed to fetch ZIP from URL: ${error instanceof Error ? error.message : String(error)}`\n );\n });\n\n if (!response.ok) {\n return fail(`Failed to fetch ZIP from URL: ${response.status} ${response.statusText}`);\n }\n\n const buffer = await response.arrayBuffer().catch((error) => {\n throw new Error(\n `Failed to read response buffer: ${error instanceof Error ? error.message : String(error)}`\n );\n });\n onProgress?.('reading-file', 100, 'URL fetch complete');\n\n return this.loadFromBuffer(buffer, options, onProgress);\n }\n\n /**\n * Build file tree from JSZip instance\n */\n private async buildFileTree(zip: any, onProgress?: ZipProgressCallback): Promise<ZipFileTree> {\n const files = new Map<string, ZipFileItem>();\n const directories = new Set<string>();\n\n const zipFiles = Object.keys(zip.files);\n let processed = 0;\n\n // Pre-load all file contents for performance\n for (const filename of zipFiles) {\n const zipEntry = zip.files[filename];\n\n if (zipEntry.dir) {\n directories.add(filename);\n files.set(filename, {\n name:\n filename\n .split('/')\n .filter((p) => p)\n .pop() || filename,\n path: filename,\n size: 0,\n isDirectory: true,\n lastModified: zipEntry.date\n });\n } else {\n // Load file content\n const content = await zipEntry.async('string');\n\n files.set(filename, {\n name: filename.split('/').pop() || filename,\n path: filename,\n size: content.length,\n isDirectory: false,\n lastModified: zipEntry.date,\n content\n });\n }\n\n processed++;\n const progress = Math.round((processed / zipFiles.length) * 100);\n onProgress?.('extracting-files', progress, `Processing ${filename}`);\n }\n\n return {\n files,\n directories,\n root: this.findCommonRoot(Array.from(files.keys()))\n };\n }\n\n /**\n * Load manifest from ZIP\n */\n private async loadManifest(zip: any): Promise<any> {\n const manifestFile = zip.files['manifest.json'];\n if (!manifestFile) {\n return null;\n }\n\n const manifestData = await manifestFile.async('string').catch((error: any) => {\n console.warn('Failed to read manifest file:', error);\n return null;\n });\n\n if (!manifestData) return null;\n\n const parseResult = parseManifest(manifestData);\n return parseResult.orDefault() ?? null;\n }\n\n /**\n * Load configuration from ZIP\n */\n private async loadConfiguration(zip: any, options: ZipLoadOptions): Promise<any> {\n if (options.overrideConfig) {\n return options.overrideConfig;\n }\n\n const configFile = zip.files['config.json'];\n if (!configFile) {\n return null;\n }\n\n const configData = await configFile.async('string').catch((error: any) => {\n console.warn('Failed to read config file:', error);\n return null;\n });\n\n if (!configData) return null;\n\n const parseResult = parseConfiguration(configData);\n return parseResult.orDefault() ?? null;\n }\n\n /**\n * Find common root directory from file paths\n */\n private findCommonRoot(paths: string[]): string {\n if (paths.length === 0) return '';\n if (paths.length === 1) return paths[0].split('/')[0] || '';\n\n const parts = paths[0].split('/');\n let commonLength = 0;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (paths.every((path) => path.split('/')[i] === part)) {\n commonLength = i + 1;\n } else {\n break;\n }\n }\n\n return parts.slice(0, commonLength).join('/');\n }\n}\n\n/**\n * Create a new browser ZIP loader instance\n */\nexport function createBrowserZipLoader(): IZipLoader {\n return new BrowserZipLoader();\n}\n\n/**\n * Convenience function to load ZIP from File with default options\n */\nexport async function loadZipFile(\n file: File,\n options?: ZipLoadOptions,\n onProgress?: ZipProgressCallback\n): Promise<Result<ZipLoadResult>> {\n const loader = createBrowserZipLoader();\n return loader.loadFromFile(file, options, onProgress);\n}\n\n/**\n * Convenience function to load ZIP from URL with default options\n */\nexport async function loadZipFromUrl(\n url: string,\n options?: ZipLoadOptions,\n onProgress?: ZipProgressCallback\n): Promise<Result<ZipLoadResult>> {\n const loader = createBrowserZipLoader();\n return loader.loadFromUrl(url, options, onProgress);\n}\n"]}
@@ -0,0 +1,8 @@
1
+ export * from './types';
2
+ export * from './zipUtils';
3
+ export * from './browserZipLoader';
4
+ export * from './nodeZipBuilder';
5
+ export { loadZipFile, loadZipFromUrl, createBrowserZipLoader } from './browserZipLoader';
6
+ export { prepareZipData, prepareZipDataFromDirectory, createNodeZipBuilder } from './nodeZipBuilder';
7
+ export { generateZipFilename, parseManifest, parseConfiguration, zipTreeToFiles, zipTreeToDirectory, formatFileSize, isZipFile } from './zipUtils';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/zipLoader/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AAGxB,cAAc,YAAY,CAAC;AAG3B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEzF,OAAO,EAAE,cAAc,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAErG,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,SAAS,EACV,MAAM,YAAY,CAAC"}
@@ -0,0 +1,13 @@
1
+ // Export types
2
+ export * from './types';
3
+ // Export utilities
4
+ export * from './zipUtils';
5
+ // Export browser ZIP loader
6
+ export * from './browserZipLoader';
7
+ // Export Node.js ZIP builder (placeholder)
8
+ export * from './nodeZipBuilder';
9
+ // Re-export commonly used functions
10
+ export { loadZipFile, loadZipFromUrl, createBrowserZipLoader } from './browserZipLoader';
11
+ export { prepareZipData, prepareZipDataFromDirectory, createNodeZipBuilder } from './nodeZipBuilder';
12
+ export { generateZipFilename, parseManifest, parseConfiguration, zipTreeToFiles, zipTreeToDirectory, formatFileSize, isZipFile } from './zipUtils';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/zipLoader/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,cAAc,SAAS,CAAC;AAExB,mBAAmB;AACnB,cAAc,YAAY,CAAC;AAE3B,4BAA4B;AAC5B,cAAc,oBAAoB,CAAC;AAEnC,2CAA2C;AAC3C,cAAc,kBAAkB,CAAC;AAEjC,oCAAoC;AACpC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEzF,OAAO,EAAE,cAAc,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAErG,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,SAAS,EACV,MAAM,YAAY,CAAC","sourcesContent":["// Export types\nexport * from './types';\n\n// Export utilities\nexport * from './zipUtils';\n\n// Export browser ZIP loader\nexport * from './browserZipLoader';\n\n// Export Node.js ZIP builder (placeholder)\nexport * from './nodeZipBuilder';\n\n// Re-export commonly used functions\nexport { loadZipFile, loadZipFromUrl, createBrowserZipLoader } from './browserZipLoader';\n\nexport { prepareZipData, prepareZipDataFromDirectory, createNodeZipBuilder } from './nodeZipBuilder';\n\nexport {\n generateZipFilename,\n parseManifest,\n parseConfiguration,\n zipTreeToFiles,\n zipTreeToDirectory,\n formatFileSize,\n isZipFile\n} from './zipUtils';\n"]}
@@ -0,0 +1,55 @@
1
+ import { Result } from '@fgv/ts-utils';
2
+ import { IZipBuilder, ZipArchiveOptions, ZipArchiveResult, ZipManifest } from './types';
3
+ import { ImportedDirectory, ImportedFile } from '../../types';
4
+ /**
5
+ * Node.js-based ZIP builder implementation
6
+ *
7
+ * Note: This is a placeholder implementation for interface compatibility.
8
+ * The actual Node.js ZIP building functionality should be implemented
9
+ * in a separate Node.js-specific package or tool.
10
+ */
11
+ export declare class NodeZipBuilder implements IZipBuilder {
12
+ /**
13
+ * Create ZIP from files
14
+ */
15
+ createFromFiles(files: ImportedFile[], options?: ZipArchiveOptions): Promise<Result<ZipArchiveResult>>;
16
+ /**
17
+ * Create ZIP from directory
18
+ */
19
+ createFromDirectory(directory: ImportedDirectory, options?: ZipArchiveOptions): Promise<Result<ZipArchiveResult>>;
20
+ /**
21
+ * Create ZIP from file system path
22
+ */
23
+ createFromPath(path: string, options?: ZipArchiveOptions): Promise<Result<ZipArchiveResult>>;
24
+ }
25
+ /**
26
+ * Create a new Node.js ZIP builder instance
27
+ *
28
+ * Note: This returns a placeholder implementation.
29
+ * For actual ZIP building, use the ts-res-browser-cli tool.
30
+ */
31
+ export declare function createNodeZipBuilder(): IZipBuilder;
32
+ /**
33
+ * Browser-compatible ZIP creation interface
34
+ *
35
+ * This provides a way to prepare ZIP data in the browser,
36
+ * though actual ZIP file creation requires server-side processing
37
+ * or a separate Node.js tool.
38
+ */
39
+ export interface BrowserZipData {
40
+ files: Array<{
41
+ path: string;
42
+ content: string;
43
+ }>;
44
+ manifest: ZipManifest;
45
+ config?: any;
46
+ }
47
+ /**
48
+ * Prepare ZIP data structure for browser download or server processing
49
+ */
50
+ export declare function prepareZipData(files: ImportedFile[], options?: ZipArchiveOptions): Result<BrowserZipData>;
51
+ /**
52
+ * Prepare ZIP data from directory structure
53
+ */
54
+ export declare function prepareZipDataFromDirectory(directory: ImportedDirectory, options?: ZipArchiveOptions): Result<BrowserZipData>;
55
+ //# sourceMappingURL=nodeZipBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeZipBuilder.d.ts","sourceRoot":"","sources":["../../../src/utils/zipLoader/nodeZipBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG9D;;;;;;GAMG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD;;OAEG;IACG,eAAe,CACnB,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAMpC;;OAEG;IACG,mBAAmB,CACvB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAMpC;;OAEG;IACG,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;CAKvG;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,WAAW,CAElD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CAAC,cAAc,CAAC,CAqCxB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,iBAAiB,EAC5B,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CAAC,cAAc,CAAC,CA4BxB"}
@@ -0,0 +1,98 @@
1
+ import { succeed, fail } from '@fgv/ts-utils';
2
+ import { createManifest, sanitizeFilename, normalizePath } from './zipUtils';
3
+ /**
4
+ * Node.js-based ZIP builder implementation
5
+ *
6
+ * Note: This is a placeholder implementation for interface compatibility.
7
+ * The actual Node.js ZIP building functionality should be implemented
8
+ * in a separate Node.js-specific package or tool.
9
+ */
10
+ export class NodeZipBuilder {
11
+ /**
12
+ * Create ZIP from files
13
+ */
14
+ async createFromFiles(files, options = {}) {
15
+ return fail('Node.js ZIP building not implemented in browser library. Use @fgv/ts-res-browser-cli for ZIP creation.');
16
+ }
17
+ /**
18
+ * Create ZIP from directory
19
+ */
20
+ async createFromDirectory(directory, options = {}) {
21
+ return fail('Node.js ZIP building not implemented in browser library. Use @fgv/ts-res-browser-cli for ZIP creation.');
22
+ }
23
+ /**
24
+ * Create ZIP from file system path
25
+ */
26
+ async createFromPath(path, options = {}) {
27
+ return fail('Node.js ZIP building not implemented in browser library. Use @fgv/ts-res-browser-cli for ZIP creation.');
28
+ }
29
+ }
30
+ /**
31
+ * Create a new Node.js ZIP builder instance
32
+ *
33
+ * Note: This returns a placeholder implementation.
34
+ * For actual ZIP building, use the ts-res-browser-cli tool.
35
+ */
36
+ export function createNodeZipBuilder() {
37
+ return new NodeZipBuilder();
38
+ }
39
+ /**
40
+ * Prepare ZIP data structure for browser download or server processing
41
+ */
42
+ export function prepareZipData(files, options = {}) {
43
+ const timestamp = new Date().toISOString();
44
+ const filename = options.filename || 'ts-res-bundle';
45
+ // Create manifest
46
+ const manifest = createManifest('file', 'browser-files', 'files/', options.includeConfig ? 'config.json' : undefined);
47
+ // Prepare file data
48
+ const zipFiles = files.map((file) => ({
49
+ path: normalizePath(file.path || file.name),
50
+ content: file.content
51
+ }));
52
+ // Add manifest
53
+ zipFiles.push({
54
+ path: 'manifest.json',
55
+ content: JSON.stringify(manifest, null, 2)
56
+ });
57
+ // Add configuration if provided
58
+ if (options.includeConfig && options.config) {
59
+ zipFiles.push({
60
+ path: 'config.json',
61
+ content: JSON.stringify(options.config, null, 2)
62
+ });
63
+ }
64
+ return succeed({
65
+ files: zipFiles,
66
+ manifest,
67
+ config: options.config
68
+ });
69
+ }
70
+ /**
71
+ * Prepare ZIP data from directory structure
72
+ */
73
+ export function prepareZipDataFromDirectory(directory, options = {}) {
74
+ // Flatten directory to files
75
+ const files = [];
76
+ const collectFiles = (dir, basePath = '') => {
77
+ // Add files from current directory
78
+ dir.files.forEach((file) => {
79
+ files.push({
80
+ ...file,
81
+ path: basePath ? `${basePath}/${file.name}` : file.name
82
+ });
83
+ });
84
+ // Recursively collect from subdirectories
85
+ if (dir.subdirectories) {
86
+ dir.subdirectories.forEach((subdir) => {
87
+ const subdirPath = basePath ? `${basePath}/${subdir.name}` : subdir.name;
88
+ collectFiles(subdir, subdirPath);
89
+ });
90
+ }
91
+ };
92
+ collectFiles(directory);
93
+ return prepareZipData(files, {
94
+ ...options,
95
+ filename: options.filename || sanitizeFilename(directory.name)
96
+ });
97
+ }
98
+ //# sourceMappingURL=nodeZipBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeZipBuilder.js","sourceRoot":"","sources":["../../../src/utils/zipLoader/nodeZipBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import { Result, succeed, fail } from '@fgv/ts-utils';\nimport { IZipBuilder, ZipArchiveOptions, ZipArchiveResult, ZipManifest } from './types';\nimport { ImportedDirectory, ImportedFile } from '../../types';\nimport { generateZipFilename, createManifest, sanitizeFilename, normalizePath } from './zipUtils';\n\n/**\n * Node.js-based ZIP builder implementation\n *\n * Note: This is a placeholder implementation for interface compatibility.\n * The actual Node.js ZIP building functionality should be implemented\n * in a separate Node.js-specific package or tool.\n */\nexport class NodeZipBuilder implements IZipBuilder {\n /**\n * Create ZIP from files\n */\n async createFromFiles(\n files: ImportedFile[],\n options: ZipArchiveOptions = {}\n ): Promise<Result<ZipArchiveResult>> {\n return fail(\n 'Node.js ZIP building not implemented in browser library. Use @fgv/ts-res-browser-cli for ZIP creation.'\n );\n }\n\n /**\n * Create ZIP from directory\n */\n async createFromDirectory(\n directory: ImportedDirectory,\n options: ZipArchiveOptions = {}\n ): Promise<Result<ZipArchiveResult>> {\n return fail(\n 'Node.js ZIP building not implemented in browser library. Use @fgv/ts-res-browser-cli for ZIP creation.'\n );\n }\n\n /**\n * Create ZIP from file system path\n */\n async createFromPath(path: string, options: ZipArchiveOptions = {}): Promise<Result<ZipArchiveResult>> {\n return fail(\n 'Node.js ZIP building not implemented in browser library. Use @fgv/ts-res-browser-cli for ZIP creation.'\n );\n }\n}\n\n/**\n * Create a new Node.js ZIP builder instance\n *\n * Note: This returns a placeholder implementation.\n * For actual ZIP building, use the ts-res-browser-cli tool.\n */\nexport function createNodeZipBuilder(): IZipBuilder {\n return new NodeZipBuilder();\n}\n\n/**\n * Browser-compatible ZIP creation interface\n *\n * This provides a way to prepare ZIP data in the browser,\n * though actual ZIP file creation requires server-side processing\n * or a separate Node.js tool.\n */\nexport interface BrowserZipData {\n files: Array<{\n path: string;\n content: string;\n }>;\n manifest: ZipManifest;\n config?: any;\n}\n\n/**\n * Prepare ZIP data structure for browser download or server processing\n */\nexport function prepareZipData(\n files: ImportedFile[],\n options: ZipArchiveOptions = {}\n): Result<BrowserZipData> {\n const timestamp = new Date().toISOString();\n const filename = options.filename || 'ts-res-bundle';\n\n // Create manifest\n const manifest = createManifest(\n 'file',\n 'browser-files',\n 'files/',\n options.includeConfig ? 'config.json' : undefined\n );\n\n // Prepare file data\n const zipFiles = files.map((file) => ({\n path: normalizePath(file.path || file.name),\n content: file.content\n }));\n\n // Add manifest\n zipFiles.push({\n path: 'manifest.json',\n content: JSON.stringify(manifest, null, 2)\n });\n\n // Add configuration if provided\n if (options.includeConfig && options.config) {\n zipFiles.push({\n path: 'config.json',\n content: JSON.stringify(options.config, null, 2)\n });\n }\n\n return succeed({\n files: zipFiles,\n manifest,\n config: options.config\n });\n}\n\n/**\n * Prepare ZIP data from directory structure\n */\nexport function prepareZipDataFromDirectory(\n directory: ImportedDirectory,\n options: ZipArchiveOptions = {}\n): Result<BrowserZipData> {\n // Flatten directory to files\n const files: ImportedFile[] = [];\n\n const collectFiles = (dir: ImportedDirectory, basePath: string = '') => {\n // Add files from current directory\n dir.files.forEach((file) => {\n files.push({\n ...file,\n path: basePath ? `${basePath}/${file.name}` : file.name\n });\n });\n\n // Recursively collect from subdirectories\n if (dir.subdirectories) {\n dir.subdirectories.forEach((subdir) => {\n const subdirPath = basePath ? `${basePath}/${subdir.name}` : subdir.name;\n collectFiles(subdir, subdirPath);\n });\n }\n };\n\n collectFiles(directory);\n\n return prepareZipData(files, {\n ...options,\n filename: options.filename || sanitizeFilename(directory.name)\n });\n}\n"]}