diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..20fb69a --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,78 @@ +{ + "env": { + "es2020": true, + "browser": true, + "vue/setup-compiler-macros": true + }, + "extends": [ + "eslint:recommended", + "plugin:import/recommended", + "plugin:import/typescript", + "plugin:@typescript-eslint/recommended", + "plugin:vue/vue3-recommended" + ], + "parserOptions": { + "parser": "@typescript-eslint/parser", + "ecmaVersion": 2020, + "sourceType": "module" + }, + "plugins": ["import", "vue"], + "rules": { + "import/first": "error", + "import/exports-last": "error", + "import/newline-after-import": "error", + "import/prefer-default-export": "error", + "import/group-exports": "error", + "import/no-duplicates": "error", + "import/no-amd": "error", + "import/no-commonjs": "error", + "import/order": [ + "error", + { + "groups": [ + "builtin", + "external", + "internal", + "parent", + "sibling", + "index" + ], + "newlines-between": "always", + "alphabetize": { + "order": "asc" + } + } + ], + "import/no-unused-modules": "error", + "import/no-mutable-exports": "error", + "import/no-extraneous-dependencies": [ + "error", + { "devDependencies": ["vite.config.ts", "test/**/*.test.ts"] } + ], + "@typescript-eslint/explicit-function-return-type": "error", + "vue/component-api-style": ["error", ["script-setup"]], + "vue/custom-event-name-casing": ["error", "kebab-case"], + "vue/no-empty-component-block": "error", + "vue/html-self-closing": "off", + "vue/singleline-html-element-content-newline": "off" + }, + "settings": { + "import/resolver": { + "typescript": {} + } + }, + "overrides": [ + { + "files": ["src/**/*.vue"], + "rules": { + "import/prefer-default-export": "off" + } + }, + { + "files": ["src/pages/**/*.vue"], + "rules": { + "vue/multi-word-component-names": "off" + } + } + ] +} diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..6a49d05 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "monthly" diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..8a9e49b --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,34 @@ +name: CI + +on: + push: + branches: main + pull_request: + branches: main + +jobs: + run: + name: Run + runs-on: ubuntu-latest + + strategy: + fail-fast: false + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + + - name: Clean install + run: bun install + + - name: Lint + run: bun run lint + + - name: Type checking + run: bun run typecheck + + - name: Build + run: bun run build diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1eae0cf --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +dist/ +node_modules/ diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..1b7c70d --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "singleAttributePerLine": true +} diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 0000000..74a01b5 --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,10 @@ +{ + "extends": [ + "stylelint-config-standard", + "stylelint-config-recommended-vue", + "stylelint-config-property-sort-order-smacss" + ], + "rules": { + "media-feature-name-allowed-list": ["width", "prefers-color-scheme"] + } +} diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000..5df634c Binary files /dev/null and b/bun.lockb differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..2171804 --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + App + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..8e64669 --- /dev/null +++ b/package.json @@ -0,0 +1,51 @@ +{ + "name": "starter-app", + "version": "1.0.0", + "description": "Starter Vue app", + "author": { + "name": "Timur Badretdinov", + "url": "https://github.com/Destiner" + }, + "keywords": [ + "vue", + "starter" + ], + "license": "UNLICENSED", + "repository": { + "type": "git", + "url": "git://github.com/Destiner/starter-app.git" + }, + "type": "module", + "scripts": { + "build": "vite build", + "dev": "vite", + "lint": "bun run lint:prettier && bun run lint:eslint && bun run lint:stylelint", + "lint:prettier": "prettier -c \"src/**/*.{json,js,ts,vue}\"", + "lint:eslint": "eslint \"src/**/*.{js,ts,vue}\"", + "lint:stylelint": "stylelint \"src/**/*.{css,vue}\"", + "typecheck": "tsc --noEmit && vue-tsc --noEmit" + }, + "dependencies": { + "vue": "^3.4.19", + "vue-router": "^4.3.0" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/compiler-sfc": "^3.4.19", + "eslint": "^8.57.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-vue": "^9.22.0", + "prettier": "^3.2.5", + "stylelint": "^16.2.1", + "stylelint-config-property-sort-order-smacss": "^10.0.0", + "stylelint-config-recommended-vue": "^1.5.0", + "stylelint-config-standard": "^36.0.0", + "typescript": "^5.4.2", + "vite": "^5.1.4", + "vite-plugin-vue-devtools": "^7.0.16", + "vite-tsconfig-paths": "^4.3.1", + "vue-tsc": "^1.8.27" + } +} diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..cbed770 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,3 @@ + + 🔥 + diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..810ec78 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..8af2b33 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,20 @@ +import { createApp } from 'vue'; +import { createWebHistory, createRouter } from 'vue-router'; + +import Main from '@/pages/Main.vue'; + +import App from './App.vue'; + +const routerHistory = createWebHistory(); +const router = createRouter({ + history: routerHistory, + routes: [{ path: '/', component: Main }], +}); + +const app = createApp(App); + +app.use(router); + +app.mount('#app'); + +export { routerHistory, router }; diff --git a/src/pages/Main.vue b/src/pages/Main.vue new file mode 100644 index 0000000..c5ac289 --- /dev/null +++ b/src/pages/Main.vue @@ -0,0 +1,5 @@ + diff --git a/src/shims.d.ts b/src/shims.d.ts new file mode 100644 index 0000000..1e71a5a --- /dev/null +++ b/src/shims.d.ts @@ -0,0 +1,6 @@ +declare module '*.vue' { + import { ComponentOptions } from 'vue'; + + const component: ComponentOptions; + export default component; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f926af4 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + /* Base */ + "esModuleInterop": true, + "skipLibCheck": true, + "target": "ES2022", + "allowJs": true, + "resolveJsonModule": true, + "moduleDetection": "force", + "isolatedModules": true, + /* Strictness */ + "strict": true, + "noUncheckedIndexedAccess": true, + "forceConsistentCasingInFileNames": true, + "noImplicitAny": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noFallthroughCasesInSwitch": true, + "noPropertyAccessFromIndexSignature": false, + /* No transpiling */ + "moduleResolution": "Bundler", + "module": "preserve", + "noEmit": true, + /* Browser-specific */ + "lib": ["ES2022", "DOM", "DOM.Iterable"], + /* Imports */ + "baseUrl": "src", + "paths": { + "@/*": ["*"] + } + } +} diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..2837e08 --- /dev/null +++ b/vercel.json @@ -0,0 +1,4 @@ +{ + "framework": "vite", + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..75ddb79 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,14 @@ +import vue from '@vitejs/plugin-vue'; +import { defineConfig } from 'vite'; +import VueDevTools from 'vite-plugin-vue-devtools'; +import tsconfigPaths from 'vite-tsconfig-paths'; + +export default defineConfig({ + plugins: [ + tsconfigPaths({ + loose: true, + }), + vue(), + VueDevTools(), + ], +});