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 @@
+
+
+
Home page
+
+
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(),
+ ],
+});