Skip to content

Commit a214dc8

Browse files
committed
add: dynamicId support for dependencies
1 parent a571277 commit a214dc8

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

src/compileSchema.reduceSchema.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,17 @@ describe("compileSchema : reduceNode", () => {
810810
assert.deepEqual(node.dynamicId, "#(dependentSchemas/muh,dependentSchemas/rooar)");
811811
});
812812

813+
it("should add dynamicId based on selected `dependencies`", () => {
814+
const { node } = compileSchema({
815+
dependencies: {
816+
one: ["two"],
817+
two: { properties: { header: { type: "boolean" } } }
818+
}
819+
}).reduceNode({ one: true });
820+
821+
assert.deepEqual(node.dynamicId, "#(dependencies/one,dependencies/two)");
822+
});
823+
813824
it("should prefix with schemaId", () => {
814825
const { node } =
815826
compileSchema({

src/keywords/dependencies.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export function reduceDependencies({ node, data, key, path }: JsonSchemaReducerP
5252
let workingNode = node.compileSchema(node.schema, node.spointer, node.schemaId);
5353
let required = workingNode.schema.required ?? [];
5454

55+
let dynamicId = "";
5556
if (node.dependentRequired) {
5657
Object.keys(node.dependentRequired).forEach((propertyName) => {
5758
if (!hasProperty(data, propertyName) && !required.includes(propertyName)) {
@@ -61,6 +62,10 @@ export function reduceDependencies({ node, data, key, path }: JsonSchemaReducerP
6162
return;
6263
}
6364
required.push(...node.dependentRequired[propertyName]);
65+
66+
// @dynamicId
67+
const localDynamicId = `dependencies/${propertyName}`;
68+
dynamicId += `${dynamicId === "" ? "" : ","}${localDynamicId}`;
6469
});
6570
}
6671

@@ -85,6 +90,11 @@ export function reduceDependencies({ node, data, key, path }: JsonSchemaReducerP
8590
if (workingNode.schema.required) {
8691
required.push(...workingNode.schema.required);
8792
}
93+
94+
// @dynamicId
95+
const nestedDynamicId = reducedDependency.dynamicId?.replace(node.dynamicId, "") ?? "";
96+
const localDynamicId = nestedDynamicId === "" ? `dependencies/${propertyName}` : nestedDynamicId;
97+
dynamicId += `${dynamicId === "" ? "" : ","}${localDynamicId}`;
8898
});
8999
}
90100

@@ -103,7 +113,12 @@ export function reduceDependencies({ node, data, key, path }: JsonSchemaReducerP
103113
required = workingNode.schema.required ? workingNode.schema.required.concat(...required) : required;
104114
required = required.filter((r: string, index: number, list: string[]) => list.indexOf(r) === index);
105115
workingNode = mergeNode(workingNode, workingNode, "dependencies");
106-
return workingNode.compileSchema({ ...workingNode.schema, required }, workingNode.spointer, workingNode.schemaId);
116+
return workingNode.compileSchema(
117+
{ ...workingNode.schema, required },
118+
workingNode.spointer,
119+
workingNode.schemaId,
120+
`${node.schemaId}(${dynamicId})`
121+
);
107122
}
108123

109124
function validateDependencies({ node, data, pointer, path }: JsonSchemaValidatorParams) {

0 commit comments

Comments
 (0)