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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
52 changes: 52 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Examples CI

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
test-examples:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
example:
- 01-starter-api
- 02-jwt-authentication
- 03-authorization-rbac
- 04-database-inmemory
- 05-database-postgres
- 06-database-prisma
- 07-file-upload
- 08-events
- 09-message-queue
- 10-redis-cache
- 11-testing
- 12-docker-compose
- 13-micro-api
- 14-interceptors
- 15-openapi-studio

steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: "20"
cache: npm
cache-dependency-path: ${{ matrix.example }}/package-lock.json

- name: Install and test
working-directory: ${{ matrix.example }}
env:
NODE_ENV: test
JWT_SECRET: dev-secret-change-me-min-32-chars-long
SKIP_DB: "1"
run: |
npm ci
if [ "${{ matrix.example }}" = "06-database-prisma" ]; then
npx prisma generate
fi
npm test
5 changes: 5 additions & 0 deletions 01-starter-api/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
APP_NAME=expressots-example
PORT=3000
NODE_ENV=development
LOG_LEVEL=INFO

33 changes: 33 additions & 0 deletions 01-starter-api/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Dependencies
node_modules/

# Build output
dist/
*.tsbuildinfo

# Environment files (except examples)
.env
.env.local
.env.development
.env.test
.env.staging
.env.production
*.env.local
!.env.example

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

# OS
.DS_Store
Thumbs.db

# Testing
coverage/

# Logs
*.log
npm-debug.log*
30 changes: 30 additions & 0 deletions 01-starter-api/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# 01-starter-api

Minimal ExpressoTS v4 REST API: modules, middleware preset, health check, and integration tests.

## Documentation

- [First steps](https://doc.expresso-ts.com/docs/core/first-steps)

## Quick start

```bash
npm install
cp .env.example .env
npm run dev
```

Open `http://localhost:3000/api/` and `http://localhost:3000/api/health`.

## Tests

```bash
npm test
```

## Related examples

| Example | Topic |
| --- | --- |
| [02-jwt-authentication](../02-jwt-authentication/) | JWT auth |
| [11-testing](../11-testing/) | Testing patterns |
43 changes: 43 additions & 0 deletions 01-starter-api/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import js from "@eslint/js";
import tseslint from "typescript-eslint";
import { fileURLToPath } from "node:url";

const __dirname = fileURLToPath(new URL(".", import.meta.url));

export default tseslint.config(
js.configs.recommended,
...tseslint.configs.recommended,
{
files: ["src/**/*.ts", "test/**/*.ts"],
languageOptions: {
parserOptions: {
project: true,
tsconfigRootDir: __dirname,
},
},
rules: {
// TypeScript-specific rules
"@typescript-eslint/no-unused-vars": [
"error",
{
argsIgnorePattern: "^_",
varsIgnorePattern: "^_",
},
],
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-unused-vars": "off",
"@typescript-eslint/no-non-null-assertion": "warn",
},
},
{
ignores: [
"node_modules/**",
"dist/**",
"coverage/**",
"*.config.ts",
"*.config.js",
"*.config.mjs",
],
}
);
24 changes: 24 additions & 0 deletions 01-starter-api/expressots.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { ExpressoConfig, Pattern } from "@expressots/shared";

const config: ExpressoConfig = {
entryPoint: "main",
sourceRoot: "src",
scaffoldPattern: Pattern.KEBAB_CASE,
opinionated: true,
scaffoldSchematics: {
controller: "useCases",
usecase: "useCases",
dto: "useCases",
module: "useCases",
provider: "providers",
entity: "entities",
middleware: "middleware",
interceptor: "interceptors",
event: "events",
handler: "events",
guard: "guards",
config: "config",
},
};

export default config;
26 changes: 26 additions & 0 deletions 01-starter-api/jest.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import type { Config } from "jest";

const config: Config = {
preset: "ts-jest",
testEnvironment: "node",
rootDir: ".",
testMatch: ["<rootDir>/test/**/*.spec.ts"],
moduleNameMapper: {
"^@app/(.*)$": "<rootDir>/src/$1",
"^@useCases/(.*)$": "<rootDir>/src/useCases/$1",
"^@providers/(.*)$": "<rootDir>/src/providers/$1",
"^@entities/(.*)$": "<rootDir>/src/entities/$1",
"^@middleware/(.*)$": "<rootDir>/src/middleware/$1",
"^@interceptors/(.*)$": "<rootDir>/src/interceptors/$1",
"^@events/(.*)$": "<rootDir>/src/events/$1",
"^@guards/(.*)$": "<rootDir>/src/guards/$1",
"^@config/(.*)$": "<rootDir>/src/config/$1",
},
modulePathIgnorePatterns: ["<rootDir>/dist"],
collectCoverageFrom: ["src/**/*.ts", "!src/**/*.d.ts", "!src/main.ts"],
coverageDirectory: "coverage",
coverageReporters: ["text", "lcov"],
forceExit: true,
};

export default config;
Loading
Loading