diff --git a/.agents/skills/migrate-oxlint/SKILL.md b/.agents/skills/migrate-oxlint/SKILL.md new file mode 100644 index 0000000..4f13ec1 --- /dev/null +++ b/.agents/skills/migrate-oxlint/SKILL.md @@ -0,0 +1,196 @@ +--- +name: migrate-oxlint +description: Guide for migrating a project from ESLint to Oxlint. Use when asked to migrate, convert, or switch a JavaScript/TypeScript project's linter from ESLint to Oxlint. +--- + +This skill guides you through migrating a JavaScript/TypeScript project from ESLint to [Oxlint](https://oxc.rs/docs/guide/usage/linter/). + +## Overview + +Oxlint is a high-performance linter that implements many popular ESLint rules natively in Rust. It can be used alongside ESLint or as a full replacement. + +An official migration tool is available, and will be used by this skill: [`@oxlint/migrate`](https://github.com/oxc-project/oxlint-migrate) + +## Step 1: Run Automated Migration + +Run the migration tool in the project root: + +```bash +npx @oxlint/migrate +``` + +This reads your ESLint flat config (`eslint.config.js` for example) and generates a `.oxlintrc.json` file from it. It will find your ESLint config file automatically in most cases. + +See options below for more info. + +### Key Options + +| Option | Description | +| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `--type-aware` | Include type-aware rules from `@typescript-eslint` (will require the `oxlint-tsgolint` package to be installed after migrating) | +| `--with-nursery` | Include experimental rules still under development, may not be fully stable or consistent with ESLint equivalents | +| `--js-plugins [bool]` | Enable/disable ESLint plugin migration via `jsPlugins` (default: enabled) | +| `--details` | List rules that could not be migrated | +| `--replace-eslint-comments` | Convert all `// eslint-disable` comments to `// oxlint-disable` | +| `--output-file ` | Specify a different output path (default: `.oxlintrc.json`) | + +If your ESLint config is not at the default location, pass the path explicitly: + +```bash +npx @oxlint/migrate ./path/to/eslint.config.js +``` + +## Step 2: Review Generated Config + +After migration, review the generated `.oxlintrc.json`. + +### Plugin Mapping + +The migration tool automatically maps ESLint plugins to oxlint's built-in equivalents. The following table is for reference when reviewing the generated config: + +| ESLint Plugin | Oxlint Plugin Name | +| --------------------------------------------------- | ------------------ | +| `@typescript-eslint/eslint-plugin` | `typescript` | +| `eslint-plugin-react` / `eslint-plugin-react-hooks` | `react` | +| `eslint-plugin-import` / `eslint-plugin-import-x` | `import` | +| `eslint-plugin-unicorn` | `unicorn` | +| `eslint-plugin-jsx-a11y` | `jsx-a11y` | +| `eslint-plugin-react-perf` | `react-perf` | +| `eslint-plugin-promise` | `promise` | +| `eslint-plugin-jest` | `jest` | +| `@vitest/eslint-plugin` | `vitest` | +| `eslint-plugin-jsdoc` | `jsdoc` | +| `eslint-plugin-next` | `nextjs` | +| `eslint-plugin-node` | `node` | +| `eslint-plugin-vue` | `vue` | + +Default plugins (enabled when `plugins` field is omitted): `unicorn`, `typescript`, `oxc`. +Setting the `plugins` array explicitly overrides these defaults. + +ESLint core rules are usable in oxlint without needing to configure a plugin in the config file. + +### Rule Categories + +Oxlint groups rules into categories for bulk configuration, though only `correctness` is enabled by default: + +```json +{ + "categories": { + "correctness": "error", + "suspicious": "warn" + } +} +``` + +Available categories: `correctness` (default: enabled), `suspicious`, `pedantic`, `perf`, `style`, `restriction`, `nursery`. + +Individual rule settings in `rules` override category settings. + +`@oxlint/migrate` will turn `correctness` off to avoid enabling additional rules that weren't enabled by your ESLint config. You can choose to enable additional categories after migration if desired. + +### Check Unmigrated Rules + +Run with `--details` to see which ESLint rules could not be migrated: + +```bash +npx @oxlint/migrate --details +``` + +Review the output and decide whether to keep ESLint for those rules or not. Some rules may be mentioned in the output from `--details` as having equivalents in oxlint that were not automatically mapped by the migration tool. In those cases, consider enabling the equivalent oxlint rule manually after migration. + +## Step 3: Install Oxlint + +Install the core oxlint package (use `yarn install`, `pnpm install`, `vp install`, `bun install`, etc. depending on your package manager): + +```bash +npm install -D oxlint +``` + +If you want to add the `oxlint-tsgolint` package, if you intend to use type-aware rules that require TypeScript type information: + +```bash +npm install -D oxlint-tsgolint +``` + +No other packages besides the above are needed by default, though you will need to keep/install any additional ESLint plugins that were migrated into `jsPlugins`. Do not add `@oxlint/migrate` to the package.json, it is meant for one-off usage. + +## Step 4: Handle Unsupported Features + +Some features require manual attention: + +- Local plugins (relative path imports): Must be migrated manually to `jsPlugins` +- `eslint-plugin-prettier`: Supported, but very slow. It is recommended to use [oxfmt](https://oxc.rs/docs/guide/usage/formatter) instead, or switch to `prettier --check` as a separate step alongside oxlint. +- `settings` in override configs: Oxlint does not support `settings` inside `overrides` blocks. +- ESLint v9+ plugins: Not all work with oxlint's JS Plugins API, but the majority will. + +### Local Plugins + +If you have any custom ESLint rules in the project repo itself, you can migrate them manually after running the migration tool by adding them to the `jsPlugins` field in `.oxlintrc.json`: + +```json +{ + "jsPlugins": ["./path/to/my-plugin.js"], + "rules": { + "local-plugin/rule-name": "error" + } +} +``` + +### External ESLint Plugins + +For ESLint plugins without a built-in oxlint equivalent, use the `jsPlugins` field to load them: + +```json +{ + "jsPlugins": ["eslint-plugin-custom"], + "rules": { + "custom/my-rule": "warn" + } +} +``` + +## Step 5: Update CI and Scripts + +Replace ESLint commands with oxlint. Path arguments are optional; oxlint defaults to the current working directory. + +```bash +# Before +npx eslint src/ +npx eslint --fix src/ + +# After +npx oxlint src/ +npx oxlint --fix src/ +``` + +### Common CLI Options + +| ESLint | oxlint equivalent | +| ------------------------- | ---------------------------------------------- | +| `eslint .` | `oxlint` (default: lints the cwd) | +| `eslint src/` | `oxlint src/` | +| `eslint --fix` | `oxlint --fix` | +| `eslint --max-warnings 0` | `oxlint --deny-warnings` or `--max-warnings 0` | +| `eslint --format json` | `oxlint --format json` | + +Additional oxlint options: + +- `--tsconfig `: Specify tsconfig.json path, likely unnecessary unless you have a non-standard name for `tsconfig.json`. + +## Tips + +- You can run alongside ESLint if necessary: Oxlint is designed to complement ESLint during migration, but with JS Plugins many projects can switch over fully without losing many rules. +- Disable comments work: `// eslint-disable` and `// eslint-disable-next-line` comments are supported by oxlint. Use `--replace-eslint-comments` when running @oxlint/migrate to convert them to `// oxlint-disable` equivalents if desired. +- List available rules: Run `npx oxlint --rules` to see all supported rules, or refer to the [rule documentation](https://oxc.rs/docs/guide/usage/linter/rules.html). +- Schema support: Add `"$schema": "./node_modules/oxlint/configuration_schema.json"` to `.oxlintrc.json` for editor autocompletion if the migration tool didn't do it automatically. +- Output formats: `default`, `stylish`, `json`, `github`, `gitlab`, `junit`, `checkstyle`, `unix` +- Ignore files: `.eslintignore` is supported by oxlint if you have it, but it's recommended to move any ignore patterns into the `ignorePatterns` field in `.oxlintrc.json` for consistency and simplicity. All files and paths ignored via a `.gitignore` file will be ignored by oxlint by default as well. +- If you ran the migration tool multiple times, remove the `.oxlintrc.json.bak` backup file created by the migration tool once you've finished migrating. +- If you are not using any JS Plugins and have replaced your ESLint configuration, you can remove all ESLint packages from your project dependencies. +- Ensure your editor is configured to use oxlint instead of ESLint for linting and error reporting. You may want to install the Oxc extension for your preferred editor. See https://oxc.rs/docs/guide/usage/linter/editors.html for more details. + +## References + +- [CLI Reference](https://oxc.rs/docs/guide/usage/linter/cli.html) +- [Config File Reference](https://oxc.rs/docs/guide/usage/linter/config-file-reference.html) +- [Complete Oxlint rule list and docs](https://oxc.rs/docs/guide/usage/linter/rules.html) diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 6b4f261..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,53 +0,0 @@ -require("@rushstack/eslint-patch/modern-module-resolution") - -const DEV_TOOL_ACTIVATED = - process.env.NODE_ENV === "production" ? "warn" : "off" - -module.exports = { - root: true, - env: { - node: true, - es2022: true, - }, - extends: ["plugin:vue/vue3-essential", "@vue/eslint-config-typescript"], - plugins: ["simple-import-sort", "unused-imports"], - rules: { - "no-console": DEV_TOOL_ACTIVATED, - "no-debugger": DEV_TOOL_ACTIVATED, - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/camelcase": "off", - "prettier-vue/prettier": [ - "error", - { - semi: false, - singleQuote: true, - trailingComma: "none", - arrowParens: "always", - }, - ], - "vue/no-v-html": "off", - "no-restricted-imports": [ - "error", - { - paths: [ - { - name: "vue-demi", - importNames: ["computed"], - message: "Please use computed from vue instead.", - }, - ], - }, - ], - "simple-import-sort/imports": "error", - "simple-import-sort/exports": "error", - "unused-imports/no-unused-imports": "error", - }, - overrides: [ - { - files: [ - "**/__tests__/*.{j,t}s?(x)", - "**/tests/unit/**/*.spec.{j,t}s?(x)", - ], - }, - ], -} diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 0000000..2d1b127 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,9 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "semi": false, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 80, + "sortPackageJson": false, + "ignorePatterns": [] +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..dcf57e3 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,40 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript"], + "jsPlugins": [ + "eslint-plugin-prettier-vue", + "eslint-plugin-simple-import-sort", + "eslint-plugin-unused-imports" + ], + "categories": { + "correctness": "off" + }, + "env": { + "builtin": true + }, + "rules": { + "no-restricted-imports": [ + "error", + { + "paths": [ + { + "name": "vue-demi", + "importNames": ["computed"], + "message": "Please use computed from vue instead." + } + ] + } + ], + "simple-import-sort/imports": "error", + "simple-import-sort/exports": "error", + "unused-imports/no-unused-imports": "error" + }, + "overrides": [ + { + "files": ["**/*.vue"], + "rules": { + "unused-imports/no-unused-imports": "off" + } + } + ] +} diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index cce9d3c..0000000 --- a/.prettierrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "semi": false -} diff --git a/_scripts/change-theme-dark.ts b/_scripts/change-theme-dark.ts index 2fd2d4b..293fa01 100644 --- a/_scripts/change-theme-dark.ts +++ b/_scripts/change-theme-dark.ts @@ -3,42 +3,43 @@ // Script pour changer facilement le thème sombre de l'application Remanso // Usage: pnpm run theme:dark [theme-name] -import { readFileSync, writeFileSync } from "fs" -import { join } from "path" -import { commitTheme } from "./change-theme" +import { readFileSync, writeFileSync } from 'fs' +import { join } from 'path' + +import { commitTheme } from './change-theme' // Chemins vers les fichiers -const themeConfigPath = join(__dirname, "..", "src", "theme.config.ts") -const appCssPath = join(__dirname, "..", "src", "styles", "app.css") +const themeConfigPath = join(__dirname, '..', 'src', 'theme.config.ts') +const appCssPath = join(__dirname, '..', 'src', 'styles', 'app.css') // Vérifier les arguments if (process.argv.length < 3) { - console.log("Usage: pnpm run theme:dark [theme-name]") - console.log("Exemple: pnpm run theme:dark business") + console.log('Usage: pnpm run theme:dark [theme-name]') + console.log('Exemple: pnpm run theme:dark business') process.exit(1) } // Mode fixé à dark pour ce script -const mode = "dark" +const mode = 'dark' const newTheme = process.argv[2] // nom du nouveau thème // Lire le contenu actuel du fichier de configuration -let themeConfigContent = readFileSync(themeConfigPath, "utf8") +let themeConfigContent = readFileSync(themeConfigPath, 'utf8') // Remplacer la valeur du thème sombre themeConfigContent = themeConfigContent.replace( /dark:\s*['"][^'"]*['"],/, - `dark: '${newTheme}',`, + `dark: '${newTheme}',` ) // Écrire le contenu mis à jour dans le fichier writeFileSync(themeConfigPath, themeConfigContent) // Mettre à jour également le fichier app.css pour le thème --prefersdark -let appCssContent = readFileSync(appCssPath, "utf8") +let appCssContent = readFileSync(appCssPath, 'utf8') appCssContent = appCssContent.replace( /(\s+)([a-zA-Z0-9-]+)(\s+--prefersdark;)/, - `$1${newTheme}$3`, + `$1${newTheme}$3` ) writeFileSync(appCssPath, appCssContent) diff --git a/_scripts/change-theme-light.ts b/_scripts/change-theme-light.ts index f21f21d..b3d703a 100644 --- a/_scripts/change-theme-light.ts +++ b/_scripts/change-theme-light.ts @@ -3,51 +3,52 @@ // Script pour changer facilement le thème clair de l'application Remanso // Usage: pnpm run theme:light [theme-name] -import { readFileSync, writeFileSync } from "fs" -import { join } from "path" -import { commitTheme } from "./change-theme" +import { readFileSync, writeFileSync } from 'fs' +import { join } from 'path' + +import { commitTheme } from './change-theme' // Chemins vers les fichiers -const themeConfigPath = join(__dirname, "..", "src", "theme.config.ts") -const indexPath = join(__dirname, "..", "index.html") -const appCssPath = join(__dirname, "..", "src", "styles", "app.css") +const themeConfigPath = join(__dirname, '..', 'src', 'theme.config.ts') +const indexPath = join(__dirname, '..', 'index.html') +const appCssPath = join(__dirname, '..', 'src', 'styles', 'app.css') // Vérifier les arguments if (process.argv.length < 3) { - console.log("Usage: pnpm run theme:light [theme-name]") - console.log("Exemple: pnpm run theme:light cupcake") + console.log('Usage: pnpm run theme:light [theme-name]') + console.log('Exemple: pnpm run theme:light cupcake') process.exit(1) } // Mode fixé à light pour ce script -const mode = "light" +const mode = 'light' const newTheme = process.argv[2] // nom du nouveau thème // Lire le contenu actuel du fichier de configuration -let themeConfigContent = readFileSync(themeConfigPath, "utf8") +let themeConfigContent = readFileSync(themeConfigPath, 'utf8') // Remplacer la valeur du thème clair themeConfigContent = themeConfigContent.replace( /light:\s*['"][^'"]*['"],/, - `light: '${newTheme}',`, + `light: '${newTheme}',` ) // Écrire le contenu mis à jour dans le fichier writeFileSync(themeConfigPath, themeConfigContent) // Mettre à jour également le fichier index.html -let indexContent = readFileSync(indexPath, "utf8") +let indexContent = readFileSync(indexPath, 'utf8') indexContent = indexContent.replace( /data-theme="[^"]*"/, - `data-theme="${newTheme}"`, + `data-theme="${newTheme}"` ) writeFileSync(indexPath, indexContent) // Mettre à jour également le fichier app.css pour le thème --default -let appCssContent = readFileSync(appCssPath, "utf8") +let appCssContent = readFileSync(appCssPath, 'utf8') appCssContent = appCssContent.replace( /(\s+)([a-zA-Z0-9-]+)(\s+--default,)/, - `$1${newTheme}$3`, + `$1${newTheme}$3` ) writeFileSync(appCssPath, appCssContent) diff --git a/_scripts/change-theme.ts b/_scripts/change-theme.ts index 56be997..556d263 100644 --- a/_scripts/change-theme.ts +++ b/_scripts/change-theme.ts @@ -1,22 +1,22 @@ -import { execSync } from "child_process" +import { execSync } from 'child_process' export const commitTheme = (mode: string, newTheme: string) => { // Créer un commit avec les changements try { // Ajouter tous les fichiers modifiés - execSync("git add .", { stdio: "inherit" }) + execSync('git add .', { stdio: 'inherit' }) // Créer le commit avec le message approprié const commitMessage = `design: change ${mode} theme to ${newTheme}` - execSync(`git commit -m "${commitMessage}"`, { stdio: "inherit" }) + execSync(`git commit -m "${commitMessage}"`, { stdio: 'inherit' }) console.log(`Commit créé avec succès: "${commitMessage}"`) - execSync(`git push`, { stdio: "inherit" }) + execSync(`git push`, { stdio: 'inherit' }) console.log(`Push sur origin`) } catch (error) { - console.error("Erreur lors de la création du commit:", error) + console.error('Erreur lors de la création du commit:', error) process.exit(1) } } diff --git a/docs/bugs/rolldown-while-in-globalThis.md b/docs/bugs/rolldown-while-in-globalThis.md index 084142e..f977cf1 100644 --- a/docs/bugs/rolldown-while-in-globalThis.md +++ b/docs/bugs/rolldown-while-in-globalThis.md @@ -26,11 +26,10 @@ Rolldown's minifier drops the `while(`/`for(;` keyword when a `while (x in globa File: `node_modules/@ark/schema/out/shared/registry.js` ```js -let _registryName = "$ark"; -let suffix = 2; -while (_registryName in globalThis) - _registryName = `$ark${suffix++}`; -export const registryName = _registryName; +let _registryName = '$ark' +let suffix = 2 +while (_registryName in globalThis) _registryName = `$ark${suffix++}` +export const registryName = _registryName ``` ## Actual minified output @@ -44,7 +43,10 @@ The `while(` keyword is missing. The orphaned `)` is a syntax error. ## Expected output ```js -var dn=`$ark`,fn=2;for(;dn in globalThis;)dn=`$ark${fn++}`;var pn=dn; +var dn = `$ark`, + fn = 2 +for (; dn in globalThis; ) dn = `$ark${fn++}` +var pn = dn ``` ## Impact diff --git a/netlify.toml b/netlify.toml index 3cd2705..b3fa18b 100644 --- a/netlify.toml +++ b/netlify.toml @@ -9,9 +9,9 @@ status = 200 [[headers]] for = "/client-metadata.json" - [headers.values] - Access-Control-Allow-Origin = "*" - Content-Type = "application/json" +[headers.values] +Access-Control-Allow-Origin = "*" +Content-Type = "application/json" [[redirects]] from = "/client-metadata.json" diff --git a/package.json b/package.json index 6c86eca..a3e14b0 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,10 @@ "serve": "vite preview", "test": "vitest", "types": "tsc --noEmit", - "lint": "eslint --ext .ts,.js,.vue --ignore-path .gitignore --fix src", + "lint": "oxlint", + "lint:fix": "oxlint --fix", + "fmt": "oxfmt", + "fmt:check": "oxfmt --check", "prepare": "husky", "theme:light": "esno _scripts/change-theme-light.ts", "theme:dark": "esno _scripts/change-theme-dark.ts", @@ -85,6 +88,8 @@ "eslint-plugin-vue": "^10.8.0", "esno": "^4.8.0", "husky": "^9.1.7", + "oxfmt": "^0.42.0", + "oxlint": "^1.57.0", "prettier": "^3.8.1", "prettier-vue": "^1.1.2", "sass": "^1.98.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 618a17c..bc026be 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -213,6 +213,12 @@ importers: husky: specifier: ^9.1.7 version: 9.1.7 + oxfmt: + specifier: ^0.42.0 + version: 0.42.0 + oxlint: + specifier: ^1.57.0 + version: 1.57.0 prettier: specifier: ^3.8.1 version: 3.8.1 @@ -1405,6 +1411,250 @@ packages: '@oxc-project/types@0.120.0': resolution: {integrity: sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==} + '@oxfmt/binding-android-arm-eabi@0.42.0': + resolution: {integrity: sha512-dsqPTYsozeokRjlrt/b4E7Pj0z3eS3Eg74TWQuuKbjY4VttBmA88rB7d50Xrd+TZ986qdXCNeZRPEzZHAe+jow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.42.0': + resolution: {integrity: sha512-t+aAjHxcr5eOBphFHdg1ouQU9qmZZoRxnX7UOJSaTwSoKsb6TYezNKO0YbWytGXCECObRqNcUxPoPr0KaraAIg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.42.0': + resolution: {integrity: sha512-ulpSEYMKg61C5bRMZinFHrKJYRoKGVbvMEXA5zM1puX3O9T6Q4XXDbft20yrDijpYWeuG59z3Nabt+npeTsM1A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.42.0': + resolution: {integrity: sha512-ttxLKhQYPdFiM8I/Ri37cvqChE4Xa562nNOsZFcv1CKTVLeEozXjKuYClNvxkXmNlcF55nzM80P+CQkdFBu+uQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.42.0': + resolution: {integrity: sha512-Og7QS3yI3tdIKYZ58SXik0rADxIk2jmd+/YvuHRyKULWpG4V2fR5V4hvKm624Mc0cQET35waPXiCQWvjQEjwYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.42.0': + resolution: {integrity: sha512-jwLOw/3CW4H6Vxcry4/buQHk7zm9Ne2YsidzTL1kpiMe4qqrRCwev3dkyWe2YkFmP+iZCQ7zku4KwjcLRoh8ew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.42.0': + resolution: {integrity: sha512-XwXu2vkMtiq2h7tfvN+WA/9/5/1IoGAVCFPiiQUvcAuG3efR97KNcRGM8BetmbYouFotQ2bDal3yyjUx6IPsTg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.42.0': + resolution: {integrity: sha512-ea7s/XUJoT7ENAtUQDudFe3nkSM3e3Qpz4nJFRdzO2wbgXEcjnchKLEsV3+t4ev3r8nWxIYr9NRjPWtnyIFJVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.42.0': + resolution: {integrity: sha512-+JA0YMlSdDqmacygGi2REp57c3fN+tzARD8nwsukx9pkCHK+6DkbAA9ojS4lNKsiBjIW8WWa0pBrBWhdZEqfuw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.42.0': + resolution: {integrity: sha512-VfnET0j4Y5mdfCzh5gBt0NK28lgn5DKx+8WgSMLYYeSooHhohdbzwAStLki9pNuGy51y4I7IoW8bqwAaCMiJQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.42.0': + resolution: {integrity: sha512-gVlCbmBkB0fxBWbhBj9rcxezPydsQHf4MFKeHoTSPicOQ+8oGeTQgQ8EeesSybWeiFPVRx3bgdt4IJnH6nOjAA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.42.0': + resolution: {integrity: sha512-zN5OfstL0avgt/IgvRu0zjQzVh/EPkcLzs33E9LMAzpqlLWiPWeMDZyMGFlSRGOdDjuNmlZBCgj0pFnK5u32TQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.42.0': + resolution: {integrity: sha512-9X6+H2L0qMc2sCAgO9HS03bkGLMKvOFjmEdchaFlany3vNZOjnVui//D8k/xZAtQv2vaCs1reD5KAgPoIU4msA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.42.0': + resolution: {integrity: sha512-BajxJ6KQvMMdpXGPWhBGyjb2Jvx4uec0w+wi6TJZ6Tv7+MzPwe0pO8g5h1U0jyFgoaF7mDl6yKPW3ykWcbUJRw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.42.0': + resolution: {integrity: sha512-0wV284I6vc5f0AqAhgAbHU2935B4bVpncPoe5n/WzVZY/KnHgqxC8iSFGeSyLWEgstFboIcWkOPck7tqbdHkzA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.42.0': + resolution: {integrity: sha512-p4BG6HpGnhfgHk1rzZfyR6zcWkE7iLrWxyehHfXUy4Qa5j3e0roglFOdP/Nj5cJJ58MA3isQ5dlfkW2nNEpolw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.42.0': + resolution: {integrity: sha512-mn//WV60A+IetORDxYieYGAoQso4KnVRRjORDewMcod4irlRe0OSC7YPhhwaexYNPQz/GCFk+v9iUcZ2W22yxQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.42.0': + resolution: {integrity: sha512-3gWltUrvuz4LPJXWivoAxZ28Of2O4N7OGuM5/X3ubPXCEV8hmgECLZzjz7UYvSDUS3grfdccQwmjynm+51EFpw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.42.0': + resolution: {integrity: sha512-Wg4TMAfQRL9J9AZevJ/ZNy3uyyDztDYQtGr4P8UyyzIhLhFrdSmz1J/9JT+rv0fiCDLaFOBQnj3f3K3+a5PzDQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.57.0': + resolution: {integrity: sha512-C7EiyfAJG4B70496eV543nKiq5cH0o/xIh/ufbjQz3SIvHhlDDsyn+mRFh+aW8KskTyUpyH2LGWL8p2oN6bl1A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.57.0': + resolution: {integrity: sha512-9i80AresjZ/FZf5xK8tKFbhQnijD4s1eOZw6/FHUwD59HEZbVLRc2C88ADYJfLZrF5XofWDiRX/Ja9KefCLy7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.57.0': + resolution: {integrity: sha512-0eUfhRz5L2yKa9I8k3qpyl37XK3oBS5BvrgdVIx599WZK63P8sMbg+0s4IuxmIiZuBK68Ek+Z+gcKgeYf0otsg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.57.0': + resolution: {integrity: sha512-UvrSuzBaYOue+QMAcuDITe0k/Vhj6KZGjfnI6x+NkxBTke/VoM7ZisaxgNY0LWuBkTnd1OmeQfEQdQ48fRjkQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.57.0': + resolution: {integrity: sha512-wtQq0dCoiw4bUwlsNVDJJ3pxJA218fOezpgtLKrbQqUtQJcM9yP8z+I9fu14aHg0uyAxIY+99toL6uBa2r7nxA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.57.0': + resolution: {integrity: sha512-qxFWl2BBBFcT4djKa+OtMdnLgoHEJXpqjyGwz8OhW35ImoCwR5qtAGqApNYce5260FQqoAHW8S8eZTjiX67Tsg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.57.0': + resolution: {integrity: sha512-SQoIsBU7J0bDW15/f0/RvxHfY3Y0+eB/caKBQtNFbuerTiA6JCYx9P1MrrFTwY2dTm/lMgTSgskvCEYk2AtG/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.57.0': + resolution: {integrity: sha512-jqxYd1W6WMeozsCmqe9Rzbu3SRrGTyGDAipRlRggetyYbUksJqJKvUNTQtZR/KFoJPb+grnSm5SHhdWrywv3RQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-arm64-musl@1.57.0': + resolution: {integrity: sha512-i66WyEPVEvq9bxRUCJ/MP5EBfnTDN3nhwEdFZFTO5MmLLvzngfWEG3NSdXQzTT3vk5B9i6C2XSIYBh+aG6uqyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-ppc64-gnu@1.57.0': + resolution: {integrity: sha512-oMZDCwz4NobclZU3pH+V1/upVlJZiZvne4jQP+zhJwt+lmio4XXr4qG47CehvrW1Lx2YZiIHuxM2D4YpkG3KVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-gnu@1.57.0': + resolution: {integrity: sha512-uoBnjJ3MMEBbfnWC1jSFr7/nSCkcQYa72NYoNtLl1imshDnWSolYCjzb8LVCwYCCfLJXD+0gBLD7fyC14c0+0g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-musl@1.57.0': + resolution: {integrity: sha512-BdrwD7haPZ8a9KrZhKJRSj6jwCor+Z8tHFZ3PT89Y3Jq5v3LfMfEePeAmD0LOTWpiTmzSzdmyw9ijneapiVHKQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-s390x-gnu@1.57.0': + resolution: {integrity: sha512-BNs+7ZNsRstVg2tpNxAXfMX/Iv5oZh204dVyb8Z37+/gCh+yZqNTlg6YwCLIMPSk5wLWIGOaQjT0GUOahKYImw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-gnu@1.57.0': + resolution: {integrity: sha512-AghS18w+XcENcAX0+BQGLiqjpqpaxKJa4cWWP0OWNLacs27vHBxu7TYkv9LUSGe5w8lOJHeMxcYfZNOAPqw2bg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-musl@1.57.0': + resolution: {integrity: sha512-E/FV3GB8phu/Rpkhz5T96hAiJlGzn91qX5yj5gU754P5cmVGXY1Jw/VSjDSlZBCY3VHjsVLdzgdkJaomEmcNOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/binding-openharmony-arm64@1.57.0': + resolution: {integrity: sha512-xvZ2yZt0nUVfU14iuGv3V25jpr9pov5N0Wr28RXnHFxHCRxNDMtYPHV61gGLhN9IlXM96gI4pyYpLSJC5ClLCQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.57.0': + resolution: {integrity: sha512-Z4D8Pd0AyHBKeazhdIXeUUy5sIS3Mo0veOlzlDECg6PhRRKgEsBJCCV1n+keUZtQ04OP+i7+itS3kOykUyNhDg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.57.0': + resolution: {integrity: sha512-StOZ9nFMVKvevicbQfql6Pouu9pgbeQnu60Fvhz2S6yfMaii+wnueLnqQ5I1JPgNF0Syew4voBlAaHD13wH6tw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.57.0': + resolution: {integrity: sha512-6PuxhYgth8TuW0+ABPOIkGdBYw+qYGxgIdXPHSVpiCDm+hqTTWCmC739St1Xni0DJBt8HnSHTG67i1y6gr8qrA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@parcel/watcher-android-arm64@2.5.0': resolution: {integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==} engines: {node: '>= 10.0.0'} @@ -5017,6 +5267,21 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + oxfmt@0.42.0: + resolution: {integrity: sha512-QhejGErLSMReNuZ6vxgFHDyGoPbjTRNi6uGHjy0cvIjOQFqD6xmr/T+3L41ixR3NIgzcNiJ6ylQKpvShTgDfqg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + oxlint@1.57.0: + resolution: {integrity: sha512-DGFsuBX5MFZX9yiDdtKjTrYPq45CZ8Fft6qCltJITYZxfwYjVdGf/6wycGYTACloauwIPxUnYhBVeZbHvleGhw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.15.0' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + p-cancelable@0.3.0: resolution: {integrity: sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==} engines: {node: '>=4'} @@ -5907,6 +6172,10 @@ packages: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} @@ -7872,6 +8141,120 @@ snapshots: '@oxc-project/types@0.120.0': {} + '@oxfmt/binding-android-arm-eabi@0.42.0': + optional: true + + '@oxfmt/binding-android-arm64@0.42.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.42.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.42.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.42.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.42.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.42.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.42.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.42.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.42.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.42.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.42.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.42.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.42.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.42.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.42.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.42.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.42.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.42.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.57.0': + optional: true + + '@oxlint/binding-android-arm64@1.57.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.57.0': + optional: true + + '@oxlint/binding-darwin-x64@1.57.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.57.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.57.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.57.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.57.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.57.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.57.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.57.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.57.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.57.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.57.0': + optional: true + '@parcel/watcher-android-arm64@2.5.0': optional: true @@ -11839,6 +12222,52 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxfmt@0.42.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.42.0 + '@oxfmt/binding-android-arm64': 0.42.0 + '@oxfmt/binding-darwin-arm64': 0.42.0 + '@oxfmt/binding-darwin-x64': 0.42.0 + '@oxfmt/binding-freebsd-x64': 0.42.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.42.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.42.0 + '@oxfmt/binding-linux-arm64-gnu': 0.42.0 + '@oxfmt/binding-linux-arm64-musl': 0.42.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.42.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.42.0 + '@oxfmt/binding-linux-riscv64-musl': 0.42.0 + '@oxfmt/binding-linux-s390x-gnu': 0.42.0 + '@oxfmt/binding-linux-x64-gnu': 0.42.0 + '@oxfmt/binding-linux-x64-musl': 0.42.0 + '@oxfmt/binding-openharmony-arm64': 0.42.0 + '@oxfmt/binding-win32-arm64-msvc': 0.42.0 + '@oxfmt/binding-win32-ia32-msvc': 0.42.0 + '@oxfmt/binding-win32-x64-msvc': 0.42.0 + + oxlint@1.57.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.57.0 + '@oxlint/binding-android-arm64': 1.57.0 + '@oxlint/binding-darwin-arm64': 1.57.0 + '@oxlint/binding-darwin-x64': 1.57.0 + '@oxlint/binding-freebsd-x64': 1.57.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.57.0 + '@oxlint/binding-linux-arm-musleabihf': 1.57.0 + '@oxlint/binding-linux-arm64-gnu': 1.57.0 + '@oxlint/binding-linux-arm64-musl': 1.57.0 + '@oxlint/binding-linux-ppc64-gnu': 1.57.0 + '@oxlint/binding-linux-riscv64-gnu': 1.57.0 + '@oxlint/binding-linux-riscv64-musl': 1.57.0 + '@oxlint/binding-linux-s390x-gnu': 1.57.0 + '@oxlint/binding-linux-x64-gnu': 1.57.0 + '@oxlint/binding-linux-x64-musl': 1.57.0 + '@oxlint/binding-openharmony-arm64': 1.57.0 + '@oxlint/binding-win32-arm64-msvc': 1.57.0 + '@oxlint/binding-win32-ia32-msvc': 1.57.0 + '@oxlint/binding-win32-x64-msvc': 1.57.0 + p-cancelable@0.3.0: {} p-finally@1.0.0: {} @@ -12836,6 +13265,8 @@ snapshots: tinypool@1.1.1: {} + tinypool@2.1.0: {} + tinyrainbow@2.0.0: {} tinyspy@4.0.3: {} diff --git a/postcss.config.js b/postcss.config.js index bd887d4..375342d 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,3 +1,3 @@ module.exports = { - plugins: { "@tailwindcss/postcss": {}, autoprefixer: {} }, + plugins: { '@tailwindcss/postcss': {}, autoprefixer: {} } } diff --git a/public/client-metadata.json b/public/client-metadata.json index 76718e8..b495432 100644 --- a/public/client-metadata.json +++ b/public/client-metadata.json @@ -2,9 +2,7 @@ "client_id": "https://remanso.space/client-metadata.json", "client_name": "Remanso", "client_uri": "https://remanso.space", - "redirect_uris": [ - "https://remanso.space/" - ], + "redirect_uris": ["https://remanso.space/"], "scope": "atproto transition:generic", "grant_types": ["authorization_code", "refresh_token"], "response_types": ["code"], diff --git a/pwa-assets.config.ts b/pwa-assets.config.ts index 440aa7a..145bd5f 100644 --- a/pwa-assets.config.ts +++ b/pwa-assets.config.ts @@ -1,9 +1,9 @@ import { defineConfig, - minimal2023Preset as preset, -} from "@vite-pwa/assets-generator/config" + minimal2023Preset as preset +} from '@vite-pwa/assets-generator/config' export default defineConfig({ preset, - images: ["public/favicon.png"], + images: ['public/favicon.png'] }) diff --git a/skills-lock.json b/skills-lock.json new file mode 100644 index 0000000..c705162 --- /dev/null +++ b/skills-lock.json @@ -0,0 +1,10 @@ +{ + "version": 1, + "skills": { + "migrate-oxlint": { + "source": "oxc-project/oxc", + "sourceType": "github", + "computedHash": "80ce5201b1ef52d6cabe553a4cacfd6e1db97bad99618216b9cf9318d11d7e64" + } + } +} diff --git a/tailwind.config.js b/tailwind.config.js index 44deb55..add0deb 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,67 +1,67 @@ /** @type {import('tailwindcss').Config} */ -const dotenv = require("dotenv") +const dotenv = require('dotenv') dotenv.config() const defaultTitleStyles = Array.from( { length: 6 }, - (_, k) => `h${k + 1}`, + (_, k) => `h${k + 1}` ).reduce( (acc, heading) => ({ ...acc, [heading]: { - "margin-top": "0", - "margin-bottom": "0.5em", - }, + 'margin-top': '0', + 'margin-bottom': '0.5em' + } }), - {}, + {} ) -const BOX_SHADOW = "6px" +const BOX_SHADOW = '6px' module.exports = { - content: ["./src/**/*.{vue,js,ts}"], + content: ['./src/**/*.{vue,js,ts}'], theme: { extend: { typography: () => ({ DEFAULT: { css: { ...defaultTitleStyles, - "font-size": "13pt", - "font-family": '"Libertinus Serif", serif', + 'font-size': '13pt', + 'font-family': '"Libertinus Serif", serif', p: { - "margin-top": "0.8em", - "margin-bottom": "0.8em", - "text-align": "left", + 'margin-top': '0.8em', + 'margin-bottom': '0.8em', + 'text-align': 'left' // "text-wrap": "balance", }, - "img, video": { - margin: "auto", - "border-radius": "0.5rem", - "box-shadow": - "rgba(50, 50, 93, 0.25) 0px 6px 12px -2px, rgba(0, 0, 0, 0.3) 0px 3px 7px -3px", - "max-width": `calc(100% - 2 * ${BOX_SHADOW})`, + 'img, video': { + margin: 'auto', + 'border-radius': '0.5rem', + 'box-shadow': + 'rgba(50, 50, 93, 0.25) 0px 6px 12px -2px, rgba(0, 0, 0, 0.3) 0px 3px 7px -3px', + 'max-width': `calc(100% - 2 * ${BOX_SHADOW})` }, a: { - "font-weight": 600, + 'font-weight': 600, // "text-decoration": "wavy underline var(--color-contrast-content)", // "text-decoration-thickness": "0.1em", - "text-decoration": "none", - color: "var(--color-accent)", + 'text-decoration': 'none', + color: 'var(--color-accent)' }, - "a.btn-primary": { - color: "var(--color-secondary-content)", + 'a.btn-primary': { + color: 'var(--color-secondary-content)' }, - "a:hover": { - "text-decoration": "underline", + 'a:hover': { + 'text-decoration': 'underline' }, li: { - "margin-top": 0, - "margin-bottom": 0, - }, - }, - }, - }), - }, - }, + 'margin-top': 0, + 'margin-bottom': 0 + } + } + } + }) + } + } } diff --git a/tsconfig.json b/tsconfig.json index e8c9e4f..83fc15b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,6 +9,7 @@ "esModuleInterop": true, "allowSyntheticDefaultImports": true, "sourceMap": true, + "moduleResolution": "bundler", "resolveJsonModule": true, "types": ["node", "vite/client", "vite-plugin-pwa/vue"], "paths": { diff --git a/vite.config.mts b/vite.config.mts index a86468c..3bff4ca 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -1,87 +1,87 @@ -import vue from "@vitejs/plugin-vue" -import path from "path" -import { defineConfig, type UserConfigExport } from "vite" -import { VitePWA } from "vite-plugin-pwa" +import vue from '@vitejs/plugin-vue' +import path from 'path' +import { defineConfig, type UserConfigExport } from 'vite' +import { VitePWA } from 'vite-plugin-pwa' export default defineConfig(({ command }) => { const config: UserConfigExport = { build: { - minify: "esbuild", + minify: 'esbuild' }, plugins: [ vue(), VitePWA({ - registerType: "prompt", + registerType: 'prompt', includeAssets: [ - "favicon.ico", - "apple-touch-icon.png", - "apple-touch-icon-180x180.png", - "favicon.png", - "pwa-64x64.png", - "pwa-192x192.png", - "pwa-512x512.png", - "masked-icon.png", - "maskable-icon-512x512.png", - "monochrome-icon.png", - "assets/*.svg", + 'favicon.ico', + 'apple-touch-icon.png', + 'apple-touch-icon-180x180.png', + 'favicon.png', + 'pwa-64x64.png', + 'pwa-192x192.png', + 'pwa-512x512.png', + 'masked-icon.png', + 'maskable-icon-512x512.png', + 'monochrome-icon.png', + 'assets/*.svg' ], manifest: { - name: "Remanso", - short_name: "Remanso", - description: "Note taking & sharing app", - background_color: "#ffa4c0", - theme_color: "#ffa4c0", + name: 'Remanso', + short_name: 'Remanso', + description: 'Note taking & sharing app', + background_color: '#ffa4c0', + theme_color: '#ffa4c0', icons: [ { - src: "pwa-64x64.png", - sizes: "64x64", - type: "image/png", + src: 'pwa-64x64.png', + sizes: '64x64', + type: 'image/png' }, { - src: "pwa-192x192.png", - sizes: "192x192", - type: "image/png", + src: 'pwa-192x192.png', + sizes: '192x192', + type: 'image/png' }, { - src: "pwa-512x512.png", - sizes: "512x512", - type: "image/png", + src: 'pwa-512x512.png', + sizes: '512x512', + type: 'image/png' }, { - src: "favicon.png", - sizes: "1024x1024", - type: "image/png", + src: 'favicon.png', + sizes: '1024x1024', + type: 'image/png' }, { - src: "maskable-icon-512x512.png", - sizes: "512x512", - type: "image/png", - purpose: "maskable", + src: 'maskable-icon-512x512.png', + sizes: '512x512', + type: 'image/png', + purpose: 'maskable' }, { - src: "monochrome-icon.png", - sizes: "1024x1024", - type: "image/png", - purpose: "monochrome", - }, - ], - }, - }), + src: 'monochrome-icon.png', + sizes: '1024x1024', + type: 'image/png', + purpose: 'monochrome' + } + ] + } + }) ], resolve: { alias: { - "@": path.resolve(__dirname, "./src"), - "node-fetch": "isomorphic-fetch", - }, - }, + '@': path.resolve(__dirname, './src'), + 'node-fetch': 'isomorphic-fetch' + } + } } - if (command === "serve") { + if (command === 'serve') { config.define = { - global: {}, + global: {} } config.server = { - host: "127.0.0.1", + host: '127.0.0.1' } }