@spwig/theme-cli 1.0.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.
Files changed (51) hide show
  1. package/README.md +278 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +99 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/component.d.ts +13 -0
  7. package/dist/commands/component.d.ts.map +1 -0
  8. package/dist/commands/component.js +229 -0
  9. package/dist/commands/component.js.map +1 -0
  10. package/dist/commands/init.d.ts +13 -0
  11. package/dist/commands/init.d.ts.map +1 -0
  12. package/dist/commands/init.js +249 -0
  13. package/dist/commands/init.js.map +1 -0
  14. package/dist/commands/package.d.ts +12 -0
  15. package/dist/commands/package.d.ts.map +1 -0
  16. package/dist/commands/package.js +320 -0
  17. package/dist/commands/package.js.map +1 -0
  18. package/dist/commands/validate.d.ts +10 -0
  19. package/dist/commands/validate.d.ts.map +1 -0
  20. package/dist/commands/validate.js +204 -0
  21. package/dist/commands/validate.js.map +1 -0
  22. package/dist/index.d.ts +13 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +9 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/schemas/component_manifest_schema.json +221 -0
  27. package/dist/schemas/theme_manifest_schema.json +267 -0
  28. package/dist/templates/components/blank.template.html.template +4 -0
  29. package/dist/templates/components/footer.manifest.json.template +11 -0
  30. package/dist/templates/components/footer.template.html.template +36 -0
  31. package/dist/templates/components/header.manifest.json.template +11 -0
  32. package/dist/templates/components/header.schema.json.template +23 -0
  33. package/dist/templates/components/header.template.html.template +39 -0
  34. package/dist/templates/components/schema.json.template +15 -0
  35. package/dist/templates/components/section.manifest.json.template +11 -0
  36. package/dist/templates/components/section.template.html.template +13 -0
  37. package/dist/templates/components/utility.manifest.json.template +11 -0
  38. package/dist/templates/theme/README.md.template +64 -0
  39. package/dist/templates/theme/design_tokens.json.template +66 -0
  40. package/dist/templates/theme/manifest.json.template +40 -0
  41. package/dist/utils/file-system.d.ts +49 -0
  42. package/dist/utils/file-system.d.ts.map +1 -0
  43. package/dist/utils/file-system.js +115 -0
  44. package/dist/utils/file-system.js.map +1 -0
  45. package/dist/utils/validation.d.ts +40 -0
  46. package/dist/utils/validation.d.ts.map +1 -0
  47. package/dist/utils/validation.js +98 -0
  48. package/dist/utils/validation.js.map +1 -0
  49. package/package.json +62 -0
  50. package/schemas/component_manifest_schema.json +221 -0
  51. package/schemas/theme_manifest_schema.json +267 -0
@@ -0,0 +1,249 @@
1
+ import path from 'path';
2
+ import chalk from 'chalk';
3
+ import inquirer from 'inquirer';
4
+ import ora from 'ora';
5
+ import { directoryExists, ensureDirectory, writeFromTemplate, writeJSON, } from '../utils/file-system.js';
6
+ import { toKebabCase, toTitleCase, getThemeNameError, isValidEmail, } from '../utils/validation.js';
7
+ /**
8
+ * Initialize a new theme
9
+ */
10
+ export async function initCommand(themeName, options) {
11
+ console.log(chalk.blue.bold('\n🎨 Spwig Theme SDK - Create New Theme\n'));
12
+ // Get theme name
13
+ let finalThemeName = themeName;
14
+ if (!finalThemeName) {
15
+ const { name } = await inquirer.prompt([
16
+ {
17
+ type: 'input',
18
+ name: 'name',
19
+ message: 'Theme name (lowercase, hyphens):',
20
+ validate: (input) => {
21
+ const error = getThemeNameError(input);
22
+ return error || true;
23
+ },
24
+ },
25
+ ]);
26
+ finalThemeName = name;
27
+ }
28
+ else {
29
+ // Validate provided name
30
+ const error = getThemeNameError(finalThemeName);
31
+ if (error) {
32
+ throw new Error(`Invalid theme name: ${error}`);
33
+ }
34
+ }
35
+ const themeSlug = toKebabCase(finalThemeName);
36
+ const themePath = path.join(process.cwd(), themeSlug);
37
+ // Check if directory already exists
38
+ if (await directoryExists(themePath)) {
39
+ throw new Error(`Directory ${themeSlug} already exists`);
40
+ }
41
+ // Get other theme details
42
+ const answers = await inquirer.prompt([
43
+ {
44
+ type: 'input',
45
+ name: 'displayName',
46
+ message: 'Display name:',
47
+ default: toTitleCase(themeSlug),
48
+ validate: (input) => (input.length > 0 ? true : 'Display name is required'),
49
+ },
50
+ {
51
+ type: 'input',
52
+ name: 'author',
53
+ message: 'Author name:',
54
+ default: options.author,
55
+ validate: (input) => (input.length > 0 ? true : 'Author name is required'),
56
+ },
57
+ {
58
+ type: 'input',
59
+ name: 'email',
60
+ message: 'Author email:',
61
+ default: options.email,
62
+ validate: (input) => {
63
+ if (!input)
64
+ return true; // Email is optional
65
+ return isValidEmail(input) ? true : 'Invalid email address';
66
+ },
67
+ },
68
+ {
69
+ type: 'input',
70
+ name: 'description',
71
+ message: 'Description:',
72
+ default: options.description || `A modern theme for Spwig eCommerce`,
73
+ validate: (input) => input.length >= 10 ? true : 'Description must be at least 10 characters',
74
+ },
75
+ {
76
+ type: 'list',
77
+ name: 'license',
78
+ message: 'License:',
79
+ choices: ['MIT', 'Apache-2.0', 'GPL-3.0', 'Proprietary'],
80
+ default: options.license || 'MIT',
81
+ },
82
+ {
83
+ type: 'confirm',
84
+ name: 'initGit',
85
+ message: 'Initialize git repository?',
86
+ default: options.git !== false,
87
+ },
88
+ ]);
89
+ const spinner = ora('Creating theme...').start();
90
+ try {
91
+ // Create theme directory structure
92
+ await createThemeStructure(themePath, {
93
+ themeName: themeSlug,
94
+ displayName: answers.displayName,
95
+ author: answers.author,
96
+ email: answers.email,
97
+ description: answers.description,
98
+ license: answers.license,
99
+ template: options.template || 'full',
100
+ });
101
+ spinner.succeed(chalk.green('Theme created successfully!'));
102
+ // Show next steps
103
+ console.log(chalk.blue('\n📦 Next steps:\n'));
104
+ console.log(chalk.white(` cd ${themeSlug}`));
105
+ console.log(chalk.white(` spwig dev`));
106
+ console.log(chalk.dim('\n Visit http://localhost:3000 to see your theme\n'));
107
+ }
108
+ catch (error) {
109
+ spinner.fail(chalk.red('Failed to create theme'));
110
+ throw error;
111
+ }
112
+ }
113
+ /**
114
+ * Create theme directory structure
115
+ */
116
+ async function createThemeStructure(themePath, config) {
117
+ const { themeName, displayName, author, description, license, template } = config;
118
+ // Create base directories
119
+ await ensureDirectory(themePath);
120
+ // Template variables
121
+ const variables = {
122
+ themeName,
123
+ displayName,
124
+ author,
125
+ description,
126
+ license,
127
+ };
128
+ // Get templates directory
129
+ const templatesDir = path.join(__dirname, '../templates');
130
+ // Always create manifest.json
131
+ await writeFromTemplate(path.join(templatesDir, 'theme/manifest.json.template'), path.join(themePath, 'manifest.json'), variables);
132
+ // Always create README.md
133
+ await writeFromTemplate(path.join(templatesDir, 'theme/README.md.template'), path.join(themePath, 'README.md'), variables);
134
+ // Create .gitignore
135
+ const gitignoreContent = `node_modules/
136
+ dist/
137
+ *.log
138
+ .DS_Store
139
+ Thumbs.db
140
+ `;
141
+ await ensureDirectory(themePath);
142
+ const fs = await import('fs-extra');
143
+ await fs.writeFile(path.join(themePath, '.gitignore'), gitignoreContent);
144
+ if (template === 'blank') {
145
+ // Blank template - just manifest and README
146
+ return;
147
+ }
148
+ // Minimal and full templates include design tokens
149
+ await writeFromTemplate(path.join(templatesDir, 'theme/design_tokens.json.template'), path.join(themePath, 'design_tokens.json'), variables);
150
+ if (template === 'minimal') {
151
+ // Minimal template - basic structure only
152
+ await ensureDirectory(path.join(themePath, 'components'));
153
+ await ensureDirectory(path.join(themePath, 'pages'));
154
+ await ensureDirectory(path.join(themePath, 'assets'));
155
+ return;
156
+ }
157
+ // Full template - complete structure with default components
158
+ // Create components
159
+ await createDefaultComponent(themePath, 'header', 'default_header', 'Default Header', variables);
160
+ await createDefaultComponent(themePath, 'footer', 'default_footer', 'Default Footer', variables);
161
+ await createDefaultComponent(themePath, 'section', 'hero_section', 'Hero Section', variables);
162
+ // Create pages directory with basic schemas
163
+ await ensureDirectory(path.join(themePath, 'pages'));
164
+ const pagesDir = path.join(themePath, 'pages');
165
+ // Home page schema
166
+ await writeJSON(path.join(pagesDir, 'home.json'), {
167
+ page_type: 'home',
168
+ sections: [
169
+ {
170
+ type: 'hero_section',
171
+ settings: {
172
+ title: 'Welcome to Your Store',
173
+ description: 'Discover our amazing products',
174
+ },
175
+ },
176
+ ],
177
+ });
178
+ // Product page schema
179
+ await writeJSON(path.join(pagesDir, 'product.json'), {
180
+ page_type: 'product',
181
+ sections: [],
182
+ });
183
+ // Collection page schema
184
+ await writeJSON(path.join(pagesDir, 'collection.json'), {
185
+ page_type: 'collection',
186
+ sections: [],
187
+ });
188
+ // Cart page schema
189
+ await writeJSON(path.join(pagesDir, 'cart.json'), {
190
+ page_type: 'cart',
191
+ sections: [],
192
+ });
193
+ // Create assets directory
194
+ await ensureDirectory(path.join(themePath, 'assets/styles'));
195
+ await ensureDirectory(path.join(themePath, 'assets/scripts'));
196
+ await ensureDirectory(path.join(themePath, 'assets/images'));
197
+ // Create global CSS
198
+ const globalCSS = `/* Global Styles */
199
+ * {
200
+ box-sizing: border-box;
201
+ margin: 0;
202
+ padding: 0;
203
+ }
204
+
205
+ body {
206
+ font-family: var(--body-font);
207
+ font-size: var(--base-size);
208
+ color: var(--text-color);
209
+ line-height: 1.6;
210
+ }
211
+
212
+ .container {
213
+ max-width: 1280px;
214
+ margin: 0 auto;
215
+ padding: 0 1rem;
216
+ }
217
+
218
+ a {
219
+ color: var(--primary-color);
220
+ text-decoration: none;
221
+ }
222
+
223
+ a:hover {
224
+ text-decoration: underline;
225
+ }
226
+ `;
227
+ await fs.writeFile(path.join(themePath, 'assets/styles/global.css'), globalCSS);
228
+ }
229
+ /**
230
+ * Create a default component
231
+ */
232
+ async function createDefaultComponent(themePath, type, name, displayName, variables) {
233
+ const componentDir = path.join(themePath, `components/${type}s/${name}`);
234
+ await ensureDirectory(componentDir);
235
+ const templatesDir = path.join(__dirname, '../templates/components');
236
+ const componentVars = {
237
+ ...variables,
238
+ componentName: name,
239
+ displayName: displayName,
240
+ description: `${displayName} component`,
241
+ };
242
+ // Manifest
243
+ await writeFromTemplate(path.join(templatesDir, `${type}.manifest.json.template`), path.join(componentDir, 'manifest.json'), componentVars);
244
+ // Template
245
+ await writeFromTemplate(path.join(templatesDir, `${type}.template.html.template`), path.join(componentDir, 'template.html'), componentVars);
246
+ // Schema
247
+ await writeFromTemplate(path.join(templatesDir, `${type}.schema.json.template`), path.join(componentDir, 'schema.json'), componentVars);
248
+ }
249
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Package command
3
+ * Creates distributable ZIP packages from themes
4
+ */
5
+ export interface PackageOptions {
6
+ output?: string;
7
+ name?: string;
8
+ validate?: boolean;
9
+ checksum?: 'sha256' | 'md5';
10
+ }
11
+ export declare function packageCommand(themePath: string, options: PackageOptions): Promise<void>;
12
+ //# sourceMappingURL=package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../src/commands/package.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;CAC7B;AAqBD,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA+E9F"}
@@ -0,0 +1,320 @@
1
+ /**
2
+ * Package command
3
+ * Creates distributable ZIP packages from themes
4
+ */
5
+ import chalk from 'chalk';
6
+ import ora from 'ora';
7
+ import path from 'path';
8
+ import fs from 'fs-extra';
9
+ import archiver from 'archiver';
10
+ import crypto from 'crypto';
11
+ import { ThemeValidator } from '@spwig/theme-validator';
12
+ export async function packageCommand(themePath, options) {
13
+ console.log(chalk.blue.bold('\n📦 Spwig Theme SDK - Package Theme\n'));
14
+ const absolutePath = path.resolve(themePath);
15
+ // Check if directory exists
16
+ if (!(await fs.pathExists(absolutePath))) {
17
+ console.error(chalk.red('Error:'), `Directory does not exist: ${absolutePath}`);
18
+ process.exit(1);
19
+ }
20
+ // Load manifest
21
+ const manifestPath = path.join(absolutePath, 'manifest.json');
22
+ if (!(await fs.pathExists(manifestPath))) {
23
+ console.error(chalk.red('Error:'), 'No manifest.json found in theme directory');
24
+ process.exit(1);
25
+ }
26
+ let manifest;
27
+ try {
28
+ manifest = await fs.readJSON(manifestPath);
29
+ }
30
+ catch (error) {
31
+ console.error(chalk.red('Error:'), 'Failed to parse manifest.json');
32
+ process.exit(1);
33
+ }
34
+ console.log(chalk.bold('Theme:'), manifest.display_name);
35
+ console.log(chalk.gray('Version:'), manifest.version);
36
+ console.log();
37
+ // Validate theme first (unless --no-validate)
38
+ if (options.validate !== false) {
39
+ const validateSpinner = ora('Validating theme...').start();
40
+ const validator = new ThemeValidator(absolutePath);
41
+ const result = await validator.validate();
42
+ if (!result.isValid) {
43
+ validateSpinner.fail(chalk.red('Validation failed'));
44
+ console.log();
45
+ console.log(chalk.red.bold(`❌ ERRORS (${result.errors.length}):`));
46
+ for (const error of result.errors) {
47
+ console.log(chalk.red(' •'), error.message);
48
+ }
49
+ console.log();
50
+ console.error(chalk.red('Cannot package theme with validation errors'));
51
+ process.exit(1);
52
+ }
53
+ validateSpinner.succeed('Theme validation passed');
54
+ }
55
+ // Determine output path
56
+ const outputDir = options.output ? path.resolve(options.output) : path.join(absolutePath, 'dist');
57
+ await fs.ensureDir(outputDir);
58
+ const packageName = options.name || `${manifest.name}-${manifest.version}.zip`;
59
+ const outputPath = path.join(outputDir, packageName);
60
+ // Create package
61
+ const spinner = ora('Creating package...').start();
62
+ try {
63
+ const packageInfo = await createPackage(absolutePath, outputPath, manifest);
64
+ spinner.succeed('Package created successfully');
65
+ console.log();
66
+ console.log(chalk.green.bold('✨ Package Summary:'));
67
+ console.log(chalk.gray(' Package:'), packageInfo.package_file);
68
+ console.log(chalk.gray(' Size:'), formatBytes(packageInfo.package_size));
69
+ console.log(chalk.gray(' Files:'), packageInfo.file_count);
70
+ console.log(chalk.gray(' Checksum:'), packageInfo.checksum_file);
71
+ console.log(chalk.gray(' Components:'), packageInfo.bundled_components);
72
+ console.log();
73
+ console.log(chalk.green('✅ Theme package ready for distribution!'));
74
+ }
75
+ catch (error) {
76
+ spinner.fail('Packaging failed');
77
+ console.error(chalk.red('\nError:'), error instanceof Error ? error.message : error);
78
+ process.exit(1);
79
+ }
80
+ }
81
+ /**
82
+ * Create ZIP package from theme directory
83
+ */
84
+ async function createPackage(themePath, outputPath, manifest) {
85
+ // Create temporary build directory
86
+ const buildDir = path.join(path.dirname(outputPath), `build_${manifest.name}_${Date.now()}`);
87
+ await fs.ensureDir(buildDir);
88
+ try {
89
+ // Copy theme to build directory
90
+ await copyToBuildDir(themePath, buildDir);
91
+ // Clean build directory
92
+ await cleanBuildDir(buildDir);
93
+ // Calculate metadata
94
+ const metadata = await calculateMetadata(buildDir);
95
+ // Update manifest with metadata
96
+ await updateManifestWithMetadata(buildDir, metadata);
97
+ // Create ZIP
98
+ await createZip(buildDir, outputPath);
99
+ // Calculate package checksum
100
+ const packageChecksum = await calculateFileChecksum(outputPath);
101
+ // Create checksum file
102
+ const checksumPath = `${outputPath}.sha256`;
103
+ await fs.writeFile(checksumPath, `${packageChecksum} ${path.basename(outputPath)}\n`);
104
+ // Return package info
105
+ return {
106
+ theme_name: manifest.name,
107
+ version: manifest.version,
108
+ package_file: outputPath,
109
+ checksum_file: checksumPath,
110
+ package_size: (await fs.stat(outputPath)).size,
111
+ package_checksum: packageChecksum,
112
+ content_checksum: metadata.checksum,
113
+ file_count: metadata.file_count,
114
+ total_size: metadata.total_size,
115
+ bundled_components: manifest.bundled_components?.length || 0,
116
+ };
117
+ }
118
+ finally {
119
+ // Cleanup build directory
120
+ if (await fs.pathExists(buildDir)) {
121
+ await fs.remove(buildDir);
122
+ }
123
+ }
124
+ }
125
+ /**
126
+ * Copy theme directory to build directory
127
+ */
128
+ async function copyToBuildDir(themePath, buildDir) {
129
+ const ignorePatterns = [
130
+ '__pycache__',
131
+ '*.pyc',
132
+ '.DS_Store',
133
+ '.git',
134
+ '.gitignore',
135
+ 'node_modules',
136
+ '.env',
137
+ '*.log',
138
+ 'dist',
139
+ 'build',
140
+ '.vscode',
141
+ '.idea',
142
+ ];
143
+ await fs.copy(themePath, buildDir, {
144
+ filter: (src) => {
145
+ const basename = path.basename(src);
146
+ return !ignorePatterns.some((pattern) => {
147
+ if (pattern.startsWith('*')) {
148
+ return basename.endsWith(pattern.substring(1));
149
+ }
150
+ return basename === pattern;
151
+ });
152
+ },
153
+ });
154
+ }
155
+ /**
156
+ * Clean build directory of unwanted files
157
+ */
158
+ async function cleanBuildDir(buildDir) {
159
+ // Remove Python cache files
160
+ const pycFiles = await findFiles(buildDir, '**/*.pyc');
161
+ for (const file of pycFiles) {
162
+ await fs.remove(file);
163
+ }
164
+ // Remove __pycache__ directories
165
+ const pycacheDirs = await findDirectories(buildDir, '**/__pycache__');
166
+ for (const dir of pycacheDirs) {
167
+ await fs.remove(dir);
168
+ }
169
+ // Remove .DS_Store files (macOS)
170
+ const dsFiles = await findFiles(buildDir, '**/.DS_Store');
171
+ for (const file of dsFiles) {
172
+ await fs.remove(file);
173
+ }
174
+ }
175
+ /**
176
+ * Calculate package metadata (file count, size, checksum)
177
+ */
178
+ async function calculateMetadata(buildDir) {
179
+ let fileCount = 0;
180
+ let totalSize = 0;
181
+ const fileHashes = [];
182
+ const files = await getAllFiles(buildDir);
183
+ for (const file of files) {
184
+ const stats = await fs.stat(file);
185
+ fileCount++;
186
+ totalSize += stats.size;
187
+ // Don't include manifest.json in checksum (will be updated)
188
+ if (path.basename(file) !== 'manifest.json') {
189
+ const hash = await calculateFileChecksum(file);
190
+ fileHashes.push(hash);
191
+ }
192
+ }
193
+ // Calculate overall checksum from sorted file hashes
194
+ const combinedHash = crypto.createHash('sha256');
195
+ for (const hash of fileHashes.sort()) {
196
+ combinedHash.update(hash);
197
+ }
198
+ return {
199
+ file_count: fileCount,
200
+ total_size: totalSize,
201
+ checksum: `sha256:${combinedHash.digest('hex')}`,
202
+ };
203
+ }
204
+ /**
205
+ * Update manifest.json with package metadata
206
+ */
207
+ async function updateManifestWithMetadata(buildDir, metadata) {
208
+ const manifestPath = path.join(buildDir, 'manifest.json');
209
+ const manifest = await fs.readJSON(manifestPath);
210
+ manifest.total_size_bytes = metadata.total_size;
211
+ manifest.file_count = metadata.file_count;
212
+ manifest.checksum = metadata.checksum;
213
+ await fs.writeJSON(manifestPath, manifest, { spaces: 2 });
214
+ }
215
+ /**
216
+ * Create ZIP package
217
+ */
218
+ async function createZip(buildDir, outputPath) {
219
+ return new Promise((resolve, reject) => {
220
+ const output = fs.createWriteStream(outputPath);
221
+ const archive = archiver('zip', {
222
+ zlib: { level: 9 }, // Maximum compression
223
+ });
224
+ output.on('close', () => resolve());
225
+ archive.on('error', (err) => reject(err));
226
+ archive.pipe(output);
227
+ // Add all files to ZIP (at root level, not in subdirectory)
228
+ archive.directory(buildDir, false);
229
+ archive.finalize();
230
+ });
231
+ }
232
+ /**
233
+ * Calculate SHA256 checksum of a file
234
+ */
235
+ async function calculateFileChecksum(filePath) {
236
+ return new Promise((resolve, reject) => {
237
+ const hash = crypto.createHash('sha256');
238
+ const stream = fs.createReadStream(filePath);
239
+ stream.on('data', (data) => hash.update(data));
240
+ stream.on('end', () => resolve(hash.digest('hex')));
241
+ stream.on('error', reject);
242
+ });
243
+ }
244
+ /**
245
+ * Get all files recursively
246
+ */
247
+ async function getAllFiles(dir) {
248
+ const files = [];
249
+ async function walk(currentPath) {
250
+ const entries = await fs.readdir(currentPath, { withFileTypes: true });
251
+ for (const entry of entries) {
252
+ const fullPath = path.join(currentPath, entry.name);
253
+ if (entry.isDirectory()) {
254
+ await walk(fullPath);
255
+ }
256
+ else if (entry.isFile()) {
257
+ files.push(fullPath);
258
+ }
259
+ }
260
+ }
261
+ await walk(dir);
262
+ return files;
263
+ }
264
+ /**
265
+ * Find files matching pattern
266
+ */
267
+ async function findFiles(dir, pattern) {
268
+ // Simple implementation - would use glob in production
269
+ const files = [];
270
+ const extension = pattern.includes('*') ? pattern.split('*')[1] : null;
271
+ async function walk(currentPath) {
272
+ const entries = await fs.readdir(currentPath, { withFileTypes: true });
273
+ for (const entry of entries) {
274
+ const fullPath = path.join(currentPath, entry.name);
275
+ if (entry.isDirectory()) {
276
+ await walk(fullPath);
277
+ }
278
+ else if (entry.isFile()) {
279
+ if (!extension || fullPath.endsWith(extension)) {
280
+ files.push(fullPath);
281
+ }
282
+ }
283
+ }
284
+ }
285
+ await walk(dir);
286
+ return files;
287
+ }
288
+ /**
289
+ * Find directories matching pattern
290
+ */
291
+ async function findDirectories(dir, pattern) {
292
+ const dirs = [];
293
+ const targetName = pattern.includes('**') ? pattern.split('/').pop() : pattern;
294
+ async function walk(currentPath) {
295
+ const entries = await fs.readdir(currentPath, { withFileTypes: true });
296
+ for (const entry of entries) {
297
+ const fullPath = path.join(currentPath, entry.name);
298
+ if (entry.isDirectory()) {
299
+ if (entry.name === targetName) {
300
+ dirs.push(fullPath);
301
+ }
302
+ await walk(fullPath);
303
+ }
304
+ }
305
+ }
306
+ await walk(dir);
307
+ return dirs;
308
+ }
309
+ /**
310
+ * Format bytes to human-readable string
311
+ */
312
+ function formatBytes(bytes) {
313
+ if (bytes === 0)
314
+ return '0 Bytes';
315
+ const k = 1024;
316
+ const sizes = ['Bytes', 'KB', 'MB', 'GB'];
317
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
318
+ return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];
319
+ }
320
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/commands/package.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Validate command
3
+ * Validates theme or component packages
4
+ */
5
+ export interface ValidateOptions {
6
+ type?: 'theme' | 'component';
7
+ verbose?: boolean;
8
+ }
9
+ export declare function validateCommand(targetPath: string | undefined, options: ValidateOptions): Promise<number>;
10
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,YAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAqCzG"}