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,
];| 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 ....
| 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-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 usage |
sfmc/ssjs-no-unsupported-syntax |
error |
Flag ES6+ syntax not supported by SFMC |
sfmc/ssjs-no-unknown-platform-function |
error |
Disallow unknown Platform.Function.* methods |
sfmc/ssjs-platform-function-arity |
error |
Enforce correct arity for Platform.Function.* |
sfmc/ssjs-no-unknown-http-method |
error |
Disallow unknown HTTP.* methods |
sfmc/ssjs-no-unknown-platform-variable |
error |
Disallow unknown Platform.Variable.* methods |
sfmc/ssjs-no-unknown-platform-response |
error |
Disallow unknown Platform.Response.* methods |
sfmc/ssjs-no-unknown-platform-request |
error |
Disallow unknown Platform.Request.* methods |
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-no-unknown-platform-client-browser |
error |
Disallow unknown Platform.ClientBrowser.* methods |
sfmc/ssjs-no-unknown-core-method |
warn |
Disallow unknown methods on Core library objects |
sfmc/ssjs-no-unknown-wsproxy-method |
warn |
Disallow unknown WSProxy methods |
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 |
| 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