**feat: improve TensorFlow.js compatibility and remove unnecessary patches**

- Removed outdated Node.js v24 compatibility patches for `TextEncoder` and `TextDecoder` in `cli-wrapper.js` and other modules since TensorFlow.js now supports Node.js v24+ natively.
- Introduced a utility module `src/utils/tensorflowUtils.ts` for TensorFlow.js compatibility, defining global `PlatformNode` and related utilities.
- Enhanced `fileSystemStorage.ts` with improved Node.js module loading mechanisms for better compatibility across environments.
- Simplified dependency requirements by reducing the minimum Node.js version to `>=23.0.0`.
- Updated `package.json`, `cli-package/package.json`, and `README.md` versions to `0.9.25`.
- Harmonized `cli-package` and main package dependencies to ensure version alignment.
- Improved global compatibility with TensorFlow.js in mixed Node.js environments.

This update modernizes TensorFlow.js integration, reduces maintenance efforts, and aligns compatibility with current Node.js and TensorFlow.js capabilities.
This commit is contained in:
David Snelling 2025-07-02 16:16:19 -07:00
parent e9f51e1bf3
commit 5edea683c6
20 changed files with 428 additions and 168 deletions

View file

@ -8,84 +8,123 @@
* globally for testing.
*/
import { execSync } from 'child_process';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import { execSync } from 'child_process'
import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'
// Get the directory of the current module
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const rootDir = path.join(__dirname, '..');
const cliPackageDir = path.join(rootDir, 'cli-package');
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
const rootDir = path.join(__dirname, '..')
const cliPackageDir = path.join(rootDir, 'cli-package')
// Ensure the CLI package directory exists
if (!fs.existsSync(cliPackageDir)) {
console.error(`Error: CLI package directory not found at ${cliPackageDir}`);
process.exit(1);
console.error(`Error: CLI package directory not found at ${cliPackageDir}`)
process.exit(1)
}
try {
// Step 1: Ensure versions are in sync
console.log('Ensuring versions are in sync...');
execSync('node scripts/generate-version.js', { stdio: 'inherit', cwd: rootDir });
console.log('Ensuring versions are in sync...')
execSync('node scripts/generate-version.js', {
stdio: 'inherit',
cwd: rootDir
})
// Step 2: Build the main package
console.log('Building main package...');
execSync('npm run build', { stdio: 'inherit', cwd: rootDir });
console.log('Building main package...')
execSync('npm run build', { stdio: 'inherit', cwd: rootDir })
// Step 3: Create a local tarball of the main package
console.log('Creating local tarball of main package...');
const mainPackOutput = execSync('npm pack', { cwd: rootDir }).toString().trim();
const mainPackageTarball = path.join(rootDir, mainPackOutput);
console.log(`Main package tarball created: ${mainPackageTarball}`);
console.log('Creating local tarball of main package...')
execSync('npm pack', { stdio: 'inherit', cwd: rootDir })
// Read the main package.json to get the name and version
const mainPackageJsonPath = path.join(rootDir, 'package.json')
const mainPackageJson = JSON.parse(
fs.readFileSync(mainPackageJsonPath, 'utf8')
)
// The tarball name follows a standard format: <package-name>-<version>.tgz
const mainPackageName = mainPackageJson.name
.replace('@', '')
.replace('/', '-')
const mainPackageVersion = mainPackageJson.version
const mainTarballName = `${mainPackageName}-${mainPackageVersion}.tgz`
const mainPackageTarball = path.join(rootDir, mainTarballName)
// Verify the tarball exists
if (!fs.existsSync(mainPackageTarball)) {
console.error(
`Error: Main package tarball not found at ${mainPackageTarball}`
)
process.exit(1)
}
console.log(`Main package tarball created: ${mainPackageTarball}`)
// Step 4: Build the CLI package
console.log('Building CLI package...');
execSync('npm run build', { stdio: 'inherit', cwd: cliPackageDir });
console.log('Building CLI package...')
execSync('npm run build', { stdio: 'inherit', cwd: cliPackageDir })
// Step 5: Verify the CLI was built successfully
const cliPath = path.join(cliPackageDir, 'dist', 'cli.js');
const cliPath = path.join(cliPackageDir, 'dist', 'cli.js')
if (!fs.existsSync(cliPath)) {
console.error(`Error: CLI build failed. File not found at ${cliPath}`);
process.exit(1);
console.error(`Error: CLI build failed. File not found at ${cliPath}`)
process.exit(1)
}
// Step 6: Temporarily update the CLI package.json to use the local main package
console.log('Updating CLI package.json to use local main package...');
const cliPackageJsonPath = path.join(cliPackageDir, 'package.json');
const cliPackageJson = JSON.parse(fs.readFileSync(cliPackageJsonPath, 'utf8'));
console.log('Updating CLI package.json to use local main package...')
const cliPackageJsonPath = path.join(cliPackageDir, 'package.json')
const cliPackageJson = JSON.parse(fs.readFileSync(cliPackageJsonPath, 'utf8'))
// Save the original dependency for restoration later
const originalDependency = cliPackageJson.dependencies['@soulcraft/brainy'];
const originalDependency = cliPackageJson.dependencies['@soulcraft/brainy']
// Update to use the local tarball
cliPackageJson.dependencies['@soulcraft/brainy'] = `file:${mainPackageTarball}`;
cliPackageJson.dependencies['@soulcraft/brainy'] =
`file:${mainPackageTarball}`
// Write the updated package.json
fs.writeFileSync(cliPackageJsonPath, JSON.stringify(cliPackageJson, null, 2));
fs.writeFileSync(cliPackageJsonPath, JSON.stringify(cliPackageJson, null, 2))
// Step 7: Create a local tarball of the CLI package
console.log('Creating local tarball of CLI package...');
const cliPackOutput = execSync('npm pack', { cwd: cliPackageDir }).toString().trim();
const cliPackageTarball = path.join(cliPackageDir, cliPackOutput);
console.log(`CLI package tarball created: ${cliPackageTarball}`);
console.log('Creating local tarball of CLI package...')
execSync('npm pack', { stdio: 'inherit', cwd: cliPackageDir })
// Step 8: Restore the original dependency in CLI package.json
console.log('Restoring original dependency in CLI package.json...');
cliPackageJson.dependencies['@soulcraft/brainy'] = originalDependency;
fs.writeFileSync(cliPackageJsonPath, JSON.stringify(cliPackageJson, null, 2));
// The tarball name follows a standard format: <package-name>-<version>.tgz
const cliPackageName = cliPackageJson.name.replace('@', '').replace('/', '-')
const cliPackageVersion = cliPackageJson.version
const cliTarballName = `${cliPackageName}-${cliPackageVersion}.tgz`
const cliPackageTarball = path.join(cliPackageDir, cliTarballName)
// Step 9: Install the CLI package globally for testing
console.log('Installing CLI package globally for testing...');
execSync(`npm install -g ${cliPackageTarball}`, { stdio: 'inherit' });
// Verify the tarball exists
if (!fs.existsSync(cliPackageTarball)) {
console.error(
`Error: CLI package tarball not found at ${cliPackageTarball}`
)
process.exit(1)
}
console.log('\nCLI package installed globally for testing!');
console.log('You can now run the CLI using the "brainy" command.');
console.log('\nTo uninstall after testing:');
console.log('npm uninstall -g @soulcraft/brainy-cli');
console.log(`CLI package tarball created: ${cliPackageTarball}`)
// Step 8: Install the CLI package globally for testing
console.log('Installing CLI package globally for testing...')
execSync(`npm install -g "${cliPackageTarball}"`, { stdio: 'inherit' })
// Step 9: Restore the original dependency in CLI package.json
console.log('Restoring original dependency in CLI package.json...')
cliPackageJson.dependencies['@soulcraft/brainy'] = originalDependency
fs.writeFileSync(cliPackageJsonPath, JSON.stringify(cliPackageJson, null, 2))
console.log('\nCLI package installed globally for testing!')
console.log('You can now run the CLI using the "brainy" command.')
console.log('\nTo uninstall after testing:')
console.log('npm uninstall -g @soulcraft/brainy-cli')
} catch (error) {
console.error('Error:', error.message);
process.exit(1);
console.error('Error:', error.message)
process.exit(1)
}