@frontmcp/nx 1.8.5 → 1.8.7

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.
Files changed (110) hide show
  1. package/executors/build/build.impl.js +9 -19
  2. package/executors/build/build.impl.js.map +1 -1
  3. package/executors/build/schema.d.ts +2 -0
  4. package/executors/build/schema.js.map +1 -1
  5. package/executors/build/schema.json +22 -2
  6. package/executors/build-exec/build-exec.impl.js +5 -17
  7. package/executors/build-exec/build-exec.impl.js.map +1 -1
  8. package/executors/deploy/deploy.impl.js.map +1 -1
  9. package/executors/dev/dev.impl.js +11 -17
  10. package/executors/dev/dev.impl.js.map +1 -1
  11. package/executors/frontmcp-cli.d.ts +31 -0
  12. package/executors/frontmcp-cli.js +108 -0
  13. package/executors/frontmcp-cli.js.map +1 -0
  14. package/executors/inspector/inspector.impl.js +10 -18
  15. package/executors/inspector/inspector.impl.js.map +1 -1
  16. package/executors/serve/serve.impl.js +11 -17
  17. package/executors/serve/serve.impl.js.map +1 -1
  18. package/executors/test/test.impl.js +3 -15
  19. package/executors/test/test.impl.js.map +1 -1
  20. package/generators/adapter/files/__fileName__.adapter.ts__tmpl__ +9 -2
  21. package/generators/agent/agent.d.ts +1 -1
  22. package/generators/agent/agent.js +21 -7
  23. package/generators/agent/agent.js.map +1 -1
  24. package/generators/agent/files/__fileName__.agent.ts__tmpl__ +12 -6
  25. package/generators/app/app.d.ts +1 -1
  26. package/generators/app/app.js +3 -3
  27. package/generators/app/app.js.map +1 -1
  28. package/generators/app/files/jest.config.cjs__tmpl__ +37 -0
  29. package/generators/app/files/package.json__tmpl__ +5 -0
  30. package/generators/app/files/project.json__tmpl__ +3 -1
  31. package/generators/app/files/tsconfig.json__tmpl__ +6 -9
  32. package/generators/app/files/tsconfig.lib.json__tmpl__ +1 -2
  33. package/generators/app/files/tsconfig.spec.json__tmpl__ +3 -4
  34. package/generators/app/lib/normalize-options.d.ts +8 -1
  35. package/generators/app/lib/normalize-options.js +7 -2
  36. package/generators/app/lib/normalize-options.js.map +1 -1
  37. package/generators/app/schema.d.ts +2 -0
  38. package/generators/app/schema.js.map +1 -1
  39. package/generators/app/schema.json +5 -0
  40. package/generators/auth-provider/files/__fileName__.auth-provider.ts__tmpl__ +0 -1
  41. package/generators/flow/files/__fileName__.flow.ts__tmpl__ +54 -16
  42. package/generators/init/init.d.ts +4 -0
  43. package/generators/init/init.js +40 -0
  44. package/generators/init/init.js.map +1 -0
  45. package/generators/init/schema.d.ts +4 -0
  46. package/generators/init/schema.js +3 -0
  47. package/generators/init/schema.js.map +1 -0
  48. package/generators/init/schema.json +21 -0
  49. package/generators/lib/lib/normalize-options.d.ts +4 -1
  50. package/generators/lib/lib/normalize-options.js +5 -2
  51. package/generators/lib/lib/normalize-options.js.map +1 -1
  52. package/generators/lib/lib-project-files/jest.config.cjs__tmpl__ +39 -0
  53. package/generators/lib/lib-project-files/project.json__tmpl__ +16 -0
  54. package/generators/lib/lib-project-files/tsconfig.json__tmpl__ +15 -0
  55. package/generators/lib/lib-project-files/tsconfig.lib.json__tmpl__ +11 -0
  56. package/generators/lib/lib-project-files/tsconfig.spec.json__tmpl__ +11 -0
  57. package/generators/lib/lib.js +1 -1
  58. package/generators/lib/lib.js.map +1 -1
  59. package/generators/plugin/files/__fileName__.plugin.ts__tmpl__ +9 -5
  60. package/generators/provider/files/__fileName__.provider.ts__tmpl__ +5 -9
  61. package/generators/provider/provider.d.ts +1 -1
  62. package/generators/provider/provider.js +3 -3
  63. package/generators/provider/provider.js.map +1 -1
  64. package/generators/server/files/common/package.json__tmpl__ +5 -0
  65. package/generators/server/files/common/project.json__tmpl__ +3 -2
  66. package/generators/server/files/common/src/main.ts__tmpl__ +2 -2
  67. package/generators/server/files/common/tsconfig.json__tmpl__ +6 -8
  68. package/generators/server/files/common/tsconfig.lib.json__tmpl__ +0 -1
  69. package/generators/server/lib/normalize-options.d.ts +9 -1
  70. package/generators/server/lib/normalize-options.js +15 -2
  71. package/generators/server/lib/normalize-options.js.map +1 -1
  72. package/generators/server/server.d.ts +1 -1
  73. package/generators/server/server.js +2 -2
  74. package/generators/server/server.js.map +1 -1
  75. package/generators/ui-component/files/__className__/__className__.tsx__tmpl__ +0 -1
  76. package/generators/ui-component/ui-component.d.ts +1 -1
  77. package/generators/ui-component/ui-component.js +4 -1
  78. package/generators/ui-component/ui-component.js.map +1 -1
  79. package/generators/ui-page/ui-page.d.ts +1 -1
  80. package/generators/ui-page/ui-page.js +4 -1
  81. package/generators/ui-page/ui-page.js.map +1 -1
  82. package/generators/ui-shared/add-ui-entry.js.map +1 -1
  83. package/generators/ui-shared/ensure-ui-package.d.ts +17 -0
  84. package/generators/ui-shared/ensure-ui-package.js +120 -0
  85. package/generators/ui-shared/ensure-ui-package.js.map +1 -0
  86. package/generators/ui-shell/files/__fileName__/__fileName__.shell.spec.ts__tmpl__ +2 -1
  87. package/generators/ui-shell/ui-shell.d.ts +1 -1
  88. package/generators/ui-shell/ui-shell.js +4 -1
  89. package/generators/ui-shell/ui-shell.js.map +1 -1
  90. package/generators/workspace/files/nx.json__tmpl__ +15 -1
  91. package/generators/workspace/files/package.json__tmpl__ +3 -3
  92. package/generators/workspace/workspace.d.ts +1 -1
  93. package/generators/workspace/workspace.js +3 -2
  94. package/generators/workspace/workspace.js.map +1 -1
  95. package/generators.json +5 -0
  96. package/index.d.ts +1 -0
  97. package/index.js +3 -1
  98. package/index.js.map +1 -1
  99. package/package.json +2 -2
  100. package/utils/add-dependencies.d.ts +4 -2
  101. package/utils/add-dependencies.js +2 -2
  102. package/utils/add-dependencies.js.map +1 -1
  103. package/utils/normalize-options.js.map +1 -1
  104. package/utils/project-paths.d.ts +20 -0
  105. package/utils/project-paths.js +56 -0
  106. package/utils/project-paths.js.map +1 -0
  107. package/utils/versions.d.ts +2 -0
  108. package/utils/versions.js +17 -5
  109. package/utils/versions.js.map +1 -1
  110. package/generators/app/files/jest.config.ts__tmpl__ +0 -23
@@ -0,0 +1,11 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "<%= offset %>dist/out-tsc",
5
+ "module": "commonjs",
6
+ "moduleResolution": "node10",<% if (ignoreDeprecations) { %>
7
+ "ignoreDeprecations": "<%= ignoreDeprecations %>",<% } %>
8
+ "types": ["jest", "node"]
9
+ },
10
+ "include": ["src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
11
+ }
@@ -8,7 +8,7 @@ async function libGenerator(tree, schema) {
8
8
  return libGeneratorInternal(tree, schema);
9
9
  }
10
10
  async function libGeneratorInternal(tree, schema) {
11
- const options = (0, index_js_1.normalizeOptions)(schema);
11
+ const options = (0, index_js_1.normalizeOptions)(tree, schema);
12
12
  // Generate project config files (project.json, tsconfig, jest)
13
13
  (0, devkit_1.generateFiles)(tree, (0, path_1.join)(__dirname, 'lib-project-files'), options.projectRoot, {
14
14
  ...options,
@@ -1 +1 @@
1
- {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../../src/generators/lib/lib.ts"],"names":[],"mappings":";;AAWA,oCAEC;AAbD,uCAMoB;AACpB,+BAA4B;AAE5B,6CAAkD;AAE3C,KAAK,UAAU,YAAY,CAAC,IAAU,EAAE,MAA0B;IACvE,OAAO,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,IAAU,EACV,MAA0B;IAE1B,MAAM,OAAO,GAAG,IAAA,2BAAgB,EAAC,MAAM,CAAC,CAAC;IAEzC,+DAA+D;IAC/D,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAA,WAAI,EAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC,WAAW,EAAE;QAC7E,GAAG,OAAO;QACV,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,sCAAsC;IACtC,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,IAAA,sBAAa,EAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE;QACpD,GAAG,OAAO;QACV,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,sDAAsD;IACtD,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACtC,IAAA,mBAAU,EAAC,IAAI,EAAE,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC;YAClD,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9D,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,WAAW,eAAe,CAAC,CAAC;YACzF,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,kBAAe,YAAY,CAAC","sourcesContent":["import {\n type Tree,\n formatFiles,\n generateFiles,\n updateJson,\n type GeneratorCallback,\n} from '@nx/devkit';\nimport { join } from 'path';\nimport type { LibGeneratorSchema } from './schema.js';\nimport { normalizeOptions } from './lib/index.js';\n\nexport async function libGenerator(tree: Tree, schema: LibGeneratorSchema): Promise<GeneratorCallback | void> {\n return libGeneratorInternal(tree, schema);\n}\n\nasync function libGeneratorInternal(\n tree: Tree,\n schema: LibGeneratorSchema,\n): Promise<GeneratorCallback | void> {\n const options = normalizeOptions(schema);\n\n // Generate project config files (project.json, tsconfig, jest)\n generateFiles(tree, join(__dirname, 'lib-project-files'), options.projectRoot, {\n ...options,\n tmpl: '',\n });\n\n // Generate type-specific source files\n const templateDir = join(__dirname, 'files', options.libType);\n generateFiles(tree, templateDir, options.projectRoot, {\n ...options,\n tmpl: '',\n });\n\n // Add path mapping to tsconfig.base.json if it exists\n if (tree.exists('tsconfig.base.json')) {\n updateJson(tree, 'tsconfig.base.json', (json) => {\n json.compilerOptions = json.compilerOptions ?? {};\n json.compilerOptions.paths = json.compilerOptions.paths ?? {};\n json.compilerOptions.paths[options.importPath] = [`${options.projectRoot}/src/index.ts`];\n return json;\n });\n }\n\n if (!options.skipFormat) {\n await formatFiles(tree);\n }\n}\n\nexport default libGenerator;\n"]}
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../../src/generators/lib/lib.ts"],"names":[],"mappings":";;AAWA,oCAEC;AAbD,uCAMoB;AACpB,+BAA4B;AAE5B,6CAAkD;AAE3C,KAAK,UAAU,YAAY,CAAC,IAAU,EAAE,MAA0B;IACvE,OAAO,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,IAAU,EACV,MAA0B;IAE1B,MAAM,OAAO,GAAG,IAAA,2BAAgB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE/C,+DAA+D;IAC/D,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAA,WAAI,EAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC,WAAW,EAAE;QAC7E,GAAG,OAAO;QACV,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,sCAAsC;IACtC,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,IAAA,sBAAa,EAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE;QACpD,GAAG,OAAO;QACV,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,sDAAsD;IACtD,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACtC,IAAA,mBAAU,EAAC,IAAI,EAAE,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC;YAClD,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9D,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,WAAW,eAAe,CAAC,CAAC;YACzF,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,kBAAe,YAAY,CAAC","sourcesContent":["import {\n type Tree,\n formatFiles,\n generateFiles,\n updateJson,\n type GeneratorCallback,\n} from '@nx/devkit';\nimport { join } from 'path';\nimport type { LibGeneratorSchema } from './schema.js';\nimport { normalizeOptions } from './lib/index.js';\n\nexport async function libGenerator(tree: Tree, schema: LibGeneratorSchema): Promise<GeneratorCallback | void> {\n return libGeneratorInternal(tree, schema);\n}\n\nasync function libGeneratorInternal(\n tree: Tree,\n schema: LibGeneratorSchema,\n): Promise<GeneratorCallback | void> {\n const options = normalizeOptions(tree, schema);\n\n // Generate project config files (project.json, tsconfig, jest)\n generateFiles(tree, join(__dirname, 'lib-project-files'), options.projectRoot, {\n ...options,\n tmpl: '',\n });\n\n // Generate type-specific source files\n const templateDir = join(__dirname, 'files', options.libType);\n generateFiles(tree, templateDir, options.projectRoot, {\n ...options,\n tmpl: '',\n });\n\n // Add path mapping to tsconfig.base.json if it exists\n if (tree.exists('tsconfig.base.json')) {\n updateJson(tree, 'tsconfig.base.json', (json) => {\n json.compilerOptions = json.compilerOptions ?? {};\n json.compilerOptions.paths = json.compilerOptions.paths ?? {};\n json.compilerOptions.paths[options.importPath] = [`${options.projectRoot}/src/index.ts`];\n return json;\n });\n }\n\n if (!options.skipFormat) {\n await formatFiles(tree);\n }\n}\n\nexport default libGenerator;\n"]}
@@ -1,4 +1,4 @@
1
- import { Plugin, DynamicPlugin, type PluginRegistrationContext } from '@frontmcp/sdk';
1
+ import { DynamicPlugin, Plugin, type ProviderType } from '@frontmcp/sdk';
2
2
 
3
3
  export interface <%= className %>PluginOptions {
4
4
  // TODO: define plugin options
@@ -9,11 +9,15 @@ export interface <%= className %>PluginOptions {
9
9
  description: 'TODO: describe what this plugin does',
10
10
  })
11
11
  export class <%= className %>Plugin extends DynamicPlugin<<%= className %>PluginOptions> {
12
- async dynamicProviders() {
13
- return [];
12
+ options: <%= className %>PluginOptions;
13
+
14
+ constructor(options: <%= className %>PluginOptions = {}) {
15
+ super();
16
+ this.options = options;
14
17
  }
15
18
 
16
- async onRegister(ctx: PluginRegistrationContext): Promise<void> {
17
- // TODO: register tools, resources, prompts, or context extensions
19
+ // Providers this plugin contributes to the container.
20
+ static override dynamicProviders(_options: <%= className %>PluginOptions): ProviderType[] {
21
+ return [];
18
22
  }
19
23
  }
@@ -1,15 +1,11 @@
1
- import { Provider } from '@frontmcp/sdk';
2
-
3
- export const <%= constantName %>_TOKEN = Symbol('<%= className %>Provider');
1
+ import { Provider, ProviderScope } from '@frontmcp/sdk';
4
2
 
3
+ // Register with `providers: [<%= className %>Provider]` on an @App or @FrontMcp,
4
+ // then resolve it inside a tool with `this.get(<%= className %>Provider)`.
5
5
  @Provider({
6
- token: <%= constantName %>_TOKEN,
7
- scope: '<%= scope %>',
6
+ name: '<%= className %>Provider',
7
+ scope: ProviderScope.<%= scopeEnum %>,
8
8
  })
9
9
  export class <%= className %>Provider {
10
10
  // TODO: implement provider logic
11
-
12
- static factory(): <%= className %>Provider {
13
- return new <%= className %>Provider();
14
- }
15
11
  }
@@ -1,4 +1,4 @@
1
- import { type Tree, type GeneratorCallback } from '@nx/devkit';
1
+ import { type GeneratorCallback, type Tree } from '@nx/devkit';
2
2
  import type { ProviderGeneratorSchema } from './schema.js';
3
3
  export declare function providerGenerator(tree: Tree, schema: ProviderGeneratorSchema): Promise<GeneratorCallback | void>;
4
4
  export default providerGenerator;
@@ -1,17 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.providerGenerator = providerGenerator;
4
- const devkit_1 = require("@nx/devkit");
5
4
  const path_1 = require("path");
5
+ const devkit_1 = require("@nx/devkit");
6
6
  const normalize_options_js_1 = require("../../utils/normalize-options.js");
7
7
  async function providerGenerator(tree, schema) {
8
8
  const options = (0, normalize_options_js_1.normalizePrimitiveOptions)(tree, schema, 'providers');
9
9
  const scope = schema.scope ?? 'singleton';
10
- const constantName = (0, devkit_1.names)(schema.name).constantName;
10
+ const scopeEnum = scope === 'singleton' ? 'GLOBAL' : 'CONTEXT';
11
11
  (0, devkit_1.generateFiles)(tree, (0, path_1.join)(__dirname, 'files'), options.directory, {
12
12
  ...options,
13
13
  scope,
14
- constantName,
14
+ scopeEnum,
15
15
  tmpl: '',
16
16
  });
17
17
  if (!schema.skipFormat) {
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../../src/generators/provider/provider.ts"],"names":[],"mappings":";;AAKA,8CAkBC;AAvBD,uCAAkG;AAClG,+BAA4B;AAE5B,2EAA6E;AAEtE,KAAK,UAAU,iBAAiB,CACrC,IAAU,EACV,MAA+B;IAE/B,MAAM,OAAO,GAAG,IAAA,gDAAyB,EAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,WAAW,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAA,cAAK,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC;IAErD,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAA,WAAI,EAAC,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE;QAC/D,GAAG,OAAO;QACV,KAAK;QACL,YAAY;QACZ,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,kBAAe,iBAAiB,CAAC","sourcesContent":["import { type Tree, formatFiles, generateFiles, names, type GeneratorCallback } from '@nx/devkit';\nimport { join } from 'path';\nimport type { ProviderGeneratorSchema } from './schema.js';\nimport { normalizePrimitiveOptions } from '../../utils/normalize-options.js';\n\nexport async function providerGenerator(\n tree: Tree,\n schema: ProviderGeneratorSchema,\n): Promise<GeneratorCallback | void> {\n const options = normalizePrimitiveOptions(tree, schema, 'providers');\n const scope = schema.scope ?? 'singleton';\n const constantName = names(schema.name).constantName;\n\n generateFiles(tree, join(__dirname, 'files'), options.directory, {\n ...options,\n scope,\n constantName,\n tmpl: '',\n });\n\n if (!schema.skipFormat) {\n await formatFiles(tree);\n }\n}\n\nexport default providerGenerator;\n"]}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../../src/generators/provider/provider.ts"],"names":[],"mappings":";;AAOA,8CAkBC;AAzBD,+BAA4B;AAE5B,uCAA2F;AAE3F,2EAA6E;AAGtE,KAAK,UAAU,iBAAiB,CACrC,IAAU,EACV,MAA+B;IAE/B,MAAM,OAAO,GAAG,IAAA,gDAAyB,EAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,WAAW,CAAC;IAC1C,MAAM,SAAS,GAAG,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAE/D,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAA,WAAI,EAAC,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE;QAC/D,GAAG,OAAO;QACV,KAAK;QACL,SAAS;QACT,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,kBAAe,iBAAiB,CAAC","sourcesContent":["import { join } from 'path';\n\nimport { formatFiles, generateFiles, type GeneratorCallback, type Tree } from '@nx/devkit';\n\nimport { normalizePrimitiveOptions } from '../../utils/normalize-options.js';\nimport type { ProviderGeneratorSchema } from './schema.js';\n\nexport async function providerGenerator(\n tree: Tree,\n schema: ProviderGeneratorSchema,\n): Promise<GeneratorCallback | void> {\n const options = normalizePrimitiveOptions(tree, schema, 'providers');\n const scope = schema.scope ?? 'singleton';\n const scopeEnum = scope === 'singleton' ? 'GLOBAL' : 'CONTEXT';\n\n generateFiles(tree, join(__dirname, 'files'), options.directory, {\n ...options,\n scope,\n scopeEnum,\n tmpl: '',\n });\n\n if (!schema.skipFormat) {\n await formatFiles(tree);\n }\n}\n\nexport default providerGenerator;\n"]}
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "<%= projectName %>",
3
+ "version": "0.0.1",
4
+ "private": true
5
+ }
@@ -1,17 +1,18 @@
1
1
  {
2
2
  "name": "<%= projectName %>",
3
- "$schema": "../../node_modules/nx/schemas/project-schema.json",
3
+ "$schema": "<%= offset %>node_modules/nx/schemas/project-schema.json",
4
4
  "sourceRoot": "<%= projectRoot %>/src",
5
5
  "projectType": "application",
6
6
  "tags": [<%- parsedTags.map(t => `"${t}"`).join(', ') %>],
7
7
  "targets": {
8
8
  "build": {
9
9
  "executor": "@frontmcp/nx:build",
10
+ "cache": true,
10
11
  "outputs": ["{projectRoot}/dist"],
11
12
  "options": {
12
13
  "entry": "{projectRoot}/src/main.ts",
13
14
  "outputPath": "{projectRoot}/dist",
14
- "adapter": "<%= deploymentTarget %>"
15
+ "target": "<%= deploymentTarget %>"
15
16
  }
16
17
  },
17
18
  "deploy": {
@@ -1,9 +1,9 @@
1
1
  import 'reflect-metadata';
2
2
  import { FrontMcp } from '@frontmcp/sdk';
3
- <% appNames.forEach(function(appName) { %>import { <%= names(appName).className %>App } from '../../apps/<%= names(appName).fileName %>/<%= names(appName).fileName %>.app';
3
+ <% appImports.forEach(function(app) { %>import { <%= app.className %> } from '<%= app.importPath %>';
4
4
  <% }); %>
5
5
  @FrontMcp({
6
6
  info: { name: '<%= className %> Server', version: '0.1.0' },
7
- apps: [<%- appNames.map(a => names(a).className + 'App').join(', ') %>],
7
+ apps: [<%- appImports.map(a => a.className).join(', ') %>],
8
8
  })
9
9
  export default class Server {}
@@ -1,14 +1,12 @@
1
1
  {
2
- "extends": "../../tsconfig.base.json",
2
+ "extends": "<%= offset %>tsconfig.base.json",
3
3
  "compilerOptions": {
4
- "module": "NodeNext",
5
- "moduleResolution": "NodeNext",
4
+ "module": "commonjs",
5
+ "moduleResolution": "node10",<% if (ignoreDeprecations) { %>
6
+ "ignoreDeprecations": "<%= ignoreDeprecations %>",<% } %>
6
7
  "emitDecoratorMetadata": true,
7
8
  "experimentalDecorators": true
8
9
  },
9
- "files": [],
10
- "include": [],
11
- "references": [
12
- { "path": "./tsconfig.lib.json" }
13
- ]
10
+ "include": ["src/**/*.ts"],
11
+ "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"]
14
12
  }
@@ -2,7 +2,6 @@
2
2
  "extends": "./tsconfig.json",
3
3
  "compilerOptions": {
4
4
  "outDir": "./dist",
5
- "rootDir": "./src",
6
5
  "declaration": true,
7
6
  "types": ["node"]
8
7
  },
@@ -1,14 +1,22 @@
1
+ import { type Tree } from '@nx/devkit';
1
2
  import type { ServerGeneratorSchema } from '../schema.js';
2
3
  export interface NormalizedServerOptions {
3
4
  name: string;
4
5
  projectName: string;
5
6
  projectRoot: string;
7
+ offset: string;
8
+ ignoreDeprecations: string;
6
9
  className: string;
7
10
  fileName: string;
8
11
  deploymentTarget: 'node' | 'vercel' | 'lambda' | 'cloudflare';
9
12
  appNames: string[];
13
+ /** Each composed app with the import specifier `main.ts` uses, relative to the server's `src/`. */
14
+ appImports: Array<{
15
+ className: string;
16
+ importPath: string;
17
+ }>;
10
18
  redis: 'docker' | 'existing' | 'none';
11
19
  parsedTags: string[];
12
20
  skipFormat: boolean;
13
21
  }
14
- export declare function normalizeOptions(schema: ServerGeneratorSchema): NormalizedServerOptions;
22
+ export declare function normalizeOptions(tree: Tree, schema: ServerGeneratorSchema): NormalizedServerOptions;
@@ -2,21 +2,34 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.normalizeOptions = normalizeOptions;
4
4
  const devkit_1 = require("@nx/devkit");
5
- function normalizeOptions(schema) {
5
+ const path_1 = require("path");
6
+ const project_paths_js_1 = require("../../../utils/project-paths.js");
7
+ function normalizeOptions(tree, schema) {
6
8
  const { className, fileName } = (0, devkit_1.names)(schema.name);
7
- const projectRoot = schema.directory ?? (0, devkit_1.joinPathFragments)('servers', fileName);
9
+ const { projectRoot, offset } = (0, project_paths_js_1.resolveProjectPaths)(schema.directory ?? (0, devkit_1.joinPathFragments)('servers', fileName));
8
10
  const parsedTags = schema.tags
9
11
  ? schema.tags.split(',').map((t) => t.trim())
10
12
  : ['scope:servers'];
11
13
  const appNames = schema.apps.split(',').map((a) => a.trim()).filter(Boolean);
14
+ const projects = (0, devkit_1.getProjects)(tree);
15
+ const appImports = appNames.map((appName) => {
16
+ const { className: appClass, fileName: appFile } = (0, devkit_1.names)(appName);
17
+ const appProject = projects.get(appName) ?? projects.get(appFile);
18
+ const appSourceRoot = appProject?.sourceRoot ?? (0, devkit_1.joinPathFragments)(appProject?.root ?? (0, devkit_1.joinPathFragments)('apps', appFile), 'src');
19
+ const importPath = path_1.posix.relative((0, devkit_1.joinPathFragments)(projectRoot, 'src'), (0, devkit_1.joinPathFragments)(appSourceRoot, `${appFile}.app`));
20
+ return { className: `${appClass}App`, importPath: importPath.startsWith('.') ? importPath : `./${importPath}` };
21
+ });
12
22
  return {
13
23
  name: schema.name,
14
24
  projectName: `server-${fileName}`,
15
25
  projectRoot,
26
+ offset,
27
+ ignoreDeprecations: (0, project_paths_js_1.getIgnoreDeprecations)(tree),
16
28
  className,
17
29
  fileName,
18
30
  deploymentTarget: schema.deploymentTarget ?? 'node',
19
31
  appNames,
32
+ appImports,
20
33
  redis: schema.redis ?? 'none',
21
34
  parsedTags,
22
35
  skipFormat: schema.skipFormat ?? false,
@@ -1 +1 @@
1
- {"version":3,"file":"normalize-options.js","sourceRoot":"","sources":["../../../../../src/generators/server/lib/normalize-options.ts"],"names":[],"mappings":";;AAgBA,4CAqBC;AArCD,uCAAsD;AAgBtD,SAAgB,gBAAgB,CAAC,MAA6B;IAC5D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAA,cAAK,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,IAAI,IAAA,0BAAiB,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI;QAC5B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7C,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAEtB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE7E,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,UAAU,QAAQ,EAAE;QACjC,WAAW;QACX,SAAS;QACT,QAAQ;QACR,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,MAAM;QACnD,QAAQ;QACR,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM;QAC7B,UAAU;QACV,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK;KACvC,CAAC;AACJ,CAAC","sourcesContent":["import { names, joinPathFragments } from '@nx/devkit';\nimport type { ServerGeneratorSchema } from '../schema.js';\n\nexport interface NormalizedServerOptions {\n name: string;\n projectName: string;\n projectRoot: string;\n className: string;\n fileName: string;\n deploymentTarget: 'node' | 'vercel' | 'lambda' | 'cloudflare';\n appNames: string[];\n redis: 'docker' | 'existing' | 'none';\n parsedTags: string[];\n skipFormat: boolean;\n}\n\nexport function normalizeOptions(schema: ServerGeneratorSchema): NormalizedServerOptions {\n const { className, fileName } = names(schema.name);\n const projectRoot = schema.directory ?? joinPathFragments('servers', fileName);\n const parsedTags = schema.tags\n ? schema.tags.split(',').map((t) => t.trim())\n : ['scope:servers'];\n\n const appNames = schema.apps.split(',').map((a) => a.trim()).filter(Boolean);\n\n return {\n name: schema.name,\n projectName: `server-${fileName}`,\n projectRoot,\n className,\n fileName,\n deploymentTarget: schema.deploymentTarget ?? 'node',\n appNames,\n redis: schema.redis ?? 'none',\n parsedTags,\n skipFormat: schema.skipFormat ?? false,\n };\n}\n"]}
1
+ {"version":3,"file":"normalize-options.js","sourceRoot":"","sources":["../../../../../src/generators/server/lib/normalize-options.ts"],"names":[],"mappings":";;AAsBA,4CAiCC;AAvDD,uCAA8E;AAC9E,+BAA6B;AAE7B,sEAA6F;AAmB7F,SAAgB,gBAAgB,CAAC,IAAU,EAAE,MAA6B;IACxE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAA,cAAK,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAA,sCAAmB,EAAC,MAAM,CAAC,SAAS,IAAI,IAAA,0BAAiB,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChH,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI;QAC5B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7C,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAEtB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE7E,MAAM,QAAQ,GAAG,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC1C,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,aAAa,GAAG,UAAU,EAAE,UAAU,IAAI,IAAA,0BAAiB,EAAC,UAAU,EAAE,IAAI,IAAI,IAAA,0BAAiB,EAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QACjI,MAAM,UAAU,GAAG,YAAK,CAAC,QAAQ,CAAC,IAAA,0BAAiB,EAAC,WAAW,EAAE,KAAK,CAAC,EAAE,IAAA,0BAAiB,EAAC,aAAa,EAAE,GAAG,OAAO,MAAM,CAAC,CAAC,CAAC;QAC7H,OAAO,EAAE,SAAS,EAAE,GAAG,QAAQ,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,EAAE,CAAC;IAClH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,UAAU,QAAQ,EAAE;QACjC,WAAW;QACX,MAAM;QACN,kBAAkB,EAAE,IAAA,wCAAqB,EAAC,IAAI,CAAC;QAC/C,SAAS;QACT,QAAQ;QACR,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,MAAM;QACnD,QAAQ;QACR,UAAU;QACV,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM;QAC7B,UAAU;QACV,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK;KACvC,CAAC;AACJ,CAAC","sourcesContent":["import { type Tree, getProjects, joinPathFragments, names } from '@nx/devkit';\nimport { posix } from 'path';\nimport type { ServerGeneratorSchema } from '../schema.js';\nimport { getIgnoreDeprecations, resolveProjectPaths } from '../../../utils/project-paths.js';\n\nexport interface NormalizedServerOptions {\n name: string;\n projectName: string;\n projectRoot: string;\n offset: string;\n ignoreDeprecations: string;\n className: string;\n fileName: string;\n deploymentTarget: 'node' | 'vercel' | 'lambda' | 'cloudflare';\n appNames: string[];\n /** Each composed app with the import specifier `main.ts` uses, relative to the server's `src/`. */\n appImports: Array<{ className: string; importPath: string }>;\n redis: 'docker' | 'existing' | 'none';\n parsedTags: string[];\n skipFormat: boolean;\n}\n\nexport function normalizeOptions(tree: Tree, schema: ServerGeneratorSchema): NormalizedServerOptions {\n const { className, fileName } = names(schema.name);\n const { projectRoot, offset } = resolveProjectPaths(schema.directory ?? joinPathFragments('servers', fileName));\n const parsedTags = schema.tags\n ? schema.tags.split(',').map((t) => t.trim())\n : ['scope:servers'];\n\n const appNames = schema.apps.split(',').map((a) => a.trim()).filter(Boolean);\n\n const projects = getProjects(tree);\n const appImports = appNames.map((appName) => {\n const { className: appClass, fileName: appFile } = names(appName);\n const appProject = projects.get(appName) ?? projects.get(appFile);\n const appSourceRoot = appProject?.sourceRoot ?? joinPathFragments(appProject?.root ?? joinPathFragments('apps', appFile), 'src');\n const importPath = posix.relative(joinPathFragments(projectRoot, 'src'), joinPathFragments(appSourceRoot, `${appFile}.app`));\n return { className: `${appClass}App`, importPath: importPath.startsWith('.') ? importPath : `./${importPath}` };\n });\n\n return {\n name: schema.name,\n projectName: `server-${fileName}`,\n projectRoot,\n offset,\n ignoreDeprecations: getIgnoreDeprecations(tree),\n className,\n fileName,\n deploymentTarget: schema.deploymentTarget ?? 'node',\n appNames,\n appImports,\n redis: schema.redis ?? 'none',\n parsedTags,\n skipFormat: schema.skipFormat ?? false,\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { type Tree, type GeneratorCallback } from '@nx/devkit';
1
+ import { type GeneratorCallback, type Tree } from '@nx/devkit';
2
2
  import type { ServerGeneratorSchema } from './schema.js';
3
3
  export declare function serverGenerator(tree: Tree, schema: ServerGeneratorSchema): Promise<GeneratorCallback | void>;
4
4
  export default serverGenerator;
@@ -2,15 +2,15 @@
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
8
  const index_js_1 = require("./lib/index.js");
9
9
  async function serverGenerator(tree, schema) {
10
10
  return serverGeneratorInternal(tree, schema);
11
11
  }
12
12
  async function serverGeneratorInternal(tree, schema) {
13
- const options = (0, index_js_1.normalizeOptions)(schema);
13
+ const options = (0, index_js_1.normalizeOptions)(tree, schema);
14
14
  const templateVars = {
15
15
  ...options,
16
16
  names: devkit_1.names,
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../src/generators/server/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Tree, formatFiles, generateFiles, names as nxNames, type GeneratorCallback } from '@nx/devkit';\nimport * as fs from 'fs';\nimport { join } from 'path';\nimport type { ServerGeneratorSchema } from './schema.js';\nimport { normalizeOptions } from './lib/index.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(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 if (!options.skipFormat) {\n await formatFiles(tree);\n }\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
+ {"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 { 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 if (!options.skipFormat) {\n await formatFiles(tree);\n }\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,3 @@
1
- import React from 'react';
2
1
  import { Box, Typography } from '@mui/material';
3
2
 
4
3
  export interface <%= className %>Props {
@@ -1,4 +1,4 @@
1
- import { type Tree, type GeneratorCallback } from '@nx/devkit';
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":";;AAQA,oDA6BC;AArCD,uCAAkG;AAClG,+BAA4B;AAE5B,kEAA0D;AAE1D,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,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;AACH,CAAC;AAED,kBAAe,oBAAoB,CAAC","sourcesContent":["import { type Tree, formatFiles, generateFiles, names, type GeneratorCallback } from '@nx/devkit';\nimport { join } from 'path';\nimport type { UiComponentGeneratorSchema } from './schema.js';\nimport { addUiEntry } from '../ui-shared/add-ui-entry.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 // 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\nexport default uiComponentGenerator;\n"]}
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 Tree, type GeneratorCallback } from '@nx/devkit';
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":";;AAQA,0CA0BC;AAlCD,uCAAkG;AAClG,+BAA4B;AAE5B,kEAA0D;AAE1D,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,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;AACH,CAAC;AAED,kBAAe,eAAe,CAAC","sourcesContent":["import { type Tree, formatFiles, generateFiles, names, type GeneratorCallback } from '@nx/devkit';\nimport { join } from 'path';\nimport type { UiPageGeneratorSchema } from './schema.js';\nimport { addUiEntry } from '../ui-shared/add-ui-entry.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 // 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\nexport default uiPageGenerator;\n"]}
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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"add-ui-entry.js","sourceRoot":"","sources":["../../../../src/generators/ui-shared/add-ui-entry.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Tree, updateJson } from '@nx/devkit';\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 if (tree.exists('tsconfig.base.json')) {\n updateJson(tree, 'tsconfig.base.json', (json) => {\n const paths = json.compilerOptions?.paths ?? {};\n const aliasKey = `${importPath}/${entryName}`;\n if (!paths[aliasKey]) {\n paths[aliasKey] = [`${packageRoot}/src/${entryName}/index.ts`];\n }\n json.compilerOptions = json.compilerOptions ?? {};\n json.compilerOptions.paths = paths;\n return json;\n });\n }\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"]}
1
+ {"version":3,"file":"add-ui-entry.js","sourceRoot":"","sources":["../../../../src/generators/ui-shared/add-ui-entry.ts"],"names":[],"mappings":"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","sourcesContent":["import { updateJson, type Tree } from '@nx/devkit';\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 if (tree.exists('tsconfig.base.json')) {\n updateJson(tree, 'tsconfig.base.json', (json) => {\n const paths = json.compilerOptions?.paths ?? {};\n const aliasKey = `${importPath}/${entryName}`;\n if (!paths[aliasKey]) {\n paths[aliasKey] = [`${packageRoot}/src/${entryName}/index.ts`];\n }\n json.compilerOptions = json.compilerOptions ?? {};\n json.compilerOptions.paths = paths;\n return json;\n });\n }\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,120 @@
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
+ const ignoreDeprecations = (0, project_paths_js_1.getIgnoreDeprecations)(tree);
67
+ // `customConditions` (Nx solution workspaces set it) is only valid with a modern `moduleResolution`
68
+ // (TS5098), so a package that inherits it must inherit the base's `module`/`moduleResolution` too.
69
+ const inheritsModernResolution = Boolean(tree.exists('tsconfig.base.json') &&
70
+ (0, devkit_1.readJson)(tree, 'tsconfig.base.json').compilerOptions
71
+ ?.customConditions);
72
+ (0, devkit_1.writeJson)(tree, `${packageRoot}/project.json`, {
73
+ name: projectName,
74
+ $schema: `${offset}node_modules/nx/schemas/project-schema.json`,
75
+ sourceRoot: `${packageRoot}/src`,
76
+ projectType: 'library',
77
+ tags: [],
78
+ targets: buildTargets(packageRoot),
79
+ });
80
+ (0, devkit_1.writeJson)(tree, `${packageRoot}/tsconfig.json`, {
81
+ extends: `${offset}tsconfig.base.json`,
82
+ compilerOptions: {
83
+ ...(!inheritsModernResolution && { module: 'commonjs', moduleResolution: 'node10' }),
84
+ ...(!inheritsModernResolution && ignoreDeprecations && { ignoreDeprecations }),
85
+ ...(kind === 'react' && { jsx: 'react-jsx' }),
86
+ esModuleInterop: true,
87
+ strict: true,
88
+ },
89
+ include: ['src/**/*.ts', 'src/**/*.tsx'],
90
+ exclude: ['src/**/*.spec.ts', 'src/**/*.spec.tsx'],
91
+ });
92
+ tree.write(`${packageRoot}/jest.config.cjs`, `module.exports = {
93
+ displayName: '${projectName}',
94
+ testEnvironment: '${kind === 'react' ? 'jsdom' : 'node'}',
95
+ transform: {
96
+ '^.+\\\\.[tj]sx?$': ['@swc/jest', {
97
+ jsc: {
98
+ target: 'es2022',
99
+ parser: { syntax: 'typescript', tsx: true },
100
+ transform: { react: { runtime: 'automatic' } },
101
+ },
102
+ swcrc: false,
103
+ }],
104
+ },
105
+ moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
106
+ };
107
+ `);
108
+ if (!tree.exists(`${packageRoot}/src/index.ts`)) {
109
+ tree.write(`${packageRoot}/src/index.ts`, '');
110
+ }
111
+ }
112
+ const range = `~${(0, versions_js_1.getFrontmcpVersion)()}`;
113
+ const buildDevDependencies = { '@nx/esbuild': (0, versions_js_1.getNxVersion)(), esbuild: '^0.25.0' };
114
+ return kind === 'react'
115
+ ? (0, add_dependencies_js_1.addFrontmcpDependencies)(tree, REACT_DEPENDENCIES, { ...REACT_DEV_DEPENDENCIES, ...buildDevDependencies }, { keepExistingVersions: true })
116
+ : (0, add_dependencies_js_1.addFrontmcpDependencies)(tree, { '@frontmcp/uipack': range }, buildDevDependencies, {
117
+ keepExistingVersions: true,
118
+ });
119
+ }
120
+ //# sourceMappingURL=ensure-ui-package.js.map