@jterrats/smart-deployment 1.0.3 → 1.0.4
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/LICENSE +29 -0
- package/README.md +6 -0
- package/lib/ai/wave-validation-service.d.ts +21 -0
- package/lib/ai/wave-validation-service.js +189 -114
- package/lib/ai/wave-validation-service.js.map +1 -1
- package/lib/analysis/analysis-reporter.d.ts +12 -0
- package/lib/analysis/analysis-reporter.js +61 -0
- package/lib/analysis/analysis-reporter.js.map +1 -1
- package/lib/analysis/analyze-artifact-service.d.ts +25 -0
- package/lib/analysis/analyze-artifact-service.js +50 -0
- package/lib/analysis/analyze-artifact-service.js.map +1 -0
- package/lib/analysis/analyze-context-service.d.ts +25 -0
- package/lib/analysis/analyze-context-service.js +28 -0
- package/lib/analysis/analyze-context-service.js.map +1 -0
- package/lib/analysis/project-analysis-service.d.ts +48 -0
- package/lib/analysis/project-analysis-service.js +134 -0
- package/lib/analysis/project-analysis-service.js.map +1 -0
- package/lib/commands/analyze.d.ts +0 -2
- package/lib/commands/analyze.js +31 -162
- package/lib/commands/analyze.js.map +1 -1
- package/lib/commands/config.d.ts +0 -4
- package/lib/commands/config.js +25 -95
- package/lib/commands/config.js.map +1 -1
- package/lib/commands/resume.js +6 -16
- package/lib/commands/resume.js.map +1 -1
- package/lib/commands/start.d.ts +0 -11
- package/lib/commands/start.js +38 -550
- package/lib/commands/start.js.map +1 -1
- package/lib/commands/status.js +36 -12
- package/lib/commands/status.js.map +1 -1
- package/lib/commands/validate.d.ts +3 -0
- package/lib/commands/validate.js +5 -7
- package/lib/commands/validate.js.map +1 -1
- package/lib/config/config-mutation-service.d.ts +21 -0
- package/lib/config/config-mutation-service.js +61 -0
- package/lib/config/config-mutation-service.js.map +1 -0
- package/lib/dependencies/circular-dependency-detector.d.ts +5 -0
- package/lib/dependencies/circular-dependency-detector.js +67 -72
- package/lib/dependencies/circular-dependency-detector.js.map +1 -1
- package/lib/dependencies/dependency-depth-calculator.d.ts +28 -0
- package/lib/dependencies/dependency-depth-calculator.js +86 -39
- package/lib/dependencies/dependency-depth-calculator.js.map +1 -1
- package/lib/dependencies/dependency-graph-builder.d.ts +45 -13
- package/lib/dependencies/dependency-graph-builder.js +228 -123
- package/lib/dependencies/dependency-graph-builder.js.map +1 -1
- package/lib/dependencies/dependency-impact-analyzer.d.ts +13 -0
- package/lib/dependencies/dependency-impact-analyzer.js +146 -102
- package/lib/dependencies/dependency-impact-analyzer.js.map +1 -1
- package/lib/dependencies/dependency-merger.d.ts +10 -0
- package/lib/dependencies/dependency-merger.js +123 -61
- package/lib/dependencies/dependency-merger.js.map +1 -1
- package/lib/dependencies/dependency-resolver.d.ts +34 -9
- package/lib/dependencies/dependency-resolver.js +181 -112
- package/lib/dependencies/dependency-resolver.js.map +1 -1
- package/lib/dependencies/dependency-semantics.d.ts +20 -0
- package/lib/dependencies/dependency-semantics.js +55 -0
- package/lib/dependencies/dependency-semantics.js.map +1 -0
- package/lib/dependencies/graph-visualizer.d.ts +6 -1
- package/lib/dependencies/graph-visualizer.js +38 -4
- package/lib/dependencies/graph-visualizer.js.map +1 -1
- package/lib/dependencies/heuristic-inference.d.ts +2 -53
- package/lib/dependencies/heuristic-inference.js +8 -317
- package/lib/dependencies/heuristic-inference.js.map +1 -1
- package/lib/dependencies/heuristic-patterns.d.ts +14 -0
- package/lib/dependencies/heuristic-patterns.js +247 -0
- package/lib/dependencies/heuristic-patterns.js.map +1 -0
- package/lib/deployment/cycle-remediation-runner.d.ts +36 -0
- package/lib/deployment/cycle-remediation-runner.js +262 -0
- package/lib/deployment/cycle-remediation-runner.js.map +1 -0
- package/lib/deployment/deployment-context-service.d.ts +24 -0
- package/lib/deployment/deployment-context-service.js +17 -0
- package/lib/deployment/deployment-context-service.js.map +1 -0
- package/lib/deployment/deployment-runner.d.ts +37 -0
- package/lib/deployment/deployment-runner.js +94 -0
- package/lib/deployment/deployment-runner.js.map +1 -0
- package/lib/deployment/deployment-status-service.d.ts +5 -0
- package/lib/deployment/deployment-status-service.js +39 -18
- package/lib/deployment/deployment-status-service.js.map +1 -1
- package/lib/deployment/deployment-validation-service.d.ts +5 -2
- package/lib/deployment/deployment-validation-service.js +48 -45
- package/lib/deployment/deployment-validation-service.js.map +1 -1
- package/lib/deployment/resume-deployment-service.d.ts +14 -0
- package/lib/deployment/resume-deployment-service.js +25 -0
- package/lib/deployment/resume-deployment-service.js.map +1 -0
- package/lib/deployment/start-execution-service.d.ts +44 -0
- package/lib/deployment/start-execution-service.js +94 -0
- package/lib/deployment/start-execution-service.js.map +1 -0
- package/lib/deployment/test-executor.d.ts +60 -1
- package/lib/deployment/test-executor.js +180 -12
- package/lib/deployment/test-executor.js.map +1 -1
- package/lib/deployment/test-plan-service.d.ts +8 -0
- package/lib/deployment/test-plan-service.js +26 -0
- package/lib/deployment/test-plan-service.js.map +1 -0
- package/lib/deployment/wave-manifest-service.d.ts +11 -0
- package/lib/deployment/wave-manifest-service.js +41 -0
- package/lib/deployment/wave-manifest-service.js.map +1 -0
- package/lib/parsers/apex-class-parser.js +180 -98
- package/lib/parsers/apex-class-parser.js.map +1 -1
- package/lib/parsers/apex-trigger-parser.js +56 -7
- package/lib/parsers/apex-trigger-parser.js.map +1 -1
- package/lib/parsers/aura-parser.js +2 -2
- package/lib/parsers/aura-parser.js.map +1 -1
- package/lib/parsers/bot-parser.js +31 -4
- package/lib/parsers/bot-parser.js.map +1 -1
- package/lib/parsers/custom-metadata-parser.js +37 -3
- package/lib/parsers/custom-metadata-parser.js.map +1 -1
- package/lib/parsers/custom-object-parser.js +284 -150
- package/lib/parsers/custom-object-parser.js.map +1 -1
- package/lib/parsers/email-template-parser.js +115 -58
- package/lib/parsers/email-template-parser.js.map +1 -1
- package/lib/parsers/flexipage-parser.js +41 -16
- package/lib/parsers/flexipage-parser.js.map +1 -1
- package/lib/parsers/flow-parser.js +73 -63
- package/lib/parsers/flow-parser.js.map +1 -1
- package/lib/parsers/genai-prompt-parser.js +16 -4
- package/lib/parsers/genai-prompt-parser.js.map +1 -1
- package/lib/parsers/layout-parser.d.ts +11 -0
- package/lib/parsers/layout-parser.js +143 -68
- package/lib/parsers/layout-parser.js.map +1 -1
- package/lib/parsers/lwc-parser.d.ts +0 -9
- package/lib/parsers/lwc-parser.js +245 -100
- package/lib/parsers/lwc-parser.js.map +1 -1
- package/lib/parsers/parser-utils.d.ts +3 -0
- package/lib/parsers/parser-utils.js +16 -0
- package/lib/parsers/parser-utils.js.map +1 -0
- package/lib/parsers/permission-set-parser.d.ts +6 -0
- package/lib/parsers/permission-set-parser.js +31 -40
- package/lib/parsers/permission-set-parser.js.map +1 -1
- package/lib/parsers/profile-parser.d.ts +13 -0
- package/lib/parsers/profile-parser.js +39 -34
- package/lib/parsers/profile-parser.js.map +1 -1
- package/lib/parsers/visualforce-parser.js +2 -1
- package/lib/parsers/visualforce-parser.js.map +1 -1
- package/lib/presentation/analyze-command-presenter.d.ts +10 -0
- package/lib/presentation/analyze-command-presenter.js +30 -0
- package/lib/presentation/analyze-command-presenter.js.map +1 -0
- package/lib/presentation/config-command-presenter.d.ts +15 -0
- package/lib/presentation/config-command-presenter.js +50 -0
- package/lib/presentation/config-command-presenter.js.map +1 -0
- package/lib/presentation/project-analysis-presenter.d.ts +9 -0
- package/lib/presentation/project-analysis-presenter.js +9 -0
- package/lib/presentation/project-analysis-presenter.js.map +1 -0
- package/lib/presentation/resume-command-presenter.d.ts +7 -0
- package/lib/presentation/resume-command-presenter.js +12 -0
- package/lib/presentation/resume-command-presenter.js.map +1 -0
- package/lib/presentation/start-command-presenter.d.ts +15 -0
- package/lib/presentation/start-command-presenter.js +29 -0
- package/lib/presentation/start-command-presenter.js.map +1 -0
- package/lib/presentation/status-command-presenter.d.ts +7 -0
- package/lib/presentation/status-command-presenter.js +16 -0
- package/lib/presentation/status-command-presenter.js.map +1 -0
- package/lib/presentation/validate-command-presenter.d.ts +9 -0
- package/lib/presentation/validate-command-presenter.js +50 -0
- package/lib/presentation/validate-command-presenter.js.map +1 -0
- package/lib/services/metadata-scanner-service.d.ts +8 -12
- package/lib/services/metadata-scanner-service.js +55 -533
- package/lib/services/metadata-scanner-service.js.map +1 -1
- package/lib/services/scanners/automation-ai-metadata-scanner.d.ts +4 -0
- package/lib/services/scanners/automation-ai-metadata-scanner.js +61 -0
- package/lib/services/scanners/automation-ai-metadata-scanner.js.map +1 -0
- package/lib/services/scanners/code-metadata-scanner.d.ts +23 -0
- package/lib/services/scanners/code-metadata-scanner.js +149 -0
- package/lib/services/scanners/code-metadata-scanner.js.map +1 -0
- package/lib/services/scanners/data-metadata-scanner.d.ts +3 -0
- package/lib/services/scanners/data-metadata-scanner.js +82 -0
- package/lib/services/scanners/data-metadata-scanner.js.map +1 -0
- package/lib/services/scanners/experience-metadata-scanner.d.ts +5 -0
- package/lib/services/scanners/experience-metadata-scanner.js +123 -0
- package/lib/services/scanners/experience-metadata-scanner.js.map +1 -0
- package/lib/services/scanners/scanner-runtime.d.ts +11 -0
- package/lib/services/scanners/scanner-runtime.js +115 -0
- package/lib/services/scanners/scanner-runtime.js.map +1 -0
- package/lib/services/scanners/security-metadata-scanner.d.ts +3 -0
- package/lib/services/scanners/security-metadata-scanner.js +71 -0
- package/lib/services/scanners/security-metadata-scanner.js.map +1 -0
- package/lib/types/dependency.d.ts +11 -1
- package/lib/types/metadata.d.ts +17 -0
- package/lib/types/salesforce/flow/actions.d.ts +108 -0
- package/lib/types/salesforce/flow/actions.js +2 -0
- package/lib/types/salesforce/flow/actions.js.map +1 -0
- package/lib/types/salesforce/flow/common.d.ts +36 -0
- package/lib/types/salesforce/flow/common.js +5 -0
- package/lib/types/salesforce/flow/common.js.map +1 -0
- package/lib/types/salesforce/flow/metadata.d.ts +37 -0
- package/lib/types/salesforce/flow/metadata.js +2 -0
- package/lib/types/salesforce/flow/metadata.js.map +1 -0
- package/lib/types/salesforce/flow/records.d.ts +38 -0
- package/lib/types/salesforce/flow/records.js +2 -0
- package/lib/types/salesforce/flow/records.js.map +1 -0
- package/lib/types/salesforce/flow/resources.d.ts +44 -0
- package/lib/types/salesforce/flow/resources.js +2 -0
- package/lib/types/salesforce/flow/resources.js.map +1 -0
- package/lib/types/salesforce/flow/screens.d.ts +56 -0
- package/lib/types/salesforce/flow/screens.js +2 -0
- package/lib/types/salesforce/flow/screens.js.map +1 -0
- package/lib/types/salesforce/flow/start.d.ts +24 -0
- package/lib/types/salesforce/flow/start.js +2 -0
- package/lib/types/salesforce/flow/start.js.map +1 -0
- package/lib/types/salesforce/flow.d.ts +9 -514
- package/lib/types/salesforce/flow.js +1 -1
- package/lib/types/salesforce/object/core.d.ts +68 -0
- package/lib/types/salesforce/object/core.js +5 -0
- package/lib/types/salesforce/object/core.js.map +1 -0
- package/lib/types/salesforce/object/field.d.ts +155 -0
- package/lib/types/salesforce/object/field.js +5 -0
- package/lib/types/salesforce/object/field.js.map +1 -0
- package/lib/types/salesforce/object/filter.d.ts +16 -0
- package/lib/types/salesforce/object/filter.js +5 -0
- package/lib/types/salesforce/object/filter.js.map +1 -0
- package/lib/types/salesforce/object/policy.d.ts +27 -0
- package/lib/types/salesforce/object/policy.js +5 -0
- package/lib/types/salesforce/object/policy.js.map +1 -0
- package/lib/types/salesforce/object/record.d.ts +44 -0
- package/lib/types/salesforce/object/record.js +5 -0
- package/lib/types/salesforce/object/record.js.map +1 -0
- package/lib/types/salesforce/object/view.d.ts +71 -0
- package/lib/types/salesforce/object/view.js +5 -0
- package/lib/types/salesforce/object/view.js.map +1 -0
- package/lib/types/salesforce/object/weblink.d.ts +70 -0
- package/lib/types/salesforce/object/weblink.js +5 -0
- package/lib/types/salesforce/object/weblink.js.map +1 -0
- package/lib/types/salesforce/object.d.ts +7 -423
- package/lib/types/salesforce/object.js +7 -1
- package/lib/types/salesforce/object.js.map +1 -1
- package/lib/utils/cache-manager.d.ts +16 -15
- package/lib/utils/cache-manager.js +290 -188
- package/lib/utils/cache-manager.js.map +1 -1
- package/lib/utils/logger.d.ts +8 -0
- package/lib/utils/logger.js +82 -69
- package/lib/utils/logger.js.map +1 -1
- package/lib/validators/xml/xml-reference-rules.d.ts +3 -0
- package/lib/validators/xml/xml-reference-rules.js +173 -0
- package/lib/validators/xml/xml-reference-rules.js.map +1 -0
- package/lib/validators/xml/xml-report-formatter.d.ts +2 -0
- package/lib/validators/xml/xml-report-formatter.js +47 -0
- package/lib/validators/xml/xml-report-formatter.js.map +1 -0
- package/lib/validators/xml/xml-schema-rules.d.ts +3 -0
- package/lib/validators/xml/xml-schema-rules.js +75 -0
- package/lib/validators/xml/xml-schema-rules.js.map +1 -0
- package/lib/validators/xml/xml-validation-types.d.ts +25 -0
- package/lib/validators/xml/xml-validation-types.js +2 -0
- package/lib/validators/xml/xml-validation-types.js.map +1 -0
- package/lib/validators/xml-metadata-validator.d.ts +2 -63
- package/lib/validators/xml-metadata-validator.js +7 -338
- package/lib/validators/xml-metadata-validator.js.map +1 -1
- package/lib/waves/test-optimizer.d.ts +13 -0
- package/lib/waves/test-optimizer.js +124 -63
- package/lib/waves/test-optimizer.js.map +1 -1
- package/lib/waves/wave-builder.d.ts +17 -21
- package/lib/waves/wave-builder.js +199 -135
- package/lib/waves/wave-builder.js.map +1 -1
- package/lib/waves/wave-splitter.d.ts +12 -8
- package/lib/waves/wave-splitter.js +156 -115
- package/lib/waves/wave-splitter.js.map +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/oclif.manifest.json +1 -1
- package/package.json +1 -1
package/lib/utils/logger.d.ts
CHANGED
|
@@ -123,6 +123,10 @@ export declare class Logger {
|
|
|
123
123
|
* Core logging method
|
|
124
124
|
*/
|
|
125
125
|
private log;
|
|
126
|
+
private createConfig;
|
|
127
|
+
private resolveLogFilePath;
|
|
128
|
+
private createLogEntry;
|
|
129
|
+
private normalizeLogContext;
|
|
126
130
|
/**
|
|
127
131
|
* Log to console with color coding
|
|
128
132
|
*/
|
|
@@ -131,6 +135,7 @@ export declare class Logger {
|
|
|
131
135
|
* Log to file asynchronously (queued to prevent race conditions)
|
|
132
136
|
*/
|
|
133
137
|
private logToFileAsync;
|
|
138
|
+
private writeLogEntry;
|
|
134
139
|
/**
|
|
135
140
|
* Check file size and rotate if needed
|
|
136
141
|
*/
|
|
@@ -139,6 +144,9 @@ export declare class Logger {
|
|
|
139
144
|
* Rotate log file
|
|
140
145
|
*/
|
|
141
146
|
private rotateLogFile;
|
|
147
|
+
private findRotatedFiles;
|
|
148
|
+
private deleteOverflowRotations;
|
|
149
|
+
private bumpRotationIndexes;
|
|
142
150
|
/**
|
|
143
151
|
* Format log entry based on configured format
|
|
144
152
|
*/
|
package/lib/utils/logger.js
CHANGED
|
@@ -71,15 +71,8 @@ export class Logger {
|
|
|
71
71
|
* Private constructor - use getInstance() instead
|
|
72
72
|
*/
|
|
73
73
|
constructor(config) {
|
|
74
|
-
this.config =
|
|
75
|
-
|
|
76
|
-
this.config.logDirectory = path.join(os.homedir(), '.sf', 'smart-deployment', 'logs');
|
|
77
|
-
}
|
|
78
|
-
if (this.config.logToFile && this.config.logDirectory) {
|
|
79
|
-
const sanitizedComponent = this.config.component.replaceAll(/[^\w-]/g, '_').toLowerCase();
|
|
80
|
-
const date = new Date().toISOString().split('T')[0];
|
|
81
|
-
this.logFilePath = path.join(this.config.logDirectory, `${sanitizedComponent}-${date}.log`);
|
|
82
|
-
}
|
|
74
|
+
this.config = this.createConfig(config);
|
|
75
|
+
this.logFilePath = this.resolveLogFilePath(this.config);
|
|
83
76
|
}
|
|
84
77
|
/**
|
|
85
78
|
* Get logger instance for component (one instance per component)
|
|
@@ -136,6 +129,7 @@ export class Logger {
|
|
|
136
129
|
*/
|
|
137
130
|
configure(config) {
|
|
138
131
|
this.config = { ...this.config, ...config };
|
|
132
|
+
this.logFilePath = this.resolveLogFilePath(this.config);
|
|
139
133
|
}
|
|
140
134
|
/**
|
|
141
135
|
* Get current configuration
|
|
@@ -153,44 +147,59 @@ export class Logger {
|
|
|
153
147
|
* Core logging method
|
|
154
148
|
*/
|
|
155
149
|
log(level, message, context) {
|
|
156
|
-
// Check if level is enabled
|
|
157
150
|
if (LOG_LEVEL_VALUES[level] < LOG_LEVEL_VALUES[this.config.level]) {
|
|
158
151
|
return;
|
|
159
152
|
}
|
|
160
|
-
const entry =
|
|
153
|
+
const entry = this.createLogEntry(level, message, context);
|
|
154
|
+
if (this.config.logToConsole) {
|
|
155
|
+
this.logToConsoleOutput(entry);
|
|
156
|
+
}
|
|
157
|
+
if (this.config.logToFile && this.logFilePath) {
|
|
158
|
+
void this.logToFileAsync(entry);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
createConfig(config) {
|
|
162
|
+
const mergedConfig = { ...DEFAULT_CONFIG, ...config };
|
|
163
|
+
if (mergedConfig.logToFile && !mergedConfig.logDirectory) {
|
|
164
|
+
mergedConfig.logDirectory = path.join(os.homedir(), '.sf', 'smart-deployment', 'logs');
|
|
165
|
+
}
|
|
166
|
+
return mergedConfig;
|
|
167
|
+
}
|
|
168
|
+
resolveLogFilePath(config) {
|
|
169
|
+
if (!config.logToFile || !config.logDirectory) {
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
const sanitizedComponent = config.component.replaceAll(/[^\w-]/g, '_').toLowerCase();
|
|
173
|
+
const date = new Date().toISOString().split('T')[0];
|
|
174
|
+
return path.join(config.logDirectory, `${sanitizedComponent}-${date}.log`);
|
|
175
|
+
}
|
|
176
|
+
createLogEntry(level, message, context) {
|
|
177
|
+
const normalizedContext = this.normalizeLogContext(context);
|
|
178
|
+
return {
|
|
161
179
|
timestamp: new Date().toISOString(),
|
|
162
180
|
level,
|
|
163
181
|
component: this.config.component,
|
|
164
182
|
message,
|
|
183
|
+
context: normalizedContext.context,
|
|
184
|
+
error: normalizedContext.error,
|
|
165
185
|
};
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
entry.error = {
|
|
171
|
-
name: context.error.name,
|
|
172
|
-
message: context.error.message,
|
|
173
|
-
stack: context.error.stack,
|
|
174
|
-
};
|
|
175
|
-
// Remove error from context to avoid duplication
|
|
176
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
177
|
-
const { error: _, ...restContext } = context;
|
|
178
|
-
if (Object.keys(restContext).length > 0) {
|
|
179
|
-
entry.context = restContext;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
entry.context = context;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
// Log to console
|
|
187
|
-
if (this.config.logToConsole) {
|
|
188
|
-
this.logToConsoleOutput(entry);
|
|
186
|
+
}
|
|
187
|
+
normalizeLogContext(context) {
|
|
188
|
+
if (!context) {
|
|
189
|
+
return {};
|
|
189
190
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
void this.logToFileAsync(entry);
|
|
191
|
+
if (!(context.error instanceof Error)) {
|
|
192
|
+
return { context };
|
|
193
193
|
}
|
|
194
|
+
const { error, ...restContext } = context;
|
|
195
|
+
return {
|
|
196
|
+
error: {
|
|
197
|
+
name: error.name,
|
|
198
|
+
message: error.message,
|
|
199
|
+
stack: error.stack,
|
|
200
|
+
},
|
|
201
|
+
context: Object.keys(restContext).length > 0 ? restContext : undefined,
|
|
202
|
+
};
|
|
194
203
|
}
|
|
195
204
|
/**
|
|
196
205
|
* Log to console with color coding
|
|
@@ -218,18 +227,9 @@ export class Logger {
|
|
|
218
227
|
* Log to file asynchronously (queued to prevent race conditions)
|
|
219
228
|
*/
|
|
220
229
|
async logToFileAsync(entry) {
|
|
221
|
-
// Queue writes to prevent concurrent file access
|
|
222
230
|
this.writeQueue = this.writeQueue.then(async () => {
|
|
223
231
|
try {
|
|
224
|
-
|
|
225
|
-
return;
|
|
226
|
-
// Create log directory if it doesn't exist
|
|
227
|
-
await fs.mkdir(path.dirname(this.logFilePath), { recursive: true });
|
|
228
|
-
// Check if rotation is needed
|
|
229
|
-
await this.rotateIfNeeded();
|
|
230
|
-
// Format and write log entry
|
|
231
|
-
const formatted = this.formatEntry(entry);
|
|
232
|
-
await fs.appendFile(this.logFilePath, `${formatted}\n`, 'utf-8');
|
|
232
|
+
await this.writeLogEntry(entry);
|
|
233
233
|
}
|
|
234
234
|
catch {
|
|
235
235
|
// Silently ignore file write errors (don't block application)
|
|
@@ -237,6 +237,14 @@ export class Logger {
|
|
|
237
237
|
});
|
|
238
238
|
await this.writeQueue;
|
|
239
239
|
}
|
|
240
|
+
async writeLogEntry(entry) {
|
|
241
|
+
if (!this.logFilePath) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
await fs.mkdir(path.dirname(this.logFilePath), { recursive: true });
|
|
245
|
+
await this.rotateIfNeeded();
|
|
246
|
+
await fs.appendFile(this.logFilePath, `${this.formatEntry(entry)}\n`, 'utf-8');
|
|
247
|
+
}
|
|
240
248
|
/**
|
|
241
249
|
* Check file size and rotate if needed
|
|
242
250
|
*/
|
|
@@ -261,36 +269,41 @@ export class Logger {
|
|
|
261
269
|
if (!this.logFilePath)
|
|
262
270
|
return;
|
|
263
271
|
try {
|
|
264
|
-
// Find existing rotated files
|
|
265
272
|
const dir = path.dirname(this.logFilePath);
|
|
266
273
|
const baseFileName = path.basename(this.logFilePath, '.log');
|
|
267
|
-
const
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
.map((file) => {
|
|
271
|
-
const match = /\.(\d+)\.log$/.exec(file);
|
|
272
|
-
return {
|
|
273
|
-
file,
|
|
274
|
-
index: match ? Number.parseInt(match[1], 10) : 0,
|
|
275
|
-
};
|
|
276
|
-
})
|
|
277
|
-
.sort((a, b) => b.index - a.index);
|
|
278
|
-
// Delete oldest files if we have too many
|
|
279
|
-
const filesToDelete = rotatedFiles.slice(this.config.maxLogFiles - 1);
|
|
280
|
-
await Promise.all(filesToDelete.map((f) => fs.unlink(path.join(dir, f.file))));
|
|
281
|
-
// Rotate existing files in parallel
|
|
282
|
-
await Promise.all(rotatedFiles.slice(0, this.config.maxLogFiles - 1).map(({ file, index }) => {
|
|
283
|
-
const oldPath = path.join(dir, file);
|
|
284
|
-
const newPath = path.join(dir, `${baseFileName}.${index + 1}.log`);
|
|
285
|
-
return fs.rename(oldPath, newPath);
|
|
286
|
-
}));
|
|
287
|
-
// Rotate current file to .1.log
|
|
274
|
+
const rotatedFiles = await this.findRotatedFiles(dir, baseFileName);
|
|
275
|
+
await this.deleteOverflowRotations(dir, rotatedFiles);
|
|
276
|
+
await this.bumpRotationIndexes(dir, baseFileName, rotatedFiles);
|
|
288
277
|
await fs.rename(this.logFilePath, `${this.logFilePath.replace(/\.log$/, '')}.1.log`);
|
|
289
278
|
}
|
|
290
279
|
catch {
|
|
291
280
|
// Rotation failed - continue with current file
|
|
292
281
|
}
|
|
293
282
|
}
|
|
283
|
+
async findRotatedFiles(dir, baseFileName) {
|
|
284
|
+
const files = await fs.readdir(dir);
|
|
285
|
+
return files
|
|
286
|
+
.filter((file) => file.startsWith(`${baseFileName}.`) && file.endsWith('.log'))
|
|
287
|
+
.map((file) => {
|
|
288
|
+
const match = /\.(\d+)\.log$/.exec(file);
|
|
289
|
+
return {
|
|
290
|
+
file,
|
|
291
|
+
index: match ? Number.parseInt(match[1], 10) : 0,
|
|
292
|
+
};
|
|
293
|
+
})
|
|
294
|
+
.sort((a, b) => b.index - a.index);
|
|
295
|
+
}
|
|
296
|
+
async deleteOverflowRotations(dir, rotatedFiles) {
|
|
297
|
+
const filesToDelete = rotatedFiles.slice(this.config.maxLogFiles - 1);
|
|
298
|
+
await Promise.all(filesToDelete.map((file) => fs.unlink(path.join(dir, file.file))));
|
|
299
|
+
}
|
|
300
|
+
async bumpRotationIndexes(dir, baseFileName, rotatedFiles) {
|
|
301
|
+
await Promise.all(rotatedFiles.slice(0, this.config.maxLogFiles - 1).map(({ file, index }) => {
|
|
302
|
+
const oldPath = path.join(dir, file);
|
|
303
|
+
const newPath = path.join(dir, `${baseFileName}.${index + 1}.log`);
|
|
304
|
+
return fs.rename(oldPath, newPath);
|
|
305
|
+
}));
|
|
306
|
+
}
|
|
294
307
|
/**
|
|
295
308
|
* Format log entry based on configured format
|
|
296
309
|
*/
|
package/lib/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB;;GAEG;AACH,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,2BAAe,CAAA;IACf,yBAAa,CAAA;IACb,yBAAa,CAAA;IACb,2BAAe,CAAA;AACjB,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAED;;GAEG;AACH,MAAM,gBAAgB,GAA6B;IACjD,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACnB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IAClB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IAClB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;CACpB,CAAC;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
const RESERVED_KEYWORDS = new Set([
|
|
2
|
+
'abstract',
|
|
3
|
+
'activate',
|
|
4
|
+
'and',
|
|
5
|
+
'any',
|
|
6
|
+
'array',
|
|
7
|
+
'as',
|
|
8
|
+
'asc',
|
|
9
|
+
'autonomous',
|
|
10
|
+
'begin',
|
|
11
|
+
'bigdecimal',
|
|
12
|
+
'blob',
|
|
13
|
+
'break',
|
|
14
|
+
'bulk',
|
|
15
|
+
'by',
|
|
16
|
+
'case',
|
|
17
|
+
'cast',
|
|
18
|
+
'catch',
|
|
19
|
+
'char',
|
|
20
|
+
'class',
|
|
21
|
+
'collect',
|
|
22
|
+
'commit',
|
|
23
|
+
'const',
|
|
24
|
+
'continue',
|
|
25
|
+
'convertcurrency',
|
|
26
|
+
'decimal',
|
|
27
|
+
'default',
|
|
28
|
+
'delete',
|
|
29
|
+
'desc',
|
|
30
|
+
'do',
|
|
31
|
+
'else',
|
|
32
|
+
'end',
|
|
33
|
+
'enum',
|
|
34
|
+
'exception',
|
|
35
|
+
'exit',
|
|
36
|
+
'export',
|
|
37
|
+
'extends',
|
|
38
|
+
'false',
|
|
39
|
+
'final',
|
|
40
|
+
'finally',
|
|
41
|
+
'float',
|
|
42
|
+
'for',
|
|
43
|
+
'from',
|
|
44
|
+
'future',
|
|
45
|
+
'global',
|
|
46
|
+
'goto',
|
|
47
|
+
'group',
|
|
48
|
+
'having',
|
|
49
|
+
'hint',
|
|
50
|
+
'if',
|
|
51
|
+
'implements',
|
|
52
|
+
'import',
|
|
53
|
+
'in',
|
|
54
|
+
'inner',
|
|
55
|
+
'insert',
|
|
56
|
+
'instanceof',
|
|
57
|
+
'int',
|
|
58
|
+
'interface',
|
|
59
|
+
'into',
|
|
60
|
+
'join',
|
|
61
|
+
'like',
|
|
62
|
+
'limit',
|
|
63
|
+
'list',
|
|
64
|
+
'long',
|
|
65
|
+
'loop',
|
|
66
|
+
'map',
|
|
67
|
+
'merge',
|
|
68
|
+
'new',
|
|
69
|
+
'not',
|
|
70
|
+
'null',
|
|
71
|
+
'nulls',
|
|
72
|
+
'number',
|
|
73
|
+
'object',
|
|
74
|
+
'of',
|
|
75
|
+
'on',
|
|
76
|
+
'or',
|
|
77
|
+
'outer',
|
|
78
|
+
'override',
|
|
79
|
+
'package',
|
|
80
|
+
'parallel',
|
|
81
|
+
'pragma',
|
|
82
|
+
'private',
|
|
83
|
+
'protected',
|
|
84
|
+
'public',
|
|
85
|
+
'retrieve',
|
|
86
|
+
'return',
|
|
87
|
+
'rollback',
|
|
88
|
+
'select',
|
|
89
|
+
'set',
|
|
90
|
+
'short',
|
|
91
|
+
'sort',
|
|
92
|
+
'static',
|
|
93
|
+
'super',
|
|
94
|
+
'switch',
|
|
95
|
+
'synchronized',
|
|
96
|
+
'system',
|
|
97
|
+
'testmethod',
|
|
98
|
+
'then',
|
|
99
|
+
'this',
|
|
100
|
+
'throw',
|
|
101
|
+
'transaction',
|
|
102
|
+
'trigger',
|
|
103
|
+
'true',
|
|
104
|
+
'try',
|
|
105
|
+
'type',
|
|
106
|
+
'undelete',
|
|
107
|
+
'update',
|
|
108
|
+
'upsert',
|
|
109
|
+
'using',
|
|
110
|
+
'virtual',
|
|
111
|
+
'void',
|
|
112
|
+
'webservice',
|
|
113
|
+
'when',
|
|
114
|
+
'where',
|
|
115
|
+
'while',
|
|
116
|
+
]);
|
|
117
|
+
export function validateReferences(content, result) {
|
|
118
|
+
const patterns = [
|
|
119
|
+
{ regex: /<field>([^<]+)<\/field>/g, type: 'field' },
|
|
120
|
+
{ regex: /<object>([^<]+)<\/object>/g, type: 'object' },
|
|
121
|
+
{ regex: /<class>([^<]+)<\/class>/g, type: 'class' },
|
|
122
|
+
];
|
|
123
|
+
for (const pattern of patterns) {
|
|
124
|
+
const matches = [...content.matchAll(pattern.regex)];
|
|
125
|
+
for (const match of matches) {
|
|
126
|
+
const reference = match[1];
|
|
127
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_]*(__c)?$/.test(reference)) {
|
|
128
|
+
result.errors.push({
|
|
129
|
+
type: 'reference',
|
|
130
|
+
message: `Invalid ${pattern.type} name: ${reference}`,
|
|
131
|
+
severity: 'warning',
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
if (RESERVED_KEYWORDS.has(reference.toLowerCase())) {
|
|
135
|
+
result.errors.push({
|
|
136
|
+
type: 'reference',
|
|
137
|
+
message: `Reserved keyword used as ${pattern.type} name: ${reference}`,
|
|
138
|
+
severity: 'error',
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export function generateSuggestions(result, maxApiVersion) {
|
|
145
|
+
for (const error of result.errors) {
|
|
146
|
+
if (error.type === 'version' && error.message.includes('too old')) {
|
|
147
|
+
result.suggestions.push({
|
|
148
|
+
issue: error.message,
|
|
149
|
+
fix: `Update API version to ${maxApiVersion}`,
|
|
150
|
+
autoFixable: true,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (error.type === 'reference' && error.message.includes('Invalid')) {
|
|
154
|
+
const match = error.message.match(/: (.+)$/);
|
|
155
|
+
if (!match) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
result.suggestions.push({
|
|
159
|
+
issue: error.message,
|
|
160
|
+
fix: `Rename to: ${suggestFixedName(match[1])}`,
|
|
161
|
+
autoFixable: false,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function suggestFixedName(invalidName) {
|
|
167
|
+
let fixed = invalidName.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
168
|
+
if (!/^[a-zA-Z]/.test(fixed)) {
|
|
169
|
+
fixed = `Field_${fixed}`;
|
|
170
|
+
}
|
|
171
|
+
return fixed;
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=xml-reference-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-reference-rules.js","sourceRoot":"","sources":["../../../src/validators/xml/xml-reference-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export function formatValidationReport(result) {
|
|
2
|
+
const lines = [];
|
|
3
|
+
lines.push('🔍 XML Validation Report');
|
|
4
|
+
lines.push('═══════════════════════════════════════');
|
|
5
|
+
lines.push(`File: ${result.filePath}`);
|
|
6
|
+
lines.push(`Status: ${result.isValid ? '✅ VALID' : '❌ INVALID'}`);
|
|
7
|
+
lines.push('');
|
|
8
|
+
if (result.errors.length > 0) {
|
|
9
|
+
const errors = result.errors.filter((error) => error.severity === 'error');
|
|
10
|
+
if (errors.length > 0) {
|
|
11
|
+
lines.push(`🔴 Errors (${errors.length}):`);
|
|
12
|
+
for (const error of errors) {
|
|
13
|
+
const location = error.line ? ` [Line ${error.line}]` : '';
|
|
14
|
+
lines.push(` ${error.type.toUpperCase()}${location}: ${error.message}`);
|
|
15
|
+
}
|
|
16
|
+
lines.push('');
|
|
17
|
+
}
|
|
18
|
+
const warnings = result.errors.filter((error) => error.severity === 'warning');
|
|
19
|
+
if (warnings.length > 0) {
|
|
20
|
+
lines.push(`🟡 Warnings (${warnings.length}):`);
|
|
21
|
+
for (const warning of warnings) {
|
|
22
|
+
lines.push(` ${warning.message}`);
|
|
23
|
+
}
|
|
24
|
+
lines.push('');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (result.warnings.length > 0) {
|
|
28
|
+
lines.push(`⚠️ Additional Warnings (${result.warnings.length}):`);
|
|
29
|
+
for (const warning of result.warnings) {
|
|
30
|
+
lines.push(` ${warning.message}`);
|
|
31
|
+
if (warning.suggestion) {
|
|
32
|
+
lines.push(` 💡 ${warning.suggestion}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
lines.push('');
|
|
36
|
+
}
|
|
37
|
+
if (result.suggestions.length > 0) {
|
|
38
|
+
lines.push(`💡 Suggestions (${result.suggestions.length}):`);
|
|
39
|
+
for (const suggestion of result.suggestions) {
|
|
40
|
+
const autofix = suggestion.autoFixable ? ' [Auto-fixable]' : '';
|
|
41
|
+
lines.push(` ${suggestion.issue}`);
|
|
42
|
+
lines.push(` → ${suggestion.fix}${autofix}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return lines.join('\n');
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=xml-report-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-report-formatter.js","sourceRoot":"","sources":["../../../src/validators/xml/xml-report-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { MetadataValidationType, ValidationResult } from './xml-validation-types.js';
|
|
2
|
+
export declare function detectMetadataType(filePath: string): MetadataValidationType;
|
|
3
|
+
export declare function validateSchema(content: string, filePath: string, result: ValidationResult): void;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export function detectMetadataType(filePath) {
|
|
2
|
+
if (filePath.includes('/classes/'))
|
|
3
|
+
return 'ApexClass';
|
|
4
|
+
if (filePath.includes('/triggers/'))
|
|
5
|
+
return 'ApexTrigger';
|
|
6
|
+
if (filePath.includes('/objects/'))
|
|
7
|
+
return 'CustomObject';
|
|
8
|
+
if (filePath.includes('/profiles/'))
|
|
9
|
+
return 'Profile';
|
|
10
|
+
if (filePath.includes('/permissionsets/'))
|
|
11
|
+
return 'PermissionSet';
|
|
12
|
+
return 'Unknown';
|
|
13
|
+
}
|
|
14
|
+
export function validateSchema(content, filePath, result) {
|
|
15
|
+
const metadataType = detectMetadataType(filePath);
|
|
16
|
+
if (metadataType === 'ApexClass' || metadataType === 'ApexTrigger') {
|
|
17
|
+
validateApexMetadata(content, result);
|
|
18
|
+
}
|
|
19
|
+
else if (metadataType === 'CustomObject') {
|
|
20
|
+
validateObjectMetadata(content, result);
|
|
21
|
+
}
|
|
22
|
+
else if (metadataType === 'Profile' || metadataType === 'PermissionSet') {
|
|
23
|
+
validateSecurityMetadata(content, result);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function validateApexMetadata(content, result) {
|
|
27
|
+
if (!content.includes('<ApexClass') && !content.includes('<ApexTrigger')) {
|
|
28
|
+
result.errors.push({
|
|
29
|
+
type: 'schema',
|
|
30
|
+
message: 'Missing ApexClass or ApexTrigger root element',
|
|
31
|
+
severity: 'error',
|
|
32
|
+
});
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (!content.includes('<status>')) {
|
|
36
|
+
result.errors.push({
|
|
37
|
+
type: 'schema',
|
|
38
|
+
message: 'Missing required field: status',
|
|
39
|
+
severity: 'error',
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function validateObjectMetadata(content, result) {
|
|
44
|
+
if (!content.includes('<CustomObject')) {
|
|
45
|
+
result.errors.push({
|
|
46
|
+
type: 'schema',
|
|
47
|
+
message: 'Missing CustomObject root element',
|
|
48
|
+
severity: 'error',
|
|
49
|
+
});
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!content.includes('<label>')) {
|
|
53
|
+
result.errors.push({
|
|
54
|
+
type: 'schema',
|
|
55
|
+
message: 'Missing required field: label',
|
|
56
|
+
severity: 'error',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (!content.includes('<pluralLabel>')) {
|
|
60
|
+
result.warnings.push({
|
|
61
|
+
message: 'Missing pluralLabel field',
|
|
62
|
+
suggestion: 'Add pluralLabel for better user experience',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function validateSecurityMetadata(content, result) {
|
|
67
|
+
if (!content.includes('<Profile') && !content.includes('<PermissionSet')) {
|
|
68
|
+
result.errors.push({
|
|
69
|
+
type: 'schema',
|
|
70
|
+
message: 'Missing Profile or PermissionSet root element',
|
|
71
|
+
severity: 'error',
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=xml-schema-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-schema-rules.js","sourceRoot":"","sources":["../../../src/validators/xml/xml-schema-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type ValidationResult = {
|
|
2
|
+
isValid: boolean;
|
|
3
|
+
errors: ValidationError[];
|
|
4
|
+
warnings: ValidationWarning[];
|
|
5
|
+
suggestions: ValidationSuggestion[];
|
|
6
|
+
filePath: string;
|
|
7
|
+
};
|
|
8
|
+
export type ValidationError = {
|
|
9
|
+
type: 'syntax' | 'schema' | 'reference' | 'version';
|
|
10
|
+
message: string;
|
|
11
|
+
line?: number;
|
|
12
|
+
column?: number;
|
|
13
|
+
severity: 'error' | 'warning';
|
|
14
|
+
};
|
|
15
|
+
export type ValidationWarning = {
|
|
16
|
+
message: string;
|
|
17
|
+
line?: number;
|
|
18
|
+
suggestion?: string;
|
|
19
|
+
};
|
|
20
|
+
export type ValidationSuggestion = {
|
|
21
|
+
issue: string;
|
|
22
|
+
fix: string;
|
|
23
|
+
autoFixable: boolean;
|
|
24
|
+
};
|
|
25
|
+
export type MetadataValidationType = 'ApexClass' | 'ApexTrigger' | 'CustomObject' | 'Profile' | 'PermissionSet' | 'Unknown';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-validation-types.js","sourceRoot":"","sources":["../../../src/validators/xml/xml-validation-types.ts"],"names":[],"mappings":""}
|