Comprehensive language support for ISL (Intuitive Scripting Language) - a powerful JSON transformation scripting language.
ISL is a low-code interpreted scripting language and runtime container designed to provide developers and non-developers an easy way to write, test, and deploy user developed code inside any service.
The ISL supports an intuitive simplified syntax with features that make data acquisition and data transformations easy with minimal lines of code. In addition, the language supports easy extensibility allowing it to be used as a multi-purpose service extensibility language.
The ISL can be embedded in any JVM based project to provide runtime based extensibility through a fast and lightweight runtime.
In the most simple form the ISL is a JSON transformation language:
Given Input JSON:
{
"title": "IPod Nano - 8GB",
"body_html": "It's the small iPod with a big idea: Video.",
"id": 632910392,
"images": [
{
"id": 850703190,
"src": "http://example.com/burton.jpg",
}
],
"options": {
"name": "Color",
"values": [
"Pink",
"Red",
"Green",
"Black"
]
},
"status": "active",
"tags": "Emotive, Flash Memory, MP3, Music",
"updated_at": 1645004735,
"vendor": "Apple"
}And Transformation:
fun transform( $input ){
return {
// Simple JSON Path Selectors
id: $input.id,
// piped modifiers using `|`
name: $input.title | trim,
// easy string building using interpolation ` ... `
short_description: `${ $input.title } by ${ $input.vendor }`,
// child object building
primary_image: {
id: $input.images[0].id,
url: $input.images[0].src
},
// conditional properties
is_active: if( $input.status == "active" ) true else false,
option_name: $input.options.name,
// array to csv
option_values: $input.options.values | join(','),
// date processing
updated: $input.updated_at | date.fromEpochSeconds | to.string("yyyy-MM-dd HH:mm")
}
}Will output:
{
"id": 632910392,
"name": "IPod Nano - 8GB",
"short_description": "IPod Nano - 8GB by Apple",
"primary_image": {
"id": 850703190,
"url": "http://example.com/burton.jpg"
},
"is_active": true,
"option_name": "Color",
"option_values": "Pink,Red,Green,Black",
"updated": "2022-02-47 09:45"
}- Complete syntax highlighting for all ISL constructs
- String interpolation:
${variable},{{math}},@.Function() - Modifiers, operators, control flow, and more
NEW! Define your own project-specific functions and modifiers:
- Create a
.islextensionsfile in your workspace root - Or configure a global source (URL or file path) shared across all projects
- Define custom functions and modifiers with full type information
- Get IntelliSense, hover documentation, and validation for your extensions
- Auto-reload when definitions change
- Workspace-local files override global source for project-specific extensions
- Learn more about ISL Extensions
Built-in definitions: All built-in functions and modifiers (e.g. date.fromEpochSeconds, Math.sum, trim) are defined in isl-language.json at the plugin root. Edit that file to add or change built-ins; completion, hover, signatures, and validation all use it as the single source of truth.
Smart completion for:
- Keywords:
fun,foreach,if,switch, etc. - Services:
@.Date,@.Math,@.String, etc. - Modifiers:
|filter,|map,|trim,|upperCase, 50+ more - Variables: Automatic discovery from your code
Real-time error detection:
- Balanced braces, brackets, parentheses
- Control flow matching (
if/endif,foreach/endfor, etc.) - Undefined functions and modifiers
- Undeclared variable usage
- Invalid syntax and semantic errors
Hover over any element for:
- Keyword syntax and usage
- Service method descriptions
- Modifier documentation with examples
- Variable type information
- Simplify string interpolation (
${$var}→$var) - Convert
:to=for variable assignments - Format long objects onto multiple lines
- Replace
default()with??operator
- Automatic indentation and spacing
- Parameter spacing normalization
- Modifier chain alignment
- Multi-line string preservation
- Format on save support
- Parameter hints for functions and modifiers
- Inline type annotations for variables
- CodeLens actions (test functions, find usages)
- Run transformations directly from editor
- Test with inline JSON or external files
- View formatted output side-by-side
- Integrated error reporting
20+ ready-to-use snippets for:
- Functions and modifiers
- Control flow patterns
- Array and object transformations
- Date operations
- Error handling
- Install the extension
- Open or create a
.islfile - Start coding with full language support!
Want IntelliSense for your project-specific functions and modifiers?
Option 1: Project-specific (workspace-local)
- Create a
.islextensionsfile in your workspace root - Define your custom functions and modifiers in JSON format
- Enjoy full IDE support for your extensions!
Option 2: Global source (shared across projects)
- Configure
isl.extensions.sourcein VS Code settings - Set to a URL (e.g.,
https://example.com/extensions.json) or file path - All projects automatically use these extensions
- Override with workspace-local
.islextensionswhen needed
Example .islextensions:
{
"functions": [
{
"name": "sendEmail",
"description": "Sends an email via custom service",
"parameters": [
{"name": "to", "type": "String"},
{"name": "subject", "type": "String"},
{"name": "body", "type": "String"}
]
}
],
"modifiers": [
{
"name": "formatPhone",
"description": "Formats phone numbers",
"parameters": [
{"name": "format", "type": "String", "optional": true}
]
}
]
}See ISL Extensions Documentation for complete details.
fun run($input) {
$customers = foreach $customer in $input.customers
{
id: $customer.id | to.string,
name: `${$customer.first} ${$customer.last}` | trim,
email: $customer.email | lowerCase,
orders: $customer.orders | filter($order.status == "completed")
}
endfor
return {
customers: $customers,
total: $customers | length,
processed: @.Date.Now() | to.string("yyyy-MM-dd")
}
}Available settings (all prefixed with isl.):
{
"isl.validation.enabled": true,
"isl.formatting.enabled": true,
"isl.formatting.indentSize": 4,
"isl.formatting.useTabs": false,
"isl.formatting.alignProperties": false,
"isl.execution.islCommand": "isl",
"isl.execution.javaHome": "",
"isl.extensions.source": "",
"isl.extensions.cacheTTL": 3600
}Extension Settings:
isl.extensions.source: Global source for.islextensions(URL or file path). Workspace-local files take precedence.isl.extensions.cacheTTL: Cache TTL in seconds for URL-based extensions (default: 3600 = 1 hour).
- ISL: Validate Current File - Run validation
- ISL: Run Transformation - Execute with inline input
- ISL: Run Transformation with Input File - Execute with JSON file
- ISL: Format Document - Format code
- ISL: Open Documentation - Open ISL docs
If the extension doesn't work in Windsurf (commands not found, no Output panel):
-
Check Developer Tools – Open Help → Toggle Developer Tools (or Developer: Toggle Developer Tools from Command Palette). Check the Console tab for errors when loading the extension or when activating it.
-
Check Extension Host – In the Output panel, select Extension Host from the dropdown. Look for activation errors or stack traces.
-
Verify installation – Ensure you're using Windsurf 1.89+ if required. Reinstall the extension: uninstall, then install from the
.vsixfile again. -
Activation errors – If activation fails, the extension now shows an error message. Check Output → ISL Language Support for details.
To execute ISL transformations:
- Java Runtime Environment (JRE) 11+
- The extension bundles an embedded ISL CLI (
plugin/lib/isl-cmd-all.jar) and debug adapter (plugin/lib/isl-debug-adapter-all.jar) — no separate install needed
When developing the extension with ISL changes, rebuild and copy both fat JARs:
# From the repository root (one command)
./gradlew buildPluginLibLocalUse buildIslRuntimeLocal or buildDebugAdapterLocal alone if you only changed the CLI or only the debug adapter.
See lib/README.md for details.
This extension includes AI configuration for Cursor, Windsurf, GitHub Copilot, and other AI editors. Your AI assistant automatically understands ISL syntax and can help write transformations.
Ask your AI to:
- Generate ISL transformations
- Explain ISL syntax and modifiers
- Convert data logic to ISL
- Debug and optimize code
- ISL Documentation
- ISL GitHub Repository
- Language Reference
- Quick Start Guide
- ISL Extensions Guide - Define custom functions and modifiers
- Example
.islextensionsfile
Major improvements:
- Signature help and inlay hints
- Code actions and quick fixes
- Enhanced formatter (parameter spacing, nested control flow)
- Semantic validation (undefined functions/modifiers, variable tracking)
- 20+ new code snippets
- Better control flow balance detection
- Multi-line string preservation
Initial release with syntax highlighting, completion, validation, formatting, and execution support.
See CHANGELOG.md for full details.
Found a bug or have a feature request? File an issue on GitHub.
Apache License 2.0 - See LICENSE file.
Enjoy using ISL! 🚀