2025-06-24 11:41:30 -07:00
import typescript from '@rollup/plugin-typescript'
import resolve from '@rollup/plugin-node-resolve'
import commonjs from '@rollup/plugin-commonjs'
import json from '@rollup/plugin-json'
import { terser } from 'rollup-plugin-terser'
import replace from '@rollup/plugin-replace'
2025-07-04 14:42:33 -07:00
import fs from 'fs'
import path from 'path'
2025-06-24 11:41:30 -07:00
// Custom plugin to provide empty shims for Node.js built-in modules in browser environments
const nodeModuleShims = ( ) => {
return {
name : 'node-module-shims' ,
resolveId ( source ) {
// List of Node.js built-in modules to shim
2025-07-04 14:42:33 -07:00
const nodeBuiltins = [
'fs' ,
'path' ,
'util' ,
'child_process' ,
'node:fs' ,
'node:path' ,
'node:util' ,
'node:child_process'
]
2025-06-24 11:41:30 -07:00
if ( nodeBuiltins . includes ( source ) ) {
// Return a virtual module ID for the shim
return ` \0 ${ source } -shim `
}
return null
} ,
load ( id ) {
2025-07-15 11:53:26 -07:00
// If this is one of our shims, return an appropriate module
2025-06-24 11:41:30 -07:00
if ( id . startsWith ( '\0' ) && id . endsWith ( '-shim' ) ) {
2025-07-15 11:53:26 -07:00
const moduleName = id . slice ( 1 , - 5 )
2025-06-24 11:41:30 -07:00
console . log (
2025-07-15 11:53:26 -07:00
` Providing shim for Node.js module: ${ moduleName } `
2025-06-24 11:41:30 -07:00
)
2025-07-15 11:53:26 -07:00
// Special handling for util module to include TextEncoder/TextDecoder
if ( moduleName === 'util' || moduleName === 'node:util' ) {
return `
// Util shim with TextEncoder/TextDecoder support
const TextEncoder = globalThis . TextEncoder || ( typeof global !== 'undefined' && global . TextEncoder ) || class TextEncoder {
encode ( input ) {
return new Uint8Array ( Buffer . from ( input , 'utf8' ) ) ;
}
} ;
const TextDecoder = globalThis . TextDecoder || ( typeof global !== 'undefined' && global . TextDecoder ) || class TextDecoder {
decode ( input ) {
return Buffer . from ( input ) . toString ( 'utf8' ) ;
}
} ;
const types = {
isFloat32Array : ( arr ) => arr instanceof Float32Array ,
isInt32Array : ( arr ) => arr instanceof Int32Array ,
isUint8Array : ( arr ) => arr instanceof Uint8Array ,
isUint8ClampedArray : ( arr ) => arr instanceof Uint8ClampedArray
} ;
export default { TextEncoder , TextDecoder , types } ;
export { TextEncoder , TextDecoder , types } ;
export const promises = { } ;
`
}
// Default empty shim for other modules
2025-06-24 11:41:30 -07:00
return 'export default {}; export const promises = {};'
}
return null
}
}
}
// Custom plugin to provide Buffer polyfill for browser environments
const bufferPolyfill = ( ) => {
return {
name : 'buffer-polyfill' ,
// This will run before the bundle is generated
buildStart ( ) {
console . log ( 'Setting up Buffer polyfill for the bundle' )
} ,
// This will run for each module
transform ( code , id ) {
// Only transform the entry point
if ( id . includes ( 'src/unified.ts' ) ) {
// Add import for buffer at the top of the file
const bufferImport = `
// Import Buffer polyfill
import { Buffer as BufferPolyfill } from 'buffer' ;
// Make Buffer available globally
if ( typeof window !== 'undefined' && typeof globalThis . Buffer === 'undefined' ) {
globalThis . Buffer = BufferPolyfill ;
}
2025-07-04 14:42:33 -07:00
`
2025-06-24 11:41:30 -07:00
return {
code : bufferImport + code ,
map : { mappings : '' } // Provide an empty sourcemap to avoid warnings
2025-07-04 14:42:33 -07:00
}
2025-06-24 11:41:30 -07:00
}
2025-07-04 14:42:33 -07:00
return null // Return null to let Rollup handle other files normally
2025-06-24 11:41:30 -07:00
}
}
}
// Custom plugin to fix 'this' references in specific files
const fixThisReferences = ( ) => {
return {
name : 'fix-this-references' ,
transform ( code , id ) {
// Only transform the specific files that have issues with 'this'
if (
id . includes (
'@tensorflow/tfjs-layers/dist/layers/convolutional_recurrent.js'
)
) {
// Replace 'this' with 'globalThis' in the problematic code
return {
code : code . replace ( /\bthis\b/g , 'globalThis' ) ,
map : { mappings : '' } // Provide an empty sourcemap to avoid warnings
}
}
return null // Return null to let Rollup handle other files normally
}
}
}
2025-07-04 14:42:33 -07:00
// We no longer need to copy the worker file as we'll bundle it separately
2025-06-24 11:41:30 -07:00
// Get build type from environment variable or default to 'unified'
const buildType = process . env . BUILD _TYPE || 'unified'
// Configuration based on build type
const config = {
unified : {
input : 'src/unified.ts' ,
outputPrefix : 'unified' ,
tsconfig : './tsconfig.unified.json' ,
declaration : true ,
declarationMap : true ,
intro : `
// Buffer polyfill is now included via the buffer-polyfill plugin
`
} ,
browser : {
input : 'src/unified.ts' ,
outputPrefix : 'brainy' ,
tsconfig : './tsconfig.browser.json' ,
declaration : false ,
declarationMap : false ,
intro : `
// Set global for compatibility
var global = typeof window !== "undefined" ? window : this ;
// Buffer polyfill is now included via the buffer-polyfill plugin
`
}
}
// Get configuration for the current build type
const buildConfig = config [ buildType ]
// Create the rollup configuration
2025-07-01 10:39:12 -07:00
const mainConfig = {
2025-06-24 11:41:30 -07:00
input : buildConfig . input ,
output : [
{
dir : 'dist' ,
entryFileNames : ` ${ buildConfig . outputPrefix } .js ` ,
format : 'es' ,
sourcemap : true ,
inlineDynamicImports : true ,
intro : buildConfig . intro
} ,
{
dir : 'dist' ,
entryFileNames : ` ${ buildConfig . outputPrefix } .min.js ` ,
format : 'es' ,
sourcemap : true ,
inlineDynamicImports : true ,
intro : buildConfig . intro ,
plugins : [ terser ( ) ]
}
] ,
plugins : [
// Add environment replacement for unified build
... ( buildType === 'unified'
? [
replace ( {
preventAssignment : true ,
'process.env.NODE_ENV' : JSON . stringify ( 'production' )
} )
]
: [ ] ) ,
// Add our custom plugins
fixThisReferences ( ) ,
nodeModuleShims ( ) ,
bufferPolyfill ( ) , // Add Buffer polyfill
resolve ( {
browser : true ,
preferBuiltins : false
} ) ,
commonjs ( {
transformMixedEsModules : true
} ) ,
json ( ) ,
typescript ( {
tsconfig : buildConfig . tsconfig ,
declaration : buildConfig . declaration ,
declarationMap : buildConfig . declarationMap
} )
] ,
external : [
// Add any dependencies you want to exclude from the bundle
'@aws-sdk/client-s3' ,
'@smithy/util-stream' ,
'@smithy/node-http-handler' ,
'@aws-crypto/crc32c' ,
2025-07-01 10:39:12 -07:00
'node:stream/web' ,
2025-07-02 16:16:19 -07:00
'node:worker_threads' ,
2025-07-02 16:52:44 -07:00
'worker_threads' ,
2025-07-02 16:16:19 -07:00
'node:fs' ,
2025-07-02 16:52:44 -07:00
'node:path' ,
'fs' ,
'path'
2025-06-24 11:41:30 -07:00
]
}
2025-07-01 10:39:12 -07:00
2025-07-04 14:42:33 -07:00
// Create a separate configuration for the worker.ts file
const workerConfig = {
input : 'src/worker.ts' ,
output : {
file : 'dist/worker.js' ,
format : 'es' ,
sourcemap : true
} ,
plugins : [
// Add environment replacement
replace ( {
preventAssignment : true ,
'process.env.NODE_ENV' : JSON . stringify ( 'production' )
} ) ,
// Add our custom plugins
fixThisReferences ( ) ,
nodeModuleShims ( ) ,
bufferPolyfill ( ) , // Add Buffer polyfill
resolve ( {
browser : true ,
preferBuiltins : false
} ) ,
commonjs ( {
transformMixedEsModules : true
} ) ,
json ( ) ,
typescript ( {
tsconfig : './tsconfig.unified.json'
} )
] ,
external : [
// Add any dependencies you want to exclude from the bundle
'@aws-sdk/client-s3' ,
'@smithy/util-stream' ,
'@smithy/node-http-handler' ,
'@aws-crypto/crc32c' ,
'node:stream/web' ,
'node:worker_threads' ,
'worker_threads' ,
'node:fs' ,
'node:path' ,
'fs' ,
'path'
]
2025-07-15 11:53:26 -07:00
}
2025-07-04 14:42:33 -07:00
// Export both configurations
2025-07-15 11:53:26 -07:00
export default [ mainConfig , workerConfig ]