@cmssy/cli 0.1.0
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 +21 -0
- package/README.md +649 -0
- package/config.d.ts +2 -0
- package/config.js +2 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +236 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add-source.d.ts +7 -0
- package/dist/commands/add-source.d.ts.map +1 -0
- package/dist/commands/add-source.js +238 -0
- package/dist/commands/add-source.js.map +1 -0
- package/dist/commands/build.d.ts +7 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +105 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/configure.d.ts +6 -0
- package/dist/commands/configure.d.ts.map +1 -0
- package/dist/commands/configure.js +42 -0
- package/dist/commands/configure.js.map +1 -0
- package/dist/commands/create.d.ts +18 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +444 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/dev.d.ts +6 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +962 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +362 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/migrate.d.ts +2 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +227 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/package.d.ts +7 -0
- package/dist/commands/package.d.ts.map +1 -0
- package/dist/commands/package.js +136 -0
- package/dist/commands/package.js.map +1 -0
- package/dist/commands/publish.d.ts +13 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +910 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/sync.d.ts +6 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +208 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/upload.d.ts +7 -0
- package/dist/commands/upload.d.ts.map +1 -0
- package/dist/commands/upload.js +126 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/commands/workspaces.d.ts +2 -0
- package/dist/commands/workspaces.d.ts.map +1 -0
- package/dist/commands/workspaces.js +67 -0
- package/dist/commands/workspaces.js.map +1 -0
- package/dist/dev-ui/app.js +1284 -0
- package/dist/dev-ui/index.html +1511 -0
- package/dist/dev-ui-react/App.tsx +164 -0
- package/dist/dev-ui-react/__tests__/previewData.test.ts +193 -0
- package/dist/dev-ui-react/components/BlocksList.tsx +232 -0
- package/dist/dev-ui-react/components/Editor.tsx +469 -0
- package/dist/dev-ui-react/components/Preview.tsx +146 -0
- package/dist/dev-ui-react/hooks/useBlocks.ts +80 -0
- package/dist/dev-ui-react/index.html +13 -0
- package/dist/dev-ui-react/main.tsx +8 -0
- package/dist/dev-ui-react/styles.css +856 -0
- package/dist/dev-ui-react/types.ts +45 -0
- package/dist/types/block-config.d.ts +315 -0
- package/dist/types/block-config.d.ts.map +1 -0
- package/dist/types/block-config.js +8 -0
- package/dist/types/block-config.js.map +1 -0
- package/dist/utils/block-config.d.ts +10 -0
- package/dist/utils/block-config.d.ts.map +1 -0
- package/dist/utils/block-config.js +199 -0
- package/dist/utils/block-config.js.map +1 -0
- package/dist/utils/blocks-meta-cache.d.ts +28 -0
- package/dist/utils/blocks-meta-cache.d.ts.map +1 -0
- package/dist/utils/blocks-meta-cache.js +72 -0
- package/dist/utils/blocks-meta-cache.js.map +1 -0
- package/dist/utils/builder.d.ts +34 -0
- package/dist/utils/builder.d.ts.map +1 -0
- package/dist/utils/builder.js +140 -0
- package/dist/utils/builder.js.map +1 -0
- package/dist/utils/cmssy-config.d.ts +16 -0
- package/dist/utils/cmssy-config.d.ts.map +1 -0
- package/dist/utils/cmssy-config.js +19 -0
- package/dist/utils/cmssy-config.js.map +1 -0
- package/dist/utils/config.d.ts +9 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +46 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/field-schema.d.ts +12 -0
- package/dist/utils/field-schema.d.ts.map +1 -0
- package/dist/utils/field-schema.js +202 -0
- package/dist/utils/field-schema.js.map +1 -0
- package/dist/utils/graphql.d.ts +8 -0
- package/dist/utils/graphql.d.ts.map +1 -0
- package/dist/utils/graphql.js +118 -0
- package/dist/utils/graphql.js.map +1 -0
- package/dist/utils/publish-helpers.d.ts +35 -0
- package/dist/utils/publish-helpers.d.ts.map +1 -0
- package/dist/utils/publish-helpers.js +141 -0
- package/dist/utils/publish-helpers.js.map +1 -0
- package/dist/utils/scanner.d.ts +36 -0
- package/dist/utils/scanner.d.ts.map +1 -0
- package/dist/utils/scanner.js +140 -0
- package/dist/utils/scanner.js.map +1 -0
- package/dist/utils/type-generator.d.ts +9 -0
- package/dist/utils/type-generator.d.ts.map +1 -0
- package/dist/utils/type-generator.js +85 -0
- package/dist/utils/type-generator.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { GraphQLClient } from "graphql-request";
|
|
2
|
+
import { loadConfig } from "./config.js";
|
|
3
|
+
export function createClient() {
|
|
4
|
+
const config = loadConfig();
|
|
5
|
+
if (!config.apiToken) {
|
|
6
|
+
throw new Error("CMSSY_API_TOKEN not configured. Run: cmssy configure");
|
|
7
|
+
}
|
|
8
|
+
return new GraphQLClient(config.apiUrl, {
|
|
9
|
+
headers: {
|
|
10
|
+
"Content-Type": "application/json",
|
|
11
|
+
Authorization: `Bearer ${config.apiToken}`,
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
// GraphQL Mutations
|
|
16
|
+
export const PUBLISH_PACKAGE_MUTATION = `
|
|
17
|
+
mutation PublishPackage($token: String!, $input: PublishPackageInput!) {
|
|
18
|
+
publishPackage(token: $token, input: $input) {
|
|
19
|
+
success
|
|
20
|
+
message
|
|
21
|
+
packageId
|
|
22
|
+
status
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
`;
|
|
26
|
+
export const IMPORT_BLOCK_MUTATION = `
|
|
27
|
+
mutation ImportBlock($input: ImportBlockInput!) {
|
|
28
|
+
importBlock(input: $input) {
|
|
29
|
+
id
|
|
30
|
+
blockType
|
|
31
|
+
name
|
|
32
|
+
description
|
|
33
|
+
icon
|
|
34
|
+
category
|
|
35
|
+
layoutSlot
|
|
36
|
+
schemaFields {
|
|
37
|
+
key
|
|
38
|
+
type
|
|
39
|
+
label
|
|
40
|
+
defaultValue
|
|
41
|
+
placeholder
|
|
42
|
+
required
|
|
43
|
+
helperText
|
|
44
|
+
options
|
|
45
|
+
minValue
|
|
46
|
+
maxValue
|
|
47
|
+
group
|
|
48
|
+
showWhen {
|
|
49
|
+
field
|
|
50
|
+
equals
|
|
51
|
+
notEquals
|
|
52
|
+
notEmpty
|
|
53
|
+
isEmpty
|
|
54
|
+
}
|
|
55
|
+
validation {
|
|
56
|
+
minLength
|
|
57
|
+
maxLength
|
|
58
|
+
min
|
|
59
|
+
max
|
|
60
|
+
pattern
|
|
61
|
+
message
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
defaultContent
|
|
65
|
+
requires {
|
|
66
|
+
auth
|
|
67
|
+
language
|
|
68
|
+
workspace
|
|
69
|
+
modules
|
|
70
|
+
permissions
|
|
71
|
+
features
|
|
72
|
+
}
|
|
73
|
+
version
|
|
74
|
+
createdAt
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
`;
|
|
78
|
+
export const IMPORT_TEMPLATE_MUTATION = `
|
|
79
|
+
mutation ImportTemplate($input: ImportTemplateInput!) {
|
|
80
|
+
importTemplate(input: $input) {
|
|
81
|
+
success
|
|
82
|
+
block {
|
|
83
|
+
id
|
|
84
|
+
blockType
|
|
85
|
+
name
|
|
86
|
+
version
|
|
87
|
+
}
|
|
88
|
+
pagesCreated
|
|
89
|
+
pagesUpdated
|
|
90
|
+
layoutSlotsCreated
|
|
91
|
+
layoutSlotsUpdated
|
|
92
|
+
message
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
`;
|
|
96
|
+
export const ADD_BLOCK_SOURCE_CODE_MUTATION = `
|
|
97
|
+
mutation AddBlockSourceCode($input: AddBlockSourceCodeInput!) {
|
|
98
|
+
addBlockSourceCode(input: $input) {
|
|
99
|
+
id
|
|
100
|
+
blockType
|
|
101
|
+
name
|
|
102
|
+
sourceUrl
|
|
103
|
+
sourceCssUrl
|
|
104
|
+
dependenciesUrl
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
`;
|
|
108
|
+
export const GET_WORKSPACE_BLOCKS_QUERY = `
|
|
109
|
+
query GetWorkspaceBlocks {
|
|
110
|
+
workspaceBlocks {
|
|
111
|
+
id
|
|
112
|
+
blockType
|
|
113
|
+
name
|
|
114
|
+
sourceUrl
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
`;
|
|
118
|
+
//# sourceMappingURL=graphql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/utils/graphql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,sDAAsD,CACvD,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE;QACtC,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,MAAM,CAAC,QAAQ,EAAE;SAC3C;KACF,CAAC,CAAC;AACL,CAAC;AAED,oBAAoB;AACpB,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;CASvC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDpC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;CAiBvC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;;;;;;;CAW7C,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;CASzC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper functions for the publish command.
|
|
3
|
+
* Extracted for testability.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert block.config.ts schema to schemaFields array for GraphQL mutation.
|
|
7
|
+
*/
|
|
8
|
+
export declare function convertSchemaToFields(schema: Record<string, any>): any[];
|
|
9
|
+
/**
|
|
10
|
+
* Extract default content values from schema.
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractDefaultContent(schema: Record<string, any>): any;
|
|
13
|
+
/**
|
|
14
|
+
* Extract block type from full package name.
|
|
15
|
+
* @example "@cmssy/blocks.hero" -> "hero"
|
|
16
|
+
* @example "@org/templates.landing" -> "landing"
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractBlockType(packageName: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Add __component to mount/update pattern for SSR compatibility.
|
|
21
|
+
* This makes blocks work in both dev environment (mount/update) and SSR (__component).
|
|
22
|
+
*/
|
|
23
|
+
export declare function addComponentForSSR(code: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Detect if a package is a template based on type.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isTemplate(packageType: "block" | "template"): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Parse pages.json data and convert to mutation input format.
|
|
30
|
+
*/
|
|
31
|
+
export declare function parsePagesJson(pagesData: any): {
|
|
32
|
+
pages: any[];
|
|
33
|
+
layoutSlots: any[];
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=publish-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/publish-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,CAwDxE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAYtE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsCvD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAErE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG;IAC9C,KAAK,EAAE,GAAG,EAAE,CAAC;IACb,WAAW,EAAE,GAAG,EAAE,CAAC;CACpB,CA0BA"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper functions for the publish command.
|
|
3
|
+
* Extracted for testability.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert block.config.ts schema to schemaFields array for GraphQL mutation.
|
|
7
|
+
*/
|
|
8
|
+
export function convertSchemaToFields(schema) {
|
|
9
|
+
const fields = [];
|
|
10
|
+
Object.entries(schema).forEach(([key, field]) => {
|
|
11
|
+
const baseField = {
|
|
12
|
+
key,
|
|
13
|
+
type: field.type,
|
|
14
|
+
label: field.label,
|
|
15
|
+
required: field.required || false,
|
|
16
|
+
};
|
|
17
|
+
// Add defaultValue if present
|
|
18
|
+
if (field.defaultValue !== undefined) {
|
|
19
|
+
baseField.defaultValue = field.defaultValue;
|
|
20
|
+
}
|
|
21
|
+
// Add placeholder if present
|
|
22
|
+
if (field.placeholder) {
|
|
23
|
+
baseField.placeholder = field.placeholder;
|
|
24
|
+
}
|
|
25
|
+
// Add helpText if present
|
|
26
|
+
if (field.helpText) {
|
|
27
|
+
baseField.helperText = field.helpText;
|
|
28
|
+
}
|
|
29
|
+
// Add group if present
|
|
30
|
+
if (field.group) {
|
|
31
|
+
baseField.group = field.group;
|
|
32
|
+
}
|
|
33
|
+
// Add showWhen conditional visibility
|
|
34
|
+
if (field.showWhen) {
|
|
35
|
+
baseField.showWhen = field.showWhen;
|
|
36
|
+
}
|
|
37
|
+
// Add validation rules
|
|
38
|
+
if (field.validation) {
|
|
39
|
+
baseField.validation = field.validation;
|
|
40
|
+
}
|
|
41
|
+
if (field.type === "select" && field.options) {
|
|
42
|
+
baseField.options = field.options;
|
|
43
|
+
}
|
|
44
|
+
if (field.type === "repeater" && field.schema) {
|
|
45
|
+
baseField.minItems = field.minItems;
|
|
46
|
+
baseField.maxItems = field.maxItems;
|
|
47
|
+
// Backend expects itemSchema to be a flat array of field definitions
|
|
48
|
+
baseField.itemSchema = convertSchemaToFields(field.schema);
|
|
49
|
+
}
|
|
50
|
+
fields.push(baseField);
|
|
51
|
+
});
|
|
52
|
+
return fields;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Extract default content values from schema.
|
|
56
|
+
*/
|
|
57
|
+
export function extractDefaultContent(schema) {
|
|
58
|
+
const content = {};
|
|
59
|
+
Object.entries(schema).forEach(([key, field]) => {
|
|
60
|
+
if (field.defaultValue !== undefined) {
|
|
61
|
+
content[key] = field.defaultValue;
|
|
62
|
+
}
|
|
63
|
+
else if (field.type === "repeater") {
|
|
64
|
+
content[key] = [];
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return content;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Extract block type from full package name.
|
|
71
|
+
* @example "@cmssy/blocks.hero" -> "hero"
|
|
72
|
+
* @example "@org/templates.landing" -> "landing"
|
|
73
|
+
*/
|
|
74
|
+
export function extractBlockType(packageName) {
|
|
75
|
+
return packageName
|
|
76
|
+
.replace(/@[^/]+\//, "") // Remove @scope/
|
|
77
|
+
.replace(/^blocks\./, "") // Remove blocks. prefix
|
|
78
|
+
.replace(/^templates\./, ""); // Remove templates. prefix
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Add __component to mount/update pattern for SSR compatibility.
|
|
82
|
+
* This makes blocks work in both dev environment (mount/update) and SSR (__component).
|
|
83
|
+
*/
|
|
84
|
+
export function addComponentForSSR(code) {
|
|
85
|
+
// Check if code exports mount/update pattern
|
|
86
|
+
const hasPattern = /exports\.default\s*=\s*\{[^}]*mount\s*\([^)]*\)/s.test(code) ||
|
|
87
|
+
/module\.exports\s*=\s*\{[^}]*mount\s*\([^)]*\)/s.test(code);
|
|
88
|
+
if (!hasPattern) {
|
|
89
|
+
// No mount/update pattern - return as-is
|
|
90
|
+
return code;
|
|
91
|
+
}
|
|
92
|
+
// Find the component that's being used in mount()
|
|
93
|
+
// Pattern: export default { mount() { ... render(<Component ... /> or createElement(Component ...) } }
|
|
94
|
+
const componentMatch = code.match(/(?:render|createElement)\s*\(\s*(?:<\s*)?(\w+)/);
|
|
95
|
+
const componentName = componentMatch?.[1];
|
|
96
|
+
if (!componentName) {
|
|
97
|
+
console.warn("[CLI] Warning: Found mount/update pattern but could not extract component name for __component");
|
|
98
|
+
return code;
|
|
99
|
+
}
|
|
100
|
+
// Add __component to the exports object
|
|
101
|
+
// Replace: module.exports = { mount, update, unmount };
|
|
102
|
+
// With: module.exports = { mount, update, unmount, __component: ComponentName };
|
|
103
|
+
const updatedCode = code.replace(/((?:exports\.default|module\.exports)\s*=\s*\{[^}]*)(}\s*;)/s, `$1,\n // Auto-added by CLI for SSR compatibility\n __component: ${componentName}\n$2`);
|
|
104
|
+
if (updatedCode === code) {
|
|
105
|
+
console.warn("[CLI] Warning: Could not add __component to exports");
|
|
106
|
+
}
|
|
107
|
+
return updatedCode;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Detect if a package is a template based on type.
|
|
111
|
+
*/
|
|
112
|
+
export function isTemplate(packageType) {
|
|
113
|
+
return packageType === "template";
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Parse pages.json data and convert to mutation input format.
|
|
117
|
+
*/
|
|
118
|
+
export function parsePagesJson(pagesData) {
|
|
119
|
+
// Convert pages
|
|
120
|
+
const pages = (pagesData.pages || []).map((page) => ({
|
|
121
|
+
name: page.name,
|
|
122
|
+
slug: page.slug,
|
|
123
|
+
blocks: (page.blocks || []).map((block) => ({
|
|
124
|
+
type: block.type,
|
|
125
|
+
content: block.content || {},
|
|
126
|
+
})),
|
|
127
|
+
}));
|
|
128
|
+
// Convert layoutSlots to array format
|
|
129
|
+
const layoutSlots = [];
|
|
130
|
+
if (pagesData.layoutSlots) {
|
|
131
|
+
for (const [slot, data] of Object.entries(pagesData.layoutSlots)) {
|
|
132
|
+
layoutSlots.push({
|
|
133
|
+
slot,
|
|
134
|
+
type: data.type,
|
|
135
|
+
content: data.content || {},
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return { pages, layoutSlots };
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=publish-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-helpers.js","sourceRoot":"","sources":["../../src/utils/publish-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface ScanOptions {
|
|
2
|
+
/** Throw errors instead of warnings (default: false) */
|
|
3
|
+
strict?: boolean;
|
|
4
|
+
/** Load block.config.ts (default: true) */
|
|
5
|
+
loadConfig?: boolean;
|
|
6
|
+
/** Validate schema (default: true) */
|
|
7
|
+
validateSchema?: boolean;
|
|
8
|
+
/** Load preview.json (default: false) */
|
|
9
|
+
loadPreview?: boolean;
|
|
10
|
+
/** Require package.json (default: true) */
|
|
11
|
+
requirePackageJson?: boolean;
|
|
12
|
+
/** Custom working directory (default: process.cwd()) */
|
|
13
|
+
cwd?: string;
|
|
14
|
+
/** Only scan specific blocks/templates by name (case-insensitive) */
|
|
15
|
+
names?: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface ScannedResource {
|
|
18
|
+
type: "block" | "template";
|
|
19
|
+
name: string;
|
|
20
|
+
path: string;
|
|
21
|
+
displayName?: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
category?: string;
|
|
24
|
+
previewData?: any;
|
|
25
|
+
blockConfig?: any;
|
|
26
|
+
packageJson?: any;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Scan blocks and templates directories with configurable options.
|
|
30
|
+
* Supports 3 modes:
|
|
31
|
+
* - Strict mode (build): throws errors, requires block.config.ts + validation
|
|
32
|
+
* - Lenient mode (dev): warns, loads preview.json, metadata
|
|
33
|
+
* - Minimal mode (package): only package.json, no validation
|
|
34
|
+
*/
|
|
35
|
+
export declare function scanResources(options?: ScanOptions): Promise<ScannedResource[]>;
|
|
36
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/utils/scanner.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,yCAAyC;IACzC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2CAA2C;IAC3C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,WAAW,CAAC,EAAE,GAAG,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,eAAe,EAAE,CAAC,CAwC5B"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { loadBlockConfig, validateSchema } from "./block-config.js";
|
|
5
|
+
import { getPackageJson } from "./cmssy-config.js";
|
|
6
|
+
/**
|
|
7
|
+
* Scan blocks and templates directories with configurable options.
|
|
8
|
+
* Supports 3 modes:
|
|
9
|
+
* - Strict mode (build): throws errors, requires block.config.ts + validation
|
|
10
|
+
* - Lenient mode (dev): warns, loads preview.json, metadata
|
|
11
|
+
* - Minimal mode (package): only package.json, no validation
|
|
12
|
+
*/
|
|
13
|
+
export async function scanResources(options = {}) {
|
|
14
|
+
const { strict = false, loadConfig = true, validateSchema: shouldValidate = true, loadPreview = false, requirePackageJson = true, cwd = process.cwd(), names, } = options;
|
|
15
|
+
const resources = [];
|
|
16
|
+
// Scan blocks
|
|
17
|
+
await scanDirectory({
|
|
18
|
+
type: "block",
|
|
19
|
+
dir: path.join(cwd, "blocks"),
|
|
20
|
+
resources,
|
|
21
|
+
strict,
|
|
22
|
+
loadConfig,
|
|
23
|
+
shouldValidate,
|
|
24
|
+
loadPreview,
|
|
25
|
+
requirePackageJson,
|
|
26
|
+
names,
|
|
27
|
+
});
|
|
28
|
+
// Scan templates
|
|
29
|
+
await scanDirectory({
|
|
30
|
+
type: "template",
|
|
31
|
+
dir: path.join(cwd, "templates"),
|
|
32
|
+
resources,
|
|
33
|
+
strict,
|
|
34
|
+
loadConfig,
|
|
35
|
+
shouldValidate,
|
|
36
|
+
loadPreview,
|
|
37
|
+
requirePackageJson,
|
|
38
|
+
names,
|
|
39
|
+
});
|
|
40
|
+
return resources;
|
|
41
|
+
}
|
|
42
|
+
async function scanDirectory(opts) {
|
|
43
|
+
const { type, dir, resources, strict, loadConfig, shouldValidate, loadPreview, requirePackageJson, names } = opts;
|
|
44
|
+
if (!fs.existsSync(dir)) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
let itemDirs = fs
|
|
48
|
+
.readdirSync(dir, { withFileTypes: true })
|
|
49
|
+
.filter((dirent) => dirent.isDirectory())
|
|
50
|
+
.map((dirent) => dirent.name);
|
|
51
|
+
// Filter by names if provided (case-insensitive)
|
|
52
|
+
if (names && names.length > 0) {
|
|
53
|
+
const lowerNames = names.map((n) => n.toLowerCase());
|
|
54
|
+
itemDirs = itemDirs.filter((name) => lowerNames.includes(name.toLowerCase()));
|
|
55
|
+
}
|
|
56
|
+
for (const itemName of itemDirs) {
|
|
57
|
+
const itemPath = path.join(dir, itemName);
|
|
58
|
+
// Try loading block.config.ts if requested
|
|
59
|
+
let blockConfig = null;
|
|
60
|
+
if (loadConfig) {
|
|
61
|
+
blockConfig = await loadBlockConfig(itemPath);
|
|
62
|
+
if (!blockConfig) {
|
|
63
|
+
// Check if package.json has cmssy (old format)
|
|
64
|
+
const pkg = getPackageJson(itemPath);
|
|
65
|
+
if (pkg && pkg.cmssy) {
|
|
66
|
+
const message = `${type === "block" ? "Block" : "Template"} "${itemName}" uses legacy package.json format.\n` +
|
|
67
|
+
`Please migrate to block.config.ts.\n` +
|
|
68
|
+
`Run: cmssy migrate ${itemName}\n` +
|
|
69
|
+
`Or see migration guide: https://cmssy.io/docs/migration`;
|
|
70
|
+
if (strict) {
|
|
71
|
+
throw new Error(message);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.warn(chalk.yellow(`Warning: ${message}`));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (strict) {
|
|
78
|
+
console.warn(chalk.yellow(`Warning: Skipping ${itemName} - no block.config.ts found`));
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
// In non-strict mode, continue without config
|
|
82
|
+
}
|
|
83
|
+
// Validate schema if requested and config exists and has schema
|
|
84
|
+
if (shouldValidate && blockConfig && blockConfig.schema) {
|
|
85
|
+
const validation = await validateSchema(blockConfig.schema, itemPath);
|
|
86
|
+
if (!validation.valid) {
|
|
87
|
+
const errorMessage = `\nValidation ${strict ? "errors" : "warnings"} in ${itemName}:`;
|
|
88
|
+
if (strict) {
|
|
89
|
+
console.error(chalk.red(errorMessage));
|
|
90
|
+
validation.errors.forEach((err) => console.error(chalk.red(` - ${err}`)));
|
|
91
|
+
throw new Error(`Schema validation failed for ${itemName}`);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.warn(chalk.yellow(errorMessage));
|
|
95
|
+
validation.errors.forEach((err) => console.warn(chalk.yellow(` - ${err}`)));
|
|
96
|
+
// Don't skip in non-strict - just warn
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Load package.json (optional in non-strict mode)
|
|
102
|
+
const pkg = getPackageJson(itemPath);
|
|
103
|
+
if (requirePackageJson && (!pkg || !pkg.name || !pkg.version)) {
|
|
104
|
+
const message = `${type === "block" ? "Block" : "Template"} "${itemName}" must have package.json with name and version`;
|
|
105
|
+
if (strict) {
|
|
106
|
+
throw new Error(message);
|
|
107
|
+
}
|
|
108
|
+
// In non-strict mode, continue without valid package.json
|
|
109
|
+
}
|
|
110
|
+
// Load preview.json if requested
|
|
111
|
+
let previewData = {};
|
|
112
|
+
if (loadPreview) {
|
|
113
|
+
const previewPath = path.join(itemPath, "preview.json");
|
|
114
|
+
if (fs.existsSync(previewPath)) {
|
|
115
|
+
previewData = fs.readJsonSync(previewPath);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Build resource object
|
|
119
|
+
const resource = {
|
|
120
|
+
type,
|
|
121
|
+
name: itemName,
|
|
122
|
+
path: itemPath,
|
|
123
|
+
packageJson: pkg,
|
|
124
|
+
// Default displayName from directory name (PascalCase)
|
|
125
|
+
displayName: itemName.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(''),
|
|
126
|
+
};
|
|
127
|
+
// Add optional fields if block.config.ts was loaded
|
|
128
|
+
if (blockConfig) {
|
|
129
|
+
resource.blockConfig = blockConfig;
|
|
130
|
+
resource.displayName = blockConfig.name || resource.displayName;
|
|
131
|
+
resource.description = blockConfig.description || pkg?.description;
|
|
132
|
+
resource.category = blockConfig.category;
|
|
133
|
+
}
|
|
134
|
+
if (loadPreview && Object.keys(previewData).length > 0) {
|
|
135
|
+
resource.previewData = previewData;
|
|
136
|
+
}
|
|
137
|
+
resources.push(resource);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/utils/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { FieldConfig } from "../types/block-config.js";
|
|
2
|
+
import { FieldTypeDefinition } from "./field-schema.js";
|
|
3
|
+
export interface GenerateTypesOptions {
|
|
4
|
+
blockPath: string;
|
|
5
|
+
schema: Record<string, FieldConfig>;
|
|
6
|
+
fieldTypes?: FieldTypeDefinition[];
|
|
7
|
+
}
|
|
8
|
+
export declare function generateTypes(options: GenerateTypesOptions): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=type-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-generator.d.ts","sourceRoot":"","sources":["../../src/utils/type-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EAGZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAsBxD,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACpC;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAchF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import path from "path";
|
|
3
|
+
// Default value type mappings (used when field types are not provided)
|
|
4
|
+
const DEFAULT_VALUE_TYPES = {
|
|
5
|
+
singleLine: "string",
|
|
6
|
+
multiLine: "string",
|
|
7
|
+
richText: "string",
|
|
8
|
+
numeric: "number",
|
|
9
|
+
date: "string",
|
|
10
|
+
media: "string",
|
|
11
|
+
link: "string",
|
|
12
|
+
select: "string",
|
|
13
|
+
multiselect: "string[]",
|
|
14
|
+
boolean: "boolean",
|
|
15
|
+
color: "string",
|
|
16
|
+
slider: "number",
|
|
17
|
+
repeater: "Record<string, unknown>[]",
|
|
18
|
+
form: "string",
|
|
19
|
+
emailTemplate: "string",
|
|
20
|
+
emailConfiguration: "string",
|
|
21
|
+
};
|
|
22
|
+
export async function generateTypes(options) {
|
|
23
|
+
const { blockPath, schema, fieldTypes } = options;
|
|
24
|
+
const typeDefinition = generateTypeDefinition({ schema, fieldTypes, indent: " " });
|
|
25
|
+
const outputPath = path.join(blockPath, "src", "block.d.ts");
|
|
26
|
+
const fileContent = `// Auto-generated from block.config.ts
|
|
27
|
+
// DO NOT EDIT - This file is automatically regenerated
|
|
28
|
+
|
|
29
|
+
export interface BlockContent {
|
|
30
|
+
${typeDefinition}
|
|
31
|
+
}
|
|
32
|
+
`;
|
|
33
|
+
await fs.writeFile(outputPath, fileContent);
|
|
34
|
+
}
|
|
35
|
+
function generateTypeDefinition(options) {
|
|
36
|
+
const { schema, fieldTypes, indent = " " } = options;
|
|
37
|
+
const lines = [];
|
|
38
|
+
Object.entries(schema).forEach(([key, field]) => {
|
|
39
|
+
const optional = field.required ? "" : "?";
|
|
40
|
+
const tsType = mapFieldTypeToTypeScript({ field, fieldTypes, indent });
|
|
41
|
+
if (field.helpText) {
|
|
42
|
+
lines.push(`${indent}/** ${field.helpText} */`);
|
|
43
|
+
}
|
|
44
|
+
lines.push(`${indent}${key}${optional}: ${tsType};`);
|
|
45
|
+
});
|
|
46
|
+
return lines.join("\n");
|
|
47
|
+
}
|
|
48
|
+
function mapFieldTypeToTypeScript(options) {
|
|
49
|
+
const { field, fieldTypes, indent = " " } = options;
|
|
50
|
+
// Special handling for select (generate union type from options)
|
|
51
|
+
if (field.type === "select") {
|
|
52
|
+
const selectField = field;
|
|
53
|
+
if (selectField.options && selectField.options.length > 0) {
|
|
54
|
+
const unionTypes = selectField.options
|
|
55
|
+
.map((opt) => `"${opt.value}"`)
|
|
56
|
+
.join(" | ");
|
|
57
|
+
return unionTypes;
|
|
58
|
+
}
|
|
59
|
+
return "string";
|
|
60
|
+
}
|
|
61
|
+
// Special handling for repeater (generate nested type from schema)
|
|
62
|
+
if (field.type === "repeater") {
|
|
63
|
+
const repeaterField = field;
|
|
64
|
+
if (repeaterField.schema) {
|
|
65
|
+
const nestedIndent = indent + " ";
|
|
66
|
+
const nestedType = `{\n${generateTypeDefinition({
|
|
67
|
+
schema: repeaterField.schema,
|
|
68
|
+
fieldTypes,
|
|
69
|
+
indent: nestedIndent,
|
|
70
|
+
})}\n${indent}}`;
|
|
71
|
+
return `Array<${nestedType}>`;
|
|
72
|
+
}
|
|
73
|
+
return "any[]";
|
|
74
|
+
}
|
|
75
|
+
// Look up valueType from backend field types
|
|
76
|
+
if (fieldTypes) {
|
|
77
|
+
const fieldTypeDef = fieldTypes.find((ft) => ft.type === field.type);
|
|
78
|
+
if (fieldTypeDef?.valueType) {
|
|
79
|
+
return fieldTypeDef.valueType;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Fall back to default mappings
|
|
83
|
+
return DEFAULT_VALUE_TYPES[field.type] || "any";
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=type-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-generator.js","sourceRoot":"","sources":["../../src/utils/type-generator.ts"],"names":[],"mappings":"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"}
|