@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,204 @@
1
+ /**
2
+ * Validate command
3
+ * Validates theme or component packages
4
+ */
5
+ import chalk from 'chalk';
6
+ import ora from 'ora';
7
+ import path from 'path';
8
+ import fs from 'fs-extra';
9
+ import { ThemeValidator, ComponentValidator } from '@spwig/theme-validator';
10
+ export async function validateCommand(targetPath = '.', options) {
11
+ console.log(chalk.blue.bold('\n🔍 Spwig Theme SDK - Validate Package\n'));
12
+ const absolutePath = path.resolve(targetPath);
13
+ // Check if directory exists
14
+ if (!(await fs.pathExists(absolutePath))) {
15
+ console.error(chalk.red('Error:'), `Directory does not exist: ${absolutePath}`);
16
+ return 1;
17
+ }
18
+ // Auto-detect type if not specified
19
+ let type = options.type;
20
+ if (!type) {
21
+ const spinner = ora('Auto-detecting package type...').start();
22
+ type = await detectPackageType(absolutePath);
23
+ spinner.succeed(`Detected ${type} package`);
24
+ }
25
+ console.log(chalk.gray('Path:'), absolutePath);
26
+ console.log(chalk.gray('Type:'), type);
27
+ console.log();
28
+ // Run validation
29
+ const spinner = ora(`Validating ${type}...`).start();
30
+ try {
31
+ if (type === 'theme') {
32
+ return await validateTheme(absolutePath, options.verbose || false, spinner);
33
+ }
34
+ else {
35
+ return await validateComponent(absolutePath, options.verbose || false, spinner);
36
+ }
37
+ }
38
+ catch (error) {
39
+ spinner.fail('Validation failed with error');
40
+ console.error(chalk.red('\nError:'), error instanceof Error ? error.message : error);
41
+ return 1;
42
+ }
43
+ }
44
+ /**
45
+ * Auto-detect package type (theme or component)
46
+ */
47
+ async function detectPackageType(packagePath) {
48
+ const manifestPath = path.join(packagePath, 'manifest.json');
49
+ if (!(await fs.pathExists(manifestPath))) {
50
+ console.error(chalk.red('Error:'), 'No manifest.json found');
51
+ process.exit(1);
52
+ }
53
+ try {
54
+ const manifest = await fs.readJSON(manifestPath);
55
+ // Theme packages have bundled_components or page_schemas
56
+ if (manifest.bundled_components || manifest.page_schemas || manifest.design_tokens) {
57
+ return 'theme';
58
+ }
59
+ // Component packages have tier_compatibility and regions
60
+ if (manifest.tier_compatibility || manifest.regions) {
61
+ return 'component';
62
+ }
63
+ // Default to theme if unclear
64
+ return 'theme';
65
+ }
66
+ catch (error) {
67
+ console.error(chalk.red('Error:'), 'Failed to parse manifest.json');
68
+ process.exit(1);
69
+ }
70
+ }
71
+ /**
72
+ * Validate theme package
73
+ */
74
+ async function validateTheme(themePath, verbose, spinner) {
75
+ const validator = new ThemeValidator(themePath);
76
+ const result = await validator.validate();
77
+ if (result.isValid) {
78
+ spinner.succeed(chalk.green('✅ Theme validation passed!'));
79
+ }
80
+ else {
81
+ spinner.fail(chalk.red('❌ Theme validation failed'));
82
+ }
83
+ console.log();
84
+ // Show theme info
85
+ if (result.themeInfo) {
86
+ console.log(chalk.bold('Theme Information:'));
87
+ console.log(chalk.gray(' Name:'), result.themeInfo.display_name);
88
+ console.log(chalk.gray(' ID:'), result.themeInfo.name);
89
+ console.log(chalk.gray(' Version:'), result.themeInfo.version);
90
+ console.log(chalk.gray(' Author:'), result.themeInfo.author);
91
+ if (result.themeInfo.bundled_components) {
92
+ console.log(chalk.gray(' Components:'), result.themeInfo.bundled_components.length);
93
+ }
94
+ console.log();
95
+ }
96
+ // Show errors
97
+ if (result.errors.length > 0) {
98
+ console.log(chalk.red.bold(`❌ ERRORS (${result.errors.length}):`));
99
+ for (const error of result.errors) {
100
+ console.log(chalk.red(' •'), error.message);
101
+ if (verbose && error.path) {
102
+ console.log(chalk.gray(` Path: ${error.path}`));
103
+ }
104
+ }
105
+ console.log();
106
+ }
107
+ // Show warnings
108
+ if (result.warnings.length > 0) {
109
+ console.log(chalk.yellow.bold(`⚠️ WARNINGS (${result.warnings.length}):`));
110
+ for (const warning of result.warnings) {
111
+ console.log(chalk.yellow(' •'), warning.message);
112
+ if (warning.suggestion) {
113
+ console.log(chalk.gray(` 💡 ${warning.suggestion}`));
114
+ }
115
+ if (verbose && warning.path) {
116
+ console.log(chalk.gray(` Path: ${warning.path}`));
117
+ }
118
+ }
119
+ console.log();
120
+ }
121
+ // Summary
122
+ if (result.errors.length === 0 && result.warnings.length === 0) {
123
+ console.log(chalk.green('✨ No errors or warnings found!'));
124
+ console.log(chalk.gray('Your theme is ready to package.'));
125
+ return 0;
126
+ }
127
+ else if (result.errors.length === 0) {
128
+ console.log(chalk.yellow('⚠️ Validation passed with warnings'));
129
+ console.log(chalk.gray('Consider addressing warnings before packaging'));
130
+ return 0;
131
+ }
132
+ else {
133
+ console.log(chalk.red('❌ Validation failed'));
134
+ console.log(chalk.gray('Please fix errors before packaging'));
135
+ return 1;
136
+ }
137
+ }
138
+ /**
139
+ * Validate component package
140
+ */
141
+ async function validateComponent(componentPath, verbose, spinner) {
142
+ const validator = new ComponentValidator(componentPath);
143
+ const result = await validator.validate();
144
+ if (result.isValid) {
145
+ spinner.succeed(chalk.green('✅ Component validation passed!'));
146
+ }
147
+ else {
148
+ spinner.fail(chalk.red('❌ Component validation failed'));
149
+ }
150
+ console.log();
151
+ // Show component info
152
+ if (result.componentInfo) {
153
+ console.log(chalk.bold('Component Information:'));
154
+ console.log(chalk.gray(' Name:'), result.componentInfo.display_name);
155
+ console.log(chalk.gray(' ID:'), result.componentInfo.name);
156
+ console.log(chalk.gray(' Version:'), result.componentInfo.version);
157
+ console.log(chalk.gray(' Author:'), result.componentInfo.author);
158
+ console.log(chalk.gray(' Category:'), result.componentInfo.category);
159
+ console.log(chalk.gray(' Tiers:'), result.componentInfo.tier_compatibility.join(', '));
160
+ console.log();
161
+ }
162
+ // Show errors
163
+ if (result.errors.length > 0) {
164
+ console.log(chalk.red.bold(`❌ ERRORS (${result.errors.length}):`));
165
+ for (const error of result.errors) {
166
+ console.log(chalk.red(' •'), error.message);
167
+ if (verbose && error.path) {
168
+ console.log(chalk.gray(` Path: ${error.path}`));
169
+ }
170
+ }
171
+ console.log();
172
+ }
173
+ // Show warnings
174
+ if (result.warnings.length > 0) {
175
+ console.log(chalk.yellow.bold(`⚠️ WARNINGS (${result.warnings.length}):`));
176
+ for (const warning of result.warnings) {
177
+ console.log(chalk.yellow(' •'), warning.message);
178
+ if (warning.suggestion) {
179
+ console.log(chalk.gray(` 💡 ${warning.suggestion}`));
180
+ }
181
+ if (verbose && warning.path) {
182
+ console.log(chalk.gray(` Path: ${warning.path}`));
183
+ }
184
+ }
185
+ console.log();
186
+ }
187
+ // Summary
188
+ if (result.errors.length === 0 && result.warnings.length === 0) {
189
+ console.log(chalk.green('✨ No errors or warnings found!'));
190
+ console.log(chalk.gray('Your component is ready to use.'));
191
+ return 0;
192
+ }
193
+ else if (result.errors.length === 0) {
194
+ console.log(chalk.yellow('⚠️ Validation passed with warnings'));
195
+ console.log(chalk.gray('Consider addressing warnings for best practices'));
196
+ return 0;
197
+ }
198
+ else {
199
+ console.log(chalk.red('❌ Validation failed'));
200
+ console.log(chalk.gray('Please fix errors before using this component'));
201
+ return 1;
202
+ }
203
+ }
204
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Programmatic API for Spwig Theme CLI
3
+ * Allows using CLI functionality from Node.js code
4
+ */
5
+ export { initCommand } from './commands/init.js';
6
+ export { validateCommand } from './commands/validate.js';
7
+ export { packageCommand } from './commands/package.js';
8
+ export { componentCommand } from './commands/component.js';
9
+ export type { InitOptions } from './commands/init.js';
10
+ export type { ValidateOptions } from './commands/validate.js';
11
+ export type { PackageOptions } from './commands/package.js';
12
+ export type { ComponentOptions } from './commands/component.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,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;AAG3D,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Programmatic API for Spwig Theme CLI
3
+ * Allows using CLI functionality from Node.js code
4
+ */
5
+ export { initCommand } from './commands/init.js';
6
+ export { validateCommand } from './commands/validate.js';
7
+ export { packageCommand } from './commands/package.js';
8
+ export { componentCommand } from './commands/component.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,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"}
@@ -0,0 +1,221 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Component Manifest Schema",
4
+ "description": "Schema for Spwig component package manifests",
5
+ "type": "object",
6
+ "required": [
7
+ "name",
8
+ "version",
9
+ "display_name",
10
+ "description",
11
+ "author",
12
+ "tier_compatibility",
13
+ "regions"
14
+ ],
15
+ "properties": {
16
+ "name": {
17
+ "type": "string",
18
+ "pattern": "^[a-z][a-z0-9_]*$",
19
+ "minLength": 2,
20
+ "maxLength": 50,
21
+ "description": "Component identifier (lowercase, alphanumeric with underscores)"
22
+ },
23
+ "version": {
24
+ "type": "string",
25
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$",
26
+ "description": "Semantic version (e.g., 1.0.0)"
27
+ },
28
+ "display_name": {
29
+ "type": "string",
30
+ "minLength": 1,
31
+ "maxLength": 100,
32
+ "description": "Human-readable component name"
33
+ },
34
+ "description": {
35
+ "type": "string",
36
+ "minLength": 10,
37
+ "maxLength": 500,
38
+ "description": "Component description for marketplace listing"
39
+ },
40
+ "author": {
41
+ "type": "string",
42
+ "minLength": 1,
43
+ "maxLength": 100,
44
+ "description": "Component author/vendor name"
45
+ },
46
+ "tier_compatibility": {
47
+ "type": "array",
48
+ "minItems": 1,
49
+ "uniqueItems": true,
50
+ "items": {
51
+ "type": "string",
52
+ "enum": ["A", "B", "C"]
53
+ },
54
+ "description": "Security tiers this component is compatible with"
55
+ },
56
+ "regions": {
57
+ "type": "array",
58
+ "minItems": 1,
59
+ "uniqueItems": true,
60
+ "items": {
61
+ "type": "string",
62
+ "pattern": "^[a-z][a-z0-9_]*$"
63
+ },
64
+ "description": "Page regions this component can be placed in"
65
+ },
66
+ "props_schema": {
67
+ "type": "object",
68
+ "description": "JSON Schema defining component properties",
69
+ "required": ["type", "properties"],
70
+ "properties": {
71
+ "type": {
72
+ "const": "object"
73
+ },
74
+ "properties": {
75
+ "type": "object"
76
+ },
77
+ "required": {
78
+ "type": "array",
79
+ "items": {
80
+ "type": "string"
81
+ }
82
+ }
83
+ }
84
+ },
85
+ "assets": {
86
+ "type": "object",
87
+ "properties": {
88
+ "css": {
89
+ "type": "array",
90
+ "items": {
91
+ "type": "string",
92
+ "pattern": "^assets/.*\\.css$"
93
+ },
94
+ "description": "CSS files relative to component root"
95
+ },
96
+ "js": {
97
+ "type": "array",
98
+ "items": {
99
+ "type": "string",
100
+ "pattern": "^assets/.*\\.js$"
101
+ },
102
+ "description": "JavaScript files relative to component root"
103
+ },
104
+ "images": {
105
+ "type": "array",
106
+ "items": {
107
+ "type": "string",
108
+ "pattern": "^assets/.*\\.(png|jpg|jpeg|svg|gif|webp)$"
109
+ },
110
+ "description": "Image files relative to component root"
111
+ }
112
+ },
113
+ "additionalProperties": false
114
+ },
115
+ "dependencies": {
116
+ "type": "array",
117
+ "items": {
118
+ "type": "object",
119
+ "required": ["name", "min_version"],
120
+ "properties": {
121
+ "name": {
122
+ "type": "string",
123
+ "pattern": "^[a-z][a-z0-9_]*$"
124
+ },
125
+ "min_version": {
126
+ "type": "string",
127
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$"
128
+ },
129
+ "max_version": {
130
+ "type": "string",
131
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$"
132
+ }
133
+ }
134
+ },
135
+ "description": "Component dependencies on other components"
136
+ },
137
+ "locales": {
138
+ "type": "array",
139
+ "items": {
140
+ "type": "string",
141
+ "pattern": "^[a-z]{2}(_[A-Z]{2})?$"
142
+ },
143
+ "description": "Supported locale codes (e.g., en, es, fr, en_US)"
144
+ },
145
+ "preview": {
146
+ "type": "string",
147
+ "pattern": "^preview\\.(png|jpg|jpeg|webp)$",
148
+ "description": "Preview image filename (recommended: 600x800px, max 5MB)"
149
+ },
150
+ "category": {
151
+ "type": "string",
152
+ "enum": [
153
+ "hero",
154
+ "header",
155
+ "footer",
156
+ "content",
157
+ "product",
158
+ "collection",
159
+ "cart",
160
+ "checkout",
161
+ "marketing",
162
+ "social",
163
+ "navigation",
164
+ "utility"
165
+ ],
166
+ "description": "Component category for marketplace organization"
167
+ },
168
+ "tags": {
169
+ "type": "array",
170
+ "maxItems": 10,
171
+ "items": {
172
+ "type": "string",
173
+ "pattern": "^[a-z][a-z0-9-]*$",
174
+ "maxLength": 30
175
+ },
176
+ "description": "Searchable tags for marketplace"
177
+ },
178
+ "license": {
179
+ "type": "string",
180
+ "enum": ["MIT", "Apache-2.0", "GPL-3.0", "Proprietary"],
181
+ "default": "Proprietary",
182
+ "description": "Component license type"
183
+ },
184
+ "changelog": {
185
+ "type": "array",
186
+ "items": {
187
+ "type": "object",
188
+ "required": ["version", "date", "changes"],
189
+ "properties": {
190
+ "version": {
191
+ "type": "string",
192
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$"
193
+ },
194
+ "date": {
195
+ "type": "string",
196
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
197
+ },
198
+ "changes": {
199
+ "type": "array",
200
+ "minItems": 1,
201
+ "items": {
202
+ "type": "string"
203
+ }
204
+ }
205
+ }
206
+ },
207
+ "description": "Version history and changes"
208
+ },
209
+ "min_platform_version": {
210
+ "type": "string",
211
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$",
212
+ "description": "Minimum platform version required"
213
+ },
214
+ "max_platform_version": {
215
+ "type": "string",
216
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$",
217
+ "description": "Maximum platform version supported"
218
+ }
219
+ },
220
+ "additionalProperties": false
221
+ }