237 lines
19 KiB
JavaScript
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 '@/shemas/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaGVtYXMvcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUFjLE1BQU0sS0FBSyxDQUFBO0FBQ25DLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFFakUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDcEQsT0FBTyxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUVoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBT3BDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO0FBRWhGLE1BQU0saUJBQWlCLEdBQUc7SUFDdEIsYUFBYSxFQUFFLDZCQUE2QjtJQUM1QyxtQkFBbUIsRUFBRSxvREFBb0Q7SUFDekUsc0JBQXNCLEVBQUUsMERBQTBEO0lBQ2xGLGVBQWUsRUFBRSwwRUFBMEU7SUFDM0YsZUFBZSxFQUFFLDBFQUEwRTtJQUMzRixpQkFBaUIsRUFBRSxxREFBcUQ7SUFDeEUsaUJBQWlCLEVBQUUscURBQXFEO0NBQ2xFLENBQUE7QUFFVixNQUFNLENBQU4sSUFBWSxNQVFYO0FBUkQs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
|