UNPKG

piral-cli

Version:

The standard CLI for creating and building a Piral instance or a Pilet.

188 lines • 7.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createPiletDeclaration = createPiletDeclaration; exports.createPiralDeclaration = createPiralDeclaration; const dets_1 = require("dets"); const path_1 = require("path"); const log_1 = require("./log"); const package_1 = require("./package"); const constants_1 = require("./constants"); const io_1 = require("./io"); const external_1 = require("../external"); const piletApiName = 'PiletApi'; function findPiralBaseRoot(root, framework) { const piralJson = `${framework}/package.json`; if (piralJson !== constants_1.piralBaseRoot) { try { const packageJsonPath = (0, external_1.getModulePath)(root, piralJson); return (0, path_1.dirname)(packageJsonPath); } catch { } } return root; } async function findPiralInstanceApi(root, piralInstance) { if (piralInstance) { const path = require.resolve(`${piralInstance}/${constants_1.packageJson}`, { paths: [(0, path_1.join)(root, 'node_modules')], }); const appRoot = (0, path_1.dirname)(path); const data = await (0, io_1.readJson)(appRoot, constants_1.packageJson); const subpath = data.types || data.typings; if (subpath) { return [ { file: (0, path_1.resolve)(appRoot, subpath), name: piletApiName, }, ]; } } return []; } function findPiralBaseApi(root, framework) { // for some package managers, e.g., pnpm we need to first go into // some specifics before being able to retrieve "piral-base" const baseRoot = findPiralBaseRoot(root, framework); try { const packageJsonPath = (0, external_1.getModulePath)(baseRoot, constants_1.piralBaseRoot); const projectDir = (0, path_1.dirname)(packageJsonPath); const project = require(packageJsonPath); // By default support for piral-base < 0.15 const { piletApiTypings = 'lib/types.d.ts' } = project; return [ { file: (0, path_1.resolve)(projectDir, piletApiTypings), name: piletApiName, }, ]; } catch (err) { (0, log_1.log)('generalError_0002', `Could not find the root API of "piral-base" from "${root}": ${err}`); return []; } } function isString(n) { return typeof n === 'string'; } function findDeclaredTypings(root, shared = []) { const types = shared.filter(isString).map((file) => (0, path_1.resolve)(root, file)); try { const { typings, extraTypes } = require((0, path_1.resolve)(root, 'package.json')); if (extraTypes) { if (isString(extraTypes)) { return [(0, path_1.resolve)(root, extraTypes), ...types]; } else if (Array.isArray(extraTypes)) { const items = extraTypes.filter(isString).map((file) => (0, path_1.resolve)(root, file)); return [...items, ...types]; } } if (typings) { return [(0, path_1.resolve)(root, typings), ...types]; } } catch { } return types; } async function getAllFiles(entryModules) { const files = []; const pattern = '**/+(*.ts|*.tsx|*.js|*.jsx)'; const allFiles = await Promise.all(entryModules.map((m) => (0, io_1.matchFiles)((0, path_1.dirname)(m), pattern))); for (const found of allFiles) { files.push(...found.filter((file) => !files.includes(file))); } return files; } async function getEntryModules(entryFiles) { if (!constants_1.entryModuleExtensions.includes((0, path_1.extname)(entryFiles).toLowerCase())) { const appFile = await (0, io_1.readText)((0, path_1.dirname)(entryFiles), (0, path_1.basename)(entryFiles)); const entryModules = await (0, io_1.getEntryFiles)(appFile, (0, path_1.dirname)(entryFiles)); return entryModules; } return [entryFiles]; } function createLogger() { return { error(message) { throw new Error(message); }, info(message) { (0, log_1.logInfo)(message); }, verbose(message) { (0, log_1.logVerbose)(message); }, warn(message) { (0, log_1.logWarn)(message); }, }; } async function createDeclarationFile(options, target, forceOverwrite) { (0, log_1.progress)('Bundling declaration file ...'); const result = await (0, dets_1.generateDeclaration)(options); (0, log_1.progress)('Writing declaration file ...'); await (0, io_1.createFileIfNotExists)(target, 'index.d.ts', result, forceOverwrite); } async function createPiletDeclaration(piralInstances, root, entry, allowedImports, target, forceOverwrite, logLevel) { const [piralInstance] = piralInstances; const apis = await findPiralInstanceApi(root, piralInstance); const [file] = apis.map((m) => m.file); if (file) { const files = await getAllFiles([entry]); const types = findDeclaredTypings(root); const options = { name: piralInstance, root, files, types, plugins: [(0, dets_1.createDiffPlugin)(file)], apis, noModuleDeclaration: true, imports: allowedImports.filter(m => !piralInstances.includes(m)), logLevel, logger: createLogger(), }; try { await createDeclarationFile(options, target, forceOverwrite); return true; } catch (ex) { (0, log_1.log)('declarationCouldNotBeGenerated_0076', root, ex); } return false; } } async function createPiralDeclaration(baseDir, entry, target, forceOverwrite, logLevel) { (0, log_1.progress)('Reading configuration ...'); const entryFiles = await (0, package_1.retrievePiralRoot)(baseDir, entry); const { name, root, externals, framework, shared } = await (0, package_1.retrievePiletsInfo)(entryFiles); const entryModules = await getEntryModules(entryFiles); const files = await getAllFiles(entryModules); const options = { name, root, files, types: findDeclaredTypings(root, shared), apis: findPiralBaseApi(root, framework), noModuleDeclaration: true, imports: (0, package_1.flattenExternals)(externals, true), logLevel, logger: createLogger(), }; (0, package_1.validateSharedDependencies)(externals); if (options.apis.length) { try { await createDeclarationFile(options, target, forceOverwrite); return true; } catch (ex) { (0, log_1.log)('declarationCouldNotBeGenerated_0076', baseDir, ex); } } else { (0, log_1.log)('declarationCouldNotBeGenerated_0076', baseDir, 'The main Pilet API interface could not be found.'); } return false; } //# sourceMappingURL=declaration.js.map