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,780 @@
|
|
|
1
|
+
import { COUNTED_FAMILIES, FAMILIES, TITLES, countFindings, createPalette, highlightCode, isSubrule, pluralize, preventedChecks, sectionTitle, skippedChecks, splitAction, stateSymbol, summaryLine, wrap } from "./report.js";
|
|
2
|
+
import { formatAge, lastBootFileFor } from "./lastBoot.js";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
//#region src/kernel/checks/renderReport.ts
|
|
5
|
+
/**
|
|
6
|
+
* Le rapport de `nodefony doctor` tel qu'un HUMAIN le lit — rendu PUR.
|
|
7
|
+
*
|
|
8
|
+
* Ce module ne connaît ni le terminal, ni l'horloge, ni l'environnement : la
|
|
9
|
+
* largeur, la couleur et l'instant lui sont DONNÉS, et il rend des lignes. Deux
|
|
10
|
+
* raisons, et la seconde est la vraie.
|
|
11
|
+
*
|
|
12
|
+
* 1. Il devient éprouvable ailleurs que dans le terminal où il tourne —
|
|
13
|
+
* c'est-à-dire en intégration continue, où il n'y en a pas.
|
|
14
|
+
* 2. Un rapport qui s'écrit au fil de l'eau ne peut pas se relire lui-même :
|
|
15
|
+
* impossible d'aligner une colonne sur le plus long titre, de regrouper deux
|
|
16
|
+
* contrôles qui partagent une raison, ou de compter ce qu'on vient d'écrire.
|
|
17
|
+
* Le rendu produit donc le document ENTIER avant qu'un seul octet ne sorte.
|
|
18
|
+
*
|
|
19
|
+
* ## Ce que la forme doit au lecteur
|
|
20
|
+
*
|
|
21
|
+
* Un diagnostic se lit en panne, souvent vite, parfois par quelqu'un qui ne
|
|
22
|
+
* connaît pas le projet. Il répond donc dans cet ordre : **où** l'on regarde,
|
|
23
|
+
* **l'état de chaque famille** d'un coup d'œil, le **détail** de ce qui ne va
|
|
24
|
+
* pas, ce qui n'a **pas pu être regardé**, puis un bilan chiffré. Rien d'autre :
|
|
25
|
+
* ce qui va bien ne se commente pas, et le bruit finit par masquer le signal.
|
|
26
|
+
*/
|
|
27
|
+
/** L'indentation du corps, alignée sous le titre des lignes à puce. */
|
|
28
|
+
/**
|
|
29
|
+
* L'indentation du CONTENU d'un item.
|
|
30
|
+
*
|
|
31
|
+
* Le rendu tient sur une grille unique : un item commence colonne 4 (symbole ou
|
|
32
|
+
* numéro), son contenu colonne 7. Trois indentations différentes cohabitaient,
|
|
33
|
+
* et l'œil ne savait plus ce qui appartenait à quoi.
|
|
34
|
+
*/
|
|
35
|
+
const BODY = " ";
|
|
36
|
+
/** L'indentation d'un ITEM — symbole, numéro, titre. */
|
|
37
|
+
const ITEM = " ";
|
|
38
|
+
/**
|
|
39
|
+
* Au-delà de cette longueur, une commande occupe sa ligne SEULE.
|
|
40
|
+
*
|
|
41
|
+
* Elle cesse alors de fixer la colonne où s'aligne la glose des autres.
|
|
42
|
+
*/
|
|
43
|
+
const ACTION_COLUMN_MAX = 28;
|
|
44
|
+
/** Au-delà, une énumération cesse d'informer et se met à noyer le rapport. */
|
|
45
|
+
const PUCES_MAX = 3;
|
|
46
|
+
/**
|
|
47
|
+
* Une énumération BORNÉE, qui dit combien elle a tu.
|
|
48
|
+
*
|
|
49
|
+
* Le bilan d'un démarrage peut porter huit modules écartés et quatre messages
|
|
50
|
+
* critiques : quarante lignes qui repoussaient le reste du rapport hors de
|
|
51
|
+
* l'écran. Les trois premières suffisent à reconnaître le motif ; le compte
|
|
52
|
+
* total est déjà donné juste au-dessus, et le fichier de bilan porte le reste.
|
|
53
|
+
*
|
|
54
|
+
* @param items - les lignes à énumérer, déjà peintes.
|
|
55
|
+
* @param p - la peinture.
|
|
56
|
+
* @returns les puces, plus une mention du reste s'il y en a.
|
|
57
|
+
*/
|
|
58
|
+
function firstFew(items, p) {
|
|
59
|
+
const lines = items.slice(0, PUCES_MAX).map((text) => `${BODY} · ${text}`);
|
|
60
|
+
const remainder = items.length - PUCES_MAX;
|
|
61
|
+
if (remainder > 0) lines.push(p.dim(`${BODY} · … et ${pluralize(remainder, "autre")}`));
|
|
62
|
+
return lines;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Un bilan de démarrage mérite d'être rapporté quand il porte une MAUVAISE
|
|
66
|
+
* nouvelle.
|
|
67
|
+
*
|
|
68
|
+
* Un démarrage abouti, complet et sans brique manquante ne se commente pas :
|
|
69
|
+
* l'afficher à chaque contrôle serait du bruit. Les avertissements seuls ne
|
|
70
|
+
* suffisent pas non plus à déclencher — un boot de développement en produit
|
|
71
|
+
* régulièrement.
|
|
72
|
+
*
|
|
73
|
+
* @param entry - le bilan lu.
|
|
74
|
+
* @returns `true` s'il y a quelque chose à dire.
|
|
75
|
+
*/
|
|
76
|
+
function worthReporting(entry) {
|
|
77
|
+
return entry.status === "failed" || entry.healthy === false || Boolean(entry.bricksSkipped?.length) || Boolean(entry.errors);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Regroupe les contrôles sautés qui partagent la MÊME raison.
|
|
81
|
+
*
|
|
82
|
+
* Hors d'une application, quatre familles sont sautées pour un seul et même
|
|
83
|
+
* motif. Les énumérer une par une répète quatre fois la même phrase et le même
|
|
84
|
+
* geste : le lecteur croit à quatre problèmes distincts et cesse de lire avant
|
|
85
|
+
* la fin. Une seule entrée, quatre titres, un geste.
|
|
86
|
+
*
|
|
87
|
+
* @param skipped - les contrôles sautés, dans l'ordre de lecture.
|
|
88
|
+
* @returns un groupe par raison distincte, l'ordre du premier membre conservé.
|
|
89
|
+
*/
|
|
90
|
+
function groupByReason(skipped) {
|
|
91
|
+
const groups = [];
|
|
92
|
+
for (const check of skipped) {
|
|
93
|
+
const existing = groups.find((g) => g.reason === check.reason && g.unlock === check.unlock);
|
|
94
|
+
if (existing) existing.titles.push(check.title);
|
|
95
|
+
else groups.push({
|
|
96
|
+
titles: [check.title],
|
|
97
|
+
reason: check.reason,
|
|
98
|
+
unlock: check.unlock
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return groups;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Le document complet, ligne par ligne, sans retour chariot final.
|
|
105
|
+
*
|
|
106
|
+
* @param report - le diagnostic collecté.
|
|
107
|
+
* @param opts - le décor de rendu (largeur, couleur, instant).
|
|
108
|
+
* @returns les lignes à écrire, dans l'ordre.
|
|
109
|
+
*/
|
|
110
|
+
function renderReport(report, opts) {
|
|
111
|
+
const { width, color, now, strict } = opts;
|
|
112
|
+
const p = createPalette(color);
|
|
113
|
+
const lines = [];
|
|
114
|
+
const skipped = skippedChecks(report.execution);
|
|
115
|
+
/** Ouvre une section : un titre, prolongé par un filet jusqu'au bord. */
|
|
116
|
+
const section = (name, teinte) => {
|
|
117
|
+
const { title, divider: trait } = sectionTitle(name, width);
|
|
118
|
+
lines.push("", teinte(p.strong(title)) + p.dim(trait), "");
|
|
119
|
+
};
|
|
120
|
+
lines.push(...enTete(report, opts, p));
|
|
121
|
+
lines.push(...bandeau(report, skipped, p));
|
|
122
|
+
section("ÉTAT", (t) => t);
|
|
123
|
+
lines.push(...renderSummary(report, p, width));
|
|
124
|
+
const problems = findingGroups(report).filter((g) => g.items.length > 0);
|
|
125
|
+
if (problems.length > 0) {
|
|
126
|
+
section("PROBLÈMES", p.failure);
|
|
127
|
+
const totalProblems = problems.reduce((n, g) => n + g.items.length, 0);
|
|
128
|
+
let index = 0;
|
|
129
|
+
for (const { title, items } of problems) for (const item of items) {
|
|
130
|
+
if (index > 0) lines.push("");
|
|
131
|
+
lines.push(...problemBlock(++index, totalProblems, title, item, p, opts));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (skipped.length > 0) {
|
|
135
|
+
section("NON CONTRÔLÉ", p.warning);
|
|
136
|
+
lines.push(...uncheckedBlocks(skipped, p, opts));
|
|
137
|
+
if (strict) {
|
|
138
|
+
lines.push("");
|
|
139
|
+
const empeches = preventedChecks(skipped);
|
|
140
|
+
for (const l of wrap(empeches.length > 0 ? "mode strict : un contrôle EMPÊCHÉ fait échouer la commande." : skipped.every((c) => c.notApplicable) ? "mode strict : ce qui manque ici n'avait rien à examiner — le code de sortie n'en tient pas compte." : "mode strict : ce qui manque ici n'a pas été demandé, ou n'avait rien à examiner — le code de sortie n'en tient pas compte.", width, BODY)) lines.push(p.dim(l));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const openings = openSurface(report, width, p);
|
|
144
|
+
if (openings.length > 0) {
|
|
145
|
+
section("SURFACE OUVERTE", p.warning);
|
|
146
|
+
lines.push(...openings);
|
|
147
|
+
}
|
|
148
|
+
const retires = manquementsLive(report, "service-lost");
|
|
149
|
+
if (retires.length > 0) {
|
|
150
|
+
section("CE QUE L'ENVIRONNEMENT VISÉ RETIRE", p.warning);
|
|
151
|
+
for (const f of retires) for (const [i, l] of wrap(f.message, width, BODY).entries()) lines.push(i === 0 ? `${ITEM}${p.warning("—")} ${l.trim()}` : l);
|
|
152
|
+
lines.push("");
|
|
153
|
+
for (const l of wrap("Un module `policy: \"dev\"` est ÉCARTÉ là-bas : c'est sa raison d'être, et ces lignes sont alors normales. À regarder seulement si du code servi en production réclame l'un de ces services.", width - 4, " ")) lines.push(p.dim(l));
|
|
154
|
+
}
|
|
155
|
+
const tellingSummaries = report.lastBoots.filter(worthReporting);
|
|
156
|
+
if (tellingSummaries.length > 0) {
|
|
157
|
+
section(tellingSummaries.length > 1 ? "DERNIERS DÉMARRAGES" : "DERNIER DÉMARRAGE", p.warning);
|
|
158
|
+
let premier = true;
|
|
159
|
+
for (const startup of tellingSummaries) {
|
|
160
|
+
if (!premier) lines.push("");
|
|
161
|
+
premier = false;
|
|
162
|
+
lines.push(...lastStartup(startup, now, p, width));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const actions = nextActions(report, skipped);
|
|
166
|
+
if (actions.length > 0) {
|
|
167
|
+
section("À FAIRE ENSUITE", p.action);
|
|
168
|
+
lines.push(...actionList(actions, p, width));
|
|
169
|
+
}
|
|
170
|
+
lines.push("");
|
|
171
|
+
lines.push(...footer(report, skipped, p, width, opts.durationMs));
|
|
172
|
+
lines.push("");
|
|
173
|
+
return lines;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Le VERDICT, avant tout le reste.
|
|
177
|
+
*
|
|
178
|
+
* Il était en bas, et c'était le défaut le plus coûteux de ce rendu : la
|
|
179
|
+
* question qu'on se pose en lançant `doctor` est « est-ce que ça va ? », et
|
|
180
|
+
* elle n'obtenait sa réponse qu'après soixante lignes de détail. Un rapport se
|
|
181
|
+
* lit en panne, souvent vite : il doit répondre à la première ligne, puis
|
|
182
|
+
* justifier.
|
|
183
|
+
*
|
|
184
|
+
* @param report - le diagnostic.
|
|
185
|
+
* @param skipped - les contrôles qui n'ont pas eu lieu.
|
|
186
|
+
* @param p - la peinture.
|
|
187
|
+
* @returns une ligne, plus une ligne vide.
|
|
188
|
+
*/
|
|
189
|
+
function bandeau(report, skipped, p) {
|
|
190
|
+
const total = countFindings(report);
|
|
191
|
+
const passes = passedCheckCount(report);
|
|
192
|
+
if (total > 0) {
|
|
193
|
+
const angles = skipped.length > 0 ? p.warning(` ${pluralize(skipped.length, "angle mort", "angles morts")}`) : "";
|
|
194
|
+
return [p.failure(` ${stateSymbol("echec")} ${p.strong(pluralize(total, "PROBLÈME").toUpperCase())}`) + angles];
|
|
195
|
+
}
|
|
196
|
+
if (passes === 0) return [p.warning(` ${stateSymbol("non-controle")} ${p.strong("AUCUN CONTRÔLE N'A PU ÊTRE FAIT ICI")}`)];
|
|
197
|
+
return [skipped.length > 0 ? p.ok(` ${stateSymbol("ok")} ${p.strong("RIEN À SIGNALER")}`) + p.warning(` (${pluralize(skipped.length, "angle mort", "angles morts")})`) : p.ok(` ${stateSymbol("ok")} ${p.strong("RIEN À SIGNALER")}`)];
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Un problème, rendu comme une erreur de compilateur.
|
|
201
|
+
*
|
|
202
|
+
* La forme vient de ce qui se fait de mieux dans un terminal : un numéro pour
|
|
203
|
+
* s'y référer, le nom de la famille pour savoir DE QUOI on parle, une gouttière
|
|
204
|
+
* qui relie visuellement le constat à son geste, et le geste seul sur sa ligne,
|
|
205
|
+
* préfixé d'un chevron — c'est la seule chose qu'un lecteur pressé cherche, et
|
|
206
|
+
* elle doit se copier sans attraper le reste de la phrase.
|
|
207
|
+
*
|
|
208
|
+
* @param index - le rang du problème dans le rapport.
|
|
209
|
+
* @param family - le titre de la famille dont il vient.
|
|
210
|
+
* @param item - le manquement (message, et le fichier qui le porte).
|
|
211
|
+
* @param p - la peinture.
|
|
212
|
+
* @param opts - le décor (largeur, couleur).
|
|
213
|
+
* @returns les lignes du bloc.
|
|
214
|
+
*/
|
|
215
|
+
function problemBlock(index, total, family, item, p, opts) {
|
|
216
|
+
const { width, color } = opts;
|
|
217
|
+
const { finding, action } = splitAction(item.message);
|
|
218
|
+
const lines = [];
|
|
219
|
+
const rang = String(index).padStart(String(total).length, " ");
|
|
220
|
+
lines.push(`${ITEM}${p.failure(p.strong(rang))} ${p.strong(family)}`);
|
|
221
|
+
const gutter = `${BODY}${p.dim("│")} `;
|
|
222
|
+
for (const l of wrap(finding, width - 10, "")) lines.push(gutter + highlightCode(l, p, color));
|
|
223
|
+
if (item.file) {
|
|
224
|
+
const behindGutter = `${BODY}│ ${item.file}`;
|
|
225
|
+
lines.push(behindGutter.length <= width ? gutter + p.dim(item.file) : `${BODY}${p.dim(item.file)}`);
|
|
226
|
+
}
|
|
227
|
+
lines.push(...actionLine(action, p, width));
|
|
228
|
+
return lines;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Les contrôles qui n'ont pas eu lieu, groupés par cause.
|
|
232
|
+
*
|
|
233
|
+
* @param skipped - les contrôles sautés.
|
|
234
|
+
* @param p - la peinture.
|
|
235
|
+
* @param opts - le décor.
|
|
236
|
+
* @returns les lignes de la section.
|
|
237
|
+
*/
|
|
238
|
+
function uncheckedBlocks(skipped, p, opts) {
|
|
239
|
+
const { width, color } = opts;
|
|
240
|
+
const lines = [];
|
|
241
|
+
let premier = true;
|
|
242
|
+
for (const group of groupByReason(skipped)) {
|
|
243
|
+
if (!premier) lines.push("");
|
|
244
|
+
premier = false;
|
|
245
|
+
const [firstTitle, ...otherTitles] = wrap(group.titles.join(", "), width - 8, "");
|
|
246
|
+
lines.push(`${ITEM}${p.warning(stateSymbol("non-controle"))} ${p.strong(firstTitle ?? "")}`);
|
|
247
|
+
for (const l of otherTitles) lines.push(`${BODY}${p.strong(l)}`);
|
|
248
|
+
const gutter = `${BODY}${p.dim("│")} `;
|
|
249
|
+
for (const l of wrap(group.reason, width - 10, "")) lines.push(gutter + p.warning(highlightCode(l, p, color)));
|
|
250
|
+
lines.push(...actionLine(group.unlock, p, width));
|
|
251
|
+
}
|
|
252
|
+
return lines;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Le geste, seul sur sa ligne, sous un chevron.
|
|
256
|
+
*
|
|
257
|
+
* Les accents graves qui l'entourent dans le message SAUTENT : la ligne est
|
|
258
|
+
* déjà désignée comme une commande par son chevron, et un accent grave collé
|
|
259
|
+
* part avec la commande quand on la copie — puis le terminal se plaint d'un
|
|
260
|
+
* fichier introuvable.
|
|
261
|
+
*
|
|
262
|
+
* @param action - le geste, ou `undefined` s'il n'y en a pas.
|
|
263
|
+
* @param p - la peinture.
|
|
264
|
+
* @param width - largeur utile.
|
|
265
|
+
* @returns les lignes, vides s'il n'y a pas de geste.
|
|
266
|
+
*/
|
|
267
|
+
function actionLine(action, p, width) {
|
|
268
|
+
if (!action) return [];
|
|
269
|
+
const cleaned = action.replace(/`/gu, "").trim();
|
|
270
|
+
return wrap(cleaned, width - 10, "").map((l, i) => i === 0 ? `${BODY}${p.action("▸")} ${p.action(l)}` : `${BODY} ${p.action(l)}`);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Les gestes du rapport, DÉDOUBLONNÉS et ordonnés.
|
|
274
|
+
*
|
|
275
|
+
* C'est ce qui manquait le plus : les gestes étaient dispersés dans le détail,
|
|
276
|
+
* chacun sous son problème, et le même `npm run build` pouvait apparaître trois
|
|
277
|
+
* fois. Un lecteur qui veut agir devait relire tout le rapport pour reconstituer
|
|
278
|
+
* la liste — et un agent, la deviner.
|
|
279
|
+
*
|
|
280
|
+
* L'ordre est celui des problèmes, puis des angles morts : ce qui EMPÊCHE
|
|
281
|
+
* d'abord, ce qui MANQUE ensuite.
|
|
282
|
+
*
|
|
283
|
+
* @param report - le diagnostic.
|
|
284
|
+
* @param skipped - les contrôles sautés.
|
|
285
|
+
* @returns les gestes, sans doublon, dans l'ordre où les faire.
|
|
286
|
+
*/
|
|
287
|
+
function nextActions(report, skipped) {
|
|
288
|
+
const actions = [];
|
|
289
|
+
const vus = /* @__PURE__ */ new Set();
|
|
290
|
+
const add = (command, why) => {
|
|
291
|
+
const cleaned = command.replace(/^`|`$/gu, "").trim();
|
|
292
|
+
if (cleaned === "" || vus.has(cleaned)) return;
|
|
293
|
+
vus.add(cleaned);
|
|
294
|
+
actions.push({
|
|
295
|
+
command: cleaned,
|
|
296
|
+
why
|
|
297
|
+
});
|
|
298
|
+
};
|
|
299
|
+
for (const { title, items } of findingGroups(report)) for (const item of items) {
|
|
300
|
+
const { action } = splitAction(item.message);
|
|
301
|
+
if (action) add(action, title);
|
|
302
|
+
}
|
|
303
|
+
for (const group of groupByReason(skipped)) if (group.unlock) add(group.unlock, group.titles.join(", "));
|
|
304
|
+
return actions;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Ce qu'un geste répare, rendu SOUS lui quand il ne tient pas à sa droite.
|
|
308
|
+
*
|
|
309
|
+
* @param why - la famille que ce geste referme.
|
|
310
|
+
* @param indent - l'indentation, alignée sous la commande.
|
|
311
|
+
* @param width - largeur utile du terminal.
|
|
312
|
+
* @param p - la peinture.
|
|
313
|
+
* @returns les lignes, repliées pour ne jamais déborder.
|
|
314
|
+
*/
|
|
315
|
+
function underAction(why, indent, width, p) {
|
|
316
|
+
return wrap(why, width - indent.length, "").map((l) => indent + p.dim(l));
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* La liste des gestes, numérotée et alignée.
|
|
320
|
+
*
|
|
321
|
+
* @param actions - les gestes, déjà dédoublonnés.
|
|
322
|
+
* @param p - la peinture.
|
|
323
|
+
* @param width - largeur utile.
|
|
324
|
+
* @returns les lignes de la section.
|
|
325
|
+
*/
|
|
326
|
+
function actionList(actions, p, width) {
|
|
327
|
+
const shortLengths = actions.map((g) => g.command.length).filter((n) => n <= ACTION_COLUMN_MAX);
|
|
328
|
+
const column = shortLengths.length > 0 ? Math.max(...shortLengths) : 0;
|
|
329
|
+
const lines = [];
|
|
330
|
+
for (const [i, g] of actions.entries()) {
|
|
331
|
+
const rang = String(i + 1).padStart(String(actions.length).length, " ");
|
|
332
|
+
const indent = ITEM + " ".repeat(rang.length + 2);
|
|
333
|
+
const measure = `${ITEM}${rang} ${g.command}`;
|
|
334
|
+
const overflows = g.command.length > column;
|
|
335
|
+
const glose = overflows ? "" : ` ${" ".repeat(column - g.command.length)}${g.why}`;
|
|
336
|
+
if (measure.length <= width) {
|
|
337
|
+
const debut = `${ITEM}${p.dim(rang)} ${p.action(g.command)}`;
|
|
338
|
+
lines.push(glose !== "" && measure.length + glose.length <= width ? debut + p.dim(glose) : debut);
|
|
339
|
+
if (overflows || measure.length + glose.length > width) lines.push(...underAction(g.why, indent, width, p));
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
const [premiere, ...suite] = wrap(g.command, width - indent.length, "");
|
|
343
|
+
lines.push(`${ITEM}${p.dim(rang)} ${p.action(premiere ?? "")}`);
|
|
344
|
+
for (const l of suite) lines.push(indent + p.action(l));
|
|
345
|
+
lines.push(...underAction(g.why, indent, width, p));
|
|
346
|
+
}
|
|
347
|
+
return lines;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* L'en-tête : QUI est ausculté.
|
|
351
|
+
*
|
|
352
|
+
* Un rapport qui porte sur un autre dossier que celui qu'on croit se lit de
|
|
353
|
+
* travers, dans les deux sens — et c'est le cas normal, puisque la cible est
|
|
354
|
+
* l'APPLICATION et non le dossier où l'on a tapé.
|
|
355
|
+
*/
|
|
356
|
+
function enTete(report, opts, p) {
|
|
357
|
+
const lines = ["", ` ${p.strong("nodefony doctor")}`];
|
|
358
|
+
const name = report.appName;
|
|
359
|
+
if (name) lines[1] += p.dim(` · ${name}`);
|
|
360
|
+
lines.push(p.dim(` ${report.root}`));
|
|
361
|
+
if (opts.targetEnv) lines.push(p.warning(` exigences évaluées pour l'environnement ${opts.targetEnv}`));
|
|
362
|
+
if (opts.launchedFrom && path.resolve(report.root) !== path.resolve(opts.launchedFrom)) lines.push(p.dim(` lancé depuis ${opts.launchedFrom}`));
|
|
363
|
+
lines.push("");
|
|
364
|
+
return lines;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Le sommaire : l'état de chaque famille, d'un coup d'œil.
|
|
368
|
+
*
|
|
369
|
+
* C'est ce qui répond à « y a-t-il un problème, et où ? » sans rien lire
|
|
370
|
+
* d'autre. **L'état d'EXÉCUTION prime toujours sur les trouvailles** : un
|
|
371
|
+
* contrôle qui n'a rien regardé n'a rien trouvé, et l'afficher en vert est le
|
|
372
|
+
* seul mensonge que ce sommaire ne doit jamais dire.
|
|
373
|
+
*/
|
|
374
|
+
function renderSummary(report, p, width) {
|
|
375
|
+
const { freshness, readiness, wiring, findings, scanned, execution } = report;
|
|
376
|
+
const state = (n) => n > 0 ? "echec" : "ok";
|
|
377
|
+
/**
|
|
378
|
+
* Les familles qui REPORTING_ONLY au lieu d'accuser.
|
|
379
|
+
*
|
|
380
|
+
* 🔴 `gating` relève ce que l'environnement visé retire. Qu'un module
|
|
381
|
+
* `policy: "dev"` disparaisse en production est sa raison d'être : le rendre
|
|
382
|
+
* en `✗` faisait passer le fonctionnement NORMAL du produit pour un défaut,
|
|
383
|
+
* et le geste qui suivait — « retire `policy: "dev"` » — aurait embarqué
|
|
384
|
+
* l'outillage de développement en production.
|
|
385
|
+
*/
|
|
386
|
+
const REPORTING_ONLY = /* @__PURE__ */ new Set(["gating"]);
|
|
387
|
+
const line = (family, n, detail) => {
|
|
388
|
+
const exec = execution[family] ?? {
|
|
389
|
+
ran: false,
|
|
390
|
+
short: "état absent"
|
|
391
|
+
};
|
|
392
|
+
return exec.ran ? {
|
|
393
|
+
title: TITLES[family],
|
|
394
|
+
state: n > 0 && REPORTING_ONLY.has(family) ? "avertissement" : state(n),
|
|
395
|
+
detail
|
|
396
|
+
} : {
|
|
397
|
+
title: TITLES[family],
|
|
398
|
+
state: "non-controle",
|
|
399
|
+
detail: exec.short ?? "non contrôlé"
|
|
400
|
+
};
|
|
401
|
+
};
|
|
402
|
+
const detail = {
|
|
403
|
+
freshness: {
|
|
404
|
+
n: freshness.findings.length,
|
|
405
|
+
text: freshness.findings.length > 0 ? pluralize(freshness.findings.length, "écart") : "sources et build alignés"
|
|
406
|
+
},
|
|
407
|
+
readiness: {
|
|
408
|
+
n: readiness.findings.length,
|
|
409
|
+
text: readiness.findings.length > 0 ? pluralize(readiness.findings.length, "manquement") : "environnement, modules, ports"
|
|
410
|
+
},
|
|
411
|
+
envCatalog: {
|
|
412
|
+
n: 0,
|
|
413
|
+
text: ""
|
|
414
|
+
},
|
|
415
|
+
envTracked: {
|
|
416
|
+
n: 0,
|
|
417
|
+
text: ""
|
|
418
|
+
},
|
|
419
|
+
deps: {
|
|
420
|
+
n: findings.length,
|
|
421
|
+
text: findings.length > 0 ? `${pluralize(findings.length, "manquement")} sur ${pluralize(scanned, "paquet")}` : pluralize(scanned, "paquet")
|
|
422
|
+
},
|
|
423
|
+
wiring: {
|
|
424
|
+
n: wiring.findings.length,
|
|
425
|
+
text: wiring.findings.length > 0 ? `${pluralize(wiring.findings.length, "manquement")} sur ${pluralize(wiring.scanned, "classe")}` : `${pluralize(wiring.scanned, "classe")} déclarée${wiring.scanned > 1 ? "s" : ""}`
|
|
426
|
+
},
|
|
427
|
+
surface: {
|
|
428
|
+
n: surfaceFindings(report, "public-area-covers-all").length,
|
|
429
|
+
text: surfaceFindings(report, "public-area-covers-all").length > 0 ? "une zone publique couvre TOUT" : inventaireSurface(report)
|
|
430
|
+
},
|
|
431
|
+
dialect: {
|
|
432
|
+
n: surfaceFindings(report, "entity-other-dialect").length,
|
|
433
|
+
text: surfaceFindings(report, "entity-other-dialect").length > 0 ? `${pluralize(surfaceFindings(report, "entity-other-dialect").length, "entité")} hors dialecte` : `${pluralize(report.surface.entitiesScanned, "entité")} sur ${report.surface.dialect ?? "?"}`
|
|
434
|
+
},
|
|
435
|
+
guards: {
|
|
436
|
+
n: report.guards.findings.length,
|
|
437
|
+
text: report.guards.findings.length > 0 ? `${pluralize(report.guards.findings.length, "garde")} décrochée${report.guards.findings.length > 1 ? "s" : ""}` : armedGuards(report.guards.armed, report.guards.armedNames)
|
|
438
|
+
},
|
|
439
|
+
verify: {
|
|
440
|
+
n: (report.deep?.steps ?? []).filter((s) => s.outcome === "failed").length,
|
|
441
|
+
text: (() => {
|
|
442
|
+
const steps = report.deep?.steps ?? [];
|
|
443
|
+
const failed = steps.filter((s) => s.outcome === "failed");
|
|
444
|
+
const interrupted = steps.filter((s) => s.outcome === "timeout");
|
|
445
|
+
if (failed.length > 0) return failed.map((s) => s.step).join(", ") + " en échec" + (interrupted.length > 0 ? ` (+ ${interrupted.length} interrompu(s) par la borne)` : "");
|
|
446
|
+
if (interrupted.length > 0) return interrupted.map((s) => s.step).join(", ") + " interrompu(s) par la borne — NON CONTRÔLÉ, pas en échec";
|
|
447
|
+
const passes = steps.filter((s) => s.outcome === "passed");
|
|
448
|
+
return passes.length > 0 ? `${passes.map((s) => s.step).join(", ")} au vert` : "aucun script à lancer";
|
|
449
|
+
})()
|
|
450
|
+
},
|
|
451
|
+
outdated: {
|
|
452
|
+
n: report.deep?.outdated?.packages.length ?? 0,
|
|
453
|
+
text: (() => {
|
|
454
|
+
const retard = report.deep?.outdated;
|
|
455
|
+
if (!retard) return "non interrogé";
|
|
456
|
+
const n = retard.packages.length;
|
|
457
|
+
if (n === 0) return "tout est à jour";
|
|
458
|
+
const majeurs = retard.packages.filter((pkg) => pkg.severity === "major").length;
|
|
459
|
+
return majeurs > 0 ? `${pluralize(n, "paquet")} en retard, dont ${majeurs} majeure${majeurs > 1 ? "s" : ""}` : `${pluralize(n, "paquet")} en retard`;
|
|
460
|
+
})()
|
|
461
|
+
},
|
|
462
|
+
migrations: {
|
|
463
|
+
n: manquementsLive(report, "migrations-not-ok").length,
|
|
464
|
+
text: manquementsLive(report, "migrations-not-ok").length > 0 ? pluralize(manquementsLive(report, "migrations-not-ok").length, "écart") : "schéma et historique alignés"
|
|
465
|
+
},
|
|
466
|
+
firewall: {
|
|
467
|
+
n: manquementsLive(report, "firewall-config-invalid").length,
|
|
468
|
+
text: manquementsLive(report, "firewall-config-invalid").length > 0 ? "configuration INVALIDE" : "zones et authentificateurs cohérents"
|
|
469
|
+
},
|
|
470
|
+
gating: {
|
|
471
|
+
n: manquementsLive(report, "service-lost").length,
|
|
472
|
+
text: manquementsLive(report, "service-lost").length > 0 ? pluralize(manquementsLive(report, "service-lost").length, "brique") + " perdue" + (manquementsLive(report, "service-lost").length > 1 ? "s" : "") : modulesEcartes(report).length > 0 ? `${pluralize(modulesEcartes(report).length, "module")} écarté${modulesEcartes(report).length > 1 ? "s" : ""}, rien de perdu` : "rien ne disparaît"
|
|
473
|
+
}
|
|
474
|
+
};
|
|
475
|
+
const lines = FAMILIES.filter((f) => !isSubrule(f) || !execution[f]?.ran && execution.readiness?.ran === true).map((f) => line(f, detail[f].n, detail[f].text));
|
|
476
|
+
const titleWidth = Math.max(...lines.map((l) => l.title.length));
|
|
477
|
+
return lines.map((l) => {
|
|
478
|
+
return (l.state === "echec" ? p.failure : l.state === "ok" ? p.ok : p.warning)(summaryLine(l, titleWidth, width));
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Les manquements de l'étage 2 d'une espèce donnée.
|
|
483
|
+
*
|
|
484
|
+
* Le rapport porte UNE liste ; le sommaire et le détail la découpent par
|
|
485
|
+
* famille. Filtrer ici plutôt que tenir deux listes évite qu'un jour l'une
|
|
486
|
+
* contienne ce que l'autre ignore.
|
|
487
|
+
*
|
|
488
|
+
* @param report - le rapport, dont `live` peut être absent (aucun boot)
|
|
489
|
+
* @param kind - l'espèce de manquement cherchée
|
|
490
|
+
* @returns les manquements de cette espèce, vide si l'étage 2 n'a pas eu lieu
|
|
491
|
+
*/
|
|
492
|
+
function manquementsLive(report, kind) {
|
|
493
|
+
return (report.live?.findings ?? []).filter((f) => f.kind === kind);
|
|
494
|
+
}
|
|
495
|
+
/** Au-delà, la liste cesse d'informer et devient un mur — le reste se demande. */
|
|
496
|
+
const OPENINGS_SHOWN = 12;
|
|
497
|
+
/** Le libellé de chaque espèce d'ouverture, tel qu'il se lit. */
|
|
498
|
+
const OPENING_LABEL = {
|
|
499
|
+
"bypass-firewall": "@BypassFirewall",
|
|
500
|
+
anonymous: "@Anonymous",
|
|
501
|
+
"bypass-option": "bypassFirewall: true",
|
|
502
|
+
"public-area": "zone publique"
|
|
503
|
+
};
|
|
504
|
+
/**
|
|
505
|
+
* L'inventaire de ce qui est atteignable SANS authentification.
|
|
506
|
+
*
|
|
507
|
+
* Rendu en INFORMATION, jamais en verdict : `@BypassFirewall` sur une sonde de
|
|
508
|
+
* vivacité est exactement ce qu'il faut écrire. Le service rendu est de les
|
|
509
|
+
* voir ENSEMBLE, ce qu'aucun outil ne fait aujourd'hui.
|
|
510
|
+
*
|
|
511
|
+
* La liste est BORNÉE : au-delà d'une douzaine de lignes elle cesse d'informer,
|
|
512
|
+
* et le rapport entier devient illisible. Le compte exact reste dit, et le
|
|
513
|
+
* reste s'obtient par `--json` — un rapport qui tronque doit dire où trouver
|
|
514
|
+
* ce qu'il a coupé.
|
|
515
|
+
*/
|
|
516
|
+
function openSurface(report, width, p) {
|
|
517
|
+
const openings = report.surface.openings;
|
|
518
|
+
if (openings.length === 0) return [];
|
|
519
|
+
const lines = [];
|
|
520
|
+
for (const o of openings.slice(0, OPENINGS_SHOWN)) {
|
|
521
|
+
const label = OPENING_LABEL[o.kind] ?? o.kind;
|
|
522
|
+
const quoi = o.what ? `${label} ${o.what}` : label;
|
|
523
|
+
for (const [i, l] of wrap(quoi, width, BODY).entries()) lines.push(i === 0 ? `${ITEM}${p.warning("—")} ${l.trim()}` : l);
|
|
524
|
+
lines.push(p.dim(`${BODY}${o.file}`));
|
|
525
|
+
}
|
|
526
|
+
const remainder = openings.length - OPENINGS_SHOWN;
|
|
527
|
+
if (remainder > 0) {
|
|
528
|
+
lines.push("");
|
|
529
|
+
lines.push(p.dim(`${BODY}… et ${pluralize(remainder, "autre")} — la liste complète : nodefony doctor --json`));
|
|
530
|
+
}
|
|
531
|
+
return lines;
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Les manquements de surface d'une espèce donnée.
|
|
535
|
+
*
|
|
536
|
+
* Le contrôle porte UNE liste ; le sommaire et le détail la découpent par
|
|
537
|
+
* famille. Filtrer ici plutôt que tenir deux listes évite qu'un jour l'une
|
|
538
|
+
* contienne ce que l'autre ignore.
|
|
539
|
+
*/
|
|
540
|
+
function surfaceFindings(report, kind) {
|
|
541
|
+
return report.surface.findings.filter((f) => f.kind === kind);
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* L'inventaire de la surface ouverte, en une ligne.
|
|
545
|
+
*
|
|
546
|
+
* Chaque ouverture est LÉGITIME prise isolément — un `@BypassFirewall` sur une
|
|
547
|
+
* sonde de vivacité, une zone publique sur les pages d'accueil. Ce que
|
|
548
|
+
* personne n'a jamais, c'est le COMPTE : c'est ainsi qu'une route de mise au
|
|
549
|
+
* point reste ouverte en production. La ligne le donne sans accuser.
|
|
550
|
+
*/
|
|
551
|
+
function inventaireSurface(report) {
|
|
552
|
+
const routes = report.surface.openings.filter((o) => o.kind !== "public-area").length;
|
|
553
|
+
const zones = report.surface.openings.length - routes;
|
|
554
|
+
if (routes === 0 && zones === 0) return "rien d'ouvert sans authentification";
|
|
555
|
+
const parts = [];
|
|
556
|
+
if (routes > 0) parts.push(`${pluralize(routes, "route")} ouverte${routes > 1 ? "s" : ""}`);
|
|
557
|
+
if (zones > 0) parts.push(`${pluralize(zones, "zone")} publique${zones > 1 ? "s" : ""}`);
|
|
558
|
+
return parts.join(", ");
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* Les modules que l'environnement visé écarte — une INFORMATION.
|
|
562
|
+
*
|
|
563
|
+
* Elle ne devient jamais un manquement : retirer un module `policy: "dev"` en
|
|
564
|
+
* production est le comportement NORMAL, et un contrôle qui crie sur le cas
|
|
565
|
+
* sain apprend à être ignoré. Elle sert à la ligne du sommaire, qui distingue
|
|
566
|
+
* « rien ne disparaît » de « des modules partent, mais rien n'est perdu ».
|
|
567
|
+
*/
|
|
568
|
+
function modulesEcartes(report) {
|
|
569
|
+
return report.live?.gatedModules ?? [];
|
|
570
|
+
}
|
|
571
|
+
/**
|
|
572
|
+
* Ce que dit la ligne « Gardes du projet » quand tout est armé — les NOMS.
|
|
573
|
+
*
|
|
574
|
+
* 🔴 « 5 gardes armées » se lit comme un quitus et n'apprend rien : le lecteur
|
|
575
|
+
* ne sait ni ce qui est gardé, ni si la garde qu'il croit posée en fait partie.
|
|
576
|
+
* Le compte agrégeait en plus deux natures sans le dire — des scripts du
|
|
577
|
+
* manifeste (`typecheck`, `verify`) et des règles du linter.
|
|
578
|
+
*
|
|
579
|
+
* La ligne du sommaire est étroite : on nomme donc autant de gardes que la
|
|
580
|
+
* place le permet, et l'on DIT combien restent. Un « +3 » est une information ;
|
|
581
|
+
* une liste tronquée par un `…` muet en serait la caricature.
|
|
582
|
+
*
|
|
583
|
+
* @param armed - le nombre total de gardes constatées.
|
|
584
|
+
* @param names - leurs noms, dans l'ordre où le contrôle les a rencontrées.
|
|
585
|
+
* @returns le texte de la ligne.
|
|
586
|
+
*/
|
|
587
|
+
function armedGuards(armed, names) {
|
|
588
|
+
if (armed === 0) return "aucune garde armée";
|
|
589
|
+
if (names.length === 0) return `${pluralize(armed, "garde")} armée${armed > 1 ? "s" : ""}`;
|
|
590
|
+
const shown = names.slice(0, 3);
|
|
591
|
+
const remainder = names.length - shown.length;
|
|
592
|
+
return remainder > 0 ? `${shown.join(", ")} +${remainder}` : shown.join(", ");
|
|
593
|
+
}
|
|
594
|
+
/** Les familles de manquements, dans l'ordre où elles se lisent. */ /** Les familles de manquements, dans l'ordre où elles se lisent. */
|
|
595
|
+
function findingGroups(report) {
|
|
596
|
+
return [
|
|
597
|
+
{
|
|
598
|
+
title: TITLES.freshness,
|
|
599
|
+
items: report.freshness.findings
|
|
600
|
+
},
|
|
601
|
+
{
|
|
602
|
+
title: TITLES.readiness,
|
|
603
|
+
items: report.readiness.findings
|
|
604
|
+
},
|
|
605
|
+
{
|
|
606
|
+
title: TITLES.deps,
|
|
607
|
+
items: report.findings
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
title: TITLES.wiring,
|
|
611
|
+
items: report.wiring.findings
|
|
612
|
+
},
|
|
613
|
+
{
|
|
614
|
+
title: TITLES.surface,
|
|
615
|
+
items: surfaceFindings(report, "public-area-covers-all")
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
title: TITLES.dialect,
|
|
619
|
+
items: surfaceFindings(report, "entity-other-dialect")
|
|
620
|
+
},
|
|
621
|
+
{
|
|
622
|
+
title: TITLES.guards,
|
|
623
|
+
items: report.guards.findings
|
|
624
|
+
},
|
|
625
|
+
{
|
|
626
|
+
title: TITLES.verify,
|
|
627
|
+
items: (report.deep?.steps ?? []).filter((st) => st.outcome === "failed" || st.outcome === "timeout").map((st) => ({ message: st.outcome === "timeout" ? `\`npm run ${st.step}\` n'a PAS pu être contrôlé — interrompu par la borne après ${Math.round(st.ms / 1e3)} s\n → lance-le seul, sans borne : \`npm run ${st.step}\`` : `\`npm run ${st.step}\` a échoué (${Math.round(st.ms / 1e3)} s)` + (st.detail ? ` :\n ${st.detail}` : "") + `\n → relance-le seul pour voir la sortie entière : \`npm run ${st.step}\`` }))
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
title: TITLES.migrations,
|
|
631
|
+
items: manquementsLive(report, "migrations-not-ok").map((f) => ({ message: f.action ? `${f.message}\n → ${f.action}` : f.message }))
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
title: TITLES.firewall,
|
|
635
|
+
items: manquementsLive(report, "firewall-config-invalid").map((f) => ({ message: f.message }))
|
|
636
|
+
}
|
|
637
|
+
];
|
|
638
|
+
}
|
|
639
|
+
/**
|
|
640
|
+
* QUI a démarré, en toutes lettres.
|
|
641
|
+
*
|
|
642
|
+
* « Le dernier démarrage a ÉCHOUÉ » désignait le serveur quel que soit le
|
|
643
|
+
* coupable : un `nodefony inspect` lancé sans son environnement produisait la
|
|
644
|
+
* même phrase, et envoyait chercher là où il n'y a rien. Nommer le profil ET
|
|
645
|
+
* la commande donne les deux choses qui manquaient — qui accuser, et quoi
|
|
646
|
+
* relancer pour reproduire.
|
|
647
|
+
*
|
|
648
|
+
* @param entry - le bilan.
|
|
649
|
+
* @returns « `nodefony inspect` (console) », ou « Le dernier démarrage ».
|
|
650
|
+
*/
|
|
651
|
+
function qui(entry) {
|
|
652
|
+
const profile = entry.profile === "console" ? "console" : entry.profile === "cluster" ? "maître de cluster" : entry.profile === "server" ? "serveur" : "";
|
|
653
|
+
if (!entry.command && !profile) return "Le dernier démarrage";
|
|
654
|
+
if (!entry.command) return `Le dernier démarrage (${profile})`;
|
|
655
|
+
return `\`nodefony ${entry.command}\`${profile ? ` (${profile})` : ""}`;
|
|
656
|
+
}
|
|
657
|
+
/**
|
|
658
|
+
* Le bilan du dernier démarrage, quand il a une mauvaise nouvelle à donner.
|
|
659
|
+
*
|
|
660
|
+
* Placé haut, parce que c'est l'information la plus utile de tout le rapport
|
|
661
|
+
* quand elle existe : celui qui lance `doctor` sur une application qui ne
|
|
662
|
+
* démarre plus cherche exactement ça, et la faire suivre une liste de
|
|
663
|
+
* manquements de câblage reviendrait à la cacher.
|
|
664
|
+
*
|
|
665
|
+
* Il n'entre PAS dans le code de sortie : `doctor` contrôle le CODE, l'état
|
|
666
|
+
* d'un démarrage est un fait d'exécution, souvent déjà réparé au moment où on
|
|
667
|
+
* lit.
|
|
668
|
+
*/
|
|
669
|
+
function lastStartup(entry, now, p, width) {
|
|
670
|
+
const lines = [];
|
|
671
|
+
const age = formatAge(entry.timestamp, now);
|
|
672
|
+
const state = entry.status === "failed" ? "echec" : "avertissement";
|
|
673
|
+
/**
|
|
674
|
+
* Un couple « libellé — valeur », la valeur repliée SOUS elle-même.
|
|
675
|
+
*
|
|
676
|
+
* Une cause de démarrage échoué fait couramment trois cents caractères
|
|
677
|
+
* (message d'erreur, URL de connecteur, cause native). Laissée sur une seule
|
|
678
|
+
* ligne, elle déborde le terminal et se replie sur la marge : la moitié du
|
|
679
|
+
* message se retrouve alignée avec les libellés, et on ne distingue plus ce
|
|
680
|
+
* qui est un champ de ce qui est du texte.
|
|
681
|
+
*/
|
|
682
|
+
const field = (name, value) => {
|
|
683
|
+
const column = 18;
|
|
684
|
+
const indent = BODY + " ".repeat(column);
|
|
685
|
+
const valueLines = wrap(value, width, indent);
|
|
686
|
+
if (valueLines.some((l) => l.length > width)) return [`${BODY}${p.dim(name)}`, ...wrap(value, width, `${BODY} `)];
|
|
687
|
+
const [premiere, ...suite] = valueLines;
|
|
688
|
+
return [`${BODY}${p.dim(name.padEnd(column, " "))}${(premiere ?? "").trimStart()}`, ...suite];
|
|
689
|
+
};
|
|
690
|
+
/** Le titre du bloc, replié comme n'importe quelle autre phrase. */
|
|
691
|
+
const title = (text, teinte) => {
|
|
692
|
+
const [premiere, ...suite] = wrap(text, width, BODY);
|
|
693
|
+
return [teinte(`${ITEM}${stateSymbol(state)} ${(premiere ?? "").trimStart()}`), ...suite.map(teinte)];
|
|
694
|
+
};
|
|
695
|
+
if (entry.status === "failed") {
|
|
696
|
+
lines.push(...title(`${qui(entry)} a ÉCHOUÉ (${age})`, p.failure));
|
|
697
|
+
lines.push(...field("phase atteinte", entry.phase ?? "inconnue"));
|
|
698
|
+
lines.push(...field("environnement", entry.environment));
|
|
699
|
+
if (entry.error) {
|
|
700
|
+
lines.push(...field("cause", `${entry.error.name}: ${entry.error.message}`));
|
|
701
|
+
if (entry.error.exitCode !== void 0) lines.push(...field("code de sortie", String(entry.error.exitCode)));
|
|
702
|
+
}
|
|
703
|
+
} else {
|
|
704
|
+
lines.push(...title(`${qui(entry)} a abouti mais il MANQUE des briques (${age})`, p.warning));
|
|
705
|
+
lines.push(...field("environnement", entry.environment));
|
|
706
|
+
if (entry.healthy === false) lines.push(...field("verdict", p.failure("un profil serveur a fini SANS aucun serveur en écoute")));
|
|
707
|
+
}
|
|
708
|
+
if (entry.bricksSkipped?.length) {
|
|
709
|
+
lines.push(...field("briques ignorées", String(entry.bricksSkipped.length)));
|
|
710
|
+
lines.push(...firstFew(entry.bricksSkipped.map((b) => `${b.module}${b.phase ? p.dim(` (${b.phase})`) : ""} — ${b.reason}`), p));
|
|
711
|
+
}
|
|
712
|
+
if (entry.bricksGated?.length) {
|
|
713
|
+
lines.push(...field("écartées exprès", String(entry.bricksGated.length)));
|
|
714
|
+
lines.push(...firstFew(entry.bricksGated.map((b) => `${b.module} — ${b.reason}`), p));
|
|
715
|
+
}
|
|
716
|
+
if (entry.warnings || entry.errors) lines.push(...field("journal du boot", `${pluralize(entry.warnings ?? 0, "avertissement")}, ${pluralize(entry.errors ?? 0, "erreur")}`));
|
|
717
|
+
if (entry.criticals?.length) {
|
|
718
|
+
const shown = entry.criticals.slice(0, PUCES_MAX);
|
|
719
|
+
for (const message of shown) {
|
|
720
|
+
const [premiere, ...suite] = wrap(message, width, `${BODY} `);
|
|
721
|
+
lines.push(p.failure(`${BODY} · ${(premiere ?? "").trimStart()}`));
|
|
722
|
+
for (const l of suite) lines.push(p.failure(l));
|
|
723
|
+
}
|
|
724
|
+
const remainder = entry.criticals.length - shown.length;
|
|
725
|
+
if (remainder > 0) lines.push(p.dim(`${BODY} · … et ${pluralize(remainder, "autre")}`));
|
|
726
|
+
}
|
|
727
|
+
if (entry.remediation) for (const l of wrap(`→ ${entry.remediation}`, width, BODY)) lines.push(p.action(l));
|
|
728
|
+
lines.push(...field("bilan complet", lastBootFileFor(entry.profile)));
|
|
729
|
+
return lines;
|
|
730
|
+
}
|
|
731
|
+
/**
|
|
732
|
+
* La dernière ligne — celle qu'on retient.
|
|
733
|
+
*
|
|
734
|
+
* Elle doit rester VRAIE dans les trois situations, y compris la plus piégeuse :
|
|
735
|
+
* quand aucun contrôle n'a pu tourner. « Rien à signaler · 0 contrôle passé »
|
|
736
|
+
* s'y lisait comme un succès alors que rien n'avait été regardé.
|
|
737
|
+
*/
|
|
738
|
+
function footer(report, skipped, p, width, durationMs) {
|
|
739
|
+
const total = countFindings(report);
|
|
740
|
+
const passes = passedCheckCount(report);
|
|
741
|
+
/**
|
|
742
|
+
* Un segment du bilan : ce qu'il MESURE, et ce qui s'AFFICHE.
|
|
743
|
+
*
|
|
744
|
+
* Les deux diffèrent dès qu'il y a de la couleur — une séquence ANSI compte
|
|
745
|
+
* pour zéro colonne mais pour plusieurs caractères. Mesurer la version peinte
|
|
746
|
+
* ferait passer une ligne courte pour trop longue, et l'inverse.
|
|
747
|
+
*/
|
|
748
|
+
const seg = (text, teinte) => ({
|
|
749
|
+
measure: text,
|
|
750
|
+
peint: teinte(text)
|
|
751
|
+
});
|
|
752
|
+
const segments = [];
|
|
753
|
+
if (total > 0) {
|
|
754
|
+
segments.push(seg(pluralize(total, "manquement"), p.failure));
|
|
755
|
+
segments.push(seg(pluralize(passes, "contrôle effectué", "contrôles effectués"), (t) => t));
|
|
756
|
+
} else if (passes === 0) segments.push(seg("Aucun contrôle n'a pu être fait ici", p.warning));
|
|
757
|
+
else {
|
|
758
|
+
const exceptions = report.exceptions > 0 ? ` (${pluralize(report.exceptions, "exception")} déclarée${report.exceptions > 1 ? "s" : ""})` : "";
|
|
759
|
+
const phrase = skipped.length > 0 ? `Rien à signaler parmi les ${pluralize(passes, "contrôle effectué", "contrôles effectués")}` : `Rien à signaler sur ${pluralize(passes, "contrôle", "contrôles")}`;
|
|
760
|
+
segments.push({
|
|
761
|
+
measure: phrase + exceptions,
|
|
762
|
+
peint: p.ok(phrase) + p.dim(exceptions)
|
|
763
|
+
});
|
|
764
|
+
}
|
|
765
|
+
if (skipped.length > 0) segments.push(seg(pluralize(skipped.length, "non contrôlé", "non contrôlés"), p.warning));
|
|
766
|
+
if (durationMs !== void 0) {
|
|
767
|
+
const text = durationMs < 1e3 ? `${Math.round(durationMs)} ms` : `${(durationMs / 1e3).toFixed(1)} s`;
|
|
768
|
+
segments.push(seg(text, p.dim));
|
|
769
|
+
}
|
|
770
|
+
if (` ${segments.map((s) => s.measure).join(" · ")}`.length <= width) return [` ${segments.map((s) => s.peint).join(" · ")}`];
|
|
771
|
+
return segments.map((s) => ` ${s.peint}`);
|
|
772
|
+
}
|
|
773
|
+
/** Combien de familles ont réellement regardé — la moitié utile du bilan. */
|
|
774
|
+
function passedCheckCount(report) {
|
|
775
|
+
let n = 0;
|
|
776
|
+
for (const family of COUNTED_FAMILIES) if (report.execution[family]?.ran) n++;
|
|
777
|
+
return n;
|
|
778
|
+
}
|
|
779
|
+
//#endregion
|
|
780
|
+
export { groupByReason, nextActions, qui, renderReport, worthReporting };
|