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.
Files changed (903) hide show
  1. package/.ai/symbols.json +36135 -0
  2. package/LICENSE +544 -0
  3. package/README.md +316 -694
  4. package/bin/nodefony +2183 -85
  5. package/dist/client/Container.js +367 -0
  6. package/dist/client/Event.js +198 -0
  7. package/dist/client/Service.js +344 -0
  8. package/dist/client/Tools.js +162 -0
  9. package/dist/client/client/ClientKernel.js +276 -0
  10. package/dist/client/client/angular/index.js +352 -0
  11. package/dist/client/client/announce.js +212 -0
  12. package/dist/client/client/debugbar/DebugBar.js +1624 -0
  13. package/dist/client/client/debugbar/format.js +103 -0
  14. package/dist/client/client/debugbar/hmr.js +37 -0
  15. package/dist/client/client/debugbar/index.js +29 -0
  16. package/dist/client/client/debugbar/model.js +133 -0
  17. package/dist/client/client/debugbar/network.js +173 -0
  18. package/dist/client/client/debugbar/profile.js +114 -0
  19. package/dist/client/client/index.js +34 -0
  20. package/dist/client/client/react/index.js +268 -0
  21. package/dist/client/client/realtime/AdaptiveRate.js +240 -0
  22. package/dist/client/client/realtime/BrowserWsTransport.js +57 -0
  23. package/dist/client/client/realtime/RealtimeClient.js +898 -0
  24. package/dist/client/client/realtime/localEvents.js +56 -0
  25. package/dist/client/client/realtime/notice.js +125 -0
  26. package/dist/client/client/realtime/observe.js +280 -0
  27. package/dist/client/client/roles/index.js +3 -0
  28. package/dist/client/client/roles/registry.js +97 -0
  29. package/dist/client/client/roles/roles.js +91 -0
  30. package/dist/client/client/shim/events.js +88 -0
  31. package/dist/client/client/shim/util.js +20 -0
  32. package/dist/client/client/svelte/index.js +319 -0
  33. package/dist/client/client/syslog/context.js +122 -0
  34. package/dist/client/client/syslog/errors.js +49 -0
  35. package/dist/client/client/syslog/uplink.js +106 -0
  36. package/dist/client/client/vue/index.js +321 -0
  37. package/dist/client/colors.js +63 -0
  38. package/dist/client/debugbar.standalone.js +4274 -0
  39. package/dist/client/realtime/IRealtimeTransport.js +32 -0
  40. package/dist/client/realtime/JsonRpcPeer.js +251 -0
  41. package/dist/client/realtime/channelRate.js +39 -0
  42. package/dist/client/realtime/platformChannels.js +155 -0
  43. package/dist/client/syslog/Pdu.js +224 -0
  44. package/dist/client/syslog/Syslog.js +1159 -0
  45. package/dist/client/syslog/drivers/pduFlow.js +106 -0
  46. package/dist/client/syslog/drivers/pduProtocol.js +28 -0
  47. package/dist/client/syslog/logColor.js +80 -0
  48. package/dist/client/types/src/Container.d.ts +221 -0
  49. package/dist/client/types/src/Event.d.ts +171 -0
  50. package/dist/client/types/src/FileClass.d.ts +184 -0
  51. package/dist/client/types/src/Service.d.ts +165 -0
  52. package/dist/client/types/src/Tools.d.ts +116 -0
  53. package/dist/client/types/src/client/ClientKernel.d.ts +90 -0
  54. package/dist/client/types/src/client/IClientKernel.d.ts +195 -0
  55. package/dist/client/types/src/client/angular/index.d.ts +273 -0
  56. package/dist/client/types/src/client/announce.d.ts +74 -0
  57. package/dist/client/types/src/client/debugbar/DebugBar.d.ts +279 -0
  58. package/dist/client/types/src/client/debugbar/format.d.ts +48 -0
  59. package/dist/client/types/src/client/debugbar/hmr.d.ts +16 -0
  60. package/dist/client/types/src/client/debugbar/index.d.ts +30 -0
  61. package/dist/client/types/src/client/debugbar/model.d.ts +158 -0
  62. package/dist/client/types/src/client/debugbar/network.d.ts +55 -0
  63. package/dist/client/types/src/client/debugbar/profile.d.ts +99 -0
  64. package/dist/client/types/src/client/index.d.ts +47 -0
  65. package/dist/client/types/src/client/react/index.d.ts +207 -0
  66. package/dist/client/types/src/client/realtime/AdaptiveRate.d.ts +138 -0
  67. package/dist/client/types/src/client/realtime/BrowserWsTransport.d.ts +27 -0
  68. package/dist/client/types/src/client/realtime/RealtimeClient.d.ts +573 -0
  69. package/dist/client/types/src/client/realtime/localEvents.d.ts +53 -0
  70. package/dist/client/types/src/client/realtime/notice.d.ts +70 -0
  71. package/dist/client/types/src/client/realtime/observe.d.ts +284 -0
  72. package/dist/client/types/src/client/roles/index.d.ts +15 -0
  73. package/dist/client/types/src/client/roles/registry.d.ts +72 -0
  74. package/dist/client/types/src/client/roles/roles.d.ts +68 -0
  75. package/dist/client/types/src/client/shim/cli-color.d.ts +2 -0
  76. package/dist/client/types/src/client/shim/events.d.ts +39 -0
  77. package/dist/client/types/src/client/shim/util.d.ts +14 -0
  78. package/dist/client/types/src/client/svelte/index.d.ts +216 -0
  79. package/dist/client/types/src/client/syslog/context.d.ts +76 -0
  80. package/dist/client/types/src/client/syslog/errors.d.ts +46 -0
  81. package/dist/client/types/src/client/syslog/uplink.d.ts +89 -0
  82. package/dist/client/types/src/client/transport/websocket.d.ts +5 -0
  83. package/dist/client/types/src/client/vue/index.d.ts +234 -0
  84. package/dist/client/types/src/colors.d.ts +32 -0
  85. package/dist/client/types/src/config/infra.d.ts +171 -0
  86. package/dist/client/types/src/kernel/bootReport.d.ts +112 -0
  87. package/dist/client/types/src/kernel/readinessRegistry.d.ts +104 -0
  88. package/dist/client/types/src/realtime/IRealtimeSocket.d.ts +142 -0
  89. package/dist/client/types/src/realtime/IRealtimeTransport.d.ts +50 -0
  90. package/dist/client/types/src/realtime/JsonRpcPeer.d.ts +251 -0
  91. package/dist/client/types/src/realtime/RealtimeEventMap.d.ts +269 -0
  92. package/dist/client/types/src/realtime/channelRate.d.ts +55 -0
  93. package/dist/client/types/src/realtime/platformChannels.d.ts +147 -0
  94. package/dist/client/types/src/syslog/Pdu.d.ts +134 -0
  95. package/dist/client/types/src/syslog/Syslog.d.ts +482 -0
  96. package/dist/client/types/src/syslog/drivers/ILogDriver.d.ts +177 -0
  97. package/dist/client/types/src/syslog/drivers/pduFlow.d.ts +53 -0
  98. package/dist/client/types/src/syslog/drivers/pduProtocol.d.ts +20 -0
  99. package/dist/client/types/src/syslog/logColor.d.ts +59 -0
  100. package/dist/client/types/src/types/ICliKernel.d.ts +28 -0
  101. package/dist/client/types/src/types/ICommand.d.ts +14 -0
  102. package/dist/client/types/src/types/IContainer.d.ts +35 -0
  103. package/dist/client/types/src/types/IKernel.d.ts +138 -0
  104. package/dist/client/types/src/types/IMcpTool.d.ts +157 -0
  105. package/dist/client/types/src/types/IModule.d.ts +73 -0
  106. package/dist/client/types/src/types/IPage.d.ts +119 -0
  107. package/dist/client/types/src/types/IService.d.ts +62 -0
  108. package/dist/client/types/src/types/ISyslog.d.ts +58 -0
  109. package/dist/client/types/src/types/ITransport.d.ts +5 -0
  110. package/dist/client/types/src/types/globals.d.ts +47 -0
  111. package/dist/node/Cli.js +750 -0
  112. package/dist/node/Container.js +367 -0
  113. package/dist/node/Error.js +309 -0
  114. package/dist/node/Event.js +198 -0
  115. package/dist/node/FileClass.js +308 -0
  116. package/dist/node/Nodefony.js +78 -0
  117. package/dist/node/Service.js +344 -0
  118. package/dist/node/Tools.js +205 -0
  119. package/dist/node/bin/resolveLocalCli.js +10 -0
  120. package/dist/node/bundler/index.js +103 -0
  121. package/dist/node/cli/agentTargets.js +461 -0
  122. package/dist/node/cli/aiMcp.js +553 -0
  123. package/dist/node/cli/aiMcpReport.js +129 -0
  124. package/dist/node/cli/aiSync.js +323 -0
  125. package/dist/node/cli/aiSyncReport.js +142 -0
  126. package/dist/node/cli/card.js +186 -0
  127. package/dist/node/cli/cardReport.js +110 -0
  128. package/dist/node/cli/completion.js +415 -0
  129. package/dist/node/cli/create.js +805 -0
  130. package/dist/node/cli/env.js +332 -0
  131. package/dist/node/cli/envReport.js +159 -0
  132. package/dist/node/cli/execPortable.js +60 -0
  133. package/dist/node/cli/gitHooks.js +191 -0
  134. package/dist/node/cli/gitHooksReport.js +119 -0
  135. package/dist/node/cli/globalFlags.js +67 -0
  136. package/dist/node/cli/helpReport.js +288 -0
  137. package/dist/node/cli/manPage.js +165 -0
  138. package/dist/node/cli/nodefonyBin.js +61 -0
  139. package/dist/node/cli/outdated.js +144 -0
  140. package/dist/node/cli/progress.js +555 -0
  141. package/dist/node/cli/projectRoot.js +32 -0
  142. package/dist/node/cli/promptPassword.js +44 -0
  143. package/dist/node/cli/prompts.js +86 -0
  144. package/dist/node/cli/scaffold/destination.js +92 -0
  145. package/dist/node/cli/scaffold/engine.js +2156 -0
  146. package/dist/node/cli/scaffold/entityFields.js +589 -0
  147. package/dist/node/cli/scaffold/format.js +243 -0
  148. package/dist/node/cli/scaffold/interactive.js +124 -0
  149. package/dist/node/cli/scaffold/moduleLayout.js +38 -0
  150. package/dist/node/cli/scaffold/reservedEntities.js +74 -0
  151. package/dist/node/cli/scaffold/spec.js +704 -0
  152. package/dist/node/cli/scaffold/steps.js +40 -0
  153. package/dist/node/cli/scaffold/userContractSource.js +133 -0
  154. package/dist/node/cli/scaffold/versions.js +57 -0
  155. package/dist/node/cli/scaffold/writer.js +172 -0
  156. package/dist/node/cli/startMenu.js +496 -0
  157. package/dist/node/cli/symbols.js +205 -0
  158. package/dist/node/cli/sysexits.js +34 -0
  159. package/dist/node/cli/tableReport.js +184 -0
  160. package/dist/node/cli/usageReport.js +144 -0
  161. package/dist/node/colors.js +63 -0
  162. package/dist/node/command/Builder.js +153 -0
  163. package/dist/node/command/Command.js +348 -0
  164. package/dist/node/config/configProvenance.js +101 -0
  165. package/dist/node/config/defaults.js +39 -0
  166. package/dist/node/config/defineConfig.js +129 -0
  167. package/dist/node/config/defineEnv.js +264 -0
  168. package/dist/node/config/envExample.js +41 -0
  169. package/dist/node/config/envOverride.js +423 -0
  170. package/dist/node/config/infra.js +163 -0
  171. package/dist/node/config/reactivity.js +23 -0
  172. package/dist/node/config/reservedEnv.js +118 -0
  173. package/dist/node/config/schema.js +134 -0
  174. package/dist/node/config/use.js +24 -0
  175. package/dist/node/finder/File.js +49 -0
  176. package/dist/node/finder/FileResult.js +86 -0
  177. package/dist/node/finder/Finder.js +201 -0
  178. package/dist/node/finder/Result.js +45 -0
  179. package/dist/node/index.js +121 -0
  180. package/dist/node/kernel/BootConfigurationError.js +54 -0
  181. package/dist/node/kernel/CliKernel.js +630 -0
  182. package/dist/node/kernel/Kernel.js +2198 -0
  183. package/dist/node/kernel/Module.js +453 -0
  184. package/dist/node/kernel/adminPlane/adminCaller.js +98 -0
  185. package/dist/node/kernel/adminPlane/adminRbac.js +51 -0
  186. package/dist/node/kernel/adminPlane/catalog.js +158 -0
  187. package/dist/node/kernel/adminPlane/executeAdmin.js +78 -0
  188. package/dist/node/kernel/checks/deep.js +335 -0
  189. package/dist/node/kernel/checks/freshness.js +139 -0
  190. package/dist/node/kernel/checks/gating.js +231 -0
  191. package/dist/node/kernel/checks/guards.js +232 -0
  192. package/dist/node/kernel/checks/lastBoot.js +136 -0
  193. package/dist/node/kernel/checks/live.js +330 -0
  194. package/dist/node/kernel/checks/packageDeps.js +292 -0
  195. package/dist/node/kernel/checks/readiness.js +153 -0
  196. package/dist/node/kernel/checks/renderReport.js +780 -0
  197. package/dist/node/kernel/checks/report.js +421 -0
  198. package/dist/node/kernel/checks/runDoctor.js +731 -0
  199. package/dist/node/kernel/checks/surface.js +364 -0
  200. package/dist/node/kernel/checks/walk.js +100 -0
  201. package/dist/node/kernel/checks/wiring.js +450 -0
  202. package/dist/node/kernel/commands/AiMcpCommand.js +65 -0
  203. package/dist/node/kernel/commands/AiSyncCommand.js +48 -0
  204. package/dist/node/kernel/commands/BuildCommand.js +49 -0
  205. package/dist/node/kernel/commands/CardCommand.js +50 -0
  206. package/dist/node/kernel/commands/ClusterCommand.js +58 -0
  207. package/dist/node/kernel/commands/CompletionCommand.js +31 -0
  208. package/dist/node/kernel/commands/CreateCommand.js +45 -0
  209. package/dist/node/kernel/commands/DevCommand.js +99 -0
  210. package/dist/node/kernel/commands/DoctorCommand.js +115 -0
  211. package/dist/node/kernel/commands/EnvCommand.js +52 -0
  212. package/dist/node/kernel/commands/GitHooksCommand.js +47 -0
  213. package/dist/node/kernel/commands/InspectCommand.js +153 -0
  214. package/dist/node/kernel/commands/InstallCommand.js +20 -0
  215. package/dist/node/kernel/commands/MenuCommand.js +261 -0
  216. package/dist/node/kernel/commands/OutdatedCommand.js +164 -0
  217. package/dist/node/kernel/commands/ProdCommand.js +60 -0
  218. package/dist/node/kernel/commands/StatusCommand.js +30 -0
  219. package/dist/node/kernel/commands/StopCommand.js +35 -0
  220. package/dist/node/kernel/commands/SymbolsCommand.js +45 -0
  221. package/dist/node/kernel/commands/runtimeLauncher.js +95 -0
  222. package/dist/node/kernel/decorators/kernelDecorator.js +110 -0
  223. package/dist/node/kernel/injector/injector.js +137 -0
  224. package/dist/node/kernel/injector/serviceOrder.js +106 -0
  225. package/dist/node/kernel/inspect/adminSubjects.js +194 -0
  226. package/dist/node/kernel/inspect/docOutline.js +86 -0
  227. package/dist/node/kernel/lifecycleTags.js +76 -0
  228. package/dist/node/kernel/moduleConfig.js +75 -0
  229. package/dist/node/kernel/moduleGating.js +68 -0
  230. package/dist/node/kernel/readinessRegistry.js +98 -0
  231. package/dist/node/kernel/resolveModuleEntry.js +61 -0
  232. package/dist/node/mcp/caller.js +40 -0
  233. package/dist/node/mcp/guard.js +51 -0
  234. package/dist/node/mcp/protocol.js +157 -0
  235. package/dist/node/mcp/server.js +216 -0
  236. package/dist/node/mcp/tools.js +861 -0
  237. package/dist/node/oauth/authorizationServer.js +221 -0
  238. package/dist/node/oauth/protectedResource.js +293 -0
  239. package/dist/node/package.js +4 -0
  240. package/dist/node/realtime/IRealtimeTransport.js +32 -0
  241. package/dist/node/realtime/JsonRpcPeer.js +251 -0
  242. package/dist/node/realtime/RealtimeEventMap.js +15 -0
  243. package/dist/node/realtime/channelRate.js +39 -0
  244. package/dist/node/realtime/platformChannels.js +155 -0
  245. package/dist/node/runtime/GcScheduler.js +92 -0
  246. package/dist/node/runtime/RequestContext.js +76 -0
  247. package/dist/node/runtime/bearer.js +84 -0
  248. package/dist/node/runtime/engineEnvironment.js +79 -0
  249. package/dist/node/runtime/loadEnv.js +105 -0
  250. package/dist/node/runtime/pageFacets.js +85 -0
  251. package/dist/node/runtime/pageFilters.js +103 -0
  252. package/dist/node/runtime/pageGuard.js +84 -0
  253. package/dist/node/runtime/pageQuery.js +160 -0
  254. package/dist/node/runtime/pageSort.js +114 -0
  255. package/dist/node/runtime/redact.js +43 -0
  256. package/dist/node/runtime/withTimeout.js +71 -0
  257. package/dist/node/service/cluster/ClusterManager.js +202 -0
  258. package/dist/node/service/cluster/ClusterProbeAggregator.js +120 -0
  259. package/dist/node/service/cluster/ClusterRelay.js +74 -0
  260. package/dist/node/service/cluster/clusterMaster.js +65 -0
  261. package/dist/node/service/cluster/clusterMessage.js +70 -0
  262. package/dist/node/service/cluster/cpuQuota.js +59 -0
  263. package/dist/node/service/cluster/instanceProbe.js +52 -0
  264. package/dist/node/service/cluster/podEnvironment.js +48 -0
  265. package/dist/node/service/cluster/processProbe.js +70 -0
  266. package/dist/node/service/cluster/richProcessProbe.js +115 -0
  267. package/dist/node/service/cluster/topology.js +71 -0
  268. package/dist/node/service/dev/BootReporter.js +490 -0
  269. package/dist/node/service/dev/DevSupervisor.js +1004 -0
  270. package/dist/node/service/dev/bootVerdict.js +158 -0
  271. package/dist/node/service/dev/detachedStart.js +372 -0
  272. package/dist/node/service/dev/devProcess.js +1137 -0
  273. package/dist/node/service/dev/devProjects.js +138 -0
  274. package/dist/node/service/dev/devStatusReport.js +395 -0
  275. package/dist/node/service/dev/devStop.js +263 -0
  276. package/dist/node/service/fetchService.js +35 -0
  277. package/dist/node/service/gitService.js +62 -0
  278. package/dist/node/syslog/Pdu.js +224 -0
  279. package/dist/node/syslog/Syslog.js +1159 -0
  280. package/dist/node/syslog/drivers/ClusterFileLogDriver.js +114 -0
  281. package/dist/node/syslog/drivers/FileLogDriver.js +127 -0
  282. package/dist/node/syslog/drivers/ILogDriver.js +26 -0
  283. package/dist/node/syslog/drivers/LokiLogDriver.js +144 -0
  284. package/dist/node/syslog/drivers/MemoryLogDriver.js +33 -0
  285. package/dist/node/syslog/drivers/OpenSearchLogDriver.js +159 -0
  286. package/dist/node/syslog/drivers/builtinLogDrivers.js +114 -0
  287. package/dist/node/syslog/drivers/filterPdus.js +71 -0
  288. package/dist/node/syslog/drivers/logDriverRegistry.js +83 -0
  289. package/dist/node/syslog/drivers/opensearchShared.js +17 -0
  290. package/dist/node/syslog/drivers/pduFlow.js +106 -0
  291. package/dist/node/syslog/drivers/pduProtocol.js +28 -0
  292. package/dist/node/syslog/httpFetch.js +43 -0
  293. package/dist/node/syslog/logColor.js +80 -0
  294. package/dist/node/syslog/sinks/FileSink.js +142 -0
  295. package/dist/node/syslog/transports/BatchingHttpTransport.js +98 -0
  296. package/dist/node/syslog/transports/ConsoleTransport.js +14 -0
  297. package/dist/node/syslog/transports/FileTransport.js +17 -0
  298. package/dist/node/syslog/transports/HttpTransport.js +44 -0
  299. package/dist/node/syslog/transports/LokiTransport.js +80 -0
  300. package/dist/node/syslog/transports/OpenSearchTransport.js +53 -0
  301. package/dist/node/syslog/transports/SyslogTransport.js +13 -0
  302. package/dist/node/syslog/transports/index.js +8 -0
  303. package/dist/node/testing/index.js +190 -0
  304. package/dist/types/Cli.d.ts +177 -0
  305. package/dist/types/Container.d.ts +221 -0
  306. package/dist/types/Error.d.ts +162 -0
  307. package/dist/types/Event.d.ts +171 -0
  308. package/dist/types/FileClass.d.ts +184 -0
  309. package/dist/types/Nodefony.d.ts +66 -0
  310. package/dist/types/Service.d.ts +165 -0
  311. package/dist/types/Tools.d.ts +116 -0
  312. package/dist/types/bin/resolveLocalCli.d.ts +49 -0
  313. package/dist/types/bundler/index.d.ts +66 -0
  314. package/dist/types/cli/agentTargets.d.ts +378 -0
  315. package/dist/types/cli/aiMcp.d.ts +239 -0
  316. package/dist/types/cli/aiMcpReport.d.ts +113 -0
  317. package/dist/types/cli/aiSync.d.ts +68 -0
  318. package/dist/types/cli/aiSyncReport.d.ts +149 -0
  319. package/dist/types/cli/card.d.ts +49 -0
  320. package/dist/types/cli/cardReport.d.ts +127 -0
  321. package/dist/types/cli/completion.d.ts +154 -0
  322. package/dist/types/cli/create.d.ts +177 -0
  323. package/dist/types/cli/env.d.ts +103 -0
  324. package/dist/types/cli/envReport.d.ts +153 -0
  325. package/dist/types/cli/execPortable.d.ts +54 -0
  326. package/dist/types/cli/gitHooks.d.ts +48 -0
  327. package/dist/types/cli/gitHooksReport.d.ts +101 -0
  328. package/dist/types/cli/globalFlags.d.ts +48 -0
  329. package/dist/types/cli/helpReport.d.ts +110 -0
  330. package/dist/types/cli/manPage.d.ts +21 -0
  331. package/dist/types/cli/nodefonyBin.d.ts +45 -0
  332. package/dist/types/cli/outdated.d.ts +119 -0
  333. package/dist/types/cli/progress.d.ts +349 -0
  334. package/dist/types/cli/projectRoot.d.ts +19 -0
  335. package/dist/types/cli/promptPassword.d.ts +22 -0
  336. package/dist/types/cli/prompts.d.ts +102 -0
  337. package/dist/types/cli/scaffold/destination.d.ts +70 -0
  338. package/dist/types/cli/scaffold/engine.d.ts +545 -0
  339. package/dist/types/cli/scaffold/entityFields.d.ts +238 -0
  340. package/dist/types/cli/scaffold/format.d.ts +78 -0
  341. package/dist/types/cli/scaffold/interactive.d.ts +11 -0
  342. package/dist/types/cli/scaffold/moduleLayout.d.ts +69 -0
  343. package/dist/types/cli/scaffold/reservedEntities.d.ts +49 -0
  344. package/dist/types/cli/scaffold/spec.d.ts +159 -0
  345. package/dist/types/cli/scaffold/steps.d.ts +24 -0
  346. package/dist/types/cli/scaffold/userContractSource.d.ts +86 -0
  347. package/dist/types/cli/scaffold/versions.d.ts +14 -0
  348. package/dist/types/cli/scaffold/writer.d.ts +100 -0
  349. package/dist/types/cli/startMenu.d.ts +195 -0
  350. package/dist/types/cli/symbols.d.ts +84 -0
  351. package/dist/types/cli/sysexits.d.ts +31 -0
  352. package/dist/types/cli/tableReport.d.ts +44 -0
  353. package/dist/types/cli/usageReport.d.ts +108 -0
  354. package/dist/types/client/ClientKernel.d.ts +90 -0
  355. package/dist/types/client/IClientKernel.d.ts +195 -0
  356. package/dist/types/client/angular/index.d.ts +273 -0
  357. package/dist/types/client/announce.d.ts +74 -0
  358. package/dist/types/client/debugbar/DebugBar.d.ts +279 -0
  359. package/dist/types/client/debugbar/format.d.ts +48 -0
  360. package/dist/types/client/debugbar/hmr.d.ts +16 -0
  361. package/dist/types/client/debugbar/index.d.ts +30 -0
  362. package/dist/types/client/debugbar/model.d.ts +158 -0
  363. package/dist/types/client/debugbar/network.d.ts +55 -0
  364. package/dist/types/client/debugbar/profile.d.ts +99 -0
  365. package/dist/types/client/index.d.ts +47 -0
  366. package/dist/types/client/react/index.d.ts +207 -0
  367. package/dist/types/client/realtime/AdaptiveRate.d.ts +138 -0
  368. package/dist/types/client/realtime/BrowserWsTransport.d.ts +27 -0
  369. package/dist/types/client/realtime/RealtimeClient.d.ts +573 -0
  370. package/dist/types/client/realtime/localEvents.d.ts +53 -0
  371. package/dist/types/client/realtime/notice.d.ts +70 -0
  372. package/dist/types/client/realtime/observe.d.ts +284 -0
  373. package/dist/types/client/roles/index.d.ts +15 -0
  374. package/dist/types/client/roles/registry.d.ts +72 -0
  375. package/dist/types/client/roles/roles.d.ts +68 -0
  376. package/dist/types/client/shim/cli-color.d.ts +2 -0
  377. package/dist/types/client/shim/events.d.ts +39 -0
  378. package/dist/types/client/shim/util.d.ts +14 -0
  379. package/dist/types/client/svelte/index.d.ts +216 -0
  380. package/dist/types/client/syslog/context.d.ts +76 -0
  381. package/dist/types/client/syslog/errors.d.ts +46 -0
  382. package/dist/types/client/syslog/uplink.d.ts +89 -0
  383. package/dist/types/client/transport/websocket.d.ts +5 -0
  384. package/dist/types/client/vue/index.d.ts +234 -0
  385. package/dist/types/colors.d.ts +32 -0
  386. package/dist/types/command/Builder.d.ts +47 -0
  387. package/dist/types/command/Command.d.ts +268 -0
  388. package/dist/types/config/configMeta.d.ts +53 -0
  389. package/dist/types/config/configProvenance.d.ts +58 -0
  390. package/dist/types/config/defaults.d.ts +33 -0
  391. package/dist/types/config/defineConfig.d.ts +70 -0
  392. package/dist/types/config/defineEnv.d.ts +170 -0
  393. package/dist/types/config/envExample.d.ts +23 -0
  394. package/dist/types/config/envOverride.d.ts +236 -0
  395. package/dist/types/config/index.d.ts +23 -0
  396. package/dist/types/config/infra.d.ts +171 -0
  397. package/dist/types/config/reactivity.d.ts +36 -0
  398. package/dist/types/config/reservedEnv.d.ts +145 -0
  399. package/dist/types/config/schema.d.ts +113 -0
  400. package/dist/types/config/types.d.ts +374 -0
  401. package/dist/types/config/use.d.ts +80 -0
  402. package/dist/types/finder/File.d.ts +26 -0
  403. package/dist/types/finder/FileResult.d.ts +14 -0
  404. package/dist/types/finder/Finder.d.ts +51 -0
  405. package/dist/types/finder/Result.d.ts +10 -0
  406. package/dist/types/index.d.ts +205 -0
  407. package/dist/types/kernel/BootConfigurationError.d.ts +50 -0
  408. package/dist/types/kernel/CliKernel.d.ts +289 -0
  409. package/dist/types/kernel/Kernel.d.ts +1255 -0
  410. package/dist/types/kernel/Module.d.ts +326 -0
  411. package/dist/types/kernel/adminPlane/adminCaller.d.ts +105 -0
  412. package/dist/types/kernel/adminPlane/adminRbac.d.ts +44 -0
  413. package/dist/types/kernel/adminPlane/catalog.d.ts +122 -0
  414. package/dist/types/kernel/adminPlane/executeAdmin.d.ts +99 -0
  415. package/dist/types/kernel/bootReport.d.ts +112 -0
  416. package/dist/types/kernel/checks/deep.d.ts +122 -0
  417. package/dist/types/kernel/checks/freshness.d.ts +49 -0
  418. package/dist/types/kernel/checks/gating.d.ts +134 -0
  419. package/dist/types/kernel/checks/guards.d.ts +57 -0
  420. package/dist/types/kernel/checks/lastBoot.d.ts +189 -0
  421. package/dist/types/kernel/checks/live.d.ts +110 -0
  422. package/dist/types/kernel/checks/packageDeps.d.ts +44 -0
  423. package/dist/types/kernel/checks/readiness.d.ts +97 -0
  424. package/dist/types/kernel/checks/renderReport.d.ts +107 -0
  425. package/dist/types/kernel/checks/report.d.ts +414 -0
  426. package/dist/types/kernel/checks/runDoctor.d.ts +361 -0
  427. package/dist/types/kernel/checks/surface.d.ts +148 -0
  428. package/dist/types/kernel/checks/walk.d.ts +45 -0
  429. package/dist/types/kernel/checks/wiring.d.ts +54 -0
  430. package/dist/types/kernel/commands/AiMcpCommand.d.ts +39 -0
  431. package/dist/types/kernel/commands/AiSyncCommand.d.ts +28 -0
  432. package/dist/types/kernel/commands/BuildCommand.d.ts +13 -0
  433. package/dist/types/kernel/commands/CardCommand.d.ts +34 -0
  434. package/dist/types/kernel/commands/ClusterCommand.d.ts +29 -0
  435. package/dist/types/kernel/commands/CompletionCommand.d.ts +17 -0
  436. package/dist/types/kernel/commands/CreateCommand.d.ts +16 -0
  437. package/dist/types/kernel/commands/DevCommand.d.ts +40 -0
  438. package/dist/types/kernel/commands/DoctorCommand.d.ts +55 -0
  439. package/dist/types/kernel/commands/EnvCommand.d.ts +35 -0
  440. package/dist/types/kernel/commands/GitHooksCommand.d.ts +27 -0
  441. package/dist/types/kernel/commands/InspectCommand.d.ts +59 -0
  442. package/dist/types/kernel/commands/InstallCommand.d.ts +7 -0
  443. package/dist/types/kernel/commands/MenuCommand.d.ts +58 -0
  444. package/dist/types/kernel/commands/OutdatedCommand.d.ts +47 -0
  445. package/dist/types/kernel/commands/ProdCommand.d.ts +29 -0
  446. package/dist/types/kernel/commands/StatusCommand.d.ts +17 -0
  447. package/dist/types/kernel/commands/StopCommand.d.ts +17 -0
  448. package/dist/types/kernel/commands/SymbolsCommand.d.ts +29 -0
  449. package/dist/types/kernel/commands/runtimeLauncher.d.ts +76 -0
  450. package/dist/types/kernel/decorators/kernelDecorator.d.ts +76 -0
  451. package/dist/types/kernel/injector/injector.d.ts +47 -0
  452. package/dist/types/kernel/injector/serviceOrder.d.ts +29 -0
  453. package/dist/types/kernel/inspect/adminSubjects.d.ts +169 -0
  454. package/dist/types/kernel/inspect/docOutline.d.ts +53 -0
  455. package/dist/types/kernel/lifecycleTags.d.ts +79 -0
  456. package/dist/types/kernel/moduleConfig.d.ts +35 -0
  457. package/dist/types/kernel/moduleGating.d.ts +78 -0
  458. package/dist/types/kernel/readinessRegistry.d.ts +104 -0
  459. package/dist/types/kernel/resolveModuleEntry.d.ts +46 -0
  460. package/dist/types/mcp/caller.d.ts +55 -0
  461. package/dist/types/mcp/guard.d.ts +66 -0
  462. package/dist/types/mcp/protocol.d.ts +163 -0
  463. package/dist/types/mcp/server.d.ts +70 -0
  464. package/dist/types/mcp/tools.d.ts +209 -0
  465. package/dist/types/oauth/authorizationServer.d.ts +204 -0
  466. package/dist/types/oauth/protectedResource.d.ts +339 -0
  467. package/dist/types/realtime/IRealtimeSocket.d.ts +142 -0
  468. package/dist/types/realtime/IRealtimeTransport.d.ts +50 -0
  469. package/dist/types/realtime/JsonRpcPeer.d.ts +251 -0
  470. package/dist/types/realtime/RealtimeEventMap.d.ts +269 -0
  471. package/dist/types/realtime/channelRate.d.ts +55 -0
  472. package/dist/types/realtime/platformChannels.d.ts +147 -0
  473. package/dist/types/runtime/GcScheduler.d.ts +96 -0
  474. package/dist/types/runtime/RequestContext.d.ts +152 -0
  475. package/dist/types/runtime/bearer.d.ts +88 -0
  476. package/dist/types/runtime/engineEnvironment.d.ts +115 -0
  477. package/dist/types/runtime/loadEnv.d.ts +86 -0
  478. package/dist/types/runtime/pageFacets.d.ts +104 -0
  479. package/dist/types/runtime/pageFilters.d.ts +139 -0
  480. package/dist/types/runtime/pageGuard.d.ts +78 -0
  481. package/dist/types/runtime/pageQuery.d.ts +138 -0
  482. package/dist/types/runtime/pageSort.d.ts +86 -0
  483. package/dist/types/runtime/redact.d.ts +27 -0
  484. package/dist/types/runtime/withTimeout.d.ts +51 -0
  485. package/dist/types/service/cluster/ClusterManager.d.ts +112 -0
  486. package/dist/types/service/cluster/ClusterProbeAggregator.d.ts +68 -0
  487. package/dist/types/service/cluster/ClusterRelay.d.ts +57 -0
  488. package/dist/types/service/cluster/clusterMaster.d.ts +40 -0
  489. package/dist/types/service/cluster/clusterMessage.d.ts +94 -0
  490. package/dist/types/service/cluster/cpuQuota.d.ts +37 -0
  491. package/dist/types/service/cluster/instanceProbe.d.ts +82 -0
  492. package/dist/types/service/cluster/podEnvironment.d.ts +35 -0
  493. package/dist/types/service/cluster/processProbe.d.ts +53 -0
  494. package/dist/types/service/cluster/richProcessProbe.d.ts +77 -0
  495. package/dist/types/service/cluster/topology.d.ts +64 -0
  496. package/dist/types/service/dev/BootReporter.d.ts +67 -0
  497. package/dist/types/service/dev/DevSupervisor.d.ts +117 -0
  498. package/dist/types/service/dev/bootVerdict.d.ts +99 -0
  499. package/dist/types/service/dev/detachedStart.d.ts +164 -0
  500. package/dist/types/service/dev/devProcess.d.ts +638 -0
  501. package/dist/types/service/dev/devProjects.d.ts +121 -0
  502. package/dist/types/service/dev/devStatusReport.d.ts +141 -0
  503. package/dist/types/service/dev/devStop.d.ts +57 -0
  504. package/dist/types/service/fetchService.d.ts +29 -0
  505. package/dist/types/service/gitService.d.ts +24 -0
  506. package/dist/types/syslog/Pdu.d.ts +134 -0
  507. package/dist/types/syslog/Syslog.d.ts +482 -0
  508. package/dist/types/syslog/drivers/ClusterFileLogDriver.d.ts +40 -0
  509. package/dist/types/syslog/drivers/FileLogDriver.d.ts +55 -0
  510. package/dist/types/syslog/drivers/ILogDriver.d.ts +177 -0
  511. package/dist/types/syslog/drivers/LokiLogDriver.d.ts +44 -0
  512. package/dist/types/syslog/drivers/MemoryLogDriver.d.ts +20 -0
  513. package/dist/types/syslog/drivers/OpenSearchLogDriver.d.ts +40 -0
  514. package/dist/types/syslog/drivers/builtinLogDrivers.d.ts +43 -0
  515. package/dist/types/syslog/drivers/filterPdus.d.ts +21 -0
  516. package/dist/types/syslog/drivers/logDriverRegistry.d.ts +100 -0
  517. package/dist/types/syslog/drivers/opensearchShared.d.ts +11 -0
  518. package/dist/types/syslog/drivers/pduFlow.d.ts +53 -0
  519. package/dist/types/syslog/drivers/pduProtocol.d.ts +20 -0
  520. package/dist/types/syslog/httpFetch.d.ts +48 -0
  521. package/dist/types/syslog/logColor.d.ts +59 -0
  522. package/dist/types/syslog/sinks/FileSink.d.ts +78 -0
  523. package/dist/types/syslog/transports/BatchingHttpTransport.d.ts +59 -0
  524. package/dist/types/syslog/transports/ConsoleTransport.d.ts +8 -0
  525. package/dist/types/syslog/transports/FileTransport.d.ts +13 -0
  526. package/dist/types/syslog/transports/HttpTransport.d.ts +15 -0
  527. package/dist/types/syslog/transports/LokiTransport.d.ts +45 -0
  528. package/dist/types/syslog/transports/OpenSearchTransport.d.ts +40 -0
  529. package/dist/types/syslog/transports/SyslogTransport.d.ts +9 -0
  530. package/dist/types/syslog/transports/index.d.ts +12 -0
  531. package/dist/types/testing/index.d.ts +197 -0
  532. package/dist/types/types/IAdminApi.d.ts +246 -0
  533. package/dist/types/types/ICliKernel.d.ts +28 -0
  534. package/dist/types/types/ICommand.d.ts +14 -0
  535. package/dist/types/types/IContainer.d.ts +35 -0
  536. package/dist/types/types/IIdempotencyStore.d.ts +159 -0
  537. package/dist/types/types/IKernel.d.ts +138 -0
  538. package/dist/types/types/IMcpTool.d.ts +157 -0
  539. package/dist/types/types/IModule.d.ts +73 -0
  540. package/dist/types/types/IModuleManifest.d.ts +49 -0
  541. package/dist/types/types/IPage.d.ts +119 -0
  542. package/dist/types/types/IService.d.ts +62 -0
  543. package/dist/types/types/ISyslog.d.ts +58 -0
  544. package/dist/types/types/ITransport.d.ts +5 -0
  545. package/dist/types/types/globals.d.ts +47 -0
  546. package/docs/angular-services.md +318 -0
  547. package/docs/catalogue.md +184 -0
  548. package/docs/cli.md +369 -0
  549. package/docs/client.md +616 -0
  550. package/docs/debugbar.md +218 -0
  551. package/docs/environnement.md +308 -0
  552. package/docs/index.md +388 -0
  553. package/docs/kernel.md +670 -0
  554. package/docs/progression.md +228 -0
  555. package/docs/react-hooks.md +686 -0
  556. package/docs/request-context.md +507 -0
  557. package/docs/service.md +590 -0
  558. package/docs/svelte-reactivite.md +293 -0
  559. package/docs/syslog.md +848 -0
  560. package/docs/testing.md +203 -0
  561. package/docs/vue-composables.md +255 -0
  562. package/man/nodefony.1 +152 -0
  563. package/package.json +163 -83
  564. package/templates/app/agents/AGENTS.md.tpl +967 -0
  565. package/templates/app/agents/POINTEUR.md.tpl +12 -0
  566. package/templates/app/base/Dockerfile.tpl +104 -0
  567. package/templates/app/base/README.md.tpl +314 -0
  568. package/templates/app/base/dockerignore.tpl +28 -0
  569. package/templates/app/base/env.ts.tpl +130 -0
  570. package/templates/app/base/gitattributes.tpl +28 -0
  571. package/templates/app/base/github/workflows/ci.yml.tpl +91 -0
  572. package/templates/app/base/gitignore.tpl +46 -0
  573. package/templates/app/base/gitlab-ci.yml.tpl +42 -0
  574. package/templates/app/base/index.ts.tpl +69 -0
  575. package/templates/app/base/nodefony.config.ts.tpl +342 -0
  576. package/templates/app/base/oxlintrc.json.tpl +127 -0
  577. package/templates/app/base/package.json.tpl +75 -0
  578. package/templates/app/base/prettierignore.tpl +24 -0
  579. package/templates/app/base/prettierrc.json.tpl +12 -0
  580. package/templates/app/base/rolldown.config.ts.tpl +8 -0
  581. package/templates/app/base/tests/config.test.ts.tpl +29 -0
  582. package/templates/app/base/tests/e2e.setup.ts.tpl +181 -0
  583. package/templates/app/base/tests/e2e.test.ts.tpl +105 -0
  584. package/templates/app/base/tests/migrations.e2e.test.ts.tpl +579 -0
  585. package/templates/app/base/tsconfig.json.tpl +47 -0
  586. package/templates/app/base/vitest.config.ts.tpl +88 -0
  587. package/templates/app/base/vitest.e2e.config.ts.tpl +39 -0
  588. package/templates/app/complete/compose.yaml.tpl +328 -0
  589. package/templates/app/complete/deploy/migrate-job.yaml.tpl +100 -0
  590. package/templates/app/complete/docker/db/init-nodefony-e2e.sql.tpl +30 -0
  591. package/templates/app/complete/docker/grafana/provisioning/datasources/loki.yaml.tpl +15 -0
  592. package/templates/app/complete/env.local.tpl +11 -0
  593. package/templates/app/complete/env.tpl +53 -0
  594. package/templates/app/complete/nodefony/entity/User.ts.tpl +69 -0
  595. package/templates/app/complete/nodefony/security/provisionUsers.ts.tpl +124 -0
  596. package/templates/app/complete/nodefony/service/AppBannerService.ts.tpl +98 -0
  597. package/templates/app/complete/nodefony/service/AppInfoService.ts.tpl +85 -0
  598. package/templates/app/frontend/angular/frontend/src/accent.css.tpl +34 -0
  599. package/templates/app/frontend/angular/frontend/src/app/app.component.ts.tpl +400 -0
  600. package/templates/app/frontend/react/frontend/src/App.tsx.tpl +421 -0
  601. package/templates/app/frontend/react/frontend/src/accent.css.tpl +30 -0
  602. package/templates/app/frontend/shared/frontend/src/brand.ts.tpl +3 -0
  603. package/templates/app/frontend/shared/frontend/src/showcase.css.tpl +224 -0
  604. package/templates/app/frontend/shared/nodefony/controllers/AppController.ts.tpl +45 -0
  605. package/templates/app/frontend/svelte/frontend/src/App.svelte.tpl +371 -0
  606. package/templates/app/frontend/svelte/frontend/src/accent.css.tpl +34 -0
  607. package/templates/app/frontend/vue/frontend/src/App.vue.tpl +367 -0
  608. package/templates/app/frontend/vue/frontend/src/accent.css.tpl +34 -0
  609. package/templates/app/home/nodefony/controllers/HomeController.ts.tpl +38 -0
  610. package/templates/command/nodefony/command/__NAME__.ts.tpl +132 -0
  611. package/templates/controller/duplex/nodefony/controllers/__NAME__.ts.tpl +188 -0
  612. package/templates/controller/example/nodefony/controllers/__NAME__.ts.tpl +348 -0
  613. package/templates/controller/hello/nodefony/controllers/__NAME__.ts.tpl +143 -0
  614. package/templates/controller/realtime/nodefony/controllers/__NAME__.ts.tpl +153 -0
  615. package/templates/controller/realtime/tests/__KEBAB__-realtime.test.ts.tpl +79 -0
  616. package/templates/controller/rest/nodefony/controllers/__NAME__.ts.tpl +159 -0
  617. package/templates/entity/base/nodefony/entity/__PASCAL__.schema.ts.tpl +31 -0
  618. package/templates/entity/base/nodefony/entity/__PASCAL__.ts.tpl +68 -0
  619. package/templates/entity/controller/nodefony/controllers/__PASCAL__Controller.ts.tpl +335 -0
  620. package/templates/entity/service/nodefony/service/__PASCAL__Service.ts.tpl +126 -0
  621. package/templates/entity/tests/tests/__KEBAB__.e2e.test.ts.tpl +358 -0
  622. package/templates/entity/tests/tests/__KEBAB__.test.ts.tpl +87 -0
  623. package/templates/front/angular/frontend/src/app/app.component.ts.tpl +30 -0
  624. package/templates/front/base/nodefony/controllers/__NAME__.ts.tpl +60 -0
  625. package/templates/front/react/frontend/src/App.tsx.tpl +26 -0
  626. package/templates/front/svelte/frontend/src/App.svelte.tpl +19 -0
  627. package/templates/front/vue/frontend/src/App.vue.tpl +23 -0
  628. package/templates/module/ai/AGENTS.md.tpl +71 -0
  629. package/templates/module/base/README.md.tpl +62 -0
  630. package/templates/module/base/docs/index.md.tpl +55 -0
  631. package/templates/module/base/index.ts.tpl +50 -0
  632. package/templates/module/base/nodefony/config/config.ts.tpl +60 -0
  633. package/templates/module/base/nodefony/config/defineModuleConfig.ts.tpl +55 -0
  634. package/templates/module/base/nodefony/src/errors/__PASCAL__Error.ts.tpl +20 -0
  635. package/templates/module/base/package.json.tpl +53 -0
  636. package/templates/module/base/rolldown.config.ts.tpl +14 -0
  637. package/templates/module/base/tests/__KEBAB__.test.ts.tpl +39 -0
  638. package/templates/module/base/tsconfig.json.tpl +42 -0
  639. package/templates/module/base/vitest.config.ts.tpl +27 -0
  640. package/templates/module/packages/CLAUDE.md.tpl +51 -0
  641. package/templates/module/packages/MEMORY.md.tpl +39 -0
  642. package/templates/module/packages/tsconfig.declarations.json.tpl +19 -0
  643. package/templates/module/packages/tsconfig.tests.json.tpl +11 -0
  644. package/templates/module/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +14 -0
  645. package/templates/module/service/nodefony/interfaces/index.ts.tpl +1 -0
  646. package/templates/module/service/nodefony/service/__PASCAL__Service.ts.tpl +116 -0
  647. package/templates/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +19 -0
  648. package/templates/service/nodefony/service/__PASCAL__Service.ts.tpl +136 -0
  649. package/templates/service/tests/__PASCAL__Service.test.ts.tpl +53 -0
  650. package/templates/shared/front-entry/angular/frontend/src/main.ts.tpl +17 -0
  651. package/templates/shared/front-entry/react/frontend/src/main.tsx.tpl +11 -0
  652. package/templates/shared/front-entry/svelte/frontend/src/main.ts.tpl +13 -0
  653. package/templates/shared/front-entry/vue/frontend/src/main.ts.tpl +12 -0
  654. package/templates/shared/front-registrar/nodefony/frontend/register__PASCAL__Entry.ts.tpl +40 -0
  655. package/templates/shared/front-shell/frontend/index.html.tpl +39 -0
  656. package/templates/shared/ng-app-tsconfig/frontend/tsconfig.app.json.tpl +18 -0
  657. package/templates/shared/svelte-shim/frontend/src/env.d.ts.tpl +12 -0
  658. package/templates/shared/vue-shim/frontend/src/env.d.ts.tpl +15 -0
  659. package/.yarnclean +0 -45
  660. package/CHANGELOG.md +0 -406
  661. package/autoloader.es6 +0 -253
  662. package/builder.es6 +0 -366
  663. package/cli/builder/bundles/bundle.js +0 -328
  664. package/cli/builder/bundles/controller.js +0 -73
  665. package/cli/builder/bundles/users-bundle/.yarnclean +0 -45
  666. package/cli/builder/bundles/users-bundle/Command/fixtureTask.js +0 -47
  667. package/cli/builder/bundles/users-bundle/Command/usersCommand.js +0 -105
  668. package/cli/builder/bundles/users-bundle/Entity/mongoose/userEntity.js +0 -168
  669. package/cli/builder/bundles/users-bundle/Entity/sequelize/userEntity.js +0 -231
  670. package/cli/builder/bundles/users-bundle/Fixtures/users.js +0 -117
  671. package/cli/builder/bundles/users-bundle/Fixtures/usersFixtures.js +0 -114
  672. package/cli/builder/bundles/users-bundle/Resources/config/config.js +0 -90
  673. package/cli/builder/bundles/users-bundle/Resources/config/routing.js +0 -17
  674. package/cli/builder/bundles/users-bundle/Resources/config/security.js +0 -96
  675. package/cli/builder/bundles/users-bundle/Resources/config/services.js +0 -7
  676. package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.dev.config.js +0 -13
  677. package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.prod.config.js +0 -31
  678. package/cli/builder/bundles/users-bundle/Resources/config/webpack.config.js +0 -146
  679. package/cli/builder/bundles/users-bundle/Resources/js/users.js +0 -153
  680. package/cli/builder/bundles/users-bundle/Resources/public/favicon.ico +0 -0
  681. package/cli/builder/bundles/users-bundle/Resources/public/images/users-logo.png +0 -0
  682. package/cli/builder/bundles/users-bundle/Resources/scss/awesome/font-awesome.config.js +0 -11
  683. package/cli/builder/bundles/users-bundle/Resources/scss/custom.scss +0 -23
  684. package/cli/builder/bundles/users-bundle/Resources/scss/users.scss +0 -59
  685. package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/login.js +0 -235
  686. package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/users.js +0 -232
  687. package/cli/builder/bundles/users-bundle/Resources/translations/login.en_en.yml +0 -14
  688. package/cli/builder/bundles/users-bundle/Resources/translations/login.fr_fr.yml +0 -14
  689. package/cli/builder/bundles/users-bundle/Resources/translations/users.en_en.yml +0 -35
  690. package/cli/builder/bundles/users-bundle/Resources/translations/users.fr_fr.yml +0 -36
  691. package/cli/builder/bundles/users-bundle/Resources/views/base.html.twig +0 -32
  692. package/cli/builder/bundles/users-bundle/Resources/views/footer.html.twig +0 -7
  693. package/cli/builder/bundles/users-bundle/Resources/views/header.html.twig +0 -90
  694. package/cli/builder/bundles/users-bundle/Resources/views/login/login.html.twig +0 -43
  695. package/cli/builder/bundles/users-bundle/Resources/views/users/createUser.html.twig +0 -296
  696. package/cli/builder/bundles/users-bundle/Resources/views/users/readUsers.html.twig +0 -94
  697. package/cli/builder/bundles/users-bundle/controller/api/graphql/graphqlController.js +0 -56
  698. package/cli/builder/bundles/users-bundle/controller/api/graphql/userResolver.js +0 -121
  699. package/cli/builder/bundles/users-bundle/controller/api/graphql/usertype.js +0 -58
  700. package/cli/builder/bundles/users-bundle/controller/api/openapi/loginApiController.js +0 -210
  701. package/cli/builder/bundles/users-bundle/controller/api/openapi/restUserController.js +0 -244
  702. package/cli/builder/bundles/users-bundle/controller/loginController.js +0 -91
  703. package/cli/builder/bundles/users-bundle/controller/usersController.js +0 -332
  704. package/cli/builder/bundles/users-bundle/package.json +0 -58
  705. package/cli/builder/bundles/users-bundle/readme.md +0 -360
  706. package/cli/builder/bundles/users-bundle/services/usersService.js +0 -411
  707. package/cli/builder/bundles/users-bundle/src/providers/mongoose/userProvider.js +0 -47
  708. package/cli/builder/bundles/users-bundle/src/providers/sequelize/userProvider.js +0 -48
  709. package/cli/builder/bundles/users-bundle/tests/loginTest.js +0 -182
  710. package/cli/builder/bundles/users-bundle/usersBundle.js +0 -26
  711. package/cli/builder/microService/microService.js +0 -261
  712. package/cli/builder/microService/skeletons/.editorconfig +0 -18
  713. package/cli/builder/microService/skeletons/.env-cmdrc.js +0 -32
  714. package/cli/builder/microService/skeletons/.jshintrc +0 -37
  715. package/cli/builder/microService/skeletons/README.md +0 -117
  716. package/cli/builder/microService/skeletons/bin/bash/hello.sh +0 -5
  717. package/cli/builder/microService/skeletons/bin/cli +0 -13
  718. package/cli/builder/microService/skeletons/bin/python/hello.py +0 -20
  719. package/cli/builder/microService/skeletons/config/config.js +0 -29
  720. package/cli/builder/microService/skeletons/config/pm2.config.js +0 -72
  721. package/cli/builder/microService/skeletons/config/webpack/webpack.config.dev.js +0 -8
  722. package/cli/builder/microService/skeletons/config/webpack/webpack.config.prod.js +0 -25
  723. package/cli/builder/microService/skeletons/config/webpack.config.js +0 -114
  724. package/cli/builder/microService/skeletons/package.json +0 -76
  725. package/cli/builder/microService/skeletons/src/browser/index.css +0 -3
  726. package/cli/builder/microService/skeletons/src/browser/index.js +0 -16
  727. package/cli/builder/microService/skeletons/src/browser/socketio.js +0 -46
  728. package/cli/builder/microService/skeletons/src/cli/cli.js +0 -224
  729. package/cli/builder/microService/skeletons/src/cli/menu.js +0 -28
  730. package/cli/builder/microService/skeletons/src/n-api/README.md +0 -1
  731. package/cli/builder/microService/skeletons/src/n-api/binding.gyp +0 -14
  732. package/cli/builder/microService/skeletons/src/n-api/hello.cc +0 -14
  733. package/cli/builder/microService/skeletons/src/n-api/hello.js +0 -23
  734. package/cli/builder/microService/skeletons/src/n-api/package.json +0 -15
  735. package/cli/builder/microService/skeletons/src/node/examples/index.js +0 -120
  736. package/cli/builder/microService/skeletons/src/node/index.js +0 -102
  737. package/cli/builder/microService/skeletons/src/node/services/markdown/markdown.js +0 -27
  738. package/cli/builder/microService/skeletons/src/node/services/servers/http.js +0 -45
  739. package/cli/builder/microService/skeletons/src/node/services/servers/https.js +0 -44
  740. package/cli/builder/microService/skeletons/src/node/services/socketio/socketio.js +0 -46
  741. package/cli/builder/microService/skeletons/src/node/services/syscall/syscall.js +0 -111
  742. package/cli/builder/microService/skeletons/src/node/services/worker/thread.js +0 -59
  743. package/cli/builder/microService/skeletons/src/node/services/worker/worker.js +0 -60
  744. package/cli/builder/microService/skeletons/src/templates/base.html +0 -12
  745. package/cli/builder/microService/skeletons/src/templates/socket.html +0 -23
  746. package/cli/builder/microService/skeletons/tests/unit/serviceTest.js +0 -30
  747. package/cli/builder/project/project.js +0 -474
  748. package/cli/builder/project/skeletons/README.md +0 -778
  749. package/cli/builder/project/skeletons/bin/dev-deploy.sh +0 -5
  750. package/cli/builder/project/skeletons/bin/generateCertificates.sh.skeleton +0 -180
  751. package/cli/builder/project/skeletons/bin/prod-deploy.sh +0 -3
  752. package/cli/builder/project/skeletons/config/config.js.skeleton +0 -178
  753. package/cli/builder/project/skeletons/config/openssl/ca/openssl.cnf.skeleton +0 -150
  754. package/cli/builder/project/skeletons/config/openssl/ca_intermediate/openssl.cnf.skeleton +0 -152
  755. package/cli/builder/project/skeletons/config/pm2.config.js.skeleton +0 -62
  756. package/cli/builder/project/skeletons/documentation.html.twig +0 -24
  757. package/cli/builder/project/skeletons/editorconfig.skeleton +0 -18
  758. package/cli/builder/project/skeletons/eslintignore.skeleton +0 -15
  759. package/cli/builder/project/skeletons/eslintrc.js.skeleton +0 -97
  760. package/cli/builder/project/skeletons/gitignore.skeleton +0 -32
  761. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.37.entity-user.js +0 -137
  762. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.38.entity-session.js +0 -97
  763. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.39.entity-requests.js +0 -115
  764. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.40.entity-jwts.js +0 -97
  765. package/cli/builder/project/skeletons/migrations/migrations.skeleton.js +0 -101
  766. package/cli/builder/project/skeletons/package.json.twig +0 -71
  767. package/cli/builder/react/reactBuilder.js +0 -224
  768. package/cli/builder/react/skeletons/app/Resources/databases/nodefony.db +0 -0
  769. package/cli/builder/react/skeletons/app/Resources/translations/messages.en_en.yml +0 -5
  770. package/cli/builder/react/skeletons/app/Resources/translations/messages.fr_fr.yml +0 -5
  771. package/cli/builder/react/skeletons/app/Resources/views/base.html.twig +0 -33
  772. package/cli/builder/react/skeletons/app/config/config.js +0 -392
  773. package/cli/builder/react/skeletons/app/config/routing.js +0 -10
  774. package/cli/builder/react/skeletons/app/config/security.js +0 -74
  775. package/cli/builder/react/skeletons/app/controller/appController.js +0 -22
  776. package/cli/builder/sandbox/sandBoxBuilder.js +0 -610
  777. package/cli/builder/sandbox/skeletons/Resources/css/entry.css +0 -48
  778. package/cli/builder/sandbox/skeletons/Resources/js/entry.js +0 -60
  779. package/cli/builder/sandbox/skeletons/Resources/public/manifest.json +0 -32
  780. package/cli/builder/sandbox/skeletons/Resources/translations/messages.en_en.yml +0 -5
  781. package/cli/builder/sandbox/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
  782. package/cli/builder/sandbox/skeletons/Resources/views/base.html.twig +0 -46
  783. package/cli/builder/sandbox/skeletons/Resources/views/index.html.twig +0 -34
  784. package/cli/builder/sandbox/skeletons/bootstrap/custom.scss +0 -27
  785. package/cli/builder/sandbox/skeletons/bootstrap/entry.scss +0 -60
  786. package/cli/builder/sandbox/skeletons/workbox/templates/index.html.twig +0 -32
  787. package/cli/builder/sandbox/skeletons/workbox/workers/service-worker.js +0 -196
  788. package/cli/builder/skeletons/Resources/public/favicon.ico +0 -0
  789. package/cli/builder/skeletons/Resources/public/images/app-logo.png +0 -0
  790. package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.html.twig +0 -1
  791. package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.json.twig +0 -24
  792. package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.html.twig +0 -1
  793. package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.json.twig +0 -20
  794. package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.html.twig +0 -1
  795. package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.json.twig +0 -20
  796. package/cli/builder/skeletons/Resources/views/framework-bundle/views/500.html.twig +0 -1
  797. package/cli/builder/skeletons/Resources/views/framework-bundle/views/base.html.twig +0 -30
  798. package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.html.twig +0 -1
  799. package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.json.twig +0 -24
  800. package/cli/builder/skeletons/Resources/views/framework-bundle/views/footer.html.twig +0 -33
  801. package/cli/builder/skeletons/Resources/views/framework-bundle/views/header.html.twig +0 -6
  802. package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.html.twig +0 -6
  803. package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.json.twig +0 -1
  804. package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.html.twig +0 -125
  805. package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.json.twig +0 -5
  806. package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.html.twig +0 -1
  807. package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.json.twig +0 -24
  808. package/cli/builder/skeletons/app/appKernel.js +0 -133
  809. package/cli/builder/skeletons/binding/binding.cc +0 -26
  810. package/cli/builder/skeletons/binding/binding.skeleton +0 -8
  811. package/cli/builder/skeletons/bundle/bundleClass.js +0 -37
  812. package/cli/builder/skeletons/command/commandClass.js +0 -11
  813. package/cli/builder/skeletons/command/taskClass.js +0 -20
  814. package/cli/builder/skeletons/config/config.js +0 -138
  815. package/cli/builder/skeletons/config/nodefony/elastic-bundle.js +0 -37
  816. package/cli/builder/skeletons/config/nodefony/framework-bundle.js +0 -22
  817. package/cli/builder/skeletons/config/nodefony/http-bundle.js +0 -104
  818. package/cli/builder/skeletons/config/nodefony/mail-bundle.js +0 -44
  819. package/cli/builder/skeletons/config/nodefony/mongoose-bundle.js +0 -51
  820. package/cli/builder/skeletons/config/nodefony/monitoring-bundle.js +0 -34
  821. package/cli/builder/skeletons/config/nodefony/realtime-bundle.js +0 -15
  822. package/cli/builder/skeletons/config/nodefony/redis-bundle.js +0 -44
  823. package/cli/builder/skeletons/config/nodefony/security-bundle.js +0 -25
  824. package/cli/builder/skeletons/config/nodefony/sequelize-bundle.js +0 -156
  825. package/cli/builder/skeletons/config/routing.js +0 -55
  826. package/cli/builder/skeletons/config/security.js +0 -102
  827. package/cli/builder/skeletons/config/services.js +0 -1
  828. package/cli/builder/skeletons/config/webpack/webpack.dev.config.js +0 -13
  829. package/cli/builder/skeletons/config/webpack/webpack.prod.config.js +0 -20
  830. package/cli/builder/skeletons/config/webpack.config.js +0 -148
  831. package/cli/builder/skeletons/controller/controllerClass.js +0 -75
  832. package/cli/builder/skeletons/package.json.twig +0 -57
  833. package/cli/builder/skeletons/unittest/testFile.js +0 -46
  834. package/cli/builder/vue/skeletons/Resources/public/images/app-logo.png +0 -0
  835. package/cli/builder/vue/skeletons/Resources/translations/messages.en_en.yml +0 -5
  836. package/cli/builder/vue/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
  837. package/cli/builder/vue/skeletons/vue.config.js +0 -129
  838. package/cli/builder/vue/vueBuilder.js +0 -410
  839. package/cli/generate/generate.es6 +0 -103
  840. package/cli/install/install.js +0 -190
  841. package/cli/sequelize/sequelize.js +0 -94
  842. package/cli/start.js +0 -702
  843. package/cli/tools/pm2.es6 +0 -112
  844. package/cli/tools/tools.es6 +0 -97
  845. package/cli.es6 +0 -925
  846. package/container.es6 +0 -272
  847. package/error.es6 +0 -293
  848. package/fileClass.es6 +0 -242
  849. package/finder/file.es6 +0 -33
  850. package/finder/fileResult.es6 +0 -138
  851. package/finder/finder2.es6 +0 -275
  852. package/finder.es6 +0 -427
  853. package/kernel/annotations/annotations.es6 +0 -286
  854. package/kernel/api/api.es6 +0 -61
  855. package/kernel/api/graphqlApi.es6 +0 -107
  856. package/kernel/api/jsonApi.es6 +0 -177
  857. package/kernel/api/openApi.es6 +0 -139
  858. package/kernel/api/schemas/openApiSchema.js +0 -394
  859. package/kernel/babylon.es6 +0 -162
  860. package/kernel/bundle.es6 +0 -1200
  861. package/kernel/cliKernel.es6 +0 -869
  862. package/kernel/command.es6 +0 -78
  863. package/kernel/commands/nodefonyCommand.es6 +0 -247
  864. package/kernel/commands/tasks/bundlesTask.es6 +0 -59
  865. package/kernel/controllers/controller.es6 +0 -791
  866. package/kernel/fixture.es6 +0 -19
  867. package/kernel/injections/injections.es6 +0 -424
  868. package/kernel/kernel.es6 +0 -1960
  869. package/kernel/kernelWatcher.es6 +0 -387
  870. package/kernel/orm/entity.es6 +0 -59
  871. package/kernel/orm/orm.es6 +0 -139
  872. package/kernel/reader.es6 +0 -290
  873. package/kernel/security/encoder.es6 +0 -17
  874. package/kernel/security/factories/factory.es6 +0 -111
  875. package/kernel/security/factories/passeportFactory.es6 +0 -61
  876. package/kernel/security/provider.es6 +0 -58
  877. package/kernel/security/providers/chainProvider.es6 +0 -99
  878. package/kernel/security/providers/memoryProvider.es6 +0 -55
  879. package/kernel/security/providers/providerManager.es6 +0 -67
  880. package/kernel/security/providers/userEntityProvider.es6 +0 -50
  881. package/kernel/security/role.es6 +0 -12
  882. package/kernel/security/secureArea.es6 +0 -431
  883. package/kernel/security/tokens/token.es6 +0 -171
  884. package/kernel/security/user.es6 +0 -106
  885. package/kernel/serviceRealTime.es6 +0 -21
  886. package/kernel/services/connectionsService.es6 +0 -93
  887. package/kernel/services/cron/cronService.es6 +0 -123
  888. package/kernel/task.es6 +0 -80
  889. package/kernel/templates.es6 +0 -22
  890. package/kernel/templating/twig.es6 +0 -218
  891. package/kernel/tests/cliTest.js +0 -59
  892. package/kernel/tests/containerTest.js +0 -232
  893. package/kernel/tests/kernelTest.js +0 -39
  894. package/nodefony.es6 +0 -1084
  895. package/notificationsCenter.es6 +0 -118
  896. package/protocol.es6 +0 -86
  897. package/protocols/bayeux.es6 +0 -174
  898. package/protocols/jsonRpc/jsonrpc.es6 +0 -56
  899. package/result.es6 +0 -99
  900. package/service.es6 +0 -288
  901. package/syslog/pdu.es6 +0 -141
  902. package/syslog/syslog.es6 +0 -754
  903. package/watcher.es6 +0 -113
@@ -0,0 +1,188 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import {
3
+ route,
4
+ controller,
5
+ Param,
6
+ Body,
7
+ Query,
8
+ HttpCode,
9
+ Idempotent,
10
+ CurrentUser,
11
+ <% if (it.hasSecurity) { %> IsGranted,
12
+ <% } %>} from "@nodefony/framework";
13
+ import { RealtimeController } from "@nodefony/realtime";
14
+ import { HttpError } from "@nodefony/http";
15
+ import type { ContextType } from "@nodefony/http";
16
+ <% if (it.hasSecurity) { %>import type { IUser } from "@nodefony/user";
17
+ <% } %>
18
+
19
+ /** Forme d'un item — remplace par ton entité (`nodefony create entity`). */
20
+ interface IItem {
21
+ id: string;
22
+ name: string;
23
+ createdAt: number;
24
+ createdBy: string;
25
+ }
26
+
27
+ /**
28
+ * <%= it.nameClass %> — resource **DUPLEX** : les MÊMES actions répondent en
29
+ * REST (curl/fetch) ET par la **socket Nodefony** via le pont `api.request`
30
+ * (« API souveraine » : 1 action = N transports, même pipeline — firewall,
31
+ * idempotence, audit). Deux ingrédients :
32
+ *
33
+ * 1. chaque route déclare ses transports — `methods: ["GET", "WEBSOCKET"]`
34
+ * (zéro bypass : une action dit à quelles portes elle répond) ;
35
+ * 2. `realtimeApiRequest()` → `true` (opt-in) : la connexion socket expose la
36
+ * méthode RPC `api.request {path}` qui re-route vers l'action.
37
+ *
38
+ * ⚠ Zero Trust : dans une zone firewall `security` (ex. `^/api` du manifeste),
39
+ * le pont exige une identité NON-anonyme — même si la zone accepte l'anonyme en
40
+ * HTTP (une surface d'invocation WS ne s'ouvre jamais par défaut). Connecte-toi
41
+ * d'abord (le cookie de session voyage avec le handshake), ou place la route
42
+ * hors zone pour un accès anonyme assumé.
43
+ *
44
+ * Côté client (navigateur OU script Node — la façade est isomorphe, le
45
+ * subpath `nodefony/client` est sa porte explicite) :
46
+ * ```ts
47
+ * import { RealtimeClient } from "nodefony/client";
48
+ * // URL RELATIVE, résolue contre la page (https → wss automatique) ;
49
+ * // `.shared()` = UNE socket par URL, partagée par toute la page.
50
+ * const socket = RealtimeClient.shared({ url: "<%= it.route %>/realtime" });
51
+ * await socket.connect();
52
+ * // LECTURE — la même action que `GET <%= it.route %>` :
53
+ * const items = await socket.request("<%= it.route %>?limit=10");
54
+ * // MUTATION — méthode HTTP logique + clé d'idempotence OBLIGATOIRE (une
55
+ * // socket qui reconnecte peut rejouer une frame → la clé dédoublonne) :
56
+ * const created = await socket.mutate("<%= it.route %>", {
57
+ * method: "POST",
58
+ * body: { name: "premier" },
59
+ * idempotencyKey: crypto.randomUUID(),
60
+ * });
61
+ * ```
62
+ * Et les MÊMES actions au curl :
63
+ * ```bash
64
+ * curl -k "https://127.0.0.1:5152<%= it.route %>?limit=10"
65
+ * curl -k -X POST -H "content-type: application/json" \
66
+ * -H "idempotency-key: demo-1" -d '{"name":"premier"}' https://127.0.0.1:5152<%= it.route %>
67
+ * ```
68
+ */
69
+ @controller("<%= it.route %>")
70
+ <% if (it.roleGuard) { %>// Habilitation exigée pour TOUT ce controller.
71
+ //
72
+ // Posée sur la CLASSE : chaque action en hérite, y compris celles qu'on
73
+ // ajoutera demain — c'est ce qui distingue une règle d'un rappel. Le refus est
74
+ // rendu par le framework AVANT que le controller ne soit instancié (403), donc
75
+ // aucune ligne de contrôle d'accès n'a sa place dans une action.
76
+ //
77
+ // L'administrateur y a accès sans porter ce rôle : `nodefony.config.ts` le
78
+ // déclare sous `ROLE_ADMIN` dans `roleHierarchy` — administrer, c'est déjà
79
+ // pouvoir tout consulter. Une hiérarchie vaut pour TOUTES les routes gardées par
80
+ // ce rôle, présentes et futures ; lister les rôles un par un sur chaque action ne
81
+ // généralise pas.
82
+ @IsGranted("<%= it.role %>")
83
+ <% } %>class <%= it.nameClass %> extends RealtimeController {
84
+ /** Store démo en mémoire — remplace par un repository (`create entity`). */
85
+ static items = new Map<string, IItem>();
86
+
87
+ constructor(context: ContextType) {
88
+ super("<%= it.kebab %>", context);
89
+ }
90
+
91
+ /**
92
+ * Le PONT (opt-in, défaut `false`) : expose `api.request` sur chaque
93
+ * connexion socket de ce controller. N'atteint QUE les routes déclarant le
94
+ * transport `WEBSOCKET` dans leurs `methods`.
95
+ */
96
+ protected override realtimeApiRequest(): boolean {
97
+ return true;
98
+ }
99
+
100
+ /** Handshake de la socket Nodefony (JSON-RPC 2.0) — la porte du pont. */
101
+ @route("<%= it.kebab %>-realtime", {
102
+ path: "/realtime",
103
+ requirements: { methods: ["WEBSOCKET"] },
104
+ })
105
+ async realtime(message: string | Buffer | null): Promise<void> {
106
+ this.handleRealtime(message);
107
+ }
108
+
109
+ /** Liste — `GET <%= it.route %>` OU `socket.request("<%= it.route %>")`. */
110
+ @route("<%= it.kebab %>-list", {
111
+ path: "",
112
+ requirements: { methods: ["GET", "WEBSOCKET"] },
113
+ })
114
+ list(@Query("limit") limit?: string) {
115
+ const max = Math.min(Number(limit) || 50, 200);
116
+ return [...<%= it.nameClass %>.items.values()].slice(0, max);
117
+ }
118
+
119
+ /** Détail — 404 typée si inconnu (RpcError `data.status: 404` côté socket). */
120
+ @route("<%= it.kebab %>-get", {
121
+ path: "/{id}",
122
+ requirements: { methods: ["GET", "WEBSOCKET"] },
123
+ })
124
+ detail(@Param("id") id: string) {
125
+ const item = <%= it.nameClass %>.items.get(id);
126
+ if (!item) {
127
+ throw new HttpError(`item ${id} introuvable`, 404);
128
+ }
129
+ return item;
130
+ }
131
+
132
+ /**
133
+ * Création idempotente par les DEUX portes : en HTTP la clé vient de
134
+ * l'en-tête `Idempotency-Key`, par la socket elle voyage dans la frame
135
+ * (`socket.mutate` l'exige) — même dédup, même cache de rejeu. ⚠ Une action
136
+ * `@Idempotent` RETOURNE son payload BRUT (c'est LUI qui est mémorisé).
137
+ */
138
+ @route("<%= it.kebab %>-create", {
139
+ path: "",
140
+ requirements: { methods: ["POST", "WEBSOCKET"] },
141
+ })
142
+ @HttpCode(201)
143
+ @Idempotent()
144
+ create(
145
+ @Body() payload: { name?: string },
146
+ @CurrentUser() user?: { identifier?: string },
147
+ ) {
148
+ const item: IItem = {
149
+ id: randomUUID(),
150
+ name: payload?.name ?? "sans nom",
151
+ createdAt: Date.now(),
152
+ createdBy: user?.identifier ?? "anon.",
153
+ };
154
+ <%= it.nameClass %>.items.set(item.id, item);
155
+ return item;
156
+ }
157
+
158
+ <% if (it.hasSecurity) { %> /**
159
+ * Suppression PROTÉGÉE par rôle — la MÊME garde pour les DEUX portes : en
160
+ * HTTP `@IsGranted` refuse (403) AVANT l'action ; par la socket, le pont
161
+ * `api.request` re-traverse le MÊME pipeline (le token du handshake voyage
162
+ * dans l'ALS) → même refus. En dev, `admin/admin` a le rôle.
163
+ */
164
+ @route("<%= it.kebab %>-delete", {
165
+ path: "/{id}",
166
+ requirements: { methods: ["DELETE", "WEBSOCKET"] },
167
+ })
168
+ @IsGranted("ROLE_ADMIN")
169
+ destroy(@Param("id") id: string, @CurrentUser() user: IUser) {
170
+ if (!<%= it.nameClass %>.items.delete(id)) {
171
+ throw new HttpError(`item ${id} introuvable`, 404);
172
+ }
173
+ return { deleted: id, by: user.identifier };
174
+ }
175
+ <% } else { %> /** Suppression — `DELETE` HTTP ou `socket.mutate(path, { method: "DELETE", … })`. */
176
+ @route("<%= it.kebab %>-delete", {
177
+ path: "/{id}",
178
+ requirements: { methods: ["DELETE", "WEBSOCKET"] },
179
+ })
180
+ destroy(@Param("id") id: string) {
181
+ if (!<%= it.nameClass %>.items.delete(id)) {
182
+ throw new HttpError(`item ${id} introuvable`, 404);
183
+ }
184
+ return { deleted: id };
185
+ }
186
+ <% } %>}
187
+
188
+ export default <%= it.nameClass %>;
@@ -0,0 +1,348 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import {
3
+ route,
4
+ controller,
5
+ Controller,
6
+ Get,
7
+ Post,
8
+ Put,
9
+ Patch,
10
+ Delete,
11
+ HttpCode,
12
+ Header,
13
+ Redirect,
14
+ Param,
15
+ Body,
16
+ Query,
17
+ Headers,
18
+ Cookie,
19
+ UseSession,
20
+ Session,
21
+ Idempotent,
22
+ UploadedFile,
23
+ UploadedFiles,
24
+ // Identité ALS posée par le firewall — marche AUSSI sans @nodefony/security
25
+ // (injecte alors `undefined`) : le décorateur vient du framework, pas de security.
26
+ CurrentUser,
27
+ <% if (it.hasSecurity) { %> IsGranted,
28
+ RequireScope,
29
+ CsrfProtect,
30
+ <% } %>} from "@nodefony/framework";
31
+ import { HttpError } from "@nodefony/http";
32
+ import type { ContextType, ICookie, IUploadedFile } from "@nodefony/http";
33
+ <% if (it.hasSecurity) { %>import type { IUser } from "@nodefony/user";
34
+ <% } %>
35
+ /** Forme d'un item — remplace par ton entité (`nodefony create entity`). */
36
+ interface IItem {
37
+ id: string;
38
+ name: string;
39
+ createdAt: number;
40
+ createdBy: string;
41
+ }
42
+
43
+ /**
44
+ * <%= it.nameClass %> — **vitrine des décorateurs Nodefony** (saveur `example`) :
45
+ * chaque action montre une capacité du pipeline, commentée et testable au curl.
46
+ * Pour un squelette de PRODUCTION, préfère `--kind rest` (CRUD pur) ou
47
+ * `--kind duplex` (la même ressource en HTTP ET par la socket Nodefony).
48
+ *
49
+ * - CRUD complet : `@Get`/`@Post`/`@Put`/`@Patch`/`@Delete` + `@Param`/`@Body`/`@Query`
50
+ * - Réponse : `@HttpCode`, `@Header`, `@Redirect`
51
+ * - Anti double-effet : `@Idempotent` (header `Idempotency-Key`)
52
+ * - Session : `@UseSession` + `@Session` (compteur de visites)
53
+ * - Requête brute : `@Headers`, `@Cookie`, upload `@UploadedFile(s)`
54
+ * - Identité : `@CurrentUser` (utilisateur ALS posé par le firewall)
55
+ <% if (it.hasSecurity) { %> * - Sécurité : `@IsGranted` (rôles), `@RequireScope` (API keys M2M),
56
+ * `@CsrfProtect` (mutations pilotées session)
57
+ <% } else { %> * - (ajoute `@nodefony/security` pour débloquer `@IsGranted`, `@RequireScope`,
58
+ * `@CsrfProtect` — régénère alors cette saveur pour voir les exemples)
59
+ <% } %> * - WebSocket : echo dans la MÊME classe (un seul pipeline)
60
+ *
61
+ * - Flux BRUT : `@Body({ stream: true })` (gros uploads sans parse en RAM)
62
+ *
63
+ * Existent aussi (non générés ici) : `@All`/`@Options`/`@Head`, `@Req`/`@Res`
64
+ * (objets requête/réponse bruts), `@Anonymous`, `@BypassFirewall` (⚠ réfléchis
65
+ * avant), `@Domain` (routage par vhost), `@Csp`, `@CsrfExempt`, `@Scope`
66
+ * (scope DI du controller).
67
+ *
68
+ * Essais rapides (zone `^/api` du manifeste : identité résolue, jamais bloquante) :
69
+ * ```bash
70
+ * curl -k "https://127.0.0.1:5152<%= it.route %>?page=1&limit=10"
71
+ * curl -k -X POST -H "content-type: application/json" \
72
+ * -H "idempotency-key: demo-1" -d '{"name":"premier"}' https://127.0.0.1:5152<%= it.route %>
73
+ * # rejoue la MÊME clé → réponse mémorisée (aucun doublon créé)
74
+ * curl -k -c /tmp/jar -b /tmp/jar https://127.0.0.1:5152<%= it.route %>/session # ×2 → visits: 2
75
+ * ```
76
+ */
77
+ @controller("<%= it.route %>")
78
+ <% if (it.roleGuard) { %>// Habilitation exigée pour TOUT ce controller.
79
+ //
80
+ // Posée sur la CLASSE : chaque action en hérite, y compris celles qu'on
81
+ // ajoutera demain — c'est ce qui distingue une règle d'un rappel. Le refus est
82
+ // rendu par le framework AVANT que le controller ne soit instancié (403), donc
83
+ // aucune ligne de contrôle d'accès n'a sa place dans une action.
84
+ //
85
+ // L'administrateur y a accès sans porter ce rôle : `nodefony.config.ts` le
86
+ // déclare sous `ROLE_ADMIN` dans `roleHierarchy` — administrer, c'est déjà
87
+ // pouvoir tout consulter. Une hiérarchie vaut pour TOUTES les routes gardées par
88
+ // ce rôle, présentes et futures ; lister les rôles un par un sur chaque action ne
89
+ // généralise pas.
90
+ @IsGranted("<%= it.role %>")
91
+ <% } %>class <%= it.nameClass %> extends Controller {
92
+ /** Stub EN MÉMOIRE volontairement naïf (par process, perdu au restart) —
93
+ * branche un repository dès que tu crées ton entité. */
94
+ static readonly items = new Map<string, IItem>();
95
+
96
+ constructor(context: ContextType) {
97
+ super("<%= it.kebab %>", context);
98
+ }
99
+
100
+ // ── Lecture ────────────────────────────────────────────────────────────────
101
+
102
+ /**
103
+ * `@Query` = querystring typée à la carte ; `@Header` fixe un header de
104
+ * RÉPONSE déclarativement (ici : cache court côté client).
105
+ */
106
+ @Get("")
107
+ @Header("cache-control", "private, max-age=5")
108
+ list(@Query("page") page: string, @Query("limit") limit: string) {
109
+ const p = Math.max(1, Number(page) || 1);
110
+ const l = Math.min(100, Math.max(1, Number(limit) || 20));
111
+ const all = [...<%= it.nameClass %>.items.values()];
112
+ return this.renderJson({
113
+ page: p,
114
+ limit: l,
115
+ total: all.length,
116
+ items: all.slice((p - 1) * l, p * l),
117
+ });
118
+ }
119
+
120
+ // ── Mutations ──────────────────────────────────────────────────────────────
121
+
122
+ /**
123
+ * `@Idempotent()` (strict) : la mutation EXIGE un header `Idempotency-Key` —
124
+ * sans clé → 400 ; rejeu de la MÊME clé → la réponse mémorisée est renvoyée
125
+ * SANS ré-exécuter (anti double-clic / retry réseau / réplique cross-pod avec
126
+ * le store redis `NF_IDEMPOTENCY_STORE=redis`) ; même clé + payload différent
127
+ * → 422. `@HttpCode(201)` force le status de création.
128
+ *
129
+ * ⚠ Une action `@Idempotent` doit RETOURNER son payload BRUT (`return item`) :
130
+ * c'est LUI qui est mémorisé puis rejoué. `renderJson()` enverrait la Response
131
+ * (structure circulaire) au cache → la mémorisation échouerait.
132
+ */
133
+ @Post("")
134
+ @HttpCode(201)
135
+ @Idempotent()
136
+ create(
137
+ @Body() payload: { name?: string },
138
+ @CurrentUser() user?: { identifier?: string },
139
+ ) {
140
+ const item: IItem = {
141
+ id: randomUUID(),
142
+ name: payload?.name ?? "sans nom",
143
+ createdAt: Date.now(),
144
+ createdBy: user?.identifier ?? "anon.",
145
+ };
146
+ <%= it.nameClass %>.items.set(item.id, item);
147
+ return item;
148
+ }
149
+
150
+ /** `@Body("name")` = UN champ du body (le reste est ignoré). */
151
+ @Put("/{id}")
152
+ update(@Param("id") id: string, @Body("name") name: string) {
153
+ const item = <%= it.nameClass %>.items.get(id);
154
+ if (!item) {
155
+ throw new HttpError(`<%= it.kebab %> ${id} introuvable`, 404, this.context);
156
+ }
157
+ if (name !== undefined) {
158
+ item.name = name;
159
+ }
160
+ return this.renderJson(item);
161
+ }
162
+
163
+ /**
164
+ * `@Patch` = mise à jour PARTIELLE (vs `@Put` remplacement) : seuls les
165
+ * champs présents dans le body sont appliqués.
166
+ */
167
+ @Patch("/{id}")
168
+ patchItem(@Param("id") id: string, @Body() changes: Partial<Pick<IItem, "name">>) {
169
+ const item = <%= it.nameClass %>.items.get(id);
170
+ if (!item) {
171
+ throw new HttpError(`<%= it.kebab %> ${id} introuvable`, 404, this.context);
172
+ }
173
+ Object.assign(item, { name: changes?.name ?? item.name });
174
+ return this.renderJson(item);
175
+ }
176
+
177
+ <% if (it.hasSecurity) { %> /**
178
+ * AUTORISATION déclarative — la zone firewall AUTHENTIFIE, `@IsGranted`
179
+ * DÉCIDE ensuite : anonyme ou simple user → **403** (pas 401), porteur du
180
+ * rôle → l'action s'exécute. `@CurrentUser()` injecte l'utilisateur de l'ALS
181
+ * (jamais le credential). Teste : DELETE anonyme → 403 ; loggé `admin` → 200.
182
+ */
183
+ @Delete("/{id}")
184
+ @IsGranted("ROLE_ADMIN")
185
+ destroy(@Param("id") id: string, @CurrentUser() user: IUser) {
186
+ if (!<%= it.nameClass %>.items.delete(id)) {
187
+ throw new HttpError(`<%= it.kebab %> ${id} introuvable`, 404, this.context);
188
+ }
189
+ return this.renderJson({ deleted: id, by: user.identifier });
190
+ }
191
+
192
+ /**
193
+ * `@RequireScope` = autorisation MACHINE-À-MACHINE par scope d'API key
194
+ * (`Authorization: ApiKey <clé>` — la clé porte ses scopes, cf commande
195
+ * `nodefony security:apikey:*` et la page API Keys de /nodefony).
196
+ *
197
+ * ⚠ Un scope ne bride QUE les jetons machine (clé API / JWT délégué / OAuth) :
198
+ * une clé sans le scope → 403, mais un HUMAIN (session) ou l'anonyme PASSE —
199
+ * son autorisation à lui se décide par rôles (`@IsGranted`). Pour une route
200
+ * exigeante sur les DEUX axes, combine les deux décorateurs.
201
+ */
202
+ @Get("/export/all")
203
+ @RequireScope("<%= it.kebab %>:export")
204
+ exportAll() {
205
+ return this.renderJson({
206
+ exportedAt: Date.now(),
207
+ items: [...<%= it.nameClass %>.items.values()],
208
+ });
209
+ }
210
+
211
+ /**
212
+ * `@CsrfProtect` = anti-CSRF sur mutation pilotée par SESSION (cookie) :
213
+ * le double-submit est exigé — cookie `csrf-token` (posé par le serveur,
214
+ * non HttpOnly) REJOUÉ dans l'en-tête `x-csrf-token` — un POST forgé
215
+ * cross-site sans token → 403. Inutile pour du M2M sans cookie
216
+ * (`@CsrfExempt` existe pour l'inverse).
217
+ */
218
+ @Post("/reset")
219
+ @UseSession()
220
+ @CsrfProtect()
221
+ reset(@Session() session: unknown) {
222
+ const count = <%= it.nameClass %>.items.size;
223
+ <%= it.nameClass %>.items.clear();
224
+ void session; // la session prouve le contexte BFF (cookie) de la mutation
225
+ return this.renderJson({ cleared: count });
226
+ }
227
+
228
+ <% } else { %> /** DELETE sans garde — ajoute @nodefony/security pour la version gardée par rôle. */
229
+ @Delete("/{id}")
230
+ destroy(@Param("id") id: string) {
231
+ if (!<%= it.nameClass %>.items.delete(id)) {
232
+ throw new HttpError(`<%= it.kebab %> ${id} introuvable`, 404, this.context);
233
+ }
234
+ return this.renderJson({ deleted: id });
235
+ }
236
+
237
+ <% } %> // ── Session / requête brute ───────────────────────────────────────────────
238
+
239
+ /**
240
+ * `@UseSession()` ACTIVE la session sur CETTE action (granularité méthode —
241
+ * possible aussi au niveau classe) ; `@Session()` injecte l'objet session.
242
+ * Recharge la page : `visits` s'incrémente, porté par le cookie de session.
243
+ */
244
+ @Get("/session")
245
+ @UseSession()
246
+ sessionVisits(
247
+ @Session() session: { get: (k: string) => unknown; set: (k: string, v: unknown) => void },
248
+ ) {
249
+ const visits = (Number(session.get("visits")) || 0) + 1;
250
+ session.set("visits", visits);
251
+ return this.renderJson({ visits, sessionActive: true });
252
+ }
253
+
254
+ /**
255
+ * `@Headers("x")` = UN header de requête ; `@Cookie()` = map des cookies
256
+ * (`@Cookie("nom")` = un seul, objet `{ value }`). Diagnostic sans toucher
257
+ * aux objets bruts (`@Req()`/`@Res()` existent pour ça).
258
+ */
259
+ @Get("/whoami")
260
+ whoami(
261
+ @Headers("user-agent") ua: string,
262
+ @Cookie() cookies: Record<string, ICookie> | undefined,
263
+ // Identité posée dans l'ALS par le firewall (anonyme = identifier "anon.").
264
+ @CurrentUser() user?: { identifier?: string; roles?: string[] },
265
+ ) {
266
+ return this.renderJson({
267
+ identifier: user?.identifier ?? null,
268
+ roles: user?.roles ?? [],
269
+ userAgent: ua ?? null,
270
+ cookies: cookies ? Object.keys(cookies) : [],
271
+ });
272
+ }
273
+
274
+ /** `@UploadedFile()` = 1ᵉʳ fichier multipart ; `@UploadedFiles()` = tous. */
275
+ @Post("/upload")
276
+ upload(
277
+ @UploadedFile() file: IUploadedFile | undefined,
278
+ @UploadedFiles() files: IUploadedFile[] | undefined,
279
+ ) {
280
+ return this.renderJson({
281
+ received: file?.filename ?? null,
282
+ count: files?.length ?? 0,
283
+ });
284
+ }
285
+
286
+ /**
287
+ * `@Body({ stream: true })` = le pipeline SAUTE le parse (JSON/busboy) et
288
+ * injecte le FLUX brut (`Readable`) : gros fichiers, proxys, ingestion —
289
+ * zéro copie en RAM. Ici on compte les octets :
290
+ * `curl -k -X POST --data-binary @gros.bin https://…<%= it.route %>/ingest`
291
+ */
292
+ @Post("/ingest")
293
+ async ingest(@Body({ stream: true }) body: NodeJS.ReadableStream) {
294
+ let bytes = 0;
295
+ await new Promise<void>((resolve, reject) => {
296
+ body.on("data", (chunk: Buffer) => {
297
+ bytes += chunk.length;
298
+ });
299
+ body.once("end", () => resolve());
300
+ body.once("error", reject);
301
+ });
302
+ return this.renderJson({ ingested: bytes });
303
+ }
304
+
305
+ /** `@Redirect(url, code)` — le retour `{ url }` peut surcharger la cible. */
306
+ @Get("/latest")
307
+ @Redirect("/unused", 302)
308
+ latest() {
309
+ const last = [...<%= it.nameClass %>.items.keys()].at(-1);
310
+ return { url: last ? `<%= it.route %>/${last}` : "<%= it.route %>" };
311
+ }
312
+
313
+ /**
314
+ * `@Param("id")` = segment d'URL `{id}` injecté. Déclarée EN DERNIER des GET :
315
+ * une route paramétrique déclarée avant capturerait `/session`, `/latest`…
316
+ */
317
+ @Get("/{id}")
318
+ read(@Param("id") id: string) {
319
+ const item = <%= it.nameClass %>.items.get(id);
320
+ if (!item) {
321
+ throw new HttpError(`<%= it.kebab %> ${id} introuvable`, 404, this.context);
322
+ }
323
+ return this.renderJson(item);
324
+ }
325
+
326
+ // ── WebSocket — MÊME classe, même pipeline ────────────────────────────────
327
+
328
+ /**
329
+ * Echo WS : `wscat -c wss://127.0.0.1:5152<%= it.route %>/echo`.
330
+ *
331
+ * ⚠ WS BRUT = démo du pipeline partagé, pas un modèle. Pour du WS métier
332
+ * (canaux pub/sub, actions RPC, policies), la bonne couche est la socket
333
+ * Nodefony : `nodefony create controller <nom> --kind realtime` — ou
334
+ * `--kind duplex` pour les MÊMES actions REST par la socket.
335
+ */
336
+ @route("<%= it.kebab %>-echo", {
337
+ path: "/echo",
338
+ requirements: { methods: ["WEBSOCKET"] },
339
+ })
340
+ async echo(message: string | Buffer | null) {
341
+ if (!message) {
342
+ return this.renderJson({ handshake: true });
343
+ }
344
+ return this.renderJson({ echo: message.toString() });
345
+ }
346
+ }
347
+
348
+ export default <%= it.nameClass %>;
@@ -0,0 +1,143 @@
1
+ import {
2
+ route,
3
+ controller,
4
+ Controller,
5
+ CurrentUser,
6
+ Param,
7
+ <% if (it.roleGuard) { %> IsGranted,
8
+ <% } %>} from "@nodefony/framework";
9
+ import type { ContextType } from "@nodefony/http";
10
+
11
+ /**
12
+ * <%= it.nameClass %> — UN controller, DEUX protocoles (le différenciateur
13
+ * Nodefony) : HTTP et WebSocket sont co-citoyens du même contexte controller,
14
+ * même pipeline (firewall, audit, logs).
15
+ *
16
+ * Routes montées sous `<%= it.route %>` (couvertes par la zone firewall `^/api`
17
+ * si tu as gardé le manifeste par défaut : identité résolue, jamais bloquante).
18
+ *
19
+ * C'est le MÊME gabarit qui sert le controller d'accueil d'une app neuve et
20
+ * `nodefony create controller --kind hello` : le premier exemple que tu lis est
21
+ * donc exactement celui que la commande te régénérera.
22
+ */
23
+ @controller("<%= it.route %>")
24
+ <% if (it.roleGuard) { %>// Habilitation exigée pour TOUT ce controller.
25
+ //
26
+ // Posée sur la CLASSE : chaque action en hérite, y compris celles qu'on
27
+ // ajoutera demain — c'est ce qui distingue une règle d'un rappel. Le refus est
28
+ // rendu par le framework AVANT que le controller ne soit instancié (403), donc
29
+ // aucune ligne de contrôle d'accès n'a sa place dans une action.
30
+ //
31
+ // L'administrateur y a accès sans porter ce rôle : `nodefony.config.ts` le
32
+ // déclare sous `ROLE_ADMIN` dans `roleHierarchy` — administrer, c'est déjà
33
+ // pouvoir tout consulter. Une hiérarchie vaut pour TOUTES les routes gardées par
34
+ // ce rôle, présentes et futures ; lister les rôles un par un sur chaque action ne
35
+ // généralise pas.
36
+ @IsGranted("<%= it.role %>")
37
+ <% } %>class <%= it.nameClass %> extends Controller {
38
+ constructor(context: ContextType) {
39
+ super("<%= it.kebab %>", context);
40
+ }
41
+
42
+ // ── `initialize()` — le constructeur ASYNCHRONE du controller ──────────────
43
+ // Un `constructor` ne peut pas être `async` : tout ce qui demande un `await`
44
+ // avant l'action se fait ici. Le hook est optionnel — ne l'écris que si tu en
45
+ // as besoin.
46
+ //
47
+ // async initialize(): Promise<this> {
48
+ // this.setContextJson(); // format de sortie
49
+ // const user = RequestContext.getUser(); // identité déjà résolue
50
+ // this.prefs = await this.get("prefs").load(user.identifier);
51
+ // return this;
52
+ // }
53
+ //
54
+ // Quand il tourne :
55
+ // • en HTTP — APRÈS le firewall et la garde `@IsGranted` : l'identité est
56
+ // résolue, et rien ne s'exécute pour un appelant qui sera rejeté ;
57
+ // • en WebSocket — AVANT l'accept du handshake, donc avant le firewall :
58
+ // l'identité n'y est PAS encore résolue. C'est en revanche la dernière
59
+ // fenêtre pour poser un cookie ou un en-tête sur la réponse de handshake.
60
+ // Pour de la mise en place par connexion AUTHENTIFIÉE, fais-la au
61
+ // handshake (`echo(null)` ci-dessous), qui lui est post-firewall.
62
+ //
63
+ // À ne pas y mettre : une décision d'autorisation (c'est `@IsGranted`, qui
64
+ // s'évalue avant), ni un travail qu'une seule action sur cinq utilise — il
65
+ // serait payé par toutes.
66
+
67
+ @route("<%= it.kebab %>-index", { path: "<%= it.indexPath %>", method: "GET" })
68
+ // `@CurrentUser()` injecte l'utilisateur posé dans l'ALS par le firewall.
69
+ // `identifier` = identifiant fonctionnel ; l'anonyme est un VRAI user
70
+ // (AnonymousUser, identifier "anon."), jamais null en zone firewall.
71
+ async index(@CurrentUser() user?: { identifier?: string }) {
72
+ const authenticated = !!user?.identifier && user.identifier !== "anon.";
73
+ return this.renderJson({
74
+ hello: "<%= it.helloName %>",
75
+ pid: process.pid,
76
+ who: authenticated ? user!.identifier! : "anonyme",
77
+ });
78
+ }
79
+
80
+ /**
81
+ * Une valeur PORTÉE PAR LE CHEMIN — et c'est la seule syntaxe de Nodefony qui
82
+ * diffère de ce que tu connais ailleurs.
83
+ *
84
+ * Le segment variable s'écrit **`{name}`**, entre accolades. `:name` — la
85
+ * forme d'Express, de Nest et de Fastify — compile, se monte, s'affiche dans
86
+ * `nodefony inspect routes`… et ne correspond à AUCUNE URL réelle : il est
87
+ * pris pour un segment littéral. Le symptôme est un 404 sur une route qu'on
88
+ * VOIT dans le code. (`nodefony doctor` nomme ce cas et rend le chemin
89
+ * corrigé.)
90
+ *
91
+ * La valeur se lit avec `@Param("name")`. Elle arrive aussi en argument
92
+ * positionnel, dans l'ordre des variables du chemin, mais le décorateur
93
+ * nomme ce qu'il injecte : il survit à un segment ajouté devant.
94
+ *
95
+ * Contraindre le format se fait dans le chemin : `{id}(\d+)` n'accepte que
96
+ * des chiffres, et `/{slug}?` rend le segment optionnel.
97
+ */
98
+ @route("<%= it.kebab %>-greet", { path: "/hello/{name}", method: "GET" })
99
+ async greet(@Param("name") name: string) {
100
+ return this.renderJson({ hello: name, pid: process.pid });
101
+ }
102
+
103
+ <% if (it.secureRoute) { %> /**
104
+ * Route PROTÉGÉE par la zone `secure` (`^/api/secure`, session SEULE — cf
105
+ * nodefony.config.ts) : sans session, le firewall répond 401 AVANT d'entrer
106
+ * ici. Le controller peut donc supposer un utilisateur authentifié.
107
+ *
108
+ * Elle n'est générée que pour l'app, parce qu'une route protégée n'a de sens
109
+ * que si une ZONE la couvre — et c'est le manifeste de l'app qui la déclare.
110
+ * Sous un autre préfixe (`/api/blog/secure/…`), la même méthode serait
111
+ * ouverte à tous : un exemple qui enseigne le contraire de ce qu'il montre.
112
+ */
113
+ @route("<%= it.kebab %>-secure", { path: "/secure/hello", method: "GET" })
114
+ async secureHello(@CurrentUser() user?: { identifier?: string }) {
115
+ return this.renderJson({
116
+ message: `Bonjour ${user?.identifier ?? "?"}`,
117
+ zone: "secure",
118
+ pid: process.pid,
119
+ });
120
+ }
121
+
122
+ <% } %> /**
123
+ * WebSocket natif : `wscat -c wss://127.0.0.1:5152<%= it.route %>/echo`
124
+ * puis tape un message — la réponse repasse par le MÊME pipeline.
125
+ *
126
+ * ⚠ Cet echo BRUT est une DÉMO du pipeline HTTP/WS partagé, pas un modèle :
127
+ * pour du WS métier (canaux pub/sub, actions RPC, reconnexion, policies),
128
+ * génère la bonne couche — `nodefony create controller <nom> --kind realtime`
129
+ * (socket Nodefony JSON-RPC, côté client `RealtimeClient`/hooks React).
130
+ */
131
+ @route("<%= it.kebab %>-echo", {
132
+ path: "/echo",
133
+ requirements: { methods: ["WEBSOCKET"] },
134
+ })
135
+ async echo(message: string | Buffer | null) {
136
+ if (!message) {
137
+ return this.renderJson({ handshake: true });
138
+ }
139
+ return this.renderJson({ echo: message.toString() });
140
+ }
141
+ }
142
+
143
+ export default <%= it.nameClass %>;