From b1952b8acb909830899a60c6d343c0710a361539 Mon Sep 17 00:00:00 2001 From: Kevin MacMartin Date: Fri, 8 Mar 2024 18:29:50 -0500 Subject: [PATCH] Replace sass-lint with stylelint --- README.md | 19 --- readme.md | 59 +++++++ sass-lint.yml | 431 -------------------------------------------------- stylelintrc | 394 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 453 insertions(+), 450 deletions(-) delete mode 100644 README.md create mode 100644 readme.md delete mode 100644 sass-lint.yml create mode 100644 stylelintrc diff --git a/README.md b/README.md deleted file mode 100644 index dbd5f0d..0000000 --- a/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Linter Configs - -Configurations for linters used at WNY - -## SCSS - -* Linter: [sass-lint](https://github.com/sasstools/sass-lint) -* Config: `sass-lint.yml` -* Install: `~/.sass-lint.yml` - -## Javascript - -* Linter: [eslint](https://github.com/eslint/eslint) -* Modules: - * [@babel/eslint-parser](https://github.com/babel/babel-eslint) - * [eslint-plugin-vue@next](https://github.com/vuejs/eslint-plugin-vue) - * [eslint-plugin-json](https://github.com/azeemba/eslint-plugin-json) -* Config: `eslintrc` -* Install: `~/.eslintrc` diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..f990f20 --- /dev/null +++ b/readme.md @@ -0,0 +1,59 @@ +# Linter Configs + +Linters @ Williams New York + +## SCSS + +### Packages + +* Linter: + * [stylelint](https://github.com/stylelint/stylelint) +* Modules: + * [stylelint-config-recommended-scss](https://github.com/stylelint-scss/stylelint-config-recommended-scss) + * [stylelint-order](https://github.com/hudochenkov/stylelint-order) + * [stylelint-stylistic](https://github.com/stylelint-stylistic/stylelint-stylistic) + +#### Install + +``` +npm install -g stylelint stylelint-config-recommended-scss stylelint-order @stylistic/stylelint-plugin +``` + +### Config + +Repo: `stylelintrc` +System: `~/.stylelintrc` + +#### Install + +``` +ln -s "$(readlink -f stylelintrc)" ~/.stylelintrc +``` + +## Javascript + +### Packages + +* Linter: + * [eslint](https://github.com/eslint/eslint) +* Modules: + * [@babel/eslint-parser](https://github.com/babel/babel-eslint) + * [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue) + * [eslint-plugin-json](https://github.com/azeemba/eslint-plugin-json) + +#### Install + +``` +npm install -g eslint @babel/eslint-parser eslint-plugin-vue eslint-plugin-json +``` + +### Config + +Repo: `eslintrc` +System: `~/.eslintrc` + +#### Install + +``` +ln -s "$(readlink -f eslintrc)" ~/.eslintrc +``` diff --git a/sass-lint.yml b/sass-lint.yml deleted file mode 100644 index 4f014ba..0000000 --- a/sass-lint.yml +++ /dev/null @@ -1,431 +0,0 @@ -files: - include: '**/*.scss' -options: - formatter: stylish - merge-default-rules: false -rules: - attribute-quotes: - - 1 - - include: true - bem-depth: - - 0 - - max-depth: 1 - border-zero: - - 1 - - convention: zero - brace-style: - - 1 - - style: 1tbs - - allow-single-line: true - class-name-format: - - 0 - - allow-leading-underscore: false - - convention: hyphenatedlowercase - - ignore: [] - clean-import-paths: - - 0 - - filename-extension: false - leading-underscore: false - declarations-before-nesting: 1 - empty-args: - - 1 - - include: false - empty-line-between-blocks: - - 1 - - include: true - - allow-single-line-rulesets: true - extends-before-declarations: 1 - extends-before-mixins: 1 - final-newline: - - 1 - - include: true - force-attribute-nesting: 0 - force-element-nesting: 0 - force-pseudo-nesting: 0 - function-name-format: - - 1 - - allow-leading-underscore: false - convention: hyphenatedlowercase - hex-length: - - 1 - - style: short - hex-notation: - - 1 - - style: lowercase - id-name-format: - - 1 - - allow-leading-underscore: false - - convention: hyphenatedlowercase - indentation: - - 1 - - size: 4 - leading-zero: - - 1 - - include: true - max-file-line-count: - - 0 - - length: 300 - max-line-length: - - 0 - - length: 80 - mixin-name-format: - - 1 - - allow-leading-underscore: false - convention: hyphenatedlowercase - mixins-before-declarations: 0 - nesting-depth: - - 1 - - max-depth: 10 - no-attribute-selectors: 0 - no-color-hex: 0 - no-color-keywords: 1 - no-color-literals: 0 - no-combinators: 0 - no-css-comments: 1 - no-debug: 1 - no-disallowed-properties: - - 0 - - properties: [] - no-duplicate-properties: - - 1 - - exclude: - - src - no-empty-rulesets: 1 - no-extends: 0 - no-ids: 0 - no-important: 0 - no-invalid-hex: 1 - no-mergeable-selectors: 1 - no-misspelled-properties: - - 1 - - extra-properties: [ 'aspect-ratio', 'gap' ] - no-qualifying-elements: - - 1 - - allow-element-with-attribute: true - allow-element-with-class: false - allow-element-with-id: false - no-trailing-whitespace: 1 - no-trailing-zero: 1 - no-transition-all: 0 - no-universal-selectors: 0 - no-url-domains: 0 - no-url-protocols: 0 - no-vendor-prefixes: - - 0 - - additional-identifiers: [] - - excluded-identifiers: [] - - ignore-non-standard: false - no-warn: 1 - one-declaration-per-line: 1 - placeholder-in-extend: 0 - placeholder-name-format: - - 0 - - allow-leading-underscore: false - - convention: hyphenatedlowercase - property-sort-order: - - 1 - - ignore-custom-properties: false - order: - - all - - content - - resize - - empty-cells - - float - - clear - - shape-image-threshold - - shape-margin - - shape-outside - - overflow - - overflow-x - - overflow-y - - z-index - - position - - top - - right - - bottom - - left - - transform - - transform-origin - - transform-style - - perspective - - perspective-origin - - backface-visibility - - margin - - margin-top - - margin-right - - margin-bottom - - margin-left - - visibility - - display - - box-sizing - - width - - min-width - - max-width - - height - - min-height - - max-height - - aspect-ratio - - padding - - padding-top - - padding-right - - padding-bottom - - padding-left - - grid-gap - - grid-area - - grid-row - - grid-row-start - - grid-row-end - - grid-row-gap - - grid-column - - grid-column-start - - grid-column-end - - grid-column-gap - - grid-auto-rows - - grid-auto-flow - - grid-template - - grid-template-areas - - grid-template-rows - - grid-template-columns - - gap - - flex - - flex-basis - - flex-direction - - flex-flow - - flex-grow - - flex-shrink - - flex-wrap - - order - - justify-content - - align-content - - justify-self - - align-items - - align-self - - columns - - column-width - - column-count - - column-gap - - column-rule - - column-rule-color - - column-rule-style - - column-rule-width - - column-fill - - column-span - - caption-side - - table-layout - - vertical-align - - outline - - outline-width - - outline-color - - outline-style - - outline-offset - - border - - border-top - - border-right - - border-bottom - - border-left - - border-width - - border-top-width - - border-right-width - - border-bottom-width - - border-left-width - - border-color - - border-top-color - - border-right-color - - border-bottom-color - - border-left-color - - border-style - - border-top-style - - border-right-style - - border-bottom-style - - border-left-style - - border-radius - - border-top-right-radius - - border-top-left-radius - - border-bottom-right-radius - - border-bottom-left-radius - - border-image - - border-image-source - - border-image-width - - border-image-outset - - border-image-repeat - - border-image-slice - - border-collapse - - border-spacing - - box-shadow - - clip - - clip-path - - mask - - mask-image - - mask-position - - mask-size - - mask-repeat - - mask-mode - - mask-type - - mask-clip - - object-position - - background - - background-color - - background-image - - background-position - - background-position-x - - background-position-y - - background-origin - - background-size - - background-clip - - -webkit-background-clip - - background-repeat - - background-attachment - - background-blend-mode - - color - - -webkit-text-fill-color - - -webkit-text-stroke - - -webkit-text-stroke-width - - -webkit-text-stroke-color - - font - - font-family - - src - - font-size - - font-size-adjust - - font-stretch - - font-variant - - font-weight - - font-style - - quotes - - tab-size - - letter-spacing - - line-height - - word-break - - word-spacing - - word-wrap - - white-space - - direction - - unicode-bidi - - break-after - - page-break-after - - break-before - - page-break-before - - break-inside - - page-break-inside - - text-align - - text-align-last - - text-justify - - text-indent - - text-overflow - - text-transform - - text-decoration - - text-decoration-color - - text-decoration-style - - text-decoration-line - - text-shadow - - text-emphasis - - text-emphasis-color - - filter - - opacity - - transition - - transition-delay - - transition-duration - - transition-property - - transition-timing-function - - animation - - animation-delay - - animation-direction - - animation-duration - - animation-fill-mode - - animation-iteration-count - - animation-name - - animation-play-state - - animation-timing-function - - list-style - - list-style-type - - list-style-position - - list-style-image - - counter-increment - - counter-reset - - scroll-snap-type - - scroll-snap-coordinate - - scroll-snap-destination - - cursor - - -webkit-appearance - - -webkit-font-smoothing - - -moz-osx-font-smoothing - - -webkit-overflow-scrolling - - -ms-overflow-style - property-units: - - 1 - - global: - - ch - - em - - ex - - rem - - cm - - in - - mm - - pc - - pt - - px - - q - - vh - - vw - - vmin - - vmax - - deg - - grad - - rad - - turn - - ms - - s - - Hz - - kHz - - dpi - - dpcm - - dppx - - '%' - per-property: {} - pseudo-element: 0 - quotes: - - 1 - - style: double - shorthand-values: - - 1 - - allowed-shorthands: - - 1 - - 2 - single-line-per-selector: 0 - space-after-bang: - - 1 - - include: false - space-after-colon: - - 1 - - include: true - space-after-comma: - - 1 - - include: true - space-around-operator: - - 0 - - include: true - space-before-bang: - - 1 - - include: true - space-before-brace: - - 1 - - include: true - space-before-colon: - - 1 - - include: false - space-between-parens: - - 1 - - include: false - trailing-semicolon: - - 1 - - include: true - url-quotes: 1 - variable-for-property: - - 0 - - properties: [] - variable-name-format: - - 1 - - allow-leading-underscore: false - convention: hyphenatedlowercase - zero-unit: - - 0 - - include: false diff --git a/stylelintrc b/stylelintrc new file mode 100644 index 0000000..115a7ae --- /dev/null +++ b/stylelintrc @@ -0,0 +1,394 @@ +{ + "extends": [ + "stylelint-config-recommended-scss" + ], + + "plugins": [ + "@stylistic/stylelint-plugin", + "stylelint-order" + ], + + "rules": { + "no-descending-specificity": [ true, { "ignore": [ "selectors-within-list" ] } ], + + "no-empty-source": null, + + "font-family-no-missing-generic-family-keyword": null, + + "at-rule-no-vendor-prefix": true, + + "color-named": [ "never", { "severity": "warning" } ], + + "function-url-no-scheme-relative": true, + + "media-feature-name-no-vendor-prefix": true, + + "selector-no-vendor-prefix": true, + + "function-name-case": "lower", + "selector-type-case": "lower", + "value-keyword-case": "lower", + + "comment-empty-line-before": [ "always", { "except": [ "first-nested" ], "ignore": [ "after-comment", "stylelint-commands" ], "severity": "warning" } ], + "custom-property-empty-line-before": [ "never", { "severity": "warning" } ], + "declaration-empty-line-before": [ "never", { "severity": "warning" } ], + "rule-empty-line-before": [ "always-multi-line", { "except": [ "first-nested" ], "severity": "warning" } ], + + "declaration-block-single-line-max-declarations": [ 1, { "severity": "warning" } ], + + "selector-pseudo-element-colon-notation": [ "single", { "severity": "warning" } ], + + "color-hex-length": [ "short", { "severity": "warning" } ], + + "keyframes-name-pattern": [ "^([a-z][a-z0-9]*)(-[a-z0-9]+)*$", { "severity": "warning", "message": "Expected keyframes name to be kebab-case" } ], + "selector-class-pattern": [ "^([a-z][a-z0-9]*)(-[a-z0-9]+)*$", { "severity": "warning", "message": "Expected selector class name to be kebab-case" } ], + "selector-id-pattern": [ "^([a-z][a-z0-9]*)(-[a-z0-9]+)*$", { "severity": "warning", "message": "Expected selector id name to be kebab-case" } ], + + "font-family-name-quotes": [ "always-unless-keyword", { "severity": "warning" } ], + "function-url-quotes": [ "always", { "severity": "warning" } ], + "selector-attribute-quotes": [ "always", { "severity": "warning" } ], + + "declaration-block-no-redundant-longhand-properties": [ true, { "severity": "warning" } ], + "shorthand-property-no-redundant-values": [ true, { "severity": "warning" } ], + + "comment-whitespace-inside": [ "always", { "severity": "warning" } ], + + "scss/at-each-key-value-single-line": true, + + "scss/at-else-closing-brace-newline-after": [ "always-last-in-chain", { "severity": "warning" } ], + "scss/at-else-closing-brace-space-after": [ "always-intermediate", { "severity": "warning" } ], + "scss/at-else-empty-line-before": [ "never", { "severity": "warning" } ], + "scss/at-else-if-parentheses-space-before": [ "always", { "severity": "warning" } ], + + "scss/at-function-pattern": [ "^([a-z][a-z0-9]*)(-[a-z0-9]+)*$", { "severity": "warning", "message": "Expected function name to be kebab-case" } ], + + "scss/at-import-partial-extension": null, + + "scss/at-if-closing-brace-newline-after": [ "always-last-in-chain", { "severity": "warning" } ], + "scss/at-if-closing-brace-space-after": [ "always-intermediate", { "severity": "warning" } ], + "scss/at-if-no-null": [ true, { "severity": "warning" } ], + + "scss/at-mixin-argumentless-call-parentheses": [ "never", { "severity": "warning" } ], + "scss/at-mixin-parentheses-space-before": [ "never", { "severity": "warning" } ], + "scss/at-mixin-pattern": [ "^([a-z][a-z0-9]*)(-[a-z0-9]+)*$", { "severity": "warning", "message": "Expected mixin name to be kebab-case" } ], + + "scss/dollar-variable-colon-space-after": [ "always-single-line", { "severity": "warning" } ], + "scss/dollar-variable-colon-space-before": [ "never", { "severity": "warning" } ], + "scss/dollar-variable-first-in-block": [ true, { "ignore": [ "comments", "imports" ], "severity": "warning" } ], + "scss/dollar-variable-pattern": [ "^([a-z][a-z0-9]*)(-[a-z0-9]+)*$", { "severity": "warning", "message": "Expected $ variable name to be kebab-case" } ], + + "scss/percent-placeholder-pattern": [ "^([a-z][a-z0-9]*)(-[a-z0-9]+)*$", { "severity": "warning", "message": "Expected % placeholder name to be kebab-case" } ], + + "scss/block-no-redundant-nesting": [ true, { "severity": "warning" } ], + + "scss/comment-no-empty": null, + + "scss/dimension-no-non-numeric-values": [ true, { "severity": "warning" } ], + + "scss/operator-no-newline-after": [ true, { "severity": "warning" } ], + "scss/operator-no-newline-before": [ true, { "severity": "warning" } ], + "scss/operator-no-unspaced": [ true, { "severity": "warning" } ], + + "scss/partial-no-import": true, + + "scss/property-no-unknown": true, + + "scss/selector-no-redundant-nesting-selector": [ true, { "severity": "warning" } ], + + "scss/load-no-partial-leading-underscore": null, + + "scss/no-duplicate-dollar-variables": true, + "scss/no-unused-private-members": [ true, { "severity": "warning" } ], + + "@stylistic/color-hex-case": [ "lower", { "severity": "warning" } ], + + "@stylistic/function-comma-newline-after": [ "always-multi-line", { "severity": "warning" } ], + "@stylistic/function-comma-newline-before": [ "never-multi-line", { "severity": "warning" } ], + "@stylistic/function-comma-space-after": [ "always-single-line", { "severity": "warning" } ], + "@stylistic/function-comma-space-before": [ "never", { "severity": "warning" } ], + "@stylistic/function-max-empty-lines": [ 0, { "severity": "warning" } ], + "@stylistic/function-parentheses-newline-inside": [ "always-multi-line", { "severity": "warning" } ], + "@stylistic/function-parentheses-space-inside": [ "never-single-line", { "severity": "warning" } ], + "@stylistic/function-whitespace-after": [ "always", { "severity": "warning" } ], + + "@stylistic/number-leading-zero": [ "always", { "severity": "warning" } ], + "@stylistic/number-no-trailing-zeros": [ true, { "severity": "warning" } ], + + "@stylistic/string-quotes": [ "double", { "severity": "warning" } ], + + "@stylistic/unit-case": [ "lower", { "severity": "warning" } ], + + "@stylistic/value-list-comma-space-after": [ "always-single-line", { "severity": "warning" } ], + "@stylistic/value-list-comma-space-before": [ "never", { "severity": "warning" } ], + "@stylistic/value-list-max-empty-lines": [ 0, { "severity": "warning" } ], + + "@stylistic/property-case": [ "lower", { "severity": "warning" } ], + + "@stylistic/declaration-block-semicolon-newline-after": [ "always-multi-line", { "severity": "warning" } ], + "@stylistic/declaration-block-semicolon-newline-before": [ "never-multi-line", { "severity": "warning" } ], + "@stylistic/declaration-block-semicolon-space-after": [ "always-single-line", { "severity": "warning" } ], + "@stylistic/declaration-block-semicolon-space-before": [ "never", { "severity": "warning" } ], + "@stylistic/declaration-block-trailing-semicolon": [ "always", { "severity": "warning" } ], + + "@stylistic/block-closing-brace-newline-after": [ "always", { "ignoreAtRules": [ "if", "else" ], "severity": "warning" } ], + "@stylistic/block-closing-brace-empty-line-before": [ "never", { "severity": "warning" } ], + "@stylistic/block-closing-brace-newline-before": [ "always-multi-line", { "severity": "warning" } ], + "@stylistic/block-closing-brace-space-before": [ "always-single-line", { "severity": "warning" } ], + "@stylistic/block-opening-brace-newline-after": [ "always-multi-line", { "severity": "warning" } ], + "@stylistic/block-opening-brace-space-after": [ "always-single-line", { "severity": "warning" } ], + "@stylistic/block-opening-brace-space-before": [ "always", { "severity": "warning" } ], + + "@stylistic/selector-list-comma-newline-before": [ "never-multi-line", { "severity": "warning" } ], + "@stylistic/selector-list-comma-space-after": [ "always-single-line", { "severity": "warning" } ], + "@stylistic/selector-list-comma-space-before": [ "never", { "severity": "warning" } ], + + "@stylistic/at-rule-name-case": [ "lower", { "severity": "warning" } ], + "@stylistic/at-rule-name-newline-after": [ "always-multi-line", { "severity": "warning" } ], + "@stylistic/at-rule-name-space-after": [ "always", { "severity": "warning" } ], + "@stylistic/at-rule-semicolon-newline-after": [ "always", { "severity": "warning" } ], + "@stylistic/at-rule-semicolon-space-before": [ "never", { "severity": "warning" } ], + "@stylistic/media-feature-colon-space-after": [ "always", { "severity": "warning" } ], + "@stylistic/media-feature-name-case": [ "lower", { "severity": "warning" } ], + "@stylistic/media-feature-parentheses-space-inside": [ "never", { "severity": "warning" } ], + "@stylistic/media-feature-range-operator-space-after": [ "always", { "severity": "warning" } ], + "@stylistic/media-feature-range-operator-space-before": [ "always", { "severity": "warning" } ], + + "@stylistic/named-grid-areas-alignment": [ true, { "severity": "warning" } ], + + "@stylistic/indentation": [ 4, { "ignore": [ "value" ], "severity": "warning" } ], + "@stylistic/linebreaks": "unix", + "@stylistic/max-empty-lines": [ 1, { "severity": "warning" } ], + "@stylistic/no-empty-first-line": [ true, { "severity": "warning" } ], + "@stylistic/no-eol-whitespace": [ true, { "severity": "warning" } ], + "@stylistic/no-extra-semicolons": [ true, { "severity": "warning" } ], + "@stylistic/no-missing-end-of-source-newline": [ true, { "severity": "warning" } ], + + "order/order": [ + "dollar-variables", + "declarations", + "custom-properties", + "rules" + ], + + "order/properties-order": [ + "content", + "resize", + "empty-cells", + "float", + "clear", + "shape-image-threshold", + "shape-margin", + "shape-outside", + "overflow", + "overflow-x", + "overflow-y", + "z-index", + "position", + "top", + "right", + "bottom", + "left", + "transform", + "transform-origin", + "transform-style", + "perspective", + "perspective-origin", + "backface-visibility", + "margin", + "margin-top", + "margin-right", + "margin-bottom", + "margin-left", + "visibility", + "display", + "box-sizing", + "width", + "min-width", + "max-width", + "height", + "min-height", + "max-height", + "aspect-ratio", + "padding", + "padding-top", + "padding-right", + "padding-bottom", + "padding-left", + "grid-gap", + "grid-area", + "grid-row", + "grid-row-start", + "grid-row-end", + "grid-row-gap", + "grid-column", + "grid-column-start", + "grid-column-end", + "grid-column-gap", + "grid-auto-rows", + "grid-auto-flow", + "grid-template", + "grid-template-areas", + "grid-template-rows", + "grid-template-columns", + "gap", + "flex", + "flex-basis", + "flex-direction", + "flex-flow", + "flex-grow", + "flex-shrink", + "flex-wrap", + "order", + "justify-content", + "align-content", + "justify-self", + "align-items", + "align-self", + "columns", + "column-width", + "column-count", + "column-gap", + "column-rule", + "column-rule-color", + "column-rule-style", + "column-rule-width", + "column-fill", + "column-span", + "caption-side", + "table-layout", + "vertical-align", + "outline", + "outline-width", + "outline-color", + "outline-style", + "outline-offset", + "border", + "border-top", + "border-right", + "border-bottom", + "border-left", + "border-width", + "border-top-width", + "border-right-width", + "border-bottom-width", + "border-left-width", + "border-color", + "border-top-color", + "border-right-color", + "border-bottom-color", + "border-left-color", + "border-style", + "border-top-style", + "border-right-style", + "border-bottom-style", + "border-left-style", + "border-radius", + "border-top-right-radius", + "border-top-left-radius", + "border-bottom-right-radius", + "border-bottom-left-radius", + "border-image", + "border-image-source", + "border-image-width", + "border-image-outset", + "border-image-repeat", + "border-image-slice", + "border-collapse", + "border-spacing", + "box-shadow", + "clip", + "clip-path", + "mask", + "mask-image", + "mask-position", + "mask-size", + "mask-repeat", + "mask-mode", + "mask-type", + "mask-clip", + "object-position", + "appearance", + "background", + "background-color", + "background-image", + "background-position", + "background-position-x", + "background-position-y", + "background-origin", + "background-size", + "background-clip", + "background-repeat", + "background-attachment", + "background-blend-mode", + "color", + "text-fill-color", + "text-stroke", + "text-stroke-width", + "text-stroke-color", + "font", + "font-family", + "font-size", + "font-size-adjust", + "font-stretch", + "font-variant", + "font-weight", + "font-style", + "font-smoothing", + "quotes", + "tab-size", + "letter-spacing", + "line-height", + "word-break", + "word-spacing", + "word-wrap", + "white-space", + "direction", + "unicode-bidi", + "break-after", + "page-break-after", + "break-before", + "page-break-before", + "break-inside", + "page-break-inside", + "text-align", + "text-align-last", + "text-justify", + "text-indent", + "text-overflow", + "text-transform", + "text-decoration", + "text-decoration-color", + "text-decoration-style", + "text-decoration-line", + "text-shadow", + "text-emphasis", + "text-emphasis-color", + "filter", + "opacity", + "transition", + "transition-delay", + "transition-duration", + "transition-property", + "transition-timing-function", + "animation", + "animation-delay", + "animation-direction", + "animation-duration", + "animation-fill-mode", + "animation-iteration-count", + "animation-name", + "animation-play-state", + "animation-timing-function", + "list-style", + "list-style-type", + "list-style-position", + "list-style-image", + "counter-increment", + "counter-reset", + "scroll-snap-type", + "scroll-snap-coordinate", + "scroll-snap-destination", + "cursor" + ] + } +}