@wasmsoft/fantastic 1.0.0
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/README.md +65 -0
- package/bin/run.js +27 -0
- package/bin/supervisor.js +65 -0
- package/dist/acquire/central-url.d.ts +9 -0
- package/dist/acquire/central-url.d.ts.map +1 -0
- package/dist/acquire/central-url.js +74 -0
- package/dist/acquire/central-url.js.map +1 -0
- package/dist/acquire/code.d.ts +21 -0
- package/dist/acquire/code.d.ts.map +1 -0
- package/dist/acquire/code.js +66 -0
- package/dist/acquire/code.js.map +1 -0
- package/dist/acquire/compatibility.d.ts +18 -0
- package/dist/acquire/compatibility.d.ts.map +1 -0
- package/dist/acquire/compatibility.js +36 -0
- package/dist/acquire/compatibility.js.map +1 -0
- package/dist/acquire/fetch.d.ts +26 -0
- package/dist/acquire/fetch.d.ts.map +1 -0
- package/dist/acquire/fetch.js +72 -0
- package/dist/acquire/fetch.js.map +1 -0
- package/dist/acquire/latest.d.ts +24 -0
- package/dist/acquire/latest.d.ts.map +1 -0
- package/dist/acquire/latest.js +95 -0
- package/dist/acquire/latest.js.map +1 -0
- package/dist/backup/archive.d.ts +26 -0
- package/dist/backup/archive.d.ts.map +1 -0
- package/dist/backup/archive.js +123 -0
- package/dist/backup/archive.js.map +1 -0
- package/dist/backup/restore.d.ts +46 -0
- package/dist/backup/restore.d.ts.map +1 -0
- package/dist/backup/restore.js +164 -0
- package/dist/backup/restore.js.map +1 -0
- package/dist/base-command.d.ts +54 -0
- package/dist/base-command.d.ts.map +1 -0
- package/dist/base-command.js +120 -0
- package/dist/base-command.js.map +1 -0
- package/dist/bundle-format/index.d.ts +6 -0
- package/dist/bundle-format/index.d.ts.map +1 -0
- package/dist/bundle-format/index.js +36 -0
- package/dist/bundle-format/index.js.map +1 -0
- package/dist/commands/activate.d.ts +15 -0
- package/dist/commands/activate.d.ts.map +1 -0
- package/dist/commands/activate.js +139 -0
- package/dist/commands/activate.js.map +1 -0
- package/dist/commands/backup.d.ts +11 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +75 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/config/get.d.ts +10 -0
- package/dist/commands/config/get.d.ts.map +1 -0
- package/dist/commands/config/get.js +33 -0
- package/dist/commands/config/get.js.map +1 -0
- package/dist/commands/config/list.d.ts +7 -0
- package/dist/commands/config/list.d.ts.map +1 -0
- package/dist/commands/config/list.js +43 -0
- package/dist/commands/config/list.js.map +1 -0
- package/dist/commands/config/set.d.ts +11 -0
- package/dist/commands/config/set.d.ts.map +1 -0
- package/dist/commands/config/set.js +56 -0
- package/dist/commands/config/set.js.map +1 -0
- package/dist/commands/db/migrate.d.ts +10 -0
- package/dist/commands/db/migrate.d.ts.map +1 -0
- package/dist/commands/db/migrate.js +67 -0
- package/dist/commands/db/migrate.js.map +1 -0
- package/dist/commands/dev.d.ts +19 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +149 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/doctor.d.ts +11 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +75 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/health.d.ts +12 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +109 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/install.d.ts +60 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +486 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/iptv/snapshot.d.ts +10 -0
- package/dist/commands/iptv/snapshot.d.ts.map +1 -0
- package/dist/commands/iptv/snapshot.js +55 -0
- package/dist/commands/iptv/snapshot.js.map +1 -0
- package/dist/commands/library/drives.d.ts +7 -0
- package/dist/commands/library/drives.d.ts.map +1 -0
- package/dist/commands/library/drives.js +71 -0
- package/dist/commands/library/drives.js.map +1 -0
- package/dist/commands/library/relink.d.ts +10 -0
- package/dist/commands/library/relink.d.ts.map +1 -0
- package/dist/commands/library/relink.js +72 -0
- package/dist/commands/library/relink.js.map +1 -0
- package/dist/commands/library/scan.d.ts +16 -0
- package/dist/commands/library/scan.d.ts.map +1 -0
- package/dist/commands/library/scan.js +87 -0
- package/dist/commands/library/scan.js.map +1 -0
- package/dist/commands/library/sections.d.ts +7 -0
- package/dist/commands/library/sections.d.ts.map +1 -0
- package/dist/commands/library/sections.js +33 -0
- package/dist/commands/library/sections.js.map +1 -0
- package/dist/commands/library/status.d.ts +7 -0
- package/dist/commands/library/status.d.ts.map +1 -0
- package/dist/commands/library/status.js +37 -0
- package/dist/commands/library/status.js.map +1 -0
- package/dist/commands/list.d.ts +7 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +73 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/live/channels.d.ts +10 -0
- package/dist/commands/live/channels.d.ts.map +1 -0
- package/dist/commands/live/channels.js +55 -0
- package/dist/commands/live/channels.js.map +1 -0
- package/dist/commands/live/test.d.ts +15 -0
- package/dist/commands/live/test.d.ts.map +1 -0
- package/dist/commands/live/test.js +116 -0
- package/dist/commands/live/test.js.map +1 -0
- package/dist/commands/logs.d.ts +16 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +77 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/migrate-cli.d.ts +11 -0
- package/dist/commands/migrate-cli.d.ts.map +1 -0
- package/dist/commands/migrate-cli.js +116 -0
- package/dist/commands/migrate-cli.js.map +1 -0
- package/dist/commands/owner/reset.d.ts +7 -0
- package/dist/commands/owner/reset.d.ts.map +1 -0
- package/dist/commands/owner/reset.js +74 -0
- package/dist/commands/owner/reset.js.map +1 -0
- package/dist/commands/restart.d.ts +11 -0
- package/dist/commands/restart.d.ts.map +1 -0
- package/dist/commands/restart.js +53 -0
- package/dist/commands/restart.js.map +1 -0
- package/dist/commands/restore.d.ts +17 -0
- package/dist/commands/restore.d.ts.map +1 -0
- package/dist/commands/restore.js +148 -0
- package/dist/commands/restore.js.map +1 -0
- package/dist/commands/self-update.d.ts +10 -0
- package/dist/commands/self-update.d.ts.map +1 -0
- package/dist/commands/self-update.js +98 -0
- package/dist/commands/self-update.js.map +1 -0
- package/dist/commands/setup.d.ts +19 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +111 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/shell.d.ts +118 -0
- package/dist/commands/shell.d.ts.map +1 -0
- package/dist/commands/shell.js +415 -0
- package/dist/commands/shell.js.map +1 -0
- package/dist/commands/start.d.ts +12 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +108 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +115 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +11 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +45 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/stream/cancel.d.ts +13 -0
- package/dist/commands/stream/cancel.d.ts.map +1 -0
- package/dist/commands/stream/cancel.js +31 -0
- package/dist/commands/stream/cancel.js.map +1 -0
- package/dist/commands/stream/encoders.d.ts +7 -0
- package/dist/commands/stream/encoders.d.ts.map +1 -0
- package/dist/commands/stream/encoders.js +42 -0
- package/dist/commands/stream/encoders.js.map +1 -0
- package/dist/commands/stream/queue.d.ts +7 -0
- package/dist/commands/stream/queue.d.ts.map +1 -0
- package/dist/commands/stream/queue.js +52 -0
- package/dist/commands/stream/queue.js.map +1 -0
- package/dist/commands/stream/sessions.d.ts +7 -0
- package/dist/commands/stream/sessions.d.ts.map +1 -0
- package/dist/commands/stream/sessions.js +44 -0
- package/dist/commands/stream/sessions.js.map +1 -0
- package/dist/commands/uninstall.d.ts +23 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +290 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +21 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +290 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/watch.d.ts +10 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +38 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config/local-config.d.ts +22 -0
- package/dist/config/local-config.d.ts.map +1 -0
- package/dist/config/local-config.js +79 -0
- package/dist/config/local-config.js.map +1 -0
- package/dist/core-scripts/run.d.ts +22 -0
- package/dist/core-scripts/run.d.ts.map +1 -0
- package/dist/core-scripts/run.js +65 -0
- package/dist/core-scripts/run.js.map +1 -0
- package/dist/doctor/check.types.d.ts +51 -0
- package/dist/doctor/check.types.d.ts.map +1 -0
- package/dist/doctor/check.types.js +14 -0
- package/dist/doctor/check.types.js.map +1 -0
- package/dist/doctor/checks/core.check.d.ts +11 -0
- package/dist/doctor/checks/core.check.d.ts.map +1 -0
- package/dist/doctor/checks/core.check.js +104 -0
- package/dist/doctor/checks/core.check.js.map +1 -0
- package/dist/doctor/checks/data.check.d.ts +11 -0
- package/dist/doctor/checks/data.check.d.ts.map +1 -0
- package/dist/doctor/checks/data.check.js +70 -0
- package/dist/doctor/checks/data.check.js.map +1 -0
- package/dist/doctor/checks/environment.check.d.ts +6 -0
- package/dist/doctor/checks/environment.check.d.ts.map +1 -0
- package/dist/doctor/checks/environment.check.js +70 -0
- package/dist/doctor/checks/environment.check.js.map +1 -0
- package/dist/doctor/checks/integrity.check.d.ts +4 -0
- package/dist/doctor/checks/integrity.check.d.ts.map +1 -0
- package/dist/doctor/checks/integrity.check.js +89 -0
- package/dist/doctor/checks/integrity.check.js.map +1 -0
- package/dist/doctor/checks/isolation.check.d.ts +49 -0
- package/dist/doctor/checks/isolation.check.d.ts.map +1 -0
- package/dist/doctor/checks/isolation.check.js +220 -0
- package/dist/doctor/checks/isolation.check.js.map +1 -0
- package/dist/doctor/checks/licence.check.d.ts +8 -0
- package/dist/doctor/checks/licence.check.d.ts.map +1 -0
- package/dist/doctor/checks/licence.check.js +172 -0
- package/dist/doctor/checks/licence.check.js.map +1 -0
- package/dist/doctor/checks/ports.check.d.ts +4 -0
- package/dist/doctor/checks/ports.check.d.ts.map +1 -0
- package/dist/doctor/checks/ports.check.js +52 -0
- package/dist/doctor/checks/ports.check.js.map +1 -0
- package/dist/doctor/checks/supervisor.check.d.ts +19 -0
- package/dist/doctor/checks/supervisor.check.d.ts.map +1 -0
- package/dist/doctor/checks/supervisor.check.js +152 -0
- package/dist/doctor/checks/supervisor.check.js.map +1 -0
- package/dist/doctor/checks/tooling.check.d.ts +3 -0
- package/dist/doctor/checks/tooling.check.d.ts.map +1 -0
- package/dist/doctor/checks/tooling.check.js +43 -0
- package/dist/doctor/checks/tooling.check.js.map +1 -0
- package/dist/doctor/registry.d.ts +15 -0
- package/dist/doctor/registry.d.ts.map +1 -0
- package/dist/doctor/registry.js +53 -0
- package/dist/doctor/registry.js.map +1 -0
- package/dist/exit-codes.d.ts +18 -0
- package/dist/exit-codes.d.ts.map +1 -0
- package/dist/exit-codes.js +23 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/logs/sink.d.ts +11 -0
- package/dist/logs/sink.d.ts.map +1 -0
- package/dist/logs/sink.js +73 -0
- package/dist/logs/sink.js.map +1 -0
- package/dist/logs/tail.d.ts +17 -0
- package/dist/logs/tail.d.ts.map +1 -0
- package/dist/logs/tail.js +98 -0
- package/dist/logs/tail.js.map +1 -0
- package/dist/packaging/boot-task.d.ts +56 -0
- package/dist/packaging/boot-task.d.ts.map +1 -0
- package/dist/packaging/boot-task.js +151 -0
- package/dist/packaging/boot-task.js.map +1 -0
- package/dist/packaging/install.d.ts +154 -0
- package/dist/packaging/install.d.ts.map +1 -0
- package/dist/packaging/install.js +381 -0
- package/dist/packaging/install.js.map +1 -0
- package/dist/packaging/layout.d.ts +153 -0
- package/dist/packaging/layout.d.ts.map +1 -0
- package/dist/packaging/layout.js +168 -0
- package/dist/packaging/layout.js.map +1 -0
- package/dist/packaging/machine-path.d.ts +52 -0
- package/dist/packaging/machine-path.d.ts.map +1 -0
- package/dist/packaging/machine-path.js +237 -0
- package/dist/packaging/machine-path.js.map +1 -0
- package/dist/packaging/manifest.d.ts +37 -0
- package/dist/packaging/manifest.d.ts.map +1 -0
- package/dist/packaging/manifest.js +115 -0
- package/dist/packaging/manifest.js.map +1 -0
- package/dist/packaging/shims.d.ts +31 -0
- package/dist/packaging/shims.d.ts.map +1 -0
- package/dist/packaging/shims.js +165 -0
- package/dist/packaging/shims.js.map +1 -0
- package/dist/probes/internal-paths.d.ts +35 -0
- package/dist/probes/internal-paths.d.ts.map +1 -0
- package/dist/probes/internal-paths.js +58 -0
- package/dist/probes/internal-paths.js.map +1 -0
- package/dist/probes/internal.client.d.ts +54 -0
- package/dist/probes/internal.client.d.ts.map +1 -0
- package/dist/probes/internal.client.js +123 -0
- package/dist/probes/internal.client.js.map +1 -0
- package/dist/probes/port.probe.d.ts +21 -0
- package/dist/probes/port.probe.d.ts.map +1 -0
- package/dist/probes/port.probe.js +42 -0
- package/dist/probes/port.probe.js.map +1 -0
- package/dist/probes/service.probe.d.ts +29 -0
- package/dist/probes/service.probe.d.ts.map +1 -0
- package/dist/probes/service.probe.js +65 -0
- package/dist/probes/service.probe.js.map +1 -0
- package/dist/profiles/appliance.profile.d.ts +20 -0
- package/dist/profiles/appliance.profile.d.ts.map +1 -0
- package/dist/profiles/appliance.profile.js +137 -0
- package/dist/profiles/appliance.profile.js.map +1 -0
- package/dist/profiles/dev.profile.d.ts +22 -0
- package/dist/profiles/dev.profile.d.ts.map +1 -0
- package/dist/profiles/dev.profile.js +104 -0
- package/dist/profiles/dev.profile.js.map +1 -0
- package/dist/profiles/resolve.d.ts +37 -0
- package/dist/profiles/resolve.d.ts.map +1 -0
- package/dist/profiles/resolve.js +198 -0
- package/dist/profiles/resolve.js.map +1 -0
- package/dist/profiles/types.d.ts +57 -0
- package/dist/profiles/types.d.ts.map +1 -0
- package/dist/profiles/types.js +15 -0
- package/dist/profiles/types.js.map +1 -0
- package/dist/registry/local-registry.d.ts +79 -0
- package/dist/registry/local-registry.d.ts.map +1 -0
- package/dist/registry/local-registry.js +252 -0
- package/dist/registry/local-registry.js.map +1 -0
- package/dist/render/banner.d.ts +13 -0
- package/dist/render/banner.d.ts.map +1 -0
- package/dist/render/banner.js +83 -0
- package/dist/render/banner.js.map +1 -0
- package/dist/render/boot.render.d.ts +123 -0
- package/dist/render/boot.render.d.ts.map +1 -0
- package/dist/render/boot.render.js +288 -0
- package/dist/render/boot.render.js.map +1 -0
- package/dist/render/brand.d.ts +16 -0
- package/dist/render/brand.d.ts.map +1 -0
- package/dist/render/brand.js +22 -0
- package/dist/render/brand.js.map +1 -0
- package/dist/render/doctor.render.d.ts +12 -0
- package/dist/render/doctor.render.d.ts.map +1 -0
- package/dist/render/doctor.render.js +95 -0
- package/dist/render/doctor.render.js.map +1 -0
- package/dist/render/json.d.ts +29 -0
- package/dist/render/json.d.ts.map +1 -0
- package/dist/render/json.js +19 -0
- package/dist/render/json.js.map +1 -0
- package/dist/render/licence.render.d.ts +10 -0
- package/dist/render/licence.render.d.ts.map +1 -0
- package/dist/render/licence.render.js +167 -0
- package/dist/render/licence.render.js.map +1 -0
- package/dist/render/status.render.d.ts +6 -0
- package/dist/render/status.render.d.ts.map +1 -0
- package/dist/render/status.render.js +52 -0
- package/dist/render/status.render.js.map +1 -0
- package/dist/render/theme.d.ts +66 -0
- package/dist/render/theme.d.ts.map +1 -0
- package/dist/render/theme.js +89 -0
- package/dist/render/theme.js.map +1 -0
- package/dist/runtime-guard.d.ts +19 -0
- package/dist/runtime-guard.d.ts.map +1 -0
- package/dist/runtime-guard.js +57 -0
- package/dist/runtime-guard.js.map +1 -0
- package/dist/shell/input-mode.d.ts +25 -0
- package/dist/shell/input-mode.d.ts.map +1 -0
- package/dist/shell/input-mode.js +17 -0
- package/dist/shell/input-mode.js.map +1 -0
- package/dist/shell/parse-line.d.ts +6 -0
- package/dist/shell/parse-line.d.ts.map +1 -0
- package/dist/shell/parse-line.js +62 -0
- package/dist/shell/parse-line.js.map +1 -0
- package/dist/shell/suggestions.d.ts +14 -0
- package/dist/shell/suggestions.d.ts.map +1 -0
- package/dist/shell/suggestions.js +35 -0
- package/dist/shell/suggestions.js.map +1 -0
- package/dist/supervisor/dependencies.d.ts +2 -0
- package/dist/supervisor/dependencies.d.ts.map +1 -0
- package/dist/supervisor/dependencies.js +38 -0
- package/dist/supervisor/dependencies.js.map +1 -0
- package/dist/supervisor/entry.d.ts +36 -0
- package/dist/supervisor/entry.d.ts.map +1 -0
- package/dist/supervisor/entry.js +171 -0
- package/dist/supervisor/entry.js.map +1 -0
- package/dist/supervisor/inspect.d.ts +17 -0
- package/dist/supervisor/inspect.d.ts.map +1 -0
- package/dist/supervisor/inspect.js +39 -0
- package/dist/supervisor/inspect.js.map +1 -0
- package/dist/supervisor/invocation.d.ts +27 -0
- package/dist/supervisor/invocation.d.ts.map +1 -0
- package/dist/supervisor/invocation.js +33 -0
- package/dist/supervisor/invocation.js.map +1 -0
- package/dist/supervisor/monitor.d.ts +63 -0
- package/dist/supervisor/monitor.d.ts.map +1 -0
- package/dist/supervisor/monitor.js +141 -0
- package/dist/supervisor/monitor.js.map +1 -0
- package/dist/supervisor/orchestrator.d.ts +52 -0
- package/dist/supervisor/orchestrator.d.ts.map +1 -0
- package/dist/supervisor/orchestrator.js +154 -0
- package/dist/supervisor/orchestrator.js.map +1 -0
- package/dist/supervisor/pidfile.d.ts +21 -0
- package/dist/supervisor/pidfile.d.ts.map +1 -0
- package/dist/supervisor/pidfile.js +39 -0
- package/dist/supervisor/pidfile.js.map +1 -0
- package/dist/supervisor/process-identity.d.ts +19 -0
- package/dist/supervisor/process-identity.d.ts.map +1 -0
- package/dist/supervisor/process-identity.js +51 -0
- package/dist/supervisor/process-identity.js.map +1 -0
- package/dist/supervisor/readiness.d.ts +17 -0
- package/dist/supervisor/readiness.d.ts.map +1 -0
- package/dist/supervisor/readiness.js +52 -0
- package/dist/supervisor/readiness.js.map +1 -0
- package/dist/supervisor/restart-consumer.d.ts +37 -0
- package/dist/supervisor/restart-consumer.d.ts.map +1 -0
- package/dist/supervisor/restart-consumer.js +119 -0
- package/dist/supervisor/restart-consumer.js.map +1 -0
- package/dist/supervisor/runner.d.ts +2 -0
- package/dist/supervisor/runner.d.ts.map +1 -0
- package/dist/supervisor/runner.js +118 -0
- package/dist/supervisor/runner.js.map +1 -0
- package/dist/supervisor/schedule-timer.d.ts +38 -0
- package/dist/supervisor/schedule-timer.d.ts.map +1 -0
- package/dist/supervisor/schedule-timer.js +148 -0
- package/dist/supervisor/schedule-timer.js.map +1 -0
- package/dist/supervisor/spawn.d.ts +18 -0
- package/dist/supervisor/spawn.d.ts.map +1 -0
- package/dist/supervisor/spawn.js +119 -0
- package/dist/supervisor/spawn.js.map +1 -0
- package/dist/supervisor/state-files.d.ts +33 -0
- package/dist/supervisor/state-files.d.ts.map +1 -0
- package/dist/supervisor/state-files.js +110 -0
- package/dist/supervisor/state-files.js.map +1 -0
- package/dist/supervisor/tree-kill.d.ts +14 -0
- package/dist/supervisor/tree-kill.d.ts.map +1 -0
- package/dist/supervisor/tree-kill.js +82 -0
- package/dist/supervisor/tree-kill.js.map +1 -0
- package/dist/ui/health-panel.d.ts +8 -0
- package/dist/ui/health-panel.d.ts.map +1 -0
- package/dist/ui/health-panel.js +91 -0
- package/dist/ui/health-panel.js.map +1 -0
- package/dist/updating/apply.d.ts +50 -0
- package/dist/updating/apply.d.ts.map +1 -0
- package/dist/updating/apply.js +172 -0
- package/dist/updating/apply.js.map +1 -0
- package/dist/updating/download.d.ts +44 -0
- package/dist/updating/download.d.ts.map +1 -0
- package/dist/updating/download.js +144 -0
- package/dist/updating/download.js.map +1 -0
- package/dist/updating/rollback.d.ts +33 -0
- package/dist/updating/rollback.d.ts.map +1 -0
- package/dist/updating/rollback.js +54 -0
- package/dist/updating/rollback.js.map +1 -0
- package/dist/updating/self.d.ts +16 -0
- package/dist/updating/self.d.ts.map +1 -0
- package/dist/updating/self.js +50 -0
- package/dist/updating/self.js.map +1 -0
- package/dist/updating/verify.d.ts +25 -0
- package/dist/updating/verify.d.ts.map +1 -0
- package/dist/updating/verify.js +51 -0
- package/dist/updating/verify.js.map +1 -0
- package/dist/updating/versions.d.ts +31 -0
- package/dist/updating/versions.d.ts.map +1 -0
- package/dist/updating/versions.js +78 -0
- package/dist/updating/versions.js.map +1 -0
- package/dist/version.d.ts +4 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +29 -0
- package/dist/version.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { networkInterfaces } from "node:os";
|
|
2
|
+
import { c, glyph, NOT_REPORTED } from "./theme.js";
|
|
3
|
+
// AR: عارضات الإقلاع والإيقاف. تنسيق فقط: لا تسأل شبكة ولا تقرأ حالة، بل تتلقّى النتيجة وترسمها.
|
|
4
|
+
// EN: Boot and shutdown renderers. Formatting only: they query nothing and read no state, they take
|
|
5
|
+
// the outcome and draw it.
|
|
6
|
+
/**
|
|
7
|
+
* AR: أسماء الواجهات الافتراضية. **البطاقة الموجودة في ويندوز لا تعني شبكةً موجودة في الغرفة.**
|
|
8
|
+
* VirtualBox وVMware وHyper-V وWSL وDocker كلّها تُنشئ واجهات دائمة لها عناوين IPv4 سليمة
|
|
9
|
+
* تمامًا لا يصل إليها هاتفٌ على شبكة الاستراحة أبدًا.
|
|
10
|
+
* EN: Virtual interface names. **A card present in Windows does not mean a network present in the
|
|
11
|
+
* room.** VirtualBox, VMware, Hyper-V, WSL and Docker all create permanent interfaces with
|
|
12
|
+
* perfectly valid IPv4 addresses that a phone on the rest-house network can never reach.
|
|
13
|
+
*/
|
|
14
|
+
const VIRTUAL_INTERFACE = /virtualbox|vmware|hyper-?v|vethernet|wsl|docker|tailscale|zerotier|tap|tun|loopback|bluetooth/i;
|
|
15
|
+
/**
|
|
16
|
+
* AR: نطاق 192.168.56.0/24 هو المدى الافتراضي لشبكة VirtualBox المضيفة فقط، وهو موثّق عندهم.
|
|
17
|
+
* يُخفَّض ترتيبه لا يُحذَف: لو كان راوتر الاستراحة عليه فعلًا فهو المرشّح الوحيد ويظهر.
|
|
18
|
+
* EN: `192.168.56.0/24` is VirtualBox's documented host-only default range. It is demoted rather
|
|
19
|
+
* than dropped: if the rest-house router really sits on it, it is the only candidate and shows.
|
|
20
|
+
*/
|
|
21
|
+
const VIRTUALBOX_HOST_ONLY = /^192\.168\.56\./;
|
|
22
|
+
/** 169.254.x.x يعني «لم أحصل على عنوان» — بطاقةٌ بلا شبكة، لا شبكة بعنوان. */
|
|
23
|
+
const LINK_LOCAL = /^169\.254\./;
|
|
24
|
+
/**
|
|
25
|
+
* AR: كم يشبه هذا العنوان شبكةً حقيقية؟ الأعلى أولى.
|
|
26
|
+
*
|
|
27
|
+
* الترتيب من الواقع لا من الأناقة: راوترات المنازل والاستراحات على 192.168.x في الغالب
|
|
28
|
+
* الأعمّ، ثم 10.x في الشبكات المُدارة، و172.16–31.x أخيرًا لأنه — رغم كونه مدًى خاصًّا
|
|
29
|
+
* صحيحًا — هو المدى الذي تحجزه Docker وWSL لنفسها على أجهزة ويندوز.
|
|
30
|
+
* EN: How much does this address look like a real network? Higher wins.
|
|
31
|
+
*
|
|
32
|
+
* The order comes from reality rather than elegance: home and rest-house routers are
|
|
33
|
+
* overwhelmingly on `192.168.x`, then `10.x` on managed networks, and `172.16–31.x` last
|
|
34
|
+
* because — valid private range though it is — it is the range Docker and WSL reserve for
|
|
35
|
+
* themselves on Windows machines.
|
|
36
|
+
*/
|
|
37
|
+
function rankAddress(address, interfaceName) {
|
|
38
|
+
let score = 0;
|
|
39
|
+
if (VIRTUAL_INTERFACE.test(interfaceName))
|
|
40
|
+
score -= 100;
|
|
41
|
+
if (VIRTUALBOX_HOST_ONLY.test(address))
|
|
42
|
+
score -= 50;
|
|
43
|
+
if (address.startsWith("192.168."))
|
|
44
|
+
score += 30;
|
|
45
|
+
else if (address.startsWith("10."))
|
|
46
|
+
score += 20;
|
|
47
|
+
else if (/^172\.(1[6-9]|2\d|3[01])\./.test(address))
|
|
48
|
+
score += 10;
|
|
49
|
+
return score;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* AR: عناوين هذه الآلة على الشبكة، **مرتّبةً بالأرجحية**.
|
|
53
|
+
*
|
|
54
|
+
* كانت الدالّة تُعيد «أوّل عنوان IPv4 غير محلّي» — وهو ترتيبُ ويندوز لبطاقاته لا ترتيبُ
|
|
55
|
+
* صلاحيتها. على آلة الاختبار كان الأوّل 192.168.56.1 (بطاقة VirtualBox المضيفة) بينما
|
|
56
|
+
* الشبكة الحقيقية 192.168.1.6 على الواي-فاي؛ فالسطر المعروض للمالك ليكتبه في هاتفه كان
|
|
57
|
+
* عنوانًا **لا يفتح شيئًا من أي هاتف** — وهو أسوأ من غياب السطر، لأن الفشل يُقرأ عطبًا في
|
|
58
|
+
* النظام لا خطأً في العنوان.
|
|
59
|
+
* EN: This machine's addresses on the network, **ordered by likelihood**.
|
|
60
|
+
*
|
|
61
|
+
* The function used to return "the first non-internal IPv4" — which is Windows' ordering of its
|
|
62
|
+
* cards, not an ordering of their usefulness. On the test machine the first was `192.168.56.1`
|
|
63
|
+
* (VirtualBox's host-only card) while the real network was `192.168.1.6` over Wi-Fi; so the line
|
|
64
|
+
* printed for the owner to type into his phone was an address that **opens nothing from any
|
|
65
|
+
* phone** — worse than no line at all, because the failure reads as a fault in the system rather
|
|
66
|
+
* than a wrong address.
|
|
67
|
+
*/
|
|
68
|
+
export function lanAddresses() {
|
|
69
|
+
return rankLanAddresses(networkInterfaces());
|
|
70
|
+
}
|
|
71
|
+
/** نواة الترتيب، مفصولةً عن os لتُختبَر بواجهاتٍ مُصطنعة بدل شبكة آلة البناء. */
|
|
72
|
+
export function rankLanAddresses(interfaces) {
|
|
73
|
+
const candidates = [];
|
|
74
|
+
for (const [name, addresses] of Object.entries(interfaces)) {
|
|
75
|
+
for (const address of addresses ?? []) {
|
|
76
|
+
if (address.family !== "IPv4" || address.internal)
|
|
77
|
+
continue;
|
|
78
|
+
if (LINK_LOCAL.test(address.address))
|
|
79
|
+
continue;
|
|
80
|
+
candidates.push({ address: address.address, score: rankAddress(address.address, name) });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return candidates.sort((a, b) => b.score - a.score).map((candidate) => candidate.address);
|
|
84
|
+
}
|
|
85
|
+
/** أرجح عنوان: هو ما يكتبه المالك في هاتفه للدخول على الجهاز من الشبكة. */
|
|
86
|
+
export function lanAddress() {
|
|
87
|
+
return lanAddresses()[0];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* AR: منفذ الواجهة في ملفّ التشغيل هذا. في appliance لا عملية واجهة — النواة تخدمها ملفات ثابتة،
|
|
91
|
+
* فالعنوان عنوان النواة.
|
|
92
|
+
* EN: The portal's port under this profile. In appliance mode there is no portal process — the core
|
|
93
|
+
* serves it as static files, so the address is the core's.
|
|
94
|
+
*/
|
|
95
|
+
function portalPort(profile) {
|
|
96
|
+
const portal = profile.services.find((service) => service.name === "portal");
|
|
97
|
+
const core = profile.services.find((service) => service.name === "core");
|
|
98
|
+
return portal?.port ?? core?.port;
|
|
99
|
+
}
|
|
100
|
+
/** المنفذ ٨٠ لا يُكتب في متصفّح، وما عداه يجب أن يُكتب. */
|
|
101
|
+
function portSuffix(port) {
|
|
102
|
+
return port === 80 ? "" : `:${port}`;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* AR: عنوان شاشة التفعيل على هذه الآلة. يُطبع كلّما كان الجهاز محجوبًا: **الرسالة التي تقول
|
|
106
|
+
* «غير مفعَّل» بلا عنوانٍ يُفتح تترك الفنّي يخمّن المسار.** undefined حين لا منفذ في
|
|
107
|
+
* ملفّ التشغيل أصلًا.
|
|
108
|
+
* EN: The activation screen's address on this machine. Printed whenever the appliance is blocked:
|
|
109
|
+
* **a message saying "not activated" without an address to open leaves the technician guessing
|
|
110
|
+
* the path.** `undefined` when the profile has no port at all.
|
|
111
|
+
*/
|
|
112
|
+
export function activationUrl(profile) {
|
|
113
|
+
const port = portalPort(profile);
|
|
114
|
+
return port ? `http://localhost${portSuffix(port)}/activate` : undefined;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* AR: العناوين كبيانات لا كنصّ مرسوم. مصدرٌ واحد يقرأه الجدولُ في الطرفية و--json معًا، فلا
|
|
118
|
+
* يقول أحدهما /admin ويسكت الآخر عنه يوم يتغيّر مسار.
|
|
119
|
+
* EN: The addresses as data rather than drawn text. One source read by both the terminal table and
|
|
120
|
+
* `--json`, so one of them cannot say `/admin` while the other stays silent about it the day a
|
|
121
|
+
* path changes.
|
|
122
|
+
*/
|
|
123
|
+
export function portalUrls(profile) {
|
|
124
|
+
const port = portalPort(profile);
|
|
125
|
+
if (!port)
|
|
126
|
+
return null;
|
|
127
|
+
const suffix = portSuffix(port);
|
|
128
|
+
const [lan, ...alternates] = lanAddresses();
|
|
129
|
+
return {
|
|
130
|
+
portal: `http://localhost${suffix}/`,
|
|
131
|
+
login: `http://localhost${suffix}/login`,
|
|
132
|
+
dashboard: `http://localhost${suffix}/admin`,
|
|
133
|
+
network: lan ? `http://${lan}${suffix}/` : null,
|
|
134
|
+
networkAlternates: alternates.map((address) => `http://${address}${suffix}/`),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
export function renderUrls(profile) {
|
|
138
|
+
const urls = portalUrls(profile);
|
|
139
|
+
if (!urls)
|
|
140
|
+
return "";
|
|
141
|
+
const rows = [
|
|
142
|
+
["Portal", urls.portal],
|
|
143
|
+
["Login", urls.login],
|
|
144
|
+
["Dashboard", urls.dashboard],
|
|
145
|
+
];
|
|
146
|
+
// العنوان على الشبكة يغيب حين لا واجهة شبكة خارجية — نحذفه ولا نطبع سطرًا فارغًا يوهم بعنوان.
|
|
147
|
+
if (urls.network)
|
|
148
|
+
rows.push(["Network", urls.network]);
|
|
149
|
+
const lines = rows.map(([label, url]) => ` ${c.dim(label.padEnd(10))}${c.value(url)}`);
|
|
150
|
+
// البدائل باهتةً تحت الأصل: تُقرأ حين يفشل الأوّل، ولا تزاحمه حين ينجح.
|
|
151
|
+
if (urls.networkAlternates.length > 0) {
|
|
152
|
+
lines.push(` ${c.dim("".padEnd(10))}${c.dim(`or ${urls.networkAlternates.join(" · ")}`)}`);
|
|
153
|
+
}
|
|
154
|
+
return lines.join("\n");
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* AR: تنبيه الجهاز المحجوب — يُطبع في start وstatus معًا، ويغيب تمامًا حين تكون الرخصة سارية.
|
|
158
|
+
*
|
|
159
|
+
* **هذا هو السطر الذي كان ناقصًا.** الخدمات تُقلع على جهاز بلا رخصة — وهذا مقصود: النواة
|
|
160
|
+
* يجب أن تعمل ليُفتَح المتصفّح على شاشة التفعيل أصلًا، وإيقاف الإقلاع كان سيمنع العلاج مع
|
|
161
|
+
* المرض. لكن الطرفية كانت تقول «كل شيء يعمل» وتنتهي، فيفتح المالك البوّابة ويجد واجهةً
|
|
162
|
+
* تنهار على كل نداء بلا كلمةٍ واحدة تشرح لماذا.
|
|
163
|
+
*
|
|
164
|
+
* null حين لا شيء يُقال: رخصةٌ سارية، أو نواةٌ لم تُسأل بعد (device === null) — والادّعاء
|
|
165
|
+
* بأن الجهاز غير مفعَّل لأننا لم نستطع السؤال كذبةٌ بنفس حجم إخفاء الحقيقة.
|
|
166
|
+
*
|
|
167
|
+
* EN: The blocked-appliance notice — printed by both `start` and `status`, and absent entirely when
|
|
168
|
+
* the licence is valid.
|
|
169
|
+
*
|
|
170
|
+
* **This is the line that was missing.** The services do start on an unlicensed machine, and
|
|
171
|
+
* that is deliberate: the core must run for a browser to reach the activation screen at all, and
|
|
172
|
+
* refusing to boot would withhold the cure along with the disease. But the terminal said
|
|
173
|
+
* "everything is running" and stopped there, so the owner opened the portal and found an
|
|
174
|
+
* interface collapsing on every call without one word explaining why.
|
|
175
|
+
*
|
|
176
|
+
* `null` when there is nothing to say: a valid licence, or a core that was never asked
|
|
177
|
+
* (`device === null`) — claiming the machine is unactivated because we could not ask is a lie of
|
|
178
|
+
* exactly the same size as hiding the truth.
|
|
179
|
+
*/
|
|
180
|
+
export function renderActivationNotice(profile, device) {
|
|
181
|
+
if (!device)
|
|
182
|
+
return null;
|
|
183
|
+
if (device.status === "active" || device.status === "grace")
|
|
184
|
+
return null;
|
|
185
|
+
const url = activationUrl(profile);
|
|
186
|
+
const lines = [
|
|
187
|
+
` ${c.bad(glyph.bad)} ${c.bad("This appliance is not licensed. The portal will not open until it is activated.")}`,
|
|
188
|
+
];
|
|
189
|
+
// العنوان سطرٌ مستقلّ بلونه: هو الإجراء الوحيد المطلوب، ولا يُدسّ داخل جملة تُقرأ ثم تُنسى.
|
|
190
|
+
if (url)
|
|
191
|
+
lines.push(` ${c.dim("Activate".padEnd(10))}${c.value(url)}`);
|
|
192
|
+
return lines.join("\n");
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* AR: سطر الباقة عند الإقلاع — **يُطبع حين تكون هناك خدمةٌ غير مشمولة، ويُسكت حين تكون الباقة
|
|
196
|
+
* شاملة.** سطرٌ يقول «كل شيء مشمول» في كل إقلاع ضجيجٌ يُتعلَّم تجاهله، ثم يُتجاهَل معه السطر
|
|
197
|
+
* الذي كان يهمّ.
|
|
198
|
+
*
|
|
199
|
+
* ومن يقرأ مخرَج start ثم يبحث عن خدمةٍ لا تعمل يجب أن يجد السبب هنا لا بعد ساعة من
|
|
200
|
+
* التشخيص: خدمة البث المباشر التي «لا تستجيب» قد تكون ببساطة خارج الباقة، والفرق بين
|
|
201
|
+
* التشخيصين هو الفرق بين مكالمة مبيعات وليلةٍ ضائعة.
|
|
202
|
+
* EN: The package line at boot — **printed when some service is not included, and silent when the
|
|
203
|
+
* package covers everything.** A line saying "everything is included" on every boot is noise
|
|
204
|
+
* that gets learned and ignored, and the line that mattered gets ignored with it.
|
|
205
|
+
*
|
|
206
|
+
* And whoever reads `start`'s output and then goes looking for a service that is not running
|
|
207
|
+
* should find the reason here rather than an hour into diagnosis: a live service that "does not
|
|
208
|
+
* respond" may simply be outside the package, and the difference between those two diagnoses is
|
|
209
|
+
* the difference between a sales call and a lost night.
|
|
210
|
+
*/
|
|
211
|
+
export function renderPackageNotice(device) {
|
|
212
|
+
if (!device)
|
|
213
|
+
return null;
|
|
214
|
+
if (device.status !== "active" && device.status !== "grace")
|
|
215
|
+
return null;
|
|
216
|
+
const excluded = (device.featureStates ?? []).filter((state) => !state.included);
|
|
217
|
+
if (excluded.length === 0)
|
|
218
|
+
return null;
|
|
219
|
+
const lines = [
|
|
220
|
+
` ${c.dim("Package".padEnd(10))}${c.value(device.plan ?? NOT_REPORTED)}`,
|
|
221
|
+
` ${c.dim("Excluded".padEnd(10))}${excluded.map((state) => `${c.bad(glyph.fail)} ${state.key}`).join(" ")}`,
|
|
222
|
+
];
|
|
223
|
+
return lines.join("\n");
|
|
224
|
+
}
|
|
225
|
+
export function renderConflicts(conflicts) {
|
|
226
|
+
const lines = conflicts.map((conflict) => {
|
|
227
|
+
const holder = conflict.holder
|
|
228
|
+
? `${conflict.holder.name} (PID ${conflict.holder.pid})`
|
|
229
|
+
: "an unknown process";
|
|
230
|
+
return ` ${c.bad(glyph.bad)} port ${c.value(String(conflict.port))} is held by ${c.value(holder)}`;
|
|
231
|
+
});
|
|
232
|
+
return [
|
|
233
|
+
c.bad("Not starting: one or more ports are already in use."),
|
|
234
|
+
...lines,
|
|
235
|
+
c.dim(" Stop whatever holds them, or change the port in .fantastic/config.json"),
|
|
236
|
+
].join("\n");
|
|
237
|
+
}
|
|
238
|
+
export function renderStartOutcome(outcome) {
|
|
239
|
+
const lines = outcome.steps.map((step) => {
|
|
240
|
+
const label = step.definition.label.padEnd(12);
|
|
241
|
+
switch (step.status) {
|
|
242
|
+
case "started":
|
|
243
|
+
return ` ${c.ok(glyph.ok)} ${label} ${c.dim(`${step.definition.host}:${step.definition.port}`)} ${c.dim(`pid ${step.pid}`)}`;
|
|
244
|
+
case "already-running":
|
|
245
|
+
return ` ${c.warn(glyph.warn)} ${label} ${c.dim("already running, left alone")}`;
|
|
246
|
+
case "failed":
|
|
247
|
+
return ` ${c.bad(glyph.bad)} ${label} ${c.bad(step.readiness?.reason ?? "failed to start")}`;
|
|
248
|
+
case "skipped":
|
|
249
|
+
return ` ${c.dim(glyph.none)} ${label} ${c.dim("not started")}`;
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
const failed = outcome.steps.find((step) => step.status === "failed");
|
|
253
|
+
const tail = failed?.readiness?.tail ?? [];
|
|
254
|
+
if (tail.length === 0)
|
|
255
|
+
return lines.join("\n");
|
|
256
|
+
return [
|
|
257
|
+
...lines,
|
|
258
|
+
"",
|
|
259
|
+
c.dim(`last output from ${failed?.definition.label}:`),
|
|
260
|
+
...tail.map((line) => c.dim(` │ ${line}`)),
|
|
261
|
+
].join("\n");
|
|
262
|
+
}
|
|
263
|
+
export function renderStopOutcome(steps) {
|
|
264
|
+
return steps
|
|
265
|
+
.map((step) => {
|
|
266
|
+
const label = step.definition.label.padEnd(12);
|
|
267
|
+
if (step.holderUnknown) {
|
|
268
|
+
return ` ${c.warn(glyph.warn)} ${label} ${c.warn("running, but could not identify what holds the port — left alone")}`;
|
|
269
|
+
}
|
|
270
|
+
if (step.foreign && !step.adopted) {
|
|
271
|
+
return ` ${c.warn(glyph.warn)} ${label} ${c.dim("running, but the CLI did not start it — left alone (retry with --force)")}`;
|
|
272
|
+
}
|
|
273
|
+
if (!step.wasRunning) {
|
|
274
|
+
return ` ${c.dim(glyph.none)} ${label} ${c.dim("already stopped")}`;
|
|
275
|
+
}
|
|
276
|
+
if (!step.terminated) {
|
|
277
|
+
return ` ${c.bad(glyph.bad)} ${label} ${c.bad("did not stop")}`;
|
|
278
|
+
}
|
|
279
|
+
if (!step.portReleased) {
|
|
280
|
+
return ` ${c.warn(glyph.warn)} ${label} ${c.warn(`stopped, but port ${step.definition.port} is still in use`)}`;
|
|
281
|
+
}
|
|
282
|
+
const tags = [step.forced && "forced", step.adopted && "wasn't started by the CLI"].filter(Boolean);
|
|
283
|
+
const how = tags.length > 0 ? c.dim(`(${tags.join(", ")})`) : "";
|
|
284
|
+
return ` ${c.ok(glyph.ok)} ${label} ${c.dim("stopped")} ${how}`.trimEnd();
|
|
285
|
+
})
|
|
286
|
+
.join("\n");
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=boot.render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boot.render.js","sourceRoot":"","sources":["../../src/render/boot.render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type BrandContext = {
|
|
2
|
+
/** ملفّ التشغيل المُستنتَج، ليُقال صراحةً ولا يُخمَّن (لا تخمين صامت). */
|
|
3
|
+
profile?: string;
|
|
4
|
+
version?: string;
|
|
5
|
+
/** جذر النظام: مجلد المستودع أو مجلد التثبيت. */
|
|
6
|
+
root?: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* سطر العلامة مع سياقه. يُعيد نصًّا فارغًا خارج الطرفية، فيستطيع المُنادي طباعته بلا شرط.
|
|
10
|
+
*/
|
|
11
|
+
export declare function renderBrand(context?: BrandContext): string;
|
|
12
|
+
/**
|
|
13
|
+
* ترويسة مضغوطة بسطر واحد للأوامر التي تطبع كثيرًا (status، logs) فلا تزاحم الجدول.
|
|
14
|
+
*/
|
|
15
|
+
export declare function renderBrandLine(context?: BrandContext): string;
|
|
16
|
+
//# sourceMappingURL=brand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/render/brand.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,YAAY,GAAG;IACzB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAIF;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,YAAiB,GAAG,MAAM,CAO9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,YAAiB,GAAG,MAAM,CAKlE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { c, glyph, isTty } from "./theme.js";
|
|
2
|
+
const WORDMARK = "FANTASTIC";
|
|
3
|
+
/**
|
|
4
|
+
* سطر العلامة مع سياقه. يُعيد نصًّا فارغًا خارج الطرفية، فيستطيع المُنادي طباعته بلا شرط.
|
|
5
|
+
*/
|
|
6
|
+
export function renderBrand(context = {}) {
|
|
7
|
+
if (!isTty)
|
|
8
|
+
return "";
|
|
9
|
+
const rule = c.accent(glyph.rule.repeat(52));
|
|
10
|
+
const details = [context.profile, context.version, context.root].filter(Boolean).join(c.dim(" · "));
|
|
11
|
+
return ["", rule, ` ${c.label(c.accent(WORDMARK))} ${c.dim(details)}`, rule, ""].join("\n");
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* ترويسة مضغوطة بسطر واحد للأوامر التي تطبع كثيرًا (status، logs) فلا تزاحم الجدول.
|
|
15
|
+
*/
|
|
16
|
+
export function renderBrandLine(context = {}) {
|
|
17
|
+
if (!isTty)
|
|
18
|
+
return "";
|
|
19
|
+
const details = [context.profile, context.version].filter(Boolean).join(c.dim(" · "));
|
|
20
|
+
return `${c.label(c.accent(WORDMARK))} ${c.dim(details)}`;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=brand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../../src/render/brand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAsB7C,MAAM,QAAQ,GAAG,WAAW,CAAC;AAE7B;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,UAAwB,EAAE;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpG,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChG,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAAwB,EAAE;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACtF,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DoctorReport } from "../doctor/registry.js";
|
|
2
|
+
export declare function renderDoctorReport(report: DoctorReport, verbose?: boolean): string;
|
|
3
|
+
/** الشكل الآلي: نفس المعلومة، ومعها العلاج، بلا ألوان. */
|
|
4
|
+
export declare function doctorJsonData(report: DoctorReport): Record<string, unknown>;
|
|
5
|
+
/** المشاكل بشكل غلاف --json المشترك. */
|
|
6
|
+
export declare function doctorProblems(report: DoctorReport): {
|
|
7
|
+
id: string;
|
|
8
|
+
severity: "fail" | "warn";
|
|
9
|
+
message: string;
|
|
10
|
+
remedy: string;
|
|
11
|
+
}[];
|
|
12
|
+
//# sourceMappingURL=doctor.render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.render.d.ts","sourceRoot":"","sources":["../../src/render/doctor.render.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AA+C1D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,UAAQ,GAAG,MAAM,CAchF;AAoBD,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAe5E;AAED,0CAA0C;AAC1C,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG;IACpD,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,EAAE,CASF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { CATEGORY_TITLES, CHECK_CATEGORIES } from "../doctor/check.types.js";
|
|
2
|
+
import { c, glyph } from "./theme.js";
|
|
3
|
+
// AR: عارضة التقرير. لا منطق: تأخذ نتائج محسوبة وتصفّها.
|
|
4
|
+
// العلاج يُطبع **تحت الفحص الفاشل مباشرة** لا في قائمة مجمَّعة في الأسفل: من يقرأ سطرًا أحمر
|
|
5
|
+
// يريد الخطوة التالية في الحال، لا أن يبحث عنها في آخر المخرَج.
|
|
6
|
+
// EN: The report renderer. No logic: it takes computed results and lays them out.
|
|
7
|
+
// A remedy prints **directly under its failing check**, never in a collected list at the bottom:
|
|
8
|
+
// whoever reads a red line wants the next step right there, not hunting for it at the end.
|
|
9
|
+
const MARK = {
|
|
10
|
+
pass: glyph.pass,
|
|
11
|
+
fail: glyph.fail,
|
|
12
|
+
warn: "!",
|
|
13
|
+
unknown: "?",
|
|
14
|
+
};
|
|
15
|
+
function paint(status, text) {
|
|
16
|
+
if (status === "pass")
|
|
17
|
+
return c.ok(text);
|
|
18
|
+
if (status === "fail")
|
|
19
|
+
return c.bad(text);
|
|
20
|
+
if (status === "warn")
|
|
21
|
+
return c.warn(text);
|
|
22
|
+
return c.dim(text);
|
|
23
|
+
}
|
|
24
|
+
// أعرض عنوان فحص هو «DATA_DIR agreement (core ↔ live)». العرض يتّسع له فلا ينزاح عمود القيم.
|
|
25
|
+
const TITLE_WIDTH = 34;
|
|
26
|
+
function renderOutcome(outcome, verbose) {
|
|
27
|
+
const { check, result, remedy } = outcome;
|
|
28
|
+
const lines = [];
|
|
29
|
+
const mark = paint(result.status, MARK[result.status]);
|
|
30
|
+
const title = check.title.padEnd(TITLE_WIDTH);
|
|
31
|
+
const detail = result.detail ? paint(result.status, result.detail) : "";
|
|
32
|
+
lines.push(` ${mark} ${title} ${detail}`);
|
|
33
|
+
// الدليل يظهر مع --verbose دائمًا، ومع الفشل دومًا: عند الفشل هو نصف التشخيص.
|
|
34
|
+
if (result.evidence && (verbose || result.status === "fail")) {
|
|
35
|
+
lines.push(` ${c.dim(result.evidence)}`);
|
|
36
|
+
}
|
|
37
|
+
if (remedy)
|
|
38
|
+
lines.push(` ${c.accent(glyph.arrow)} ${remedy}`);
|
|
39
|
+
return lines;
|
|
40
|
+
}
|
|
41
|
+
export function renderDoctorReport(report, verbose = false) {
|
|
42
|
+
const lines = [];
|
|
43
|
+
for (const category of CHECK_CATEGORIES) {
|
|
44
|
+
const inCategory = report.outcomes.filter((outcome) => outcome.check.category === category);
|
|
45
|
+
if (inCategory.length === 0)
|
|
46
|
+
continue;
|
|
47
|
+
lines.push("", c.dim(CATEGORY_TITLES[category]));
|
|
48
|
+
for (const outcome of inCategory)
|
|
49
|
+
lines.push(...renderOutcome(outcome, verbose));
|
|
50
|
+
}
|
|
51
|
+
lines.push("", renderSummary(report));
|
|
52
|
+
return lines.join("\n");
|
|
53
|
+
}
|
|
54
|
+
function renderSummary(report) {
|
|
55
|
+
const parts = [];
|
|
56
|
+
parts.push(report.blocking === 0
|
|
57
|
+
? c.ok("No blocking issues.")
|
|
58
|
+
: c.bad(`${report.blocking} blocking issue${report.blocking === 1 ? "" : "s"}.`));
|
|
59
|
+
if (report.warnings > 0)
|
|
60
|
+
parts.push(c.warn(`${report.warnings} warning${report.warnings === 1 ? "" : "s"}.`));
|
|
61
|
+
if (report.unknown > 0)
|
|
62
|
+
parts.push(c.dim(`${report.unknown} could not be determined.`));
|
|
63
|
+
// تُقال صراحةً في كل تشغيل: من يشخّص عطلًا يحتاج أن يعرف أن الأداة لم تزد الطين بلّة.
|
|
64
|
+
parts.push(c.dim("doctor never writes; nothing was changed."));
|
|
65
|
+
return parts.join(" ");
|
|
66
|
+
}
|
|
67
|
+
/** الشكل الآلي: نفس المعلومة، ومعها العلاج، بلا ألوان. */
|
|
68
|
+
export function doctorJsonData(report) {
|
|
69
|
+
return {
|
|
70
|
+
blocking: report.blocking,
|
|
71
|
+
warnings: report.warnings,
|
|
72
|
+
unknown: report.unknown,
|
|
73
|
+
checks: report.outcomes.map((outcome) => ({
|
|
74
|
+
id: outcome.check.id,
|
|
75
|
+
category: outcome.check.category,
|
|
76
|
+
title: outcome.check.title,
|
|
77
|
+
status: outcome.result.status,
|
|
78
|
+
detail: outcome.result.detail ?? null,
|
|
79
|
+
evidence: outcome.result.evidence ?? null,
|
|
80
|
+
remedy: outcome.remedy ?? null,
|
|
81
|
+
})),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/** المشاكل بشكل غلاف --json المشترك. */
|
|
85
|
+
export function doctorProblems(report) {
|
|
86
|
+
return report.outcomes
|
|
87
|
+
.filter((outcome) => outcome.result.status === "fail" || outcome.result.status === "warn")
|
|
88
|
+
.map((outcome) => ({
|
|
89
|
+
id: outcome.check.id,
|
|
90
|
+
severity: outcome.result.status === "fail" ? "fail" : "warn",
|
|
91
|
+
message: `${outcome.check.title}: ${outcome.result.detail ?? outcome.result.status}`,
|
|
92
|
+
remedy: outcome.remedy ?? "",
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=doctor.render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.render.js","sourceRoot":"","sources":["../../src/render/doctor.render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Profile } from "../profiles/types.js";
|
|
2
|
+
export type ProblemSeverity = "fail" | "warn";
|
|
3
|
+
export type JsonProblem = {
|
|
4
|
+
id: string;
|
|
5
|
+
severity: ProblemSeverity;
|
|
6
|
+
message: string;
|
|
7
|
+
/** الخطوة التالية المقترحة. **إلزامي**: مشكلة بلا علاج تقرير لا مساعدة. */
|
|
8
|
+
remedy: string;
|
|
9
|
+
};
|
|
10
|
+
export type JsonEnvelope<TData> = {
|
|
11
|
+
ok: boolean;
|
|
12
|
+
command: string;
|
|
13
|
+
profile: Profile["kind"] | null;
|
|
14
|
+
data: TData;
|
|
15
|
+
problems: JsonProblem[];
|
|
16
|
+
};
|
|
17
|
+
export type BuildEnvelopeInput<TData> = {
|
|
18
|
+
command: string;
|
|
19
|
+
profile?: Profile;
|
|
20
|
+
data: TData;
|
|
21
|
+
problems?: JsonProblem[];
|
|
22
|
+
};
|
|
23
|
+
export declare function buildEnvelope<TData>(input: BuildEnvelopeInput<TData>): JsonEnvelope<TData>;
|
|
24
|
+
/**
|
|
25
|
+
* يطبع الغلاف. مسافة بادئة ثابتة: المخرَج يُقرأ أحيانًا بالعين في التشخيص، والحجم هنا صغير دائمًا
|
|
26
|
+
* (حالة ولقطة صحة) فلا مقايضة حقيقية مع الأداء.
|
|
27
|
+
*/
|
|
28
|
+
export declare function renderJson<TData>(envelope: JsonEnvelope<TData>): string;
|
|
29
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/render/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAepD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,KAAK,IAAI;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAChC,IAAI,EAAE,KAAK,CAAC;IACZ,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,KAAK,IAAI;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,KAAK,CAAC;IACZ,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAW1F;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,MAAM,CAEvE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function buildEnvelope(input) {
|
|
2
|
+
const problems = input.problems ?? [];
|
|
3
|
+
return {
|
|
4
|
+
// ok مشتقّ لا مُعلَن: لا يمكن أن يقول أمرٌ «نجحت» وهو يحمل مشكلة حاجبة.
|
|
5
|
+
ok: !problems.some((problem) => problem.severity === "fail"),
|
|
6
|
+
command: input.command,
|
|
7
|
+
profile: input.profile?.kind ?? null,
|
|
8
|
+
data: input.data,
|
|
9
|
+
problems,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* يطبع الغلاف. مسافة بادئة ثابتة: المخرَج يُقرأ أحيانًا بالعين في التشخيص، والحجم هنا صغير دائمًا
|
|
14
|
+
* (حالة ولقطة صحة) فلا مقايضة حقيقية مع الأداء.
|
|
15
|
+
*/
|
|
16
|
+
export function renderJson(envelope) {
|
|
17
|
+
return JSON.stringify(envelope, null, 2);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/render/json.ts"],"names":[],"mappings":"AAwCA,MAAM,UAAU,aAAa,CAAQ,KAAgC;IACnE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;IAEtC,OAAO;QACL,0EAA0E;QAC1E,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC;QAC5D,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI;QACpC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAQ,QAA6B;IAC7D,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DeviceInfo } from "../contracts/core.js";
|
|
2
|
+
/** سطر الحالة بلونه: كلمة واحدة يقرؤها الفنّي من بعيد. */
|
|
3
|
+
export declare function licenceBadge(device: DeviceInfo | null): string;
|
|
4
|
+
export type LicenceCardOptions = {
|
|
5
|
+
/** يسبق البطاقةَ سطرُ «✔ Activated — <الشبكة>». يستعمله activate وحده. */
|
|
6
|
+
heading?: boolean;
|
|
7
|
+
};
|
|
8
|
+
/** كتلة كاملة لـactivate وhealth: الخطّة والانتهاء والأجهزة وبصمة الجهاز. */
|
|
9
|
+
export declare function renderLicenceCard(device: DeviceInfo | null, options?: LicenceCardOptions): string;
|
|
10
|
+
//# sourceMappingURL=licence.render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"licence.render.d.ts","sourceRoot":"","sources":["../../src/render/licence.render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAavD,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,CAyB9D;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,OAAO,GAAE,kBAAuB,GAAG,MAAM,CA+CrG"}
|