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.
- package/bin/cli.js +9 -13
- package/bin/commands/create-project.js +106 -0
- package/bin/commands/translate.js +12 -0
- package/bin/config/templates.js +9 -0
- package/bin/utils/file-utils.js +84 -0
- package/bin/utils/project-utils.js +49 -0
- package/package.json +4 -2
- package/templates/react-native/expo-clean-architecture/README.md +154 -0
- package/templates/react-native/expo-clean-architecture/app.config.ts +61 -0
- package/templates/react-native/expo-clean-architecture/assets/config/.gitkeep +3 -0
- package/templates/react-native/expo-clean-architecture/assets/fonts/SpaceMono-Regular.ttf +0 -0
- package/templates/react-native/expo-clean-architecture/assets/images/adaptive-icon.png +0 -0
- package/templates/react-native/expo-clean-architecture/assets/images/favicon.png +0 -0
- package/templates/react-native/expo-clean-architecture/assets/images/icon.png +0 -0
- package/templates/react-native/expo-clean-architecture/assets/images/partial-react-logo.png +0 -0
- package/templates/react-native/expo-clean-architecture/assets/images/react-logo.png +0 -0
- package/templates/react-native/expo-clean-architecture/assets/images/react-logo@2x.png +0 -0
- package/templates/react-native/expo-clean-architecture/assets/images/react-logo@3x.png +0 -0
- package/templates/react-native/expo-clean-architecture/assets/images/splash-icon.png +0 -0
- package/templates/react-native/expo-clean-architecture/babel.config.js +11 -0
- package/templates/react-native/expo-clean-architecture/docs/00-introduction.md +3 -0
- package/templates/react-native/expo-clean-architecture/docs/01-architecture.md +107 -0
- package/templates/react-native/expo-clean-architecture/package.json +78 -0
- package/templates/react-native/expo-clean-architecture/scripts/clean-src.sh +48 -0
- package/templates/react-native/expo-clean-architecture/scripts/generate-feature.sh +40 -0
- package/templates/react-native/expo-clean-architecture/src/app/(protected)/(tabs)/_layout.tsx +42 -0
- package/templates/react-native/expo-clean-architecture/src/app/(protected)/(tabs)/favorites.tsx +72 -0
- package/templates/react-native/expo-clean-architecture/src/app/(protected)/(tabs)/home.tsx +122 -0
- package/templates/react-native/expo-clean-architecture/src/app/(protected)/(tabs)/settings/_layout.tsx +5 -0
- package/templates/react-native/expo-clean-architecture/src/app/(protected)/(tabs)/settings/index.tsx +29 -0
- package/templates/react-native/expo-clean-architecture/src/app/(protected)/(tabs)/settings/profile.tsx +22 -0
- package/templates/react-native/expo-clean-architecture/src/app/(protected)/_layout.tsx +20 -0
- package/templates/react-native/expo-clean-architecture/src/app/(protected)/details.tsx +124 -0
- package/templates/react-native/expo-clean-architecture/src/app/(public)/_layout.tsx +18 -0
- package/templates/react-native/expo-clean-architecture/src/app/(public)/login.tsx +31 -0
- package/templates/react-native/expo-clean-architecture/src/app/_layout.tsx +33 -0
- package/templates/react-native/expo-clean-architecture/src/app/index.tsx +8 -0
- package/templates/react-native/expo-clean-architecture/src/core/constants/api-constants.ts +10 -0
- package/templates/react-native/expo-clean-architecture/src/core/constants/image-constants.ts +3 -0
- package/templates/react-native/expo-clean-architecture/src/core/constants/query-keys.ts +6 -0
- package/templates/react-native/expo-clean-architecture/src/core/constants/storage-keys.ts +3 -0
- package/templates/react-native/expo-clean-architecture/src/core/design/@types/color-scheme-state.ts +35 -0
- package/templates/react-native/expo-clean-architecture/src/core/design/@types/color-scheme.ts +12 -0
- package/templates/react-native/expo-clean-architecture/src/core/design/components/app-icon.tsx +16 -0
- package/templates/react-native/expo-clean-architecture/src/core/design/components/app-separator.tsx +26 -0
- package/templates/react-native/expo-clean-architecture/src/core/design/hooks/use-app-color-scheme.ts +52 -0
- package/templates/react-native/expo-clean-architecture/src/core/design/hooks/use-app-fonts.ts +12 -0
- package/templates/react-native/expo-clean-architecture/src/core/design/hooks/use-app-styles.ts +28 -0
- package/templates/react-native/expo-clean-architecture/src/core/design/theme/app-colors.ts +21 -0
- package/templates/react-native/expo-clean-architecture/src/core/design/theme/app-fonts.ts +16 -0
- package/templates/react-native/expo-clean-architecture/src/core/design/theme/app-sizes.ts +14 -0
- package/templates/react-native/expo-clean-architecture/src/core/di/injection-container.ts +53 -0
- package/templates/react-native/expo-clean-architecture/src/core/errors/index.ts +1 -0
- package/templates/react-native/expo-clean-architecture/src/core/helpers/@types.ts +23 -0
- package/templates/react-native/expo-clean-architecture/src/core/helpers/rest-client.ts +144 -0
- package/templates/react-native/expo-clean-architecture/src/core/helpers/result.ts +37 -0
- package/templates/react-native/expo-clean-architecture/src/core/helpers/usecase.ts +5 -0
- package/templates/react-native/expo-clean-architecture/src/core/hooks/use-network.ts +18 -0
- package/templates/react-native/expo-clean-architecture/src/core/i18n/@types/i18next.d.ts +11 -0
- package/templates/react-native/expo-clean-architecture/src/core/i18n/index.ts +19 -0
- package/templates/react-native/expo-clean-architecture/src/core/i18n/translations/fr.json +12 -0
- package/templates/react-native/expo-clean-architecture/src/core/services/local-storage-service-impl.ts +29 -0
- package/templates/react-native/expo-clean-architecture/src/core/services/local-storage-service.ts +26 -0
- package/templates/react-native/expo-clean-architecture/src/core/services/monitoring-service-impl.ts +15 -0
- package/templates/react-native/expo-clean-architecture/src/core/services/monitoring-service.ts +13 -0
- package/templates/react-native/expo-clean-architecture/src/core/services/network-service-impl.ts +40 -0
- package/templates/react-native/expo-clean-architecture/src/core/services/network-service.ts +16 -0
- package/templates/react-native/expo-clean-architecture/src/features/auth/@types/session-state.ts +38 -0
- package/templates/react-native/expo-clean-architecture/src/features/auth/@types/session-status-enum.ts +16 -0
- package/templates/react-native/expo-clean-architecture/src/features/auth/presentation/hooks/use-session.ts +18 -0
- package/templates/react-native/expo-clean-architecture/src/features/favorites/data/datasources/favorites-datasource-impl.ts +25 -0
- package/templates/react-native/expo-clean-architecture/src/features/favorites/data/datasources/favorites-datasource.ts +5 -0
- package/templates/react-native/expo-clean-architecture/src/features/favorites/data/repositories/favorites-repository-impl.ts +46 -0
- package/templates/react-native/expo-clean-architecture/src/features/favorites/domain/repositories/favorites-repository.ts +8 -0
- package/templates/react-native/expo-clean-architecture/src/features/favorites/domain/usecases/add-to-favorites-usecase.ts +23 -0
- package/templates/react-native/expo-clean-architecture/src/features/favorites/domain/usecases/clear-favorites-usecase.ts +23 -0
- package/templates/react-native/expo-clean-architecture/src/features/favorites/domain/usecases/get-favorites-usecase.ts +24 -0
- package/templates/react-native/expo-clean-architecture/src/features/favorites/domain/usecases/remove-from-favorites-usecase.ts +23 -0
- package/templates/react-native/expo-clean-architecture/src/features/favorites/presentation/components/favorites-card.tsx +77 -0
- package/templates/react-native/expo-clean-architecture/src/features/favorites/presentation/hooks/use-add-favorite.ts +24 -0
- package/templates/react-native/expo-clean-architecture/src/features/favorites/presentation/hooks/use-clear-favorites.ts +22 -0
- package/templates/react-native/expo-clean-architecture/src/features/favorites/presentation/hooks/use-favorites.ts +22 -0
- package/templates/react-native/expo-clean-architecture/src/features/favorites/presentation/hooks/use-remove-favorite.ts +24 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/data/datasources/movies-datasource-impl.ts +50 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/data/datasources/movies-datasource.ts +8 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/data/models/movie-details-model.ts +67 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/data/models/movie-model.ts +30 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/data/models/tmdb-response-model.ts +6 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/data/repositories/movies-repository-impl.ts +34 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/domain/entities/movie-details-entity.ts +28 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/domain/entities/movie-entity.ts +6 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/domain/repositories/movies-repository.ts +25 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/domain/usecases/get-movie-details-usecase.ts +26 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/domain/usecases/get-random-movies-usecase.ts +24 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/domain/usecases/search-movies-usecase.ts +23 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/presentation/components/movie-tile.tsx +69 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/presentation/hooks/use-movie-details.ts +22 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/presentation/hooks/use-random-movies.ts +22 -0
- package/templates/react-native/expo-clean-architecture/src/features/movies/presentation/hooks/use-search-movies.ts +22 -0
- package/templates/react-native/expo-clean-architecture/tests/core/services/local-storage-service-impl.test.ts +108 -0
- package/templates/react-native/expo-clean-architecture/tests/core/services/monitoring-service.test.ts +74 -0
- package/templates/react-native/expo-clean-architecture/tests/core/services/network-service.test.ts +117 -0
- package/templates/react-native/expo-clean-architecture/tests/features/auth/presentation/hooks/use-session.test.ts +69 -0
- package/templates/react-native/expo-clean-architecture/tests/features/favorites/data/datasources/favorites-datasource.test.ts +69 -0
- package/templates/react-native/expo-clean-architecture/tests/features/favorites/data/repositories/favorites-repository-impl.test.ts +124 -0
- package/templates/react-native/expo-clean-architecture/tests/features/favorites/domain/usecases/add-to-favorites-usecase.test.ts +54 -0
- package/templates/react-native/expo-clean-architecture/tests/features/favorites/domain/usecases/clear-favorites-usecase.test.ts +44 -0
- package/templates/react-native/expo-clean-architecture/tests/features/favorites/domain/usecases/get-favorites-usecase.test.ts +74 -0
- package/templates/react-native/expo-clean-architecture/tests/features/favorites/domain/usecases/remove-from-favorites-usecase.test.ts +52 -0
- package/templates/react-native/expo-clean-architecture/tests/setup.ts +9 -0
- 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,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
|
+
}
|