@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.
- package/.rush/temp/03c8b056281d9db0a97d8a6e25eea798a160d393.tar.log +271 -0
- package/.rush/temp/chunked-rush-logs/ts-res-ui-components.build.chunks.jsonl +9 -0
- package/.rush/temp/operation/build/all.log +9 -0
- package/.rush/temp/operation/build/log-chunks.jsonl +9 -0
- package/.rush/temp/operation/build/state.json +3 -0
- package/.rush/temp/shrinkwrap-deps.json +1111 -0
- package/README.md +18 -0
- package/REFACTORING_PLAN.md +171 -0
- package/config/jest.config.json +16 -0
- package/config/jest.setup.js +64 -0
- package/config/rig.json +16 -0
- package/lib/components/common/QualifierContextControl.d.ts +14 -0
- package/lib/components/common/QualifierContextControl.d.ts.map +1 -0
- package/lib/components/common/QualifierContextControl.js +78 -0
- package/lib/components/common/QualifierContextControl.js.map +1 -0
- package/lib/components/common/ResourceListView.d.ts +11 -0
- package/lib/components/common/ResourceListView.d.ts.map +1 -0
- package/lib/components/common/ResourceListView.js +20 -0
- package/lib/components/common/ResourceListView.js.map +1 -0
- package/lib/components/common/ResourceTreeView.d.ts +12 -0
- package/lib/components/common/ResourceTreeView.d.ts.map +1 -0
- package/lib/components/common/ResourceTreeView.js +162 -0
- package/lib/components/common/ResourceTreeView.js.map +1 -0
- package/lib/components/forms/HierarchyEditor.d.ts +10 -0
- package/lib/components/forms/HierarchyEditor.d.ts.map +1 -0
- package/lib/components/forms/HierarchyEditor.js +106 -0
- package/lib/components/forms/HierarchyEditor.js.map +1 -0
- package/lib/components/forms/QualifierEditForm.d.ts +11 -0
- package/lib/components/forms/QualifierEditForm.d.ts.map +1 -0
- package/lib/components/forms/QualifierEditForm.js +181 -0
- package/lib/components/forms/QualifierEditForm.js.map +1 -0
- package/lib/components/forms/QualifierTypeEditForm.d.ts +10 -0
- package/lib/components/forms/QualifierTypeEditForm.d.ts.map +1 -0
- package/lib/components/forms/QualifierTypeEditForm.js +172 -0
- package/lib/components/forms/QualifierTypeEditForm.js.map +1 -0
- package/lib/components/forms/ResourceTypeEditForm.d.ts +10 -0
- package/lib/components/forms/ResourceTypeEditForm.d.ts.map +1 -0
- package/lib/components/forms/ResourceTypeEditForm.js +188 -0
- package/lib/components/forms/ResourceTypeEditForm.js.map +1 -0
- package/lib/components/forms/index.d.ts +9 -0
- package/lib/components/forms/index.d.ts.map +1 -0
- package/lib/components/forms/index.js +5 -0
- package/lib/components/forms/index.js.map +1 -0
- package/lib/components/orchestrator/ResourceOrchestrator.d.ts +14 -0
- package/lib/components/orchestrator/ResourceOrchestrator.d.ts.map +1 -0
- package/lib/components/orchestrator/ResourceOrchestrator.js +278 -0
- package/lib/components/orchestrator/ResourceOrchestrator.js.map +1 -0
- package/lib/components/views/CompiledView/index.d.ts +5 -0
- package/lib/components/views/CompiledView/index.d.ts.map +1 -0
- package/lib/components/views/CompiledView/index.js +595 -0
- package/lib/components/views/CompiledView/index.js.map +1 -0
- package/lib/components/views/ConfigurationView/index.d.ts +5 -0
- package/lib/components/views/ConfigurationView/index.d.ts.map +1 -0
- package/lib/components/views/ConfigurationView/index.js +363 -0
- package/lib/components/views/ConfigurationView/index.js.map +1 -0
- package/lib/components/views/FilterView/index.d.ts +5 -0
- package/lib/components/views/FilterView/index.d.ts.map +1 -0
- package/lib/components/views/FilterView/index.js +463 -0
- package/lib/components/views/FilterView/index.js.map +1 -0
- package/lib/components/views/ImportView/index.d.ts +5 -0
- package/lib/components/views/ImportView/index.d.ts.map +1 -0
- package/lib/components/views/ImportView/index.js +514 -0
- package/lib/components/views/ImportView/index.js.map +1 -0
- package/lib/components/views/ResolutionView/EditableJsonView.d.ts +21 -0
- package/lib/components/views/ResolutionView/EditableJsonView.d.ts.map +1 -0
- package/lib/components/views/ResolutionView/EditableJsonView.js +109 -0
- package/lib/components/views/ResolutionView/EditableJsonView.js.map +1 -0
- package/lib/components/views/ResolutionView/ResolutionEditControls.d.ts +19 -0
- package/lib/components/views/ResolutionView/ResolutionEditControls.d.ts.map +1 -0
- package/lib/components/views/ResolutionView/ResolutionEditControls.js +82 -0
- package/lib/components/views/ResolutionView/ResolutionEditControls.js.map +1 -0
- package/lib/components/views/ResolutionView/index.d.ts +5 -0
- package/lib/components/views/ResolutionView/index.d.ts.map +1 -0
- package/lib/components/views/ResolutionView/index.js +255 -0
- package/lib/components/views/ResolutionView/index.js.map +1 -0
- package/lib/components/views/SourceView/index.d.ts +5 -0
- package/lib/components/views/SourceView/index.d.ts.map +1 -0
- package/lib/components/views/SourceView/index.js +316 -0
- package/lib/components/views/SourceView/index.js.map +1 -0
- package/lib/components/views/ZipLoaderView/index.d.ts +5 -0
- package/lib/components/views/ZipLoaderView/index.d.ts.map +1 -0
- package/lib/components/views/ZipLoaderView/index.js +313 -0
- package/lib/components/views/ZipLoaderView/index.js.map +1 -0
- package/lib/hooks/useConfigurationState.d.ts +46 -0
- package/lib/hooks/useConfigurationState.d.ts.map +1 -0
- package/lib/hooks/useConfigurationState.js +239 -0
- package/lib/hooks/useConfigurationState.js.map +1 -0
- package/lib/hooks/useFilterState.d.ts +7 -0
- package/lib/hooks/useFilterState.d.ts.map +1 -0
- package/lib/hooks/useFilterState.js +80 -0
- package/lib/hooks/useFilterState.js.map +1 -0
- package/lib/hooks/useResolutionState.d.ts +8 -0
- package/lib/hooks/useResolutionState.d.ts.map +1 -0
- package/lib/hooks/useResolutionState.js +253 -0
- package/lib/hooks/useResolutionState.js.map +1 -0
- package/lib/hooks/useResourceData.d.ts +19 -0
- package/lib/hooks/useResourceData.d.ts.map +1 -0
- package/lib/hooks/useResourceData.js +368 -0
- package/lib/hooks/useResourceData.js.map +1 -0
- package/lib/hooks/useViewState.d.ts +10 -0
- package/lib/hooks/useViewState.d.ts.map +1 -0
- package/lib/hooks/useViewState.js +29 -0
- package/lib/hooks/useViewState.js.map +1 -0
- package/lib/index.d.ts +27 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +34 -0
- package/lib/index.js.map +1 -0
- package/lib/test/helpers/testDataLoader.d.ts +37 -0
- package/lib/test/helpers/testDataLoader.d.ts.map +1 -0
- package/lib/test/helpers/testDataLoader.js +171 -0
- package/lib/test/helpers/testDataLoader.js.map +1 -0
- package/lib/test/unit/utils/configurationUtils.test.d.ts +2 -0
- package/lib/test/unit/utils/configurationUtils.test.d.ts.map +1 -0
- package/lib/test/unit/utils/configurationUtils.test.js +497 -0
- package/lib/test/unit/utils/configurationUtils.test.js.map +1 -0
- package/lib/test/unit/utils/fileProcessing.test.d.ts +2 -0
- package/lib/test/unit/utils/fileProcessing.test.d.ts.map +1 -0
- package/lib/test/unit/utils/fileProcessing.test.js +321 -0
- package/lib/test/unit/utils/fileProcessing.test.js.map +1 -0
- package/lib/test/unit/utils/filterResources.test.d.ts +2 -0
- package/lib/test/unit/utils/filterResources.test.d.ts.map +1 -0
- package/lib/test/unit/utils/filterResources.test.js +403 -0
- package/lib/test/unit/utils/filterResources.test.js.map +1 -0
- package/lib/test/unit/utils/resolutionEditing.test.d.ts +2 -0
- package/lib/test/unit/utils/resolutionEditing.test.d.ts.map +1 -0
- package/lib/test/unit/utils/resolutionEditing.test.js +439 -0
- package/lib/test/unit/utils/resolutionEditing.test.js.map +1 -0
- package/lib/test/unit/utils/resolutionUtils.test.d.ts +2 -0
- package/lib/test/unit/utils/resolutionUtils.test.d.ts.map +1 -0
- package/lib/test/unit/utils/resolutionUtils.test.js +397 -0
- package/lib/test/unit/utils/resolutionUtils.test.js.map +1 -0
- package/lib/test/unit/utils/tsResIntegration.test.d.ts +2 -0
- package/lib/test/unit/utils/tsResIntegration.test.d.ts.map +1 -0
- package/lib/test/unit/utils/tsResIntegration.test.js +376 -0
- package/lib/test/unit/utils/tsResIntegration.test.js.map +1 -0
- package/lib/types/index.d.ts +251 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +2 -0
- package/lib/types/index.js.map +1 -0
- package/lib/utils/configurationUtils.d.ts +74 -0
- package/lib/utils/configurationUtils.d.ts.map +1 -0
- package/lib/utils/configurationUtils.js +359 -0
- package/lib/utils/configurationUtils.js.map +1 -0
- package/lib/utils/fileProcessing.d.ts +18 -0
- package/lib/utils/fileProcessing.d.ts.map +1 -0
- package/lib/utils/fileProcessing.js +142 -0
- package/lib/utils/fileProcessing.js.map +1 -0
- package/lib/utils/filterResources.d.ts +38 -0
- package/lib/utils/filterResources.d.ts.map +1 -0
- package/lib/utils/filterResources.js +153 -0
- package/lib/utils/filterResources.js.map +1 -0
- package/lib/utils/resolutionEditing.d.ts +58 -0
- package/lib/utils/resolutionEditing.d.ts.map +1 -0
- package/lib/utils/resolutionEditing.js +246 -0
- package/lib/utils/resolutionEditing.js.map +1 -0
- package/lib/utils/resolutionUtils.d.ts +28 -0
- package/lib/utils/resolutionUtils.d.ts.map +1 -0
- package/lib/utils/resolutionUtils.js +216 -0
- package/lib/utils/resolutionUtils.js.map +1 -0
- package/lib/utils/tsResIntegration.d.ts +71 -0
- package/lib/utils/tsResIntegration.d.ts.map +1 -0
- package/lib/utils/tsResIntegration.js +294 -0
- package/lib/utils/tsResIntegration.js.map +1 -0
- package/lib/utils/zipLoader/browserZipLoader.d.ts +48 -0
- package/lib/utils/zipLoader/browserZipLoader.d.ts.map +1 -0
- package/lib/utils/zipLoader/browserZipLoader.js +247 -0
- package/lib/utils/zipLoader/browserZipLoader.js.map +1 -0
- package/lib/utils/zipLoader/index.d.ts +8 -0
- package/lib/utils/zipLoader/index.d.ts.map +1 -0
- package/lib/utils/zipLoader/index.js +13 -0
- package/lib/utils/zipLoader/index.js.map +1 -0
- package/lib/utils/zipLoader/nodeZipBuilder.d.ts +55 -0
- package/lib/utils/zipLoader/nodeZipBuilder.d.ts.map +1 -0
- package/lib/utils/zipLoader/nodeZipBuilder.js +98 -0
- package/lib/utils/zipLoader/nodeZipBuilder.js.map +1 -0
- package/lib/utils/zipLoader/types.d.ts +139 -0
- package/lib/utils/zipLoader/types.d.ts.map +1 -0
- package/lib/utils/zipLoader/types.js +2 -0
- package/lib/utils/zipLoader/types.js.map +1 -0
- package/lib/utils/zipLoader/zipUtils.d.ts +53 -0
- package/lib/utils/zipLoader/zipUtils.d.ts.map +1 -0
- package/lib/utils/zipLoader/zipUtils.js +229 -0
- package/lib/utils/zipLoader/zipUtils.js.map +1 -0
- package/package.json +69 -0
- package/rush-logs/ts-res-ui-components.build.cache.log +3 -0
- package/rush-logs/ts-res-ui-components.build.log +9 -0
- package/src/components/common/QualifierContextControl.tsx +151 -0
- package/src/components/common/ResourceListView.tsx +63 -0
- package/src/components/common/ResourceTreeView.tsx +271 -0
- package/src/components/forms/HierarchyEditor.tsx +204 -0
- package/src/components/forms/QualifierEditForm.tsx +355 -0
- package/src/components/forms/QualifierTypeEditForm.tsx +347 -0
- package/src/components/forms/ResourceTypeEditForm.tsx +331 -0
- package/src/components/forms/index.ts +11 -0
- package/src/components/orchestrator/ResourceOrchestrator.tsx +372 -0
- package/src/components/views/CompiledView/index.tsx +922 -0
- package/src/components/views/ConfigurationView/index.tsx +800 -0
- package/src/components/views/FilterView/index.tsx +825 -0
- package/src/components/views/ImportView/index.tsx +717 -0
- package/src/components/views/ResolutionView/EditableJsonView.tsx +214 -0
- package/src/components/views/ResolutionView/ResolutionEditControls.tsx +170 -0
- package/src/components/views/ResolutionView/index.tsx +591 -0
- package/src/components/views/SourceView/index.tsx +536 -0
- package/src/components/views/ZipLoaderView/index.tsx +485 -0
- package/src/hooks/useConfigurationState.ts +374 -0
- package/src/hooks/useFilterState.ts +97 -0
- package/src/hooks/useResolutionState.ts +355 -0
- package/src/hooks/useResourceData.ts +467 -0
- package/src/hooks/useViewState.ts +44 -0
- package/src/index.ts +45 -0
- package/src/test/helpers/testDataLoader.ts +195 -0
- package/src/test/unit/utils/configurationUtils.test.ts +630 -0
- package/src/test/unit/utils/fileProcessing.test.ts +391 -0
- package/src/test/unit/utils/filterResources.test.ts +574 -0
- package/src/test/unit/utils/resolutionEditing.test.ts +556 -0
- package/src/test/unit/utils/resolutionUtils.test.ts +521 -0
- package/src/test/unit/utils/tsResIntegration.test.ts +433 -0
- package/src/types/index.ts +322 -0
- package/src/utils/configurationUtils.ts +424 -0
- package/src/utils/fileProcessing.ts +160 -0
- package/src/utils/filterResources.ts +206 -0
- package/src/utils/resolutionEditing.ts +319 -0
- package/src/utils/resolutionUtils.ts +289 -0
- package/src/utils/tsResIntegration.ts +440 -0
- package/src/utils/zipLoader/browserZipLoader.ts +319 -0
- package/src/utils/zipLoader/index.ts +26 -0
- package/src/utils/zipLoader/nodeZipBuilder.ts +153 -0
- package/src/utils/zipLoader/types.ts +175 -0
- package/src/utils/zipLoader/zipUtils.ts +266 -0
- package/temp/build/typescript/ts_gZid87Hu.json +1 -0
- 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":"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","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"]}
|