@astryxdesign/cli 0.7.2-canary.caec7ca → 0.7.2-canary.caf5673

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 (221) hide show
  1. package/README.md +15 -14
  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 +80 -0
  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.d.mts +11 -0
  10. package/api/docs/_adapter.mjs +244 -1
  11. package/api/docs/integrationDocs.test.mjs +124 -0
  12. package/api/doctor/doctor.mjs +27 -3
  13. package/api/doctor/doctor.test.mjs +43 -0
  14. package/api/doctor/theme-checks.mjs +1 -1
  15. package/api/gap-report/gap-report.mjs +67 -4
  16. package/api/index.d.mts +2 -0
  17. package/api/index.mjs +2 -0
  18. package/api/init/run/run.mjs +2 -2
  19. package/api/integration/_adapter.d.mts +12 -0
  20. package/api/integration/_adapter.mjs +54 -0
  21. package/api/integration/add-contribution.component-names.test.mjs +66 -0
  22. package/api/integration/add-contribution.mjs +8 -4
  23. package/api/integration/add-contribution.test.mjs +4 -2
  24. package/api/integration/authoring-checks.mjs +11 -2
  25. package/api/integration/authoring-checks.test.mjs +39 -0
  26. package/api/integration/authoring-checks.type.d.mts +9 -0
  27. package/api/integration/authoring-checks.type.mjs +14 -1
  28. package/api/integration/check/check.d.mts +96 -0
  29. package/api/integration/check/check.mjs +357 -0
  30. package/api/integration/check/check.test.mjs +489 -0
  31. package/api/integration/integration-check.type.d.mts +118 -0
  32. package/api/integration/integration-check.type.mjs +84 -0
  33. package/api/integration/integrationCheck.doc.d.mts +10 -0
  34. package/api/integration/integrationCheck.doc.mjs +73 -0
  35. package/api/integration/integrationComponentConflicts.doc.mjs +43 -6
  36. package/api/integration/pack-check.mjs +61 -107
  37. package/api/integration/pack-check.test.mjs +359 -0
  38. package/api/integration/validate-integration.mjs +8 -0
  39. package/api/integration/validate-integration.test.mjs +11 -0
  40. package/api/integration/validate-integration.type.d.mts +8 -0
  41. package/api/integration/validate-integration.type.mjs +12 -1
  42. package/api/integration/validateIntegration.doc.mjs +19 -3
  43. package/api/search/search.d.mts +81 -12
  44. package/api/search/search.domain-priority.test.mjs +108 -18
  45. package/api/search/search.integration-check.test.mjs +24 -0
  46. package/api/search/search.mjs +608 -53
  47. package/api/search/search.test.mjs +175 -0
  48. package/api/swizzle/copy/copy.mjs +28 -14
  49. package/api/theme/build/build.family.test.mjs +64 -0
  50. package/api/theme/build/build.mjs +180 -24
  51. package/api/theme/themeBuild.doc.mjs +4 -4
  52. package/assets/codemods/transforms/next/__tests__/migrate-list-edge-compensation-to-edge.test.mjs +120 -0
  53. package/assets/codemods/transforms/next/index.mjs +11 -1
  54. package/assets/codemods/transforms/next/migrate-list-edge-compensation-to-edge.mjs +198 -0
  55. package/assets/docs/README.md +10 -0
  56. package/assets/docs/author-a-theme.doc.mjs +1 -1
  57. package/assets/docs/getting-started.doc.mjs +3 -3
  58. package/assets/docs/styling-overview.doc.mjs +1 -1
  59. package/assets/docs/theme.doc.dense.mjs +1 -1
  60. package/assets/docs/theme.doc.mjs +1 -1
  61. package/assets/docs/theme.doc.zh.mjs +1 -1
  62. package/assets/docs/tree/add-a-component.doc.mjs +11 -1
  63. package/assets/docs/tree/add-a-theme.doc.mjs +1 -1
  64. package/assets/docs/tree/add-a-topic.doc.mjs +10 -7
  65. package/assets/docs/tree/agent-guidance.doc.mjs +2 -2
  66. package/assets/docs/tree/block-template.doc.mjs +8 -20
  67. package/assets/docs/tree/build-the-template.doc.mjs +1 -1
  68. package/assets/docs/tree/check-the-props.doc.mjs +196 -0
  69. package/assets/docs/tree/check-your-docs.doc.mjs +51 -5
  70. package/assets/docs/tree/checks.doc.mjs +24 -16
  71. package/assets/docs/tree/codemods.doc.mjs +4 -4
  72. package/assets/docs/tree/component-family.doc.mjs +8 -6
  73. package/assets/docs/tree/component-imports.doc.mjs +10 -2
  74. package/assets/docs/tree/components.doc.mjs +1 -1
  75. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +7 -18
  76. package/assets/docs/tree/define-the-theme.doc.mjs +6 -5
  77. package/assets/docs/tree/describe-the-component.doc.mjs +2 -2
  78. package/assets/docs/tree/docs.doc.mjs +3 -3
  79. package/assets/docs/tree/document-the-template.doc.mjs +1 -1
  80. package/assets/docs/tree/document-the-theme.doc.mjs +1 -1
  81. package/assets/docs/tree/export-template-assets.doc.mjs +1 -1
  82. package/assets/docs/tree/extend-or-replace.doc.mjs +6 -6
  83. package/assets/docs/tree/fonts-and-assets.doc.mjs +2 -2
  84. package/assets/docs/tree/generate-a-palette.doc.mjs +5 -3
  85. package/assets/docs/tree/grade-template-with-agent.doc.mjs +1 -1
  86. package/assets/docs/tree/integrations.doc.mjs +8 -0
  87. package/assets/docs/tree/links.doc.mjs +6 -5
  88. package/assets/docs/tree/migration-setup.doc.mjs +1 -0
  89. package/assets/docs/tree/migration-verification.doc.mjs +0 -1
  90. package/assets/docs/tree/migration.doc.mjs +0 -1
  91. package/assets/docs/tree/package-and-test.doc.mjs +1 -1
  92. package/assets/docs/tree/page-template.doc.mjs +4 -8
  93. package/assets/docs/tree/publishing.doc.mjs +1 -1
  94. package/assets/docs/tree/quick-start.doc.mjs +37 -21
  95. package/assets/docs/tree/replace-a-core-component.doc.mjs +4 -6
  96. package/assets/docs/tree/replace-a-core-template.doc.mjs +6 -8
  97. package/assets/docs/tree/sections-and-placement.doc.mjs +4 -6
  98. package/assets/docs/tree/see-it-in-an-app.doc.mjs +4 -2
  99. package/assets/docs/tree/short-and-findable.doc.mjs +6 -5
  100. package/assets/docs/tree/single-component.doc.mjs +15 -6
  101. package/assets/docs/tree/start-a-template.doc.mjs +3 -3
  102. package/assets/docs/tree/subcomponent.doc.mjs +6 -6
  103. package/assets/docs/tree/template-assets.doc.mjs +2 -2
  104. package/assets/docs/tree/template-doc-overview.doc.mjs +4 -15
  105. package/assets/docs/tree/template-fonts.doc.mjs +1 -1
  106. package/assets/docs/tree/template-icons.doc.mjs +1 -1
  107. package/assets/docs/tree/template-images-media.doc.mjs +1 -1
  108. package/assets/docs/tree/template-styles.doc.mjs +2 -2
  109. package/assets/docs/tree/templates.doc.mjs +1 -1
  110. package/assets/docs/tree/test-in-an-app.doc.mjs +3 -3
  111. package/assets/docs/tree/test-template-in-app.doc.mjs +1 -1
  112. package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
  113. package/assets/docs/tree/troubleshooting.doc.mjs +13 -5
  114. package/assets/docs/tree/type-scale.doc.mjs +3 -3
  115. package/assets/docs/tree/upgrading.doc.mjs +3 -3
  116. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +3 -1
  117. package/assets/docs/tree/verify-packed-template.doc.mjs +1 -1
  118. package/assets/docs/tree/versioning.doc.mjs +7 -6
  119. package/assets/docs/tree/write-the-template-file.doc.mjs +4 -3
  120. package/assets/docs/use-a-theme.doc.mjs +2 -2
  121. package/assets/docs/working-with-ai.doc.mjs +43 -4
  122. package/assets/theme.template.ts +1 -1
  123. package/authoring/codemod/codemod.doc.mjs +7 -3
  124. package/authoring/config/config.doc.mjs +9 -6
  125. package/authoring/config/type.ts +4 -2
  126. package/authoring/discover/discover.doc.mjs +1 -1
  127. package/authoring/doctypes/base/graph-fields.doc.mjs +6 -4
  128. package/authoring/doctypes/command/command.doc.mjs +14 -12
  129. package/authoring/doctypes/component/component.doc.mjs +29 -26
  130. package/authoring/doctypes/component/type.ts +13 -8
  131. package/authoring/doctypes/enum/enum.doc.mjs +7 -4
  132. package/authoring/doctypes/function/function.doc.mjs +9 -8
  133. package/authoring/doctypes/hook/hook.doc.mjs +5 -4
  134. package/authoring/doctypes/namespace/namespace.doc.mjs +7 -6
  135. package/authoring/doctypes/reference/reference.doc.mjs +11 -10
  136. package/authoring/doctypes/schema/schema.doc.mjs +9 -9
  137. package/authoring/doctypes/template/integration-template.doc.d.mts +11 -0
  138. package/authoring/doctypes/template/integration-template.doc.mjs +49 -0
  139. package/authoring/doctypes/template/parse.d.mts +6 -2
  140. package/authoring/doctypes/template/parse.mjs +3 -1
  141. package/authoring/doctypes/template/template.doc.mjs +3 -3
  142. package/authoring/doctypes/template/type.ts +22 -0
  143. package/authoring/doctypes/theme/theme.doc.mjs +2 -2
  144. package/authoring/gap-report/gap-report.doc.mjs +2 -2
  145. package/authoring/identity/identity.doc.mjs +3 -3
  146. package/authoring/index.d.ts +1 -0
  147. package/authoring/integration/integration.doc.mjs +12 -4
  148. package/authoring/integration/parse.test.mjs +10 -0
  149. package/authoring/integration/schema.d.mts +2 -0
  150. package/authoring/integration/schema.mjs +1 -0
  151. package/authoring/integration/type.ts +4 -0
  152. package/clients/cli/commands/build-theme.batch-report.test.mjs +3 -1
  153. package/clients/cli/commands/build-theme.mjs +1 -1
  154. package/clients/cli/commands/build-theme.path-safety.test.mjs +224 -6
  155. package/clients/cli/commands/build-theme.registry.test.mjs +5 -2
  156. package/clients/cli/commands/cli-postinstall.test.mjs +49 -1
  157. package/clients/cli/commands/doctor-integration-components.doc.mjs +17 -4
  158. package/clients/cli/commands/doctor-integration-validate.doc.mjs +13 -2
  159. package/clients/cli/commands/doctor-integration.test.mjs +837 -0
  160. package/clients/cli/commands/doctor.mjs +190 -0
  161. package/clients/cli/commands/integration-check.doc.mjs +85 -0
  162. package/clients/cli/commands/integration-check.test.mjs +267 -0
  163. package/clients/cli/commands/integration.doc.mjs +6 -2
  164. package/clients/cli/commands/integration.mjs +107 -1
  165. package/clients/cli/commands/setup-nudge.test.mjs +79 -1
  166. package/clients/cli/commands/swizzle.mjs +5 -3
  167. package/clients/cli/commands/swizzle.routing.test.mjs +18 -1
  168. package/clients/cli/commands/text-json-parity.test.mjs +5 -0
  169. package/clients/cli/commands/theme-build.doc.mjs +2 -2
  170. package/clients/cli/index.mjs +30 -5
  171. package/foundation/agent-docs/agent-doc-state.d.mts +14 -0
  172. package/foundation/agent-docs/agent-doc-state.mjs +38 -0
  173. package/foundation/agent-docs/agent-docs.d.mts +2 -1
  174. package/foundation/agent-docs/agent-docs.mjs +8 -6
  175. package/foundation/config/project.mjs +82 -0
  176. package/foundation/discovery/authoring-self-docs.mjs +2 -1
  177. package/foundation/discovery/component-discovery.d.mts +190 -10
  178. package/foundation/discovery/component-discovery.export-names.test.mjs +760 -0
  179. package/foundation/discovery/component-discovery.mjs +864 -56
  180. package/foundation/discovery/component-discovery.test.mjs +96 -0
  181. package/foundation/discovery/component-replacement.mjs +18 -0
  182. package/foundation/discovery/component-replacement.test.mjs +40 -0
  183. package/foundation/discovery/doc-types.d.mts +157 -0
  184. package/foundation/discovery/doc-types.mjs +1224 -0
  185. package/foundation/discovery/doc-types.test.mjs +700 -0
  186. package/foundation/discovery/docs-discovery.d.mts +81 -0
  187. package/foundation/discovery/docs-discovery.mjs +57 -0
  188. package/foundation/discovery/integration-doc-files.d.mts +22 -0
  189. package/foundation/discovery/integration-doc-files.mjs +231 -0
  190. package/foundation/discovery/integration-doc-files.test.mjs +246 -0
  191. package/foundation/discovery/module-exports.d.mts +27 -0
  192. package/foundation/discovery/module-exports.mjs +356 -31
  193. package/foundation/discovery/module-exports.test.mjs +172 -0
  194. package/foundation/discovery/package-tsconfig.d.mts +14 -0
  195. package/foundation/discovery/package-tsconfig.mjs +228 -0
  196. package/foundation/discovery/package-tsconfig.test.mjs +210 -0
  197. package/foundation/discovery/project-typescript.d.mts +32 -0
  198. package/foundation/discovery/project-typescript.mjs +89 -0
  199. package/foundation/discovery/prop-drift.d.mts +278 -0
  200. package/foundation/discovery/prop-drift.mjs +2263 -0
  201. package/foundation/discovery/prop-drift.test.mjs +2272 -0
  202. package/foundation/discovery/type-match.d.mts +53 -0
  203. package/foundation/discovery/type-match.mjs +660 -0
  204. package/foundation/discovery/type-match.test.mjs +169 -0
  205. package/foundation/discovery/type-text.d.mts +68 -0
  206. package/foundation/discovery/type-text.mjs +658 -0
  207. package/foundation/discovery/type-text.test.mjs +196 -0
  208. package/foundation/discovery/unresolved-references.d.mts +62 -0
  209. package/foundation/discovery/unresolved-references.mjs +790 -0
  210. package/foundation/discovery/unresolved-references.test.mjs +567 -0
  211. package/foundation/doc-compiler/doc-loads.test.mjs +14 -0
  212. package/foundation/doc-compiler/inputs.mjs +23 -0
  213. package/foundation/doc-compiler/inputs.test.mjs +0 -1
  214. package/foundation/doc-compiler/links.d.mts +9 -5
  215. package/foundation/doc-compiler/links.mjs +4 -2
  216. package/foundation/integrations/contribution-inventory.mjs +6 -1
  217. package/foundation/response/response-types.doc.mjs +7 -2
  218. package/foundation/xle/registry.mjs +4 -0
  219. package/foundation/xle/registry.test.mjs +28 -0
  220. package/package.json +9 -9
  221. package/scripts/postinstall.mjs +3 -3
@@ -75,14 +75,75 @@ async function placedGuides(route, seen = new Set()) {
75
75
  }
76
76
 
77
77
  describe('search domain priority — the rule', () => {
78
- it('gives a doc no priority for a keyword or heading match', () => {
78
+ it('gives a doc no priority for a heading match or a one-word keyword', () => {
79
79
  const topic = {
80
80
  domain: 'doc',
81
81
  name: 'typography/font-setup',
82
- keywords: ['font size'],
82
+ keywords: ['size'],
83
83
  titles: ['Font Setup', 'Font Sizes'],
84
84
  };
85
85
  expect(priority('font size', topic)).toBe(0);
86
+ expect(priority('size', topic)).toBe(0);
87
+ });
88
+
89
+ it('gives a doc priority when the query is one of its declared keywords', () => {
90
+ const guide = {
91
+ domain: 'doc',
92
+ name: 'guides/quality',
93
+ titles: ['Is my code good?'],
94
+ keywords: ['code review', 'review my code'],
95
+ _declared: ['code review', 'review my code'],
96
+ };
97
+ expect(priority('code review', guide)).toBe(1);
98
+ expect(priority('Code Reviews', guide)).toBe(1);
99
+ expect(priority('review my code', guide)).toBe(1);
100
+ // A section's keywords are its headings and code terms.
101
+ const section = {
102
+ ...guide,
103
+ name: 'before-you-ship',
104
+ _topic: 'guides/quality',
105
+ _section: 'before-you-ship',
106
+ };
107
+ expect(priority('code review', section)).toBe(0);
108
+ });
109
+
110
+ it("gives a doc no priority for a code term or table cell it didn't declare", () => {
111
+ // A typed doc's keywords hold the first column of its tables and the code
112
+ // terms its text mentions; `missing_field` reads as two words.
113
+ const reference = {
114
+ domain: 'doc',
115
+ name: 'cli/api/functions/validate-integration',
116
+ titles: ['validateIntegration'],
117
+ keywords: ['validate-integration', 'missing_field', 'file required'],
118
+ _declared: [],
119
+ _topic: 'cli/api/functions/validate-integration',
120
+ };
121
+ expect(priority('missing field', reference)).toBe(0);
122
+ expect(priority('file required', reference)).toBe(0);
123
+ expect(
124
+ priority('missing field', {...reference, _declared: ['missing field']}),
125
+ ).toBe(1);
126
+ });
127
+
128
+ it('keeps a component the query names exactly above a doc that declares it', async () => {
129
+ const tokens = tokenizeQuery('empty state');
130
+ const component = {domain: 'component', name: 'EmptyState'};
131
+ const doc = {
132
+ domain: 'doc',
133
+ name: 'illustrations',
134
+ keywords: ['empty state'],
135
+ _declared: ['empty state'],
136
+ };
137
+ const c = scoreQuery('empty state', tokens, component);
138
+ const d = scoreQuery('empty state', tokens, doc);
139
+ expect(
140
+ domainPriority('empty state', tokens, /** @type {any} */ (component), c),
141
+ ).toBe(1);
142
+ expect(
143
+ domainPriority('empty state', tokens, /** @type {any} */ (doc), d),
144
+ ).toBe(1);
145
+ // Both have priority, so the stronger match wins: the exact name.
146
+ expect(c?.score).toBeGreaterThan(d?.score ?? 0);
86
147
  });
87
148
 
88
149
  it('gives a doc priority when the query names it', () => {
@@ -190,32 +251,61 @@ describe('search domain priority — the rule', () => {
190
251
 
191
252
  describe('search domain priority — real docs and components', () => {
192
253
  it(
193
- 'finds the Text component before the typography guides for `font size`',
254
+ 'finds a guide that declares the whole phrase above a component that matches one word',
194
255
  async () => {
195
- for (const q of ['font size', 'font weight']) {
196
- const results = (await search(q, {cwd})).data.results;
197
- expect(results[0], q).toMatchObject({
198
- domain: 'component',
199
- name: 'Text',
200
- });
201
- const guide = results.findIndex(
202
- r => r.domain === 'doc' && /^typography(?:\/|$)/.test(r.name),
203
- );
204
- // The guide still matches, below the component.
205
- expect(guide, q).toBeGreaterThan(0);
256
+ const results = (await search('font size', {cwd})).data.results;
257
+ expect(results[0]).toMatchObject({domain: 'doc'});
258
+ expect(results[0].name).toMatch(/^typography(?:\/|$)/);
259
+ // The component the phrase points to stays near the top.
260
+ expect(
261
+ results
262
+ .slice(0, 3)
263
+ .some(r => r.domain === 'component' && r.name === 'Text'),
264
+ ).toBe(true);
265
+ },
266
+ SLOW,
267
+ );
268
+
269
+ it(
270
+ 'keeps a component above a reference doc whose table or code terms hold the phrase',
271
+ async () => {
272
+ for (const q of ['missing field', 'file required']) {
273
+ const [top] = (await search(q, {cwd})).data.results;
274
+ expect(top, q).toMatchObject({domain: 'component', name: 'Field'});
206
275
  }
207
276
  },
208
277
  SLOW,
209
278
  );
210
279
 
211
280
  it(
212
- 'reports the text-match score unchanged',
281
+ 'opens the guide that answers a declared phrase, not one that only mentions it',
282
+ async () => {
283
+ const [layers] = (await search('cascade layers', {cwd})).data.results;
284
+ expect(layers).toMatchObject({
285
+ domain: 'doc',
286
+ name: 'migration/migration-setup',
287
+ });
288
+ const [keyboard] = (await search('keyboard navigation', {cwd})).data
289
+ .results;
290
+ expect(keyboard?.name).not.toBe('migration/migration-verification');
291
+ },
292
+ SLOW,
293
+ );
294
+
295
+ it(
296
+ 'keeps a component above docs that match only by a heading, with scores unchanged',
213
297
  async () => {
214
298
  const results = (await search('font size', {cwd})).data.results;
215
- const guide = results.find(
216
- r => r.domain === 'doc' && /^typography(?:\/|$)/.test(r.name),
299
+ const text = results.findIndex(
300
+ r => r.domain === 'component' && r.name === 'Text',
217
301
  );
218
- expect(guide?.score).toBeGreaterThan(results[0].score);
302
+ expect(text).toBeGreaterThanOrEqual(0);
303
+ // A doc below Text outscores it on text alone: priority moved it, not the score.
304
+ expect(
305
+ results
306
+ .slice(text + 1)
307
+ .some(r => r.domain === 'doc' && r.score > results[text].score),
308
+ ).toBe(true);
219
309
  },
220
310
  SLOW,
221
311
  );
@@ -0,0 +1,24 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file A reader looking for the check a build runs finds
5
+ * `astryx integration check` first.
6
+ */
7
+
8
+ import {describe, expect, it} from 'vitest';
9
+ import {search} from './search.mjs';
10
+
11
+ describe('search finds integration check for CI', () => {
12
+ it.each([
13
+ 'ci',
14
+ 'continuous integration',
15
+ 'typecheck integration',
16
+ 'integration check',
17
+ ])('`%s` ranks it first', async query => {
18
+ const {results} = (await search(query)).data;
19
+ expect(results[0], JSON.stringify(results.slice(0, 3))).toMatchObject({
20
+ domain: 'doc',
21
+ name: 'cli/commands/integration-check',
22
+ });
23
+ });
24
+ });