mono/packages/commons/dist/schemas/path.js
2025-02-20 21:02:11 +01:00

237 lines
19 KiB
JavaScript

import { z } from 'zod';
import * as path from 'path';
import { accessSync, constants, lstatSync, existsSync } from 'fs';
import { isString } from '@polymech/core/primitives';
import { sync as exists } from '@polymech/fs/exists';
import { sync as read } from '@polymech/fs/read';
import { logger } from '../logger.js';
import { DEFAULT_VARS, resolve, template } from '../variables.js';
import { getDescription } from './index.js';
import { isFile } from '../lib/fs.js';
const DefaultPathSchemaBase = 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}',
};
export 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 || (E_PATH = {}));
export const Transformers = {
resolve: (val, variables = {}) => {
if (!val) {
return null;
}
return {
resolved: path.resolve(resolve(val, false, variables)),
source: val
};
},
json: (val, variables = {}) => {
if (!val) {
return null;
}
const resolved = path.resolve(resolve(isString(val) ? val : val.source, false, variables));
return {
resolved,
source: val,
value: read(resolved, 'json')
};
},
string: (val, variables = {}) => {
if (!val) {
return null;
}
let src = isString(val) ? val : val.source;
src = resolve(src, false, variables);
const resolved = path.resolve(src);
if (!exists(resolved) || !isFile(resolved)) {
return {
resolved,
source: val,
value: null
};
}
else {
let value = null;
try {
value = read(resolved, 'string');
}
catch (e) {
logger.error('Failed to read file', { resolved, source: val, error: e.message });
}
return {
resolved,
source: val,
value
};
}
}
};
export const TransformersDescription = [
{
description: 'RESOLVE_PATH',
fn: Transformers.resolve
},
{
description: 'READ_JSON',
fn: Transformers.json
},
{
description: 'READ_STRING',
fn: 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 = 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 = TransformersDescription.find((t) => t.fn === fn);
return description ? description.description : 'Unknown';
};
export const extendSchema = (baseSchema, extend) => {
const baseShape = baseSchema.shape;
const extendedShape = { ...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 z.object(extendedShape);
};
export const ENSURE_DIRECTORY_WRITABLE = (inputPath, ctx, variables) => {
const resolvedPath = path.resolve(resolve(inputPath, false, variables));
const parts = path.parse(resolvedPath);
if (resolvedPath && existsSync(parts.dir) && lstatSync(parts.dir).isDirectory()) {
try {
accessSync(resolvedPath, constants.W_OK);
return resolvedPath;
}
catch (e) {
ctx.addIssue({
code: E_PATH.ENSURE_DIRECTORY_WRITABLE,
message: template(PathErrorMessages.DIRECTORY_NOT_WRITABLE, { inputPath, resolvedPath })
});
return z.NEVER;
}
}
else {
ctx.addIssue({
code: E_PATH.ENSURE_DIRECTORY_WRITABLE,
message: template(PathErrorMessages.NOT_A_DIRECTORY, { inputPath, resolvedPath })
});
return z.NEVER;
}
};
export const IS_VALID_STRING = (inputPath) => isString(inputPath);
export const ENSURE_PATH_EXISTS = (inputPath, ctx, variables) => {
if (!inputPath || !ctx) {
return z.NEVER;
}
if (!isString(inputPath)) {
ctx.addIssue({
code: E_PATH.INVALID_INPUT,
message: template(PathErrorMessages.INVALID_INPUT, {})
});
return z.NEVER;
}
const resolvedPath = path.resolve(resolve(inputPath, false, variables));
if (!exists(resolvedPath)) {
ctx.addIssue({
code: E_PATH.ENSURE_PATH_EXISTS,
message: template(PathErrorMessages.PATH_DOES_NOT_EXIST, { inputPath, resolvedPath })
});
return z.NEVER;
}
return resolvedPath;
};
export const test = () => {
const BaseCompilerOptions = () => z.object({
root: DefaultPathSchemaBase.default(`${process.cwd()}`)
});
const ret = extendSchema(BaseCompilerOptions(), {
root: {
refine: [
(val, ctx) => ENSURE_DIRECTORY_WRITABLE(val, ctx, DEFAULT_VARS({ exampleVar: 'exampleValue' })),
(val, ctx) => ENSURE_PATH_EXISTS(val, ctx, DEFAULT_VARS({ exampleVar: 'exampleValue' }))
],
transform: [
(val) => path.resolve(resolve(val, false, DEFAULT_VARS({ exampleVar: 'exampleValue' })))
]
}
});
return ret;
};
export const Templates = {
json: {
refine: [IS_VALID_STRING, ENSURE_PATH_EXISTS],
transform: [Transformers.resolve, Transformers.json]
},
string: {
refine: [ENSURE_PATH_EXISTS],
transform: [Transformers.resolve, Transformers.string]
}
};
export const extend = (baseSchema, template, variables = {}) => {
const type = extendType(baseSchema, template, variables);
return extendTypeDescription(type, template, variables);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWFzL3BhdGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLENBQUMsRUFBYyxNQUFNLEtBQUssQ0FBQTtBQUNuQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUM1QixPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBRWpFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFPckMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLDZCQUE2QixDQUFDLENBQUE7QUFFaEYsTUFBTSxpQkFBaUIsR0FBRztJQUN0QixhQUFhLEVBQUUsNkJBQTZCO0lBQzVDLG1CQUFtQixFQUFFLG9EQUFvRDtJQUN6RSxzQkFBc0IsRUFBRSwwREFBMEQ7SUFDbEYsZUFBZSxFQUFFLDBFQUEwRTtJQUMzRixlQUFlLEVBQUUsMEVBQTBFO0lBQzNGLGlCQUFpQixFQUFFLHFEQUFxRDtJQUN4RSxpQkFBaUIsRUFBRSxxREFBcUQ7Q0FDbEUsQ0FBQTtBQUVWLE1BQU0sQ0FBTixJQUFZLE1BUVg7QUFSRCxX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