├── .github └── workflows │ └── node.js.yml ├── .gitignore ├── LICENSE ├── README.md ├── index.js ├── package-lock.json ├── package.json └── test ├── expr.js └── nix.js /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node 2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [ "main" ] 9 | pull_request: 10 | branches: [ "main" ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | matrix: 19 | node-version: [16.x, 18.x, 20.x] 20 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 21 | 22 | steps: 23 | - uses: actions/checkout@v3 24 | - name: Use Node.js ${{ matrix.node-version }} 25 | uses: actions/setup-node@v3 26 | with: 27 | node-version: ${{ matrix.node-version }} 28 | cache: 'npm' 29 | - name: Install Nix 30 | uses: DeterminateSystems/nix-installer-action@main 31 | - run: npm ci 32 | - run: npm test 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2023 Xe Iaso 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # nixexpr 2 | 3 | ![enbyware](https://pride-badges.pony.workers.dev/static/v1?label=enbyware&labelColor=%23555&stripeWidth=8&stripeColors=FCF434%2CFFFFFF%2C9C59D1%2C2C2C2C) 4 | ![license](https://img.shields.io/github/license/Xe/nixexpr) 5 | ![Libraries.io dependency status for GitHub repo](https://img.shields.io/librariesio/github/Xe/nixexpr) 6 | [![Node.js CI](https://github.com/Xe/nixexpr/actions/workflows/node.js.yml/badge.svg)](https://github.com/Xe/nixexpr/actions/workflows/node.js.yml) 7 | 8 | JavaScript is great as a programming language, but sometimes it can be 9 | really inconvenient when you are using it as a way to write 10 | configuration data. nixexpr allows you to use [Nix](https://nixos.org) 11 | syntax to make dealing with complicated configuration that much 12 | easier. 13 | 14 | To get started, install the package `@xeserv/nixexpr`: 15 | 16 | ``` 17 | npm install --save @xeserv/nixexpr 18 | ``` 19 | 20 | And then import it from your code: 21 | 22 | ```js 23 | import { nix } from "@xeserv/nixexpr"; 24 | ``` 25 | 26 | Then use it like you would any other tagged template: 27 | 28 | ```js 29 | const highlight = nix`{ 30 | pre_tags = [ "em" ]; 31 | post_tags = [ "" ]; 32 | require_fields_match = false; 33 | fields.body_content.fragment_size = 200; 34 | fields.body_content.number_of_fragments = 1; 35 | } 36 | ``` 37 | 38 | ## Why? 39 | 40 | Consider the differences between these two snippets of code: 41 | 42 | ```js 43 | { 44 | highlight: { 45 | pre_tags: [''], 46 | post_tags: [''], 47 | require_field_match: false, 48 | fields: { 49 | body_content: { 50 | fragment_size: 200, 51 | number_of_fragments: 1, 52 | }, 53 | }, 54 | }, 55 | } 56 | ``` 57 | 58 | vs 59 | 60 | ```nix 61 | highlight = { 62 | pre_tags = [ "em" ]; 63 | post_tags = [ "" ]; 64 | require_fields_match = false; 65 | fields.body_content.fragment_size = 200; 66 | fields.body_content.number_of_fragments = 1; 67 | }; 68 | ``` 69 | 70 | The one on the bottom has a lot less boilerplate and is overall a lot 71 | easier to deal with. 72 | 73 | ## Disclaimer 74 | 75 | If you use this in production and have issues with it, please 76 | reconsider your life decisions. If you still think it's a good idea to 77 | use this library, [get in contact](https://xeiaso.net/contact) to 78 | arrange a consulting meeting to help optimize the library for your 79 | unique needs. 80 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const util = require('node:util'); 2 | const exec = util.promisify(require('node:child_process').exec); 3 | 4 | const { escape } = require("shescape"); 5 | 6 | function nix(strings, ...expressions) { 7 | let result = ""; 8 | expressions.forEach((value, i) => { 9 | let formattedValue = `(builtins.fromJSON ${JSON.stringify(JSON.stringify(value))})`; 10 | result += `${strings[i]}${formattedValue}`; 11 | }); 12 | 13 | result += strings[strings.length - 1] 14 | 15 | return result; 16 | } 17 | 18 | exports.expr = nix; 19 | 20 | exports.nix = async (strings, ...expressions) => { 21 | const expr = nix(strings, ...expressions); 22 | const { stdout } = await exec(`nix eval --json --expr '${escape(expr)}'`); 23 | return JSON.parse(stdout) 24 | } 25 | 26 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@xeserv/nixexpr", 3 | "version": "0.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@xeserv/nixexpr", 9 | "version": "0.1.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "shescape": "^1.7.3" 13 | }, 14 | "devDependencies": { 15 | "mocha": "^10.2.0" 16 | } 17 | }, 18 | "node_modules/ansi-colors": { 19 | "version": "4.1.1", 20 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 21 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 22 | "dev": true, 23 | "engines": { 24 | "node": ">=6" 25 | } 26 | }, 27 | "node_modules/ansi-regex": { 28 | "version": "5.0.1", 29 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 30 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 31 | "dev": true, 32 | "engines": { 33 | "node": ">=8" 34 | } 35 | }, 36 | "node_modules/ansi-styles": { 37 | "version": "4.3.0", 38 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 39 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 40 | "dev": true, 41 | "dependencies": { 42 | "color-convert": "^2.0.1" 43 | }, 44 | "engines": { 45 | "node": ">=8" 46 | }, 47 | "funding": { 48 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 49 | } 50 | }, 51 | "node_modules/anymatch": { 52 | "version": "3.1.3", 53 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 54 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 55 | "dev": true, 56 | "dependencies": { 57 | "normalize-path": "^3.0.0", 58 | "picomatch": "^2.0.4" 59 | }, 60 | "engines": { 61 | "node": ">= 8" 62 | } 63 | }, 64 | "node_modules/argparse": { 65 | "version": "2.0.1", 66 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 67 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 68 | "dev": true 69 | }, 70 | "node_modules/balanced-match": { 71 | "version": "1.0.2", 72 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 73 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 74 | "dev": true 75 | }, 76 | "node_modules/binary-extensions": { 77 | "version": "2.2.0", 78 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 79 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 80 | "dev": true, 81 | "engines": { 82 | "node": ">=8" 83 | } 84 | }, 85 | "node_modules/brace-expansion": { 86 | "version": "2.0.1", 87 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 88 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 89 | "dev": true, 90 | "dependencies": { 91 | "balanced-match": "^1.0.0" 92 | } 93 | }, 94 | "node_modules/braces": { 95 | "version": "3.0.2", 96 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 97 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 98 | "dev": true, 99 | "dependencies": { 100 | "fill-range": "^7.0.1" 101 | }, 102 | "engines": { 103 | "node": ">=8" 104 | } 105 | }, 106 | "node_modules/browser-stdout": { 107 | "version": "1.3.1", 108 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 109 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 110 | "dev": true 111 | }, 112 | "node_modules/camelcase": { 113 | "version": "6.3.0", 114 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 115 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 116 | "dev": true, 117 | "engines": { 118 | "node": ">=10" 119 | }, 120 | "funding": { 121 | "url": "https://github.com/sponsors/sindresorhus" 122 | } 123 | }, 124 | "node_modules/chalk": { 125 | "version": "4.1.2", 126 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 127 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 128 | "dev": true, 129 | "dependencies": { 130 | "ansi-styles": "^4.1.0", 131 | "supports-color": "^7.1.0" 132 | }, 133 | "engines": { 134 | "node": ">=10" 135 | }, 136 | "funding": { 137 | "url": "https://github.com/chalk/chalk?sponsor=1" 138 | } 139 | }, 140 | "node_modules/chalk/node_modules/supports-color": { 141 | "version": "7.2.0", 142 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 143 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 144 | "dev": true, 145 | "dependencies": { 146 | "has-flag": "^4.0.0" 147 | }, 148 | "engines": { 149 | "node": ">=8" 150 | } 151 | }, 152 | "node_modules/chokidar": { 153 | "version": "3.5.3", 154 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 155 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 156 | "dev": true, 157 | "funding": [ 158 | { 159 | "type": "individual", 160 | "url": "https://paulmillr.com/funding/" 161 | } 162 | ], 163 | "dependencies": { 164 | "anymatch": "~3.1.2", 165 | "braces": "~3.0.2", 166 | "glob-parent": "~5.1.2", 167 | "is-binary-path": "~2.1.0", 168 | "is-glob": "~4.0.1", 169 | "normalize-path": "~3.0.0", 170 | "readdirp": "~3.6.0" 171 | }, 172 | "engines": { 173 | "node": ">= 8.10.0" 174 | }, 175 | "optionalDependencies": { 176 | "fsevents": "~2.3.2" 177 | } 178 | }, 179 | "node_modules/cliui": { 180 | "version": "7.0.4", 181 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 182 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 183 | "dev": true, 184 | "dependencies": { 185 | "string-width": "^4.2.0", 186 | "strip-ansi": "^6.0.0", 187 | "wrap-ansi": "^7.0.0" 188 | } 189 | }, 190 | "node_modules/color-convert": { 191 | "version": "2.0.1", 192 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 193 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 194 | "dev": true, 195 | "dependencies": { 196 | "color-name": "~1.1.4" 197 | }, 198 | "engines": { 199 | "node": ">=7.0.0" 200 | } 201 | }, 202 | "node_modules/color-name": { 203 | "version": "1.1.4", 204 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 205 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 206 | "dev": true 207 | }, 208 | "node_modules/concat-map": { 209 | "version": "0.0.1", 210 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 211 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 212 | "dev": true 213 | }, 214 | "node_modules/debug": { 215 | "version": "4.3.4", 216 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 217 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 218 | "dev": true, 219 | "dependencies": { 220 | "ms": "2.1.2" 221 | }, 222 | "engines": { 223 | "node": ">=6.0" 224 | }, 225 | "peerDependenciesMeta": { 226 | "supports-color": { 227 | "optional": true 228 | } 229 | } 230 | }, 231 | "node_modules/debug/node_modules/ms": { 232 | "version": "2.1.2", 233 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 234 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 235 | "dev": true 236 | }, 237 | "node_modules/decamelize": { 238 | "version": "4.0.0", 239 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 240 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 241 | "dev": true, 242 | "engines": { 243 | "node": ">=10" 244 | }, 245 | "funding": { 246 | "url": "https://github.com/sponsors/sindresorhus" 247 | } 248 | }, 249 | "node_modules/diff": { 250 | "version": "5.0.0", 251 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 252 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 253 | "dev": true, 254 | "engines": { 255 | "node": ">=0.3.1" 256 | } 257 | }, 258 | "node_modules/emoji-regex": { 259 | "version": "8.0.0", 260 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 261 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 262 | "dev": true 263 | }, 264 | "node_modules/escalade": { 265 | "version": "3.1.1", 266 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 267 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 268 | "dev": true, 269 | "engines": { 270 | "node": ">=6" 271 | } 272 | }, 273 | "node_modules/escape-string-regexp": { 274 | "version": "4.0.0", 275 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 276 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 277 | "dev": true, 278 | "engines": { 279 | "node": ">=10" 280 | }, 281 | "funding": { 282 | "url": "https://github.com/sponsors/sindresorhus" 283 | } 284 | }, 285 | "node_modules/fill-range": { 286 | "version": "7.0.1", 287 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 288 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 289 | "dev": true, 290 | "dependencies": { 291 | "to-regex-range": "^5.0.1" 292 | }, 293 | "engines": { 294 | "node": ">=8" 295 | } 296 | }, 297 | "node_modules/find-up": { 298 | "version": "5.0.0", 299 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 300 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 301 | "dev": true, 302 | "dependencies": { 303 | "locate-path": "^6.0.0", 304 | "path-exists": "^4.0.0" 305 | }, 306 | "engines": { 307 | "node": ">=10" 308 | }, 309 | "funding": { 310 | "url": "https://github.com/sponsors/sindresorhus" 311 | } 312 | }, 313 | "node_modules/flat": { 314 | "version": "5.0.2", 315 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 316 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 317 | "dev": true, 318 | "bin": { 319 | "flat": "cli.js" 320 | } 321 | }, 322 | "node_modules/fs.realpath": { 323 | "version": "1.0.0", 324 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 325 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 326 | "dev": true 327 | }, 328 | "node_modules/fsevents": { 329 | "version": "2.3.2", 330 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 331 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 332 | "dev": true, 333 | "hasInstallScript": true, 334 | "optional": true, 335 | "os": [ 336 | "darwin" 337 | ], 338 | "engines": { 339 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 340 | } 341 | }, 342 | "node_modules/get-caller-file": { 343 | "version": "2.0.5", 344 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 345 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 346 | "dev": true, 347 | "engines": { 348 | "node": "6.* || 8.* || >= 10.*" 349 | } 350 | }, 351 | "node_modules/glob": { 352 | "version": "7.2.0", 353 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 354 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 355 | "dev": true, 356 | "dependencies": { 357 | "fs.realpath": "^1.0.0", 358 | "inflight": "^1.0.4", 359 | "inherits": "2", 360 | "minimatch": "^3.0.4", 361 | "once": "^1.3.0", 362 | "path-is-absolute": "^1.0.0" 363 | }, 364 | "engines": { 365 | "node": "*" 366 | }, 367 | "funding": { 368 | "url": "https://github.com/sponsors/isaacs" 369 | } 370 | }, 371 | "node_modules/glob-parent": { 372 | "version": "5.1.2", 373 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 374 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 375 | "dev": true, 376 | "dependencies": { 377 | "is-glob": "^4.0.1" 378 | }, 379 | "engines": { 380 | "node": ">= 6" 381 | } 382 | }, 383 | "node_modules/glob/node_modules/brace-expansion": { 384 | "version": "1.1.11", 385 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 386 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 387 | "dev": true, 388 | "dependencies": { 389 | "balanced-match": "^1.0.0", 390 | "concat-map": "0.0.1" 391 | } 392 | }, 393 | "node_modules/glob/node_modules/minimatch": { 394 | "version": "3.1.2", 395 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 396 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 397 | "dev": true, 398 | "dependencies": { 399 | "brace-expansion": "^1.1.7" 400 | }, 401 | "engines": { 402 | "node": "*" 403 | } 404 | }, 405 | "node_modules/has-flag": { 406 | "version": "4.0.0", 407 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 408 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 409 | "dev": true, 410 | "engines": { 411 | "node": ">=8" 412 | } 413 | }, 414 | "node_modules/he": { 415 | "version": "1.2.0", 416 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 417 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 418 | "dev": true, 419 | "bin": { 420 | "he": "bin/he" 421 | } 422 | }, 423 | "node_modules/inflight": { 424 | "version": "1.0.6", 425 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 426 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 427 | "dev": true, 428 | "dependencies": { 429 | "once": "^1.3.0", 430 | "wrappy": "1" 431 | } 432 | }, 433 | "node_modules/inherits": { 434 | "version": "2.0.4", 435 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 436 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 437 | "dev": true 438 | }, 439 | "node_modules/is-binary-path": { 440 | "version": "2.1.0", 441 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 442 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 443 | "dev": true, 444 | "dependencies": { 445 | "binary-extensions": "^2.0.0" 446 | }, 447 | "engines": { 448 | "node": ">=8" 449 | } 450 | }, 451 | "node_modules/is-extglob": { 452 | "version": "2.1.1", 453 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 454 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 455 | "dev": true, 456 | "engines": { 457 | "node": ">=0.10.0" 458 | } 459 | }, 460 | "node_modules/is-fullwidth-code-point": { 461 | "version": "3.0.0", 462 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 463 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 464 | "dev": true, 465 | "engines": { 466 | "node": ">=8" 467 | } 468 | }, 469 | "node_modules/is-glob": { 470 | "version": "4.0.3", 471 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 472 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 473 | "dev": true, 474 | "dependencies": { 475 | "is-extglob": "^2.1.1" 476 | }, 477 | "engines": { 478 | "node": ">=0.10.0" 479 | } 480 | }, 481 | "node_modules/is-number": { 482 | "version": "7.0.0", 483 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 484 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 485 | "dev": true, 486 | "engines": { 487 | "node": ">=0.12.0" 488 | } 489 | }, 490 | "node_modules/is-plain-obj": { 491 | "version": "2.1.0", 492 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 493 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 494 | "dev": true, 495 | "engines": { 496 | "node": ">=8" 497 | } 498 | }, 499 | "node_modules/is-unicode-supported": { 500 | "version": "0.1.0", 501 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 502 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 503 | "dev": true, 504 | "engines": { 505 | "node": ">=10" 506 | }, 507 | "funding": { 508 | "url": "https://github.com/sponsors/sindresorhus" 509 | } 510 | }, 511 | "node_modules/isexe": { 512 | "version": "2.0.0", 513 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 514 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 515 | }, 516 | "node_modules/js-yaml": { 517 | "version": "4.1.0", 518 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 519 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 520 | "dev": true, 521 | "dependencies": { 522 | "argparse": "^2.0.1" 523 | }, 524 | "bin": { 525 | "js-yaml": "bin/js-yaml.js" 526 | } 527 | }, 528 | "node_modules/locate-path": { 529 | "version": "6.0.0", 530 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 531 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 532 | "dev": true, 533 | "dependencies": { 534 | "p-locate": "^5.0.0" 535 | }, 536 | "engines": { 537 | "node": ">=10" 538 | }, 539 | "funding": { 540 | "url": "https://github.com/sponsors/sindresorhus" 541 | } 542 | }, 543 | "node_modules/log-symbols": { 544 | "version": "4.1.0", 545 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 546 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 547 | "dev": true, 548 | "dependencies": { 549 | "chalk": "^4.1.0", 550 | "is-unicode-supported": "^0.1.0" 551 | }, 552 | "engines": { 553 | "node": ">=10" 554 | }, 555 | "funding": { 556 | "url": "https://github.com/sponsors/sindresorhus" 557 | } 558 | }, 559 | "node_modules/minimatch": { 560 | "version": "5.0.1", 561 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 562 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 563 | "dev": true, 564 | "dependencies": { 565 | "brace-expansion": "^2.0.1" 566 | }, 567 | "engines": { 568 | "node": ">=10" 569 | } 570 | }, 571 | "node_modules/mocha": { 572 | "version": "10.2.0", 573 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 574 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 575 | "dev": true, 576 | "dependencies": { 577 | "ansi-colors": "4.1.1", 578 | "browser-stdout": "1.3.1", 579 | "chokidar": "3.5.3", 580 | "debug": "4.3.4", 581 | "diff": "5.0.0", 582 | "escape-string-regexp": "4.0.0", 583 | "find-up": "5.0.0", 584 | "glob": "7.2.0", 585 | "he": "1.2.0", 586 | "js-yaml": "4.1.0", 587 | "log-symbols": "4.1.0", 588 | "minimatch": "5.0.1", 589 | "ms": "2.1.3", 590 | "nanoid": "3.3.3", 591 | "serialize-javascript": "6.0.0", 592 | "strip-json-comments": "3.1.1", 593 | "supports-color": "8.1.1", 594 | "workerpool": "6.2.1", 595 | "yargs": "16.2.0", 596 | "yargs-parser": "20.2.4", 597 | "yargs-unparser": "2.0.0" 598 | }, 599 | "bin": { 600 | "_mocha": "bin/_mocha", 601 | "mocha": "bin/mocha.js" 602 | }, 603 | "engines": { 604 | "node": ">= 14.0.0" 605 | }, 606 | "funding": { 607 | "type": "opencollective", 608 | "url": "https://opencollective.com/mochajs" 609 | } 610 | }, 611 | "node_modules/ms": { 612 | "version": "2.1.3", 613 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 614 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 615 | "dev": true 616 | }, 617 | "node_modules/nanoid": { 618 | "version": "3.3.3", 619 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 620 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 621 | "dev": true, 622 | "bin": { 623 | "nanoid": "bin/nanoid.cjs" 624 | }, 625 | "engines": { 626 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 627 | } 628 | }, 629 | "node_modules/normalize-path": { 630 | "version": "3.0.0", 631 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 632 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 633 | "dev": true, 634 | "engines": { 635 | "node": ">=0.10.0" 636 | } 637 | }, 638 | "node_modules/once": { 639 | "version": "1.4.0", 640 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 641 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 642 | "dev": true, 643 | "dependencies": { 644 | "wrappy": "1" 645 | } 646 | }, 647 | "node_modules/p-limit": { 648 | "version": "3.1.0", 649 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 650 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 651 | "dev": true, 652 | "dependencies": { 653 | "yocto-queue": "^0.1.0" 654 | }, 655 | "engines": { 656 | "node": ">=10" 657 | }, 658 | "funding": { 659 | "url": "https://github.com/sponsors/sindresorhus" 660 | } 661 | }, 662 | "node_modules/p-locate": { 663 | "version": "5.0.0", 664 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 665 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 666 | "dev": true, 667 | "dependencies": { 668 | "p-limit": "^3.0.2" 669 | }, 670 | "engines": { 671 | "node": ">=10" 672 | }, 673 | "funding": { 674 | "url": "https://github.com/sponsors/sindresorhus" 675 | } 676 | }, 677 | "node_modules/path-exists": { 678 | "version": "4.0.0", 679 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 680 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 681 | "dev": true, 682 | "engines": { 683 | "node": ">=8" 684 | } 685 | }, 686 | "node_modules/path-is-absolute": { 687 | "version": "1.0.1", 688 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 689 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 690 | "dev": true, 691 | "engines": { 692 | "node": ">=0.10.0" 693 | } 694 | }, 695 | "node_modules/picomatch": { 696 | "version": "2.3.1", 697 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 698 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 699 | "dev": true, 700 | "engines": { 701 | "node": ">=8.6" 702 | }, 703 | "funding": { 704 | "url": "https://github.com/sponsors/jonschlinkert" 705 | } 706 | }, 707 | "node_modules/randombytes": { 708 | "version": "2.1.0", 709 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 710 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 711 | "dev": true, 712 | "dependencies": { 713 | "safe-buffer": "^5.1.0" 714 | } 715 | }, 716 | "node_modules/readdirp": { 717 | "version": "3.6.0", 718 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 719 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 720 | "dev": true, 721 | "dependencies": { 722 | "picomatch": "^2.2.1" 723 | }, 724 | "engines": { 725 | "node": ">=8.10.0" 726 | } 727 | }, 728 | "node_modules/require-directory": { 729 | "version": "2.1.1", 730 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 731 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 732 | "dev": true, 733 | "engines": { 734 | "node": ">=0.10.0" 735 | } 736 | }, 737 | "node_modules/safe-buffer": { 738 | "version": "5.2.1", 739 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 740 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 741 | "dev": true, 742 | "funding": [ 743 | { 744 | "type": "github", 745 | "url": "https://github.com/sponsors/feross" 746 | }, 747 | { 748 | "type": "patreon", 749 | "url": "https://www.patreon.com/feross" 750 | }, 751 | { 752 | "type": "consulting", 753 | "url": "https://feross.org/support" 754 | } 755 | ] 756 | }, 757 | "node_modules/serialize-javascript": { 758 | "version": "6.0.0", 759 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 760 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 761 | "dev": true, 762 | "dependencies": { 763 | "randombytes": "^2.1.0" 764 | } 765 | }, 766 | "node_modules/shescape": { 767 | "version": "1.7.3", 768 | "resolved": "https://registry.npmjs.org/shescape/-/shescape-1.7.3.tgz", 769 | "integrity": "sha512-b9xUf4ZKgGBxdovdkfTXs0fPc+VpL8KuIpFv2fc8XAjwr+zV6cyL14pD5BSYEgSNkGLR5LG8qf3Kv2xxHdr+sQ==", 770 | "dependencies": { 771 | "which": "^2.0.0" 772 | }, 773 | "engines": { 774 | "node": "^10.13.0 || ^12 || ^14 || ^16 || ^18 || ^19 || ^20" 775 | } 776 | }, 777 | "node_modules/string-width": { 778 | "version": "4.2.3", 779 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 780 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 781 | "dev": true, 782 | "dependencies": { 783 | "emoji-regex": "^8.0.0", 784 | "is-fullwidth-code-point": "^3.0.0", 785 | "strip-ansi": "^6.0.1" 786 | }, 787 | "engines": { 788 | "node": ">=8" 789 | } 790 | }, 791 | "node_modules/strip-ansi": { 792 | "version": "6.0.1", 793 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 794 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 795 | "dev": true, 796 | "dependencies": { 797 | "ansi-regex": "^5.0.1" 798 | }, 799 | "engines": { 800 | "node": ">=8" 801 | } 802 | }, 803 | "node_modules/strip-json-comments": { 804 | "version": "3.1.1", 805 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 806 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 807 | "dev": true, 808 | "engines": { 809 | "node": ">=8" 810 | }, 811 | "funding": { 812 | "url": "https://github.com/sponsors/sindresorhus" 813 | } 814 | }, 815 | "node_modules/supports-color": { 816 | "version": "8.1.1", 817 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 818 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 819 | "dev": true, 820 | "dependencies": { 821 | "has-flag": "^4.0.0" 822 | }, 823 | "engines": { 824 | "node": ">=10" 825 | }, 826 | "funding": { 827 | "url": "https://github.com/chalk/supports-color?sponsor=1" 828 | } 829 | }, 830 | "node_modules/to-regex-range": { 831 | "version": "5.0.1", 832 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 833 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 834 | "dev": true, 835 | "dependencies": { 836 | "is-number": "^7.0.0" 837 | }, 838 | "engines": { 839 | "node": ">=8.0" 840 | } 841 | }, 842 | "node_modules/which": { 843 | "version": "2.0.2", 844 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 845 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 846 | "dependencies": { 847 | "isexe": "^2.0.0" 848 | }, 849 | "bin": { 850 | "node-which": "bin/node-which" 851 | }, 852 | "engines": { 853 | "node": ">= 8" 854 | } 855 | }, 856 | "node_modules/workerpool": { 857 | "version": "6.2.1", 858 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 859 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 860 | "dev": true 861 | }, 862 | "node_modules/wrap-ansi": { 863 | "version": "7.0.0", 864 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 865 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 866 | "dev": true, 867 | "dependencies": { 868 | "ansi-styles": "^4.0.0", 869 | "string-width": "^4.1.0", 870 | "strip-ansi": "^6.0.0" 871 | }, 872 | "engines": { 873 | "node": ">=10" 874 | }, 875 | "funding": { 876 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 877 | } 878 | }, 879 | "node_modules/wrappy": { 880 | "version": "1.0.2", 881 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 882 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 883 | "dev": true 884 | }, 885 | "node_modules/y18n": { 886 | "version": "5.0.8", 887 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 888 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 889 | "dev": true, 890 | "engines": { 891 | "node": ">=10" 892 | } 893 | }, 894 | "node_modules/yargs": { 895 | "version": "16.2.0", 896 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 897 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 898 | "dev": true, 899 | "dependencies": { 900 | "cliui": "^7.0.2", 901 | "escalade": "^3.1.1", 902 | "get-caller-file": "^2.0.5", 903 | "require-directory": "^2.1.1", 904 | "string-width": "^4.2.0", 905 | "y18n": "^5.0.5", 906 | "yargs-parser": "^20.2.2" 907 | }, 908 | "engines": { 909 | "node": ">=10" 910 | } 911 | }, 912 | "node_modules/yargs-parser": { 913 | "version": "20.2.4", 914 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 915 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 916 | "dev": true, 917 | "engines": { 918 | "node": ">=10" 919 | } 920 | }, 921 | "node_modules/yargs-unparser": { 922 | "version": "2.0.0", 923 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 924 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 925 | "dev": true, 926 | "dependencies": { 927 | "camelcase": "^6.0.0", 928 | "decamelize": "^4.0.0", 929 | "flat": "^5.0.2", 930 | "is-plain-obj": "^2.1.0" 931 | }, 932 | "engines": { 933 | "node": ">=10" 934 | } 935 | }, 936 | "node_modules/yocto-queue": { 937 | "version": "0.1.0", 938 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 939 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 940 | "dev": true, 941 | "engines": { 942 | "node": ">=10" 943 | }, 944 | "funding": { 945 | "url": "https://github.com/sponsors/sindresorhus" 946 | } 947 | } 948 | } 949 | } 950 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@xeserv/nixexpr", 3 | "version": "0.1.0", 4 | "description": "A tagged template for evaluating Nix code", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/Xe/nixexpr.git" 12 | }, 13 | "keywords": [ 14 | "nix" 15 | ], 16 | "author": "Xe Iaso ", 17 | "license": "MIT", 18 | "bugs": { 19 | "url": "https://github.com/Xe/nixexpr/issues" 20 | }, 21 | "homepage": "https://github.com/Xe/nixexpr#readme", 22 | "devDependencies": { 23 | "mocha": "^10.2.0" 24 | }, 25 | "dependencies": { 26 | "shescape": "^1.7.3" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /test/expr.js: -------------------------------------------------------------------------------- 1 | const { expr } = require("../index.js"); 2 | const assert = require('assert'); 3 | 4 | describe("expr", () => { 5 | describe("basic string", () => { 6 | it("should construct basic strings", () => { 7 | assert.equal( 8 | expr`let hi = ${"there"}; in hi`, 9 | "let hi = (builtins.fromJSON \"\\\"there\\\"\"); in hi", 10 | ); 11 | }) 12 | it("should construct objects", () => { 13 | assert.equal( 14 | expr`let hi = ${"there"}; in { greeting = hi; }`, 15 | "let hi = (builtins.fromJSON \"\\\"there\\\"\"); in { greeting = hi; }", 16 | ); 17 | }) 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /test/nix.js: -------------------------------------------------------------------------------- 1 | const { nix } = require("../index.js"); 2 | const assert = require('assert'); 3 | 4 | describe("nix", () => { 5 | describe("basic string", () => { 6 | it("should construct basic strings", async () => { 7 | const there = "foo"; 8 | assert.equal( 9 | await nix`let hi = ${there}; in hi`, 10 | there, 11 | ); 12 | }) 13 | it("should construct objects", async () => { 14 | assert.equal( 15 | JSON.stringify(await nix`let hi = ${"there"}; in { greeting = hi; }`), 16 | JSON.stringify({ greeting: "there" }), 17 | ); 18 | }) 19 | }); 20 | }); 21 | --------------------------------------------------------------------------------