@spwig/theme-validator 1.0.0 → 2.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 (36) hide show
  1. package/README.md +0 -0
  2. package/dist/index.d.ts +1 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +0 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/schemas/theme_manifest_schema.json +7 -65
  7. package/dist/types/manifest.d.ts +50 -82
  8. package/dist/types/manifest.d.ts.map +1 -1
  9. package/dist/types/manifest.js +1 -1
  10. package/dist/types/manifest.js.map +0 -0
  11. package/dist/types/validation-result.d.ts +0 -0
  12. package/dist/types/validation-result.d.ts.map +0 -0
  13. package/dist/types/validation-result.js +0 -0
  14. package/dist/types/validation-result.js.map +0 -0
  15. package/dist/validators/design-tokens-validator.d.ts +16 -0
  16. package/dist/validators/design-tokens-validator.d.ts.map +1 -1
  17. package/dist/validators/design-tokens-validator.js +208 -0
  18. package/dist/validators/design-tokens-validator.js.map +1 -1
  19. package/dist/validators/manifest-validator.d.ts +0 -0
  20. package/dist/validators/manifest-validator.d.ts.map +0 -0
  21. package/dist/validators/manifest-validator.js +0 -0
  22. package/dist/validators/manifest-validator.js.map +0 -0
  23. package/dist/validators/theme-validator.d.ts +11 -7
  24. package/dist/validators/theme-validator.d.ts.map +1 -1
  25. package/dist/validators/theme-validator.js +110 -84
  26. package/dist/validators/theme-validator.js.map +1 -1
  27. package/package.json +1 -1
  28. package/dist/schemas/component_manifest_schema.json +0 -221
  29. package/dist/validators/component-validator.d.ts +0 -50
  30. package/dist/validators/component-validator.d.ts.map +0 -1
  31. package/dist/validators/component-validator.js +0 -235
  32. package/dist/validators/component-validator.js.map +0 -1
  33. package/dist/validators/template-validator.d.ts +0 -34
  34. package/dist/validators/template-validator.d.ts.map +0 -1
  35. package/dist/validators/template-validator.js +0 -170
  36. package/dist/validators/template-validator.js.map +0 -1
@@ -1,170 +0,0 @@
1
- /**
2
- * Template Validator
3
- * Validates Django/Jinja2 template files
4
- */
5
- import fs from 'fs-extra';
6
- import { createError, createWarning, } from '../types/validation-result.js';
7
- export class TemplateValidator {
8
- errors = [];
9
- warnings = [];
10
- /**
11
- * Validate a template file
12
- */
13
- async validate(templatePath) {
14
- this.errors = [];
15
- this.warnings = [];
16
- // Check file exists
17
- if (!(await this.fileExists(templatePath))) {
18
- this.errors.push(createError('file_not_found', `Template file does not exist: ${templatePath}`));
19
- return this.buildResult();
20
- }
21
- // Check file is not empty
22
- const content = await this.readTemplate(templatePath);
23
- if (!content) {
24
- return this.buildResult();
25
- }
26
- // Basic template syntax checks
27
- this.checkTemplateSyntax(content, templatePath);
28
- // Check for common issues
29
- this.checkCommonIssues(content, templatePath);
30
- return this.buildResult();
31
- }
32
- /**
33
- * Check file exists
34
- */
35
- async fileExists(filePath) {
36
- try {
37
- const stats = await fs.stat(filePath);
38
- return stats.isFile();
39
- }
40
- catch {
41
- return false;
42
- }
43
- }
44
- /**
45
- * Read template content
46
- */
47
- async readTemplate(templatePath) {
48
- try {
49
- const content = await fs.readFile(templatePath, 'utf-8');
50
- if (content.trim().length === 0) {
51
- this.errors.push(createError('empty_template', 'Template file is empty', {
52
- path: templatePath,
53
- }));
54
- return null;
55
- }
56
- return content;
57
- }
58
- catch (error) {
59
- if (error instanceof Error) {
60
- this.errors.push(createError('read_error', `Failed to read template: ${error.message}`, {
61
- path: templatePath,
62
- }));
63
- }
64
- return null;
65
- }
66
- }
67
- /**
68
- * Check basic template syntax
69
- */
70
- checkTemplateSyntax(content, templatePath) {
71
- const lines = content.split('\n');
72
- // Check for unclosed tags
73
- let blockStack = [];
74
- const blockTags = ['if', 'for', 'block', 'with', 'autoescape', 'spaceless', 'verbatim'];
75
- lines.forEach((line, index) => {
76
- const lineNumber = index + 1;
77
- // Find opening tags
78
- const openMatches = line.matchAll(/{%\s*(\w+)/g);
79
- for (const match of openMatches) {
80
- const tag = match[1];
81
- if (blockTags.includes(tag)) {
82
- blockStack.push({ tag, line: lineNumber });
83
- }
84
- }
85
- // Find closing tags
86
- const closeMatches = line.matchAll(/{%\s*end(\w+)/g);
87
- for (const match of closeMatches) {
88
- const tag = match[1];
89
- if (blockStack.length === 0) {
90
- this.errors.push(createError('template_syntax', `Unexpected closing tag: {% end${tag} %}`, {
91
- path: templatePath,
92
- line: lineNumber,
93
- }));
94
- }
95
- else {
96
- const lastBlock = blockStack.pop();
97
- if (lastBlock && lastBlock.tag !== tag) {
98
- this.errors.push(createError('template_syntax', `Mismatched closing tag: expected {% end${lastBlock.tag} %}, found {% end${tag} %}`, {
99
- path: templatePath,
100
- line: lineNumber,
101
- }));
102
- }
103
- }
104
- }
105
- });
106
- // Check for unclosed blocks
107
- if (blockStack.length > 0) {
108
- for (const block of blockStack) {
109
- this.errors.push(createError('template_syntax', `Unclosed block: {% ${block.tag} %}`, {
110
- path: templatePath,
111
- line: block.line,
112
- }));
113
- }
114
- }
115
- // Check for basic variable syntax errors
116
- const variablePattern = /{{\s*[\w._[\]]+\s*}}/g;
117
- const invalidVariables = content.match(/{{[^}]*$/gm);
118
- if (invalidVariables) {
119
- this.errors.push(createError('template_syntax', 'Unclosed variable tag: {{', {
120
- path: templatePath,
121
- }));
122
- }
123
- }
124
- /**
125
- * Check for common template issues
126
- */
127
- checkCommonIssues(content, templatePath) {
128
- // Warn about hardcoded URLs
129
- if (content.includes('http://') || content.includes('https://')) {
130
- const httpMatches = content.match(/https?:\/\/[^\s"'<>]+/g);
131
- if (httpMatches && httpMatches.length > 0) {
132
- this.warnings.push(createWarning('hardcoded_url', `Found ${httpMatches.length} hardcoded URL(s) in template`, {
133
- path: templatePath,
134
- suggestion: 'Use relative URLs or Django template tags like {% url %}',
135
- }));
136
- }
137
- }
138
- // Warn about inline styles (should use design tokens)
139
- const inlineStyleCount = (content.match(/style\s*=/gi) || []).length;
140
- if (inlineStyleCount > 3) {
141
- this.warnings.push(createWarning('inline_styles', `Found ${inlineStyleCount} inline style attributes`, {
142
- path: templatePath,
143
- suggestion: 'Consider using CSS classes and design tokens instead',
144
- }));
145
- }
146
- // Check for missing alt attributes on images
147
- const imgTags = content.match(/<img[^>]+>/gi);
148
- if (imgTags) {
149
- for (const imgTag of imgTags) {
150
- if (!imgTag.includes('alt=')) {
151
- this.warnings.push(createWarning('accessibility', 'Image tag missing alt attribute', {
152
- path: templatePath,
153
- suggestion: 'Add alt attribute for accessibility',
154
- }));
155
- }
156
- }
157
- }
158
- }
159
- /**
160
- * Build validation result
161
- */
162
- buildResult() {
163
- return {
164
- isValid: this.errors.length === 0,
165
- errors: this.errors,
166
- warnings: this.warnings,
167
- };
168
- }
169
- }
170
- //# sourceMappingURL=template-validator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"template-validator.js","sourceRoot":"","sources":["../../src/validators/template-validator.ts"],"names":[],"mappings":"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"}