create-slotkit-app 0.1.7 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +319 -319
- package/bin/create-slotkit-app.js +4 -4
- package/dist/index.js +272 -272
- package/package.json +31 -31
package/README.md
CHANGED
|
@@ -1,319 +1,319 @@
|
|
|
1
|
-
# create-slotkit-app
|
|
2
|
-
|
|
3
|
-
[English](#english) | [中文](#中文)
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## English
|
|
8
|
-
|
|
9
|
-
### Scaffold Tool for SlotKit Applications
|
|
10
|
-
|
|
11
|
-
`create-slotkit-app` is a CLI tool that helps you quickly create a new SlotKit application with all the necessary configuration and boilerplate code.
|
|
12
|
-
|
|
13
|
-
### Features
|
|
14
|
-
|
|
15
|
-
- **Quick Setup**: Create a new SlotKit project in seconds
|
|
16
|
-
- **Vite Integration**: Uses Vite for fast development and building
|
|
17
|
-
- **TypeScript Support**: Full TypeScript configuration included
|
|
18
|
-
- **Plugin System Ready**: Pre-configured plugin directory structure with a default helloworld plugin
|
|
19
|
-
- **Auto Import Generation**: `slotkit generate-imports` runs automatically before `pnpm dev` and `pnpm build`
|
|
20
|
-
- **Zero Configuration**: Works out of the box with sensible defaults
|
|
21
|
-
|
|
22
|
-
### Installation
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
npm install -g create-slotkit-app
|
|
26
|
-
# or
|
|
27
|
-
yarn global add create-slotkit-app
|
|
28
|
-
# or
|
|
29
|
-
pnpm add -g create-slotkit-app
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Or use it directly with npx/pnpm create:
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
npx create-slotkit-app my-app
|
|
36
|
-
# or
|
|
37
|
-
pnpm create slotkit-app my-app
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### Usage
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
create-slotkit-app <project-name> [options]
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
**Options:**
|
|
47
|
-
|
|
48
|
-
- `--template <template>` - Vite template to use (default: `react-ts`)
|
|
49
|
-
- Available templates: `react`, `react-ts`, `vue`, `vue-ts`, `vanilla`, `vanilla-ts`
|
|
50
|
-
|
|
51
|
-
### Quick Start
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
# Create a new SlotKit project
|
|
55
|
-
create-slotkit-app my-slotkit-app
|
|
56
|
-
|
|
57
|
-
# Navigate to the project
|
|
58
|
-
cd my-slotkit-app
|
|
59
|
-
|
|
60
|
-
# Install dependencies
|
|
61
|
-
pnpm install
|
|
62
|
-
|
|
63
|
-
# Start development server (generate-imports runs automatically)
|
|
64
|
-
pnpm dev
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### What Gets Created
|
|
68
|
-
|
|
69
|
-
When you run `create-slotkit-app`, it creates:
|
|
70
|
-
|
|
71
|
-
```
|
|
72
|
-
my-slotkit-app/
|
|
73
|
-
├── src/
|
|
74
|
-
│ ├── App.tsx # Main app component with plugin loading
|
|
75
|
-
│ ├── app/
|
|
76
|
-
│ │ ├── AppLayout.tsx # Layout with Slot components
|
|
77
|
-
│ │ └── AppLayout.css # Layout styles
|
|
78
|
-
│ └── main.tsx # Entry point
|
|
79
|
-
├── plugins/
|
|
80
|
-
│ └── helloworld/ # Default sample plugin
|
|
81
|
-
├── slotkit.config.ts # SlotKit configuration
|
|
82
|
-
├── vite.config.ts # Vite configuration
|
|
83
|
-
├── package.json # Project dependencies
|
|
84
|
-
└── tsconfig.json # TypeScript configuration
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### Project Structure
|
|
88
|
-
|
|
89
|
-
The generated project includes:
|
|
90
|
-
|
|
91
|
-
1. **App.tsx**: Automatically loads and registers plugins on mount
|
|
92
|
-
2. **AppLayout.tsx**: Pre-configured layout with Slot components for:
|
|
93
|
-
- `header` slot
|
|
94
|
-
- `sidebar` slot
|
|
95
|
-
- `content` slot
|
|
96
|
-
- `footer` slot
|
|
97
|
-
3. **slotkit.config.ts**: Basic configuration pointing to `./plugins`
|
|
98
|
-
4. **helloworld plugin**: Located at `plugins/helloworld/` as a ready-to-run example
|
|
99
|
-
5. **vite.config.ts**: Vite configuration with plugin directory access
|
|
100
|
-
|
|
101
|
-
### Creating Plugins
|
|
102
|
-
|
|
103
|
-
After creating your project, you can create plugins:
|
|
104
|
-
|
|
105
|
-
```bash
|
|
106
|
-
# Create a plugin
|
|
107
|
-
slotkit create-plugin my-plugin --slots content,sidebar
|
|
108
|
-
|
|
109
|
-
# Generate import mappings (required after creating plugins)
|
|
110
|
-
slotkit generate-imports
|
|
111
|
-
|
|
112
|
-
# List all plugins
|
|
113
|
-
slotkit list
|
|
114
|
-
|
|
115
|
-
# Enable/disable plugins
|
|
116
|
-
slotkit enable my-plugin
|
|
117
|
-
slotkit disable my-plugin
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### Next Steps
|
|
121
|
-
|
|
122
|
-
1. Install dependencies: `pnpm install`
|
|
123
|
-
2. Start the dev server: `pnpm dev` (runs `slotkit generate-imports` automatically)
|
|
124
|
-
3. Create additional plugins: `slotkit create-plugin my-plugin --slots content`
|
|
125
|
-
4. Whenever you create/modify plugins outside the dev flow, run `pnpm slotkit generate-imports`
|
|
126
|
-
|
|
127
|
-
### Configuration
|
|
128
|
-
|
|
129
|
-
The generated `slotkit.config.ts` file:
|
|
130
|
-
|
|
131
|
-
```typescript
|
|
132
|
-
import { defineConfig } from '@slotkitjs/core'
|
|
133
|
-
|
|
134
|
-
export default defineConfig({
|
|
135
|
-
pluginsDir: './plugins',
|
|
136
|
-
// Add more configuration here
|
|
137
|
-
})
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
### Development
|
|
141
|
-
|
|
142
|
-
```bash
|
|
143
|
-
# Clone the repository
|
|
144
|
-
git clone <repository-url>
|
|
145
|
-
cd create-slotkit-app
|
|
146
|
-
|
|
147
|
-
# Install dependencies
|
|
148
|
-
pnpm install
|
|
149
|
-
|
|
150
|
-
# Build
|
|
151
|
-
pnpm build
|
|
152
|
-
|
|
153
|
-
# Development mode (watch)
|
|
154
|
-
pnpm dev
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### License
|
|
158
|
-
|
|
159
|
-
MIT
|
|
160
|
-
|
|
161
|
-
---
|
|
162
|
-
|
|
163
|
-
## 中文
|
|
164
|
-
|
|
165
|
-
### SlotKit 应用脚手架工具
|
|
166
|
-
|
|
167
|
-
`create-slotkit-app` 是一个 CLI 工具,帮助你快速创建一个新的 SlotKit 应用,包含所有必要的配置和样板代码。
|
|
168
|
-
|
|
169
|
-
### 特性
|
|
170
|
-
|
|
171
|
-
- **快速设置**:几秒钟内创建新的 SlotKit 项目
|
|
172
|
-
- **Vite 集成**:使用 Vite 进行快速开发和构建
|
|
173
|
-
- **TypeScript 支持**:包含完整的 TypeScript 配置
|
|
174
|
-
- **插件系统就绪**:预配置的插件目录结构
|
|
175
|
-
- **零配置**:开箱即用,使用合理的默认值
|
|
176
|
-
|
|
177
|
-
### 安装
|
|
178
|
-
|
|
179
|
-
```bash
|
|
180
|
-
npm install -g create-slotkit-app
|
|
181
|
-
# 或
|
|
182
|
-
yarn global add create-slotkit-app
|
|
183
|
-
# 或
|
|
184
|
-
pnpm add -g create-slotkit-app
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
或者直接使用 npx/pnpm create:
|
|
188
|
-
|
|
189
|
-
```bash
|
|
190
|
-
npx create-slotkit-app my-app
|
|
191
|
-
# 或
|
|
192
|
-
pnpm create slotkit-app my-app
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
### 使用
|
|
196
|
-
|
|
197
|
-
```bash
|
|
198
|
-
create-slotkit-app <project-name> [options]
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
**选项:**
|
|
202
|
-
|
|
203
|
-
- `--template <template>` - 使用的 Vite 模板(默认:`react-ts`)
|
|
204
|
-
- 可用模板:`react`, `react-ts`, `vue`, `vue-ts`, `vanilla`, `vanilla-ts`
|
|
205
|
-
|
|
206
|
-
### 快速开始
|
|
207
|
-
|
|
208
|
-
```bash
|
|
209
|
-
# 创建新的 SlotKit 项目
|
|
210
|
-
create-slotkit-app my-slotkit-app
|
|
211
|
-
|
|
212
|
-
# 进入项目目录
|
|
213
|
-
cd my-slotkit-app
|
|
214
|
-
|
|
215
|
-
# 安装依赖
|
|
216
|
-
pnpm install
|
|
217
|
-
|
|
218
|
-
# 创建第一个插件
|
|
219
|
-
slotkit create-plugin my-first-plugin --slots content
|
|
220
|
-
|
|
221
|
-
# 生成插件导入映射
|
|
222
|
-
slotkit generate-imports
|
|
223
|
-
|
|
224
|
-
# 启动开发服务器
|
|
225
|
-
slotkit dev
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
### 创建的内容
|
|
229
|
-
|
|
230
|
-
运行 `create-slotkit-app` 后,会创建:
|
|
231
|
-
|
|
232
|
-
```
|
|
233
|
-
my-slotkit-app/
|
|
234
|
-
├── src/
|
|
235
|
-
│ ├── App.tsx # 主应用组件,自动加载插件
|
|
236
|
-
│ ├── app/
|
|
237
|
-
│ │ ├── AppLayout.tsx # 包含 Slot 组件的布局
|
|
238
|
-
│ │ └── AppLayout.css # 布局样式
|
|
239
|
-
│ └── main.tsx # 入口文件
|
|
240
|
-
├── plugins/ # 插件目录(初始为空)
|
|
241
|
-
├── slotkit.config.ts # SlotKit 配置
|
|
242
|
-
├── vite.config.ts # Vite 配置
|
|
243
|
-
├── package.json # 项目依赖
|
|
244
|
-
└── tsconfig.json # TypeScript 配置
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
### 项目结构
|
|
248
|
-
|
|
249
|
-
生成的项目包括:
|
|
250
|
-
|
|
251
|
-
1. **App.tsx**: 在挂载时自动加载并注册插件
|
|
252
|
-
2. **AppLayout.tsx**: 预配置的布局,包含以下插槽的 Slot 组件:
|
|
253
|
-
- `header` 插槽
|
|
254
|
-
- `sidebar` 插槽
|
|
255
|
-
- `content` 插槽
|
|
256
|
-
- `footer` 插槽
|
|
257
|
-
3. **slotkit.config.ts**: 指向 `./plugins` 目录的基本配置
|
|
258
|
-
4. **vite.config.ts**: Vite 配置,包含插件文件系统访问权限
|
|
259
|
-
|
|
260
|
-
### 创建插件
|
|
261
|
-
|
|
262
|
-
创建项目后,你可以创建插件:
|
|
263
|
-
|
|
264
|
-
```bash
|
|
265
|
-
# 创建插件
|
|
266
|
-
slotkit create-plugin my-plugin --slots content,sidebar
|
|
267
|
-
|
|
268
|
-
# 生成导入映射(创建插件后必需)
|
|
269
|
-
slotkit generate-imports
|
|
270
|
-
|
|
271
|
-
# 列出所有插件
|
|
272
|
-
slotkit list
|
|
273
|
-
|
|
274
|
-
# 启用/禁用插件
|
|
275
|
-
slotkit enable my-plugin
|
|
276
|
-
slotkit disable my-plugin
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
### 下一步
|
|
280
|
-
|
|
281
|
-
1. **创建插件**:使用 `slotkit create-plugin` 搭建新插件
|
|
282
|
-
2. **生成导入**:创建插件后运行 `slotkit generate-imports`
|
|
283
|
-
3. **开始开发**:运行 `slotkit dev` 启动开发服务器
|
|
284
|
-
4. **构建**:准备生产构建时运行 `slotkit build`
|
|
285
|
-
|
|
286
|
-
### 配置
|
|
287
|
-
|
|
288
|
-
生成的 `slotkit.config.ts` 文件:
|
|
289
|
-
|
|
290
|
-
```typescript
|
|
291
|
-
import { defineConfig } from '@slotkitjs/core'
|
|
292
|
-
|
|
293
|
-
export default defineConfig({
|
|
294
|
-
pluginsDir: './plugins',
|
|
295
|
-
// 在这里添加更多配置
|
|
296
|
-
})
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
### 开发
|
|
300
|
-
|
|
301
|
-
```bash
|
|
302
|
-
# 克隆仓库
|
|
303
|
-
git clone <repository-url>
|
|
304
|
-
cd create-slotkit-app
|
|
305
|
-
|
|
306
|
-
# 安装依赖
|
|
307
|
-
pnpm install
|
|
308
|
-
|
|
309
|
-
# 构建
|
|
310
|
-
pnpm build
|
|
311
|
-
|
|
312
|
-
# 开发模式(监听)
|
|
313
|
-
pnpm dev
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
### 许可证
|
|
317
|
-
|
|
318
|
-
MIT
|
|
319
|
-
|
|
1
|
+
# create-slotkit-app
|
|
2
|
+
|
|
3
|
+
[English](#english) | [中文](#中文)
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## English
|
|
8
|
+
|
|
9
|
+
### Scaffold Tool for SlotKit Applications
|
|
10
|
+
|
|
11
|
+
`create-slotkit-app` is a CLI tool that helps you quickly create a new SlotKit application with all the necessary configuration and boilerplate code.
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
- **Quick Setup**: Create a new SlotKit project in seconds
|
|
16
|
+
- **Vite Integration**: Uses Vite for fast development and building
|
|
17
|
+
- **TypeScript Support**: Full TypeScript configuration included
|
|
18
|
+
- **Plugin System Ready**: Pre-configured plugin directory structure with a default helloworld plugin
|
|
19
|
+
- **Auto Import Generation**: `slotkit generate-imports` runs automatically before `pnpm dev` and `pnpm build`
|
|
20
|
+
- **Zero Configuration**: Works out of the box with sensible defaults
|
|
21
|
+
|
|
22
|
+
### Installation
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install -g create-slotkit-app
|
|
26
|
+
# or
|
|
27
|
+
yarn global add create-slotkit-app
|
|
28
|
+
# or
|
|
29
|
+
pnpm add -g create-slotkit-app
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Or use it directly with npx/pnpm create:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npx create-slotkit-app my-app
|
|
36
|
+
# or
|
|
37
|
+
pnpm create slotkit-app my-app
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Usage
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
create-slotkit-app <project-name> [options]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Options:**
|
|
47
|
+
|
|
48
|
+
- `--template <template>` - Vite template to use (default: `react-ts`)
|
|
49
|
+
- Available templates: `react`, `react-ts`, `vue`, `vue-ts`, `vanilla`, `vanilla-ts`
|
|
50
|
+
|
|
51
|
+
### Quick Start
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# Create a new SlotKit project
|
|
55
|
+
create-slotkit-app my-slotkit-app
|
|
56
|
+
|
|
57
|
+
# Navigate to the project
|
|
58
|
+
cd my-slotkit-app
|
|
59
|
+
|
|
60
|
+
# Install dependencies
|
|
61
|
+
pnpm install
|
|
62
|
+
|
|
63
|
+
# Start development server (generate-imports runs automatically)
|
|
64
|
+
pnpm dev
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### What Gets Created
|
|
68
|
+
|
|
69
|
+
When you run `create-slotkit-app`, it creates:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
my-slotkit-app/
|
|
73
|
+
├── src/
|
|
74
|
+
│ ├── App.tsx # Main app component with plugin loading
|
|
75
|
+
│ ├── app/
|
|
76
|
+
│ │ ├── AppLayout.tsx # Layout with Slot components
|
|
77
|
+
│ │ └── AppLayout.css # Layout styles
|
|
78
|
+
│ └── main.tsx # Entry point
|
|
79
|
+
├── plugins/
|
|
80
|
+
│ └── helloworld/ # Default sample plugin
|
|
81
|
+
├── slotkit.config.ts # SlotKit configuration
|
|
82
|
+
├── vite.config.ts # Vite configuration
|
|
83
|
+
├── package.json # Project dependencies
|
|
84
|
+
└── tsconfig.json # TypeScript configuration
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Project Structure
|
|
88
|
+
|
|
89
|
+
The generated project includes:
|
|
90
|
+
|
|
91
|
+
1. **App.tsx**: Automatically loads and registers plugins on mount
|
|
92
|
+
2. **AppLayout.tsx**: Pre-configured layout with Slot components for:
|
|
93
|
+
- `header` slot
|
|
94
|
+
- `sidebar` slot
|
|
95
|
+
- `content` slot
|
|
96
|
+
- `footer` slot
|
|
97
|
+
3. **slotkit.config.ts**: Basic configuration pointing to `./plugins`
|
|
98
|
+
4. **helloworld plugin**: Located at `plugins/helloworld/` as a ready-to-run example
|
|
99
|
+
5. **vite.config.ts**: Vite configuration with plugin directory access
|
|
100
|
+
|
|
101
|
+
### Creating Plugins
|
|
102
|
+
|
|
103
|
+
After creating your project, you can create plugins:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Create a plugin
|
|
107
|
+
slotkit create-plugin my-plugin --slots content,sidebar
|
|
108
|
+
|
|
109
|
+
# Generate import mappings (required after creating plugins)
|
|
110
|
+
slotkit generate-imports
|
|
111
|
+
|
|
112
|
+
# List all plugins
|
|
113
|
+
slotkit list
|
|
114
|
+
|
|
115
|
+
# Enable/disable plugins
|
|
116
|
+
slotkit enable my-plugin
|
|
117
|
+
slotkit disable my-plugin
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Next Steps
|
|
121
|
+
|
|
122
|
+
1. Install dependencies: `pnpm install`
|
|
123
|
+
2. Start the dev server: `pnpm dev` (runs `slotkit generate-imports` automatically)
|
|
124
|
+
3. Create additional plugins: `slotkit create-plugin my-plugin --slots content`
|
|
125
|
+
4. Whenever you create/modify plugins outside the dev flow, run `pnpm slotkit generate-imports`
|
|
126
|
+
|
|
127
|
+
### Configuration
|
|
128
|
+
|
|
129
|
+
The generated `slotkit.config.ts` file:
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
import { defineConfig } from '@slotkitjs/core'
|
|
133
|
+
|
|
134
|
+
export default defineConfig({
|
|
135
|
+
pluginsDir: './plugins',
|
|
136
|
+
// Add more configuration here
|
|
137
|
+
})
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Development
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# Clone the repository
|
|
144
|
+
git clone <repository-url>
|
|
145
|
+
cd create-slotkit-app
|
|
146
|
+
|
|
147
|
+
# Install dependencies
|
|
148
|
+
pnpm install
|
|
149
|
+
|
|
150
|
+
# Build
|
|
151
|
+
pnpm build
|
|
152
|
+
|
|
153
|
+
# Development mode (watch)
|
|
154
|
+
pnpm dev
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### License
|
|
158
|
+
|
|
159
|
+
MIT
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 中文
|
|
164
|
+
|
|
165
|
+
### SlotKit 应用脚手架工具
|
|
166
|
+
|
|
167
|
+
`create-slotkit-app` 是一个 CLI 工具,帮助你快速创建一个新的 SlotKit 应用,包含所有必要的配置和样板代码。
|
|
168
|
+
|
|
169
|
+
### 特性
|
|
170
|
+
|
|
171
|
+
- **快速设置**:几秒钟内创建新的 SlotKit 项目
|
|
172
|
+
- **Vite 集成**:使用 Vite 进行快速开发和构建
|
|
173
|
+
- **TypeScript 支持**:包含完整的 TypeScript 配置
|
|
174
|
+
- **插件系统就绪**:预配置的插件目录结构
|
|
175
|
+
- **零配置**:开箱即用,使用合理的默认值
|
|
176
|
+
|
|
177
|
+
### 安装
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
npm install -g create-slotkit-app
|
|
181
|
+
# 或
|
|
182
|
+
yarn global add create-slotkit-app
|
|
183
|
+
# 或
|
|
184
|
+
pnpm add -g create-slotkit-app
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
或者直接使用 npx/pnpm create:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
npx create-slotkit-app my-app
|
|
191
|
+
# 或
|
|
192
|
+
pnpm create slotkit-app my-app
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### 使用
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
create-slotkit-app <project-name> [options]
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**选项:**
|
|
202
|
+
|
|
203
|
+
- `--template <template>` - 使用的 Vite 模板(默认:`react-ts`)
|
|
204
|
+
- 可用模板:`react`, `react-ts`, `vue`, `vue-ts`, `vanilla`, `vanilla-ts`
|
|
205
|
+
|
|
206
|
+
### 快速开始
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
# 创建新的 SlotKit 项目
|
|
210
|
+
create-slotkit-app my-slotkit-app
|
|
211
|
+
|
|
212
|
+
# 进入项目目录
|
|
213
|
+
cd my-slotkit-app
|
|
214
|
+
|
|
215
|
+
# 安装依赖
|
|
216
|
+
pnpm install
|
|
217
|
+
|
|
218
|
+
# 创建第一个插件
|
|
219
|
+
slotkit create-plugin my-first-plugin --slots content
|
|
220
|
+
|
|
221
|
+
# 生成插件导入映射
|
|
222
|
+
slotkit generate-imports
|
|
223
|
+
|
|
224
|
+
# 启动开发服务器
|
|
225
|
+
slotkit dev
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### 创建的内容
|
|
229
|
+
|
|
230
|
+
运行 `create-slotkit-app` 后,会创建:
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
my-slotkit-app/
|
|
234
|
+
├── src/
|
|
235
|
+
│ ├── App.tsx # 主应用组件,自动加载插件
|
|
236
|
+
│ ├── app/
|
|
237
|
+
│ │ ├── AppLayout.tsx # 包含 Slot 组件的布局
|
|
238
|
+
│ │ └── AppLayout.css # 布局样式
|
|
239
|
+
│ └── main.tsx # 入口文件
|
|
240
|
+
├── plugins/ # 插件目录(初始为空)
|
|
241
|
+
├── slotkit.config.ts # SlotKit 配置
|
|
242
|
+
├── vite.config.ts # Vite 配置
|
|
243
|
+
├── package.json # 项目依赖
|
|
244
|
+
└── tsconfig.json # TypeScript 配置
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### 项目结构
|
|
248
|
+
|
|
249
|
+
生成的项目包括:
|
|
250
|
+
|
|
251
|
+
1. **App.tsx**: 在挂载时自动加载并注册插件
|
|
252
|
+
2. **AppLayout.tsx**: 预配置的布局,包含以下插槽的 Slot 组件:
|
|
253
|
+
- `header` 插槽
|
|
254
|
+
- `sidebar` 插槽
|
|
255
|
+
- `content` 插槽
|
|
256
|
+
- `footer` 插槽
|
|
257
|
+
3. **slotkit.config.ts**: 指向 `./plugins` 目录的基本配置
|
|
258
|
+
4. **vite.config.ts**: Vite 配置,包含插件文件系统访问权限
|
|
259
|
+
|
|
260
|
+
### 创建插件
|
|
261
|
+
|
|
262
|
+
创建项目后,你可以创建插件:
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
# 创建插件
|
|
266
|
+
slotkit create-plugin my-plugin --slots content,sidebar
|
|
267
|
+
|
|
268
|
+
# 生成导入映射(创建插件后必需)
|
|
269
|
+
slotkit generate-imports
|
|
270
|
+
|
|
271
|
+
# 列出所有插件
|
|
272
|
+
slotkit list
|
|
273
|
+
|
|
274
|
+
# 启用/禁用插件
|
|
275
|
+
slotkit enable my-plugin
|
|
276
|
+
slotkit disable my-plugin
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### 下一步
|
|
280
|
+
|
|
281
|
+
1. **创建插件**:使用 `slotkit create-plugin` 搭建新插件
|
|
282
|
+
2. **生成导入**:创建插件后运行 `slotkit generate-imports`
|
|
283
|
+
3. **开始开发**:运行 `slotkit dev` 启动开发服务器
|
|
284
|
+
4. **构建**:准备生产构建时运行 `slotkit build`
|
|
285
|
+
|
|
286
|
+
### 配置
|
|
287
|
+
|
|
288
|
+
生成的 `slotkit.config.ts` 文件:
|
|
289
|
+
|
|
290
|
+
```typescript
|
|
291
|
+
import { defineConfig } from '@slotkitjs/core'
|
|
292
|
+
|
|
293
|
+
export default defineConfig({
|
|
294
|
+
pluginsDir: './plugins',
|
|
295
|
+
// 在这里添加更多配置
|
|
296
|
+
})
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### 开发
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
# 克隆仓库
|
|
303
|
+
git clone <repository-url>
|
|
304
|
+
cd create-slotkit-app
|
|
305
|
+
|
|
306
|
+
# 安装依赖
|
|
307
|
+
pnpm install
|
|
308
|
+
|
|
309
|
+
# 构建
|
|
310
|
+
pnpm build
|
|
311
|
+
|
|
312
|
+
# 开发模式(监听)
|
|
313
|
+
pnpm dev
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### 许可证
|
|
317
|
+
|
|
318
|
+
MIT
|
|
319
|
+
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import '../dist/index.js'
|
|
4
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import '../dist/index.js'
|
|
4
|
+
|
package/dist/index.js
CHANGED
|
@@ -54,218 +54,218 @@ function createSlotKitFiles(projectDir) {
|
|
|
54
54
|
const appDir = join(projectDir, 'src', 'app');
|
|
55
55
|
mkdirSync(appDir, { recursive: true });
|
|
56
56
|
// Create App.tsx (replaces Vite's default)
|
|
57
|
-
const appTsx = `import React, { useEffect, useState } from 'react'
|
|
58
|
-
import { AppLayout } from './app/AppLayout'
|
|
59
|
-
import { pluginRegistry, pluginLoader, setPluginImportFunctions } from '@slotkitjs/core'
|
|
60
|
-
|
|
61
|
-
// Import generated plugin import mappings
|
|
62
|
-
// This file is generated by 'slotkit generate-imports'
|
|
63
|
-
import * as pluginImports from './core/plugin/loader/plugin-imports.generated'
|
|
64
|
-
|
|
65
|
-
// Initialize plugin import mappings
|
|
66
|
-
if (pluginImports.getPluginImport && pluginImports.getAvailablePluginIds) {
|
|
67
|
-
setPluginImportFunctions({
|
|
68
|
-
getPluginImport: (pluginId: string) => {
|
|
69
|
-
const importFn = pluginImports.getPluginImport(pluginId)
|
|
70
|
-
if (!importFn) return undefined
|
|
71
|
-
return () => Promise.resolve(importFn())
|
|
72
|
-
},
|
|
73
|
-
getAvailablePluginIds: pluginImports.getAvailablePluginIds,
|
|
74
|
-
getAllPluginManifests: pluginImports.getAllPluginManifests,
|
|
75
|
-
getPluginManifest: pluginImports.getPluginManifest
|
|
76
|
-
})
|
|
77
|
-
} else {
|
|
78
|
-
console.warn('[WARN] Plugin import functions not found in generated file')
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Load all plugins
|
|
82
|
-
const loadPlugins = async () => {
|
|
83
|
-
try {
|
|
84
|
-
const plugins = await pluginLoader.loadAllPlugins()
|
|
85
|
-
|
|
86
|
-
plugins.forEach(plugin => {
|
|
87
|
-
pluginRegistry.register(plugin)
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
return plugins
|
|
91
|
-
} catch (error) {
|
|
92
|
-
console.error('[ERROR] Failed to load plugins:', error)
|
|
93
|
-
return []
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const App: React.FC = () => {
|
|
98
|
-
const [pluginsLoaded, setPluginsLoaded] = useState(false)
|
|
99
|
-
const [loadedPlugins, setLoadedPlugins] = useState<any[]>([])
|
|
100
|
-
|
|
101
|
-
useEffect(() => {
|
|
102
|
-
loadPlugins()
|
|
103
|
-
.then((plugins) => {
|
|
104
|
-
setPluginsLoaded(true)
|
|
105
|
-
setLoadedPlugins(plugins)
|
|
106
|
-
})
|
|
107
|
-
.catch((error) => {
|
|
108
|
-
console.error('[ERROR] Failed to load plugins:', error)
|
|
109
|
-
})
|
|
110
|
-
}, [])
|
|
111
|
-
|
|
112
|
-
return (
|
|
113
|
-
<div className="app">
|
|
114
|
-
<AppLayout />
|
|
115
|
-
|
|
116
|
-
{/* Plugin loading status indicator */}
|
|
117
|
-
<div style={{
|
|
118
|
-
position: 'fixed',
|
|
119
|
-
top: '10px',
|
|
120
|
-
right: '10px',
|
|
121
|
-
background: pluginsLoaded ? '#e8f5e8' : '#fff3cd',
|
|
122
|
-
padding: '10px',
|
|
123
|
-
borderRadius: '4px',
|
|
124
|
-
fontSize: '12px',
|
|
125
|
-
border: pluginsLoaded ? '1px solid #4caf50' : '1px solid #ffc107',
|
|
126
|
-
zIndex: 1000
|
|
127
|
-
}}>
|
|
128
|
-
{pluginsLoaded ? '[OK] Plugins loaded' : '[INFO] Loading plugins...'}
|
|
129
|
-
</div>
|
|
130
|
-
|
|
131
|
-
{/* Loaded plugins list */}
|
|
132
|
-
{loadedPlugins.length > 0 && (
|
|
133
|
-
<div style={{
|
|
134
|
-
position: 'fixed',
|
|
135
|
-
top: '50px',
|
|
136
|
-
right: '10px',
|
|
137
|
-
background: '#f3e5f5',
|
|
138
|
-
padding: '10px',
|
|
139
|
-
borderRadius: '4px',
|
|
140
|
-
fontSize: '11px',
|
|
141
|
-
border: '1px solid #9c27b0',
|
|
142
|
-
zIndex: 1000,
|
|
143
|
-
maxWidth: '200px'
|
|
144
|
-
}}>
|
|
145
|
-
<div style={{ fontWeight: 'bold', marginBottom: '5px' }}>Loaded Plugins:</div>
|
|
146
|
-
{loadedPlugins.map(plugin => (
|
|
147
|
-
<div key={plugin.id} style={{ marginBottom: '2px' }}>
|
|
148
|
-
• {plugin.name} v{plugin.version}
|
|
149
|
-
</div>
|
|
150
|
-
))}
|
|
151
|
-
</div>
|
|
152
|
-
)}
|
|
153
|
-
</div>
|
|
154
|
-
)
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
export default App;
|
|
57
|
+
const appTsx = `import React, { useEffect, useState } from 'react'
|
|
58
|
+
import { AppLayout } from './app/AppLayout'
|
|
59
|
+
import { pluginRegistry, pluginLoader, setPluginImportFunctions } from '@slotkitjs/core'
|
|
60
|
+
|
|
61
|
+
// Import generated plugin import mappings
|
|
62
|
+
// This file is generated by 'slotkit generate-imports'
|
|
63
|
+
import * as pluginImports from './core/plugin/loader/plugin-imports.generated'
|
|
64
|
+
|
|
65
|
+
// Initialize plugin import mappings
|
|
66
|
+
if (pluginImports.getPluginImport && pluginImports.getAvailablePluginIds) {
|
|
67
|
+
setPluginImportFunctions({
|
|
68
|
+
getPluginImport: (pluginId: string) => {
|
|
69
|
+
const importFn = pluginImports.getPluginImport(pluginId)
|
|
70
|
+
if (!importFn) return undefined
|
|
71
|
+
return () => Promise.resolve(importFn())
|
|
72
|
+
},
|
|
73
|
+
getAvailablePluginIds: pluginImports.getAvailablePluginIds,
|
|
74
|
+
getAllPluginManifests: pluginImports.getAllPluginManifests,
|
|
75
|
+
getPluginManifest: pluginImports.getPluginManifest
|
|
76
|
+
})
|
|
77
|
+
} else {
|
|
78
|
+
console.warn('[WARN] Plugin import functions not found in generated file')
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Load all plugins
|
|
82
|
+
const loadPlugins = async () => {
|
|
83
|
+
try {
|
|
84
|
+
const plugins = await pluginLoader.loadAllPlugins()
|
|
85
|
+
|
|
86
|
+
plugins.forEach(plugin => {
|
|
87
|
+
pluginRegistry.register(plugin)
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
return plugins
|
|
91
|
+
} catch (error) {
|
|
92
|
+
console.error('[ERROR] Failed to load plugins:', error)
|
|
93
|
+
return []
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const App: React.FC = () => {
|
|
98
|
+
const [pluginsLoaded, setPluginsLoaded] = useState(false)
|
|
99
|
+
const [loadedPlugins, setLoadedPlugins] = useState<any[]>([])
|
|
100
|
+
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
loadPlugins()
|
|
103
|
+
.then((plugins) => {
|
|
104
|
+
setPluginsLoaded(true)
|
|
105
|
+
setLoadedPlugins(plugins)
|
|
106
|
+
})
|
|
107
|
+
.catch((error) => {
|
|
108
|
+
console.error('[ERROR] Failed to load plugins:', error)
|
|
109
|
+
})
|
|
110
|
+
}, [])
|
|
111
|
+
|
|
112
|
+
return (
|
|
113
|
+
<div className="app">
|
|
114
|
+
<AppLayout />
|
|
115
|
+
|
|
116
|
+
{/* Plugin loading status indicator */}
|
|
117
|
+
<div style={{
|
|
118
|
+
position: 'fixed',
|
|
119
|
+
top: '10px',
|
|
120
|
+
right: '10px',
|
|
121
|
+
background: pluginsLoaded ? '#e8f5e8' : '#fff3cd',
|
|
122
|
+
padding: '10px',
|
|
123
|
+
borderRadius: '4px',
|
|
124
|
+
fontSize: '12px',
|
|
125
|
+
border: pluginsLoaded ? '1px solid #4caf50' : '1px solid #ffc107',
|
|
126
|
+
zIndex: 1000
|
|
127
|
+
}}>
|
|
128
|
+
{pluginsLoaded ? '[OK] Plugins loaded' : '[INFO] Loading plugins...'}
|
|
129
|
+
</div>
|
|
130
|
+
|
|
131
|
+
{/* Loaded plugins list */}
|
|
132
|
+
{loadedPlugins.length > 0 && (
|
|
133
|
+
<div style={{
|
|
134
|
+
position: 'fixed',
|
|
135
|
+
top: '50px',
|
|
136
|
+
right: '10px',
|
|
137
|
+
background: '#f3e5f5',
|
|
138
|
+
padding: '10px',
|
|
139
|
+
borderRadius: '4px',
|
|
140
|
+
fontSize: '11px',
|
|
141
|
+
border: '1px solid #9c27b0',
|
|
142
|
+
zIndex: 1000,
|
|
143
|
+
maxWidth: '200px'
|
|
144
|
+
}}>
|
|
145
|
+
<div style={{ fontWeight: 'bold', marginBottom: '5px' }}>Loaded Plugins:</div>
|
|
146
|
+
{loadedPlugins.map(plugin => (
|
|
147
|
+
<div key={plugin.id} style={{ marginBottom: '2px' }}>
|
|
148
|
+
• {plugin.name} v{plugin.version}
|
|
149
|
+
</div>
|
|
150
|
+
))}
|
|
151
|
+
</div>
|
|
152
|
+
)}
|
|
153
|
+
</div>
|
|
154
|
+
)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export default App;
|
|
158
158
|
`;
|
|
159
159
|
writeFileSync(appFilePath, appTsx, 'utf-8');
|
|
160
160
|
// Create AppLayout.tsx
|
|
161
|
-
const appLayoutTsx = `import React from 'react'
|
|
162
|
-
import { Slot } from '@slotkitjs/react'
|
|
163
|
-
import './AppLayout.css'
|
|
164
|
-
|
|
165
|
-
export const AppLayout: React.FC = () => {
|
|
166
|
-
return (
|
|
167
|
-
<div className="app-layout">
|
|
168
|
-
<header className="app-header">
|
|
169
|
-
<h1>SlotKit App</h1>
|
|
170
|
-
<Slot name="header" />
|
|
171
|
-
</header>
|
|
172
|
-
|
|
173
|
-
<main className="app-main">
|
|
174
|
-
<aside className="app-sidebar">
|
|
175
|
-
<h3>Sidebar</h3>
|
|
176
|
-
<Slot name="sidebar">
|
|
177
|
-
<p style={{ color: '#666', fontSize: '14px' }}>Waiting for plugins...</p>
|
|
178
|
-
</Slot>
|
|
179
|
-
</aside>
|
|
180
|
-
|
|
181
|
-
<section className="app-content">
|
|
182
|
-
<h3>Main Content</h3>
|
|
183
|
-
<Slot name="content">
|
|
184
|
-
<p style={{ color: '#666', fontSize: '14px' }}>Waiting for plugins...</p>
|
|
185
|
-
</Slot>
|
|
186
|
-
</section>
|
|
187
|
-
</main>
|
|
188
|
-
|
|
189
|
-
<footer className="app-footer">
|
|
190
|
-
<Slot name="footer" />
|
|
191
|
-
</footer>
|
|
192
|
-
</div>
|
|
193
|
-
)
|
|
194
|
-
}
|
|
161
|
+
const appLayoutTsx = `import React from 'react'
|
|
162
|
+
import { Slot } from '@slotkitjs/react'
|
|
163
|
+
import './AppLayout.css'
|
|
164
|
+
|
|
165
|
+
export const AppLayout: React.FC = () => {
|
|
166
|
+
return (
|
|
167
|
+
<div className="app-layout">
|
|
168
|
+
<header className="app-header">
|
|
169
|
+
<h1>SlotKit App</h1>
|
|
170
|
+
<Slot name="header" />
|
|
171
|
+
</header>
|
|
172
|
+
|
|
173
|
+
<main className="app-main">
|
|
174
|
+
<aside className="app-sidebar">
|
|
175
|
+
<h3>Sidebar</h3>
|
|
176
|
+
<Slot name="sidebar">
|
|
177
|
+
<p style={{ color: '#666', fontSize: '14px' }}>Waiting for plugins...</p>
|
|
178
|
+
</Slot>
|
|
179
|
+
</aside>
|
|
180
|
+
|
|
181
|
+
<section className="app-content">
|
|
182
|
+
<h3>Main Content</h3>
|
|
183
|
+
<Slot name="content">
|
|
184
|
+
<p style={{ color: '#666', fontSize: '14px' }}>Waiting for plugins...</p>
|
|
185
|
+
</Slot>
|
|
186
|
+
</section>
|
|
187
|
+
</main>
|
|
188
|
+
|
|
189
|
+
<footer className="app-footer">
|
|
190
|
+
<Slot name="footer" />
|
|
191
|
+
</footer>
|
|
192
|
+
</div>
|
|
193
|
+
)
|
|
194
|
+
}
|
|
195
195
|
`;
|
|
196
196
|
writeFileSync(join(appDir, 'AppLayout.tsx'), appLayoutTsx, 'utf-8');
|
|
197
197
|
// Create AppLayout.css
|
|
198
|
-
const appLayoutCss = `.app-layout {
|
|
199
|
-
display: flex;
|
|
200
|
-
flex-direction: column;
|
|
201
|
-
min-height: 100vh;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
.app-header {
|
|
205
|
-
background: #2196f3;
|
|
206
|
-
color: white;
|
|
207
|
-
padding: 1rem 2rem;
|
|
208
|
-
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
.app-header h1 {
|
|
212
|
-
margin: 0;
|
|
213
|
-
font-size: 1.5rem;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
.app-main {
|
|
217
|
-
display: flex;
|
|
218
|
-
flex: 1;
|
|
219
|
-
gap: 1rem;
|
|
220
|
-
padding: 1rem;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
.app-sidebar {
|
|
224
|
-
width: 250px;
|
|
225
|
-
background: #f5f5f5;
|
|
226
|
-
padding: 1rem;
|
|
227
|
-
border-radius: 8px;
|
|
228
|
-
border: 1px solid #ddd;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
.app-sidebar h3 {
|
|
232
|
-
margin: 0 0 1rem 0;
|
|
233
|
-
font-size: 1.1rem;
|
|
234
|
-
color: #333;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
.app-content {
|
|
238
|
-
flex: 1;
|
|
239
|
-
background: white;
|
|
240
|
-
padding: 1rem;
|
|
241
|
-
border-radius: 8px;
|
|
242
|
-
border: 1px solid #ddd;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
.app-content h3 {
|
|
246
|
-
margin: 0 0 1rem 0;
|
|
247
|
-
font-size: 1.1rem;
|
|
248
|
-
color: #333;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
.app-footer {
|
|
252
|
-
background: #f5f5f5;
|
|
253
|
-
padding: 1rem 2rem;
|
|
254
|
-
border-top: 1px solid #ddd;
|
|
255
|
-
text-align: center;
|
|
256
|
-
color: #666;
|
|
257
|
-
}
|
|
198
|
+
const appLayoutCss = `.app-layout {
|
|
199
|
+
display: flex;
|
|
200
|
+
flex-direction: column;
|
|
201
|
+
min-height: 100vh;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.app-header {
|
|
205
|
+
background: #2196f3;
|
|
206
|
+
color: white;
|
|
207
|
+
padding: 1rem 2rem;
|
|
208
|
+
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.app-header h1 {
|
|
212
|
+
margin: 0;
|
|
213
|
+
font-size: 1.5rem;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.app-main {
|
|
217
|
+
display: flex;
|
|
218
|
+
flex: 1;
|
|
219
|
+
gap: 1rem;
|
|
220
|
+
padding: 1rem;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.app-sidebar {
|
|
224
|
+
width: 250px;
|
|
225
|
+
background: #f5f5f5;
|
|
226
|
+
padding: 1rem;
|
|
227
|
+
border-radius: 8px;
|
|
228
|
+
border: 1px solid #ddd;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.app-sidebar h3 {
|
|
232
|
+
margin: 0 0 1rem 0;
|
|
233
|
+
font-size: 1.1rem;
|
|
234
|
+
color: #333;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.app-content {
|
|
238
|
+
flex: 1;
|
|
239
|
+
background: white;
|
|
240
|
+
padding: 1rem;
|
|
241
|
+
border-radius: 8px;
|
|
242
|
+
border: 1px solid #ddd;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.app-content h3 {
|
|
246
|
+
margin: 0 0 1rem 0;
|
|
247
|
+
font-size: 1.1rem;
|
|
248
|
+
color: #333;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.app-footer {
|
|
252
|
+
background: #f5f5f5;
|
|
253
|
+
padding: 1rem 2rem;
|
|
254
|
+
border-top: 1px solid #ddd;
|
|
255
|
+
text-align: center;
|
|
256
|
+
color: #666;
|
|
257
|
+
}
|
|
258
258
|
`;
|
|
259
259
|
writeFileSync(join(appDir, 'AppLayout.css'), appLayoutCss, 'utf-8');
|
|
260
260
|
// No need to modify main.tsx - Vite's default already imports './App'
|
|
261
261
|
// We replaced src/App.tsx above, so it will automatically work
|
|
262
262
|
// Create slotkit.config.ts
|
|
263
|
-
const slotkitConfig = `import { defineConfig } from '@slotkitjs/core'
|
|
264
|
-
|
|
265
|
-
export default defineConfig({
|
|
266
|
-
pluginsDir: './plugins',
|
|
267
|
-
// Add more configuration here
|
|
268
|
-
})
|
|
263
|
+
const slotkitConfig = `import { defineConfig } from '@slotkitjs/core'
|
|
264
|
+
|
|
265
|
+
export default defineConfig({
|
|
266
|
+
pluginsDir: './plugins',
|
|
267
|
+
// Add more configuration here
|
|
268
|
+
})
|
|
269
269
|
`;
|
|
270
270
|
writeFileSync(join(projectDir, 'slotkit.config.ts'), slotkitConfig, 'utf-8');
|
|
271
271
|
// Create plugins directory and default hello-world plugin
|
|
@@ -274,65 +274,65 @@ export default defineConfig({
|
|
|
274
274
|
const helloWorldDir = join(pluginsDir, 'helloworld');
|
|
275
275
|
const helloWorldSrcDir = join(helloWorldDir, 'src');
|
|
276
276
|
mkdirSync(helloWorldSrcDir, { recursive: true });
|
|
277
|
-
const helloWorldManifest = `{
|
|
278
|
-
"id": "helloworld",
|
|
279
|
-
"name": "Hello-world Plugin",
|
|
280
|
-
"version": "1.0.0",
|
|
281
|
-
"description": "A built-in hello-world plugin",
|
|
282
|
-
"author": "SlotKit Team",
|
|
283
|
-
"entry": "./src/index.tsx",
|
|
284
|
-
"slots": [
|
|
285
|
-
"content"
|
|
286
|
-
],
|
|
287
|
-
"enabled": true
|
|
277
|
+
const helloWorldManifest = `{
|
|
278
|
+
"id": "helloworld",
|
|
279
|
+
"name": "Hello-world Plugin",
|
|
280
|
+
"version": "1.0.0",
|
|
281
|
+
"description": "A built-in hello-world plugin",
|
|
282
|
+
"author": "SlotKit Team",
|
|
283
|
+
"entry": "./src/index.tsx",
|
|
284
|
+
"slots": [
|
|
285
|
+
"content"
|
|
286
|
+
],
|
|
287
|
+
"enabled": true
|
|
288
288
|
}`;
|
|
289
289
|
writeFileSync(join(helloWorldDir, 'manifest.json'), helloWorldManifest + '\n', 'utf-8');
|
|
290
|
-
const helloWorldPackageJson = `{
|
|
291
|
-
"name": "plugin-helloworld",
|
|
292
|
-
"version": "1.0.0",
|
|
293
|
-
"main": "src/index.tsx",
|
|
294
|
-
"private": true
|
|
290
|
+
const helloWorldPackageJson = `{
|
|
291
|
+
"name": "plugin-helloworld",
|
|
292
|
+
"version": "1.0.0",
|
|
293
|
+
"main": "src/index.tsx",
|
|
294
|
+
"private": true
|
|
295
295
|
}`;
|
|
296
296
|
writeFileSync(join(helloWorldDir, 'package.json'), helloWorldPackageJson + '\n', 'utf-8');
|
|
297
|
-
const helloWorldTsconfig = `{
|
|
298
|
-
"extends": "../../tsconfig.json",
|
|
299
|
-
"compilerOptions": {
|
|
300
|
-
"jsx": "react-jsx"
|
|
301
|
-
},
|
|
302
|
-
"include": [
|
|
303
|
-
"src/**/*"
|
|
304
|
-
]
|
|
297
|
+
const helloWorldTsconfig = `{
|
|
298
|
+
"extends": "../../tsconfig.json",
|
|
299
|
+
"compilerOptions": {
|
|
300
|
+
"jsx": "react-jsx"
|
|
301
|
+
},
|
|
302
|
+
"include": [
|
|
303
|
+
"src/**/*"
|
|
304
|
+
]
|
|
305
305
|
}`;
|
|
306
306
|
writeFileSync(join(helloWorldDir, 'tsconfig.json'), helloWorldTsconfig + '\n', 'utf-8');
|
|
307
|
-
const helloWorldIndexTsx = `import React from 'react'
|
|
308
|
-
|
|
309
|
-
const HelloWorldComponent: React.FC = () => {
|
|
310
|
-
return (
|
|
311
|
-
<div
|
|
312
|
-
style={{
|
|
313
|
-
padding: '1rem',
|
|
314
|
-
background: '#f5f5f5',
|
|
315
|
-
border: '1px solid #ddd',
|
|
316
|
-
borderRadius: '8px',
|
|
317
|
-
margin: '0.5rem 0'
|
|
318
|
-
}}
|
|
319
|
-
>
|
|
320
|
-
<h3>Hello-world Plugin</h3>
|
|
321
|
-
<p>This is the default hello-world plugin generated by create-slotkit-app.</p>
|
|
322
|
-
</div>
|
|
323
|
-
)
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
const helloworldPlugin = {
|
|
327
|
-
id: 'helloworld',
|
|
328
|
-
name: 'Hello-world Plugin',
|
|
329
|
-
version: '1.0.0',
|
|
330
|
-
component: HelloWorldComponent,
|
|
331
|
-
slots: ['content']
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
export { helloworldPlugin }
|
|
335
|
-
export default helloworldPlugin
|
|
307
|
+
const helloWorldIndexTsx = `import React from 'react'
|
|
308
|
+
|
|
309
|
+
const HelloWorldComponent: React.FC = () => {
|
|
310
|
+
return (
|
|
311
|
+
<div
|
|
312
|
+
style={{
|
|
313
|
+
padding: '1rem',
|
|
314
|
+
background: '#f5f5f5',
|
|
315
|
+
border: '1px solid #ddd',
|
|
316
|
+
borderRadius: '8px',
|
|
317
|
+
margin: '0.5rem 0'
|
|
318
|
+
}}
|
|
319
|
+
>
|
|
320
|
+
<h3>Hello-world Plugin</h3>
|
|
321
|
+
<p>This is the default hello-world plugin generated by create-slotkit-app.</p>
|
|
322
|
+
</div>
|
|
323
|
+
)
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
const helloworldPlugin = {
|
|
327
|
+
id: 'helloworld',
|
|
328
|
+
name: 'Hello-world Plugin',
|
|
329
|
+
version: '1.0.0',
|
|
330
|
+
component: HelloWorldComponent,
|
|
331
|
+
slots: ['content']
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
export { helloworldPlugin }
|
|
335
|
+
export default helloworldPlugin
|
|
336
336
|
`;
|
|
337
337
|
writeFileSync(join(helloWorldSrcDir, 'index.tsx'), helloWorldIndexTsx, 'utf-8');
|
|
338
338
|
// Create or update vite.config.ts with SlotKit-specific configuration
|
|
@@ -348,12 +348,12 @@ export default helloworldPlugin
|
|
|
348
348
|
if (!viteConfig.includes('server:')) {
|
|
349
349
|
// Find the defineConfig call and add server config inside it
|
|
350
350
|
if (viteConfig.includes('export default defineConfig')) {
|
|
351
|
-
viteConfig = viteConfig.replace(/export default defineConfig\(\{/, `export default defineConfig({
|
|
352
|
-
server: {
|
|
353
|
-
fs: {
|
|
354
|
-
// Allow access to plugin directory
|
|
355
|
-
allow: ['..', '../..', '../../..']
|
|
356
|
-
}
|
|
351
|
+
viteConfig = viteConfig.replace(/export default defineConfig\(\{/, `export default defineConfig({
|
|
352
|
+
server: {
|
|
353
|
+
fs: {
|
|
354
|
+
// Allow access to plugin directory
|
|
355
|
+
allow: ['..', '../..', '../../..']
|
|
356
|
+
}
|
|
357
357
|
},`);
|
|
358
358
|
writeFileSync(existingConfigPath, viteConfig, 'utf-8');
|
|
359
359
|
}
|
|
@@ -361,18 +361,18 @@ export default helloworldPlugin
|
|
|
361
361
|
}
|
|
362
362
|
else {
|
|
363
363
|
// Create new vite.config.ts
|
|
364
|
-
const viteConfigContent = `import { defineConfig } from 'vite'
|
|
365
|
-
import react from '@vitejs/plugin-react'
|
|
366
|
-
|
|
367
|
-
export default defineConfig({
|
|
368
|
-
plugins: [react()],
|
|
369
|
-
server: {
|
|
370
|
-
fs: {
|
|
371
|
-
// Allow access to plugin directory
|
|
372
|
-
allow: ['..', '../..', '../../..']
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
})
|
|
364
|
+
const viteConfigContent = `import { defineConfig } from 'vite'
|
|
365
|
+
import react from '@vitejs/plugin-react'
|
|
366
|
+
|
|
367
|
+
export default defineConfig({
|
|
368
|
+
plugins: [react()],
|
|
369
|
+
server: {
|
|
370
|
+
fs: {
|
|
371
|
+
// Allow access to plugin directory
|
|
372
|
+
allow: ['..', '../..', '../../..']
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
})
|
|
376
376
|
`;
|
|
377
377
|
writeFileSync(viteConfigPath, viteConfigContent, 'utf-8');
|
|
378
378
|
}
|
package/package.json
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "create-slotkit-app",
|
|
3
|
-
"version": "0.1
|
|
4
|
-
"type": "module",
|
|
5
|
-
"description": "Create a new SlotKit application",
|
|
6
|
-
"bin": {
|
|
7
|
-
"create-slotkit-app": "./bin/create-slotkit-app.js"
|
|
8
|
-
},
|
|
9
|
-
"files": [
|
|
10
|
-
"bin",
|
|
11
|
-
"dist"
|
|
12
|
-
],
|
|
13
|
-
"scripts": {
|
|
14
|
-
"build": "tsc",
|
|
15
|
-
"dev": "tsc --watch"
|
|
16
|
-
},
|
|
17
|
-
"keywords": [
|
|
18
|
-
"slotkit",
|
|
19
|
-
"create-app",
|
|
20
|
-
"scaffold"
|
|
21
|
-
],
|
|
22
|
-
"author": "liusnew <liushuinew@gmail.com>",
|
|
23
|
-
"license": "MIT",
|
|
24
|
-
"dependencies": {
|
|
25
|
-
"commander": "^12.1.0"
|
|
26
|
-
},
|
|
27
|
-
"devDependencies": {
|
|
28
|
-
"@types/node": "^24.6.0",
|
|
29
|
-
"typescript": "~5.9.3"
|
|
30
|
-
}
|
|
31
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "create-slotkit-app",
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Create a new SlotKit application",
|
|
6
|
+
"bin": {
|
|
7
|
+
"create-slotkit-app": "./bin/create-slotkit-app.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin",
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "tsc --watch"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"slotkit",
|
|
19
|
+
"create-app",
|
|
20
|
+
"scaffold"
|
|
21
|
+
],
|
|
22
|
+
"author": "liusnew <liushuinew@gmail.com>",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"commander": "^12.1.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^24.6.0",
|
|
29
|
+
"typescript": "~5.9.3"
|
|
30
|
+
}
|
|
31
|
+
}
|