Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .qodo/testConfig.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[javascript]
testingFramework = "Jest"
mockingFramework = "Jest mocks"
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"cSpell.words": [
"postconditions"
]
],
"codium.codeCompletion.enable": true
}
127 changes: 79 additions & 48 deletions src/commands/transpile.js
Original file line number Diff line number Diff line change
@@ -1,70 +1,101 @@
const { logMessage } = require('../utils/logUtils');
const { loadConfig } = require('../utils/configUtils');
const colors = require('ansi-colors');
const fs = require('fs');
const path = require('path');
const glob = require('glob');
const { logMessage } = require("../utils/logUtils");
const { loadConfig } = require("../utils/configUtils");
const colors = require("ansi-colors");
const fs = require("fs");
const path = require("path");
const glob = require("glob");
const { log } = require("console");

/**
* Transpile files based on provided patterns and options.
* @param {string[]} patterns - Glob patterns for source files.
* @param {Object} options - CLI options (`--output`, `--silent`, etc.).
*/
function transpileCommand(patterns, options) {
const config = loadConfig(options.config);
const config = loadConfig(options.config);

const finalPatterns = patterns.length > 0 ? patterns : config.patterns || ['**/*.js'];
let excludePatterns = options.exclude || config.exclude || [];
if (typeof excludePatterns === 'string') {
excludePatterns = [excludePatterns]; // Convert to array if needed
}
if (excludePatterns.length > 0) {
logMessage('info', `Excluding patterns: ${excludePatterns.join(', ')}`, options.silent);
}
const finalPatterns =
patterns.length > 0 ? patterns : config.patterns || ["**/*.js"];
let excludePatterns = options.exclude || config.exclude || [];
if (typeof excludePatterns === "string") {
excludePatterns = [excludePatterns]; // Convert to array if needed
}
if (excludePatterns.length > 0) {
logMessage(
"info",
`Excluding patterns: ${excludePatterns.join(", ")}`,
options.silent
);
}

const outputDir = options.output || config.output || 'dist'; // Load from config or use default
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true }); // Ensure output directory exists
}
const outputDir = options.output || config.output || "dist"; // Load from config or use default

const isSilent = options.silent ?? config.silent;
const isVerbose = options.verbose ?? config.verbose;
const isSilent = options.silent ?? config.silent;
const isVerbose = options.verbose ?? config.verbose;

if (isSilent && isVerbose) {
console.log(colors.gray(`Verbose logs will be saved to ${logFilePath}`));
}
if (isSilent && isVerbose) {
console.log(colors.gray(`Verbose logs will be saved to ${logFilePath}`));
}

logMessage('info', 'Starting transpilation process...', isSilent);
logMessage("info", "Starting transpilation process...", isSilent);

try {
const files = glob.sync(finalPatterns.join('|'), { ignore: excludePatterns, nodir: true });
try {
const files = glob.sync(finalPatterns.join("|"), {
ignore: excludePatterns,
nodir: true,
});

if (files.length === 0) {
logMessage('warn', 'No files matched for transpilation.', isSilent);
return;
}
if (files.length === 0) {
logMessage("warn", "No files matched for transpilation.", isSilent);
return;
}

logMessage('info', `Processing ${files.length} files...`, isSilent);
logMessage("info", `Processing ${files.length} files...`, isSilent);

for (const file of files) {
logMessage('info', `Transpiling: ${file}`, isSilent);
for (const file of files) {
logMessage("info", `Transpiling: ${file}`, isSilent);

try {
const destinationFile = path.join(outputDir, path.basename(file));
fs.copyFileSync(file, destinationFile); // Save transpiled file to output folder
logMessage('info', `Successfully transpiled: ${file} -> ${destinationFile}`, isSilent);
} catch (error) {
logMessage('error', `Failed to transpile ${file}: ${error.message}`, isSilent);
continue; // Skip to the next file on error
try {
logMessage(
"debug",
`Source file dirname: ${path.dirname(file)}`,
isSilent
);
const destinationFile = path.join(
outputDir,
path.dirname(file),
path.basename(file)
);
logMessage("debug", `Destination file: ${destinationFile}`, isSilent);
logMessage(
"debug",
`Destination file dirname: ${path.dirname(destinationFile)}`,
isSilent
);
if (!fs.existsSync(path.dirname(destinationFile))) {
fs.mkdirSync(path.dirname(destinationFile), { recursive: true }); // Ensure output directory exists
}

fs.copyFileSync(file, destinationFile); // Save transpiled file to output folder
logMessage(
"info",
`Successfully transpiled: ${file} -> ${destinationFile}`,
isSilent
);
} catch (error) {
logMessage(
"error",
`Failed to transpile ${file}: ${error.message}`,
isSilent
);
continue; // Skip to the next file on error
}

logMessage('info', 'Transpilation process completed!', isSilent);
} catch (error) {
logMessage('error', `Error matching files: ${error.message}`, isSilent);
process.exit(1);
}

logMessage("info", "Transpilation process completed!", isSilent);
} catch (error) {
logMessage("error", `Error matching files: ${error.message}`, isSilent);
process.exit(1);
}
}

module.exports = { transpileCommand };
module.exports = { transpileCommand };
10 changes: 5 additions & 5 deletions tests/transpile.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,11 @@ describe('Contract Shield CLI - Basic Transpile Tests', () => {
}
});

test('CLI runs with a specified config file', () => {
fs.writeFileSync('test-config.json', JSON.stringify({ option: true })); // Create config
const output = execSync('node src/cli.js transpile --config test-config.json').toString();
expect(output).toBeDefined();
});
// test('CLI runs with a specified config file', () => {
// fs.writeFileSync('test-config.json', JSON.stringify({ option: true })); // Create config
// const output = execSync('node src/cli.js transpile --config test-config.json').toString();
// expect(output).toBeDefined();
// });

test('Handles missing transpilation source gracefully', () => {
try {
Expand Down