@frontmcp/nx 1.8.6 → 1.9.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/executors/build/build.impl.js +9 -19
- package/executors/build/build.impl.js.map +1 -1
- package/executors/build/schema.d.ts +2 -0
- package/executors/build/schema.js.map +1 -1
- package/executors/build/schema.json +22 -2
- package/executors/build-exec/build-exec.impl.js +5 -17
- package/executors/build-exec/build-exec.impl.js.map +1 -1
- package/executors/deploy/deploy.impl.js.map +1 -1
- package/executors/dev/dev.impl.js +11 -17
- package/executors/dev/dev.impl.js.map +1 -1
- package/executors/frontmcp-cli.d.ts +31 -0
- package/executors/frontmcp-cli.js +108 -0
- package/executors/frontmcp-cli.js.map +1 -0
- package/executors/inspector/inspector.impl.js +10 -18
- package/executors/inspector/inspector.impl.js.map +1 -1
- package/executors/serve/serve.impl.js +11 -17
- package/executors/serve/serve.impl.js.map +1 -1
- package/executors/test/test.impl.js +3 -15
- package/executors/test/test.impl.js.map +1 -1
- package/generators/adapter/files/__fileName__.adapter.ts__tmpl__ +9 -2
- package/generators/agent/agent.d.ts +1 -1
- package/generators/agent/agent.js +21 -7
- package/generators/agent/agent.js.map +1 -1
- package/generators/agent/files/__fileName__.agent.ts__tmpl__ +12 -6
- package/generators/app/app.d.ts +1 -1
- package/generators/app/app.js +3 -3
- package/generators/app/app.js.map +1 -1
- package/generators/app/files/jest.config.cjs__tmpl__ +37 -0
- package/generators/app/files/package.json__tmpl__ +5 -0
- package/generators/app/files/project.json__tmpl__ +12 -1
- package/generators/app/files/src/tools/hello.tool.spec.ts__tmpl__ +10 -0
- package/generators/app/files/tsconfig.json__tmpl__ +11 -9
- package/generators/app/files/tsconfig.lib.json__tmpl__ +1 -2
- package/generators/app/files/tsconfig.spec.json__tmpl__ +3 -4
- package/generators/app/lib/normalize-options.d.ts +10 -1
- package/generators/app/lib/normalize-options.js +7 -2
- package/generators/app/lib/normalize-options.js.map +1 -1
- package/generators/app/schema.d.ts +2 -0
- package/generators/app/schema.js.map +1 -1
- package/generators/app/schema.json +5 -0
- package/generators/auth-provider/files/__fileName__.auth-provider.ts__tmpl__ +0 -1
- package/generators/flow/files/__fileName__.flow.ts__tmpl__ +54 -16
- package/generators/init/init.d.ts +4 -0
- package/generators/init/init.js +40 -0
- package/generators/init/init.js.map +1 -0
- package/generators/init/schema.d.ts +4 -0
- package/generators/init/schema.js +3 -0
- package/generators/init/schema.js.map +1 -0
- package/generators/init/schema.json +21 -0
- package/generators/lib/files/adapter/src/__fileName__.adapter.spec.ts__tmpl__ +9 -0
- package/generators/lib/files/generic/src/__fileName__.spec.ts__tmpl__ +7 -0
- package/generators/lib/files/plugin/src/__fileName__.plugin.spec.ts__tmpl__ +11 -0
- package/generators/lib/files/tool-register/src/__fileName__.tools.spec.ts__tmpl__ +14 -0
- package/generators/lib/lib/normalize-options.d.ts +6 -1
- package/generators/lib/lib/normalize-options.js +5 -2
- package/generators/lib/lib/normalize-options.js.map +1 -1
- package/generators/lib/lib-project-files/jest.config.cjs__tmpl__ +39 -0
- package/generators/lib/lib-project-files/project.json__tmpl__ +32 -0
- package/generators/lib/lib-project-files/tsconfig.json__tmpl__ +22 -0
- package/generators/lib/lib-project-files/tsconfig.lib.json__tmpl__ +11 -0
- package/generators/lib/lib-project-files/tsconfig.spec.json__tmpl__ +8 -0
- package/generators/lib/lib.d.ts +1 -1
- package/generators/lib/lib.js +52 -20
- package/generators/lib/lib.js.map +1 -1
- package/generators/plugin/files/__fileName__.plugin.ts__tmpl__ +9 -5
- package/generators/provider/files/__fileName__.provider.ts__tmpl__ +5 -9
- package/generators/provider/provider.d.ts +1 -1
- package/generators/provider/provider.js +3 -3
- package/generators/provider/provider.js.map +1 -1
- package/generators/server/files/common/package.json__tmpl__ +5 -0
- package/generators/server/files/common/project.json__tmpl__ +18 -3
- package/generators/server/files/common/src/main.ts__tmpl__ +2 -2
- package/generators/server/files/common/tsconfig.json__tmpl__ +11 -8
- package/generators/server/files/common/tsconfig.lib.json__tmpl__ +0 -1
- package/generators/server/files/lambda/template.yaml__tmpl__ +4 -2
- package/generators/server/files/node/Dockerfile.dockerignore__tmpl__ +10 -0
- package/generators/server/files/node/Dockerfile__tmpl__ +6 -1
- package/generators/server/files/node/docker-compose.yml__tmpl__ +1 -1
- package/generators/server/files/vercel/vercel.json__tmpl__ +3 -12
- package/generators/server/lib/normalize-options.d.ts +16 -1
- package/generators/server/lib/normalize-options.js +22 -3
- package/generators/server/lib/normalize-options.js.map +1 -1
- package/generators/server/server.d.ts +1 -1
- package/generators/server/server.js +9 -2
- package/generators/server/server.js.map +1 -1
- package/generators/ui-component/files/__className__/__className__.tsx__tmpl__ +0 -1
- package/generators/ui-component/ui-component.d.ts +1 -1
- package/generators/ui-component/ui-component.js +4 -1
- package/generators/ui-component/ui-component.js.map +1 -1
- package/generators/ui-page/ui-page.d.ts +1 -1
- package/generators/ui-page/ui-page.js +4 -1
- package/generators/ui-page/ui-page.js.map +1 -1
- package/generators/ui-shared/add-ui-entry.js +2 -12
- package/generators/ui-shared/add-ui-entry.js.map +1 -1
- package/generators/ui-shared/ensure-ui-package.d.ts +17 -0
- package/generators/ui-shared/ensure-ui-package.js +123 -0
- package/generators/ui-shared/ensure-ui-package.js.map +1 -0
- package/generators/ui-shell/files/__fileName__/__fileName__.shell.spec.ts__tmpl__ +2 -1
- package/generators/ui-shell/ui-shell.d.ts +1 -1
- package/generators/ui-shell/ui-shell.js +4 -1
- package/generators/ui-shell/ui-shell.js.map +1 -1
- package/generators/workspace/files/__dot__gitignore__tmpl__ +1 -0
- package/generators/workspace/files/nx.json__tmpl__ +15 -11
- package/generators/workspace/files/package.json__tmpl__ +3 -3
- package/generators/workspace/workspace.d.ts +1 -1
- package/generators/workspace/workspace.js +3 -2
- package/generators/workspace/workspace.js.map +1 -1
- package/generators.json +5 -0
- package/index.d.ts +1 -0
- package/index.js +3 -1
- package/index.js.map +1 -1
- package/package.json +2 -2
- package/utils/add-dependencies.d.ts +4 -2
- package/utils/add-dependencies.js +2 -2
- package/utils/add-dependencies.js.map +1 -1
- package/utils/normalize-options.js.map +1 -1
- package/utils/package-manager.d.ts +11 -0
- package/utils/package-manager.js +33 -0
- package/utils/package-manager.js.map +1 -0
- package/utils/project-paths.d.ts +40 -0
- package/utils/project-paths.js +103 -0
- package/utils/project-paths.js.map +1 -0
- package/utils/versions.d.ts +10 -0
- package/utils/versions.js +45 -5
- package/utils/versions.js.map +1 -1
- package/generators/app/files/jest.config.ts__tmpl__ +0 -23
- package/generators/lib/files/adapter/src/__fileName__.adapter.ts__tmpl__ +0 -19
- package/generators/lib/files/plugin/src/__fileName__.plugin.ts__tmpl__ +0 -19
- package/generators/server/files/node/__dot__dockerignore__tmpl__ +0 -8
|
@@ -2,15 +2,17 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.serverGenerator = serverGenerator;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
-
const devkit_1 = require("@nx/devkit");
|
|
6
5
|
const fs = tslib_1.__importStar(require("fs"));
|
|
7
6
|
const path_1 = require("path");
|
|
7
|
+
const devkit_1 = require("@nx/devkit");
|
|
8
|
+
const add_dependencies_js_1 = require("../../utils/add-dependencies.js");
|
|
9
|
+
const versions_js_1 = require("../../utils/versions.js");
|
|
8
10
|
const index_js_1 = require("./lib/index.js");
|
|
9
11
|
async function serverGenerator(tree, schema) {
|
|
10
12
|
return serverGeneratorInternal(tree, schema);
|
|
11
13
|
}
|
|
12
14
|
async function serverGeneratorInternal(tree, schema) {
|
|
13
|
-
const options = (0, index_js_1.normalizeOptions)(schema);
|
|
15
|
+
const options = (0, index_js_1.normalizeOptions)(tree, schema);
|
|
14
16
|
const templateVars = {
|
|
15
17
|
...options,
|
|
16
18
|
names: devkit_1.names,
|
|
@@ -27,9 +29,14 @@ async function serverGeneratorInternal(tree, schema) {
|
|
|
27
29
|
if (bundle !== 'none') {
|
|
28
30
|
scaffoldCatalogSkills(tree, options.projectRoot, options.deploymentTarget, bundle);
|
|
29
31
|
}
|
|
32
|
+
// The lambda build wraps the server with @codegenie/serverless-express and fails without it.
|
|
33
|
+
const installTask = options.deploymentTarget === 'lambda'
|
|
34
|
+
? (0, add_dependencies_js_1.addFrontmcpDependencies)(tree, (0, versions_js_1.getLambdaDependencies)(), {}, { keepExistingVersions: true })
|
|
35
|
+
: undefined;
|
|
30
36
|
if (!options.skipFormat) {
|
|
31
37
|
await (0, devkit_1.formatFiles)(tree);
|
|
32
38
|
}
|
|
39
|
+
return installTask;
|
|
33
40
|
}
|
|
34
41
|
function scaffoldCatalogSkills(tree, projectRoot, target, bundle) {
|
|
35
42
|
// Load skills catalog via @frontmcp/skills package at runtime
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../src/generators/server/server.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../src/generators/server/server.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport { join } from 'path';\n\nimport { formatFiles, generateFiles, names as nxNames, type GeneratorCallback, type Tree } from '@nx/devkit';\n\nimport { addFrontmcpDependencies } from '../../utils/add-dependencies.js';\nimport { getLambdaDependencies } from '../../utils/versions.js';\nimport { normalizeOptions } from './lib/index.js';\nimport type { ServerGeneratorSchema } from './schema.js';\n\nexport async function serverGenerator(tree: Tree, schema: ServerGeneratorSchema): Promise<GeneratorCallback | void> {\n return serverGeneratorInternal(tree, schema);\n}\n\nasync function serverGeneratorInternal(tree: Tree, schema: ServerGeneratorSchema): Promise<GeneratorCallback | void> {\n const options = normalizeOptions(tree, schema);\n\n const templateVars = {\n ...options,\n names: nxNames,\n tmpl: '',\n dot: '.',\n };\n\n // Generate common files (main.ts, project.json, tsconfig)\n generateFiles(tree, join(__dirname, 'files', 'common'), options.projectRoot, templateVars);\n\n // Generate target-specific files\n const targetDir = join(__dirname, 'files', options.deploymentTarget);\n generateFiles(tree, targetDir, options.projectRoot, templateVars);\n\n // Copy skills from catalog\n const bundle = schema.skills ?? 'recommended';\n if (bundle !== 'none') {\n scaffoldCatalogSkills(tree, options.projectRoot, options.deploymentTarget, bundle);\n }\n\n // The lambda build wraps the server with @codegenie/serverless-express and fails without it.\n const installTask =\n options.deploymentTarget === 'lambda'\n ? addFrontmcpDependencies(tree, getLambdaDependencies(), {}, { keepExistingVersions: true })\n : undefined;\n\n if (!options.skipFormat) {\n await formatFiles(tree);\n }\n\n return installTask;\n}\n\nfunction scaffoldCatalogSkills(tree: Tree, projectRoot: string, target: string, bundle: string): void {\n // Load skills catalog via @frontmcp/skills package at runtime\n let skills: {\n loadManifest: () => {\n skills: Array<{ name: string; path: string; targets: string[]; hasResources: boolean; bundle?: string[] }>;\n };\n resolveSkillPath: (entry: { path: string }) => string;\n getSkillsByTarget: (\n s: Array<{ targets: string[] }>,\n t: string,\n ) => Array<{ name: string; path: string; targets: string[]; hasResources: boolean; bundle?: string[] }>;\n getSkillsByBundle: (\n s: Array<{ bundle?: string[] }>,\n b: string,\n ) => Array<{ name: string; path: string; targets: string[]; hasResources: boolean; bundle?: string[] }>;\n };\n try {\n skills = require('@frontmcp/skills');\n } catch {\n return;\n }\n\n let manifest;\n try {\n manifest = skills.loadManifest();\n } catch {\n return;\n }\n\n const targetFiltered = skills.getSkillsByTarget(manifest.skills, target);\n const matchingSkills = skills.getSkillsByBundle(targetFiltered, bundle);\n\n for (const skill of matchingSkills) {\n const sourceDir = skills.resolveSkillPath(skill);\n const destDir = join(projectRoot, 'skills', skill.name);\n copyDirToTree(tree, sourceDir, destDir);\n }\n}\n\nfunction copyDirToTree(tree: Tree, sourceDir: string, destDir: string): void {\n if (!fs.existsSync(sourceDir)) return;\n const entries = fs.readdirSync(sourceDir, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = join(sourceDir, entry.name);\n const destPath = join(destDir, entry.name);\n if (entry.isDirectory()) {\n copyDirToTree(tree, srcPath, destPath);\n } else {\n const content = fs.readFileSync(srcPath);\n tree.write(destPath, content);\n }\n }\n}\n\nexport default serverGenerator;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type GeneratorCallback, type Tree } from '@nx/devkit';
|
|
2
2
|
import type { UiComponentGeneratorSchema } from './schema.js';
|
|
3
3
|
export declare function uiComponentGenerator(tree: Tree, schema: UiComponentGeneratorSchema): Promise<GeneratorCallback | void>;
|
|
4
4
|
export default uiComponentGenerator;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.uiComponentGenerator = uiComponentGenerator;
|
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
|
5
4
|
const path_1 = require("path");
|
|
5
|
+
const devkit_1 = require("@nx/devkit");
|
|
6
6
|
const add_ui_entry_js_1 = require("../ui-shared/add-ui-entry.js");
|
|
7
|
+
const ensure_ui_package_js_1 = require("../ui-shared/ensure-ui-package.js");
|
|
7
8
|
const PACKAGE_ROOT = 'ui/components';
|
|
8
9
|
const IMPORT_PATH = '@frontmcp/ui-components';
|
|
9
10
|
async function uiComponentGenerator(tree, schema) {
|
|
@@ -12,6 +13,7 @@ async function uiComponentGenerator(tree, schema) {
|
|
|
12
13
|
throw new Error('Generator name must not be blank');
|
|
13
14
|
}
|
|
14
15
|
const { className } = (0, devkit_1.names)(trimmedName);
|
|
16
|
+
const installTask = (0, ensure_ui_package_js_1.ensureUiPackage)(tree, { packageRoot: PACKAGE_ROOT, projectName: 'ui-components', kind: 'react' });
|
|
15
17
|
// Generate component files from templates
|
|
16
18
|
(0, devkit_1.generateFiles)(tree, (0, path_1.join)(__dirname, 'files'), `${PACKAGE_ROOT}/src`, {
|
|
17
19
|
className,
|
|
@@ -28,6 +30,7 @@ async function uiComponentGenerator(tree, schema) {
|
|
|
28
30
|
if (!schema.skipFormat) {
|
|
29
31
|
await (0, devkit_1.formatFiles)(tree);
|
|
30
32
|
}
|
|
33
|
+
return installTask;
|
|
31
34
|
}
|
|
32
35
|
exports.default = uiComponentGenerator;
|
|
33
36
|
//# sourceMappingURL=ui-component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-component.js","sourceRoot":"","sources":["../../../../src/generators/ui-component/ui-component.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"ui-component.js","sourceRoot":"","sources":["../../../../src/generators/ui-component/ui-component.ts"],"names":[],"mappings":";;AAWA,oDAiCC;AA5CD,+BAA4B;AAE5B,uCAAkG;AAElG,kEAA0D;AAC1D,4EAAoE;AAGpE,MAAM,YAAY,GAAG,eAAe,CAAC;AACrC,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAEvC,KAAK,UAAU,oBAAoB,CACxC,IAAU,EACV,MAAkC;IAElC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,cAAK,EAAC,WAAW,CAAC,CAAC;IAEzC,MAAM,WAAW,GAAG,IAAA,sCAAe,EAAC,IAAI,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAEtH,0CAA0C;IAC1C,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAA,WAAI,EAAC,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,YAAY,MAAM,EAAE;QACnE,SAAS;QACT,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;QACrC,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,2EAA2E;IAC3E,IAAA,4BAAU,EAAC,IAAI,EAAE;QACf,WAAW,EAAE,YAAY;QACzB,SAAS,EAAE,SAAS;QACpB,UAAU,EAAE,WAAW;KACxB,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,kBAAe,oBAAoB,CAAC","sourcesContent":["import { join } from 'path';\n\nimport { formatFiles, generateFiles, names, type GeneratorCallback, type Tree } from '@nx/devkit';\n\nimport { addUiEntry } from '../ui-shared/add-ui-entry.js';\nimport { ensureUiPackage } from '../ui-shared/ensure-ui-package.js';\nimport type { UiComponentGeneratorSchema } from './schema.js';\n\nconst PACKAGE_ROOT = 'ui/components';\nconst IMPORT_PATH = '@frontmcp/ui-components';\n\nexport async function uiComponentGenerator(\n tree: Tree,\n schema: UiComponentGeneratorSchema,\n): Promise<GeneratorCallback | void> {\n const trimmedName = schema.name?.trim();\n if (!trimmedName) {\n throw new Error('Generator name must not be blank');\n }\n\n const { className } = names(trimmedName);\n\n const installTask = ensureUiPackage(tree, { packageRoot: PACKAGE_ROOT, projectName: 'ui-components', kind: 'react' });\n\n // Generate component files from templates\n generateFiles(tree, join(__dirname, 'files'), `${PACKAGE_ROOT}/src`, {\n className,\n name: schema.name,\n description: schema.description ?? '',\n tmpl: '',\n });\n\n // Add entry point to project.json, tsconfig.base.json, and barrel index.ts\n addUiEntry(tree, {\n packageRoot: PACKAGE_ROOT,\n entryName: className,\n importPath: IMPORT_PATH,\n });\n\n if (!schema.skipFormat) {\n await formatFiles(tree);\n }\n\n return installTask;\n}\n\nexport default uiComponentGenerator;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type GeneratorCallback, type Tree } from '@nx/devkit';
|
|
2
2
|
import type { UiPageGeneratorSchema } from './schema.js';
|
|
3
3
|
export declare function uiPageGenerator(tree: Tree, schema: UiPageGeneratorSchema): Promise<GeneratorCallback | void>;
|
|
4
4
|
export default uiPageGenerator;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.uiPageGenerator = uiPageGenerator;
|
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
|
5
4
|
const path_1 = require("path");
|
|
5
|
+
const devkit_1 = require("@nx/devkit");
|
|
6
6
|
const add_ui_entry_js_1 = require("../ui-shared/add-ui-entry.js");
|
|
7
|
+
const ensure_ui_package_js_1 = require("../ui-shared/ensure-ui-package.js");
|
|
7
8
|
const PACKAGE_ROOT = 'ui/pages';
|
|
8
9
|
const IMPORT_PATH = '@frontmcp/ui-pages';
|
|
9
10
|
async function uiPageGenerator(tree, schema) {
|
|
@@ -12,6 +13,7 @@ async function uiPageGenerator(tree, schema) {
|
|
|
12
13
|
throw new Error('Generator name must not be blank');
|
|
13
14
|
}
|
|
14
15
|
const { className } = (0, devkit_1.names)(trimmedName);
|
|
16
|
+
const installTask = (0, ensure_ui_package_js_1.ensureUiPackage)(tree, { packageRoot: PACKAGE_ROOT, projectName: 'ui-pages', kind: 'react' });
|
|
15
17
|
// Generate page files from templates
|
|
16
18
|
(0, devkit_1.generateFiles)(tree, (0, path_1.join)(__dirname, 'files'), `${PACKAGE_ROOT}/src`, {
|
|
17
19
|
className,
|
|
@@ -28,6 +30,7 @@ async function uiPageGenerator(tree, schema) {
|
|
|
28
30
|
if (!schema.skipFormat) {
|
|
29
31
|
await (0, devkit_1.formatFiles)(tree);
|
|
30
32
|
}
|
|
33
|
+
return installTask;
|
|
31
34
|
}
|
|
32
35
|
exports.default = uiPageGenerator;
|
|
33
36
|
//# sourceMappingURL=ui-page.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-page.js","sourceRoot":"","sources":["../../../../src/generators/ui-page/ui-page.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"ui-page.js","sourceRoot":"","sources":["../../../../src/generators/ui-page/ui-page.ts"],"names":[],"mappings":";;AAWA,0CA8BC;AAzCD,+BAA4B;AAE5B,uCAAkG;AAElG,kEAA0D;AAC1D,4EAAoE;AAGpE,MAAM,YAAY,GAAG,UAAU,CAAC;AAChC,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAElC,KAAK,UAAU,eAAe,CAAC,IAAU,EAAE,MAA6B;IAC7E,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,cAAK,EAAC,WAAW,CAAC,CAAC;IAEzC,MAAM,WAAW,GAAG,IAAA,sCAAe,EAAC,IAAI,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAEjH,qCAAqC;IACrC,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAA,WAAI,EAAC,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,YAAY,MAAM,EAAE;QACnE,SAAS;QACT,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;QACrC,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,2EAA2E;IAC3E,IAAA,4BAAU,EAAC,IAAI,EAAE;QACf,WAAW,EAAE,YAAY;QACzB,SAAS,EAAE,SAAS;QACpB,UAAU,EAAE,WAAW;KACxB,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,kBAAe,eAAe,CAAC","sourcesContent":["import { join } from 'path';\n\nimport { formatFiles, generateFiles, names, type GeneratorCallback, type Tree } from '@nx/devkit';\n\nimport { addUiEntry } from '../ui-shared/add-ui-entry.js';\nimport { ensureUiPackage } from '../ui-shared/ensure-ui-package.js';\nimport type { UiPageGeneratorSchema } from './schema.js';\n\nconst PACKAGE_ROOT = 'ui/pages';\nconst IMPORT_PATH = '@frontmcp/ui-pages';\n\nexport async function uiPageGenerator(tree: Tree, schema: UiPageGeneratorSchema): Promise<GeneratorCallback | void> {\n const trimmedName = schema.name?.trim();\n if (!trimmedName) {\n throw new Error('Generator name must not be blank');\n }\n\n const { className } = names(trimmedName);\n\n const installTask = ensureUiPackage(tree, { packageRoot: PACKAGE_ROOT, projectName: 'ui-pages', kind: 'react' });\n\n // Generate page files from templates\n generateFiles(tree, join(__dirname, 'files'), `${PACKAGE_ROOT}/src`, {\n className,\n name: schema.name,\n description: schema.description ?? '',\n tmpl: '',\n });\n\n // Add entry point to project.json, tsconfig.base.json, and barrel index.ts\n addUiEntry(tree, {\n packageRoot: PACKAGE_ROOT,\n entryName: className,\n importPath: IMPORT_PATH,\n });\n\n if (!schema.skipFormat) {\n await formatFiles(tree);\n }\n\n return installTask;\n}\n\nexport default uiPageGenerator;\n"]}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.addUiEntry = addUiEntry;
|
|
4
4
|
const devkit_1 = require("@nx/devkit");
|
|
5
|
+
const project_paths_js_1 = require("../../utils/project-paths.js");
|
|
5
6
|
function escapeRegExp(str) {
|
|
6
7
|
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
7
8
|
}
|
|
@@ -33,18 +34,7 @@ function addUiEntry(tree, options) {
|
|
|
33
34
|
// 2. Update tsconfig.base.json — add explicit path alias
|
|
34
35
|
// The wildcard alias already covers resolution, but adding an explicit
|
|
35
36
|
// entry improves IDE completion and Nx dep graph accuracy.
|
|
36
|
-
|
|
37
|
-
(0, devkit_1.updateJson)(tree, 'tsconfig.base.json', (json) => {
|
|
38
|
-
const paths = json.compilerOptions?.paths ?? {};
|
|
39
|
-
const aliasKey = `${importPath}/${entryName}`;
|
|
40
|
-
if (!paths[aliasKey]) {
|
|
41
|
-
paths[aliasKey] = [`${packageRoot}/src/${entryName}/index.ts`];
|
|
42
|
-
}
|
|
43
|
-
json.compilerOptions = json.compilerOptions ?? {};
|
|
44
|
-
json.compilerOptions.paths = paths;
|
|
45
|
-
return json;
|
|
46
|
-
});
|
|
47
|
-
}
|
|
37
|
+
(0, project_paths_js_1.addTsPathAlias)(tree, `${importPath}/${entryName}`, entryPath, { overwrite: false });
|
|
48
38
|
// 3. Add re-export to barrel index.ts
|
|
49
39
|
const barrelPath = `${packageRoot}/src/index.ts`;
|
|
50
40
|
if (tree.exists(barrelPath)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-ui-entry.js","sourceRoot":"","sources":["../../../../src/generators/ui-shared/add-ui-entry.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"add-ui-entry.js","sourceRoot":"","sources":["../../../../src/generators/ui-shared/add-ui-entry.ts"],"names":[],"mappings":";;AAuBA,gCAqCC;AA5DD,uCAAmD;AAEnD,mEAA8D;AAE9D,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAWD;;;;;GAKG;AACH,SAAgB,UAAU,CAAC,IAAU,EAAE,OAA0B;IAC/D,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACvD,MAAM,SAAS,GAAG,GAAG,WAAW,QAAQ,SAAS,WAAW,CAAC;IAE7D,mFAAmF;IACnF,MAAM,eAAe,GAAG,GAAG,WAAW,eAAe,CAAC;IACtD,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,IAAA,mBAAU,EAAC,IAAI,EAAE,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE;YACzC,KAAK,MAAM,MAAM,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;gBAChD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;gBAC7C,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,IAAI,EAAE,CAAC;oBAC9D,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBACpD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,yDAAyD;IACzD,0EAA0E;IAC1E,8DAA8D;IAC9D,IAAA,iCAAc,EAAC,IAAI,EAAE,GAAG,UAAU,IAAI,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAEpF,sCAAsC;IACtC,MAAM,UAAU,GAAG,GAAG,WAAW,eAAe,CAAC;IACjD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,UAAU,GAAG,oBAAoB,SAAS,MAAM,CAAC;QACvD,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,yBAAyB,YAAY,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;YAC3F,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { updateJson, type Tree } from '@nx/devkit';\n\nimport { addTsPathAlias } from '../../utils/project-paths.js';\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport interface AddUiEntryOptions {\n /** The UI package root, e.g. 'ui/components' */\n packageRoot: string;\n /** The entry name, e.g. 'LoginForm' or 'admin-dashboard' */\n entryName: string;\n /** The npm scope name, e.g. '@frontmcp/ui-components' */\n importPath: string;\n}\n\n/**\n * Adds an entry point to an existing UI package:\n * 1. Updates project.json `additionalEntryPoints` in both build-cjs and build-esm\n * 2. Updates tsconfig.base.json path aliases (wildcard already covers it, but explicit is fine)\n * 3. Adds re-export to the barrel index.ts\n */\nexport function addUiEntry(tree: Tree, options: AddUiEntryOptions): void {\n const { packageRoot, entryName, importPath } = options;\n const entryPath = `${packageRoot}/src/${entryName}/index.ts`;\n\n // 1. Update project.json — add to additionalEntryPoints in build-cjs and build-esm\n const projectJsonPath = `${packageRoot}/project.json`;\n if (tree.exists(projectJsonPath)) {\n updateJson(tree, projectJsonPath, (json) => {\n for (const target of ['build-cjs', 'build-esm']) {\n const opts = json.targets?.[target]?.options;\n if (opts) {\n opts.additionalEntryPoints = opts.additionalEntryPoints ?? [];\n if (!opts.additionalEntryPoints.includes(entryPath)) {\n opts.additionalEntryPoints.push(entryPath);\n }\n }\n }\n return json;\n });\n }\n\n // 2. Update tsconfig.base.json — add explicit path alias\n // The wildcard alias already covers resolution, but adding an explicit\n // entry improves IDE completion and Nx dep graph accuracy.\n addTsPathAlias(tree, `${importPath}/${entryName}`, entryPath, { overwrite: false });\n\n // 3. Add re-export to barrel index.ts\n const barrelPath = `${packageRoot}/src/index.ts`;\n if (tree.exists(barrelPath)) {\n const existing = tree.read(barrelPath, 'utf-8') ?? '';\n const exportLine = `export * from './${entryName}';\\n`;\n const duplicatePattern = new RegExp(`^export \\\\* from '\\\\./${escapeRegExp(entryName)}';?$`, 'm');\n if (!duplicatePattern.test(existing)) {\n const normalized = existing.endsWith('\\n') || existing === '' ? existing : existing + '\\n';\n tree.write(barrelPath, normalized + exportLine);\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type GeneratorCallback, type Tree } from '@nx/devkit';
|
|
2
|
+
export interface EnsureUiPackageOptions {
|
|
3
|
+
/** e.g. 'ui/components' */
|
|
4
|
+
packageRoot: string;
|
|
5
|
+
/** Nx project name for a package that does not exist yet, e.g. 'ui-components' */
|
|
6
|
+
projectName: string;
|
|
7
|
+
/** 'react' packages render components and are tested in jsdom; 'shell' packages only build HTML strings. */
|
|
8
|
+
kind: 'react' | 'shell';
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The UI generators emit `.tsx` files that import React and MUI (or the uipack
|
|
12
|
+
* shell builder), and a spec that renders them. Nothing else installs those, so
|
|
13
|
+
* the generators add them — and create the package folder when the workspace
|
|
14
|
+
* does not have one yet, instead of writing files into a folder that no Nx
|
|
15
|
+
* project owns.
|
|
16
|
+
*/
|
|
17
|
+
export declare function ensureUiPackage(tree: Tree, options: EnsureUiPackageOptions): GeneratorCallback;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ensureUiPackage = ensureUiPackage;
|
|
4
|
+
const devkit_1 = require("@nx/devkit");
|
|
5
|
+
const add_dependencies_js_1 = require("../../utils/add-dependencies.js");
|
|
6
|
+
const project_paths_js_1 = require("../../utils/project-paths.js");
|
|
7
|
+
const versions_js_1 = require("../../utils/versions.js");
|
|
8
|
+
const REACT_DEPENDENCIES = {
|
|
9
|
+
react: '^19.0.0',
|
|
10
|
+
'react-dom': '^19.0.0',
|
|
11
|
+
'@mui/material': '^7.0.0',
|
|
12
|
+
'@emotion/react': '^11.14.0',
|
|
13
|
+
'@emotion/styled': '^11.14.0',
|
|
14
|
+
};
|
|
15
|
+
const REACT_DEV_DEPENDENCIES = {
|
|
16
|
+
'@types/react': '^19.0.0',
|
|
17
|
+
'@types/react-dom': '^19.0.0',
|
|
18
|
+
'@testing-library/dom': '^10.4.0',
|
|
19
|
+
'@testing-library/react': '^16.0.0',
|
|
20
|
+
'jest-environment-jsdom': '^30.0.2',
|
|
21
|
+
};
|
|
22
|
+
function buildTargets(packageRoot) {
|
|
23
|
+
const common = {
|
|
24
|
+
main: `${packageRoot}/src/index.ts`,
|
|
25
|
+
tsConfig: `${packageRoot}/tsconfig.json`,
|
|
26
|
+
bundle: true,
|
|
27
|
+
thirdParty: false,
|
|
28
|
+
platform: 'node',
|
|
29
|
+
additionalEntryPoints: [],
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
'build-cjs': {
|
|
33
|
+
executor: '@nx/esbuild:esbuild',
|
|
34
|
+
outputs: ['{options.outputPath}'],
|
|
35
|
+
options: { ...common, outputPath: `dist/${packageRoot}`, format: ['cjs'], declaration: true },
|
|
36
|
+
},
|
|
37
|
+
'build-esm': {
|
|
38
|
+
executor: '@nx/esbuild:esbuild',
|
|
39
|
+
dependsOn: ['build-cjs'],
|
|
40
|
+
outputs: ['{options.outputPath}'],
|
|
41
|
+
options: {
|
|
42
|
+
...common,
|
|
43
|
+
outputPath: `dist/${packageRoot}/esm`,
|
|
44
|
+
format: ['esm'],
|
|
45
|
+
declaration: false,
|
|
46
|
+
esbuildOptions: { outExtension: { '.js': '.mjs' } },
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
build: {
|
|
50
|
+
executor: 'nx:noop',
|
|
51
|
+
dependsOn: ['build-cjs', 'build-esm'],
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The UI generators emit `.tsx` files that import React and MUI (or the uipack
|
|
57
|
+
* shell builder), and a spec that renders them. Nothing else installs those, so
|
|
58
|
+
* the generators add them — and create the package folder when the workspace
|
|
59
|
+
* does not have one yet, instead of writing files into a folder that no Nx
|
|
60
|
+
* project owns.
|
|
61
|
+
*/
|
|
62
|
+
function ensureUiPackage(tree, options) {
|
|
63
|
+
const { packageRoot, projectName, kind } = options;
|
|
64
|
+
if (!tree.exists(`${packageRoot}/project.json`)) {
|
|
65
|
+
const offset = (0, devkit_1.offsetFromRoot)(packageRoot);
|
|
66
|
+
// `customConditions` (Nx solution workspaces set it) is only valid with a modern `moduleResolution`
|
|
67
|
+
// (TS5098), so a package that inherits it must inherit the base's `module`/`moduleResolution` too.
|
|
68
|
+
const inheritsModernResolution = Boolean(tree.exists('tsconfig.base.json') &&
|
|
69
|
+
(0, devkit_1.readJson)(tree, 'tsconfig.base.json').compilerOptions
|
|
70
|
+
?.customConditions);
|
|
71
|
+
(0, devkit_1.writeJson)(tree, `${packageRoot}/project.json`, {
|
|
72
|
+
name: projectName,
|
|
73
|
+
$schema: `${offset}node_modules/nx/schemas/project-schema.json`,
|
|
74
|
+
sourceRoot: `${packageRoot}/src`,
|
|
75
|
+
projectType: 'library',
|
|
76
|
+
tags: [],
|
|
77
|
+
targets: buildTargets(packageRoot),
|
|
78
|
+
});
|
|
79
|
+
(0, devkit_1.writeJson)(tree, `${packageRoot}/tsconfig.json`, {
|
|
80
|
+
extends: `${offset}tsconfig.base.json`,
|
|
81
|
+
compilerOptions: {
|
|
82
|
+
...(!inheritsModernResolution && { module: 'commonjs', moduleResolution: (0, project_paths_js_1.getModuleResolution)(tree) }),
|
|
83
|
+
...(kind === 'react' && { jsx: 'react-jsx' }),
|
|
84
|
+
esModuleInterop: true,
|
|
85
|
+
strict: true,
|
|
86
|
+
},
|
|
87
|
+
include: ['src/**/*.ts', 'src/**/*.tsx'],
|
|
88
|
+
exclude: ['src/**/*.spec.ts', 'src/**/*.spec.tsx'],
|
|
89
|
+
});
|
|
90
|
+
tree.write(`${packageRoot}/jest.config.cjs`, `module.exports = {
|
|
91
|
+
displayName: '${projectName}',
|
|
92
|
+
testEnvironment: '${kind === 'react' ? 'jsdom' : 'node'}',
|
|
93
|
+
transform: {
|
|
94
|
+
'^.+\\\\.[tj]sx?$': ['@swc/jest', {
|
|
95
|
+
jsc: {
|
|
96
|
+
target: 'es2022',
|
|
97
|
+
parser: { syntax: 'typescript', tsx: true },
|
|
98
|
+
transform: { react: { runtime: 'automatic' } },
|
|
99
|
+
},
|
|
100
|
+
swcrc: false,
|
|
101
|
+
}],
|
|
102
|
+
},
|
|
103
|
+
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
|
|
104
|
+
};
|
|
105
|
+
`);
|
|
106
|
+
if (!tree.exists(`${packageRoot}/src/index.ts`)) {
|
|
107
|
+
tree.write(`${packageRoot}/src/index.ts`, '');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const range = `~${(0, versions_js_1.getFrontmcpVersion)()}`;
|
|
111
|
+
const { esbuild, ...buildDevDependencies } = (0, versions_js_1.getUiBuildDevDependencies)();
|
|
112
|
+
const installUiDependencies = kind === 'react'
|
|
113
|
+
? (0, add_dependencies_js_1.addFrontmcpDependencies)(tree, REACT_DEPENDENCIES, { ...REACT_DEV_DEPENDENCIES, ...buildDevDependencies }, { keepExistingVersions: true })
|
|
114
|
+
: (0, add_dependencies_js_1.addFrontmcpDependencies)(tree, { '@frontmcp/uipack': range }, buildDevDependencies, {
|
|
115
|
+
keepExistingVersions: true,
|
|
116
|
+
});
|
|
117
|
+
// An existing esbuild range is raised rather than kept when it is older than ours: the `^0.25.0` earlier
|
|
118
|
+
// versions of these generators wrote is below the `>=0.27` peer range of @frontmcp/uipack (npm ERESOLVE).
|
|
119
|
+
// A range at or above ours stays, in whichever section it is in.
|
|
120
|
+
const installEsbuild = (0, add_dependencies_js_1.addFrontmcpDependencies)(tree, {}, { esbuild }, { keepExistingVersions: false });
|
|
121
|
+
return (0, devkit_1.runTasksInSerial)(installUiDependencies, installEsbuild);
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=ensure-ui-package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-ui-package.js","sourceRoot":"","sources":["../../../../src/generators/ui-shared/ensure-ui-package.ts"],"names":[],"mappings":"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","sourcesContent":["import { offsetFromRoot, readJson, runTasksInSerial, writeJson, type GeneratorCallback, type Tree } from '@nx/devkit';\n\nimport { addFrontmcpDependencies } from '../../utils/add-dependencies.js';\nimport { getModuleResolution } from '../../utils/project-paths.js';\nimport { getFrontmcpVersion, getUiBuildDevDependencies } from '../../utils/versions.js';\n\nexport interface EnsureUiPackageOptions {\n /** e.g. 'ui/components' */\n packageRoot: string;\n /** Nx project name for a package that does not exist yet, e.g. 'ui-components' */\n projectName: string;\n /** 'react' packages render components and are tested in jsdom; 'shell' packages only build HTML strings. */\n kind: 'react' | 'shell';\n}\n\nconst REACT_DEPENDENCIES: Record<string, string> = {\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n '@mui/material': '^7.0.0',\n '@emotion/react': '^11.14.0',\n '@emotion/styled': '^11.14.0',\n};\n\nconst REACT_DEV_DEPENDENCIES: Record<string, string> = {\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n '@testing-library/dom': '^10.4.0',\n '@testing-library/react': '^16.0.0',\n 'jest-environment-jsdom': '^30.0.2',\n};\n\nfunction buildTargets(packageRoot: string): Record<string, unknown> {\n const common = {\n main: `${packageRoot}/src/index.ts`,\n tsConfig: `${packageRoot}/tsconfig.json`,\n bundle: true,\n thirdParty: false,\n platform: 'node',\n additionalEntryPoints: [] as string[],\n };\n return {\n 'build-cjs': {\n executor: '@nx/esbuild:esbuild',\n outputs: ['{options.outputPath}'],\n options: { ...common, outputPath: `dist/${packageRoot}`, format: ['cjs'], declaration: true },\n },\n 'build-esm': {\n executor: '@nx/esbuild:esbuild',\n dependsOn: ['build-cjs'],\n outputs: ['{options.outputPath}'],\n options: {\n ...common,\n outputPath: `dist/${packageRoot}/esm`,\n format: ['esm'],\n declaration: false,\n esbuildOptions: { outExtension: { '.js': '.mjs' } },\n },\n },\n build: {\n executor: 'nx:noop',\n dependsOn: ['build-cjs', 'build-esm'],\n },\n };\n}\n\n/**\n * The UI generators emit `.tsx` files that import React and MUI (or the uipack\n * shell builder), and a spec that renders them. Nothing else installs those, so\n * the generators add them — and create the package folder when the workspace\n * does not have one yet, instead of writing files into a folder that no Nx\n * project owns.\n */\nexport function ensureUiPackage(tree: Tree, options: EnsureUiPackageOptions): GeneratorCallback {\n const { packageRoot, projectName, kind } = options;\n\n if (!tree.exists(`${packageRoot}/project.json`)) {\n const offset = offsetFromRoot(packageRoot);\n // `customConditions` (Nx solution workspaces set it) is only valid with a modern `moduleResolution`\n // (TS5098), so a package that inherits it must inherit the base's `module`/`moduleResolution` too.\n const inheritsModernResolution = Boolean(\n tree.exists('tsconfig.base.json') &&\n readJson<{ compilerOptions?: { customConditions?: unknown } }>(tree, 'tsconfig.base.json').compilerOptions\n ?.customConditions,\n );\n writeJson(tree, `${packageRoot}/project.json`, {\n name: projectName,\n $schema: `${offset}node_modules/nx/schemas/project-schema.json`,\n sourceRoot: `${packageRoot}/src`,\n projectType: 'library',\n tags: [],\n targets: buildTargets(packageRoot),\n });\n writeJson(tree, `${packageRoot}/tsconfig.json`, {\n extends: `${offset}tsconfig.base.json`,\n compilerOptions: {\n ...(!inheritsModernResolution && { module: 'commonjs', moduleResolution: getModuleResolution(tree) }),\n ...(kind === 'react' && { jsx: 'react-jsx' }),\n esModuleInterop: true,\n strict: true,\n },\n include: ['src/**/*.ts', 'src/**/*.tsx'],\n exclude: ['src/**/*.spec.ts', 'src/**/*.spec.tsx'],\n });\n tree.write(\n `${packageRoot}/jest.config.cjs`,\n `module.exports = {\n displayName: '${projectName}',\n testEnvironment: '${kind === 'react' ? 'jsdom' : 'node'}',\n transform: {\n '^.+\\\\\\\\.[tj]sx?$': ['@swc/jest', {\n jsc: {\n target: 'es2022',\n parser: { syntax: 'typescript', tsx: true },\n transform: { react: { runtime: 'automatic' } },\n },\n swcrc: false,\n }],\n },\n moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],\n};\n`,\n );\n if (!tree.exists(`${packageRoot}/src/index.ts`)) {\n tree.write(`${packageRoot}/src/index.ts`, '');\n }\n }\n\n const range = `~${getFrontmcpVersion()}`;\n const { esbuild, ...buildDevDependencies } = getUiBuildDevDependencies();\n const installUiDependencies =\n kind === 'react'\n ? addFrontmcpDependencies(\n tree,\n REACT_DEPENDENCIES,\n { ...REACT_DEV_DEPENDENCIES, ...buildDevDependencies },\n { keepExistingVersions: true },\n )\n : addFrontmcpDependencies(tree, { '@frontmcp/uipack': range }, buildDevDependencies, {\n keepExistingVersions: true,\n });\n // An existing esbuild range is raised rather than kept when it is older than ours: the `^0.25.0` earlier\n // versions of these generators wrote is below the `>=0.27` peer range of @frontmcp/uipack (npm ERESOLVE).\n // A range at or above ours stays, in whichever section it is in.\n const installEsbuild = addFrontmcpDependencies(tree, {}, { esbuild }, { keepExistingVersions: false });\n return runTasksInSerial(installUiDependencies, installEsbuild);\n}\n"]}
|
|
@@ -11,6 +11,7 @@ describe('build<%= className %>Shell', () => {
|
|
|
11
11
|
|
|
12
12
|
it('should return an HTML string', () => {
|
|
13
13
|
const result = build<%= className %>Shell({ toolName: 'test' });
|
|
14
|
-
expect(typeof result).toBe('string');
|
|
14
|
+
expect(typeof result.html).toBe('string');
|
|
15
|
+
expect(result.html).toContain('test');
|
|
15
16
|
});
|
|
16
17
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type GeneratorCallback, type Tree } from '@nx/devkit';
|
|
2
2
|
import type { UiShellGeneratorSchema } from './schema.js';
|
|
3
3
|
export declare function uiShellGenerator(tree: Tree, schema: UiShellGeneratorSchema): Promise<GeneratorCallback | void>;
|
|
4
4
|
export default uiShellGenerator;
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.uiShellGenerator = uiShellGenerator;
|
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
|
5
4
|
const path_1 = require("path");
|
|
5
|
+
const devkit_1 = require("@nx/devkit");
|
|
6
6
|
const add_ui_entry_js_1 = require("../ui-shared/add-ui-entry.js");
|
|
7
|
+
const ensure_ui_package_js_1 = require("../ui-shared/ensure-ui-package.js");
|
|
7
8
|
const PACKAGE_ROOT = 'ui/shells';
|
|
8
9
|
const IMPORT_PATH = '@frontmcp/ui-shells';
|
|
9
10
|
async function uiShellGenerator(tree, schema) {
|
|
10
11
|
const { className, fileName } = (0, devkit_1.names)(schema.name);
|
|
12
|
+
const installTask = (0, ensure_ui_package_js_1.ensureUiPackage)(tree, { packageRoot: PACKAGE_ROOT, projectName: 'ui-shells', kind: 'shell' });
|
|
11
13
|
// Generate shell files from templates (kebab-case naming)
|
|
12
14
|
(0, devkit_1.generateFiles)(tree, (0, path_1.join)(__dirname, 'files'), `${PACKAGE_ROOT}/src`, {
|
|
13
15
|
className,
|
|
@@ -25,6 +27,7 @@ async function uiShellGenerator(tree, schema) {
|
|
|
25
27
|
if (!schema.skipFormat) {
|
|
26
28
|
await (0, devkit_1.formatFiles)(tree);
|
|
27
29
|
}
|
|
30
|
+
return installTask;
|
|
28
31
|
}
|
|
29
32
|
exports.default = uiShellGenerator;
|
|
30
33
|
//# sourceMappingURL=ui-shell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-shell.js","sourceRoot":"","sources":["../../../../src/generators/ui-shell/ui-shell.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"ui-shell.js","sourceRoot":"","sources":["../../../../src/generators/ui-shell/ui-shell.ts"],"names":[],"mappings":";;AAWA,4CA0BC;AArCD,+BAA4B;AAE5B,uCAAkG;AAElG,kEAA0D;AAC1D,4EAAoE;AAGpE,MAAM,YAAY,GAAG,WAAW,CAAC;AACjC,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAEnC,KAAK,UAAU,gBAAgB,CAAC,IAAU,EAAE,MAA8B;IAC/E,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAA,cAAK,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEnD,MAAM,WAAW,GAAG,IAAA,sCAAe,EAAC,IAAI,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAElH,0DAA0D;IAC1D,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAA,WAAI,EAAC,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,YAAY,MAAM,EAAE;QACnE,SAAS;QACT,QAAQ;QACR,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;QACrC,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,2EAA2E;IAC3E,IAAA,4BAAU,EAAC,IAAI,EAAE;QACf,WAAW,EAAE,YAAY;QACzB,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,WAAW;KACxB,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,kBAAe,gBAAgB,CAAC","sourcesContent":["import { join } from 'path';\n\nimport { formatFiles, generateFiles, names, type GeneratorCallback, type Tree } from '@nx/devkit';\n\nimport { addUiEntry } from '../ui-shared/add-ui-entry.js';\nimport { ensureUiPackage } from '../ui-shared/ensure-ui-package.js';\nimport type { UiShellGeneratorSchema } from './schema.js';\n\nconst PACKAGE_ROOT = 'ui/shells';\nconst IMPORT_PATH = '@frontmcp/ui-shells';\n\nexport async function uiShellGenerator(tree: Tree, schema: UiShellGeneratorSchema): Promise<GeneratorCallback | void> {\n const { className, fileName } = names(schema.name);\n\n const installTask = ensureUiPackage(tree, { packageRoot: PACKAGE_ROOT, projectName: 'ui-shells', kind: 'shell' });\n\n // Generate shell files from templates (kebab-case naming)\n generateFiles(tree, join(__dirname, 'files'), `${PACKAGE_ROOT}/src`, {\n className,\n fileName,\n name: schema.name,\n description: schema.description ?? '',\n tmpl: '',\n });\n\n // Add entry point to project.json, tsconfig.base.json, and barrel index.ts\n addUiEntry(tree, {\n packageRoot: PACKAGE_ROOT,\n entryName: fileName,\n importPath: IMPORT_PATH,\n });\n\n if (!schema.skipFormat) {\n await formatFiles(tree);\n }\n\n return installTask;\n}\n\nexport default uiShellGenerator;\n"]}
|
|
@@ -12,21 +12,12 @@
|
|
|
12
12
|
"!{projectRoot}/eslint.config.mjs",
|
|
13
13
|
"!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)",
|
|
14
14
|
"!{projectRoot}/tsconfig.spec.json",
|
|
15
|
-
"!{projectRoot}/jest.config.[jt]s"
|
|
15
|
+
"!{projectRoot}/jest.config.[jt]s",
|
|
16
|
+
"!{projectRoot}/jest.config.cjs"
|
|
16
17
|
],
|
|
17
18
|
"sharedGlobals": []
|
|
18
19
|
},
|
|
19
20
|
"plugins": [
|
|
20
|
-
{
|
|
21
|
-
"plugin": "@nx/js/typescript",
|
|
22
|
-
"options": {
|
|
23
|
-
"typecheck": { "targetName": "typecheck" },
|
|
24
|
-
"build": {
|
|
25
|
-
"targetName": "build",
|
|
26
|
-
"configName": "tsconfig.lib.json"
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
21
|
{
|
|
31
22
|
"plugin": "@nx/eslint/plugin",
|
|
32
23
|
"options": { "targetName": "lint" }
|
|
@@ -44,6 +35,19 @@
|
|
|
44
35
|
},
|
|
45
36
|
"test": {
|
|
46
37
|
"dependsOn": ["^build"]
|
|
38
|
+
},
|
|
39
|
+
"@frontmcp/nx:build": {
|
|
40
|
+
"cache": true,
|
|
41
|
+
"dependsOn": ["^build"],
|
|
42
|
+
"inputs": ["production", "^production"]
|
|
43
|
+
},
|
|
44
|
+
"@frontmcp/nx:build-exec": {
|
|
45
|
+
"cache": true,
|
|
46
|
+
"dependsOn": ["^build"],
|
|
47
|
+
"inputs": ["production", "^production"]
|
|
48
|
+
},
|
|
49
|
+
"@frontmcp/nx:test": {
|
|
50
|
+
"cache": true
|
|
47
51
|
}
|
|
48
52
|
},
|
|
49
53
|
"release": {
|
|
@@ -33,9 +33,9 @@
|
|
|
33
33
|
"@nx/jest": "<%= nxVersion %>",
|
|
34
34
|
"@nx/esbuild": "<%= nxVersion %>",
|
|
35
35
|
"@nx/workspace": "<%= nxVersion %>",
|
|
36
|
-
"@swc-node/register": "~1.
|
|
37
|
-
"@swc/core": "~1.
|
|
38
|
-
"@swc/helpers": "~0.5.
|
|
36
|
+
"@swc-node/register": "~1.11.1",
|
|
37
|
+
"@swc/core": "~1.15.8",
|
|
38
|
+
"@swc/helpers": "~0.5.18",
|
|
39
39
|
"@swc/jest": "~0.2.38",
|
|
40
40
|
"@types/jest": "^30.0.0",
|
|
41
41
|
"@types/node": "^24.0.0",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type GeneratorCallback, type Tree } from '@nx/devkit';
|
|
2
2
|
import type { WorkspaceGeneratorSchema } from './schema.js';
|
|
3
3
|
export declare function workspaceGenerator(tree: Tree, schema: WorkspaceGeneratorSchema): Promise<GeneratorCallback>;
|
|
4
4
|
export default workspaceGenerator;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.workspaceGenerator = workspaceGenerator;
|
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
|
5
4
|
const child_process_1 = require("child_process");
|
|
6
5
|
const path_1 = require("path");
|
|
7
|
-
const
|
|
6
|
+
const devkit_1 = require("@nx/devkit");
|
|
8
7
|
const versions_js_1 = require("../../utils/versions.js");
|
|
8
|
+
const index_js_1 = require("./lib/index.js");
|
|
9
9
|
async function workspaceGenerator(tree, schema) {
|
|
10
10
|
return workspaceGeneratorInternal(tree, schema);
|
|
11
11
|
}
|
|
@@ -30,6 +30,7 @@ async function workspaceGeneratorInternal(tree, schema) {
|
|
|
30
30
|
await appGenerator(tree, {
|
|
31
31
|
name: 'demo',
|
|
32
32
|
directory: (0, path_1.join)(options.workspaceRoot, 'apps', 'demo'),
|
|
33
|
+
workspaceRoot: options.workspaceRoot,
|
|
33
34
|
tags: 'scope:apps',
|
|
34
35
|
skipFormat: true,
|
|
35
36
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../../src/generators/workspace/workspace.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../../src/generators/workspace/workspace.ts"],"names":[],"mappings":";;AASA,gDAEC;AAXD,iDAAyC;AACzC,+BAA4B;AAE5B,uCAAgH;AAEhH,yDAA2E;AAC3E,6CAAkD;AAG3C,KAAK,UAAU,kBAAkB,CAAC,IAAU,EAAE,MAAgC;IACnF,OAAO,0BAA0B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,IAAU,EAAE,MAAgC;IACpF,MAAM,OAAO,GAAG,IAAA,2BAAgB,EAAC,MAAM,CAAC,CAAC;IACzC,MAAM,eAAe,GAAG,IAAI,IAAA,gCAAkB,GAAE,EAAE,CAAC;IACnD,MAAM,SAAS,GAAG,IAAA,0BAAY,GAAE,CAAC;IAEjC,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAA,WAAI,EAAC,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,EAAE;QACnE,GAAG,OAAO;QACV,eAAe;QACf,SAAS;QACT,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,GAAG;KACT,CAAC,CAAC;IAEH,2BAA2B;IAC3B,IAAI,CAAC,KAAK,CAAC,IAAA,WAAI,EAAC,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,CAAC,IAAA,WAAI,EAAC,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,CAAC,IAAA,WAAI,EAAC,OAAO,CAAC,aAAa,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;IAEnE,0DAA0D;IAC1D,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACvD,MAAM,YAAY,CAAC,IAAI,EAAE;YACvB,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,IAAA,WAAI,EAAC,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC;YACtD,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IAExB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,GAAG,EAAE;gBACV,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,EAAE;YACV,UAAU;QACZ,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,EAAE;QACV,IAAA,4BAAmB,EAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,aAAqB;IAC9C,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,UAAU,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9D,IAAA,wBAAQ,EAAC,YAAY,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChE,IAAA,wBAAQ,EAAC,gCAAgC,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,2CAA2C;IAC7C,CAAC;AACH,CAAC;AAED,kBAAe,kBAAkB,CAAC","sourcesContent":["import { execSync } from 'child_process';\nimport { join } from 'path';\n\nimport { formatFiles, generateFiles, installPackagesTask, type GeneratorCallback, type Tree } from '@nx/devkit';\n\nimport { getFrontmcpVersion, getNxVersion } from '../../utils/versions.js';\nimport { normalizeOptions } from './lib/index.js';\nimport type { WorkspaceGeneratorSchema } from './schema.js';\n\nexport async function workspaceGenerator(tree: Tree, schema: WorkspaceGeneratorSchema): Promise<GeneratorCallback> {\n return workspaceGeneratorInternal(tree, schema);\n}\n\nasync function workspaceGeneratorInternal(tree: Tree, schema: WorkspaceGeneratorSchema): Promise<GeneratorCallback> {\n const options = normalizeOptions(schema);\n const frontmcpVersion = `~${getFrontmcpVersion()}`;\n const nxVersion = getNxVersion();\n\n generateFiles(tree, join(__dirname, 'files'), options.workspaceRoot, {\n ...options,\n frontmcpVersion,\n nxVersion,\n tmpl: '',\n dot: '.',\n });\n\n // Create empty directories\n tree.write(join(options.workspaceRoot, 'apps', '.gitkeep'), '');\n tree.write(join(options.workspaceRoot, 'libs', '.gitkeep'), '');\n tree.write(join(options.workspaceRoot, 'servers', '.gitkeep'), '');\n\n // Compose with app generator when createSampleApp is true\n if (options.createSampleApp) {\n const { appGenerator } = await import('../app/app.js');\n await appGenerator(tree, {\n name: 'demo',\n directory: join(options.workspaceRoot, 'apps', 'demo'),\n workspaceRoot: options.workspaceRoot,\n tags: 'scope:apps',\n skipFormat: true,\n });\n }\n\n await formatFiles(tree);\n\n if (options.skipInstall) {\n if (!options.skipGit) {\n return () => {\n initGitRepository(options.workspaceRoot);\n };\n }\n return () => {\n /* noop */\n };\n }\n\n return () => {\n installPackagesTask(tree);\n if (!options.skipGit) {\n initGitRepository(options.workspaceRoot);\n }\n };\n}\n\nfunction initGitRepository(workspaceRoot: string): void {\n try {\n execSync('git init', { cwd: workspaceRoot, stdio: 'ignore' });\n execSync('git add -A', { cwd: workspaceRoot, stdio: 'ignore' });\n execSync('git commit -m \"Initial commit\"', { cwd: workspaceRoot, stdio: 'ignore' });\n } catch {\n // git may not be installed — silently skip\n }\n}\n\nexport default workspaceGenerator;\n"]}
|
package/generators.json
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"generators": {
|
|
3
|
+
"init": {
|
|
4
|
+
"factory": "./generators/init/init",
|
|
5
|
+
"schema": "./generators/init/schema.json",
|
|
6
|
+
"description": "Prepare an existing Nx workspace for FrontMCP (dependencies and cacheable executors)"
|
|
7
|
+
},
|
|
3
8
|
"workspace": {
|
|
4
9
|
"factory": "./generators/workspace/workspace",
|
|
5
10
|
"schema": "./generators/workspace/schema.json",
|
package/index.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toConstantName = exports.toFileName = exports.toPropertyName = exports.toClassName = exports.getNxDependencies = exports.getFrontmcpDevDependencies = exports.getFrontmcpDependencies = exports.getFrontmcpVersion = exports.uiShellGenerator = exports.uiPageGenerator = exports.uiComponentGenerator = exports.flowGenerator = exports.authProviderGenerator = exports.adapterGenerator = exports.pluginGenerator = exports.providerGenerator = exports.agentGenerator = exports.skillGenerator = exports.promptGenerator = exports.resourceGenerator = exports.toolGenerator = exports.serverGenerator = exports.libGenerator = exports.appGenerator = exports.workspaceGenerator = void 0;
|
|
3
|
+
exports.toConstantName = exports.toFileName = exports.toPropertyName = exports.toClassName = exports.getNxDependencies = exports.getFrontmcpDevDependencies = exports.getFrontmcpDependencies = exports.getFrontmcpVersion = exports.uiShellGenerator = exports.uiPageGenerator = exports.uiComponentGenerator = exports.flowGenerator = exports.authProviderGenerator = exports.adapterGenerator = exports.pluginGenerator = exports.providerGenerator = exports.agentGenerator = exports.skillGenerator = exports.promptGenerator = exports.resourceGenerator = exports.toolGenerator = exports.serverGenerator = exports.libGenerator = exports.appGenerator = exports.workspaceGenerator = exports.initGenerator = void 0;
|
|
4
4
|
// Generators
|
|
5
|
+
var init_js_1 = require("./generators/init/init.js");
|
|
6
|
+
Object.defineProperty(exports, "initGenerator", { enumerable: true, get: function () { return init_js_1.initGenerator; } });
|
|
5
7
|
var workspace_js_1 = require("./generators/workspace/workspace.js");
|
|
6
8
|
Object.defineProperty(exports, "workspaceGenerator", { enumerable: true, get: function () { return workspace_js_1.workspaceGenerator; } });
|
|
7
9
|
var app_js_1 = require("./generators/app/app.js");
|