"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.extend = exports.Templates = exports.test = exports.ENSURE_PATH_EXISTS = exports.IS_VALID_STRING = exports.ENSURE_DIRECTORY_WRITABLE = exports.extendSchema = exports.TransformersDescription = exports.Transformers = exports.E_PATH = void 0; const zod_1 = require("zod"); const path = __importStar(require("path")); const node_fs_1 = require("node:fs"); const primitives_1 = require("@plastichub/core/primitives"); const logger_1 = require("../logger"); const exists_1 = require("@plastichub/fs/exists"); const read_1 = require("@plastichub/fs/read"); const variables_1 = require("../variables"); const __1 = require("../"); const fs_1 = require("../lib/fs"); const DefaultPathSchemaBase = zod_1.z.string().describe('Path to a file or directory'); const PathErrorMessages = { INVALID_INPUT: 'INVALID_INPUT: ${inputPath}', PATH_DOES_NOT_EXIST: 'Path does not exist ${inputPath} = ${resolvedPath}', DIRECTORY_NOT_WRITABLE: 'Directory is not writable ${inputPath} = ${resolvedPath}', NOT_A_DIRECTORY: 'Path is not a directory or does not exist ${inputPath} = ${resolvedPath}', NOT_A_JSON_FILE: 'File is not a JSON file or does not exist ${inputPath} = ${resolvedPath}', PATH_NOT_ABSOLUTE: 'Path is not absolute ${inputPath} = ${resolvedPath}', PATH_NOT_RELATIVE: 'Path is not relative ${inputPath} = ${resolvedPath}', }; var E_PATH; (function (E_PATH) { E_PATH[E_PATH["ENSURE_PATH_EXISTS"] = 1] = "ENSURE_PATH_EXISTS"; E_PATH[E_PATH["INVALID_INPUT"] = 2] = "INVALID_INPUT"; E_PATH[E_PATH["ENSURE_DIRECTORY_WRITABLE"] = 3] = "ENSURE_DIRECTORY_WRITABLE"; E_PATH[E_PATH["ENSURE_FILE_IS_JSON"] = 4] = "ENSURE_FILE_IS_JSON"; E_PATH[E_PATH["ENSURE_PATH_IS_ABSOLUTE"] = 5] = "ENSURE_PATH_IS_ABSOLUTE"; E_PATH[E_PATH["ENSURE_PATH_IS_RELATIVE"] = 6] = "ENSURE_PATH_IS_RELATIVE"; E_PATH[E_PATH["GET_PATH_INFO"] = 7] = "GET_PATH_INFO"; })(E_PATH || (exports.E_PATH = E_PATH = {})); exports.Transformers = { resolve: (val, variables = {}) => { if (!val) { return null; } return { resolved: path.resolve((0, variables_1.resolve)(val, false, variables)), source: val }; }, json: (val, variables = {}) => { if (!val) { return null; } const resolved = path.resolve((0, variables_1.resolve)((0, primitives_1.isString)(val) ? val : val.source, false, variables)); return { resolved, source: val, value: (0, read_1.sync)(resolved, 'json') }; }, string: (val, variables = {}) => { if (!val) { return null; } let src = (0, primitives_1.isString)(val) ? val : val.source; src = (0, variables_1.resolve)(src, false, variables); const resolved = path.resolve(src); if (!(0, exists_1.sync)(resolved) || !(0, fs_1.isFile)(resolved)) { return { resolved, source: val, value: null }; } else { let value = null; try { value = (0, read_1.sync)(resolved, 'string'); } catch (e) { logger_1.logger.error('Failed to read file', { resolved, source: val, error: e.message }); } return { resolved, source: val, value }; } } }; exports.TransformersDescription = [ { description: 'RESOLVE_PATH', fn: exports.Transformers.resolve }, { description: 'READ_JSON', fn: exports.Transformers.json }, { description: 'READ_STRING', fn: exports.Transformers.string } ]; const extendType = (type, extend, variables = {}) => { if (Array.isArray(extend.refine)) { for (const refine of extend.refine) { type = type.refine(refine); } } else { type = type.refine(extend.refine); } if (Array.isArray(extend.transform)) { for (const transform of extend.transform) { type = type.transform((val) => transform(val, variables)); } } else { type = type.transform(extend.transform); } return type; }; const extendTypeDescription = (type, extension, variables = {}) => { const description = (0, __1.getDescription)(type) || ''; let transformerDescriptions = 'Transformers:\n'; if (Array.isArray(extension.transform)) { for (const transform of extension.transform) { transformerDescriptions += transformerDescription(transform) + '\n'; } } else { transformerDescriptions += transformerDescription(extension.transform) + '\n'; } type = type.describe(description + '\n' + transformerDescriptions); return type; }; const transformerDescription = (fn) => { const description = exports.TransformersDescription.find((t) => t.fn === fn); return description ? description.description : 'Unknown'; }; const extendSchema = (baseSchema, extend) => { const baseShape = baseSchema.shape; const extendedShape = Object.assign({}, baseShape); for (const [key, refines] of Object.entries(extend)) { if (!baseShape[key]) continue; let fieldSchema = baseShape[key]; if (Array.isArray(refines.refine)) { for (const refine of refines.refine) { fieldSchema = fieldSchema.superRefine(refine); } } else { fieldSchema = fieldSchema.superRefine(refines); } if (Array.isArray(refines.transform)) { for (const transform of refines.transform) { fieldSchema = fieldSchema.transform((val) => transform(val)); } } else { fieldSchema = fieldSchema.transform(refines.transform); } extendedShape[key] = fieldSchema; } return zod_1.z.object(extendedShape); }; exports.extendSchema = extendSchema; const ENSURE_DIRECTORY_WRITABLE = (inputPath, ctx, variables) => { const resolvedPath = path.resolve((0, variables_1.resolve)(inputPath, false, variables)); const parts = path.parse(resolvedPath); if (resolvedPath && (0, node_fs_1.existsSync)(parts.dir) && (0, node_fs_1.lstatSync)(parts.dir).isDirectory()) { try { (0, node_fs_1.accessSync)(resolvedPath, node_fs_1.constants.W_OK); return resolvedPath; } catch (e) { ctx.addIssue({ code: E_PATH.ENSURE_DIRECTORY_WRITABLE, message: (0, variables_1.resolveVariables)(PathErrorMessages.DIRECTORY_NOT_WRITABLE, false, { inputPath, resolvedPath }) }); return zod_1.z.NEVER; } } else { ctx.addIssue({ code: E_PATH.ENSURE_DIRECTORY_WRITABLE, message: (0, variables_1.resolveVariables)(PathErrorMessages.NOT_A_DIRECTORY, false, { inputPath, resolvedPath }) }); return zod_1.z.NEVER; } }; exports.ENSURE_DIRECTORY_WRITABLE = ENSURE_DIRECTORY_WRITABLE; const IS_VALID_STRING = (inputPath) => { return (0, primitives_1.isString)(inputPath); }; exports.IS_VALID_STRING = IS_VALID_STRING; const ENSURE_PATH_EXISTS = (inputPath, ctx, variables) => { if (!inputPath || !ctx) { return zod_1.z.NEVER; } if (!(0, primitives_1.isString)(inputPath)) { ctx.addIssue({ code: E_PATH.INVALID_INPUT, message: (0, variables_1.resolveVariables)(PathErrorMessages.INVALID_INPUT, false, {}) }); return zod_1.z.NEVER; } const resolvedPath = path.resolve((0, variables_1.resolve)(inputPath, false, variables)); if (!(0, exists_1.sync)(resolvedPath)) { ctx.addIssue({ code: E_PATH.ENSURE_PATH_EXISTS, message: (0, variables_1.resolveVariables)(PathErrorMessages.PATH_DOES_NOT_EXIST, false, { inputPath, resolvedPath }) }); return zod_1.z.NEVER; } return resolvedPath; }; exports.ENSURE_PATH_EXISTS = ENSURE_PATH_EXISTS; const test = () => { const BaseCompilerOptions = () => zod_1.z.object({ root: DefaultPathSchemaBase.default(`${process.cwd()}`) }); const ret = (0, exports.extendSchema)(BaseCompilerOptions(), { root: { refine: [ (val, ctx) => (0, exports.ENSURE_DIRECTORY_WRITABLE)(val, ctx, (0, variables_1.DEFAULT_VARS)({ exampleVar: 'exampleValue' })), (val, ctx) => (0, exports.ENSURE_PATH_EXISTS)(val, ctx, (0, variables_1.DEFAULT_VARS)({ exampleVar: 'exampleValue' })) ], transform: [ (val) => path.resolve((0, variables_1.resolve)(val, false, (0, variables_1.DEFAULT_VARS)({ exampleVar: 'exampleValue' }))) ] } }); return ret; }; exports.test = test; exports.Templates = { json: { refine: [exports.IS_VALID_STRING, exports.ENSURE_PATH_EXISTS], transform: [exports.Transformers.resolve, exports.Transformers.json] }, string: { refine: [exports.ENSURE_PATH_EXISTS], transform: [exports.Transformers.resolve, exports.Transformers.string] } }; const extend = (baseSchema, template, variables = {}) => { const type = extendType(baseSchema, template, variables); return extendTypeDescription(type, template, variables); }; exports.extend = extend; //# sourceMappingURL=path.js.map