nico-tools 1.0.0 → 1.1.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.
Files changed (111) hide show
  1. package/bin/cli.js +9 -13
  2. package/bin/commands/create-project.js +106 -0
  3. package/bin/commands/translate.js +12 -0
  4. package/bin/config/templates.js +9 -0
  5. package/bin/utils/file-utils.js +84 -0
  6. package/bin/utils/project-utils.js +49 -0
  7. package/package.json +4 -2
  8. package/templates/react-native/expo-clean-architecture/README.md +154 -0
  9. package/templates/react-native/expo-clean-architecture/app.config.ts +61 -0
  10. package/templates/react-native/expo-clean-architecture/assets/config/.gitkeep +3 -0
  11. package/templates/react-native/expo-clean-architecture/assets/fonts/SpaceMono-Regular.ttf +0 -0
  12. package/templates/react-native/expo-clean-architecture/assets/images/adaptive-icon.png +0 -0
  13. package/templates/react-native/expo-clean-architecture/assets/images/favicon.png +0 -0
  14. package/templates/react-native/expo-clean-architecture/assets/images/icon.png +0 -0
  15. package/templates/react-native/expo-clean-architecture/assets/images/partial-react-logo.png +0 -0
  16. package/templates/react-native/expo-clean-architecture/assets/images/react-logo.png +0 -0
  17. package/templates/react-native/expo-clean-architecture/assets/images/react-logo@2x.png +0 -0
  18. package/templates/react-native/expo-clean-architecture/assets/images/react-logo@3x.png +0 -0
  19. package/templates/react-native/expo-clean-architecture/assets/images/splash-icon.png +0 -0
  20. package/templates/react-native/expo-clean-architecture/babel.config.js +11 -0
  21. package/templates/react-native/expo-clean-architecture/docs/00-introduction.md +3 -0
  22. package/templates/react-native/expo-clean-architecture/docs/01-architecture.md +107 -0
  23. package/templates/react-native/expo-clean-architecture/package.json +78 -0
  24. package/templates/react-native/expo-clean-architecture/scripts/clean-src.sh +48 -0
  25. package/templates/react-native/expo-clean-architecture/scripts/generate-feature.sh +40 -0
  26. package/templates/react-native/expo-clean-architecture/src/app/(protected)/(tabs)/_layout.tsx +42 -0
  27. package/templates/react-native/expo-clean-architecture/src/app/(protected)/(tabs)/favorites.tsx +72 -0
  28. package/templates/react-native/expo-clean-architecture/src/app/(protected)/(tabs)/home.tsx +122 -0
  29. package/templates/react-native/expo-clean-architecture/src/app/(protected)/(tabs)/settings/_layout.tsx +5 -0
  30. package/templates/react-native/expo-clean-architecture/src/app/(protected)/(tabs)/settings/index.tsx +29 -0
  31. package/templates/react-native/expo-clean-architecture/src/app/(protected)/(tabs)/settings/profile.tsx +22 -0
  32. package/templates/react-native/expo-clean-architecture/src/app/(protected)/_layout.tsx +20 -0
  33. package/templates/react-native/expo-clean-architecture/src/app/(protected)/details.tsx +124 -0
  34. package/templates/react-native/expo-clean-architecture/src/app/(public)/_layout.tsx +18 -0
  35. package/templates/react-native/expo-clean-architecture/src/app/(public)/login.tsx +31 -0
  36. package/templates/react-native/expo-clean-architecture/src/app/_layout.tsx +33 -0
  37. package/templates/react-native/expo-clean-architecture/src/app/index.tsx +8 -0
  38. package/templates/react-native/expo-clean-architecture/src/core/constants/api-constants.ts +10 -0
  39. package/templates/react-native/expo-clean-architecture/src/core/constants/image-constants.ts +3 -0
  40. package/templates/react-native/expo-clean-architecture/src/core/constants/query-keys.ts +6 -0
  41. package/templates/react-native/expo-clean-architecture/src/core/constants/storage-keys.ts +3 -0
  42. package/templates/react-native/expo-clean-architecture/src/core/design/@types/color-scheme-state.ts +35 -0
  43. package/templates/react-native/expo-clean-architecture/src/core/design/@types/color-scheme.ts +12 -0
  44. package/templates/react-native/expo-clean-architecture/src/core/design/components/app-icon.tsx +16 -0
  45. package/templates/react-native/expo-clean-architecture/src/core/design/components/app-separator.tsx +26 -0
  46. package/templates/react-native/expo-clean-architecture/src/core/design/hooks/use-app-color-scheme.ts +52 -0
  47. package/templates/react-native/expo-clean-architecture/src/core/design/hooks/use-app-fonts.ts +12 -0
  48. package/templates/react-native/expo-clean-architecture/src/core/design/hooks/use-app-styles.ts +28 -0
  49. package/templates/react-native/expo-clean-architecture/src/core/design/theme/app-colors.ts +21 -0
  50. package/templates/react-native/expo-clean-architecture/src/core/design/theme/app-fonts.ts +16 -0
  51. package/templates/react-native/expo-clean-architecture/src/core/design/theme/app-sizes.ts +14 -0
  52. package/templates/react-native/expo-clean-architecture/src/core/di/injection-container.ts +53 -0
  53. package/templates/react-native/expo-clean-architecture/src/core/errors/index.ts +1 -0
  54. package/templates/react-native/expo-clean-architecture/src/core/helpers/@types.ts +23 -0
  55. package/templates/react-native/expo-clean-architecture/src/core/helpers/rest-client.ts +144 -0
  56. package/templates/react-native/expo-clean-architecture/src/core/helpers/result.ts +37 -0
  57. package/templates/react-native/expo-clean-architecture/src/core/helpers/usecase.ts +5 -0
  58. package/templates/react-native/expo-clean-architecture/src/core/hooks/use-network.ts +18 -0
  59. package/templates/react-native/expo-clean-architecture/src/core/i18n/@types/i18next.d.ts +11 -0
  60. package/templates/react-native/expo-clean-architecture/src/core/i18n/index.ts +19 -0
  61. package/templates/react-native/expo-clean-architecture/src/core/i18n/translations/fr.json +12 -0
  62. package/templates/react-native/expo-clean-architecture/src/core/services/local-storage-service-impl.ts +29 -0
  63. package/templates/react-native/expo-clean-architecture/src/core/services/local-storage-service.ts +26 -0
  64. package/templates/react-native/expo-clean-architecture/src/core/services/monitoring-service-impl.ts +15 -0
  65. package/templates/react-native/expo-clean-architecture/src/core/services/monitoring-service.ts +13 -0
  66. package/templates/react-native/expo-clean-architecture/src/core/services/network-service-impl.ts +40 -0
  67. package/templates/react-native/expo-clean-architecture/src/core/services/network-service.ts +16 -0
  68. package/templates/react-native/expo-clean-architecture/src/features/auth/@types/session-state.ts +38 -0
  69. package/templates/react-native/expo-clean-architecture/src/features/auth/@types/session-status-enum.ts +16 -0
  70. package/templates/react-native/expo-clean-architecture/src/features/auth/presentation/hooks/use-session.ts +18 -0
  71. package/templates/react-native/expo-clean-architecture/src/features/favorites/data/datasources/favorites-datasource-impl.ts +25 -0
  72. package/templates/react-native/expo-clean-architecture/src/features/favorites/data/datasources/favorites-datasource.ts +5 -0
  73. package/templates/react-native/expo-clean-architecture/src/features/favorites/data/repositories/favorites-repository-impl.ts +46 -0
  74. package/templates/react-native/expo-clean-architecture/src/features/favorites/domain/repositories/favorites-repository.ts +8 -0
  75. package/templates/react-native/expo-clean-architecture/src/features/favorites/domain/usecases/add-to-favorites-usecase.ts +23 -0
  76. package/templates/react-native/expo-clean-architecture/src/features/favorites/domain/usecases/clear-favorites-usecase.ts +23 -0
  77. package/templates/react-native/expo-clean-architecture/src/features/favorites/domain/usecases/get-favorites-usecase.ts +24 -0
  78. package/templates/react-native/expo-clean-architecture/src/features/favorites/domain/usecases/remove-from-favorites-usecase.ts +23 -0
  79. package/templates/react-native/expo-clean-architecture/src/features/favorites/presentation/components/favorites-card.tsx +77 -0
  80. package/templates/react-native/expo-clean-architecture/src/features/favorites/presentation/hooks/use-add-favorite.ts +24 -0
  81. package/templates/react-native/expo-clean-architecture/src/features/favorites/presentation/hooks/use-clear-favorites.ts +22 -0
  82. package/templates/react-native/expo-clean-architecture/src/features/favorites/presentation/hooks/use-favorites.ts +22 -0
  83. package/templates/react-native/expo-clean-architecture/src/features/favorites/presentation/hooks/use-remove-favorite.ts +24 -0
  84. package/templates/react-native/expo-clean-architecture/src/features/movies/data/datasources/movies-datasource-impl.ts +50 -0
  85. package/templates/react-native/expo-clean-architecture/src/features/movies/data/datasources/movies-datasource.ts +8 -0
  86. package/templates/react-native/expo-clean-architecture/src/features/movies/data/models/movie-details-model.ts +67 -0
  87. package/templates/react-native/expo-clean-architecture/src/features/movies/data/models/movie-model.ts +30 -0
  88. package/templates/react-native/expo-clean-architecture/src/features/movies/data/models/tmdb-response-model.ts +6 -0
  89. package/templates/react-native/expo-clean-architecture/src/features/movies/data/repositories/movies-repository-impl.ts +34 -0
  90. package/templates/react-native/expo-clean-architecture/src/features/movies/domain/entities/movie-details-entity.ts +28 -0
  91. package/templates/react-native/expo-clean-architecture/src/features/movies/domain/entities/movie-entity.ts +6 -0
  92. package/templates/react-native/expo-clean-architecture/src/features/movies/domain/repositories/movies-repository.ts +25 -0
  93. package/templates/react-native/expo-clean-architecture/src/features/movies/domain/usecases/get-movie-details-usecase.ts +26 -0
  94. package/templates/react-native/expo-clean-architecture/src/features/movies/domain/usecases/get-random-movies-usecase.ts +24 -0
  95. package/templates/react-native/expo-clean-architecture/src/features/movies/domain/usecases/search-movies-usecase.ts +23 -0
  96. package/templates/react-native/expo-clean-architecture/src/features/movies/presentation/components/movie-tile.tsx +69 -0
  97. package/templates/react-native/expo-clean-architecture/src/features/movies/presentation/hooks/use-movie-details.ts +22 -0
  98. package/templates/react-native/expo-clean-architecture/src/features/movies/presentation/hooks/use-random-movies.ts +22 -0
  99. package/templates/react-native/expo-clean-architecture/src/features/movies/presentation/hooks/use-search-movies.ts +22 -0
  100. package/templates/react-native/expo-clean-architecture/tests/core/services/local-storage-service-impl.test.ts +108 -0
  101. package/templates/react-native/expo-clean-architecture/tests/core/services/monitoring-service.test.ts +74 -0
  102. package/templates/react-native/expo-clean-architecture/tests/core/services/network-service.test.ts +117 -0
  103. package/templates/react-native/expo-clean-architecture/tests/features/auth/presentation/hooks/use-session.test.ts +69 -0
  104. package/templates/react-native/expo-clean-architecture/tests/features/favorites/data/datasources/favorites-datasource.test.ts +69 -0
  105. package/templates/react-native/expo-clean-architecture/tests/features/favorites/data/repositories/favorites-repository-impl.test.ts +124 -0
  106. package/templates/react-native/expo-clean-architecture/tests/features/favorites/domain/usecases/add-to-favorites-usecase.test.ts +54 -0
  107. package/templates/react-native/expo-clean-architecture/tests/features/favorites/domain/usecases/clear-favorites-usecase.test.ts +44 -0
  108. package/templates/react-native/expo-clean-architecture/tests/features/favorites/domain/usecases/get-favorites-usecase.test.ts +74 -0
  109. package/templates/react-native/expo-clean-architecture/tests/features/favorites/domain/usecases/remove-from-favorites-usecase.test.ts +52 -0
  110. package/templates/react-native/expo-clean-architecture/tests/setup.ts +9 -0
  111. package/templates/react-native/expo-clean-architecture/tsconfig.json +20 -0
@@ -0,0 +1,74 @@
1
+ import { GetFavoritesUsecase } from "@/features/favorites/domain/usecases/get-favorites-usecase";
2
+ import { FavoritesRepository } from "@/features/favorites/domain/repositories/favorites-repository";
3
+ import { MovieEntity } from "@/features/movies/domain/entities/movie-entity";
4
+
5
+ describe("GetFavoritesUsecase", () => {
6
+ let usecase: GetFavoritesUsecase;
7
+ let mockFavoritesRepository: jest.Mocked<FavoritesRepository>;
8
+
9
+ const mockMovies: MovieEntity[] = [
10
+ {
11
+ id: "123",
12
+ title: "Test Movie 1",
13
+ description: "Test Description 1",
14
+ image: "test-image-1.jpg",
15
+ },
16
+ {
17
+ id: "456",
18
+ title: "Test Movie 2",
19
+ description: "Test Description 2",
20
+ image: "test-image-2.jpg",
21
+ },
22
+ ];
23
+
24
+ beforeEach(() => {
25
+ mockFavoritesRepository = {
26
+ getFavorites: jest.fn(),
27
+ addFavorite: jest.fn(),
28
+ removeFavorite: jest.fn(),
29
+ clearFavorites: jest.fn(),
30
+ };
31
+
32
+ usecase = new GetFavoritesUsecase(mockFavoritesRepository);
33
+ });
34
+
35
+ it("should successfully get all favorites", async () => {
36
+ // Arrange
37
+ mockFavoritesRepository.getFavorites.mockResolvedValue(mockMovies);
38
+
39
+ // Act
40
+ const result = await usecase.execute();
41
+
42
+ // Assert
43
+ expect(result.isSuccess).toBe(true);
44
+ expect(result.data).toEqual(mockMovies);
45
+ expect(mockFavoritesRepository.getFavorites).toHaveBeenCalledTimes(1);
46
+ });
47
+
48
+ it("should return empty array when no favorites exist", async () => {
49
+ // Arrange
50
+ mockFavoritesRepository.getFavorites.mockResolvedValue([]);
51
+
52
+ // Act
53
+ const result = await usecase.execute();
54
+
55
+ // Assert
56
+ expect(result.isSuccess).toBe(true);
57
+ expect(result.data).toEqual([]);
58
+ expect(mockFavoritesRepository.getFavorites).toHaveBeenCalledTimes(1);
59
+ });
60
+
61
+ it("should return failure when repository throws an error", async () => {
62
+ // Arrange
63
+ const error = new Error("Failed to get favorites");
64
+ mockFavoritesRepository.getFavorites.mockRejectedValue(error);
65
+
66
+ // Act
67
+ const result = await usecase.execute();
68
+
69
+ // Assert
70
+ expect(result.isFailure).toBe(true);
71
+ expect(result.error).toBe(error);
72
+ expect(mockFavoritesRepository.getFavorites).toHaveBeenCalledTimes(1);
73
+ });
74
+ });
@@ -0,0 +1,52 @@
1
+ import { RemoveFromFavoritesUsecase } from "@/features/favorites/domain/usecases/remove-from-favorites-usecase";
2
+ import { FavoritesRepository } from "@/features/favorites/domain/repositories/favorites-repository";
3
+
4
+ describe("RemoveFromFavoritesUsecase", () => {
5
+ let usecase: RemoveFromFavoritesUsecase;
6
+ let mockFavoritesRepository: jest.Mocked<FavoritesRepository>;
7
+
8
+ const mockMovieId = "123";
9
+
10
+ beforeEach(() => {
11
+ mockFavoritesRepository = {
12
+ getFavorites: jest.fn(),
13
+ addFavorite: jest.fn(),
14
+ removeFavorite: jest.fn(),
15
+ clearFavorites: jest.fn(),
16
+ };
17
+
18
+ usecase = new RemoveFromFavoritesUsecase(mockFavoritesRepository);
19
+ });
20
+
21
+ it("should successfully remove a movie from favorites", async () => {
22
+ // Arrange
23
+ mockFavoritesRepository.removeFavorite.mockResolvedValue();
24
+
25
+ // Act
26
+ const result = await usecase.execute(mockMovieId);
27
+
28
+ // Assert
29
+ expect(result.isSuccess).toBe(true);
30
+ expect(mockFavoritesRepository.removeFavorite).toHaveBeenCalledWith(
31
+ mockMovieId
32
+ );
33
+ expect(mockFavoritesRepository.removeFavorite).toHaveBeenCalledTimes(1);
34
+ });
35
+
36
+ it("should return failure when repository throws an error", async () => {
37
+ // Arrange
38
+ const error = new Error("Failed to remove favorite");
39
+ mockFavoritesRepository.removeFavorite.mockRejectedValue(error);
40
+
41
+ // Act
42
+ const result = await usecase.execute(mockMovieId);
43
+
44
+ // Assert
45
+ expect(result.isFailure).toBe(true);
46
+ expect(result.error).toBe(error);
47
+ expect(mockFavoritesRepository.removeFavorite).toHaveBeenCalledWith(
48
+ mockMovieId
49
+ );
50
+ expect(mockFavoritesRepository.removeFavorite).toHaveBeenCalledTimes(1);
51
+ });
52
+ });
@@ -0,0 +1,9 @@
1
+ import "@testing-library/jest-native/extend-expect";
2
+
3
+ // Mock AsyncStorage
4
+ jest.mock("@react-native-async-storage/async-storage", () => ({
5
+ getItem: jest.fn(),
6
+ setItem: jest.fn(),
7
+ removeItem: jest.fn(),
8
+ clear: jest.fn(),
9
+ }));
@@ -0,0 +1,20 @@
1
+ {
2
+ "extends": "expo/tsconfig.base",
3
+ "compilerOptions": {
4
+ "strict": true,
5
+ "experimentalDecorators": true,
6
+ "emitDecoratorMetadata": true,
7
+ "resolveJsonModule": true,
8
+ "paths": {
9
+ "@/*": ["./src/*"]
10
+ }
11
+ },
12
+ "include": [
13
+ "**/*.ts",
14
+ "**/*.tsx",
15
+ ".expo/types/**/*.ts",
16
+ "expo-env.d.ts",
17
+ "env.d.ts",
18
+ "plugins/**/*.ts"
19
+ ]
20
+ }