From c3a3bb49007b26fbb603508566a0d25f64ca4be1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Kamy=C5=9Fev?= Date: Wed, 17 Apr 2024 15:03:22 +0700 Subject: [PATCH] no nx (#82) --- .changeset/config.json | 1 + .changeset/thin-readers-impress.md | 8 + .eslintignore | 1 - .eslintrc.json | 39 - .github/workflows/changes.yml | 2 +- .github/workflows/ci.yml | 43 +- .github/workflows/release.yml | 3 +- .github/workflows/website.yml | 4 +- README.md | 20 +- apps/web-api-demo-e2e/.eslintrc.json | 22 - apps/web-api-demo-e2e/playwright.config.ts | 10 - apps/web-api-demo-e2e/project.json | 40 - apps/web-api-demo-e2e/tsconfig.e2e.json | 10 - apps/web-api-demo-e2e/tsconfig.json | 9 - apps/web-api-demo/.eslintrc.json | 10 - apps/web-api-demo/README.md | 2 +- apps/web-api-demo/package.json | 12 + apps/web-api-demo/playwright.config.ts | 15 + apps/web-api-demo/project.json | 43 - .../test}/media_query.spec.ts | 0 .../test}/preferred_languages.spec.ts | 0 apps/web-api-demo/tsconfig.json | 23 +- apps/web-api-demo/vite.config.js | 5 + apps/web-api-demo/vite.config.ts | 8 - apps/website/changelog/cli.mjs | 165 + apps/website/changelog/lib.mjs | 40 + apps/website/changelog/lib.test.js | 246 + .../docs/.vitepress/{config.js => config.mjs} | 5 +- .../docs/.vitepress/{rss.js => rss.mjs} | 0 ...sidebar_creator.js => sidebar_creator.mjs} | 0 .../docs/.vitepress/theme/LiveDemo.vue | 2 +- apps/website/package.json | 12 +- apps/website/project.json | 41 - babel.config.json | 3 - nx.json | 50 - package.json | 44 +- packages/factories/.babelrc | 10 - packages/factories/.eslintrc.json | 18 - packages/factories/README.md | 12 +- packages/factories/index.ts | 2 - packages/factories/package.json | 33 +- packages/factories/project.json | 81 - packages/factories/src/factories.test.ts | 12 +- packages/factories/src/index.ts | 2 + packages/factories/tsconfig.build.json | 4 - packages/factories/tsconfig.json | 14 +- packages/factories/vite.config.js | 19 + packages/factories/vite.config.ts | 11 - packages/i18next/.babelrc | 10 - packages/i18next/.eslintrc.json | 25 - packages/i18next/README.md | 12 +- packages/i18next/index.ts | 1 - packages/i18next/package.json | 35 +- packages/i18next/project.json | 74 - packages/i18next/src/index.ts | 1 + packages/i18next/src/integration.ts | 2 +- packages/i18next/tsconfig.build.json | 4 - packages/i18next/tsconfig.json | 14 +- packages/i18next/vite.config.js | 22 + packages/i18next/vite.config.ts | 7 - packages/redux/.babelrc | 10 - packages/redux/.eslintrc.json | 18 - packages/redux/README.md | 12 +- packages/redux/index.ts | 1 - packages/redux/package.json | 35 +- packages/redux/project.json | 67 - packages/redux/src/index.ts | 2 +- .../redux.spec.ts => integration.spec.ts} | 10 +- .../src/{lib/redux.ts => integration.ts} | 5 - packages/redux/tsconfig.json | 24 +- packages/redux/tsconfig.lib.json | 10 - packages/redux/tsconfig.spec.json | 19 - packages/redux/vite.config.js | 22 + packages/redux/vite.config.ts | 32 - packages/web-api/.babelrc | 10 - packages/web-api/.eslintrc.json | 25 - packages/web-api/README.md | 12 +- packages/web-api/index.ts | 5 - packages/web-api/package.json | 35 +- packages/web-api/project.json | 74 - packages/web-api/src/index.ts | 5 + packages/web-api/tsconfig.build.json | 4 - packages/web-api/tsconfig.json | 14 +- packages/web-api/vite.config.js | 22 + packages/web-api/vite.config.ts | 7 - playwright.config.base.ts | 7 - pnpm-lock.yaml | 9545 +++++------------ pnpm-workspace.yaml | 1 + tools/executors/size-limit/executor.json | 9 - tools/executors/size-limit/impl.js | 26 - tools/executors/size-limit/package.json | 3 - tools/executors/size-limit/schema.json | 5 - tools/other-majors/prepare.mjs | 33 +- tools/publint.mjs | 17 + tools/scripts/changelogs.mjs | 19 - tools/scripts/publish.mjs | 82 - tools/scripts/typepack.mjs | 35 - tools/tsconfig.tools.json | 11 - tools/vite/types.js | 24 + tsconfig.base.json | 12 +- 100 files changed, 3647 insertions(+), 8025 deletions(-) create mode 100644 .changeset/thin-readers-impress.md delete mode 100644 .eslintignore delete mode 100644 .eslintrc.json delete mode 100644 apps/web-api-demo-e2e/.eslintrc.json delete mode 100644 apps/web-api-demo-e2e/playwright.config.ts delete mode 100644 apps/web-api-demo-e2e/project.json delete mode 100644 apps/web-api-demo-e2e/tsconfig.e2e.json delete mode 100644 apps/web-api-demo-e2e/tsconfig.json delete mode 100644 apps/web-api-demo/.eslintrc.json create mode 100644 apps/web-api-demo/package.json create mode 100644 apps/web-api-demo/playwright.config.ts delete mode 100644 apps/web-api-demo/project.json rename apps/{web-api-demo-e2e/src => web-api-demo/test}/media_query.spec.ts (100%) rename apps/{web-api-demo-e2e/src => web-api-demo/test}/preferred_languages.spec.ts (100%) create mode 100644 apps/web-api-demo/vite.config.js delete mode 100644 apps/web-api-demo/vite.config.ts create mode 100644 apps/website/changelog/cli.mjs create mode 100644 apps/website/changelog/lib.mjs create mode 100644 apps/website/changelog/lib.test.js rename apps/website/docs/.vitepress/{config.js => config.mjs} (98%) rename apps/website/docs/.vitepress/{rss.js => rss.mjs} (100%) rename apps/website/docs/.vitepress/{sidebar_creator.js => sidebar_creator.mjs} (100%) delete mode 100644 apps/website/project.json delete mode 100644 babel.config.json delete mode 100644 nx.json delete mode 100644 packages/factories/.babelrc delete mode 100644 packages/factories/.eslintrc.json delete mode 100644 packages/factories/index.ts delete mode 100644 packages/factories/project.json create mode 100644 packages/factories/src/index.ts delete mode 100644 packages/factories/tsconfig.build.json create mode 100644 packages/factories/vite.config.js delete mode 100644 packages/factories/vite.config.ts delete mode 100644 packages/i18next/.babelrc delete mode 100644 packages/i18next/.eslintrc.json delete mode 100644 packages/i18next/index.ts delete mode 100644 packages/i18next/project.json create mode 100644 packages/i18next/src/index.ts delete mode 100644 packages/i18next/tsconfig.build.json create mode 100644 packages/i18next/vite.config.js delete mode 100644 packages/i18next/vite.config.ts delete mode 100644 packages/redux/.babelrc delete mode 100644 packages/redux/.eslintrc.json delete mode 100644 packages/redux/index.ts delete mode 100644 packages/redux/project.json rename packages/redux/src/{lib/redux.spec.ts => integration.spec.ts} (98%) rename packages/redux/src/{lib/redux.ts => integration.ts} (95%) delete mode 100644 packages/redux/tsconfig.lib.json delete mode 100644 packages/redux/tsconfig.spec.json create mode 100644 packages/redux/vite.config.js delete mode 100644 packages/redux/vite.config.ts delete mode 100644 packages/web-api/.babelrc delete mode 100644 packages/web-api/.eslintrc.json delete mode 100644 packages/web-api/index.ts delete mode 100644 packages/web-api/project.json create mode 100644 packages/web-api/src/index.ts delete mode 100644 packages/web-api/tsconfig.build.json create mode 100644 packages/web-api/vite.config.js delete mode 100644 packages/web-api/vite.config.ts delete mode 100644 playwright.config.base.ts delete mode 100644 tools/executors/size-limit/executor.json delete mode 100644 tools/executors/size-limit/impl.js delete mode 100644 tools/executors/size-limit/package.json delete mode 100644 tools/executors/size-limit/schema.json create mode 100644 tools/publint.mjs delete mode 100644 tools/scripts/changelogs.mjs delete mode 100644 tools/scripts/publish.mjs delete mode 100644 tools/scripts/typepack.mjs delete mode 100644 tools/tsconfig.tools.json create mode 100644 tools/vite/types.js diff --git a/.changeset/config.json b/.changeset/config.json index f98d9b8e..fe2382a9 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -4,6 +4,7 @@ "commit": "../tools/utils/commit_message.js", "fixed": [], "linked": [], + "ignore": ["website", "*-demo"], "access": "public", "baseBranch": "origin/master", "updateInternalDependencies": "patch" diff --git a/.changeset/thin-readers-impress.md b/.changeset/thin-readers-impress.md new file mode 100644 index 00000000..bd3fc194 --- /dev/null +++ b/.changeset/thin-readers-impress.md @@ -0,0 +1,8 @@ +--- +'@withease/factories': patch +'@withease/i18next': patch +'@withease/redux': patch +'@withease/web-api': patch +--- + +Update toolchain diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 3c3629e6..00000000 --- a/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 474e1656..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "root": true, - "ignorePatterns": ["**/*"], - "plugins": ["@nx"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": { - "@nx/enforce-module-boundaries": [ - "error", - { - "enforceBuildableLibDependency": true, - "allow": [], - "depConstraints": [ - { - "sourceTag": "*", - "onlyDependOnLibsWithTags": ["*"] - } - ] - } - ] - } - }, - { - "files": ["*.test.ts", "*.test.tsx"], - "rules": { "@nx/enforce-module-boundaries": "off" } - }, - { - "files": ["*.ts", "*.tsx"], - "extends": ["plugin:@nx/typescript"], - "rules": {} - }, - { - "files": ["*.js", "*.jsx"], - "extends": ["plugin:@nx/javascript"], - "rules": {} - } - ] -} diff --git a/.github/workflows/changes.yml b/.github/workflows/changes.yml index 854cf324..ac031eef 100644 --- a/.github/workflows/changes.yml +++ b/.github/workflows/changes.yml @@ -18,4 +18,4 @@ jobs: node-version-file: '.nvmrc' cache: 'pnpm' - run: pnpm install --frozen-lockfile - - run: pnpm lint:changes + - run: pnpm pnpm changeset status diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d4645c08..38c3f2de 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,9 +1,9 @@ name: CI -on: push +on: [pull_request, push] jobs: - checks: + code: runs-on: ubuntu-latest steps: @@ -14,13 +14,24 @@ jobs: node-version-file: '.nvmrc' cache: 'pnpm' - run: pnpm install --frozen-lockfile - - run: pnpm lint:format - - run: pnpm lint:workspace - - run: pnpm test - - run: pnpm test:types - - run: pnpm lint - - run: pnpm build - - run: pnpm size + - run: pnpm run format:check + - run: pnpm run -r build + - run: pnpm run -r test:run + pkg: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + - uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + cache: 'pnpm' + - run: pnpm install --frozen-lockfile + - run: pnpm run -r build + - run: pnpm run -r size + - run: pnpm run -r publint + - run: pnpm run -r typelint e2e: runs-on: ubuntu-latest @@ -33,9 +44,10 @@ jobs: cache: 'pnpm' - run: pnpm install --frozen-lockfile - run: pnpm playwright install - - run: pnpm test:e2e + - run: pnpm run -r build + - run: pnpm run -r e2e - checks_old_versions: + code_old_versions: runs-on: ubuntu-latest strategy: @@ -49,13 +61,13 @@ jobs: with: node-version-file: '.nvmrc' cache: 'pnpm' - - run: pnpm install --frozen-lockfile - run: node ./tools/other-majors/prepare.mjs ${{ matrix.version }} - run: pnpm install --no-frozen-lockfile - - run: pnpm test - - run: pnpm test:types + - run: pnpm run -r build + - run: pnpm run -r test:run + e2e_old_versions: runs-on: ubuntu-latest @@ -76,4 +88,5 @@ jobs: - run: pnpm install --no-frozen-lockfile - run: pnpm playwright install - - run: pnpm test:e2e + - run: pnpm run -r build + - run: pnpm run -r e2e diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1343b325..cdd18d9b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,4 +19,5 @@ jobs: - run: | echo "//registry.npmjs.org/:_authToken="${{secrets.NPM_TOKEN}}"" > ~/.npmrc shell: sh - - run: pnpm nx run-many --output-style=static --target=publish --all + - run: pnpm run -r build + - run: pnpm -r publish --no-git-checks diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index fdbb4166..8801a074 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -20,7 +20,7 @@ jobs: cache: 'pnpm' - run: pnpm install --frozen-lockfile - - run: pnpm nx build website + - run: pnpm run -r build - name: Publish to Cloudflare Pages uses: cloudflare/pages-action@v1 @@ -28,5 +28,5 @@ jobs: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: 1d6db711ad880b2455da08a6aeb2a119 projectName: withease - directory: dist/apps/website + directory: apps/website/docs/.vitepress/dist gitHubToken: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index 96ba8be4..8564f33c 100644 --- a/README.md +++ b/README.md @@ -10,17 +10,23 @@ A set of libraries and recipes to make frontend development easier thanks to Eff - install deps via `pnpm install` - make changes - make sure that your changes is passing checks: - - run tests via `pnpm test` - - run type tests via `pnpm test:types` - - run linter via `pnpm lint` - - try to build it via `pnpm build` - - format code via `pnpm format` -- fill in changes via `pnpm changes` + - run tests via `pnpm run -r test:run` + - try to build it via `pnpm run -r build` + - format code via `pnpm run format:check` +- fill in changes via `pnpm changeset` - open a PR - enjoy 🎉 ### Release workflow -Releases of With Ease are automated by [changesets](https://github.com/changesets/changesets) and GitHub Actions. Your only duty is creating changeset for every PR, it is controlled by [Changes-action](./.github/workflows/changes.yml). +Releases of Farfetched are automated by [changesets](https://github.com/changesets/changesets) and GitHub Actions. Your only duty is creating changeset for every PR, it is controlled by [Changes-action](./.github/workflows/changes.yml). After merging PR to master-branch, [Version-action](./.github/workflows/version.yml) will update special PR with the next release. To publish this release, just merge special PR and wait, [Release-action](./.github/workflows/release.yml) will publish packages. + +### Repository management + +#### New package creation + +Copy-paste `packages/web-api` directory, rename it to the package name. Then, update `package.json`, `README.md` and `vite.config.js` files. Then, delete `CHANGELOG.md` file and any other files that are not needed in the new package. + +Fancy generator will be added in the future. diff --git a/apps/web-api-demo-e2e/.eslintrc.json b/apps/web-api-demo-e2e/.eslintrc.json deleted file mode 100644 index 296b4bd5..00000000 --- a/apps/web-api-demo-e2e/.eslintrc.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": { - "jest/no-done-callback": "off" - } - }, - { - "files": ["*.ts", "*.tsx"], - "rules": { - "jest/no-done-callback": "off" - } - }, - { - "files": ["*.js", "*.jsx"], - "rules": {} - } - ] -} diff --git a/apps/web-api-demo-e2e/playwright.config.ts b/apps/web-api-demo-e2e/playwright.config.ts deleted file mode 100644 index 677fbce9..00000000 --- a/apps/web-api-demo-e2e/playwright.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { PlaywrightTestConfig } from '@playwright/test'; - -import { baseConfig } from '../../playwright.config.base'; - -const config: PlaywrightTestConfig = { - ...baseConfig, - use: { baseURL: 'http://localhost:5173' }, -}; - -export default config; diff --git a/apps/web-api-demo-e2e/project.json b/apps/web-api-demo-e2e/project.json deleted file mode 100644 index 022ff6a6..00000000 --- a/apps/web-api-demo-e2e/project.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "web-api-demo-e2e", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "apps/web-api-demo-e2e/src", - "projectType": "application", - "targets": { - "e2e": { - "executor": "@mands/nx-playwright:playwright-executor", - "options": { - "e2eFolder": "apps/web-api-demo-e2e", - "devServerTarget": "web-api-demo:serve", - "packageRunner": "pnpm" - }, - "configurations": { - "production": { - "devServerTarget": "web-api-demo:serve:production" - } - } - }, - "ts-check": { - "executor": "nx:run-commands", - "options": { - "commands": [ - { - "command": "tsc --build --force --verbose apps/web-api-demo-e2e/tsconfig.json" - } - ] - } - }, - "lint": { - "executor": "@nx/linter:eslint", - "outputs": ["{options.outputFile}"], - "options": { - "lintFilePatterns": ["apps/web-api-demo-e2e/**/*.{ts,tsx,js,jsx}"] - } - } - }, - "tags": [], - "implicitDependencies": ["web-api-demo"] -} diff --git a/apps/web-api-demo-e2e/tsconfig.e2e.json b/apps/web-api-demo-e2e/tsconfig.e2e.json deleted file mode 100644 index 725f4a55..00000000 --- a/apps/web-api-demo-e2e/tsconfig.e2e.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "sourceMap": false, - "outDir": "../../dist/out-tsc", - "allowJs": true, - "types": ["node"] - }, - "include": ["**/*.ts", "**/*.js"] -} diff --git a/apps/web-api-demo-e2e/tsconfig.json b/apps/web-api-demo-e2e/tsconfig.json deleted file mode 100644 index 683c0699..00000000 --- a/apps/web-api-demo-e2e/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": [], - "references": [ - { - "path": "./tsconfig.e2e.json" - } - ] -} diff --git a/apps/web-api-demo/.eslintrc.json b/apps/web-api-demo/.eslintrc.json deleted file mode 100644 index 0b3a631e..00000000 --- a/apps/web-api-demo/.eslintrc.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*", "node_modules"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "rules": {} - } - ] -} diff --git a/apps/web-api-demo/README.md b/apps/web-api-demo/README.md index 695a6a34..f3239f46 100644 --- a/apps/web-api-demo/README.md +++ b/apps/web-api-demo/README.md @@ -5,4 +5,4 @@ - clone the repo - ensure that `pnpm` is installed - install dependencies via `pnpm install` -- start showcase via `pnpm nx serve web-api-demo` +- start showcase via `pnpm --filter web-api-demo dev` diff --git a/apps/web-api-demo/package.json b/apps/web-api-demo/package.json new file mode 100644 index 00000000..c254c678 --- /dev/null +++ b/apps/web-api-demo/package.json @@ -0,0 +1,12 @@ +{ + "name": "web-api-demo", + "private": true, + "scripts": { + "dev": "vite dev", + "build": "vite build", + "e2e": "playwright test" + }, + "dependencies": { + "@withease/web-api": "workspace:*" + } +} diff --git a/apps/web-api-demo/playwright.config.ts b/apps/web-api-demo/playwright.config.ts new file mode 100644 index 00000000..09689186 --- /dev/null +++ b/apps/web-api-demo/playwright.config.ts @@ -0,0 +1,15 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; + +const config: PlaywrightTestConfig = { + retries: 3, + maxFailures: 2, + timeout: 120000, + use: { baseURL: 'http://localhost:5173' }, + webServer: { + command: 'pnpm --filter web-api-demo dev', + url: 'http://localhost:5173', + reuseExistingServer: !process.env.CI, + }, +}; + +export default config; diff --git a/apps/web-api-demo/project.json b/apps/web-api-demo/project.json deleted file mode 100644 index b9aabd49..00000000 --- a/apps/web-api-demo/project.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "web-api-demo", - "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "apps/web-api-demo/src", - "projectType": "application", - "targets": { - "build": { - "executor": "@nx/vite:build", - "options": { - "outputPath": "dist/apps/web-api-demo" - } - }, - "serve": { - "executor": "@nx/vite:dev-server", - "options": { - "buildTarget": "web-api-demo:build" - } - }, - "lint": { - "executor": "@nx/linter:eslint", - "outputs": ["{options.outputFile}"], - "options": { - "lintFilePatterns": ["apps/web-api-demo/**/*.{ts,js}"] - } - }, - "preview": { - "executor": "@nx/vite:preview-server", - "defaultConfiguration": "development", - "options": { - "buildTarget": "web-api-demo:build" - }, - "configurations": { - "development": { - "buildTarget": "web-api-demo:build:development" - }, - "production": { - "buildTarget": "web-api-demo:build:production" - } - } - } - }, - "tags": [] -} diff --git a/apps/web-api-demo-e2e/src/media_query.spec.ts b/apps/web-api-demo/test/media_query.spec.ts similarity index 100% rename from apps/web-api-demo-e2e/src/media_query.spec.ts rename to apps/web-api-demo/test/media_query.spec.ts diff --git a/apps/web-api-demo-e2e/src/preferred_languages.spec.ts b/apps/web-api-demo/test/preferred_languages.spec.ts similarity index 100% rename from apps/web-api-demo-e2e/src/preferred_languages.spec.ts rename to apps/web-api-demo/test/preferred_languages.spec.ts diff --git a/apps/web-api-demo/tsconfig.json b/apps/web-api-demo/tsconfig.json index 02e967f5..65b1ff2c 100644 --- a/apps/web-api-demo/tsconfig.json +++ b/apps/web-api-demo/tsconfig.json @@ -1,22 +1,11 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "strict": true, - "moduleResolution": "Node", - "resolveJsonModule": true, - "isolatedModules": true, - "types": ["vite/client"], - "noEmit": true, - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "allowJs": false, - "esModuleInterop": false, - "skipLibCheck": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "jsx": "react-jsx" + "declaration": true, + "types": ["node"], + "outDir": "dist", + "rootDir": "src", + "baseUrl": "src" }, - "include": ["**/*.js", "**/*.ts", "src"] + "include": ["src/**/*.ts"] } diff --git a/apps/web-api-demo/vite.config.js b/apps/web-api-demo/vite.config.js new file mode 100644 index 00000000..df3a5aeb --- /dev/null +++ b/apps/web-api-demo/vite.config.js @@ -0,0 +1,5 @@ +import tsconfigPaths from 'vite-tsconfig-paths'; + +export default { + plugins: [tsconfigPaths()], +}; diff --git a/apps/web-api-demo/vite.config.ts b/apps/web-api-demo/vite.config.ts deleted file mode 100644 index 436fda8a..00000000 --- a/apps/web-api-demo/vite.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { defineConfig } from 'vite'; -import nxViteTsPaths from 'vite-tsconfig-paths'; - -export default defineConfig({ - cacheDir: '../../../node_modules/.vite/web-api-demo', - plugins: [nxViteTsPaths()], - build: { outDir: '../../../dist/apps/web-api-demo' }, -}); diff --git a/apps/website/changelog/cli.mjs b/apps/website/changelog/cli.mjs new file mode 100644 index 00000000..1c28e9ee --- /dev/null +++ b/apps/website/changelog/cli.mjs @@ -0,0 +1,165 @@ +import glob from 'glob'; +import { readFile, writeFile } from 'node:fs/promises'; +import { promisify } from 'node:util'; +import { markdown } from 'markdown'; +import { format } from 'prettier'; +import { NodeHtmlMarkdown } from 'node-html-markdown'; +import { parseSemVer, compareSemVer } from 'semver-parser'; +import { resolve } from 'node:path'; + +import { excludeTrashUpdates, groupByVersions } from './lib.mjs'; + +const files = await promisify(glob)( + '../../{packages,deleted_packages}/*/CHANGELOG.md', + { + absolute: true, + } +); + +const changelogs = await Promise.all( + files.map((file) => + readFile(file, 'UTF-8') + .then((content) => content.toString()) + .then(parseChangelog) + ) +); + +for (const [release, changelog] of mergeChangelogs(changelogs).entries()) { + const md = await renderChangelog(changelog); + + const releaseFile = release.replaceAll('.', '-'); + const filePath = resolve('docs/releases', `${releaseFile}.changelog.md`); + + await writeFile(filePath, md); +} + +// --- // --- + +async function renderChangelog(tree) { + return makeLinksOnCommits( + await format( + NodeHtmlMarkdown.translate( + markdown.renderJsonML(markdown.toHTMLTree(tree)) + ), + { + parser: 'markdown', + } + ) + ); +} + +function mergeChangelogs(packages) { + const releases = new Set( + Object.values(packages) + .flatMap(({ changes }) => Object.keys(changes)) + .map(getRelease) + ); + + const log = new Map(); + + for (const release of releases) { + const currentLog = [[]]; + + const relatedChanges = packages + .map(({ name, changes }) => ({ + name, + changes: Object.fromEntries( + Object.entries(changes).filter( + ([version]) => getRelease(version) === release + ) + ), + })) + .filter(({ changes }) => Object.keys(changes).length > 0); + + currentLog.push(['header', { level: 2 }, 'Full changelog']); + for (const { version, packages } of groupByVersions(relatedChanges).sort( + ({ version: v1 }, { version: v2 }) => -compareSemVer(v1, v2) + )) { + const logForVersion = []; + for (const { name: packageName, changes: packageChanges } of packages) { + const pacakgeChangesEntries = Object.entries(packageChanges) + .map(([type, items]) => [type, excludeTrashUpdates(items)]) + .filter(([, items]) => items.length > 0); + + let hasChanges = pacakgeChangesEntries.length > 0; + + if (!hasChanges) { + continue; + } + + logForVersion.push(['para', `::: details ${packageName}`]); + + for (const [type, items] of pacakgeChangesEntries) { + logForVersion.push(['para', ['strong', type]], ...items); + } + + logForVersion.push(['para', ':::']); + } + + if (logForVersion.length > 0) { + currentLog.push(['header', { level: 3 }, version]); + currentLog.push(...logForVersion); + } + } + + log.set(release, currentLog); + } + + return log; +} + +async function parseChangelog(md) { + const [_1, header, ...rest] = markdown.parse(md); + + const name = header.at(2); + + const versions = groupByLevel(2, rest); + + const changes = {}; + for (const [version, content] of Object.entries(versions)) { + changes[version] = groupByLevel(3, content); + } + + return { name, changes }; +} + +function groupByLevel(targetLevel, data) { + const groups = {}; + + let currentGroup; + for (const item of data) { + const { level } = item.at(1); + + if (level === targetLevel) { + const group = item.at(2); + currentGroup = group; + } else { + if (!groups[currentGroup]) { + continue; + } + groups[currentGroup].push(item); + } + } + + return groups; +} + +function getRelease(version) { + const { major, minor } = parseSemVer(version); + + return `${major}.${minor}`; +} + +function makeLinksOnCommits(content) { + function linkToCommit(commitHash) { + return `[${commitHash}](https://github.com/igorkamyshev/farfetched/commit/${commitHash})`; + } + + function replacer(all, commitHash) { + return all.replace(commitHash, linkToCommit(commitHash)); + } + + return content + .replaceAll(/- ([0-9a-f]{7}):/gi, replacer) + .replaceAll(/\\\[([0-9a-f]{7})\\\]/gi, replacer); +} diff --git a/apps/website/changelog/lib.mjs b/apps/website/changelog/lib.mjs new file mode 100644 index 00000000..f7b64123 --- /dev/null +++ b/apps/website/changelog/lib.mjs @@ -0,0 +1,40 @@ +export function groupByVersions(packages) { + const groupedByVersions = []; + + for (const { name, changes } of packages) { + for (const [version, versionChanges] of Object.entries(changes)) { + const versionGroup = groupedByVersions.find( + (group) => group.version === version + ); + + if (versionGroup) { + versionGroup.packages.push({ name, changes: versionChanges }); + } else { + groupedByVersions.push({ + version, + packages: [{ name, changes: versionChanges }], + }); + } + } + } + + return groupedByVersions; +} + +export function excludeTrashUpdates(items) { + return items + .map((tags) => { + const [header, ...body] = tags; + + const filteredBody = body.filter( + (item) => !item.at(1).toLowerCase().includes('updated dependencies') + ); + + if (filteredBody.length === 0) { + return null; + } + + return [header, ...filteredBody]; + }) + .filter(Boolean); +} diff --git a/apps/website/changelog/lib.test.js b/apps/website/changelog/lib.test.js new file mode 100644 index 00000000..577fe4fc --- /dev/null +++ b/apps/website/changelog/lib.test.js @@ -0,0 +1,246 @@ +import { describe, test, expect } from 'vitest'; + +import { groupByVersions, excludeTrashUpdates } from './lib.mjs'; + +describe('groupByVersion', () => { + test('correct grouping', () => { + const changes = [ + { + name: '@farfetched/core', + changes: { + '0.6.4': { + 'Patch Changes': [ + [ + 'bulletlist', + [ + 'listitem', + '5da04bf: Fix type inference in ', + ['inlinecode', 'createQuery'], + ' in ', + ['inlinecode', 'effect'], + ' and ', + ['inlinecode', 'mapData'], + ' overload', + ], + ], + ], + }, + '0.6.3': {}, + '0.6.2': { + 'Patch Changes': [ + [ + 'bulletlist', + [ + 'listitem', + '05b4860: Fix ', + ['inlinecode', 'cache'], + ' invalidation after ', + ['inlinecode', 'update'], + ], + ], + ], + }, + '0.6.1': { + 'Patch Changes': [ + [ + 'bulletlist', + [ + 'listitem', + 'c2b67a6: Fix ', + ['inlinecode', 'cache'], + ' overlapping in ', + ['inlinecode', 'createJsonQuery'], + ], + ], + ], + }, + }, + }, + { + name: '@farfetched/solid', + changes: { + '0.6.4': {}, + '0.6.3': { + 'Patch Changes': [ + [ + 'bulletlist', + [ + 'listitem', + '0a45391: Re-trigger resource after ', + ['inlinecode', 'update'], + ' a ', + ['em', 'Query'], + ], + ], + ], + }, + '0.6.2': {}, + '0.6.1': {}, + }, + }, + ]; + + const result = groupByVersions(changes); + + expect(result).toEqual([ + { + version: '0.6.4', + packages: [ + { + name: '@farfetched/core', + changes: { + 'Patch Changes': [ + [ + 'bulletlist', + [ + 'listitem', + '5da04bf: Fix type inference in ', + ['inlinecode', 'createQuery'], + ' in ', + ['inlinecode', 'effect'], + ' and ', + ['inlinecode', 'mapData'], + ' overload', + ], + ], + ], + }, + }, + { + name: '@farfetched/solid', + changes: {}, + }, + ], + }, + { + version: '0.6.3', + packages: [ + { + name: '@farfetched/core', + changes: {}, + }, + { + name: '@farfetched/solid', + changes: { + 'Patch Changes': [ + [ + 'bulletlist', + [ + 'listitem', + '0a45391: Re-trigger resource after ', + ['inlinecode', 'update'], + ' a ', + ['em', 'Query'], + ], + ], + ], + }, + }, + ], + }, + { + version: '0.6.2', + packages: [ + { + name: '@farfetched/core', + changes: { + 'Patch Changes': [ + [ + 'bulletlist', + [ + 'listitem', + '05b4860: Fix ', + ['inlinecode', 'cache'], + ' invalidation after ', + ['inlinecode', 'update'], + ], + ], + ], + }, + }, + { + name: '@farfetched/solid', + changes: {}, + }, + ], + }, + { + version: '0.6.1', + packages: [ + { + name: '@farfetched/core', + changes: { + 'Patch Changes': [ + [ + 'bulletlist', + [ + 'listitem', + 'c2b67a6: Fix ', + ['inlinecode', 'cache'], + ' overlapping in ', + ['inlinecode', 'createJsonQuery'], + ], + ], + ], + }, + }, + { + name: '@farfetched/solid', + changes: {}, + }, + ], + }, + ]); + }); +}); + +describe('excludeTrashUpdates', () => { + test('delete trash updates from the list', () => { + const trashUpdates = [ + [ + 'bulletlist', + ['listitem', '896e27d: Update build tool-chain'], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array], [Array]], + ], + ]; + + expect(excludeTrashUpdates(trashUpdates)).toMatchInlineSnapshot(` + [ + [ + "bulletlist", + [ + "listitem", + "896e27d: Update build tool-chain", + ], + ], + ] + `); + }); + + test('delete the whole list in case of only updated deps', () => { + const trashUpdates = [ + [ + 'bulletlist', + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array]], + ['listitem', 'Updated dependencies ', [Array], [Array]], + ], + ]; + + expect(excludeTrashUpdates(trashUpdates)).toMatchInlineSnapshot(`[]`); + }); +}); diff --git a/apps/website/docs/.vitepress/config.js b/apps/website/docs/.vitepress/config.mjs similarity index 98% rename from apps/website/docs/.vitepress/config.js rename to apps/website/docs/.vitepress/config.mjs index 92016af4..7eb6ae62 100644 --- a/apps/website/docs/.vitepress/config.js +++ b/apps/website/docs/.vitepress/config.mjs @@ -1,6 +1,6 @@ import { defineConfig } from 'vitepress'; -import { createSidebar } from './sidebar_creator'; -import { rss } from './rss'; +import { createSidebar } from './sidebar_creator.mjs'; +import { rss } from './rss.mjs'; const HOSTNAME = 'https://withease.pages.dev'; @@ -16,7 +16,6 @@ export default defineConfig({ description: 'A set of libraries and recipes to make frontend development easier thanks to Effector', lastUpdated: true, - outDir: '../../../dist/apps/website', head: [ ['link', { rel: 'icon', href: '/favicon.ico', sizes: 'any' }], ['link', { rel: 'icon', href: '/icon.svg', type: 'image/svg+xml' }], diff --git a/apps/website/docs/.vitepress/rss.js b/apps/website/docs/.vitepress/rss.mjs similarity index 100% rename from apps/website/docs/.vitepress/rss.js rename to apps/website/docs/.vitepress/rss.mjs diff --git a/apps/website/docs/.vitepress/sidebar_creator.js b/apps/website/docs/.vitepress/sidebar_creator.mjs similarity index 100% rename from apps/website/docs/.vitepress/sidebar_creator.js rename to apps/website/docs/.vitepress/sidebar_creator.mjs diff --git a/apps/website/docs/.vitepress/theme/LiveDemo.vue b/apps/website/docs/.vitepress/theme/LiveDemo.vue index b775a8ec..707fc92b 100644 --- a/apps/website/docs/.vitepress/theme/LiveDemo.vue +++ b/apps/website/docs/.vitepress/theme/LiveDemo.vue @@ -1,5 +1,5 @@