Compare commits

..

2 Commits

Author SHA1 Message Date
a0981e2668 docs(readme): update README for todo plugin 2024-10-17 19:48:06 +08:00
278da91d16 fix: app upgrade should not overwrite the activation status of plugins (#1610)
Co-authored-by: sealday <sealday@gmail.com>
Reviewed-on: daoyoucloud/tachybase#1610
2024-10-17 19:41:45 +08:00
23 changed files with 567 additions and 36 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

View File

@ -0,0 +1,2 @@
/node_modules
/src

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

View File

@ -0,0 +1,128 @@
## Todo 应用插件说明
@tachybase/plugin-todo-page
### 简介
该项目实现了一个 Todo 应用,用户可以通过浏览器在页面中管理待办事项。通过使用 React 进行开发,待办事项列表支持增、删、改、查操作。该插件通过 `@tachybase/client` 扩展系统功能,加载并展示 Todo 页面。
### 功能特性
- **添加待办事项**:用户可以输入新的任务并将其添加到待办事项列表中。
- **删除待办事项**:用户可以删除已完成或不再需要的任务。
- **编辑待办事项**:用户可以对现有的任务进行修改。
- **标记完成状态**:用户可以通过复选框标记任务是否完成。
- **页面加载插件**:通过 `Plugin` 类将 Todo 页面的加载集成到主应用中。
### 环境要求
- Node.js
- React
- `@tachybase/client` 插件系统支持
### 安装步骤
1. **克隆项目**
```bash
# git clone 项目
git clone https://git.daoyoucloud.com:8443/daoyoucloud/tachybase.git
# 安装依赖(必须使用 pnpm
cd tachybase
pnpm i
# 初始化环境
pnpm tachybase install -f
# 然后初始化一个插件,并添加到系统中:
pnpm pm create @samples/plugin-replace-page
pnpm pm enable @samples/plugin-replace-page
pnpm pm create @tachybase/plugin-todo-page
pnpm pm enable @tachybase/plugin-todo-page
# 然后启动项目即可:
pnpm dev
```
2. **安装依赖**
```bash
{
"name": "@tachybase/plugin-todo-page",
"version": "0.21.61",
"main": "dist/server/index.js",
"dependencies": {
"react-router-dom": "^6.11.2",
"antd": "^5.18.3"
},
"peerDependencies": {
"@tachybase/client": "workspace:*",
"@tachybase/server": "workspace:*",
"@tachybase/plugin-auth": "workspace:*",
"@tachybase/test": "workspace:*"
}
}
```
3. **运行项目**
```bash
pnpm dev
```
### API 集成说明
该项目通过 `PluginTodoPageClient` 类集成了 Todo 页面,主要实现了 `afterAdd`、`beforeLoad` 和 `load` 方法,具体说明如下:
#### 1. `afterAdd()`
该方法将在插件添加之后执行,目前预留了钩子(注释部分可实现自定义操作)。
#### 2. `beforeLoad()`
在插件页面加载之前会调用此方法,允许在加载前执行相关初始化工作。
#### 3. `load()`
该方法是插件的核心部分,负责将 Todo 页面的路由和组件添加到应用中:
- `this.router.add()`:将路径 `/todo``todoList` 组件添加到路由中,确保访问该路径时显示待办事项页面。
- `this.app.pluginSettingsManager.add()`:向应用的插件管理器中添加设置,确保在插件管理界面显示 Todo 页面的入口。
### 文件说明
#### 1. `todoList.js`
- **作用**:定义了 `todoList` 组件,用于渲染待办事项页面。
- **功能**
- 通过 API 接口获取待办事项列表。
- 支持增、删、改、查、标记完成的功能。
- 使用 React 状态管理,用户可以在页面上实时操作待办事项。
#### 2. `PluginTodoPageClient.js`
- **作用**:作为插件的入口文件,负责将 Todo 页面的路由、组件注册到系统的插件管理中。
- **功能**
- 扩展系统的路由和页面展示功能。
- 加载 `todoList` 组件并集成到主应用中。
### API 说明
插件通过 HTTP API 与后端进行交互,实现对待办事项的增删改查功能:
- **GET `/api/todo:list`**:获取所有待办事项列表。
- **POST `/api/todo:create`**:添加新待办事项。
- **DELETE `/api/todo:destroy?filterByTk={id}`**:删除指定 ID 的待办事项。
- **PUT `/api/todo:update?filterByTk={id}`**:更新指定 ID 的待办事项。
### 项目结构
```
├── src
│ └── client
│ ├── index.js # 插件入口
│ ├── index.css # 样式文件
│ └── todoList.js # 定义 TodoList 组件
├── package.json # 项目依赖和配置信息
└── README.md # 项目说明文档
```
### 使用说明
1. 运行项目后,访问 `/todo` 路径可以看到待办事项页面。
![alt text]((459).png)
1. 通过页面可以添加、删除、编辑和标记完成状态。
新增待办事项
![alt text]((460).png)
![alt text](<2024-10-17 105733.png>)
修改待办事项222为666
![alt text]((461).png)
修改待办事项状态为已完成
![alt text]((462).png)
删除待办事项
![alt text]((463).png)
![alt text](<2024-10-17 105821.png>)
### 贡献指南
如果您发现问题或希望为此项目贡献代码,欢迎提交 PR 或 issue。

View File

@ -0,0 +1,2 @@
export * from './dist/client';
export { default } from './dist/client';

View File

@ -0,0 +1 @@
module.exports = require('./dist/client/index.js');

View File

@ -0,0 +1,15 @@
{
"name": "@tachybase/plugin-todo-page",
"version": "0.21.61",
"main": "dist/server/index.js",
"dependencies": {
"antd": "^5.18.3",
"react-router-dom": "^6.11.2"
},
"peerDependencies": {
"@tachybase/client": "workspace:*",
"@tachybase/plugin-auth": "workspace:*",
"@tachybase/server": "workspace:*",
"@tachybase/test": "workspace:*"
}
}

View File

@ -0,0 +1,2 @@
export * from './dist/server';
export { default } from './dist/server';

View File

@ -0,0 +1 @@
module.exports = require('./dist/server/index.js');

View File

@ -0,0 +1,124 @@
import React, { useEffect, useState } from 'react';
import './index.css';
export function TodoList() {
const [todos, setTodos] = useState([]);
const [newTodo, setNewTodo] = useState('');
const [editingId, setEditingId] = useState(null);
const [editingText, setEditingText] = useState('');
useEffect(() => {
const fetchTodos = async () => {
const response = await fetch('http://localhost:3000/api/todo:list');
const { data } = await response.json();
if (Array.isArray(data)) setTodos(data);
};
fetchTodos();
}, []);
const handleAdd = async (e) => {
e.preventDefault();
if (newTodo.trim()) {
const response = await fetch('http://localhost:3000/api/todo:create', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ title: newTodo, completed: false }),
});
const newTodoItem = await response.json();
setTodos([...todos, newTodoItem]);
setNewTodo('');
}
};
const handleDelete = async (id) => {
await fetch(`http://localhost:3000/api/todo:destroy?filterByTk=${id}`, { method: 'DELETE' });
setTodos(todos.filter((todo) => todo.id !== id));
};
const handleEdit = (id, title) => {
setEditingId(id);
setEditingText(title);
};
const handleUpdate = async (id) => {
await fetch(`http://localhost:3000/api/todo:update?filterByTk=${id}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ title: editingText }),
});
setTodos(todos.map((todo) => (todo.id === id ? { ...todo, title: editingText } : todo)));
setEditingId(null);
setEditingText('');
};
const handleToggleComplete = async (id, currentStatus) => {
const updatedStatus = !currentStatus;
await fetch(`http://localhost:3000/api/todo:update?filterByTk=${id}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ completed: updatedStatus }),
});
setTodos(todos.map((todo) => (todo.id === id ? { ...todo, completed: updatedStatus } : todo)));
};
return (
<div className="todoapp stack-large">
<h1>TodoMatic</h1>
<form onSubmit={handleAdd}>
<h2 className="label-wrapper">
<label htmlFor="new-todo-input" className="label__lg">
What needs to be done?
</label>
</h2>
<input
type="text"
id="new-todo-input"
className="input input__lg"
autoComplete="off"
value={newTodo}
onChange={(e) => setNewTodo(e.target.value)}
/>
<button type="submit" className="btn btn__primary btn__lg">
Add
</button>
</form>
<h2 id="list-heading">{todos.length} tasks remaining</h2>
<ul role="list" className="todo-list stack-large stack-exception" aria-labelledby="list-heading">
{todos.map((todo) => (
<li key={todo.id} className="todo stack-small">
<div className="c-cb">
<input
id={`todo-${todo.id}`}
type="checkbox"
checked={todo.completed}
onChange={() => handleToggleComplete(todo.id, todo.completed)}
/>
{editingId === todo.id ? (
<input type="text" value={editingText} onChange={(e) => setEditingText(e.target.value)} />
) : (
<label className="todo-label" htmlFor={`todo-${todo.id}`}>
{todo.title}
</label>
)}
</div>
<div className="btn-group">
{editingId === todo.id ? (
<button type="button" className="btn" onClick={() => handleUpdate(todo.id)}>
Save
</button>
) : (
<button type="button" className="btn" onClick={() => handleEdit(todo.id, todo.title)}>
Edit
</button>
)}
<button type="button" className="btn btn__danger" onClick={() => handleDelete(todo.id)}>
Delete
</button>
</div>
</li>
))}
</ul>
</div>
);
}

View File

@ -0,0 +1,146 @@
/* RESETS */
*
*::before,
*::after {
box-sizing: border-box;
}
*:focus {
outline: 3px dashed #228bec;
outline-offset: 0;
}
html {
font: 62.5% / 1.15 sans-serif;
}
h1,
h2 {
margin-bottom: 0;
}
ul {
list-style: none;
padding: 0;
}
button {
border: none;
margin: 0;
padding: 0;
width: auto;
overflow: visible;
background: transparent;
color: inherit;
font: inherit;
line-height: normal;
-webkit-font-smoothing: inherit;
-moz-osx-font-smoothing: inherit;
-webkit-appearance: none;
}
button::-moz-focus-inner {
border: 0;
}
button,
input,
optgroup,
select,
textarea {
font-family: inherit;
font-size: 100%;
line-height: 1.15;
margin: 0;
}
button,
input {
overflow: visible;
}
input[type="text"] {
border-radius: 0;
}
body {
width: 100%;
max-width: 68rem;
margin: 0 auto;
font:
1.6rem/1.25 Arial,
sans-serif;
background-color: #f5f5f5;
color: #4d4d4d;
}
@media screen and (min-width: 620px) {
body {
font-size: 1.9rem;
line-height: 1.31579;
}
}
/*END RESETS*/
/* GLOBAL STYLES */
.form-group>input[type="text"] {
display: inline-block;
margin-top: 0.4rem;
}
.btn {
padding: 0.8rem 1rem 0.7rem;
border: 0.2rem solid #4d4d4d;
cursor: pointer;
text-transform: capitalize;
}
.btn.toggle-btn {
border-width: 1px;
border-color: #d3d3d3;
}
.btn.toggle-btn[aria-pressed="true"] {
text-decoration: underline;
border-color: #4d4d4d;
}
.btn__danger {
color: #fff;
background-color: #ca3c3c;
border-color: #bd2130;
}
.btn__filter {
border-color: lightgrey;
}
.btn__primary {
color: #fff;
background-color: #000;
}
.btn-group {
display: flex;
justify-content: space-between;
}
.btn-group>* {
flex: 1 1 49%;
}
.btn-group>*+* {
margin-left: 0.8rem;
}
.label-wrapper {
margin: 0;
flex: 0 0 100%;
text-align: center;
}
.visually-hidden {
position: absolute !important;
height: 1px;
width: 1px;
overflow

View File

@ -0,0 +1,25 @@
import { Plugin } from '@tachybase/client';
import { TodoList } from './TodoList';
export class PluginTodoPageClient extends Plugin {
async afterAdd() {
// await this.app.pm.add()
}
async beforeLoad() {} // You can get and modify the app instance here
async load() {
this.router.add('todo', {
path: '/todo',
Component: TodoList,
});
this.app.pluginSettingsManager.add('todo', {
title: 'todo',
icon: 'ApiOutlined',
Component: TodoList,
});
}
}
export default PluginTodoPageClient;

View File

@ -0,0 +1,2 @@
export * from './server';
export { default } from './server';

View File

@ -0,0 +1,20 @@
import { Plugin } from '@tachybase/server';
export class PluginTodoServer extends Plugin {
async load() {
// 定义一个 todo 数据表,包含 title 和 completed 字段
this.app.db.collection({
name: 'todos',
fields: [
{ type: 'string', name: 'title' },
{ type: 'boolean', name: 'completed', default: false },
],
});
await this.app.db.sync();
// 设置 todos 数据表的访问权限为公开
this.app.acl.allow('todos', '*', 'public');
}
}
export default PluginTodoServer;

View File

@ -191,9 +191,8 @@ export class PresetTachyBase extends Plugin {
}
}
const name = plugin[0];
const enabled = plugin[2];
const packageJson = await this.getPackageJson(name);
plugins.push({ name, packageName: packageJson.name, version: packageJson.version, enabled });
plugins.push({ name, packageName: packageJson.name, version: packageJson.version });
}
return plugins;
}

View File

@ -124,10 +124,10 @@ importers:
version: 8.4.0(eslint@9.10.0)(typescript@5.4.5)
umi:
specifier: ^4.3.3
version: 4.3.3(@babel/core@7.25.2)(@types/node@20.14.2)(@types/react@18.3.3)(eslint@9.10.0)(lightningcss@1.26.0)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.4)(sass@1.77.8)(stylelint@16.8.2(typescript@5.4.5))(terser@5.31.6)(type-fest@4.25.0)(typescript@5.4.5)(webpack@5.93.0)
version: 4.3.3(@babel/core@7.22.10)(@types/node@20.14.2)(@types/react@18.3.3)(eslint@9.10.0)(lightningcss@1.26.0)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.4)(sass@1.77.8)(stylelint@16.8.2(typescript@5.4.5))(terser@5.31.6)(type-fest@4.25.0)(typescript@5.4.5)(webpack@5.93.0)
vitest:
specifier: ^1.6.0
version: 1.6.0(@types/node@20.14.2)(jsdom@24.1.1(canvas@2.11.2(encoding@0.1.13)))(less@4.2.0)(lightningcss@1.26.0)(sass@1.77.8)(terser@5.31.6)
version: 1.6.0(@types/node@20.14.2)(jsdom@24.1.1(canvas@2.11.2(encoding@0.1.13)))(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(terser@5.31.6)
packages/core/acl:
dependencies:
@ -992,7 +992,7 @@ importers:
version: 5.4.4
umi:
specifier: ^4.3.3
version: 4.3.3(@babel/core@7.22.10)(@types/node@20.14.2)(@types/react@18.3.3)(eslint@8.55.0)(lightningcss@1.26.0)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.4)(sass@1.77.8)(stylelint@16.8.2(typescript@5.4.4))(terser@5.31.6)(type-fest@4.25.0)(typescript@5.4.4)(webpack@5.93.0)
version: 4.3.3(@babel/core@7.25.2)(@types/node@20.14.2)(@types/react@18.3.3)(eslint@8.55.0)(lightningcss@1.26.0)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.4)(sass@1.77.8)(stylelint@16.8.2(typescript@5.4.4))(terser@5.31.6)(type-fest@4.25.0)(typescript@5.4.4)(webpack@5.93.0)
packages/core/evaluators:
dependencies:
@ -1771,6 +1771,27 @@ importers:
specifier: ^6.25.1
version: 6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
packages/plugins/@samples/plugin-replace-page:
dependencies:
'@tachybase/client':
specifier: workspace:*
version: link:../../../core/client
'@tachybase/plugin-auth':
specifier: workspace:*
version: link:../../@tachybase/plugin-auth
'@tachybase/server':
specifier: workspace:*
version: link:../../../core/server
'@tachybase/test':
specifier: workspace:*
version: link:../../../core/test
antd:
specifier: 5.19.4
version: 5.19.4(date-fns@3.6.0)(luxon@3.5.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-router-dom:
specifier: ^6.11.2
version: 6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
packages/plugins/@tachybase/plugin-acl:
dependencies:
'@tachybase/acl':
@ -8245,43 +8266,36 @@ packages:
resolution: {integrity: sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.14.1':
resolution: {integrity: sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==}
cpu: [arm64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-powerpc64le-gnu@4.14.1':
resolution: {integrity: sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==}
cpu: [ppc64le]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-gnu@4.14.1':
resolution: {integrity: sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-s390x-gnu@4.14.1':
resolution: {integrity: sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.14.1':
resolution: {integrity: sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==}
cpu: [x64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.14.1':
resolution: {integrity: sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==}
cpu: [x64]
os: [linux]
libc: [musl]
'@rollup/rollup-win32-arm64-msvc@4.14.1':
resolution: {integrity: sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==}
@ -9416,28 +9430,24 @@ packages:
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@umijs/es-module-parser-linux-arm64-musl@0.0.7':
resolution: {integrity: sha512-cqQffARWkmQ3n1RYNKZR3aD6X8YaP6u1maASjDgPQOpZMAlv/OSDrM/7iGujWTs0PD0haockNG9/DcP6lgPHMw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [musl]
'@umijs/es-module-parser-linux-x64-gnu@0.0.7':
resolution: {integrity: sha512-PHrKHtT665Za0Ydjch4ACrNpRU+WIIden12YyF1CtMdhuLDSoU6UfdhF3NoDbgEUcXVDX/ftOqmj0SbH3R1uew==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [glibc]
'@umijs/es-module-parser-linux-x64-musl@0.0.7':
resolution: {integrity: sha512-cyZvUK5lcECLWzLp/eU1lFlCETcz+LEb+wrdARQSST1dgoIGZsT4cqM1WzYmdZNk3o883tiZizLt58SieEiHBQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [musl]
'@umijs/es-module-parser-win32-arm64-msvc@0.0.7':
resolution: {integrity: sha512-V7WxnUI88RboSl0RWLNQeKBT7EDW35fW6Tn92zqtoHHxrhAIL9DtDyvC8REP4qTxeZ6Oej/Ax5I6IjsLx3yTOg==}
@ -9478,14 +9488,12 @@ packages:
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [glibc]
'@umijs/mako-linux-x64-musl@0.7.5':
resolution: {integrity: sha512-sfVOpUC1UIxHaUNrj7RahYeTaSrC97XEOqAxEAbeMG9tBKYOV7azGREJPsdePyGFdjF9mfsW69ljAuo6+MBxmQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [musl]
'@umijs/mako@0.7.5':
resolution: {integrity: sha512-0mk/uNoltnX8d2ZD1Zi8/2En+zw69dPtxo1bpAyVDoruGI4djoi+u99s2vI9EORK+LGtTNuj8Sa/uyopKtsuPA==}
@ -14323,56 +14331,48 @@ packages:
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
libc: [glibc]
lightningcss-linux-arm64-gnu@1.26.0:
resolution: {integrity: sha512-iJmZM7fUyVjH+POtdiCtExG+67TtPUTer7K/5A8DIfmPfrmeGvzfRyBltGhQz13Wi15K1lf2cPYoRaRh6vcwNA==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
libc: [glibc]
lightningcss-linux-arm64-musl@1.22.1:
resolution: {integrity: sha512-MCV6RuRpzXbunvzwY644iz8cw4oQxvW7oer9xPkdadYqlEyiJJ6wl7FyJOH7Q6ZYH4yjGAUCvxDBxPbnDu9ZVg==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
libc: [musl]
lightningcss-linux-arm64-musl@1.26.0:
resolution: {integrity: sha512-XxoEL++tTkyuvu+wq/QS8bwyTXZv2y5XYCMcWL45b8XwkiS8eEEEej9BkMGSRwxa5J4K+LDeIhLrS23CpQyfig==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
libc: [musl]
lightningcss-linux-x64-gnu@1.22.1:
resolution: {integrity: sha512-RjNgpdM20VUXgV7us/VmlO3Vn2ZRiDnc3/bUxCVvySZWPiVPprpqW/QDWuzkGa+NCUf6saAM5CLsZLSxncXJwg==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
libc: [glibc]
lightningcss-linux-x64-gnu@1.26.0:
resolution: {integrity: sha512-1dkTfZQAYLj8MUSkd6L/+TWTG8V6Kfrzfa0T1fSlXCXQHrt1HC1/UepXHtKHDt/9yFwyoeayivxXAsApVxn6zA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
libc: [glibc]
lightningcss-linux-x64-musl@1.22.1:
resolution: {integrity: sha512-ZgO4C7Rd6Hv/5MnyY2KxOYmIlzk4rplVolDt3NbkNR8DndnyX0Q5IR4acJWNTBICQ21j3zySzKbcJaiJpk/4YA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
libc: [musl]
lightningcss-linux-x64-musl@1.26.0:
resolution: {integrity: sha512-yX3Rk9m00JGCUzuUhFEojY+jf/6zHs3XU8S8Vk+FRbnr4St7cjyMXdNjuA2LjiT8e7j8xHRCH8hyZ4H/btRE4A==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
libc: [musl]
lightningcss-win32-arm64-msvc@1.26.0:
resolution: {integrity: sha512-X/597/cFnCogy9VItj/+7Tgu5VLbAtDF7KZDPdSw0MaL6FL940th1y3HiOzFIlziVvAtbo0RB3NAae1Oofr+Tw==}
@ -37497,19 +37497,19 @@ snapshots:
uglify-to-browserify@1.0.2:
optional: true
umi@4.3.3(@babel/core@7.22.10)(@types/node@20.14.2)(@types/react@18.3.3)(eslint@8.55.0)(lightningcss@1.26.0)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.4)(sass@1.77.8)(stylelint@16.8.2(typescript@5.4.4))(terser@5.31.6)(type-fest@4.25.0)(typescript@5.4.4)(webpack@5.93.0):
umi@4.3.3(@babel/core@7.22.10)(@types/node@20.14.2)(@types/react@18.3.3)(eslint@9.10.0)(lightningcss@1.26.0)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.4)(sass@1.77.8)(stylelint@16.8.2(typescript@5.4.5))(terser@5.31.6)(type-fest@4.25.0)(typescript@5.4.5)(webpack@5.93.0):
dependencies:
'@babel/runtime': 7.23.6
'@umijs/bundler-utils': 4.3.3
'@umijs/bundler-webpack': 4.3.3(type-fest@4.25.0)(typescript@5.4.4)(webpack@5.93.0)
'@umijs/bundler-webpack': 4.3.3(type-fest@4.25.0)(typescript@5.4.5)(webpack@5.93.0)
'@umijs/core': 4.3.3
'@umijs/lint': 4.3.3(eslint@8.55.0)(stylelint@16.8.2(typescript@5.4.4))(typescript@5.4.4)
'@umijs/preset-umi': 4.3.3(@types/node@20.14.2)(@types/react@18.3.3)(lightningcss@1.26.0)(rollup@3.29.4)(sass@1.77.8)(terser@5.31.6)(type-fest@4.25.0)(typescript@5.4.4)(webpack@5.93.0)
'@umijs/lint': 4.3.3(eslint@9.10.0)(stylelint@16.8.2(typescript@5.4.5))(typescript@5.4.5)
'@umijs/preset-umi': 4.3.3(@types/node@20.14.2)(@types/react@18.3.3)(lightningcss@1.26.0)(rollup@3.29.4)(sass@1.77.8)(terser@5.31.6)(type-fest@4.25.0)(typescript@5.4.5)(webpack@5.93.0)
'@umijs/renderer-react': 4.3.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@umijs/server': 4.3.3
'@umijs/test': 4.3.3(@babel/core@7.22.10)
'@umijs/utils': 4.3.3
prettier-plugin-organize-imports: 3.2.4(prettier@3.2.5)(typescript@5.4.4)
prettier-plugin-organize-imports: 3.2.4(prettier@3.2.5)(typescript@5.4.5)
prettier-plugin-packagejson: 2.4.3(prettier@3.2.5)
transitivePeerDependencies:
- '@babel/core'
@ -37544,19 +37544,19 @@ snapshots:
- webpack-hot-middleware
- webpack-plugin-serve
umi@4.3.3(@babel/core@7.25.2)(@types/node@20.14.2)(@types/react@18.3.3)(eslint@9.10.0)(lightningcss@1.26.0)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.4)(sass@1.77.8)(stylelint@16.8.2(typescript@5.4.5))(terser@5.31.6)(type-fest@4.25.0)(typescript@5.4.5)(webpack@5.93.0):
umi@4.3.3(@babel/core@7.25.2)(@types/node@20.14.2)(@types/react@18.3.3)(eslint@8.55.0)(lightningcss@1.26.0)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.4)(sass@1.77.8)(stylelint@16.8.2(typescript@5.4.4))(terser@5.31.6)(type-fest@4.25.0)(typescript@5.4.4)(webpack@5.93.0):
dependencies:
'@babel/runtime': 7.23.6
'@umijs/bundler-utils': 4.3.3
'@umijs/bundler-webpack': 4.3.3(type-fest@4.25.0)(typescript@5.4.5)(webpack@5.93.0)
'@umijs/bundler-webpack': 4.3.3(type-fest@4.25.0)(typescript@5.4.4)(webpack@5.93.0)
'@umijs/core': 4.3.3
'@umijs/lint': 4.3.3(eslint@9.10.0)(stylelint@16.8.2(typescript@5.4.5))(typescript@5.4.5)
'@umijs/preset-umi': 4.3.3(@types/node@20.14.2)(@types/react@18.3.3)(lightningcss@1.26.0)(rollup@3.29.4)(sass@1.77.8)(terser@5.31.6)(type-fest@4.25.0)(typescript@5.4.5)(webpack@5.93.0)
'@umijs/lint': 4.3.3(eslint@8.55.0)(stylelint@16.8.2(typescript@5.4.4))(typescript@5.4.4)
'@umijs/preset-umi': 4.3.3(@types/node@20.14.2)(@types/react@18.3.3)(lightningcss@1.26.0)(rollup@3.29.4)(sass@1.77.8)(terser@5.31.6)(type-fest@4.25.0)(typescript@5.4.4)(webpack@5.93.0)
'@umijs/renderer-react': 4.3.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@umijs/server': 4.3.3
'@umijs/test': 4.3.3(@babel/core@7.25.2)
'@umijs/utils': 4.3.3
prettier-plugin-organize-imports: 3.2.4(prettier@3.2.5)(typescript@5.4.5)
prettier-plugin-organize-imports: 3.2.4(prettier@3.2.5)(typescript@5.4.4)
prettier-plugin-packagejson: 2.4.3(prettier@3.2.5)
transitivePeerDependencies:
- '@babel/core'
@ -37912,6 +37912,23 @@ snapshots:
string_decoder: 1.3.0
util-deprecate: 1.0.2
vite-node@1.6.0(@types/node@20.14.2)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(terser@5.31.6):
dependencies:
cac: 6.7.14
debug: 4.3.6(supports-color@8.1.1)
pathe: 1.1.2
picocolors: 1.0.1
vite: 5.2.13(@types/node@20.14.2)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(terser@5.31.6)
transitivePeerDependencies:
- '@types/node'
- less
- lightningcss
- sass
- stylus
- sugarss
- supports-color
- terser
vite-node@1.6.0(@types/node@20.14.2)(less@4.2.0)(lightningcss@1.26.0)(sass@1.77.8)(terser@5.31.6):
dependencies:
cac: 6.7.14
@ -37952,6 +37969,19 @@ snapshots:
sass: 1.77.8
terser: 5.31.6
vite@5.2.13(@types/node@20.14.2)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(terser@5.31.6):
dependencies:
esbuild: 0.20.2
postcss: 8.4.39
rollup: 4.14.1
optionalDependencies:
'@types/node': 20.14.2
fsevents: 2.3.3
less: 4.1.3
lightningcss: 1.26.0
sass: 1.77.8
terser: 5.31.6
vite@5.2.13(@types/node@20.14.2)(less@4.2.0)(lightningcss@1.26.0)(sass@1.75.0)(terser@5.31.6):
dependencies:
esbuild: 0.20.2
@ -38012,6 +38042,40 @@ snapshots:
- supports-color
- terser
vitest@1.6.0(@types/node@20.14.2)(jsdom@24.1.1(canvas@2.11.2(encoding@0.1.13)))(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(terser@5.31.6):
dependencies:
'@vitest/expect': 1.6.0
'@vitest/runner': 1.6.0
'@vitest/snapshot': 1.6.0
'@vitest/spy': 1.6.0
'@vitest/utils': 1.6.0
acorn-walk: 8.3.2
chai: 4.3.10
debug: 4.3.5(supports-color@5.5.0)
execa: 8.0.1
local-pkg: 0.5.0
magic-string: 0.30.8
pathe: 1.1.2
picocolors: 1.0.1
std-env: 3.7.0
strip-literal: 2.0.0
tinybench: 2.6.0
tinypool: 0.8.3
vite: 5.2.13(@types/node@20.14.2)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(terser@5.31.6)
vite-node: 1.6.0(@types/node@20.14.2)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(terser@5.31.6)
why-is-node-running: 2.2.2
optionalDependencies:
'@types/node': 20.14.2
jsdom: 24.1.1(canvas@2.11.2(encoding@0.1.13))
transitivePeerDependencies:
- less
- lightningcss
- sass
- stylus
- sugarss
- supports-color
- terser
vitest@1.6.0(@types/node@20.14.2)(jsdom@24.1.1(canvas@2.11.2(encoding@0.1.13)))(less@4.2.0)(lightningcss@1.26.0)(sass@1.77.8)(terser@5.31.6):
dependencies:
'@vitest/expect': 1.6.0