haystack-codegen
Version:
Project Haystack Core code generation tools
101 lines (98 loc) • 4.41 kB
JavaScript
;
/*
* Copyright (c) 2021, J2 Innovations. All Rights Reserved
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.codegen = void 0;
const safe_1 = __importDefault(require("colors/safe"));
const CodeGenerator_1 = require("./CodeGenerator");
const namespace_1 = require("./namespace");
const commander_1 = require("commander");
const path_1 = __importDefault(require("path"));
const util_1 = require("util");
const fs_1 = require("fs");
const haystack_nclient_1 = require("haystack-nclient");
const node_fetch_1 = __importDefault(require("node-fetch"));
const writeFileAsync = (0, util_1.promisify)(fs_1.writeFile);
const mkdirAsync = (0, util_1.promisify)(fs_1.mkdir);
function log(message) {
console.log(message);
}
async function codegen() {
const program = new commander_1.Command();
const { tags, file, uri, typeguard } = program
.description(safe_1.default.green(`
Generate TypeScript code from haystack v4 defs
Defs are fetched in the following order...
- If a uri is specified, a network request will be made to fetch the defs.
- If FIN_HOME or FAN_HOME is specified, the defs will be compiled from POD files.
- As a last resort, the defs used in this library will be used.
`.trim()))
.option('-t, --tags <tags...>', 'a space separated list of tags to generate code from')
.option('-f, --file <file>', 'the TypeScript file to generate', './src/haystack/types.ts')
.option('-u, --uri <uri>', 'haystack server uri (i.e. http://localhost:8080/api/projectNameGoesHere)')
.option('-g, --typeguard <entity|all>', 'typeguard generation. Only entities or everything (excluding ph lib).', 'entity')
.parse(process.argv)
.opts();
if (process.argv.length < 3 || !tags?.length) {
program.help();
return;
}
log(safe_1.default.green('Creating TypeScript for ') +
safe_1.default.yellow(tags.join(', ')));
let namespace;
if (uri) {
log(safe_1.default.green(' Found uri: ') + safe_1.default.yellow(uri));
log(safe_1.default.green(' Requesting defs from server...'));
try {
const client = new haystack_nclient_1.Client({
base: new URL(uri),
fetch: node_fetch_1.default,
});
await client.ext.loadDefs();
namespace = client.defs;
log(safe_1.default.green(' Successfully requested defs'));
}
catch (err) {
log(safe_1.default.red(' Cannot load defs from uri. Ensure the server is active and does not have authentication enabled'));
throw err;
}
}
else if (process.env.FIN_HOME) {
const home = String(process.env.FIN_HOME);
log(safe_1.default.green(' Found FIN_HOME environment variable: ') +
safe_1.default.yellow(home));
log(safe_1.default.green(' Compiling defs...'));
namespace = await (0, namespace_1.resolvePodsNamespace)(`${home}/lib/pod`);
}
else if (process.env.FAN_HOME) {
const home = String(process.env.FAN_HOME);
log(safe_1.default.green(' Found FAN_HOME environment variable: ') +
safe_1.default.yellow(home));
log(safe_1.default.green(' Compiling defs...'));
namespace = await (0, namespace_1.resolvePodsNamespace)(`${home}/lib/fan`, 'ph');
}
if (!namespace) {
log(safe_1.default.green(' Reading default namespace'));
namespace = await (0, namespace_1.resolveDefaultNamespace)();
}
// Special name to encode all the defs.
const encodeAll = tags[0] === '*all*';
log(safe_1.default.green(' Generating TypeScript...'));
const ts = new CodeGenerator_1.CodeGenerator({
names: encodeAll
? namespace.grid.listBy('def').map((sym) => sym.value)
: tags,
namespace,
typeGuardOptions: typeguard,
}).generate();
log(safe_1.default.green(' Writing file ') + safe_1.default.yellow(file));
const tsFile = path_1.default.resolve(file);
await mkdirAsync(path_1.default.dirname(tsFile), { recursive: true });
await writeFileAsync(tsFile, ts);
log(safe_1.default.green(' Successfully created TypeScript file!'));
}
exports.codegen = codegen;