@astryxdesign/cli 0.6.3-canary.db4e378 → 0.6.3-canary.db7b338
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 +22 -1
- package/api/blog/blog.doc.mjs +1 -0
- package/api/build/build.doc.mjs +1 -0
- package/api/component/component.doc.mjs +1 -0
- package/api/discover/discover.doc.mjs +1 -0
- package/api/docs/_adapter.d.mts +3 -8
- package/api/docs/_adapter.mjs +13 -105
- package/api/docs/detail/section/section.mjs +9 -15
- package/api/docs/detail/section/section.test.mjs +15 -6
- package/api/docs/docs.doc.mjs +1 -0
- package/api/docs/list/list.mjs +3 -7
- package/api/doctor/doctor.d.mts +25 -3
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +186 -14
- package/api/doctor/doctor.test.mjs +332 -7
- package/api/gap-report/gap-report.doc.mjs +1 -0
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +1 -0
- package/api/hook/list/list.d.mts +1 -1
- package/api/hook/list/list.mjs +69 -17
- package/api/init/init.doc.mjs +1 -0
- package/api/integration/add-contribution.mjs +7 -7
- package/api/integration/add-contribution.test.mjs +37 -3
- package/api/integration/add-theme.mjs +34 -64
- package/api/integration/add-theme.test.mjs +105 -21
- package/api/integration/authoring-checks.test.mjs +8 -4
- package/api/integration/integration-block-exports.test.mjs +10 -6
- package/api/integration/integrationAdd.doc.mjs +1 -0
- package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
- package/api/integration/integrationAddCodemod.doc.mjs +1 -0
- package/api/integration/integrationAddComponent.doc.mjs +1 -0
- package/api/integration/integrationAddDoc.doc.mjs +1 -0
- package/api/integration/integrationAddTemplate.doc.mjs +1 -0
- package/api/integration/integrationAddTheme.doc.mjs +6 -5
- package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
- package/api/integration/integrationDocConflicts.doc.mjs +1 -0
- package/api/integration/integrationPackCheck.doc.mjs +1 -0
- package/api/integration/integrationTemplateConflicts.doc.mjs +1 -0
- package/api/integration/pack-check.test.mjs +17 -47
- package/api/integration/summarizeIssues.doc.mjs +1 -0
- package/api/integration/validate-integration-fixes.test.mjs +1389 -0
- package/api/integration/validate-integration.mjs +50 -102
- package/api/integration/validate-integration.test.mjs +85 -23
- package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
- package/api/integration/validateIntegration.doc.mjs +1 -0
- package/api/json/assertResponse.doc.mjs +1 -0
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +1 -0
- package/api/layout/layoutCheck.doc.mjs +1 -0
- package/api/layout/layoutExpand.doc.mjs +1 -0
- package/api/layout/layoutGrammar.doc.mjs +1 -0
- package/api/search/search.doc.mjs +1 -0
- package/api/search/search.mjs +16 -6
- package/api/swizzle/swizzle.doc.mjs +1 -0
- package/api/template/template-suffix.test.mjs +41 -21
- package/api/template/template.doc.mjs +1 -0
- package/api/theme/_adapter.d.mts +2 -3
- package/api/theme/_adapter.mjs +4 -5
- package/api/theme/add/add.binary.test.mjs +10 -17
- package/api/theme/add/add.test.mjs +14 -1
- package/api/theme/generateTonalPalette.doc.mjs +1 -0
- package/api/theme/integration-themes.test.mjs +39 -28
- package/api/theme/list/list.test.mjs +19 -20
- package/api/theme/listThemes.doc.mjs +6 -5
- package/api/theme/themeAdd.doc.mjs +4 -3
- package/api/theme/themeBuild.doc.mjs +1 -0
- package/api/theme/themeList.doc.mjs +6 -3
- package/api/theme/themeListAvailable.doc.mjs +5 -3
- package/api/theme/themePaletteGenerate.doc.mjs +1 -0
- package/api/theme/themeTargets.doc.mjs +1 -0
- package/api/theme/themeTemplate.doc.mjs +1 -0
- package/api/upgrade/_adapter.d.mts +32 -5
- package/api/upgrade/_adapter.mjs +97 -69
- package/api/upgrade/provider-agreement.test.mjs +152 -0
- package/api/upgrade/run/run.mjs +356 -59
- package/api/upgrade/upgrade.doc.mjs +6 -1
- package/api/upgrade/upgrade.type.d.mts +34 -0
- package/api/upgrade/upgrade.type.mjs +15 -0
- package/assets/codemods/__tests__/runner.test.mjs +330 -8
- package/assets/codemods/integration-discovery.mjs +8 -2
- package/assets/codemods/integration-discovery.test.mjs +15 -0
- package/assets/codemods/integration-runner.mjs +56 -4
- package/assets/codemods/integration-runner.protection.test.mjs +153 -0
- package/assets/codemods/run-codemod.mjs +177 -34
- package/assets/codemods/runner.mjs +350 -102
- package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
- package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
- package/assets/codemods/transforms/next/index.mjs +19 -1
- package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
- package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
- package/assets/docs/cli-integrations.doc.mjs +30 -30
- package/assets/docs/cli.doc.mjs +15 -0
- package/assets/docs/theme.doc.mjs +1 -1
- package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
- package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
- package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
- package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
- package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
- package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
- package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
- package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
- package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
- package/authoring/codemod/codemod.doc.mjs +1 -1
- package/authoring/codemod/type.ts +12 -0
- package/authoring/config/config.doc.mjs +1 -1
- package/authoring/debug/debug.doc.d.mts +11 -0
- package/authoring/debug/debug.doc.mjs +182 -0
- package/authoring/doctypes/_schema.d.mts +71 -141
- package/authoring/doctypes/_schema.mjs +29 -2
- package/authoring/doctypes/base/graph-fields.doc.mjs +1 -1
- package/authoring/doctypes/command/command.doc.mjs +1 -1
- package/authoring/doctypes/command/type.ts +1 -1
- package/authoring/doctypes/component/type.ts +2 -2
- package/authoring/doctypes/doctypes-new.test.mjs +48 -6
- package/authoring/doctypes/enum/enum.doc.mjs +1 -1
- package/authoring/doctypes/enum/type.ts +1 -1
- package/authoring/doctypes/function/function.doc.mjs +1 -1
- package/authoring/doctypes/function/type.ts +1 -1
- package/authoring/doctypes/hook/type.ts +2 -2
- package/authoring/doctypes/load-contract.test.mjs +3 -2
- package/authoring/doctypes/namespace/namespace.doc.mjs +2 -2
- package/authoring/doctypes/namespace/parse.test.mjs +23 -25
- package/authoring/doctypes/namespace/type.ts +5 -2
- package/authoring/doctypes/parse.d.mts +4 -2
- package/authoring/doctypes/parse.mjs +10 -5
- package/authoring/doctypes/reference/reference.doc.mjs +6 -4
- package/authoring/doctypes/reference/type.ts +9 -10
- package/authoring/doctypes/schema/schema.doc.mjs +1 -1
- package/authoring/doctypes/schema/type.ts +1 -2
- package/authoring/doctypes/template/template.doc.mjs +3 -3
- package/authoring/doctypes/theme/parse.d.mts +35 -0
- package/authoring/doctypes/theme/parse.mjs +76 -0
- package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
- package/authoring/doctypes/theme/theme.doc.mjs +79 -0
- package/authoring/doctypes/theme/type.ts +42 -0
- package/authoring/doctypes/types.ts +2 -1
- package/authoring/gap-report/gap-report.doc.d.mts +12 -0
- package/authoring/gap-report/gap-report.doc.mjs +183 -0
- package/authoring/index.d.mts +1 -0
- package/authoring/index.d.ts +7 -4
- package/authoring/index.mjs +2 -1
- package/authoring/integration/integration.doc.mjs +2 -2
- package/authoring/integration/type.ts +3 -9
- package/clients/cli/__tests__/cliManifest.test.ts +27 -29
- package/clients/cli/commands/blog.doc.mjs +1 -1
- package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
- package/clients/cli/commands/build-theme.mjs +10 -44
- package/clients/cli/commands/build.doc.mjs +1 -1
- package/clients/cli/commands/component.doc.mjs +1 -1
- package/clients/cli/commands/discover.doc.mjs +1 -1
- package/clients/cli/commands/docs.doc.mjs +1 -1
- package/clients/cli/commands/docs.mjs +15 -58
- package/clients/cli/commands/docs.test.mjs +11 -14
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-templates.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.test.mjs +15 -7
- package/clients/cli/commands/doctor.doc.mjs +1 -1
- package/clients/cli/commands/gap-report.doc.mjs +1 -1
- package/clients/cli/commands/hook.doc.mjs +1 -1
- package/clients/cli/commands/init.doc.mjs +1 -1
- package/clients/cli/commands/integration-add.controls.test.mjs +1 -1
- package/clients/cli/commands/integration-add.doc.mjs +1 -1
- package/clients/cli/commands/integration-pack.doc.mjs +1 -1
- package/clients/cli/commands/integration-real-world.test.mjs +3 -9
- package/clients/cli/commands/integration.doc.mjs +1 -1
- package/clients/cli/commands/layout-check.doc.mjs +1 -1
- package/clients/cli/commands/layout-expand.doc.mjs +1 -1
- package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
- package/clients/cli/commands/layout.doc.mjs +1 -1
- package/clients/cli/commands/manifest.doc.mjs +1 -1
- package/clients/cli/commands/search.doc.mjs +1 -1
- package/clients/cli/commands/swizzle.doc.mjs +1 -1
- package/clients/cli/commands/template.doc.mjs +1 -1
- package/clients/cli/commands/text-json-parity.test.mjs +718 -0
- package/clients/cli/commands/theme-add.doc.mjs +2 -2
- package/clients/cli/commands/theme-build.doc.mjs +1 -1
- package/clients/cli/commands/theme-list.doc.mjs +2 -2
- package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
- package/clients/cli/commands/theme-palette.doc.mjs +1 -1
- package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
- package/clients/cli/commands/theme-targets.doc.mjs +1 -1
- package/clients/cli/commands/theme-template.doc.mjs +1 -1
- package/clients/cli/commands/theme.doc.mjs +1 -1
- package/clients/cli/commands/upgrade.doc.mjs +3 -2
- package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
- package/clients/cli/commands/upgrade.mjs +29 -7
- package/clients/cli/formatters/index.mjs +2 -0
- package/clients/cli/formatters/index.test.mjs +6 -0
- package/clients/cli/lib/hook-format.mjs +14 -5
- package/foundation/config/project-themes.test.mjs +11 -19
- package/foundation/config/project.d.mts +8 -0
- package/foundation/config/project.mjs +50 -21
- package/foundation/config/project.test.mjs +3 -16
- package/foundation/discovery/authoring-self-docs.d.mts +6 -0
- package/foundation/discovery/authoring-self-docs.mjs +17 -7
- package/foundation/discovery/authoring-self-docs.test.mjs +3 -2
- package/foundation/discovery/authoring-surface.d.mts +74 -0
- package/foundation/discovery/authoring-surface.mjs +525 -0
- package/foundation/discovery/authoring-surface.test.mjs +392 -0
- package/foundation/discovery/cli-self-docs.d.mts +113 -0
- package/foundation/discovery/cli-self-docs.mjs +514 -0
- package/foundation/discovery/cli-self-docs.test.mjs +437 -0
- package/foundation/discovery/component-loader.d.mts +35 -38
- package/foundation/discovery/component-loader.mjs +53 -222
- package/foundation/discovery/docs-discovery.d.mts +3 -2
- package/foundation/discovery/docs-discovery.mjs +14 -17
- package/foundation/discovery/docs-discovery.test.mjs +15 -15
- package/foundation/discovery/docs-section-key.d.mts +19 -8
- package/foundation/discovery/docs-section-key.mjs +119 -32
- package/foundation/discovery/docs-section-key.test.mjs +41 -19
- package/foundation/discovery/template-adapter.d.mts +7 -0
- package/foundation/discovery/template-adapter.mjs +27 -40
- package/foundation/discovery/template-adapter.test.mjs +15 -0
- package/foundation/discovery/theme-discovery.d.mts +67 -7
- package/foundation/discovery/theme-discovery.mjs +916 -186
- package/foundation/discovery/theme-discovery.test.mjs +613 -219
- package/foundation/doc-compiler/bundle.d.mts +47 -0
- package/foundation/doc-compiler/bundle.mjs +218 -0
- package/foundation/doc-compiler/bundle.test.mjs +255 -0
- package/foundation/doc-compiler/compile.d.mts +200 -0
- package/foundation/doc-compiler/compile.mjs +259 -9
- package/foundation/doc-compiler/diagnostics.d.mts +126 -0
- package/foundation/doc-compiler/diagnostics.mjs +277 -0
- package/foundation/doc-compiler/doc-compiler.test.mjs +28 -1
- package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
- package/foundation/doc-compiler/import.d.mts +24 -0
- package/foundation/doc-compiler/import.mjs +59 -0
- package/foundation/doc-compiler/inputs.d.mts +102 -0
- package/foundation/doc-compiler/inputs.mjs +286 -0
- package/foundation/doc-compiler/inputs.test.mjs +299 -0
- package/foundation/doc-compiler/ir.d.mts +13 -0
- package/foundation/doc-compiler/ir.mjs +189 -12
- package/foundation/doc-compiler/lower-doc.test.mjs +492 -0
- package/foundation/doc-compiler/overlays.d.mts +37 -0
- package/foundation/doc-compiler/overlays.mjs +206 -0
- package/foundation/doc-compiler/parse-readable.d.mts +9 -0
- package/foundation/doc-compiler/parse-readable.mjs +29 -0
- package/foundation/doc-compiler/read.d.mts +126 -0
- package/foundation/doc-compiler/read.mjs +320 -0
- package/foundation/doc-compiler/read.test.mjs +313 -0
- package/foundation/doc-compiler/source.d.mts +33 -0
- package/foundation/doc-compiler/source.mjs +128 -0
- package/foundation/fs/file-protection.d.mts +33 -0
- package/foundation/fs/file-protection.mjs +825 -0
- package/foundation/fs/file-protection.test.mjs +250 -0
- package/foundation/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -57
- package/foundation/integrations/contribution-fixes.d.mts +145 -0
- package/foundation/integrations/contribution-fixes.mjs +1284 -0
- package/foundation/integrations/contribution-inventory.d.mts +1 -1
- package/foundation/integrations/contribution-inventory.mjs +17 -20
- package/foundation/integrations/contribution-inventory.test.mjs +67 -27
- package/foundation/integrations/integrations.d.mts +3 -0
- package/foundation/integrations/integrations.mjs +11 -97
- package/foundation/integrations/provider-ledger.test.mjs +275 -0
- package/foundation/integrations/provider-resolution.d.mts +152 -0
- package/foundation/integrations/provider-resolution.mjs +576 -0
- package/foundation/integrations/provider-resolution.test.mjs +369 -0
- package/foundation/integrations/theme-descriptor.d.mts +8 -0
- package/foundation/integrations/theme-descriptor.mjs +44 -0
- package/foundation/integrations/validate-contributions.mjs +104 -10
- package/foundation/response/error-codes.d.mts +3 -1
- package/foundation/response/error-codes.d.ts +2 -0
- package/foundation/response/error-codes.doc.mjs +12 -2
- package/foundation/response/error-codes.mjs +7 -1
- package/foundation/response/error-codes.test.mjs +55 -11
- package/foundation/response/response-types.doc.mjs +1 -1
- package/foundation/response/response.doc.mjs +1 -1
- package/foundation/text/string-utils.mjs +22 -10
- package/package.json +10 -9
- package/assets/templates/themes/manifest.json +0 -95
|
@@ -57,7 +57,7 @@ export const doc = {
|
|
|
57
57
|
name: 'namespace',
|
|
58
58
|
type: 'string',
|
|
59
59
|
description:
|
|
60
|
-
"
|
|
60
|
+
"The `astryx docs` topic that reads this doc. The CLI's API functions use 'cli/api' (the section `api-<name>` of the `cli` topic). Every function doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that no topic reads.",
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
name: 'aliases',
|
|
@@ -62,7 +62,7 @@ export interface FunctionDoc extends AuthoredDocGraphFields {
|
|
|
62
62
|
summary?: string;
|
|
63
63
|
/** Longer description. */
|
|
64
64
|
description?: string;
|
|
65
|
-
/**
|
|
65
|
+
/** The `astryx docs` topic that reads this doc. The CLI's API functions use 'cli/api' (the section `api-<name>` of the `cli` topic). Every function doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that no topic reads. */
|
|
66
66
|
namespace?: string;
|
|
67
67
|
/** Alternate slugs that also resolve to this doc. */
|
|
68
68
|
aliases?: string[];
|
|
@@ -23,10 +23,10 @@ import type {
|
|
|
23
23
|
* Standalone hooks (e.g. useMediaQuery, useFocusTrap, useOverflow) get
|
|
24
24
|
* their own {hookName}.doc.mjs file and use this type.
|
|
25
25
|
*
|
|
26
|
-
* Every hook .doc.mjs
|
|
26
|
+
* Every new hook .doc.mjs default-exports a stamped object:
|
|
27
27
|
*
|
|
28
28
|
* /\*\* @type {import('@astryxdesign/cli/authoring').HookDoc} \*\/
|
|
29
|
-
* export
|
|
29
|
+
* export default { type: 'function', ... };
|
|
30
30
|
*/
|
|
31
31
|
export interface HookDoc extends AuthoredDocGraphFields {
|
|
32
32
|
/** Doc-kind discriminant for the stamped default-export format
|
|
@@ -49,7 +49,7 @@ const EXAMPLES = Object.fromEntries(
|
|
|
49
49
|
|
|
50
50
|
describe('load check vs published type', () => {
|
|
51
51
|
it('locks every doc kind', () => {
|
|
52
|
-
const source = ['_schema.mjs', 'template/parse.mjs']
|
|
52
|
+
const source = ['_schema.mjs', 'template/parse.mjs', 'theme/parse.mjs']
|
|
53
53
|
.map(file => fs.readFileSync(path.join(HERE, file), 'utf8'))
|
|
54
54
|
.join('\n');
|
|
55
55
|
expect(Object.keys(LOCKS).sort()).toEqual([...KINDS].sort());
|
|
@@ -57,6 +57,7 @@ describe('load check vs published type', () => {
|
|
|
57
57
|
...Object.values(LOCKS),
|
|
58
58
|
'_AuthoredDocKindDriftLock',
|
|
59
59
|
'_HookDocIsFunctionDocLock',
|
|
60
|
+
'_ThemeDocDriftLock',
|
|
60
61
|
];
|
|
61
62
|
for (const lock of locks) {
|
|
62
63
|
expect(source, `${lock} is missing`).toMatch(
|
|
@@ -70,7 +71,7 @@ describe('load check vs published type', () => {
|
|
|
70
71
|
expect(() => parseDoc(EXAMPLES[kind], `${kind}.doc.mjs`)).not.toThrow();
|
|
71
72
|
}
|
|
72
73
|
expect(() => parseDoc({type: 'widget', name: 'x'}, 'x.doc.mjs')).toThrow(
|
|
73
|
-
/
|
|
74
|
+
/x\.doc\.mjs is invalid/u,
|
|
74
75
|
);
|
|
75
76
|
});
|
|
76
77
|
});
|
|
@@ -78,9 +78,9 @@ export const doc = {
|
|
|
78
78
|
},
|
|
79
79
|
{
|
|
80
80
|
name: 'blocks',
|
|
81
|
-
type: 'ReferenceContentBlock[]',
|
|
81
|
+
type: '(ReferenceContentBlock | GraphContentBlock)[]',
|
|
82
82
|
description:
|
|
83
|
-
'Ordered layout content.
|
|
83
|
+
'Ordered layout content. Graph-only workflow, collection, and reference blocks are available here without widening the stable ReferenceContentBlock union used by existing topic renderers.',
|
|
84
84
|
},
|
|
85
85
|
],
|
|
86
86
|
examples: [
|
|
@@ -134,32 +134,30 @@ describe('NamespaceDoc', () => {
|
|
|
134
134
|
});
|
|
135
135
|
});
|
|
136
136
|
|
|
137
|
-
describe('semantic blocks
|
|
138
|
-
it('
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
'workflow',
|
|
155
|
-
'collection',
|
|
156
|
-
'reference',
|
|
157
|
-
]);
|
|
137
|
+
describe('semantic graph blocks', () => {
|
|
138
|
+
it('keeps graph-only blocks out of the stable ReferenceDoc section union', () => {
|
|
139
|
+
expect(() =>
|
|
140
|
+
parseReference({
|
|
141
|
+
type: 'generic',
|
|
142
|
+
name: 'publishing',
|
|
143
|
+
title: 'Publishing',
|
|
144
|
+
description: 'Publish an integration.',
|
|
145
|
+
sections: [
|
|
146
|
+
{
|
|
147
|
+
id: 'start',
|
|
148
|
+
title: 'Start',
|
|
149
|
+
content: namespaceDoc.blocks,
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
}),
|
|
153
|
+
).toThrow(/Invalid discriminator value/u);
|
|
158
154
|
});
|
|
159
155
|
|
|
160
|
-
it('
|
|
161
|
-
expect(
|
|
162
|
-
|
|
163
|
-
|
|
156
|
+
it('keeps shape-sniffing an unknown stamp for 0.6.x compatibility', () => {
|
|
157
|
+
expect(parseDoc({type: 'choice', name: 'x', props: []})).toMatchObject({
|
|
158
|
+
type: 'choice',
|
|
159
|
+
name: 'x',
|
|
160
|
+
props: [],
|
|
161
|
+
});
|
|
164
162
|
});
|
|
165
163
|
});
|
|
@@ -7,7 +7,10 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import type {AuthoredDocGraphFields, AuthoredDocKind} from '../base/type.js';
|
|
10
|
-
import type {
|
|
10
|
+
import type {
|
|
11
|
+
GraphContentBlock,
|
|
12
|
+
ReferenceContentBlock,
|
|
13
|
+
} from '../reference/type.js';
|
|
11
14
|
|
|
12
15
|
/** Which providers may contribute appearances to a namespace slot. */
|
|
13
16
|
export type NamespaceProviderScope = 'same' | 'configured';
|
|
@@ -67,5 +70,5 @@ export interface NamespaceDoc extends AuthoredDocGraphFields {
|
|
|
67
70
|
/** Optional source-adoption rules for otherwise-unplaced docs. */
|
|
68
71
|
adopts?: NamespaceAdoptionRule[];
|
|
69
72
|
/** Ordered renderer-neutral content and collection blocks. */
|
|
70
|
-
blocks?: ReferenceContentBlock[];
|
|
73
|
+
blocks?: (ReferenceContentBlock | GraphContentBlock)[];
|
|
71
74
|
}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
/** @typedef {import('./types.js').CommandDoc} CommandDoc */
|
|
11
11
|
/** @typedef {import('./types.js').EnumDoc} EnumDoc */
|
|
12
12
|
/** @typedef {import('./types.js').NamespaceDoc} NamespaceDoc */
|
|
13
|
+
/** @typedef {import('./types.js').ThemeDoc} ThemeDoc */
|
|
13
14
|
/**
|
|
14
15
|
* Validate an unknown loaded doc value into its typed shape, or throw.
|
|
15
16
|
* Dispatches on the stamped `type`; unstamped docs fall back to
|
|
@@ -18,9 +19,9 @@
|
|
|
18
19
|
*
|
|
19
20
|
* @param {unknown} input
|
|
20
21
|
* @param {string} [label]
|
|
21
|
-
* @returns {ComponentDoc | HookDoc | FunctionDoc | ReferenceDoc | TemplateDoc | SchemaDoc | CommandDoc | EnumDoc | NamespaceDoc}
|
|
22
|
+
* @returns {ComponentDoc | HookDoc | FunctionDoc | ReferenceDoc | TemplateDoc | SchemaDoc | CommandDoc | EnumDoc | NamespaceDoc | ThemeDoc}
|
|
22
23
|
*/
|
|
23
|
-
export function parseDoc(input: unknown, label?: string): ComponentDoc | HookDoc | FunctionDoc | ReferenceDoc | TemplateDoc | SchemaDoc | CommandDoc | EnumDoc | NamespaceDoc;
|
|
24
|
+
export function parseDoc(input: unknown, label?: string): ComponentDoc | HookDoc | FunctionDoc | ReferenceDoc | TemplateDoc | SchemaDoc | CommandDoc | EnumDoc | NamespaceDoc | ThemeDoc;
|
|
24
25
|
export type ComponentDoc = import("./types.js").ComponentDoc;
|
|
25
26
|
export type HookDoc = import("./types.js").HookDoc;
|
|
26
27
|
export type FunctionDoc = import("./types.js").FunctionDoc;
|
|
@@ -30,3 +31,4 @@ export type SchemaDoc = import("./types.js").SchemaDoc;
|
|
|
30
31
|
export type CommandDoc = import("./types.js").CommandDoc;
|
|
31
32
|
export type EnumDoc = import("./types.js").EnumDoc;
|
|
32
33
|
export type NamespaceDoc = import("./types.js").NamespaceDoc;
|
|
34
|
+
export type ThemeDoc = import("./types.js").ThemeDoc;
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* @file The doc load boundary. `parseDoc` validates an unknown loaded doc value
|
|
5
5
|
* into its typed shape (or throws a readable error), dispatching on the stamped
|
|
6
6
|
* `type` and falling back to legacy shape-sniffing for unstamped docs. Its
|
|
7
|
-
* acceptance set
|
|
8
|
-
*
|
|
7
|
+
* acceptance set preserves the old permissive `ComponentDocSchema` while new
|
|
8
|
+
* stamped kinds, including `theme`, use their sealed parser.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import {parseComponent} from './component/parse.mjs';
|
|
@@ -16,6 +16,7 @@ import {parseSchema} from './schema/parse.mjs';
|
|
|
16
16
|
import {parseCommand} from './command/parse.mjs';
|
|
17
17
|
import {parseEnum} from './enum/parse.mjs';
|
|
18
18
|
import {parseNamespace} from './namespace/parse.mjs';
|
|
19
|
+
import {parseTheme} from './theme/parse.mjs';
|
|
19
20
|
import {parseLegacyDoc} from './legacy.mjs';
|
|
20
21
|
|
|
21
22
|
/** @typedef {import('./types.js').ComponentDoc} ComponentDoc */
|
|
@@ -27,6 +28,7 @@ import {parseLegacyDoc} from './legacy.mjs';
|
|
|
27
28
|
/** @typedef {import('./types.js').CommandDoc} CommandDoc */
|
|
28
29
|
/** @typedef {import('./types.js').EnumDoc} EnumDoc */
|
|
29
30
|
/** @typedef {import('./types.js').NamespaceDoc} NamespaceDoc */
|
|
31
|
+
/** @typedef {import('./types.js').ThemeDoc} ThemeDoc */
|
|
30
32
|
|
|
31
33
|
/**
|
|
32
34
|
* Validate an unknown loaded doc value into its typed shape, or throw.
|
|
@@ -36,7 +38,7 @@ import {parseLegacyDoc} from './legacy.mjs';
|
|
|
36
38
|
*
|
|
37
39
|
* @param {unknown} input
|
|
38
40
|
* @param {string} [label]
|
|
39
|
-
* @returns {ComponentDoc | HookDoc | FunctionDoc | ReferenceDoc | TemplateDoc | SchemaDoc | CommandDoc | EnumDoc | NamespaceDoc}
|
|
41
|
+
* @returns {ComponentDoc | HookDoc | FunctionDoc | ReferenceDoc | TemplateDoc | SchemaDoc | CommandDoc | EnumDoc | NamespaceDoc | ThemeDoc}
|
|
40
42
|
*/
|
|
41
43
|
export function parseDoc(input, label = 'doc') {
|
|
42
44
|
const type =
|
|
@@ -62,9 +64,12 @@ export function parseDoc(input, label = 'doc') {
|
|
|
62
64
|
return parseEnum(input, label);
|
|
63
65
|
case 'namespace':
|
|
64
66
|
return parseNamespace(input, label);
|
|
67
|
+
case 'theme':
|
|
68
|
+
return parseTheme(input, label);
|
|
65
69
|
case undefined:
|
|
66
|
-
return parseLegacyDoc(input, label);
|
|
67
70
|
default:
|
|
68
|
-
|
|
71
|
+
// 0.6.x shape-sniffed unknown stamps. Keep accepting them through the
|
|
72
|
+
// patch compatibility window; canonical writers emit a known stamp.
|
|
73
|
+
return parseLegacyDoc(input, label);
|
|
69
74
|
}
|
|
70
75
|
}
|
|
@@ -62,7 +62,7 @@ export const doc = {
|
|
|
62
62
|
name: 'extends',
|
|
63
63
|
type: 'string',
|
|
64
64
|
description:
|
|
65
|
-
|
|
65
|
+
"Name of an existing topic this doc merges onto, section by section: a section whose title matches one in the base replaces it, a section the base does not have is appended. The topic keeps the base's title and description. For correcting or adding to a topic rather than owning it. Exclusive with `replaces`.",
|
|
66
66
|
example: "'theme'",
|
|
67
67
|
},
|
|
68
68
|
{
|
|
@@ -95,7 +95,7 @@ export const doc = {
|
|
|
95
95
|
name: 'sections[].content',
|
|
96
96
|
type: 'ReferenceContentBlock[]',
|
|
97
97
|
description:
|
|
98
|
-
'Ordered content blocks: prose, heading, code, table, list, and token-ref. workflow, collection, and reference are
|
|
98
|
+
'Ordered content blocks: prose, heading, code, table, list, and token-ref. Graph-only workflow, collection, and reference blocks are available through GraphContentBlock on NamespaceDoc, without widening this stable union.',
|
|
99
99
|
required: true,
|
|
100
100
|
},
|
|
101
101
|
{
|
|
@@ -144,7 +144,7 @@ export const docs = {
|
|
|
144
144
|
},
|
|
145
145
|
{
|
|
146
146
|
type: 'prose',
|
|
147
|
-
text: 'Each `sections[].content` is an ordered array of ReferenceContentBlock,
|
|
147
|
+
text: 'Each `sections[].content` is an ordered array of ReferenceContentBlock, the stable discriminated union of prose, heading, code, table, list, and token-ref. Docs-graph-only workflow, collection, and reference blocks are exported separately as GraphContentBlock and accepted by NamespaceDoc. choice, callout, and checklist remain invalid. ReferenceContentBlock is also reused by the `notes` field on SchemaDoc and CommandDoc.',
|
|
148
148
|
},
|
|
149
149
|
{
|
|
150
150
|
type: 'code',
|
|
@@ -156,7 +156,9 @@ export const docs = {
|
|
|
156
156
|
| { type: 'code'; lang: string; code: string; label?: string }
|
|
157
157
|
| { type: 'table'; headers: string[]; rows: string[][] }
|
|
158
158
|
| { type: 'list'; style: 'ordered' | 'unordered' | 'do' | 'dont'; items: string[] }
|
|
159
|
-
| { type: 'token-ref'; topic: string; section: string }
|
|
159
|
+
| { type: 'token-ref'; topic: string; section: string };
|
|
160
|
+
|
|
161
|
+
type GraphContentBlock =
|
|
160
162
|
| { type: 'workflow'; title?: string; steps: WorkflowStep[] }
|
|
161
163
|
| { type: 'collection'; source: {slot: string}; presentation?: 'list' | 'cards' | 'compact'; whenEmpty?: 'show' | 'omit' }
|
|
162
164
|
| { type: 'reference'; target: string; projection?: {fields?: string[]; sections?: string[]} };`,
|
|
@@ -41,8 +41,13 @@ export interface ReferenceDocBlock {
|
|
|
41
41
|
presentation?: 'summary' | 'compact' | 'full';
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
/** Graph-only content blocks. These are additive and do not widen the stable
|
|
45
|
+
* {@link ReferenceContentBlock} union consumed by existing exhaustive renderers. */
|
|
46
|
+
export type GraphContentBlock =
|
|
47
|
+
WorkflowDocBlock | CollectionDocBlock | ReferenceDocBlock;
|
|
48
|
+
|
|
44
49
|
/**
|
|
45
|
-
* A content block within a reference doc section
|
|
50
|
+
* A content block within a reference doc section.
|
|
46
51
|
* Ordered arrays of these blocks form renderer-neutral documentation content.
|
|
47
52
|
* A new semantic kind must ship with every renderer or fail visibly at a legacy
|
|
48
53
|
* reader boundary until that renderer is available.
|
|
@@ -55,9 +60,6 @@ export interface ReferenceDocBlock {
|
|
|
55
60
|
* { type: 'table', headers: ['Token', 'Value'], rows: [['--spacing-4', '16px']] }
|
|
56
61
|
* { type: 'list', style: 'do', items: ['Use semantic tokens'] }
|
|
57
62
|
* { 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']} }
|
|
61
63
|
* ```
|
|
62
64
|
*/
|
|
63
65
|
export type ReferenceContentBlock =
|
|
@@ -80,10 +82,7 @@ export type ReferenceContentBlock =
|
|
|
80
82
|
topic: string;
|
|
81
83
|
/** Section title to pull from that topic. e.g. `'Color Tokens'` */
|
|
82
84
|
section: string;
|
|
83
|
-
}
|
|
84
|
-
| WorkflowDocBlock
|
|
85
|
-
| CollectionDocBlock
|
|
86
|
-
| ReferenceDocBlock;
|
|
85
|
+
};
|
|
87
86
|
|
|
88
87
|
/**
|
|
89
88
|
* A reference documentation file (.doc.mjs).
|
|
@@ -93,10 +92,10 @@ export type ReferenceContentBlock =
|
|
|
93
92
|
* they aren't tied to a specific component — just drop a .doc.mjs file
|
|
94
93
|
* in the docs/ directory and it shows up in `astryx docs`.
|
|
95
94
|
*
|
|
96
|
-
* Every reference .doc.mjs
|
|
95
|
+
* Every new reference .doc.mjs default-exports a stamped object:
|
|
97
96
|
*
|
|
98
97
|
* /** @type {import('@astryxdesign/cli/authoring').ReferenceDoc} *\/
|
|
99
|
-
* export
|
|
98
|
+
* export default { type: 'generic', ... };
|
|
100
99
|
*/
|
|
101
100
|
export interface ReferenceDoc extends AuthoredDocGraphFields {
|
|
102
101
|
/** Doc-kind discriminant for the stamped default-export format
|
|
@@ -49,7 +49,7 @@ export const doc = {
|
|
|
49
49
|
name: 'namespace',
|
|
50
50
|
type: 'string',
|
|
51
51
|
description:
|
|
52
|
-
"
|
|
52
|
+
"The `astryx docs` topic that reads this doc: 'authoring' for a file an author writes (a section of `astryx docs authoring`), or 'cli/api' for a shape the CLI returns (the section `api-<name>` of the `cli` topic). Every schema doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that no topic reads.",
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
name: 'aliases',
|
|
@@ -47,8 +47,7 @@ export interface SchemaDoc extends AuthoredDocGraphFields {
|
|
|
47
47
|
displayName: string;
|
|
48
48
|
/** One-line summary shown in listings. */
|
|
49
49
|
description: string;
|
|
50
|
-
/**
|
|
51
|
-
* the docs index; set explicitly to place the schema. */
|
|
50
|
+
/** The `astryx docs` topic that reads this doc: 'authoring' for a file an author writes (a section of `astryx docs authoring`), or 'cli/api' for a shape the CLI returns (the section `api-<name>` of the `cli` topic). Every schema doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that no topic reads. */
|
|
52
51
|
namespace?: string;
|
|
53
52
|
/** Alternate slugs that also resolve to this doc (back-compat). */
|
|
54
53
|
aliases?: string[];
|
|
@@ -18,7 +18,7 @@ export const doc = {
|
|
|
18
18
|
"(type: 'page') for full page templates and BlockTemplateDoc (type: 'block') for " +
|
|
19
19
|
'editable compositions. A block can stand alone or use `exampleFor` to attach ' +
|
|
20
20
|
'to one component; `isShowcase` requires that component ownership.',
|
|
21
|
-
appliesTo: '<Name>.
|
|
21
|
+
appliesTo: '<Name>.doc.mjs',
|
|
22
22
|
fields: [
|
|
23
23
|
{
|
|
24
24
|
name: 'type',
|
|
@@ -123,7 +123,7 @@ export const doc = {
|
|
|
123
123
|
{
|
|
124
124
|
label: 'Page template',
|
|
125
125
|
code: `/** @type {import('@astryxdesign/cli/authoring').TemplateDoc} */
|
|
126
|
-
export
|
|
126
|
+
export default {
|
|
127
127
|
type: 'page',
|
|
128
128
|
name: 'Dashboard',
|
|
129
129
|
displayName: 'Dashboard',
|
|
@@ -135,7 +135,7 @@ export const doc = {
|
|
|
135
135
|
{
|
|
136
136
|
label: 'Block template (component example)',
|
|
137
137
|
code: `/** @type {import('@astryxdesign/cli/authoring').TemplateDoc} */
|
|
138
|
-
export
|
|
138
|
+
export default {
|
|
139
139
|
type: 'block',
|
|
140
140
|
name: 'ButtonGroupExample',
|
|
141
141
|
displayName: 'Button Group Example',
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in authoring/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Compile-time drift lock: the sealed schema must infer exactly ThemeDoc.
|
|
6
|
+
*
|
|
7
|
+
* @typedef {import('../../_shared/contract.js').Expect<
|
|
8
|
+
* import('../../_shared/contract.js').Equal<
|
|
9
|
+
* z.infer<typeof themeDocSchema>,
|
|
10
|
+
* ThemeDoc
|
|
11
|
+
* >
|
|
12
|
+
* >} _ThemeDocDriftLock
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Validate an unknown value as a theme descriptor, or throw.
|
|
16
|
+
*
|
|
17
|
+
* @param {unknown} input
|
|
18
|
+
* @param {string} [label]
|
|
19
|
+
* @returns {ThemeDoc}
|
|
20
|
+
*/
|
|
21
|
+
export function parseTheme(input: unknown, label?: string): ThemeDoc;
|
|
22
|
+
/**
|
|
23
|
+
* Compile-time drift lock: the sealed schema must infer exactly ThemeDoc.
|
|
24
|
+
*/
|
|
25
|
+
export type _ThemeDocDriftLock = import("../../_shared/contract.js").Expect<import("../../_shared/contract.js").Equal<z.infer<typeof themeDocSchema>, ThemeDoc>>;
|
|
26
|
+
export type ThemeDoc = import("./type.js").ThemeDoc;
|
|
27
|
+
import { z } from 'zod';
|
|
28
|
+
declare const themeDocSchema: z.ZodObject<{
|
|
29
|
+
type: z.ZodLiteral<"theme">;
|
|
30
|
+
name: z.ZodString;
|
|
31
|
+
displayName: z.ZodString;
|
|
32
|
+
description: z.ZodString;
|
|
33
|
+
maintained: z.ZodBoolean;
|
|
34
|
+
}, z.core.$strict>;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Theme doc parser (stamped `type: 'theme'`). Zod is sealed here;
|
|
5
|
+
* theme discovery calls `parseTheme` at the descriptor load boundary.
|
|
6
|
+
*
|
|
7
|
+
* @input an unknown loaded or statically extracted theme descriptor
|
|
8
|
+
* @output a validated ThemeDoc or a readable schema error
|
|
9
|
+
* @position packages/cli/authoring/doctypes/theme — descriptor load boundary
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import {z} from 'zod';
|
|
13
|
+
import {formatZodError} from '../../_shared/errors.mjs';
|
|
14
|
+
|
|
15
|
+
/** @typedef {import('./type.js').ThemeDoc} ThemeDoc */
|
|
16
|
+
|
|
17
|
+
/** @param {string} field */
|
|
18
|
+
const nonBlank = field =>
|
|
19
|
+
z.string().refine(value => value.trim() !== '', {
|
|
20
|
+
message: `${field} must not be blank`,
|
|
21
|
+
abort: true,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const themeDocSchema = z
|
|
25
|
+
.object({
|
|
26
|
+
type: z.literal('theme'),
|
|
27
|
+
name: nonBlank('name').regex(
|
|
28
|
+
/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u,
|
|
29
|
+
'name must be lowercase kebab-case starting with a letter',
|
|
30
|
+
),
|
|
31
|
+
displayName: nonBlank('displayName'),
|
|
32
|
+
// Blank is allowed, as the released catalog allowed it.
|
|
33
|
+
description: z.string(),
|
|
34
|
+
maintained: z.boolean(),
|
|
35
|
+
})
|
|
36
|
+
.strict();
|
|
37
|
+
|
|
38
|
+
/** Zod skips `__proto__` when it looks for unknown keys. */
|
|
39
|
+
const PROTO_KEY_ISSUE = {
|
|
40
|
+
code: /** @type {const} */ ('unrecognized_keys'),
|
|
41
|
+
keys: ['__proto__'],
|
|
42
|
+
path: [],
|
|
43
|
+
message: 'Unrecognized key: "__proto__"',
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Compile-time drift lock: the sealed schema must infer exactly ThemeDoc.
|
|
48
|
+
*
|
|
49
|
+
* @typedef {import('../../_shared/contract.js').Expect<
|
|
50
|
+
* import('../../_shared/contract.js').Equal<
|
|
51
|
+
* z.infer<typeof themeDocSchema>,
|
|
52
|
+
* ThemeDoc
|
|
53
|
+
* >
|
|
54
|
+
* >} _ThemeDocDriftLock
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Validate an unknown value as a theme descriptor, or throw.
|
|
59
|
+
*
|
|
60
|
+
* @param {unknown} input
|
|
61
|
+
* @param {string} [label]
|
|
62
|
+
* @returns {ThemeDoc}
|
|
63
|
+
*/
|
|
64
|
+
export function parseTheme(input, label = 'theme') {
|
|
65
|
+
const result = themeDocSchema.safeParse(input);
|
|
66
|
+
const protoKey =
|
|
67
|
+
input !== null &&
|
|
68
|
+
typeof input === 'object' &&
|
|
69
|
+
Object.hasOwn(input, '__proto__');
|
|
70
|
+
if (result.success && !protoKey) return result.data;
|
|
71
|
+
const issues = [
|
|
72
|
+
...(result.error?.issues ?? []),
|
|
73
|
+
...(protoKey ? [PROTO_KEY_ISSUE] : []),
|
|
74
|
+
];
|
|
75
|
+
throw new Error(formatZodError(label, new z.ZodError(issues)));
|
|
76
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in authoring/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @file SchemaDoc for the ThemeDoc authoring type.
|
|
6
|
+
* @position packages/cli/authoring/doctypes/theme — doc-type documentation
|
|
7
|
+
*/
|
|
8
|
+
/** @type {import('@astryxdesign/cli/authoring').SchemaDoc} */
|
|
9
|
+
export const doc: import("@astryxdesign/cli/authoring").SchemaDoc;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file SchemaDoc for the ThemeDoc authoring type.
|
|
5
|
+
* @position packages/cli/authoring/doctypes/theme — doc-type documentation
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/** @type {import('@astryxdesign/cli/authoring').SchemaDoc} */
|
|
9
|
+
export const doc = {
|
|
10
|
+
type: 'schema',
|
|
11
|
+
name: 'theme-doc',
|
|
12
|
+
displayName: 'ThemeDoc',
|
|
13
|
+
namespace: 'authoring',
|
|
14
|
+
description:
|
|
15
|
+
'The strongly typed descriptor for one integration or CLI-bundled source theme.',
|
|
16
|
+
appliesTo: '<theme-source-stem>.doc.mjs',
|
|
17
|
+
fields: [
|
|
18
|
+
{
|
|
19
|
+
name: 'type',
|
|
20
|
+
type: "'theme'",
|
|
21
|
+
description: 'Doc-kind discriminant.',
|
|
22
|
+
required: true,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'name',
|
|
26
|
+
type: 'string',
|
|
27
|
+
description:
|
|
28
|
+
'Lower-kebab CLI theme identity. Must match the descriptor parent directory.',
|
|
29
|
+
required: true,
|
|
30
|
+
example: "'ocean'",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'displayName',
|
|
34
|
+
type: 'string',
|
|
35
|
+
description: 'Human-readable name shown by theme listings.',
|
|
36
|
+
required: true,
|
|
37
|
+
example: "'Ocean'",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'description',
|
|
41
|
+
type: 'string',
|
|
42
|
+
description: 'One-line summary shown by theme listings.',
|
|
43
|
+
required: true,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'maintained',
|
|
47
|
+
type: 'boolean',
|
|
48
|
+
description: 'Whether the owning package actively maintains this theme.',
|
|
49
|
+
required: true,
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
examples: [
|
|
53
|
+
{
|
|
54
|
+
label: 'A theme descriptor beside oceanTheme.ts',
|
|
55
|
+
code: `/** @type {import('@astryxdesign/cli/authoring').ThemeDoc} */
|
|
56
|
+
export default {
|
|
57
|
+
type: 'theme',
|
|
58
|
+
name: 'ocean',
|
|
59
|
+
displayName: 'Ocean',
|
|
60
|
+
description: 'Cool blue surfaces with crisp contrast.',
|
|
61
|
+
maintained: true,
|
|
62
|
+
};`,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
notes: [
|
|
66
|
+
{
|
|
67
|
+
type: 'prose',
|
|
68
|
+
text: 'ThemeDoc is static metadata. Default-export one object with literal string and boolean fields; discovery validates it without executing the descriptor or theme source.',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
type: 'prose',
|
|
72
|
+
text: 'The descriptor and source share one stem. For oceanTheme.doc.mjs, discovery requires exactly one oceanTheme source module and a named oceanTheme runtime export.',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
type: 'prose',
|
|
76
|
+
text: 'The parent theme directory, including this descriptor, is the complete copy and pack boundary. Nested source, palettes, assets, and receipts need no second file list.',
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Theme contribution descriptor type.
|
|
5
|
+
*
|
|
6
|
+
* A theme descriptor is a strongly typed `.doc.mjs` beside its same-stem theme
|
|
7
|
+
* source. The shared stem identifies the source entry and required named runtime
|
|
8
|
+
* export. The lower-kebab parent directory and `name` identify the CLI theme.
|
|
9
|
+
*
|
|
10
|
+
* @input metadata authored beside one source theme
|
|
11
|
+
* @output the public ThemeDoc contract
|
|
12
|
+
* @position packages/cli/authoring/doctypes/theme — theme descriptor vocabulary
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The descriptor for one source theme contributed by an integration or bundled
|
|
17
|
+
* with the CLI.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```
|
|
21
|
+
* /** @type {import('@astryxdesign/cli/authoring').ThemeDoc} *\/
|
|
22
|
+
* export default {
|
|
23
|
+
* type: 'theme',
|
|
24
|
+
* name: 'ocean',
|
|
25
|
+
* displayName: 'Ocean',
|
|
26
|
+
* description: 'Cool blue surfaces with crisp contrast.',
|
|
27
|
+
* maintained: true,
|
|
28
|
+
* };
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export interface ThemeDoc {
|
|
32
|
+
/** Doc-kind discriminant. */
|
|
33
|
+
type: 'theme';
|
|
34
|
+
/** Stable CLI identity. Must be lower-kebab and match the parent directory. */
|
|
35
|
+
name: string;
|
|
36
|
+
/** Human-readable name shown by theme listings. */
|
|
37
|
+
displayName: string;
|
|
38
|
+
/** One-line summary shown by theme listings. */
|
|
39
|
+
description: string;
|
|
40
|
+
/** Whether the owning package actively maintains this theme. */
|
|
41
|
+
maintained: boolean;
|
|
42
|
+
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* @file Doc-type vocabulary barrel. Each kind's types live in one `type.ts`
|
|
5
5
|
* under its folder (`base/` shared leaves, then `component/`, `hook/`,
|
|
6
|
-
* `reference/`, `template/`); this re-exports them as the full doc vocabulary
|
|
6
|
+
* `reference/`, `template/`, `theme/`); this re-exports them as the full doc vocabulary
|
|
7
7
|
* behind `@astryxdesign/cli/authoring`.
|
|
8
8
|
*/
|
|
9
9
|
|
|
@@ -17,3 +17,4 @@ export type * from './template/type.js';
|
|
|
17
17
|
export type * from './schema/type.js';
|
|
18
18
|
export type * from './command/type.js';
|
|
19
19
|
export type * from './enum/type.js';
|
|
20
|
+
export type * from './theme/type.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in authoring/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @file SchemaDoc for GapReportHandler, the handler `astryx gap-report` calls.
|
|
6
|
+
* @input The GapReportHandler type beside it (`type.ts`), which `parse.mjs`
|
|
7
|
+
* validates.
|
|
8
|
+
* @output The `gap-report-handler` section of `astryx docs authoring`.
|
|
9
|
+
* @position packages/cli/authoring/gap-report — schema documentation
|
|
10
|
+
*/
|
|
11
|
+
/** @type {import('@astryxdesign/cli/authoring').SchemaDoc} */
|
|
12
|
+
export const doc: import("@astryxdesign/cli/authoring").SchemaDoc;
|