UNPKG

haystack-codegen

Version:

Project Haystack Core code generation tools

101 lines (98 loc) 4.41 kB
"use strict"; /* * 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;