Stack technologiczny
| Framework: | Astro (SSG) |
| Silnik styli: | Tailwind CSS |
| Skrypty: | TypeScript |
| Menadżer pakietów: | Bun |
| Linter: | ESLint |
| Formatter: | Prettier |
| Edytor AI: | Opencode (MiMo V2.5 Free) |
| Framework: | Astro (SSG) |
| Silnik styli: | Tailwind CSS |
| Skrypty: | TypeScript |
| Menadżer pakietów: | Bun |
| Linter: | ESLint |
| Formatter: | Prettier |
| Edytor AI: | Opencode (MiMo V2.5 Free) |
// @ts-check
import { defineConfig, svgoOptimizer } from 'astro/config'
import tailwindcss from '@tailwindcss/vite'
import mdx from '@astrojs/mdx'
import sitemap from '@astrojs/sitemap'
import { DEFAULT_LANGUAGE } from './src/constants'
// https://astro.build/config
export default defineConfig({
site: 'https://herob527.github.io',
base: import.meta.env.DEV ? '/' : '/website',
experimental: {
contentIntellisense: true,
svgOptimizer: svgoOptimizer(),
},
i18n: {
defaultLocale: DEFAULT_LANGUAGE,
locales: [DEFAULT_LANGUAGE, 'en'],
routing: {
prefixDefaultLocale: false,
},
},
integrations: [mdx(), sitemap()],
vite: {
plugins: [tailwindcss()],
},
})import eslint from '@eslint/js'
import tseslint from 'typescript-eslint'
import pluginAstro from 'eslint-plugin-astro'
export default [
eslint.configs.recommended,
...tseslint.configs.strictTypeChecked,
...tseslint.configs.stylisticTypeChecked,
{
files: ['**/*.{ts,tsx,mts,cts}'],
languageOptions: {
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
},
{
files: ['**/*.{js,mjs,cjs}'],
...tseslint.configs.disableTypeChecked,
},
{
rules: {
'no-unused-vars': 'warn',
'no-console': 'warn',
eqeqeq: 'error',
'no-var': 'error',
'prefer-const': 'error',
},
},
...pluginAstro.configs['flat/recommended'],
{
files: ['**/*.astro'],
...tseslint.configs.disableTypeChecked,
languageOptions: {
globals: {
astroHTML: 'readonly',
},
parserOptions: {
parser: tseslint.parser,
project: true,
tsconfigRootDir: import.meta.dirname,
},
},
},
{
ignores: ['dist/', '.astro/', 'node_modules/'],
},
]{
"semi": false,
"singleQuote": true,
"trailingComma": "all",
"printWidth": 80,
"tabWidth": 2,
"plugins": ["prettier-plugin-astro"]
}{
"extends": "astro/tsconfigs/strict",
"include": [".astro/types.d.ts", "**/*"],
"exclude": ["dist"],
"compilerOptions": {
"target": "esnext",
"lib": ["ESNext.Temporal", "ES2022.Array"],
"jsx": "react-jsx",
"jsxImportSource": "react",
"baseUrl": ".",
"paths": {
"@layouts/*": ["src/layouts/*"],
"@components/*": ["src/components/*"],
"@assets/*": ["src/assets/*"],
"@root/*": ["./*"]
}
}
}{
"name": "blog-website",
"type": "module",
"version": "0.0.1",
"engines": {
"node": ">=22.12.0"
},
"scripts": {
"dev": "astro dev",
"build": "astro build",
"preview": "astro preview",
"astro": "astro",
"format": "prettier --write .",
"format:check": "prettier --check .",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"redact-ai": "bun run ./scripts/redact"
},
"dependencies": {
"@astrojs/markdown-remark": "^7.2.1",
"@astrojs/mdx": "^7.0.3",
"@astrojs/sitemap": "^3.7.3",
"@lmstudio/sdk": "^1.5.0",
"@tailwindcss/typography": "^0.5.20",
"@types/bun": "^1.3.14",
"@types/react": "^19.2.17",
"astro": "^7.1.3",
"i18next": "^26.3.6",
"react": "^19.2.7",
"react-dom": "^19.2.7",
"reading-time": "^1.5.0",
"satteri": "^0.9.5",
"tailwindcss": "^4.3.3",
"takumi-js": "^2.4.0",
"yaml": "^2.9.0",
"zod": "^4.4.3"
},
"devDependencies": {
"@eslint/js": "^10.0.1",
"@iconify-json/flagpack": "^1.2.8",
"@iconify-json/mdi": "^1.2.3",
"@iconify/tailwind4": "^1.2.3",
"@tailwindcss/vite": "^4.3.3",
"eslint": "^10.7.0",
"eslint-plugin-astro": "^3.0.1",
"prettier": "^3.9.6",
"prettier-plugin-astro": "^0.14.1",
"typescript": "^6.0.3",
"typescript-eslint": "^8.65.0"
}
}@import 'tailwindcss';
@plugin "@tailwindcss/typography";
@plugin "@iconify/tailwind4";[tools]
bun = "1.3.14"