UNPKG

@iexec/iapp

Version:

A CLI to guide you through the process of building an iExec iApp

63 lines 2.76 kB
import { readFile, writeFile } from 'node:fs/promises'; import { z } from 'zod'; import { fromError } from 'zod-validation-error'; import { CHAINS_CONFIGURATIONS, CONFIG_FILE, DEFAULT_CHAIN, LEGACY_TEMPLATE_NAMES, SUPPORTED_CHAINS, TEMPLATES, } from '../config/config.js'; const chainNameSchema = z.enum(SUPPORTED_CHAINS); export const projectNameSchema = z .string() .min(2, 'Must contain at least 2 characters') // docker image name constraint .refine((value) => !/(^\s)|(\s$)/.test(value), 'Should not start or end with space') .refine((value) => /^[a-zA-Z0-9- ]+$/.test(value ?? ''), 'Only letters, numbers, spaces, and hyphens are allowed'); const dockerImageNameSchema = z .string() .refine((value) => /^[a-z0-9-]+$/.test(value ?? ''), 'Invalid docker image name'); const jsonConfigFileSchema = z.object({ defaultChain: chainNameSchema.default(DEFAULT_CHAIN), projectName: projectNameSchema, template: z .enum(Object.keys(TEMPLATES).concat(LEGACY_TEMPLATE_NAMES)) .default('JavaScript'), dockerhubUsername: z.string().optional(), dockerhubAccessToken: z.string().optional(), walletPrivateKey: z.string().optional(), walletFileName: z.string().optional(), appSecret: z.string().optional().nullable(), // can be null or string (null means do no use secret) }); // transform the projectName into a suitable docker image name (no space, lowercase only) export function projectNameToImageName(projectName = '') { const imageName = projectName.toLowerCase().replaceAll(' ', '-'); return dockerImageNameSchema.parse(imageName); } // Read JSON configuration file export async function readIAppConfig() { const configContent = await readFile(CONFIG_FILE, 'utf8').catch(() => { throw Error(`Failed to read \`${CONFIG_FILE}\` file. Are you in your iApp project folder?`); }); let configAsObject; try { configAsObject = JSON.parse(configContent); } catch { throw Error(`Failed to read \`${CONFIG_FILE}\` file, JSON seems to be invalid.`); } try { return jsonConfigFileSchema.parse(configAsObject); } catch (err) { const validationError = fromError(err); const errorMessage = `Failed to read \`${CONFIG_FILE}\` file: ${validationError.toString()}`; throw Error(errorMessage); } } // Utility function to write the iApp JSON configuration file export async function writeIAppConfig(config) { await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2)); } export function getChainConfig(name) { const conf = CHAINS_CONFIGURATIONS[name]; if (!conf) { throw Error(`Unsupported chain ${name}`); } return { name, ...conf }; } //# sourceMappingURL=iAppConfigFile.js.map