Files
NapCatQQ/.pnpm-store/v3/files/02/4d83fde9e44bb90c4fc71bbba841f1790b00864807ebf63bde3280ef9e10d4cd10b565afb5cdd8d594f97db5e02cbaf692bf2babdc1fa099ca09126eec96df
TanTan e311ca3275
Build NapCat Artifacts / Type Check & Test (push) Waiting to run
docs: 仓库链接指向本镜像仓库
2026-11-13 09:25:58 +08:00

130 lines
5.0 KiB
Plaintext

import { Deref, Pushref } from '../deref/index.mjs';
import { Kind } from '../../type/symbols/index.mjs';
// ------------------------------------------------------------------
// KindGuard
// ------------------------------------------------------------------
import { IsTransform, IsSchema } from '../../type/guard/kind.mjs';
// ------------------------------------------------------------------
// ValueGuard
// ------------------------------------------------------------------
import { IsUndefined } from '../guard/index.mjs';
// prettier-ignore
function FromArray(schema, references) {
return IsTransform(schema) || Visit(schema.items, references);
}
// prettier-ignore
function FromAsyncIterator(schema, references) {
return IsTransform(schema) || Visit(schema.items, references);
}
// prettier-ignore
function FromConstructor(schema, references) {
return IsTransform(schema) || Visit(schema.returns, references) || schema.parameters.some((schema) => Visit(schema, references));
}
// prettier-ignore
function FromFunction(schema, references) {
return IsTransform(schema) || Visit(schema.returns, references) || schema.parameters.some((schema) => Visit(schema, references));
}
// prettier-ignore
function FromIntersect(schema, references) {
return IsTransform(schema) || IsTransform(schema.unevaluatedProperties) || schema.allOf.some((schema) => Visit(schema, references));
}
// prettier-ignore
function FromImport(schema, references) {
const additional = globalThis.Object.getOwnPropertyNames(schema.$defs).reduce((result, key) => [...result, schema.$defs[key]], []);
const target = schema.$defs[schema.$ref];
return IsTransform(schema) || Visit(target, [...additional, ...references]);
}
// prettier-ignore
function FromIterator(schema, references) {
return IsTransform(schema) || Visit(schema.items, references);
}
// prettier-ignore
function FromNot(schema, references) {
return IsTransform(schema) || Visit(schema.not, references);
}
// prettier-ignore
function FromObject(schema, references) {
return (IsTransform(schema) ||
Object.values(schema.properties).some((schema) => Visit(schema, references)) ||
(IsSchema(schema.additionalProperties) && Visit(schema.additionalProperties, references)));
}
// prettier-ignore
function FromPromise(schema, references) {
return IsTransform(schema) || Visit(schema.item, references);
}
// prettier-ignore
function FromRecord(schema, references) {
const pattern = Object.getOwnPropertyNames(schema.patternProperties)[0];
const property = schema.patternProperties[pattern];
return IsTransform(schema) || Visit(property, references) || (IsSchema(schema.additionalProperties) && IsTransform(schema.additionalProperties));
}
// prettier-ignore
function FromRef(schema, references) {
if (IsTransform(schema))
return true;
return Visit(Deref(schema, references), references);
}
// prettier-ignore
function FromThis(schema, references) {
if (IsTransform(schema))
return true;
return Visit(Deref(schema, references), references);
}
// prettier-ignore
function FromTuple(schema, references) {
return IsTransform(schema) || (!IsUndefined(schema.items) && schema.items.some((schema) => Visit(schema, references)));
}
// prettier-ignore
function FromUnion(schema, references) {
return IsTransform(schema) || schema.anyOf.some((schema) => Visit(schema, references));
}
// prettier-ignore
function Visit(schema, references) {
const references_ = Pushref(schema, references);
const schema_ = schema;
if (schema.$id && visited.has(schema.$id))
return false;
if (schema.$id)
visited.add(schema.$id);
switch (schema[Kind]) {
case 'Array':
return FromArray(schema_, references_);
case 'AsyncIterator':
return FromAsyncIterator(schema_, references_);
case 'Constructor':
return FromConstructor(schema_, references_);
case 'Function':
return FromFunction(schema_, references_);
case 'Import':
return FromImport(schema_, references_);
case 'Intersect':
return FromIntersect(schema_, references_);
case 'Iterator':
return FromIterator(schema_, references_);
case 'Not':
return FromNot(schema_, references_);
case 'Object':
return FromObject(schema_, references_);
case 'Promise':
return FromPromise(schema_, references_);
case 'Record':
return FromRecord(schema_, references_);
case 'Ref':
return FromRef(schema_, references_);
case 'This':
return FromThis(schema_, references_);
case 'Tuple':
return FromTuple(schema_, references_);
case 'Union':
return FromUnion(schema_, references_);
default:
return IsTransform(schema);
}
}
const visited = new Set();
/** Returns true if this schema contains a transform codec */
export function HasTransform(schema, references) {
visited.clear();
return Visit(schema, references);
}