@fragments-sdk/cli 0.7.9 → 0.7.10
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-ZA7WK3EY.js} +137 -30
- package/dist/viewer-ZA7WK3EY.js.map +1 -0
- package/package.json +6 -1
- 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 +137 -96
- package/src/viewer/components/BottomPanel.tsx +1 -1
- package/src/viewer/components/CodePanel.naming.test.tsx +1 -1
- package/src/viewer/components/CodePanel.tsx +1 -1
- 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 +1 -1
- package/src/viewer/components/LeftSidebar.tsx +105 -18
- package/src/viewer/components/MultiViewportPreview.tsx +1 -1
- package/src/viewer/components/PreviewArea.tsx +1 -2
- package/src/viewer/components/PreviewFrameHost.tsx +0 -4
- package/src/viewer/components/PreviewMenu.tsx +247 -0
- 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 +80 -7
- package/src/viewer/styles/globals.css +12 -51
- 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/dist/index.d.ts
CHANGED
|
@@ -1,163 +1,8 @@
|
|
|
1
|
+
import { F as FragmentsConfig, T as Theme, D as DiffResult } from './defineFragment-C6PFzZyo.js';
|
|
2
|
+
export { a as defineBlock, d as defineFragment } from './defineFragment-C6PFzZyo.js';
|
|
1
3
|
import { CompiledFragmentsFile } from '@fragments-sdk/context/types';
|
|
2
4
|
export { CLI_COMMANDS, CLI_COMMAND_CATEGORIES, CliCategoryInfo, CliCommandCategory, CliCommandDef, CliOptionDef } from '@fragments-sdk/context/cli-commands';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Registry generation options
|
|
6
|
-
*/
|
|
7
|
-
interface RegistryOptions {
|
|
8
|
-
/** Only include components that have a corresponding .stories.tsx file */
|
|
9
|
-
requireStory?: boolean;
|
|
10
|
-
/** Only include components that are exported (public API) */
|
|
11
|
-
publicOnly?: boolean;
|
|
12
|
-
/** Maximum depth for category inference from directory structure (default: 1) */
|
|
13
|
-
categoryDepth?: number;
|
|
14
|
-
/** Include props in registry (default: false - AI can read TypeScript directly) */
|
|
15
|
-
includeProps?: boolean;
|
|
16
|
-
/** Include full fragment data in registry (default: false - reference fragmentPath instead) */
|
|
17
|
-
embedFragments?: boolean;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Design token configuration
|
|
21
|
-
*/
|
|
22
|
-
interface TokenConfig {
|
|
23
|
-
/**
|
|
24
|
-
* Glob patterns for files to scan for tokens
|
|
25
|
-
* e.g., ["src/styles/theme.scss", "src/styles/variables.css"]
|
|
26
|
-
*/
|
|
27
|
-
include: string[];
|
|
28
|
-
/**
|
|
29
|
-
* Glob patterns to exclude
|
|
30
|
-
* @example ["node_modules"]
|
|
31
|
-
*/
|
|
32
|
-
exclude?: string[];
|
|
33
|
-
/**
|
|
34
|
-
* Map CSS selectors to theme names
|
|
35
|
-
* @example { ":root": "default", "[data-theme='dark']": "dark" }
|
|
36
|
-
*/
|
|
37
|
-
themeSelectors?: Record<string, string>;
|
|
38
|
-
/** Enable token comparison in style diffs (default: true) */
|
|
39
|
-
enabled?: boolean;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* CI configuration for automated compliance checks
|
|
43
|
-
*/
|
|
44
|
-
interface CIConfig {
|
|
45
|
-
/** Minimum compliance percentage to pass (default: 80) */
|
|
46
|
-
minCompliance?: number;
|
|
47
|
-
/** Whether to fail on any visual regression */
|
|
48
|
-
failOnDiff?: boolean;
|
|
49
|
-
/** Whether to output JSON format */
|
|
50
|
-
jsonOutput?: boolean;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Snippet policy configuration.
|
|
54
|
-
* Controls snippet/render quality enforcement in `fragments validate`.
|
|
55
|
-
*/
|
|
56
|
-
interface SnippetPolicyConfig {
|
|
57
|
-
/** Validation mode: warn (non-blocking) or error (blocking). Default: warn */
|
|
58
|
-
mode?: "warn" | "error";
|
|
59
|
-
/** Validate snippet strings only, or snippet strings + render functions. Default: snippet+render */
|
|
60
|
-
scope?: "snippet" | "snippet+render";
|
|
61
|
-
/** Require authored snippets to be full, copy-pasteable examples with imports. Default: true */
|
|
62
|
-
requireFullSnippet?: boolean;
|
|
63
|
-
/** Allow these external modules for JSX components in snippets/renders. */
|
|
64
|
-
allowedExternalModules?: string[];
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Config file structure
|
|
68
|
-
*/
|
|
69
|
-
interface FragmentsConfig {
|
|
70
|
-
/** Glob patterns for finding fragment/fragment files */
|
|
71
|
-
include: string[];
|
|
72
|
-
/** Glob patterns to exclude */
|
|
73
|
-
exclude?: string[];
|
|
74
|
-
/** Glob patterns for finding component files (for coverage validation) */
|
|
75
|
-
components?: string[];
|
|
76
|
-
/** Output path for compiled output */
|
|
77
|
-
outFile?: string;
|
|
78
|
-
/** Framework adapter to use */
|
|
79
|
-
framework?: "react" | "vue" | "svelte";
|
|
80
|
-
/** Figma file URL for the design system (used by `fragments link`) */
|
|
81
|
-
figmaFile?: string;
|
|
82
|
-
/** Figma access token (alternative to FIGMA_ACCESS_TOKEN env var) */
|
|
83
|
-
figmaToken?: string;
|
|
84
|
-
/** Screenshot configuration */
|
|
85
|
-
screenshots?: ScreenshotConfig;
|
|
86
|
-
/** Service configuration */
|
|
87
|
-
service?: ServiceConfig;
|
|
88
|
-
/** Registry generation options */
|
|
89
|
-
registry?: RegistryOptions;
|
|
90
|
-
/** Design token discovery and mapping configuration */
|
|
91
|
-
tokens?: TokenConfig;
|
|
92
|
-
/** CI pipeline configuration */
|
|
93
|
-
ci?: CIConfig;
|
|
94
|
-
/** Snippet/render policy validation */
|
|
95
|
-
snippets?: SnippetPolicyConfig;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Screenshot capture configuration
|
|
99
|
-
*/
|
|
100
|
-
interface ScreenshotConfig {
|
|
101
|
-
/** Default viewport for captures */
|
|
102
|
-
viewport?: Viewport;
|
|
103
|
-
/** Diff threshold percentage (0-100) */
|
|
104
|
-
threshold?: number;
|
|
105
|
-
/** Additional delay after render before capture (ms) */
|
|
106
|
-
delay?: number;
|
|
107
|
-
/** Output directory for baselines (relative to project root) */
|
|
108
|
-
outputDir?: string;
|
|
109
|
-
/** Themes to capture */
|
|
110
|
-
themes?: Theme[];
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Service configuration
|
|
114
|
-
*/
|
|
115
|
-
interface ServiceConfig {
|
|
116
|
-
/** Browser pool size */
|
|
117
|
-
poolSize?: number;
|
|
118
|
-
/** Idle timeout before shutdown (ms) */
|
|
119
|
-
idleTimeout?: number;
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Viewport dimensions
|
|
123
|
-
*/
|
|
124
|
-
interface Viewport {
|
|
125
|
-
width: number;
|
|
126
|
-
height: number;
|
|
127
|
-
deviceScaleFactor?: number;
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Theme identifier
|
|
131
|
-
*/
|
|
132
|
-
type Theme = "light" | "dark";
|
|
133
|
-
/**
|
|
134
|
-
* Result of comparing two screenshots
|
|
135
|
-
*/
|
|
136
|
-
interface DiffResult {
|
|
137
|
-
/** Whether images are considered matching (below threshold) */
|
|
138
|
-
matches: boolean;
|
|
139
|
-
/** Percentage of pixels that differ (0-100) */
|
|
140
|
-
diffPercentage: number;
|
|
141
|
-
/** Number of differing pixels */
|
|
142
|
-
diffPixelCount: number;
|
|
143
|
-
/** Total pixels compared */
|
|
144
|
-
totalPixels: number;
|
|
145
|
-
/** PNG image highlighting differences */
|
|
146
|
-
diffImage?: Buffer;
|
|
147
|
-
/** Bounding boxes of changed regions */
|
|
148
|
-
changedRegions: BoundingBox[];
|
|
149
|
-
/** Time taken to compute diff (ms) */
|
|
150
|
-
diffTimeMs: number;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Bounding box for changed region
|
|
154
|
-
*/
|
|
155
|
-
interface BoundingBox {
|
|
156
|
-
x: number;
|
|
157
|
-
y: number;
|
|
158
|
-
width: number;
|
|
159
|
-
height: number;
|
|
160
|
-
}
|
|
5
|
+
import 'react';
|
|
161
6
|
|
|
162
7
|
/**
|
|
163
8
|
* Find the config file in the current directory or parent directories.
|
|
@@ -556,4 +401,4 @@ declare function generateStaticViewer(data: CompiledFragmentsFile): string;
|
|
|
556
401
|
*/
|
|
557
402
|
declare function generateViewerFromJson(jsonPath: string): Promise<string>;
|
|
558
403
|
|
|
559
|
-
export { type AnalyzeOptions, type AnalyzeResult, type BuildResult, type DiffCommandOptions, type DiffCommandResult, type DiscoveredFile, type ScreenshotCommandOptions, type ScreenshotResult, type ValidationError, type ValidationResult, type ValidationRunOptions, type ValidationWarning, type VariantDiffResult, buildFragments, discoverComponentFiles, discoverFragmentFiles, extractComponentName, findConfigFile, generateStaticViewer, generateViewerFromJson, loadConfig, runAnalyzeCommand, runDiffCommand, runScreenshotCommand, validateAll, validateCoverage, validateSchema, validateSnippets };
|
|
404
|
+
export { type AnalyzeOptions, type AnalyzeResult, type BuildResult, type DiffCommandOptions, type DiffCommandResult, type DiscoveredFile, FragmentsConfig, type ScreenshotCommandOptions, type ScreenshotResult, type ValidationError, type ValidationResult, type ValidationRunOptions, type ValidationWarning, type VariantDiffResult, buildFragments, discoverComponentFiles, discoverFragmentFiles, extractComponentName, findConfigFile, generateStaticViewer, generateViewerFromJson, loadConfig, runAnalyzeCommand, runDiffCommand, runScreenshotCommand, validateAll, validateCoverage, validateSchema, validateSnippets };
|
package/dist/index.js
CHANGED
|
@@ -12,19 +12,22 @@ import {
|
|
|
12
12
|
validateCoverage,
|
|
13
13
|
validateSchema,
|
|
14
14
|
validateSnippets
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-CRTN6BIW.js";
|
|
16
16
|
import {
|
|
17
17
|
findConfigFile,
|
|
18
18
|
loadConfig
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-57OW43NL.js";
|
|
20
20
|
import {
|
|
21
21
|
discoverComponentFiles,
|
|
22
22
|
discoverFragmentFiles,
|
|
23
23
|
extractComponentName
|
|
24
24
|
} from "./chunk-AWYCDRPG.js";
|
|
25
25
|
import "./chunk-YMPGYEWK.js";
|
|
26
|
-
import
|
|
27
|
-
|
|
26
|
+
import {
|
|
27
|
+
defineBlock,
|
|
28
|
+
defineFragment
|
|
29
|
+
} from "./chunk-TQOGBAOZ.js";
|
|
30
|
+
import "./chunk-7CRC46HV.js";
|
|
28
31
|
import "./chunk-EKLMXTWU.js";
|
|
29
32
|
import "./chunk-Z7EY4VHE.js";
|
|
30
33
|
|
|
@@ -37,6 +40,8 @@ export {
|
|
|
37
40
|
CLI_COMMANDS,
|
|
38
41
|
CLI_COMMAND_CATEGORIES,
|
|
39
42
|
buildFragments,
|
|
43
|
+
defineBlock,
|
|
44
|
+
defineFragment,
|
|
40
45
|
discoverComponentFiles,
|
|
41
46
|
discoverFragmentFiles,
|
|
42
47
|
extractComponentName,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli-commands.ts"],"sourcesContent":["/**\n * CLI command metadata — re-exported from @fragments-sdk/context for convenience.\n *\n * The source of truth lives in @fragments-sdk/context/cli-commands so that\n * browser-safe consumers (like the docs site) can import without pulling in\n * Node.js dependencies from the CLI package.\n */\nexport {\n CLI_COMMANDS,\n CLI_COMMAND_CATEGORIES,\n} from '@fragments-sdk/context/cli-commands';\n\nexport type {\n CliCommandDef,\n CliOptionDef,\n CliCommandCategory,\n CliCategoryInfo,\n} from '@fragments-sdk/context/cli-commands';\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/cli-commands.ts"],"sourcesContent":["/**\n * CLI command metadata — re-exported from @fragments-sdk/context for convenience.\n *\n * The source of truth lives in @fragments-sdk/context/cli-commands so that\n * browser-safe consumers (like the docs site) can import without pulling in\n * Node.js dependencies from the CLI package.\n */\nexport {\n CLI_COMMANDS,\n CLI_COMMAND_CATEGORIES,\n} from '@fragments-sdk/context/cli-commands';\n\nexport type {\n CliCommandDef,\n CliOptionDef,\n CliCommandCategory,\n CliCategoryInfo,\n} from '@fragments-sdk/context/cli-commands';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA;AAAA,EACE;AAAA,EACA;AAAA,OACK;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
|
|
2
|
-
import "./chunk-
|
|
3
|
-
import "./chunk-
|
|
2
|
+
import "./chunk-TQOGBAOZ.js";
|
|
3
|
+
import "./chunk-7CRC46HV.js";
|
|
4
4
|
import {
|
|
5
5
|
BRAND
|
|
6
6
|
} from "./chunk-EKLMXTWU.js";
|
|
@@ -8,7 +8,7 @@ import "./chunk-Z7EY4VHE.js";
|
|
|
8
8
|
|
|
9
9
|
// src/commands/init.ts
|
|
10
10
|
import { writeFile, mkdir, access } from "fs/promises";
|
|
11
|
-
import { resolve, join, relative } from "path";
|
|
11
|
+
import { resolve, join, relative, dirname, basename } from "path";
|
|
12
12
|
import { spawn } from "child_process";
|
|
13
13
|
import pc from "picocolors";
|
|
14
14
|
import fg from "fast-glob";
|
|
@@ -47,6 +47,7 @@ async function detectProject(projectRoot) {
|
|
|
47
47
|
"**/dist/**",
|
|
48
48
|
"**/build/**",
|
|
49
49
|
"**/*.stories.*",
|
|
50
|
+
"**/*.fragment.*",
|
|
50
51
|
"**/*.test.*",
|
|
51
52
|
"**/*.spec.*",
|
|
52
53
|
"**/*.d.ts",
|
|
@@ -55,9 +56,12 @@ async function detectProject(projectRoot) {
|
|
|
55
56
|
]
|
|
56
57
|
}
|
|
57
58
|
);
|
|
59
|
+
const nonComponentPatterns = /\.(styles|utils|helpers|constants|types|hooks|context|config|mock|fixture)\./i;
|
|
60
|
+
const nonComponentNames = /^(index|types|utils|helpers|constants|hooks|providers|layout|use[A-Z])/;
|
|
58
61
|
const likelyComponents = componentFiles.filter((f) => {
|
|
59
62
|
const fileName = f.split("/").pop() || "";
|
|
60
|
-
|
|
63
|
+
const baseName = fileName.replace(/\.tsx$/, "");
|
|
64
|
+
return !nonComponentPatterns.test(fileName) && !nonComponentNames.test(baseName);
|
|
61
65
|
});
|
|
62
66
|
let suggestedComponentPath = "src/components";
|
|
63
67
|
if (likelyComponents.length > 0) {
|
|
@@ -155,7 +159,7 @@ export function Button({
|
|
|
155
159
|
}
|
|
156
160
|
function generateExampleFragment() {
|
|
157
161
|
return `import React from 'react';
|
|
158
|
-
import { defineFragment } from '@fragments-sdk/cli';
|
|
162
|
+
import { defineFragment } from '@fragments-sdk/cli/core';
|
|
159
163
|
import { Button } from './Button';
|
|
160
164
|
|
|
161
165
|
export default defineFragment({
|
|
@@ -251,6 +255,42 @@ export default defineFragment({
|
|
|
251
255
|
});
|
|
252
256
|
`;
|
|
253
257
|
}
|
|
258
|
+
function toPascalCase(str) {
|
|
259
|
+
return str.replace(/[-_.](\w)/g, (_, c) => c.toUpperCase()).replace(/^\w/, (c) => c.toUpperCase());
|
|
260
|
+
}
|
|
261
|
+
function generateFragmentStub(componentName, importPath) {
|
|
262
|
+
return `import React from 'react';
|
|
263
|
+
import { defineFragment } from '@fragments-sdk/cli/core';
|
|
264
|
+
import { ${componentName} } from '${importPath}';
|
|
265
|
+
|
|
266
|
+
export default defineFragment({
|
|
267
|
+
component: ${componentName},
|
|
268
|
+
|
|
269
|
+
meta: {
|
|
270
|
+
name: '${componentName}',
|
|
271
|
+
description: '${componentName} component',
|
|
272
|
+
category: 'general',
|
|
273
|
+
status: 'beta',
|
|
274
|
+
},
|
|
275
|
+
|
|
276
|
+
usage: {
|
|
277
|
+
when: ['TODO: describe when to use ${componentName}'],
|
|
278
|
+
whenNot: ['TODO: describe when not to use ${componentName}'],
|
|
279
|
+
},
|
|
280
|
+
|
|
281
|
+
props: {},
|
|
282
|
+
|
|
283
|
+
variants: [
|
|
284
|
+
{
|
|
285
|
+
name: 'Default',
|
|
286
|
+
description: 'Default ${componentName}',
|
|
287
|
+
code: \`<${componentName} />\`,
|
|
288
|
+
render: () => <${componentName} />,
|
|
289
|
+
},
|
|
290
|
+
],
|
|
291
|
+
});
|
|
292
|
+
`;
|
|
293
|
+
}
|
|
254
294
|
function startDevServer(projectRoot) {
|
|
255
295
|
console.log(pc.dim("\nStarting development server...\n"));
|
|
256
296
|
const isWindows = process.platform === "win32";
|
|
@@ -393,9 +433,31 @@ Keeping existing configuration. Run \`${BRAND.cliCommand} dev\` to start.
|
|
|
393
433
|
}
|
|
394
434
|
}
|
|
395
435
|
if (scenario === "components" && runScan) {
|
|
436
|
+
let stubsCreated = 0;
|
|
437
|
+
for (const compFile of detection.componentFiles) {
|
|
438
|
+
const absPath = join(projectRoot, compFile);
|
|
439
|
+
const dir = dirname(absPath);
|
|
440
|
+
const fileName = basename(compFile, ".tsx");
|
|
441
|
+
const componentName = toPascalCase(fileName);
|
|
442
|
+
const fragmentPath = join(dir, `${fileName}.fragment.tsx`);
|
|
443
|
+
try {
|
|
444
|
+
await access(fragmentPath);
|
|
445
|
+
continue;
|
|
446
|
+
} catch {
|
|
447
|
+
}
|
|
448
|
+
try {
|
|
449
|
+
const stub = generateFragmentStub(componentName, `./${fileName}`);
|
|
450
|
+
await writeFile(fragmentPath, stub, "utf-8");
|
|
451
|
+
stubsCreated++;
|
|
452
|
+
} catch {
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
if (stubsCreated > 0) {
|
|
456
|
+
console.log(pc.green(`\u2713 Generated ${stubsCreated} fragment stub(s)`));
|
|
457
|
+
}
|
|
396
458
|
console.log(pc.dim("\nGenerating documentation from source code...\n"));
|
|
397
459
|
try {
|
|
398
|
-
const { scan } = await import("./scan-
|
|
460
|
+
const { scan } = await import("./scan-BSMLGBX4.js");
|
|
399
461
|
await scan({
|
|
400
462
|
config: configPath,
|
|
401
463
|
verbose: false
|
|
@@ -433,4 +495,4 @@ Keeping existing configuration. Run \`${BRAND.cliCommand} dev\` to start.
|
|
|
433
495
|
export {
|
|
434
496
|
init
|
|
435
497
|
};
|
|
436
|
-
//# sourceMappingURL=init-
|
|
498
|
+
//# sourceMappingURL=init-GID2DXB3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/init.ts"],"sourcesContent":["/**\n * fragments init - Smart interactive initialization\n *\n * Handles three scenarios:\n * 1. Stories found → Configure and load existing stories\n * 2. Components found (no stories) → Auto-generate documentation\n * 3. Fresh project → Guided setup with example component\n */\n\nimport { readFile, writeFile, mkdir, access } from \"node:fs/promises\";\nimport { resolve, join, relative, dirname, basename } from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport pc from \"picocolors\";\nimport { BRAND } from \"../core/index.js\";\nimport fg from \"fast-glob\";\nimport { input, confirm, select } from \"@inquirer/prompts\";\n\nexport interface InitOptions {\n /** Project root directory */\n projectRoot?: string;\n /** Force overwrite existing config */\n force?: boolean;\n /** Non-interactive mode - auto-detect and use defaults */\n yes?: boolean;\n}\n\nexport interface InitResult {\n success: boolean;\n configPath?: string;\n scenario: \"stories\" | \"components\" | \"fresh\";\n storiesFound: number;\n componentsFound: number;\n errors: string[];\n}\n\ninterface DetectionResult {\n storyFiles: string[];\n componentFiles: string[];\n hasConfig: boolean;\n configPath: string | null;\n suggestedComponentPath: string;\n}\n\n/**\n * Detect what exists in the project\n */\nasync function detectProject(projectRoot: string): Promise<DetectionResult> {\n console.log(pc.dim(\"\\nScanning project...\\n\"));\n\n // Check for existing config\n const configPath = join(projectRoot, BRAND.configFile);\n const legacyConfigPath = join(projectRoot, BRAND.legacyConfigFile);\n let hasConfig = false;\n let foundConfigPath: string | null = null;\n\n try {\n await access(configPath);\n hasConfig = true;\n foundConfigPath = configPath;\n } catch {\n try {\n await access(legacyConfigPath);\n hasConfig = true;\n foundConfigPath = legacyConfigPath;\n } catch {\n // No config\n }\n }\n\n // Scan for story files\n const storyFiles = await fg(\n [\"**/*.stories.tsx\", \"**/*.stories.ts\", \"**/*.stories.jsx\", \"**/*.stories.js\"],\n {\n cwd: projectRoot,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/build/**\", \"**/.storybook/**\"],\n }\n );\n\n // Scan for component files (React components)\n const componentFiles = await fg(\n [\"**/components/**/*.tsx\", \"**/Components/**/*.tsx\", \"src/**/*.tsx\"],\n {\n cwd: projectRoot,\n ignore: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/*.stories.*\",\n \"**/*.fragment.*\",\n \"**/*.test.*\",\n \"**/*.spec.*\",\n \"**/*.d.ts\",\n \"**/index.tsx\", // Skip barrel files\n ],\n }\n );\n\n // Filter to likely component files (exclude known non-component patterns)\n const nonComponentPatterns = /\\.(styles|utils|helpers|constants|types|hooks|context|config|mock|fixture)\\./i;\n const nonComponentNames = /^(index|types|utils|helpers|constants|hooks|providers|layout|use[A-Z])/;\n const likelyComponents = componentFiles.filter((f) => {\n const fileName = f.split(\"/\").pop() || \"\";\n const baseName = fileName.replace(/\\.tsx$/, \"\");\n return !nonComponentPatterns.test(fileName) && !nonComponentNames.test(baseName);\n });\n\n // Suggest component path based on what we found\n let suggestedComponentPath = \"src/components\";\n if (likelyComponents.length > 0) {\n const firstComponent = likelyComponents[0];\n const parts = firstComponent.split(\"/\");\n const componentsIndex = parts.findIndex(\n (p) => p.toLowerCase() === \"components\"\n );\n if (componentsIndex !== -1) {\n suggestedComponentPath = parts.slice(0, componentsIndex + 1).join(\"/\");\n }\n }\n\n return {\n storyFiles,\n componentFiles: likelyComponents,\n hasConfig,\n configPath: foundConfigPath,\n suggestedComponentPath,\n };\n}\n\n/**\n * Generate config file content\n */\nfunction generateConfig(options: {\n includePaths: string[];\n componentPaths: string[];\n framework: string;\n}): string {\n const includeStr = options.includePaths.map((p) => ` '${p}'`).join(\",\\n\");\n const componentStr = options.componentPaths.map((p) => ` '${p}'`).join(\",\\n\");\n\n return `import type { FragmentsConfig } from '@fragments-sdk/cli';\n\nconst config: FragmentsConfig = {\n // Glob patterns for finding fragment/story files\n include: [\n${includeStr}\n ],\n\n // Glob patterns to exclude\n exclude: ['**/node_modules/**'],\n\n // Glob patterns for finding component files (for auto-documentation)\n components: [\n${componentStr}\n ],\n\n // Framework (react, vue, svelte)\n framework: '${options.framework}',\n};\n\nexport default config;\n`;\n}\n\n/**\n * Generate example Button component\n */\nfunction generateExampleComponent(): string {\n return `import React from 'react';\n\nexport interface ButtonProps {\n /** Button label */\n children: React.ReactNode;\n /** Visual style variant */\n variant?: 'primary' | 'secondary' | 'ghost';\n /** Button size */\n size?: 'sm' | 'md' | 'lg';\n /** Disabled state */\n disabled?: boolean;\n /** Click handler */\n onClick?: () => void;\n}\n\nexport function Button({\n children,\n variant = 'primary',\n size = 'md',\n disabled = false,\n onClick,\n}: ButtonProps) {\n const baseStyles = 'inline-flex items-center justify-center font-medium rounded-md transition-colors';\n\n const variantStyles = {\n primary: 'bg-blue-600 text-white hover:bg-blue-700',\n secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300',\n ghost: 'bg-transparent text-gray-700 hover:bg-gray-100',\n };\n\n const sizeStyles = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-base',\n lg: 'px-6 py-3 text-lg',\n };\n\n return (\n <button\n className={\\`\\${baseStyles} \\${variantStyles[variant]} \\${sizeStyles[size]}\\`}\n disabled={disabled}\n onClick={onClick}\n >\n {children}\n </button>\n );\n}\n`;\n}\n\n/**\n * Generate example Button fragment file\n */\nfunction generateExampleFragment(): string {\n return `import React from 'react';\nimport { defineFragment } from '@fragments-sdk/cli/core';\nimport { Button } from './Button';\n\nexport default defineFragment({\n component: Button,\n\n meta: {\n name: 'Button',\n description: 'Interactive button for triggering actions',\n category: 'Actions',\n status: 'stable',\n },\n\n usage: {\n when: [\n 'Triggering an action (save, submit, delete)',\n 'Form submission',\n 'Opening dialogs or menus',\n ],\n whenNot: [\n 'Simple navigation (use Link)',\n 'Toggling state (use Switch)',\n ],\n guidelines: [\n 'Use Primary for the main action in a context',\n 'Only one Primary button per section',\n ],\n },\n\n props: {\n children: {\n type: 'node',\n required: true,\n description: 'Button label content',\n },\n variant: {\n type: 'enum',\n values: ['primary', 'secondary', 'ghost'],\n default: 'primary',\n description: 'Visual style variant',\n },\n size: {\n type: 'enum',\n values: ['sm', 'md', 'lg'],\n default: 'md',\n description: 'Button size',\n },\n },\n\n variants: [\n {\n name: 'Primary',\n description: 'Default action button',\n code: \\`import { Button } from './Button';\n\n<Button variant=\"primary\">Save Changes</Button>\\`,\n render: () => <Button variant=\"primary\">Save Changes</Button>,\n },\n {\n name: 'Secondary',\n description: 'Less prominent action',\n code: \\`import { Button } from './Button';\n\n<Button variant=\"secondary\">Cancel</Button>\\`,\n render: () => <Button variant=\"secondary\">Cancel</Button>,\n },\n {\n name: 'Ghost',\n description: 'Minimal visual weight',\n code: \\`import { Button } from './Button';\n\n<Button variant=\"ghost\">Learn More</Button>\\`,\n render: () => <Button variant=\"ghost\">Learn More</Button>,\n },\n {\n name: 'Sizes',\n description: 'Available size options',\n code: \\`import { Button } from './Button';\n\n<>\n <Button size=\"sm\">Small</Button>\n <Button size=\"md\">Medium</Button>\n <Button size=\"lg\">Large</Button>\n</>\\`,\n render: () => (\n <>\n <Button size=\"sm\">Small</Button>\n <Button size=\"md\">Medium</Button>\n <Button size=\"lg\">Large</Button>\n </>\n ),\n },\n ],\n});\n`;\n}\n\n/**\n * Convert a filename to PascalCase component name\n */\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_.](\\w)/g, (_, c) => c.toUpperCase())\n .replace(/^\\w/, (c) => c.toUpperCase());\n}\n\n/**\n * Generate a minimal fragment stub for a discovered component\n */\nfunction generateFragmentStub(componentName: string, importPath: string): string {\n return `import React from 'react';\nimport { defineFragment } from '@fragments-sdk/cli/core';\nimport { ${componentName} } from '${importPath}';\n\nexport default defineFragment({\n component: ${componentName},\n\n meta: {\n name: '${componentName}',\n description: '${componentName} component',\n category: 'general',\n status: 'beta',\n },\n\n usage: {\n when: ['TODO: describe when to use ${componentName}'],\n whenNot: ['TODO: describe when not to use ${componentName}'],\n },\n\n props: {},\n\n variants: [\n {\n name: 'Default',\n description: 'Default ${componentName}',\n code: \\`<${componentName} />\\`,\n render: () => <${componentName} />,\n },\n ],\n});\n`;\n}\n\n/**\n * Start the dev server\n */\nfunction startDevServer(projectRoot: string): void {\n console.log(pc.dim(\"\\nStarting development server...\\n\"));\n\n // Use process.platform to determine the correct command\n const isWindows = process.platform === \"win32\";\n const cmd = isWindows ? \"npx.cmd\" : \"npx\";\n\n const child = spawn(cmd, [BRAND.cliCommand, \"dev\"], {\n cwd: projectRoot,\n stdio: \"inherit\",\n });\n\n child.on(\"error\", (err) => {\n console.error(pc.red(\"Failed to start dev server:\"), err.message);\n });\n}\n\n/**\n * Main init function - smart and interactive by default\n */\nexport async function init(options: InitOptions = {}): Promise<InitResult> {\n const projectRoot = resolve(options.projectRoot || process.cwd());\n const errors: string[] = [];\n\n console.log(pc.cyan(`\\n✨ Welcome to ${BRAND.name}!\\n`));\n\n // Step 1: Detect what exists\n const detection = await detectProject(projectRoot);\n\n // Check for existing config\n if (detection.hasConfig && !options.force) {\n console.log(pc.yellow(`⚠ Config already exists: ${BRAND.configFile}`));\n\n if (!options.yes) {\n const overwrite = await confirm({\n message: \"Do you want to reinitialize? (This will overwrite your config)\",\n default: false,\n });\n\n if (!overwrite) {\n console.log(pc.dim(`\\nKeeping existing configuration. Run \\`${BRAND.cliCommand} dev\\` to start.\\n`));\n return {\n success: true,\n scenario: \"stories\",\n storiesFound: detection.storyFiles.length,\n componentsFound: detection.componentFiles.length,\n errors: [],\n };\n }\n }\n }\n\n // Step 2: Determine scenario and show what we found\n let scenario: \"stories\" | \"components\" | \"fresh\";\n\n if (detection.storyFiles.length > 0) {\n scenario = \"stories\";\n console.log(pc.green(`✓ Found ${detection.storyFiles.length} Storybook story file(s)`));\n console.log(pc.dim(` ${detection.storyFiles.slice(0, 3).join(\"\\n \")}`));\n if (detection.storyFiles.length > 3) {\n console.log(pc.dim(` ... and ${detection.storyFiles.length - 3} more`));\n }\n console.log();\n console.log(\n pc.cyan(\"Great news! \") +\n \"Fragments can load your existing stories automatically.\"\n );\n } else if (detection.componentFiles.length > 0) {\n scenario = \"components\";\n console.log(pc.green(`✓ Found ${detection.componentFiles.length} component file(s)`));\n console.log(pc.dim(` ${detection.componentFiles.slice(0, 3).join(\"\\n \")}`));\n if (detection.componentFiles.length > 3) {\n console.log(pc.dim(` ... and ${detection.componentFiles.length - 3} more`));\n }\n console.log();\n console.log(\n pc.cyan(\"No stories found, but that's fine! \") +\n \"Fragments can auto-generate documentation from your TypeScript.\"\n );\n } else {\n scenario = \"fresh\";\n console.log(pc.yellow(\"No components or stories found.\"));\n console.log();\n console.log(pc.cyan(\"Let's create your first fragment!\"));\n }\n\n console.log();\n\n // Step 3: Gather configuration (interactive unless --yes)\n let componentPath = detection.suggestedComponentPath;\n let runScan = scenario === \"components\";\n let createExample = scenario === \"fresh\";\n let startServer = true;\n\n if (!options.yes) {\n // Ask about component location\n componentPath = await input({\n message: \"Where are your components located?\",\n default: detection.suggestedComponentPath,\n });\n\n if (scenario === \"components\") {\n // For component-only projects, ask about scanning\n runScan = await confirm({\n message: \"Auto-generate documentation from TypeScript?\",\n default: true,\n });\n } else {\n // Fresh project - ask about example\n createExample = await confirm({\n message: \"Create an example Button component to get started?\",\n default: true,\n });\n }\n\n // Ask about starting the server\n startServer = await confirm({\n message: \"Start the viewer now?\",\n default: true,\n });\n }\n\n // Step 4: Create configuration\n console.log(pc.dim(\"\\nCreating configuration...\\n\"));\n\n // Build include patterns\n const includePaths: string[] = [\n `${componentPath}/**/*.fragment.tsx`,\n ];\n\n // Include story files when Storybook is detected\n if (scenario === 'stories') {\n includePaths.push(`${componentPath}/**/*.stories.tsx`);\n includePaths.push(`${componentPath}/**/*.stories.ts`);\n }\n\n // Create config file\n const configPath = join(projectRoot, BRAND.configFile);\n const configContent = generateConfig({\n includePaths,\n componentPaths: [`${componentPath}/**/*.tsx`],\n framework: \"react\",\n });\n\n try {\n await writeFile(configPath, configContent, \"utf-8\");\n console.log(pc.green(`✓ Created ${BRAND.configFile}`));\n } catch (e) {\n errors.push(`Failed to create config: ${e}`);\n }\n\n // Step 5: Handle scenario-specific setup\n if (scenario === \"fresh\" && createExample) {\n // Create example component\n const exampleDir = join(projectRoot, componentPath, \"Button\");\n\n try {\n await mkdir(exampleDir, { recursive: true });\n\n // Write Button.tsx\n await writeFile(\n join(exampleDir, \"Button.tsx\"),\n generateExampleComponent(),\n \"utf-8\"\n );\n console.log(\n pc.green(`✓ Created ${relative(projectRoot, join(exampleDir, \"Button.tsx\"))}`)\n );\n\n // Write Button.fragment.tsx\n await writeFile(\n join(exampleDir, \"Button.fragment.tsx\"),\n generateExampleFragment(),\n \"utf-8\"\n );\n console.log(\n pc.green(\n `✓ Created ${relative(projectRoot, join(exampleDir, \"Button.fragment.tsx\"))}`\n )\n );\n } catch (e) {\n errors.push(`Failed to create example component: ${e}`);\n }\n }\n\n if (scenario === \"components\" && runScan) {\n // Generate .fragment.tsx stubs for discovered components\n let stubsCreated = 0;\n for (const compFile of detection.componentFiles) {\n const absPath = join(projectRoot, compFile);\n const dir = dirname(absPath);\n const fileName = basename(compFile, \".tsx\");\n const componentName = toPascalCase(fileName);\n const fragmentPath = join(dir, `${fileName}.fragment.tsx`);\n\n // Skip if fragment already exists\n try {\n await access(fragmentPath);\n continue; // already exists\n } catch {\n // doesn't exist, create it\n }\n\n try {\n const stub = generateFragmentStub(componentName, `./${fileName}`);\n await writeFile(fragmentPath, stub, \"utf-8\");\n stubsCreated++;\n } catch {\n // skip files we can't write to\n }\n }\n\n if (stubsCreated > 0) {\n console.log(pc.green(`✓ Generated ${stubsCreated} fragment stub(s)`));\n }\n\n // Run scan to generate fragments.json\n console.log(pc.dim(\"\\nGenerating documentation from source code...\\n\"));\n try {\n const { scan } = await import(\"./scan.js\");\n await scan({\n config: configPath,\n verbose: false,\n });\n } catch (e) {\n console.log(\n pc.yellow(`Note: Auto-documentation will run when you start the dev server.`)\n );\n }\n }\n\n // Step 6: Show next steps or start server\n if (errors.length === 0) {\n console.log(pc.green(\"\\n✓ Setup complete!\\n\"));\n\n if (startServer) {\n const serverMessage =\n scenario === \"stories\"\n ? `Your ${detection.storyFiles.length} stories are loading...`\n : scenario === \"components\"\n ? `Your ${detection.componentFiles.length} components are being documented...`\n : `Your first component is ready!`;\n\n console.log(pc.cyan(serverMessage));\n startDevServer(projectRoot);\n } else {\n console.log(pc.cyan(\"Next steps:\"));\n console.log(` 1. Run ${pc.bold(`${BRAND.cliCommand} dev`)} to start the viewer`);\n if (scenario === \"fresh\") {\n console.log(` 2. Edit ${pc.bold(`${componentPath}/Button/Button.fragment.tsx`)}`);\n }\n console.log();\n }\n }\n\n return {\n success: errors.length === 0,\n configPath: errors.length === 0 ? configPath : undefined,\n scenario,\n storiesFound: detection.storyFiles.length,\n componentsFound: detection.componentFiles.length,\n errors,\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/mcp-bin.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
4
|
generateContext
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-TQOGBAOZ.js";
|
|
6
|
+
import "./chunk-7CRC46HV.js";
|
|
7
7
|
import {
|
|
8
8
|
BRAND,
|
|
9
9
|
DEFAULTS
|
|
@@ -60,7 +60,7 @@ var _service = null;
|
|
|
60
60
|
async function getService() {
|
|
61
61
|
if (!_service) {
|
|
62
62
|
try {
|
|
63
|
-
_service = await import("./service-
|
|
63
|
+
_service = await import("./service-QACVPR37.js");
|
|
64
64
|
} catch {
|
|
65
65
|
throw new Error(
|
|
66
66
|
"Visual tools require playwright. Install it with: npm install playwright"
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
scan
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-M42XIHPV.js";
|
|
5
|
+
import "./chunk-57OW43NL.js";
|
|
6
6
|
import "./chunk-AWYCDRPG.js";
|
|
7
7
|
import "./chunk-YMPGYEWK.js";
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-TQOGBAOZ.js";
|
|
9
|
+
import "./chunk-7CRC46HV.js";
|
|
10
10
|
import "./chunk-EKLMXTWU.js";
|
|
11
11
|
import "./chunk-Z7EY4VHE.js";
|
|
12
12
|
export {
|
|
13
13
|
scan
|
|
14
14
|
};
|
|
15
|
-
//# sourceMappingURL=scan-
|
|
15
|
+
//# sourceMappingURL=scan-BSMLGBX4.js.map
|
|
@@ -98,8 +98,8 @@ import {
|
|
|
98
98
|
sleep,
|
|
99
99
|
summarizePatternsForPrompt
|
|
100
100
|
} from "./chunk-YMPGYEWK.js";
|
|
101
|
-
import "./chunk-
|
|
102
|
-
import "./chunk-
|
|
101
|
+
import "./chunk-TQOGBAOZ.js";
|
|
102
|
+
import "./chunk-7CRC46HV.js";
|
|
103
103
|
import {
|
|
104
104
|
BRAND,
|
|
105
105
|
DEFAULTS
|
|
@@ -207,4 +207,4 @@ export {
|
|
|
207
207
|
sleep,
|
|
208
208
|
summarizePatternsForPrompt
|
|
209
209
|
};
|
|
210
|
-
//# sourceMappingURL=service-
|
|
210
|
+
//# sourceMappingURL=service-QACVPR37.js.map
|
|
@@ -3,12 +3,12 @@ import {
|
|
|
3
3
|
generateStaticViewer,
|
|
4
4
|
generateViewerFromJson
|
|
5
5
|
} from "./chunk-TOIE7VXF.js";
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-TQOGBAOZ.js";
|
|
7
|
+
import "./chunk-7CRC46HV.js";
|
|
8
8
|
import "./chunk-EKLMXTWU.js";
|
|
9
9
|
import "./chunk-Z7EY4VHE.js";
|
|
10
10
|
export {
|
|
11
11
|
generateStaticViewer,
|
|
12
12
|
generateViewerFromJson
|
|
13
13
|
};
|
|
14
|
-
//# sourceMappingURL=static-viewer-
|
|
14
|
+
//# sourceMappingURL=static-viewer-2RQD5QLR.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
parseFragmentFile
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-57OW43NL.js";
|
|
5
5
|
import {
|
|
6
6
|
discoverFragmentFiles
|
|
7
7
|
} from "./chunk-AWYCDRPG.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-7CRC46HV.js";
|
|
9
9
|
import "./chunk-EKLMXTWU.js";
|
|
10
10
|
import "./chunk-Z7EY4VHE.js";
|
|
11
11
|
|
|
@@ -1072,4 +1072,4 @@ export {
|
|
|
1072
1072
|
listTests,
|
|
1073
1073
|
runTestCommand
|
|
1074
1074
|
};
|
|
1075
|
-
//# sourceMappingURL=test-
|
|
1075
|
+
//# sourceMappingURL=test-36UELXTE.js.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
loadConfig
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-57OW43NL.js";
|
|
5
5
|
import "./chunk-AWYCDRPG.js";
|
|
6
6
|
import {
|
|
7
7
|
parseTokenFiles
|
|
8
8
|
} from "./chunk-YMPGYEWK.js";
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-TQOGBAOZ.js";
|
|
10
|
+
import "./chunk-7CRC46HV.js";
|
|
11
11
|
import {
|
|
12
12
|
BRAND
|
|
13
13
|
} from "./chunk-EKLMXTWU.js";
|
|
@@ -173,4 +173,4 @@ export {
|
|
|
173
173
|
tokens_default as default,
|
|
174
174
|
tokens
|
|
175
175
|
};
|
|
176
|
-
//# sourceMappingURL=tokens-
|
|
176
|
+
//# sourceMappingURL=tokens-A3BZIQPB.js.map
|