applyJsEvalTransform function
Apply JavaScript evaluation transform to extract variables from JS code
Executes JavaScript code using the registered JS executor and extracts specified variables. Requires JsExecutorRegistry to be configured.
Parameters
value- JavaScript code to execute (as string)variableNames- Optional comma-separated list of variable names to extract
Variable Extraction Modes
- Auto-detect:
jseval- Executor determines which variables to extract - Single variable:
jseval:config- Extract one variable - Multiple variables:
jseval:userId,userName- Extract multiple variables - Wildcard patterns:
jseval:flashvars_*- Extract matching variables
Setup Required
Before using jseval transforms, register a JS executor:
import 'package:web_query/js.dart';
JsExecutorRegistry.register(FlutterJsExecutor());
Returns
- Extracted variable value(s) as determined by the JS executor
- null if executor not configured, execution fails, or value is null/empty
Examples
// Setup
JsExecutorRegistry.register(FlutterJsExecutor());
// Single variable
applyJsEvalTransform('var x = 42;', 'x'); // 42
// Multiple variables
applyJsEvalTransform('var a = 1; var b = 2;', 'a,b');
// Returns structured result with both values
// Auto-detect
applyJsEvalTransform('var config = {...};', null);
// Executor determines what to extract
Error Handling
- Missing executor: logs warning with setup instructions, returns null
- Execution errors: logs warning, returns null
- Empty script: returns null
Implementation
dynamic applyJsEvalTransform(dynamic value, String? variableNames) {
if (value == null) return null;
try {
// Get JS executor from registry
final jsExecutor = JsExecutorRegistry.instance;
if (jsExecutor == null) {
_log.warning(
'JavaScript executor not configured. Use: import "package:web_query/js.dart"; configureJsExecutor(FlutterJsExecutor());');
return null;
}
final script = value.toString().trim();
if (script.isEmpty) return null;
// Parse variable names if provided
List<String>? varList;
if (variableNames != null && variableNames.isNotEmpty) {
varList = variableNames.split(',').map((e) => e.trim()).toList();
}
// Execute JavaScript synchronously using flutter_js
// flutter_js evaluate() is synchronous, so this works
final result = jsExecutor.extractVariablesSync(script, varList);
return result;
} catch (e) {
_log.warning('Failed to execute JavaScript: $e');
return null;
}
}