@astryxdesign/cli 0.7.2-canary.e2909cf → 0.7.2-canary.e4bdd70
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 +15 -14
- package/api/build/help/help.mjs +1 -1
- package/api/component/_adapter.d.mts +41 -1
- package/api/component/_adapter.mjs +93 -7
- package/api/component/component.mjs +22 -5
- package/api/component/integration-export-name.test.mjs +644 -0
- package/api/docs/_adapter.d.mts +11 -0
- package/api/docs/_adapter.mjs +244 -1
- package/api/docs/integrationDocs.test.mjs +124 -0
- package/api/doctor/theme-checks.mjs +1 -1
- package/api/gap-report/gap-report.mjs +67 -4
- package/api/index.d.mts +2 -0
- package/api/index.mjs +2 -0
- package/api/init/run/run.mjs +2 -2
- package/api/integration/_adapter.d.mts +12 -0
- package/api/integration/_adapter.mjs +54 -0
- package/api/integration/add-contribution.component-names.test.mjs +66 -0
- package/api/integration/add-contribution.mjs +8 -4
- package/api/integration/add-contribution.test.mjs +4 -2
- package/api/integration/authoring-checks.mjs +11 -2
- package/api/integration/authoring-checks.test.mjs +39 -0
- package/api/integration/authoring-checks.type.d.mts +9 -0
- package/api/integration/authoring-checks.type.mjs +14 -1
- package/api/integration/check/check.d.mts +96 -0
- package/api/integration/check/check.mjs +357 -0
- package/api/integration/check/check.test.mjs +489 -0
- package/api/integration/integration-check.type.d.mts +118 -0
- package/api/integration/integration-check.type.mjs +84 -0
- package/api/integration/integrationCheck.doc.d.mts +10 -0
- package/api/integration/integrationCheck.doc.mjs +73 -0
- package/api/integration/integrationComponentConflicts.doc.mjs +36 -5
- package/api/integration/pack-check.mjs +51 -97
- package/api/integration/pack-check.test.mjs +359 -0
- package/api/integration/validate-integration.mjs +8 -0
- package/api/integration/validate-integration.test.mjs +11 -0
- package/api/integration/validate-integration.type.d.mts +8 -0
- package/api/integration/validate-integration.type.mjs +12 -1
- package/api/integration/validateIntegration.doc.mjs +17 -3
- package/api/search/search.d.mts +22 -6
- package/api/search/search.domain-priority.test.mjs +93 -18
- package/api/search/search.integration-check.test.mjs +24 -0
- package/api/search/search.mjs +133 -22
- package/api/swizzle/copy/copy.mjs +28 -14
- package/api/theme/build/build.family.test.mjs +54 -6
- package/api/theme/build/build.mjs +114 -17
- package/api/theme/themeBuild.doc.mjs +4 -4
- package/assets/docs/README.md +10 -0
- package/assets/docs/author-a-theme.doc.mjs +1 -1
- package/assets/docs/getting-started.doc.mjs +3 -3
- package/assets/docs/styling-overview.doc.mjs +1 -1
- package/assets/docs/theme.doc.dense.mjs +1 -1
- package/assets/docs/theme.doc.mjs +1 -1
- package/assets/docs/theme.doc.zh.mjs +1 -1
- package/assets/docs/tree/add-a-component.doc.mjs +11 -1
- package/assets/docs/tree/add-a-theme.doc.mjs +1 -1
- package/assets/docs/tree/add-a-topic.doc.mjs +10 -7
- package/assets/docs/tree/agent-guidance.doc.mjs +2 -2
- package/assets/docs/tree/block-template.doc.mjs +8 -20
- package/assets/docs/tree/build-the-template.doc.mjs +1 -1
- package/assets/docs/tree/check-the-props.doc.mjs +196 -0
- package/assets/docs/tree/check-your-docs.doc.mjs +51 -5
- package/assets/docs/tree/checks.doc.mjs +24 -16
- package/assets/docs/tree/codemods.doc.mjs +4 -4
- package/assets/docs/tree/component-family.doc.mjs +8 -6
- package/assets/docs/tree/component-imports.doc.mjs +10 -2
- package/assets/docs/tree/components.doc.mjs +1 -1
- package/assets/docs/tree/debug-and-gap-reports.doc.mjs +7 -18
- package/assets/docs/tree/define-the-theme.doc.mjs +6 -5
- package/assets/docs/tree/describe-the-component.doc.mjs +2 -2
- package/assets/docs/tree/docs.doc.mjs +3 -3
- package/assets/docs/tree/document-the-template.doc.mjs +1 -1
- package/assets/docs/tree/document-the-theme.doc.mjs +1 -1
- package/assets/docs/tree/export-template-assets.doc.mjs +1 -1
- package/assets/docs/tree/extend-or-replace.doc.mjs +6 -6
- package/assets/docs/tree/fonts-and-assets.doc.mjs +2 -2
- package/assets/docs/tree/generate-a-palette.doc.mjs +5 -3
- package/assets/docs/tree/grade-template-with-agent.doc.mjs +1 -1
- package/assets/docs/tree/integrations.doc.mjs +8 -0
- package/assets/docs/tree/links.doc.mjs +6 -5
- package/assets/docs/tree/package-and-test.doc.mjs +1 -1
- package/assets/docs/tree/page-template.doc.mjs +4 -8
- package/assets/docs/tree/publishing.doc.mjs +1 -1
- package/assets/docs/tree/quick-start.doc.mjs +37 -21
- package/assets/docs/tree/replace-a-core-component.doc.mjs +4 -6
- package/assets/docs/tree/replace-a-core-template.doc.mjs +6 -8
- package/assets/docs/tree/sections-and-placement.doc.mjs +4 -6
- package/assets/docs/tree/see-it-in-an-app.doc.mjs +4 -2
- package/assets/docs/tree/short-and-findable.doc.mjs +6 -5
- package/assets/docs/tree/single-component.doc.mjs +15 -6
- package/assets/docs/tree/start-a-template.doc.mjs +3 -3
- package/assets/docs/tree/subcomponent.doc.mjs +6 -6
- package/assets/docs/tree/template-assets.doc.mjs +2 -2
- package/assets/docs/tree/template-doc-overview.doc.mjs +4 -15
- package/assets/docs/tree/template-fonts.doc.mjs +1 -1
- package/assets/docs/tree/template-icons.doc.mjs +1 -1
- package/assets/docs/tree/template-images-media.doc.mjs +1 -1
- package/assets/docs/tree/template-styles.doc.mjs +2 -2
- package/assets/docs/tree/templates.doc.mjs +1 -1
- package/assets/docs/tree/test-in-an-app.doc.mjs +3 -3
- package/assets/docs/tree/test-template-in-app.doc.mjs +1 -1
- package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
- package/assets/docs/tree/troubleshooting.doc.mjs +13 -5
- package/assets/docs/tree/type-scale.doc.mjs +3 -3
- package/assets/docs/tree/upgrading.doc.mjs +3 -3
- package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +3 -1
- package/assets/docs/tree/verify-packed-template.doc.mjs +1 -1
- package/assets/docs/tree/versioning.doc.mjs +7 -6
- package/assets/docs/tree/write-the-template-file.doc.mjs +4 -3
- package/assets/docs/use-a-theme.doc.mjs +2 -2
- package/assets/theme.template.ts +1 -1
- package/authoring/codemod/codemod.doc.mjs +7 -3
- package/authoring/config/config.doc.mjs +9 -6
- package/authoring/config/type.ts +4 -2
- package/authoring/discover/discover.doc.mjs +1 -1
- package/authoring/doctypes/base/graph-fields.doc.mjs +6 -4
- package/authoring/doctypes/command/command.doc.mjs +14 -12
- package/authoring/doctypes/component/component.doc.mjs +29 -26
- package/authoring/doctypes/component/type.ts +13 -8
- package/authoring/doctypes/enum/enum.doc.mjs +7 -4
- package/authoring/doctypes/function/function.doc.mjs +9 -8
- package/authoring/doctypes/hook/hook.doc.mjs +5 -4
- package/authoring/doctypes/namespace/namespace.doc.mjs +7 -6
- package/authoring/doctypes/reference/reference.doc.mjs +11 -10
- package/authoring/doctypes/schema/schema.doc.mjs +9 -9
- package/authoring/doctypes/template/integration-template.doc.d.mts +11 -0
- package/authoring/doctypes/template/integration-template.doc.mjs +49 -0
- package/authoring/doctypes/template/parse.d.mts +6 -2
- package/authoring/doctypes/template/parse.mjs +3 -1
- package/authoring/doctypes/template/template.doc.mjs +3 -3
- package/authoring/doctypes/template/type.ts +22 -0
- package/authoring/doctypes/theme/theme.doc.mjs +2 -2
- package/authoring/gap-report/gap-report.doc.mjs +2 -2
- package/authoring/identity/identity.doc.mjs +3 -3
- package/authoring/index.d.ts +1 -0
- package/authoring/integration/integration.doc.mjs +12 -4
- package/authoring/integration/parse.test.mjs +10 -0
- package/authoring/integration/schema.d.mts +2 -0
- package/authoring/integration/schema.mjs +1 -0
- package/authoring/integration/type.ts +4 -0
- package/clients/cli/commands/build-theme.batch-report.test.mjs +3 -1
- package/clients/cli/commands/build-theme.mjs +1 -1
- package/clients/cli/commands/build-theme.path-safety.test.mjs +155 -21
- package/clients/cli/commands/doctor-integration-components.doc.mjs +15 -4
- package/clients/cli/commands/doctor-integration-validate.doc.mjs +11 -2
- package/clients/cli/commands/doctor-integration.test.mjs +837 -0
- package/clients/cli/commands/doctor.mjs +190 -0
- package/clients/cli/commands/integration-check.doc.mjs +85 -0
- package/clients/cli/commands/integration-check.test.mjs +267 -0
- package/clients/cli/commands/integration.doc.mjs +6 -2
- package/clients/cli/commands/integration.mjs +107 -1
- package/clients/cli/commands/text-json-parity.test.mjs +5 -0
- package/clients/cli/commands/theme-build.doc.mjs +2 -2
- package/clients/cli/index.mjs +1 -0
- package/foundation/config/project.mjs +82 -0
- package/foundation/discovery/authoring-self-docs.mjs +2 -1
- package/foundation/discovery/component-discovery.d.mts +178 -10
- package/foundation/discovery/component-discovery.export-names.test.mjs +760 -0
- package/foundation/discovery/component-discovery.mjs +659 -62
- package/foundation/discovery/component-replacement.mjs +18 -0
- package/foundation/discovery/component-replacement.test.mjs +40 -0
- package/foundation/discovery/doc-types.d.mts +157 -0
- package/foundation/discovery/doc-types.mjs +1224 -0
- package/foundation/discovery/doc-types.test.mjs +652 -0
- package/foundation/discovery/docs-discovery.d.mts +81 -0
- package/foundation/discovery/docs-discovery.mjs +57 -0
- package/foundation/discovery/integration-doc-files.d.mts +22 -0
- package/foundation/discovery/integration-doc-files.mjs +231 -0
- package/foundation/discovery/integration-doc-files.test.mjs +246 -0
- package/foundation/discovery/module-exports.d.mts +27 -0
- package/foundation/discovery/module-exports.mjs +356 -31
- package/foundation/discovery/module-exports.test.mjs +172 -0
- package/foundation/discovery/package-tsconfig.d.mts +14 -0
- package/foundation/discovery/package-tsconfig.mjs +228 -0
- package/foundation/discovery/package-tsconfig.test.mjs +210 -0
- package/foundation/discovery/project-typescript.d.mts +23 -0
- package/foundation/discovery/project-typescript.mjs +61 -0
- package/foundation/discovery/prop-drift.d.mts +278 -0
- package/foundation/discovery/prop-drift.mjs +2263 -0
- package/foundation/discovery/prop-drift.test.mjs +2219 -0
- package/foundation/discovery/type-match.d.mts +53 -0
- package/foundation/discovery/type-match.mjs +660 -0
- package/foundation/discovery/type-match.test.mjs +169 -0
- package/foundation/discovery/type-text.d.mts +68 -0
- package/foundation/discovery/type-text.mjs +658 -0
- package/foundation/discovery/type-text.test.mjs +196 -0
- package/foundation/discovery/unresolved-references.d.mts +62 -0
- package/foundation/discovery/unresolved-references.mjs +790 -0
- package/foundation/discovery/unresolved-references.test.mjs +567 -0
- package/foundation/doc-compiler/doc-loads.test.mjs +6 -0
- package/foundation/doc-compiler/links.d.mts +9 -5
- package/foundation/doc-compiler/links.mjs +4 -2
- package/foundation/integrations/contribution-inventory.mjs +6 -1
- package/foundation/response/response-types.doc.mjs +7 -2
- package/package.json +9 -9
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file `astryx docs cli/integrations/building-blocks/components/describe-the-component/check-the-props`:
|
|
5
|
+
* compare each component doc's props table with the component's TypeScript
|
|
6
|
+
* props, read each finding, and fix the doc or the code.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/** @type {import('@astryxdesign/cli/authoring').ReferenceDoc} */
|
|
10
|
+
export const docs = {
|
|
11
|
+
type: 'generic',
|
|
12
|
+
name: 'check-the-props',
|
|
13
|
+
placement: {
|
|
14
|
+
parent: 'namespace:describe-the-component',
|
|
15
|
+
slot: 'guides',
|
|
16
|
+
order: 50,
|
|
17
|
+
},
|
|
18
|
+
title: 'Check the props table',
|
|
19
|
+
category: 'guide',
|
|
20
|
+
keywords: [
|
|
21
|
+
'props table',
|
|
22
|
+
'documented props',
|
|
23
|
+
'prop drift',
|
|
24
|
+
'props not compared',
|
|
25
|
+
],
|
|
26
|
+
description:
|
|
27
|
+
"Compare each props table with the component's TypeScript props, then fix the doc or the code.",
|
|
28
|
+
sections: [
|
|
29
|
+
{
|
|
30
|
+
id: 'run-the-props-check',
|
|
31
|
+
title: 'Run the props check',
|
|
32
|
+
content: [
|
|
33
|
+
{
|
|
34
|
+
type: 'prose',
|
|
35
|
+
text: "`doctor integration components` compares every props table in your component docs, hidden docs and every family entry included, with the props the component's TypeScript declares. Run it in your package after you change a component or its doc.",
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
type: 'code',
|
|
39
|
+
lang: 'bash',
|
|
40
|
+
code: 'npx astryx doctor integration components',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
type: 'code',
|
|
44
|
+
lang: 'text',
|
|
45
|
+
code: `severity: [warn]
|
|
46
|
+
component: AcmeCarousel
|
|
47
|
+
prop: loop
|
|
48
|
+
kind: not_in_code
|
|
49
|
+
message: "loop" is documented, but AcmeCarousel's props have no "loop".
|
|
50
|
+
doc: components/AcmeCarousel.doc.mjs
|
|
51
|
+
source: components/AcmeCarousel.tsx
|
|
52
|
+
docType: boolean
|
|
53
|
+
|
|
54
|
+
1 prop(s) differ between the docs and the code in 1 of 1 component(s) compared (TypeScript 6.0.3). These are warnings: update the doc, or the code if the doc is right.`,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
type: 'list',
|
|
58
|
+
style: 'unordered',
|
|
59
|
+
items: [
|
|
60
|
+
"A doc's own `props` describe the export its `name` names. In a family doc, each entry describes its own export. A hook entry documents parameters and returns, so it is not compared.",
|
|
61
|
+
"It reads props with the `typescript` your package installs, and reads your package's `tsconfig.json` the way `tsc -p` does. Without TypeScript it prints `[skip] Props not compared` and the reason.",
|
|
62
|
+
'Every finding is a warning, so the exit code stays 0. Read them before you publish. With `--json`, they are in `data.propDrift.findings`.',
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: 'fix-each-finding',
|
|
69
|
+
title: 'Fix each finding',
|
|
70
|
+
content: [
|
|
71
|
+
{
|
|
72
|
+
type: 'prose',
|
|
73
|
+
text: "Each finding's `kind` says what differs. Fix the doc, or the code if the doc is right.",
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
type: 'table',
|
|
77
|
+
headers: ['Kind', 'Means', 'Fix'],
|
|
78
|
+
rows: [
|
|
79
|
+
[
|
|
80
|
+
'`not_in_code`',
|
|
81
|
+
"The doc lists a prop the component's props do not have",
|
|
82
|
+
'Remove it from the doc, or add it to the code. A name an index signature takes, such as `data-*`, counts as present',
|
|
83
|
+
],
|
|
84
|
+
[
|
|
85
|
+
'`not_in_doc`',
|
|
86
|
+
"Your package declares a prop the doc does not list, or builds one with a mapped type, such as `Partial<Record<'sm' | 'md', string>>`",
|
|
87
|
+
'Document it. Props from React, the DOM, or another package are never asked for, and neither are props whose keys another package defines (`keyof CSSProperties`, behind an alias or not), `className`, `style`, `xstyle`, `data-testid`, `ref`, `key`, or a prop whose JSDoc has `@internal`. A deprecated prop is still a prop: document it until you remove it. A prop a mapped type builds from keys the check cannot trace (a template literal, say) is listed under `[info] Props not checked for a doc entry` instead',
|
|
88
|
+
],
|
|
89
|
+
[
|
|
90
|
+
'`required_mismatch`',
|
|
91
|
+
'`required` disagrees with the code',
|
|
92
|
+
'Set `required: true` exactly when every caller must pass the prop. One your `defaultProps` fills counts as optional, as it is to JSX callers, and so does one only some members of a union require, since a caller can leave it out: say in its description which variants need it. An entry that names several props (`value / onChange`) makes the same claim about each: give them separate entries when they differ',
|
|
93
|
+
],
|
|
94
|
+
[
|
|
95
|
+
'`type_mismatch`',
|
|
96
|
+
"The documented `type` differs from the code's, where both read exactly",
|
|
97
|
+
'Copy the type from the source, or fix the code. The next section says which types are judged',
|
|
98
|
+
],
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: 'write-types-the-check-can-judge',
|
|
105
|
+
title: 'Write types the check can judge',
|
|
106
|
+
content: [
|
|
107
|
+
{
|
|
108
|
+
type: 'prose',
|
|
109
|
+
text: 'For a prop your package declares, the check also compares the documented `type`, but only where both sides read exactly. It never guesses, so a type it cannot judge is listed, not reported. It needs TypeScript 4.8 or later: with an older one it prints `[skip] Prop types not judged` and judges none.',
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
type: 'code',
|
|
113
|
+
lang: 'text',
|
|
114
|
+
code: `severity: [warn]
|
|
115
|
+
component: AcmeCarousel
|
|
116
|
+
prop: interval
|
|
117
|
+
kind: type_mismatch
|
|
118
|
+
message: "interval" is documented as string, but the code declares number.
|
|
119
|
+
doc: components/AcmeCarousel.doc.mjs
|
|
120
|
+
source: components/AcmeCarousel.tsx
|
|
121
|
+
docType: string
|
|
122
|
+
codeType: number`,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'list',
|
|
126
|
+
style: 'unordered',
|
|
127
|
+
items: [
|
|
128
|
+
"Write the type as the source writes it, such as `ReactNode[]` or `(index: number) => void`. Parameter names, member order, quotes and whitespace may differ. Text that writes `readonly` must match exactly, parameter names included; only whitespace may differ. `React.X` names React's own `X` where the prop is declared, so it matches a bare `X` only where that name is React's: `React.KeyboardEvent` is not the DOM's `KeyboardEvent`.",
|
|
129
|
+
"Name a type as the file that declares the prop names it, so an import renamed there (`Item as BaseItem`) is written as that file writes it. A field (`cfg.level`) takes its prop's file, even when the field's own type is declared in another file.",
|
|
130
|
+
'A type written another way is judged only when both sides are built from exact parts: primitives such as `string` and `number`, string, number and boolean literals, string enum members, arrays and unions of these, and type names that stand for them. Union members may come in any order, and a member another covers adds nothing, as TypeScript passes it there: `undefined` beside `void`, or `string[]` beside `(string | number)[]`.',
|
|
131
|
+
'A mutable array type matches a readonly one, because callers can pass it. A readonly one documented for a mutable array is a mismatch.',
|
|
132
|
+
"When a prop's variants give a field different types, as `{value: string} | {value: number}` does, document every variant's type (`string | number`). The types of only some variants are listed: the prop's variants give this field different types. With more than six variant types, any other type is listed too.",
|
|
133
|
+
"To name an alias and show its values, write `AcmeSize = 'sm' | 'md'` or `AcmeSize ('sm' | 'md')`. Both parts must match.",
|
|
134
|
+
"An optional prop's `undefined` is set aside on both sides. With `exactOptionalPropertyTypes`, the doc shows `undefined` exactly when the code declares it.",
|
|
135
|
+
'Anything else, such as an object, a tuple, a generic with arguments, `keyof`, an intersection, or a mapped or conditional type written another way, is not compared.',
|
|
136
|
+
],
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: 'prose',
|
|
140
|
+
text: "The check prints how many documented types it judged, then lists the rest by reason: not a form the check judges exactly, a field the prop's variants give different types, a standard prop, or a prop declared outside the package. With `--json`, they are in `data.propDrift.typesNotCompared`.",
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'code',
|
|
144
|
+
lang: 'text',
|
|
145
|
+
code: '[info] Documented prop types judged: 2; not compared: 0. A type is judged when the doc writes it the same as the source (exactly, if it contains `readonly`), or when both are primitives, literals, arrays and unions of those, or names for them.',
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
id: 'when-a-component-is-not-compared',
|
|
151
|
+
title: 'When a component is not compared',
|
|
152
|
+
content: [
|
|
153
|
+
{
|
|
154
|
+
type: 'prose',
|
|
155
|
+
text: "When the check cannot read a component's props exactly, it lists the component under `[info] Props not compared`, with the reason, instead of reporting findings that might be wrong.",
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
type: 'code',
|
|
159
|
+
lang: 'text',
|
|
160
|
+
code: `[info] Props not compared for 1 documented component(s):
|
|
161
|
+
|
|
162
|
+
component: AcmeCarousel
|
|
163
|
+
doc: components/AcmeCarousel.doc.mjs
|
|
164
|
+
reason: AcmeCarousel depends on \`@acme/motion\` (imported in AcmeCarousel.tsx), which the compiler could not resolve, usually a dependency that is not installed. Install the package's dependencies and run this check again`,
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
type: 'table',
|
|
168
|
+
headers: ['Reason', 'Fix'],
|
|
169
|
+
rows: [
|
|
170
|
+
[
|
|
171
|
+
'It depends on a package or file the compiler could not resolve',
|
|
172
|
+
"Install the package's dependencies, then run the check again",
|
|
173
|
+
],
|
|
174
|
+
[
|
|
175
|
+
"It depends on a type the compiler can't work out",
|
|
176
|
+
'Make the types compile with `npx tsc --noEmit`, then run the check again',
|
|
177
|
+
],
|
|
178
|
+
[
|
|
179
|
+
"The package's TypeScript config has an error",
|
|
180
|
+
'Fix `tsconfig.json` until `npx tsc -p .` reads it',
|
|
181
|
+
],
|
|
182
|
+
['Its props are typed `any`', 'Give the component a props type'],
|
|
183
|
+
[
|
|
184
|
+
'Some prop names come from a type parameter',
|
|
185
|
+
'Nothing to fix: a component that renders an element the caller picks takes props known only where it is used',
|
|
186
|
+
],
|
|
187
|
+
[
|
|
188
|
+
"The file has no export named by the doc's `name`",
|
|
189
|
+
'Change `name` or the export so they agree',
|
|
190
|
+
],
|
|
191
|
+
],
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @file `astryx docs cli/integrations/docs/check-your-docs`:
|
|
5
|
-
* proves about an integration's docs: the docs check,
|
|
6
|
-
* CLI peer.
|
|
4
|
+
* @file `astryx docs cli/integrations/building-blocks/docs/check-your-docs`:
|
|
5
|
+
* what each check proves about an integration's docs: the docs check, each
|
|
6
|
+
* doc's fields, the read size, and the CLI peer.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
/** @type {import('@astryxdesign/cli/authoring').ReferenceDoc} */
|
|
@@ -13,7 +13,8 @@ export const docs = {
|
|
|
13
13
|
placement: {parent: 'namespace:docs', slot: 'guides', order: 60},
|
|
14
14
|
title: 'Check your docs',
|
|
15
15
|
category: 'guide',
|
|
16
|
-
description:
|
|
16
|
+
description:
|
|
17
|
+
'Check the docs tree, links, overlaps, doc fields, read size, and CLI peer.',
|
|
17
18
|
sections: [
|
|
18
19
|
{
|
|
19
20
|
id: 'run-the-docs-check',
|
|
@@ -45,7 +46,7 @@ export const docs = {
|
|
|
45
46
|
content: [
|
|
46
47
|
{
|
|
47
48
|
type: 'prose',
|
|
48
|
-
text: 'A doc that does not load, an accidental Core overlap, or a failed namespace or placement fails the check with exit code 1. A link that names no doc only warns, and the exit code stays 0.',
|
|
49
|
+
text: 'A doc that does not load, an accidental Core overlap, a `reference` block that names no doc, or a failed namespace or placement fails the check with exit code 1. A link that names no doc only warns, and the exit code stays 0.',
|
|
49
50
|
},
|
|
50
51
|
{
|
|
51
52
|
type: 'table',
|
|
@@ -66,6 +67,11 @@ export const docs = {
|
|
|
66
67
|
'`[fail]` `invalid_doc_graph`',
|
|
67
68
|
'1',
|
|
68
69
|
],
|
|
70
|
+
[
|
|
71
|
+
'A `reference` block whose target names no doc',
|
|
72
|
+
'`[fail]` `invalid_doc_reference`',
|
|
73
|
+
'1',
|
|
74
|
+
],
|
|
69
75
|
['A link that names no doc', '`[warn]` `invalid_doc_graph`', '0'],
|
|
70
76
|
[
|
|
71
77
|
'A topic that sets `replaces` or `extends`',
|
|
@@ -80,6 +86,46 @@ export const docs = {
|
|
|
80
86
|
},
|
|
81
87
|
],
|
|
82
88
|
},
|
|
89
|
+
{
|
|
90
|
+
id: 'check-each-doc-against-its-type',
|
|
91
|
+
title: 'Check each doc against its type',
|
|
92
|
+
content: [
|
|
93
|
+
{
|
|
94
|
+
type: 'prose',
|
|
95
|
+
text: "`doctor integration validate` reads every doc your package ships against the type `@astryxdesign/cli/authoring` publishes for its kind, the way `tsc` would: a `hidden` doc and a second doc for one name too. Test fixtures under `__tests__` in the components or docs root, which those readers skip, are counted, not checked. It reports a field the type does not have (`unknown_field`), a missing required field (`missing_field`), and a value outside the field's type (`wrong_type`).",
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
type: 'code',
|
|
99
|
+
lang: 'bash',
|
|
100
|
+
code: 'npx astryx doctor integration validate',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
type: 'code',
|
|
104
|
+
lang: 'text',
|
|
105
|
+
code: `Checking 1 doc(s) against the authoring types (TypeScript 6.0.3)
|
|
106
|
+
|
|
107
|
+
severity: [warn]
|
|
108
|
+
doc: components/AcmeCarousel.doc.mjs
|
|
109
|
+
line: 7
|
|
110
|
+
export: default
|
|
111
|
+
type: ComponentDoc
|
|
112
|
+
field: summary
|
|
113
|
+
problem: unknown_field
|
|
114
|
+
message: Object literal may only specify known properties, and 'summary' does not exist in type 'SingleComponentDoc'.
|
|
115
|
+
fix: Remove \`summary\`: SingleComponentDoc has no field \`summary\`.`,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'list',
|
|
119
|
+
style: 'unordered',
|
|
120
|
+
items: [
|
|
121
|
+
"The folder decides the type: `ComponentDoc` in your components root, `IntegrationTemplateDoc` in your templates root, `ThemeDoc` in your themes root, and in your docs root the type the doc's `type` names. Keep the `@type` comment above each doc's export too, so your editor shows the same problems as you type.",
|
|
122
|
+
'Every finding is a warning, so the exit code stays 0. With `--json`, they are in `data.docTypes.findings`.',
|
|
123
|
+
'It uses the `typescript` your package installs. Without it, it prints `[skip] Docs not type-checked` and the reason.',
|
|
124
|
+
'Every field of every doc type is in `astryx docs authoring`.',
|
|
125
|
+
],
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
},
|
|
83
129
|
{
|
|
84
130
|
id: 'check-read-size',
|
|
85
131
|
title: 'Check read size',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @file `astryx docs cli/integrations/checks`: what each package check
|
|
4
|
+
* @file `astryx docs cli/integrations/ship/checks`: what each package check
|
|
5
5
|
* proves, what fails and what only warns, and one command to run them all.
|
|
6
6
|
*/
|
|
7
7
|
|
|
@@ -12,7 +12,7 @@ export const docs = {
|
|
|
12
12
|
placement: {parent: 'namespace:ship', slot: 'guides', order: 20},
|
|
13
13
|
title: 'Check an integration',
|
|
14
14
|
category: 'guide',
|
|
15
|
-
keywords: ['check before publishing', 'validate an integration'
|
|
15
|
+
keywords: ['check before publishing', 'validate an integration'],
|
|
16
16
|
description:
|
|
17
17
|
'Pick the check for each problem, learn what fails and what only warns, and run every check in CI.',
|
|
18
18
|
sections: [
|
|
@@ -22,7 +22,7 @@ export const docs = {
|
|
|
22
22
|
content: [
|
|
23
23
|
{
|
|
24
24
|
type: 'prose',
|
|
25
|
-
text: 'Run these in the package folder. The four `doctor integration` checks read your source; `integration verify` checks the package npm would publish.',
|
|
25
|
+
text: 'Run these in the package folder. The four `doctor integration` checks read your source, and `integration check` runs all four; `integration verify` checks the package npm would publish.',
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
type: 'table',
|
|
@@ -30,15 +30,15 @@ export const docs = {
|
|
|
30
30
|
rows: [
|
|
31
31
|
[
|
|
32
32
|
'`npx astryx doctor integration validate`',
|
|
33
|
-
'The manifest loads,
|
|
33
|
+
'The manifest loads, each root holds contributions the CLI can read, and each doc matches its authoring type',
|
|
34
34
|
'A declared root is missing (`missing_root`), a contribution does not load (`invalid_doc`, `invalid_component`, `invalid_theme`), or two templates in the package replace one Core id (`ambiguous_template_replacement`)',
|
|
35
|
-
|
|
35
|
+
"The manifest has a key this CLI does not know (`unknown_manifest_key`), or a doc field does not match the doc's authoring type: a field the type does not have, a missing required field, or a value outside the field's type. It checks docs with your installed `typescript`; without it, it prints `[skip] Docs not type-checked`. With no `astryx.integration.mjs` it prints a hint and exits 0",
|
|
36
36
|
],
|
|
37
37
|
[
|
|
38
38
|
'`npx astryx doctor integration components`',
|
|
39
|
-
|
|
39
|
+
"No component name clashes with a Core component, each `replaces` names one Core component, and each component doc's props match the component's TypeScript props",
|
|
40
40
|
'Core is not installed (`core_not_found`). In a package that declares the CLI range that turns replacement on, a `replaces` target is missing (`missing_component_replacement_target`) or invalid (`invalid_component_replacement`), or two components replace one Core component (`ambiguous_component_replacement`)',
|
|
41
|
-
'A name clashes with Core,
|
|
41
|
+
'A name clashes with Core, a component sets `replaces` in a package without that range (`inactive_component_replacement`, plus any missing, invalid, or duplicate `replaces` reported as a warning), or a documented prop differs from the code: it is missing there (`not_in_code`), the doc omits a prop the package declares (`not_in_doc`), or its `required` (`required_mismatch`) or type (`type_mismatch`) disagrees. It reads props with your installed `typescript`; without it, it prints `[skip] Props not compared`',
|
|
42
42
|
],
|
|
43
43
|
[
|
|
44
44
|
'`npx astryx doctor integration templates`',
|
|
@@ -52,6 +52,12 @@ export const docs = {
|
|
|
52
52
|
'A topic takes a Core topic name without `replaces` or `extends`, a doc is invalid (`invalid_doc`), or a namespace or placement fails, which hides the doc (`invalid_doc_graph`)',
|
|
53
53
|
'A link names no doc (`invalid_doc_graph`)',
|
|
54
54
|
],
|
|
55
|
+
[
|
|
56
|
+
'`npx astryx integration check`',
|
|
57
|
+
'Everything the four `doctor integration` checks prove, in one command, for your build',
|
|
58
|
+
'Any of the four would exit 1 on its own. With `--strict`, also any warning, and any check that did not run, such as a package with no `astryx.integration.*`',
|
|
59
|
+
'Anything the four warn about, unless you pass `--strict`',
|
|
60
|
+
],
|
|
55
61
|
[
|
|
56
62
|
'`npx astryx integration verify`',
|
|
57
63
|
'The packed package holds every file, shows the same contributions, resolves every public import, and declares the CLI it needs',
|
|
@@ -62,29 +68,31 @@ export const docs = {
|
|
|
62
68
|
},
|
|
63
69
|
{
|
|
64
70
|
type: 'prose',
|
|
65
|
-
text: 'Pass a package name, such as `npx astryx doctor integration validate @acme/astryx-widgets`, to check an installed copy from an app instead.',
|
|
71
|
+
text: 'Pass a package name, such as `npx astryx doctor integration validate @acme/astryx-widgets`, to check an installed copy from an app instead. To fix a props finding, see {@link generic:check-the-props}.',
|
|
66
72
|
},
|
|
67
73
|
],
|
|
68
74
|
},
|
|
69
75
|
{
|
|
70
76
|
id: 'run-every-check-in-ci',
|
|
71
|
-
title: 'Run every check in
|
|
77
|
+
title: 'Run every check in every build (required)',
|
|
72
78
|
content: [
|
|
73
79
|
{
|
|
74
80
|
type: 'prose',
|
|
75
|
-
text: '
|
|
81
|
+
text: 'Every integration runs `integration check --strict` in its own build, so every build keeps your docs, types, and links in sync; this is required, not optional. Run `integration verify` before you publish. Install devDependencies first, because the components check needs Core, and `tsc --noEmit` needs `typescript` and a `tsconfig.json`. In package.json:',
|
|
76
82
|
},
|
|
77
83
|
{
|
|
78
84
|
type: 'code',
|
|
79
|
-
lang: '
|
|
80
|
-
code: '
|
|
85
|
+
lang: 'json',
|
|
86
|
+
code: '"typecheck": "tsc --noEmit && astryx integration check --strict"',
|
|
81
87
|
},
|
|
82
88
|
{
|
|
83
89
|
type: 'list',
|
|
84
90
|
style: 'unordered',
|
|
85
91
|
items: [
|
|
86
|
-
'`integration
|
|
87
|
-
'
|
|
92
|
+
'`integration check` runs `validate`, `components`, `templates`, and `docs` in that order, prints each result, then a summary, and exits 1 when any of them would.',
|
|
93
|
+
'`--strict` also exits 1 on any warning and on any check that did not run. Without it, warnings keep exit code 0: use that while you fix the warnings a package already has.',
|
|
94
|
+
'Its exit codes and JSON are a contract for your build: a new check, or a new failure code, joins only in a minor release that names it in the release notes. A patch can still ship a Core component, template, or CLI topic whose name conflicts with one of yours.',
|
|
95
|
+
'`integration verify` runs `validate` but none of the other three: a Core name clash, a `replaces` that names no Core template, a topic that takes a Core name, or a hidden guide still passes it. Run both before you publish: `npx astryx integration check --strict && npx astryx integration verify`.',
|
|
88
96
|
'Bare `npx astryx doctor` in the package also warns about a doc section over 32 KB, which no check above measures.',
|
|
89
97
|
],
|
|
90
98
|
},
|
|
@@ -105,14 +113,14 @@ export const docs = {
|
|
|
105
113
|
'It runs `npm pack` the way `npm publish` would, including your `prepack` script.',
|
|
106
114
|
'It checks that every contribution file is in the `.tgz` file. A root missing from `files` fails with `Add "templates" to "files" in package.json.`',
|
|
107
115
|
'It lists the components, templates, themes, docs, and codemods the temporary app sees, and compares them with your source.',
|
|
108
|
-
"It resolves each component's `import`, and each template's public import, the way Node does, and checks that the module exports the component, or a default export for a template.",
|
|
116
|
+
"It resolves each component's `import`, and each template's public import, the way Node does, and checks that the module exports the component under the name its doc documents, or a default export for a template. A type-only export does not count.",
|
|
109
117
|
'For each theme, it rebuilds the source, compares the built module and production CSS with the authored outputs, and proves the module, CSS, and optional font CSS exports resolve from the packed package.',
|
|
110
118
|
'It fails a package that needs an `@astryxdesign/cli` peer and lacks it: `>=0.6.6` for a template that sets `keywords`, and `>=0.6.4` for a template that sets `replaces`, a docs section, a placed guide, a doc section with an `id`, or a theme.',
|
|
111
119
|
],
|
|
112
120
|
},
|
|
113
121
|
{
|
|
114
122
|
type: 'prose',
|
|
115
|
-
text: '`integration pack --check`, the name this check had
|
|
123
|
+
text: '`integration pack --check`, the name this check had before published 0.6.5, still runs it and prints a note; it will be removed in a later release. The options and exit codes are in {@link command:integration verify}.',
|
|
116
124
|
},
|
|
117
125
|
],
|
|
118
126
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @file `astryx docs cli/integrations/codemods`: add codemods to an
|
|
4
|
+
* @file `astryx docs cli/integrations/building-blocks/codemods`: add codemods to an
|
|
5
5
|
* integration package, and know which of them `astryx upgrade` runs in an app.
|
|
6
6
|
*/
|
|
7
7
|
|
|
@@ -82,7 +82,7 @@ export default {
|
|
|
82
82
|
},
|
|
83
83
|
{
|
|
84
84
|
type: 'prose',
|
|
85
|
-
text: "`type: 'code'` rewrites the app's source files that match `fileExtensions`. `type: 'config'` rewrites the app's `astryx.config` file instead, and runs before code codemods. `title` shows in the upgrade output, and `api.jscodeshift` is a jscodeshift instance for the file. Every field is in {@link
|
|
85
|
+
text: "`type: 'code'` rewrites the app's source files that match `fileExtensions`. `type: 'config'` rewrites the app's `astryx.config` file instead, and runs before code codemods. `title` shows in the upgrade output, and `api.jscodeshift` is a jscodeshift instance for the file. Every field is in {@link schema:codemod}.",
|
|
86
86
|
},
|
|
87
87
|
],
|
|
88
88
|
},
|
|
@@ -124,14 +124,14 @@ npx astryx upgrade --from 0.6.3 --integration @acme/astryx-widgets --apply`,
|
|
|
124
124
|
type: 'code',
|
|
125
125
|
lang: 'text',
|
|
126
126
|
code: `Integrations: @acme/astryx-widgets
|
|
127
|
-
|
|
127
|
+
<n> codemods to run (dry run)
|
|
128
128
|
Applying integration codemods...
|
|
129
129
|
Rename AcmeCarousel delay to interval (v0.7.0, @acme/astryx-widgets)
|
|
130
130
|
! ~ src/Hero.tsx (would change)`,
|
|
131
131
|
},
|
|
132
132
|
{
|
|
133
133
|
type: 'prose',
|
|
134
|
-
text: "
|
|
134
|
+
text: "`<n>` counts Core's codemods for the same versions too: they run first and print above `Integrations:`. To run only yours, as when you test it, add `--codemod rename-delay`.",
|
|
135
135
|
},
|
|
136
136
|
{
|
|
137
137
|
type: 'prose',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @file `astryx docs cli/integrations/components/describe-the-component/component-family`:
|
|
4
|
+
* @file `astryx docs cli/integrations/building-blocks/components/describe-the-component/component-family`:
|
|
5
5
|
* author one ComponentDoc for several public exports in a component family.
|
|
6
6
|
*/
|
|
7
7
|
|
|
@@ -38,10 +38,8 @@ export const docs = {
|
|
|
38
38
|
],
|
|
39
39
|
},
|
|
40
40
|
{
|
|
41
|
-
type: '
|
|
42
|
-
|
|
43
|
-
projection: {fields: ['components']},
|
|
44
|
-
presentation: 'full',
|
|
41
|
+
type: 'prose',
|
|
42
|
+
text: 'Every field is in {@link schema:component-doc}.',
|
|
45
43
|
},
|
|
46
44
|
],
|
|
47
45
|
},
|
|
@@ -95,7 +93,11 @@ export default {
|
|
|
95
93
|
},
|
|
96
94
|
{
|
|
97
95
|
type: 'prose',
|
|
98
|
-
text:
|
|
96
|
+
text: "The public module named by `import` must export every component or hook named by a full entry. Apps then list, search and open each component in the family by its own name. A full entry the module does not export is not listed, and `integration verify` does not report it: check the family with `astryx component --list`. When `import` names output your pack lifecycle builds (such as `dist`), the members are listed once that output exists, and `integration verify` compares them as they are listed after the pack builds it.",
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
type: 'prose',
|
|
100
|
+
text: "A member's source is the `.tsx` file in the family doc's folder, or below it, that declares it: the one the family's own file or the module `import` names reaches, else the one in that folder that declares the name, as when `import` names built output. A member that only a bundle or a file outside that folder declares is still listed, with no source for `--source` or `swizzle`. A member is not listed when a doc's file or a Core name your package replaces already has its name. A member that shares a name with Core opens with `--package`.",
|
|
99
101
|
},
|
|
100
102
|
],
|
|
101
103
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @file `astryx docs cli/integrations/components/component-imports`: make an
|
|
4
|
+
* @file `astryx docs cli/integrations/building-blocks/components/component-imports`: make an
|
|
5
5
|
* integration component's documented import resolve from the packed package.
|
|
6
6
|
*/
|
|
7
7
|
|
|
@@ -35,6 +35,14 @@ export const docs = {
|
|
|
35
35
|
type: 'prose',
|
|
36
36
|
text: 'Add writes the entry only when package.json already has an `exports` map, so start every package with `"exports": {}`.',
|
|
37
37
|
},
|
|
38
|
+
{
|
|
39
|
+
type: 'prose',
|
|
40
|
+
text: 'A file does not have to be named after its component. When `Slides.tsx` exports `AcmeCarousel` and nothing named `Slides`, keep the doc beside it as `Slides.doc.mjs` and set its `name` to `AcmeCarousel`: apps list, search and open the component by that name, and `integration verify` checks that its import exports `AcmeCarousel`. A file that exports its own name keeps that name. A package that names its files in kebab case works the same way: `acme-gallery.doc.mjs` beside `acme-gallery.tsx` sets `name: \'AcmeGallery\'`.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
type: 'prose',
|
|
44
|
+
text: "The file name still opens the doc. A name that Core or another doc's file already has stays theirs, and so does a Core name your package replaces: with `Badge.doc.mjs` naming `AcmeBadge`, `astryx component Badge` opens Core's `Badge`, and `--package` with your package name reaches yours.",
|
|
45
|
+
},
|
|
38
46
|
],
|
|
39
47
|
},
|
|
40
48
|
{
|
|
@@ -43,7 +51,7 @@ export const docs = {
|
|
|
43
51
|
content: [
|
|
44
52
|
{
|
|
45
53
|
type: 'prose',
|
|
46
|
-
text: '`integration verify`
|
|
54
|
+
text: '`integration verify` unpacks the packed package into a temporary app, resolves each documented import, and checks that the module exports the documented component name. Its `--json` output names each failure by code.',
|
|
47
55
|
},
|
|
48
56
|
{
|
|
49
57
|
type: 'code',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @file `astryx docs cli/integrations/components`: guides for adding and
|
|
4
|
+
* @file `astryx docs cli/integrations/building-blocks/components`: guides for adding and
|
|
5
5
|
* documenting components in an integration package.
|
|
6
6
|
*/
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @file `astryx docs cli/integrations/debug-and-gap-reports`: receive a record
|
|
4
|
+
* @file `astryx docs cli/integrations/building-blocks/configuration/debug-and-gap-reports`: receive a record
|
|
5
5
|
* of each CLI run with `debug`, and handle `astryx gap-report` with
|
|
6
6
|
* `gapReport`, both named exports of the integration manifest.
|
|
7
7
|
*/
|
|
@@ -44,7 +44,7 @@ export default {
|
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
type: 'prose',
|
|
47
|
-
text: 'The event is a `DebugEvent` with `command`, `outcome`, `exitCode`, `durationMs`, `error`, and more, its values scrubbed (`redacted: true`). Every field is in {@link
|
|
47
|
+
text: 'The event is a `DebugEvent` with `command`, `outcome`, `exitCode`, `durationMs`, `error`, and more, its values scrubbed (`redacted: true`). Every field is in {@link schema:debug-event}.',
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
50
|
type: 'prose',
|
|
@@ -104,22 +104,11 @@ export const gapReport = {
|
|
|
104
104
|
},
|
|
105
105
|
{
|
|
106
106
|
type: 'prose',
|
|
107
|
-
text: 'Every handler in the app gets every report, so check `report.target.package` and skip reports about other packages.
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
type: '
|
|
111
|
-
|
|
112
|
-
rows: [
|
|
113
|
-
[
|
|
114
|
-
'`filed`',
|
|
115
|
-
'You created or queued the report. Return `url` or `message`.',
|
|
116
|
-
],
|
|
117
|
-
[
|
|
118
|
-
'`routed_only`',
|
|
119
|
-
'You point the caller to where to file it. `url` is required.',
|
|
120
|
-
],
|
|
121
|
-
['`skipped`', 'You chose not to act, for example on a duplicate.'],
|
|
122
|
-
],
|
|
107
|
+
text: 'Every handler in the app gets every report, so check `report.target.package` and skip reports about other packages.',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: 'prose',
|
|
111
|
+
text: 'Every field is in {@link schema:gap-report-handler}.',
|
|
123
112
|
},
|
|
124
113
|
{
|
|
125
114
|
type: 'prose',
|
|
@@ -45,7 +45,7 @@ export const oceanTheme = defineTheme({
|
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
type: 'prose',
|
|
48
|
-
text: 'Local imports must stay inside the theme folder. One that leaves it, such as `../../shared/colors`, fails with `invalid_theme`, and
|
|
48
|
+
text: 'Local imports must stay inside the theme folder. One that leaves it, such as `../../shared/colors`, fails with `invalid_theme`, and every theme in the package disappears from `theme list`. `npx astryx theme template` writes a file that explains every `defineTheme` field. For the full token set and component theming, read {@link generic:author-a-theme}.',
|
|
49
49
|
},
|
|
50
50
|
],
|
|
51
51
|
},
|
|
@@ -55,13 +55,14 @@ export const oceanTheme = defineTheme({
|
|
|
55
55
|
content: [
|
|
56
56
|
{
|
|
57
57
|
type: 'prose',
|
|
58
|
-
text: 'To base a theme on an existing one, `extends` it: import the base theme and override only the tokens you change. The derived theme keeps a live link to the base and
|
|
58
|
+
text: 'To base a theme on an existing one, `extends` it: import the base theme and override only the tokens you change. Add the derived theme with `integration add theme ocean-contrast`, and import the base from its built package export, since local imports cannot leave the theme folder. The derived theme keeps a live link to the base and picks up its later changes when you rebuild it — unlike `--from`, which forks a copy ({@link generic:add-a-theme}).',
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
type: 'code',
|
|
62
62
|
lang: 'ts',
|
|
63
|
-
code:
|
|
64
|
-
import {
|
|
63
|
+
code: `// themes/ocean-contrast/oceanContrastTheme.ts
|
|
64
|
+
import {defineTheme} from '@astryxdesign/core/theme';
|
|
65
|
+
import {oceanTheme} from '@acme/astryx-widgets/themes/ocean';
|
|
65
66
|
|
|
66
67
|
export const oceanContrastTheme = defineTheme({
|
|
67
68
|
name: 'ocean-contrast',
|
|
@@ -79,7 +80,7 @@ export const oceanContrastTheme = defineTheme({
|
|
|
79
80
|
content: [
|
|
80
81
|
{
|
|
81
82
|
type: 'prose',
|
|
82
|
-
text: 'Each `[light, dark]` pair compiles to a `light-dark()` value, which switches only colors. Give it colors. For a value that is not a plain color — a gradient — put `light-dark()` on each color stop, not around the whole value:
|
|
83
|
+
text: 'Each `[light, dark]` pair compiles to a `light-dark()` value, which switches only colors. Give it colors. For a value that is not a plain color — a gradient — put `light-dark()` on each color stop, not around the whole value: `light-dark()` takes two colors, so wrapping whole gradients makes the value invalid where the token is used, and `theme build` does not warn.',
|
|
83
84
|
},
|
|
84
85
|
],
|
|
85
86
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @file `astryx docs cli/integrations/components/describe-the-component`:
|
|
4
|
+
* @file `astryx docs cli/integrations/building-blocks/components/describe-the-component`:
|
|
5
5
|
* choose and maintain the ComponentDoc shape that matches a component's public
|
|
6
6
|
* source.
|
|
7
7
|
*/
|
|
@@ -37,7 +37,7 @@ export const docs = {
|
|
|
37
37
|
items: [
|
|
38
38
|
'Change the source and its `.doc.mjs` together.',
|
|
39
39
|
'Update the doc whenever the public name, import, behavior, props, defaults, examples, or accessibility requirements change.',
|
|
40
|
-
'`integration verify` checks the doc shape and packed import,
|
|
40
|
+
'`integration verify` checks the doc shape and packed import, and `doctor integration components` compares each props table with the component\'s TypeScript props ({@link generic:check-the-props}). Neither can prove the prose still matches the component.',
|
|
41
41
|
],
|
|
42
42
|
},
|
|
43
43
|
{
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @file `astryx docs cli/integrations/docs`: the guides to
|
|
5
|
-
* integration package, which join the same docs tree as
|
|
6
|
-
* (spec:AST-046, spec:AST-047).
|
|
4
|
+
* @file `astryx docs cli/integrations/building-blocks/docs`: the guides to
|
|
5
|
+
* writing docs for an integration package, which join the same docs tree as
|
|
6
|
+
* the CLI's own (spec:AST-046, spec:AST-047).
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
/** @type {import('@astryxdesign/cli/authoring').NamespaceDoc} */
|