@nrfcloud/ts-json-schema-transformer
Version:
A TypeScript transformer that generates JSON schemas and validators from TypeScript interfaces
80 lines • 3.46 kB
JavaScript
;
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 (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.schemaToValidator = schemaToValidator;
const ajv_1 = __importDefault(require("ajv"));
const standalone_1 = __importDefault(require("ajv/dist/standalone"));
const crypto_1 = require("crypto");
const ts = __importStar(require("typescript"));
const formats_1 = require("./formats");
const utils_1 = require("./transformers/utils");
function schemaToValidator(schema, options) {
const ajv = new ajv_1.default({
...options,
code: {
esm: true,
source: true,
optimize: true,
lines: true,
},
strictTypes: false,
strict: false,
});
(0, utils_1.addFormatsAjv)(ajv);
(0, formats_1.convertNamedFormats)(schema);
const compiled = ajv.compile(schema);
// Provide scoped values to the validator function.
// This includes referenced schemas and validators.
// Additionally, replace the generated validator export with a default export;
const scoped = (0, standalone_1.default)(ajv, compiled).replace(/export const validate = \S+?;/g, "");
const validatorBody = (0, utils_1.fixAjvImportCode)(scoped);
const bundleValidator = `${(0, utils_1.bundleSource)(validatorBody, {
bundle: true,
platform: "node",
target: "node18",
format: "esm",
minify: true,
})}`;
const wrappedValidator = bundleValidator.replace(/export\s*?{\s*?(\S+?) as default\s*?};/g, "return $1;");
const sourceFile = ts.createSourceFile((0, crypto_1.randomUUID)(), wrappedValidator, ts.ScriptTarget.ES5, true);
markSynthesized(sourceFile);
const bodyExpression = ts.factory.createBlock(sourceFile.statements, false);
const functionExpression = ts.factory.createArrowFunction(undefined, undefined, [], undefined, undefined, bodyExpression);
const call = ts.factory.createCallExpression(functionExpression, undefined, []);
return call;
}
/**
* Strip all ranges from a node and its children as well as marking them as synthesized.
*/
function markSynthesized(node) {
node.pos = -1;
node.end = -1;
node.flags = node.flags | ts.NodeFlags.Synthesized;
ts.forEachChild(node, markSynthesized);
}
//# sourceMappingURL=transformer-utils.js.map