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,160 @@
|
|
|
1
|
+
import nodefonyError from "../Error.js";
|
|
2
|
+
//#region src/runtime/pageQuery.ts
|
|
3
|
+
/**
|
|
4
|
+
* Erreur d'une requête de page mal formée ou non honorable par le point
|
|
5
|
+
* d'entrée : `order` sur un endpoint qui ne trie pas, champ hors allowlist,
|
|
6
|
+
* sens de tri inconnu.
|
|
7
|
+
*
|
|
8
|
+
* `code = 400` : la faute est au client. Le data plane admin
|
|
9
|
+
* (`AdminApiController`) traduit ce `code` en statut HTTP, comme il le fait
|
|
10
|
+
* déjà pour {@link PaginationModeError}.
|
|
11
|
+
*/
|
|
12
|
+
var PageQueryError = class extends nodefonyError {
|
|
13
|
+
constructor(message) {
|
|
14
|
+
super(message, 400);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const DEFAULT_LIMIT = 50;
|
|
18
|
+
const MAX_LIMIT = 200;
|
|
19
|
+
/**
|
|
20
|
+
* Les clés que le contrat de page revendique sur le fil — **source unique**.
|
|
21
|
+
*
|
|
22
|
+
* Elle existe pour un consommateur : `parseFilters`, qui doit distinguer un
|
|
23
|
+
* paramètre de pagination d'un filtre inconnu, et refuse le second. Recopier
|
|
24
|
+
* cette liste là-bas aurait suffi à ce qu'un `?tenantId=` légitime devienne un
|
|
25
|
+
* `400` le jour où le contrat gagne une clé ici et pas là.
|
|
26
|
+
*
|
|
27
|
+
* `tenantId` y figure bien qu'il ne soit pas encore lu (réserve multi-tenant du
|
|
28
|
+
* contrat, `IPageQuery.tenantId`) : le front l'émet déjà sur les sessions.
|
|
29
|
+
*/
|
|
30
|
+
const PAGE_QUERY_KEYS = /* @__PURE__ */ new Set([
|
|
31
|
+
"limit",
|
|
32
|
+
"offset",
|
|
33
|
+
"cursor",
|
|
34
|
+
"order",
|
|
35
|
+
"withTotal",
|
|
36
|
+
"q",
|
|
37
|
+
"tenantId"
|
|
38
|
+
]);
|
|
39
|
+
/**
|
|
40
|
+
* **La** lecture d'une valeur unique dans une source de page — partagée par
|
|
41
|
+
* {@link parsePageQuery} et `parseFilters`.
|
|
42
|
+
*
|
|
43
|
+
* Une {@link PageQuerySource} peut porter plusieurs valeurs par clé (query
|
|
44
|
+
* string répétée, tableau JSON d'un corps `QUERY`) : c'est le polymorphisme du
|
|
45
|
+
* transport. Aucun des deux lecteurs ne sait quoi faire d'une seconde valeur —
|
|
46
|
+
* ni le contrat de page, ni une spec de filtre n'expriment l'appartenance à un
|
|
47
|
+
* ensemble. Prendre la première et **jeter les autres en silence** rendait une
|
|
48
|
+
* page filtrée sur `a` à qui avait demandé `a` **et** `b`, sans rien dire : la
|
|
49
|
+
* faute exacte que ce contrat bannit partout ailleurs.
|
|
50
|
+
*
|
|
51
|
+
* D'où le refus. Le jour où un point d'entrée doit accepter plusieurs valeurs,
|
|
52
|
+
* ce sera une nature de filtre déclarée (`["in", …]`), pas une tolérance
|
|
53
|
+
* implicite du lecteur.
|
|
54
|
+
*
|
|
55
|
+
* @throws {@link PageQueryError} (`400`) si la clé porte plus d'une valeur.
|
|
56
|
+
*/
|
|
57
|
+
const singleValue = (source, key) => {
|
|
58
|
+
const value = source[key];
|
|
59
|
+
if (value === void 0) return void 0;
|
|
60
|
+
if (!Array.isArray(value)) return value;
|
|
61
|
+
if (value.length > 1) throw new PageQueryError(`Parameter "${key}" was given ${value.length} values; this endpoint reads a single value per parameter.`);
|
|
62
|
+
return value[0];
|
|
63
|
+
};
|
|
64
|
+
/** Alias interne — la lecture unique, sous le nom court du fichier. */
|
|
65
|
+
const one = singleValue;
|
|
66
|
+
/** Entier décimal strict — `undefined` si absent, vide ou non numérique. */
|
|
67
|
+
const int = (source, key) => {
|
|
68
|
+
const raw = one(source, key);
|
|
69
|
+
if (raw === void 0 || raw === "") return void 0;
|
|
70
|
+
const n = Number.parseInt(raw, 10);
|
|
71
|
+
return Number.isFinite(n) ? n : void 0;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Lit le tri `champ:sens[,champ:sens]*` et le valide contre l'allowlist.
|
|
75
|
+
*
|
|
76
|
+
* @throws {@link PageQueryError} si l'endpoint ne trie pas, si un champ n'est
|
|
77
|
+
* pas dans `sortable`, ou si un sens n'est ni `ASC` ni `DESC`.
|
|
78
|
+
*/
|
|
79
|
+
const parseOrder = (raw, sortable) => {
|
|
80
|
+
if (!sortable || sortable.length === 0) throw new PageQueryError(`This endpoint does not support sorting; drop the "order" parameter.`);
|
|
81
|
+
const order = [];
|
|
82
|
+
for (const part of raw.split(",")) {
|
|
83
|
+
const spec = part.trim();
|
|
84
|
+
if (spec === "") continue;
|
|
85
|
+
const sep = spec.lastIndexOf(":");
|
|
86
|
+
const field = sep === -1 ? spec : spec.slice(0, sep);
|
|
87
|
+
const rawDir = sep === -1 ? "ASC" : spec.slice(sep + 1);
|
|
88
|
+
if (!sortable.includes(field)) throw new PageQueryError(`Unsortable field "${field}". Sortable fields: ${sortable.join(", ")}.`);
|
|
89
|
+
const dir = rawDir.toUpperCase();
|
|
90
|
+
if (dir !== "ASC" && dir !== "DESC") throw new PageQueryError(`Invalid sort direction "${rawDir}" for field "${field}" (expected ASC or DESC).`);
|
|
91
|
+
order.push([field, dir]);
|
|
92
|
+
}
|
|
93
|
+
return order.length ? order : void 0;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* **Le** traducteur d'une requête de page : transforme une source clé→valeur en
|
|
97
|
+
* {@link IPageQuery} borné et validé. Fonction **pure** — aucun accès au kernel,
|
|
98
|
+
* à l'ALS ni à la requête HTTP.
|
|
99
|
+
*
|
|
100
|
+
* Il remplace les parseurs `limit`/`offset` que chaque data plane réécrivait
|
|
101
|
+
* pour lui-même. Ces copies avaient déjà divergé (`Number.isNaN` d'un côté,
|
|
102
|
+
* `Number.isFinite` de l'autre : `?limit=abc` bornait à `50` ici et plantait à
|
|
103
|
+
* `NaN` là), et aucune ne validait le tri.
|
|
104
|
+
*
|
|
105
|
+
* Ce qui est lu, et rien d'autre — un paramètre inconnu est laissé à l'appelant,
|
|
106
|
+
* qui compose ses propres filtres par-dessus (`interface XQuery extends
|
|
107
|
+
* IPageQuery`) :
|
|
108
|
+
*
|
|
109
|
+
* | Paramètre | Forme sur le fil | Résultat |
|
|
110
|
+
* | ------------ | --------------------------- | ------------------------------------------- |
|
|
111
|
+
* | `limit` | `?limit=20` | borné à `[1, maxLimit]`, défaut `defaultLimit` |
|
|
112
|
+
* | `offset` | `?offset=40` | `≥ 0` (négatif ou invalide → absent) |
|
|
113
|
+
* | `cursor` | `?cursor=abc` | posé si non vide |
|
|
114
|
+
* | `order` | `?order=name:ASC,age:DESC` | validé contre `sortable` |
|
|
115
|
+
* | `withTotal` | `?withTotal=false` | posé **seulement** si `false` (défaut `true`) |
|
|
116
|
+
* | `q` | `?q=jean` | trimé, posé si non vide — **refusé** sans `searchable` |
|
|
117
|
+
*
|
|
118
|
+
* `offset` et `cursor` peuvent tous deux être présents ici : ce n'est pas à ce
|
|
119
|
+
* traducteur d'arbitrer, mais au store, qui seul connaît son mode — il l'énonce
|
|
120
|
+
* en appelant `assertPageQuery(query, mode)` en première ligne de son `listPage`.
|
|
121
|
+
*
|
|
122
|
+
* @param source - la query string parsée, ou le corps d'une requête `QUERY`.
|
|
123
|
+
* @param options - bornes et champs triables de ce point d'entrée.
|
|
124
|
+
* @returns une requête de page conforme au contrat, prête pour un store.
|
|
125
|
+
* @throws {@link PageQueryError} (`code` 400) si le tri demandé n'est pas
|
|
126
|
+
* honorable par ce point d'entrée.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```ts
|
|
130
|
+
* const query = parsePageQuery(request.query, {
|
|
131
|
+
* maxLimit: 200,
|
|
132
|
+
* sortable: ["username", "createdAt"],
|
|
133
|
+
* });
|
|
134
|
+
* return repository.listPage({ ...query, enabled: true });
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
function parsePageQuery(source, options = {}) {
|
|
138
|
+
const maxLimit = options.maxLimit ?? MAX_LIMIT;
|
|
139
|
+
const defaultLimit = Math.min(options.defaultLimit ?? DEFAULT_LIMIT, maxLimit);
|
|
140
|
+
const rawLimit = int(source, "limit");
|
|
141
|
+
const query = { limit: rawLimit === void 0 ? defaultLimit : Math.min(Math.max(rawLimit, 1), maxLimit) };
|
|
142
|
+
const offset = int(source, "offset");
|
|
143
|
+
if (offset !== void 0 && offset >= 0) query.offset = offset;
|
|
144
|
+
const cursor = one(source, "cursor");
|
|
145
|
+
if (cursor) query.cursor = cursor;
|
|
146
|
+
const rawOrder = one(source, "order");
|
|
147
|
+
if (rawOrder) {
|
|
148
|
+
const order = parseOrder(rawOrder, options.sortable);
|
|
149
|
+
if (order) query.order = order;
|
|
150
|
+
}
|
|
151
|
+
if (one(source, "withTotal") === "false") query.withTotal = false;
|
|
152
|
+
const q = one(source, "q")?.trim();
|
|
153
|
+
if (q) {
|
|
154
|
+
if (!options.searchable) throw new PageQueryError("This endpoint does not support full-text search (\"q\"). Use the declared filters instead.");
|
|
155
|
+
query.q = q;
|
|
156
|
+
}
|
|
157
|
+
return query;
|
|
158
|
+
}
|
|
159
|
+
//#endregion
|
|
160
|
+
export { PAGE_QUERY_KEYS, PageQueryError, parsePageQuery, singleValue };
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
//#region src/runtime/pageSort.ts
|
|
2
|
+
/** Une valeur absente ne se compare pas — elle se range à part. */
|
|
3
|
+
const missing = (v) => v === null || v === void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Compare deux valeurs de tri **présentes**, tous types confondus. Le cas des
|
|
6
|
+
* absentes est traité par {@link compareByOrder}, en dehors de l'inversion de
|
|
7
|
+
* sens : les y laisser reviendrait à les faire remonter en tête d'un tri `DESC`,
|
|
8
|
+
* ce qui n'a jamais renseigné personne.
|
|
9
|
+
*/
|
|
10
|
+
function compareValues(a, b) {
|
|
11
|
+
if (a instanceof Date || b instanceof Date) return Number(a) - Number(b);
|
|
12
|
+
if (typeof a === "number" && typeof b === "number") return a - b;
|
|
13
|
+
if (typeof a === "boolean" && typeof b === "boolean") return Number(a) - Number(b);
|
|
14
|
+
return String(a).localeCompare(String(b));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Réécrit les noms de champs d'un `order` selon une table d'alias — le pont
|
|
18
|
+
* entre le vocabulaire **public** (celui de l'URL) et le schéma d'un backend.
|
|
19
|
+
*
|
|
20
|
+
* Il existe parce que chaque store le refaisait : trois fonctions strictement
|
|
21
|
+
* identiques traduisaient `id` vers `_id` ou `session_id`, une par ressource.
|
|
22
|
+
* La règle (« réécrire les noms ») est la même partout ; seule la TABLE change,
|
|
23
|
+
* et c'est elle qui est une donnée du backend, pas du code.
|
|
24
|
+
*
|
|
25
|
+
* Un champ absent de la table passe inchangé — l'immense majorité des noms
|
|
26
|
+
* publics sont déjà ceux du schéma.
|
|
27
|
+
*
|
|
28
|
+
* @param order - l'ordre demandé, en vocabulaire public.
|
|
29
|
+
* @param aliases - `{ nomPublic: nomDansLeSchéma }`.
|
|
30
|
+
* @returns le même ordre, exprimé dans le schéma du backend.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* // Mongo stocke la clé primaire en `_id`, il n'existe aucun champ `id`.
|
|
35
|
+
* renameOrderFields(order, { id: "_id" });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
function renameOrderFields(order, aliases) {
|
|
39
|
+
return order.map(([field, dir]) => [aliases[field] ?? field, dir]);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Retient d'un `order` demandé les seuls couples dont le champ est **déclaré
|
|
43
|
+
* triable**, et retombe sur l'ordre par défaut s'il n'en reste aucun.
|
|
44
|
+
*
|
|
45
|
+
* C'est le dernier étage d'une garde à deux niveaux, et il n'est pas redondant :
|
|
46
|
+
* le data plane refuse déjà en 400 un champ hors allowlist, mais tout appelant
|
|
47
|
+
* interne (un autre service, un test, un futur endpoint) peut fabriquer un
|
|
48
|
+
* `IPageQuery` à la main. Sans ce filtre, deux backends répondraient
|
|
49
|
+
* différemment à la même requête — celui qui lit l'objet en mémoire trierait sur
|
|
50
|
+
* un champ jamais annoncé, celui qui compose du SQL l'ignorerait — et le contrat
|
|
51
|
+
* partagé ne décrirait plus un comportement mais deux.
|
|
52
|
+
*
|
|
53
|
+
* 🔒 Côté SQL, ce filtre est une **garde d'injection** : un nom de colonne ne se
|
|
54
|
+
* lie pas en paramètre, il se concatène dans le `ORDER BY`.
|
|
55
|
+
*
|
|
56
|
+
* @param order - l'ordre demandé (peut être absent ou vide).
|
|
57
|
+
* @param allowed - les champs que le store déclare savoir trier.
|
|
58
|
+
* @param fallback - l'ordre contractuel appliqué à défaut.
|
|
59
|
+
* @returns un ordre non vide, garanti clos sur `allowed` ∪ `fallback`.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* const order = pickOrder(query.order, this.sortableFields, DEFAULT_ORDER);
|
|
64
|
+
* rows.sort(compareByOrder(order, (r, f) => r[f as keyof Row]));
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
function pickOrder(order, allowed, fallback) {
|
|
68
|
+
if (!order || order.length === 0) return fallback;
|
|
69
|
+
const kept = order.filter(([field]) => allowed.includes(field));
|
|
70
|
+
return kept.length > 0 ? kept : fallback;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Fabrique le comparateur d'un `order` du contrat de page — **le** tri en
|
|
74
|
+
* mémoire de Nodefony, partagé par tous les stores qui n'ont pas de moteur pour
|
|
75
|
+
* le faire à leur place.
|
|
76
|
+
*
|
|
77
|
+
* Il existe parce que chaque store mémoire réécrivait le sien, en dur et inline :
|
|
78
|
+
* le tri d'un backend mémoire différait alors de celui du backend SQL de la même
|
|
79
|
+
* ressource, si bien qu'un test vert en mémoire ne disait rien de la production.
|
|
80
|
+
* Les backends SQL et Mongo, eux, n'en ont pas besoin — ils poussent l'`order`
|
|
81
|
+
* dans la requête, où il est infiniment moins cher.
|
|
82
|
+
*
|
|
83
|
+
* Les couples sont appliqués **dans l'ordre** : le premier qui départage
|
|
84
|
+
* l'emporte, les suivants ne servent qu'aux ex æquo. Un `order` vide rend un
|
|
85
|
+
* comparateur neutre (`0` partout), ce qui laisse `Array.prototype.sort` stable
|
|
86
|
+
* et préserve donc l'ordre d'origine.
|
|
87
|
+
*
|
|
88
|
+
* @param order - les couples `[champ, sens]` du contrat.
|
|
89
|
+
* @param read - comment lire un champ sur un élément.
|
|
90
|
+
* @returns un comparateur utilisable tel quel dans `.sort()`.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```ts
|
|
94
|
+
* const order = query.order?.length ? query.order : DEFAULT_ORDER;
|
|
95
|
+
* rows.sort(compareByOrder(order, (r, field) => r[field as keyof Row]));
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
function compareByOrder(order, read) {
|
|
99
|
+
return (a, b) => {
|
|
100
|
+
for (const [field, dir] of order) {
|
|
101
|
+
const va = read(a, field);
|
|
102
|
+
const vb = read(b, field);
|
|
103
|
+
if (missing(va) || missing(vb)) {
|
|
104
|
+
if (missing(va) && missing(vb)) continue;
|
|
105
|
+
return missing(va) ? 1 : -1;
|
|
106
|
+
}
|
|
107
|
+
const cmp = compareValues(va, vb);
|
|
108
|
+
if (cmp !== 0) return dir === "DESC" ? -cmp : cmp;
|
|
109
|
+
}
|
|
110
|
+
return 0;
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//#endregion
|
|
114
|
+
export { compareByOrder, pickOrder, renameOrderFields };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//#region src/runtime/redact.ts
|
|
2
|
+
/**
|
|
3
|
+
* Redaction de secrets dans une ligne de texte (logs, SQL profilé, payloads).
|
|
4
|
+
*
|
|
5
|
+
* **Défense en profondeur, pas un contrôle d'accès** : la source de vérité reste
|
|
6
|
+
* « ne pas logger de secret ». Cette passe masque les fuites résiduelles avant
|
|
7
|
+
* d'exposer du texte hors du process (viewer de logs Studio, profiler dev, debug
|
|
8
|
+
* bar). Pure et isomorphe (zéro dépendance Node) → utilisable serveur ET browser.
|
|
9
|
+
*
|
|
10
|
+
* Couvre trois familles fréquentes :
|
|
11
|
+
* - paires clé/valeur JSON `"password":"x"` / `"token": x` ;
|
|
12
|
+
* - paires clé/valeur texte `password=x` / `Authorization: x` ;
|
|
13
|
+
* - schémas d'auth porteurs `Bearer <jwt>` / `Basic <b64>`.
|
|
14
|
+
*
|
|
15
|
+
* Les regex sont compilées une fois (coût nul par appel hormis le `replace`).
|
|
16
|
+
* Hors hot-path requête (admin plane / dev) — l'usage en boucle reste correct
|
|
17
|
+
* mais préférer un appel par ligne.
|
|
18
|
+
*/
|
|
19
|
+
/** Clés dont la valeur est considérée sensible (insensible à la casse). */
|
|
20
|
+
const SENSITIVE_KEYS = "password|passwd|pwd|secret|client[_-]?secret|token|access[_-]?token|refresh[_-]?token|id[_-]?token|api[_-]?key|x-api-key|authorization|cookie|set-cookie|session[_-]?id|private[_-]?key";
|
|
21
|
+
/** JSON : `"key": "value"` ou `"key": value` → valeur masquée. */
|
|
22
|
+
const JSON_PAIR = new RegExp(`("(?:${SENSITIVE_KEYS})"\\s*:\\s*)("(?:[^"\\\\]|\\\\.)*"|[^\\s,}\\]]+)`, "gi");
|
|
23
|
+
/** Texte : `key=value` / `key: value` (avec ou sans quotes) → valeur masquée. */
|
|
24
|
+
const KV_PAIR = new RegExp(`\\b(${SENSITIVE_KEYS})(\\s*[:=]\\s*)("[^"]*"|'[^']*'|[^\\s,;]+)`, "gi");
|
|
25
|
+
/** Schémas d'auth porteurs : `Bearer <token>` / `Basic <b64>`. */
|
|
26
|
+
const BEARER = /\b(Bearer|Basic)\s+[A-Za-z0-9._~+/=-]{4,}/gi;
|
|
27
|
+
/** Placeholder unique de remplacement. */
|
|
28
|
+
const MASK = "***";
|
|
29
|
+
/**
|
|
30
|
+
* Renvoie `line` avec les secrets connus masqués par `***`.
|
|
31
|
+
*
|
|
32
|
+
* Idempotent (re-rédiger une ligne déjà masquée ne change rien). Conserve la
|
|
33
|
+
* structure (clés, ponctuation) pour que la ligne reste lisible/diffable.
|
|
34
|
+
*
|
|
35
|
+
* @param line - ligne de log/texte brute.
|
|
36
|
+
* @returns la même ligne, valeurs sensibles remplacées par `***`.
|
|
37
|
+
*/
|
|
38
|
+
function redactSecrets(line) {
|
|
39
|
+
if (!line) return line;
|
|
40
|
+
return line.replace(BEARER, `$1 ${MASK}`).replace(JSON_PAIR, `$1"${MASK}"`).replace(KV_PAIR, `$1$2${MASK}`);
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
export { redactSecrets };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
//#region src/runtime/withTimeout.ts
|
|
2
|
+
/**
|
|
3
|
+
* Borne une promesse par un délai maximum — utilitaire de **résilience de boot**
|
|
4
|
+
* (et de tout `await` susceptible de pendre indéfiniment).
|
|
5
|
+
*
|
|
6
|
+
* Motivation : un `await` sur une opération réseau dont le pair est injoignable
|
|
7
|
+
* peut **ne jamais se résoudre** (ex. l'offline-queue de `node-redis` met la
|
|
8
|
+
* Promise en attente sans la rejeter). Sans garde, un seul de ces `await` gèle
|
|
9
|
+
* tout le cycle de boot du Kernel → les serveurs ne montent jamais.
|
|
10
|
+
*
|
|
11
|
+
* ⚠️ **NE PAS utiliser dans le hot path HTTP/WS** : chaque appel alloue un timer
|
|
12
|
+
* + une Promise de course. Réservé au **boot / lifecycle / jobs** (≪ 1×/process).
|
|
13
|
+
* Le hot path utilise `Event.emitAsync` nu (aucun timer par requête).
|
|
14
|
+
*
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Erreur levée par {@link withTimeout} quand le délai est dépassé — distincte
|
|
19
|
+
* d'un rejet métier pour que l'appelant puisse différencier « lent/figé » de
|
|
20
|
+
* « a échoué » (ex. politique de boot : timeout d'un module critique en prod).
|
|
21
|
+
*/
|
|
22
|
+
var TimeoutError = class extends Error {
|
|
23
|
+
/** Délai (ms) qui a été dépassé. */
|
|
24
|
+
timeoutMs;
|
|
25
|
+
/**
|
|
26
|
+
* @param timeoutMs - délai dépassé, en millisecondes.
|
|
27
|
+
* @param label - libellé optionnel de l'opération (préfixe du message).
|
|
28
|
+
*/
|
|
29
|
+
constructor(timeoutMs, label) {
|
|
30
|
+
super(`${label ? `${label}: ` : ""}timeout après ${timeoutMs}ms`);
|
|
31
|
+
this.name = "TimeoutError";
|
|
32
|
+
this.timeoutMs = timeoutMs;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Résout avec la valeur de `promise` si elle se règle avant `timeoutMs`,
|
|
37
|
+
* sinon rejette avec une {@link TimeoutError}.
|
|
38
|
+
*
|
|
39
|
+
* Robustesse :
|
|
40
|
+
* - le timer est `unref` (ne maintient pas l'event-loop vivant) et **toujours**
|
|
41
|
+
* nettoyé (`finally`) → aucun handle qui fuit ;
|
|
42
|
+
* - un `.catch()` est posé sur la promesse d'origine : si elle rejette **après**
|
|
43
|
+
* que le timeout a gagné la course, le rejet ne remonte pas en
|
|
44
|
+
* `unhandledRejection` (qui crasherait le process) ;
|
|
45
|
+
* - `timeoutMs ≤ 0` (ou non fini) → **aucune garde**, on attend la promesse telle
|
|
46
|
+
* quelle (permet de désactiver le timeout par config sans brancher de code).
|
|
47
|
+
*
|
|
48
|
+
* @typeParam T - type résolu par la promesse.
|
|
49
|
+
* @param promise - opération à borner.
|
|
50
|
+
* @param timeoutMs - délai max en millisecondes (≤ 0 = pas de timeout).
|
|
51
|
+
* @param label - libellé optionnel pour le message d'erreur.
|
|
52
|
+
* @returns la valeur résolue par `promise`.
|
|
53
|
+
* @throws {@link TimeoutError} si `timeoutMs` est dépassé.
|
|
54
|
+
* @throws l'erreur d'origine si `promise` rejette avant le timeout.
|
|
55
|
+
*/
|
|
56
|
+
async function withTimeout(promise, timeoutMs, label) {
|
|
57
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) return await promise;
|
|
58
|
+
const p = Promise.resolve(promise);
|
|
59
|
+
p.catch(() => {});
|
|
60
|
+
let timer;
|
|
61
|
+
try {
|
|
62
|
+
return await Promise.race([p, new Promise((_, reject) => {
|
|
63
|
+
timer = setTimeout(() => reject(new TimeoutError(timeoutMs, label)), timeoutMs);
|
|
64
|
+
timer.unref?.();
|
|
65
|
+
})]);
|
|
66
|
+
} finally {
|
|
67
|
+
if (timer) clearTimeout(timer);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//#endregion
|
|
71
|
+
export { TimeoutError, withTimeout };
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import cluster from "node:cluster";
|
|
2
|
+
//#region src/service/cluster/ClusterManager.ts
|
|
3
|
+
/**
|
|
4
|
+
* Calcule le délai de respawn d'un worker mort selon un backoff exponentiel.
|
|
5
|
+
*
|
|
6
|
+
* Anti crash-loop : un worker qui crashe en boucle ne doit pas être re-forké en
|
|
7
|
+
* rafale (CPU 100 %, logs noyés). Le délai double à chaque crash consécutif, plafonné.
|
|
8
|
+
*
|
|
9
|
+
* @param crashes - nombre de crashs consécutifs (>= 1).
|
|
10
|
+
* @param baseMs - délai du 1er respawn.
|
|
11
|
+
* @param maxMs - plafond du délai.
|
|
12
|
+
* @returns délai en ms, dans `[baseMs, maxMs]`.
|
|
13
|
+
*/
|
|
14
|
+
function computeBackoff(crashes, baseMs, maxMs) {
|
|
15
|
+
return Math.min(baseMs * 2 ** (Math.max(1, Math.floor(crashes)) - 1), maxMs);
|
|
16
|
+
}
|
|
17
|
+
const nodeScheduler = {
|
|
18
|
+
set: (fn, ms) => setTimeout(fn, ms),
|
|
19
|
+
clear: (h) => clearTimeout(h)
|
|
20
|
+
};
|
|
21
|
+
/** Adapter de production : `node:cluster`. */
|
|
22
|
+
const nodeClusterRuntime = {
|
|
23
|
+
get isPrimary() {
|
|
24
|
+
return cluster.isPrimary;
|
|
25
|
+
},
|
|
26
|
+
fork() {
|
|
27
|
+
const w = cluster.fork();
|
|
28
|
+
return {
|
|
29
|
+
id: w.id,
|
|
30
|
+
kill: (s) => w.kill(s),
|
|
31
|
+
isDead: () => w.isDead()
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
onExit(cb) {
|
|
35
|
+
cluster.on("exit", (w, code, signal) => cb({
|
|
36
|
+
id: w.id,
|
|
37
|
+
kill: (s) => w.kill(s),
|
|
38
|
+
isDead: () => w.isDead()
|
|
39
|
+
}, code, signal));
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Superviseur cluster du process MASTER (Phase 2 du mode cluster sans PM2).
|
|
44
|
+
*
|
|
45
|
+
* Le master ne sert AUCUN HTTP : il fork N workers, les respawn avec backoff en cas
|
|
46
|
+
* de crash, et coordonne un arrêt gracieux (drain SIGTERM → SIGKILL après timeout).
|
|
47
|
+
* Cgroup-aware via {@link resolveWorkerCount} (le `workers` passé est déjà résolu).
|
|
48
|
+
*
|
|
49
|
+
* Toute la mécanique runtime (`node:cluster`, timers, `process.exit`, signaux) est
|
|
50
|
+
* derrière des seams injectables : le state machine respawn/shutdown est testé sans
|
|
51
|
+
* forker un seul process réel.
|
|
52
|
+
*/
|
|
53
|
+
var ClusterManager = class {
|
|
54
|
+
#workers;
|
|
55
|
+
#log;
|
|
56
|
+
#runtime;
|
|
57
|
+
#scheduler;
|
|
58
|
+
#exit;
|
|
59
|
+
#base;
|
|
60
|
+
#max;
|
|
61
|
+
#stableMs;
|
|
62
|
+
#shutdownTimeoutMs;
|
|
63
|
+
#live = /* @__PURE__ */ new Map();
|
|
64
|
+
#consecutiveCrashes = 0;
|
|
65
|
+
#shuttingDown = false;
|
|
66
|
+
#shutdownTimer = null;
|
|
67
|
+
#started = false;
|
|
68
|
+
constructor(opts) {
|
|
69
|
+
this.#workers = Math.max(1, opts.workers);
|
|
70
|
+
this.#log = opts.log ?? (() => {});
|
|
71
|
+
this.#runtime = opts.runtime ?? nodeClusterRuntime;
|
|
72
|
+
this.#scheduler = opts.scheduler ?? nodeScheduler;
|
|
73
|
+
this.#exit = opts.exit ?? ((code) => process.exit(code));
|
|
74
|
+
this.#base = opts.respawnBaseMs ?? 200;
|
|
75
|
+
this.#max = opts.respawnMaxMs ?? 1e4;
|
|
76
|
+
this.#stableMs = opts.stableMs ?? 3e4;
|
|
77
|
+
this.#shutdownTimeoutMs = opts.shutdownTimeoutMs ?? 1e4;
|
|
78
|
+
}
|
|
79
|
+
/** Nombre de workers actuellement vivants. */
|
|
80
|
+
get size() {
|
|
81
|
+
return this.#live.size;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Les gestionnaires de signaux POSÉS PAR CE MANAGER, avec leur signal.
|
|
85
|
+
*
|
|
86
|
+
* Garder la référence est ce qui permet de retirer les siens sans toucher à
|
|
87
|
+
* ceux des autres — la raison d'être de {@link removeSignalHandlers}.
|
|
88
|
+
*/
|
|
89
|
+
#signalHandlers = [];
|
|
90
|
+
/** `true` une fois `shutdown()` enclenché (plus aucun respawn). */
|
|
91
|
+
get shuttingDown() {
|
|
92
|
+
return this.#shuttingDown;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Fork les workers initiaux et arme le respawn. Idempotent.
|
|
96
|
+
*
|
|
97
|
+
* @returns `this`.
|
|
98
|
+
*/
|
|
99
|
+
start() {
|
|
100
|
+
if (this.#started) return this;
|
|
101
|
+
this.#started = true;
|
|
102
|
+
this.#runtime.onExit((w, code, signal) => this.#onExit(w, code, signal));
|
|
103
|
+
for (let i = 0; i < this.#workers; i += 1) this.#fork();
|
|
104
|
+
this.#log(`cluster master up — ${this.#workers} worker(s)`, "INFO");
|
|
105
|
+
return this;
|
|
106
|
+
}
|
|
107
|
+
#fork() {
|
|
108
|
+
const worker = this.#runtime.fork();
|
|
109
|
+
this.#live.set(worker.id, {
|
|
110
|
+
worker,
|
|
111
|
+
forkedAt: Date.now()
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
#onExit(worker, code, signal) {
|
|
115
|
+
const rec = this.#live.get(worker.id);
|
|
116
|
+
this.#live.delete(worker.id);
|
|
117
|
+
const cause = signal ?? `code ${code}`;
|
|
118
|
+
if (this.#shuttingDown) {
|
|
119
|
+
this.#log(`worker ${worker.id} exited (${cause}) — ${this.#live.size} remaining`, "INFO");
|
|
120
|
+
if (this.#live.size === 0) this.#finishShutdown(0);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if ((rec ? Date.now() - rec.forkedAt : 0) >= this.#stableMs) this.#consecutiveCrashes = 0;
|
|
124
|
+
this.#consecutiveCrashes += 1;
|
|
125
|
+
const delay = computeBackoff(this.#consecutiveCrashes, this.#base, this.#max);
|
|
126
|
+
this.#log(`worker ${worker.id} died (${cause}) — respawn in ${delay}ms (crash #${this.#consecutiveCrashes})`, "WARNING");
|
|
127
|
+
this.#scheduler.set(() => {
|
|
128
|
+
if (!this.#shuttingDown) this.#fork();
|
|
129
|
+
}, delay);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Arrêt gracieux : déconnecte/SIGTERM chaque worker (drain), puis SIGKILL les
|
|
133
|
+
* survivants après `shutdownTimeoutMs`, et sort le process. Idempotent.
|
|
134
|
+
*
|
|
135
|
+
* @param signal - signal d'origine (log uniquement).
|
|
136
|
+
*/
|
|
137
|
+
shutdown(signal = "SIGTERM") {
|
|
138
|
+
if (this.#shuttingDown) return;
|
|
139
|
+
this.#shuttingDown = true;
|
|
140
|
+
this.#log(`${signal} — draining ${this.#live.size} worker(s)`, "CRITIC");
|
|
141
|
+
if (this.#live.size === 0) {
|
|
142
|
+
this.#finishShutdown(0);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
for (const { worker } of this.#live.values()) if (!worker.isDead()) worker.kill("SIGTERM");
|
|
146
|
+
this.#shutdownTimer = this.#scheduler.set(() => {
|
|
147
|
+
this.#log(`graceful timeout — SIGKILL ${this.#live.size} worker(s)`, "ERROR");
|
|
148
|
+
for (const { worker } of this.#live.values()) if (!worker.isDead()) worker.kill("SIGKILL");
|
|
149
|
+
this.#finishShutdown(1);
|
|
150
|
+
}, this.#shutdownTimeoutMs);
|
|
151
|
+
}
|
|
152
|
+
#finishShutdown(code) {
|
|
153
|
+
if (this.#shutdownTimer !== null) {
|
|
154
|
+
this.#scheduler.clear(this.#shutdownTimer);
|
|
155
|
+
this.#shutdownTimer = null;
|
|
156
|
+
}
|
|
157
|
+
this.#log(`cluster master down (exit ${code})`, "INFO");
|
|
158
|
+
this.#exit(code);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Branche SIGTERM/SIGINT du process MASTER sur {@link shutdown}.
|
|
162
|
+
*
|
|
163
|
+
* Le master prend la main sur ces signaux : `Cli.handleSignals` les mapperait
|
|
164
|
+
* sinon vers un `terminate()` immédiat (process.exit) qui tuerait le master
|
|
165
|
+
* AVANT que les workers aient drainé. À n'appeler que dans le vrai process
|
|
166
|
+
* master.
|
|
167
|
+
*
|
|
168
|
+
* 🔴 **On n'arrache que ce qu'on a posé soi-même.** Cette méthode commençait
|
|
169
|
+
* par `process.removeAllListeners(sig)` — ce qui effaçait AUSSI le
|
|
170
|
+
* gestionnaire qu'un module tiers avait branché sur `SIGTERM` pour son propre
|
|
171
|
+
* arrêt propre. Ce module ne recevait plus rien, et rien ne le lui disait :
|
|
172
|
+
* son code était juste, ses tests passaient, et son nettoyage cessait de
|
|
173
|
+
* s'exécuter le jour où l'application passait en cluster. Le gestionnaire du
|
|
174
|
+
* CLI, lui, se retire NOMMÉMENT — c'est le lanceur qui le fait
|
|
175
|
+
* (`Cli.releaseSignalListeners`), parce que lui seul sait de quelle instance
|
|
176
|
+
* il s'agit.
|
|
177
|
+
*/
|
|
178
|
+
installSignalHandlers() {
|
|
179
|
+
for (const sig of ["SIGTERM", "SIGINT"]) {
|
|
180
|
+
const handler = () => this.shutdown(sig);
|
|
181
|
+
this.#signalHandlers.push([sig, handler]);
|
|
182
|
+
process.on(sig, handler);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Retire les gestionnaires que {@link installSignalHandlers} a posés.
|
|
187
|
+
*
|
|
188
|
+
* Symétrique, et pour la même raison qu'il ne faut pas arracher ceux des
|
|
189
|
+
* autres : un master qui s'arrête laisse sinon deux listeners sur un process
|
|
190
|
+
* qui peut lui survivre (tests, outils qui enchaînent des commandes).
|
|
191
|
+
*
|
|
192
|
+
* @returns le nombre de gestionnaires retirés.
|
|
193
|
+
*/
|
|
194
|
+
removeSignalHandlers() {
|
|
195
|
+
const n = this.#signalHandlers.length;
|
|
196
|
+
for (const [sig, handler] of this.#signalHandlers) process.removeListener(sig, handler);
|
|
197
|
+
this.#signalHandlers = [];
|
|
198
|
+
return n;
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
//#endregion
|
|
202
|
+
export { ClusterManager, ClusterManager as default, computeBackoff };
|