@fragments-sdk/cli 0.7.3 → 0.7.5
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/LICENSE +1 -4
- package/README.md +2 -0
- package/dist/bin.js +39 -16
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-D34Q6A7S.js → chunk-AWYCDRPG.js} +8 -2
- package/dist/chunk-AWYCDRPG.js.map +1 -0
- package/dist/{chunk-R2YH7NLN.js → chunk-CR3XHBGM.js} +3 -3
- package/dist/{chunk-QPY4DUFB.js → chunk-EFQ7SIBX.js} +583 -108
- package/dist/chunk-EFQ7SIBX.js.map +1 -0
- package/dist/{chunk-UXLGIGSX.js → chunk-GIC3I2KZ.js} +2 -2
- package/dist/{chunk-R6IZZSE7.js → chunk-JZNATKQA.js} +9 -3
- package/dist/chunk-JZNATKQA.js.map +1 -0
- package/dist/{chunk-P33AKQJW.js → chunk-SFWZ4K7C.js} +8 -2
- package/dist/{chunk-P33AKQJW.js.map → chunk-SFWZ4K7C.js.map} +1 -1
- package/dist/{core-3NMNCLFW.js → core-T7BDYEGO.js} +3 -3
- package/dist/{discovery-AKGA6CJD.js → discovery-Z4RDDFVR.js} +2 -2
- package/dist/{generate-JAUEHKK7.js → generate-C2DKFCFJ.js} +5 -5
- package/dist/index.d.ts +28 -2
- package/dist/index.js +9 -7
- package/dist/index.js.map +1 -1
- package/dist/{init-DZQOT54X.js → init-O3FCHEPN.js} +26 -8
- package/dist/init-O3FCHEPN.js.map +1 -0
- package/dist/mcp-bin.js +3 -3
- package/dist/{scan-OJRCVKK2.js → scan-IYTZDUKG.js} +6 -6
- package/dist/{service-CFFBHW4X.js → service-VA6XKADO.js} +3 -3
- package/dist/{static-viewer-VA2JXSCX.js → static-viewer-5N42MBDR.js} +3 -3
- package/dist/{test-O7DZNKDC.js → test-OMMDWL2W.js} +4 -4
- package/dist/{tokens-N7THFD6J.js → tokens-6VJAHFIG.js} +5 -5
- package/dist/{viewer-QTR7QJMM.js → viewer-IVP5XC7U.js} +37 -17
- package/dist/viewer-IVP5XC7U.js.map +1 -0
- package/package.json +8 -2
- package/src/bin.ts +4 -0
- package/src/commands/add.ts +6 -0
- package/src/commands/init.ts +24 -4
- package/src/commands/validate.ts +24 -2
- package/src/core/config.ts +6 -0
- package/src/core/discovery.ts +7 -1
- package/src/core/index.ts +1 -0
- package/src/core/schema.ts +6 -0
- package/src/core/types.ts +21 -0
- package/src/index.ts +2 -1
- package/src/migrate/detect.ts +4 -0
- package/src/service/snippet-validation.test.ts +209 -0
- package/src/service/snippet-validation.ts +635 -0
- package/src/validators.ts +53 -5
- package/src/viewer/__tests__/viewer-integration.test.ts +8 -0
- package/src/viewer/components/App.tsx +63 -2
- package/src/viewer/components/CodePanel.naming.test.tsx +60 -0
- package/src/viewer/components/CodePanel.tsx +76 -468
- package/src/viewer/components/Layout.tsx +2 -2
- package/src/viewer/components/LeftSidebar.tsx +35 -77
- package/src/viewer/preview-frame.html +1 -1
- package/src/viewer/styles/globals.css +2 -1
- package/src/viewer/utils/a11y-fixes.ts +24 -9
- package/src/viewer/vite-plugin.ts +27 -2
- package/dist/chunk-D34Q6A7S.js.map +0 -1
- package/dist/chunk-QPY4DUFB.js.map +0 -1
- package/dist/chunk-R6IZZSE7.js.map +0 -1
- package/dist/init-DZQOT54X.js.map +0 -1
- package/dist/viewer-QTR7QJMM.js.map +0 -1
- /package/dist/{chunk-R2YH7NLN.js.map → chunk-CR3XHBGM.js.map} +0 -0
- /package/dist/{chunk-UXLGIGSX.js.map → chunk-GIC3I2KZ.js.map} +0 -0
- /package/dist/{core-3NMNCLFW.js.map → core-T7BDYEGO.js.map} +0 -0
- /package/dist/{discovery-AKGA6CJD.js.map → discovery-Z4RDDFVR.js.map} +0 -0
- /package/dist/{generate-JAUEHKK7.js.map → generate-C2DKFCFJ.js.map} +0 -0
- /package/dist/{scan-OJRCVKK2.js.map → scan-IYTZDUKG.js.map} +0 -0
- /package/dist/{service-CFFBHW4X.js.map → service-VA6XKADO.js.map} +0 -0
- /package/dist/{static-viewer-VA2JXSCX.js.map → static-viewer-5N42MBDR.js.map} +0 -0
- /package/dist/{test-O7DZNKDC.js.map → test-OMMDWL2W.js.map} +0 -0
- /package/dist/{tokens-N7THFD6J.js.map → tokens-6VJAHFIG.js.map} +0 -0
package/LICENSE
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
Functional Source License, Version 1.1, MIT Future License
|
|
2
2
|
|
|
3
3
|
Licensor: Conan McNicholl
|
|
4
|
-
Software:
|
|
5
|
-
|
|
6
|
-
IMPORTANT: The @fragments-sdk/ui package is licensed separately under the MIT License.
|
|
7
|
-
See libs/ui/LICENSE for details.
|
|
4
|
+
Software: @fragments-sdk/cli
|
|
8
5
|
|
|
9
6
|
---
|
|
10
7
|
|
package/README.md
CHANGED
package/dist/bin.js
CHANGED
|
@@ -8,18 +8,19 @@ import {
|
|
|
8
8
|
runScreenshotCommand,
|
|
9
9
|
validateAll,
|
|
10
10
|
validateCoverage,
|
|
11
|
-
validateSchema
|
|
12
|
-
|
|
11
|
+
validateSchema,
|
|
12
|
+
validateSnippets
|
|
13
|
+
} from "./chunk-EFQ7SIBX.js";
|
|
13
14
|
import {
|
|
14
15
|
scan
|
|
15
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-CR3XHBGM.js";
|
|
16
17
|
import {
|
|
17
18
|
loadConfig,
|
|
18
19
|
loadFragmentFile
|
|
19
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-JZNATKQA.js";
|
|
20
21
|
import {
|
|
21
22
|
discoverFragmentFiles
|
|
22
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-AWYCDRPG.js";
|
|
23
24
|
import {
|
|
24
25
|
FigmaClient,
|
|
25
26
|
StorageManager,
|
|
@@ -38,8 +39,8 @@ import {
|
|
|
38
39
|
} from "./chunk-YMPGYEWK.js";
|
|
39
40
|
import {
|
|
40
41
|
generateContext
|
|
41
|
-
} from "./chunk-
|
|
42
|
-
import "./chunk-
|
|
42
|
+
} from "./chunk-GIC3I2KZ.js";
|
|
43
|
+
import "./chunk-SFWZ4K7C.js";
|
|
43
44
|
import {
|
|
44
45
|
BRAND
|
|
45
46
|
} from "./chunk-EKLMXTWU.js";
|
|
@@ -56,6 +57,7 @@ import { dirname as dirname4, join as join10 } from "path";
|
|
|
56
57
|
import pc from "picocolors";
|
|
57
58
|
async function validate(options = {}) {
|
|
58
59
|
const { config, configDir } = await loadConfig(options.config);
|
|
60
|
+
const componentLimit = Number.isFinite(options.componentLimit) ? options.componentLimit : void 0;
|
|
59
61
|
console.log(pc.cyan(`
|
|
60
62
|
${BRAND.name} Validator
|
|
61
63
|
`));
|
|
@@ -66,9 +68,20 @@ ${BRAND.name} Validator
|
|
|
66
68
|
} else if (options.coverage) {
|
|
67
69
|
console.log(pc.dim("Running coverage validation...\n"));
|
|
68
70
|
result = await validateCoverage(config, configDir);
|
|
71
|
+
} else if (options.snippets) {
|
|
72
|
+
console.log(pc.dim("Running snippet policy validation...\n"));
|
|
73
|
+
result = await validateSnippets(config, configDir, {
|
|
74
|
+
snippetMode: options.snippetMode,
|
|
75
|
+
componentStart: options.componentStart,
|
|
76
|
+
componentLimit
|
|
77
|
+
});
|
|
69
78
|
} else {
|
|
70
79
|
console.log(pc.dim("Running all validations...\n"));
|
|
71
|
-
result = await validateAll(config, configDir
|
|
80
|
+
result = await validateAll(config, configDir, {
|
|
81
|
+
snippetMode: options.snippetMode,
|
|
82
|
+
componentStart: options.componentStart,
|
|
83
|
+
componentLimit
|
|
84
|
+
});
|
|
72
85
|
}
|
|
73
86
|
if (result.errors.length > 0) {
|
|
74
87
|
console.log(pc.red(pc.bold("Errors:")));
|
|
@@ -1624,7 +1637,11 @@ async function discoverStoryFiles(projectRoot, patterns) {
|
|
|
1624
1637
|
"**/node_modules/**",
|
|
1625
1638
|
"**/dist/**",
|
|
1626
1639
|
"**/build/**",
|
|
1627
|
-
"**/.storybook/**"
|
|
1640
|
+
"**/.storybook/**",
|
|
1641
|
+
"**/*.test.stories.*",
|
|
1642
|
+
"**/*.stories.test.*",
|
|
1643
|
+
"**/*.test.story.*",
|
|
1644
|
+
"**/*.story.test.*"
|
|
1628
1645
|
]
|
|
1629
1646
|
});
|
|
1630
1647
|
return files.sort();
|
|
@@ -1789,7 +1806,7 @@ ${BRAND.name} Dev Server
|
|
|
1789
1806
|
}
|
|
1790
1807
|
}
|
|
1791
1808
|
}
|
|
1792
|
-
const { createDevServer } = await import("./viewer-
|
|
1809
|
+
const { createDevServer } = await import("./viewer-IVP5XC7U.js");
|
|
1793
1810
|
console.log(pc7.dim("\nStarting dev server..."));
|
|
1794
1811
|
const parsedPort = typeof port === "string" ? parseInt(port, 10) : port;
|
|
1795
1812
|
try {
|
|
@@ -3773,12 +3790,18 @@ export default defineFragment({
|
|
|
3773
3790
|
{
|
|
3774
3791
|
name: 'Default',
|
|
3775
3792
|
description: 'Default ${name} appearance',
|
|
3793
|
+
code: \`import { ${name} } from '@/components/${name}';
|
|
3794
|
+
|
|
3795
|
+
<${name}>Example content</${name}>\`,
|
|
3776
3796
|
render: () => <${name}>Example content</${name}>,
|
|
3777
3797
|
},
|
|
3778
3798
|
// TODO: Add more variants
|
|
3779
3799
|
// {
|
|
3780
3800
|
// name: 'WithProps',
|
|
3781
3801
|
// description: '${name} with additional props',
|
|
3802
|
+
// code: \`import { ${name} } from '@/components/${name}';
|
|
3803
|
+
//
|
|
3804
|
+
// <${name} someProp="value">Content</${name}>\`,
|
|
3782
3805
|
// render: () => <${name} someProp="value">Content</${name}>,
|
|
3783
3806
|
// },
|
|
3784
3807
|
],
|
|
@@ -5189,7 +5212,7 @@ var __dirname = dirname4(fileURLToPath(import.meta.url));
|
|
|
5189
5212
|
var pkg = JSON.parse(readFileSync(join10(__dirname, "../package.json"), "utf-8"));
|
|
5190
5213
|
var program = new Command();
|
|
5191
5214
|
program.name(BRAND.cliCommand).description(`${BRAND.name} - Design system documentation and compliance tool`).version(pkg.version);
|
|
5192
|
-
program.command("validate").description("Validate fragment files").option("-c, --config <path>", "Path to config file").option("--schema", "Validate fragment schema only").option("--coverage", "Validate coverage only").action(async (options) => {
|
|
5215
|
+
program.command("validate").description("Validate fragment files").option("-c, --config <path>", "Path to config file").option("--schema", "Validate fragment schema only").option("--coverage", "Validate coverage only").option("--snippets", "Validate snippet/render policy only").option("--snippet-mode <mode>", "Override snippet policy mode (warn|error)").option("--component-start <name>", "Start component name for alphabetical snippet batch validation").option("--component-limit <n>", "Component count for alphabetical snippet batch validation", (value) => Number.parseInt(value, 10)).action(async (options) => {
|
|
5193
5216
|
try {
|
|
5194
5217
|
const result = await validate(options);
|
|
5195
5218
|
if (!result.valid) {
|
|
@@ -5554,7 +5577,7 @@ Make sure the dev server is running: ${BRAND.cliCommand} dev`));
|
|
|
5554
5577
|
});
|
|
5555
5578
|
program.command("view").description(`Generate a static HTML viewer for ${BRAND.outFile}`).option("-i, --input <path>", `Path to ${BRAND.outFile}`, BRAND.outFile).option("-o, --output <path>", "Output HTML file path", BRAND.viewerHtmlFile).option("--open", "Open in browser after generation").action(async (options) => {
|
|
5556
5579
|
try {
|
|
5557
|
-
const { generateViewerFromJson } = await import("./static-viewer-
|
|
5580
|
+
const { generateViewerFromJson } = await import("./static-viewer-5N42MBDR.js");
|
|
5558
5581
|
const fs2 = await import("fs/promises");
|
|
5559
5582
|
const path = await import("path");
|
|
5560
5583
|
const inputPath = path.resolve(process.cwd(), options.input);
|
|
@@ -5602,7 +5625,7 @@ program.command("add").argument("[name]", 'Component name (e.g., "Button", "Text
|
|
|
5602
5625
|
});
|
|
5603
5626
|
program.command("init").description("Initialize fragments in a project (interactive by default)").option("--force", "Overwrite existing config").option("-y, --yes", "Non-interactive mode - auto-detect and use defaults").action(async (options) => {
|
|
5604
5627
|
try {
|
|
5605
|
-
const { init } = await import("./init-
|
|
5628
|
+
const { init } = await import("./init-O3FCHEPN.js");
|
|
5606
5629
|
const result = await init({
|
|
5607
5630
|
projectRoot: process.cwd(),
|
|
5608
5631
|
force: options.force,
|
|
@@ -5622,7 +5645,7 @@ program.command("init").description("Initialize fragments in a project (interact
|
|
|
5622
5645
|
});
|
|
5623
5646
|
program.command("tokens").description("Discover and list design tokens from CSS/SCSS files").option("-c, --config <path>", "Path to config file").option("--json", "Output as JSON").option("--categories", "Group tokens by category").option("--theme <theme>", "Filter by theme name").option("--category <category>", "Filter by category (color, spacing, typography, etc.)").option("--verbose", "Show all tokens (no truncation)").action(async (options) => {
|
|
5624
5647
|
try {
|
|
5625
|
-
const { tokens } = await import("./tokens-
|
|
5648
|
+
const { tokens } = await import("./tokens-6VJAHFIG.js");
|
|
5626
5649
|
const result = await tokens({
|
|
5627
5650
|
config: options.config,
|
|
5628
5651
|
json: options.json,
|
|
@@ -5641,7 +5664,7 @@ program.command("tokens").description("Discover and list design tokens from CSS/
|
|
|
5641
5664
|
});
|
|
5642
5665
|
program.command("generate").description("Generate fragment files from component source code").argument("[component]", "Specific component name to generate (optional)").option("--force", "Overwrite existing fragment files").option("--pattern <glob>", "Pattern for component files", "src/components/**/*.tsx").action(async (component, options) => {
|
|
5643
5666
|
try {
|
|
5644
|
-
const { generate } = await import("./generate-
|
|
5667
|
+
const { generate } = await import("./generate-C2DKFCFJ.js");
|
|
5645
5668
|
const result = await generate({
|
|
5646
5669
|
projectRoot: process.cwd(),
|
|
5647
5670
|
component,
|
|
@@ -5668,7 +5691,7 @@ program.command("graph").description("Query the component relationship graph").a
|
|
|
5668
5691
|
program.command("test").description("Run interaction tests for fragments with play functions").option("-c, --config <path>", "Path to config file").option("--component <name>", "Filter by component name").option("--tags <tags>", "Filter by tags (comma-separated)").option("--grep <pattern>", "Filter by variant name pattern").option("--exclude <pattern>", "Exclude tests matching pattern").option("--parallel <count>", "Number of parallel browser contexts", parseInt, 4).option("--timeout <ms>", "Timeout per test in milliseconds", parseInt, 3e4).option("--retries <count>", "Number of retries for failed tests", parseInt, 0).option("--bail", "Stop on first failure").option("--browser <name>", "Browser to use (chromium, firefox, webkit)", "chromium").option("--headed", "Run in headed mode (show browser)").option("--a11y", "Run accessibility checks with axe-core").option("--visual", "Capture screenshots for visual regression").option("--update-snapshots", "Update visual snapshots").option("--watch", "Watch mode - re-run on file changes").option("--reporters <names>", "Reporters to use (console, junit, json)", "console").option("-o, --output <dir>", "Output directory for results", "./test-results").option("--server-url <url>", "URL of running dev server (skips starting server)").option("-p, --port <port>", "Port for dev server", parseInt, 6006).option("--ci", "CI mode - non-interactive, exit with code 1 on failure").option("--list", "List available tests without running them").action(async (options) => {
|
|
5669
5692
|
try {
|
|
5670
5693
|
const { config, configDir } = await loadConfig(options.config);
|
|
5671
|
-
const { runTestCommand, listTests } = await import("./test-
|
|
5694
|
+
const { runTestCommand, listTests } = await import("./test-OMMDWL2W.js");
|
|
5672
5695
|
if (options.list) {
|
|
5673
5696
|
await listTests(config, configDir, {
|
|
5674
5697
|
component: options.component,
|