/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See https://github.com/microsoft/monaco-languages/blob/master/LICENSE.md *--------------------------------------------------------------------------------------------*/ /* eslint-disable no-useless-escape */ /* eslint-disable @gitlab/require-i18n-strings */ const conf = { comments: { lineComment: '//', blockComment: ['/*', '*/'], }, brackets: [ ['{', '}'], ['[', ']'], ['(', ')'], ], autoClosingPairs: [ { open: '{', close: '}' }, { open: '[', close: ']' }, { open: '(', close: ')' }, { open: '"', close: '"', notIn: ['string'] }, ], surroundingPairs: [ { open: '{', close: '}' }, { open: '[', close: ']' }, { open: '(', close: ')' }, { open: '"', close: '"' }, ], }; const language = { defaultToken: '', tokenPostfix: '.hcl', keywords: [ 'var', 'local', 'path', 'for_each', 'any', 'string', 'number', 'bool', 'true', 'false', 'null', 'if ', 'else ', 'endif ', 'for ', 'in', 'endfor', ], operators: [ '=', '>=', '<=', '==', '!=', '+', '-', '*', '/', '%', '&&', '||', '!', '<', '>', '?', '...', ':', ], symbols: /[=>](?!@symbols)/, '@brackets'], [ /@symbols/, { cases: { '@operators': 'operator', '@default': '', }, }, ], // numbers [/\d*\d+[eE]([\-+]?\d+)?/, 'number.float'], [/\d*\.\d+([eE][\-+]?\d+)?/, 'number.float'], [/\d[\d']*/, 'number'], [/\d/, 'number'], [/[;,.]/, 'delimiter'], // delimiter: after number because of .\d floats // strings [/"/, 'string', '@string'], // this will include expressions [/'/, 'invalid'], ], heredoc: [ [ /<<[-]*\s*["]?([\w\-]+)["]?/, { token: 'string.heredoc.delimiter', next: '@heredocBody.$1' }, ], ], heredocBody: [ [ /([\w\-]+)$/, { cases: { '$1==$S2': [ { token: 'string.heredoc.delimiter', next: '@popall', }, ], '@default': 'string.heredoc', }, }, ], [/./, 'string.heredoc'], ], whitespace: [ [/[ \t\r\n]+/, ''], [/\/\*/, 'comment', '@comment'], [/\/\/.*$/, 'comment'], [/#.*$/, 'comment'], ], comment: [ [/[^\/*]+/, 'comment'], [/\*\//, 'comment', '@pop'], [/[\/*]/, 'comment'], ], string: [ [/\$\{/, { token: 'delimiter', next: '@stringExpression' }], [/[^\\"\$]+/, 'string'], [/@escapes/, 'string.escape'], [/\\./, 'string.escape.invalid'], [/"/, 'string', '@popall'], ], stringInsideExpression: [ [/[^\\"]+/, 'string'], [/@escapes/, 'string.escape'], [/\\./, 'string.escape.invalid'], [/"/, 'string', '@pop'], ], stringExpression: [ [/\}/, { token: 'delimiter', next: '@pop' }], [/"/, 'string', '@stringInsideExpression'], { include: '@terraform' }, ], }, }; export default { id: 'hcl', extensions: ['.tf', '.tfvars', '.hcl'], aliases: ['Terraform', 'tf', 'HCL', 'hcl'], conf, language, };