nodefony 7.0.2 → 10.0.0-alpha.2
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/.ai/symbols.json +36135 -0
- package/LICENSE +544 -0
- package/README.md +316 -694
- package/bin/nodefony +2183 -85
- package/dist/client/Container.js +367 -0
- package/dist/client/Event.js +198 -0
- package/dist/client/Service.js +344 -0
- package/dist/client/Tools.js +162 -0
- package/dist/client/client/ClientKernel.js +276 -0
- package/dist/client/client/angular/index.js +352 -0
- package/dist/client/client/announce.js +212 -0
- package/dist/client/client/debugbar/DebugBar.js +1624 -0
- package/dist/client/client/debugbar/format.js +103 -0
- package/dist/client/client/debugbar/hmr.js +37 -0
- package/dist/client/client/debugbar/index.js +29 -0
- package/dist/client/client/debugbar/model.js +133 -0
- package/dist/client/client/debugbar/network.js +173 -0
- package/dist/client/client/debugbar/profile.js +114 -0
- package/dist/client/client/index.js +34 -0
- package/dist/client/client/react/index.js +268 -0
- package/dist/client/client/realtime/AdaptiveRate.js +240 -0
- package/dist/client/client/realtime/BrowserWsTransport.js +57 -0
- package/dist/client/client/realtime/RealtimeClient.js +898 -0
- package/dist/client/client/realtime/localEvents.js +56 -0
- package/dist/client/client/realtime/notice.js +125 -0
- package/dist/client/client/realtime/observe.js +280 -0
- package/dist/client/client/roles/index.js +3 -0
- package/dist/client/client/roles/registry.js +97 -0
- package/dist/client/client/roles/roles.js +91 -0
- package/dist/client/client/shim/events.js +88 -0
- package/dist/client/client/shim/util.js +20 -0
- package/dist/client/client/svelte/index.js +319 -0
- package/dist/client/client/syslog/context.js +122 -0
- package/dist/client/client/syslog/errors.js +49 -0
- package/dist/client/client/syslog/uplink.js +106 -0
- package/dist/client/client/vue/index.js +321 -0
- package/dist/client/colors.js +63 -0
- package/dist/client/debugbar.standalone.js +4274 -0
- package/dist/client/realtime/IRealtimeTransport.js +32 -0
- package/dist/client/realtime/JsonRpcPeer.js +251 -0
- package/dist/client/realtime/channelRate.js +39 -0
- package/dist/client/realtime/platformChannels.js +155 -0
- package/dist/client/syslog/Pdu.js +224 -0
- package/dist/client/syslog/Syslog.js +1159 -0
- package/dist/client/syslog/drivers/pduFlow.js +106 -0
- package/dist/client/syslog/drivers/pduProtocol.js +28 -0
- package/dist/client/syslog/logColor.js +80 -0
- package/dist/client/types/src/Container.d.ts +221 -0
- package/dist/client/types/src/Event.d.ts +171 -0
- package/dist/client/types/src/FileClass.d.ts +184 -0
- package/dist/client/types/src/Service.d.ts +165 -0
- package/dist/client/types/src/Tools.d.ts +116 -0
- package/dist/client/types/src/client/ClientKernel.d.ts +90 -0
- package/dist/client/types/src/client/IClientKernel.d.ts +195 -0
- package/dist/client/types/src/client/angular/index.d.ts +273 -0
- package/dist/client/types/src/client/announce.d.ts +74 -0
- package/dist/client/types/src/client/debugbar/DebugBar.d.ts +279 -0
- package/dist/client/types/src/client/debugbar/format.d.ts +48 -0
- package/dist/client/types/src/client/debugbar/hmr.d.ts +16 -0
- package/dist/client/types/src/client/debugbar/index.d.ts +30 -0
- package/dist/client/types/src/client/debugbar/model.d.ts +158 -0
- package/dist/client/types/src/client/debugbar/network.d.ts +55 -0
- package/dist/client/types/src/client/debugbar/profile.d.ts +99 -0
- package/dist/client/types/src/client/index.d.ts +47 -0
- package/dist/client/types/src/client/react/index.d.ts +207 -0
- package/dist/client/types/src/client/realtime/AdaptiveRate.d.ts +138 -0
- package/dist/client/types/src/client/realtime/BrowserWsTransport.d.ts +27 -0
- package/dist/client/types/src/client/realtime/RealtimeClient.d.ts +573 -0
- package/dist/client/types/src/client/realtime/localEvents.d.ts +53 -0
- package/dist/client/types/src/client/realtime/notice.d.ts +70 -0
- package/dist/client/types/src/client/realtime/observe.d.ts +284 -0
- package/dist/client/types/src/client/roles/index.d.ts +15 -0
- package/dist/client/types/src/client/roles/registry.d.ts +72 -0
- package/dist/client/types/src/client/roles/roles.d.ts +68 -0
- package/dist/client/types/src/client/shim/cli-color.d.ts +2 -0
- package/dist/client/types/src/client/shim/events.d.ts +39 -0
- package/dist/client/types/src/client/shim/util.d.ts +14 -0
- package/dist/client/types/src/client/svelte/index.d.ts +216 -0
- package/dist/client/types/src/client/syslog/context.d.ts +76 -0
- package/dist/client/types/src/client/syslog/errors.d.ts +46 -0
- package/dist/client/types/src/client/syslog/uplink.d.ts +89 -0
- package/dist/client/types/src/client/transport/websocket.d.ts +5 -0
- package/dist/client/types/src/client/vue/index.d.ts +234 -0
- package/dist/client/types/src/colors.d.ts +32 -0
- package/dist/client/types/src/config/infra.d.ts +171 -0
- package/dist/client/types/src/kernel/bootReport.d.ts +112 -0
- package/dist/client/types/src/kernel/readinessRegistry.d.ts +104 -0
- package/dist/client/types/src/realtime/IRealtimeSocket.d.ts +142 -0
- package/dist/client/types/src/realtime/IRealtimeTransport.d.ts +50 -0
- package/dist/client/types/src/realtime/JsonRpcPeer.d.ts +251 -0
- package/dist/client/types/src/realtime/RealtimeEventMap.d.ts +269 -0
- package/dist/client/types/src/realtime/channelRate.d.ts +55 -0
- package/dist/client/types/src/realtime/platformChannels.d.ts +147 -0
- package/dist/client/types/src/syslog/Pdu.d.ts +134 -0
- package/dist/client/types/src/syslog/Syslog.d.ts +482 -0
- package/dist/client/types/src/syslog/drivers/ILogDriver.d.ts +177 -0
- package/dist/client/types/src/syslog/drivers/pduFlow.d.ts +53 -0
- package/dist/client/types/src/syslog/drivers/pduProtocol.d.ts +20 -0
- package/dist/client/types/src/syslog/logColor.d.ts +59 -0
- package/dist/client/types/src/types/ICliKernel.d.ts +28 -0
- package/dist/client/types/src/types/ICommand.d.ts +14 -0
- package/dist/client/types/src/types/IContainer.d.ts +35 -0
- package/dist/client/types/src/types/IKernel.d.ts +138 -0
- package/dist/client/types/src/types/IMcpTool.d.ts +157 -0
- package/dist/client/types/src/types/IModule.d.ts +73 -0
- package/dist/client/types/src/types/IPage.d.ts +119 -0
- package/dist/client/types/src/types/IService.d.ts +62 -0
- package/dist/client/types/src/types/ISyslog.d.ts +58 -0
- package/dist/client/types/src/types/ITransport.d.ts +5 -0
- package/dist/client/types/src/types/globals.d.ts +47 -0
- package/dist/node/Cli.js +750 -0
- package/dist/node/Container.js +367 -0
- package/dist/node/Error.js +309 -0
- package/dist/node/Event.js +198 -0
- package/dist/node/FileClass.js +308 -0
- package/dist/node/Nodefony.js +78 -0
- package/dist/node/Service.js +344 -0
- package/dist/node/Tools.js +205 -0
- package/dist/node/bin/resolveLocalCli.js +10 -0
- package/dist/node/bundler/index.js +103 -0
- package/dist/node/cli/agentTargets.js +461 -0
- package/dist/node/cli/aiMcp.js +553 -0
- package/dist/node/cli/aiMcpReport.js +129 -0
- package/dist/node/cli/aiSync.js +323 -0
- package/dist/node/cli/aiSyncReport.js +142 -0
- package/dist/node/cli/card.js +186 -0
- package/dist/node/cli/cardReport.js +110 -0
- package/dist/node/cli/completion.js +415 -0
- package/dist/node/cli/create.js +805 -0
- package/dist/node/cli/env.js +332 -0
- package/dist/node/cli/envReport.js +159 -0
- package/dist/node/cli/execPortable.js +60 -0
- package/dist/node/cli/gitHooks.js +191 -0
- package/dist/node/cli/gitHooksReport.js +119 -0
- package/dist/node/cli/globalFlags.js +67 -0
- package/dist/node/cli/helpReport.js +288 -0
- package/dist/node/cli/manPage.js +165 -0
- package/dist/node/cli/nodefonyBin.js +61 -0
- package/dist/node/cli/outdated.js +144 -0
- package/dist/node/cli/progress.js +555 -0
- package/dist/node/cli/projectRoot.js +32 -0
- package/dist/node/cli/promptPassword.js +44 -0
- package/dist/node/cli/prompts.js +86 -0
- package/dist/node/cli/scaffold/destination.js +92 -0
- package/dist/node/cli/scaffold/engine.js +2156 -0
- package/dist/node/cli/scaffold/entityFields.js +589 -0
- package/dist/node/cli/scaffold/format.js +243 -0
- package/dist/node/cli/scaffold/interactive.js +124 -0
- package/dist/node/cli/scaffold/moduleLayout.js +38 -0
- package/dist/node/cli/scaffold/reservedEntities.js +74 -0
- package/dist/node/cli/scaffold/spec.js +704 -0
- package/dist/node/cli/scaffold/steps.js +40 -0
- package/dist/node/cli/scaffold/userContractSource.js +133 -0
- package/dist/node/cli/scaffold/versions.js +57 -0
- package/dist/node/cli/scaffold/writer.js +172 -0
- package/dist/node/cli/startMenu.js +496 -0
- package/dist/node/cli/symbols.js +205 -0
- package/dist/node/cli/sysexits.js +34 -0
- package/dist/node/cli/tableReport.js +184 -0
- package/dist/node/cli/usageReport.js +144 -0
- package/dist/node/colors.js +63 -0
- package/dist/node/command/Builder.js +153 -0
- package/dist/node/command/Command.js +348 -0
- package/dist/node/config/configProvenance.js +101 -0
- package/dist/node/config/defaults.js +39 -0
- package/dist/node/config/defineConfig.js +129 -0
- package/dist/node/config/defineEnv.js +264 -0
- package/dist/node/config/envExample.js +41 -0
- package/dist/node/config/envOverride.js +423 -0
- package/dist/node/config/infra.js +163 -0
- package/dist/node/config/reactivity.js +23 -0
- package/dist/node/config/reservedEnv.js +118 -0
- package/dist/node/config/schema.js +134 -0
- package/dist/node/config/use.js +24 -0
- package/dist/node/finder/File.js +49 -0
- package/dist/node/finder/FileResult.js +86 -0
- package/dist/node/finder/Finder.js +201 -0
- package/dist/node/finder/Result.js +45 -0
- package/dist/node/index.js +121 -0
- package/dist/node/kernel/BootConfigurationError.js +54 -0
- package/dist/node/kernel/CliKernel.js +630 -0
- package/dist/node/kernel/Kernel.js +2198 -0
- package/dist/node/kernel/Module.js +453 -0
- package/dist/node/kernel/adminPlane/adminCaller.js +98 -0
- package/dist/node/kernel/adminPlane/adminRbac.js +51 -0
- package/dist/node/kernel/adminPlane/catalog.js +158 -0
- package/dist/node/kernel/adminPlane/executeAdmin.js +78 -0
- package/dist/node/kernel/checks/deep.js +335 -0
- package/dist/node/kernel/checks/freshness.js +139 -0
- package/dist/node/kernel/checks/gating.js +231 -0
- package/dist/node/kernel/checks/guards.js +232 -0
- package/dist/node/kernel/checks/lastBoot.js +136 -0
- package/dist/node/kernel/checks/live.js +330 -0
- package/dist/node/kernel/checks/packageDeps.js +292 -0
- package/dist/node/kernel/checks/readiness.js +153 -0
- package/dist/node/kernel/checks/renderReport.js +780 -0
- package/dist/node/kernel/checks/report.js +421 -0
- package/dist/node/kernel/checks/runDoctor.js +731 -0
- package/dist/node/kernel/checks/surface.js +364 -0
- package/dist/node/kernel/checks/walk.js +100 -0
- package/dist/node/kernel/checks/wiring.js +450 -0
- package/dist/node/kernel/commands/AiMcpCommand.js +65 -0
- package/dist/node/kernel/commands/AiSyncCommand.js +48 -0
- package/dist/node/kernel/commands/BuildCommand.js +49 -0
- package/dist/node/kernel/commands/CardCommand.js +50 -0
- package/dist/node/kernel/commands/ClusterCommand.js +58 -0
- package/dist/node/kernel/commands/CompletionCommand.js +31 -0
- package/dist/node/kernel/commands/CreateCommand.js +45 -0
- package/dist/node/kernel/commands/DevCommand.js +99 -0
- package/dist/node/kernel/commands/DoctorCommand.js +115 -0
- package/dist/node/kernel/commands/EnvCommand.js +52 -0
- package/dist/node/kernel/commands/GitHooksCommand.js +47 -0
- package/dist/node/kernel/commands/InspectCommand.js +153 -0
- package/dist/node/kernel/commands/InstallCommand.js +20 -0
- package/dist/node/kernel/commands/MenuCommand.js +261 -0
- package/dist/node/kernel/commands/OutdatedCommand.js +164 -0
- package/dist/node/kernel/commands/ProdCommand.js +60 -0
- package/dist/node/kernel/commands/StatusCommand.js +30 -0
- package/dist/node/kernel/commands/StopCommand.js +35 -0
- package/dist/node/kernel/commands/SymbolsCommand.js +45 -0
- package/dist/node/kernel/commands/runtimeLauncher.js +95 -0
- package/dist/node/kernel/decorators/kernelDecorator.js +110 -0
- package/dist/node/kernel/injector/injector.js +137 -0
- package/dist/node/kernel/injector/serviceOrder.js +106 -0
- package/dist/node/kernel/inspect/adminSubjects.js +194 -0
- package/dist/node/kernel/inspect/docOutline.js +86 -0
- package/dist/node/kernel/lifecycleTags.js +76 -0
- package/dist/node/kernel/moduleConfig.js +75 -0
- package/dist/node/kernel/moduleGating.js +68 -0
- package/dist/node/kernel/readinessRegistry.js +98 -0
- package/dist/node/kernel/resolveModuleEntry.js +61 -0
- package/dist/node/mcp/caller.js +40 -0
- package/dist/node/mcp/guard.js +51 -0
- package/dist/node/mcp/protocol.js +157 -0
- package/dist/node/mcp/server.js +216 -0
- package/dist/node/mcp/tools.js +861 -0
- package/dist/node/oauth/authorizationServer.js +221 -0
- package/dist/node/oauth/protectedResource.js +293 -0
- package/dist/node/package.js +4 -0
- package/dist/node/realtime/IRealtimeTransport.js +32 -0
- package/dist/node/realtime/JsonRpcPeer.js +251 -0
- package/dist/node/realtime/RealtimeEventMap.js +15 -0
- package/dist/node/realtime/channelRate.js +39 -0
- package/dist/node/realtime/platformChannels.js +155 -0
- package/dist/node/runtime/GcScheduler.js +92 -0
- package/dist/node/runtime/RequestContext.js +76 -0
- package/dist/node/runtime/bearer.js +84 -0
- package/dist/node/runtime/engineEnvironment.js +79 -0
- package/dist/node/runtime/loadEnv.js +105 -0
- package/dist/node/runtime/pageFacets.js +85 -0
- package/dist/node/runtime/pageFilters.js +103 -0
- package/dist/node/runtime/pageGuard.js +84 -0
- package/dist/node/runtime/pageQuery.js +160 -0
- package/dist/node/runtime/pageSort.js +114 -0
- package/dist/node/runtime/redact.js +43 -0
- package/dist/node/runtime/withTimeout.js +71 -0
- package/dist/node/service/cluster/ClusterManager.js +202 -0
- package/dist/node/service/cluster/ClusterProbeAggregator.js +120 -0
- package/dist/node/service/cluster/ClusterRelay.js +74 -0
- package/dist/node/service/cluster/clusterMaster.js +65 -0
- package/dist/node/service/cluster/clusterMessage.js +70 -0
- package/dist/node/service/cluster/cpuQuota.js +59 -0
- package/dist/node/service/cluster/instanceProbe.js +52 -0
- package/dist/node/service/cluster/podEnvironment.js +48 -0
- package/dist/node/service/cluster/processProbe.js +70 -0
- package/dist/node/service/cluster/richProcessProbe.js +115 -0
- package/dist/node/service/cluster/topology.js +71 -0
- package/dist/node/service/dev/BootReporter.js +490 -0
- package/dist/node/service/dev/DevSupervisor.js +1004 -0
- package/dist/node/service/dev/bootVerdict.js +158 -0
- package/dist/node/service/dev/detachedStart.js +372 -0
- package/dist/node/service/dev/devProcess.js +1137 -0
- package/dist/node/service/dev/devProjects.js +138 -0
- package/dist/node/service/dev/devStatusReport.js +395 -0
- package/dist/node/service/dev/devStop.js +263 -0
- package/dist/node/service/fetchService.js +35 -0
- package/dist/node/service/gitService.js +62 -0
- package/dist/node/syslog/Pdu.js +224 -0
- package/dist/node/syslog/Syslog.js +1159 -0
- package/dist/node/syslog/drivers/ClusterFileLogDriver.js +114 -0
- package/dist/node/syslog/drivers/FileLogDriver.js +127 -0
- package/dist/node/syslog/drivers/ILogDriver.js +26 -0
- package/dist/node/syslog/drivers/LokiLogDriver.js +144 -0
- package/dist/node/syslog/drivers/MemoryLogDriver.js +33 -0
- package/dist/node/syslog/drivers/OpenSearchLogDriver.js +159 -0
- package/dist/node/syslog/drivers/builtinLogDrivers.js +114 -0
- package/dist/node/syslog/drivers/filterPdus.js +71 -0
- package/dist/node/syslog/drivers/logDriverRegistry.js +83 -0
- package/dist/node/syslog/drivers/opensearchShared.js +17 -0
- package/dist/node/syslog/drivers/pduFlow.js +106 -0
- package/dist/node/syslog/drivers/pduProtocol.js +28 -0
- package/dist/node/syslog/httpFetch.js +43 -0
- package/dist/node/syslog/logColor.js +80 -0
- package/dist/node/syslog/sinks/FileSink.js +142 -0
- package/dist/node/syslog/transports/BatchingHttpTransport.js +98 -0
- package/dist/node/syslog/transports/ConsoleTransport.js +14 -0
- package/dist/node/syslog/transports/FileTransport.js +17 -0
- package/dist/node/syslog/transports/HttpTransport.js +44 -0
- package/dist/node/syslog/transports/LokiTransport.js +80 -0
- package/dist/node/syslog/transports/OpenSearchTransport.js +53 -0
- package/dist/node/syslog/transports/SyslogTransport.js +13 -0
- package/dist/node/syslog/transports/index.js +8 -0
- package/dist/node/testing/index.js +190 -0
- package/dist/types/Cli.d.ts +177 -0
- package/dist/types/Container.d.ts +221 -0
- package/dist/types/Error.d.ts +162 -0
- package/dist/types/Event.d.ts +171 -0
- package/dist/types/FileClass.d.ts +184 -0
- package/dist/types/Nodefony.d.ts +66 -0
- package/dist/types/Service.d.ts +165 -0
- package/dist/types/Tools.d.ts +116 -0
- package/dist/types/bin/resolveLocalCli.d.ts +49 -0
- package/dist/types/bundler/index.d.ts +66 -0
- package/dist/types/cli/agentTargets.d.ts +378 -0
- package/dist/types/cli/aiMcp.d.ts +239 -0
- package/dist/types/cli/aiMcpReport.d.ts +113 -0
- package/dist/types/cli/aiSync.d.ts +68 -0
- package/dist/types/cli/aiSyncReport.d.ts +149 -0
- package/dist/types/cli/card.d.ts +49 -0
- package/dist/types/cli/cardReport.d.ts +127 -0
- package/dist/types/cli/completion.d.ts +154 -0
- package/dist/types/cli/create.d.ts +177 -0
- package/dist/types/cli/env.d.ts +103 -0
- package/dist/types/cli/envReport.d.ts +153 -0
- package/dist/types/cli/execPortable.d.ts +54 -0
- package/dist/types/cli/gitHooks.d.ts +48 -0
- package/dist/types/cli/gitHooksReport.d.ts +101 -0
- package/dist/types/cli/globalFlags.d.ts +48 -0
- package/dist/types/cli/helpReport.d.ts +110 -0
- package/dist/types/cli/manPage.d.ts +21 -0
- package/dist/types/cli/nodefonyBin.d.ts +45 -0
- package/dist/types/cli/outdated.d.ts +119 -0
- package/dist/types/cli/progress.d.ts +349 -0
- package/dist/types/cli/projectRoot.d.ts +19 -0
- package/dist/types/cli/promptPassword.d.ts +22 -0
- package/dist/types/cli/prompts.d.ts +102 -0
- package/dist/types/cli/scaffold/destination.d.ts +70 -0
- package/dist/types/cli/scaffold/engine.d.ts +545 -0
- package/dist/types/cli/scaffold/entityFields.d.ts +238 -0
- package/dist/types/cli/scaffold/format.d.ts +78 -0
- package/dist/types/cli/scaffold/interactive.d.ts +11 -0
- package/dist/types/cli/scaffold/moduleLayout.d.ts +69 -0
- package/dist/types/cli/scaffold/reservedEntities.d.ts +49 -0
- package/dist/types/cli/scaffold/spec.d.ts +159 -0
- package/dist/types/cli/scaffold/steps.d.ts +24 -0
- package/dist/types/cli/scaffold/userContractSource.d.ts +86 -0
- package/dist/types/cli/scaffold/versions.d.ts +14 -0
- package/dist/types/cli/scaffold/writer.d.ts +100 -0
- package/dist/types/cli/startMenu.d.ts +195 -0
- package/dist/types/cli/symbols.d.ts +84 -0
- package/dist/types/cli/sysexits.d.ts +31 -0
- package/dist/types/cli/tableReport.d.ts +44 -0
- package/dist/types/cli/usageReport.d.ts +108 -0
- package/dist/types/client/ClientKernel.d.ts +90 -0
- package/dist/types/client/IClientKernel.d.ts +195 -0
- package/dist/types/client/angular/index.d.ts +273 -0
- package/dist/types/client/announce.d.ts +74 -0
- package/dist/types/client/debugbar/DebugBar.d.ts +279 -0
- package/dist/types/client/debugbar/format.d.ts +48 -0
- package/dist/types/client/debugbar/hmr.d.ts +16 -0
- package/dist/types/client/debugbar/index.d.ts +30 -0
- package/dist/types/client/debugbar/model.d.ts +158 -0
- package/dist/types/client/debugbar/network.d.ts +55 -0
- package/dist/types/client/debugbar/profile.d.ts +99 -0
- package/dist/types/client/index.d.ts +47 -0
- package/dist/types/client/react/index.d.ts +207 -0
- package/dist/types/client/realtime/AdaptiveRate.d.ts +138 -0
- package/dist/types/client/realtime/BrowserWsTransport.d.ts +27 -0
- package/dist/types/client/realtime/RealtimeClient.d.ts +573 -0
- package/dist/types/client/realtime/localEvents.d.ts +53 -0
- package/dist/types/client/realtime/notice.d.ts +70 -0
- package/dist/types/client/realtime/observe.d.ts +284 -0
- package/dist/types/client/roles/index.d.ts +15 -0
- package/dist/types/client/roles/registry.d.ts +72 -0
- package/dist/types/client/roles/roles.d.ts +68 -0
- package/dist/types/client/shim/cli-color.d.ts +2 -0
- package/dist/types/client/shim/events.d.ts +39 -0
- package/dist/types/client/shim/util.d.ts +14 -0
- package/dist/types/client/svelte/index.d.ts +216 -0
- package/dist/types/client/syslog/context.d.ts +76 -0
- package/dist/types/client/syslog/errors.d.ts +46 -0
- package/dist/types/client/syslog/uplink.d.ts +89 -0
- package/dist/types/client/transport/websocket.d.ts +5 -0
- package/dist/types/client/vue/index.d.ts +234 -0
- package/dist/types/colors.d.ts +32 -0
- package/dist/types/command/Builder.d.ts +47 -0
- package/dist/types/command/Command.d.ts +268 -0
- package/dist/types/config/configMeta.d.ts +53 -0
- package/dist/types/config/configProvenance.d.ts +58 -0
- package/dist/types/config/defaults.d.ts +33 -0
- package/dist/types/config/defineConfig.d.ts +70 -0
- package/dist/types/config/defineEnv.d.ts +170 -0
- package/dist/types/config/envExample.d.ts +23 -0
- package/dist/types/config/envOverride.d.ts +236 -0
- package/dist/types/config/index.d.ts +23 -0
- package/dist/types/config/infra.d.ts +171 -0
- package/dist/types/config/reactivity.d.ts +36 -0
- package/dist/types/config/reservedEnv.d.ts +145 -0
- package/dist/types/config/schema.d.ts +113 -0
- package/dist/types/config/types.d.ts +374 -0
- package/dist/types/config/use.d.ts +80 -0
- package/dist/types/finder/File.d.ts +26 -0
- package/dist/types/finder/FileResult.d.ts +14 -0
- package/dist/types/finder/Finder.d.ts +51 -0
- package/dist/types/finder/Result.d.ts +10 -0
- package/dist/types/index.d.ts +205 -0
- package/dist/types/kernel/BootConfigurationError.d.ts +50 -0
- package/dist/types/kernel/CliKernel.d.ts +289 -0
- package/dist/types/kernel/Kernel.d.ts +1255 -0
- package/dist/types/kernel/Module.d.ts +326 -0
- package/dist/types/kernel/adminPlane/adminCaller.d.ts +105 -0
- package/dist/types/kernel/adminPlane/adminRbac.d.ts +44 -0
- package/dist/types/kernel/adminPlane/catalog.d.ts +122 -0
- package/dist/types/kernel/adminPlane/executeAdmin.d.ts +99 -0
- package/dist/types/kernel/bootReport.d.ts +112 -0
- package/dist/types/kernel/checks/deep.d.ts +122 -0
- package/dist/types/kernel/checks/freshness.d.ts +49 -0
- package/dist/types/kernel/checks/gating.d.ts +134 -0
- package/dist/types/kernel/checks/guards.d.ts +57 -0
- package/dist/types/kernel/checks/lastBoot.d.ts +189 -0
- package/dist/types/kernel/checks/live.d.ts +110 -0
- package/dist/types/kernel/checks/packageDeps.d.ts +44 -0
- package/dist/types/kernel/checks/readiness.d.ts +97 -0
- package/dist/types/kernel/checks/renderReport.d.ts +107 -0
- package/dist/types/kernel/checks/report.d.ts +414 -0
- package/dist/types/kernel/checks/runDoctor.d.ts +361 -0
- package/dist/types/kernel/checks/surface.d.ts +148 -0
- package/dist/types/kernel/checks/walk.d.ts +45 -0
- package/dist/types/kernel/checks/wiring.d.ts +54 -0
- package/dist/types/kernel/commands/AiMcpCommand.d.ts +39 -0
- package/dist/types/kernel/commands/AiSyncCommand.d.ts +28 -0
- package/dist/types/kernel/commands/BuildCommand.d.ts +13 -0
- package/dist/types/kernel/commands/CardCommand.d.ts +34 -0
- package/dist/types/kernel/commands/ClusterCommand.d.ts +29 -0
- package/dist/types/kernel/commands/CompletionCommand.d.ts +17 -0
- package/dist/types/kernel/commands/CreateCommand.d.ts +16 -0
- package/dist/types/kernel/commands/DevCommand.d.ts +40 -0
- package/dist/types/kernel/commands/DoctorCommand.d.ts +55 -0
- package/dist/types/kernel/commands/EnvCommand.d.ts +35 -0
- package/dist/types/kernel/commands/GitHooksCommand.d.ts +27 -0
- package/dist/types/kernel/commands/InspectCommand.d.ts +59 -0
- package/dist/types/kernel/commands/InstallCommand.d.ts +7 -0
- package/dist/types/kernel/commands/MenuCommand.d.ts +58 -0
- package/dist/types/kernel/commands/OutdatedCommand.d.ts +47 -0
- package/dist/types/kernel/commands/ProdCommand.d.ts +29 -0
- package/dist/types/kernel/commands/StatusCommand.d.ts +17 -0
- package/dist/types/kernel/commands/StopCommand.d.ts +17 -0
- package/dist/types/kernel/commands/SymbolsCommand.d.ts +29 -0
- package/dist/types/kernel/commands/runtimeLauncher.d.ts +76 -0
- package/dist/types/kernel/decorators/kernelDecorator.d.ts +76 -0
- package/dist/types/kernel/injector/injector.d.ts +47 -0
- package/dist/types/kernel/injector/serviceOrder.d.ts +29 -0
- package/dist/types/kernel/inspect/adminSubjects.d.ts +169 -0
- package/dist/types/kernel/inspect/docOutline.d.ts +53 -0
- package/dist/types/kernel/lifecycleTags.d.ts +79 -0
- package/dist/types/kernel/moduleConfig.d.ts +35 -0
- package/dist/types/kernel/moduleGating.d.ts +78 -0
- package/dist/types/kernel/readinessRegistry.d.ts +104 -0
- package/dist/types/kernel/resolveModuleEntry.d.ts +46 -0
- package/dist/types/mcp/caller.d.ts +55 -0
- package/dist/types/mcp/guard.d.ts +66 -0
- package/dist/types/mcp/protocol.d.ts +163 -0
- package/dist/types/mcp/server.d.ts +70 -0
- package/dist/types/mcp/tools.d.ts +209 -0
- package/dist/types/oauth/authorizationServer.d.ts +204 -0
- package/dist/types/oauth/protectedResource.d.ts +339 -0
- package/dist/types/realtime/IRealtimeSocket.d.ts +142 -0
- package/dist/types/realtime/IRealtimeTransport.d.ts +50 -0
- package/dist/types/realtime/JsonRpcPeer.d.ts +251 -0
- package/dist/types/realtime/RealtimeEventMap.d.ts +269 -0
- package/dist/types/realtime/channelRate.d.ts +55 -0
- package/dist/types/realtime/platformChannels.d.ts +147 -0
- package/dist/types/runtime/GcScheduler.d.ts +96 -0
- package/dist/types/runtime/RequestContext.d.ts +152 -0
- package/dist/types/runtime/bearer.d.ts +88 -0
- package/dist/types/runtime/engineEnvironment.d.ts +115 -0
- package/dist/types/runtime/loadEnv.d.ts +86 -0
- package/dist/types/runtime/pageFacets.d.ts +104 -0
- package/dist/types/runtime/pageFilters.d.ts +139 -0
- package/dist/types/runtime/pageGuard.d.ts +78 -0
- package/dist/types/runtime/pageQuery.d.ts +138 -0
- package/dist/types/runtime/pageSort.d.ts +86 -0
- package/dist/types/runtime/redact.d.ts +27 -0
- package/dist/types/runtime/withTimeout.d.ts +51 -0
- package/dist/types/service/cluster/ClusterManager.d.ts +112 -0
- package/dist/types/service/cluster/ClusterProbeAggregator.d.ts +68 -0
- package/dist/types/service/cluster/ClusterRelay.d.ts +57 -0
- package/dist/types/service/cluster/clusterMaster.d.ts +40 -0
- package/dist/types/service/cluster/clusterMessage.d.ts +94 -0
- package/dist/types/service/cluster/cpuQuota.d.ts +37 -0
- package/dist/types/service/cluster/instanceProbe.d.ts +82 -0
- package/dist/types/service/cluster/podEnvironment.d.ts +35 -0
- package/dist/types/service/cluster/processProbe.d.ts +53 -0
- package/dist/types/service/cluster/richProcessProbe.d.ts +77 -0
- package/dist/types/service/cluster/topology.d.ts +64 -0
- package/dist/types/service/dev/BootReporter.d.ts +67 -0
- package/dist/types/service/dev/DevSupervisor.d.ts +117 -0
- package/dist/types/service/dev/bootVerdict.d.ts +99 -0
- package/dist/types/service/dev/detachedStart.d.ts +164 -0
- package/dist/types/service/dev/devProcess.d.ts +638 -0
- package/dist/types/service/dev/devProjects.d.ts +121 -0
- package/dist/types/service/dev/devStatusReport.d.ts +141 -0
- package/dist/types/service/dev/devStop.d.ts +57 -0
- package/dist/types/service/fetchService.d.ts +29 -0
- package/dist/types/service/gitService.d.ts +24 -0
- package/dist/types/syslog/Pdu.d.ts +134 -0
- package/dist/types/syslog/Syslog.d.ts +482 -0
- package/dist/types/syslog/drivers/ClusterFileLogDriver.d.ts +40 -0
- package/dist/types/syslog/drivers/FileLogDriver.d.ts +55 -0
- package/dist/types/syslog/drivers/ILogDriver.d.ts +177 -0
- package/dist/types/syslog/drivers/LokiLogDriver.d.ts +44 -0
- package/dist/types/syslog/drivers/MemoryLogDriver.d.ts +20 -0
- package/dist/types/syslog/drivers/OpenSearchLogDriver.d.ts +40 -0
- package/dist/types/syslog/drivers/builtinLogDrivers.d.ts +43 -0
- package/dist/types/syslog/drivers/filterPdus.d.ts +21 -0
- package/dist/types/syslog/drivers/logDriverRegistry.d.ts +100 -0
- package/dist/types/syslog/drivers/opensearchShared.d.ts +11 -0
- package/dist/types/syslog/drivers/pduFlow.d.ts +53 -0
- package/dist/types/syslog/drivers/pduProtocol.d.ts +20 -0
- package/dist/types/syslog/httpFetch.d.ts +48 -0
- package/dist/types/syslog/logColor.d.ts +59 -0
- package/dist/types/syslog/sinks/FileSink.d.ts +78 -0
- package/dist/types/syslog/transports/BatchingHttpTransport.d.ts +59 -0
- package/dist/types/syslog/transports/ConsoleTransport.d.ts +8 -0
- package/dist/types/syslog/transports/FileTransport.d.ts +13 -0
- package/dist/types/syslog/transports/HttpTransport.d.ts +15 -0
- package/dist/types/syslog/transports/LokiTransport.d.ts +45 -0
- package/dist/types/syslog/transports/OpenSearchTransport.d.ts +40 -0
- package/dist/types/syslog/transports/SyslogTransport.d.ts +9 -0
- package/dist/types/syslog/transports/index.d.ts +12 -0
- package/dist/types/testing/index.d.ts +197 -0
- package/dist/types/types/IAdminApi.d.ts +246 -0
- package/dist/types/types/ICliKernel.d.ts +28 -0
- package/dist/types/types/ICommand.d.ts +14 -0
- package/dist/types/types/IContainer.d.ts +35 -0
- package/dist/types/types/IIdempotencyStore.d.ts +159 -0
- package/dist/types/types/IKernel.d.ts +138 -0
- package/dist/types/types/IMcpTool.d.ts +157 -0
- package/dist/types/types/IModule.d.ts +73 -0
- package/dist/types/types/IModuleManifest.d.ts +49 -0
- package/dist/types/types/IPage.d.ts +119 -0
- package/dist/types/types/IService.d.ts +62 -0
- package/dist/types/types/ISyslog.d.ts +58 -0
- package/dist/types/types/ITransport.d.ts +5 -0
- package/dist/types/types/globals.d.ts +47 -0
- package/docs/angular-services.md +318 -0
- package/docs/catalogue.md +184 -0
- package/docs/cli.md +369 -0
- package/docs/client.md +616 -0
- package/docs/debugbar.md +218 -0
- package/docs/environnement.md +308 -0
- package/docs/index.md +388 -0
- package/docs/kernel.md +670 -0
- package/docs/progression.md +228 -0
- package/docs/react-hooks.md +686 -0
- package/docs/request-context.md +507 -0
- package/docs/service.md +590 -0
- package/docs/svelte-reactivite.md +293 -0
- package/docs/syslog.md +848 -0
- package/docs/testing.md +203 -0
- package/docs/vue-composables.md +255 -0
- package/man/nodefony.1 +152 -0
- package/package.json +163 -83
- package/templates/app/agents/AGENTS.md.tpl +967 -0
- package/templates/app/agents/POINTEUR.md.tpl +12 -0
- package/templates/app/base/Dockerfile.tpl +104 -0
- package/templates/app/base/README.md.tpl +314 -0
- package/templates/app/base/dockerignore.tpl +28 -0
- package/templates/app/base/env.ts.tpl +130 -0
- package/templates/app/base/gitattributes.tpl +28 -0
- package/templates/app/base/github/workflows/ci.yml.tpl +91 -0
- package/templates/app/base/gitignore.tpl +46 -0
- package/templates/app/base/gitlab-ci.yml.tpl +42 -0
- package/templates/app/base/index.ts.tpl +69 -0
- package/templates/app/base/nodefony.config.ts.tpl +342 -0
- package/templates/app/base/oxlintrc.json.tpl +127 -0
- package/templates/app/base/package.json.tpl +75 -0
- package/templates/app/base/prettierignore.tpl +24 -0
- package/templates/app/base/prettierrc.json.tpl +12 -0
- package/templates/app/base/rolldown.config.ts.tpl +8 -0
- package/templates/app/base/tests/config.test.ts.tpl +29 -0
- package/templates/app/base/tests/e2e.setup.ts.tpl +181 -0
- package/templates/app/base/tests/e2e.test.ts.tpl +105 -0
- package/templates/app/base/tests/migrations.e2e.test.ts.tpl +579 -0
- package/templates/app/base/tsconfig.json.tpl +47 -0
- package/templates/app/base/vitest.config.ts.tpl +88 -0
- package/templates/app/base/vitest.e2e.config.ts.tpl +39 -0
- package/templates/app/complete/compose.yaml.tpl +328 -0
- package/templates/app/complete/deploy/migrate-job.yaml.tpl +100 -0
- package/templates/app/complete/docker/db/init-nodefony-e2e.sql.tpl +30 -0
- package/templates/app/complete/docker/grafana/provisioning/datasources/loki.yaml.tpl +15 -0
- package/templates/app/complete/env.local.tpl +11 -0
- package/templates/app/complete/env.tpl +53 -0
- package/templates/app/complete/nodefony/entity/User.ts.tpl +69 -0
- package/templates/app/complete/nodefony/security/provisionUsers.ts.tpl +124 -0
- package/templates/app/complete/nodefony/service/AppBannerService.ts.tpl +98 -0
- package/templates/app/complete/nodefony/service/AppInfoService.ts.tpl +85 -0
- package/templates/app/frontend/angular/frontend/src/accent.css.tpl +34 -0
- package/templates/app/frontend/angular/frontend/src/app/app.component.ts.tpl +400 -0
- package/templates/app/frontend/react/frontend/src/App.tsx.tpl +421 -0
- package/templates/app/frontend/react/frontend/src/accent.css.tpl +30 -0
- package/templates/app/frontend/shared/frontend/src/brand.ts.tpl +3 -0
- package/templates/app/frontend/shared/frontend/src/showcase.css.tpl +224 -0
- package/templates/app/frontend/shared/nodefony/controllers/AppController.ts.tpl +45 -0
- package/templates/app/frontend/svelte/frontend/src/App.svelte.tpl +371 -0
- package/templates/app/frontend/svelte/frontend/src/accent.css.tpl +34 -0
- package/templates/app/frontend/vue/frontend/src/App.vue.tpl +367 -0
- package/templates/app/frontend/vue/frontend/src/accent.css.tpl +34 -0
- package/templates/app/home/nodefony/controllers/HomeController.ts.tpl +38 -0
- package/templates/command/nodefony/command/__NAME__.ts.tpl +132 -0
- package/templates/controller/duplex/nodefony/controllers/__NAME__.ts.tpl +188 -0
- package/templates/controller/example/nodefony/controllers/__NAME__.ts.tpl +348 -0
- package/templates/controller/hello/nodefony/controllers/__NAME__.ts.tpl +143 -0
- package/templates/controller/realtime/nodefony/controllers/__NAME__.ts.tpl +153 -0
- package/templates/controller/realtime/tests/__KEBAB__-realtime.test.ts.tpl +79 -0
- package/templates/controller/rest/nodefony/controllers/__NAME__.ts.tpl +159 -0
- package/templates/entity/base/nodefony/entity/__PASCAL__.schema.ts.tpl +31 -0
- package/templates/entity/base/nodefony/entity/__PASCAL__.ts.tpl +68 -0
- package/templates/entity/controller/nodefony/controllers/__PASCAL__Controller.ts.tpl +335 -0
- package/templates/entity/service/nodefony/service/__PASCAL__Service.ts.tpl +126 -0
- package/templates/entity/tests/tests/__KEBAB__.e2e.test.ts.tpl +358 -0
- package/templates/entity/tests/tests/__KEBAB__.test.ts.tpl +87 -0
- package/templates/front/angular/frontend/src/app/app.component.ts.tpl +30 -0
- package/templates/front/base/nodefony/controllers/__NAME__.ts.tpl +60 -0
- package/templates/front/react/frontend/src/App.tsx.tpl +26 -0
- package/templates/front/svelte/frontend/src/App.svelte.tpl +19 -0
- package/templates/front/vue/frontend/src/App.vue.tpl +23 -0
- package/templates/module/ai/AGENTS.md.tpl +71 -0
- package/templates/module/base/README.md.tpl +62 -0
- package/templates/module/base/docs/index.md.tpl +55 -0
- package/templates/module/base/index.ts.tpl +50 -0
- package/templates/module/base/nodefony/config/config.ts.tpl +60 -0
- package/templates/module/base/nodefony/config/defineModuleConfig.ts.tpl +55 -0
- package/templates/module/base/nodefony/src/errors/__PASCAL__Error.ts.tpl +20 -0
- package/templates/module/base/package.json.tpl +53 -0
- package/templates/module/base/rolldown.config.ts.tpl +14 -0
- package/templates/module/base/tests/__KEBAB__.test.ts.tpl +39 -0
- package/templates/module/base/tsconfig.json.tpl +42 -0
- package/templates/module/base/vitest.config.ts.tpl +27 -0
- package/templates/module/packages/CLAUDE.md.tpl +51 -0
- package/templates/module/packages/MEMORY.md.tpl +39 -0
- package/templates/module/packages/tsconfig.declarations.json.tpl +19 -0
- package/templates/module/packages/tsconfig.tests.json.tpl +11 -0
- package/templates/module/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +14 -0
- package/templates/module/service/nodefony/interfaces/index.ts.tpl +1 -0
- package/templates/module/service/nodefony/service/__PASCAL__Service.ts.tpl +116 -0
- package/templates/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +19 -0
- package/templates/service/nodefony/service/__PASCAL__Service.ts.tpl +136 -0
- package/templates/service/tests/__PASCAL__Service.test.ts.tpl +53 -0
- package/templates/shared/front-entry/angular/frontend/src/main.ts.tpl +17 -0
- package/templates/shared/front-entry/react/frontend/src/main.tsx.tpl +11 -0
- package/templates/shared/front-entry/svelte/frontend/src/main.ts.tpl +13 -0
- package/templates/shared/front-entry/vue/frontend/src/main.ts.tpl +12 -0
- package/templates/shared/front-registrar/nodefony/frontend/register__PASCAL__Entry.ts.tpl +40 -0
- package/templates/shared/front-shell/frontend/index.html.tpl +39 -0
- package/templates/shared/ng-app-tsconfig/frontend/tsconfig.app.json.tpl +18 -0
- package/templates/shared/svelte-shim/frontend/src/env.d.ts.tpl +12 -0
- package/templates/shared/vue-shim/frontend/src/env.d.ts.tpl +15 -0
- package/.yarnclean +0 -45
- package/CHANGELOG.md +0 -406
- package/autoloader.es6 +0 -253
- package/builder.es6 +0 -366
- package/cli/builder/bundles/bundle.js +0 -328
- package/cli/builder/bundles/controller.js +0 -73
- package/cli/builder/bundles/users-bundle/.yarnclean +0 -45
- package/cli/builder/bundles/users-bundle/Command/fixtureTask.js +0 -47
- package/cli/builder/bundles/users-bundle/Command/usersCommand.js +0 -105
- package/cli/builder/bundles/users-bundle/Entity/mongoose/userEntity.js +0 -168
- package/cli/builder/bundles/users-bundle/Entity/sequelize/userEntity.js +0 -231
- package/cli/builder/bundles/users-bundle/Fixtures/users.js +0 -117
- package/cli/builder/bundles/users-bundle/Fixtures/usersFixtures.js +0 -114
- package/cli/builder/bundles/users-bundle/Resources/config/config.js +0 -90
- package/cli/builder/bundles/users-bundle/Resources/config/routing.js +0 -17
- package/cli/builder/bundles/users-bundle/Resources/config/security.js +0 -96
- package/cli/builder/bundles/users-bundle/Resources/config/services.js +0 -7
- package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.dev.config.js +0 -13
- package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.prod.config.js +0 -31
- package/cli/builder/bundles/users-bundle/Resources/config/webpack.config.js +0 -146
- package/cli/builder/bundles/users-bundle/Resources/js/users.js +0 -153
- package/cli/builder/bundles/users-bundle/Resources/public/favicon.ico +0 -0
- package/cli/builder/bundles/users-bundle/Resources/public/images/users-logo.png +0 -0
- package/cli/builder/bundles/users-bundle/Resources/scss/awesome/font-awesome.config.js +0 -11
- package/cli/builder/bundles/users-bundle/Resources/scss/custom.scss +0 -23
- package/cli/builder/bundles/users-bundle/Resources/scss/users.scss +0 -59
- package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/login.js +0 -235
- package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/users.js +0 -232
- package/cli/builder/bundles/users-bundle/Resources/translations/login.en_en.yml +0 -14
- package/cli/builder/bundles/users-bundle/Resources/translations/login.fr_fr.yml +0 -14
- package/cli/builder/bundles/users-bundle/Resources/translations/users.en_en.yml +0 -35
- package/cli/builder/bundles/users-bundle/Resources/translations/users.fr_fr.yml +0 -36
- package/cli/builder/bundles/users-bundle/Resources/views/base.html.twig +0 -32
- package/cli/builder/bundles/users-bundle/Resources/views/footer.html.twig +0 -7
- package/cli/builder/bundles/users-bundle/Resources/views/header.html.twig +0 -90
- package/cli/builder/bundles/users-bundle/Resources/views/login/login.html.twig +0 -43
- package/cli/builder/bundles/users-bundle/Resources/views/users/createUser.html.twig +0 -296
- package/cli/builder/bundles/users-bundle/Resources/views/users/readUsers.html.twig +0 -94
- package/cli/builder/bundles/users-bundle/controller/api/graphql/graphqlController.js +0 -56
- package/cli/builder/bundles/users-bundle/controller/api/graphql/userResolver.js +0 -121
- package/cli/builder/bundles/users-bundle/controller/api/graphql/usertype.js +0 -58
- package/cli/builder/bundles/users-bundle/controller/api/openapi/loginApiController.js +0 -210
- package/cli/builder/bundles/users-bundle/controller/api/openapi/restUserController.js +0 -244
- package/cli/builder/bundles/users-bundle/controller/loginController.js +0 -91
- package/cli/builder/bundles/users-bundle/controller/usersController.js +0 -332
- package/cli/builder/bundles/users-bundle/package.json +0 -58
- package/cli/builder/bundles/users-bundle/readme.md +0 -360
- package/cli/builder/bundles/users-bundle/services/usersService.js +0 -411
- package/cli/builder/bundles/users-bundle/src/providers/mongoose/userProvider.js +0 -47
- package/cli/builder/bundles/users-bundle/src/providers/sequelize/userProvider.js +0 -48
- package/cli/builder/bundles/users-bundle/tests/loginTest.js +0 -182
- package/cli/builder/bundles/users-bundle/usersBundle.js +0 -26
- package/cli/builder/microService/microService.js +0 -261
- package/cli/builder/microService/skeletons/.editorconfig +0 -18
- package/cli/builder/microService/skeletons/.env-cmdrc.js +0 -32
- package/cli/builder/microService/skeletons/.jshintrc +0 -37
- package/cli/builder/microService/skeletons/README.md +0 -117
- package/cli/builder/microService/skeletons/bin/bash/hello.sh +0 -5
- package/cli/builder/microService/skeletons/bin/cli +0 -13
- package/cli/builder/microService/skeletons/bin/python/hello.py +0 -20
- package/cli/builder/microService/skeletons/config/config.js +0 -29
- package/cli/builder/microService/skeletons/config/pm2.config.js +0 -72
- package/cli/builder/microService/skeletons/config/webpack/webpack.config.dev.js +0 -8
- package/cli/builder/microService/skeletons/config/webpack/webpack.config.prod.js +0 -25
- package/cli/builder/microService/skeletons/config/webpack.config.js +0 -114
- package/cli/builder/microService/skeletons/package.json +0 -76
- package/cli/builder/microService/skeletons/src/browser/index.css +0 -3
- package/cli/builder/microService/skeletons/src/browser/index.js +0 -16
- package/cli/builder/microService/skeletons/src/browser/socketio.js +0 -46
- package/cli/builder/microService/skeletons/src/cli/cli.js +0 -224
- package/cli/builder/microService/skeletons/src/cli/menu.js +0 -28
- package/cli/builder/microService/skeletons/src/n-api/README.md +0 -1
- package/cli/builder/microService/skeletons/src/n-api/binding.gyp +0 -14
- package/cli/builder/microService/skeletons/src/n-api/hello.cc +0 -14
- package/cli/builder/microService/skeletons/src/n-api/hello.js +0 -23
- package/cli/builder/microService/skeletons/src/n-api/package.json +0 -15
- package/cli/builder/microService/skeletons/src/node/examples/index.js +0 -120
- package/cli/builder/microService/skeletons/src/node/index.js +0 -102
- package/cli/builder/microService/skeletons/src/node/services/markdown/markdown.js +0 -27
- package/cli/builder/microService/skeletons/src/node/services/servers/http.js +0 -45
- package/cli/builder/microService/skeletons/src/node/services/servers/https.js +0 -44
- package/cli/builder/microService/skeletons/src/node/services/socketio/socketio.js +0 -46
- package/cli/builder/microService/skeletons/src/node/services/syscall/syscall.js +0 -111
- package/cli/builder/microService/skeletons/src/node/services/worker/thread.js +0 -59
- package/cli/builder/microService/skeletons/src/node/services/worker/worker.js +0 -60
- package/cli/builder/microService/skeletons/src/templates/base.html +0 -12
- package/cli/builder/microService/skeletons/src/templates/socket.html +0 -23
- package/cli/builder/microService/skeletons/tests/unit/serviceTest.js +0 -30
- package/cli/builder/project/project.js +0 -474
- package/cli/builder/project/skeletons/README.md +0 -778
- package/cli/builder/project/skeletons/bin/dev-deploy.sh +0 -5
- package/cli/builder/project/skeletons/bin/generateCertificates.sh.skeleton +0 -180
- package/cli/builder/project/skeletons/bin/prod-deploy.sh +0 -3
- package/cli/builder/project/skeletons/config/config.js.skeleton +0 -178
- package/cli/builder/project/skeletons/config/openssl/ca/openssl.cnf.skeleton +0 -150
- package/cli/builder/project/skeletons/config/openssl/ca_intermediate/openssl.cnf.skeleton +0 -152
- package/cli/builder/project/skeletons/config/pm2.config.js.skeleton +0 -62
- package/cli/builder/project/skeletons/documentation.html.twig +0 -24
- package/cli/builder/project/skeletons/editorconfig.skeleton +0 -18
- package/cli/builder/project/skeletons/eslintignore.skeleton +0 -15
- package/cli/builder/project/skeletons/eslintrc.js.skeleton +0 -97
- package/cli/builder/project/skeletons/gitignore.skeleton +0 -32
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.37.entity-user.js +0 -137
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.38.entity-session.js +0 -97
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.39.entity-requests.js +0 -115
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.40.entity-jwts.js +0 -97
- package/cli/builder/project/skeletons/migrations/migrations.skeleton.js +0 -101
- package/cli/builder/project/skeletons/package.json.twig +0 -71
- package/cli/builder/react/reactBuilder.js +0 -224
- package/cli/builder/react/skeletons/app/Resources/databases/nodefony.db +0 -0
- package/cli/builder/react/skeletons/app/Resources/translations/messages.en_en.yml +0 -5
- package/cli/builder/react/skeletons/app/Resources/translations/messages.fr_fr.yml +0 -5
- package/cli/builder/react/skeletons/app/Resources/views/base.html.twig +0 -33
- package/cli/builder/react/skeletons/app/config/config.js +0 -392
- package/cli/builder/react/skeletons/app/config/routing.js +0 -10
- package/cli/builder/react/skeletons/app/config/security.js +0 -74
- package/cli/builder/react/skeletons/app/controller/appController.js +0 -22
- package/cli/builder/sandbox/sandBoxBuilder.js +0 -610
- package/cli/builder/sandbox/skeletons/Resources/css/entry.css +0 -48
- package/cli/builder/sandbox/skeletons/Resources/js/entry.js +0 -60
- package/cli/builder/sandbox/skeletons/Resources/public/manifest.json +0 -32
- package/cli/builder/sandbox/skeletons/Resources/translations/messages.en_en.yml +0 -5
- package/cli/builder/sandbox/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
- package/cli/builder/sandbox/skeletons/Resources/views/base.html.twig +0 -46
- package/cli/builder/sandbox/skeletons/Resources/views/index.html.twig +0 -34
- package/cli/builder/sandbox/skeletons/bootstrap/custom.scss +0 -27
- package/cli/builder/sandbox/skeletons/bootstrap/entry.scss +0 -60
- package/cli/builder/sandbox/skeletons/workbox/templates/index.html.twig +0 -32
- package/cli/builder/sandbox/skeletons/workbox/workers/service-worker.js +0 -196
- package/cli/builder/skeletons/Resources/public/favicon.ico +0 -0
- package/cli/builder/skeletons/Resources/public/images/app-logo.png +0 -0
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.json.twig +0 -24
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.json.twig +0 -20
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.json.twig +0 -20
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/500.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/base.html.twig +0 -30
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.json.twig +0 -24
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/footer.html.twig +0 -33
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/header.html.twig +0 -6
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.html.twig +0 -6
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.json.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.html.twig +0 -125
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.json.twig +0 -5
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.json.twig +0 -24
- package/cli/builder/skeletons/app/appKernel.js +0 -133
- package/cli/builder/skeletons/binding/binding.cc +0 -26
- package/cli/builder/skeletons/binding/binding.skeleton +0 -8
- package/cli/builder/skeletons/bundle/bundleClass.js +0 -37
- package/cli/builder/skeletons/command/commandClass.js +0 -11
- package/cli/builder/skeletons/command/taskClass.js +0 -20
- package/cli/builder/skeletons/config/config.js +0 -138
- package/cli/builder/skeletons/config/nodefony/elastic-bundle.js +0 -37
- package/cli/builder/skeletons/config/nodefony/framework-bundle.js +0 -22
- package/cli/builder/skeletons/config/nodefony/http-bundle.js +0 -104
- package/cli/builder/skeletons/config/nodefony/mail-bundle.js +0 -44
- package/cli/builder/skeletons/config/nodefony/mongoose-bundle.js +0 -51
- package/cli/builder/skeletons/config/nodefony/monitoring-bundle.js +0 -34
- package/cli/builder/skeletons/config/nodefony/realtime-bundle.js +0 -15
- package/cli/builder/skeletons/config/nodefony/redis-bundle.js +0 -44
- package/cli/builder/skeletons/config/nodefony/security-bundle.js +0 -25
- package/cli/builder/skeletons/config/nodefony/sequelize-bundle.js +0 -156
- package/cli/builder/skeletons/config/routing.js +0 -55
- package/cli/builder/skeletons/config/security.js +0 -102
- package/cli/builder/skeletons/config/services.js +0 -1
- package/cli/builder/skeletons/config/webpack/webpack.dev.config.js +0 -13
- package/cli/builder/skeletons/config/webpack/webpack.prod.config.js +0 -20
- package/cli/builder/skeletons/config/webpack.config.js +0 -148
- package/cli/builder/skeletons/controller/controllerClass.js +0 -75
- package/cli/builder/skeletons/package.json.twig +0 -57
- package/cli/builder/skeletons/unittest/testFile.js +0 -46
- package/cli/builder/vue/skeletons/Resources/public/images/app-logo.png +0 -0
- package/cli/builder/vue/skeletons/Resources/translations/messages.en_en.yml +0 -5
- package/cli/builder/vue/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
- package/cli/builder/vue/skeletons/vue.config.js +0 -129
- package/cli/builder/vue/vueBuilder.js +0 -410
- package/cli/generate/generate.es6 +0 -103
- package/cli/install/install.js +0 -190
- package/cli/sequelize/sequelize.js +0 -94
- package/cli/start.js +0 -702
- package/cli/tools/pm2.es6 +0 -112
- package/cli/tools/tools.es6 +0 -97
- package/cli.es6 +0 -925
- package/container.es6 +0 -272
- package/error.es6 +0 -293
- package/fileClass.es6 +0 -242
- package/finder/file.es6 +0 -33
- package/finder/fileResult.es6 +0 -138
- package/finder/finder2.es6 +0 -275
- package/finder.es6 +0 -427
- package/kernel/annotations/annotations.es6 +0 -286
- package/kernel/api/api.es6 +0 -61
- package/kernel/api/graphqlApi.es6 +0 -107
- package/kernel/api/jsonApi.es6 +0 -177
- package/kernel/api/openApi.es6 +0 -139
- package/kernel/api/schemas/openApiSchema.js +0 -394
- package/kernel/babylon.es6 +0 -162
- package/kernel/bundle.es6 +0 -1200
- package/kernel/cliKernel.es6 +0 -869
- package/kernel/command.es6 +0 -78
- package/kernel/commands/nodefonyCommand.es6 +0 -247
- package/kernel/commands/tasks/bundlesTask.es6 +0 -59
- package/kernel/controllers/controller.es6 +0 -791
- package/kernel/fixture.es6 +0 -19
- package/kernel/injections/injections.es6 +0 -424
- package/kernel/kernel.es6 +0 -1960
- package/kernel/kernelWatcher.es6 +0 -387
- package/kernel/orm/entity.es6 +0 -59
- package/kernel/orm/orm.es6 +0 -139
- package/kernel/reader.es6 +0 -290
- package/kernel/security/encoder.es6 +0 -17
- package/kernel/security/factories/factory.es6 +0 -111
- package/kernel/security/factories/passeportFactory.es6 +0 -61
- package/kernel/security/provider.es6 +0 -58
- package/kernel/security/providers/chainProvider.es6 +0 -99
- package/kernel/security/providers/memoryProvider.es6 +0 -55
- package/kernel/security/providers/providerManager.es6 +0 -67
- package/kernel/security/providers/userEntityProvider.es6 +0 -50
- package/kernel/security/role.es6 +0 -12
- package/kernel/security/secureArea.es6 +0 -431
- package/kernel/security/tokens/token.es6 +0 -171
- package/kernel/security/user.es6 +0 -106
- package/kernel/serviceRealTime.es6 +0 -21
- package/kernel/services/connectionsService.es6 +0 -93
- package/kernel/services/cron/cronService.es6 +0 -123
- package/kernel/task.es6 +0 -80
- package/kernel/templates.es6 +0 -22
- package/kernel/templating/twig.es6 +0 -218
- package/kernel/tests/cliTest.js +0 -59
- package/kernel/tests/containerTest.js +0 -232
- package/kernel/tests/kernelTest.js +0 -39
- package/nodefony.es6 +0 -1084
- package/notificationsCenter.es6 +0 -118
- package/protocol.es6 +0 -86
- package/protocols/bayeux.es6 +0 -174
- package/protocols/jsonRpc/jsonrpc.es6 +0 -56
- package/result.es6 +0 -99
- package/service.es6 +0 -288
- package/syslog/pdu.es6 +0 -141
- package/syslog/syslog.es6 +0 -754
- package/watcher.es6 +0 -113
|
@@ -0,0 +1,805 @@
|
|
|
1
|
+
import { version } from "../package.js";
|
|
2
|
+
import "./sysexits.js";
|
|
3
|
+
import { chargePrompts } from "./prompts.js";
|
|
4
|
+
import { printUsage, printUsageError } from "./usageReport.js";
|
|
5
|
+
import { needsShell } from "./execPortable.js";
|
|
6
|
+
import { findProjectRoot } from "./projectRoot.js";
|
|
7
|
+
import { stripGlobalCliFlags } from "./globalFlags.js";
|
|
8
|
+
import { syncSkillPointers } from "./aiSync.js";
|
|
9
|
+
import { AGENT_TARGETS } from "./agentTargets.js";
|
|
10
|
+
import { formatFilesOnDisk } from "./scaffold/format.js";
|
|
11
|
+
import { diffLines } from "./scaffold/writer.js";
|
|
12
|
+
import { COMMAND_PHASE_CHOICES, CONTROLLER_KIND_CHOICES, DATABASE_CHOICES, ENTITY_ID_CHOICES, FRONTEND_CHOICES, MODULE_CONTROLLER_CHOICES, PRESET_CHOICES, getScaffoldSpec } from "./scaffold/spec.js";
|
|
13
|
+
import { findPackageRoot, getScaffoldContext, listTargets, resolveLocalWorkspaces, runScaffold } from "./scaffold/engine.js";
|
|
14
|
+
import { runAiMcpCommand } from "./aiMcp.js";
|
|
15
|
+
import { GIT_HOOKS_DIR } from "./gitHooksReport.js";
|
|
16
|
+
import { installGitHooks } from "./gitHooks.js";
|
|
17
|
+
import { askMissing, confirm } from "./scaffold/interactive.js";
|
|
18
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
19
|
+
import path from "node:path";
|
|
20
|
+
import { spawnSync } from "node:child_process";
|
|
21
|
+
//#region src/cli/create.ts
|
|
22
|
+
/**
|
|
23
|
+
* Adaptateur CLI du scaffold `nodefony create <type> [name]` — front n°1 et n°2
|
|
24
|
+
* du moteur (`scaffold/engine.ts`, partagé avec Studio) :
|
|
25
|
+
*
|
|
26
|
+
* - **CLI rapide** : tout est dit en flags (`create app x --preset minimal
|
|
27
|
+
* --frontend react --link`) → zéro question, scriptable.
|
|
28
|
+
* - **CLI interactif** (défaut en TTY) : les questions de la spec NON couvertes
|
|
29
|
+
* par les flags sont posées en readline natif, récap + confirmation.
|
|
30
|
+
* - Hors TTY (CI, spawn de test) : les défauts de la spec s'appliquent —
|
|
31
|
+
* comportement stable pour les scripts, `--yes` force la même chose en TTY.
|
|
32
|
+
*
|
|
33
|
+
* Pur outillage standalone (même famille que status/stop/completion) : AUCUN
|
|
34
|
+
* boot kernel — cas nominal HORS projet : `npx nodefony create app mon-app`.
|
|
35
|
+
*/
|
|
36
|
+
/** Types de scaffold disponibles. */
|
|
37
|
+
const CREATE_TYPES = [
|
|
38
|
+
"app",
|
|
39
|
+
"module",
|
|
40
|
+
"controller",
|
|
41
|
+
"service",
|
|
42
|
+
"front",
|
|
43
|
+
"entity",
|
|
44
|
+
"command"
|
|
45
|
+
];
|
|
46
|
+
/**
|
|
47
|
+
* Parse l'argv complet du process après le mot `create`. Ne valide QUE la forme
|
|
48
|
+
* des flags — les valeurs (nom, preset…) sont jugées par la spec du moteur.
|
|
49
|
+
*
|
|
50
|
+
* @returns la requête, ou un message d'usage si invalide
|
|
51
|
+
*/
|
|
52
|
+
function parseCreateArgv(argv) {
|
|
53
|
+
const at = argv.indexOf("create");
|
|
54
|
+
const rest = stripGlobalCliFlags(at === -1 ? [] : argv.slice(at + 1));
|
|
55
|
+
const positionals = [];
|
|
56
|
+
const answers = {};
|
|
57
|
+
let dir;
|
|
58
|
+
let force = false;
|
|
59
|
+
let yes = false;
|
|
60
|
+
let install = true;
|
|
61
|
+
let git = true;
|
|
62
|
+
let dryRun = false;
|
|
63
|
+
let describeJson = false;
|
|
64
|
+
let answersJson;
|
|
65
|
+
let help = false;
|
|
66
|
+
for (let i = 0; i < rest.length; i++) {
|
|
67
|
+
const word = rest[i];
|
|
68
|
+
if (word === "--help" || word === "-h") help = true;
|
|
69
|
+
else if (word === "--force" || word === "-f") force = true;
|
|
70
|
+
else if (word === "--yes" || word === "-y") yes = true;
|
|
71
|
+
else if (word === "--dry-run" || word === "-n") dryRun = true;
|
|
72
|
+
else if (word === "--describe-json") describeJson = true;
|
|
73
|
+
else if (word === "--answers-json") answersJson = rest[++i];
|
|
74
|
+
else if (word === "--no-install") install = false;
|
|
75
|
+
else if (word === "--no-git") git = false;
|
|
76
|
+
else if (word === "--git-hooks") answers.gitHooks = true;
|
|
77
|
+
else if (word === "--link") answers.link = true;
|
|
78
|
+
else if (word === "--no-link") answers.link = false;
|
|
79
|
+
else if (word === "--agents") answers.agents = (rest[++i] ?? "").split(/[\s,]+/u).map((c) => c.trim().toLowerCase()).filter((c) => c.length > 0 && c !== "none");
|
|
80
|
+
else if (word === "--preset") answers.preset = rest[++i];
|
|
81
|
+
else if (word === "--frontend") answers.frontend = rest[++i];
|
|
82
|
+
else if (word === "--database") answers.database = rest[++i];
|
|
83
|
+
else if (word === "--kind") answers.kind = rest[++i];
|
|
84
|
+
else if (word === "--controller") answers.controller = rest[++i];
|
|
85
|
+
else if (word === "--description") answers.description = rest[++i];
|
|
86
|
+
else if (word === "--service") {
|
|
87
|
+
const next = rest[i + 1];
|
|
88
|
+
answers.service = true;
|
|
89
|
+
if (next !== void 0 && !next.startsWith("-")) answers.serviceName = rest[++i];
|
|
90
|
+
} else if (word === "--no-service") answers.service = false;
|
|
91
|
+
else if (word === "--command") answers.command = true;
|
|
92
|
+
else if (word === "--no-command") answers.command = false;
|
|
93
|
+
else if (word === "--phase") answers.phase = rest[++i];
|
|
94
|
+
else if (word === "--route") answers.route = rest[++i];
|
|
95
|
+
else if (word === "--module") answers.module = rest[++i];
|
|
96
|
+
else if (word === "--role") answers.role = rest[++i];
|
|
97
|
+
else if (word === "--inject") answers.inject = rest[++i];
|
|
98
|
+
else if (word === "--no-controller") answers.controller = false;
|
|
99
|
+
else if (word === "--fields") answers.fields = rest[++i];
|
|
100
|
+
else if (word === "--id") answers.id = rest[++i];
|
|
101
|
+
else if (word === "--connector") answers.connector = rest[++i];
|
|
102
|
+
else if (word === "--dialect") answers.dialect = rest[++i];
|
|
103
|
+
else if (word === "--table") answers.table = rest[++i];
|
|
104
|
+
else if (word === "--column-case") answers.columnCase = rest[++i];
|
|
105
|
+
else if (word === "--id-name") answers.idName = rest[++i];
|
|
106
|
+
else if (word === "--index" || word === "--unique") {
|
|
107
|
+
const value = rest[++i];
|
|
108
|
+
if (value !== void 0) {
|
|
109
|
+
const key = word === "--index" ? "index" : "uniqueIndex";
|
|
110
|
+
const current = answers[key];
|
|
111
|
+
answers[key] = [...Array.isArray(current) ? current : [], value];
|
|
112
|
+
}
|
|
113
|
+
} else if (word === "--soft-delete") answers.softDelete = true;
|
|
114
|
+
else if (word === "--no-timestamps") answers.timestamps = false;
|
|
115
|
+
else if (word === "--no-tests") answers.tests = false;
|
|
116
|
+
else if (word === "--dir") dir = rest[++i];
|
|
117
|
+
else if (word.startsWith("-")) return { error: `option inconnue : ${word}` };
|
|
118
|
+
else positionals.push(word);
|
|
119
|
+
}
|
|
120
|
+
const [type, name, ...extra] = positionals;
|
|
121
|
+
if (help) return {
|
|
122
|
+
help,
|
|
123
|
+
answers,
|
|
124
|
+
force,
|
|
125
|
+
yes,
|
|
126
|
+
install,
|
|
127
|
+
git,
|
|
128
|
+
dryRun,
|
|
129
|
+
describeJson
|
|
130
|
+
};
|
|
131
|
+
if (type !== void 0 && !CREATE_TYPES.includes(type)) return { error: `type requis : ${CREATE_TYPES.join(" | ")} (reçu : ${type})` };
|
|
132
|
+
if (type === void 0 && !describeJson) return { error: `type requis : ${CREATE_TYPES.join(" | ")} (reçu : rien)` };
|
|
133
|
+
if (answersJson === void 0 && rest.includes("--answers-json")) return { error: "--answers-json attend un fichier, ou - pour l'entrée standard" };
|
|
134
|
+
if (name !== void 0) answers.name = name;
|
|
135
|
+
if (type === "entity" && extra.length > 0) answers.fields = extra.join(" ");
|
|
136
|
+
return {
|
|
137
|
+
help,
|
|
138
|
+
type,
|
|
139
|
+
answers,
|
|
140
|
+
dir,
|
|
141
|
+
force,
|
|
142
|
+
yes,
|
|
143
|
+
install,
|
|
144
|
+
git,
|
|
145
|
+
dryRun,
|
|
146
|
+
describeJson,
|
|
147
|
+
answersJson
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const PAR_TYPE = ` app : [--preset <${PRESET_CHOICES.join("|")}>] [--frontend <${FRONTEND_CHOICES.join("|")}>]\n [--agents <liste|none>] — agents de dev à câbler (défaut : aucun)\n [--database <${DATABASE_CHOICES.join("|")}>] — le compose ne porte QUE ce service\n [--link|--no-link] [--no-install] [--no-git] [--git-hooks]\n module : [--controller <${MODULE_CONTROLLER_CHOICES.join("|")}>] [--no-service] [--command]\n [--frontend <${FRONTEND_CHOICES.join("|")}>] [--description "…"] [--no-install]\n controller : [--kind <${CONTROLLER_KIND_CHOICES.join("|")}>] [--route </api/x>] [--module <nom>]\n [--role ROLE_X] — réserve TOUT le controller à cette habilitation\n (@IsGranted de classe) et déclare le rôle dans roleHierarchy :\n l'administrateur en hérite, sans qu'on ait à le lui attribuer\n service : [--inject <AutreService>] [--description "…"] [--module <nom>]\n classe @injectable, sans dépendance à un config.ts — pour la découvrir, imite-la\n --inject : dépendance déclarée au CONSTRUCTEUR (@inject + appel), pas container.get\n front : [--frontend <react|vue|angular|svelte>] [--route </page>] [--module <nom>]\n entity : [champs…] [--id <${ENTITY_ID_CHOICES.join("|")}>] [--soft-delete] [--no-timestamps]\n [--no-controller] [--no-service] [--no-tests] [--route </api/x>] [--module <nom>]\n [--connector <nom>] [--dialect <sqlite|postgres|mysql>]\n [--index "colA,colB"] [--unique "colA,colB"] — répétables, un par index\n [--table <nom_sql>] [--column-case <camel|snake>] [--id-name <colonne>]\n — pour épouser une table EXISTANTE ; les propriétés TS ne changent pas\n ex : nodefony create entity Website name:string domain:string \\\n --table website --column-case snake --id-name website_id\n champs : nom:type[?|!][:index] — types : string(n) text int float bool json date uuid char(n) decimal(p,s) ref:<Entité>\n ex : nodefony create entity Post title:string! content:text views:int author:ref:User\n ex : nodefony create entity Event siteId:uuid path:string --index "siteId,createdAt"\n command : [--phase <${COMMAND_PHASE_CHOICES.join("|")}>] [--description "…"] [--service] [--module <nom>]\n nom = l'ACTION ; la commande vaut <module>:<action> (ex : blog:publish)\n (types controller/service/front/entity/command : dans un projet existant — app racine ou module)\n Sans flags dans un terminal → mode interactif (questions + récap).\n Mode machine (agents, scripts) :\n --describe-json types, questions, valeurs permises et cibles du projet, en JSON\n --answers-json <fichier|-> réponses en JSON (- = entrée standard) ; les flags l'emportent\n --dry-run le plan (fichiers créés + diff des réécritures), sans rien écrire\n`;
|
|
151
|
+
/** La page d'aide — `nodefony create --help`, et le rappel après un refus. */
|
|
152
|
+
const PAGE = {
|
|
153
|
+
command: "nodefony create",
|
|
154
|
+
tagline: "engendre du code conforme au framework : une application, un module, un controller, un service, un front, une entité, une commande",
|
|
155
|
+
synopsis: [`nodefony create <${CREATE_TYPES.join("|")}> [nom] [options]`, "nodefony create --describe-json"],
|
|
156
|
+
sections: [{
|
|
157
|
+
title: "CE QUE CHAQUE TYPE ACCEPTE",
|
|
158
|
+
lines: PAR_TYPE.split("\n").filter((l) => l !== "")
|
|
159
|
+
}],
|
|
160
|
+
options: [
|
|
161
|
+
{
|
|
162
|
+
term: "--dir <chemin>",
|
|
163
|
+
text: "dossier cible (défaut : ./<nom>)"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
term: "-f, --force",
|
|
167
|
+
text: "accepte un dossier cible non vide"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
term: "-y, --yes",
|
|
171
|
+
text: "prend les défauts de la spec (saute l'interactif)"
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
term: "-n, --dry-run",
|
|
175
|
+
text: "le plan, sans rien écrire"
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
term: "--describe-json",
|
|
179
|
+
text: "types, questions, valeurs permises et cibles du projet, en JSON — la porte MACHINE, pour un agent ou un script"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
term: "--answers-json <f>",
|
|
183
|
+
text: "réponses en JSON (`-` = entrée standard) ; les drapeaux l'emportent"
|
|
184
|
+
}
|
|
185
|
+
],
|
|
186
|
+
examples: [
|
|
187
|
+
{
|
|
188
|
+
term: "nodefony create app mon-app",
|
|
189
|
+
text: "une application neuve, hors de tout projet"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
term: "nodefony create entity Post title:string content:text",
|
|
193
|
+
text: "une entité, son repository, son controller et ses tests"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
term: "nodefony create --describe-json | jq .",
|
|
197
|
+
text: "ce que le générateur sait faire, pour un agent"
|
|
198
|
+
}
|
|
199
|
+
],
|
|
200
|
+
exitCodes: [{
|
|
201
|
+
term: "73",
|
|
202
|
+
text: "le dossier cible ne peut pas être créé (EX_CANTCREAT)"
|
|
203
|
+
}],
|
|
204
|
+
footer: "Sans drapeau dans un terminal, elle passe en mode interactif : les questions de la spec, puis un récapitulatif avant d'écrire."
|
|
205
|
+
};
|
|
206
|
+
/**
|
|
207
|
+
* Décrit le scaffold en JSON — la porte MACHINE de `nodefony create`.
|
|
208
|
+
*
|
|
209
|
+
* POURQUOI : un agent qui développe dans une app Nodefony n'a que deux façons
|
|
210
|
+
* d'obtenir du code conforme — imiter des fichiers existants (et se tromper dès
|
|
211
|
+
* que l'exemple vieillit), ou APPELER le générateur. La seconde n'est possible
|
|
212
|
+
* que si l'outil sait dire ce qu'il attend : types disponibles, questions,
|
|
213
|
+
* valeurs permises, défauts. C'est exactement ce que la spec déclarative
|
|
214
|
+
* contient déjà ; il ne manquait que la porte.
|
|
215
|
+
*
|
|
216
|
+
* Le format est additif : `types` décrit les questions, `project` décrit où l'on
|
|
217
|
+
* se trouve — et son `context` porte ce que seul le projet sait (connecteurs
|
|
218
|
+
* déclarés, entités déjà créées, traduction des types par moteur). Une question
|
|
219
|
+
* marquée `optionsFrom` s'y réfère : ses réponses valides sont là, pas dans la
|
|
220
|
+
* spec, parce qu'elles changent d'un projet à l'autre.
|
|
221
|
+
*/
|
|
222
|
+
function describeScaffold(type) {
|
|
223
|
+
const projectRoot = findProjectRoot(process.cwd());
|
|
224
|
+
return `${JSON.stringify({
|
|
225
|
+
nodefony: version,
|
|
226
|
+
types: getScaffoldSpec(type),
|
|
227
|
+
caps: { hasCheckout: resolveLocalWorkspaces(findPackageRoot()) !== null },
|
|
228
|
+
project: projectRoot ? {
|
|
229
|
+
root: projectRoot,
|
|
230
|
+
targets: listTargets(projectRoot).map((t) => ({
|
|
231
|
+
kind: t.kind,
|
|
232
|
+
name: t.name
|
|
233
|
+
})),
|
|
234
|
+
context: getScaffoldContext(projectRoot)
|
|
235
|
+
} : null,
|
|
236
|
+
usage: {
|
|
237
|
+
run: "nodefony create <type> <name> [flags]",
|
|
238
|
+
answers: "nodefony create <type> --answers-json - (réponses JSON sur l'entrée standard ; les flags l'emportent)",
|
|
239
|
+
preview: "ajouter --dry-run pour obtenir le plan sans rien écrire"
|
|
240
|
+
}
|
|
241
|
+
}, null, 2)}\n`;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Réponses lues depuis `--answers-json` (fichier, ou `-` = entrée standard).
|
|
245
|
+
*
|
|
246
|
+
* Une clé hors spec est REFUSÉE plutôt qu'ignorée : `resolveAnswers` ne
|
|
247
|
+
* conserve que les clés déclarées, si bien qu'un `"preset"` mal orthographié
|
|
248
|
+
* produirait un scaffold silencieusement différent de celui demandé — le pire
|
|
249
|
+
* retour possible pour un appelant automatique, qui n'a pas d'yeux pour
|
|
250
|
+
* relire le résultat.
|
|
251
|
+
*
|
|
252
|
+
* @throws Error si la source est illisible, le JSON invalide, ou une clé inconnue
|
|
253
|
+
*/
|
|
254
|
+
function readAnswersJson(source, type) {
|
|
255
|
+
const raw = source === "-" ? readFileSync(0, "utf8") : readFileSync(source, "utf8");
|
|
256
|
+
let parsed;
|
|
257
|
+
try {
|
|
258
|
+
parsed = JSON.parse(raw);
|
|
259
|
+
} catch (e) {
|
|
260
|
+
throw new Error(`--answers-json : JSON invalide (${e.message})`, { cause: e });
|
|
261
|
+
}
|
|
262
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error("--answers-json : un objet de réponses est attendu");
|
|
263
|
+
const [spec] = getScaffoldSpec(type);
|
|
264
|
+
const known = new Set(spec.questions.map((q) => q.key));
|
|
265
|
+
const answers = {};
|
|
266
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
267
|
+
if (!known.has(key)) throw new Error(`--answers-json : clé inconnue « ${key} » pour ${type} — attendues : ${[...known].join(", ")}`);
|
|
268
|
+
if (typeof value !== "string" && typeof value !== "boolean") throw new Error(`--answers-json : « ${key} » doit être une chaîne ou un booléen`);
|
|
269
|
+
answers[key] = value;
|
|
270
|
+
}
|
|
271
|
+
return answers;
|
|
272
|
+
}
|
|
273
|
+
/** Lignes de diff affichées par fichier réécrit, avant troncature annoncée. */
|
|
274
|
+
const DRY_RUN_DIFF_LINES = 20;
|
|
275
|
+
/**
|
|
276
|
+
* Rend le plan d'un `--dry-run` : ce qui serait créé, et surtout le DIFF de ce
|
|
277
|
+
* qui serait réécrit.
|
|
278
|
+
*
|
|
279
|
+
* Les créations sont listées à plat (leur contenu n'écrase rien, l'inventaire
|
|
280
|
+
* suffit) ; les réécritures sont les seules opérations qui touchent au travail
|
|
281
|
+
* existant — c'est là que la simulation a une valeur, donc c'est là qu'on
|
|
282
|
+
* dépense de la place.
|
|
283
|
+
*/
|
|
284
|
+
function renderDryRun(changes, notes) {
|
|
285
|
+
const rel = (file) => path.relative(process.cwd(), file) || ".";
|
|
286
|
+
const created = changes.filter((c) => c.kind === "create");
|
|
287
|
+
const rewritten = changes.filter((c) => c.kind === "overwrite");
|
|
288
|
+
let out = `\n🔍 simulation (--dry-run) — RIEN n'a été écrit\n\n ${created.length} fichier(s) à créer, ${rewritten.length} à réécrire\n`;
|
|
289
|
+
if (created.length > 0) out += `\nCréés :\n${created.map((c) => ` + ${rel(c.path)}`).join("\n")}\n`;
|
|
290
|
+
for (const change of rewritten) {
|
|
291
|
+
const lines = diffLines(change.previous ?? "", change.content).filter((l) => l.kind !== "keep");
|
|
292
|
+
const shown = lines.slice(0, DRY_RUN_DIFF_LINES);
|
|
293
|
+
out += `\nRéécrit : ${rel(change.path)}\n` + shown.map((l) => ` ${l.kind === "add" ? "+" : "-"} ${l.text}`).join("\n") + (lines.length > shown.length ? `\n … ${lines.length - shown.length} ligne(s) de plus\n` : "\n");
|
|
294
|
+
}
|
|
295
|
+
if (notes && notes.length > 0) out += `\nCe que l'exécution dirait :\n${notes.map((n) => ` ${n}`).join("\n")}\n`;
|
|
296
|
+
return out;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* `npm install` dans l'app générée (sortie streamée — le dev voit npm
|
|
300
|
+
* travailler, pas un silence de 60 s). Échec = code retourné, l'appelant
|
|
301
|
+
* décide (l'app EST générée : on n'échoue pas tout le create pour un réseau).
|
|
302
|
+
*/
|
|
303
|
+
function runInstall(dest) {
|
|
304
|
+
process.stdout.write(`\n⏳ npm install (${path.basename(dest)})…\n`);
|
|
305
|
+
return spawnSync("npm", ["install"], {
|
|
306
|
+
cwd: dest,
|
|
307
|
+
stdio: "inherit",
|
|
308
|
+
shell: needsShell("npm")
|
|
309
|
+
}).status === 0;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Met en forme les fichiers que le scaffold vient d'écrire, après l'installation.
|
|
313
|
+
*
|
|
314
|
+
* Le formatage de la transaction ({@link formatScaffoldOutput}) ne peut rien
|
|
315
|
+
* pour une app NEUVE : à l'instant où ses fichiers sont rendus, `npm install`
|
|
316
|
+
* n'a pas encore tourné et le projet n'a aucun prettier à emprunter. C'est
|
|
317
|
+
* pourtant le cas qui compte le plus — l'application qu'un utilisateur reçoit.
|
|
318
|
+
*
|
|
319
|
+
* 🔴 **Bornée aux fichiers ÉCRITS.** La première version passait `--write .` au
|
|
320
|
+
* binaire du projet : sur `create module`, cela reformatait le dépôt ENTIER de
|
|
321
|
+
* l'utilisateur, code écrit à la main compris. Un générateur met en forme ce
|
|
322
|
+
* qu'il produit, jamais ce qu'il trouve.
|
|
323
|
+
*
|
|
324
|
+
* Silencieux et non bloquant : une app non formatée reste une app qui marche.
|
|
325
|
+
*
|
|
326
|
+
* @param dest - racine du projet (recherche de prettier).
|
|
327
|
+
* @param files - chemins RELATIFS rendus par le scaffold.
|
|
328
|
+
*/
|
|
329
|
+
function runFormat(dest, files) {
|
|
330
|
+
formatFilesOnDisk(files.map((f) => path.join(dest, f)), dest);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Le code de sortie de `create`, décidé à part — parce qu'il se teste.
|
|
334
|
+
*
|
|
335
|
+
* Le défaut qu'il ferme : la commande affichait « npm run build a échoué »
|
|
336
|
+
* puis rendait **0**. L'application existait bien, c'est vrai — mais elle
|
|
337
|
+
* n'était PAS utilisable, et aucun automate ne pouvait le savoir : ni une
|
|
338
|
+
* chaîne d'intégration continue, ni un banc, ni un agent qui enchaîne. C'est
|
|
339
|
+
* exactement ce qui a laissé le front d'une application générée ne pas se
|
|
340
|
+
* bâtir sans que rien ne tombe, le message se noyant dans la sortie.
|
|
341
|
+
*
|
|
342
|
+
* La règle : **ce qui est ÉCRIT reste écrit** (les fichiers ne sont pas
|
|
343
|
+
* retirés, les prochaines étapes sont affichées, `npm run build` y figure),
|
|
344
|
+
* mais le code de sortie DIT qu'il reste quelque chose à faire.
|
|
345
|
+
*
|
|
346
|
+
* L'installation sautée (`--no-install`) ne compte pas comme un échec : rien
|
|
347
|
+
* n'a été tenté, et la commande l'annonce dans ses prochaines étapes.
|
|
348
|
+
*
|
|
349
|
+
* 🔴 **Sautée et ratée sont deux états, pas un booléen.** Les deux étapes
|
|
350
|
+
* étaient rendues par `boolean`, où `false` disait à la fois « on ne l'a pas
|
|
351
|
+
* lancée » et « on l'a lancée et elle a échoué ». Une installation ratée
|
|
352
|
+
* tombait donc du bon côté : code 0. Or elle emporte TOUT ce qui la suit — le
|
|
353
|
+
* formatage, le build, la migration initiale — et l'utilisateur reçoit une
|
|
354
|
+
* application qui ne peut pas démarrer, sous un succès. Constaté sur le décor
|
|
355
|
+
* du banc de découvrabilité, dont l'application témoin n'avait jamais eu de
|
|
356
|
+
* `dist/` ni de `migrations/` : le manifeste pointait encore vers un registre
|
|
357
|
+
* où aucun paquet `@nodefony/*` n'est publié.
|
|
358
|
+
*
|
|
359
|
+
* @param install - l'installation des dépendances : sautée, réussie, échouée.
|
|
360
|
+
* @param build - `npm run build` : sauté (l'install n'a pas eu lieu), réussi,
|
|
361
|
+
* échoué.
|
|
362
|
+
* @returns `OK`, ou `SOFTWARE` dès qu'une étape TENTÉE a échoué.
|
|
363
|
+
*/
|
|
364
|
+
function createExitCode(install, build) {
|
|
365
|
+
return install === "failed" || build === "failed" ? 70 : 0;
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* `npm run build` dans l'app générée — le runtime charge `dist/index.js`
|
|
369
|
+
* (garde fail-loud « NON CONSTRUIT » au boot) : sans ce build, le premier
|
|
370
|
+
* `npm run dev` échoue. Suit l'install (pas de node_modules = pas de build) ;
|
|
371
|
+
* `dist/` est gitignoré → n'entre pas dans le premier commit.
|
|
372
|
+
*/
|
|
373
|
+
function runBuild(dest) {
|
|
374
|
+
process.stdout.write(`\n⏳ npm run build (${path.basename(dest)})…\n`);
|
|
375
|
+
return spawnSync("npm", ["run", "build"], {
|
|
376
|
+
cwd: dest,
|
|
377
|
+
stdio: "inherit",
|
|
378
|
+
shell: needsShell("npm")
|
|
379
|
+
}).status === 0;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Le paquet qui porte les migrations SQL.
|
|
383
|
+
*
|
|
384
|
+
* Nommé UNE seule fois : deux endroits demandent « cette application a-t-elle
|
|
385
|
+
* un ORM ? » — celui qui ÉCRIT la migration, et celui qui l'ANNONCE quand elle
|
|
386
|
+
* n'a pas pu l'être. Écrit deux fois, il divergerait au premier renommage.
|
|
387
|
+
*/
|
|
388
|
+
const ORM_PACKAGE = "@nodefony/drizzle";
|
|
389
|
+
/**
|
|
390
|
+
* L'application générée DÉCLARE-t-elle un ORM SQL ?
|
|
391
|
+
*
|
|
392
|
+
* Se lit dans le MANIFESTE, jamais dans `node_modules` : la question se pose
|
|
393
|
+
* précisément quand rien n'est installé — `--no-install`, ou un build en
|
|
394
|
+
* échec. C'est là que la migration manque, et c'est là que personne ne le
|
|
395
|
+
* disait.
|
|
396
|
+
*
|
|
397
|
+
* @param dest - racine de l'application générée.
|
|
398
|
+
* @returns `true` si le manifeste déclare le paquet d'ORM.
|
|
399
|
+
*/
|
|
400
|
+
function appDeclareUnOrm(dest) {
|
|
401
|
+
try {
|
|
402
|
+
return JSON.parse(readFileSync(path.join(dest, "package.json"), "utf8")).dependencies?.[ORM_PACKAGE] !== void 0;
|
|
403
|
+
} catch {
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Écrit la PREMIÈRE migration de l'application — celle de son entité `User`.
|
|
409
|
+
*
|
|
410
|
+
* ## Pourquoi une application doit naître avec sa migration
|
|
411
|
+
*
|
|
412
|
+
* L'identité appartient à l'application : c'est elle qui déclare la table
|
|
413
|
+
* `User`, donc elle qui en porte la migration. En développement, le schéma est
|
|
414
|
+
* dérivé du code et rien ne manque — c'est en PRODUCTION que le trou apparaît,
|
|
415
|
+
* là où personne ne crée la table : le premier déploiement s'arrête sur
|
|
416
|
+
* « table absente : User », pour un geste que rien n'imposait. Livrer l'entité
|
|
417
|
+
* sans sa migration, c'est livrer la moitié qui se voit.
|
|
418
|
+
*
|
|
419
|
+
* ## Pourquoi la migration est GÉNÉRÉE, jamais recopiée dans un gabarit
|
|
420
|
+
*
|
|
421
|
+
* Un gabarit SQL figé dirait ce que l'entité disait le jour où on l'a écrit. Le
|
|
422
|
+
* générateur, lui, lit l'entité qui vient d'être rendue — avec le dialecte figé
|
|
423
|
+
* à la création, et les champs que l'utilisateur a demandés. Une source unique,
|
|
424
|
+
* celle qui écrira aussi les migrations suivantes.
|
|
425
|
+
*
|
|
426
|
+
* ## Écrite, puis APPLIQUÉE
|
|
427
|
+
*
|
|
428
|
+
* Les deux, et dans la foulée : une application dont les fichiers de migration
|
|
429
|
+
* existent mais dont la base ne les a jamais vus est à mi-chemin, et c'est le
|
|
430
|
+
* pire des deux états. Son premier démarrage en développement dérive le schéma
|
|
431
|
+
* du code, les tables apparaissent sans historique, et tout ce qui interroge
|
|
432
|
+
* cet état ensuite accuse à juste titre — `doctor --live` en tête.
|
|
433
|
+
*
|
|
434
|
+
* ## Quand elle ne peut pas être écrite
|
|
435
|
+
*
|
|
436
|
+
* La commande démarre l'application, et le démarrage OUVRE la connexion : sans
|
|
437
|
+
* base joignable, elle s'arrête avant d'exécuter le verbe. C'est le cas d'un
|
|
438
|
+
* profil qui déclare un serveur qui n'existe pas encore. L'échec est alors DIT,
|
|
439
|
+
* avec le geste exact — jamais avalé : une application qui croit avoir sa
|
|
440
|
+
* migration et ne l'a pas est exactement le défaut qu'on répare ici.
|
|
441
|
+
*
|
|
442
|
+
* @param dest - racine de l'application générée.
|
|
443
|
+
* @returns le verdict et sa ligne d'affichage, ou `null` si l'application n'a
|
|
444
|
+
* pas d'ORM. Le booléen n'est pas décoratif : c'est lui qui décide si
|
|
445
|
+
* les prochaines étapes doivent réclamer le geste — le lire dans le
|
|
446
|
+
* texte de la note le rendrait dépendant de sa formulation.
|
|
447
|
+
*/
|
|
448
|
+
function runInitialMigration(dest) {
|
|
449
|
+
if (!existsSync(path.join(dest, "node_modules", ORM_PACKAGE))) return null;
|
|
450
|
+
process.stdout.write(`\n⏳ migration initiale (orm:generate)…\n`);
|
|
451
|
+
const r = spawnSync("npm", [
|
|
452
|
+
"exec",
|
|
453
|
+
"--",
|
|
454
|
+
"nodefony",
|
|
455
|
+
"orm:generate",
|
|
456
|
+
"--name",
|
|
457
|
+
"init"
|
|
458
|
+
], {
|
|
459
|
+
cwd: dest,
|
|
460
|
+
encoding: "utf8",
|
|
461
|
+
shell: needsShell("npm"),
|
|
462
|
+
env: {
|
|
463
|
+
...process.env,
|
|
464
|
+
NODE_ENV: "production",
|
|
465
|
+
NF_STORE: "memory"
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
if (r.status === 0) {
|
|
469
|
+
if (spawnSync("npm", [
|
|
470
|
+
"exec",
|
|
471
|
+
"--",
|
|
472
|
+
"nodefony",
|
|
473
|
+
"orm:migrate"
|
|
474
|
+
], {
|
|
475
|
+
cwd: dest,
|
|
476
|
+
encoding: "utf8",
|
|
477
|
+
shell: needsShell("npm"),
|
|
478
|
+
env: {
|
|
479
|
+
...process.env,
|
|
480
|
+
NODE_ENV: "production",
|
|
481
|
+
NF_STORE: "memory"
|
|
482
|
+
}
|
|
483
|
+
}).status === 0) return {
|
|
484
|
+
written: true,
|
|
485
|
+
note: "écrite et appliquée (migrations/)"
|
|
486
|
+
};
|
|
487
|
+
return {
|
|
488
|
+
written: true,
|
|
489
|
+
note: "écrite (migrations/), NON appliquée — lance « nodefony orm:migrate » quand ta base répond"
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
return {
|
|
493
|
+
written: false,
|
|
494
|
+
note: `NON écrite (${`${r.stdout ?? ""}${r.stderr ?? ""}`.includes("ECONNREFUSED") ? "base injoignable" : `code ${String(r.status)}`}) — lance « nodefony orm:generate --name init » puis « nodefony orm:migrate » quand ta base répond`
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* Pose les pointeurs vers les skills d'agent livrés par les paquets installés.
|
|
499
|
+
*
|
|
500
|
+
* **Pourquoi ici, et pas par un `postinstall`** : `--ignore-scripts` est courant
|
|
501
|
+
* (intégration continue, politiques d'entreprise), les scripts d'installation
|
|
502
|
+
* sont un vecteur d'attaque connu de l'écosystème npm, et écrire dans un dossier
|
|
503
|
+
* VERSIONNÉ à chaque installation produirait des différences surprises. Le
|
|
504
|
+
* scaffold pose une fois, `npx nodefony ai:sync` remet à jour quand on le
|
|
505
|
+
* demande.
|
|
506
|
+
*
|
|
507
|
+
* **Pourquoi APRÈS l'install et AVANT le premier commit** : les skills vivent
|
|
508
|
+
* dans `node_modules`, il n'y a rien à découvrir tant qu'il n'existe pas ; et
|
|
509
|
+
* ces pointeurs sont faits pour être VERSIONNÉS — l'équipe et l'intégration
|
|
510
|
+
* continue disposent alors des mêmes skills que celui qui a créé l'app.
|
|
511
|
+
*
|
|
512
|
+
* Sans ce geste, le lot ne servirait qu'à celui qui connaît déjà `ai:sync` — or
|
|
513
|
+
* personne n'apprend un verbe absent.
|
|
514
|
+
*
|
|
515
|
+
* @param dest - racine de l'app générée.
|
|
516
|
+
* @returns la note à afficher. Ne lève JAMAIS : une application entièrement
|
|
517
|
+
* générée ne s'annule pas parce qu'un dossier de skills est illisible.
|
|
518
|
+
*/
|
|
519
|
+
function poseSkillPointers(dest) {
|
|
520
|
+
try {
|
|
521
|
+
const plan = syncSkillPointers(dest);
|
|
522
|
+
if (plan.skills.length === 0) return `aucun skill livré par les paquets installés → npx nodefony ai:sync après un npm install`;
|
|
523
|
+
return `${plan.skills.length} dans ${plan.directory}/ (${plan.skills.map((s) => s.name).join(", ")}) — commite-les`;
|
|
524
|
+
} catch (e) {
|
|
525
|
+
return `non posés (${e.message}) → npx nodefony ai:sync`;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Un type manquant se DEMANDE-t-il, ou l'usage est-il la bonne réponse ? PURE.
|
|
530
|
+
*
|
|
531
|
+
* Trois conditions, et chacune dit quelque chose de différent :
|
|
532
|
+
* - l'erreur est bien « aucun type » — un type FAUTIF (`create ap`) se corrige,
|
|
533
|
+
* il ne se remplace pas par une question qui masquerait la faute de frappe ;
|
|
534
|
+
* - un terminal répond en face — sans lui, une question est un blocage muet ;
|
|
535
|
+
* - `--yes` n'a pas été demandé : il dit « ne me demande rien », et le
|
|
536
|
+
* respecter vaut mieux que de rendre service.
|
|
537
|
+
*
|
|
538
|
+
* @param error - le motif rendu par l'analyse de la ligne de commande.
|
|
539
|
+
* @param ctx - terminal disponible, et présence de `--yes`.
|
|
540
|
+
*/
|
|
541
|
+
function shouldAskForType(error, ctx) {
|
|
542
|
+
return error.includes("reçu : rien") && ctx.isTTY && !ctx.yes;
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Description courte d'un type de scaffold — celle de la SPEC, jamais une
|
|
546
|
+
* seconde version : deux listes de types divergeraient au premier ajout.
|
|
547
|
+
*/
|
|
548
|
+
function descriptionType(type) {
|
|
549
|
+
const [spec] = getScaffoldSpec(type);
|
|
550
|
+
return spec?.description ?? type;
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Décide si `create app` CÂBLE la porte MCP chez les agents choisis. PURE.
|
|
554
|
+
*
|
|
555
|
+
* Deux refus, deux raisons qui n'ont rien à voir :
|
|
556
|
+
* - **aucun agent choisi** — et c'est le DÉFAUT (la question de la spec part
|
|
557
|
+
* vide). Déclarer une porte chez un agent ÉCRIT dans la configuration d'un
|
|
558
|
+
* autre outil : rien de coché, rien d'écrit, en terminal comme ailleurs.
|
|
559
|
+
* C'est le choix explicite qui autorise, pas la présence d'un humain — ce
|
|
560
|
+
* qui rend le geste servable par Studio, qui n'est pas un terminal.
|
|
561
|
+
* - **app ni installée ni construite** (`--no-install`, ou une install en
|
|
562
|
+
* échec) : `ai:mcp` enchaîne sur l'émission du jeton, qui DÉMARRE le kernel.
|
|
563
|
+
* Sans `node_modules` ni `dist`, on provoquerait soi-même l'échec — le geste
|
|
564
|
+
* est alors NOMMÉ plutôt que joué.
|
|
565
|
+
*
|
|
566
|
+
* @param ctx - nombre d'agents choisis, et état réel de l'app générée.
|
|
567
|
+
* @returns la proposition, ou le motif du refus (affiché tel quel).
|
|
568
|
+
*/
|
|
569
|
+
function mcpWiringPlan(ctx) {
|
|
570
|
+
if (ctx.chosen === 0) return {
|
|
571
|
+
propose: false,
|
|
572
|
+
pattern: "aucun agent choisi"
|
|
573
|
+
};
|
|
574
|
+
if (!ctx.installed || !ctx.built) return {
|
|
575
|
+
propose: false,
|
|
576
|
+
pattern: "agents choisis mais app ni installée ni construite — l'émission du jeton démarre le kernel ; à rejouer : npx nodefony ai:mcp"
|
|
577
|
+
};
|
|
578
|
+
return { propose: true };
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* Traduit le choix d'agents de développement en appel `ai:mcp` — PURE.
|
|
582
|
+
*
|
|
583
|
+
* ⭐ **Ce qui se choisit, c'est l'AGENT ; la porte MCP vient AVEC.** Demander
|
|
584
|
+
* « veux-tu déclarer une porte MCP ? » posait la question à l'envers : personne
|
|
585
|
+
* n'installe un protocole, on se sert d'un assistant — et c'est lui qui a besoin
|
|
586
|
+
* de la porte. Une seule question, dans les mots de celui qui répond.
|
|
587
|
+
*
|
|
588
|
+
* Deux familles d'agents, une seule liste : ceux qui se déclarent par LEUR CLI
|
|
589
|
+
* (`--agent <clés>`) et ceux qui lisent le `.mcp.json` du projet — pour ces
|
|
590
|
+
* derniers, écrire le fichier EST la déclaration, d'où `none` plutôt que rien :
|
|
591
|
+
* `--agent none` dit « n'appelle aucune CLI », pas « ne fais rien ».
|
|
592
|
+
*
|
|
593
|
+
* `--auth` : l'en-tête porte `${NF_MCP_TOKEN}`, jamais le jeton lui-même. Une
|
|
594
|
+
* app neuve naît avec sa porte fermée ; l'ouvrir sans authentification serait un
|
|
595
|
+
* défaut par défaut.
|
|
596
|
+
*
|
|
597
|
+
* @param chosen - clés cochées par l'utilisateur.
|
|
598
|
+
* @param detected - agents présents sur ce poste (source unique `AGENT_TARGETS`).
|
|
599
|
+
* @param dest - racine de l'app générée.
|
|
600
|
+
* @returns l'argv à passer à `ai:mcp`, ou `null` quand aucun agent n'est choisi
|
|
601
|
+
* — coder seul est un choix, et rien ne doit alors être écrit.
|
|
602
|
+
*/
|
|
603
|
+
function argvMcpWiring(chosen, detected, dest) {
|
|
604
|
+
if (chosen.length === 0) return null;
|
|
605
|
+
const parCli = detected.filter((c) => c.declaration === "cli" && chosen.includes(c.key)).map((c) => c.key);
|
|
606
|
+
return [
|
|
607
|
+
"ai:mcp",
|
|
608
|
+
"--cwd",
|
|
609
|
+
dest,
|
|
610
|
+
"--auth",
|
|
611
|
+
"--agent",
|
|
612
|
+
parCli.length > 0 ? parCli.join(",") : "none"
|
|
613
|
+
];
|
|
614
|
+
}
|
|
615
|
+
/**
|
|
616
|
+
* `git init` + first commit dans l'app générée — SEULEMENT si git est
|
|
617
|
+
* disponible ET que le dossier n'est pas déjà couvert par un repo (une app de
|
|
618
|
+
* banc dans le checkout du framework ne doit pas créer un repo imbriqué).
|
|
619
|
+
* Le `.gitignore` généré exclut `*.local` AVANT ce commit : les secrets de
|
|
620
|
+
* `.env.local` ne peuvent pas y entrer.
|
|
621
|
+
*
|
|
622
|
+
* `--git-hooks` : les hooks se posent ENTRE `git init` et le premier commit —
|
|
623
|
+
* `.githooks/` entre ainsi dans le commit initial, comme les pointeurs de
|
|
624
|
+
* skills. Une app déjà couverte par un repo (init sauté) les reçoit AUSSI :
|
|
625
|
+
* `installGitHooks` calcule alors le chemin vu du toplevel, c'est son cas
|
|
626
|
+
* monorepo. Le geste est celui de `nodefony git:hooks` — MÊME implémentation,
|
|
627
|
+
* jamais recopiée.
|
|
628
|
+
*
|
|
629
|
+
* @returns note affichable (fait / sauté et pourquoi)
|
|
630
|
+
*/
|
|
631
|
+
function runGitInit(dest, appName, withHooks) {
|
|
632
|
+
const git = (...args) => spawnSync("git", args, {
|
|
633
|
+
cwd: dest,
|
|
634
|
+
stdio: "ignore"
|
|
635
|
+
});
|
|
636
|
+
const hooksNote = () => {
|
|
637
|
+
if (!withHooks) return "";
|
|
638
|
+
try {
|
|
639
|
+
const plan = installGitHooks(dest);
|
|
640
|
+
if (plan === null) return " · hooks non posés (hors dépôt git)";
|
|
641
|
+
return plan.refused ? " · hooks REFUSÉS (existant préservé — npx nodefony git:hooks pour le détail)" : ` · hooks natifs posés (${GIT_HOOKS_DIR}/ + core.hooksPath)`;
|
|
642
|
+
} catch (e) {
|
|
643
|
+
return ` · hooks non posés (${e.message})`;
|
|
644
|
+
}
|
|
645
|
+
};
|
|
646
|
+
if (spawnSync("git", ["--version"], { stdio: "ignore" }).error) return "git indisponible → repo non initialisé (git init à la main plus tard)";
|
|
647
|
+
if (git("rev-parse", "--is-inside-work-tree").status === 0) return `déjà dans un repo git → init sauté (pas de repo imbriqué)${hooksNote()}`;
|
|
648
|
+
if (git("init").status !== 0) return "git init a échoué → repo non initialisé";
|
|
649
|
+
const hooks = hooksNote();
|
|
650
|
+
git("add", "-A");
|
|
651
|
+
return (spawnSync("git", [
|
|
652
|
+
"commit",
|
|
653
|
+
"--no-verify",
|
|
654
|
+
"-m",
|
|
655
|
+
`chore: bootstrap ${appName} (nodefony create app)`
|
|
656
|
+
], {
|
|
657
|
+
cwd: dest,
|
|
658
|
+
stdio: "ignore"
|
|
659
|
+
}).status === 0 ? "repo git initialisé + premier commit" : "repo git initialisé (commit initial à faire : identité git non configurée ?)") + hooks;
|
|
660
|
+
}
|
|
661
|
+
/**
|
|
662
|
+
* Commande `nodefony create` — orchestre l'adaptateur : parse argv, complète en
|
|
663
|
+
* interactif si TTY, délègue au moteur, rend le récap.
|
|
664
|
+
*
|
|
665
|
+
* @returns exit code sémantique (`OK`, `USAGE`, `CANTCREAT`, `SOFTWARE`)
|
|
666
|
+
*/
|
|
667
|
+
async function runCreateCommand(argv) {
|
|
668
|
+
let parsed = parseCreateArgv(argv);
|
|
669
|
+
if ("error" in parsed && shouldAskForType(parsed.error, {
|
|
670
|
+
isTTY: process.stdin.isTTY === true,
|
|
671
|
+
yes: argv.includes("--yes")
|
|
672
|
+
})) {
|
|
673
|
+
const { select } = await chargePrompts();
|
|
674
|
+
const type = await select({
|
|
675
|
+
message: "Que veux-tu créer ?",
|
|
676
|
+
default: "app",
|
|
677
|
+
choices: CREATE_TYPES.map((t) => ({
|
|
678
|
+
name: `${t} — ${descriptionType(t)}`,
|
|
679
|
+
value: t
|
|
680
|
+
}))
|
|
681
|
+
});
|
|
682
|
+
const at = argv.indexOf("create");
|
|
683
|
+
const fullName = [...argv];
|
|
684
|
+
fullName.splice(at === -1 ? argv.length : at + 1, 0, type);
|
|
685
|
+
parsed = parseCreateArgv(fullName);
|
|
686
|
+
}
|
|
687
|
+
if ("error" in parsed) return printUsageError(PAGE, parsed.error);
|
|
688
|
+
if (parsed.help) return printUsage(PAGE);
|
|
689
|
+
if (parsed.describeJson) {
|
|
690
|
+
process.stdout.write(describeScaffold(parsed.type));
|
|
691
|
+
return 0;
|
|
692
|
+
}
|
|
693
|
+
const type = parsed.type;
|
|
694
|
+
const caps = { hasCheckout: resolveLocalWorkspaces(findPackageRoot()) !== null };
|
|
695
|
+
let answers = parsed.answers;
|
|
696
|
+
if (parsed.answersJson !== void 0) try {
|
|
697
|
+
answers = {
|
|
698
|
+
...readAnswersJson(parsed.answersJson, type),
|
|
699
|
+
...answers
|
|
700
|
+
};
|
|
701
|
+
} catch (e) {
|
|
702
|
+
process.stderr.write(`create: ${e.message}\n`);
|
|
703
|
+
return 64;
|
|
704
|
+
}
|
|
705
|
+
if (process.stdin.isTTY === true && !parsed.yes) {
|
|
706
|
+
const [spec] = getScaffoldSpec(type);
|
|
707
|
+
answers = await askMissing(spec, answers, caps, process.stdin, process.stdout, getScaffoldContext(process.cwd()));
|
|
708
|
+
const effective = new Map(spec.questions.map((q) => [q.key, answers[q.key] ?? q.default]));
|
|
709
|
+
const lines = spec.questions.filter((q) => !q.askWhen || String(effective.get(q.askWhen.key)) === q.askWhen.equals).map((q) => {
|
|
710
|
+
const value = answers[q.key] ?? q.default;
|
|
711
|
+
const shown = q.type === "boolean" ? value === true ? "oui" : "non" : String(value ?? "") || "(auto)";
|
|
712
|
+
return ` ${q.key.padEnd(10)} : ${shown}`;
|
|
713
|
+
}).join("\n");
|
|
714
|
+
process.stdout.write(`\nRécapitulatif :\n${lines}\n`);
|
|
715
|
+
if (!await confirm(parsed.dryRun ? "Simuler ?" : "Générer ?")) {
|
|
716
|
+
process.stdout.write("create: annulé\n");
|
|
717
|
+
return 0;
|
|
718
|
+
}
|
|
719
|
+
} else if (answers.link === void 0) answers.link = false;
|
|
720
|
+
if (answers.name === void 0 || answers.name === "") return printUsageError(PAGE, "nom requis");
|
|
721
|
+
const dir = parsed.dir ?? (type === "app" ? String(answers.name) : process.cwd());
|
|
722
|
+
let result;
|
|
723
|
+
try {
|
|
724
|
+
result = runScaffold({
|
|
725
|
+
type,
|
|
726
|
+
answers,
|
|
727
|
+
dir,
|
|
728
|
+
force: parsed.force
|
|
729
|
+
}, version, { dryRun: parsed.dryRun });
|
|
730
|
+
} catch (e) {
|
|
731
|
+
const message = e.message;
|
|
732
|
+
process.stderr.write(`create: ${message}\n`);
|
|
733
|
+
if (message.includes("n'est pas vide")) return 73;
|
|
734
|
+
if (message.includes("invalide")) return printUsageError(PAGE, message);
|
|
735
|
+
return 70;
|
|
736
|
+
}
|
|
737
|
+
const relDest = path.relative(process.cwd(), result.dest) || ".";
|
|
738
|
+
if (parsed.dryRun) {
|
|
739
|
+
process.stdout.write(`✔ ${type} « ${String(answers.name)} » — cible : ${relDest}/\n` + renderDryRun(result.changes ?? [], result.notes) + `\nRelance sans --dry-run pour écrire.\n`);
|
|
740
|
+
return 0;
|
|
741
|
+
}
|
|
742
|
+
if (type === "module") {
|
|
743
|
+
process.stdout.write(`✔ module « ${String(answers.name)} » généré dans ${relDest}/\n\n` + result.files.map((f) => ` ${f}`).join("\n") + `\n\nCâblage :\n` + (result.notes ?? []).map((n) => ` ${n}`).join("\n") + `\n`);
|
|
744
|
+
const projectRoot = findProjectRoot(process.cwd());
|
|
745
|
+
if (!parsed.install) {
|
|
746
|
+
const where = projectRoot ? path.relative(projectRoot, result.dest).split(path.sep).join("/") : String(answers.name);
|
|
747
|
+
process.stdout.write(`\nProchaines étapes (--no-install) :\n npm install # symlinke ${where} (workspace)\n npm run build\n`);
|
|
748
|
+
return 0;
|
|
749
|
+
}
|
|
750
|
+
if (!(projectRoot !== null && runInstall(projectRoot)) || projectRoot === null) {
|
|
751
|
+
process.stdout.write(`⚠ npm install a échoué — relance-le à la racine de l'app (le module ne sera pas chargeable avant)\n`);
|
|
752
|
+
return 0;
|
|
753
|
+
}
|
|
754
|
+
runFormat(projectRoot, result.files);
|
|
755
|
+
const built = runBuild(projectRoot);
|
|
756
|
+
process.stdout.write(built ? `\n✔ module installé (workspace), module et application construits — un serveur dev le rechargera au prochain redémarrage\n` : `\n⚠ npm run build a échoué à la racine — corrige puis relance-le (le runtime charge le dist de l'app)\n`);
|
|
757
|
+
return 0;
|
|
758
|
+
}
|
|
759
|
+
if (type !== "app") {
|
|
760
|
+
const addedDeps = result.depsAdded ?? [];
|
|
761
|
+
if (parsed.install && addedDeps.length > 0) {
|
|
762
|
+
const root = findProjectRoot(process.cwd());
|
|
763
|
+
const pose = root !== null && runInstall(root);
|
|
764
|
+
process.stdout.write(pose ? `\n✔ dépendance(s) installée(s) : ${addedDeps.join(", ")}\n` : `\n⚠ npm install a échoué — relance-le à la racine du projet (${addedDeps.join(", ")} est déclaré mais absent de node_modules)\n`);
|
|
765
|
+
} else if (addedDeps.length > 0) process.stdout.write(`\n⚠ ${addedDeps.join(", ")} ajouté(s) au package.json et NON installé(s) (--no-install) → lance \`npm install\`\n`);
|
|
766
|
+
process.stdout.write(`✔ ${type} « ${String(answers.name)} » généré dans ${relDest}/\n\n` + result.files.map((f) => ` ${f}`).join("\n") + `\n\n${type === "command" ? "Câblage" : "Endpoints"} :\n` + (result.notes ?? []).map((n) => ` ${n}`).join("\n") + `\n\nServeur dev lancé → rebuild automatique ; sinon : npm run build\n`);
|
|
767
|
+
return 0;
|
|
768
|
+
}
|
|
769
|
+
const linkNote = result.linked.length ? `\n🔗 link : ${result.linked.length} paquets nodefony câblés en file: sur le checkout local (dev framework — ne pas publier ce package.json tel quel)\n` : "";
|
|
770
|
+
process.stdout.write(`✔ ${type} « ${String(answers.name)} » généré dans ${relDest}/\n\n` + result.files.map((f) => ` ${f}`).join("\n") + `\n${linkNote}`);
|
|
771
|
+
const installed = parsed.install ? runInstall(result.dest) : false;
|
|
772
|
+
if (parsed.install && !installed) process.stdout.write(`⚠ npm install a échoué — relance-le à la main dans ${relDest}/\n`);
|
|
773
|
+
if (installed) runFormat(result.dest, result.files);
|
|
774
|
+
const built = installed ? runBuild(result.dest) : false;
|
|
775
|
+
if (installed && !built) process.stdout.write(`⚠ npm run build a échoué — relance-le à la main dans ${relDest}/\n`);
|
|
776
|
+
let migrationWritten = false;
|
|
777
|
+
if (built) {
|
|
778
|
+
const migration = runInitialMigration(result.dest);
|
|
779
|
+
if (migration !== null) {
|
|
780
|
+
migrationWritten = migration.written;
|
|
781
|
+
process.stdout.write(`\n🗄️ migration initiale : ${migration.note}\n`);
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
process.stdout.write(`\n🤖 skills d'agent : ${poseSkillPointers(result.dest)}\n`);
|
|
785
|
+
const chosen = Array.isArray(answers.agents) ? answers.agents : [];
|
|
786
|
+
const wiring = mcpWiringPlan({
|
|
787
|
+
chosen: chosen.length,
|
|
788
|
+
installed,
|
|
789
|
+
built
|
|
790
|
+
});
|
|
791
|
+
let mcpNote = wiring.propose ? "" : wiring.pattern;
|
|
792
|
+
if (wiring.propose) {
|
|
793
|
+
const mcpCall = argvMcpWiring(chosen, AGENT_TARGETS, result.dest);
|
|
794
|
+
if (mcpCall === null) mcpNote = "aucun agent choisi";
|
|
795
|
+
else await runAiMcpCommand(mcpCall);
|
|
796
|
+
}
|
|
797
|
+
if (mcpNote !== "") process.stdout.write(`🔌 agents IA : ${mcpNote}\n`);
|
|
798
|
+
const gitNote = parsed.git ? runGitInit(result.dest, String(answers.name), answers.gitHooks === true) : "sauté (--no-git)";
|
|
799
|
+
process.stdout.write(`🌱 git : ${gitNote}\n`);
|
|
800
|
+
const needsInfra = answers.preset !== "minimal" && answers.database !== void 0 && answers.database !== "sqlite";
|
|
801
|
+
process.stdout.write(`\nProchaines étapes :\n cd ${relDest}\n` + (installed ? "" : ` npm install\n`) + (built ? "" : ` npm run build\n`) + (needsInfra ? ` npm run infra:up # docker : ${String(answers.database)} + Redis (NF_DATABASE_URL pointe dessus)\n` : "") + (!migrationWritten && appDeclareUnOrm(result.dest) ? ` npx nodefony orm:generate --name init # écrit la migration de ta table User\n` : "") + ` npm run dev # → https://127.0.0.1:5152 (ou le port libre suivant, annoncé au démarrage)\n` + (answers.preset === "complete" ? ` # console d'administration : /nodefony — admin/admin en dev\n` : "") + (mcpNote !== "" ? ` npx nodefony ai:mcp # câbler ton agent IA (porte MCP + jeton)\n` : ""));
|
|
802
|
+
return createExitCode(parsed.install ? installed ? "succeeded" : "failed" : "skipped", installed ? built ? "succeeded" : "failed" : "skipped");
|
|
803
|
+
}
|
|
804
|
+
//#endregion
|
|
805
|
+
export { CREATE_TYPES, argvMcpWiring, createExitCode, mcpWiringPlan, parseCreateArgv, renderDryRun, runCreateCommand, shouldAskForType };
|