eslint-plugin-sfmc
v0.1.3
Published
ESLint plugin for Salesforce Marketing Cloud — AMPscript and Server-Side JavaScript (SSJS)
Maintainers
Readme
eslint-plugin-sfmc
Unified ESLint plugin for Salesforce Marketing Cloud — linting rules for both AMPscript and Server-Side JavaScript (SSJS).
Installation
npm install eslint-plugin-sfmc --save-devRequires ESLint 9+ (flat config).
Quick Start
// 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,
];Configs
| 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 ....
AMPscript Rules (amp-*)
| 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 |
SSJS Rules (ssjs-*)
| 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 |
Processors
| 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 |
License
MIT
