@astryxdesign/cli 0.7.2-canary.db3a2e7 → 0.7.2-canary.e26723d

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.
Files changed (142) hide show
  1. package/README.md +7 -7
  2. package/api/build/help/help.mjs +1 -1
  3. package/api/component/_adapter.d.mts +41 -1
  4. package/api/component/_adapter.mjs +93 -7
  5. package/api/component/component.mjs +22 -5
  6. package/api/component/component.test.mjs +420 -167
  7. package/api/component/integration-export-name.test.mjs +644 -0
  8. package/api/component/list/list.mjs +42 -4
  9. package/api/docs/_adapter.mjs +207 -1
  10. package/api/docs/integrationDocs.test.mjs +124 -0
  11. package/api/doctor/theme-checks.mjs +1 -1
  12. package/api/gap-report/gap-report.mjs +67 -4
  13. package/api/init/run/run.mjs +2 -2
  14. package/api/integration/_adapter.d.mts +12 -0
  15. package/api/integration/_adapter.mjs +54 -0
  16. package/api/integration/add-contribution.component-names.test.mjs +66 -0
  17. package/api/integration/add-contribution.mjs +7 -3
  18. package/api/integration/authoring-checks.mjs +11 -2
  19. package/api/integration/authoring-checks.test.mjs +39 -0
  20. package/api/integration/authoring-checks.type.d.mts +9 -0
  21. package/api/integration/authoring-checks.type.mjs +14 -1
  22. package/api/integration/integrationComponentConflicts.doc.mjs +21 -5
  23. package/api/integration/pack-check.mjs +61 -107
  24. package/api/integration/pack-check.test.mjs +359 -0
  25. package/api/integration/validate-integration.test.mjs +11 -0
  26. package/api/search/search.d.mts +9 -0
  27. package/api/search/search.mjs +108 -16
  28. package/api/search/search.test.mjs +36 -0
  29. package/api/swizzle/copy/copy.mjs +28 -14
  30. package/api/template/template.test.mjs +120 -3
  31. package/api/theme/build/build.family.test.mjs +16 -0
  32. package/api/theme/build/build.mjs +81 -22
  33. package/api/theme/themeBuild.doc.mjs +3 -3
  34. package/assets/codemods/transforms/next/__tests__/migrate-list-edge-compensation-to-edge.test.mjs +120 -0
  35. package/assets/codemods/transforms/next/index.mjs +11 -1
  36. package/assets/codemods/transforms/next/migrate-list-edge-compensation-to-edge.mjs +198 -0
  37. package/assets/docs/README.md +10 -0
  38. package/assets/docs/author-a-theme.doc.mjs +1 -1
  39. package/assets/docs/getting-started.doc.mjs +3 -3
  40. package/assets/docs/theme.doc.dense.mjs +1 -1
  41. package/assets/docs/theme.doc.mjs +1 -1
  42. package/assets/docs/theme.doc.zh.mjs +1 -1
  43. package/assets/docs/tree/add-a-component.doc.mjs +10 -0
  44. package/assets/docs/tree/check-the-props.doc.mjs +145 -0
  45. package/assets/docs/tree/checks.doc.mjs +4 -4
  46. package/assets/docs/tree/component-family.doc.mjs +5 -1
  47. package/assets/docs/tree/component-imports.doc.mjs +8 -0
  48. package/assets/docs/tree/describe-the-component.doc.mjs +1 -1
  49. package/assets/docs/tree/links.doc.mjs +2 -2
  50. package/assets/docs/tree/single-component.doc.mjs +3 -2
  51. package/assets/docs/tree/troubleshooting.doc.mjs +9 -1
  52. package/assets/docs/tree/type-scale.doc.mjs +3 -3
  53. package/assets/docs/tree/versioning.doc.mjs +1 -0
  54. package/assets/docs/tree/write-the-template-file.doc.mjs +2 -1
  55. package/assets/docs/use-a-theme.doc.mjs +2 -2
  56. package/assets/docs/working-with-ai.doc.mjs +43 -4
  57. package/assets/templates/blocks/components/Drawer/DrawerForm.doc.mjs +24 -0
  58. package/assets/templates/blocks/components/Drawer/DrawerForm.tsx +62 -0
  59. package/assets/templates/blocks/components/Drawer/DrawerScrim.doc.mjs +22 -0
  60. package/assets/templates/blocks/components/Drawer/DrawerScrim.tsx +68 -0
  61. package/assets/templates/blocks/components/Drawer/DrawerShowcase.doc.mjs +22 -0
  62. package/assets/templates/blocks/components/Drawer/DrawerShowcase.tsx +41 -0
  63. package/assets/templates/blocks/components/Drawer/DrawerStart.doc.mjs +21 -0
  64. package/assets/templates/blocks/components/Drawer/DrawerStart.tsx +41 -0
  65. package/assets/templates/blocks/components/Drawer/DrawerWidths.doc.mjs +22 -0
  66. package/assets/templates/blocks/components/Drawer/DrawerWidths.tsx +54 -0
  67. package/assets/templates/blocks/components/DrawerHeader/DrawerHeaderShowcase.doc.mjs +15 -0
  68. package/assets/templates/blocks/components/DrawerHeader/DrawerHeaderShowcase.tsx +73 -0
  69. package/assets/templates/blocks/components/DrawerHeader/DrawerHeaderSubtitleEndContent.doc.mjs +22 -0
  70. package/assets/templates/blocks/components/DrawerHeader/DrawerHeaderSubtitleEndContent.tsx +49 -0
  71. package/assets/templates/blocks/components/DrawerHeader/DrawerHeaderWithCloseButton.doc.mjs +21 -0
  72. package/assets/templates/blocks/components/DrawerHeader/DrawerHeaderWithCloseButton.tsx +42 -0
  73. package/assets/templates/pages/detail-page/page.tsx +3 -3
  74. package/assets/templates/pages/table-inbox/page.tsx +10 -8
  75. package/assets/theme.template.ts +1 -1
  76. package/authoring/doctypes/base/type.ts +6 -0
  77. package/authoring/doctypes/component/component.doc.mjs +4 -4
  78. package/authoring/doctypes/component/type.ts +6 -3
  79. package/authoring/doctypes/template/integration-template.doc.d.mts +11 -0
  80. package/authoring/doctypes/template/integration-template.doc.mjs +49 -0
  81. package/authoring/doctypes/template/parse.d.mts +6 -2
  82. package/authoring/doctypes/template/parse.mjs +3 -1
  83. package/authoring/doctypes/template/type.ts +22 -0
  84. package/authoring/index.d.ts +1 -0
  85. package/authoring/integration/integration.doc.mjs +8 -1
  86. package/authoring/integration/parse.test.mjs +10 -0
  87. package/authoring/integration/schema.d.mts +2 -0
  88. package/authoring/integration/schema.mjs +1 -0
  89. package/authoring/integration/type.ts +4 -0
  90. package/clients/cli/commands/build-theme.batch-report.test.mjs +3 -1
  91. package/clients/cli/commands/build-theme.mjs +1 -1
  92. package/clients/cli/commands/build-theme.path-safety.test.mjs +84 -0
  93. package/clients/cli/commands/build-theme.registry.test.mjs +5 -2
  94. package/clients/cli/commands/doctor-integration-components.doc.mjs +9 -3
  95. package/clients/cli/commands/doctor-integration.test.mjs +392 -0
  96. package/clients/cli/commands/doctor.mjs +74 -0
  97. package/clients/cli/commands/theme-build.doc.mjs +2 -2
  98. package/clients/cli/lib/component-format.mjs +5 -1
  99. package/foundation/config/project.mjs +82 -0
  100. package/foundation/discovery/authoring-self-docs.mjs +1 -0
  101. package/foundation/discovery/component-discovery.d.mts +190 -10
  102. package/foundation/discovery/component-discovery.export-names.test.mjs +760 -0
  103. package/foundation/discovery/component-discovery.mjs +864 -56
  104. package/foundation/discovery/component-discovery.test.mjs +96 -0
  105. package/foundation/discovery/component-replacement.mjs +18 -0
  106. package/foundation/discovery/component-replacement.test.mjs +40 -0
  107. package/foundation/discovery/doc-types.d.mts +157 -0
  108. package/foundation/discovery/doc-types.mjs +1224 -0
  109. package/foundation/discovery/doc-types.test.mjs +652 -0
  110. package/foundation/discovery/docs-discovery.d.mts +81 -0
  111. package/foundation/discovery/docs-discovery.mjs +57 -0
  112. package/foundation/discovery/module-exports.d.mts +27 -0
  113. package/foundation/discovery/module-exports.mjs +356 -31
  114. package/foundation/discovery/module-exports.test.mjs +172 -0
  115. package/foundation/discovery/package-tsconfig.d.mts +14 -0
  116. package/foundation/discovery/package-tsconfig.mjs +228 -0
  117. package/foundation/discovery/package-tsconfig.test.mjs +210 -0
  118. package/foundation/discovery/project-typescript.d.mts +23 -0
  119. package/foundation/discovery/project-typescript.mjs +61 -0
  120. package/foundation/discovery/prop-drift.d.mts +220 -0
  121. package/foundation/discovery/prop-drift.mjs +1765 -0
  122. package/foundation/discovery/prop-drift.test.mjs +1197 -0
  123. package/foundation/discovery/template-adapter.mjs +74 -5
  124. package/foundation/discovery/type-match.d.mts +53 -0
  125. package/foundation/discovery/type-match.mjs +660 -0
  126. package/foundation/discovery/type-match.test.mjs +169 -0
  127. package/foundation/discovery/type-text.d.mts +68 -0
  128. package/foundation/discovery/type-text.mjs +658 -0
  129. package/foundation/discovery/type-text.test.mjs +196 -0
  130. package/foundation/discovery/unresolved-references.d.mts +62 -0
  131. package/foundation/discovery/unresolved-references.mjs +790 -0
  132. package/foundation/discovery/unresolved-references.test.mjs +567 -0
  133. package/foundation/doc-compiler/doc-loads.test.mjs +9 -1
  134. package/foundation/doc-compiler/inputs.mjs +23 -0
  135. package/foundation/doc-compiler/inputs.test.mjs +0 -1
  136. package/foundation/doc-compiler/links.d.mts +9 -5
  137. package/foundation/doc-compiler/links.mjs +4 -2
  138. package/foundation/integrations/contribution-inventory.mjs +6 -1
  139. package/foundation/response/response-types.doc.mjs +1 -1
  140. package/foundation/xle/registry.mjs +4 -0
  141. package/foundation/xle/registry.test.mjs +28 -0
  142. package/package.json +10 -10
@@ -1,8 +1,20 @@
1
1
  // @generated by scripts/sync-api-types.mjs from the JSDoc in foundation/**/*.mjs.
2
2
  // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
3
 
4
+ /**
5
+ * The entry a family doc gives `name` in its `components`, when the doc is not
6
+ * the component's own (Stack's doc for VStack); null otherwise.
7
+ * @param {any} docs - a loaded component doc
8
+ * @param {string} name - bare component name
9
+ * @returns {any}
10
+ */
11
+ export function familyMember(docs: any, name: string): any;
4
12
  /**
5
13
  * Auto-discover components by scanning for Astryx*.tsx files in core/src/.
14
+ * A component is listed when a doc documents it: a doc in its folder, or, for a
15
+ * component folder with no doc of its own, the doc `findComponentReadme` finds
16
+ * elsewhere (Heading's doc in the Text folder; HStack and VStack as members of
17
+ * Stack's doc).
6
18
  *
7
19
  * Returns an ordered Record where:
8
20
  * - Grouped components use the group name as key: `'Buttons': ['Button', 'IconButton']`
@@ -103,19 +115,99 @@ export function discoverExternalComponentsGrouped(docsDir: string): Record<strin
103
115
  * @returns {string | null}
104
116
  */
105
117
  export function findExternalComponentDoc(docsDir: string, name: string): string | null;
118
+ /** @param {string} docPath */
119
+ export function docStem(docPath: string): string;
120
+ /**
121
+ * The `.tsx` file in `folder`, or below it, that declares `name`, taking files
122
+ * in path order: the source of a member whose import never reaches a `.tsx`
123
+ * file, as when the import names built output.
124
+ *
125
+ * @param {string} folder
126
+ * @param {string} name
127
+ * @returns {string | null}
128
+ */
129
+ export function folderSourceFor(folder: string, name: string): string | null;
130
+ /**
131
+ * Each family doc under an integration's components root that names an
132
+ * import, with the file the import resolves to: null when it resolves to none,
133
+ * such as build output that does not exist yet.
134
+ *
135
+ * @param {{name: string, components?: string, issuesUrl?: string, __packageDir?: string, __packageExports?: Record<string, unknown>|null}} integration
136
+ * @returns {Array<{docPath: string, module: string | null}>}
137
+ */
138
+ export function familyImports(integration: {
139
+ name: string;
140
+ components?: string;
141
+ issuesUrl?: string;
142
+ __packageDir?: string;
143
+ __packageExports?: Record<string, unknown> | null;
144
+ }): Array<{
145
+ docPath: string;
146
+ module: string | null;
147
+ }>;
148
+ /**
149
+ * Whether a discovered integration record is a member its family doc lists,
150
+ * decided from the files, not from whether the doc loads.
151
+ *
152
+ * @param {{name: string, docPath: string|null}} record
153
+ * @returns {boolean}
154
+ */
155
+ export function isIntegrationMember(record: {
156
+ name: string;
157
+ docPath: string | null;
158
+ }): boolean;
159
+ /**
160
+ * The entry a family doc gives a member that discovery lists under its own
161
+ * name, or null when the record is the doc's own component or the loaded doc
162
+ * has no entry for it.
163
+ *
164
+ * @param {any} doc the doc loaded from `record.docPath`
165
+ * @param {{name: string, docPath: string|null}} record
166
+ * @returns {any}
167
+ */
168
+ export function integrationMemberEntry(doc: any, record: {
169
+ name: string;
170
+ docPath: string | null;
171
+ }): any;
172
+ /**
173
+ * Visit every component doc under an integration's components root, hidden
174
+ * ones included, in discovery order, with its stem.
175
+ * @param {string | undefined} componentsDir
176
+ * @param {(docPath: string, stem: string) => void} visit
177
+ */
178
+ export function forEachIntegrationDoc(componentsDir: string | undefined, visit: (docPath: string, stem: string) => void): void;
179
+ /**
180
+ * Given an integration component doc path, return the sibling component source
181
+ * (`{Name}.tsx`) if one exists, else null.
182
+ *
183
+ * @param {string} docPath absolute path to a `{Name}.doc.{ts,mjs,js}` file
184
+ * @returns {string|null}
185
+ */
186
+ export function integrationSourceForDoc(docPath: string): string | null;
106
187
  /**
107
188
  * Discover ownership records for the components contributed by a single loaded
108
189
  * integration. Scans the integration's resolved `components` dir for same-stem
109
- * doc files and records each with owner package + issuesUrl + sourcePath.
190
+ * doc files and records each with owner package + issuesUrl + sourcePath. A doc
191
+ * that names a differently named export of its file is recorded under that
192
+ * export, and each family member it lists, under the member's name, unless the
193
+ * name is taken: every doc's file name (a hidden doc's too), a Core name a doc
194
+ * in the package replaces, and a name an earlier doc records.
110
195
  *
111
- * @param {{name: string, components?: string, issuesUrl?: string}} integration
196
+ * @param {{name: string, components?: string, issuesUrl?: string, __packageDir?: string, __packageExports?: Record<string, unknown>|null}} integration
112
197
  * a single entry from `loadedIntegrations` (lib/integrations.mjs)
198
+ * @param {{documentedNames?: boolean}} [options] `documentedNames: false`
199
+ * records each doc under its file name alone, without reading the names
200
+ * docs document: for a caller that needs only what each doc says
113
201
  * @returns {Array<{name: string, package: string, docPath: string, sourcePath: string|null, issuesUrl: string|undefined, group: string|null}>}
114
202
  */
115
203
  export function discoverIntegrationComponents(integration: {
116
204
  name: string;
117
205
  components?: string;
118
206
  issuesUrl?: string;
207
+ __packageDir?: string;
208
+ __packageExports?: Record<string, unknown> | null;
209
+ }, { documentedNames }?: {
210
+ documentedNames?: boolean;
119
211
  }): Array<{
120
212
  name: string;
121
213
  package: string;
@@ -129,11 +221,16 @@ export function discoverIntegrationComponents(integration: {
129
221
  * Invalid metadata or a missing same-stem source removes only that component;
130
222
  * callers can report the returned errors while retaining valid siblings. A
131
223
  * component whose doc sets `replaces` carries the value as written; the
132
- * component replacement resolver decides what it means.
224
+ * component replacement resolver decides what it means. A family member is
225
+ * read through its family's doc: it never carries the family's `replaces`, and
226
+ * a family doc that fails to load is reported once. A doc that fails to load
227
+ * is reported under its file name: what it says cannot be trusted.
133
228
  *
134
229
  * @param {{name: string, components?: string, issuesUrl?: string}} integration
230
+ * @param {{documentedNames?: boolean}} [options] as for
231
+ * {@link discoverIntegrationComponents}
135
232
  * @returns {Promise<{
136
- * components: Array<{name: string, package: string, docPath: string, sourcePath: string, issuesUrl: string|undefined, group: string|null, replaces?: unknown}>,
233
+ * components: Array<{name: string, package: string, docPath: string, sourcePath: string|null, issuesUrl: string|undefined, group: string|null, replaces?: unknown}>,
137
234
  * discovered: Array<{name: string, package: string, docPath: string, sourcePath: string|null, issuesUrl: string|undefined, group: string|null}>,
138
235
  * errors: Array<{name: string, message: string}>,
139
236
  * }>}
@@ -142,12 +239,14 @@ export function discoverValidIntegrationComponents(integration: {
142
239
  name: string;
143
240
  components?: string;
144
241
  issuesUrl?: string;
242
+ }, options?: {
243
+ documentedNames?: boolean;
145
244
  }): Promise<{
146
245
  components: Array<{
147
246
  name: string;
148
247
  package: string;
149
248
  docPath: string;
150
- sourcePath: string;
249
+ sourcePath: string | null;
151
250
  issuesUrl: string | undefined;
152
251
  group: string | null;
153
252
  replaces?: unknown;
@@ -165,30 +264,103 @@ export function discoverValidIntegrationComponents(integration: {
165
264
  message: string;
166
265
  }>;
167
266
  }>;
267
+ /**
268
+ * How an owner holds a component name, which the owner rule
269
+ * ({@link unscopedComponentOwners}) reads: `core` when Core documents it;
270
+ * `file` when an integration doc named after its file is recorded under it;
271
+ * `doc` when only a doc records it: an export name, a member, or the file name
272
+ * of a doc recorded under another export.
273
+ * @typedef {'core' | 'file' | 'doc'} NameHold
274
+ */
275
+ /**
276
+ * How a discovered integration record holds its name.
277
+ * @param {{name: string, docPath: string|null}} record
278
+ * @returns {'file' | 'doc'}
279
+ */
280
+ export function integrationRecordHold(record: {
281
+ name: string;
282
+ docPath: string | null;
283
+ }): "file" | "doc";
284
+ /**
285
+ * The integration component a name finds, as discovery records it, and its
286
+ * hold: the same-stem doc first, then a doc that records the name as an export
287
+ * or a member.
288
+ *
289
+ * @param {{name?: string, components?: string, __packageDir?: string, __packageExports?: Record<string, unknown>|null}} integration
290
+ * @param {string} name
291
+ * @returns {{docPath: string, sourcePath: string|null, hold: 'file' | 'doc'} | null}
292
+ */
293
+ export function findIntegrationComponent(integration: {
294
+ name?: string;
295
+ components?: string;
296
+ __packageDir?: string;
297
+ __packageExports?: Record<string, unknown> | null;
298
+ }, name: string): {
299
+ docPath: string;
300
+ sourcePath: string | null;
301
+ hold: "file" | "doc";
302
+ } | null;
303
+ /**
304
+ * The name discovery records a component doc under: the export its `name`
305
+ * documents when the doc is recorded under it, else the doc's file name.
306
+ *
307
+ * @param {{name?: string, components?: string, __packageDir?: string, __packageExports?: Record<string, unknown>|null}} integration
308
+ * @param {string} docPath
309
+ * @returns {string}
310
+ */
311
+ export function recordedDocName(integration: {
312
+ name?: string;
313
+ components?: string;
314
+ __packageDir?: string;
315
+ __packageExports?: Record<string, unknown> | null;
316
+ }, docPath: string): string;
168
317
  /**
169
318
  * Find an integration component's doc file by name within a loaded
170
319
  * integration's resolved `components` dir. Honors the same-stem convention
171
- * (`{Name}.doc.{ts,mjs,js}`), preferring `.ts` → `.mjs` → `.js`.
320
+ * (`{Name}.doc.{ts,mjs,js}`), preferring `.ts` → `.mjs` → `.js`, and finds a
321
+ * doc that records the component under another name: a differently named
322
+ * export of its file, or a member its family doc lists.
172
323
  *
173
- * @param {{components?: string}} integration
324
+ * @param {{name?: string, components?: string, __packageDir?: string, __packageExports?: Record<string, unknown>|null}} integration
174
325
  * @param {string} name bare component name (no `XDS`/`Astryx` prefix)
175
326
  * @returns {string|null}
176
327
  */
177
328
  export function findIntegrationComponentDoc(integration: {
329
+ name?: string;
178
330
  components?: string;
331
+ __packageDir?: string;
332
+ __packageExports?: Record<string, unknown> | null;
179
333
  }, name: string): string | null;
180
334
  /**
181
- * Find an integration component's swizzleable source file (`{Name}.tsx`) by
182
- * name within a loaded integration's resolved `components` dir. Returns null
335
+ * Find an integration component's swizzleable source file by name within a
336
+ * loaded integration's resolved `components` dir: the same-stem `{Name}.tsx`
337
+ * of its doc, or, for a family member, the file that declares it. Returns null
183
338
  * when the integration ships docs without source.
184
339
  *
185
- * @param {{components?: string}} integration
340
+ * @param {{name?: string, components?: string, __packageDir?: string, __packageExports?: Record<string, unknown>|null}} integration
186
341
  * @param {string} name bare component name
187
342
  * @returns {string|null}
188
343
  */
189
344
  export function findIntegrationComponentSource(integration: {
345
+ name?: string;
190
346
  components?: string;
347
+ __packageDir?: string;
348
+ __packageExports?: Record<string, unknown> | null;
191
349
  }, name: string): string | null;
350
+ /**
351
+ * The owner rule: an owner that holds a name only because a doc records it
352
+ * (`hold: 'doc'`) yields to Core and to every file-named owner; `--package`
353
+ * still reaches it. Surfaces resolve a replacement first, then this rule, then
354
+ * which docs load.
355
+ *
356
+ * @template {{hold?: string}} T
357
+ * @param {T[]} owners each with its {@link NameHold}; an owner without one
358
+ * counts as Core's or file-named
359
+ * @returns {T[]}
360
+ */
361
+ export function unscopedComponentOwners<T extends {
362
+ hold?: string;
363
+ }>(owners: T[]): T[];
192
364
  /**
193
365
  * Build a flat list of ownership records for ALL discoverable components —
194
366
  * core (built-in) plus every loaded integration. This is the authoritative
@@ -217,3 +389,11 @@ export function discoverOwnedComponents(coreDir: string, loadedIntegrations?: Ar
217
389
  }>;
218
390
  /** The owner package name for built-in (core) components. */
219
391
  export const CORE_PACKAGE: import("../../authoring/index.js").ProviderId;
392
+ /**
393
+ * How an owner holds a component name, which the owner rule
394
+ * ({@link unscopedComponentOwners}) reads: `core` when Core documents it;
395
+ * `file` when an integration doc named after its file is recorded under it;
396
+ * `doc` when only a doc records it: an export name, a member, or the file name
397
+ * of a doc recorded under another export.
398
+ */
399
+ export type NameHold = "core" | "file" | "doc";