No description
  • TypeScript 77.9%
  • Vue 20.2%
  • JavaScript 1.5%
  • Dockerfile 0.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
sunsay 569a028816
All checks were successful
nuxt-clients-deploy/pipeline/head This commit looks good
Merge pull request 'chore(deps): update nginx docker tag to v1.31.4' (#63) from renovate/nginx-1.x into master
Reviewed-on: #63
2026-08-20 08:24:40 +00:00
.cursor/rules Require FORGEJO_TOKEN from env for PR creation. 2026-07-22 15:15:39 +04:00
.husky Add husky pre-commit verify for typecheck and tests. 2026-07-21 16:41:35 +04:00
app fix: apply review suggestions for infinite list feed 2026-08-08 16:18:26 +00:00
deploy Notify Matrix on CD start/done via Hermes. 2026-07-24 13:29:22 +04:00
docs/superpowers feat: add useInfiniteList and clients cursor feed etalon 2026-08-08 13:17:35 +04:00
mocks fix: apply review suggestions for infinite list feed 2026-08-08 16:18:26 +00:00
public Add SVG favicon showing architectural layer node tree. 2026-07-23 13:57:30 +00:00
src fix: apply review suggestions for infinite list feed 2026-08-08 16:18:26 +00:00
tests/e2e chore(deps): update nginx docker tag to v1.31.4 2026-08-20 06:00:29 +00:00
.dockerignore Add production Dockerfile and Jenkins deploy pipeline for master. 2026-07-24 01:15:38 +04:00
.env.example Add Playwright e2e tests with Docker infrastructure. 2026-07-22 11:43:56 +04:00
.gitignore Merge branch 'master' into feat/coverage-page 2026-08-07 20:09:31 +04:00
.npmrc Route npm installs through the primne Verdaccio proxy. 2026-08-17 16:45:26 +04:00
Dockerfile Route npm installs through the primne Verdaccio proxy. 2026-08-17 16:45:26 +04:00
eslint.config.mjs Refactor /clients to FFF layers with portable HTTP contracts. 2026-07-21 11:58:28 +04:00
nuxt.config.ts Refine theme adapter surface and delivery. 2026-07-27 06:39:30 +00:00
package-lock.json Upgrade ESLint to v10 to clear npm peer dependency warnings. 2026-07-22 15:04:48 +04:00
package.json Upgrade ESLint to v10 to clear npm peer dependency warnings. 2026-07-22 15:04:48 +04:00
README.md docs(e2e): note self-contained Playwright Jenkins pod for 1.61.1 2026-07-23 16:44:54 +00:00
renovate.json Add renovate.json 2026-07-22 06:18:22 +00:00
tailwind.config.ts Add SSR-safe dark theme toggle via cookies to prevent FOUC. 2026-07-27 05:53:50 +00:00
tsconfig.json Refactor /clients to FFF layers with portable HTTP contracts. 2026-07-21 11:58:28 +04:00
vitest.config.ts Refactor /clients to FFF layers with portable HTTP contracts. 2026-07-21 11:58:28 +04:00

Framework Free Frontend (FFF)

Экспериментальная архитектура для high-load портала, где фреймворк (Nuxt / Next / SvelteKit) — адаптер, а не ядро.

Зачем это нужно

Типичный фронтенд быстро обрастает логикой внутри framework-API: plugins, composables, pages, stores. Такой код плохо переносится и плохо тестируется вне конкретного стека.

Цель FFF: бизнес-логика, доменные use-cases, HTTP-контракты и UI-state живут вне фреймворка. Смена стека ≈ замена пары адаптеров и синтаксиса шаблонов компонентов — без переписывания домена и application-слоя.

High-load здесь — нагрузка на архитектуру (границы слоёв, изоляция, тестируемость), а не бенчмарки RPS в этом репозитории.

Демо-полигон

Не продукт, а 34 эталонные страницы, на которых отрабатываем слои:

Сценарий Что проверяем
Таблица с фильтрами / пагинацией / sync с URL списки, query-state, пагинация (/clients)
Каталог товаров листинг, фильтры каталога, карточки
Корзина клиентский state, мутации, side-effects
Авторизация (опционально) сессия, guard, границы доступа

Слои архитектуры

flowchart TB
  pages[Pages_Templates]
  adapters[Framework_Adapters]
  appLayer[Application_UseCases]
  domain[Domain_Models_Rules]
  infra[Infra_HTTP_Storage]

  pages --> adapters
  adapters --> appLayer
  appLayer --> domain
  appLayer --> infra
  • Domain — типы, инварианты, правила; без Vue / Nuxt / React / Svelte.
  • Application — use-cases (listClients, addToCart и т.п.); без UI.
  • Infra — HTTP, storage; интерфейсы на стороне application, реализации сменные.
  • Adapters — тонкая склейка с хостом (useRoute, $fetch, plugins в Nuxt; аналоги в Next / SvelteKit).
  • Pages — только композиция и шаблон.

Правило портативности: Nuxt → Next (или SvelteKit) = заменить adapters + переписать templates; domain / application / infra-contracts не трогаем.

Текущий статус

  • Host: Nuxt 4.5 (future.compatibilityVersion: 5) + Nitro mocks.
  • Эталон /clients разложен по слоям FFF:
    • src/domain/client — типы
    • src/application/clients — порт + listClients
    • src/infra/http — HTTP-реализация репозитория
    • app/adapters/clients — Nuxt-склейка (useClientsList, query-sync)
    • app/components/clients — presentational UI
    • app/pages/clients — только композиция
  • Mock REST API и use-query-sync на месте.

Это направление эксперимента, а не готовый multi-framework monorepo.

Запуск

npm install
npm run dev
  • Портал: /
  • Клиенты: /clients
  • API: /api/clients

Скрипты

  • npm run lint — ESLint
  • npm run test — Vitest (unit)
  • npm run build — production build

E2E (Playwright + Docker)

Playwright-пакет в tests/e2e/:

tests/e2e/
  specs/          # только сценарии (clients/, cart/, …)
  support/
    fixtures/     # Playwright fixtures
    utils/        # assertions, helpers
  playwright.config.ts
  docker-compose.yml
  …

Локально (без Docker):

npm run dev          # приложение на http://127.0.0.1:4000 (PORT из .env)
npm run e2e:run      # прогон тестов

Через Docker (nginx-кэш + Playwright-контейнер):

npm run dev              # на хосте, порт 4000
npm run e2e:run-docker   # shell в Playwright-контейнере
# внутри контейнера:
npx playwright test -c ./tests/e2e/playwright.config.ts
# или снапшоты под Linux (как на Jenkins):
CI=true npm run e2e:ci -- --update-snapshots
npm run e2e:stop-docker

Вход в nginx-контейнер:

npm run e2e:run-nginx

Для WSL / Docker Desktop при необходимости задайте PW_BASE_URL (IP хоста, порт 4000).

  • npm run e2e:run — Playwright локально
  • npm run e2e:ci — Playwright для CI (JUnit + line reporter, поднимает preview через start-server:test)
  • npm run e2e:run:watch — watch по spec-файлам
  • npm run e2e:run-ui — UI mode
  • npm run e2e:run-docker — поднять Docker и войти в Playwright shell
  • npm run e2e:run-nginx — поднять Docker и войти в nginx shell
  • npm run e2e:stop-docker — остановить контейнеры
  • npm run start-server:test — build + preview для CI

Jenkins (e2e на PR)

Pipeline: tests/e2e/Jenkinsfile (по аналогии с tenchat-ssr-nuxt).

Jenkins (jenkins.primne.com):

  1. New ItemMultibranch Pipeline → имя, например nuxt-clients-e2e.
  2. Branch SourcesGitea / Forgejo:
    • Server URL: https://git.primne.com
    • Credentials: токен Forgejo с доступом к sunsay/nuxt-clients
    • Owner: sunsay, Repository: nuxt-clients
    • Behaviours: Discover pull requests from origin (и при необходимости ветки master / main).
  3. Build Configuration → Script Path: tests/e2e/Jenkinsfile.
  4. Scan Multibranch Pipeline Triggers → периодический scan (например, каждые 5 мин) или webhook (ниже).

Forgejo (репозиторий sunsay/nuxt-clients → Settings → Webhooks):

Поле Значение
Target URL https://jenkins.primne.com/gitea-webhook/post
Content type application/json
Events Pull request (и при необходимости Push)

После merge webhook PR получает статус сборки в Forgejo (нужен Gitea/Forgejo plugin в Jenkins).

Docker-образ: e2e Jenkinsfile задаёт self-contained K8s pod с mcr.microsoft.com/playwright:v1.61.1-jammy (не inheritFrom 'playwright' — merge оставлял образ шаблона v1.51.1). Тег должен совпадать с @playwright/test в tests/e2e/package.json и tests/e2e/Dockerfile.

Локальная проверка CI-потока:

npm ci
npm --prefix=./tests/e2e ci
cp .env.example .env
CI=true npm run e2e:ci