Unified ESLint plugin for Salesforce Marketing Cloud — linting rules for both AMPscript and Server-Side JavaScript (SSJS).
npm install eslint-plugin-sfmc --save-devRequires ESLint 9+ (flat config).
// eslint.config.js
import sfmc from 'eslint-plugin-sfmc';
export default [
// Lint standalone .ampscript/.amp and .ssjs files
...sfmc.configs.recommended,
// Lint AMPscript + SSJS embedded in .html files
...sfmc.configs.embedded,
];To see eslint(sfmc/...) diagnostics in VS Code for .amp, .ssjs, and .html files you need the VS Code ESLint extension to validate the custom SFMC language IDs.
Option A — Install vscode-sfmc-language (recommended)
The SFMC Language Service extension contributes the SFMC language IDs and automatically configures eslint.validate for you. No manual settings required.
Option B — Manual configuration
Add the following to your .vscode/settings.json:
{
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"html",
"vue",
"markdown",
"ampscript",
"ssjs",
"sfmc"
]
}Why
eslint.validateand noteslint.probe?eslint.probesilently skips files for language IDs that the ESLint extension does not natively recognise.eslint.validateforces the extension to process those files regardless of language ID.
| Config | Files | What it does |
|---|---|---|
sfmc.configs.ampscript |
**/*.ampscript, **/*.amp |
AMPscript rules only (recommended severity) |
sfmc.configs.ssjs |
**/*.ssjs |
SSJS rules only (recommended severity) |
sfmc.configs.recommended |
Both of the above | All rules at recommended severity for standalone files |
sfmc.configs.embedded |
**/*.html |
Combined processor extracts both languages from HTML |
sfmc.configs.strict |
All of the above + HTML | All rules at error severity for standalone and embedded |
recommended, embedded, and strict are arrays — spread them with ....
Use the -next config variants when targeting Marketing Cloud Next (MCN). MCN supports only a subset of AMPscript functions and does not support SSJS at all.
| Config | Files | What it does |
|---|---|---|
sfmc.configs['ampscript-next'] |
**/*.ampscript, **/*.amp |
AMPscript rules + flags functions unsupported in MCN (single config object) |
sfmc.configs['ssjs-next'] |
**/*.ssjs |
Flags all SSJS API calls as MCN-unsupported; all other SSJS quality rules disabled |
sfmc.configs['recommended-next'] |
Both of the above | AMPscript MCN-aware + SSJS flagged for standalone files |
sfmc.configs['embedded-next'] |
**/*.html |
AMPscript MCN-aware + SSJS flagged for HTML-embedded code |
sfmc.configs['strict-next'] |
All of the above + HTML | All AMPscript rules at error severity + MCN flag; SSJS fully flagged |
recommended-next, embedded-next, and strict-next are arrays — spread them with ....
// eslint.config.js — targeting Marketing Cloud Next
import sfmc from 'eslint-plugin-sfmc';
export default [
...sfmc.configs['recommended-next'],
...sfmc.configs['embedded-next'],
];| Rule | Default | Description |
|---|---|---|
sfmc/amp-no-unknown-function |
error |
Disallow calls to unknown AMPscript functions |
sfmc/amp-function-arity |
error |
Enforce correct argument counts |
sfmc/amp-arg-types |
error |
Check that literal arguments match expected parameter types and allowed values |
sfmc/amp-set-requires-target |
error |
Require set to have a target variable |
sfmc/amp-no-smart-quotes |
error |
Disallow smart/curly quotes in strings |
sfmc/amp-no-var-redeclaration |
warn |
Disallow re-declaring a variable with var |
sfmc/amp-no-empty-block |
warn |
Disallow empty %%[ ]%% blocks |
sfmc/amp-no-loop-counter-assign |
warn |
Disallow assigning to the for loop counter |
sfmc/amp-no-inline-statement |
warn |
Disallow statements inside inline expressions |
sfmc/amp-no-deprecated-function |
warn |
Flag deprecated functions and suggest replacements |
sfmc/amp-naming-convention |
warn |
Enforce variable naming convention |
sfmc/amp-no-empty-then |
warn |
Disallow IF with empty THEN branch |
sfmc/amp-require-rowcount-check |
warn |
Require RowCount check before FOR on LookupRows |
sfmc/amp-no-html-comment |
warn |
Disallow HTML comments inside AMPscript blocks |
sfmc/amp-no-js-line-comment |
warn |
Disallow JS-style // line comments in AMPscript |
sfmc/amp-no-nested-script-tag |
error |
Disallow <script> tags nested inside AMPscript script tags |
sfmc/amp-no-nested-ampscript-delimiter |
error |
Disallow AMPscript delimiters nested inside AMPscript blocks |
sfmc/amp-prefer-attribute-value |
off | Prefer AttributeValue() over bare personalization |
sfmc/amp-require-variable-declaration |
off | Require var before set |
sfmc/amp-no-email-excluded-function |
off | Flag functions unavailable in email context |
| Rule | Default | Description |
|---|---|---|
sfmc/ssjs-require-platform-load |
error |
Require Platform.Load("core") before Core or requiresCoreLoad globals |
sfmc/ssjs-no-unsupported-syntax |
error |
Flag ES6+ syntax not supported by SFMC |
sfmc/ssjs-no-unknown-function |
error |
Disallow unknown methods on Platform.*, HTTP, Core Library, and WSProxy |
sfmc/ssjs-no-deprecated-function |
error |
Flag use of deprecated SFMC SSJS APIs (e.g. ContentArea, ContentAreaObj) |
sfmc/ssjs-no-property-call |
error |
Disallow calling Platform.Request/Response properties as functions |
sfmc/ssjs-platform-function-arity |
error |
Enforce correct arity for Platform.Function.* |
sfmc/ssjs-require-platform-load-order |
error |
Require Platform.Load() before Core usage in order |
sfmc/ssjs-no-hardcoded-credentials |
error |
Flag hardcoded keys in encryption calls |
sfmc/ssjs-cache-loop-length |
warn |
Require caching .length in for-loops |
sfmc/ssjs-require-hasownproperty |
warn |
Require hasOwnProperty guard in for-in loops |
sfmc/ssjs-prefer-platform-load-version |
warn |
Enforce a minimum Platform.Load version string |
sfmc/ssjs-no-unavailable-method |
warn |
Flag Array/String methods unavailable or broken in SFMC's ES3 engine |
sfmc/ssjs-prefer-parsejson-safe-arg |
warn |
Require string coercion on ParseJSON argument |
sfmc/ssjs-no-switch-default |
warn |
Disallow default clause in switch statements |
sfmc/ssjs-no-treatascontent-injection |
warn |
Flag dynamic string concatenation in TreatAsContent calls |
sfmc/ssjs-core-method-arity |
warn |
Enforce correct argument counts for Core Library object methods |
sfmc/ssjs-arg-types |
warn |
Check that literal arguments match expected parameter types |
| Processor | Purpose |
|---|---|
sfmc/ampscript |
Extract %%[ ]%%, %%= =%%, <script language="ampscript"> |
sfmc/ssjs |
Extract <script runat="server"> (non-ampscript) |
sfmc/sfmc |
Combined: extracts both AMPscript and SSJS from HTML |
MIT