|
Some checks are pending
CI: Master (Build, Test, Lint) / Build & format (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (24.18.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (26.5.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Lint (push) Waiting to run
CI: Master (Build, Test, Lint) / Verify single-instance deps (npm-install) (push) Waiting to run
CI: Master (Build, Test, Lint) / Notify Slack on failure (push) Blocked by required conditions
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| src | ||
| biome.jsonc | ||
| eslint.config.mjs | ||
| package.json | ||
| README.md | ||
| stylelint.config.mjs | ||
| tsconfig.json | ||
| vite.config.ts | ||
@n8n/frontend-module-mcp
Frontend feature module. Consumed from source by the editor-ui shell through
src/app/modules.manifest.ts; there is no build step and no dist.
Read the full guide at packages/@n8n/module-cli/frontend-module-guide.md. It gives the
descriptor contract, the registration points and the known problems. This README gives a
summary only.
pnpm turbo typecheck --filter=@n8n/frontend-module-mcp
pnpm turbo lint --filter=@n8n/frontend-module-mcp
pnpm turbo lint:styles --filter=@n8n/frontend-module-mcp
pnpm turbo test --filter=@n8n/frontend-module-mcp
Go through turbo, not pnpm --filter <pkg> typecheck: this package is consumed
from source, and on a cold tree its platform dependencies have not been built
yet. Turbo builds them first; the bare pnpm form does not.
Import rules
- Depend on L0–L2 platform packages only. The full list is in "Imports and
boundaries" in the guide. Never import another
@n8n/frontend-module-*, and never import@/…from the shell. @n8n/stores,@n8n/composables,@n8n/frontend-constantsand@n8n/utilsare subpath-only — import@n8n/stores/settings.store, not@n8n/stores.- The no-cross-module rule is currently a convention: the shared tsconfig base
omits sibling modules from
paths, which blocks an accidental import but not a deliberate one (declaring the dependency makes it typecheck clean). The CAT-3692 tracks the ESLint rule that will enforce it.
Adding UI
vite.config.ts already carries the three plugins a design-system consumer
needs, so a .vue file compiles in tests without further setup:
@vitejs/plugin-vue— single-file components.unplugin-icons— the~icons/lucide/*virtual modules behindN8nIcon.vite-svg-loader— design-system'scustom/*.svgicon components. Without it an.svgimport is a data-URI string, which Vue renders as a tag name.
src/__tests__/design-system-icons.test.ts renders one icon of each kind, so a
plugin dropped from vite.config.ts fails this package's own suite. Keep that
test while the module renders any design-system component.
SCSS goes in a scoped <style lang="scss"> block, with tokens from
design-system — stylelint.config.mjs holds this package to the same rules the
shell uses. Route components must load lazily — see the note in
src/mcp.module.ts.