@spwig/theme-cli 1.0.0 → 1.1.0
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/CHANGELOG.md +41 -0
- package/dist/cli.js +19 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/dev.d.ts +14 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +310 -0
- package/dist/commands/dev.js.map +1 -0
- package/package.json +5 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to @spwig/theme-cli will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [1.1.0] - 2025-11-19
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **`spwig dev` command** - Development server with hot reload
|
|
12
|
+
- Connect to a running Spwig shop for live theme development
|
|
13
|
+
- Automatic file watching and synchronization
|
|
14
|
+
- CSS-only hot reload for style changes
|
|
15
|
+
- Full page reload for template/manifest changes
|
|
16
|
+
- Basic auth with shop admin credentials
|
|
17
|
+
- Auto-opens browser to preview URL
|
|
18
|
+
- Clean disconnect on Ctrl+C
|
|
19
|
+
|
|
20
|
+
### Dependencies
|
|
21
|
+
- Added `chokidar` for file watching
|
|
22
|
+
- Added `open` for browser launching
|
|
23
|
+
|
|
24
|
+
## [1.0.0] - 2025-11-18
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
- Initial release
|
|
28
|
+
- **`spwig init`** - Create new theme with interactive prompts
|
|
29
|
+
- Template options: full, minimal, blank
|
|
30
|
+
- Git initialization support
|
|
31
|
+
- **`spwig validate`** - Validate theme or component structure
|
|
32
|
+
- JSON schema validation for manifests
|
|
33
|
+
- File structure verification
|
|
34
|
+
- Asset size checks (5MB max for images)
|
|
35
|
+
- **`spwig package`** - Create distributable theme package
|
|
36
|
+
- ZIP archive generation
|
|
37
|
+
- SHA256 checksum calculation
|
|
38
|
+
- Pre-packaging validation
|
|
39
|
+
- **`spwig component add`** - Add components to theme
|
|
40
|
+
- Scaffold component files (manifest, template, schema, styles)
|
|
41
|
+
- Auto-update theme manifest with new component
|
package/dist/cli.js
CHANGED
|
@@ -5,11 +5,12 @@ import { initCommand } from './commands/init.js';
|
|
|
5
5
|
import { validateCommand } from './commands/validate.js';
|
|
6
6
|
import { packageCommand } from './commands/package.js';
|
|
7
7
|
import { componentCommand } from './commands/component.js';
|
|
8
|
+
import { devCommand } from './commands/dev.js';
|
|
8
9
|
const program = new Command();
|
|
9
10
|
program
|
|
10
11
|
.name('spwig')
|
|
11
12
|
.description('Spwig Theme SDK - Build professional themes for Spwig eCommerce')
|
|
12
|
-
.version('1.
|
|
13
|
+
.version('1.1.0');
|
|
13
14
|
// spwig init
|
|
14
15
|
program
|
|
15
16
|
.command('init [name]')
|
|
@@ -62,6 +63,23 @@ program
|
|
|
62
63
|
process.exit(1);
|
|
63
64
|
}
|
|
64
65
|
});
|
|
66
|
+
// spwig dev
|
|
67
|
+
program
|
|
68
|
+
.command('dev [path]')
|
|
69
|
+
.description('Start development server with hot reload')
|
|
70
|
+
.requiredOption('-s, --shop <url>', 'Spwig shop URL (e.g., http://localhost:8000)')
|
|
71
|
+
.option('-p, --port <port>', 'Local port for dev server', '3000')
|
|
72
|
+
.option('--no-open', 'Do not open browser automatically')
|
|
73
|
+
.option('-v, --verbose', 'Enable verbose logging')
|
|
74
|
+
.action(async (path, options) => {
|
|
75
|
+
try {
|
|
76
|
+
await devCommand(path || process.cwd(), options);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
65
83
|
// spwig component
|
|
66
84
|
program
|
|
67
85
|
.command('component')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Development server command for Spwig Theme SDK
|
|
3
|
+
*
|
|
4
|
+
* Connects to a running Spwig shop for live theme development with hot reload.
|
|
5
|
+
*/
|
|
6
|
+
interface DevOptions {
|
|
7
|
+
shop: string;
|
|
8
|
+
port?: number;
|
|
9
|
+
open?: boolean;
|
|
10
|
+
verbose?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function devCommand(themePath: string, options: DevOptions): Promise<void>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=dev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA0BD,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA8KtF"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Development server command for Spwig Theme SDK
|
|
3
|
+
*
|
|
4
|
+
* Connects to a running Spwig shop for live theme development with hot reload.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs/promises';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as crypto from 'crypto';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import ora from 'ora';
|
|
11
|
+
import chokidar from 'chokidar';
|
|
12
|
+
import open from 'open';
|
|
13
|
+
// File extensions that should be encoded as base64
|
|
14
|
+
const BINARY_EXTENSIONS = ['.png', '.jpg', '.jpeg', '.webp', '.woff', '.woff2', '.ico', '.gif'];
|
|
15
|
+
export async function devCommand(themePath, options) {
|
|
16
|
+
const spinner = ora();
|
|
17
|
+
let session = null;
|
|
18
|
+
let watcher = null;
|
|
19
|
+
// Cleanup handler
|
|
20
|
+
const cleanup = async () => {
|
|
21
|
+
if (watcher) {
|
|
22
|
+
await watcher.close();
|
|
23
|
+
}
|
|
24
|
+
if (session) {
|
|
25
|
+
await disconnectSession(options.shop, session.token, spinner);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
// Handle process termination
|
|
29
|
+
process.on('SIGINT', async () => {
|
|
30
|
+
console.log(chalk.yellow('\n\nShutting down dev server...'));
|
|
31
|
+
await cleanup();
|
|
32
|
+
process.exit(0);
|
|
33
|
+
});
|
|
34
|
+
process.on('SIGTERM', async () => {
|
|
35
|
+
await cleanup();
|
|
36
|
+
process.exit(0);
|
|
37
|
+
});
|
|
38
|
+
try {
|
|
39
|
+
// Resolve theme path
|
|
40
|
+
const absoluteThemePath = path.resolve(themePath || process.cwd());
|
|
41
|
+
// Check theme exists
|
|
42
|
+
const manifestPath = path.join(absoluteThemePath, 'manifest.json');
|
|
43
|
+
if (!await fileExists(manifestPath)) {
|
|
44
|
+
console.error(chalk.red('Error: manifest.json not found. Are you in a theme directory?'));
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
// Read theme manifest
|
|
48
|
+
const manifest = JSON.parse(await fs.readFile(manifestPath, 'utf-8'));
|
|
49
|
+
const themeName = manifest.name || 'Unknown Theme';
|
|
50
|
+
console.log(chalk.blue(`\n🚀 Spwig Theme Development Server\n`));
|
|
51
|
+
console.log(`Theme: ${chalk.bold(themeName)}`);
|
|
52
|
+
console.log(`Shop: ${chalk.cyan(options.shop)}\n`);
|
|
53
|
+
// Connect to shop
|
|
54
|
+
spinner.start('Connecting to shop...');
|
|
55
|
+
session = await connectToShop(options.shop, themeName, absoluteThemePath, options);
|
|
56
|
+
spinner.succeed(`Connected as ${chalk.green(session.message)}`);
|
|
57
|
+
// Initial sync
|
|
58
|
+
spinner.start('Syncing theme files...');
|
|
59
|
+
const files = await collectThemeFiles(absoluteThemePath);
|
|
60
|
+
const syncResult = await syncFiles(options.shop, session.token, files);
|
|
61
|
+
if (syncResult.success) {
|
|
62
|
+
spinner.succeed(`Synced ${chalk.green(syncResult.synced.length)} files`);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
spinner.warn(`Synced with ${chalk.yellow(syncResult.errors.length)} errors`);
|
|
66
|
+
syncResult.errors.forEach(err => console.log(chalk.red(` - ${err}`)));
|
|
67
|
+
}
|
|
68
|
+
// Validate theme
|
|
69
|
+
spinner.start('Validating theme...');
|
|
70
|
+
const validation = await validateTheme(options.shop, session.token);
|
|
71
|
+
if (validation.is_valid) {
|
|
72
|
+
spinner.succeed('Theme validation passed');
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
spinner.warn(`Validation: ${chalk.yellow(validation.error_count)} errors, ${chalk.yellow(validation.warning_count)} warnings`);
|
|
76
|
+
validation.errors.forEach((err) => console.log(chalk.red(` ✗ ${err}`)));
|
|
77
|
+
validation.warnings.forEach((warn) => console.log(chalk.yellow(` ⚠ ${warn}`)));
|
|
78
|
+
}
|
|
79
|
+
// Get preview URL
|
|
80
|
+
const previewUrl = `${options.shop}${session.theme_dev_url}`;
|
|
81
|
+
console.log(chalk.green(`\n✓ Dev server ready!\n`));
|
|
82
|
+
console.log(`Preview: ${chalk.cyan(previewUrl)}`);
|
|
83
|
+
console.log(`Watch: ${chalk.dim('Watching for file changes...')}\n`);
|
|
84
|
+
// Open browser if requested
|
|
85
|
+
if (options.open !== false) {
|
|
86
|
+
await open(previewUrl);
|
|
87
|
+
}
|
|
88
|
+
// Start file watcher
|
|
89
|
+
watcher = chokidar.watch(absoluteThemePath, {
|
|
90
|
+
ignored: [
|
|
91
|
+
/(^|[\/\\])\../, // Ignore dotfiles
|
|
92
|
+
'**/node_modules/**',
|
|
93
|
+
'**/dist/**',
|
|
94
|
+
'**/*.log',
|
|
95
|
+
],
|
|
96
|
+
persistent: true,
|
|
97
|
+
ignoreInitial: true,
|
|
98
|
+
awaitWriteFinish: {
|
|
99
|
+
stabilityThreshold: 100,
|
|
100
|
+
pollInterval: 50,
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
// Track pending changes for debouncing
|
|
104
|
+
let pendingChanges = new Map();
|
|
105
|
+
const DEBOUNCE_MS = 200;
|
|
106
|
+
const handleChange = async (filePath) => {
|
|
107
|
+
const relativePath = path.relative(absoluteThemePath, filePath);
|
|
108
|
+
// Clear existing timeout for this file
|
|
109
|
+
const existingTimeout = pendingChanges.get(relativePath);
|
|
110
|
+
if (existingTimeout) {
|
|
111
|
+
clearTimeout(existingTimeout);
|
|
112
|
+
}
|
|
113
|
+
// Set new debounced timeout
|
|
114
|
+
pendingChanges.set(relativePath, setTimeout(async () => {
|
|
115
|
+
pendingChanges.delete(relativePath);
|
|
116
|
+
try {
|
|
117
|
+
const content = await fs.readFile(filePath);
|
|
118
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
119
|
+
const isBinary = BINARY_EXTENSIONS.includes(ext);
|
|
120
|
+
const file = {
|
|
121
|
+
path: relativePath,
|
|
122
|
+
content: isBinary ? content.toString('base64') : content.toString('utf-8'),
|
|
123
|
+
checksum: crypto.createHash('sha256').update(content).digest('hex'),
|
|
124
|
+
encoding: isBinary ? 'base64' : 'utf-8',
|
|
125
|
+
};
|
|
126
|
+
const result = await syncFiles(options.shop, session.token, [file]);
|
|
127
|
+
if (result.success) {
|
|
128
|
+
const icon = result.reload_type === 'css' ? '🎨' : '🔄';
|
|
129
|
+
console.log(`${icon} ${chalk.dim(relativePath)} ${chalk.green('synced')}`);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
console.log(`${chalk.red('✗')} ${chalk.dim(relativePath)} ${chalk.red('failed')}`);
|
|
133
|
+
result.errors.forEach(err => console.log(chalk.red(` ${err}`)));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
console.log(`${chalk.red('✗')} ${chalk.dim(relativePath)} ${chalk.red('read error')}`);
|
|
138
|
+
}
|
|
139
|
+
}, DEBOUNCE_MS));
|
|
140
|
+
};
|
|
141
|
+
watcher
|
|
142
|
+
.on('change', handleChange)
|
|
143
|
+
.on('add', handleChange)
|
|
144
|
+
.on('unlink', (filePath) => {
|
|
145
|
+
const relativePath = path.relative(absoluteThemePath, filePath);
|
|
146
|
+
console.log(`${chalk.yellow('⊖')} ${chalk.dim(relativePath)} ${chalk.yellow('deleted')}`);
|
|
147
|
+
// TODO: Send delete event to shop
|
|
148
|
+
});
|
|
149
|
+
// Keep process running
|
|
150
|
+
console.log(chalk.dim('Press Ctrl+C to stop\n'));
|
|
151
|
+
// Keep alive
|
|
152
|
+
await new Promise(() => { });
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
spinner.fail('Dev server failed');
|
|
156
|
+
await cleanup();
|
|
157
|
+
if (error instanceof Error) {
|
|
158
|
+
console.error(chalk.red(`\nError: ${error.message}`));
|
|
159
|
+
if (options.verbose) {
|
|
160
|
+
console.error(error.stack);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async function connectToShop(shopUrl, themeName, themePath, options) {
|
|
167
|
+
// Prompt for credentials
|
|
168
|
+
const readline = await import('readline');
|
|
169
|
+
const rl = readline.createInterface({
|
|
170
|
+
input: process.stdin,
|
|
171
|
+
output: process.stdout,
|
|
172
|
+
});
|
|
173
|
+
const question = (prompt) => {
|
|
174
|
+
return new Promise((resolve) => {
|
|
175
|
+
rl.question(prompt, (answer) => {
|
|
176
|
+
resolve(answer);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
console.log(chalk.dim('\nEnter admin credentials:'));
|
|
181
|
+
const username = await question('Username: ');
|
|
182
|
+
// Use muted input for password (or prompt without echo)
|
|
183
|
+
process.stdout.write('Password: ');
|
|
184
|
+
const password = await new Promise((resolve) => {
|
|
185
|
+
let pwd = '';
|
|
186
|
+
process.stdin.setRawMode(true);
|
|
187
|
+
process.stdin.resume();
|
|
188
|
+
process.stdin.on('data', (char) => {
|
|
189
|
+
const c = char.toString();
|
|
190
|
+
if (c === '\n' || c === '\r') {
|
|
191
|
+
process.stdin.setRawMode(false);
|
|
192
|
+
process.stdout.write('\n');
|
|
193
|
+
resolve(pwd);
|
|
194
|
+
}
|
|
195
|
+
else if (c === '\u007f') {
|
|
196
|
+
// Backspace
|
|
197
|
+
pwd = pwd.slice(0, -1);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
pwd += c;
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
rl.close();
|
|
205
|
+
// Connect to shop
|
|
206
|
+
const credentials = Buffer.from(`${username}:${password}`).toString('base64');
|
|
207
|
+
const response = await fetch(`${shopUrl}/api/theme-dev/connect/`, {
|
|
208
|
+
method: 'POST',
|
|
209
|
+
headers: {
|
|
210
|
+
'Content-Type': 'application/json',
|
|
211
|
+
'Authorization': `Basic ${credentials}`,
|
|
212
|
+
},
|
|
213
|
+
body: JSON.stringify({
|
|
214
|
+
theme_name: themeName,
|
|
215
|
+
theme_path: themePath,
|
|
216
|
+
client_info: {
|
|
217
|
+
cli_version: '1.1.0',
|
|
218
|
+
node_version: process.version,
|
|
219
|
+
os: process.platform,
|
|
220
|
+
},
|
|
221
|
+
}),
|
|
222
|
+
});
|
|
223
|
+
if (!response.ok) {
|
|
224
|
+
const error = await response.json().catch(() => ({ error: response.statusText }));
|
|
225
|
+
throw new Error(error.error || `Connection failed: ${response.status}`);
|
|
226
|
+
}
|
|
227
|
+
return response.json();
|
|
228
|
+
}
|
|
229
|
+
async function disconnectSession(shopUrl, token, spinner) {
|
|
230
|
+
try {
|
|
231
|
+
spinner.start('Disconnecting...');
|
|
232
|
+
await fetch(`${shopUrl}/api/theme-dev/disconnect/`, {
|
|
233
|
+
method: 'POST',
|
|
234
|
+
headers: {
|
|
235
|
+
'X-Dev-Token': token,
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
spinner.succeed('Disconnected');
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
spinner.warn('Failed to disconnect cleanly');
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
async function collectThemeFiles(themePath) {
|
|
245
|
+
const files = [];
|
|
246
|
+
const walk = async (dir) => {
|
|
247
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
248
|
+
for (const entry of entries) {
|
|
249
|
+
const fullPath = path.join(dir, entry.name);
|
|
250
|
+
const relativePath = path.relative(themePath, fullPath);
|
|
251
|
+
// Skip ignored files/directories
|
|
252
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist') {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
if (entry.isDirectory()) {
|
|
256
|
+
await walk(fullPath);
|
|
257
|
+
}
|
|
258
|
+
else if (entry.isFile()) {
|
|
259
|
+
const content = await fs.readFile(fullPath);
|
|
260
|
+
const ext = path.extname(entry.name).toLowerCase();
|
|
261
|
+
const isBinary = BINARY_EXTENSIONS.includes(ext);
|
|
262
|
+
files.push({
|
|
263
|
+
path: relativePath,
|
|
264
|
+
content: isBinary ? content.toString('base64') : content.toString('utf-8'),
|
|
265
|
+
checksum: crypto.createHash('sha256').update(content).digest('hex'),
|
|
266
|
+
encoding: isBinary ? 'base64' : 'utf-8',
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
await walk(themePath);
|
|
272
|
+
return files;
|
|
273
|
+
}
|
|
274
|
+
async function syncFiles(shopUrl, token, files) {
|
|
275
|
+
const response = await fetch(`${shopUrl}/api/theme-dev/sync/`, {
|
|
276
|
+
method: 'POST',
|
|
277
|
+
headers: {
|
|
278
|
+
'Content-Type': 'application/json',
|
|
279
|
+
'X-Dev-Token': token,
|
|
280
|
+
},
|
|
281
|
+
body: JSON.stringify({ files }),
|
|
282
|
+
});
|
|
283
|
+
if (!response.ok) {
|
|
284
|
+
const error = await response.json().catch(() => ({ error: response.statusText }));
|
|
285
|
+
throw new Error(error.error || `Sync failed: ${response.status}`);
|
|
286
|
+
}
|
|
287
|
+
return response.json();
|
|
288
|
+
}
|
|
289
|
+
async function validateTheme(shopUrl, token) {
|
|
290
|
+
const response = await fetch(`${shopUrl}/api/theme-dev/validate/`, {
|
|
291
|
+
method: 'GET',
|
|
292
|
+
headers: {
|
|
293
|
+
'X-Dev-Token': token,
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
if (!response.ok) {
|
|
297
|
+
throw new Error(`Validation request failed: ${response.status}`);
|
|
298
|
+
}
|
|
299
|
+
return response.json();
|
|
300
|
+
}
|
|
301
|
+
async function fileExists(filePath) {
|
|
302
|
+
try {
|
|
303
|
+
await fs.access(filePath);
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spwig/theme-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Spwig Theme SDK CLI",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"files": [
|
|
12
12
|
"dist",
|
|
13
13
|
"schemas",
|
|
14
|
-
"README.md"
|
|
14
|
+
"README.md",
|
|
15
|
+
"CHANGELOG.md"
|
|
15
16
|
],
|
|
16
17
|
"scripts": {
|
|
17
18
|
"build": "tsc && chmod +x dist/cli.js && npm run copy-assets",
|
|
@@ -40,10 +41,12 @@
|
|
|
40
41
|
"@spwig/theme-validator": "^1.0.0",
|
|
41
42
|
"archiver": "^6.0.1",
|
|
42
43
|
"chalk": "^5.3.0",
|
|
44
|
+
"chokidar": "^3.5.3",
|
|
43
45
|
"commander": "^11.1.0",
|
|
44
46
|
"express": "^4.18.2",
|
|
45
47
|
"fs-extra": "^11.2.0",
|
|
46
48
|
"inquirer": "^9.2.12",
|
|
49
|
+
"open": "^9.1.0",
|
|
47
50
|
"ora": "^7.0.1"
|
|
48
51
|
},
|
|
49
52
|
"devDependencies": {
|