Links:
carlwr/textmate-validate@carlwr/textmate-validateThe following examples use an example grammar grammar.json that can be created with this shell command:
cat >grammar.json <<EOF
{ "patterns": [
{ "match": ".*" }, `# <- a valid regex`
{ "match": ".)" } `# <- INVALID REGEX!`
]
}
EOF
Prerequisites: none; npx will fetch the package from npm on-the-fly
Example:
npx @carlwr/textmate-validate grammar.json || echo "failed!"
# failed!
npx @carlwr/textmate-validate --verbose --verbose grammar.json
# [INFO] number of regexes:
# total: 2
# valid: 1
# invalid: 1
#
# [INFO] valid regex:
# regex: .*
# path: patterns[0].match
#
# [ERROR] invalid regex:
# error: unmatched close parenthesis
# regex: .)
# path: patterns[1].match
#
# [ERROR] validation failed
npx @carlwr/textmate-validate --help # show help
To use a specific onig.wasm instead of letting auto-detection pick one (see Oniguruma engine):
npx @carlwr/textmate-validate --onig-wasm=./path/to/onig.wasm grammar.json
Prerequisites: npm install @carlwr/textmate-validate
Example:
import { validateGrammar, passed, failed, printResult } from '@carlwr/textmate-validate'
const result = await validateGrammar('grammar.json')
passed(result) // false
failed(result) // true
const verbosity = 2
printResult(result, verbosity) // same as the CLI output above
JSON.stringify(result, null, 2)
// [
// {
// "rgx": ".*",
// "loc": "patterns[0].match",
// "valid": true
// },
// {
// "rgx": ".)",
// "loc": "patterns[1].match",
// "valid": false,
// "err": "unmatched close parenthesis"
// }
// ]
For a given TextMate grammar, the regexes in it are extracted and then validated.
Validation is done by exercising each regex with the Oniguruma regex engine, which is what VS Code uses.
Extracting the regexes:
Validating the extracted regexes:
The package uses the Oniguruma WASM binary of vscode-oniguruma.
This is a design decision and comes with benefits and drawbacks:
onig.wasm file that vscode-oniguruma includesThe auto-detection can be bypassed by specifying the path directly; when specified, only that file is used:
--onig-wasm=<path-to-onig.wasm>setOnigWasmPath(<path-to-onig.wasm>)The package is intended to be used as a validation check for generated or hand-written TextMate grammars for VSCode, typically as part of a build script, CI pipeline, prepublish package.json lifecycle hook, etc. It complements the following that are also useful in a similar context:
General:
borama)apeth 2014)*.md files in documentation/ of RedCMD/TmLanguage-Syntax-HighlighterFrom Macromates:
TextMate grammar data model and structure:
apeths blograwGrammar.ts of microsoft/vscode-textmate
IRawGrammar is the entry-point/top-level typedocumentation/rules.md of RedCMD/TmLanguage-Syntax-HighlighterScope selectors:
Scope naming conventions:
apeths blog, section Standard Scopes
References:
documentation/README.md of RedCMD/TmLanguage-Syntax-Highlighter