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 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.7",
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
+ }