#!/usr/bin/env node
/**
* Ensure TypeScript declaration files are generated
* This is a workaround for a TypeScript issue where declaration files
* are not generated in certain environments when using .js extensions
* in imports with module: "NodeNext"
*/
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
// Diagnostic information
console.log('š Diagnostic Information:');
console.log(' Node version:', process.version);
console.log(' Platform:', process.platform);
console.log(' Architecture:', process.arch);
console.log(' Current directory:', process.cwd());
console.log(' Script directory:', __dirname);
// Get TypeScript version
try {
const tscVersion = execSync('npx tsc --version', { encoding: 'utf8' }).trim();
console.log(' TypeScript version:', tscVersion);
} catch (e) {
console.log(' TypeScript version: Could not determine');
}
const distDir = path.join(__dirname, '..', 'dist');
const indexDtsPath = path.join(distDir, 'index.d.ts');
// List what's in dist directory before trying fallbacks
console.log('\nš Contents of dist directory:');
if (fs.existsSync(distDir)) {
const files = fs.readdirSync(distDir);
files.forEach(file => {
const stats = fs.statSync(path.join(distDir, file));
console.log(` ${file} (${stats.isDirectory() ? 'directory' : stats.size + ' bytes'})`);
});
} else {
console.log(' dist directory does not exist!');
}
// Check if index.d.ts exists
if (!fs.existsSync(indexDtsPath)) {
console.log('\nā ļø Declaration files not generated by normal build.');
// Run tsc with diagnostics to see what's happening
console.log('\nš Running TypeScript with diagnostics...');
try {
const diagnostics = execSync('npx tsc --listFiles --noEmit', {
cwd: path.join(__dirname, '..'),
encoding: 'utf8'
});
const fileCount = diagnostics.split('\n').filter(line => line.trim()).length;
console.log(` TypeScript processed ${fileCount} files`);
} catch (e) {
console.log(' TypeScript diagnostics failed:', e.message);
}
// Check for TypeScript errors
console.log('\nš Checking for TypeScript errors...');
try {
execSync('npx tsc --noEmit', {
cwd: path.join(__dirname, '..'),
stdio: 'pipe'
});
console.log(' No TypeScript errors found');
} catch (e) {
console.log(' TypeScript errors detected:', e.stdout ? e.stdout.toString() : e.message);
}
console.log('\nš Attempting alternative declaration generation...');
try {
// Try building with different settings
console.log(' Running tsc with explicit declaration generation...');
execSync('npx tsc --declaration --emitDeclarationOnly --outDir dist', {
cwd: path.join(__dirname, '..'),
stdio: 'inherit'
});
if (fs.existsSync(indexDtsPath)) {
console.log('ā
Declaration files generated successfully via fallback!');
} else {
// If still no declarations, try one more approach
console.log(' Trying with module commonjs...');
execSync('npx tsc --declaration --module commonjs --outDir dist', {
cwd: path.join(__dirname, '..'),
stdio: 'inherit'
});
if (fs.existsSync(indexDtsPath)) {
console.log('ā
Declaration files generated successfully via second fallback!');
} else {
// Last resort - try with a minimal config
console.log(' Trying with minimal config...');
execSync('npx tsc src/index.ts --declaration --outDir dist --moduleResolution node --module commonjs', {
cwd: path.join(__dirname, '..'),
stdio: 'inherit'
});
if (fs.existsSync(indexDtsPath)) {
console.log('ā
Declaration files generated successfully via third fallback!');
} else {
console.error('\nā Failed to generate declaration files after all attempts.');
// Final diagnostic - list what files were actually created
console.log('\nš Final contents of dist directory:');
if (fs.existsSync(distDir)) {
const files = fs.readdirSync(distDir);
files.forEach(file => {
const stats = fs.statSync(path.join(distDir, file));
console.log(` ${file} (${stats.isDirectory() ? 'directory' : stats.size + ' bytes'})`);
});
}
process.exit(1);
}
}
}
} catch (error) {
console.error('ā Error during fallback declaration generation:', error.message);
process.exit(1);
}
} else {
console.log('\nā
Declaration files already exist.');
}
// Verify all expected declaration files exist
const expectedFiles = [
'index.d.ts',
'factories/adapter-factory.d.ts',
'interfaces/adapter-launch-barrier.d.ts',
'interfaces/adapter-policy.d.ts',
'interfaces/adapter-policy-js.d.ts',
'interfaces/adapter-policy-mock.d.ts',
'interfaces/adapter-policy-python.d.ts',
'interfaces/dap-client-behavior.d.ts',
'interfaces/debug-adapter.d.ts',
'interfaces/adapter-registry.d.ts',
'interfaces/external-dependencies.d.ts',
'interfaces/filesystem.d.ts',
'interfaces/process-interfaces.d.ts',
'models/index.d.ts'
];
console.log('\nš Verifying expected declaration files...');
let allFilesExist = true;
for (const file of expectedFiles) {
const filePath = path.join(distDir, file);
if (!fs.existsSync(filePath)) {
console.error(` ā Missing: ${file}`);
allFilesExist = false;
} else {
const stats = fs.statSync(filePath);
console.log(` ā
Found: ${file} (${stats.size} bytes)`);
}
}
if (!allFilesExist) {
console.error('\nā Some declaration files are missing!');
process.exit(1);
}
console.log('\nā
All declaration files verified successfully!');