All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
This project uses football/soccer terminology for release names:
| Letter | Term | Definition | Tag Name |
|---|---|---|---|
| A | Assist | Pass leading to a goal | assist |
| B | Bicycle-kick | Overhead kick | bicyclekick |
| C | Corner | Corner kick | corner |
| D | Dribble | Ball control while moving | dribble |
| E | Equalizer | Goal that ties the score | equalizer |
| F | Foul | Rule violation | foul |
| G | Goal | Scored point | goal |
| H | Header | Ball contact with head | header |
| I | Interception | Stealing the ball | interception |
| J | Juggle | Ball control skill | juggle |
| K | Keeper | Goal defender (Goalkeeper) | keeper |
| L | Lob | High arcing pass/shot | lob |
| M | Marking | Defending an opponent | marking |
| N | Nutmeg | Passing ball through legs | nutmeg |
| O | Offside | Position rule violation | offside |
| P | Penalty | Free kick from penalty spot | penalty |
| Q | Quick-throw | Fast throw-in | quickthrow |
| R | Red-card | Player ejection | redcard |
| S | Save | Goalkeeper blocking shot | save |
| T | Tackle | Challenging for the ball | tackle |
| U | Upset | Underdog victory | upset |
| V | Volley | Kicking ball in midair | volley |
| W | Wing | Side area of field | wing |
| X | X-Pass | Diagonal crossing pass | xpass |
| Y | Yellow-card | Caution warning | yellowcard |
| Z | Zone-defense | Area marking strategy | zonedefense |
- 15 substitute players seeded in
storage/players-sqlite3.db
- Player dataset normalised to November 2022 World Cup snapshot: Enzo Fernández (SL Benfica / Liga Portugal), Mac Allister (Brighton & Hove Albion), Messi (Paris Saint-Germain / Ligue 1), Di María
abbrPosition→RW - Player UUIDs replaced with deterministic UUID v5 values (namespace
f201b13e-c670-473d-885d-e2be219f74c8, formula{firstName}-{lastName}) - Test fixtures renamed for clarity:
playerStub.nonexistent(Lo Celso, squad 27 — not seeded, used for POST/DELETE) andplayerStub.existing(Emiliano Martínez, squad 23 — always seeded, used for PUT) playerStub.allexpanded to 26 playersPUT describein tests: removedbeforeEach, addedafterEachto restore Martínez; all tests retargeted to squad 23rest/players.restvariables updated:@newSquadNumber = 27,@existingSquadNumber = 23- Tests switched to in-memory SQLite (
STORAGE_PATH=:memory:) — seeded viabeforeAll, production DB never touched during test runs - Docker: run
docker compose down -vbeforedocker compose upto pick up the rebuilt seeded DB fromstorage/players-sqlite3.db(see #551)
.envrcfor direnv to automatically switch to the required Node.js version via.nvmrcon directory entryrest/players.restHTTP file with health check, POST, GET (all, by ID, by squad number), PUT, and DELETE requests for VS Code REST Client (humao.rest-client)humao.rest-clientadded to.vscode/extensions.jsonrecommended extensions
idfield inPlayermodel migrated fromINTEGERtoUUID(DataTypes.UUIDV4, auto-generated on insert) — surrogate key, admin use onlyPUT /players/:idroute replaced byPUT /players/squadNumber/:squadNumber— natural key is now the domain identifier for mutationsDELETE /players/:idroute replaced byDELETE /players/squadNumber/:squadNumber— natural key is now the domain identifier for mutationsPOST /playersconflict detection switched fromid-based tosquadNumber-based lookupIPlayer.idtype changed fromnumbertostringto reflect UUIDupdateAsyncanddeleteAsyncin service and database layers refactored to operate onsquadNumber
postman-collections/directory and Postman JSON collection replaced byrest/players.rest
- Docker entrypoint now prints API and Swagger UI URLs on startup
- Swagger UI CSP updated to include
connect-src 'self'andworker-src blob: 'self' - Swagger UI static
/swagger/index.htmlredirect now registered before static file middleware swaggerUrlset explicitly so Swagger UI fetches spec from/swagger.jsoninstead of falling back to petstore- Test naming convention updated to action-oriented arrow pattern
- Unified Copilot instructions as canonical single-file format
- Dependency updates:
pino,dotenv,qs,dottie,express-rate-limit,eslint,nodemon,commitlint,@types/*and GitHub Actions (docker/build-push-action,docker/login-action,docker/setup-buildx-action,actions/setup-node,actions/upload-artifact,actions/download-artifact)
- Docker container crashed on startup with
unable to determine transport target for "pino-pretty"— resolved by settingNODE_ENV=productionincompose.yml - Swagger UI displayed petstore fallback due to missing CSP directives and static file middleware intercepting
/swagger/index.html
Initial release. See README.md for complete feature list and documentation.
💡 Update CHANGELOG.md continuously with every meaningful change before committing!
- Release branch created from
master -
CHANGELOG.mdupdated with release notes - Changes committed and pushed on the release branch
- Release PR merged into
master - Tag created with correct format:
vX.Y.Z-term - Term is valid (A-Z from the football terminology list above)
- Tag pushed to trigger CD workflow
-
Create a release branch
git checkout master && git pull git checkout -b release/vX.Y.Z-term -
Update CHANGELOG.md
Move items from
[Unreleased]to a new version section:## [X.Y.Z - term] - YYYY-MM-DDCommit and push:
git add CHANGELOG.md git commit -m "chore(release): vX.Y.Z-term" git push origin release/vX.Y.Z-term -
Merge the release PR
Open a pull request from
release/vX.Y.Z-termintomasterand merge it. The tag must be created after the merge so it points to the correct commit onmaster. -
Create and push tag
git checkout master && git pull git tag -a vX.Y.Z-term -m "Release X.Y.Z - Term" git push origin vX.Y.Z-term
-
CD pipeline runs automatically
GitHub Actions will:
- Run full test suite with coverage
- Build Docker image
- Publish to GHCR with tags:
:X.Y.Z,:term,:latest - Create GitHub Release with auto-generated notes
Format: v{MAJOR}.{MINOR}.{PATCH}-{TERM}
Example: v1.0.0-assist
- Version: Semantic versioning (MAJOR.MINOR.PATCH)
- Term: Football terminology from the alphabetical list above
Each release publishes three Docker tags:
# Pull by semantic version (recommended for production)
docker pull ghcr.io/nanotaboada/ts-node-samples-express-restful:1.0.0
# Pull by term name (memorable, useful for staging)
docker pull ghcr.io/nanotaboada/ts-node-samples-express-restful:assist
# Pull latest (development/testing only)
docker pull ghcr.io/nanotaboada/ts-node-samples-express-restful:latestMAJOR (x.0.0): Breaking changes to API contracts MINOR (1.x.0): New features, backwards-compatible PATCH (1.0.x): Bug fixes, no new features
- 💡 Always update CHANGELOG.md
[Unreleased]section as you work - 🚫 Never commit secrets, API keys, or credentials
- ✅ Test thoroughly before tagging
- 📝 Use clear, user-facing descriptions in CHANGELOG
- 🏷️ Tags trigger CD pipeline - CI only runs on push/PR
- 🐳 Only releases publish Docker images (not every merge)