Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Build artifacts
node_modules
dist
coverage
*.log

# Git
.git
.gitignore
.github

# IDE
.vscode
.idea
*.swp
*.swo

# Environment files
.env
.env.*

# Frontend workspace (not needed for backend build)
frontend/node_modules
frontend/dist

# Infra workspace (not needed for backend build)
infra/node_modules
infra/cdk.out

# Test files
**/*.spec.ts
**/*.e2e-spec.ts
test/

# Documentation
README.md
*.md
docs/

# Docker files
Dockerfile
docker-compose*.yml
compose/
5 changes: 2 additions & 3 deletions .github/workflows/backend-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,12 @@ jobs:
- name: Login to ECR
uses: aws-actions/amazon-ecr-login@v2

- name: Build backend Docker image (backend context)
- name: Build backend Docker image (monorepo context)
shell: bash
working-directory: backend
run: |
set -euo pipefail
IMAGE_URI="${{ steps.cf.outputs.ecr_repo_uri }}:${{ github.sha }}"
docker build -t "$IMAGE_URI" -f docker/Dockerfile .
docker build -t "$IMAGE_URI" -f backend/docker/Dockerfile .

- name: Push backend image to ECR
shell: bash
Expand Down
2 changes: 2 additions & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
fund=false
audit=false
10 changes: 5 additions & 5 deletions frontend/.prettierrc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"printWidth": 100,
"singleQuote": true,
"semi": true,
"trailingComma": "all"
}
"printWidth": 100,
"singleQuote": true,
"semi": true,
"trailingComma": "all"
}
98 changes: 46 additions & 52 deletions frontend/eslint.config.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
// eslint.config.js (ESLint v9+ flat config)
import js from "@eslint/js";
import globals from "globals";
import js from '@eslint/js';
import globals from 'globals';

import tsParser from "@typescript-eslint/parser";
import tsPlugin from "@typescript-eslint/eslint-plugin";
import tsParser from '@typescript-eslint/parser';
import tsPlugin from '@typescript-eslint/eslint-plugin';

import reactPlugin from "eslint-plugin-react";
import reactHooksPlugin from "eslint-plugin-react-hooks";
import reactRefreshPlugin from "eslint-plugin-react-refresh";
import reactPlugin from 'eslint-plugin-react';
import reactHooksPlugin from 'eslint-plugin-react-hooks';
import reactRefreshPlugin from 'eslint-plugin-react-refresh';

import importPlugin from "eslint-plugin-import";
import simpleImportSortPlugin from "eslint-plugin-simple-import-sort";
import unusedImportsPlugin from "eslint-plugin-unused-imports";
import importPlugin from 'eslint-plugin-import';
import simpleImportSortPlugin from 'eslint-plugin-simple-import-sort';
import unusedImportsPlugin from 'eslint-plugin-unused-imports';

import prettierPlugin from "eslint-plugin-prettier";
import prettierConfig from "eslint-config-prettier";
import prettierPlugin from 'eslint-plugin-prettier';
import prettierConfig from 'eslint-config-prettier';

export default [
// Ignore build output etc.
{
ignores: ["dist/**", "node_modules/**"],
ignores: ['dist/**', 'node_modules/**'],
},

// Base JS recommended rules
Expand All @@ -30,12 +30,12 @@ export default [

// TypeScript + React rules
{
files: ["src/**/*.{ts,tsx}"],
files: ['src/**/*.{ts,tsx}'],
languageOptions: {
parser: tsParser,
parserOptions: {
ecmaVersion: "latest",
sourceType: "module",
ecmaVersion: 'latest',
sourceType: 'module',
ecmaFeatures: { jsx: true },
// Enables type-aware linting if you want it later:
// project: ["./tsconfig.app.json", "./tsconfig.node.json"],
Expand All @@ -46,79 +46,73 @@ export default [
},
},
settings: {
react: { version: "detect" },
"import/resolver": {
react: { version: 'detect' },
'import/resolver': {
// Makes eslint-plugin-import understand TS paths like "@/..."
typescript: {
project: ["./tsconfig.app.json", "./tsconfig.node.json"],
project: ['./tsconfig.app.json', './tsconfig.node.json'],
noWarnOnMultipleProjects: true,
},
},
},
plugins: {
"@typescript-eslint": tsPlugin,
'@typescript-eslint': tsPlugin,
react: reactPlugin,
"react-hooks": reactHooksPlugin,
"react-refresh": reactRefreshPlugin,
'react-hooks': reactHooksPlugin,
'react-refresh': reactRefreshPlugin,
import: importPlugin,
"simple-import-sort": simpleImportSortPlugin,
"unused-imports": unusedImportsPlugin,
'simple-import-sort': simpleImportSortPlugin,
'unused-imports': unusedImportsPlugin,
prettier: prettierPlugin,
},
rules: {
// ---- Prettier
"prettier/prettier": "error",
'prettier/prettier': 'error',

// ---- React
"react/react-in-jsx-scope": "off",
"react/prop-types": "off",
'react/react-in-jsx-scope': 'off',
'react/prop-types': 'off',

// React hooks recommended
...reactHooksPlugin.configs.recommended.rules,

// Vite HMR-friendly: only export components (warn)
"react-refresh/only-export-components": [
"warn",
{ allowConstantExport: true },
],
'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],

// ---- TS clean code
"@typescript-eslint/no-unused-vars": "off",
'@typescript-eslint/no-unused-vars': 'off',

// Remove unused imports + unused vars (underscore allowed)
"unused-imports/no-unused-imports": "error",
"unused-imports/no-unused-vars": [
"warn",
'unused-imports/no-unused-imports': 'error',
'unused-imports/no-unused-vars': [
'warn',
{
vars: "all",
varsIgnorePattern: "^_",
args: "after-used",
argsIgnorePattern: "^_",
vars: 'all',
varsIgnorePattern: '^_',
args: 'after-used',
argsIgnorePattern: '^_',
},
],

// Prefer `import type { ... }`
"@typescript-eslint/consistent-type-imports": [
"error",
{ prefer: "type-imports" },
],
'@typescript-eslint/consistent-type-imports': ['error', { prefer: 'type-imports' }],

// ---- Imports sorting & hygiene
"simple-import-sort/imports": "error",
"simple-import-sort/exports": "error",
'simple-import-sort/imports': 'error',
'simple-import-sort/exports': 'error',

"import/first": "error",
"import/newline-after-import": "error",
"import/no-duplicates": "error",
'import/first': 'error',
'import/newline-after-import': 'error',
'import/no-duplicates': 'error',
},
},

// Optional: allow plain JS config files to be linted too
{
files: ["**/*.{js,cjs,mjs}"],
files: ['**/*.{js,cjs,mjs}'],
languageOptions: {
ecmaVersion: "latest",
sourceType: "module",
ecmaVersion: 'latest',
sourceType: 'module',
globals: {
...globals.node,
...globals.es2022,
Expand All @@ -127,7 +121,7 @@ export default [
},

{
files: ["vite.config.ts", "**/*.config.{ts,js,mjs,cjs}"],
files: ['vite.config.ts', '**/*.config.{ts,js,mjs,cjs}'],
languageOptions: {
globals: {
...globals.node,
Expand Down
20 changes: 14 additions & 6 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,19 @@
"test": "echo \"no tests yet\""
},
"dependencies": {
"@ciscode/template-fe": "^1.0.0",
"@ciscode/ui-authentication-kit": "^1.0.0",
"@ciscode/ui-translate-core": "^1.0.0",
"@iconify/tailwind": "^1.2.0",
"@tanstack/react-query": "^5.90.16",
"filepond": "^4.32.11",
"filepond-plugin-image-preview": "^4.6.12",
"react": "^19.2.0",
"react-dom": "^19.2.0"
"react-cookie": "^8.0.1",
"react-dom": "^19.2.0",
"react-router": "^7.11.0",
"react-router-dom": "^7.11.0",
"tailwindcss-rtl": "^0.9.0"
},
"devDependencies": {
"@eslint/js": "^9.39.2",
Expand All @@ -25,7 +36,7 @@
"@types/react-dom": "^19.2.3",
"@typescript-eslint/eslint-plugin": "^8.53.1",
"@typescript-eslint/parser": "^8.53.1",
"@vitejs/plugin-react": "^5.1.1",
"@vitejs/plugin-react": "^4.3.4",
"autoprefixer": "^10.4.23",
"eslint": "^9.39.2",
"eslint-config-prettier": "^10.1.8",
Expand All @@ -43,9 +54,6 @@
"tailwindcss": "^3.4.19",
"typescript": "~5.9.3",
"typescript-eslint": "^8.46.4",
"vite": "npm:rolldown-vite@7.2.5"
},
"overrides": {
"vite": "npm:rolldown-vite@7.2.5"
"vite": "^5.4.0"
}
}
4 changes: 2 additions & 2 deletions frontend/postcss.config.js → frontend/postcss.config.cjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export default {
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}
};
20 changes: 0 additions & 20 deletions frontend/src/App.tsx

This file was deleted.

5 changes: 5 additions & 0 deletions frontend/src/app/App.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import Router from './router/router';

export default function App() {
return <Router />;
}
48 changes: 48 additions & 0 deletions frontend/src/app/layouts/AppLayout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { Template } from '@ciscode/template-fe';
import { useAuthState } from '@ciscode/ui-authentication-kit';
import { Outlet } from 'react-router-dom';

const AppLayout = () => {
const { logout } = useAuthState();

const sidebarContent = [
{
name: 'Menu',
items: [
{ label: 'Dashboard', path: '/app' },
{ label: 'Profile', path: '/profile' },
],
},
];

return (
<Template
sidebarContent={sidebarContent}
onLogout={logout}
footer={{
blocks: [
<div key="footer" className="ciscod-footer__inner">
<div className="ciscod-footer__content">
<span>© {new Date().getFullYear()} Comptaleyes — All rights reserved</span>

<div className="flex gap-4">
<a href="https://example.com/docs" target="_blank" rel="noreferrer">
Docs
</a>
<a href="https://example.com/support" target="_blank" rel="noreferrer">
Support
</a>
<span>v0.1</span>
</div>
</div>
</div>,
],
className: 'ciscod-footer',
}}
>
<Outlet />
</Template>
);
};

export default AppLayout;
Loading