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,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 %>;
|