applyJsEvalTransform function

dynamic applyJsEvalTransform(
  1. dynamic value,
  2. String? variableNames
)

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;
  }
}