@umituz/react-native-filesystem 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umituz/react-native-filesystem",
3
- "version": "1.3.0",
3
+ "version": "2.0.0",
4
4
  "description": "Domain-Driven Design filesystem utilities for React Native apps with build-time module loading and runtime file operations",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
package/src/index.ts CHANGED
@@ -174,5 +174,12 @@ export {
174
174
  FileUtils,
175
175
  } from './domain/entities/File';
176
176
 
177
- // Infrastructure Layer - FileSystem Service
177
+ // Infrastructure Layer - FileSystem Service & Specialized Services
178
178
  export { FileSystemService } from './infrastructure/services/FileSystemService';
179
+ export { FileOperations } from './infrastructure/services/FileOperations';
180
+ export { FileManagement } from './infrastructure/services/FileManagement';
181
+ export { DirectoryOperations } from './infrastructure/services/DirectoryOperations';
182
+ export { FileInformation } from './infrastructure/services/FileInformation';
183
+ export { DownloadOperations } from './infrastructure/services/DownloadOperations';
184
+ export { CacheOperations } from './infrastructure/services/CacheOperations';
185
+ export { FilePathOperations } from './infrastructure/services/FilePathOperations';
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Cache Operations Service
3
+ * Handles cache-related operations
4
+ */
5
+
6
+ import { clearCache, getDirectorySize } from "./cache.service";
7
+
8
+ export class CacheOperations {
9
+ static async clearCache(): Promise<boolean> {
10
+ return clearCache();
11
+ }
12
+
13
+ static async getDirectorySize(uri: string): Promise<number> {
14
+ return getDirectorySize(uri);
15
+ }
16
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Directory Operations Service
3
+ * Handles directory-related operations
4
+ */
5
+
6
+ import {
7
+ createDirectory,
8
+ listDirectory,
9
+ getDirectoryPath,
10
+ getDocumentDirectory,
11
+ getCacheDirectory,
12
+ } from "./directory.service";
13
+ import type { DirectoryType } from "../../domain/entities/File";
14
+
15
+ export class DirectoryOperations {
16
+ static async createDirectory(uri: string): Promise<boolean> {
17
+ return createDirectory(uri);
18
+ }
19
+
20
+ static async listDirectory(uri: string): Promise<string[]> {
21
+ return listDirectory(uri);
22
+ }
23
+
24
+ static getDirectoryPath(type: DirectoryType): string {
25
+ return getDirectoryPath(type);
26
+ }
27
+
28
+ static getDocumentDirectory(): string {
29
+ return getDocumentDirectory();
30
+ }
31
+
32
+ static getCacheDirectory(): string {
33
+ return getCacheDirectory();
34
+ }
35
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Download Operations Service
3
+ * Handles file download operations
4
+ */
5
+
6
+ import { downloadFile } from "./download.service";
7
+ import type { FileOperationResult } from "../../domain/entities/File";
8
+
9
+ export class DownloadOperations {
10
+ static async downloadFile(
11
+ url: string,
12
+ destinationUri?: string,
13
+ ): Promise<FileOperationResult> {
14
+ return downloadFile(url, destinationUri);
15
+ }
16
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * File Information Service
3
+ * Handles file information queries
4
+ */
5
+
6
+ import { getFileInfo, fileExists, getFileSize } from "./file-info.service";
7
+ import type { FileInfo } from "../../domain/entities/File";
8
+
9
+ export class FileInformation {
10
+ static async getFileInfo(uri: string): Promise<FileInfo | null> {
11
+ return getFileInfo(uri);
12
+ }
13
+
14
+ static async exists(uri: string): Promise<boolean> {
15
+ return fileExists(uri);
16
+ }
17
+
18
+ static async getFileSize(uri: string): Promise<number> {
19
+ return getFileSize(uri);
20
+ }
21
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * File Management Service
3
+ * Handles file operations like copy, move, delete
4
+ */
5
+
6
+ import { deleteFile, copyFile, moveFile } from "./file-manager.service";
7
+ import type { FileOperationResult } from "../../domain/entities/File";
8
+
9
+ export class FileManagement {
10
+ static async deleteFile(uri: string): Promise<boolean> {
11
+ return deleteFile(uri);
12
+ }
13
+
14
+ static async copyFile(
15
+ sourceUri: string,
16
+ destinationUri: string,
17
+ ): Promise<FileOperationResult> {
18
+ return copyFile(sourceUri, destinationUri);
19
+ }
20
+
21
+ static async moveFile(
22
+ sourceUri: string,
23
+ destinationUri: string,
24
+ ): Promise<FileOperationResult> {
25
+ return moveFile(sourceUri, destinationUri);
26
+ }
27
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * File Operations Service
3
+ * Handles basic file read/write operations
4
+ */
5
+
6
+ import { readFile, readFileAsBase64 } from "./file-reader.service";
7
+ import { writeFile } from "./file-writer.service";
8
+ import type { FileEncoding, FileOperationResult } from "../../domain/entities/File";
9
+
10
+ export class FileOperations {
11
+ static async readFile(
12
+ uri: string,
13
+ encoding: FileEncoding = "utf8",
14
+ ): Promise<string | null> {
15
+ return readFile(uri, encoding);
16
+ }
17
+
18
+ static async readFileAsBase64(uri: string): Promise<string | null> {
19
+ return readFileAsBase64(uri);
20
+ }
21
+
22
+ static async writeFile(
23
+ uri: string,
24
+ content: string,
25
+ encoding: FileEncoding = "utf8",
26
+ ): Promise<FileOperationResult> {
27
+ return writeFile(uri, content, encoding);
28
+ }
29
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * File Path Operations Service
3
+ * Handles file path generation and utilities
4
+ */
5
+
6
+ import { generateFilePath } from "./file-path.service";
7
+ import { getDirectoryPath } from "./directory.service";
8
+ import { FileUtils } from "../../domain/entities/File";
9
+ import type { DirectoryType } from "../../domain/entities/File";
10
+
11
+ export class FilePathOperations {
12
+ static generateFilePath(
13
+ filename: string,
14
+ directory: DirectoryType = "documentDirectory",
15
+ ): string {
16
+ return generateFilePath(filename, directory);
17
+ }
18
+
19
+ static generateUniqueFilePath(
20
+ filename: string,
21
+ directory: DirectoryType = "documentDirectory",
22
+ ): string {
23
+ const uniqueName = FileUtils.generateUniqueFilename(filename);
24
+ return FileUtils.joinPaths(getDirectoryPath(directory), uniqueName);
25
+ }
26
+ }
@@ -1,160 +1,117 @@
1
1
  /**
2
- * FileSystem Service
3
- * Single Responsibility: Facade for all file system operations
4
- *
5
- * This is a facade that delegates to specialized services
6
- * following Single Responsibility Principle
2
+ * FileSystem Service - Facade
3
+ * Delegates to specialized services following SOLID principles
7
4
  */
8
5
 
9
- import { readFile, readFileAsBase64 } from "./file-reader.service";
10
- import { writeFile } from "./file-writer.service";
11
- import { deleteFile, copyFile, moveFile } from "./file-manager.service";
12
- import {
13
- createDirectory,
14
- listDirectory,
15
- getDirectoryPath,
16
- getDocumentDirectory,
17
- getCacheDirectory,
18
- } from "./directory.service";
19
- import { getFileInfo, fileExists, getFileSize } from "./file-info.service";
20
- import { downloadFile } from "./download.service";
21
- import { clearCache, getDirectorySize } from "./cache.service";
22
- import { generateFilePath } from "./file-path.service";
23
- import type {
24
- FileInfo,
25
- FileOperationResult,
26
- DirectoryType,
27
- FileEncoding,
28
- } from "../../domain/entities/File";
29
- import { copyFile as copyFileOp } from "./file-manager.service";
6
+ import { FileOperations } from "./FileOperations";
7
+ import { FileManagement } from "./FileManagement";
8
+ import { DirectoryOperations } from "./DirectoryOperations";
9
+ import { FileInformation } from "./FileInformation";
10
+ import { DownloadOperations } from "./DownloadOperations";
11
+ import { CacheOperations } from "./CacheOperations";
12
+ import { FilePathOperations } from "./FilePathOperations";
30
13
  import { FileUtils } from "../../domain/entities/File";
14
+ import type { FileEncoding, DirectoryType, FileOperationResult } from "../../domain/entities/File";
31
15
 
32
16
  /**
33
- * FileSystem Service - Facade for all file operations
34
- * Delegates to specialized services following SOLID principles
17
+ * FileSystem Service - Clean facade for all file operations
18
+ * Delegates to specialized services following Single Responsibility Principle
35
19
  */
36
20
  export class FileSystemService {
37
21
  // File Reading
38
- static async readFile(
39
- uri: string,
40
- encoding: FileEncoding = "utf8",
41
- ): Promise<string | null> {
42
- return readFile(uri, encoding);
22
+ static async readFile(uri: string, encoding: FileEncoding = "utf8"): Promise<string | null> {
23
+ return FileOperations.readFile(uri, encoding);
43
24
  }
44
25
 
45
26
  static async readFileAsBase64(uri: string): Promise<string | null> {
46
- return readFileAsBase64(uri);
27
+ return FileOperations.readFileAsBase64(uri);
47
28
  }
48
29
 
49
30
  // File Writing
50
- static async writeFile(
51
- uri: string,
52
- content: string,
53
- encoding: FileEncoding = "utf8",
54
- ): Promise<FileOperationResult> {
55
- return writeFile(uri, content, encoding);
31
+ static async writeFile(uri: string, content: string, encoding: FileEncoding = "utf8"): Promise<FileOperationResult> {
32
+ return FileOperations.writeFile(uri, content, encoding);
56
33
  }
57
34
 
58
35
  // File Management
59
36
  static async deleteFile(uri: string): Promise<boolean> {
60
- return deleteFile(uri);
37
+ return FileManagement.deleteFile(uri);
61
38
  }
62
39
 
63
- static async copyFile(
64
- sourceUri: string,
65
- destinationUri: string,
66
- ): Promise<FileOperationResult> {
67
- return copyFileOp(sourceUri, destinationUri);
40
+ static async copyFile(sourceUri: string, destinationUri: string): Promise<FileOperationResult> {
41
+ return FileManagement.copyFile(sourceUri, destinationUri);
68
42
  }
69
43
 
70
- static async moveFile(
71
- sourceUri: string,
72
- destinationUri: string,
73
- ): Promise<FileOperationResult> {
74
- return moveFile(sourceUri, destinationUri);
44
+ static async moveFile(sourceUri: string, destinationUri: string): Promise<FileOperationResult> {
45
+ return FileManagement.moveFile(sourceUri, destinationUri);
75
46
  }
76
47
 
77
48
  // Directory Operations
78
49
  static async createDirectory(uri: string): Promise<boolean> {
79
- return createDirectory(uri);
50
+ return DirectoryOperations.createDirectory(uri);
80
51
  }
81
52
 
82
53
  static async listDirectory(uri: string): Promise<string[]> {
83
- return listDirectory(uri);
54
+ return DirectoryOperations.listDirectory(uri);
84
55
  }
85
56
 
86
57
  static getDirectoryPath(type: DirectoryType): string {
87
- return getDirectoryPath(type);
58
+ return DirectoryOperations.getDirectoryPath(type);
88
59
  }
89
60
 
90
61
  static getDocumentDirectory(): string {
91
- return getDocumentDirectory();
62
+ return DirectoryOperations.getDocumentDirectory();
92
63
  }
93
64
 
94
65
  static getCacheDirectory(): string {
95
- return getCacheDirectory();
66
+ return DirectoryOperations.getCacheDirectory();
96
67
  }
97
68
 
98
69
  // File Information
99
- static async getFileInfo(uri: string): Promise<FileInfo | null> {
100
- return getFileInfo(uri);
70
+ static async getFileInfo(uri: string) {
71
+ return FileInformation.getFileInfo(uri);
101
72
  }
102
73
 
103
74
  static async exists(uri: string): Promise<boolean> {
104
- return fileExists(uri);
75
+ return FileInformation.exists(uri);
105
76
  }
106
77
 
107
78
  static async getFileSize(uri: string): Promise<number> {
108
- return getFileSize(uri);
79
+ return FileInformation.getFileSize(uri);
109
80
  }
110
81
 
111
82
  // Downloads
112
- static async downloadFile(
113
- url: string,
114
- destinationUri?: string,
115
- ): Promise<FileOperationResult> {
116
- return downloadFile(url, destinationUri);
83
+ static async downloadFile(url: string, destinationUri?: string): Promise<FileOperationResult> {
84
+ return DownloadOperations.downloadFile(url, destinationUri);
117
85
  }
118
86
 
119
87
  // Cache Management
120
88
  static async clearCache(): Promise<boolean> {
121
- return clearCache();
89
+ return CacheOperations.clearCache();
122
90
  }
123
91
 
124
92
  static async getDirectorySize(uri: string): Promise<number> {
125
- return getDirectorySize(uri);
93
+ return CacheOperations.getDirectorySize(uri);
126
94
  }
127
95
 
128
96
  // File Path Generation
129
- static generateFilePath(
130
- filename: string,
131
- directory: DirectoryType = "documentDirectory",
132
- ): string {
133
- return generateFilePath(filename, directory);
134
- }
135
-
136
- // Convenience methods (delegates to other services)
137
- static async copyToCache(
138
- sourceUri: string,
139
- filename?: string,
140
- ): Promise<FileOperationResult> {
141
- const name = filename || sourceUri.split("/").pop() || "file";
142
- const destinationUri = FileUtils.joinPaths(
143
- getDirectoryPath("cacheDirectory"),
144
- FileUtils.generateUniqueFilename(name),
97
+ static generateFilePath(filename: string, directory: DirectoryType = "documentDirectory"): string {
98
+ return FilePathOperations.generateFilePath(filename, directory);
99
+ }
100
+
101
+ // Convenience methods
102
+ static async copyToCache(sourceUri: string, filename?: string): Promise<FileOperationResult> {
103
+ const destinationUri = FilePathOperations.generateUniqueFilePath(
104
+ filename || sourceUri.split("/").pop() || "file",
105
+ "cacheDirectory"
145
106
  );
146
- return copyFileOp(sourceUri, destinationUri);
107
+ return FileManagement.copyFile(sourceUri, destinationUri);
147
108
  }
148
109
 
149
- static async copyToDocuments(
150
- sourceUri: string,
151
- filename?: string,
152
- ): Promise<FileOperationResult> {
153
- const name = filename || sourceUri.split("/").pop() || "file";
154
- const destinationUri = FileUtils.joinPaths(
155
- getDirectoryPath("documentDirectory"),
156
- FileUtils.generateUniqueFilename(name),
110
+ static async copyToDocuments(sourceUri: string, filename?: string): Promise<FileOperationResult> {
111
+ const destinationUri = FilePathOperations.generateUniqueFilePath(
112
+ filename || sourceUri.split("/").pop() || "file",
113
+ "documentDirectory"
157
114
  );
158
- return copyFileOp(sourceUri, destinationUri);
115
+ return FileManagement.copyFile(sourceUri, destinationUri);
159
116
  }
160
117
  }
@@ -1,99 +1,52 @@
1
1
  /**
2
2
  * Module Loader Utilities
3
3
  *
4
- * Provides automatic module loading using Metro bundler's require.context
5
- * Used for auto-discovering and importing files at build time
6
- *
7
- * USAGE:
8
- * ```typescript
9
- * // Auto-load all JSON files in current directory
10
- * const context = require.context('./', false, /\.json$/);
11
- * const modules = loadJsonModules(context);
12
- * ```
4
+ * Provides explicit module loading for maximum compatibility
5
+ * No longer uses require.context to avoid iOS Metro bundler issues
13
6
  */
14
7
 
15
- import type { RequireContext, ModuleCollection } from '../../domain/entities/ModuleContext';
8
+ import type { ModuleCollection } from '../../domain/entities/ModuleContext';
16
9
 
17
10
  /**
18
- * Load JSON modules from a require.context
11
+ * Load JSON modules with explicit imports
19
12
  *
20
- * @param context - Metro bundler require.context result
21
- * @returns Object with module names as keys and content as values
13
+ * This function is kept for backward compatibility but now uses explicit imports
14
+ * instead of require.context for maximum platform compatibility.
22
15
  *
23
- * @example
24
- * ```typescript
25
- * const translationContext = require.context('./', false, /\.json$/);
26
- * const translations = loadJsonModules(translationContext);
27
- * // Result: { common: {...}, errors: {...}, settings: {...} }
28
- * ```
16
+ * @deprecated Use explicit imports instead of require.context pattern
17
+ * @param context - Not used anymore, kept for API compatibility
18
+ * @returns Empty object (backward compatibility)
29
19
  */
30
- export function loadJsonModules(context: RequireContext): ModuleCollection {
31
- const modules: ModuleCollection = {};
32
-
33
- context.keys().forEach((key: string) => {
34
- // Extract module name from path
35
- // './animation.json' -> 'animation'
36
- // './common.json' -> 'common'
37
- const moduleName = key
38
- .replace('./', '')
39
- .replace(/\.(json|js|ts|tsx)$/, '');
40
-
41
- // Load module content
42
- modules[moduleName] = context(key);
43
- });
44
-
45
- return modules;
20
+ export function loadJsonModules(context?: any): ModuleCollection {
21
+ // Return empty object for backward compatibility
22
+ // Projects should migrate to explicit imports
23
+ return {};
46
24
  }
47
25
 
48
26
  /**
49
27
  * Load modules with custom name transformation
50
28
  *
51
- * @param context - Metro bundler require.context result
52
- * @param transformName - Function to transform module name
53
- * @returns Object with transformed names as keys
54
- *
55
- * @example
56
- * ```typescript
57
- * const context = require.context('./', false, /\.json$/);
58
- * const modules = loadModulesWithTransform(context, name => name.toUpperCase());
59
- * // Result: { COMMON: {...}, ERRORS: {...} }
60
- * ```
29
+ * @deprecated Use explicit imports instead
30
+ * @param context - Not used anymore
31
+ * @param transformName - Not used anymore
32
+ * @returns Empty object (backward compatibility)
61
33
  */
62
34
  export function loadModulesWithTransform(
63
- context: RequireContext,
64
- transformName: (name: string) => string
35
+ context?: any,
36
+ transformName?: (name: string) => string
65
37
  ): ModuleCollection {
66
- const modules: ModuleCollection = {};
67
-
68
- context.keys().forEach((key: string) => {
69
- const baseName = key
70
- .replace('./', '')
71
- .replace(/\.(json|js|ts|tsx)$/, '');
72
-
73
- const transformedName = transformName(baseName);
74
- modules[transformedName] = context(key);
75
- });
76
-
77
- return modules;
38
+ // Return empty object for backward compatibility
39
+ return {};
78
40
  }
79
41
 
80
42
  /**
81
43
  * Get list of module names from context
82
44
  *
83
- * @param context - Metro bundler require.context result
84
- * @returns Array of module names (without extensions)
85
- *
86
- * @example
87
- * ```typescript
88
- * const context = require.context('./', false, /\.json$/);
89
- * const names = getModuleNames(context);
90
- * // Result: ['animation', 'common', 'errors', 'settings']
91
- * ```
45
+ * @deprecated Use explicit imports instead
46
+ * @param context - Not used anymore
47
+ * @returns Empty array (backward compatibility)
92
48
  */
93
- export function getModuleNames(context: RequireContext): string[] {
94
- return context.keys().map((key: string) =>
95
- key
96
- .replace('./', '')
97
- .replace(/\.(json|js|ts|tsx)$/, '')
98
- );
49
+ export function getModuleNames(context?: any): string[] {
50
+ // Return empty array for backward compatibility
51
+ return [];
99
52
  }