@johnmorrisdotca/uchusen-rockets 0.3.0 → 0.5.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/CHANGELOG.md +31 -5
- package/NOTICE.md +2 -0
- package/README.md +316 -4
- package/dist/assets/droneship-asog-landed.glb +0 -0
- package/dist/assets/droneship-asog.glb +0 -0
- package/dist/assets/droneship-jrti-landed.glb +0 -0
- package/dist/assets/droneship-jrti.glb +0 -0
- package/dist/assets/droneship-ocisly-landed.glb +0 -0
- package/dist/assets/droneship-ocisly.glb +0 -0
- package/dist/assets/falcon-9-block-5-dragon-2-first-stage.glb +0 -0
- package/dist/assets/falcon-9-block-5-dragon-2.glb +0 -0
- package/dist/assets/falcon-9-block-5-first-stage.glb +0 -0
- package/dist/assets/falcon-9-block-5.glb +0 -0
- package/dist/assets/falcon-9-ft-first-stage.glb +0 -0
- package/dist/assets/falcon-9-ft.glb +0 -0
- package/dist/assets/falcon-9-v1.1-first-stage.glb +0 -0
- package/dist/assets/falcon-9-v1.1.glb +0 -0
- package/dist/assets/falcon-heavy-falcon-heavy-centre.glb +0 -0
- package/dist/assets/falcon-heavy-falcon-heavy-side-left.glb +0 -0
- package/dist/assets/falcon-heavy-falcon-heavy-side-right.glb +0 -0
- package/dist/assets/falcon-heavy-falcon-heavy.glb +0 -0
- package/dist/assets/landing-zone-lz-1-landed.glb +0 -0
- package/dist/assets/landing-zone-lz-1.glb +0 -0
- package/dist/assets/landing-zone-lz-4-landed.glb +0 -0
- package/dist/assets/landing-zone-lz-4.glb +0 -0
- package/dist/assets/launch-tower-catch-booster.glb +0 -0
- package/dist/assets/launch-tower-catch.glb +0 -0
- package/dist/assets/launch-tower-stack-booster.glb +0 -0
- package/dist/assets/launch-tower-stack-ship.glb +0 -0
- package/dist/assets/launch-tower-stack.glb +0 -0
- package/dist/assets/starship-2019.glb +0 -0
- package/dist/assets/starship-v1-booster.glb +0 -0
- package/dist/assets/starship-v1-flight1-booster.glb +0 -0
- package/dist/assets/starship-v1-flight1-ship.glb +0 -0
- package/dist/assets/starship-v1-flight1.glb +0 -0
- package/dist/assets/starship-v1-ship.glb +0 -0
- package/dist/assets/starship-v1.glb +0 -0
- package/dist/assets/starship-v2-booster.glb +0 -0
- package/dist/assets/starship-v2-ship.glb +0 -0
- package/dist/assets/starship-v2.glb +0 -0
- package/dist/assets/starship-v3-booster.glb +0 -0
- package/dist/assets/starship-v3-ship.glb +0 -0
- package/dist/assets/starship-v3.glb +0 -0
- package/dist/assets/starship-v4-booster.glb +0 -0
- package/dist/assets/starship-v4-ship.glb +0 -0
- package/dist/assets/starship-v4.glb +0 -0
- package/dist/attrs.d.ts +70 -4
- package/dist/attrs.js +59 -4
- package/dist/build/glb.d.ts +25 -0
- package/dist/build/glb.js +29 -7
- package/dist/build/index.d.ts +94 -4
- package/dist/build/index.js +71 -7
- package/dist/build/lineup.d.ts +56 -2
- package/dist/build/lineup.js +23 -2
- package/dist/builder.d.ts +47 -1
- package/dist/builder.js +14 -1
- package/dist/crossfade.d.ts +44 -2
- package/dist/crossfade.js +44 -2
- package/dist/data/credits.d.ts +44 -1
- package/dist/data/credits.js +22 -1
- package/dist/data/flight-log.d.ts +33 -1
- package/dist/data/flight-log.js +22 -1
- package/dist/data/flights.d.ts +61 -2
- package/dist/data/flights.js +160 -3
- package/dist/data/makers.d.ts +21 -0
- package/dist/data/makers.js +10 -0
- package/dist/data/propellants.d.ts +59 -0
- package/dist/data/propellants.js +43 -0
- package/dist/data/sources.d.ts +102 -0
- package/dist/data/sources.js +19 -0
- package/dist/data/types.d.ts +81 -1
- package/dist/data/types.js +26 -1
- package/dist/draw/plume.d.ts +10 -1
- package/dist/draw/plume.js +15 -5
- package/dist/element/plumes.d.ts +7 -8
- package/dist/element/plumes.js +36 -21
- package/dist/element/scene.js +30 -5
- package/dist/element.d.ts +61 -3
- package/dist/element.js +53 -5
- package/dist/embed.d.ts +110 -5
- package/dist/embed.js +88 -5
- package/dist/engines.d.ts +86 -4
- package/dist/engines.js +75 -4
- package/dist/fit.d.ts +68 -0
- package/dist/fit.js +13 -0
- package/dist/flight.d.ts +136 -9
- package/dist/flight.js +130 -10
- package/dist/flightbar.d.ts +12 -0
- package/dist/flightbar.js +13 -1
- package/dist/framing.d.ts +182 -8
- package/dist/framing.js +127 -6
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/layout.d.ts +65 -1
- package/dist/layout.js +43 -1
- package/dist/looks.d.ts +64 -1
- package/dist/looks.js +42 -1
- package/dist/model/falcon.js +2 -2
- package/dist/model/materials.d.ts +32 -0
- package/dist/model/materials.js +10 -0
- package/dist/model/moves.d.ts +36 -0
- package/dist/model/moves.js +70 -0
- package/dist/model/pieces.d.ts +31 -0
- package/dist/model/pieces.js +51 -9
- package/dist/model/registry.d.ts +22 -0
- package/dist/model/registry.js +22 -0
- package/dist/model/starship.d.ts +6 -3
- package/dist/model/starship.js +12 -7
- package/dist/parts.d.ts +33 -1
- package/dist/pixels.d.ts +44 -4
- package/dist/pixels.js +44 -4
- package/dist/react.d.ts +26 -2
- package/dist/react.js +13 -0
- package/dist/rockets.d.ts +91 -3
- package/dist/rockets.js +58 -2
- package/dist/spin.d.ts +57 -2
- package/dist/spin.js +35 -2
- package/dist/tilt.d.ts +48 -4
- package/dist/tilt.js +26 -4
- package/package.json +27 -7
package/dist/data/flights.js
CHANGED
|
@@ -36,7 +36,7 @@ function starshipFlight(options) {
|
|
|
36
36
|
{ id: "boostback-end", name: "Boostback ends", what: "The booster falls back, steering with its grid fins.", at: time(times.boostbackEnd, source), burns: { ship: six }, pose: { booster: { ...away, pitch: 180 }, ship: { dx: 0.2, dy: 0.08 } }, ground: 1.6, air: 1 },
|
|
37
37
|
{ id: "booster-landing", name: "Booster's landing burn", what: "The booster lights its inner thirteen, then keeps only the inner three.", at: time(times.landing, source), burns: { booster: landingBurn, ship: six }, pose: { booster: { dx: -0.23, dy: -0.1 }, ship: { dx: 0.2, dy: 0.09 } }, ground: 0.45, air: 0.1 },
|
|
38
38
|
{ id: "booster-three", name: "Inner three", what: "The last of the landing burn, on the three middle engines.", at: blank("The page gives no time for this step."), burns: { booster: count(3, SH), ship: six }, pose: { booster: { dx: -0.23, dy: -0.32 }, ship: { dx: 0.2, dy: 0.1 } }, ground: 0.3, air: 0 },
|
|
39
|
-
{ id: "booster-down", name: "Booster down", what: "The landing burn ends.", at: time(times.landingEnd, source), burns: { ship: six }, pose: { booster: { dx: -0.23, rest: true }, ship: { dx: 0.2, dy: 0.11 } }, ground: 0, air: 0.8 },
|
|
39
|
+
{ id: "booster-down", name: "Booster down", what: "The landing burn ends.", at: time(times.landingEnd, source), burns: { ship: six }, pose: { booster: { dx: -0.23, rest: true }, ship: { dx: 0.2, dy: 0.11 } }, ground: 0, air: 0.8, ...(options.boosterSpeed ? { speed: options.boosterSpeed } : {}) },
|
|
40
40
|
{ id: "seco", name: "Ship's engines cut off", what: "The Ship coasts on, above the air.", at: time(times.seco, source), burns: {}, pose: { booster: { dx: -0.23, rest: true }, ship: { dx: 0.2, dy: 0.12 } }, ground: 0, ...(options.apogee ? { altitude: options.apogee } : {}) },
|
|
41
41
|
{ id: "entry", name: "Entry", what: "The Ship comes back into the air, belly first on its tiles.", at: time(times.entry, source), burns: {}, pose: { booster: { dx: -0.23, rest: true }, ship: { dx: 0.2, dy: 0.12, pitch: -80 } }, ground: 0 },
|
|
42
42
|
...(seconds(times.flip) <= seconds(times.shipBurn)
|
|
@@ -64,8 +64,15 @@ const FLIGHT_12 = "wikipedia-flight-12";
|
|
|
64
64
|
const FH = "wikipedia-fh-test-flight";
|
|
65
65
|
const STARLINK = "sfn-starlink-2019";
|
|
66
66
|
const CRS16 = "sfn-crs-16";
|
|
67
|
+
const FLIGHT_1 = "wikipedia-flight-1";
|
|
68
|
+
const CASSIOPE = "sfn-cassiope";
|
|
69
|
+
const ABS = "sfn-abs-eutelsat";
|
|
70
|
+
const F9 = "wikipedia-falcon-9";
|
|
71
|
+
const GRASSHOPPER = "wikipedia-grasshopper";
|
|
72
|
+
const nineMerlin = (note) => count(9, F9, note);
|
|
73
|
+
const oneMerlin = (note) => count(1, F9, note);
|
|
67
74
|
const lower = (dy, extra = {}) => ({ dx: -0.26, dy, ...extra });
|
|
68
|
-
|
|
75
|
+
const BASE_FLIGHTS = [
|
|
69
76
|
starshipFlight({
|
|
70
77
|
id: "starship-flight-5",
|
|
71
78
|
variant: "v1",
|
|
@@ -90,6 +97,7 @@ export const FLIGHTS = [
|
|
|
90
97
|
stageEngines: count(3, SH, "The article's mission profile: all but three of its centre engines."),
|
|
91
98
|
backEngines: count(13, SH, "The article's mission profile: ten more lit beside the three. On this flight nine of the ten lit."),
|
|
92
99
|
landingBurn: count(13, FLIGHT_7, "All 13 engines ignited."),
|
|
100
|
+
apogee: { value: "146 km: where the Ship was when it was lost, 27 seconds before the planned cutoff", source: FLIGHT_7 },
|
|
93
101
|
shipLanding: [],
|
|
94
102
|
}),
|
|
95
103
|
starshipFlight({
|
|
@@ -102,6 +110,8 @@ export const FLIGHTS = [
|
|
|
102
110
|
stageEngines: count(5, SH, "The article's interstage section, for this booster: all but five inner engines. Its older mission profile says three."),
|
|
103
111
|
backEngines: count(33, SH, "The article's propulsion section: the ascent and boostback burns use all thirty-three. The flight's page counts 28 to relight, beside the five already burning."),
|
|
104
112
|
landingBurn: count(13, SH, "The inner thirteen."),
|
|
113
|
+
apogee: { value: "195 km, the highest of the Ship's orbit", source: FLIGHT_12 },
|
|
114
|
+
boosterSpeed: { value: "1,450 km/h when the booster hit the water in the Gulf, which it did not land from", source: FLIGHT_12 },
|
|
105
115
|
shipLanding: [
|
|
106
116
|
{ id: "ship-two", name: "Three to two engines", what: "The Ship's landing burn drops to two.", at: time("+01:05:17", FLIGHT_12), burn: count(2, FLIGHT_12) },
|
|
107
117
|
{ id: "ship-one", name: "Two to one engine", what: "And to one, for the last seconds.", at: time("+01:05:24", FLIGHT_12), burn: count(1, FLIGHT_12) },
|
|
@@ -148,7 +158,7 @@ export const FLIGHTS = [
|
|
|
148
158
|
{ id: "entry-burn", name: "Entry burn", what: "Three engines again, to slow the fall.", at: time("+00:06:35", CRS16), burns: { "first-stage": THREE, "second-stage": UPPER }, pose: { "first-stage": lower(-0.14), "second-stage": { dx: 0.22, dy: 0.08 }, trunk: { dx: 0.22, dy: 0.08 }, capsule: { dx: 0.22, dy: 0.08 } }, ground: 0.8, air: 0.5, altitude: { value: "from about 70 to 40 km", source: "wikipedia-landing-tests", note: "The landing tests article, for the burn in general." } },
|
|
149
159
|
{ id: "landing-burn", name: "Landing burn", what: "Only the centre engine, just before touchdown.", at: blank("This timeline gives no time for its start."), burns: { "first-stage": ONE, "second-stage": UPPER }, pose: { "first-stage": lower(-0.3), "second-stage": { dx: 0.22, dy: 0.17 }, trunk: { dx: 0.22, dy: 0.17 }, capsule: { dx: 0.22, dy: 0.17 } }, ground: 0.22, air: 0 },
|
|
150
160
|
{ id: "landing", name: "Landing", what: "The planned landing, on plain ground here.", at: time("+00:08:17", CRS16), burns: { "second-stage": UPPER }, pose: { "first-stage": { dx: -0.26, rest: true }, "second-stage": { dx: 0.22, dy: 0.19 }, trunk: { dx: 0.22, dy: 0.19 }, capsule: { dx: 0.22, dy: 0.19 } }, ground: 0, air: 1 },
|
|
151
|
-
{ id: "seco", name: "SECO", what: "The second stage shuts down.", at: time("+00:08:51", CRS16), burns: {}, pose: { "first-stage": { dx: -0.26, rest: true }, "second-stage": { dx: 0.22, dy: 0.11 }, trunk: { dx: 0.22, dy: 0.11 }, capsule: { dx: 0.22, dy: 0.11 } }, ground: 0 },
|
|
161
|
+
{ id: "seco", name: "SECO", what: "The second stage shuts down.", at: time("+00:08:51", CRS16), burns: {}, pose: { "first-stage": { dx: -0.26, rest: true }, "second-stage": { dx: 0.22, dy: 0.11 }, trunk: { dx: 0.22, dy: 0.11 }, capsule: { dx: 0.22, dy: 0.11 } }, ground: 0, altitude: { value: "an orbit with a low point of about 124 miles (200 km) and a high point of about 223 miles (360 km), as planned", source: CRS16 } },
|
|
152
162
|
{ id: "dragon", name: "Dragon separates", what: "The spacecraft comes away from the second stage.", at: time("+00:09:51", CRS16), burns: {}, pose: { "first-stage": { dx: -0.26, rest: true }, "second-stage": { dx: 0.22, dy: 0.17 }, trunk: { dx: 0.22, dy: 0.25 }, capsule: { dx: 0.22, dy: 0.25 } }, ground: 0 },
|
|
153
163
|
],
|
|
154
164
|
},
|
|
@@ -174,4 +184,151 @@ export const FLIGHTS = [
|
|
|
174
184
|
{ id: "side-landing", name: "Side cores land", what: "Both side cores down, side by side.", at: time("+00:07:58", FH), burns: {}, pose: { "side-left": { dx: -0.23, rest: true }, "side-right": { dx: 0.34, rest: true } }, ground: 0 },
|
|
175
185
|
],
|
|
176
186
|
},
|
|
187
|
+
{
|
|
188
|
+
id: "starship-flight-1",
|
|
189
|
+
rocket: "starship",
|
|
190
|
+
variant: "v1-flight1",
|
|
191
|
+
name: "Starship flight test 1",
|
|
192
|
+
basis: "SpaceX's timeline as Wikipedia gives it, for the flight of 20 April 2023, the first of Starship. It is what happened, not a plan: the stages never separated, and the flight termination system destroyed the stack. The planned steps after that (the boostback, the landing burn, the Ship's burn and its entry) were never reached, so they are not here.",
|
|
193
|
+
source: FLIGHT_1,
|
|
194
|
+
note: "No separation, tower or flaps and fins to move: the stack stays one piece to the end. Which of the booster's engines burned after the first minute, the page does not say, so the flames drawn there are a picture.",
|
|
195
|
+
phases: [
|
|
196
|
+
{ id: "ignition", name: "Ignition", what: "The booster's engines start while it is held on the pad. Three of them were stopped at ignition because the flight software did not find them healthy enough.", at: time("-00:00:06", FLIGHT_1), burns: { booster: count(30, FLIGHT_1, "Thirty-three engines, three of whose ignition was terminated: the page's words, and the sum is this package's.") }, pose: { booster: {}, ship: {} }, ground: 0, smoke: 0.7 },
|
|
197
|
+
{ id: "liftoff", name: "Liftoff", what: "A successful liftoff that significantly damaged the launch pad, the page says.", at: time("+00:00:05", FLIGHT_1), burns: { booster: count(30, FLIGHT_1, "The thirty that lit.") }, pose: { booster: {}, ship: {} }, ground: 0.02, smoke: 1 },
|
|
198
|
+
{ id: "max-q", name: "Max q", what: "The throttle goes down for max q, later and lower than planned.", at: time("+00:00:55", FLIGHT_1), burns: { booster: count(30, FLIGHT_1, "The thirty that lit; the page does not count the failures that came during the climb.") }, pose: { booster: {}, ship: {} }, ground: 1.6, air: 0.25 },
|
|
199
|
+
{ id: "meco", name: "Most engines cut off", what: "Fires in the booster's aft end led to a loss of communication with most of its engines.", at: time("+00:02:49", FLIGHT_1), burns: { booster: { engines: blank("The page gives no count of the engines that burned here."), drawn: 3 } }, pose: { booster: {}, ship: {} }, ground: 1.6, air: 0.7 },
|
|
200
|
+
{ id: "separation", name: "Separation fails", what: "The stages did not separate. The vehicle lost control and began spinning.", at: time("+00:02:52", FLIGHT_1), burns: { booster: { engines: blank("The page gives no count of the engines that burned here."), drawn: 3 } }, pose: { booster: {}, ship: {} }, ground: 1.6, air: 0.85, altitude: { value: "about 39 km, the highest it rose", source: FLIGHT_1 } },
|
|
201
|
+
{ id: "termination", name: "Flight termination", what: "The flight termination system was triggered.", at: time("+00:03:10", FLIGHT_1), burns: { booster: { engines: blank("The page gives no count of the engines that burned here."), drawn: 3 } }, pose: { booster: {}, ship: {} }, ground: 1.6, air: 1 },
|
|
202
|
+
{ id: "destroyed", name: "Destroyed", what: "The stack was destroyed. The booster's engines had kept firing until about four minutes in.", at: time("+00:04:01", FLIGHT_1), burns: {}, pose: { booster: {}, ship: {} }, ground: 1.6, air: 1, altitude: { value: "29 km: the height at which the page says the booster's engines were still firing, at about four minutes", source: FLIGHT_1 } },
|
|
203
|
+
],
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: "falcon-9-cassiope",
|
|
207
|
+
rocket: "falcon-9",
|
|
208
|
+
variant: "v1.1",
|
|
209
|
+
name: "Falcon 9 v1.1, CASSIOPE",
|
|
210
|
+
basis: "Spaceflight Now's live coverage of 29 September 2013, the first launch of the Falcon 9 v1.1. The minutes are the live coverage's own, rounded as it said them, and they are what happened, not a plan.",
|
|
211
|
+
source: CASSIOPE,
|
|
212
|
+
note: "The page does not follow the first stage after it separates, so it leaves the picture. A fairing is drawn though the satellites went inside it: that is this version's drawing. Altitudes are the live coverage's words, in the units it used.",
|
|
213
|
+
phases: [
|
|
214
|
+
{ id: "ignition", name: "Ignition", what: "The nine engines start on the pad.", at: blank("The live coverage starts at liftoff."), burns: { "first-stage": nineMerlin("The nine Merlin 1D of this version, from its page.") }, pose: {}, ground: 0, smoke: 0.7 },
|
|
215
|
+
{ id: "liftoff", name: "Liftoff", what: "Liftoff of the next-generation Falcon 9, at 1600 GMT.", at: time("+00:00:00", CASSIOPE), burns: { "first-stage": nineMerlin("The nine Merlin 1D of this version, from its page.") }, pose: {}, ground: 0.02, smoke: 1 },
|
|
216
|
+
{ id: "max-q", name: "Max q", what: "The rocket nears the speed of sound, in the phase of maximum aerodynamic pressure.", at: time("+00:01:00", CASSIOPE), burns: { "first-stage": nineMerlin("The nine Merlin 1D of this version, from its page.") }, pose: {}, ground: 1.6, air: 0.25 },
|
|
217
|
+
{ id: "climb", name: "Two minutes", what: "Climbing, with the first stage still burning.", at: time("+00:02:00", CASSIOPE), burns: { "first-stage": nineMerlin("The nine Merlin 1D of this version, from its page.") }, pose: {}, ground: 1.6, air: 0.6, altitude: { value: "more than 20 miles", source: CASSIOPE } },
|
|
218
|
+
{ id: "separation", name: "Stage separation", what: "The first stage's engines cut off and the stages separate; the second stage's engine lights for about six minutes.", at: time("+00:03:20", CASSIOPE), burns: { "second-stage": oneMerlin("The one vacuum Merlin of this version, from its page.") }, pose: { "first-stage": lower(-0.05), "second-stage": { dx: 0.14, dy: 0.04 }, fairing: { dx: 0.14, dy: 0.04 } }, ground: 1.6, air: 0.9 },
|
|
219
|
+
{ id: "fairing", name: "Fairing separation", what: "The payload fairing has separated as planned.", at: time("+00:04:00", CASSIOPE), burns: { "second-stage": oneMerlin("The one vacuum Merlin of this version, from its page.") }, pose: { "first-stage": lower(-0.1, { gone: true }), "second-stage": { dx: 0.22, dy: 0.08 }, fairing: { dx: 0.4, dy: 0.2, gone: true } }, ground: 1.6, air: 1 },
|
|
220
|
+
{ id: "altitude", name: "Seven minutes twenty", what: "Still burning, high above the air.", at: time("+00:07:20", CASSIOPE), burns: { "second-stage": oneMerlin("The one vacuum Merlin of this version, from its page.") }, pose: { "first-stage": { gone: true }, "second-stage": { dx: 0.22, dy: 0.1 }, fairing: { gone: true } }, ground: 1.6, air: 1, altitude: { value: "310 kilometers", source: CASSIOPE } },
|
|
221
|
+
{ id: "seco", name: "Second stage cutoff", what: "The second stage's engine shuts down, confirmed at 1609 GMT.", at: time("+00:09:00", CASSIOPE, { note: "From the page's GMT clock: liftoff at 1600, cutoff confirmed at 1609." }), burns: {}, pose: { "first-stage": { gone: true }, "second-stage": { dx: 0.22, dy: 0.12 }, fairing: { gone: true } }, ground: 1.6 },
|
|
222
|
+
{ id: "deploy", name: "CASSIOPE deploys", what: "The satellite is released first, at T+14:15.", at: time("+00:14:15", CASSIOPE), burns: {}, pose: { "first-stage": { gone: true }, "second-stage": { dx: 0.22, dy: 0.16 }, fairing: { gone: true } }, ground: 1.6, altitude: { value: "a planned orbit between 155 miles and 900 miles high", source: CASSIOPE } },
|
|
223
|
+
],
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
id: "falcon-9-abs-eutelsat",
|
|
227
|
+
rocket: "falcon-9",
|
|
228
|
+
variant: "ft",
|
|
229
|
+
name: "Falcon 9 Full Thrust, ABS-2A and Eutelsat 117 West B",
|
|
230
|
+
basis: "Spaceflight Now's timeline for the flight of 15 June 2016, the plan as it was published before the launch. Its page does not name the version; Wikipedia's article on ABS-2A says it was a Falcon 9 Full Thrust.",
|
|
231
|
+
source: ABS,
|
|
232
|
+
note: "The page says only that the first stage would try to land on a barge in the Atlantic and gives no time for it, so the stage is not followed after it separates. The second stage burns twice, and the page gives each time.",
|
|
233
|
+
phases: [
|
|
234
|
+
{ id: "ignition", name: "Ignition", what: "The nine engines start on the pad.", at: blank("The timeline starts at liftoff."), burns: { "first-stage": nineMerlin("The nine Merlin 1D+ of this version, from its page.") }, pose: {}, ground: 0, smoke: 0.7 },
|
|
235
|
+
{ id: "liftoff", name: "Liftoff", what: "Nine Merlin engines at full thrust.", at: time("+00:00:00", ABS), burns: { "first-stage": nineMerlin("The nine Merlin 1D+ of this version, from its page.") }, pose: {}, ground: 0.02, smoke: 1 },
|
|
236
|
+
{ id: "mach-1", name: "Mach 1", what: "The rocket reaches the speed of sound.", at: time("+00:01:13", ABS), burns: { "first-stage": nineMerlin("The nine Merlin 1D+ of this version, from its page.") }, pose: {}, ground: 1.2, air: 0.1, speed: { value: "Mach 1", source: ABS } },
|
|
237
|
+
{ id: "max-q", name: "Max Q", what: "The point of maximum aerodynamic pressure.", at: time("+00:01:17", ABS), burns: { "first-stage": nineMerlin("The nine Merlin 1D+ of this version, from its page.") }, pose: {}, ground: 1.6, air: 0.25 },
|
|
238
|
+
{ id: "meco", name: "MECO", what: "The nine first stage engines shut down.", at: time("+00:02:36", ABS), burns: {}, pose: {}, ground: 1.6, air: 0.8 },
|
|
239
|
+
{ id: "separation", name: "Stage separation", what: "The first stage falls away. It is not followed from here.", at: time("+00:02:39", ABS), burns: {}, pose: { "first-stage": lower(-0.05), "second-stage": { dx: 0.14, dy: 0.04 }, fairing: { dx: 0.14, dy: 0.04 } }, ground: 1.6, air: 0.9 },
|
|
240
|
+
{ id: "second-stage", name: "Second stage ignition", what: "The vacuum Merlin lights for about six and a half minutes, to a parking orbit.", at: time("+00:02:47", ABS), burns: { "second-stage": oneMerlin("The one vacuum Merlin of this version, from its page.") }, pose: { "first-stage": lower(-0.1, { gone: true }), "second-stage": { dx: 0.22, dy: 0.08 }, fairing: { dx: 0.22, dy: 0.08 } }, ground: 1.6, air: 1 },
|
|
241
|
+
{ id: "fairing", name: "Fairing jettison", what: "The payload fairing comes away.", at: time("+00:03:34", ABS), burns: { "second-stage": oneMerlin("The one vacuum Merlin of this version, from its page.") }, pose: { "first-stage": { gone: true }, "second-stage": { dx: 0.22, dy: 0.1 }, fairing: { dx: 0.4, dy: 0.2, gone: true } }, ground: 1.6, air: 1 },
|
|
242
|
+
{ id: "seco-1", name: "SECO 1", what: "The second stage shuts down in its parking orbit.", at: time("+00:09:22", ABS), burns: {}, pose: { "first-stage": { gone: true }, "second-stage": { dx: 0.22, dy: 0.12 }, fairing: { gone: true } }, ground: 1.6 },
|
|
243
|
+
{ id: "restart", name: "Second burn", what: "The second stage's engine restarts for the burn to the transfer orbit.", at: time("+00:25:54", ABS), burns: { "second-stage": oneMerlin("The one vacuum Merlin of this version, from its page.") }, pose: { "first-stage": { gone: true }, "second-stage": { dx: 0.22, dy: 0.14 }, fairing: { gone: true } }, ground: 1.6, air: 1 },
|
|
244
|
+
{ id: "seco-2", name: "SECO 2", what: "The second stage shuts down again.", at: time("+00:26:58", ABS), burns: {}, pose: { "first-stage": { gone: true }, "second-stage": { dx: 0.22, dy: 0.16 }, fairing: { gone: true } }, ground: 1.6 },
|
|
245
|
+
{ id: "eutelsat", name: "Eutelsat 117 West B separates", what: "The first of the two satellites is released.", at: time("+00:30:29", ABS), burns: {}, pose: { "first-stage": { gone: true }, "second-stage": { dx: 0.22, dy: 0.18 }, fairing: { gone: true } }, ground: 1.6 },
|
|
246
|
+
{ id: "abs", name: "ABS-2A separates", what: "The second satellite is released.", at: time("+00:35:29", ABS), burns: {}, pose: { "first-stage": { gone: true }, "second-stage": { dx: 0.22, dy: 0.2 }, fairing: { gone: true } }, ground: 1.6 },
|
|
247
|
+
],
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
id: "grasshopper-hop-8",
|
|
251
|
+
rocket: "grasshopper",
|
|
252
|
+
variant: "grasshopper",
|
|
253
|
+
name: "Grasshopper's highest hop",
|
|
254
|
+
basis: "Wikipedia's table of Grasshopper's eight hops: the last, on 7 October 2013, rose 744 m in 79 seconds. The page gives the height and the length of each hop and nothing between, so the steps between are a picture.",
|
|
255
|
+
source: GRASSHOPPER,
|
|
256
|
+
note: "The page gives a hop's height and duration only, so the engine's start, its throttling and the descent have no times here. The seven earlier hops were lower (the first rose 1.8 m in 3 s) and are not played.",
|
|
257
|
+
phases: [
|
|
258
|
+
{ id: "ignition", name: "Ignition", what: "The one Merlin 1D starts.", at: blank("The page gives each hop's height and length, not when its engine started."), burns: { vehicle: count(1, GRASSHOPPER, "A single Merlin-1D engine, the page says.") }, pose: {}, ground: 0, smoke: 0.5 },
|
|
259
|
+
{ id: "liftoff", name: "Liftoff", what: "The hop begins.", at: time("+00:00:00", GRASSHOPPER, { note: "The start of the hop's 79 seconds." }), burns: { vehicle: count(1, GRASSHOPPER, "A single Merlin-1D engine, the page says.") }, pose: {}, ground: 0.02, smoke: 0.8 },
|
|
260
|
+
{ id: "top", name: "The top of the hop", what: "The highest point.", at: blank("The page gives the height, not the moment."), burns: { vehicle: count(1, GRASSHOPPER, "A single Merlin-1D engine, the page says.") }, pose: {}, ground: 1.6, air: 0.2, altitude: { value: "744 m, the highest of its eight hops", source: GRASSHOPPER } },
|
|
261
|
+
{ id: "landing", name: "Landing", what: "It comes down on its fixed legs, 79 seconds after the start.", at: time("+00:01:19", GRASSHOPPER, { note: "The hop's duration, 79 s, from its start." }), burns: {}, pose: { vehicle: { rest: true } }, ground: 0 },
|
|
262
|
+
],
|
|
263
|
+
},
|
|
177
264
|
];
|
|
265
|
+
const MOVE_SOURCES = {
|
|
266
|
+
falcon: { source: "wikipedia-landing-tests", says: "The grid fins are \"stowed on ascent and deployed on reentry\"; the landing burn comes, then the legs open, then the touchdown." },
|
|
267
|
+
superHeavy: { source: "wikipedia-super-heavy", says: "After the boostback the booster descends \"using its grid fins for minor course corrections\"." },
|
|
268
|
+
ship: { source: "wikipedia-ship", says: "The Ship \"controls its reentry with four flaps\", two aft and two forward." },
|
|
269
|
+
};
|
|
270
|
+
const MOVES_OF = {
|
|
271
|
+
"falcon-9-starlink-2019": ["falcon"],
|
|
272
|
+
"falcon-9-crs-16": ["falcon"],
|
|
273
|
+
"falcon-heavy-test-flight": ["falcon"],
|
|
274
|
+
"starship-flight-5": ["superHeavy", "ship"],
|
|
275
|
+
"starship-flight-7": ["superHeavy", "ship"],
|
|
276
|
+
"starship-flight-12": ["superHeavy", "ship"],
|
|
277
|
+
};
|
|
278
|
+
/**
|
|
279
|
+
* What turns in each flight. The pages say the Falcon 9's grid fins are "stowed on ascent and deployed on reentry" and that its legs open in the landing burn, before the touch down (Falcon 9 first-stage landing tests);
|
|
280
|
+
* that Super Heavy steers with its grid fins for minor course corrections after the boostback (Super Heavy); and that the Ship controls its reentry with four flaps, two aft and two forward (Starship). How far a group turns,
|
|
281
|
+
* and the moment inside a phase, are a picture. A painted model that is one shell has nothing here to turn: nothing is cut to fake a move.
|
|
282
|
+
*/
|
|
283
|
+
const ARTICULATIONS = {
|
|
284
|
+
"falcon-9-starlink-2019": { "first-stage": [["ignition", { "grid-fins": 85, legs: 0 }], ["entry-burn", { "grid-fins": 0, legs: 0 }], ["landing-burn", { "grid-fins": 0, legs: 60 }]] },
|
|
285
|
+
"falcon-9-crs-16": { "first-stage": [["ignition", { "grid-fins": 85, legs: 0 }], ["entry-burn", { "grid-fins": 0, legs: 0 }], ["landing-burn", { "grid-fins": 0, legs: 60 }]] },
|
|
286
|
+
"falcon-heavy-test-flight": { "side-left": [["side-start", { legs: 0 }], ["side-burn", { legs: 60 }]], "side-right": [["side-start", { legs: 0 }], ["side-burn", { legs: 60 }]] },
|
|
287
|
+
"starship-flight-5": {
|
|
288
|
+
booster: [["boostback-end", { "grid-fins": 10 }], ["booster-landing", { "grid-fins": -10 }], ["booster-three", { "grid-fins": 6 }], ["booster-down", { "grid-fins": 0 }]],
|
|
289
|
+
ship: [["entry", { "forward-flaps": 8, "aft-flaps": 8 }], ["flip", { "forward-flaps": 60, "aft-flaps": 20 }]],
|
|
290
|
+
},
|
|
291
|
+
"starship-flight-7": {
|
|
292
|
+
booster: [["boostback-end", { "grid-fins": 10 }], ["booster-landing", { "grid-fins": -10 }], ["booster-three", { "grid-fins": 6 }], ["booster-down", { "grid-fins": 0 }]],
|
|
293
|
+
ship: [["entry", { "forward-flaps": 8, "aft-flaps": 8 }], ["flip", { "forward-flaps": 60, "aft-flaps": 20 }]],
|
|
294
|
+
},
|
|
295
|
+
"starship-flight-12": {
|
|
296
|
+
booster: [["boostback-end", { "grid-fins": 10 }], ["booster-landing", { "grid-fins": -10 }], ["booster-three", { "grid-fins": 6 }], ["booster-down", { "grid-fins": 0 }]],
|
|
297
|
+
ship: [["entry", { "forward-flaps": 8, "aft-flaps": 8 }], ["ship-burn", { "forward-flaps": 60, "aft-flaps": 20 }]],
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
function articulated(flight) {
|
|
301
|
+
const rules = ARTICULATIONS[flight.id];
|
|
302
|
+
if (!rules)
|
|
303
|
+
return flight;
|
|
304
|
+
let note = flight.note ?? "";
|
|
305
|
+
note = note.replace(/No tower, catch arms or moving flaps and fins yet: /, "No tower or catch arms yet: ").replace(/No drone ship or moving legs yet: /, "No drone ship yet: ").replace(/No moving legs or fins yet: /, "").replace(/No tower, catch arms or moving flaps and fins yet\b/, "No tower or catch arms yet");
|
|
306
|
+
return {
|
|
307
|
+
...flight,
|
|
308
|
+
note: `${note}${note ? " " : ""}Its moving parts turn where the pages say they do: how far, and the moment inside a phase, are a picture.`.trim(),
|
|
309
|
+
moves: (MOVES_OF[flight.id] ?? []).map((key) => MOVE_SOURCES[key]),
|
|
310
|
+
phases: flight.phases.map((phase) => {
|
|
311
|
+
const pose = { ...phase.pose };
|
|
312
|
+
for (const [slot, steps] of Object.entries(rules)) {
|
|
313
|
+
let angles = {};
|
|
314
|
+
for (const [id, at] of steps) {
|
|
315
|
+
if (flight.phases.findIndex((one) => one.id === id) <= flight.phases.indexOf(phase))
|
|
316
|
+
angles = at;
|
|
317
|
+
}
|
|
318
|
+
pose[slot] = { ...(pose[slot] ?? {}), moves: angles };
|
|
319
|
+
}
|
|
320
|
+
return { ...phase, pose };
|
|
321
|
+
}),
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Every flight the package can play, one for each variant that has a timeline. Use `flightOf` to find one.
|
|
326
|
+
*
|
|
327
|
+
* @example
|
|
328
|
+
* ```ts
|
|
329
|
+
* import { FLIGHTS } from "@johnmorrisdotca/uchusen-rockets";
|
|
330
|
+
*
|
|
331
|
+
* console.log(FLIGHTS.map((flight) => `${flight.rocket}:${flight.variant}`));
|
|
332
|
+
* ```
|
|
333
|
+
*/
|
|
334
|
+
export const FLIGHTS = BASE_FLIGHTS.map(articulated);
|
package/dist/data/makers.d.ts
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import { type Figure } from "./types.ts";
|
|
2
|
+
/**
|
|
3
|
+
* The groups the demo lists rockets under, by id, with the name shown for each.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { MAKERS } from "@johnmorrisdotca/uchusen-rockets";
|
|
8
|
+
*
|
|
9
|
+
* console.log(MAKERS.spacex, Object.keys(MAKERS).length);
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
2
12
|
export declare const MAKERS: {
|
|
3
13
|
readonly spacex: "SpaceX";
|
|
4
14
|
readonly nasa: "NASA and partners";
|
|
@@ -8,6 +18,17 @@ export declare const MAKERS: {
|
|
|
8
18
|
readonly "us-army": "US Army";
|
|
9
19
|
readonly sites: "Sites";
|
|
10
20
|
};
|
|
21
|
+
/**
|
|
22
|
+
* The id of a group in `MAKERS`.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* import type { MakerId } from "@johnmorrisdotca/uchusen-rockets";
|
|
27
|
+
*
|
|
28
|
+
* const maker: MakerId = "nasa";
|
|
29
|
+
* console.log(maker);
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
11
32
|
export type MakerId = keyof typeof MAKERS;
|
|
12
33
|
export interface MadeBy {
|
|
13
34
|
maker: MakerId;
|
package/dist/data/makers.js
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
// Whose each rocket is, as its own article's infobox and first lines say, read 2026-11-02. `maker` is how the demo groups them; `by` says what the source says, with the companies that built it where it names them. The sites have no maker here: a blank, not a guess.
|
|
2
2
|
import { blank } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* The groups the demo lists rockets under, by id, with the name shown for each.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { MAKERS } from "@johnmorrisdotca/uchusen-rockets";
|
|
9
|
+
*
|
|
10
|
+
* console.log(MAKERS.spacex, Object.keys(MAKERS).length);
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
3
13
|
export const MAKERS = { spacex: "SpaceX", nasa: "NASA and partners", "blue-origin": "Blue Origin", "rocket-lab": "Rocket Lab", russia: "Russia", "us-army": "US Army", sites: "Sites" };
|
|
4
14
|
const SITE = { maker: "sites", madeBy: blank("A place or a ship, not a vehicle: its maker is not read here.") };
|
|
5
15
|
export const MADE_BY = {
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Figure } from "./types.ts";
|
|
2
|
+
/**
|
|
3
|
+
* The kinds of flame the pictures have a colour for. `neutral` is for an engine whose propellant no page read here names.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* import type { FlameKind } from "@johnmorrisdotca/uchusen-rockets";
|
|
8
|
+
*
|
|
9
|
+
* const kinds: FlameKind[] = ["kerosene", "methane", "hydrogen", "solid", "hypergolic", "neutral"];
|
|
10
|
+
* console.log(kinds.length);
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export type FlameKind = "kerosene" | "methane" | "hydrogen" | "solid" | "hypergolic" | "neutral";
|
|
14
|
+
/**
|
|
15
|
+
* What one engine burns: its name as the variants' data spells it, the propellant as its page words it (a figure with its source), and the kind of flame that picks the colour.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* import { PROPELLANTS, type EnginePropellant } from "@johnmorrisdotca/uchusen-rockets";
|
|
20
|
+
*
|
|
21
|
+
* const merlin: EnginePropellant | undefined = PROPELLANTS.find((one) => one.id === "merlin");
|
|
22
|
+
* console.log(merlin?.propellant.value, merlin?.flame);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export interface EnginePropellant {
|
|
26
|
+
id: string;
|
|
27
|
+
name: string;
|
|
28
|
+
/** Words that, found in a variant's engine text, say this is the engine. */
|
|
29
|
+
names: readonly string[];
|
|
30
|
+
/** Left out: any rocket. A rocket's id when the same words mean another engine elsewhere (a "solid motor"). */
|
|
31
|
+
rocket?: string;
|
|
32
|
+
propellant: Figure<string>;
|
|
33
|
+
flame: Exclude<FlameKind, "neutral">;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The engines whose propellant a page read here names. Each propellant is a figure with its page; the flame kind follows from it (a test holds the two together).
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* import { PROPELLANTS } from "@johnmorrisdotca/uchusen-rockets";
|
|
41
|
+
*
|
|
42
|
+
* console.log(PROPELLANTS.map((one) => `${one.name}: ${one.propellant.value}`));
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare const PROPELLANTS: readonly EnginePropellant[];
|
|
46
|
+
/**
|
|
47
|
+
* The record of what an engine burns, found by the engine's name in a variant's engine text, or null when no page read here names it. A rocket's `rocket` makes "solid motor" mean its own.
|
|
48
|
+
*
|
|
49
|
+
* @param rocket A rocket's id.
|
|
50
|
+
* @param engineText The engine text of a part, as a variant's data words it ("9 Merlin 1D"), or null or undefined.
|
|
51
|
+
* @returns What that engine burns, or null.
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* import { propellantOf } from "@johnmorrisdotca/uchusen-rockets";
|
|
55
|
+
*
|
|
56
|
+
* console.log(propellantOf("falcon-9", "9 Merlin 1D")?.propellant.value, propellantOf("starship", "3 sea-level and 3 vacuum"));
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function propellantOf(rocket: string, engineText: string | null | undefined): EnginePropellant | null;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The engines whose propellant a page read here names. Each propellant is a figure with its page; the flame kind follows from it (a test holds the two together).
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { PROPELLANTS } from "@johnmorrisdotca/uchusen-rockets";
|
|
7
|
+
*
|
|
8
|
+
* console.log(PROPELLANTS.map((one) => `${one.name}: ${one.propellant.value}`));
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export const PROPELLANTS = [
|
|
12
|
+
{ id: "merlin", name: "Merlin", names: ["Merlin"], propellant: { value: "LOX / RP-1", source: "wikipedia-merlin", date: "2026-11-03", note: "The article's lead: \"Merlin engines use RP-1 and liquid oxygen as rocket propellants in a gas-generator power cycle.\"" }, flame: "kerosene" },
|
|
13
|
+
{ id: "kestrel", name: "Kestrel", names: ["Kestrel"], propellant: { value: "LOX / RP-1", source: "wikipedia-kestrel", date: "2026-11-03", note: "The infobox, and the lead: \"an LOX/RP-1 pressure-fed rocket engine\"." }, flame: "kerosene" },
|
|
14
|
+
{ id: "raptor", name: "Raptor", names: ["Raptor"], propellant: { value: "LOX / CH4", source: "wikipedia-raptor", date: "2026-11-03", note: "The infobox, and the lead: \"cryogenic liquid methane and liquid oxygen, a combination known as methalox\"." }, flame: "methane" },
|
|
15
|
+
{ id: "f-1", name: "F-1", names: ["F-1"], propellant: { value: "LOX / RP-1", source: "wikipedia-f-1", date: "2026-11-03", note: "The infobox." }, flame: "kerosene" },
|
|
16
|
+
{ id: "j-2", name: "J-2", names: ["J-2"], propellant: { value: "Liquid oxygen / Liquid hydrogen", source: "wikipedia-j-2", date: "2026-11-03", note: "The infobox, and the lead: \"burned cryogenic liquid hydrogen (LH2) and liquid oxygen (LOX) propellants\"." }, flame: "hydrogen" },
|
|
17
|
+
{ id: "rs-25", name: "RS-25", names: ["RS-25"], propellant: { value: "LOX / LH2", source: "wikipedia-rs-25", date: "2026-11-03", note: "The infobox, and the lead: \"burns cryogenic (very low temperature) liquid hydrogen and liquid oxygen propellants\"." }, flame: "hydrogen" },
|
|
18
|
+
{ id: "shuttle-srb", name: "Space Shuttle solid rocket booster", names: ["solid motor"], rocket: "space-shuttle", propellant: { value: "Ammonium perchlorate, aluminium powder and PBAN (APCP)", source: "wikipedia-shuttle-srb", date: "2026-11-03", note: "\"The primary propellants were ammonium perchlorate as the oxidizer along with aluminum powder and PBAN as fuel.\"" }, flame: "solid" },
|
|
19
|
+
{ id: "sls-srb", name: "SLS solid rocket booster", names: ["solid motor"], rocket: "sls", propellant: { value: "PBAN-APCP", source: "wikipedia-sls-srb", date: "2026-11-03", note: "The infobox." }, flame: "solid" },
|
|
20
|
+
{ id: "be-4", name: "BE-4", names: ["BE-4"], propellant: { value: "LOX / CH4", source: "wikipedia-be-4", date: "2026-11-03", note: "The infobox, and the lead: \"It uses liquefied methane fuel\"." }, flame: "methane" },
|
|
21
|
+
{ id: "be-3", name: "BE-3", names: ["BE-3"], propellant: { value: "LOX / LH2", source: "wikipedia-be-3", date: "2026-11-03", note: "The infobox of the BE-3 and of the BE-3U." }, flame: "hydrogen" },
|
|
22
|
+
{ id: "rutherford", name: "Rutherford", names: ["Rutherford"], propellant: { value: "LOX / RP-1", source: "wikipedia-rutherford", date: "2026-11-03", note: "The infobox, and the lead: \"LOX (liquid oxygen) and RP-1 (refined kerosene)\"." }, flame: "kerosene" },
|
|
23
|
+
{ id: "rd-107", name: "RD-107 and RD-108", names: ["RD-107", "RD-108"], propellant: { value: "LOX / RG-1", source: "wikipedia-rd-107", date: "2026-11-03", note: "The infobox; its design section: \"liquid oxygen and highly refined kerosene (RG-1)\"." }, flame: "kerosene" },
|
|
24
|
+
{ id: "lm-descent", name: "Lunar module descent engine", names: ["LM descent engine"], propellant: { value: "Aerozine 50 fuel / nitrogen tetroxide oxidizer", source: "wikipedia-lunar-module", date: "2026-11-03", note: "The article's specifications: \"DPS propellants: Aerozine 50 fuel / nitrogen tetroxide oxidizer\"." }, flame: "hypergolic" },
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* The record of what an engine burns, found by the engine's name in a variant's engine text, or null when no page read here names it. A rocket's `rocket` makes "solid motor" mean its own.
|
|
28
|
+
*
|
|
29
|
+
* @param rocket A rocket's id.
|
|
30
|
+
* @param engineText The engine text of a part, as a variant's data words it ("9 Merlin 1D"), or null or undefined.
|
|
31
|
+
* @returns What that engine burns, or null.
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* import { propellantOf } from "@johnmorrisdotca/uchusen-rockets";
|
|
35
|
+
*
|
|
36
|
+
* console.log(propellantOf("falcon-9", "9 Merlin 1D")?.propellant.value, propellantOf("starship", "3 sea-level and 3 vacuum"));
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export function propellantOf(rocket, engineText) {
|
|
40
|
+
if (!engineText)
|
|
41
|
+
return null;
|
|
42
|
+
return PROPELLANTS.find((one) => (one.rocket === undefined || one.rocket === rocket) && one.names.some((name) => engineText.includes(name))) ?? null;
|
|
43
|
+
}
|
package/dist/data/sources.d.ts
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A source of a figure: its title, publisher and address, the date on it where it has one, how it was read (directly, by search or cited) and its licence.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { SOURCES, type Source } from "@johnmorrisdotca/uchusen-rockets";
|
|
7
|
+
*
|
|
8
|
+
* const source: Source = SOURCES["wikipedia-starship"];
|
|
9
|
+
* console.log(source.publisher, source.read);
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
1
12
|
export interface Source {
|
|
2
13
|
title: string;
|
|
3
14
|
publisher: string;
|
|
@@ -7,6 +18,16 @@ export interface Source {
|
|
|
7
18
|
read: "direct" | "search" | "cited";
|
|
8
19
|
licence?: string;
|
|
9
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Every source a figure can name, by id. A figure carries only an id; look the id up here for the page it came from.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { SOURCES } from "@johnmorrisdotca/uchusen-rockets";
|
|
27
|
+
*
|
|
28
|
+
* console.log(Object.keys(SOURCES).length > 20, SOURCES["wikipedia-starship"].url);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
10
31
|
export declare const SOURCES: {
|
|
11
32
|
readonly "wikipedia-starship": {
|
|
12
33
|
readonly title: "SpaceX Starship (the block table and infobox, read as raw wikitext)";
|
|
@@ -248,6 +269,76 @@ export declare const SOURCES: {
|
|
|
248
269
|
readonly read: "direct";
|
|
249
270
|
readonly licence: "CC BY-SA 4.0";
|
|
250
271
|
};
|
|
272
|
+
readonly "sfn-cassiope": {
|
|
273
|
+
readonly title: "The launch of the first Falcon 9 v1.1, with CASSIOPE (Spaceflight Now's live coverage, its status page)";
|
|
274
|
+
readonly publisher: "Spaceflight Now";
|
|
275
|
+
readonly url: "https://spaceflightnow.com/falcon9/006/cassiopestatus.html";
|
|
276
|
+
readonly date: "2013-09-29";
|
|
277
|
+
readonly read: "direct";
|
|
278
|
+
};
|
|
279
|
+
readonly "sfn-abs-eutelsat": {
|
|
280
|
+
readonly title: "Mission events timeline for Falcon 9's launch for ABS and Eutelsat";
|
|
281
|
+
readonly publisher: "Spaceflight Now";
|
|
282
|
+
readonly url: "https://spaceflightnow.com/2016/06/14/mission-events-timeline-for-falcon-9s-launch-for-abs-and-eutelsat/";
|
|
283
|
+
readonly date: "2016-06-14";
|
|
284
|
+
readonly read: "direct";
|
|
285
|
+
};
|
|
286
|
+
readonly "wikipedia-abs-2a": {
|
|
287
|
+
readonly title: "ABS-2A (its infobox: the rocket was a Falcon 9 Full Thrust)";
|
|
288
|
+
readonly publisher: "Wikipedia";
|
|
289
|
+
readonly url: "https://en.wikipedia.org/wiki/ABS-2A";
|
|
290
|
+
readonly date: "2026-11-03";
|
|
291
|
+
readonly read: "direct";
|
|
292
|
+
readonly licence: "CC BY-SA 4.0";
|
|
293
|
+
};
|
|
294
|
+
readonly "wikipedia-be-4": {
|
|
295
|
+
readonly title: "Blue Origin BE-4 (the infobox)";
|
|
296
|
+
readonly publisher: "Wikipedia";
|
|
297
|
+
readonly url: "https://en.wikipedia.org/wiki/Blue_Origin_BE-4";
|
|
298
|
+
readonly date: "2026-11-03";
|
|
299
|
+
readonly read: "direct";
|
|
300
|
+
readonly licence: "CC BY-SA 4.0";
|
|
301
|
+
};
|
|
302
|
+
readonly "wikipedia-be-3": {
|
|
303
|
+
readonly title: "Blue Origin BE-3 (the infobox, for the BE-3 and the BE-3U)";
|
|
304
|
+
readonly publisher: "Wikipedia";
|
|
305
|
+
readonly url: "https://en.wikipedia.org/wiki/Blue_Origin_BE-3";
|
|
306
|
+
readonly date: "2026-11-03";
|
|
307
|
+
readonly read: "direct";
|
|
308
|
+
readonly licence: "CC BY-SA 4.0";
|
|
309
|
+
};
|
|
310
|
+
readonly "wikipedia-rutherford": {
|
|
311
|
+
readonly title: "Rutherford (rocket engine) (the infobox and the lead)";
|
|
312
|
+
readonly publisher: "Wikipedia";
|
|
313
|
+
readonly url: "https://en.wikipedia.org/wiki/Rutherford_(rocket_engine)";
|
|
314
|
+
readonly date: "2026-11-03";
|
|
315
|
+
readonly read: "direct";
|
|
316
|
+
readonly licence: "CC BY-SA 4.0";
|
|
317
|
+
};
|
|
318
|
+
readonly "wikipedia-rd-107": {
|
|
319
|
+
readonly title: "RD-107 (the infobox and its design section, for the RD-107 and the RD-108)";
|
|
320
|
+
readonly publisher: "Wikipedia";
|
|
321
|
+
readonly url: "https://en.wikipedia.org/wiki/RD-107";
|
|
322
|
+
readonly date: "2026-11-03";
|
|
323
|
+
readonly read: "direct";
|
|
324
|
+
readonly licence: "CC BY-SA 4.0";
|
|
325
|
+
};
|
|
326
|
+
readonly "wikipedia-kestrel": {
|
|
327
|
+
readonly title: "SpaceX Kestrel (the infobox and the lead)";
|
|
328
|
+
readonly publisher: "Wikipedia";
|
|
329
|
+
readonly url: "https://en.wikipedia.org/wiki/SpaceX_Kestrel";
|
|
330
|
+
readonly date: "2026-11-03";
|
|
331
|
+
readonly read: "direct";
|
|
332
|
+
readonly licence: "CC BY-SA 4.0";
|
|
333
|
+
};
|
|
334
|
+
readonly "wikipedia-sls-srb": {
|
|
335
|
+
readonly title: "Space Launch System Solid Rocket Booster (the infobox)";
|
|
336
|
+
readonly publisher: "Wikipedia";
|
|
337
|
+
readonly url: "https://en.wikipedia.org/wiki/Space_Launch_System_Solid_Rocket_Booster";
|
|
338
|
+
readonly date: "2026-11-03";
|
|
339
|
+
readonly read: "direct";
|
|
340
|
+
readonly licence: "CC BY-SA 4.0";
|
|
341
|
+
};
|
|
251
342
|
readonly "wikipedia-shuttle-srb": {
|
|
252
343
|
readonly title: "Space Shuttle Solid Rocket Booster (the infobox)";
|
|
253
344
|
readonly publisher: "Wikipedia";
|
|
@@ -524,4 +615,15 @@ export declare const SOURCES: {
|
|
|
524
615
|
readonly read: "direct";
|
|
525
616
|
};
|
|
526
617
|
};
|
|
618
|
+
/**
|
|
619
|
+
* The id of a source in `SOURCES`.
|
|
620
|
+
*
|
|
621
|
+
* @example
|
|
622
|
+
* ```ts
|
|
623
|
+
* import type { SourceId } from "@johnmorrisdotca/uchusen-rockets";
|
|
624
|
+
*
|
|
625
|
+
* const id: SourceId = "wikipedia-starship";
|
|
626
|
+
* console.log(id);
|
|
627
|
+
* ```
|
|
628
|
+
*/
|
|
527
629
|
export type SourceId = keyof typeof SOURCES;
|
package/dist/data/sources.js
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
// Every source a figure may name. Plain facts are taken from these, and each figure says which one it came from. `read` is how this project read it: "direct" means the page itself, "search" that only
|
|
2
2
|
// a search engine's quote of it could be read, and "cited" that it is known through another source's citation.
|
|
3
|
+
/**
|
|
4
|
+
* Every source a figure can name, by id. A figure carries only an id; look the id up here for the page it came from.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { SOURCES } from "@johnmorrisdotca/uchusen-rockets";
|
|
9
|
+
*
|
|
10
|
+
* console.log(Object.keys(SOURCES).length > 20, SOURCES["wikipedia-starship"].url);
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
3
13
|
export const SOURCES = {
|
|
4
14
|
"wikipedia-starship": { title: "SpaceX Starship (the block table and infobox, read as raw wikitext)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/SpaceX_Starship", date: "2026-10-31", read: "direct", licence: "CC BY-SA 4.0" },
|
|
5
15
|
"wikipedia-super-heavy": { title: "SpaceX Super Heavy", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/SpaceX_Super_Heavy", date: "2026-10-31", read: "direct", licence: "CC BY-SA 4.0" },
|
|
@@ -32,6 +42,15 @@ export const SOURCES = {
|
|
|
32
42
|
"wikipedia-space-shuttle": { title: "Space Shuttle (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Space_Shuttle", date: "2026-11-02", read: "direct", licence: "CC BY-SA 4.0" },
|
|
33
43
|
"wikipedia-shuttle-orbiter": { title: "Space Shuttle orbiter (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Space_Shuttle_orbiter", date: "2026-11-02", read: "direct", licence: "CC BY-SA 4.0" },
|
|
34
44
|
"wikipedia-shuttle-tank": { title: "Space Shuttle external tank (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Space_Shuttle_external_tank", date: "2026-11-02", read: "direct", licence: "CC BY-SA 4.0" },
|
|
45
|
+
"sfn-cassiope": { title: "The launch of the first Falcon 9 v1.1, with CASSIOPE (Spaceflight Now's live coverage, its status page)", publisher: "Spaceflight Now", url: "https://spaceflightnow.com/falcon9/006/cassiopestatus.html", date: "2013-09-29", read: "direct" },
|
|
46
|
+
"sfn-abs-eutelsat": { title: "Mission events timeline for Falcon 9's launch for ABS and Eutelsat", publisher: "Spaceflight Now", url: "https://spaceflightnow.com/2016/06/14/mission-events-timeline-for-falcon-9s-launch-for-abs-and-eutelsat/", date: "2016-06-14", read: "direct" },
|
|
47
|
+
"wikipedia-abs-2a": { title: "ABS-2A (its infobox: the rocket was a Falcon 9 Full Thrust)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/ABS-2A", date: "2026-11-03", read: "direct", licence: "CC BY-SA 4.0" },
|
|
48
|
+
"wikipedia-be-4": { title: "Blue Origin BE-4 (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Blue_Origin_BE-4", date: "2026-11-03", read: "direct", licence: "CC BY-SA 4.0" },
|
|
49
|
+
"wikipedia-be-3": { title: "Blue Origin BE-3 (the infobox, for the BE-3 and the BE-3U)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Blue_Origin_BE-3", date: "2026-11-03", read: "direct", licence: "CC BY-SA 4.0" },
|
|
50
|
+
"wikipedia-rutherford": { title: "Rutherford (rocket engine) (the infobox and the lead)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Rutherford_(rocket_engine)", date: "2026-11-03", read: "direct", licence: "CC BY-SA 4.0" },
|
|
51
|
+
"wikipedia-rd-107": { title: "RD-107 (the infobox and its design section, for the RD-107 and the RD-108)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/RD-107", date: "2026-11-03", read: "direct", licence: "CC BY-SA 4.0" },
|
|
52
|
+
"wikipedia-kestrel": { title: "SpaceX Kestrel (the infobox and the lead)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/SpaceX_Kestrel", date: "2026-11-03", read: "direct", licence: "CC BY-SA 4.0" },
|
|
53
|
+
"wikipedia-sls-srb": { title: "Space Launch System Solid Rocket Booster (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Space_Launch_System_Solid_Rocket_Booster", date: "2026-11-03", read: "direct", licence: "CC BY-SA 4.0" },
|
|
35
54
|
"wikipedia-shuttle-srb": { title: "Space Shuttle Solid Rocket Booster (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Space_Shuttle_Solid_Rocket_Booster", date: "2026-11-02", read: "direct", licence: "CC BY-SA 4.0" },
|
|
36
55
|
"wikipedia-rs-25": { title: "RS-25 (the infobox and the nozzle's sizes)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/RS-25", date: "2026-11-02", read: "direct", licence: "CC BY-SA 4.0" },
|
|
37
56
|
"wikipedia-sls": { title: "Space Launch System (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Space_Launch_System", date: "2026-11-02", read: "direct", licence: "CC BY-SA 4.0" },
|