@fragments-sdk/cli 0.7.9 → 0.7.11
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/dist/bin.js +13 -13
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-CWKQQR6C.js → chunk-57OW43NL.js} +3 -3
- package/dist/chunk-57OW43NL.js.map +1 -0
- package/dist/{chunk-AA6CAHCZ.js → chunk-7CRC46HV.js} +2 -2
- package/dist/chunk-7CRC46HV.js.map +1 -0
- package/dist/{chunk-3JPJTU25.js → chunk-CRTN6BIW.js} +5 -5
- package/dist/chunk-CRTN6BIW.js.map +1 -0
- package/dist/{chunk-LHIIBI6F.js → chunk-M42XIHPV.js} +2 -2
- package/dist/{chunk-2EFVPE5Q.js → chunk-TQOGBAOZ.js} +2 -2
- package/dist/chunk-TQOGBAOZ.js.map +1 -0
- package/dist/core/index.d.ts +1944 -0
- package/dist/{core-YAPWXDZW.js → core/index.js} +5 -5
- package/dist/defineFragment-C6PFzZyo.d.ts +656 -0
- package/dist/{generate-LEBVZCCH.js → generate-ZPERYZLF.js} +4 -4
- package/dist/index.d.ts +4 -159
- package/dist/index.js +9 -4
- package/dist/index.js.map +1 -1
- package/dist/{init-4VXL3Q6N.js → init-GID2DXB3.js} +69 -7
- package/dist/init-GID2DXB3.js.map +1 -0
- package/dist/mcp-bin.js +3 -3
- package/dist/{scan-3NYSRF6G.js → scan-BSMLGBX4.js} +5 -5
- package/dist/{service-HL6TMP3B.js → service-QACVPR37.js} +3 -3
- package/dist/{static-viewer-KLD24I4R.js → static-viewer-2RQD5QLR.js} +3 -3
- package/dist/{test-Y7YZOJLE.js → test-36UELXTE.js} +3 -3
- package/dist/{tokens-M4FCJKBK.js → tokens-A3BZIQPB.js} +4 -4
- package/dist/{viewer-ZWQQ74FV.js → viewer-CNLZQUFO.js} +156 -32
- package/dist/viewer-CNLZQUFO.js.map +1 -0
- package/package.json +8 -2
- package/src/commands/add.ts +1 -1
- package/src/commands/init.ts +84 -4
- package/src/core/defineFragment.ts +1 -1
- package/src/core/figma.ts +1 -1
- package/src/core/index.ts +2 -2
- package/src/core/loader.ts +3 -3
- package/src/core/schema.ts +1 -1
- package/src/index.ts +6 -0
- package/src/migrate/converter.ts +1 -1
- package/src/service/snippet-validation.test.ts +5 -5
- package/src/service/snippet-validation.ts +0 -1
- package/src/viewer/__tests__/viewer-integration.test.ts +16 -23
- package/src/viewer/components/AccessibilityPanel.tsx +1 -1
- package/src/viewer/components/ActionsPanel.tsx +1 -1
- package/src/viewer/components/App.tsx +563 -166
- package/src/viewer/components/BottomPanel.tsx +1 -1
- package/src/viewer/components/CodePanel.naming.test.tsx +1 -2
- package/src/viewer/components/CodePanel.tsx +1 -2
- package/src/viewer/components/CommandPalette.tsx +1 -1
- package/src/viewer/components/ComponentGraph.tsx +1 -1
- package/src/viewer/components/ComponentHeader.tsx +1 -1
- package/src/viewer/components/ContractPanel.tsx +1 -1
- package/src/viewer/components/ErrorBoundary.tsx +1 -1
- package/src/viewer/components/HealthDashboard.tsx +1 -1
- package/src/viewer/components/HmrStatusIndicator.tsx +1 -1
- package/src/viewer/components/InteractionsPanel.tsx +1 -1
- package/src/viewer/components/IsolatedRender.tsx +1 -1
- package/src/viewer/components/KeyboardShortcutsHelp.tsx +1 -1
- package/src/viewer/components/LandingPage.tsx +1 -1
- package/src/viewer/components/Layout.tsx +16 -13
- package/src/viewer/components/LeftSidebar.tsx +105 -18
- package/src/viewer/components/MultiViewportPreview.tsx +1 -1
- package/src/viewer/components/PreviewArea.tsx +22 -13
- package/src/viewer/components/PreviewFrameHost.tsx +0 -4
- package/src/viewer/components/PreviewToolbar.tsx +1 -1
- package/src/viewer/components/PropsEditor.tsx +1 -1
- package/src/viewer/components/PropsTable.tsx +1 -1
- package/src/viewer/components/RightSidebar.tsx +1 -1
- package/src/viewer/components/ScreenshotButton.tsx +1 -1
- package/src/viewer/components/SkeletonLoader.tsx +1 -1
- package/src/viewer/components/Toast.tsx +2 -2
- package/src/viewer/components/TokenStylePanel.tsx +1 -1
- package/src/viewer/components/VariantMatrix.tsx +1 -1
- package/src/viewer/components/VariantTabs.tsx +1 -1
- package/src/viewer/components/ViewportSelector.tsx +1 -1
- package/src/viewer/constants/ui.ts +14 -0
- package/src/viewer/entry.tsx +3 -4
- package/src/viewer/hooks/useKeyboardShortcuts.ts +65 -17
- package/src/viewer/hooks/useViewSettings.ts +1 -2
- package/src/viewer/index.ts +1 -1
- package/src/viewer/preview-frame.html +6 -9
- package/src/viewer/server.ts +106 -9
- package/src/viewer/styles/globals.css +12 -51
- package/src/viewer/vendor/shared/src/DocsHeaderBar.tsx +110 -0
- package/src/viewer/vendor/shared/src/DocsPageAsideHost.tsx +89 -0
- package/src/viewer/vendor/shared/src/DocsPageShell.tsx +119 -0
- package/src/viewer/vendor/shared/src/DocsSearchCommand.tsx +134 -0
- package/src/viewer/vendor/shared/src/DocsSidebarNav.tsx +66 -0
- package/src/viewer/vendor/shared/src/docs-layout.scss +28 -0
- package/src/viewer/vendor/shared/src/docs-layout.scss.d.ts +2 -0
- package/src/viewer/vendor/shared/src/index.ts +26 -0
- package/src/viewer/vendor/shared/src/types.ts +41 -0
- package/src/viewer/vite-plugin.ts +70 -9
- package/dist/chunk-2EFVPE5Q.js.map +0 -1
- package/dist/chunk-3JPJTU25.js.map +0 -1
- package/dist/chunk-AA6CAHCZ.js.map +0 -1
- package/dist/chunk-CWKQQR6C.js.map +0 -1
- package/dist/init-4VXL3Q6N.js.map +0 -1
- package/dist/viewer-ZWQQ74FV.js.map +0 -1
- /package/dist/{chunk-LHIIBI6F.js.map → chunk-M42XIHPV.js.map} +0 -0
- /package/dist/{core-YAPWXDZW.js.map → core/index.js.map} +0 -0
- /package/dist/{generate-LEBVZCCH.js.map → generate-ZPERYZLF.js.map} +0 -0
- /package/dist/{scan-3NYSRF6G.js.map → scan-BSMLGBX4.js.map} +0 -0
- /package/dist/{service-HL6TMP3B.js.map → service-QACVPR37.js.map} +0 -0
- /package/dist/{static-viewer-KLD24I4R.js.map → static-viewer-2RQD5QLR.js.map} +0 -0
- /package/dist/{test-Y7YZOJLE.js.map → test-36UELXTE.js.map} +0 -0
- /package/dist/{tokens-M4FCJKBK.js.map → tokens-A3BZIQPB.js.map} +0 -0
package/src/core/figma.ts
CHANGED
package/src/core/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Browser-safe exports for @fragments/core
|
|
3
|
-
* For Node.js-only APIs (config, discovery, loader),
|
|
2
|
+
* Browser-safe exports for @fragments-sdk/cli/core
|
|
3
|
+
* For Node.js-only APIs (config, discovery, loader), import from '@fragments-sdk/cli' directly.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
// Brand and default constants
|
package/src/core/loader.ts
CHANGED
|
@@ -27,8 +27,8 @@ function createFragmentsCoreShimPlugin(): Plugin {
|
|
|
27
27
|
return {
|
|
28
28
|
name: BRAND.vitePluginNamespace,
|
|
29
29
|
setup(build) {
|
|
30
|
-
// Intercept @fragments/core imports
|
|
31
|
-
build.onResolve({ filter: /^@fragments\/core$/ }, (args) => {
|
|
30
|
+
// Intercept @fragments-sdk/cli/core imports
|
|
31
|
+
build.onResolve({ filter: /^@fragments-sdk\/cli\/core$/ }, (args) => {
|
|
32
32
|
return {
|
|
33
33
|
path: args.path,
|
|
34
34
|
namespace: BRAND.vitePluginNamespace,
|
|
@@ -71,7 +71,7 @@ export async function loadFragmentFile(
|
|
|
71
71
|
|
|
72
72
|
try {
|
|
73
73
|
// Use esbuild to bundle the fragment file
|
|
74
|
-
// We inject a shim for @fragments/core so it doesn't need to be installed
|
|
74
|
+
// We inject a shim for @fragments-sdk/cli/core so it doesn't need to be installed
|
|
75
75
|
// Using CommonJS format to avoid ESM/CJS interop issues with node_modules
|
|
76
76
|
await build({
|
|
77
77
|
entryPoints: [absolutePath],
|
package/src/core/schema.ts
CHANGED
|
@@ -149,7 +149,7 @@ export const fragmentGeneratedSchema = z.object({
|
|
|
149
149
|
* Schema for AI-specific metadata for playground context generation
|
|
150
150
|
*/
|
|
151
151
|
export const aiMetadataSchema = z.object({
|
|
152
|
-
compositionPattern: z.enum(['compound', 'simple', 'controlled']).optional(),
|
|
152
|
+
compositionPattern: z.enum(['compound', 'simple', 'controlled', 'wrapper']).optional(),
|
|
153
153
|
subComponents: z.array(z.string()).optional(),
|
|
154
154
|
requiredChildren: z.array(z.string()).optional(),
|
|
155
155
|
commonPatterns: z.array(z.string()).optional(),
|
package/src/index.ts
CHANGED
|
@@ -43,6 +43,12 @@ export type { AnalyzeOptions, AnalyzeResult } from "./analyze.js";
|
|
|
43
43
|
// Static Viewer
|
|
44
44
|
export { generateStaticViewer, generateViewerFromJson } from "./static-viewer.js";
|
|
45
45
|
|
|
46
|
+
// Config type (used by generated fragments.config.ts)
|
|
47
|
+
export type { FragmentsConfig } from "./core/types.js";
|
|
48
|
+
|
|
49
|
+
// Fragment definition API (used by generated .fragment.tsx files)
|
|
50
|
+
export { defineFragment, defineBlock } from "./core/defineFragment.js";
|
|
51
|
+
|
|
46
52
|
// CLI Command metadata (for docs)
|
|
47
53
|
export { CLI_COMMANDS, CLI_COMMAND_CATEGORIES } from "./cli-commands.js";
|
|
48
54
|
export type { CliCommandDef, CliOptionDef, CliCommandCategory, CliCategoryInfo } from "./cli-commands.js";
|
package/src/migrate/converter.ts
CHANGED
|
@@ -550,7 +550,7 @@ ${generated.skippedVariants.map(sv => ` { name: "${escapeString(sv.name)}",
|
|
|
550
550
|
}
|
|
551
551
|
|
|
552
552
|
// Import the actual component - this makes the fragment immediately usable
|
|
553
|
-
return `import { defineFragment } from "@fragments/core";
|
|
553
|
+
return `import { defineFragment } from "@fragments-sdk/cli/core";
|
|
554
554
|
import { ${componentName} } from "${componentImport}";
|
|
555
555
|
|
|
556
556
|
export default defineFragment({
|
|
@@ -45,7 +45,7 @@ describe('validateSnippetPolicy', () => {
|
|
|
45
45
|
projectDir,
|
|
46
46
|
'Button',
|
|
47
47
|
`import React from 'react';
|
|
48
|
-
import { defineFragment } from '@fragments/core';
|
|
48
|
+
import { defineFragment } from '@fragments-sdk/cli/core';
|
|
49
49
|
import { Button } from '.';
|
|
50
50
|
|
|
51
51
|
export default defineFragment({
|
|
@@ -86,7 +86,7 @@ export default defineFragment({
|
|
|
86
86
|
projectDir,
|
|
87
87
|
'Icon',
|
|
88
88
|
`import React from 'react';
|
|
89
|
-
import { defineFragment } from '@fragments/core';
|
|
89
|
+
import { defineFragment } from '@fragments-sdk/cli/core';
|
|
90
90
|
import { Icon } from '.';
|
|
91
91
|
|
|
92
92
|
export default defineFragment({
|
|
@@ -124,7 +124,7 @@ import { House } from '@phosphor-icons/react';
|
|
|
124
124
|
projectDir,
|
|
125
125
|
'Header',
|
|
126
126
|
`import React from 'react';
|
|
127
|
-
import { defineFragment } from '@fragments/core';
|
|
127
|
+
import { defineFragment } from '@fragments-sdk/cli/core';
|
|
128
128
|
import { Header } from '.';
|
|
129
129
|
|
|
130
130
|
export default defineFragment({
|
|
@@ -166,7 +166,7 @@ export default defineFragment({
|
|
|
166
166
|
projectDir,
|
|
167
167
|
'Alpha',
|
|
168
168
|
`import React from 'react';
|
|
169
|
-
import { defineFragment } from '@fragments/core';
|
|
169
|
+
import { defineFragment } from '@fragments-sdk/cli/core';
|
|
170
170
|
import { Alpha } from '.';
|
|
171
171
|
|
|
172
172
|
export default defineFragment({
|
|
@@ -183,7 +183,7 @@ export default defineFragment({
|
|
|
183
183
|
projectDir,
|
|
184
184
|
'Beta',
|
|
185
185
|
`import React from 'react';
|
|
186
|
-
import { defineFragment } from '@fragments/core';
|
|
186
|
+
import { defineFragment } from '@fragments-sdk/cli/core';
|
|
187
187
|
import { Beta } from '.';
|
|
188
188
|
|
|
189
189
|
export default defineFragment({
|
|
@@ -118,7 +118,6 @@ function normalizePolicy(
|
|
|
118
118
|
function isFragmentsModule(modulePath: string): boolean {
|
|
119
119
|
return (
|
|
120
120
|
modulePath === '@fragments-sdk/ui'
|
|
121
|
-
|| modulePath === '@fragments/ui'
|
|
122
121
|
|| modulePath === '.'
|
|
123
122
|
|| modulePath === '..'
|
|
124
123
|
|| modulePath.startsWith('@/components/')
|
|
@@ -12,7 +12,7 @@ import { discoverInstalledFragments } from "../../core/discovery.js";
|
|
|
12
12
|
* After packages were merged into @fragments-sdk/cli, the viewer's
|
|
13
13
|
* path resolution changed. These tests verify that:
|
|
14
14
|
* - Viewer assets (HTML, TSX entry points) are found at the correct paths
|
|
15
|
-
* - The @fragments/core alias resolves to the consolidated core source
|
|
15
|
+
* - The @fragments-sdk/cli/core alias resolves to the consolidated core source
|
|
16
16
|
* - The virtual module generates valid import statements
|
|
17
17
|
* - The Vite config references correct file system locations
|
|
18
18
|
*/
|
|
@@ -61,9 +61,9 @@ describe("viewer path resolution", () => {
|
|
|
61
61
|
});
|
|
62
62
|
});
|
|
63
63
|
|
|
64
|
-
describe("@fragments/core alias resolution", () => {
|
|
64
|
+
describe("@fragments-sdk/cli/core alias resolution", () => {
|
|
65
65
|
it("core/index.ts exists at the expected path", () => {
|
|
66
|
-
// server.ts: "@fragments/core": resolve(cliPackageRoot, "src/core/index.ts")
|
|
66
|
+
// server.ts: "@fragments-sdk/cli/core": resolve(cliPackageRoot, "src/core/index.ts")
|
|
67
67
|
const corePath = resolve(cliPackageRoot, "src/core/index.ts");
|
|
68
68
|
expect(existsSync(corePath)).toBe(true);
|
|
69
69
|
});
|
|
@@ -82,32 +82,25 @@ describe("@fragments/core alias resolution", () => {
|
|
|
82
82
|
});
|
|
83
83
|
});
|
|
84
84
|
|
|
85
|
-
describe("virtual module @fragments/core import", () => {
|
|
86
|
-
it("vite-plugin generates import from @fragments/core (resolved via alias)", async () => {
|
|
87
|
-
// The virtual module template in vite-plugin.ts must import from @fragments/core
|
|
85
|
+
describe("virtual module @fragments-sdk/cli/core import", () => {
|
|
86
|
+
it("vite-plugin generates import from @fragments-sdk/cli/core (resolved via alias)", async () => {
|
|
87
|
+
// The virtual module template in vite-plugin.ts must import from @fragments-sdk/cli/core
|
|
88
88
|
// which is resolved by the Vite alias to the consolidated core source
|
|
89
89
|
const pluginPath = resolve(viewerDir, "vite-plugin.ts");
|
|
90
90
|
const content = await readFile(pluginPath, "utf-8");
|
|
91
91
|
|
|
92
|
-
// The generated virtual module string should reference @fragments/core
|
|
92
|
+
// The generated virtual module string should reference @fragments-sdk/cli/core
|
|
93
93
|
expect(content).toContain(
|
|
94
|
-
'import { storyModuleToFragment, setPreviewConfig } from "@fragments/core"'
|
|
94
|
+
'import { storyModuleToFragment, setPreviewConfig } from "@fragments-sdk/cli/core"'
|
|
95
95
|
);
|
|
96
96
|
});
|
|
97
97
|
|
|
98
|
-
it("server.ts sets up @fragments/core alias to src/core/index.ts", async () => {
|
|
98
|
+
it("server.ts sets up @fragments-sdk/cli/core alias to src/core/index.ts", async () => {
|
|
99
99
|
const serverPath = resolve(viewerDir, "server.ts");
|
|
100
100
|
const content = await readFile(serverPath, "utf-8");
|
|
101
101
|
|
|
102
|
-
// The alias must resolve @fragments/core to the
|
|
103
|
-
expect(content).toContain('"@fragments/core": resolve(cliPackageRoot, "src/core/index.ts")');
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it("server.ts sets up @fragments/viewer alias", async () => {
|
|
107
|
-
const serverPath = resolve(viewerDir, "server.ts");
|
|
108
|
-
const content = await readFile(serverPath, "utf-8");
|
|
109
|
-
|
|
110
|
-
expect(content).toContain('"@fragments/viewer": viewerRoot');
|
|
102
|
+
// The alias must resolve @fragments-sdk/cli/core to the CLI's core source
|
|
103
|
+
expect(content).toContain('"@fragments-sdk/cli/core": resolve(cliPackageRoot, "src/core/index.ts")');
|
|
111
104
|
});
|
|
112
105
|
|
|
113
106
|
it("vite-plugin merges authored variant code from metadata fragments", async () => {
|
|
@@ -228,20 +221,20 @@ describe("no stale @fragments/* package references", () => {
|
|
|
228
221
|
const serverPath = resolve(viewerDir, "server.ts");
|
|
229
222
|
const content = await readFile(serverPath, "utf-8");
|
|
230
223
|
|
|
231
|
-
// Should NOT try to resolve @fragments/core from node_modules
|
|
224
|
+
// Should NOT try to resolve @fragments-sdk/cli/core from node_modules
|
|
232
225
|
expect(content).not.toContain('resolveFragmentsPackage("core"');
|
|
233
226
|
});
|
|
234
227
|
|
|
235
|
-
it("no source files import from @fragments/core as a runtime dependency", async () => {
|
|
228
|
+
it("no source files import from @fragments-sdk/cli/core as a runtime dependency", async () => {
|
|
236
229
|
// All source-level imports should use relative paths (../core/).
|
|
237
|
-
// Only the generated virtual module string uses @fragments/core (resolved via alias).
|
|
230
|
+
// Only the generated virtual module string uses @fragments-sdk/cli/core (resolved via alias).
|
|
238
231
|
const serverPath = resolve(viewerDir, "server.ts");
|
|
239
232
|
const content = await readFile(serverPath, "utf-8");
|
|
240
233
|
|
|
241
|
-
// server.ts should import from relative paths, not @fragments/core
|
|
234
|
+
// server.ts should import from relative paths, not @fragments-sdk/cli/core
|
|
242
235
|
const lines = content.split("\n");
|
|
243
236
|
const importLines = lines.filter(
|
|
244
|
-
(l) => l.startsWith("import") && l.includes("@fragments/core")
|
|
237
|
+
(l) => l.startsWith("import") && l.includes("@fragments-sdk/cli/core")
|
|
245
238
|
);
|
|
246
239
|
expect(importLines).toHaveLength(0);
|
|
247
240
|
});
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
import { useState, useEffect, useCallback, useMemo, useRef } from "react";
|
|
13
13
|
import type { Result, NodeResult, ImpactValue, RunOptions } from "axe-core";
|
|
14
|
-
import { Badge, Tabs, Dialog, Card, Alert, Text, Stack, Box, Button, Chip, EmptyState } from "@fragments/ui";
|
|
14
|
+
import { Badge, Tabs, Dialog, Card, Alert, Text, Stack, Box, Button, Chip, EmptyState } from "@fragments-sdk/ui";
|
|
15
15
|
import { BRAND } from "../../core/index.js";
|
|
16
16
|
import {
|
|
17
17
|
updateComponentA11yResult,
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { useState, useMemo } from "react";
|
|
9
9
|
import type { ActionLog } from "../hooks/useActions.js";
|
|
10
10
|
import { formatActionArg } from "../hooks/useActions.js";
|
|
11
|
-
import { Button, Stack, Text, Badge, Input, Menu, Separator } from "@fragments/ui";
|
|
11
|
+
import { Button, Stack, Text, Badge, Input, Menu, Separator } from "@fragments-sdk/ui";
|
|
12
12
|
import {
|
|
13
13
|
TrashIcon,
|
|
14
14
|
ChevronDownIcon,
|