lhci-ai-assistant 0.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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +228 -0
  3. package/dist/ai/copilot.d.ts +40 -0
  4. package/dist/ai/copilot.d.ts.map +1 -0
  5. package/dist/ai/copilot.js +176 -0
  6. package/dist/ai/copilot.js.map +1 -0
  7. package/dist/ai/local.d.ts +11 -0
  8. package/dist/ai/local.d.ts.map +1 -0
  9. package/dist/ai/local.js +199 -0
  10. package/dist/ai/local.js.map +1 -0
  11. package/dist/ai/openai.d.ts +39 -0
  12. package/dist/ai/openai.d.ts.map +1 -0
  13. package/dist/ai/openai.js +113 -0
  14. package/dist/ai/openai.js.map +1 -0
  15. package/dist/ai/prompt.d.ts +36 -0
  16. package/dist/ai/prompt.d.ts.map +1 -0
  17. package/dist/ai/prompt.js +190 -0
  18. package/dist/ai/prompt.js.map +1 -0
  19. package/dist/analyzer.d.ts +19 -0
  20. package/dist/analyzer.d.ts.map +1 -0
  21. package/dist/analyzer.js +264 -0
  22. package/dist/analyzer.js.map +1 -0
  23. package/dist/autofix/generator.d.ts +27 -0
  24. package/dist/autofix/generator.d.ts.map +1 -0
  25. package/dist/autofix/generator.js +153 -0
  26. package/dist/autofix/generator.js.map +1 -0
  27. package/dist/autofix/patterns.d.ts +34 -0
  28. package/dist/autofix/patterns.d.ts.map +1 -0
  29. package/dist/autofix/patterns.js +247 -0
  30. package/dist/autofix/patterns.js.map +1 -0
  31. package/dist/cli.d.ts +3 -0
  32. package/dist/cli.d.ts.map +1 -0
  33. package/dist/cli.js +159 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/config.d.ts +19 -0
  36. package/dist/config.d.ts.map +1 -0
  37. package/dist/config.js +109 -0
  38. package/dist/config.js.map +1 -0
  39. package/dist/github/diff-fetcher.d.ts +43 -0
  40. package/dist/github/diff-fetcher.d.ts.map +1 -0
  41. package/dist/github/diff-fetcher.js +183 -0
  42. package/dist/github/diff-fetcher.js.map +1 -0
  43. package/dist/github/pr-commenter.d.ts +18 -0
  44. package/dist/github/pr-commenter.d.ts.map +1 -0
  45. package/dist/github/pr-commenter.js +229 -0
  46. package/dist/github/pr-commenter.js.map +1 -0
  47. package/dist/index.d.ts +23 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +85 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/metrics/comparator.d.ts +10 -0
  52. package/dist/metrics/comparator.d.ts.map +1 -0
  53. package/dist/metrics/comparator.js +228 -0
  54. package/dist/metrics/comparator.js.map +1 -0
  55. package/dist/metrics/extractor.d.ts +26 -0
  56. package/dist/metrics/extractor.d.ts.map +1 -0
  57. package/dist/metrics/extractor.js +174 -0
  58. package/dist/metrics/extractor.js.map +1 -0
  59. package/dist/metrics/loader.d.ts +35 -0
  60. package/dist/metrics/loader.d.ts.map +1 -0
  61. package/dist/metrics/loader.js +94 -0
  62. package/dist/metrics/loader.js.map +1 -0
  63. package/dist/output/json.d.ts +23 -0
  64. package/dist/output/json.d.ts.map +1 -0
  65. package/dist/output/json.js +144 -0
  66. package/dist/output/json.js.map +1 -0
  67. package/dist/output/markdown.d.ts +10 -0
  68. package/dist/output/markdown.d.ts.map +1 -0
  69. package/dist/output/markdown.js +226 -0
  70. package/dist/output/markdown.js.map +1 -0
  71. package/dist/output/terminal.d.ts +22 -0
  72. package/dist/output/terminal.d.ts.map +1 -0
  73. package/dist/output/terminal.js +238 -0
  74. package/dist/output/terminal.js.map +1 -0
  75. package/dist/types.d.ts +156 -0
  76. package/dist/types.d.ts.map +1 -0
  77. package/dist/types.js +6 -0
  78. package/dist/types.js.map +1 -0
  79. package/package.json +80 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/ai/local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * OpenAI API client for performance analysis
3
+ */
4
+ export interface OpenAIOptions {
5
+ apiKey: string;
6
+ model?: string;
7
+ maxTokens?: number;
8
+ }
9
+ export interface OpenAIMessage {
10
+ role: 'system' | 'user' | 'assistant';
11
+ content: string;
12
+ }
13
+ /**
14
+ * Analyze performance data using OpenAI
15
+ */
16
+ export declare function analyzeWithOpenAI(prompt: string, options: OpenAIOptions): Promise<string>;
17
+ /**
18
+ * Check if an OpenAI API key is valid
19
+ */
20
+ export declare function checkOpenAIAccess(apiKey: string): Promise<boolean>;
21
+ /**
22
+ * Custom error class for OpenAI API errors
23
+ */
24
+ export declare class OpenAIError extends Error {
25
+ statusCode: number;
26
+ constructor(message: string, statusCode: number);
27
+ isAuthError(): boolean;
28
+ isRateLimit(): boolean;
29
+ isQuotaExceeded(): boolean;
30
+ }
31
+ /**
32
+ * Get a helpful error message for OpenAI errors
33
+ */
34
+ export declare function getOpenAIErrorMessage(error: unknown): string;
35
+ /**
36
+ * Estimate token count for a prompt (rough approximation)
37
+ */
38
+ export declare function estimateTokens(text: string): number;
39
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/ai/openai.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC,CA2CjB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYxE;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;IAG3B,UAAU,EAAE,MAAM;gBADzB,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM;IAM3B,WAAW,IAAI,OAAO;IAItB,WAAW,IAAI,OAAO;IAItB,eAAe,IAAI,OAAO;CAG3B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAmB5D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ /**
3
+ * OpenAI API client for performance analysis
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenAIError = void 0;
7
+ exports.analyzeWithOpenAI = analyzeWithOpenAI;
8
+ exports.checkOpenAIAccess = checkOpenAIAccess;
9
+ exports.getOpenAIErrorMessage = getOpenAIErrorMessage;
10
+ exports.estimateTokens = estimateTokens;
11
+ const OPENAI_API_URL = 'https://api.openai.com/v1/chat/completions';
12
+ /**
13
+ * Analyze performance data using OpenAI
14
+ */
15
+ async function analyzeWithOpenAI(prompt, options) {
16
+ const messages = [
17
+ {
18
+ role: 'system',
19
+ content: 'You are a web performance expert specializing in Lighthouse optimization. You provide specific, actionable advice for improving Core Web Vitals and overall performance scores.',
20
+ },
21
+ {
22
+ role: 'user',
23
+ content: prompt,
24
+ },
25
+ ];
26
+ const response = await fetch(OPENAI_API_URL, {
27
+ method: 'POST',
28
+ headers: {
29
+ Authorization: `Bearer ${options.apiKey}`,
30
+ 'Content-Type': 'application/json',
31
+ },
32
+ body: JSON.stringify({
33
+ model: options.model || 'gpt-4-turbo-preview',
34
+ messages,
35
+ max_tokens: options.maxTokens || 1000,
36
+ temperature: 0.3,
37
+ }),
38
+ });
39
+ if (!response.ok) {
40
+ const error = await response.text();
41
+ throw new OpenAIError(`OpenAI API error (${response.status}): ${error}`, response.status);
42
+ }
43
+ const data = await response.json();
44
+ if (!data.choices || data.choices.length === 0) {
45
+ throw new OpenAIError('No response from OpenAI API', 500);
46
+ }
47
+ return data.choices[0]?.message?.content || 'No analysis available.';
48
+ }
49
+ /**
50
+ * Check if an OpenAI API key is valid
51
+ */
52
+ async function checkOpenAIAccess(apiKey) {
53
+ try {
54
+ const response = await fetch('https://api.openai.com/v1/models', {
55
+ headers: {
56
+ Authorization: `Bearer ${apiKey}`,
57
+ },
58
+ });
59
+ return response.ok;
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ }
65
+ /**
66
+ * Custom error class for OpenAI API errors
67
+ */
68
+ class OpenAIError extends Error {
69
+ constructor(message, statusCode) {
70
+ super(message);
71
+ this.statusCode = statusCode;
72
+ this.name = 'OpenAIError';
73
+ }
74
+ isAuthError() {
75
+ return this.statusCode === 401;
76
+ }
77
+ isRateLimit() {
78
+ return this.statusCode === 429;
79
+ }
80
+ isQuotaExceeded() {
81
+ return this.statusCode === 402;
82
+ }
83
+ }
84
+ exports.OpenAIError = OpenAIError;
85
+ /**
86
+ * Get a helpful error message for OpenAI errors
87
+ */
88
+ function getOpenAIErrorMessage(error) {
89
+ if (error instanceof OpenAIError) {
90
+ if (error.isAuthError()) {
91
+ return 'OpenAI API key is invalid. Please check your OPENAI_API_KEY environment variable.';
92
+ }
93
+ if (error.isRateLimit()) {
94
+ return 'OpenAI rate limit exceeded. Please try again later.';
95
+ }
96
+ if (error.isQuotaExceeded()) {
97
+ return 'OpenAI quota exceeded. Please check your billing settings.';
98
+ }
99
+ return error.message;
100
+ }
101
+ if (error instanceof Error) {
102
+ return error.message;
103
+ }
104
+ return 'Unknown error occurred while calling OpenAI API';
105
+ }
106
+ /**
107
+ * Estimate token count for a prompt (rough approximation)
108
+ */
109
+ function estimateTokens(text) {
110
+ // Rough estimation: ~4 characters per token on average
111
+ return Math.ceil(text.length / 4);
112
+ }
113
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/ai/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { MetricComparison, Opportunity, PRDiff } from '../types';
2
+ /**
3
+ * Generate the analysis prompt for the AI
4
+ */
5
+ export declare function generateAnalysisPrompt(data: {
6
+ regressions: MetricComparison[];
7
+ improvements: MetricComparison[];
8
+ opportunities: Opportunity[];
9
+ codeDiff?: PRDiff;
10
+ }): string;
11
+ /**
12
+ * Generate a prompt for auto-fix suggestions
13
+ */
14
+ export declare function generateAutoFixPrompt(data: {
15
+ regression: MetricComparison;
16
+ codeSnippet?: string;
17
+ opportunity?: Opportunity;
18
+ }): string;
19
+ /**
20
+ * Parse the AI response into structured recommendations
21
+ */
22
+ export declare function parseAnalysisResponse(response: string): {
23
+ rootCauses: Array<{
24
+ metric: string;
25
+ cause: string;
26
+ confidence: 'low' | 'medium' | 'high';
27
+ }>;
28
+ recommendations: Array<{
29
+ title: string;
30
+ description: string;
31
+ priority: 'low' | 'medium' | 'high';
32
+ impact: string;
33
+ effort: 'low' | 'medium' | 'high';
34
+ }>;
35
+ };
36
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/ai/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGjE;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAUT;AAwHD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,UAAU,EAAE,gBAAgB,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,GAAG,MAAM,CAwBT;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACvD,UAAU,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5F,eAAe,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;CACxJ,CAyCA"}
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateAnalysisPrompt = generateAnalysisPrompt;
4
+ exports.generateAutoFixPrompt = generateAutoFixPrompt;
5
+ exports.parseAnalysisResponse = parseAnalysisResponse;
6
+ const diff_fetcher_1 = require("../github/diff-fetcher");
7
+ /**
8
+ * Generate the analysis prompt for the AI
9
+ */
10
+ function generateAnalysisPrompt(data) {
11
+ const sections = [
12
+ getSystemContext(),
13
+ formatPerformanceChanges(data.regressions, data.improvements),
14
+ formatCodeChanges(data.codeDiff),
15
+ formatOpportunities(data.opportunities),
16
+ getTaskInstructions(),
17
+ ];
18
+ return sections.filter(Boolean).join('\n\n');
19
+ }
20
+ /**
21
+ * System context for the AI
22
+ */
23
+ function getSystemContext() {
24
+ return `You are an expert web performance engineer analyzing Lighthouse CI results.
25
+ Your goal is to identify root causes of performance regressions and provide actionable recommendations.`;
26
+ }
27
+ /**
28
+ * Format performance changes section
29
+ */
30
+ function formatPerformanceChanges(regressions, improvements) {
31
+ const lines = ['## Performance Changes'];
32
+ if (regressions.length > 0) {
33
+ lines.push('\n### Regressions:');
34
+ for (const r of regressions) {
35
+ lines.push(`- ${r.metric}: ${formatValue(r.metric, r.base)} → ${formatValue(r.metric, r.current)} (${formatDiff(r.metric, r.diff)}) [${r.severity}]`);
36
+ }
37
+ }
38
+ else {
39
+ lines.push('\n### Regressions: None detected');
40
+ }
41
+ if (improvements.length > 0) {
42
+ lines.push('\n### Improvements:');
43
+ for (const i of improvements) {
44
+ lines.push(`- ${i.metric}: ${formatValue(i.metric, i.base)} → ${formatValue(i.metric, i.current)} (${formatDiff(i.metric, i.diff)})`);
45
+ }
46
+ }
47
+ return lines.join('\n');
48
+ }
49
+ /**
50
+ * Format code changes section
51
+ */
52
+ function formatCodeChanges(diff) {
53
+ if (!diff) {
54
+ return '## Code Changes\nNo code diff available.';
55
+ }
56
+ return `## Code Changes\n${(0, diff_fetcher_1.summarizeCodeChanges)(diff)}`;
57
+ }
58
+ /**
59
+ * Format opportunities section
60
+ */
61
+ function formatOpportunities(opportunities) {
62
+ if (opportunities.length === 0) {
63
+ return '## Lighthouse Opportunities\nNo significant opportunities detected.';
64
+ }
65
+ const lines = ['## Lighthouse Opportunities'];
66
+ for (const opp of opportunities.slice(0, 5)) {
67
+ const savings = opp.savingsMs ? ` (potential ${opp.savingsMs.toFixed(0)}ms savings)` : '';
68
+ lines.push(`- ${opp.title}${savings}`);
69
+ }
70
+ if (opportunities.length > 5) {
71
+ lines.push(`- ... and ${opportunities.length - 5} more`);
72
+ }
73
+ return lines.join('\n');
74
+ }
75
+ /**
76
+ * Task instructions for the AI
77
+ */
78
+ function getTaskInstructions() {
79
+ return `## Task
80
+
81
+ Analyze the performance changes above and provide:
82
+
83
+ 1. **Root Cause Analysis**: For each regression, identify the likely cause based on the code changes and Lighthouse opportunities. Be specific about which changes might have caused the regression.
84
+
85
+ 2. **Impact Assessment**: Explain how these changes affect real users (loading time, interactivity, visual stability).
86
+
87
+ 3. **Recommendations**: Provide 3-5 specific, actionable recommendations to fix the regressions. Include:
88
+ - What to change
89
+ - Why it helps
90
+ - Expected impact
91
+
92
+ 4. **Priority**: Order recommendations by impact (highest first).
93
+
94
+ Keep your response focused and under 500 words. Use bullet points for clarity.`;
95
+ }
96
+ /**
97
+ * Format a metric value for display
98
+ */
99
+ function formatValue(metric, value) {
100
+ if (metric.includes('Score')) {
101
+ return `${(value * 100).toFixed(0)}%`;
102
+ }
103
+ if (metric === 'CLS') {
104
+ return value.toFixed(3);
105
+ }
106
+ return `${value.toFixed(0)}ms`;
107
+ }
108
+ /**
109
+ * Format a diff value for display
110
+ */
111
+ function formatDiff(metric, diff) {
112
+ const sign = diff >= 0 ? '+' : '';
113
+ if (metric.includes('Score')) {
114
+ return `${sign}${(diff * 100).toFixed(1)}%`;
115
+ }
116
+ if (metric === 'CLS') {
117
+ return `${sign}${diff.toFixed(3)}`;
118
+ }
119
+ return `${sign}${diff.toFixed(0)}ms`;
120
+ }
121
+ /**
122
+ * Generate a prompt for auto-fix suggestions
123
+ */
124
+ function generateAutoFixPrompt(data) {
125
+ return `You are a web performance expert. Generate a specific code fix for the following performance regression:
126
+
127
+ ## Regression
128
+ ${data.regression.metric}: ${formatValue(data.regression.metric, data.regression.base)} → ${formatValue(data.regression.metric, data.regression.current)}
129
+ Severity: ${data.regression.severity}
130
+
131
+ ${data.opportunity ? `## Related Opportunity\n${data.opportunity.title}\n${data.opportunity.description || ''}` : ''}
132
+
133
+ ${data.codeSnippet ? `## Relevant Code\n\`\`\`\n${data.codeSnippet}\n\`\`\`` : ''}
134
+
135
+ ## Task
136
+ Provide a specific code change to fix this regression. Format your response as:
137
+
138
+ 1. **Title**: Brief description of the fix
139
+ 2. **Explanation**: Why this fix helps
140
+ 3. **Code Change**: Show the before/after in diff format
141
+
142
+ \`\`\`diff
143
+ - old code
144
+ + new code
145
+ \`\`\`
146
+
147
+ Be specific and practical. Only suggest changes that directly address the performance issue.`;
148
+ }
149
+ /**
150
+ * Parse the AI response into structured recommendations
151
+ */
152
+ function parseAnalysisResponse(response) {
153
+ const rootCauses = [];
154
+ const recommendations = [];
155
+ // Simple parsing - look for patterns in the response
156
+ const lines = response.split('\n');
157
+ let currentSection = '';
158
+ for (const line of lines) {
159
+ const lowerLine = line.toLowerCase();
160
+ if (lowerLine.includes('root cause') || lowerLine.includes('cause')) {
161
+ currentSection = 'causes';
162
+ }
163
+ else if (lowerLine.includes('recommendation') || lowerLine.includes('suggest')) {
164
+ currentSection = 'recommendations';
165
+ }
166
+ // Parse bullet points
167
+ const bulletMatch = line.match(/^[-*•]\s*(.+)/);
168
+ if (bulletMatch) {
169
+ const content = bulletMatch[1].trim();
170
+ if (currentSection === 'causes' && content.length > 10) {
171
+ rootCauses.push({
172
+ metric: 'Performance',
173
+ cause: content,
174
+ confidence: 'medium',
175
+ });
176
+ }
177
+ else if (currentSection === 'recommendations' && content.length > 10) {
178
+ recommendations.push({
179
+ title: content.substring(0, 50) + (content.length > 50 ? '...' : ''),
180
+ description: content,
181
+ priority: recommendations.length < 2 ? 'high' : 'medium',
182
+ impact: 'Variable',
183
+ effort: 'medium',
184
+ });
185
+ }
186
+ }
187
+ }
188
+ return { rootCauses, recommendations };
189
+ }
190
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/ai/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { AnalyzeOptions, AnalysisResult } from './types';
2
+ /**
3
+ * Main analysis orchestrator
4
+ */
5
+ export declare function analyze(options: AnalyzeOptions): Promise<AnalysisResult>;
6
+ /**
7
+ * Quick analysis without AI - useful for CI/CD gates
8
+ */
9
+ export declare function quickCheck(thresholds?: {
10
+ performance?: number;
11
+ accessibility?: number;
12
+ bestPractices?: number;
13
+ seo?: number;
14
+ }): Promise<{
15
+ passed: boolean;
16
+ scores: Record<string, number>;
17
+ failures: string[];
18
+ }>;
19
+ //# sourceMappingURL=analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,cAAc,EAIf,MAAM,SAAS,CAAC;AAmBjB;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAuF9E;AA6JD;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC;IACV,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC,CAqCD"}