@sports-alliance/sports-lib 7.0.8 → 7.0.9
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/lib/esm/index.js +12034 -152
- package/package.json +2 -2
- package/lib/esm/activities/activity-parsing-options.js +0 -19
- package/lib/esm/activities/activity.interface.js +0 -1
- package/lib/esm/activities/activity.js +0 -281
- package/lib/esm/activities/activity.json.interface.js +0 -1
- package/lib/esm/activities/activity.spec.js +0 -348
- package/lib/esm/activities/activity.types.js +0 -1046
- package/lib/esm/activities/activityt-types.spec.js +0 -16
- package/lib/esm/activities/devices/device.interface.js +0 -1
- package/lib/esm/activities/devices/device.js +0 -26
- package/lib/esm/activities/devices/device.json.interface.js +0 -1
- package/lib/esm/constants/constants.js +0 -8
- package/lib/esm/creators/creator.interface.js +0 -1
- package/lib/esm/creators/creator.js +0 -37
- package/lib/esm/creators/creator.json.interface.js +0 -1
- package/lib/esm/creators/creator.spec.js +0 -25
- package/lib/esm/data/data-active-lap.js +0 -4
- package/lib/esm/data/data-active-lengths.js +0 -4
- package/lib/esm/data/data-aerobic-training-effect.js +0 -8
- package/lib/esm/data/data-anaerobic-training-effect.js +0 -8
- package/lib/esm/data/data-stance-time-balance-left.js +0 -4
- package/lib/esm/data/data-stance-time-balance-right.js +0 -4
- package/lib/esm/data/data-stance-time-balance.js +0 -3
- package/lib/esm/data/data-store.spec.js +0 -78
- package/lib/esm/data/data-total-cycles.js +0 -4
- package/lib/esm/data/data.absolute-pressure.js +0 -5
- package/lib/esm/data/data.accumulated-power.js +0 -8
- package/lib/esm/data/data.activity-types.js +0 -7
- package/lib/esm/data/data.air-power-avg.js +0 -4
- package/lib/esm/data/data.air-power-max.js +0 -4
- package/lib/esm/data/data.air-power-min.js +0 -4
- package/lib/esm/data/data.air-power.js +0 -8
- package/lib/esm/data/data.alti-baro-profile.js +0 -4
- package/lib/esm/data/data.altitude-avg.js +0 -4
- package/lib/esm/data/data.altitude-gps.js +0 -5
- package/lib/esm/data/data.altitude-max.js +0 -4
- package/lib/esm/data/data.altitude-min.js +0 -4
- package/lib/esm/data/data.altitude-smooth.js +0 -4
- package/lib/esm/data/data.altitude.js +0 -8
- package/lib/esm/data/data.array.js +0 -13
- package/lib/esm/data/data.ascent-time.js +0 -4
- package/lib/esm/data/data.ascent.js +0 -4
- package/lib/esm/data/data.auto-lap-distance.js +0 -5
- package/lib/esm/data/data.auto-lap-duration.js +0 -4
- package/lib/esm/data/data.auto-lap-used.js +0 -7
- package/lib/esm/data/data.auto-pause-used.js +0 -7
- package/lib/esm/data/data.avg-stride-length.js +0 -4
- package/lib/esm/data/data.balance.js +0 -6
- package/lib/esm/data/data.bare.js +0 -4
- package/lib/esm/data/data.battery-charge.js +0 -8
- package/lib/esm/data/data.battery-consumption.js +0 -8
- package/lib/esm/data/data.battery-current.js +0 -8
- package/lib/esm/data/data.battery-life-estimation.js +0 -4
- package/lib/esm/data/data.battery-voltage.js +0 -8
- package/lib/esm/data/data.bike-pod-used.js +0 -7
- package/lib/esm/data/data.boolean.js +0 -9
- package/lib/esm/data/data.cadence-avg.js +0 -4
- package/lib/esm/data/data.cadence-max.js +0 -4
- package/lib/esm/data/data.cadence-min.js +0 -4
- package/lib/esm/data/data.cadence.js +0 -8
- package/lib/esm/data/data.cycling-dynamics.js +0 -3
- package/lib/esm/data/data.cycling-position.js +0 -37
- package/lib/esm/data/data.cycling-seated-time.js +0 -5
- package/lib/esm/data/data.cycling-standing-time.js +0 -5
- package/lib/esm/data/data.descent-time.js +0 -4
- package/lib/esm/data/data.descent.js +0 -4
- package/lib/esm/data/data.description.js +0 -4
- package/lib/esm/data/data.device-location.js +0 -4
- package/lib/esm/data/data.device-names.js +0 -7
- package/lib/esm/data/data.distance.js +0 -15
- package/lib/esm/data/data.duration.js +0 -56
- package/lib/esm/data/data.ehpe.js +0 -5
- package/lib/esm/data/data.enabled-navigation-systems.js +0 -4
- package/lib/esm/data/data.end-altitude.js +0 -4
- package/lib/esm/data/data.end-position.js +0 -4
- package/lib/esm/data/data.energy.js +0 -8
- package/lib/esm/data/data.epoc.js +0 -5
- package/lib/esm/data/data.event.js +0 -3
- package/lib/esm/data/data.evpe.js +0 -4
- package/lib/esm/data/data.feeling.js +0 -15
- package/lib/esm/data/data.foot-pod-used.js +0 -7
- package/lib/esm/data/data.form-power.js +0 -4
- package/lib/esm/data/data.fused-altitude.js +0 -7
- package/lib/esm/data/data.fused-location.js +0 -7
- package/lib/esm/data/data.gnss-distance.js +0 -4
- package/lib/esm/data/data.grade-adjusted-pace-avg.js +0 -15
- package/lib/esm/data/data.grade-adjusted-pace-max.js +0 -15
- package/lib/esm/data/data.grade-adjusted-pace-min.js +0 -15
- package/lib/esm/data/data.grade-adjusted-pace.js +0 -25
- package/lib/esm/data/data.grade-adjusted-speed-avg.js +0 -46
- package/lib/esm/data/data.grade-adjusted-speed-max.js +0 -46
- package/lib/esm/data/data.grade-adjusted-speed-min.js +0 -46
- package/lib/esm/data/data.grade-adjusted-speed.js +0 -78
- package/lib/esm/data/data.grade-smooth.js +0 -7
- package/lib/esm/data/data.grade.js +0 -7
- package/lib/esm/data/data.ground-time.js +0 -8
- package/lib/esm/data/data.heart-rate-avg.js +0 -4
- package/lib/esm/data/data.heart-rate-max.js +0 -4
- package/lib/esm/data/data.heart-rate-min.js +0 -4
- package/lib/esm/data/data.heart-rate-used.js +0 -7
- package/lib/esm/data/data.heart-rate-zone-five-duration.js +0 -4
- package/lib/esm/data/data.heart-rate-zone-four-duration.js +0 -4
- package/lib/esm/data/data.heart-rate-zone-one-duration.js +0 -4
- package/lib/esm/data/data.heart-rate-zone-three-duration.js +0 -4
- package/lib/esm/data/data.heart-rate-zone-two-duration.js +0 -4
- package/lib/esm/data/data.heart-rate.js +0 -8
- package/lib/esm/data/data.ibi.js +0 -8
- package/lib/esm/data/data.interface.js +0 -5
- package/lib/esm/data/data.js +0 -62
- package/lib/esm/data/data.json.interface.js +0 -1
- package/lib/esm/data/data.latitude-degrees.js +0 -5
- package/lib/esm/data/data.left-balance.js +0 -4
- package/lib/esm/data/data.leg-stiffness.js +0 -16
- package/lib/esm/data/data.longitude-degrees.js +0 -5
- package/lib/esm/data/data.moving-time.js +0 -4
- package/lib/esm/data/data.number-of-satellites.js +0 -7
- package/lib/esm/data/data.number-of.samples.js +0 -4
- package/lib/esm/data/data.number.js +0 -13
- package/lib/esm/data/data.pace-avg.js +0 -8
- package/lib/esm/data/data.pace-max.js +0 -8
- package/lib/esm/data/data.pace-min.js +0 -8
- package/lib/esm/data/data.pace.js +0 -46
- package/lib/esm/data/data.pause.js +0 -4
- package/lib/esm/data/data.peak-epoc.js +0 -7
- package/lib/esm/data/data.peak-training-effect.js +0 -4
- package/lib/esm/data/data.percent.js +0 -4
- package/lib/esm/data/data.pool-length.js +0 -5
- package/lib/esm/data/data.position.interface.js +0 -1
- package/lib/esm/data/data.position.js +0 -18
- package/lib/esm/data/data.power-avg.js +0 -4
- package/lib/esm/data/data.power-down.js +0 -4
- package/lib/esm/data/data.power-intensity-factor.js +0 -5
- package/lib/esm/data/data.power-left.js +0 -4
- package/lib/esm/data/data.power-max.js +0 -4
- package/lib/esm/data/data.power-min.js +0 -4
- package/lib/esm/data/data.power-normalized.js +0 -4
- package/lib/esm/data/data.power-pedal-smoothness-left.js +0 -4
- package/lib/esm/data/data.power-pedal-smoothness-right.js +0 -4
- package/lib/esm/data/data.power-pod-used.js +0 -7
- package/lib/esm/data/data.power-right.js +0 -4
- package/lib/esm/data/data.power-torque-effectiveness-left.js +0 -4
- package/lib/esm/data/data.power-torque-effectiveness-right.js +0 -4
- package/lib/esm/data/data.power-training-stress-score.js +0 -5
- package/lib/esm/data/data.power-up.js +0 -4
- package/lib/esm/data/data.power-work.js +0 -5
- package/lib/esm/data/data.power-zone-five-duration.js +0 -4
- package/lib/esm/data/data.power-zone-four-duration.js +0 -4
- package/lib/esm/data/data.power-zone-one-duration.js +0 -4
- package/lib/esm/data/data.power-zone-three-duration.js +0 -4
- package/lib/esm/data/data.power-zone-two-duration.js +0 -4
- package/lib/esm/data/data.power.js +0 -8
- package/lib/esm/data/data.recovery-time.js +0 -7
- package/lib/esm/data/data.rider-position-change-event.js +0 -8
- package/lib/esm/data/data.right-balance.js +0 -4
- package/lib/esm/data/data.rpe.js +0 -23
- package/lib/esm/data/data.satellite-5-best-snr.js +0 -4
- package/lib/esm/data/data.sea-level-pressure.js +0 -5
- package/lib/esm/data/data.spec.js +0 -25
- package/lib/esm/data/data.speed-avg.js +0 -46
- package/lib/esm/data/data.speed-max.js +0 -46
- package/lib/esm/data/data.speed-min.js +0 -46
- package/lib/esm/data/data.speed-zone-five-duration.js +0 -4
- package/lib/esm/data/data.speed-zone-four-duration.js +0 -4
- package/lib/esm/data/data.speed-zone-one-duration.js +0 -4
- package/lib/esm/data/data.speed-zone-three-duration.js +0 -4
- package/lib/esm/data/data.speed-zone-two-duration.js +0 -4
- package/lib/esm/data/data.speed.js +0 -88
- package/lib/esm/data/data.sport-profile-name.js +0 -4
- package/lib/esm/data/data.stance-time.js +0 -5
- package/lib/esm/data/data.start-altitude.js +0 -4
- package/lib/esm/data/data.start-event.js +0 -4
- package/lib/esm/data/data.start-position.js +0 -4
- package/lib/esm/data/data.step-length.js +0 -4
- package/lib/esm/data/data.steps-old.js +0 -4
- package/lib/esm/data/data.steps.js +0 -4
- package/lib/esm/data/data.stop-all-event.js +0 -4
- package/lib/esm/data/data.stop-event.js +0 -4
- package/lib/esm/data/data.store.export.spec.js +0 -66
- package/lib/esm/data/data.store.js +0 -1213
- package/lib/esm/data/data.string.js +0 -13
- package/lib/esm/data/data.stryd-altitude.js +0 -4
- package/lib/esm/data/data.stryd-distance.js +0 -4
- package/lib/esm/data/data.stryd-speed.js +0 -4
- package/lib/esm/data/data.swim-pace-avg.js +0 -8
- package/lib/esm/data/data.swim-pace-max.js +0 -8
- package/lib/esm/data/data.swim-pace-min.js +0 -8
- package/lib/esm/data/data.swim-pace.js +0 -19
- package/lib/esm/data/data.swolf-25m.js +0 -4
- package/lib/esm/data/data.swolf-50m.js +0 -4
- package/lib/esm/data/data.target-distance.js +0 -4
- package/lib/esm/data/data.target-heart-rate-zone.js +0 -4
- package/lib/esm/data/data.target-power-zone.js +0 -4
- package/lib/esm/data/data.target-speed-zone.js +0 -4
- package/lib/esm/data/data.target-time.js +0 -4
- package/lib/esm/data/data.temperature-avg.js +0 -4
- package/lib/esm/data/data.temperature-max.js +0 -4
- package/lib/esm/data/data.temperature-min.js +0 -4
- package/lib/esm/data/data.temperature.js +0 -8
- package/lib/esm/data/data.time.js +0 -6
- package/lib/esm/data/data.timer-time.js +0 -4
- package/lib/esm/data/data.vertical-oscillation.js +0 -5
- package/lib/esm/data/data.vertical-ratio.js +0 -5
- package/lib/esm/data/data.vertical-speed-avg.js +0 -53
- package/lib/esm/data/data.vertical-speed-max.js +0 -53
- package/lib/esm/data/data.vertical-speed-min.js +0 -53
- package/lib/esm/data/data.vertical-speed.js +0 -103
- package/lib/esm/data/data.vo2-max.js +0 -7
- package/lib/esm/data/ibi/data.ibi.filters.js +0 -52
- package/lib/esm/data/ibi/data.ibi.js +0 -98
- package/lib/esm/data/ibi/data.ibi.spec.js +0 -66
- package/lib/esm/duration/duration.class.abstract.js +0 -36
- package/lib/esm/duration/duration.class.interface.js +0 -1
- package/lib/esm/errors/duration-exceeded-event-lib.error.js +0 -9
- package/lib/esm/errors/empty-event-sports-libs.error.js +0 -9
- package/lib/esm/errors/event-lib.error.js +0 -8
- package/lib/esm/errors/lib.error.js +0 -6
- package/lib/esm/errors/parsing-event-lib.error.js +0 -9
- package/lib/esm/events/adapters/exporters/exporter.gpx.js +0 -75
- package/lib/esm/events/adapters/exporters/exporter.interface.js +0 -1
- package/lib/esm/events/adapters/exporters/exporter.json.js +0 -20
- package/lib/esm/events/adapters/file-type.enum.js +0 -7
- package/lib/esm/events/adapters/importers/fit/importer.fit.ant-plus.device.names.js +0 -25
- package/lib/esm/events/adapters/importers/fit/importer.fit.coros.device.names.js +0 -5
- package/lib/esm/events/adapters/importers/fit/importer.fit.development.device.names.js +0 -4
- package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.device.names.js +0 -462
- package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.profile.data.js +0 -877
- package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.profile.mapper.js +0 -106
- package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.profile.mapper.spec.js +0 -32
- package/lib/esm/events/adapters/importers/fit/importer.fit.hammerhead.device.names.js +0 -4
- package/lib/esm/events/adapters/importers/fit/importer.fit.integration.spec.js +0 -44
- package/lib/esm/events/adapters/importers/fit/importer.fit.js +0 -978
- package/lib/esm/events/adapters/importers/fit/importer.fit.lezyne.device.names.js +0 -3
- package/lib/esm/events/adapters/importers/fit/importer.fit.magellan.device.names.js +0 -5
- package/lib/esm/events/adapters/importers/fit/importer.fit.mapper.js +0 -231
- package/lib/esm/events/adapters/importers/fit/importer.fit.saris.device.names.js +0 -3
- package/lib/esm/events/adapters/importers/fit/importer.fit.spec.js +0 -326
- package/lib/esm/events/adapters/importers/fit/importer.fit.srm.device.names.js +0 -7
- package/lib/esm/events/adapters/importers/fit/importer.fit.suunto.device.names.js +0 -16
- package/lib/esm/events/adapters/importers/fit/importer.fit.wahoo.device.names.js +0 -10
- package/lib/esm/events/adapters/importers/gpx/gx-parser.js +0 -36
- package/lib/esm/events/adapters/importers/gpx/importer.gpx.integration.spec.js +0 -44
- package/lib/esm/events/adapters/importers/gpx/importer.gpx.js +0 -102
- package/lib/esm/events/adapters/importers/gpx/importer.gpx.mapper.js +0 -142
- package/lib/esm/events/adapters/importers/gpx/importer.gpx.spec.js +0 -71
- package/lib/esm/events/adapters/importers/json/importer.json.js +0 -160
- package/lib/esm/events/adapters/importers/sample-info.interface.js +0 -1
- package/lib/esm/events/adapters/importers/suunto/importer.suunto.activity.ids.js +0 -85
- package/lib/esm/events/adapters/importers/suunto/importer.suunto.device.names.js +0 -26
- package/lib/esm/events/adapters/importers/suunto/importer.suunto.integration.spec.js +0 -44
- package/lib/esm/events/adapters/importers/suunto/importer.suunto.json.js +0 -717
- package/lib/esm/events/adapters/importers/suunto/importer.suunto.sml.js +0 -125
- package/lib/esm/events/adapters/importers/tcx/importer.tcx.integration.spec.js +0 -46
- package/lib/esm/events/adapters/importers/tcx/importer.tcx.js +0 -442
- package/lib/esm/events/adapters/importers/tcx/importer.tcx.mapper.js +0 -91
- package/lib/esm/events/adapters/importers/tcx/utils.tcx.js +0 -36
- package/lib/esm/events/event.interface.js +0 -1
- package/lib/esm/events/event.js +0 -123
- package/lib/esm/events/event.json.interface.js +0 -1
- package/lib/esm/events/event.spec.js +0 -51
- package/lib/esm/events/utilities/activity.utilities.js +0 -1841
- package/lib/esm/events/utilities/activity.utilities.spec.js +0 -373
- package/lib/esm/events/utilities/event.utilities.js +0 -57
- package/lib/esm/events/utilities/grade-calculator/grade-calculator.js +0 -121
- package/lib/esm/events/utilities/grade-calculator/grade-calculator.spec.js +0 -93
- package/lib/esm/events/utilities/grade-calculator/low-pass-filter.js +0 -86
- package/lib/esm/events/utilities/helpers.js +0 -162
- package/lib/esm/geodesy/adapters/adapter.interface.js +0 -1
- package/lib/esm/geodesy/adapters/geolib.adapter.js +0 -28
- package/lib/esm/id/id.abstract.class.js +0 -9
- package/lib/esm/id/id.class.interface.js +0 -1
- package/lib/esm/id/id.class.spec.js +0 -13
- package/lib/esm/intensity-zones/intensity-zones.interface.js +0 -1
- package/lib/esm/intensity-zones/intensity-zones.js +0 -29
- package/lib/esm/intensity-zones/intensity-zones.json.interface.js +0 -1
- package/lib/esm/intensity-zones/intensity-zones.spec.js +0 -30
- package/lib/esm/laps/lap.interface.js +0 -1
- package/lib/esm/laps/lap.js +0 -29
- package/lib/esm/laps/lap.json.interface.js +0 -1
- package/lib/esm/laps/lap.types.js +0 -52
- package/lib/esm/meta-data/event-meta-data.interface.js +0 -6
- package/lib/esm/meta-data/meta-data.js +0 -57
- package/lib/esm/meta-data/meta-data.json.interface.js +0 -1
- package/lib/esm/privacy/privacy.class.interface.js +0 -5
- package/lib/esm/serializable/serializable.class.interface.js +0 -1
- package/lib/esm/service-tokens/oauth1-service-token.interface.js +0 -1
- package/lib/esm/service-tokens/oauth2-service-token.interface.js +0 -1
- package/lib/esm/specs/activities-parsing.integration.spec.js +0 -1847
- package/lib/esm/specs/activity-duration-stream.integration.spec.js +0 -57
- package/lib/esm/specs/fixtures/streams/strava/rides/3171472783.json +0 -52534
- package/lib/esm/specs/fixtures/streams/strava/rides/3171487458.json +0 -78818
- package/lib/esm/specs/fixtures/streams/strava/rides/343080886.json +0 -105090
- package/lib/esm/specs/fixtures/streams/strava/rides/5910143591.json +0 -110711
- package/lib/esm/specs/fixtures/streams/strava/runs/2451375851.json +0 -74846
- package/lib/esm/specs/fixtures/streams/strava/runs/2709634581.json +0 -66817
- package/lib/esm/specs/fixtures/streams/strava/runs/3156040843.json +0 -17594
- package/lib/esm/specs/fixtures/streams/strava/runs/3182900697.json +0 -17322
- package/lib/esm/specs/fixtures/streams/strava/runs/3183465494.json +0 -20463
- package/lib/esm/specs/fixtures/streams/strava/runs/3183490558.json +0 -58202
- package/lib/esm/specs/spec-utils.js +0 -159
- package/lib/esm/specs/strava-streams-compliance.spec.js +0 -951
- package/lib/esm/stats/stats.class.abstract.js +0 -32
- package/lib/esm/stats/stats.class.interface.js +0 -1
- package/lib/esm/stats/stats.json.interface.js +0 -1
- package/lib/esm/streams/compressed.stream.interface.js +0 -12
- package/lib/esm/streams/ibi-stream.js +0 -43
- package/lib/esm/streams/low-pass.stream.filter.js +0 -9
- package/lib/esm/streams/stream.filter.interface.js +0 -1
- package/lib/esm/streams/stream.interface.js +0 -1
- package/lib/esm/streams/stream.js +0 -72
- package/lib/esm/streams/stream.spec.js +0 -168
- package/lib/esm/tiles/tile.settings.interface.js +0 -41
- package/lib/esm/users/settings/dashboard/user.dashboard.settings.interface.js +0 -13
- package/lib/esm/users/settings/user.app.settings.interface.js +0 -5
- package/lib/esm/users/settings/user.chart.settings.interface.js +0 -23
- package/lib/esm/users/settings/user.map.settings.interface.js +0 -22
- package/lib/esm/users/settings/user.my-tracks.settings.interface.js +0 -1
- package/lib/esm/users/settings/user.settings.interface.js +0 -1
- package/lib/esm/users/settings/user.stats-settings.interface.js +0 -1
- package/lib/esm/users/settings/user.summaries.settings.interface.js +0 -1
- package/lib/esm/users/settings/user.unit.settings.interface.js +0 -73
- package/lib/esm/users/user.account.privileges.interface.js +0 -1
- package/lib/esm/users/user.export-to-csv.settings.interface.js +0 -1
- package/lib/esm/users/user.interface.js +0 -1
- package/lib/esm/users/user.js +0 -38
- package/lib/esm/users/user.service.meta.interface.js +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sports-alliance/sports-lib",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.9",
|
|
4
4
|
"description": "A Library to for importing / exporting and processing GPX, TCX, FIT and JSON files from services such as Strava, Movescount, Garmin, Polar etc",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gpx",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
34
|
"scripts": {
|
|
35
|
-
"build": "npm run clean && tsc --project tsconfig.esm.json && tsc --project tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > lib/cjs/package.json && echo '{\"type\": \"module\"}' > lib/esm/package.json",
|
|
35
|
+
"build": "npm run clean && tsc --emitDeclarationOnly --outDir lib/esm --project tsconfig.esm.json && tsc --project tsconfig.cjs.json && esbuild src/index.ts --bundle --format=esm --outfile=lib/esm/index.js --platform=node --external:fast-xml-parser --external:fit-file-parser --external:geolib --external:gpx-builder --external:kalmanjs --external:lowpassf --external:moving-median --external:xmldom --external:tslib --external:@garmin/fitsdk && echo '{\"type\": \"commonjs\"}' > lib/cjs/package.json && echo '{\"type\": \"module\"}' > lib/esm/package.json",
|
|
36
36
|
"watch": "npm run build -- --watch",
|
|
37
37
|
"clean": "rimraf ./lib/",
|
|
38
38
|
"generate:docs": "npm run build && typedoc --out docs --target es6 --theme minimal --mode file src",
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export class ActivityParsingOptions {
|
|
2
|
-
constructor(options) {
|
|
3
|
-
var _a, _b, _c;
|
|
4
|
-
this.streams = (_a = options.streams) !== null && _a !== void 0 ? _a : {
|
|
5
|
-
smooth: { altitudeSmooth: true, grade: true, gradeSmooth: true },
|
|
6
|
-
fixAbnormal: { speed: false }
|
|
7
|
-
};
|
|
8
|
-
this.maxActivityDurationDays = (_b = options.maxActivityDurationDays) !== null && _b !== void 0 ? _b : 14;
|
|
9
|
-
this.generateUnitStreams = (_c = options.generateUnitStreams) !== null && _c !== void 0 ? _c : true;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
ActivityParsingOptions.DEFAULT = new ActivityParsingOptions({
|
|
13
|
-
streams: {
|
|
14
|
-
smooth: { altitudeSmooth: true, grade: true, gradeSmooth: true },
|
|
15
|
-
fixAbnormal: { speed: false }
|
|
16
|
-
},
|
|
17
|
-
maxActivityDurationDays: 14,
|
|
18
|
-
generateUnitStreams: true
|
|
19
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
import { ActivityTypes } from './activity.types';
|
|
2
|
-
import { DurationClassAbstract } from '../duration/duration.class.abstract';
|
|
3
|
-
import { DataLatitudeDegrees } from '../data/data.latitude-degrees';
|
|
4
|
-
import { DataLongitudeDegrees } from '../data/data.longitude-degrees';
|
|
5
|
-
import { Stream } from '../streams/stream';
|
|
6
|
-
import { isNumber } from '../events/utilities/helpers';
|
|
7
|
-
import { DataPower } from '../data/data.power';
|
|
8
|
-
import { DataStartEvent } from '../data/data.start-event';
|
|
9
|
-
import { DataStopEvent } from '../data/data.stop-event';
|
|
10
|
-
import { DataStopAllEvent } from '../data/data.stop-all-event';
|
|
11
|
-
import { DataTime } from '../data/data.time';
|
|
12
|
-
import { ActivityUtilities } from '../events/utilities/activity.utilities';
|
|
13
|
-
import { DataDistance } from '../data/data.distance';
|
|
14
|
-
import { DataDuration } from '../data/data.duration';
|
|
15
|
-
import { DataRiderPositionChangeEvent } from '../data/data.rider-position-change-event';
|
|
16
|
-
import { ActivityParsingOptions } from './activity-parsing-options';
|
|
17
|
-
import { ParsingEventLibError } from '../errors/parsing-event-lib.error';
|
|
18
|
-
import { DurationExceededEventLibError } from '../errors/duration-exceeded-event-lib.error';
|
|
19
|
-
export class Activity extends DurationClassAbstract {
|
|
20
|
-
constructor(startDate, endDate, type, creator, options = ActivityParsingOptions.DEFAULT, name = '') {
|
|
21
|
-
super(startDate, endDate);
|
|
22
|
-
this.intensityZones = []; // maybe rename
|
|
23
|
-
this.laps = [];
|
|
24
|
-
this.streams = [];
|
|
25
|
-
this.events = [];
|
|
26
|
-
if (!startDate || !endDate) {
|
|
27
|
-
throw new ParsingEventLibError('Start and end dates are required');
|
|
28
|
-
}
|
|
29
|
-
if (endDate < startDate) {
|
|
30
|
-
throw new ParsingEventLibError('Activity end date is before the start date and that is not acceptable');
|
|
31
|
-
}
|
|
32
|
-
if (+endDate - +startDate > options.maxActivityDurationDays * 24 * 60 * 60 * 1000) {
|
|
33
|
-
throw new DurationExceededEventLibError(`Activity duration exceeds ${options.maxActivityDurationDays} days. That is not supported`);
|
|
34
|
-
}
|
|
35
|
-
this.type = type;
|
|
36
|
-
this.creator = creator;
|
|
37
|
-
this.parseOptions = options;
|
|
38
|
-
this.name = name;
|
|
39
|
-
}
|
|
40
|
-
createStream(type) {
|
|
41
|
-
const stream = new Stream(type, Array(ActivityUtilities.getDataLength(this.startDate, this.endDate)).fill(null));
|
|
42
|
-
return stream;
|
|
43
|
-
}
|
|
44
|
-
addDataToStream(type, date, value) {
|
|
45
|
-
this.getStreamData(type)[this.getDateIndex(date)] = value;
|
|
46
|
-
return this;
|
|
47
|
-
}
|
|
48
|
-
addStream(stream) {
|
|
49
|
-
if (this.streams.find(activityStream => activityStream.type === stream.type)) {
|
|
50
|
-
throw new Error(`Duplicate type of stream when adding ${stream.type} to activity ${this.getID()} `);
|
|
51
|
-
}
|
|
52
|
-
this.streams.push(stream);
|
|
53
|
-
return this;
|
|
54
|
-
}
|
|
55
|
-
clearStreams() {
|
|
56
|
-
this.streams = [];
|
|
57
|
-
return this;
|
|
58
|
-
}
|
|
59
|
-
removeStream(streamType) {
|
|
60
|
-
const stream = streamType instanceof Stream ? streamType : this.getStream(streamType);
|
|
61
|
-
this.streams = this.streams.filter(activityStream => stream !== activityStream);
|
|
62
|
-
return this;
|
|
63
|
-
}
|
|
64
|
-
replaceStreamData(streamType, data) {
|
|
65
|
-
this.removeStream(streamType);
|
|
66
|
-
this.addStream(this.createStream(streamType).setData(data));
|
|
67
|
-
return this;
|
|
68
|
-
}
|
|
69
|
-
addStreams(streams) {
|
|
70
|
-
this.streams.push(...streams);
|
|
71
|
-
return this;
|
|
72
|
-
}
|
|
73
|
-
getAllStreams() {
|
|
74
|
-
return this.streams;
|
|
75
|
-
}
|
|
76
|
-
// @todo needs more logic improvement and transparency
|
|
77
|
-
getAllExportableStreams() {
|
|
78
|
-
return this.getAllStreams().filter(stream => stream.isExportable());
|
|
79
|
-
}
|
|
80
|
-
hasStreamData(streamType, startDate, endDate) {
|
|
81
|
-
try {
|
|
82
|
-
this.getStreamData(streamType, startDate, endDate);
|
|
83
|
-
}
|
|
84
|
-
catch (e) {
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
|
-
return true;
|
|
88
|
-
}
|
|
89
|
-
hasPositionData(startDate, endDate) {
|
|
90
|
-
return (this.hasStreamData(DataLatitudeDegrees.type, startDate, endDate) &&
|
|
91
|
-
this.hasStreamData(DataLongitudeDegrees.type, startDate, endDate));
|
|
92
|
-
}
|
|
93
|
-
isTrainer() {
|
|
94
|
-
return Activity.TRAINER_TYPES.indexOf(this.type) !== -1;
|
|
95
|
-
}
|
|
96
|
-
hasPowerMeter() {
|
|
97
|
-
return this.hasStreamData(DataPower.type);
|
|
98
|
-
}
|
|
99
|
-
getStream(streamType) {
|
|
100
|
-
const find = this.streams.find(stream => stream.type === streamType);
|
|
101
|
-
if (!find) {
|
|
102
|
-
throw Error(`No stream found with type ${streamType} `);
|
|
103
|
-
}
|
|
104
|
-
return find;
|
|
105
|
-
}
|
|
106
|
-
getStreamData(streamType, startDate, endDate) {
|
|
107
|
-
const stream = streamType instanceof Stream ? streamType : this.getStream(streamType);
|
|
108
|
-
if (!startDate && !endDate) {
|
|
109
|
-
return stream.getData();
|
|
110
|
-
}
|
|
111
|
-
if (startDate && endDate) {
|
|
112
|
-
return stream
|
|
113
|
-
.getData()
|
|
114
|
-
.filter((value, index) => new Date(this.startDate.getTime() + index * 1000) <= endDate)
|
|
115
|
-
.filter((value, index) => new Date(this.startDate.getTime() + index * 1000) >= startDate);
|
|
116
|
-
}
|
|
117
|
-
if (startDate) {
|
|
118
|
-
return stream.getData().filter((value, index) => new Date(this.startDate.getTime() + index * 1000) > startDate);
|
|
119
|
-
}
|
|
120
|
-
if (endDate) {
|
|
121
|
-
return stream.getData().filter((value, index) => new Date(this.startDate.getTime() + index * 1000) < endDate);
|
|
122
|
-
}
|
|
123
|
-
return [];
|
|
124
|
-
}
|
|
125
|
-
// @todo see how this fits with the filtering on the stream class
|
|
126
|
-
/**
|
|
127
|
-
* Gets the data array of an activity stream excluding the non numeric ones
|
|
128
|
-
* @todo include strings and all data abstract types
|
|
129
|
-
* @param streamType
|
|
130
|
-
* @param startDate
|
|
131
|
-
* @param endDate
|
|
132
|
-
*/
|
|
133
|
-
getSquashedStreamData(streamType, startDate, endDate) {
|
|
134
|
-
return this.getStreamData(streamType, startDate, endDate).filter(data => isNumber(data));
|
|
135
|
-
}
|
|
136
|
-
getPositionData(startDate, endDate) {
|
|
137
|
-
const latitudeStreamData = this.getStreamData(DataLatitudeDegrees.type, startDate, endDate);
|
|
138
|
-
const longitudeStreamData = this.getStreamData(DataLongitudeDegrees.type, startDate, endDate);
|
|
139
|
-
return latitudeStreamData.reduce((positionArray, value, index, array) => {
|
|
140
|
-
const currentLatitude = latitudeStreamData[index];
|
|
141
|
-
const currentLongitude = longitudeStreamData[index];
|
|
142
|
-
if (!isNumber(currentLatitude) || !isNumber(currentLongitude)) {
|
|
143
|
-
positionArray.push(null);
|
|
144
|
-
return positionArray;
|
|
145
|
-
}
|
|
146
|
-
positionArray.push({
|
|
147
|
-
latitudeDegrees: currentLatitude,
|
|
148
|
-
longitudeDegrees: currentLongitude
|
|
149
|
-
});
|
|
150
|
-
return positionArray;
|
|
151
|
-
}, []);
|
|
152
|
-
}
|
|
153
|
-
getSquashedPositionData(startDate, endDate) {
|
|
154
|
-
return this.getPositionData(startDate, endDate).filter(data => data !== null);
|
|
155
|
-
}
|
|
156
|
-
getStreamDataTypesBasedOnDataType(streamTypeToBaseOn, streamTypes) {
|
|
157
|
-
return ActivityUtilities.getStreamDataTypesBasedOnDataType(this.getStream(streamTypeToBaseOn), this.getAllStreams()
|
|
158
|
-
.filter(stream => stream.type !== streamTypeToBaseOn)
|
|
159
|
-
.filter(stream => streamTypes.indexOf(stream.type) !== -1));
|
|
160
|
-
}
|
|
161
|
-
getStreamDataTypesBasedOnTime(streamTypes) {
|
|
162
|
-
return ActivityUtilities.getStreamDataTypesBasedOnTime(this.startDate, this.endDate, !streamTypes
|
|
163
|
-
? this.getAllStreams()
|
|
164
|
-
: this.getAllStreams().filter(stream => streamTypes.indexOf(stream.type) !== -1));
|
|
165
|
-
}
|
|
166
|
-
getStreamDataByTime(streamType, filterNull = false, filterInfinity = false) {
|
|
167
|
-
return this.getStream(streamType).getStreamDataByTime(this.startDate, filterNull, filterInfinity);
|
|
168
|
-
}
|
|
169
|
-
getStreamDataByDuration(streamType, filterNull = false, filterInfinity = false) {
|
|
170
|
-
return this.getStream(streamType).getStreamDataByDuration(0, filterNull, filterInfinity);
|
|
171
|
-
}
|
|
172
|
-
addLap(lap) {
|
|
173
|
-
this.laps.push(lap);
|
|
174
|
-
return this;
|
|
175
|
-
}
|
|
176
|
-
getLaps(activity) {
|
|
177
|
-
return this.laps;
|
|
178
|
-
}
|
|
179
|
-
hasLaps() {
|
|
180
|
-
return this.laps.length > 0;
|
|
181
|
-
}
|
|
182
|
-
getAllEvents() {
|
|
183
|
-
return this.events;
|
|
184
|
-
}
|
|
185
|
-
getStartEvents() {
|
|
186
|
-
return this.events.filter(event => event instanceof DataStartEvent);
|
|
187
|
-
}
|
|
188
|
-
getStopEvents() {
|
|
189
|
-
return this.events.filter(event => event instanceof DataStopEvent);
|
|
190
|
-
}
|
|
191
|
-
getStopAllEvents() {
|
|
192
|
-
return this.events.filter(event => event instanceof DataStopAllEvent);
|
|
193
|
-
}
|
|
194
|
-
getAllRiderPositionChangeEvents() {
|
|
195
|
-
return this.events.filter(event => event instanceof DataRiderPositionChangeEvent);
|
|
196
|
-
}
|
|
197
|
-
addEvent(event) {
|
|
198
|
-
this.events.push(event);
|
|
199
|
-
return this;
|
|
200
|
-
}
|
|
201
|
-
setAllEvents(events) {
|
|
202
|
-
this.events = events;
|
|
203
|
-
return this;
|
|
204
|
-
}
|
|
205
|
-
generateTimeStream(streamTypes = []) {
|
|
206
|
-
const timeStream = this.createStream(DataTime.type);
|
|
207
|
-
let streams = this.getAllStreams();
|
|
208
|
-
if (streamTypes.length) {
|
|
209
|
-
streams = streams.filter(stream => streamTypes.indexOf(stream.type) !== -1);
|
|
210
|
-
}
|
|
211
|
-
streams.forEach(stream => {
|
|
212
|
-
this.getStreamDataByDuration(stream.type, true, false).forEach((data) => {
|
|
213
|
-
timeStream.getData()[data.time / 1000] = data.time / 1000;
|
|
214
|
-
});
|
|
215
|
-
});
|
|
216
|
-
return timeStream;
|
|
217
|
-
}
|
|
218
|
-
generateDurationStream(streamTypes = []) {
|
|
219
|
-
const timeStream = this.generateTimeStream(streamTypes);
|
|
220
|
-
const durationStream = this.createStream(DataDuration.type);
|
|
221
|
-
durationStream.setData(timeStream.getData());
|
|
222
|
-
return durationStream;
|
|
223
|
-
}
|
|
224
|
-
getDateIndex(date) {
|
|
225
|
-
// @todo ceil vs floor (still debatable)
|
|
226
|
-
return Math.round((+date - +this.startDate) / 1000);
|
|
227
|
-
}
|
|
228
|
-
toJSON() {
|
|
229
|
-
const intensityZones = [];
|
|
230
|
-
this.intensityZones.forEach((value) => {
|
|
231
|
-
intensityZones.push(value.toJSON());
|
|
232
|
-
});
|
|
233
|
-
const stats = {};
|
|
234
|
-
this.stats.forEach((value, key) => {
|
|
235
|
-
Object.assign(stats, value.toJSON());
|
|
236
|
-
});
|
|
237
|
-
// Fetch streams from activity
|
|
238
|
-
const streams = this.getAllStreams().reduce((streams, stream) => {
|
|
239
|
-
streams.push(stream.toJSON());
|
|
240
|
-
return streams;
|
|
241
|
-
}, []);
|
|
242
|
-
// Now append missing time stream to JSON export
|
|
243
|
-
if (streams === null || streams === void 0 ? void 0 : streams.length) {
|
|
244
|
-
const stream = streams.find(s => s.type === DataDistance.type) || streams[0];
|
|
245
|
-
const timeStream = this.generateTimeStream([stream.type]).toJSON();
|
|
246
|
-
streams.push(timeStream);
|
|
247
|
-
}
|
|
248
|
-
return {
|
|
249
|
-
name: this.name || null,
|
|
250
|
-
startDate: this.startDate.getTime(),
|
|
251
|
-
endDate: this.endDate.getTime(),
|
|
252
|
-
type: this.type,
|
|
253
|
-
creator: this.creator.toJSON(),
|
|
254
|
-
intensityZones: intensityZones,
|
|
255
|
-
powerMeter: this.hasPowerMeter(),
|
|
256
|
-
trainer: this.isTrainer(),
|
|
257
|
-
stats: stats,
|
|
258
|
-
streams: streams,
|
|
259
|
-
events: this.getAllEvents().reduce((eventsArray, event) => {
|
|
260
|
-
eventsArray.push(event.toJSON());
|
|
261
|
-
return eventsArray;
|
|
262
|
-
}, []),
|
|
263
|
-
laps: this.getLaps().reduce((jsonLapsArray, lap) => {
|
|
264
|
-
jsonLapsArray.push(lap.toJSON(this));
|
|
265
|
-
return jsonLapsArray;
|
|
266
|
-
}, [])
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
Activity.TRAINER_TYPES = [
|
|
271
|
-
ActivityTypes.VirtualRun,
|
|
272
|
-
ActivityTypes.VirtualCycling,
|
|
273
|
-
ActivityTypes.Treadmill,
|
|
274
|
-
ActivityTypes.IndoorCycling,
|
|
275
|
-
ActivityTypes.IndoorRunning,
|
|
276
|
-
ActivityTypes.IndoorRowing,
|
|
277
|
-
ActivityTypes.Crosstrainer,
|
|
278
|
-
ActivityTypes.EllipticalTrainer,
|
|
279
|
-
ActivityTypes.FitnessEquipment,
|
|
280
|
-
ActivityTypes.StairStepper
|
|
281
|
-
];
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,348 +0,0 @@
|
|
|
1
|
-
import { Activity } from './activity';
|
|
2
|
-
import { DataHeartRate } from '../data/data.heart-rate';
|
|
3
|
-
import { DataAltitude } from '../data/data.altitude';
|
|
4
|
-
import { ActivityTypes } from './activity.types';
|
|
5
|
-
import { Creator } from '../creators/creator';
|
|
6
|
-
import { Stream } from '../streams/stream';
|
|
7
|
-
import { DataDistance } from '../data/data.distance';
|
|
8
|
-
import { DataStopEvent } from '../data/data.stop-event';
|
|
9
|
-
import { DataStartEvent } from '../data/data.start-event';
|
|
10
|
-
import { DataStopAllEvent } from '../data/data.stop-all-event';
|
|
11
|
-
describe('Activity', () => {
|
|
12
|
-
let activity;
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
// New activity that ends +6m and is 10s duration from new Date(0)
|
|
15
|
-
activity = new Activity(new Date(0), new Date(new Date(0).getTime() + 10000), ActivityTypes.Running, new Creator('Test'));
|
|
16
|
-
activity.setID('123');
|
|
17
|
-
});
|
|
18
|
-
it('should get streams based on time', () => {
|
|
19
|
-
activity.addStream(new Stream(DataAltitude.type, [200, 500, null, 502, null, 600, 700]));
|
|
20
|
-
activity.addStream(new Stream(DataDistance.type, [0, 10, 20, 30, 40, 50, 60]));
|
|
21
|
-
expect(activity.getStreamDataTypesBasedOnTime([DataAltitude.type])).toEqual({
|
|
22
|
-
0: {
|
|
23
|
-
Altitude: 200
|
|
24
|
-
},
|
|
25
|
-
1000: {
|
|
26
|
-
Altitude: 500
|
|
27
|
-
},
|
|
28
|
-
3000: {
|
|
29
|
-
Altitude: 502
|
|
30
|
-
},
|
|
31
|
-
5000: {
|
|
32
|
-
Altitude: 600
|
|
33
|
-
},
|
|
34
|
-
6000: {
|
|
35
|
-
Altitude: 700
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
expect(activity.getStreamDataTypesBasedOnTime([DataDistance.type])).toEqual({
|
|
39
|
-
0: { Distance: 0 },
|
|
40
|
-
1000: { Distance: 10 },
|
|
41
|
-
2000: { Distance: 20 },
|
|
42
|
-
3000: { Distance: 30 },
|
|
43
|
-
4000: { Distance: 40 },
|
|
44
|
-
5000: { Distance: 50 },
|
|
45
|
-
6000: { Distance: 60 }
|
|
46
|
-
});
|
|
47
|
-
expect(activity.getStreamDataTypesBasedOnTime([DataAltitude.type, DataDistance.type])).toEqual({
|
|
48
|
-
0: {
|
|
49
|
-
Altitude: 200,
|
|
50
|
-
Distance: 0
|
|
51
|
-
},
|
|
52
|
-
1000: { Altitude: 500, Distance: 10 },
|
|
53
|
-
2000: { Distance: 20 },
|
|
54
|
-
3000: { Altitude: 502, Distance: 30 },
|
|
55
|
-
4000: { Distance: 40 },
|
|
56
|
-
5000: { Altitude: 600, Distance: 50 },
|
|
57
|
-
6000: { Altitude: 700, Distance: 60 }
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
it('should get streams based on another stream', () => {
|
|
61
|
-
activity.addStream(new Stream(DataAltitude.type, [200, 500, null, 502, null, 500, 700]));
|
|
62
|
-
activity.addStream(new Stream(DataHeartRate.type, [60, 70, 80, null, null, null, 120]));
|
|
63
|
-
activity.addStream(new Stream(DataDistance.type, [0, 10, 20, 30, 40, 50, 60]));
|
|
64
|
-
expect(activity.getStreamDataTypesBasedOnDataType(DataDistance.type, [DataAltitude.type])).toEqual([
|
|
65
|
-
{
|
|
66
|
-
Altitude: 200,
|
|
67
|
-
Distance: 0
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
Altitude: 500,
|
|
71
|
-
Distance: 10
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
Altitude: null,
|
|
75
|
-
Distance: 20
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
Altitude: 502,
|
|
79
|
-
Distance: 30
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
Altitude: null,
|
|
83
|
-
Distance: 40
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
Altitude: 500,
|
|
87
|
-
Distance: 50
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
Altitude: 700,
|
|
91
|
-
Distance: 60
|
|
92
|
-
}
|
|
93
|
-
]);
|
|
94
|
-
expect(activity.getStreamDataTypesBasedOnDataType(DataDistance.type, [DataHeartRate.type, DataAltitude.type])).toEqual([
|
|
95
|
-
{
|
|
96
|
-
Altitude: 200,
|
|
97
|
-
Distance: 0,
|
|
98
|
-
'Heart Rate': 60
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
Altitude: 500,
|
|
102
|
-
Distance: 10,
|
|
103
|
-
'Heart Rate': 70
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
Altitude: null,
|
|
107
|
-
Distance: 20,
|
|
108
|
-
'Heart Rate': 80
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
Altitude: 502,
|
|
112
|
-
Distance: 30,
|
|
113
|
-
'Heart Rate': null
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
Altitude: null,
|
|
117
|
-
Distance: 40,
|
|
118
|
-
'Heart Rate': null
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
Altitude: 500,
|
|
122
|
-
Distance: 50,
|
|
123
|
-
'Heart Rate': null
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
Altitude: 700,
|
|
127
|
-
Distance: 60,
|
|
128
|
-
'Heart Rate': 120
|
|
129
|
-
}
|
|
130
|
-
]);
|
|
131
|
-
expect(activity.getStreamDataTypesBasedOnDataType(DataAltitude.type, [DataDistance.type, DataHeartRate.type])).toEqual([
|
|
132
|
-
{
|
|
133
|
-
Altitude: 200,
|
|
134
|
-
Distance: 0,
|
|
135
|
-
'Heart Rate': 60
|
|
136
|
-
},
|
|
137
|
-
{
|
|
138
|
-
Altitude: 500,
|
|
139
|
-
Distance: 10,
|
|
140
|
-
'Heart Rate': 70
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
Altitude: 502,
|
|
144
|
-
Distance: 30,
|
|
145
|
-
'Heart Rate': null
|
|
146
|
-
},
|
|
147
|
-
{
|
|
148
|
-
Altitude: 500,
|
|
149
|
-
Distance: 50,
|
|
150
|
-
'Heart Rate': null
|
|
151
|
-
},
|
|
152
|
-
{
|
|
153
|
-
Altitude: 700,
|
|
154
|
-
Distance: 60,
|
|
155
|
-
'Heart Rate': 120
|
|
156
|
-
}
|
|
157
|
-
]);
|
|
158
|
-
});
|
|
159
|
-
describe('Trainer flagging', () => {
|
|
160
|
-
it('should flag activities to be performed on a trainer', () => {
|
|
161
|
-
// Given
|
|
162
|
-
const types = [
|
|
163
|
-
ActivityTypes.VirtualRun,
|
|
164
|
-
ActivityTypes.VirtualCycling,
|
|
165
|
-
ActivityTypes.Treadmill,
|
|
166
|
-
ActivityTypes.IndoorCycling,
|
|
167
|
-
ActivityTypes.IndoorRunning,
|
|
168
|
-
ActivityTypes.IndoorRowing,
|
|
169
|
-
ActivityTypes.Crosstrainer,
|
|
170
|
-
ActivityTypes.EllipticalTrainer,
|
|
171
|
-
ActivityTypes.FitnessEquipment,
|
|
172
|
-
ActivityTypes.StairStepper
|
|
173
|
-
];
|
|
174
|
-
// When, Then
|
|
175
|
-
types.forEach(type => {
|
|
176
|
-
const fakeActivity = new Activity(new Date(), new Date(), type, new Creator('John doo'));
|
|
177
|
-
expect(fakeActivity.isTrainer()).toBeTruthy();
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
it('should NOT flag activities to be performed on a trainer', () => {
|
|
181
|
-
// Given
|
|
182
|
-
const types = [
|
|
183
|
-
ActivityTypes.Aerobics,
|
|
184
|
-
ActivityTypes.AlpineSkiing,
|
|
185
|
-
ActivityTypes.AmericanFootball,
|
|
186
|
-
ActivityTypes.Aquathlon,
|
|
187
|
-
ActivityTypes.BackcountrySkiing,
|
|
188
|
-
ActivityTypes.Badminton,
|
|
189
|
-
ActivityTypes.Baseball,
|
|
190
|
-
ActivityTypes.Basketball,
|
|
191
|
-
ActivityTypes.Boxing,
|
|
192
|
-
ActivityTypes.Canoeing,
|
|
193
|
-
ActivityTypes.CardioTraining,
|
|
194
|
-
ActivityTypes.Climbing,
|
|
195
|
-
ActivityTypes.Combat,
|
|
196
|
-
ActivityTypes.Cricket,
|
|
197
|
-
ActivityTypes.Crossfit,
|
|
198
|
-
ActivityTypes.CrosscountrySkiing,
|
|
199
|
-
ActivityTypes.Cycling,
|
|
200
|
-
ActivityTypes.Dancing,
|
|
201
|
-
ActivityTypes.Diving,
|
|
202
|
-
ActivityTypes.DownhillSkiing,
|
|
203
|
-
ActivityTypes.Driving,
|
|
204
|
-
ActivityTypes.Duathlon,
|
|
205
|
-
ActivityTypes.EBikeRide,
|
|
206
|
-
ActivityTypes.Fishing,
|
|
207
|
-
ActivityTypes.FlexibilityTraining,
|
|
208
|
-
ActivityTypes.FloorClimbing,
|
|
209
|
-
ActivityTypes.Floorball,
|
|
210
|
-
ActivityTypes.Flying,
|
|
211
|
-
ActivityTypes.Football,
|
|
212
|
-
ActivityTypes.FreeDiving,
|
|
213
|
-
ActivityTypes.Frisbee,
|
|
214
|
-
ActivityTypes.Generic,
|
|
215
|
-
ActivityTypes.Golf,
|
|
216
|
-
ActivityTypes.Gymnastics,
|
|
217
|
-
ActivityTypes.Handcycle,
|
|
218
|
-
ActivityTypes.Handball,
|
|
219
|
-
ActivityTypes.HangGliding,
|
|
220
|
-
ActivityTypes.Hiking,
|
|
221
|
-
ActivityTypes.HorsebackRiding,
|
|
222
|
-
ActivityTypes.IceHockey,
|
|
223
|
-
ActivityTypes.IceSkating,
|
|
224
|
-
ActivityTypes.IndoorTraining,
|
|
225
|
-
ActivityTypes.InlineSkating,
|
|
226
|
-
ActivityTypes.Kayaking,
|
|
227
|
-
ActivityTypes.Kettlebell,
|
|
228
|
-
ActivityTypes.Kitesurfing,
|
|
229
|
-
ActivityTypes.Motorcycling,
|
|
230
|
-
ActivityTypes.Motorsports,
|
|
231
|
-
ActivityTypes.MountainBiking,
|
|
232
|
-
ActivityTypes.Mountaineering,
|
|
233
|
-
ActivityTypes.NordicWalking,
|
|
234
|
-
ActivityTypes.OpenWaterSwimming,
|
|
235
|
-
ActivityTypes.Orienteering,
|
|
236
|
-
ActivityTypes.Paddling,
|
|
237
|
-
ActivityTypes.Paragliding,
|
|
238
|
-
ActivityTypes.Rafting,
|
|
239
|
-
ActivityTypes.RockClimbing,
|
|
240
|
-
ActivityTypes.RollerSki,
|
|
241
|
-
ActivityTypes.Rowing,
|
|
242
|
-
ActivityTypes.Rugby,
|
|
243
|
-
ActivityTypes.Running,
|
|
244
|
-
ActivityTypes.Sailing,
|
|
245
|
-
ActivityTypes.ScubaDiving,
|
|
246
|
-
ActivityTypes.Skating,
|
|
247
|
-
ActivityTypes.SkiTouring,
|
|
248
|
-
ActivityTypes.SkyDiving,
|
|
249
|
-
ActivityTypes.Snorkeling,
|
|
250
|
-
ActivityTypes.Snowboarding,
|
|
251
|
-
ActivityTypes.Snowmobiling,
|
|
252
|
-
ActivityTypes.Snowshoeing,
|
|
253
|
-
ActivityTypes.Soccer,
|
|
254
|
-
ActivityTypes.Softball,
|
|
255
|
-
ActivityTypes.Squash,
|
|
256
|
-
ActivityTypes.StandUpPaddling,
|
|
257
|
-
ActivityTypes.StrengthTraining,
|
|
258
|
-
ActivityTypes.Stretching,
|
|
259
|
-
ActivityTypes.Surfing,
|
|
260
|
-
ActivityTypes.Swimming,
|
|
261
|
-
ActivityTypes.Swimrun,
|
|
262
|
-
ActivityTypes.TableTennis,
|
|
263
|
-
ActivityTypes.Tactical,
|
|
264
|
-
ActivityTypes.TelemarkSkiing,
|
|
265
|
-
ActivityTypes.Tennis,
|
|
266
|
-
ActivityTypes.TrackAndField,
|
|
267
|
-
ActivityTypes.TrailRunning,
|
|
268
|
-
ActivityTypes.Training,
|
|
269
|
-
ActivityTypes.Trekking,
|
|
270
|
-
ActivityTypes.Triathlon,
|
|
271
|
-
ActivityTypes.UnknownSport,
|
|
272
|
-
ActivityTypes.Velomobile,
|
|
273
|
-
ActivityTypes.Volleyball,
|
|
274
|
-
ActivityTypes.Wakeboarding,
|
|
275
|
-
ActivityTypes.Walking,
|
|
276
|
-
ActivityTypes.WaterSkiing,
|
|
277
|
-
ActivityTypes.WeightTraining,
|
|
278
|
-
ActivityTypes.Wheelchair,
|
|
279
|
-
ActivityTypes.Windsurfing,
|
|
280
|
-
ActivityTypes.Workout,
|
|
281
|
-
ActivityTypes.Yoga,
|
|
282
|
-
ActivityTypes.YogaPilates
|
|
283
|
-
];
|
|
284
|
-
// When, Then
|
|
285
|
-
types.forEach(type => {
|
|
286
|
-
const fakeActivity = new Activity(new Date(), new Date(), type, new Creator('John doo'));
|
|
287
|
-
expect(fakeActivity.isTrainer()).toBeFalsy();
|
|
288
|
-
});
|
|
289
|
-
});
|
|
290
|
-
});
|
|
291
|
-
it('should get the time stream', () => {
|
|
292
|
-
activity.addStreams([
|
|
293
|
-
// 0 1 2 3 4 5 6 7 8 9 and 10 are not set
|
|
294
|
-
new Stream(DataAltitude.type, [200, null, 502, Infinity, -Infinity, NaN, 0]),
|
|
295
|
-
new Stream(DataDistance.type, [0, null, 600, 700, 800, null, NaN, 900, Infinity])
|
|
296
|
-
]);
|
|
297
|
-
expect(activity.generateTimeStream().getData()).toEqual([0, null, 2, 3, 4, null, 6, 7, 8, null, null]);
|
|
298
|
-
expect(activity.generateTimeStream().getData(true)).toEqual([0, 2, 3, 4, 6, 7, 8]);
|
|
299
|
-
expect(activity.generateTimeStream().getData(false)).toEqual([0, null, 2, 3, 4, null, 6, 7, 8, null, null]);
|
|
300
|
-
});
|
|
301
|
-
it('should set the correct sample sizes', () => {
|
|
302
|
-
const stream = activity.createStream(DataAltitude.type);
|
|
303
|
-
expect(stream.getData().length).toBe(11);
|
|
304
|
-
});
|
|
305
|
-
it('should get and set the correct sample keys and ', () => {
|
|
306
|
-
const stream = activity.createStream(DataAltitude.type);
|
|
307
|
-
activity.addStream(stream);
|
|
308
|
-
activity.addDataToStream(DataAltitude.type, new Date(0), 0);
|
|
309
|
-
activity.addDataToStream(DataAltitude.type, new Date(500), 5);
|
|
310
|
-
activity.addDataToStream(DataAltitude.type, new Date(1040), 10);
|
|
311
|
-
activity.addDataToStream(DataAltitude.type, new Date(2010), 20);
|
|
312
|
-
activity.addDataToStream(DataAltitude.type, new Date(2060), 30);
|
|
313
|
-
activity.addDataToStream(DataAltitude.type, new Date(2080), 35);
|
|
314
|
-
activity.addDataToStream(DataAltitude.type, new Date(3000), 40);
|
|
315
|
-
activity.addDataToStream(DataAltitude.type, new Date(4000), 50);
|
|
316
|
-
activity.addDataToStream(DataAltitude.type, new Date(5000), 60);
|
|
317
|
-
activity.addDataToStream(DataAltitude.type, new Date(6300), 70);
|
|
318
|
-
activity.addDataToStream(DataAltitude.type, new Date(7000), 80);
|
|
319
|
-
activity.addDataToStream(DataAltitude.type, new Date(8000), 90);
|
|
320
|
-
activity.addDataToStream(DataAltitude.type, new Date(9000), 100);
|
|
321
|
-
activity.addDataToStream(DataAltitude.type, new Date(10000), 110);
|
|
322
|
-
expect(stream.getData()).toEqual([0, 10, 35, 40, 50, 60, 70, 80, 90, 100, 110]);
|
|
323
|
-
});
|
|
324
|
-
it('should get events correctly', () => {
|
|
325
|
-
activity.addEvent(new DataStopEvent(1));
|
|
326
|
-
activity.addEvent(new DataStopEvent(1));
|
|
327
|
-
activity.addEvent(new DataStartEvent(1));
|
|
328
|
-
activity.addEvent(new DataStartEvent(1));
|
|
329
|
-
activity.addEvent(new DataStopAllEvent(1));
|
|
330
|
-
expect(activity.getAllEvents().length).toBe(5);
|
|
331
|
-
expect(activity.getStartEvents().length).toBe(2);
|
|
332
|
-
expect(activity.getStopEvents().length).toBe(2);
|
|
333
|
-
expect(activity.getStopAllEvents().length).toBe(1);
|
|
334
|
-
});
|
|
335
|
-
it('should set all events', () => {
|
|
336
|
-
activity.setAllEvents([
|
|
337
|
-
new DataStopEvent(1),
|
|
338
|
-
new DataStopEvent(1),
|
|
339
|
-
new DataStartEvent(1),
|
|
340
|
-
new DataStartEvent(1),
|
|
341
|
-
new DataStopAllEvent(1)
|
|
342
|
-
]);
|
|
343
|
-
expect(activity.getAllEvents().length).toBe(5);
|
|
344
|
-
expect(activity.getStartEvents().length).toBe(2);
|
|
345
|
-
expect(activity.getStopEvents().length).toBe(2);
|
|
346
|
-
expect(activity.getStopAllEvents().length).toBe(1);
|
|
347
|
-
});
|
|
348
|
-
});
|