Skip to content

Commit b39dc82

Browse files
committed
feat: automatically noexport .of(redacted())
1 parent c15cfe1 commit b39dc82

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

packages/core/src/core/schema/core/schema.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,8 +335,8 @@ export function defineSchema<Ops extends SchematicOps<unknown>>(
335335
*/
336336
export function extractOps<O extends SchematicOps<unknown>>(
337337
schema: Schema<OpsValueType<O>>,
338-
): O {
339-
return schema() as O;
338+
): Partial<O> {
339+
return schema() as Partial<O>;
340340
}
341341

342342
/**

packages/core/src/core/schema/definition/structures/redact-schema.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ import {
1616
executeOp,
1717
} from "../../core/schema.js";
1818

19-
type RedactSchemaOps<T = unknown> = SchematicOps<T> & {
19+
export type RedactOps<T = unknown> = SchematicOps<T> & {
2020
redact(): void;
2121
schema(): Schema<T>;
2222
};
2323

2424
export function redactSchema<T = unknown>(schema: Schema<T>): Schema<T> {
25-
return defineSchema<RedactSchemaOps<T>>({
25+
return defineSchema<RedactOps<T>>({
2626
merge(context) {
2727
const merged = executeOp(schema, "merge", context);
2828

packages/core/src/core/schema/definition/structures/reference-schema.ts

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ import {
1818
executeOp,
1919
isMatchingContext,
2020
SchemaRenderContext,
21+
extractOps,
2122
} from "../../core/schema.js";
2223
import { parseScopedIdentifier } from "../../core/scope.js";
2324
import { expandTemplate, templateTrampoline } from "../../template.js";
25+
import { RedactOps } from "./redact-schema.js";
2426
import { stubSchema } from "./stub-schema.js";
2527

2628
type ReferenceOps<T = unknown> = SchematicOps<T> & {
@@ -43,12 +45,23 @@ export function referenceSchema<T = unknown>(
4345
const schemaDefintion = defineSchema<ReferenceOps<T>>({
4446
merge(context) {
4547
const merged = executeOp(schema, "merge", context);
48+
let mergedHint = hint;
4649

4750
if (merged && context.stub !== undefined) {
51+
if (
52+
typeof context.stub === "function" &&
53+
extractOps<RedactOps<T>>(context.stub as Schema<T>).redact
54+
) {
55+
mergedHint = `${hint}@`;
56+
}
57+
4858
context.scope.define(context, reference, context.stub);
4959
}
5060

51-
return merged && referenceSchema(reference, { schema: merged, hint });
61+
return (
62+
merged &&
63+
referenceSchema(reference, { schema: merged, hint: mergedHint })
64+
);
5265
},
5366
async render(context) {
5467
const value = context.scope.resolve(context, reference);
@@ -127,12 +140,23 @@ export function referenceSchema<T = unknown>(
127140
return referenceSchema(`${reference}.@key`, { hint, schema });
128141
},
129142
of(definition: unknown) {
130-
return templateTrampoline((context) =>
131-
referenceSchema(reference, {
132-
hint,
133-
schema: expandTemplate(definition, context),
134-
}),
135-
);
143+
return templateTrampoline((context) => {
144+
let ofHint = hint;
145+
146+
const schema = expandTemplate(definition, context);
147+
148+
if (
149+
typeof schema === "function" &&
150+
extractOps<RedactOps<T>>(schema as Schema<T>).redact
151+
) {
152+
ofHint = `${hint}@`;
153+
}
154+
155+
return referenceSchema(reference, {
156+
hint: ofHint,
157+
schema,
158+
});
159+
});
136160
},
137161
}[property]
138162
);

0 commit comments

Comments
 (0)