Ben Ashton
2 years ago
6 changed files with 341 additions and 21 deletions
@ -1,24 +1,77 @@
|
||||
import { TemplateEngine } from './index.js'; |
||||
import { basename } from 'node:path'; |
||||
|
||||
// Check arguments
|
||||
if (process.argv.length !== 3) { |
||||
console.error(`Usage: node ${basename(process.argv[1])} filename`); |
||||
process.exit(1); |
||||
} |
||||
const fileName = process.argv[2]; |
||||
import { write, close } from 'node:fs'; |
||||
import { spawn } from 'node:child_process'; |
||||
|
||||
import { file } from 'tmp-promise'; |
||||
|
||||
const tp = new TemplateEngine(); |
||||
import { renderFile } from './src/template_engine.js'; |
||||
|
||||
let result; |
||||
|
||||
try { |
||||
result = await tp.render(fileName); |
||||
} catch (e) { |
||||
console.error(e.message); |
||||
if (process.argv.length <= 2) { |
||||
console.error( |
||||
`Usage: n0m [options] template_file.n0m\n` + |
||||
`Options:\n` + |
||||
` -c compile (by default the script will be executed)` |
||||
) |
||||
process.exit(1); |
||||
} |
||||
|
||||
if (result) { |
||||
process.stdout.write(result); |
||||
let compileOnly = false; |
||||
|
||||
const args = process.argv |
||||
.slice(2) |
||||
.filter(arg => { |
||||
if (arg.toLocaleLowerCase() === '-c') { |
||||
compileOnly = true; |
||||
return false; |
||||
} |
||||
return true; |
||||
}); |
||||
|
||||
const fileName = args[0]; |
||||
const scriptArgs = args.slice(1); |
||||
|
||||
const rendered = await renderFile(fileName); |
||||
|
||||
if (compileOnly) { |
||||
process.stdout.write(rendered); |
||||
process.exit(0); |
||||
} |
||||
|
||||
// Create temporary file
|
||||
const { fd, path, cleanup } = await file({ |
||||
mode: 0o744, |
||||
detachDescriptor: true |
||||
}); |
||||
|
||||
// Write script to temporary file and close file if successful
|
||||
await new Promise((resolve, reject) => { |
||||
write(fd, rendered, async writeErr => { |
||||
if (writeErr) { |
||||
reject(writeErr); |
||||
return; |
||||
} |
||||
|
||||
close(fd, (closeErr) => { |
||||
if (closeErr) { |
||||
reject(closeErr); |
||||
return; |
||||
} |
||||
resolve(); |
||||
}); |
||||
}); |
||||
}); |
||||
|
||||
// Spawn child process to execute script
|
||||
let child = spawn( |
||||
path, |
||||
scriptArgs, { |
||||
stdio: 'inherit', |
||||
argv0: fileName |
||||
} |
||||
); |
||||
|
||||
// Clean up temporary files once the child exits
|
||||
child.on('exit', async () => { |
||||
await cleanup(); |
||||
}); |
||||
|
@ -0,0 +1,241 @@
|
||||
{ |
||||
"name": "n0m-template-engine", |
||||
"version": "1.0.0", |
||||
"lockfileVersion": 2, |
||||
"requires": true, |
||||
"packages": { |
||||
"": { |
||||
"name": "n0m-template-engine", |
||||
"version": "1.0.0", |
||||
"license": "MIT", |
||||
"dependencies": { |
||||
"tmp-promise": "^3.0.3" |
||||
} |
||||
}, |
||||
"node_modules/balanced-match": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", |
||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" |
||||
}, |
||||
"node_modules/brace-expansion": { |
||||
"version": "1.1.11", |
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", |
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", |
||||
"dependencies": { |
||||
"balanced-match": "^1.0.0", |
||||
"concat-map": "0.0.1" |
||||
} |
||||
}, |
||||
"node_modules/concat-map": { |
||||
"version": "0.0.1", |
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", |
||||
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" |
||||
}, |
||||
"node_modules/fs.realpath": { |
||||
"version": "1.0.0", |
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", |
||||
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" |
||||
}, |
||||
"node_modules/glob": { |
||||
"version": "7.2.3", |
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", |
||||
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", |
||||
"dependencies": { |
||||
"fs.realpath": "^1.0.0", |
||||
"inflight": "^1.0.4", |
||||
"inherits": "2", |
||||
"minimatch": "^3.1.1", |
||||
"once": "^1.3.0", |
||||
"path-is-absolute": "^1.0.0" |
||||
}, |
||||
"engines": { |
||||
"node": "*" |
||||
}, |
||||
"funding": { |
||||
"url": "https://github.com/sponsors/isaacs" |
||||
} |
||||
}, |
||||
"node_modules/inflight": { |
||||
"version": "1.0.6", |
||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", |
||||
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", |
||||
"dependencies": { |
||||
"once": "^1.3.0", |
||||
"wrappy": "1" |
||||
} |
||||
}, |
||||
"node_modules/inherits": { |
||||
"version": "2.0.4", |
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", |
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" |
||||
}, |
||||
"node_modules/minimatch": { |
||||
"version": "3.1.2", |
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", |
||||
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", |
||||
"dependencies": { |
||||
"brace-expansion": "^1.1.7" |
||||
}, |
||||
"engines": { |
||||
"node": "*" |
||||
} |
||||
}, |
||||
"node_modules/once": { |
||||
"version": "1.4.0", |
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", |
||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", |
||||
"dependencies": { |
||||
"wrappy": "1" |
||||
} |
||||
}, |
||||
"node_modules/path-is-absolute": { |
||||
"version": "1.0.1", |
||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", |
||||
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", |
||||
"engines": { |
||||
"node": ">=0.10.0" |
||||
} |
||||
}, |
||||
"node_modules/rimraf": { |
||||
"version": "3.0.2", |
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", |
||||
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", |
||||
"dependencies": { |
||||
"glob": "^7.1.3" |
||||
}, |
||||
"bin": { |
||||
"rimraf": "bin.js" |
||||
}, |
||||
"funding": { |
||||
"url": "https://github.com/sponsors/isaacs" |
||||
} |
||||
}, |
||||
"node_modules/tmp": { |
||||
"version": "0.2.1", |
||||
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", |
||||
"integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", |
||||
"dependencies": { |
||||
"rimraf": "^3.0.0" |
||||
}, |
||||
"engines": { |
||||
"node": ">=8.17.0" |
||||
} |
||||
}, |
||||
"node_modules/tmp-promise": { |
||||
"version": "3.0.3", |
||||
"resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", |
||||
"integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", |
||||
"dependencies": { |
||||
"tmp": "^0.2.0" |
||||
} |
||||
}, |
||||
"node_modules/wrappy": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", |
||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" |
||||
} |
||||
}, |
||||
"dependencies": { |
||||
"balanced-match": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", |
||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" |
||||
}, |
||||
"brace-expansion": { |
||||
"version": "1.1.11", |
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", |
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", |
||||
"requires": { |
||||
"balanced-match": "^1.0.0", |
||||
"concat-map": "0.0.1" |
||||
} |
||||
}, |
||||
"concat-map": { |
||||
"version": "0.0.1", |
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", |
||||
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" |
||||
}, |
||||
"fs.realpath": { |
||||
"version": "1.0.0", |
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", |
||||
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" |
||||
}, |
||||
"glob": { |
||||
"version": "7.2.3", |
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", |
||||
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", |
||||
"requires": { |
||||
"fs.realpath": "^1.0.0", |
||||
"inflight": "^1.0.4", |
||||
"inherits": "2", |
||||
"minimatch": "^3.1.1", |
||||
"once": "^1.3.0", |
||||
"path-is-absolute": "^1.0.0" |
||||
} |
||||
}, |
||||
"inflight": { |
||||
"version": "1.0.6", |
||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", |
||||
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", |
||||
"requires": { |
||||
"once": "^1.3.0", |
||||
"wrappy": "1" |
||||
} |
||||
}, |
||||
"inherits": { |
||||
"version": "2.0.4", |
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", |
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" |
||||
}, |
||||
"minimatch": { |
||||
"version": "3.1.2", |
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", |
||||
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", |
||||
"requires": { |
||||
"brace-expansion": "^1.1.7" |
||||
} |
||||
}, |
||||
"once": { |
||||
"version": "1.4.0", |
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", |
||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", |
||||
"requires": { |
||||
"wrappy": "1" |
||||
} |
||||
}, |
||||
"path-is-absolute": { |
||||
"version": "1.0.1", |
||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", |
||||
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" |
||||
}, |
||||
"rimraf": { |
||||
"version": "3.0.2", |
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", |
||||
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", |
||||
"requires": { |
||||
"glob": "^7.1.3" |
||||
} |
||||
}, |
||||
"tmp": { |
||||
"version": "0.2.1", |
||||
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", |
||||
"integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", |
||||
"requires": { |
||||
"rimraf": "^3.0.0" |
||||
} |
||||
}, |
||||
"tmp-promise": { |
||||
"version": "3.0.3", |
||||
"resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", |
||||
"integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", |
||||
"requires": { |
||||
"tmp": "^0.2.0" |
||||
} |
||||
}, |
||||
"wrappy": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", |
||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue