chore: init oxc

This commit is contained in:
Julien Calixte
2026-03-28 09:34:04 +01:00
parent d457fd4064
commit 8e8706e258
19 changed files with 830 additions and 192 deletions

View File

@@ -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 <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 <path>`: 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)

View File

@@ -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)",
],
},
],
}

9
.oxfmtrc.json Normal file
View File

@@ -0,0 +1,9 @@
{
"$schema": "./node_modules/oxfmt/configuration_schema.json",
"semi": false,
"singleQuote": true,
"trailingComma": "none",
"printWidth": 80,
"sortPackageJson": false,
"ignorePatterns": []
}

40
.oxlintrc.json Normal file
View File

@@ -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"
}
}
]
}

View File

@@ -1,3 +0,0 @@
{
"semi": false
}

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)
}
}

View File

@@ -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

View File

@@ -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"

View File

@@ -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",

431
pnpm-lock.yaml generated
View File

@@ -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: {}

View File

@@ -1,3 +1,3 @@
module.exports = {
plugins: { "@tailwindcss/postcss": {}, autoprefixer: {} },
plugins: { '@tailwindcss/postcss': {}, autoprefixer: {} }
}

View File

@@ -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"],

View File

@@ -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']
})

10
skills-lock.json Normal file
View File

@@ -0,0 +1,10 @@
{
"version": 1,
"skills": {
"migrate-oxlint": {
"source": "oxc-project/oxc",
"sourceType": "github",
"computedHash": "80ce5201b1ef52d6cabe553a4cacfd6e1db97bad99618216b9cf9318d11d7e64"
}
}
}

View File

@@ -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
}
}
}
})
}
}
}

View File

@@ -9,6 +9,7 @@
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"sourceMap": true,
"moduleResolution": "bundler",
"resolveJsonModule": true,
"types": ["node", "vite/client", "vite-plugin-pwa/vue"],
"paths": {

View File

@@ -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'
}
}