diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index a4a982868..2a5040718 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -39,7 +39,7 @@ jobs: - uses: pnpm/action-setup@v4 name: Install pnpm with: - version: 10.8.0 + version: 10.10.0 - name: Install Node.js uses: actions/setup-node@v4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..8ca76ef61 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,66 @@ +name: Test publish version + +on: + workflow_dispatch: + inputs: + release: + description: stable, canary, or release candidate? + required: true + type: choice + options: + - canary + - stable + - release-candidate + type: + description: 'Type of package to publish' + required: true + type: choice + options: + - patch + - minor + - major + skip_bump_version: + description: 'Skip bumping version in package.json and release notes?' + required: false + type: boolean + +jobs: + bump-version: + name: 'Bump Version' + runs-on: ubuntu-latest + permissions: + contents: write + id-token: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Configure Git + run: | + git config --global user.name "${{ github.actor }}" + git config --global user.email "${{ github.actor }}@users.noreply.github.com" + + - uses: pnpm/action-setup@v4 + name: Install pnpm + with: + version: 10.10.0 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + registry-url: 'https://registry.npmjs.org/' + node-version: 22 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run script to bump version & copy files + run: pnpm run release + id: version-bump + env: + VERSION_TYPE: ${{ github.event.inputs.type }} + RELEASE_TYPE: ${{ github.event.inputs.release }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_USER: ${{ github.actor }} + GITHUB_EMAIL: ${{ github.actor }}@users.noreply.github.com diff --git a/bump-version.mjs b/bump-version.mjs new file mode 100644 index 000000000..9484bfe45 --- /dev/null +++ b/bump-version.mjs @@ -0,0 +1,18 @@ +const ALLOWED_VERSION_TYPES = ['major', 'minor', 'patch']; +const WORKSPACE = process.env.GITHUB_WORKSPACE || process.cwd(); +const GIT_USER = { + NAME: process.env.GITHUB_USER ?? 'Automated Version Bump', + EMAIL: process.env.GITHUB_EMAIL + ? `${process.env.GITHUB_USER}@users.noreply.github.com` + : 'gh-action-bump-version@users.noreply.github.com', +}; + +const init = () => { + console.log( + 'Initializing build version script...', + GIT_USER.EMAIL, + GIT_USER.NAME, + ); +}; + +init(); diff --git a/package.json b/package.json index 0e8725302..423328dc7 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "vitnode", "private": true, "scripts": { + "release": "node ./bump-version.mjs", "db:migrate": "turbo db:migrate", "db:push": "turbo db:push", "docker:dev": "docker compose -f ./docker-compose.yml -p vitnode-dev-dun up -d", diff --git a/packages/create-vitnode-app/copy-of-vitnode-app/eslint/.prettierrc.mjs b/packages/create-vitnode-app/copy-of-vitnode-app/eslint/.prettierrc.mjs new file mode 100644 index 000000000..483eff929 --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-app/eslint/.prettierrc.mjs @@ -0,0 +1,11 @@ +import vitnodePrettier from "eslint-config-typescript-vitnode/prettierrc"; + +/** + * @see https://prettier.io/docs/en/configuration.html + * @type {import("prettier").Config} + */ +const config = { + ...vitnodePrettier, +}; + +export default config; diff --git a/packages/create-vitnode-app/copy-of-vitnode-app/eslint/eslint.config.mjs b/packages/create-vitnode-app/copy-of-vitnode-app/eslint/eslint.config.mjs new file mode 100644 index 000000000..84ba50bca --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-app/eslint/eslint.config.mjs @@ -0,0 +1,3 @@ +import eslintVitNode from 'eslint-config-typescript-vitnode/eslint'; + +export default [...eslintVitNode]; diff --git a/packages/create-vitnode-app/copy-of-vitnode-app/root/next.config.ts b/packages/create-vitnode-app/copy-of-vitnode-app/root/next.config.ts new file mode 100644 index 000000000..6d893c582 --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-app/root/next.config.ts @@ -0,0 +1,11 @@ +import type { NextConfig } from 'next'; +import { vitNodeNextConfig } from '@vitnode/core/config/next.config'; + +const nextConfig: NextConfig = { + experimental: { + inlineCss: true, + reactCompiler: true, + }, +}; + +export default vitNodeNextConfig(nextConfig); diff --git a/packages/create-vitnode-app/copy-of-vitnode-app/root/src/vitnode.api.config.ts b/packages/create-vitnode-app/copy-of-vitnode-app/root/src/vitnode.api.config.ts new file mode 100644 index 000000000..8d9af083c --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-app/root/src/vitnode.api.config.ts @@ -0,0 +1,5 @@ +import { buildApiConfig } from '@vitnode/core/vitnode.config'; + +export const vitNodeApiConfig = buildApiConfig({ + plugins: [], +}); diff --git a/packages/create-vitnode-app/eslint.config.mjs b/packages/create-vitnode-app/eslint.config.mjs index d313b602c..e6c0bb936 100644 --- a/packages/create-vitnode-app/eslint.config.mjs +++ b/packages/create-vitnode-app/eslint.config.mjs @@ -7,4 +7,7 @@ export default [ 'no-console': 'off', }, }, + { + ignores: ['copy-of-vitnode-app'], + }, ]; diff --git a/packages/create-vitnode-app/package.json b/packages/create-vitnode-app/package.json index bc96e825e..40cb71dda 100644 --- a/packages/create-vitnode-app/package.json +++ b/packages/create-vitnode-app/package.json @@ -15,7 +15,7 @@ "create-vitnode-app": "dist/src/index.js" }, "scripts": { - "build:cli": "tsc", + "build:cli": "tsc && node dist/src/prepare/prepare.js", "cli": "node dist/src/index.js", "lint": "eslint .", "lint:fix": "eslint . --fix" diff --git a/packages/create-vitnode-app/src/create/create-vitnode.ts b/packages/create-vitnode-app/src/create/create-vitnode.ts index 3e87148b3..7f9749d19 100644 --- a/packages/create-vitnode-app/src/create/create-vitnode.ts +++ b/packages/create-vitnode-app/src/create/create-vitnode.ts @@ -1,6 +1,9 @@ -import { mkdir } from 'fs/promises'; +import { existsSync } from 'fs'; +import { cp, mkdir } from 'fs/promises'; import ora from 'ora'; +import { dirname, join } from 'path'; import color from 'picocolors'; +import { fileURLToPath } from 'url'; import type { CreateCliReturn } from '../questions.js'; @@ -18,15 +21,29 @@ export const createVitNode = async ({ `Creating a new VitNode app in ${color.green(root)}. Using ${color.green(packageManager)}...`, ).start(); - /** - * Create the folder - */ + const __filename = fileURLToPath(import.meta.url); + const __dirname = dirname(__filename); + const templatePath = join(__dirname, '..', '..', '..', 'copy-of-vitnode-app'); + if (!existsSync(templatePath)) { + spinner.fail( + `\n${color.red('Error!')} Template path ${color.cyan(templatePath)} does not exist.`, + ); + process.exit(1); + } + + // Create the folder await mkdir(root, { recursive: true }); if (!isFolderEmpty(root, appName)) { process.exit(1); } + // Copy the template files + spinner.text = 'Copying files...'; + await cp(join(templatePath, 'root'), root, { + recursive: true, + }); + spinner.succeed( - ` ${color.green('Success!')} Created ${color.cyan(appName)} at ${color.cyan(root)}`, + `${color.green('Success!')} Created ${color.cyan(appName)} at ${color.cyan(root)}`, ); }; diff --git a/packages/create-vitnode-app/src/prepare/prepare.ts b/packages/create-vitnode-app/src/prepare/prepare.ts new file mode 100644 index 000000000..b1be7f142 --- /dev/null +++ b/packages/create-vitnode-app/src/prepare/prepare.ts @@ -0,0 +1,21 @@ +import { existsSync } from 'fs'; +import { mkdir } from 'fs/promises'; +import { join } from 'path'; + +const prepare = async () => { + const toRootPath = join(process.cwd(), 'copy-of-vitnode-app'); + if (!existsSync(toRootPath)) { + await mkdir(toRootPath); + } + const fromRootPath = join(process.cwd(), '..', '..', 'apps', 'web'); + if (!existsSync(fromRootPath)) { + console.error( + `\x1b[31mThe path ${fromRootPath} does not exist. Please check the directory structure.\x1b[0m`, + ); + process.exit(1); + } + + console.log(`Project path: ${fromRootPath}`); +}; + +void prepare();