123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.parseDef = void 0;
- const Options_js_1 = require("./Options.js");
- const selectParser_js_1 = require("./selectParser.js");
- function parseDef(def, refs, forceResolution = false) {
- const seenItem = refs.seen.get(def);
- if (refs.override) {
- const overrideResult = refs.override?.(def, refs, seenItem, forceResolution);
- if (overrideResult !== Options_js_1.ignoreOverride) {
- return overrideResult;
- }
- }
- if (seenItem && !forceResolution) {
- const seenSchema = get$ref(seenItem, refs);
- if (seenSchema !== undefined) {
- return seenSchema;
- }
- }
- const newItem = { def, path: refs.currentPath, jsonSchema: undefined };
- refs.seen.set(def, newItem);
- const jsonSchemaOrGetter = (0, selectParser_js_1.selectParser)(def, def.typeName, refs);
- // If the return was a function, then the inner definition needs to be extracted before a call to parseDef (recursive)
- const jsonSchema = typeof jsonSchemaOrGetter === "function"
- ? parseDef(jsonSchemaOrGetter(), refs)
- : jsonSchemaOrGetter;
- if (jsonSchema) {
- addMeta(def, refs, jsonSchema);
- }
- if (refs.postProcess) {
- const postProcessResult = refs.postProcess(jsonSchema, def, refs);
- newItem.jsonSchema = jsonSchema;
- return postProcessResult;
- }
- newItem.jsonSchema = jsonSchema;
- return jsonSchema;
- }
- exports.parseDef = parseDef;
- const get$ref = (item, refs) => {
- switch (refs.$refStrategy) {
- case "root":
- return { $ref: item.path.join("/") };
- case "relative":
- return { $ref: getRelativePath(refs.currentPath, item.path) };
- case "none":
- case "seen": {
- if (item.path.length < refs.currentPath.length &&
- item.path.every((value, index) => refs.currentPath[index] === value)) {
- console.warn(`Recursive reference detected at ${refs.currentPath.join("/")}! Defaulting to any`);
- return {};
- }
- return refs.$refStrategy === "seen" ? {} : undefined;
- }
- }
- };
- const getRelativePath = (pathA, pathB) => {
- let i = 0;
- for (; i < pathA.length && i < pathB.length; i++) {
- if (pathA[i] !== pathB[i])
- break;
- }
- return [(pathA.length - i).toString(), ...pathB.slice(i)].join("/");
- };
- const addMeta = (def, refs, jsonSchema) => {
- if (def.description) {
- jsonSchema.description = def.description;
- if (refs.markdownDescription) {
- jsonSchema.markdownDescription = def.description;
- }
- }
- return jsonSchema;
- };
|