@rk-web/create 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/create.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare function createProject(name: string, template: string): Promise<void>;
1
+ export declare function createProject(projectName: string, template: string): Promise<void>;
2
2
  //# sourceMappingURL=create.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAQA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBA6KjE"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAUA,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBA6DxE"}
package/dist/create.js CHANGED
@@ -1,179 +1,79 @@
1
- import fs from 'fs-extra';
1
+ import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
+ import { execSync } from 'node:child_process';
4
5
  import pc from 'picocolors';
6
+ import prompts from 'prompts';
5
7
  const __filename = fileURLToPath(import.meta.url);
6
8
  const __dirname = path.dirname(__filename);
7
- export async function createProject(name, template) {
8
- console.log(pc.blue(`\nСоздание проекта: ${pc.bold(name)}`));
9
+ export async function createProject(projectName, template) {
10
+ console.log(pc.blue(`\nСоздание проекта: ${pc.bold(projectName)}`));
9
11
  console.log(pc.blue(`Шаблон: ${pc.bold(template)}\n`));
10
- const targetDir = path.resolve(process.cwd(), name);
11
- // Проверка существования директории
12
- if (await fs.pathExists(targetDir)) {
13
- const files = await fs.readdir(targetDir);
12
+ const targetDir = path.resolve(process.cwd(), projectName);
13
+ if (fs.existsSync(targetDir)) {
14
+ const files = fs.readdirSync(targetDir);
14
15
  if (files.length > 0) {
15
- console.error(pc.red(`\nОшибка: Директория "${name}" уже существует и не пуста`));
16
+ console.error(pc.red(`\nОшибка: Директория "${projectName}" уже существует и не пуста`));
16
17
  console.error(pc.gray('Удалите директорию или выберите другое имя'));
17
18
  process.exit(1);
18
19
  }
19
20
  }
20
- // Создание директории
21
- await fs.ensureDir(targetDir);
22
- // Копирование шаблона
23
- const templateDir = await resolveTemplateDir(template);
24
- if (!templateDir) {
21
+ // Копирование шаблона из templates/
22
+ const templateDir = path.resolve(__dirname, '../templates', template);
23
+ if (!fs.existsSync(templateDir)) {
25
24
  console.error(pc.red(`\nОшибка: Шаблон "${template}" не найден`));
26
- console.error(pc.gray(`Доступные шаблоны: minimal, blog, portfolio, landing`));
25
+ console.error(pc.gray(`Доступные шаблоны: minimal`));
27
26
  process.exit(1);
28
27
  }
29
- await fs.copy(templateDir, targetDir, {
30
- overwrite: true,
31
- errorOnExist: false
28
+ // Рекурсивное копирование
29
+ copyDirRecursive(templateDir, targetDir);
30
+ // Замена PROJECT_NAME в package.json
31
+ const pkgPath = path.join(targetDir, 'package.json');
32
+ if (fs.existsSync(pkgPath)) {
33
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
34
+ pkg.name = projectName;
35
+ fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
36
+ }
37
+ console.log(pc.green('\n✓ Проект создан!\n'));
38
+ console.log(pc.cyan(` cd ${projectName}`));
39
+ console.log(pc.cyan(' npm install'));
40
+ console.log(pc.cyan(' npm run dev'));
41
+ console.log(pc.cyan(' npm run build # production сборка\n'));
42
+ // Автоматическая установка зависимостей
43
+ const { install } = await prompts({
44
+ type: 'confirm',
45
+ name: 'install',
46
+ message: 'Установить зависимости сейчас?',
47
+ initial: true
32
48
  });
33
- // Создание package.json
34
- const packageJson = {
35
- name,
36
- version: '0.0.1',
37
- private: true,
38
- type: 'module',
39
- scripts: {
40
- dev: 'my-static-builder dev',
41
- build: 'my-static-builder build',
42
- preview: 'my-static-builder preview',
43
- validate: 'my-static-builder validate'
44
- },
45
- devDependencies: {
46
- '@rk-web/core': 'latest',
47
- vite: '^6.4.1'
49
+ if (install) {
50
+ console.log(pc.blue('\nУстановка зависимостей...'));
51
+ try {
52
+ execSync('npm install', { cwd: targetDir, stdio: 'inherit' });
53
+ console.log(pc.green('\n✓ Зависимости установлены!\n'));
54
+ console.log(pc.cyan(` cd ${projectName}`));
55
+ console.log(pc.cyan(' npm run dev\n'));
56
+ }
57
+ catch {
58
+ console.error(pc.red('\nОшибка установки зависимостей'));
59
+ console.error(pc.gray(`Выполните вручную: cd ${projectName} && npm install`));
48
60
  }
49
- };
50
- await fs.writeJson(path.join(targetDir, 'package.json'), packageJson, { spaces: 2 });
51
- // Создание базового config.json если его нет
52
- const configPath = path.join(targetDir, 'config.json');
53
- if (!await fs.pathExists(configPath)) {
54
- const configJson = {
55
- site: {
56
- title: name,
57
- description: 'Описание сайта',
58
- lang: 'ru',
59
- url: 'https://example.com'
60
- },
61
- navigation: [
62
- { label: 'Главная', url: '/' }
63
- ],
64
- footer: {
65
- copyright: new Date().getFullYear().toString()
66
- }
67
- };
68
- await fs.writeJson(configPath, configJson, { spaces: 2 });
69
- }
70
- // Создание vite.config.ts если его нет
71
- const viteConfigPath = path.join(targetDir, 'vite.config.ts');
72
- if (!await fs.pathExists(viteConfigPath)) {
73
- const viteConfig = `import { defineConfig } from 'vite'
74
- import { staticBuilder } from '@rk-web/core'
75
-
76
- export default defineConfig({
77
- plugins: [
78
- staticBuilder({
79
- template: {
80
- includePath: 'src/components',
81
- layoutPath: 'src/layouts',
82
- dataPath: 'src/data',
83
- configFile: 'config.json'
84
- },
85
- images: {
86
- formats: ['avif', 'webp', 'jpg'],
87
- quality: { avif: 50, webp: 80, jpg: 85 },
88
- sizes: [320, 640, 960, 1280, 1920],
89
- placeholder: 'blur',
90
- lazyLoad: true,
91
- decoding: 'async'
92
- },
93
- fonts: {
94
- formats: ['woff2', 'woff'],
95
- subsets: ['cyrillic', 'latin'],
96
- preload: true,
97
- display: 'swap'
98
- },
99
- seo: {
100
- sitemap: true,
101
- robots: true,
102
- manifest: true,
103
- rss: false,
104
- ogImage: true
105
- },
106
- validate: {
107
- html: true,
108
- accessibility: true,
109
- lighthouse: true
110
- },
111
- critical: {
112
- enabled: true,
113
- inline: true
114
- }
115
- })
116
- ]
117
- })
118
- `;
119
- await fs.writeFile(viteConfigPath, viteConfig);
120
- }
121
- // Создание структуры директорий
122
- const dirs = [
123
- 'src/pages',
124
- 'src/components',
125
- 'src/layouts',
126
- 'src/data',
127
- 'src/assets/images',
128
- 'src/assets/styles',
129
- 'src/assets/fonts',
130
- 'src/scripts',
131
- 'public/images',
132
- 'public/fonts'
133
- ];
134
- for (const dir of dirs) {
135
- await fs.ensureDir(path.join(targetDir, dir));
136
61
  }
137
- // Создание .gitignore
138
- const gitignore = `# Dependencies
139
- node_modules/
140
-
141
- # Builds
142
- dist/
143
-
144
- # Environment
145
- .env
146
- .env.*
147
-
148
- # IDE
149
- .vscode/
150
- .idea/
151
-
152
- # OS
153
- .DS_Store
154
- Thumbs.db
155
-
156
- # Cache
157
- .cache/
158
- .vite/
159
- .sharp-cache/
160
- `;
161
- await fs.writeFile(path.join(targetDir, '.gitignore'), gitignore);
162
- console.log(pc.green('\n✓ Проект успешно создан!\n'));
163
- console.log(pc.cyan(` cd ${name}`));
164
- console.log(pc.cyan(' npm install # или pnpm install / yarn install'));
165
- console.log(pc.cyan(' npm run dev # запустить режим разработки\n'));
166
62
  }
167
- async function resolveTemplateDir(template) {
168
- const candidates = [
169
- path.resolve(__dirname, '../templates', template),
170
- path.resolve(__dirname, '../../../templates', template)
171
- ];
172
- for (const candidate of candidates) {
173
- if (await fs.pathExists(candidate)) {
174
- return candidate;
63
+ function copyDirRecursive(src, dest) {
64
+ if (!fs.existsSync(dest)) {
65
+ fs.mkdirSync(dest, { recursive: true });
66
+ }
67
+ const entries = fs.readdirSync(src, { withFileTypes: true });
68
+ for (const entry of entries) {
69
+ const srcPath = path.join(src, entry.name);
70
+ const destPath = path.join(dest, entry.name);
71
+ if (entry.isDirectory()) {
72
+ copyDirRecursive(srcPath, destPath);
73
+ }
74
+ else {
75
+ fs.copyFileSync(srcPath, destPath);
175
76
  }
176
77
  }
177
- return null;
178
78
  }
179
79
  //# sourceMappingURL=create.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { createProject } from './create.js';
1
+ export {};
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js CHANGED
@@ -1,2 +1,31 @@
1
- export { createProject } from './create.js';
1
+ import { Command } from 'commander';
2
+ import pc from 'picocolors';
3
+ import prompts from 'prompts';
4
+ import { createProject } from './create.js';
5
+ const program = new Command();
6
+ program
7
+ .name('create-my-static-builder')
8
+ .description(pc.bold('Создание нового проекта статического сайта'))
9
+ .version('0.0.1');
10
+ program
11
+ .argument('[project-name]', 'Имя проекта')
12
+ .option('-t, --template <name>', 'Шаблон (minimal)', 'minimal')
13
+ .action(async (projectName, options) => {
14
+ let name = projectName;
15
+ if (!name) {
16
+ const response = await prompts({
17
+ type: 'text',
18
+ name: 'name',
19
+ message: 'Введите имя проекта:',
20
+ initial: 'my-site'
21
+ });
22
+ name = response.name;
23
+ }
24
+ if (!name) {
25
+ console.error(pc.red('Имя проекта не указано'));
26
+ process.exit(1);
27
+ }
28
+ await createProject(name, options.template);
29
+ });
30
+ program.parse();
2
31
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,0BAA0B,CAAC;KAChC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;KAClE,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,OAAO;KACJ,QAAQ,CAAC,gBAAgB,EAAE,aAAa,CAAC;KACzC,MAAM,CAAC,uBAAuB,EAAE,kBAAkB,EAAE,SAAS,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,WAA+B,EAAE,OAA6B,EAAE,EAAE;IAC/E,IAAI,IAAI,GAAG,WAAW,CAAA;IAEtB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;YAC7B,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,sBAAsB;YAC/B,OAAO,EAAE,SAAS;SACnB,CAAC,CAAA;QACF,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;IACtB,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAA;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA;AAEJ,OAAO,CAAC,KAAK,EAAE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rk-web/create",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "CLI для создания новых проектов",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -23,8 +23,7 @@
23
23
  "templates"
24
24
  ],
25
25
  "scripts": {
26
- "build": "pnpm run copy:templates && tsc",
27
- "copy:templates": "node ./scripts/copy-templates.mjs",
26
+ "build": "tsc",
28
27
  "dev": "tsc --watch",
29
28
  "lint": "eslint src --ext .ts",
30
29
  "typecheck": "tsc --noEmit",
@@ -40,19 +39,15 @@
40
39
  "dependencies": {
41
40
  "commander": "^12.0.0",
42
41
  "picocolors": "^1.0.0",
43
- "prompts": "^2.4.2",
44
- "fs-extra": "^11.2.0"
42
+ "prompts": "^2.4.2"
45
43
  },
46
44
  "devDependencies": {
47
45
  "@types/node": "^20.11.0",
48
46
  "@types/prompts": "^2.4.9",
49
- "@types/fs-extra": "^11.0.4",
50
- "typescript": "^5.4.0"
47
+ "typescript": "^5.4.0",
48
+ "rimraf": "^6.0.0"
51
49
  },
52
50
  "engines": {
53
51
  "node": ">=18.0.0"
54
- },
55
- "publishConfig": {
56
- "access": "public"
57
52
  }
58
53
  }
@@ -0,0 +1,12 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ indent_style = space
6
+ indent_size = 2
7
+ end_of_line = lf
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.md]
12
+ trim_trailing_whitespace = false
@@ -0,0 +1,8 @@
1
+ {
2
+ "semi": false,
3
+ "singleQuote": true,
4
+ "printWidth": 100,
5
+ "tabWidth": 2,
6
+ "trailingComma": "none",
7
+ "endOfLine": "lf"
8
+ }
@@ -0,0 +1,37 @@
1
+ # Мой сайт
2
+
3
+ Сайт создан на [@rk-web/core](https://github.com/RNKuchin/statik-builder)
4
+
5
+ ## Команды
6
+
7
+ | Команда | Описание |
8
+ |---------|----------|
9
+ | `npm run dev` | Режим разработки |
10
+ | `npm run build` | Сборка production |
11
+ | `npm run preview` | Превью собранного |
12
+ | `npm run validate` | Валидация |
13
+ | `npm run format` | Форматирование кода |
14
+ | `npm run lint` | Линтинг |
15
+
16
+ ## Структура
17
+
18
+ ```
19
+ src/
20
+ ├── pages/ # HTML страницы
21
+ ├── layouts/ # Layout шаблоны
22
+ ├── components/ # Компоненты (header, footer и тд)
23
+ ├── data/ # JSON данные
24
+ ├── assets/ # CSS, шрифты, изображения
25
+ │ ├── styles/
26
+ │ └── fonts/
27
+ └── scripts/ # TypeScript/JS скрипты
28
+ public/ # Статические файлы (копируются как есть)
29
+ ```
30
+
31
+ ## Шаблонизатор
32
+
33
+ - `{{ site.title }}` — переменные из config.json
34
+ - `<!-- for: item in data.items -->` — циклы
35
+ - `<!-- if: condition -->` — условия
36
+ - `<!-- include: components/header.html -->` — компоненты
37
+ - `<!-- layout: base.html -->` — наследование
@@ -4,8 +4,7 @@
4
4
  "description": "Описание моего сайта",
5
5
  "lang": "ru",
6
6
  "url": "https://example.com",
7
- "author": "Разработчик",
8
- "email": "dev@example.com"
7
+ "author": "Имя автора"
9
8
  },
10
9
  "seo": {
11
10
  "ogImage": "images/og-default.jpg",
@@ -17,8 +16,6 @@
17
16
  ],
18
17
  "footer": {
19
18
  "copyright": "2024",
20
- "links": [
21
- { "label": "Политика конфиденциальности", "url": "/privacy/" }
22
- ]
19
+ "links": []
23
20
  }
24
21
  }
@@ -0,0 +1,14 @@
1
+ import js from '@eslint/js'
2
+
3
+ export default [
4
+ js.configs.recommended,
5
+ {
6
+ languageOptions: {
7
+ ecmaVersion: 2020,
8
+ sourceType: 'module'
9
+ },
10
+ rules: {
11
+ 'no-unused-vars': 'warn'
12
+ }
13
+ }
14
+ ]
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "PROJECT_NAME",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview",
10
+ "validate": "vite build --mode validate",
11
+ "lint": "eslint src",
12
+ "format": "prettier --write \"src/**/*.{html,css,ts,js}\"",
13
+ "typecheck": "tsc --noEmit"
14
+ },
15
+ "devDependencies": {
16
+ "@rk-web/core": "0.0.1",
17
+ "@rk-web/vite-plugin-html-template": "0.0.1",
18
+ "@rk-web/vite-plugin-image-optimizer": "0.0.1",
19
+ "@rk-web/vite-plugin-font-optimizer": "0.0.1",
20
+ "@rk-web/vite-plugin-seo": "0.0.1",
21
+ "@rk-web/vite-plugin-validate": "0.0.1",
22
+ "@rk-web/vite-plugin-critical": "0.0.1",
23
+ "@types/node": "^20.11.0",
24
+ "eslint": "^9.0.0",
25
+ "prettier": "^3.2.0",
26
+ "typescript": "^5.4.0",
27
+ "vite": "^5.2.0"
28
+ }
29
+ }
@@ -1,4 +1,3 @@
1
- /* Минимальные стили */
2
1
  * {
3
2
  margin: 0;
4
3
  padding: 0;
@@ -6,7 +5,7 @@
6
5
  }
7
6
 
8
7
  body {
9
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
8
+ font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
10
9
  line-height: 1.6;
11
10
  color: #333;
12
11
  max-width: 1200px;
@@ -27,7 +26,7 @@ nav {
27
26
 
28
27
  nav a {
29
28
  text-decoration: none;
30
- color: #0066cc;
29
+ color: #2563eb;
31
30
  }
32
31
 
33
32
  nav a:hover {
@@ -35,6 +34,7 @@ nav a:hover {
35
34
  }
36
35
 
37
36
  main {
37
+ min-height: 60vh;
38
38
  padding: 2rem 0;
39
39
  }
40
40
 
@@ -42,6 +42,10 @@ h1 {
42
42
  margin-bottom: 1rem;
43
43
  }
44
44
 
45
+ .description {
46
+ color: #666;
47
+ }
48
+
45
49
  footer {
46
50
  padding: 2rem 0;
47
51
  border-top: 1px solid #eee;
@@ -1,5 +1,5 @@
1
1
  <footer>
2
- <p>{{ footer.copyright }} {{ site.author }}</p>
2
+ <p>&copy; {{ footer.copyright }} {{ site.author }}</p>
3
3
  <!-- for: link in footer.links -->
4
4
  <a href="{{ link.url }}">{{ link.label }}</a>
5
5
  <!-- endfor -->
@@ -5,16 +5,16 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>{{ site.title }}</title>
7
7
  <meta name="description" content="{{ site.description }}">
8
-
9
- <!-- SEO -->
10
8
  <meta property="og:title" content="{{ site.title }}">
11
9
  <meta property="og:description" content="{{ site.description }}">
12
10
  <meta property="og:image" content="{{ seo.ogImage }}">
13
11
  <meta property="og:type" content="{{ seo.ogType }}">
14
12
  </head>
15
13
  <body>
14
+ <!-- include: components/header.html -->
15
+
16
16
  <!-- slot: content -->
17
-
17
+
18
18
  <!-- include: components/footer.html -->
19
19
  </body>
20
20
  </html>
@@ -0,0 +1,7 @@
1
+ <!-- layout: base.html -->
2
+
3
+ <!-- slot: content -->
4
+ <main>
5
+ <h1>О нас</h1>
6
+ <p>Страница «О нас» — отредактируйте под себя.</p>
7
+ </main>
@@ -1,12 +1,10 @@
1
- <!-- layout: layouts/base.html -->
1
+ <!-- layout: base.html -->
2
2
 
3
3
  <!-- slot: content -->
4
4
  <main>
5
- <!-- include: components/header.html -->
6
-
7
- <h1>Добро пожаловать</h1>
8
- <p>Это минимальный шаблон для @my-static-builder</p>
9
-
5
+ <h1>Добро пожаловать!</h1>
6
+ <p>Это ваш новый сайт на @rk-web/core</p>
7
+
10
8
  <!-- if: site.description -->
11
9
  <p class="description">{{ site.description }}</p>
12
10
  <!-- endif -->
@@ -1,2 +1,2 @@
1
- // Main script
1
+ // Main script — добавьте свой код сюда
2
2
  console.log('Site loaded')
@@ -0,0 +1,15 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
7
+ "strict": true,
8
+ "noUnusedLocals": true,
9
+ "noUnusedParameters": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "resolveJsonModule": true
13
+ },
14
+ "include": ["vite.config.ts", "src/**/*.ts"]
15
+ }
@@ -0,0 +1,45 @@
1
+ import { defineConfig } from 'vite'
2
+ import { staticBuilder } from '@rk-web/core'
3
+
4
+ export default defineConfig({
5
+ plugins: [
6
+ staticBuilder({
7
+ template: {
8
+ includePath: 'src/components',
9
+ layoutPath: 'src/layouts',
10
+ dataPath: 'src/data',
11
+ configFile: 'config.json'
12
+ },
13
+ images: {
14
+ formats: ['avif', 'webp', 'jpg'],
15
+ quality: { avif: 50, webp: 80, jpg: 85 },
16
+ sizes: [320, 640, 960, 1280, 1920],
17
+ placeholder: 'blur',
18
+ lazyLoad: true,
19
+ decoding: 'async'
20
+ },
21
+ fonts: {
22
+ formats: ['woff2', 'woff'],
23
+ subsets: ['cyrillic', 'latin'],
24
+ preload: true,
25
+ display: 'swap'
26
+ },
27
+ seo: {
28
+ sitemap: true,
29
+ robots: true,
30
+ manifest: true,
31
+ rss: false,
32
+ ogImage: true
33
+ },
34
+ validate: {
35
+ html: true,
36
+ accessibility: true,
37
+ lighthouse: false
38
+ },
39
+ critical: {
40
+ enabled: true,
41
+ inline: true
42
+ }
43
+ })
44
+ ]
45
+ })