281 lines
11 KiB
JavaScript
281 lines
11 KiB
JavaScript
"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
|