@astryxdesign/cli 0.6.3-canary.ea2f048 → 0.6.3-canary.ebaebc4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/api/build/build.type.d.mts +2 -2
- package/api/build/build.type.mjs +2 -2
- package/api/component/component.type.d.mts +6 -6
- package/api/component/component.type.mjs +19 -19
- package/api/discover/discover.type.d.mts +4 -4
- package/api/discover/discover.type.mjs +10 -10
- package/api/docs/_adapter.d.mts +37 -24
- package/api/docs/_adapter.mjs +169 -83
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.mjs +14 -63
- package/api/docs/detail/section/section.d.mts +1 -1
- package/api/docs/detail/section/section.mjs +44 -20
- package/api/docs/detail/section/section.test.mjs +41 -0
- package/api/docs/docs.d.mts +7 -2
- package/api/docs/docs.doc.mjs +27 -10
- package/api/docs/docs.mjs +16 -9
- package/api/docs/docs.test.mjs +6 -0
- package/api/docs/docs.type.d.mts +40 -3
- package/api/docs/docs.type.mjs +36 -8
- package/api/docs/index/index.d.mts +18 -0
- package/api/docs/index/index.mjs +32 -0
- package/api/docs/index/index.test.mjs +62 -0
- package/api/docs/integrationDocs.test.mjs +106 -0
- package/api/doctor/doctor.d.mts +48 -0
- package/api/doctor/doctor.mjs +232 -0
- package/api/doctor/doctor.test.mjs +196 -0
- package/api/hook/hook.type.d.mts +3 -3
- package/api/hook/hook.type.mjs +11 -11
- package/api/hook/list/list.d.mts +1 -1
- package/api/integration/add-contribution.mjs +5 -3
- package/api/integration/add-contribution.test.mjs +4 -4
- package/api/integration/integration-authoring.type.d.mts +1 -1
- package/api/integration/pack-check.mjs +49 -7
- package/api/integration/pack-check.test.mjs +249 -0
- package/api/search/search.d.mts +1 -1
- package/api/search/search.mjs +5 -5
- package/api/search/search.type.d.mts +2 -2
- package/api/search/search.type.mjs +1 -1
- package/api/swizzle/swizzle.type.d.mts +2 -2
- package/api/swizzle/swizzle.type.mjs +2 -2
- package/api/template/template.d.mts +1 -1
- package/api/template/template.type.d.mts +6 -6
- package/api/template/template.type.mjs +12 -12
- package/api/theme/build/build.mjs +20 -6
- package/api/theme/build/build.test.mjs +127 -0
- package/api/theme/palette/generate/generate.mjs +1 -1
- package/api/theme/palette/generate/generator.d.mts +10 -13
- package/api/theme/palette/generate/generator.mjs +7 -3
- package/api/theme/theme.type.d.mts +170 -11
- package/api/theme/theme.type.mjs +94 -27
- package/api/upgrade/_adapter.mjs +71 -5
- package/api/upgrade/project-context.test.mjs +272 -0
- package/api/upgrade/upgrade.doc.mjs +4 -3
- package/api/upgrade/upgrade.type.d.mts +5 -5
- package/api/upgrade/upgrade.type.mjs +11 -11
- package/assets/codemods/integration-discovery.mjs +40 -2
- package/assets/codemods/integration-discovery.test.mjs +58 -0
- package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
- package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
- package/assets/docs/README.md +9 -0
- package/assets/docs/authoring.doc.mjs +14 -0
- package/assets/docs/cli-integrations.doc.mjs +86 -15
- package/assets/docs/styling-libraries.doc.mjs +1 -1
- package/assets/docs/working-with-ai.doc.mjs +1 -1
- package/authoring/_shared/contract.ts +22 -0
- package/authoring/codemod/codemod.doc.mjs +6 -1
- package/authoring/codemod/parse.d.mts +8 -8
- package/authoring/codemod/parse.mjs +8 -6
- package/authoring/config/parse.d.mts +13 -13
- package/authoring/config/parse.mjs +8 -8
- package/authoring/config/type.ts +3 -3
- package/authoring/debug/parse.d.mts +5 -5
- package/authoring/debug/parse.mjs +3 -3
- package/authoring/doctypes/_schema.d.mts +788 -23
- package/authoring/doctypes/_schema.mjs +492 -39
- package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
- package/authoring/doctypes/base/graph-fields.doc.mjs +62 -0
- package/authoring/doctypes/base/type.ts +40 -0
- package/authoring/doctypes/command/command.doc.mjs +3 -2
- package/authoring/doctypes/command/parse.d.mts +2 -2
- package/authoring/doctypes/command/parse.mjs +1 -1
- package/authoring/doctypes/command/type.ts +3 -2
- package/authoring/doctypes/component/component.doc.mjs +6 -3
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +4 -3
- package/authoring/doctypes/enum/parse.d.mts +2 -2
- package/authoring/doctypes/enum/parse.mjs +1 -1
- package/authoring/doctypes/enum/type.ts +3 -1
- package/authoring/doctypes/function/function.doc.mjs +4 -0
- package/authoring/doctypes/function/parse.d.mts +2 -2
- package/authoring/doctypes/function/parse.mjs +1 -1
- package/authoring/doctypes/function/type.ts +6 -2
- package/authoring/doctypes/hook/hook.doc.mjs +4 -0
- package/authoring/doctypes/hook/parse.d.mts +2 -2
- package/authoring/doctypes/hook/parse.mjs +1 -1
- package/authoring/doctypes/hook/type.ts +3 -2
- package/authoring/doctypes/legacy.d.mts +8 -6
- package/authoring/doctypes/legacy.mjs +5 -4
- package/authoring/doctypes/load-contract.test.mjs +207 -0
- package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +132 -0
- package/authoring/doctypes/namespace/parse.d.mts +12 -0
- package/authoring/doctypes/namespace/parse.mjs +25 -0
- package/authoring/doctypes/namespace/parse.test.mjs +165 -0
- package/authoring/doctypes/namespace/type.ts +71 -0
- package/authoring/doctypes/parse.d.mts +20 -18
- package/authoring/doctypes/parse.mjs +16 -10
- package/authoring/doctypes/parse.test.mjs +77 -3
- package/authoring/doctypes/reference/parse.d.mts +2 -2
- package/authoring/doctypes/reference/parse.mjs +8 -5
- package/authoring/doctypes/reference/reference.doc.mjs +17 -4
- package/authoring/doctypes/reference/type.ts +51 -5
- package/authoring/doctypes/schema/parse.d.mts +2 -2
- package/authoring/doctypes/schema/parse.mjs +1 -1
- package/authoring/doctypes/schema/type.ts +3 -2
- package/authoring/doctypes/template/parse.d.mts +92 -1
- package/authoring/doctypes/template/parse.mjs +36 -2
- package/authoring/doctypes/template/parse.test.mjs +8 -2
- package/authoring/doctypes/template/template.doc.mjs +4 -0
- package/authoring/doctypes/template/type.ts +5 -2
- package/authoring/doctypes/types.ts +10 -9
- package/authoring/gap-report/parse.d.mts +10 -10
- package/authoring/gap-report/parse.mjs +6 -6
- package/authoring/gap-report/type.ts +1 -1
- package/authoring/identity/identity.doc.d.mts +9 -0
- package/authoring/identity/identity.doc.mjs +61 -0
- package/authoring/identity/type.ts +132 -0
- package/authoring/index.d.mts +1 -0
- package/authoring/index.d.ts +49 -17
- package/authoring/index.mjs +1 -0
- package/authoring/integration/integration.doc.mjs +13 -6
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/parse.test.mjs +10 -1
- package/authoring/integration/schema.d.mts +6 -4
- package/authoring/integration/schema.mjs +9 -3
- package/authoring/integration/type.ts +23 -6
- package/authoring/shadcn/receipt.d.mts +6 -6
- package/clients/cli/commands/docs.doc.mjs +13 -3
- package/clients/cli/commands/docs.mjs +121 -21
- package/clients/cli/commands/docs.test.mjs +88 -0
- package/clients/cli/commands/integration-authoring.test.mjs +13 -9
- package/clients/cli/commands/theme-palette-generate.doc.mjs +8 -4
- package/clients/cli/commands/upgrade.doc.mjs +2 -2
- package/clients/cli/formatters/index.mjs +162 -1
- package/clients/cli/formatters/index.test.mjs +91 -0
- package/clients/cli/lib/manifest.mjs +7 -2
- package/foundation/config/project.mjs +21 -6
- package/foundation/discovery/authoring-self-docs.d.mts +69 -0
- package/foundation/discovery/authoring-self-docs.mjs +214 -0
- package/foundation/discovery/authoring-self-docs.test.mjs +154 -0
- package/foundation/discovery/component-discovery.d.mts +1 -1
- package/foundation/discovery/component-discovery.mjs +2 -1
- package/foundation/discovery/docs-discovery.d.mts +11 -4
- package/foundation/discovery/docs-discovery.mjs +208 -88
- package/foundation/discovery/docs-discovery.test.mjs +279 -13
- package/foundation/discovery/docs-output-budget.d.mts +28 -0
- package/foundation/discovery/docs-output-budget.mjs +50 -0
- package/foundation/discovery/docs-section-key.d.mts +98 -0
- package/foundation/discovery/docs-section-key.mjs +221 -0
- package/foundation/discovery/docs-section-key.test.mjs +224 -0
- package/foundation/discovery/template-adapter.mjs +2 -1
- package/foundation/discovery/theming-targets.test.mjs +4 -0
- package/foundation/doc-compiler/compile.d.mts +162 -0
- package/foundation/doc-compiler/compile.mjs +262 -0
- package/foundation/doc-compiler/doc-compiler.test.mjs +687 -0
- package/foundation/doc-compiler/ir.d.mts +9 -0
- package/foundation/doc-compiler/ir.mjs +287 -0
- package/foundation/doc-compiler/lenses.d.mts +33 -0
- package/foundation/doc-compiler/lenses.mjs +127 -0
- package/foundation/identity/provider-identity.d.mts +90 -0
- package/foundation/identity/provider-identity.mjs +320 -0
- package/foundation/identity/provider-identity.test.mjs +254 -0
- package/foundation/identity/providers.d.mts +7 -0
- package/foundation/identity/providers.mjs +16 -0
- package/foundation/integrations/autolink.mjs +12 -5
- package/foundation/integrations/integration-warnings.mjs +6 -0
- package/foundation/integrations/integrations.d.mts +46 -2
- package/foundation/integrations/integrations.mjs +167 -8
- package/foundation/integrations/integrations.test.mjs +384 -1
- package/foundation/integrations/provider-conflicts.test.mjs +125 -0
- package/foundation/integrations/validate-contributions.d.mts +2 -0
- package/foundation/integrations/validate-contributions.mjs +10 -0
- package/foundation/response/json-contract.test.mjs +46 -17
- package/foundation/response/response-types.doc.mjs +6 -1
- package/package.json +9 -11
|
@@ -15,16 +15,18 @@ import {parseTemplate} from './template/parse.mjs';
|
|
|
15
15
|
import {parseSchema} from './schema/parse.mjs';
|
|
16
16
|
import {parseCommand} from './command/parse.mjs';
|
|
17
17
|
import {parseEnum} from './enum/parse.mjs';
|
|
18
|
+
import {parseNamespace} from './namespace/parse.mjs';
|
|
18
19
|
import {parseLegacyDoc} from './legacy.mjs';
|
|
19
20
|
|
|
20
|
-
/** @typedef {import('./types').ComponentDoc} ComponentDoc */
|
|
21
|
-
/** @typedef {import('./types').HookDoc} HookDoc */
|
|
22
|
-
/** @typedef {import('./types').FunctionDoc} FunctionDoc */
|
|
23
|
-
/** @typedef {import('./types').ReferenceDoc} ReferenceDoc */
|
|
24
|
-
/** @typedef {import('./types').TemplateDoc} TemplateDoc */
|
|
25
|
-
/** @typedef {import('./types').SchemaDoc} SchemaDoc */
|
|
26
|
-
/** @typedef {import('./types').CommandDoc} CommandDoc */
|
|
27
|
-
/** @typedef {import('./types').EnumDoc} EnumDoc */
|
|
21
|
+
/** @typedef {import('./types.js').ComponentDoc} ComponentDoc */
|
|
22
|
+
/** @typedef {import('./types.js').HookDoc} HookDoc */
|
|
23
|
+
/** @typedef {import('./types.js').FunctionDoc} FunctionDoc */
|
|
24
|
+
/** @typedef {import('./types.js').ReferenceDoc} ReferenceDoc */
|
|
25
|
+
/** @typedef {import('./types.js').TemplateDoc} TemplateDoc */
|
|
26
|
+
/** @typedef {import('./types.js').SchemaDoc} SchemaDoc */
|
|
27
|
+
/** @typedef {import('./types.js').CommandDoc} CommandDoc */
|
|
28
|
+
/** @typedef {import('./types.js').EnumDoc} EnumDoc */
|
|
29
|
+
/** @typedef {import('./types.js').NamespaceDoc} NamespaceDoc */
|
|
28
30
|
|
|
29
31
|
/**
|
|
30
32
|
* Validate an unknown loaded doc value into its typed shape, or throw.
|
|
@@ -34,7 +36,7 @@ import {parseLegacyDoc} from './legacy.mjs';
|
|
|
34
36
|
*
|
|
35
37
|
* @param {unknown} input
|
|
36
38
|
* @param {string} [label]
|
|
37
|
-
* @returns {ComponentDoc | HookDoc | FunctionDoc | ReferenceDoc | TemplateDoc | SchemaDoc | CommandDoc | EnumDoc}
|
|
39
|
+
* @returns {ComponentDoc | HookDoc | FunctionDoc | ReferenceDoc | TemplateDoc | SchemaDoc | CommandDoc | EnumDoc | NamespaceDoc}
|
|
38
40
|
*/
|
|
39
41
|
export function parseDoc(input, label = 'doc') {
|
|
40
42
|
const type =
|
|
@@ -58,7 +60,11 @@ export function parseDoc(input, label = 'doc') {
|
|
|
58
60
|
return parseCommand(input, label);
|
|
59
61
|
case 'enum':
|
|
60
62
|
return parseEnum(input, label);
|
|
61
|
-
|
|
63
|
+
case 'namespace':
|
|
64
|
+
return parseNamespace(input, label);
|
|
65
|
+
case undefined:
|
|
62
66
|
return parseLegacyDoc(input, label);
|
|
67
|
+
default:
|
|
68
|
+
throw new Error(`${label} has unsupported type ${JSON.stringify(type)}.`);
|
|
63
69
|
}
|
|
64
70
|
}
|
|
@@ -25,8 +25,18 @@ const goodComponent = {
|
|
|
25
25
|
displayName: 'Widget',
|
|
26
26
|
description: 'A small widget.',
|
|
27
27
|
props: [
|
|
28
|
-
{
|
|
29
|
-
|
|
28
|
+
{
|
|
29
|
+
name: 'label',
|
|
30
|
+
type: 'string',
|
|
31
|
+
description: 'Visible label.',
|
|
32
|
+
required: true,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'size',
|
|
36
|
+
type: "'sm' | 'md'",
|
|
37
|
+
description: 'Control size.',
|
|
38
|
+
default: "'md'",
|
|
39
|
+
},
|
|
30
40
|
],
|
|
31
41
|
};
|
|
32
42
|
|
|
@@ -35,7 +45,9 @@ const goodFunction = {
|
|
|
35
45
|
name: 'useThing',
|
|
36
46
|
displayName: 'useThing',
|
|
37
47
|
description: 'A thing hook.',
|
|
38
|
-
params: [
|
|
48
|
+
params: [
|
|
49
|
+
{name: 'input', type: 'string', description: 'The input.', required: true},
|
|
50
|
+
],
|
|
39
51
|
returns: [{name: 'value', type: 'string', description: 'The result.'}],
|
|
40
52
|
};
|
|
41
53
|
|
|
@@ -43,7 +55,11 @@ const goodGeneric = {
|
|
|
43
55
|
type: 'generic',
|
|
44
56
|
name: 'Theming',
|
|
45
57
|
displayName: 'Theming',
|
|
58
|
+
title: 'Theming',
|
|
46
59
|
description: 'How theming works.',
|
|
60
|
+
sections: [
|
|
61
|
+
{title: 'Overview', content: [{type: 'prose', text: 'Use a theme.'}]},
|
|
62
|
+
],
|
|
47
63
|
};
|
|
48
64
|
|
|
49
65
|
/** Run parseDoc and return the thrown message (asserting it throws). */
|
|
@@ -101,6 +117,34 @@ describe('per-kind parsers (stamped format)', () => {
|
|
|
101
117
|
expect(() => parseReference(goodGeneric)).not.toThrow();
|
|
102
118
|
});
|
|
103
119
|
|
|
120
|
+
it('normalizes a migrated minimal generic doc to the public shape', () => {
|
|
121
|
+
expect(
|
|
122
|
+
parseReference({
|
|
123
|
+
type: 'generic',
|
|
124
|
+
name: 'Theming',
|
|
125
|
+
description: 'How theming works.',
|
|
126
|
+
}),
|
|
127
|
+
).toMatchObject({
|
|
128
|
+
type: 'generic',
|
|
129
|
+
name: 'Theming',
|
|
130
|
+
title: 'Theming',
|
|
131
|
+
description: 'How theming works.',
|
|
132
|
+
sections: [],
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('rejects duplicate stable section IDs', () => {
|
|
137
|
+
expect(() =>
|
|
138
|
+
parseReference({
|
|
139
|
+
...goodGeneric,
|
|
140
|
+
sections: [
|
|
141
|
+
{id: 'start', title: 'Start', content: []},
|
|
142
|
+
{id: 'start', title: 'Renamed start', content: []},
|
|
143
|
+
],
|
|
144
|
+
}),
|
|
145
|
+
).toThrow(/sections\.1\.id.*duplicate section id/u);
|
|
146
|
+
});
|
|
147
|
+
|
|
104
148
|
it('keeps nested rich blobs loose (usage/theming/playground passthrough)', () => {
|
|
105
149
|
expect(() =>
|
|
106
150
|
parseComponent({
|
|
@@ -123,6 +167,16 @@ describe('per-kind parsers (stamped format)', () => {
|
|
|
123
167
|
expect(parsed.parent).toBe('WidgetGroup');
|
|
124
168
|
expect(parsed.relatedDocs).toEqual(['Gauge', 'useThing']);
|
|
125
169
|
});
|
|
170
|
+
|
|
171
|
+
it('validates graph metadata on unstamped legacy docs', () => {
|
|
172
|
+
expect(() =>
|
|
173
|
+
parseDoc({name: 'Widget', props: [], placement: {parent: ''}}),
|
|
174
|
+
).toThrow(/placement\.parent/u);
|
|
175
|
+
expect(() => parseDoc({name: 'Widget', props: [], aliases: [1]})).toThrow();
|
|
176
|
+
expect(() =>
|
|
177
|
+
parseDoc({name: 'Widget', props: [], audience: 'secret'}),
|
|
178
|
+
).toThrow();
|
|
179
|
+
});
|
|
126
180
|
});
|
|
127
181
|
|
|
128
182
|
describe('parseDoc (load boundary, both formats)', () => {
|
|
@@ -175,6 +229,24 @@ describe('parseDoc (load boundary, both formats)', () => {
|
|
|
175
229
|
expect(() => parseDoc(hook)).not.toThrow();
|
|
176
230
|
});
|
|
177
231
|
|
|
232
|
+
it('accepts and validates the OLD loose reference-topic shape', () => {
|
|
233
|
+
const reference = {
|
|
234
|
+
name: 'theming',
|
|
235
|
+
title: 'Theming',
|
|
236
|
+
description: 'How theming works.',
|
|
237
|
+
sections: [
|
|
238
|
+
{id: 'start', title: 'Start', content: [{type: 'prose', text: 'Go.'}]},
|
|
239
|
+
],
|
|
240
|
+
};
|
|
241
|
+
expect(parseDoc(reference)).toEqual(reference);
|
|
242
|
+
expect(() =>
|
|
243
|
+
parseDoc({
|
|
244
|
+
...reference,
|
|
245
|
+
sections: [{title: 'Start', content: [{type: 'prose'}]}],
|
|
246
|
+
}),
|
|
247
|
+
).toThrow();
|
|
248
|
+
});
|
|
249
|
+
|
|
178
250
|
it('accepts BOTH parent and legacy subComponentOf', () => {
|
|
179
251
|
const withParent = {name: 'A', parent: 'B', props: []};
|
|
180
252
|
const withSubComponentOf = {
|
|
@@ -289,7 +361,9 @@ describe('loadComponentDoc (end-to-end load boundary)', () => {
|
|
|
289
361
|
" type: 'generic',",
|
|
290
362
|
" name: 'Theming',",
|
|
291
363
|
" displayName: 'Theming',",
|
|
364
|
+
" title: 'Theming',",
|
|
292
365
|
" description: 'How theming works.',",
|
|
366
|
+
" sections: [{title: 'Overview', content: [{type: 'prose', text: 'Use a theme.'}]}],",
|
|
293
367
|
'};',
|
|
294
368
|
].join('\n'),
|
|
295
369
|
);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @generated by scripts/sync-api-types.mjs from the JSDoc in authoring/**/*.mjs.
|
|
2
2
|
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
3
|
|
|
4
|
-
/** @typedef {import('../types').ReferenceDoc} ReferenceDoc */
|
|
4
|
+
/** @typedef {import('../types.js').ReferenceDoc} ReferenceDoc */
|
|
5
5
|
/**
|
|
6
6
|
* Validate an unknown value as a stamped reference/topic doc, or throw.
|
|
7
7
|
*
|
|
@@ -10,4 +10,4 @@
|
|
|
10
10
|
* @returns {ReferenceDoc}
|
|
11
11
|
*/
|
|
12
12
|
export function parseReference(input: unknown, label?: string): ReferenceDoc;
|
|
13
|
-
export type ReferenceDoc = import("../types").ReferenceDoc;
|
|
13
|
+
export type ReferenceDoc = import("../types.js").ReferenceDoc;
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import {GenericDocKindSchema} from '../_schema.mjs';
|
|
10
10
|
import {formatZodError} from '../../_shared/errors.mjs';
|
|
11
11
|
|
|
12
|
-
/** @typedef {import('../types').ReferenceDoc} ReferenceDoc */
|
|
12
|
+
/** @typedef {import('../types.js').ReferenceDoc} ReferenceDoc */
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Validate an unknown value as a stamped reference/topic doc, or throw.
|
|
@@ -23,8 +23,11 @@ export function parseReference(input, label = 'reference doc') {
|
|
|
23
23
|
if (!result.success) {
|
|
24
24
|
throw new Error(formatZodError(label, result.error));
|
|
25
25
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
const doc = result.data;
|
|
27
|
+
return /** @type {ReferenceDoc} */ ({
|
|
28
|
+
...doc,
|
|
29
|
+
title: doc.title ?? doc.displayName ?? doc.name,
|
|
30
|
+
description: doc.description ?? '',
|
|
31
|
+
sections: doc.sections ?? [],
|
|
32
|
+
});
|
|
30
33
|
}
|
|
@@ -55,7 +55,7 @@ export const doc = {
|
|
|
55
55
|
name: 'replaces',
|
|
56
56
|
type: 'string',
|
|
57
57
|
description:
|
|
58
|
-
|
|
58
|
+
'Name of an existing topic this doc takes the place of. Authored by an integration that serves its own guide instead of the built-in one: on a doc of the same name it swaps the content, and on a doc of another name it also leaves the old name as an alias so `astryx docs <old>` still resolves. Exclusive with `extends`.',
|
|
59
59
|
example: "'getting-started'",
|
|
60
60
|
},
|
|
61
61
|
{
|
|
@@ -72,6 +72,12 @@ export const doc = {
|
|
|
72
72
|
'Ordered sections that make up the doc. Each becomes an h2 in full output and can be retrieved via `astryx docs <topic> <section>`.',
|
|
73
73
|
required: true,
|
|
74
74
|
fields: [
|
|
75
|
+
{
|
|
76
|
+
name: 'sections[].id',
|
|
77
|
+
type: 'string',
|
|
78
|
+
description:
|
|
79
|
+
'Stable section anchor. New docs should set this instead of relying on a mutable title.',
|
|
80
|
+
},
|
|
75
81
|
{
|
|
76
82
|
name: 'sections[].title',
|
|
77
83
|
type: 'string',
|
|
@@ -89,7 +95,7 @@ export const doc = {
|
|
|
89
95
|
name: 'sections[].content',
|
|
90
96
|
type: 'ReferenceContentBlock[]',
|
|
91
97
|
description:
|
|
92
|
-
'Ordered content blocks
|
|
98
|
+
'Ordered content blocks: prose, heading, code, table, list, and token-ref. workflow, collection, and reference are declared for the docs graph and parse, but a topic that uses one fails to load until the docs graph ships.',
|
|
93
99
|
required: true,
|
|
94
100
|
},
|
|
95
101
|
{
|
|
@@ -134,7 +140,11 @@ export const docs = {
|
|
|
134
140
|
notes: [
|
|
135
141
|
{
|
|
136
142
|
type: 'prose',
|
|
137
|
-
text: '
|
|
143
|
+
text: 'A stamped generic doc without `title`, `description` or `sections` still loads, as older codemod output does; its title falls back to `displayName` or `name`. Without a description and sections it is not a usable topic, and `astryx doctor` reports it.',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'prose',
|
|
147
|
+
text: 'Each `sections[].content` is an ordered array of ReferenceContentBlock, a discriminated union. workflow, collection, and reference are declared for the docs graph: they parse, but topic loading rejects them until the docs graph ships. choice, callout, and checklist remain invalid. The same union is reused by the `notes` field on SchemaDoc and CommandDoc.',
|
|
138
148
|
},
|
|
139
149
|
{
|
|
140
150
|
type: 'code',
|
|
@@ -146,7 +156,10 @@ export const docs = {
|
|
|
146
156
|
| { type: 'code'; lang: string; code: string; label?: string }
|
|
147
157
|
| { type: 'table'; headers: string[]; rows: string[][] }
|
|
148
158
|
| { type: 'list'; style: 'ordered' | 'unordered' | 'do' | 'dont'; items: string[] }
|
|
149
|
-
| { type: 'token-ref'; topic: string; section: string }
|
|
159
|
+
| { type: 'token-ref'; topic: string; section: string }
|
|
160
|
+
| { type: 'workflow'; title?: string; steps: WorkflowStep[] }
|
|
161
|
+
| { type: 'collection'; source: {slot: string}; presentation?: 'list' | 'cards' | 'compact'; whenEmpty?: 'show' | 'omit' }
|
|
162
|
+
| { type: 'reference'; target: string; projection?: {fields?: string[]; sections?: string[]} };`,
|
|
150
163
|
},
|
|
151
164
|
{
|
|
152
165
|
type: 'prose',
|
|
@@ -4,10 +4,48 @@
|
|
|
4
4
|
* @file Reference/topic doc types.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import type {AuthoredDocGraphFields} from '../base/type.js';
|
|
8
|
+
|
|
9
|
+
/** One step in a renderer-neutral workflow. */
|
|
10
|
+
export interface WorkflowStep {
|
|
11
|
+
title: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
/** Stable doc references that supply detail for this step. */
|
|
14
|
+
references?: string[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Ordered procedural guidance. */
|
|
18
|
+
export interface WorkflowDocBlock {
|
|
19
|
+
type: 'workflow';
|
|
20
|
+
title?: string;
|
|
21
|
+
steps: WorkflowStep[];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** A generated view over docs placed in one namespace slot. */
|
|
25
|
+
export interface CollectionDocBlock {
|
|
26
|
+
type: 'collection';
|
|
27
|
+
title?: string;
|
|
28
|
+
source: {slot: string};
|
|
29
|
+
presentation?: 'list' | 'cards' | 'compact';
|
|
30
|
+
whenEmpty?: 'show' | 'omit';
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** A bounded projection of one canonical doc. */
|
|
34
|
+
export interface ReferenceDocBlock {
|
|
35
|
+
type: 'reference';
|
|
36
|
+
target: string;
|
|
37
|
+
projection?: {
|
|
38
|
+
fields?: string[];
|
|
39
|
+
sections?: string[];
|
|
40
|
+
};
|
|
41
|
+
presentation?: 'summary' | 'compact' | 'full';
|
|
42
|
+
}
|
|
43
|
+
|
|
7
44
|
/**
|
|
8
|
-
* A content block within a reference doc section.
|
|
9
|
-
* Ordered
|
|
10
|
-
*
|
|
45
|
+
* A content block within a reference doc section or namespace.
|
|
46
|
+
* Ordered arrays of these blocks form renderer-neutral documentation content.
|
|
47
|
+
* A new semantic kind must ship with every renderer or fail visibly at a legacy
|
|
48
|
+
* reader boundary until that renderer is available.
|
|
11
49
|
*
|
|
12
50
|
* @example
|
|
13
51
|
* ```
|
|
@@ -17,6 +55,9 @@
|
|
|
17
55
|
* { type: 'table', headers: ['Token', 'Value'], rows: [['--spacing-4', '16px']] }
|
|
18
56
|
* { type: 'list', style: 'do', items: ['Use semantic tokens'] }
|
|
19
57
|
* { type: 'token-ref', topic: 'tokens', section: 'Color Tokens' }
|
|
58
|
+
* { type: 'workflow', steps: [{title: 'Validate', references: ['command:doctor']}] }
|
|
59
|
+
* { type: 'collection', source: {slot: 'guides'}, presentation: 'cards' }
|
|
60
|
+
* { type: 'reference', target: 'schema:integration', projection: {fields: ['docs']} }
|
|
20
61
|
* ```
|
|
21
62
|
*/
|
|
22
63
|
export type ReferenceContentBlock =
|
|
@@ -39,7 +80,10 @@ export type ReferenceContentBlock =
|
|
|
39
80
|
topic: string;
|
|
40
81
|
/** Section title to pull from that topic. e.g. `'Color Tokens'` */
|
|
41
82
|
section: string;
|
|
42
|
-
}
|
|
83
|
+
}
|
|
84
|
+
| WorkflowDocBlock
|
|
85
|
+
| CollectionDocBlock
|
|
86
|
+
| ReferenceDocBlock;
|
|
43
87
|
|
|
44
88
|
/**
|
|
45
89
|
* A reference documentation file (.doc.mjs).
|
|
@@ -54,7 +98,7 @@ export type ReferenceContentBlock =
|
|
|
54
98
|
* /** @type {import('@astryxdesign/cli/authoring').ReferenceDoc} *\/
|
|
55
99
|
* export const docs = { ... };
|
|
56
100
|
*/
|
|
57
|
-
export interface ReferenceDoc {
|
|
101
|
+
export interface ReferenceDoc extends AuthoredDocGraphFields {
|
|
58
102
|
/** Doc-kind discriminant for the stamped default-export format
|
|
59
103
|
* (`export default { type: 'generic', ... }`). Optional: legacy
|
|
60
104
|
* `export const docs = {...}` docs omit it. The value stays `'generic'`
|
|
@@ -95,6 +139,8 @@ export interface ReferenceDoc {
|
|
|
95
139
|
* and can be individually retrieved via `astryx docs <topic> <section>`.
|
|
96
140
|
*/
|
|
97
141
|
export interface ReferenceSection {
|
|
142
|
+
/** Stable section anchor. New docs should set this instead of relying on title. */
|
|
143
|
+
id?: string;
|
|
98
144
|
/** Section title, e.g. "Spacing Tokens", "Light/Dark Mode" */
|
|
99
145
|
title: string;
|
|
100
146
|
/** Navigation category ('guide' | 'foundations'). Mirrors the parent doc's
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @generated by scripts/sync-api-types.mjs from the JSDoc in authoring/**/*.mjs.
|
|
2
2
|
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
3
|
|
|
4
|
-
/** @typedef {import('../types').SchemaDoc} SchemaDoc */
|
|
4
|
+
/** @typedef {import('../types.js').SchemaDoc} SchemaDoc */
|
|
5
5
|
/**
|
|
6
6
|
* Validate an unknown value as a stamped schema doc, or throw.
|
|
7
7
|
*
|
|
@@ -10,4 +10,4 @@
|
|
|
10
10
|
* @returns {SchemaDoc}
|
|
11
11
|
*/
|
|
12
12
|
export function parseSchema(input: unknown, label?: string): SchemaDoc;
|
|
13
|
-
export type SchemaDoc = import("../types").SchemaDoc;
|
|
13
|
+
export type SchemaDoc = import("../types.js").SchemaDoc;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import {SchemaDocKindSchema} from '../_schema.mjs';
|
|
9
9
|
import {formatZodError} from '../../_shared/errors.mjs';
|
|
10
10
|
|
|
11
|
-
/** @typedef {import('../types').SchemaDoc} SchemaDoc */
|
|
11
|
+
/** @typedef {import('../types.js').SchemaDoc} SchemaDoc */
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Validate an unknown value as a stamped schema doc, or throw.
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
* response envelope). Colocated as a `.doc.mjs` next to the schema it describes.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import type {
|
|
9
|
+
import type {AuthoredDocGraphFields} from '../base/type.js';
|
|
10
|
+
import type {ReferenceContentBlock} from '../reference/type.js';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* One documented field of a schema. Object fields nest via `fields`, so a whole
|
|
@@ -37,7 +38,7 @@ export interface SchemaFieldDoc {
|
|
|
37
38
|
* /\*\* @type {import('@astryxdesign/cli/authoring').SchemaDoc} \*\/
|
|
38
39
|
* export const doc = { type: 'schema', name: 'config', ... };
|
|
39
40
|
*/
|
|
40
|
-
export interface SchemaDoc {
|
|
41
|
+
export interface SchemaDoc extends AuthoredDocGraphFields {
|
|
41
42
|
/** Doc-kind discriminant. */
|
|
42
43
|
type?: 'schema';
|
|
43
44
|
/** URL-safe identifier, used as the docs slug within its namespace. */
|
|
@@ -11,4 +11,95 @@
|
|
|
11
11
|
* @returns {TemplateDoc}
|
|
12
12
|
*/
|
|
13
13
|
export function parseTemplate(input: unknown, label?: string): TemplateDoc;
|
|
14
|
-
export type TemplateDoc = import("../types").TemplateDoc;
|
|
14
|
+
export type TemplateDoc = import("../types.js").TemplateDoc;
|
|
15
|
+
export type PageTemplateDoc = import("./type.js").PageTemplateDoc;
|
|
16
|
+
export type BlockTemplateDoc = import("./type.js").BlockTemplateDoc;
|
|
17
|
+
/**
|
|
18
|
+
* Templates as they load. Integration templates already published omit
|
|
19
|
+
* `displayName` and `aspectRatio` and group themselves under their own
|
|
20
|
+
* `category`, so the loader accepts those (template discovery falls back to an
|
|
21
|
+
* aspect ratio of 1). The published types keep asking authors for all three.
|
|
22
|
+
*/
|
|
23
|
+
export type LoadedPageTemplateDoc = Omit<PageTemplateDoc, "displayName" | "category"> & {
|
|
24
|
+
displayName?: string;
|
|
25
|
+
category?: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Templates as they load. Integration templates already published omit
|
|
29
|
+
* `displayName` and `aspectRatio` and group themselves under their own
|
|
30
|
+
* `category`, so the loader accepts those (template discovery falls back to an
|
|
31
|
+
* aspect ratio of 1). The published types keep asking authors for all three.
|
|
32
|
+
*/
|
|
33
|
+
export type LoadedBlockTemplateDoc = Omit<BlockTemplateDoc, "displayName" | "aspectRatio" | "category"> & {
|
|
34
|
+
displayName?: string;
|
|
35
|
+
aspectRatio?: number;
|
|
36
|
+
category?: string;
|
|
37
|
+
};
|
|
38
|
+
export type _PageTemplateDocDriftLock = import("../../_shared/contract.js").Expect<import("../../_shared/contract.js").MutuallyAssignable<import("../../_shared/contract.js").NamedFields<z.infer<typeof pageTemplateSchema>>, import("../../_shared/contract.js").NamedFields<LoadedPageTemplateDoc>>>;
|
|
39
|
+
export type _BlockTemplateDocDriftLock = import("../../_shared/contract.js").Expect<import("../../_shared/contract.js").MutuallyAssignable<import("../../_shared/contract.js").NamedFields<z.infer<typeof blockTemplateSchema>>, import("../../_shared/contract.js").NamedFields<LoadedBlockTemplateDoc>>>;
|
|
40
|
+
import { z } from 'zod';
|
|
41
|
+
declare const pageTemplateSchema: z.ZodObject<{
|
|
42
|
+
type: z.ZodLiteral<"page">;
|
|
43
|
+
name: z.ZodString;
|
|
44
|
+
displayName: z.ZodOptional<z.ZodString>;
|
|
45
|
+
description: z.ZodOptional<z.ZodString>;
|
|
46
|
+
category: z.ZodOptional<z.ZodString>;
|
|
47
|
+
componentsUsed: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
48
|
+
preview: z.ZodOptional<z.ZodObject<{
|
|
49
|
+
image: z.ZodOptional<z.ZodString>;
|
|
50
|
+
aspectRatio: z.ZodOptional<z.ZodString>;
|
|
51
|
+
}, z.core.$strict>>;
|
|
52
|
+
isReady: z.ZodOptional<z.ZodBoolean>;
|
|
53
|
+
scaffold: z.ZodOptional<z.ZodBoolean>;
|
|
54
|
+
isHiddenFromOverview: z.ZodOptional<z.ZodBoolean>;
|
|
55
|
+
registry: z.ZodOptional<z.ZodObject<{
|
|
56
|
+
slug: z.ZodOptional<z.ZodString>;
|
|
57
|
+
aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
58
|
+
}, z.core.$strict>>;
|
|
59
|
+
placement: z.ZodOptional<z.ZodObject<{
|
|
60
|
+
parent: z.ZodString;
|
|
61
|
+
slot: z.ZodOptional<z.ZodString>;
|
|
62
|
+
order: z.ZodOptional<z.ZodNumber>;
|
|
63
|
+
}, z.core.$strict>>;
|
|
64
|
+
aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
65
|
+
audience: z.ZodOptional<z.ZodEnum<{
|
|
66
|
+
public: "public";
|
|
67
|
+
internal: "internal";
|
|
68
|
+
}>>;
|
|
69
|
+
}, z.core.$strict>;
|
|
70
|
+
declare const blockTemplateSchema: z.ZodObject<{
|
|
71
|
+
type: z.ZodLiteral<"block">;
|
|
72
|
+
exampleFor: z.ZodOptional<z.ZodString>;
|
|
73
|
+
alsoExampleFor: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
74
|
+
alsoShowcaseFor: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
75
|
+
aspectRatio: z.ZodOptional<z.ZodNumber>;
|
|
76
|
+
scale: z.ZodOptional<z.ZodNumber>;
|
|
77
|
+
isShowcase: z.ZodOptional<z.ZodBoolean>;
|
|
78
|
+
name: z.ZodString;
|
|
79
|
+
displayName: z.ZodOptional<z.ZodString>;
|
|
80
|
+
description: z.ZodOptional<z.ZodString>;
|
|
81
|
+
category: z.ZodOptional<z.ZodString>;
|
|
82
|
+
componentsUsed: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
83
|
+
preview: z.ZodOptional<z.ZodObject<{
|
|
84
|
+
image: z.ZodOptional<z.ZodString>;
|
|
85
|
+
aspectRatio: z.ZodOptional<z.ZodString>;
|
|
86
|
+
}, z.core.$strict>>;
|
|
87
|
+
isReady: z.ZodOptional<z.ZodBoolean>;
|
|
88
|
+
scaffold: z.ZodOptional<z.ZodBoolean>;
|
|
89
|
+
isHiddenFromOverview: z.ZodOptional<z.ZodBoolean>;
|
|
90
|
+
registry: z.ZodOptional<z.ZodObject<{
|
|
91
|
+
slug: z.ZodOptional<z.ZodString>;
|
|
92
|
+
aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
93
|
+
}, z.core.$strict>>;
|
|
94
|
+
placement: z.ZodOptional<z.ZodObject<{
|
|
95
|
+
parent: z.ZodString;
|
|
96
|
+
slot: z.ZodOptional<z.ZodString>;
|
|
97
|
+
order: z.ZodOptional<z.ZodNumber>;
|
|
98
|
+
}, z.core.$strict>>;
|
|
99
|
+
aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
100
|
+
audience: z.ZodOptional<z.ZodEnum<{
|
|
101
|
+
public: "public";
|
|
102
|
+
internal: "internal";
|
|
103
|
+
}>>;
|
|
104
|
+
}, z.core.$strict>;
|
|
105
|
+
export {};
|
|
@@ -9,9 +9,12 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import {z} from 'zod';
|
|
12
|
+
import {AuthoredDocGraphFields} from '../_schema.mjs';
|
|
12
13
|
import {formatZodError} from '../../_shared/errors.mjs';
|
|
13
14
|
|
|
14
|
-
/** @typedef {import('../types').TemplateDoc} TemplateDoc */
|
|
15
|
+
/** @typedef {import('../types.js').TemplateDoc} TemplateDoc */
|
|
16
|
+
/** @typedef {import('./type.js').PageTemplateDoc} PageTemplateDoc */
|
|
17
|
+
/** @typedef {import('./type.js').BlockTemplateDoc} BlockTemplateDoc */
|
|
15
18
|
|
|
16
19
|
const previewSchema = z
|
|
17
20
|
.object({
|
|
@@ -37,9 +40,10 @@ const registryIdentitySchema = z
|
|
|
37
40
|
.strict();
|
|
38
41
|
|
|
39
42
|
const baseTemplateFields = {
|
|
43
|
+
...AuthoredDocGraphFields,
|
|
40
44
|
name: z.string().min(1, 'name is required'),
|
|
41
45
|
displayName: z.string().min(1).optional(),
|
|
42
|
-
description: z.string().min(1, 'description is required'),
|
|
46
|
+
description: z.string().min(1, 'description is required').optional(),
|
|
43
47
|
category: z.string().optional(),
|
|
44
48
|
componentsUsed: z.array(z.string()).optional(),
|
|
45
49
|
preview: previewSchema.optional(),
|
|
@@ -65,6 +69,36 @@ const blockTemplateSchema = z
|
|
|
65
69
|
})
|
|
66
70
|
.strict();
|
|
67
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Templates as they load. Integration templates already published omit
|
|
74
|
+
* `displayName` and `aspectRatio` and group themselves under their own
|
|
75
|
+
* `category`, so the loader accepts those (template discovery falls back to an
|
|
76
|
+
* aspect ratio of 1). The published types keep asking authors for all three.
|
|
77
|
+
*
|
|
78
|
+
* @typedef {Omit<PageTemplateDoc, 'displayName' | 'category'>
|
|
79
|
+
* & {displayName?: string, category?: string}} LoadedPageTemplateDoc
|
|
80
|
+
* @typedef {Omit<BlockTemplateDoc, 'displayName' | 'aspectRatio' | 'category'>
|
|
81
|
+
* & {displayName?: string, aspectRatio?: number, category?: string}} LoadedBlockTemplateDoc
|
|
82
|
+
*/
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @typedef {import('../../_shared/contract.js').Expect<
|
|
86
|
+
* import('../../_shared/contract.js').MutuallyAssignable<
|
|
87
|
+
* import('../../_shared/contract.js').NamedFields<z.infer<typeof pageTemplateSchema>>,
|
|
88
|
+
* import('../../_shared/contract.js').NamedFields<LoadedPageTemplateDoc>
|
|
89
|
+
* >
|
|
90
|
+
* >} _PageTemplateDocDriftLock
|
|
91
|
+
*/
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @typedef {import('../../_shared/contract.js').Expect<
|
|
95
|
+
* import('../../_shared/contract.js').MutuallyAssignable<
|
|
96
|
+
* import('../../_shared/contract.js').NamedFields<z.infer<typeof blockTemplateSchema>>,
|
|
97
|
+
* import('../../_shared/contract.js').NamedFields<LoadedBlockTemplateDoc>
|
|
98
|
+
* >
|
|
99
|
+
* >} _BlockTemplateDocDriftLock
|
|
100
|
+
*/
|
|
101
|
+
|
|
68
102
|
const templateEnvelopeSchema = z
|
|
69
103
|
.discriminatedUnion('type', [pageTemplateSchema, blockTemplateSchema])
|
|
70
104
|
.superRefine((template, context) => {
|
|
@@ -112,8 +112,14 @@ describe('parseTemplate (load boundary)', () => {
|
|
|
112
112
|
expect(reason({type: 'page', description: 'x'})).toContain('name');
|
|
113
113
|
});
|
|
114
114
|
|
|
115
|
-
it('rejects
|
|
116
|
-
expect(
|
|
115
|
+
it('accepts an omitted description and rejects an empty one when present', () => {
|
|
116
|
+
expect(parseTemplate({type: 'page', name: 'x'})).toEqual({
|
|
117
|
+
type: 'page',
|
|
118
|
+
name: 'x',
|
|
119
|
+
});
|
|
120
|
+
expect(reason({type: 'page', name: 'x', description: ''})).toContain(
|
|
121
|
+
'description',
|
|
122
|
+
);
|
|
117
123
|
});
|
|
118
124
|
|
|
119
125
|
it('rejects an empty-string name', () => {
|
|
@@ -148,6 +148,10 @@ export const doc = {
|
|
|
148
148
|
},
|
|
149
149
|
],
|
|
150
150
|
notes: [
|
|
151
|
+
{
|
|
152
|
+
type: 'prose',
|
|
153
|
+
text: 'When it loads, a template may leave out `displayName` and `aspectRatio` and use its own `category`, as integration templates already published do; a block with no `aspectRatio` previews at 1. Write to the type anyway; it is the contract.',
|
|
154
|
+
},
|
|
151
155
|
{
|
|
152
156
|
type: 'prose',
|
|
153
157
|
text: "TemplateDoc is a discriminated union keyed by `type`. Set `type: 'page'` for a full page template. Set `type: 'block'` for an editable composition; add `exampleFor` only when one component owns the example.",
|
|
@@ -4,9 +4,12 @@
|
|
|
4
4
|
* @file Template doc types.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type {
|
|
7
|
+
import type {
|
|
8
|
+
AuthoredDocGraphFields,
|
|
9
|
+
RegistryDocIdentity,
|
|
10
|
+
} from '../base/type.js';
|
|
8
11
|
|
|
9
|
-
export interface BaseTemplateDoc {
|
|
12
|
+
export interface BaseTemplateDoc extends AuthoredDocGraphFields {
|
|
10
13
|
/** Identifier name for the template. For block templates this matches
|
|
11
14
|
* the React component import name (e.g. `"ChatMessageMetadata"`); for
|
|
12
15
|
* page templates it's a human-readable label that doubles as the
|
|
@@ -7,12 +7,13 @@
|
|
|
7
7
|
* behind `@astryxdesign/cli/authoring`.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
export type * from './base/type';
|
|
11
|
-
export type * from './component/type';
|
|
12
|
-
export type * from './hook/type';
|
|
13
|
-
export type * from './function/type';
|
|
14
|
-
export type * from './reference/type';
|
|
15
|
-
export type * from './
|
|
16
|
-
export type * from './
|
|
17
|
-
export type * from './
|
|
18
|
-
export type * from './
|
|
10
|
+
export type * from './base/type.js';
|
|
11
|
+
export type * from './component/type.js';
|
|
12
|
+
export type * from './hook/type.js';
|
|
13
|
+
export type * from './function/type.js';
|
|
14
|
+
export type * from './reference/type.js';
|
|
15
|
+
export type * from './namespace/type.js';
|
|
16
|
+
export type * from './template/type.js';
|
|
17
|
+
export type * from './schema/type.js';
|
|
18
|
+
export type * from './command/type.js';
|
|
19
|
+
export type * from './enum/type.js';
|