{
  // Place your portainer workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
  // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
  // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
  // used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
  // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
  // Placeholders with the same ids are connected.
  // Example:
  // "Print to console": {
  // 	"scope": "javascript,typescript",
  // 	"prefix": "log",
  // 	"body": [
  // 		"console.log('$1');",
  // 		"$2"
  // 	],
  // 	"description": "Log output to console"
  // }
  "React Named Export Component": {
    "prefix": "rnec",
    "body": [
      "export function $TM_FILENAME_BASE() {",
      "  return <div>$TM_FILENAME_BASE</div>;",
      "}"
    ],
    "description": "React Named Export Component"
  },
  "Component": {
    "scope": "javascript",
    "prefix": "mycomponent",
    "description": "Dummy Angularjs Component",
    "body": [
      "import angular from 'angular';",
      "import controller from './${TM_FILENAME_BASE}Controller'",
      "",
      "angular.module('portainer.${TM_DIRECTORY/.*\\/app\\/([^\\/]*)(\\/.*)?$/$1/}').component('$TM_FILENAME_BASE', {",
      "  templateUrl: './$TM_FILENAME_BASE.html',",
      "  controller,",
      "});",
      ""
    ]
  },
  "Controller": {
    "scope": "javascript",
    "prefix": "mycontroller",
    "body": [
      "class ${TM_FILENAME_BASE/(.*)/${1:/capitalize}/} {",
      "\t/* @ngInject */",
      "\tconstructor($0) {",
      "\t}",
      "}",
      "",
      "export default ${TM_FILENAME_BASE/(.*)/${1:/capitalize}/};"
    ],
    "description": "Dummy ES6+ controller"
  },
  "Service": {
    "scope": "javascript",
    "prefix": "myservice",
    "description": "Dummy ES6+ service",
    "body": [
      "import angular from 'angular';",
      "import PortainerError from 'Portainer/error';",
      "",
      "class $1 {",
      "  /* @ngInject */",
      "  constructor(\\$async, $0) {",
      "    this.\\$async = \\$async;",
      "",
      "    this.getAsync = this.getAsync.bind(this);",
      "    this.getAllAsync = this.getAllAsync.bind(this);",
      "    this.createAsync = this.createAsync.bind(this);",
      "    this.updateAsync = this.updateAsync.bind(this);",
      "    this.deleteAsync = this.deleteAsync.bind(this);",
      "  }",
      "",
      "  /**",
      "   * GET",
      "   */",
      "  async getAsync() {",
      "    try {",
      "",
      "    } catch (err) {",
      "      throw new PortainerError('', err);",
      "    }",
      "  }",
      "",
      "  async getAllAsync() {",
      "    try {",
      "",
      "    } catch (err) {",
      "      throw new PortainerError('', err);",
      "    }",
      "  }",
      "",
      "  get() {",
      "    if () {",
      "      return this.\\$async(this.getAsync);",
      "    }",
      "    return this.\\$async(this.getAllAsync);",
      "  }",
      "",
      "  /**",
      "   * CREATE",
      "   */",
      "  async createAsync() {",
      "    try {",
      "",
      "    } catch (err) {",
      "      throw new PortainerError('', err);",
      "    }",
      "  }",
      "",
      "  create() {",
      "    return this.\\$async(this.createAsync);",
      "  }",
      "",
      "  /**",
      "   * UPDATE",
      "   */",
      "  async updateAsync() {",
      "    try {",
      "",
      "    } catch (err) {",
      "      throw new PortainerError('', err);",
      "    }",
      "  }",
      "",
      "  update() {",
      "    return this.\\$async(this.updateAsync);",
      "  }",
      "",
      "  /**",
      "   * DELETE",
      "   */",
      "  async deleteAsync() {",
      "    try {",
      "",
      "    } catch (err) {",
      "      throw new PortainerError('', err);",
      "    }",
      "  }",
      "",
      "  delete() {",
      "    return this.\\$async(this.deleteAsync);",
      "  }",
      "}",
      "",
      "export default $1;",
      "angular.module('portainer.${TM_DIRECTORY/.*\\/app\\/([^\\/]*)(\\/.*)?$/$1/}').service('$1', $1);"
    ]
  },
  "swagger-api-doc": {
    "prefix": "swapi",
    "scope": "go",
    "description": "Snippet for a api doc",
    "body": [
      "// @id ",
      "// @summary ",
      "// @description ",
      "// @description **Access policy**: ",
      "// @tags ",
      "// @security ApiKeyAuth",
      "// @security jwt",
      "// @accept json",
      "// @produce json",
      "// @param id path int true \"identifier\"",
      "// @param body body Object true \"details\"",
      "// @success 200 {object} portainer. \"Success\"",
      "// @success 204 \"Success\"",
      "// @failure 400 \"Invalid request\"",
      "// @failure 403 \"Permission denied\"",
      "// @failure 404 \" not found\"",
      "// @failure 500 \"Server error\"",
      "// @router /{id} [get]"
    ]
  },
  "analytics": {
    "prefix": "nlt",
    "body": ["analytics-on", "analytics-category=\"$1\"", "analytics-event=\"$2\""],
    "description": "analytics"
  },
  "analytics-if": {
    "prefix": "nltf",
    "body": ["analytics-if=\"$1\""],
    "description": "analytics"
  },
  "analytics-metadata": {
    "prefix": "nltm",
    "body": "analytics-properties=\"{ metadata: { $1 } }\""
  }
}
