diff --git a/garage-workspace/garage/.editorconfig b/garage-workspace/garage/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..f166060da1cbc9f216e9f5e99a1ef6074ce2a8f8 --- /dev/null +++ b/garage-workspace/garage/.editorconfig @@ -0,0 +1,17 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single +ij_typescript_use_double_quotes = false + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/garage-workspace/garage/.editorconfig:Zone.Identifier b/garage-workspace/garage/.editorconfig:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/.gitignore b/garage-workspace/garage/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..cc7b141350ffde43afce3ec16ea4d7b5007cde2b --- /dev/null +++ b/garage-workspace/garage/.gitignore @@ -0,0 +1,42 @@ +# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db diff --git a/garage-workspace/garage/.gitignore:Zone.Identifier b/garage-workspace/garage/.gitignore:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/.nvmrc b/garage-workspace/garage/.nvmrc new file mode 100644 index 0000000000000000000000000000000000000000..ee09fac75c8313bd5bfd3edfe0f8b90baefb782b --- /dev/null +++ b/garage-workspace/garage/.nvmrc @@ -0,0 +1 @@ +v20.11.1 diff --git a/garage-workspace/garage/.nvmrc:Zone.Identifier b/garage-workspace/garage/.nvmrc:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/.postcssrc.json b/garage-workspace/garage/.postcssrc.json new file mode 100644 index 0000000000000000000000000000000000000000..e092dc7c1ef60daccbdd481b8be40b4937df0d25 --- /dev/null +++ b/garage-workspace/garage/.postcssrc.json @@ -0,0 +1,5 @@ +{ + "plugins": { + "@tailwindcss/postcss": {} + } +} diff --git a/garage-workspace/garage/.postcssrc.json:Zone.Identifier b/garage-workspace/garage/.postcssrc.json:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/.prettierignore b/garage-workspace/garage/.prettierignore new file mode 100644 index 0000000000000000000000000000000000000000..6bf7e4cec1e483c8777129135a755650fb3740db --- /dev/null +++ b/garage-workspace/garage/.prettierignore @@ -0,0 +1,4 @@ +dist/ +node_modules/ +package-lock.json +pnpm-lock.yaml \ No newline at end of file diff --git a/garage-workspace/garage/.prettierignore:Zone.Identifier b/garage-workspace/garage/.prettierignore:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/.prettierrc.json b/garage-workspace/garage/.prettierrc.json new file mode 100644 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/garage-workspace/garage/.prettierrc.json @@ -0,0 +1 @@ +{} diff --git a/garage-workspace/garage/.prettierrc.json:Zone.Identifier b/garage-workspace/garage/.prettierrc.json:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/README.md b/garage-workspace/garage/README.md new file mode 100644 index 0000000000000000000000000000000000000000..19af0f71893595d6ea80b19efe6010076e2f6064 --- /dev/null +++ b/garage-workspace/garage/README.md @@ -0,0 +1,59 @@ +# Garage + +This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 19.1.4. + +## Development server + +To start a local development server, run: + +```bash +ng serve +``` + +Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files. + +## Code scaffolding + +Angular CLI includes powerful code scaffolding tools. To generate a new component, run: + +```bash +ng generate component component-name +``` + +For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run: + +```bash +ng generate --help +``` + +## Building + +To build the project run: + +```bash +ng build +``` + +This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed. + +## Running unit tests + +To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command: + +```bash +ng test +``` + +## Running end-to-end tests + +For end-to-end (e2e) testing, run: + +```bash +ng e2e +``` + +Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs. + +## Additional Resources + +For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. diff --git a/garage-workspace/garage/README.md:Zone.Identifier b/garage-workspace/garage/README.md:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/angular.json b/garage-workspace/garage/angular.json new file mode 100644 index 0000000000000000000000000000000000000000..0b120bbec4af78efbd1b87cbb3f249ddea9f81ff --- /dev/null +++ b/garage-workspace/garage/angular.json @@ -0,0 +1,113 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "cli": { + "packageManager": "pnpm", + "schematicCollections": ["angular-eslint"] + }, + "newProjectRoot": "projects", + "projects": { + "garage-ui": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "projects/garage-ui", + "sourceRoot": "projects/garage-ui/src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:application", + "options": { + "outputPath": "dist/garage-ui", + "index": "projects/garage-ui/src/index.html", + "browser": "projects/garage-ui/src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "projects/garage-ui/tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "projects/garage-ui/public" + } + ], + "styles": ["projects/garage-ui/src/styles.scss"], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kB", + "maximumError": "1MB" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "4kB", + "maximumError": "8kB" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true, + "fileReplacements": [ + { + "replace": "projects/garage-ui/src/environments/environment.ts", + "with": "projects/garage-ui/src/environments/environment.development.ts" + } + ] + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "garage-ui:build:production" + }, + "development": { + "buildTarget": "garage-ui:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n" + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "polyfills": ["zone.js", "zone.js/testing"], + "tsConfig": "projects/garage-ui/tsconfig.spec.json", + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "projects/garage-ui/public" + } + ], + "styles": ["projects/garage-ui/src/styles.scss"], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": [ + "projects/garage-ui/**/*.ts", + "projects/garage-ui/**/*.html" + ], + "eslintConfig": "projects/garage-ui/eslint.config.js" + } + } + } + } + } +} diff --git a/garage-workspace/garage/angular.json:Zone.Identifier b/garage-workspace/garage/angular.json:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/eslint.config.js b/garage-workspace/garage/eslint.config.js new file mode 100644 index 0000000000000000000000000000000000000000..8379fae3b476ed6d2a4edadc8aa7d78cb3b65270 --- /dev/null +++ b/garage-workspace/garage/eslint.config.js @@ -0,0 +1,43 @@ +// @ts-check +const eslint = require("@eslint/js"); +const tseslint = require("typescript-eslint"); +const angular = require("angular-eslint"); + +module.exports = tseslint.config( + { + files: ["**/*.ts"], + extends: [ + eslint.configs.recommended, + ...tseslint.configs.recommended, + ...tseslint.configs.stylistic, + ...angular.configs.tsRecommended, + ], + processor: angular.processInlineTemplates, + rules: { + "@angular-eslint/directive-selector": [ + "error", + { + type: "attribute", + prefix: "app", + style: "camelCase", + }, + ], + "@angular-eslint/component-selector": [ + "error", + { + type: "element", + prefix: "app", + style: "kebab-case", + }, + ], + }, + }, + { + files: ["**/*.html"], + extends: [ + ...angular.configs.templateRecommended, + ...angular.configs.templateAccessibility, + ], + rules: {}, + }, +); diff --git a/garage-workspace/garage/eslint.config.js:Zone.Identifier b/garage-workspace/garage/eslint.config.js:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/package.json b/garage-workspace/garage/package.json new file mode 100644 index 0000000000000000000000000000000000000000..52755a34e01019d2a39d316f3b59f7233b5df8e2 --- /dev/null +++ b/garage-workspace/garage/package.json @@ -0,0 +1,55 @@ +{ + "name": "garage", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng dev", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test", + "lint": "ng lint && prettier --check .", + "format": "prettier --write ." + }, + "private": true, + "dependencies": { + "@angular/animations": "^19.1.0", + "@angular/common": "^19.1.0", + "@angular/compiler": "^19.1.0", + "@angular/core": "^19.1.0", + "@angular/forms": "^19.1.0", + "@angular/platform-browser": "^19.1.0", + "@angular/platform-browser-dynamic": "^19.1.0", + "@angular/router": "^19.1.0", + "@fortawesome/angular-fontawesome": "1.0.0", + "@fortawesome/free-brands-svg-icons": "^6.7.1", + "@fortawesome/free-regular-svg-icons": "^6.7.1", + "@fortawesome/free-solid-svg-icons": "^6.7.1", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.15.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^19.1.4", + "@angular/cli": "^19.1.4", + "@angular/compiler-cli": "^19.1.0", + "@tailwindcss/postcss": "^4.0.0", + "@types/jasmine": "~5.1.0", + "angular-eslint": "19.0.2", + "daisyui": "5.0.0-beta.2", + "eslint": "^9.16.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-prettier": "^5.2.3", + "jasmine-core": "~5.5.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "postcss": "^8.5.1", + "prettier": "^3.4.2", + "prettier-eslint": "^16.3.0", + "tailwindcss": "^4.0.0", + "typescript": "~5.7.2", + "typescript-eslint": "8.18.0" + } +} diff --git a/garage-workspace/garage/package.json:Zone.Identifier b/garage-workspace/garage/package.json:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/eslint.config.js b/garage-workspace/garage/projects/garage-ui/eslint.config.js new file mode 100644 index 0000000000000000000000000000000000000000..3614e93288c8c05af0c799443e55e64fe4c77abd --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/eslint.config.js @@ -0,0 +1,32 @@ +// @ts-check +const tseslint = require("typescript-eslint"); +const rootConfig = require("../../eslint.config.js"); + +module.exports = tseslint.config( + ...rootConfig, + { + files: ["**/*.ts"], + rules: { + "@angular-eslint/directive-selector": [ + "error", + { + type: "attribute", + prefix: "app", + style: "camelCase", + }, + ], + "@angular-eslint/component-selector": [ + "error", + { + type: "element", + prefix: "app", + style: "kebab-case", + }, + ], + }, + }, + { + files: ["**/*.html"], + rules: {}, + }, +); diff --git a/garage-workspace/garage/projects/garage-ui/eslint.config.js:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/eslint.config.js:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/public/favicon.ico b/garage-workspace/garage/projects/garage-ui/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..57614f9c967596fad0a3989bec2b1deff33034f6 Binary files /dev/null and b/garage-workspace/garage/projects/garage-ui/public/favicon.ico differ diff --git a/garage-workspace/garage/projects/garage-ui/public/favicon.ico:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/public/favicon.ico:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/app/app.component.ts b/garage-workspace/garage/projects/garage-ui/src/app/app.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..6a3f56ccbc0fddf1d6db6652def585639e8cc883 --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/src/app/app.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; + +@Component({ + selector: 'app-root', + imports: [RouterOutlet], + template: `<router-outlet />`, + styleUrl: './app.component.scss', +}) +export class AppComponent {} diff --git a/garage-workspace/garage/projects/garage-ui/src/app/app.component.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/app.component.ts:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/app/app.config.ts b/garage-workspace/garage/projects/garage-ui/src/app/app.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..cad493aae75e2dea0acbf7251a75be0370449c10 --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/src/app/app.config.ts @@ -0,0 +1,29 @@ +import { + type ApplicationConfig, + provideZoneChangeDetection, +} from '@angular/core'; +import { provideRouter } from '@angular/router'; + +import { provideHttpClient } from '@angular/common/http'; +import { routes } from './app.routes'; +import { CarGateway } from '@core/cars/ports/car.gateway'; +import { InMemoryCarGateway } from '@core/cars/adapters/in-memory-car.gateway'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(routes), + provideHttpClient(), + { + provide: CarGateway, + useFactory: () => + new InMemoryCarGateway().withCars( + [ + { id: 1, brand: 'Audi', model: 'A3', year: 2019, color: 'red' }, + { id: 2, brand: 'Audi', model: 'RS3', year: 2024, color: 'black' }, + { id: 3, brand: 'Audi', model: 'Q2', year: 2016, color: 'yellow' }, + ] + ), + }, + ], +}; diff --git a/garage-workspace/garage/projects/garage-ui/src/app/app.config.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/app.config.ts:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/app/app.routes.ts b/garage-workspace/garage/projects/garage-ui/src/app/app.routes.ts new file mode 100644 index 0000000000000000000000000000000000000000..0ffb48756834d80904e345078fe427289ddef994 --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/src/app/app.routes.ts @@ -0,0 +1,8 @@ +import type { Routes } from '@angular/router'; +import CarsComponent from "@features/cars/cars.component"; + +export const routes: Routes = [ + { path: '', redirectTo: 'car', pathMatch: 'full' }, + { path: 'car', component: CarsComponent }, + { path: '**', redirectTo: 'car', pathMatch: 'full' }, +]; diff --git a/garage-workspace/garage/projects/garage-ui/src/app/app.routes.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/app.routes.ts:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/app/core/cars/adapters/in-memory-car.gateway.ts b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/adapters/in-memory-car.gateway.ts new file mode 100644 index 0000000000000000000000000000000000000000..6caf67f92a713066f81bb683d93f95f8845ca6a9 --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/adapters/in-memory-car.gateway.ts @@ -0,0 +1,16 @@ +import { CarGateway } from '@core/cars/ports/car.gateway'; +import { Observable, of } from 'rxjs'; +import { Cars } from '@core/cars/models/car.model'; + +export class InMemoryCarGateway extends CarGateway { + private cars: Cars = []; + + withCars(cars: Cars): InMemoryCarGateway { + this.cars = cars; + return this; + } + + getAll(): Observable<Cars> { + return of(this.cars); + } +} diff --git a/garage-workspace/garage/projects/garage-ui/src/app/core/cars/adapters/in-memory-car.gateway.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/adapters/in-memory-car.gateway.ts:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/app/core/cars/models/car.model.ts b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/models/car.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..bbf61cb7e615988fa270b80525dd740b132c0e2f --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/models/car.model.ts @@ -0,0 +1,9 @@ +export interface Car { + id: number; + brand: string; + model: string; + year: number; + color: string; +} + +export type Cars = Car[]; diff --git a/garage-workspace/garage/projects/garage-ui/src/app/core/cars/models/car.model.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/models/car.model.ts:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/app/core/cars/ports/car.gateway.ts b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/ports/car.gateway.ts new file mode 100644 index 0000000000000000000000000000000000000000..ef890e4a0fff0668f0ff3119348635ab00ab3cd8 --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/ports/car.gateway.ts @@ -0,0 +1,6 @@ +import { Observable } from 'rxjs'; +import { Cars } from '@core/cars/models/car.model'; + +export abstract class CarGateway { + abstract getAll(): Observable<Cars>; +} diff --git a/garage-workspace/garage/projects/garage-ui/src/app/core/cars/ports/car.gateway.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/ports/car.gateway.ts:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.html b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.html new file mode 100644 index 0000000000000000000000000000000000000000..3287aeb05c34d890d03c49fd103d3df8ef358480 --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.html @@ -0,0 +1,28 @@ +<div class="container mx-auto py-6"> + <h1 class="text-4xl font-bold text-center mb-6">My cars</h1> + + <div class="overflow-x-auto"> + <table class="table table-zebra w-full"> + <thead> + <tr> + <th>#</th> + <th>Brand</th> + <th>Model</th> + <th>Year</th> + <th>Color</th> + <th>Actions</th> + </tr> + </thead> + @for (car of cars(); track car.id) { + <tr> + <td>{{ car.id }}</td> + <td>{{ car.brand }}</td> + <td>{{ car.model }}</td> + <td>{{ car.year }}</td> + <td>{{ car.color }}</td> + <td>Modify | Delete</td> + </tr> + } + </table> + </div> +</div> \ No newline at end of file diff --git a/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.html:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.html:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.scss b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.scss:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.scss:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.ts b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..ddc06943a60ef23f4b2fca29f55bee7b6834024d --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.ts @@ -0,0 +1,15 @@ +import { Component, inject } from "@angular/core"; +import { CarGateway } from "@core/cars/ports/car.gateway"; +import { toSignal } from "@angular/core/rxjs-interop"; +import { AsyncPipe } from "@angular/common"; + +@Component({ + selector: 'app-cars', + imports: [], + templateUrl: './cars.component.html', + styleUrl: './cars.component.scss', +}) +export default class CarsComponent { + private readonly carGateway = inject(CarGateway); + cars = toSignal(this.carGateway.getAll()); +} diff --git a/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.ts:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/environments/environment.development.ts b/garage-workspace/garage/projects/garage-ui/src/environments/environment.development.ts new file mode 100644 index 0000000000000000000000000000000000000000..f274e5edf297c322280400000710ffbfd88f7711 --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/src/environments/environment.development.ts @@ -0,0 +1 @@ +export const environment = {}; diff --git a/garage-workspace/garage/projects/garage-ui/src/environments/environment.development.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/environments/environment.development.ts:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/environments/environment.ts b/garage-workspace/garage/projects/garage-ui/src/environments/environment.ts new file mode 100644 index 0000000000000000000000000000000000000000..f274e5edf297c322280400000710ffbfd88f7711 --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/src/environments/environment.ts @@ -0,0 +1 @@ +export const environment = {}; diff --git a/garage-workspace/garage/projects/garage-ui/src/environments/environment.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/environments/environment.ts:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/index.html b/garage-workspace/garage/projects/garage-ui/src/index.html new file mode 100644 index 0000000000000000000000000000000000000000..2163e364e5e6bdddd2b331e30d1233b340439e2b --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/src/index.html @@ -0,0 +1,13 @@ +<!doctype html> +<html data-theme="light" lang="en"> + <head> + <meta charset="utf-8" /> + <title>GarageUi</title> + <base href="/" /> + <meta content="width=device-width, initial-scale=1" name="viewport" /> + <link href="favicon.ico" rel="icon" type="image/x-icon" /> + </head> + <body> + <app-root></app-root> + </body> +</html> diff --git a/garage-workspace/garage/projects/garage-ui/src/index.html:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/index.html:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/main.ts b/garage-workspace/garage/projects/garage-ui/src/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..f3a7223da6dfe8bb71515d18071d24bf49ad89d9 --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/src/main.ts @@ -0,0 +1,7 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { AppComponent } from './app/app.component'; +import { appConfig } from './app/app.config'; + +bootstrapApplication(AppComponent, appConfig).catch((err) => + console.error(err), +); diff --git a/garage-workspace/garage/projects/garage-ui/src/main.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/main.ts:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/src/styles.scss b/garage-workspace/garage/projects/garage-ui/src/styles.scss new file mode 100644 index 0000000000000000000000000000000000000000..811169a27bdcd4789973fd16d85ad2e8dc03bf6c --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/src/styles.scss @@ -0,0 +1,7 @@ +@use "tailwindcss"; + +@plugin "daisyui" { + themes: + light --default, + black --prefersdark; +} diff --git a/garage-workspace/garage/projects/garage-ui/src/styles.scss:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/styles.scss:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/tsconfig.app.json b/garage-workspace/garage/projects/garage-ui/tsconfig.app.json new file mode 100644 index 0000000000000000000000000000000000000000..3f672ccab2c28a04fa89a17ad65d1bbd7a6004b1 --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/tsconfig.app.json @@ -0,0 +1,11 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/app", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts"] +} diff --git a/garage-workspace/garage/projects/garage-ui/tsconfig.app.json:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/tsconfig.app.json:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/projects/garage-ui/tsconfig.spec.json b/garage-workspace/garage/projects/garage-ui/tsconfig.spec.json new file mode 100644 index 0000000000000000000000000000000000000000..4fd89a209e50c2201140ed1c7841fc58b2f35756 --- /dev/null +++ b/garage-workspace/garage/projects/garage-ui/tsconfig.spec.json @@ -0,0 +1,10 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": ["jasmine"] + }, + "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] +} diff --git a/garage-workspace/garage/projects/garage-ui/tsconfig.spec.json:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/tsconfig.spec.json:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/garage-workspace/garage/tsconfig.json b/garage-workspace/garage/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..f3656be67b6e5fbc974a011b01492b8422641d46 --- /dev/null +++ b/garage-workspace/garage/tsconfig.json @@ -0,0 +1,35 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./projects/garage-ui/src", + "paths": { + "@app/*": ["app/*"], + "@env/*": ["environments/*"], + "@core/*": ["app/core/*"], + "@shared/*": ["app/shared/*"], + "@features/*": ["app/features/*"] + }, + "outDir": "./dist/out-tsc", + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "isolatedModules": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "moduleResolution": "bundler", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/garage-workspace/garage/tsconfig.json:Zone.Identifier b/garage-workspace/garage/tsconfig.json:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391