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,84 @@
|
|
|
1
|
+
//#region src/runtime/bearer.ts
|
|
2
|
+
/**
|
|
3
|
+
* Extraction du jeton d'un en-tête `Authorization: Bearer …` — sans expression
|
|
4
|
+
* régulière, et volontairement.
|
|
5
|
+
*
|
|
6
|
+
* Le motif d'origine, `/^bearer\s+(.+)$/i`, était dupliqué dans deux
|
|
7
|
+
* authentificateurs et **quadratique** : `\s+` suivi de `(.+)` laisse le moteur
|
|
8
|
+
* essayer chaque point de découpage entre les deux quantificateurs. Un client
|
|
9
|
+
* anonyme envoyant `Bearer ` suivi de milliers d'espaces faisait donc brûler du
|
|
10
|
+
* temps processeur à chaque requête — sur la boucle d'événements, qui est
|
|
11
|
+
* unique. Aggravant : le test de support s'exécute AVANT toute authentification,
|
|
12
|
+
* donc le coût se paie pour un porteur qui n'a rien prouvé, et la taille
|
|
13
|
+
* d'en-tête tolérée par Node (16 Kio) suffit largement à le rendre sensible.
|
|
14
|
+
*
|
|
15
|
+
* Ici, tout est linéaire : une comparaison de préfixe, un saut d'espaces, une
|
|
16
|
+
* découpe. Aucun retour arrière n'est possible parce qu'il n'y a pas d'automate.
|
|
17
|
+
*
|
|
18
|
+
* **Séparateur restreint à l'espace et à la tabulation** : c'est ce que la
|
|
19
|
+
* RFC 9110 §5.6.3 autorise entre le schéma et ses paramètres (`OWS`). `\s`
|
|
20
|
+
* acceptait retours à la ligne et espaces Unicode — plus permissif que la norme,
|
|
21
|
+
* pour aucun bénéfice.
|
|
22
|
+
*
|
|
23
|
+
* ## Pourquoi au CŒUR, et pas dans le module de sécurité
|
|
24
|
+
*
|
|
25
|
+
* Deux couches lisent le même en-tête sans pouvoir se voir : les
|
|
26
|
+
* authentificateurs de `@nodefony/security`, et la porte MCP, dont le protocole
|
|
27
|
+
* vit ici. Une frontière de paquets aurait imposé une copie — or une copie de
|
|
28
|
+
* cette fonction ne diverge pas bruyamment : elle diverge sur un cas limite
|
|
29
|
+
* (`Bearer …`, `Bearer` sans séparateur) que chaque copie continue de
|
|
30
|
+
* passer dans ses propres tests. La règle « 1 règle = 1 implémentation » veut
|
|
31
|
+
* donc qu'elle vive au niveau que les deux peuvent atteindre — le plus bas.
|
|
32
|
+
*
|
|
33
|
+
* Elle est ici, et non dans un dossier `mcp/`, parce qu'elle ne doit rien à ce
|
|
34
|
+
* protocole : c'est de la sémantique HTTP, lue à chaque requête entrante.
|
|
35
|
+
*/
|
|
36
|
+
/** Le schéma, en minuscules — comparé sans allouer de version normalisée. */
|
|
37
|
+
const SCHEME = "bearer";
|
|
38
|
+
/**
|
|
39
|
+
* Lit un en-tête `Authorization` et dit ce qu'il porte.
|
|
40
|
+
*
|
|
41
|
+
* @param header - la valeur brute de l'en-tête (absente, d'un autre schéma, ou
|
|
42
|
+
* vide — aucun de ces cas ne lève).
|
|
43
|
+
* @returns le verdict de lecture ; jamais une exception.
|
|
44
|
+
*/
|
|
45
|
+
function readBearerHeader(header) {
|
|
46
|
+
if (typeof header !== "string" || header.length === 0) return { kind: "absent" };
|
|
47
|
+
if (header.length < 6) return { kind: "other" };
|
|
48
|
+
if (header.slice(0, 6).toLowerCase() !== SCHEME) return { kind: "other" };
|
|
49
|
+
let i = 6;
|
|
50
|
+
if (i === header.length) return { kind: "empty" };
|
|
51
|
+
const first = header.charCodeAt(i);
|
|
52
|
+
if (first !== 32 && first !== 9) return { kind: "other" };
|
|
53
|
+
while (i < header.length) {
|
|
54
|
+
const c = header.charCodeAt(i);
|
|
55
|
+
if (c !== 32 && c !== 9) break;
|
|
56
|
+
i++;
|
|
57
|
+
}
|
|
58
|
+
const token = header.slice(i).trimEnd();
|
|
59
|
+
return token.length > 0 ? {
|
|
60
|
+
kind: "token",
|
|
61
|
+
token
|
|
62
|
+
} : { kind: "empty" };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Rend le jeton porté par un en-tête `Authorization`, ou `null`.
|
|
66
|
+
*
|
|
67
|
+
* Projection de {@link readBearerHeader} pour les appelants que la NUANCE ne
|
|
68
|
+
* regarde pas — un authentificateur qui cherche un porteur et passe la main s'il
|
|
69
|
+
* n'y en a pas. Une porte qui doit RÉPONDRE (401 ? 400 ? anonyme ?) lit le
|
|
70
|
+
* verdict complet : sans lui, elle ne peut pas distinguer « rien présenté » de
|
|
71
|
+
* « mal présenté », et elle tranche donc toujours du mauvais côté pour l'un des
|
|
72
|
+
* deux.
|
|
73
|
+
*
|
|
74
|
+
* @param header - la valeur brute de l'en-tête (peut être absente ou d'un autre
|
|
75
|
+
* schéma — les deux rendent `null`, jamais une exception).
|
|
76
|
+
* @returns le jeton débarrassé de ses espaces de tête et de queue, ou `null` si
|
|
77
|
+
* l'en-tête n'est pas un `Bearer` valide ou ne porte aucun jeton.
|
|
78
|
+
*/
|
|
79
|
+
function bearerToken(header) {
|
|
80
|
+
const lu = readBearerHeader(header);
|
|
81
|
+
return lu.kind === "token" ? lu.token : null;
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
84
|
+
export { bearerToken, readBearerHeader };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
//#region src/runtime/engineEnvironment.ts
|
|
2
|
+
/**
|
|
3
|
+
* Mode retenu lorsque ni l'environnement ni la commande n'en désignent un.
|
|
4
|
+
*
|
|
5
|
+
* 🔴 **`development`, et c'est un choix de SÛRETÉ.** Le raisonnement, parce
|
|
6
|
+
* qu'il se reprendra le jour où quelqu'un voudra l'inverser :
|
|
7
|
+
*
|
|
8
|
+
* Ce défaut ne s'applique QUE si `NODE_ENV` est absent ET que la commande
|
|
9
|
+
* n'exprime aucune intention. Or aucun serveur ne démarre dans cet état : les
|
|
10
|
+
* trois lanceurs posent leur mode eux-mêmes (`ProdCommand`, `DevCommand`,
|
|
11
|
+
* `ClusterCommand`), et il n'existe pas d'autre façon d'en lancer un. Le défaut
|
|
12
|
+
* ne gouverne donc que les commandes UTILITAIRES — `inspect`, `check`, `env`,
|
|
13
|
+
* `security:*` — tapées, dans leur écrasante majorité, sur un poste de
|
|
14
|
+
* développement. Le défaut doit protéger le cas où l'information manque, et
|
|
15
|
+
* l'information manque là.
|
|
16
|
+
*
|
|
17
|
+
* ⚠️ **Ce n'est pas le « 12-factor » qui le justifie** : sa section Config
|
|
18
|
+
* déconseille au contraire les *environment groups* comme `NODE_ENV`, et rien
|
|
19
|
+
* n'oblige un orchestrateur à le poser. Ce qui garantit le mode en production
|
|
20
|
+
* ici est FACTUEL, pas doctrinal — l'image générée pose
|
|
21
|
+
* `ENV NODE_ENV=production`, et les lanceurs déclarent leur intention. Ce qui
|
|
22
|
+
* relève vraiment du 12-factor est la PRÉCÉDENCE : l'ambiant l'emporte sur
|
|
23
|
+
* l'intention de la commande.
|
|
24
|
+
*
|
|
25
|
+
* Risque résiduel, nommé plutôt que masqué : une commande utilitaire lancée sur
|
|
26
|
+
* un déploiement de production SANS `NODE_ENV` et HORS image officielle partira
|
|
27
|
+
* en `development`. Le symétrique — le poste de développement traité comme la
|
|
28
|
+
* production — est ce qui a réellement cassé trois fois : un jeton émis contre
|
|
29
|
+
* la mauvaise configuration, une inspection montrant les modules de production
|
|
30
|
+
* sur une machine de développement, et un contrôle de banc comparant deux
|
|
31
|
+
* applications distinctes. Aucun n'a levé la moindre erreur.
|
|
32
|
+
*/
|
|
33
|
+
const DEFAULT_ENGINE_ENVIRONMENT = "development";
|
|
34
|
+
/**
|
|
35
|
+
* Le défaut à retenir SELON que `NODE_ENV` a été posé ou non.
|
|
36
|
+
*
|
|
37
|
+
* 🔴 **Poser `NODE_ENV` est un ACTE DE DÉPLOIEMENT ; ne rien poser est l'état
|
|
38
|
+
* d'un poste de développement.** C'est toute la distinction, et l'ignorer a
|
|
39
|
+
* failli coûter cher : une première version de cette règle rendait
|
|
40
|
+
* `development` dès que `NODE_ENV` ne désignait aucun mode moteur — donc pour
|
|
41
|
+
* `staging`, `canary`, `prod-eu`, `test`. Un déploiement de pré-production
|
|
42
|
+
* aurait chargé les modules `policy:"dev"` (console d'administration, outillage
|
|
43
|
+
* de développement) et détaillé ses traces. La suite de tests l'a arrêté.
|
|
44
|
+
*
|
|
45
|
+
* Les valeurs non-moteur ne sont donc PAS traitées comme une absence : elles
|
|
46
|
+
* nomment un déploiement, et un déploiement tourne comme la production. Seule
|
|
47
|
+
* l'absence TOTALE de la variable désigne un poste de développement.
|
|
48
|
+
*
|
|
49
|
+
* Une chaîne vide compte comme POSÉE — on ne peut pas distinguer « vidée par
|
|
50
|
+
* erreur » de « vidée exprès », et le choix conservateur ne coûte qu'une
|
|
51
|
+
* commande utilitaire, là où l'inverse expose une console d'administration.
|
|
52
|
+
*
|
|
53
|
+
* @param nodeEnv - `process.env.NODE_ENV` tel quel, `undefined` s'il est absent.
|
|
54
|
+
* @returns le mode à retenir quand rien d'autre ne le désigne.
|
|
55
|
+
*/
|
|
56
|
+
function defaultEngineEnvironment(nodeEnv) {
|
|
57
|
+
return nodeEnv === void 0 ? DEFAULT_ENGINE_ENVIRONMENT : "production";
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Le mode MOTEUR que désigne une étiquette d'environnement — le « collapse ».
|
|
61
|
+
*
|
|
62
|
+
* 🔴 Tout ce qui n'est pas `dev`/`development` tourne comme la PRODUCTION :
|
|
63
|
+
* `staging`, `canary`, `prod-eu` nomment un déploiement, et un déploiement est
|
|
64
|
+
* optimisé, gated et tracé comme la production.
|
|
65
|
+
*
|
|
66
|
+
* Écrite ici, et nulle part ailleurs : cette règle décide à la fois de ce que
|
|
67
|
+
* le Kernel FAIT au démarrage et de ce que `doctor --env` PRÉDIT. Deux copies
|
|
68
|
+
* qui divergent feraient annoncer un déploiement que l'application ne produit
|
|
69
|
+
* pas — le pire défaut possible pour un outil dont c'est tout le propos.
|
|
70
|
+
*
|
|
71
|
+
* @param raw - l'étiquette telle qu'elle est posée (`NODE_ENV`, `--env`, …).
|
|
72
|
+
* @returns `"development"` ou `"production"` — jamais les formes courtes
|
|
73
|
+
* `dev`/`prod`, que ce collapse a justement pour rôle de résoudre.
|
|
74
|
+
*/
|
|
75
|
+
function engineModeOf(raw) {
|
|
76
|
+
return raw === "dev" || raw === "development" ? "development" : "production";
|
|
77
|
+
}
|
|
78
|
+
//#endregion
|
|
79
|
+
export { DEFAULT_ENGINE_ENVIRONMENT, defaultEngineEnvironment, engineModeOf };
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { parseEnv } from "node:util";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
//#region src/runtime/loadEnv.ts
|
|
5
|
+
/**
|
|
6
|
+
* Charge les fichiers `.env` du projet dans `process.env`, en cascade et SANS
|
|
7
|
+
* jamais écraser une variable déjà présente.
|
|
8
|
+
*
|
|
9
|
+
* **Convention B (Vite / Next.js)** — règle : les fichiers `*.local` (gitignorés,
|
|
10
|
+
* secrets/machine) priment TOUJOURS sur les committés ; à rang égal, le plus
|
|
11
|
+
* spécifique gagne. Nodefony ajoute un 2ᵉ axe : `appEnv` (déploiement) est plus
|
|
12
|
+
* spécifique que `runtimeEnv` (mode). Précédence, du PLUS fort au PLUS faible :
|
|
13
|
+
*
|
|
14
|
+
* ```
|
|
15
|
+
* process.env ← shell / orchestrateur k8s (gagne TOUJOURS)
|
|
16
|
+
* > .env.<appEnv>.local ┐ gitignorés (*.local) ┐ si appEnv défini
|
|
17
|
+
* > .env.<runtimeEnv>.local │ │ & ≠ runtimeEnv
|
|
18
|
+
* > .env.local ┘ │
|
|
19
|
+
* > .env.<appEnv> ┐ committés (non-secrets) ┘
|
|
20
|
+
* > .env.<runtimeEnv> │
|
|
21
|
+
* > .env ┘ défauts communs (le + faible)
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* Mécanique : on lit du **plus** prioritaire au **moins** prioritaire et on
|
|
25
|
+
* n'assigne QUE les clés encore absentes de `process.env`. Une variable déjà
|
|
26
|
+
* posée — shell, orchestrateur, ou fichier plus prioritaire déjà traité — n'est
|
|
27
|
+
* jamais réécrite → la précédence ci-dessus en découle naturellement.
|
|
28
|
+
*
|
|
29
|
+
* Parse natif `node:util.parseEnv` (Node ≥ 21) → **zéro dépendance**. Un fichier
|
|
30
|
+
* absent ou illisible est ignoré silencieusement (tout `.env` est optionnel).
|
|
31
|
+
*
|
|
32
|
+
* Appelé une seule fois au démarrage du bin CLI, **AVANT `new CliKernel()`** : les
|
|
33
|
+
* configs de modules lisent `process.env` au boot (ex. `REDIS_*` dans
|
|
34
|
+
* `defineRedisConfig`), l'env doit donc être peuplé en amont.
|
|
35
|
+
*
|
|
36
|
+
* @param opts - {@link ILoadEnvOptions} (runtimeEnv / appEnv / cwd).
|
|
37
|
+
* @returns le nombre de variables effectivement injectées (diagnostic / tests).
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* Les fichiers de la cascade, du PLUS prioritaire au MOINS prioritaire.
|
|
41
|
+
*
|
|
42
|
+
* Extrait de {@link loadEnv} pour être la source UNIQUE de cet ordre : la
|
|
43
|
+
* commande `nodefony env` l'affiche, et un ordre affiché qui différerait de
|
|
44
|
+
* l'ordre appliqué serait pire que pas d'affichage du tout — c'est exactement ce
|
|
45
|
+
* qu'un utilisateur croirait sur parole en cherchant pourquoi sa variable est
|
|
46
|
+
* ignorée.
|
|
47
|
+
*
|
|
48
|
+
* @param opts - `runtimeEnv` (mode) et `appEnv` (déploiement).
|
|
49
|
+
* @returns les noms de fichiers, ordonnés ; ne dit pas lesquels existent.
|
|
50
|
+
*/
|
|
51
|
+
function envFileOrder(opts = {}) {
|
|
52
|
+
const { runtimeEnv, appEnv } = opts;
|
|
53
|
+
const deployEnv = appEnv && appEnv !== runtimeEnv ? appEnv : void 0;
|
|
54
|
+
const files = [];
|
|
55
|
+
if (deployEnv) files.push(`.env.${deployEnv}.local`);
|
|
56
|
+
if (runtimeEnv) files.push(`.env.${runtimeEnv}.local`);
|
|
57
|
+
files.push(".env.local");
|
|
58
|
+
if (deployEnv) files.push(`.env.${deployEnv}`);
|
|
59
|
+
if (runtimeEnv) files.push(`.env.${runtimeEnv}`);
|
|
60
|
+
files.push(".env");
|
|
61
|
+
return files;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* L'environnement EFFECTIF d'un projet, sans toucher à `process.env`.
|
|
65
|
+
*
|
|
66
|
+
* Même cascade et même précédence que {@link loadEnv} — dont c'est désormais le
|
|
67
|
+
* moteur —, mais rendue plutôt qu'injectée. Elle sert à tout ce qui doit LIRE
|
|
68
|
+
* l'environnement d'une application sans être cette application : un diagnostic
|
|
69
|
+
* lancé depuis un poste voit ainsi ce que l'app verra, alors que `process.env`
|
|
70
|
+
* nu ne montre que ce que le terminal a posé.
|
|
71
|
+
*
|
|
72
|
+
* 🔴 C'est exactement le trou que `doctor` portait : le dialecte du connecteur
|
|
73
|
+
* était déduit de `process.env` seul, donc une application dont l'URL vit dans
|
|
74
|
+
* `.env.local` — le chemin que le gabarit PRESCRIT — voyait chacune de ses
|
|
75
|
+
* entités accusée d'être écrite pour le mauvais moteur.
|
|
76
|
+
*
|
|
77
|
+
* @param base - l'environnement de départ, qui GAGNE sur les fichiers.
|
|
78
|
+
* @param opts - la cascade à lire (racine, mode runtime, environnement de déploiement).
|
|
79
|
+
* @returns un objet neuf ; ni `base` ni `process.env` ne sont modifiés.
|
|
80
|
+
*/
|
|
81
|
+
function resolveEnvCascade(base, opts = {}) {
|
|
82
|
+
const { cwd = process.cwd() } = opts;
|
|
83
|
+
const merged = { ...base };
|
|
84
|
+
for (const file of envFileOrder(opts)) {
|
|
85
|
+
let parsed;
|
|
86
|
+
try {
|
|
87
|
+
parsed = parseEnv(readFileSync(resolve(cwd, file), "utf8"));
|
|
88
|
+
} catch {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
for (const key in parsed) if (merged[key] === void 0) merged[key] = parsed[key];
|
|
92
|
+
}
|
|
93
|
+
return merged;
|
|
94
|
+
}
|
|
95
|
+
function loadEnv(opts = {}) {
|
|
96
|
+
const resolved = resolveEnvCascade(process.env, opts);
|
|
97
|
+
let injected = 0;
|
|
98
|
+
for (const key in resolved) if (process.env[key] === void 0) {
|
|
99
|
+
process.env[key] = resolved[key];
|
|
100
|
+
injected++;
|
|
101
|
+
}
|
|
102
|
+
return injected;
|
|
103
|
+
}
|
|
104
|
+
//#endregion
|
|
105
|
+
export { envFileOrder, loadEnv, resolveEnvCascade };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
//#region src/runtime/pageFacets.ts
|
|
2
|
+
/**
|
|
3
|
+
* Ce qu'un store rend quand il ne PEUT pas compter — convention de tous les
|
|
4
|
+
* backends du dépôt (`countSessions`, `countTokens`, `countEndpoints`).
|
|
5
|
+
*
|
|
6
|
+
* Une valeur sentinelle plutôt qu'une exception : ne pas savoir compter est un
|
|
7
|
+
* état nominal d'un backend en curseur, pas une panne.
|
|
8
|
+
*/
|
|
9
|
+
const UNKNOWN_COUNT = -1;
|
|
10
|
+
/**
|
|
11
|
+
* Compte plusieurs **facettes** d'une même collection en un seul geste.
|
|
12
|
+
*
|
|
13
|
+
* Une facette est une question fermée posée à la collection entière — « combien
|
|
14
|
+
* de sessions authentifiées ? », « combien de clés révoquées ? ». C'est ce que
|
|
15
|
+
* les cartes en tête d'un écran d'administration prétendent afficher, et ce
|
|
16
|
+
* qu'elles calculaient jusqu'ici **sur la page chargée** : avec une fenêtre de
|
|
17
|
+
* 25 lignes, une carte annonçant « 3 comptes actifs » décrit trois lignes
|
|
18
|
+
* visibles, pas l'annuaire. Un nombre présenté sans qualificatif est lu comme un
|
|
19
|
+
* total ; le corriger d'une mention en petits caractères ne le rend pas vrai.
|
|
20
|
+
*
|
|
21
|
+
* L'algorithme vit ici en **un seul exemplaire** ; ce qui varie d'une ressource
|
|
22
|
+
* à l'autre est la **donnée** — la table des facettes — qui se déclare à côté du
|
|
23
|
+
* contrat de la ressource, jamais sous forme de fonction.
|
|
24
|
+
*
|
|
25
|
+
* Aucune facette n'est dérivée d'une autre (`inactive = total - active`) : deux
|
|
26
|
+
* facettes peuvent se recouvrir (un compte peut être à la fois désactivé et
|
|
27
|
+
* verrouillé), et une soustraction rendrait alors un nombre que rien ne compte.
|
|
28
|
+
* Chaque facette est une question posée telle quelle au store.
|
|
29
|
+
*
|
|
30
|
+
* @param facets - nom public → filtre à appliquer. Un filtre vide compte tout.
|
|
31
|
+
* @param count - le compteur du store, appelé une fois par facette. Il rend
|
|
32
|
+
* {@link UNKNOWN_COUNT} lorsqu'il ne sait pas compter.
|
|
33
|
+
* @returns un compteur par facette, `null` là où le store a répondu « inconnu ».
|
|
34
|
+
*
|
|
35
|
+
* @remarks **Cold path d'administration.** Les facettes partent en parallèle
|
|
36
|
+
* (une requête `COUNT` chacune) : c'est acceptable pour quatre questions
|
|
37
|
+
* posées à l'ouverture d'un écran, et ce ne serait pas acceptable dans un
|
|
38
|
+
* chemin de requête. Ne pas rejouer ces comptages à chaque tour de page — ils
|
|
39
|
+
* ne dépendent ni de `limit`, ni de `offset`, ni de l'ordre.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* const SESSION_FACETS = {
|
|
44
|
+
* total: {},
|
|
45
|
+
* authenticated: { authenticated: true },
|
|
46
|
+
* anonymous: { authenticated: false },
|
|
47
|
+
* } as const satisfies IFacetSpec<ISessionListQuery>;
|
|
48
|
+
*
|
|
49
|
+
* const counts = await countFacets(SESSION_FACETS, (q) => storage.countSessions(q));
|
|
50
|
+
* // → { total: 1204, authenticated: 87, anonymous: 1117 } (Redis : que des null)
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
async function countFacets(facets, count) {
|
|
54
|
+
const names = Object.keys(facets);
|
|
55
|
+
const values = await Promise.all(names.map(async (name) => {
|
|
56
|
+
const n = await count(facets[name]);
|
|
57
|
+
return Number.isFinite(n) && n >= 0 ? n : null;
|
|
58
|
+
}));
|
|
59
|
+
const out = {};
|
|
60
|
+
for (let i = 0; i < names.length; i++) out[names[i]] = values[i];
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Les champs qu'une table de facettes **décompose** — donc ceux qu'un client ne
|
|
65
|
+
* peut pas filtrer sur l'endpoint qui les rend.
|
|
66
|
+
*
|
|
67
|
+
* Poser `?status=active` sur un endpoint dont les facettes sont justement les
|
|
68
|
+
* états produirait une réponse qui se contredit : le total suivrait le filtre,
|
|
69
|
+
* et chaque facette l'écraserait par le sien (« 5 clés au total, dont 538
|
|
70
|
+
* révoquées »). Ce n'est pas un cas tordu, c'est le cas NOMINAL — un client
|
|
71
|
+
* envoie naturellement le même query string à la liste et aux compteurs.
|
|
72
|
+
*
|
|
73
|
+
* Sert donc de garde : la spec de filtre d'un endpoint de statistiques ne doit
|
|
74
|
+
* contenir aucune de ces clés, ce qu'un test vérifie par ressource.
|
|
75
|
+
*
|
|
76
|
+
* @param facets - la table déclarée.
|
|
77
|
+
* @returns les noms de champs apparaissant dans au moins une facette, triés.
|
|
78
|
+
*/
|
|
79
|
+
function facetDimensions(facets) {
|
|
80
|
+
const out = /* @__PURE__ */ new Set();
|
|
81
|
+
for (const facet of Object.values(facets)) for (const key of Object.keys(facet)) out.add(key);
|
|
82
|
+
return [...out].sort();
|
|
83
|
+
}
|
|
84
|
+
//#endregion
|
|
85
|
+
export { UNKNOWN_COUNT, countFacets, facetDimensions };
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { PAGE_QUERY_KEYS, PageQueryError, singleValue } from "./pageQuery.js";
|
|
2
|
+
//#region src/runtime/pageFilters.ts
|
|
3
|
+
/** Une définition est-elle répétable ? (discriminant de {@link FilterEach}) */
|
|
4
|
+
const isEach = (def) => typeof def === "object" && !Array.isArray(def);
|
|
5
|
+
/**
|
|
6
|
+
* Valide et convertit UNE valeur brute selon une nature scalaire — le cœur de
|
|
7
|
+
* la lecture, partagé par les filtres simples et par chaque occurrence d'un
|
|
8
|
+
* filtre `{ each }`. Les écrire deux fois les aurait fait diverger : c'est
|
|
9
|
+
* exactement ce qui s'était produit dans les data planes, où la variante
|
|
10
|
+
* multi-valeurs validait moins que la variante simple.
|
|
11
|
+
*
|
|
12
|
+
* @throws {@link PageQueryError} (`code` 400) si la valeur ne correspond pas.
|
|
13
|
+
*/
|
|
14
|
+
function coerce(raw, def, name) {
|
|
15
|
+
if (Array.isArray(def)) {
|
|
16
|
+
if (!def.includes(raw)) throw new PageQueryError(`Invalid value "${raw}" for "${name}". Accepted: ${def.join(", ")}.`);
|
|
17
|
+
return raw;
|
|
18
|
+
}
|
|
19
|
+
if (def === "boolean") {
|
|
20
|
+
if (raw !== "true" && raw !== "false") throw new PageQueryError(`Invalid value "${raw}" for "${name}" (expected true or false).`);
|
|
21
|
+
return raw === "true";
|
|
22
|
+
}
|
|
23
|
+
if (def === "int") {
|
|
24
|
+
const n = Number.parseInt(raw, 10);
|
|
25
|
+
if (!Number.isFinite(n) || String(n) !== raw.trim()) throw new PageQueryError(`Invalid value "${raw}" for "${name}" (expected an integer).`);
|
|
26
|
+
return n;
|
|
27
|
+
}
|
|
28
|
+
return raw;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* **Le** lecteur de filtres : transforme une source clé→valeur en filtres
|
|
32
|
+
* validés, selon la spec déclarée par la ressource. Fonction **pure**.
|
|
33
|
+
*
|
|
34
|
+
* Il remplace les lectures `one(query, "x")` que chaque data plane recopiait —
|
|
35
|
+
* une vingtaine dans le dépôt, avec autant de coercitions maison. Ce n'est pas
|
|
36
|
+
* la répétition qui coûtait, c'est ce qu'elles faisaient toutes : **accepter
|
|
37
|
+
* puis jeter**. `?revoked=oui` posait le filtre à `undefined`, `?category=zzz`
|
|
38
|
+
* tombait hors de l'énumération, `?enbaled=true` n'existait pour personne — et
|
|
39
|
+
* dans les trois cas la réponse était une page NON filtrée, que le client lit
|
|
40
|
+
* comme le résultat de son filtre. Le tri a cessé de faire ça ; les filtres le
|
|
41
|
+
* faisaient encore.
|
|
42
|
+
*
|
|
43
|
+
* Trois refus, tous en `400` :
|
|
44
|
+
*
|
|
45
|
+
* | Cas | Exemple |
|
|
46
|
+
* | ---------------------------------- | -------------------------- |
|
|
47
|
+
* | valeur mal formée | `?revoked=oui` |
|
|
48
|
+
* | valeur hors énumération | `?category=zzz` |
|
|
49
|
+
* | paramètre reconnu par personne | `?enbaled=true` |
|
|
50
|
+
*
|
|
51
|
+
* Le troisième est le plus important et le moins évident : sans lui, une faute
|
|
52
|
+
* de frappe dans une URL d'administration rend silencieusement la collection
|
|
53
|
+
* ENTIÈRE. Les clés du contrat de page ({@link PAGE_QUERY_KEYS}) sont bien sûr
|
|
54
|
+
* admises — c'est le même URL qui porte les deux.
|
|
55
|
+
*
|
|
56
|
+
* @param source - la query string parsée, ou le corps d'une requête `QUERY`.
|
|
57
|
+
* @param spec - ce que ce point d'entrée sait filtrer.
|
|
58
|
+
* @param options - paramètres que l'appelant lit lui-même (voir
|
|
59
|
+
* {@link IParseFiltersOptions.accepts}).
|
|
60
|
+
* @returns les filtres présents et valides (les absents ne sont pas posés).
|
|
61
|
+
* @throws {@link PageQueryError} (`code` 400) sur l'un des trois cas ci-dessus.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* const TOKEN_FILTERS = {
|
|
66
|
+
* subjectId: "string",
|
|
67
|
+
* revoked: "boolean",
|
|
68
|
+
* kind: ["pat", "refresh"],
|
|
69
|
+
* } as const satisfies IFilterSpec;
|
|
70
|
+
*
|
|
71
|
+
* const page = parsePageQuery(request.query, { sortable });
|
|
72
|
+
* const filters = parseFilters(request.query, TOKEN_FILTERS);
|
|
73
|
+
* return store.listPage({ ...page, ...filters });
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
function parseFilters(source, spec, options = {}) {
|
|
77
|
+
const out = {};
|
|
78
|
+
const accepts = options.accepts;
|
|
79
|
+
for (const key of Object.keys(source)) {
|
|
80
|
+
if (PAGE_QUERY_KEYS.has(key)) continue;
|
|
81
|
+
if (accepts?.includes(key)) continue;
|
|
82
|
+
if (!Object.hasOwn(spec, key)) {
|
|
83
|
+
const known = Object.keys(spec);
|
|
84
|
+
throw new PageQueryError(known.length ? `Unknown parameter "${key}". Filterable fields: ${known.join(", ")}.` : `Unknown parameter "${key}"; this endpoint has no filters.`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
for (const [name, def] of Object.entries(spec)) {
|
|
88
|
+
if (isEach(def)) {
|
|
89
|
+
const raw = source[name];
|
|
90
|
+
if (raw === void 0) continue;
|
|
91
|
+
const values = (Array.isArray(raw) ? raw : [raw]).filter((v) => v !== "");
|
|
92
|
+
if (values.length === 0) continue;
|
|
93
|
+
out[name] = values.map((v) => coerce(v, def.each, name));
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const raw = singleValue(source, name);
|
|
97
|
+
if (raw === void 0 || raw === "") continue;
|
|
98
|
+
out[name] = coerce(raw, def, name);
|
|
99
|
+
}
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
102
|
+
//#endregion
|
|
103
|
+
export { parseFilters };
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import nodefonyError from "../Error.js";
|
|
2
|
+
//#region src/runtime/pageGuard.ts
|
|
3
|
+
/**
|
|
4
|
+
* Erreur levée quand un `listPage` reçoit le champ de pagination du mode que son
|
|
5
|
+
* store **ne sait pas honorer** — un `cursor` pour un store offset, ou un `offset`
|
|
6
|
+
* de navigation pour un store curseur.
|
|
7
|
+
*
|
|
8
|
+
* `code = 400` : c'est une erreur du **client** (mauvais paramètre), jamais une
|
|
9
|
+
* panne serveur. Avant ce garde-fou, le champ hors-mode était **avalé en silence**
|
|
10
|
+
* (un client curseur bouclait indéfiniment sur la page 1 d'un store offset, cf
|
|
11
|
+
* l'écart F27/F51 du registre doc↔code). Le data plane admin (`AdminApiController`)
|
|
12
|
+
* traduit ce `code` en statut HTTP 400 au lieu du 500 générique.
|
|
13
|
+
*/
|
|
14
|
+
var PaginationModeError = class extends nodefonyError {
|
|
15
|
+
/**
|
|
16
|
+
* @param received - le mode dont un champ a été fourni (celui de trop).
|
|
17
|
+
* @param supported - le mode réellement supporté par le store.
|
|
18
|
+
*/
|
|
19
|
+
constructor(received, supported) {
|
|
20
|
+
super(`Pagination mode mismatch: this store paginates by "${supported}", but a "${received}" parameter was supplied. Pass "${supported}" only (offset and cursor are mutually exclusive per the IPage contract).`, 400);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Erreur levée quand un store paginant par **curseur** reçoit un
|
|
25
|
+
* {@link IPageQuery.order} : il ne peut pas l'honorer, et l'avaler mentirait.
|
|
26
|
+
*
|
|
27
|
+
* Ce n'est pas une limite d'implémentation, c'est la nature du curseur : le
|
|
28
|
+
* jeton encode une **position dans un ordre total**, celui-là même que le store
|
|
29
|
+
* applique. Le rendre paramétrable rendrait tout jeton déjà émis ininterprétable
|
|
30
|
+
* — la page suivante sauterait ou répéterait des lignes, silencieusement, ce qui
|
|
31
|
+
* est le pire défaut possible sur un journal d'audit.
|
|
32
|
+
*
|
|
33
|
+
* `code = 400` : c'est le client qui demande une capacité que ce point d'entrée
|
|
34
|
+
* n'a pas. Un backend curseur qui saurait trier devrait d'abord embarquer
|
|
35
|
+
* l'ordre DANS son curseur ; il déclarerait alors `sortableFields` et cette
|
|
36
|
+
* garde serait à revoir avec lui — pas avant.
|
|
37
|
+
*/
|
|
38
|
+
var CursorOrderError = class extends nodefonyError {
|
|
39
|
+
/** @param fields - les champs de tri demandés, dans l'ordre reçu. */
|
|
40
|
+
constructor(fields) {
|
|
41
|
+
super(`Sorting is not supported by a cursor-paginated store (requested: ${fields.join(", ")}). The cursor encodes a position in the store's own total order; changing that order would invalidate every token already issued. Drop "order", or use an offset-paginated backend.`, 400);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Fait respecter le contrat « un store expose UN seul mode » au point d'entrée
|
|
46
|
+
* d'un `listPage`, sur la requête **brute** reçue de l'appelant (avant qu'elle ne
|
|
47
|
+
* soit normalisée) : rejette explicitement le champ du mode non supporté plutôt
|
|
48
|
+
* que de l'ignorer sans un mot.
|
|
49
|
+
*
|
|
50
|
+
* Chaque store connaît son mode **statiquement** (constante de l'implémentation) et
|
|
51
|
+
* appelle ce garde-fou en première ligne. À placer côté store — jamais dans un
|
|
52
|
+
* helper de pagination en aval (`paginate()`), qui reçoit une requête déjà
|
|
53
|
+
* reconstruite d'où le champ hors-mode a pu disparaître, laissant la violation
|
|
54
|
+
* passer inaperçue.
|
|
55
|
+
*
|
|
56
|
+
* **Valeurs neutres tolérées** (pas une navigation) : un `cursor` **vide** côté
|
|
57
|
+
* offset et un `offset` **0** côté curseur désignent tous deux « le début » — ils
|
|
58
|
+
* ne trahissent aucune intention du mauvais mode et ne sont donc pas rejetés. Seule
|
|
59
|
+
* une vraie navigation du mode adverse (`cursor` non vide, `offset > 0`) lève.
|
|
60
|
+
*
|
|
61
|
+
* **Le mode curseur refuse aussi le TRI** ({@link CursorOrderError}) : son ordre
|
|
62
|
+
* est imposé par le jeton, pas choisi par l'appelant. Le data plane le refuse
|
|
63
|
+
* déjà en amont (aucun endpoint curseur ne déclare `sortable`), mais un appelant
|
|
64
|
+
* interne — un autre service, un test, un futur endpoint — fabrique son
|
|
65
|
+
* `IPageQuery` à la main ; sans cette ligne, son `order` était ignoré sans un
|
|
66
|
+
* mot par les six stores curseur du dépôt.
|
|
67
|
+
*
|
|
68
|
+
* @param query - la requête de page brute reçue par le store.
|
|
69
|
+
* @param mode - le mode que le store sait honorer.
|
|
70
|
+
* @throws {@link PaginationModeError} (`code` 400) si le champ du mode adverse est
|
|
71
|
+
* présent avec une valeur de navigation.
|
|
72
|
+
* @throws {@link CursorOrderError} (`code` 400) si un `order` non vide est fourni
|
|
73
|
+
* à un store curseur.
|
|
74
|
+
*/
|
|
75
|
+
function assertPageQuery(query, mode) {
|
|
76
|
+
if (mode === "offset") {
|
|
77
|
+
if (typeof query.cursor === "string" && query.cursor !== "") throw new PaginationModeError("cursor", "offset");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (typeof query.offset === "number" && query.offset > 0) throw new PaginationModeError("offset", "cursor");
|
|
81
|
+
if (query.order && query.order.length > 0) throw new CursorOrderError(query.order.map(([field]) => field));
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
84
|
+
export { CursorOrderError, PaginationModeError, assertPageQuery };
|