mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-10 21:32:23 +00:00
Merge remote-tracking branch 'upstream/main' into rb/opensky-scope
This commit is contained in:
commit
83bd48102a
368 files changed
+76485
-1619
No files matched your search
@@ -44,7 +44,7 @@ CCTV_NSW_ENABLED="${CCTV_NSW_ENABLED:-1}"
|
||||
CCTV_NSW_MAX_SOURCES="${CCTV_NSW_MAX_SOURCES:-250}"
|
||||
CCTV_CALGARY_ENABLED="${CCTV_CALGARY_ENABLED:-1}"
|
||||
CCTV_CALGARY_MAX_SOURCES="${CCTV_CALGARY_MAX_SOURCES:-220}"
|
||||
CCTV_MAX_SOURCES="${CCTV_MAX_SOURCES:-4000}"
|
||||
CCTV_MAX_SOURCES="${CCTV_MAX_SOURCES:-7350}"
|
||||
|
||||
# Capture which provider credentials genuinely came from the parent shell
|
||||
# before this launcher resolves dotenv and Keychain fallbacks. Only names are
|
||||
|
||||
@@ -347,6 +347,7 @@
|
||||
"src/layers/flights/tracking.js",
|
||||
"src/layers/flights/rendering.js",
|
||||
"src/layers/flights/testing.js",
|
||||
"src/layers/flights/hiddenContactRotation.test.mjs",
|
||||
"src/layers/flights/evidence.js",
|
||||
"src/layers/flights/ingestion.js",
|
||||
"src/layers/flights/queries.js",
|
||||
@@ -420,6 +421,7 @@
|
||||
"src/layers/firms/cards.js",
|
||||
"src/layers/firms/index.js",
|
||||
"src/layers/firms/ingestion.js",
|
||||
"src/layers/firms/heatVisibility.test.mjs",
|
||||
"src/layers/firms/lifecycle.js",
|
||||
"src/layers/firms/model.js",
|
||||
"src/layers/firms/policy.js",
|
||||
@@ -473,6 +475,7 @@
|
||||
"src/layers/satellites/stale.test.mjs",
|
||||
"src/layers/launches/source.test.mjs",
|
||||
"src/layers/launches/ingestion.test.mjs",
|
||||
"src/layers/launches/failedEntry.test.mjs",
|
||||
"src/layers/installations/lifecycle.js",
|
||||
"src/layers/installations/viewport.js",
|
||||
"src/layers/installations/controls.js",
|
||||
@@ -580,6 +583,7 @@
|
||||
"src/data/cctvHk.test.mjs",
|
||||
"src/data/cctvVegvesen.test.mjs",
|
||||
"src/data/cctvA22.test.mjs",
|
||||
"src/data/cctvIceland.test.mjs",
|
||||
"src/data/cctvNyc.test.mjs",
|
||||
"src/data/cctvHouston.test.mjs",
|
||||
"src/data/cctvNswSource.test.mjs",
|
||||
@@ -785,6 +789,7 @@
|
||||
"server/providers/transit.js",
|
||||
"server/providers/transitHistory.js",
|
||||
"server/providers/transitHistory.test.mjs",
|
||||
"src/data/rioRouteNames.js",
|
||||
"src/data/transitFeeds.js",
|
||||
"src/data/transitFeeds.test.mjs",
|
||||
"src/data/transitProxy.js",
|
||||
@@ -1125,6 +1130,8 @@
|
||||
"scripts/qa-status-badges.mjs",
|
||||
"src/dockerTrustedPeers.test.mjs",
|
||||
"src/cameraGlobeRotation.test.mjs",
|
||||
"src/cameraTilt.test.mjs",
|
||||
"src/ui/shellFacade.test.mjs",
|
||||
"src/voice/globeResetConfirmation.test.mjs",
|
||||
"src/hudDms.test.mjs",
|
||||
"src/hudSummaryGate.test.mjs",
|
||||
@@ -1210,6 +1217,10 @@
|
||||
"src/data/headingDegrees.test.mjs",
|
||||
"src/data/distanceFormat.test.mjs",
|
||||
"src/sources/adsbFields.test.mjs",
|
||||
"src/data/firmsIntensity.js",
|
||||
"src/data/firmsIntensity.test.mjs",
|
||||
"src/ui/layerPanel/RowSwitch.vue",
|
||||
"src/ui/layerPanel/RowSlider.vue",
|
||||
"src/sources/phaseTiming.test.mjs",
|
||||
"scripts/build-census-places.mjs",
|
||||
"src/data/placeBoundaries.test.mjs",
|
||||
@@ -1262,5 +1273,89 @@
|
||||
"src/voice/geminiTextChat.js",
|
||||
"src/voice/panelLayout.js",
|
||||
"src/voice/textChat.js",
|
||||
"src/voice/textProtocol.js"
|
||||
"src/voice/textProtocol.js",
|
||||
"src/app/sourceComposition.js",
|
||||
"src/app/sourceComposition.test.mjs",
|
||||
"src/data/dataCredits.js",
|
||||
"src/data/layerState.js",
|
||||
"src/data/layerState.test.mjs",
|
||||
"src/data/spriteOrder.js",
|
||||
"src/i18n/locales/ar.json",
|
||||
"src/i18n/locales/de.json",
|
||||
"src/i18n/locales/es.json",
|
||||
"src/i18n/locales/fr.json",
|
||||
"src/i18n/locales/it.json",
|
||||
"src/i18n/locales/ja.json",
|
||||
"src/i18n/locales/pt.json",
|
||||
"src/i18n/locales/ru.json",
|
||||
"src/i18n/locales/uk.json",
|
||||
"src/i18n/locales/zh-CN.json",
|
||||
"src/i18n/locales/zh-Hant.json",
|
||||
"src/i18n/same-as-english.json",
|
||||
"src/navigationPolicy.js",
|
||||
"src/overlays/worldOverlayDraw.js",
|
||||
"src/overlays/worldOverlayDraw.test.mjs",
|
||||
"src/sources/rateLimit.js",
|
||||
"src/ui/layerNames.js",
|
||||
"src/ui/styles/cyber.css",
|
||||
"src/voice/layerManifest.js",
|
||||
"src/worldFocus.js",
|
||||
"src/worldFocus.test.mjs",
|
||||
"server/providers/acartia.js",
|
||||
"server/providers/acartia.test.mjs",
|
||||
"server/providers/common/userAgent.js",
|
||||
"server/providers/inaturalist/client.js",
|
||||
"server/providers/inaturalist/observations.js",
|
||||
"server/providers/inaturalist/observations.test.mjs",
|
||||
"src/app/layers/wildlifeSightings.js",
|
||||
"src/layers/wildlifeSightings/cards.js",
|
||||
"src/layers/wildlifeSightings/cards.test.mjs",
|
||||
"src/layers/wildlifeSightings/controls.js",
|
||||
"src/layers/wildlifeSightings/docs.test.mjs",
|
||||
"src/layers/wildlifeSightings/index.js",
|
||||
"src/layers/wildlifeSightings/lifecycle.js",
|
||||
"src/layers/wildlifeSightings/model.js",
|
||||
"src/layers/wildlifeSightings/model.test.mjs",
|
||||
"src/layers/wildlifeSightings/ownership.test.mjs",
|
||||
"src/layers/wildlifeSightings/photos.js",
|
||||
"src/layers/wildlifeSightings/photos.test.mjs",
|
||||
"src/layers/wildlifeSightings/policy.js",
|
||||
"src/layers/wildlifeSightings/records.js",
|
||||
"src/layers/wildlifeSightings/records.test.mjs",
|
||||
"src/layers/wildlifeSightings/rendering.js",
|
||||
"src/layers/wildlifeSightings/selection.js",
|
||||
"src/layers/wildlifeSightings/source.js",
|
||||
"src/layers/wildlifeSightings/source.test.mjs",
|
||||
"src/layers/wildlifeSightings/viewport.js",
|
||||
"src/layers/wildlifeSightings/viewport.test.mjs",
|
||||
"src/sources/rateLimit.test.mjs",
|
||||
"src/layers/wildlifeSightings/bounds.js",
|
||||
"src/layers/wildlifeSightings/acartiaTaxa.js",
|
||||
"src/layers/wildlifeSightings/acquisition.test.mjs",
|
||||
"server/providers/inaturalist/client.test.mjs",
|
||||
"src/layers/wildlifeSightings/acartiaTaxa.test.mjs",
|
||||
"src/ui/wildlifeSightingCard.test.mjs",
|
||||
"src/overlays/wildlifeSightingOverlay.test.mjs",
|
||||
"scripts/run-perf-tests.mjs",
|
||||
"src/perfTestRunner.test.mjs",
|
||||
"src/testSupport/wildlifeBillboardModel.mjs",
|
||||
"src/layers/wildlifeSightings/gridViewport.test.mjs",
|
||||
"src/layers/wildlifeSightings/rendering.test.mjs",
|
||||
"src/layers/wildlifeSightings/sprites.test.mjs",
|
||||
"src/layers/wildlifeSightings/performance.test.mjs",
|
||||
"src/layers/wildlifeSightings/model.perf.test.mjs",
|
||||
"src/ui/wildlifeSightingPlacement.js",
|
||||
"server/providers/inaturalist/queue.js",
|
||||
"server/providers/inaturalist/queue.test.mjs",
|
||||
"server/providers/inaturalist/grid.js",
|
||||
"server/providers/inaturalist/grid.test.mjs",
|
||||
"server/providers/inaturalist/grid.fixture.mjs",
|
||||
"src/layers/wildlifeSightings/performance.js",
|
||||
"src/layers/wildlifeSightings/renderPerformanceFixtures.mjs",
|
||||
"server/providers/inaturalist/speed.test.mjs",
|
||||
"src/layers/wildlifeSightings/render.perf.test.mjs",
|
||||
"src/layers/wildlifeSightings/cache.integration.test.mjs",
|
||||
"src/layers/wildlifeSightings/density.test.mjs",
|
||||
"src/layers/wildlifeSightings/selection.test.mjs",
|
||||
"server/providers/inaturalist/proxy.fixture.mjs"
|
||||
]
|
||||
@@ -39,6 +39,9 @@
|
||||
"src/ui/views/panels/CockpitBriefing.vue",
|
||||
"src/ui/views/panels/CockpitContext.vue",
|
||||
"src/ui/views/panels/CockpitRoute.vue",
|
||||
"src/ui/cockpitPresentation.js",
|
||||
"src/data/headingDegrees.js",
|
||||
"src/data/distanceFormat.js",
|
||||
"src/ui/views/panels/CockpitRollingValue.vue",
|
||||
"src/ui/views/panels/CockpitSignalList.vue",
|
||||
"src/ui/views/panels/CockpitUtilityControls.vue",
|
||||
@@ -151,7 +154,8 @@
|
||||
"src/ui/views/panels/GlobeCompass.vue",
|
||||
"src/ui/stores/recording.js",
|
||||
"src/ui/styleParameters.js",
|
||||
"src/ui/i18n.js"
|
||||
"src/ui/i18n.js",
|
||||
"src/ui/surfaceKeyboard.js"
|
||||
],
|
||||
"external": ["vue", "pinia", "vue-i18n"]
|
||||
},
|
||||
@@ -160,6 +164,7 @@
|
||||
"modules": [
|
||||
"src/app/viewer.js",
|
||||
"src/app/atmosphereCompat.js",
|
||||
"src/globeInView.js",
|
||||
"src/sky/starrySky.js",
|
||||
"src/sky/stars.js",
|
||||
"src/data/bundledJson.js",
|
||||
@@ -200,7 +205,22 @@
|
||||
"src/data/aisStreamAdapter.js",
|
||||
"src/data/aisWatchdog.js",
|
||||
"src/sources/httpBody.js",
|
||||
"src/i18n/marker.js"
|
||||
"src/i18n/marker.js",
|
||||
"server/providers/acartia.js",
|
||||
"server/providers/common/rate-limit.js",
|
||||
"server/providers/common/same-site.js",
|
||||
"server/providers/common/userAgent.js",
|
||||
"server/providers/inaturalist/client.js",
|
||||
"server/providers/inaturalist/observations.js",
|
||||
"src/layers/wildlifeSightings/records.js",
|
||||
"src/layers/wildlifeSightings/policy.js",
|
||||
"src/localRequestGate.mjs",
|
||||
"src/sources/rateLimit.js",
|
||||
"src/layers/wildlifeSightings/bounds.js",
|
||||
"src/layers/wildlifeSightings/acartiaTaxa.js",
|
||||
"server/providers/inaturalist/grid.js",
|
||||
"src/layers/wildlifeSightings/gridViewport.js",
|
||||
"server/providers/inaturalist/queue.js"
|
||||
],
|
||||
"external": ["ws"]
|
||||
},
|
||||
@@ -344,6 +364,9 @@
|
||||
"server/providers/cctv/catalog.js",
|
||||
"server/providers/cctv/lithuania.js",
|
||||
"server/providers/cctv/taiwan.js",
|
||||
"server/providers/cctv/quebec.js",
|
||||
"server/providers/cctv/ottawa.js",
|
||||
"server/providers/cctv/worldCameras.js",
|
||||
"server/providers/cctv/constants.js",
|
||||
"server/providers/cctv/media.js",
|
||||
"server/providers/cctv/normalize.js",
|
||||
@@ -553,6 +576,7 @@
|
||||
"src/search/placeSearch.js",
|
||||
"src/search/google.js",
|
||||
"src/keylessGeocoder.js",
|
||||
"src/data/placeNames.js",
|
||||
"src/search/geospatial.js",
|
||||
"src/search/http.js",
|
||||
"src/search/defaults.js",
|
||||
@@ -686,6 +710,8 @@
|
||||
"src/ui/rail/classToggle.js",
|
||||
"src/ui/rail/focusSafeChildren.js",
|
||||
"src/ui/layerPanel/RowText.vue",
|
||||
"src/ui/layerPanel/RowSwitch.vue",
|
||||
"src/ui/layerPanel/RowSlider.vue",
|
||||
"src/ui/railTimeline.js",
|
||||
"src/ui/clearLayersControl.js",
|
||||
"src/loadingFeedback.js",
|
||||
@@ -723,7 +749,8 @@
|
||||
"src/ui/kit/UiButton.vue",
|
||||
"src/ui/kit/UiBadge.vue",
|
||||
"src/ui/rail/fieldValue.js",
|
||||
"src/ui/kit/UiSlider.js"
|
||||
"src/ui/kit/UiSlider.js",
|
||||
"src/ui/kit/UiSegmented.vue"
|
||||
],
|
||||
"external": ["vue"]
|
||||
},
|
||||
@@ -783,6 +810,7 @@
|
||||
"cctv-controls": {
|
||||
"exports": ["./ui/cctv"],
|
||||
"modules": [
|
||||
"src/data/iconOrientation.js",
|
||||
"src/data/headingDegrees.js",
|
||||
"src/ui/cctv.js",
|
||||
"src/ui/cctvBindings.js",
|
||||
@@ -791,6 +819,7 @@
|
||||
"src/ui/cctvFrames.js",
|
||||
"src/ui/cctvVideo.js",
|
||||
"src/ui/cctvPresentation.js",
|
||||
"src/ui/quebecCctvOverlay.js",
|
||||
"src/i18n/index.js",
|
||||
"src/i18n/locale.js",
|
||||
"src/i18n/locales/ar.json",
|
||||
@@ -810,7 +839,7 @@
|
||||
"src/ui/stores/status.js",
|
||||
"src/ui/i18n.js"
|
||||
],
|
||||
"external": ["vue", "pinia", "vue-i18n"]
|
||||
"external": ["vue", "pinia", "vue-i18n", "cesium"]
|
||||
},
|
||||
"context-controls": {
|
||||
"exports": ["./ui/context", "./ui/context/policy"],
|
||||
@@ -867,6 +896,7 @@
|
||||
"src/ui/cockpitDisplayPortal.js",
|
||||
"src/ui/displayPanelScroll.js",
|
||||
"src/ui/cockpitInput.js",
|
||||
"src/data/inputOwnership.js",
|
||||
"src/ui/cockpitInstruments.js",
|
||||
"src/ui/cockpitLayout.js",
|
||||
"src/ui/cockpitPresentation.js",
|
||||
@@ -889,6 +919,7 @@
|
||||
"src/i18n/locales/uk.json",
|
||||
"src/i18n/locales/zh-CN.json",
|
||||
"src/i18n/locales/zh-Hant.json",
|
||||
"src/ui/layerNames.js",
|
||||
"src/ui/unitLabels.js"
|
||||
],
|
||||
"external": ["cesium"]
|
||||
@@ -947,6 +978,7 @@
|
||||
"src/data/detectionPolicy.js",
|
||||
"src/data/installationFeedback.js",
|
||||
"src/data/idSwitches.js",
|
||||
"src/data/firmsIntensity.js",
|
||||
"src/data/layerState.js",
|
||||
"src/data/layerStateCoordinator.js",
|
||||
"src/data/layerStateTokenReservations.json",
|
||||
@@ -980,6 +1012,8 @@
|
||||
"src/ui/cctvFrames.js",
|
||||
"src/ui/cctvVideo.js",
|
||||
"src/ui/cctvPresentation.js",
|
||||
"src/data/iconOrientation.js",
|
||||
"src/ui/quebecCctvOverlay.js",
|
||||
"src/ui/clearLayersControl.js",
|
||||
"src/ui/cockpit.js",
|
||||
"src/ui/cockpitBriefing.js",
|
||||
@@ -993,6 +1027,7 @@
|
||||
"src/ui/cockpitDisplayPortal.js",
|
||||
"src/ui/displayPanelScroll.js",
|
||||
"src/ui/cockpitInput.js",
|
||||
"src/data/inputOwnership.js",
|
||||
"src/ui/cockpitInstruments.js",
|
||||
"src/ui/cockpitLayout.js",
|
||||
"src/ui/cockpitPresentation.js",
|
||||
@@ -1019,6 +1054,8 @@
|
||||
"src/ui/rail/classToggle.js",
|
||||
"src/ui/rail/focusSafeChildren.js",
|
||||
"src/ui/layerPanel/RowText.vue",
|
||||
"src/ui/layerPanel/RowSwitch.vue",
|
||||
"src/ui/layerPanel/RowSlider.vue",
|
||||
"src/ui/railTimeline.js",
|
||||
"src/ui/layers.js",
|
||||
"src/ui/leftPanelRail.js",
|
||||
@@ -1142,7 +1179,15 @@
|
||||
"src/ui/kit/UiBadge.vue",
|
||||
"src/ui/stores/globeActions.js",
|
||||
"src/ui/stores/recording.js",
|
||||
"src/ui/i18n.js"
|
||||
"src/ui/i18n.js",
|
||||
"src/ui/kit/UiSegmented.vue",
|
||||
"src/ui/wildlifeSightingCard.js",
|
||||
"src/layers/wildlifeSightings/records.js",
|
||||
"src/layers/wildlifeSightings/acartiaTaxa.js",
|
||||
"src/ui/views/panels/WildlifeSightingCard.vue",
|
||||
"src/ui/wildlifeSightingPlacement.js",
|
||||
"src/overlays/worldOverlayChrome.js",
|
||||
"src/layers/wildlifeSightings/photoText.js"
|
||||
],
|
||||
"external": ["cesium", "vue", "pinia", "vue-i18n"]
|
||||
},
|
||||
@@ -1160,6 +1205,7 @@
|
||||
"src/ui/styles/layers.css",
|
||||
"src/ui/styles/radio.css",
|
||||
"src/ui/styles/cctv.css",
|
||||
"src/ui/styles/quebecCctvOverlay.css",
|
||||
"src/ui/styles/scenes.css",
|
||||
"src/ui/styles/bhote-koshi.css",
|
||||
"src/ui/styles/recording.css",
|
||||
@@ -1311,6 +1357,7 @@
|
||||
"src/data/contactMatch.js",
|
||||
"src/data/iconOrientation.js",
|
||||
"src/data/idSwitches.js",
|
||||
"src/data/firmsIntensity.js",
|
||||
"src/data/layerState.js",
|
||||
"src/data/layerStateTokenReservations.json",
|
||||
"src/data/modelVisualAnchor.js",
|
||||
@@ -1373,6 +1420,7 @@
|
||||
"src/data/contactMatch.js",
|
||||
"src/data/iconOrientation.js",
|
||||
"src/data/idSwitches.js",
|
||||
"src/data/firmsIntensity.js",
|
||||
"src/data/layerState.js",
|
||||
"src/data/layerStateTokenReservations.json",
|
||||
"src/data/modelVisualAnchor.js",
|
||||
@@ -1426,6 +1474,7 @@
|
||||
"src/data/contactMatch.js",
|
||||
"src/data/iconOrientation.js",
|
||||
"src/data/idSwitches.js",
|
||||
"src/data/firmsIntensity.js",
|
||||
"src/data/layerState.js",
|
||||
"src/data/layerStateCoordinator.js",
|
||||
"src/data/layerStateTokenReservations.json",
|
||||
@@ -1527,6 +1576,8 @@
|
||||
"exports": ["./layers/firms"],
|
||||
"modules": [
|
||||
"src/data/firmsAdapt.js",
|
||||
"src/data/firmsIntensity.js",
|
||||
"src/data/firmsHeatRaster.js",
|
||||
"src/data/firmsLabels.js",
|
||||
"src/data/iconOrientation.js",
|
||||
"src/layers/firms/anchors.js",
|
||||
@@ -1538,6 +1589,7 @@
|
||||
"src/layers/firms/policy.js",
|
||||
"src/layers/firms/queries.js",
|
||||
"src/layers/firms/rendering.js",
|
||||
"src/layers/firms/heatImagery.js",
|
||||
"src/layers/firms/selection.js",
|
||||
"src/layers/firms/source.js",
|
||||
"src/layers/firms/state.js",
|
||||
@@ -1732,6 +1784,10 @@
|
||||
"src/i18n/locales/uk.json",
|
||||
"src/i18n/locales/zh-CN.json",
|
||||
"src/i18n/locales/zh-Hant.json",
|
||||
"src/data/feedState.js",
|
||||
"src/loadingFeedback.js",
|
||||
"src/data/installationFeedback.js",
|
||||
"src/ui/layerNames.js",
|
||||
"src/ui/unitLabels.js"
|
||||
],
|
||||
"external": ["cesium"]
|
||||
@@ -2001,6 +2057,7 @@
|
||||
"modules": [
|
||||
"src/data/iconOrientation.js",
|
||||
"src/data/idSwitches.js",
|
||||
"src/data/firmsIntensity.js",
|
||||
"src/data/layerState.js",
|
||||
"src/data/layerStateTokenReservations.json",
|
||||
"src/data/radioCountry.js",
|
||||
@@ -2288,6 +2345,7 @@
|
||||
"src/app/layers/alprCameras.js",
|
||||
"src/app/layers/bikeshare.js",
|
||||
"src/app/layers/cctv.js",
|
||||
"src/app/layers/cyclones.js",
|
||||
"src/app/layers/earthquakes.js",
|
||||
"src/app/layers/firms.js",
|
||||
"src/app/layers/flights.js",
|
||||
@@ -2317,6 +2375,7 @@
|
||||
"src/camera.js",
|
||||
"src/cameraGroundGuard.js",
|
||||
"src/cameraVerbs.js",
|
||||
"src/globeInView.js",
|
||||
"src/cctvFocusPolicy.js",
|
||||
"src/cctvFocusRequest.js",
|
||||
"src/celestialRing.js",
|
||||
@@ -2373,6 +2432,8 @@
|
||||
"src/data/fireAnchors.js",
|
||||
"src/data/firmsAdapt.js",
|
||||
"src/data/firmsHeatmap.js",
|
||||
"src/data/firmsIntensity.js",
|
||||
"src/data/firmsHeatRaster.js",
|
||||
"src/data/firmsLabels.js",
|
||||
"src/data/flights.js",
|
||||
"src/data/flowMatch.js",
|
||||
@@ -2534,6 +2595,7 @@
|
||||
"src/layers/firms/policy.js",
|
||||
"src/layers/firms/queries.js",
|
||||
"src/layers/firms/rendering.js",
|
||||
"src/layers/firms/heatImagery.js",
|
||||
"src/layers/firms/selection.js",
|
||||
"src/layers/firms/source.js",
|
||||
"src/layers/firms/state.js",
|
||||
@@ -2755,6 +2817,7 @@
|
||||
"src/ui/cctvFrames.js",
|
||||
"src/ui/cctvVideo.js",
|
||||
"src/ui/cctvPresentation.js",
|
||||
"src/ui/quebecCctvOverlay.js",
|
||||
"src/ui/clearLayersControl.js",
|
||||
"src/ui/cockpit.js",
|
||||
"src/ui/cockpitBriefing.js",
|
||||
@@ -2795,6 +2858,8 @@
|
||||
"src/ui/rail/classToggle.js",
|
||||
"src/ui/rail/focusSafeChildren.js",
|
||||
"src/ui/layerPanel/RowText.vue",
|
||||
"src/ui/layerPanel/RowSwitch.vue",
|
||||
"src/ui/layerPanel/RowSlider.vue",
|
||||
"src/ui/railTimeline.js",
|
||||
"src/ui/layers.js",
|
||||
"src/ui/leftPanelRail.js",
|
||||
@@ -2936,6 +3001,7 @@
|
||||
"src/app/layers/transit.js",
|
||||
"src/data/transit.js",
|
||||
"src/data/transitFeeds.js",
|
||||
"src/data/rioRouteNames.js",
|
||||
"src/data/transitIcons.js",
|
||||
"src/data/transitPresetStyle.js",
|
||||
"src/layers/transit/controls.js",
|
||||
@@ -3239,7 +3305,32 @@
|
||||
"src/voice/osmActions.js",
|
||||
"src/layers/osmPlaces/index.js",
|
||||
"src/app/layers/osmPlaces.js",
|
||||
"src/voice/areaActions.js"
|
||||
"src/voice/areaActions.js",
|
||||
"src/app/layers/wildlifeSightings.js",
|
||||
"src/layers/wildlifeSightings/cards.js",
|
||||
"src/layers/wildlifeSightings/controls.js",
|
||||
"src/layers/wildlifeSightings/index.js",
|
||||
"src/layers/wildlifeSightings/lifecycle.js",
|
||||
"src/layers/wildlifeSightings/model.js",
|
||||
"src/layers/wildlifeSightings/photos.js",
|
||||
"src/layers/wildlifeSightings/policy.js",
|
||||
"src/layers/wildlifeSightings/records.js",
|
||||
"src/layers/wildlifeSightings/rendering.js",
|
||||
"src/layers/wildlifeSightings/density.js",
|
||||
"src/layers/wildlifeSightings/selection.js",
|
||||
"src/layers/wildlifeSightings/source.js",
|
||||
"src/layers/wildlifeSightings/viewport.js",
|
||||
"src/layers/wildlifeSightings/bounds.js",
|
||||
"src/layers/wildlifeSightings/acartiaTaxa.js",
|
||||
"src/ui/wildlifeSightingCard.js",
|
||||
"src/ui/views/panels/WildlifeSightingCard.vue",
|
||||
"src/layers/wildlifeSightings/gridViewport.js",
|
||||
"src/layers/wildlifeSightings/billboardModel.js",
|
||||
"src/layers/wildlifeSightings/sprites.js",
|
||||
"src/ui/wildlifeSightingPlacement.js",
|
||||
"src/overlays/worldOverlayChrome.js",
|
||||
"src/layers/wildlifeSightings/photoText.js",
|
||||
"src/layers/wildlifeSightings/performance.js"
|
||||
],
|
||||
"external": [
|
||||
"hls.js",
|
||||
@@ -3264,6 +3355,8 @@
|
||||
"application-layer-construction": {
|
||||
"exports": ["./application/layers"],
|
||||
"modules": [
|
||||
"src/data/feedState.js",
|
||||
"src/loadingFeedback.js",
|
||||
"src/sources/adsbFields.js",
|
||||
"src/data/headingDegrees.js",
|
||||
"src/data/distanceFormat.js",
|
||||
@@ -3298,6 +3391,7 @@
|
||||
"src/app/layers/alprCameras.js",
|
||||
"src/app/layers/bikeshare.js",
|
||||
"src/app/layers/cctv.js",
|
||||
"src/app/layers/cyclones.js",
|
||||
"src/app/layers/earthquakes.js",
|
||||
"src/app/layers/firms.js",
|
||||
"src/app/layers/flights.js",
|
||||
@@ -3334,6 +3428,8 @@
|
||||
"src/data/detectionDraw.js",
|
||||
"src/data/detectionPolicy.js",
|
||||
"src/data/firmsAdapt.js",
|
||||
"src/data/firmsIntensity.js",
|
||||
"src/data/firmsHeatRaster.js",
|
||||
"src/data/firmsLabels.js",
|
||||
"src/data/flowMatch.js",
|
||||
"src/data/focusDeemphasis.js",
|
||||
@@ -3465,6 +3561,7 @@
|
||||
"src/layers/firms/policy.js",
|
||||
"src/layers/firms/queries.js",
|
||||
"src/layers/firms/rendering.js",
|
||||
"src/layers/firms/heatImagery.js",
|
||||
"src/layers/firms/selection.js",
|
||||
"src/layers/firms/source.js",
|
||||
"src/layers/firms/state.js",
|
||||
@@ -3637,6 +3734,9 @@
|
||||
"src/annotations/worldAnnotationRenderer.js",
|
||||
"src/cameraGroundGuard.js",
|
||||
"src/cameraVerbs.js",
|
||||
"src/globeInView.js",
|
||||
"src/scopeMaskPolicy.js",
|
||||
"src/scopeMask.js",
|
||||
"src/services/groundFloor.js",
|
||||
"src/data/routeSteps.js",
|
||||
"src/layers/directions/index.js",
|
||||
@@ -3683,6 +3783,7 @@
|
||||
"src/sources/nominatim.js",
|
||||
"src/app/layers/transit.js",
|
||||
"src/data/transitFeeds.js",
|
||||
"src/data/rioRouteNames.js",
|
||||
"src/data/transitIcons.js",
|
||||
"src/data/transitPresetStyle.js",
|
||||
"src/layers/transit/controls.js",
|
||||
@@ -3856,7 +3957,30 @@
|
||||
"src/data/local_data/wof_neighborhoods/files.js",
|
||||
"src/layers/osmPlaces/model.js",
|
||||
"src/layers/osmPlaces/index.js",
|
||||
"src/app/layers/osmPlaces.js"
|
||||
"src/app/layers/osmPlaces.js",
|
||||
"src/app/layers/wildlifeSightings.js",
|
||||
"src/layers/wildlifeSightings/cards.js",
|
||||
"src/layers/wildlifeSightings/controls.js",
|
||||
"src/layers/wildlifeSightings/index.js",
|
||||
"src/layers/wildlifeSightings/lifecycle.js",
|
||||
"src/layers/wildlifeSightings/model.js",
|
||||
"src/layers/wildlifeSightings/photos.js",
|
||||
"src/layers/wildlifeSightings/policy.js",
|
||||
"src/layers/wildlifeSightings/records.js",
|
||||
"src/layers/wildlifeSightings/rendering.js",
|
||||
"src/layers/wildlifeSightings/density.js",
|
||||
"src/layers/wildlifeSightings/selection.js",
|
||||
"src/layers/wildlifeSightings/source.js",
|
||||
"src/layers/wildlifeSightings/viewport.js",
|
||||
"src/ui/rail/utcClock.js",
|
||||
"src/layers/wildlifeSightings/bounds.js",
|
||||
"src/layers/wildlifeSightings/acartiaTaxa.js",
|
||||
"src/layers/wildlifeSightings/gridViewport.js",
|
||||
"src/layers/wildlifeSightings/billboardModel.js",
|
||||
"src/layers/wildlifeSightings/sprites.js",
|
||||
"src/overlays/worldOverlayChrome.js",
|
||||
"src/layers/wildlifeSightings/photoText.js",
|
||||
"src/layers/wildlifeSightings/performance.js"
|
||||
],
|
||||
"external": [
|
||||
"hls.js",
|
||||
@@ -3988,6 +4112,7 @@
|
||||
"src/i18n/marker.js",
|
||||
"src/data/installationFeedback.js",
|
||||
"src/data/idSwitches.js",
|
||||
"src/data/firmsIntensity.js",
|
||||
"src/data/layerState.js",
|
||||
"src/data/layerStateCoordinator.js",
|
||||
"src/data/layerStateTokenReservations.json",
|
||||
@@ -4391,7 +4516,15 @@
|
||||
"src/layers/airQuality/model.js",
|
||||
"src/layers/airQuality/source.js",
|
||||
"src/layers/droneAirspace/source.js",
|
||||
"src/layers/droneAirspace/records.js"
|
||||
"src/layers/droneAirspace/records.js",
|
||||
"src/layers/wildlifeSightings/policy.js",
|
||||
"src/layers/wildlifeSightings/records.js",
|
||||
"src/layers/wildlifeSightings/source.js",
|
||||
"src/layers/wildlifeSightings/viewport.js",
|
||||
"src/layers/wildlifeSightings/bounds.js",
|
||||
"src/layers/wildlifeSightings/acartiaTaxa.js",
|
||||
"src/layers/wildlifeSightings/gridViewport.js",
|
||||
"src/layers/wildlifeSightings/performance.js"
|
||||
],
|
||||
"external": []
|
||||
},
|
||||
@@ -4443,6 +4576,7 @@
|
||||
"server/providers/transitHistory.js",
|
||||
"src/data/gtfsRealtime.js",
|
||||
"src/data/transitFeeds.js",
|
||||
"src/data/rioRouteNames.js",
|
||||
"src/geoDistance.js",
|
||||
"src/data/transitProxy.js",
|
||||
"src/sources/httpBody.js",
|
||||
@@ -4459,6 +4593,7 @@
|
||||
"modules": [
|
||||
"src/data/gtfsRealtime.js",
|
||||
"src/data/transitFeeds.js",
|
||||
"src/data/rioRouteNames.js",
|
||||
"src/geoDistance.js",
|
||||
"src/data/transitProxy.js",
|
||||
"src/sources/transitHistory.js"
|
||||
@@ -4492,6 +4627,7 @@
|
||||
"src/data/terrainHeights.js",
|
||||
"src/data/transit.js",
|
||||
"src/data/transitFeeds.js",
|
||||
"src/data/rioRouteNames.js",
|
||||
"src/data/transitIcons.js",
|
||||
"src/data/transitPresetStyle.js",
|
||||
"src/data/transitProxy.js",
|
||||
@@ -4539,7 +4675,8 @@
|
||||
"src/i18n/locales/ru.json",
|
||||
"src/i18n/locales/uk.json",
|
||||
"src/i18n/locales/zh-CN.json",
|
||||
"src/i18n/locales/zh-Hant.json"
|
||||
"src/i18n/locales/zh-Hant.json",
|
||||
"src/overlays/worldOverlayChrome.js"
|
||||
],
|
||||
"external": ["cesium", "egm96-universal", "pbf"]
|
||||
},
|
||||
@@ -4550,6 +4687,7 @@
|
||||
"src/data/iconOrientation.js",
|
||||
"src/data/inputOwnership.js",
|
||||
"src/data/transitFeeds.js",
|
||||
"src/data/rioRouteNames.js",
|
||||
"src/geoDistance.js",
|
||||
"src/data/transitIcons.js",
|
||||
"src/data/transitPresetStyle.js",
|
||||
@@ -4607,6 +4745,7 @@
|
||||
"exports": ["./sources/transit-service"],
|
||||
"modules": [
|
||||
"src/data/transitFeeds.js",
|
||||
"src/data/rioRouteNames.js",
|
||||
"src/geoDistance.js",
|
||||
"src/data/transitProxy.js",
|
||||
"src/data/gtfsRealtime.js",
|
||||
@@ -4705,6 +4844,7 @@
|
||||
"src/styles/surveillance.js",
|
||||
"src/styles/thermal.js",
|
||||
"src/view/index.js",
|
||||
"src/data/firmsIntensity.js",
|
||||
"src/data/layerState.js",
|
||||
"src/data/layerStateTokenReservations.json",
|
||||
"src/data/idSwitches.js",
|
||||
@@ -4826,6 +4966,8 @@
|
||||
"src/tools/queries/brief.js",
|
||||
"src/tools/queries/maritime.js",
|
||||
"src/tools/queries/share.js",
|
||||
"src/data/firmsIntensity.js",
|
||||
"src/data/firmsAdapt.js",
|
||||
"src/data/idSwitches.js",
|
||||
"src/data/vesselTypes.js",
|
||||
"src/data/layerState.js",
|
||||
@@ -4848,6 +4990,7 @@
|
||||
"src/tools/surfaces.js",
|
||||
"src/layers/transit/policy.js",
|
||||
"src/data/transitFeeds.js",
|
||||
"src/data/rioRouteNames.js",
|
||||
"src/layers/transit/movement.js",
|
||||
"src/data/contactPlayback.js",
|
||||
"src/data/layerSnapshot.js",
|
||||
@@ -4960,6 +5103,7 @@
|
||||
"modules": [
|
||||
"src/view/index.js",
|
||||
"src/data/idSwitches.js",
|
||||
"src/data/firmsIntensity.js",
|
||||
"src/data/layerState.js",
|
||||
"src/data/layerStateTokenReservations.json",
|
||||
"src/visualStylePolicy.js"
|
||||
@@ -5014,5 +5158,68 @@
|
||||
"src/i18n/marker.js"
|
||||
],
|
||||
"external": ["cesium"]
|
||||
},
|
||||
"wildlife-sightings": {
|
||||
"exports": ["./layers/wildlife-sightings"],
|
||||
"modules": [
|
||||
"src/data/dataCredits.js",
|
||||
"src/data/iconOrientation.js",
|
||||
"src/i18n/index.js",
|
||||
"src/i18n/locale.js",
|
||||
"src/i18n/locales/ar.json",
|
||||
"src/i18n/locales/de.json",
|
||||
"src/i18n/locales/es.json",
|
||||
"src/i18n/locales/fr.json",
|
||||
"src/i18n/locales/it.json",
|
||||
"src/i18n/locales/ja.json",
|
||||
"src/i18n/locales/pt.json",
|
||||
"src/i18n/locales/ru.json",
|
||||
"src/i18n/locales/uk.json",
|
||||
"src/i18n/locales/zh-CN.json",
|
||||
"src/i18n/locales/zh-Hant.json",
|
||||
"src/i18n/marker.js",
|
||||
"src/layers/wildlifeSightings/cards.js",
|
||||
"src/layers/wildlifeSightings/controls.js",
|
||||
"src/layers/wildlifeSightings/index.js",
|
||||
"src/layers/wildlifeSightings/lifecycle.js",
|
||||
"src/layers/wildlifeSightings/model.js",
|
||||
"src/layers/wildlifeSightings/photos.js",
|
||||
"src/layers/wildlifeSightings/policy.js",
|
||||
"src/layers/wildlifeSightings/records.js",
|
||||
"src/layers/wildlifeSightings/rendering.js",
|
||||
"src/layers/wildlifeSightings/density.js",
|
||||
"src/layers/wildlifeSightings/selection.js",
|
||||
"src/layers/wildlifeSightings/source.js",
|
||||
"src/layers/wildlifeSightings/viewport.js",
|
||||
"src/overlays/worldOverlayDraw.js",
|
||||
"src/overlays/worldOverlayTokens.js",
|
||||
"src/sources/httpBody.js",
|
||||
"src/layers/wildlifeSightings/bounds.js",
|
||||
"src/layers/wildlifeSightings/acartiaTaxa.js",
|
||||
"src/ui/statusText.js",
|
||||
"src/ui/layerNames.js",
|
||||
"src/layers/wildlifeSightings/gridViewport.js",
|
||||
"src/layers/wildlifeSightings/billboardModel.js",
|
||||
"src/layers/wildlifeSightings/sprites.js",
|
||||
"src/layers/wildlifeSightings/photoText.js",
|
||||
"src/layers/wildlifeSightings/performance.js"
|
||||
],
|
||||
"external": ["cesium"]
|
||||
},
|
||||
"wildlife-sightings-source": {
|
||||
"exports": ["./layers/wildlife-sightings/source"],
|
||||
"modules": [
|
||||
"src/i18n/marker.js",
|
||||
"src/layers/wildlifeSightings/policy.js",
|
||||
"src/layers/wildlifeSightings/records.js",
|
||||
"src/layers/wildlifeSightings/source.js",
|
||||
"src/layers/wildlifeSightings/viewport.js",
|
||||
"src/sources/httpBody.js",
|
||||
"src/layers/wildlifeSightings/bounds.js",
|
||||
"src/layers/wildlifeSightings/acartiaTaxa.js",
|
||||
"src/layers/wildlifeSightings/gridViewport.js",
|
||||
"src/layers/wildlifeSightings/performance.js"
|
||||
],
|
||||
"external": []
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,8 @@
|
||||
* (vii) FAR SIDE — pins skip the depth test, so they are horizon-culled:
|
||||
* seen from over the Indian Ocean no pin clearly behind the planet is
|
||||
* shown; back over North America the near-side pins show again.
|
||||
* (viii) AGE — seven days is the default; shorter/longer windows and All
|
||||
* markers update the globe, and the age choice survives a reload.
|
||||
*
|
||||
* Screenshots go to qa-shots/ghostmaps-*.png (gitignored).
|
||||
*
|
||||
@@ -224,6 +226,77 @@ async function main() {
|
||||
record('LIVE: the /api/ghostmaps/events stream is open', stream);
|
||||
await page.screenshot({ path: path.join(SHOTS_DIR, 'ghostmaps-live.png') });
|
||||
|
||||
const ageChips = await page.evaluate(
|
||||
(id) =>
|
||||
[
|
||||
...document.querySelectorAll(
|
||||
`[data-layer-id="${id}"] [data-segmented-id="age"] [role="radio"]`,
|
||||
),
|
||||
].map((option) => ({
|
||||
id: option.dataset.chipId,
|
||||
active: option.getAttribute('aria-checked') === 'true',
|
||||
})),
|
||||
LAYER_ID,
|
||||
);
|
||||
record(
|
||||
'AGE: seven days is the default with an All markers option',
|
||||
live.ageDays === 7 &&
|
||||
ageChips.length === 6 &&
|
||||
ageChips
|
||||
.filter((chip) => chip.active)
|
||||
.map((chip) => chip.id)
|
||||
.join() === 'age-7' &&
|
||||
ageChips.some((chip) => chip.id === 'age-all'),
|
||||
);
|
||||
const selectAge = async (days) => {
|
||||
await showRow(page);
|
||||
const selector = `[data-layer-id="${LAYER_ID}"] [data-chip-id="age-${days ?? 'all'}"]`;
|
||||
await page.waitForSelector(selector, { timeout: 15000 });
|
||||
// Dispatch through the rendered button, matching the product-chip gate.
|
||||
await page.$eval(selector, (button) => button.click());
|
||||
await page.waitForFunction(
|
||||
(id, age) => {
|
||||
const s = window.__godsEyeView.dataManager.layers
|
||||
.get(id)
|
||||
.module.getStats();
|
||||
return s.ageDays === age && !s.loading;
|
||||
},
|
||||
{ timeout: TIMEOUT_MS },
|
||||
LAYER_ID,
|
||||
days,
|
||||
);
|
||||
return stats(page);
|
||||
};
|
||||
const all = await selectAge(null);
|
||||
record(
|
||||
'AGE: All markers restores old events without duplicate data sources',
|
||||
all.count > live.count &&
|
||||
(await sources(page)).length === live.products.length,
|
||||
`${live.count} → ${all.count}`,
|
||||
);
|
||||
await page.reload({ waitUntil: 'domcontentloaded' });
|
||||
await page.waitForFunction(() => window.__godsEyeView?.dataManager, {
|
||||
timeout: TIMEOUT_MS,
|
||||
});
|
||||
await enableAndSettle(page);
|
||||
const persistedAge = await stats(page);
|
||||
record(
|
||||
'AGE: All markers survives a reload',
|
||||
persistedAge.ageDays === null && persistedAge.count === all.count,
|
||||
);
|
||||
const thirty = await selectAge(30);
|
||||
const one = await selectAge(1);
|
||||
const seven = await selectAge(7);
|
||||
record(
|
||||
'AGE: counts follow the window order and seven days restores the default',
|
||||
one.count <= live.count &&
|
||||
thirty.count >= live.count &&
|
||||
thirty.count <= all.count &&
|
||||
seven.count === live.count &&
|
||||
seven.ageDays === 7,
|
||||
`1d=${one.count}, 7d=${seven.count}, 30d=${thirty.count}, all=${all.count}`,
|
||||
);
|
||||
|
||||
// ---- (ii) PICK ----------------------------------------------------------
|
||||
const target = await page.evaluate((id) => {
|
||||
const gev = window.__godsEyeView;
|
||||
|
||||
@@ -296,6 +296,22 @@ async function expandPanel(page) {
|
||||
);
|
||||
}
|
||||
|
||||
/** A keyless bundle opens on the first keyless source with live controls. */
|
||||
async function assertKeylessDefault(page) {
|
||||
await page.evaluate(() =>
|
||||
window.__godsEyeView.dataManager.setEnabled('street-level', true, {
|
||||
origin: 'user',
|
||||
}),
|
||||
);
|
||||
await uiUntil(page, litAlone, 'kartaview');
|
||||
const shown = await page.evaluate(() => ({
|
||||
status: document.getElementById('sl-status').textContent,
|
||||
disabled: document.getElementById('sl-controls').disabled,
|
||||
}));
|
||||
assert.notEqual(shown.status, 'KEY REQUIRED');
|
||||
assert.equal(shown.disabled, false, 'controls stay live');
|
||||
}
|
||||
|
||||
async function assertKeyRequired(page) {
|
||||
await page.evaluate(() =>
|
||||
window.__godsEyeView.dataManager.setEnabled('street-level', true, {
|
||||
@@ -528,11 +544,25 @@ async function main() {
|
||||
);
|
||||
|
||||
await expandPanel(page);
|
||||
if (!configured) {
|
||||
if (!configured && litAlone(await getUI(page), 'mapillary')) {
|
||||
// A keyed bundle behind a server without the token keeps Mapillary.
|
||||
await step('keyless server: KEY REQUIRED gates the controls', () =>
|
||||
assertKeyRequired(page),
|
||||
);
|
||||
skip('no Mapillary key', 'the keyed steps');
|
||||
} else if (!configured) {
|
||||
await step('keyless server: opens on KartaView, not KEY REQUIRED', () =>
|
||||
assertKeylessDefault(page),
|
||||
);
|
||||
await step(
|
||||
'keyless server: the MAPILLARY chip explains its key instead of switching',
|
||||
async () => {
|
||||
await press(page, '#sl-provider-chips [data-chip-id="mapillary"]');
|
||||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||
assert.ok(litAlone(await getUI(page), 'kartaview'));
|
||||
},
|
||||
);
|
||||
skip('no Mapillary key', 'the keyed steps');
|
||||
} else {
|
||||
await park(page);
|
||||
await step(
|
||||
@@ -751,6 +781,8 @@ async function main() {
|
||||
await park(page);
|
||||
|
||||
await fixtureStep(
|
||||
// The fixture bundle carries a token, so this covers a keyless
|
||||
// server behind a keyed bundle; the keyless default is checked above.
|
||||
'keyless server (second page): KEY REQUIRED gates the controls',
|
||||
async () => {
|
||||
const keyless = await open(
|
||||
|
||||
@@ -2321,9 +2321,11 @@ async function runBehaviorLayer() {
|
||||
`result=${JSON.stringify(r)?.slice(0, 120)} state=${JSON.stringify(contextExited)?.slice(0, 80)}`,
|
||||
);
|
||||
|
||||
// (9f) With Contacts OFF the entry gate is shut. Entry must refuse with the
|
||||
// reason rather than produce the half-entered state the operator saw: a
|
||||
// plane anchored under the camera with no HUD and no exit control.
|
||||
// (9f) Cockpit needs only the tracked aircraft's own layer, not Contacts.
|
||||
// With Contacts OFF, status must explain a shut gate without blaming
|
||||
// Contacts, and entry must either enter cleanly or refuse with the reason
|
||||
// rather than produce the half-entered state the operator saw: a plane
|
||||
// anchored under the camera with no HUD and no exit control.
|
||||
r = await run('control_cockpit', { action: 'status' });
|
||||
const gateReport = r?.state || {};
|
||||
const cockpitBeforeGate = await page.evaluate(() =>
|
||||
@@ -2331,10 +2333,13 @@ async function runBehaviorLayer() {
|
||||
);
|
||||
report(
|
||||
gateReport.active === false &&
|
||||
gateReport.entryAllowed === false &&
|
||||
gateReport.entryBlockedReason === 'contacts-inactive' &&
|
||||
(gateReport.entryAllowed === true
|
||||
? gateReport.entryBlockedReason === null
|
||||
: ['subject-layer-off', 'no-tracked-aircraft'].includes(
|
||||
gateReport.entryBlockedReason,
|
||||
)) &&
|
||||
!cockpitBeforeGate,
|
||||
'behavior: cockpit status names why entry is blocked with Contacts off',
|
||||
'behavior: cockpit status explains its gate without requiring Contacts',
|
||||
`state=${JSON.stringify(gateReport)?.slice(0, 150)}`,
|
||||
);
|
||||
|
||||
@@ -2348,12 +2353,16 @@ async function runBehaviorLayer() {
|
||||
Boolean(window.__godsEyeView?.styleManager?.cockpitView?.active),
|
||||
);
|
||||
report(
|
||||
gated?.ok === false &&
|
||||
/contacts/i.test(gated?.error || '') &&
|
||||
!cockpitAfterGate,
|
||||
'behavior: cockpit entry with Contacts off is refused, not half-entered',
|
||||
gated?.ok === true
|
||||
? cockpitAfterGate
|
||||
: !cockpitAfterGate && !/contacts/i.test(gated?.error || ''),
|
||||
'behavior: cockpit entry with Contacts off follows the own-layer gate, never half-entered',
|
||||
`ok=${gated?.ok} error=${String(gated?.error || '').slice(0, 90)} active=${cockpitAfterGate}`,
|
||||
);
|
||||
if (cockpitAfterGate)
|
||||
await page.evaluate(() =>
|
||||
window.__godsEyeView?.styleManager?.controlCockpit?.('exit'),
|
||||
);
|
||||
|
||||
await runBundledOutlineScenarios({
|
||||
page,
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
import { spawnSync } from 'node:child_process';
|
||||
import path from 'node:path';
|
||||
import { pathToFileURL } from 'node:url';
|
||||
import {
|
||||
discoverUnitTestFiles,
|
||||
UNIT_TEST_NODE_FLAGS,
|
||||
} from './run-unit-tests.mjs';
|
||||
|
||||
/** Discover every layer/provider benchmark, including those added by other branches. */
|
||||
export function discoverPerfTestFiles(root = process.cwd()) {
|
||||
return discoverUnitTestFiles(root).filter((file) =>
|
||||
file.endsWith('.perf.test.mjs'),
|
||||
);
|
||||
}
|
||||
|
||||
/** Shared by benchmarks so normal unit runs visibly skip timing assertions. */
|
||||
export function perfBudgetTestOptions(env = process.env) {
|
||||
return {
|
||||
skip:
|
||||
env.GEV_PERF_BUDGETS === '1'
|
||||
? false
|
||||
: 'Timing budgets are opt-in; run npm run test:perf (GEV_PERF_BUDGETS=1). Deterministic delta/write checks still run in the normal suite.',
|
||||
};
|
||||
}
|
||||
|
||||
/** Build a serial invocation so benchmarks do not compete for CPU time. */
|
||||
export function perfTestArgs(files) {
|
||||
// A single serial test process keeps benchmark files from competing with
|
||||
// each other; the normal suite still discovers them and reports their skips.
|
||||
return [
|
||||
...UNIT_TEST_NODE_FLAGS,
|
||||
'--test',
|
||||
'--test-concurrency=1',
|
||||
'--test-isolation=none',
|
||||
...files,
|
||||
];
|
||||
}
|
||||
|
||||
/** Run discovered benchmarks with wall-clock budgets enabled. */
|
||||
export function runPerfTests({
|
||||
root = process.cwd(),
|
||||
env = process.env,
|
||||
run = spawnSync,
|
||||
} = {}) {
|
||||
const files = discoverPerfTestFiles(root);
|
||||
if (!files.length) throw new Error('No *.perf.test.mjs benchmarks found');
|
||||
const result = run(process.execPath, perfTestArgs(files), {
|
||||
cwd: root,
|
||||
stdio: 'inherit',
|
||||
env: { ...env, GEV_PERF_BUDGETS: '1' },
|
||||
});
|
||||
if (result.error) throw result.error;
|
||||
return result.status ?? 1;
|
||||
}
|
||||
|
||||
const invoked = process.argv[1]
|
||||
? pathToFileURL(path.resolve(process.argv[1])).href
|
||||
: '';
|
||||
if (import.meta.url === invoked) process.exitCode = runPerfTests();
|
||||
Reference in new issue
Block a user