sb-edit-custom 0.15.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.
@@ -0,0 +1,2199 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
+ return new (P || (P = Promise))(function (resolve, reject) {
39
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
43
+ });
44
+ };
45
+ var __generator = (this && this.__generator) || function (thisArg, body) {
46
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
47
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
48
+ function verb(n) { return function (v) { return step([n, v]); }; }
49
+ function step(op) {
50
+ if (f) throw new TypeError("Generator is already executing.");
51
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
52
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
53
+ if (y = 0, t) op = [op[0] & 2, t.value];
54
+ switch (op[0]) {
55
+ case 0: case 1: t = op; break;
56
+ case 4: _.label++; return { value: op[1], done: false };
57
+ case 5: _.label++; y = op[1]; op = [0]; continue;
58
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
59
+ default:
60
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
61
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
62
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
63
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
64
+ if (t[2]) _.ops.pop();
65
+ _.trys.pop(); continue;
66
+ }
67
+ op = body.call(thisArg, _);
68
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
69
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
70
+ }
71
+ };
72
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
73
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
74
+ if (ar || !(i in from)) {
75
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
76
+ ar[i] = from[i];
77
+ }
78
+ }
79
+ return to.concat(ar || Array.prototype.slice.call(from));
80
+ };
81
+ Object.defineProperty(exports, "__esModule", { value: true });
82
+ var OpCode_1 = require("../../OpCode");
83
+ var prettier = __importStar(require("prettier"));
84
+ var Data_1 = require("../../Data");
85
+ /**
86
+ * Words which are invalid for any JavaScript identifier to be, when it isn't
87
+ * on a namespace (like `this` or `this.vars`).
88
+ *
89
+ * This list may be more comprehensive than it needs to be in every case,
90
+ * erring to avoid potential issues.
91
+ *
92
+ * Mostly pulled from MDN:
93
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#reserved_words
94
+ */
95
+ var JS_RESERVED_WORDS = [
96
+ "arguments",
97
+ "await",
98
+ "break",
99
+ "case",
100
+ "catch",
101
+ "class",
102
+ "const",
103
+ "continue",
104
+ "debugger",
105
+ "default",
106
+ "delete",
107
+ "do",
108
+ "else",
109
+ "enum",
110
+ "eval",
111
+ "export",
112
+ "extends",
113
+ "false",
114
+ "finally",
115
+ "for",
116
+ "function",
117
+ "if",
118
+ "implements",
119
+ "import",
120
+ "in",
121
+ "instanceof",
122
+ "interface",
123
+ "let",
124
+ "new",
125
+ "null",
126
+ "package",
127
+ "private",
128
+ "protected",
129
+ "public",
130
+ "return",
131
+ "static",
132
+ "super",
133
+ "switch",
134
+ "this",
135
+ "throw",
136
+ "true",
137
+ "try",
138
+ "typeof",
139
+ "yield",
140
+ "var",
141
+ "void",
142
+ "while",
143
+ "with"
144
+ ];
145
+ /**
146
+ * Global identifiers which Leopard sprites (subclasses of `Sprite`) must not
147
+ * be named as, since that would overwrite or be a reference binding error.
148
+ *
149
+ * Only capitalized identifiers need to be listed here: generated sprite names
150
+ * will never conflict with identifiers whose first letter is lowercase.
151
+ * (This is also why JS reserved words aren't listed here - they're all
152
+ * lowercase, so don't conflict with generated sprite names.)
153
+ *
154
+ * However, it *must* include even (capitalized) identifiers which *aren't*
155
+ * provided by Leopard, if any part of generated Leopard code could directly
156
+ * refer to those identifiers (expecting some browser-provided value, rather
157
+ * than a generated `Sprite` subclass!).
158
+ */
159
+ var LEOPARD_RESERVED_SPRITE_NAMES = [
160
+ // Flat-out syntax errors
161
+ "Infinity",
162
+ "NaN",
163
+ // Browser-provided identifiers
164
+ "Date",
165
+ "Math",
166
+ // Leopard-provided identifiers
167
+ "Color",
168
+ "Costume",
169
+ "Sound",
170
+ "Sprite",
171
+ "StageBase",
172
+ "Trigger",
173
+ "Watcher"
174
+ ];
175
+ /**
176
+ * Property names which have special meaning in JavaScript. Custom properties
177
+ * must not overwrite these names, no matter the context.
178
+ */
179
+ var JS_RESERVED_PROPERTIES = ["__proto__", "constructor", "prototype"];
180
+ /**
181
+ * Property names which are used by any Leopard target - these correspond to
182
+ * Leopard's `SpriteBase` abstract class. Properties here are present on
183
+ * sprites as well as the stage.
184
+ *
185
+ * Overwriting these properties would change behavior that Leopard itself
186
+ * provides and expects to be behave in certain ways. While this a coding wizard
187
+ * might like to take advantage of this in their own Leopard project, generated
188
+ * projects must never accidentally overwrite these!
189
+ *
190
+ * This list is a superset of `JS_RESERVED_PROPERTIES` (and so are all supersets
191
+ * of this list).
192
+ *
193
+ * Note that this is *not* a superset of ordinary JavaScript reserved
194
+ * words. Properties are always accessed with `this.${name}` syntax, not used
195
+ * as standalone identifiers (`let ${name} = foo`).
196
+ */
197
+ var LEOPARD_RESERVED_SPRITE_BASE_PROPERTIES = __spreadArray(__spreadArray([], JS_RESERVED_PROPERTIES, true), [
198
+ // Internals
199
+ "_costumeNumber",
200
+ "_layerOrder",
201
+ "_project",
202
+ "_vars",
203
+ // Basic execution
204
+ "triggers",
205
+ "vars",
206
+ "warp",
207
+ // Other objects
208
+ "stage",
209
+ "sprites",
210
+ "watchers",
211
+ // Control & events
212
+ "broadcast",
213
+ "broadcastAndWait",
214
+ "wait",
215
+ // Operators - casting
216
+ "toNumber",
217
+ "toBoolean",
218
+ "toString",
219
+ "compare",
220
+ // Operators - strings
221
+ "stringIncludes",
222
+ "letterOf",
223
+ // Operators - numbers
224
+ "degToRad",
225
+ "degToScratch",
226
+ "radToDeg",
227
+ "radToScratch",
228
+ "random",
229
+ "scratchTan",
230
+ "scratchToDeg",
231
+ "scratchToRad",
232
+ "normalizeDeg",
233
+ "wrapClamp",
234
+ // Lists (arrays)
235
+ "arrayIncludes",
236
+ "indexInArray",
237
+ "itemOf",
238
+ // Sensing
239
+ "answer",
240
+ "askAndWait",
241
+ "keyPressed",
242
+ "loudness",
243
+ "mouse",
244
+ "restartTimer",
245
+ "timer",
246
+ // Looks
247
+ "costume",
248
+ "costumeNumber",
249
+ "costumes",
250
+ "effects",
251
+ // Sounds
252
+ "audioEffects",
253
+ "effectChain",
254
+ "getSound",
255
+ "getSoundsPlayedByMe",
256
+ "playSoundUntilDone",
257
+ "sounds",
258
+ "startSound",
259
+ "stopAllOfMySounds",
260
+ "stopAllSounds",
261
+ // Pen
262
+ "clearPen"
263
+ ], false);
264
+ /**
265
+ * Property names which are used by Leopard stages (instances of `Stage`,
266
+ * whether any subclass or directly constructed from `Stage`). This list is
267
+ * a superset of `LEOPARD_RESERVED_SPRITE_BASE_PROPERTIES`.
268
+ */
269
+ var LEOPARD_RESERVED_STAGE_PROPERTIES = __spreadArray(__spreadArray([], LEOPARD_RESERVED_SPRITE_BASE_PROPERTIES, true), [
270
+ // Essential properties
271
+ "__counter",
272
+ "fence",
273
+ "height",
274
+ "width",
275
+ // Events & control
276
+ "fireBackdropChanged"
277
+ ], false);
278
+ /**
279
+ * Property names which are used by Leopard sprites (instances of `Sprite`,
280
+ * whether any subclass or directly constructed from `Sprite`). This list is
281
+ * a superset of `LEOPARD_RESERVED_SPRITE_BASE_PROPERTIES`.
282
+ */
283
+ var LEOPARD_RESERVED_SPRITE_PROPERTIES = __spreadArray(__spreadArray([], LEOPARD_RESERVED_SPRITE_BASE_PROPERTIES, true), [
284
+ // Internals
285
+ "_direction",
286
+ "_penColor",
287
+ "_penDown",
288
+ "_speechBubble",
289
+ "_x",
290
+ "_y",
291
+ // Other objects
292
+ "andClones",
293
+ "clones",
294
+ "parent",
295
+ // Control & events
296
+ "createClone",
297
+ "deleteThisClone",
298
+ // Sensing
299
+ "colorTouching",
300
+ "touching",
301
+ "nearestEdge",
302
+ // Looks
303
+ "moveAhead",
304
+ "moveBehind",
305
+ "say",
306
+ "sayAndWait",
307
+ "size",
308
+ "think",
309
+ "thinkAndWait",
310
+ "visible",
311
+ // Motion
312
+ "direction",
313
+ "glide",
314
+ "goto",
315
+ "ifOnEdgeBounce",
316
+ "move",
317
+ "positionInFence",
318
+ "rotationStyle",
319
+ "x",
320
+ "y",
321
+ // Pen
322
+ "penColor",
323
+ "penDown",
324
+ "penSize",
325
+ "stamp"
326
+ ], false);
327
+ /**
328
+ * Input shapes are the basic attribute controlling which of a set of syntaxes
329
+ * is returned for any given block (or primitive value). Provide an input shape
330
+ * to inputToJS to specify what kind of value should be provided as the value
331
+ * in that input. If the content of input does not match the desired shape, for
332
+ * example because it is a block which returns a different type than desired,
333
+ * it will be automatically cast to the correct type for use in the block.
334
+ */
335
+ var InputShape;
336
+ (function (InputShape) {
337
+ /**
338
+ * Generic shape indicating that any kind of input is acceptable. The input
339
+ * will never be cast, and may be null, undefined, or any JavaScript value.
340
+ */
341
+ InputShape["Any"] = "Any";
342
+ /**
343
+ * Number input shape. If the input block isn't guaranteed to be a number,
344
+ * it is automatically wrapped with this.toNumber(), which has particular
345
+ * behavior to match Scratch.
346
+ */
347
+ InputShape["Number"] = "Number";
348
+ /**
349
+ * Special "index" shape, representing an arbitrary number which has been
350
+ * decremented (decreased by 1). Scratch lists are 1-based while JavaScript
351
+ * arrays and strings are indexed starting from 0, so all indexes converted
352
+ * from Scratch must be decreased to match. The "index" shape allows number
353
+ * primitives to be statically decremented, and blocks which include a plus
354
+ * or minus operator to automtaically "absorb" the following decrement.
355
+ */
356
+ InputShape["Index"] = "Index";
357
+ /**
358
+ * String input shape. If the input block isn't guaranteed to be a string,
359
+ * it is automatically wrapped with this.toString(), which is just a wrapper
360
+ * around the built-in String() op but is written so for consistency.
361
+ *
362
+ * The string input shape also guarantees that primitive values which could
363
+ * be statically converted to a number, e.g. the string "1.234", will NOT be
364
+ * converted.
365
+ */
366
+ InputShape["String"] = "String";
367
+ /**
368
+ * Boolean input shape. If the input block isn't guaranteed to be a boolean,
369
+ * it is automatically wrapped with this.toBoolean(), which has particular
370
+ * behavior to match Scratch. Note that Scratch doesn't have a concept of
371
+ * boolean primitives (no "true" or "false" blocks, nor a "switch" type
372
+ * control for directly inputting true/false as in Snap!).
373
+ */
374
+ InputShape["Boolean"] = "Boolean";
375
+ /**
376
+ * "Stack" block, referring to blocks which can be put one after another and
377
+ * together represent a sequence of steps. Stack inputs may be empty and
378
+ * otherwise are one or more blocks. In JavaScript, there's no fundamental
379
+ * difference between a "function" for reporting values and a "command" for
380
+ * applying effects, so no additional syntax is required to cast any given
381
+ * input value to a stack.
382
+ */
383
+ InputShape["Stack"] = "Stack";
384
+ })(InputShape || (InputShape = {}));
385
+ function uniqueNameFactory(reservedNames) {
386
+ if (reservedNames === void 0) { reservedNames = []; }
387
+ var usedNames = new Set(reservedNames);
388
+ return uniqueName;
389
+ function uniqueName(name) {
390
+ if (!usedNames.has(name)) {
391
+ usedNames.add(name);
392
+ return name;
393
+ }
394
+ var numResult = /\d+$/.exec(name);
395
+ if (numResult === null) {
396
+ return uniqueName(name + "2");
397
+ }
398
+ return uniqueName(name.slice(0, numResult.index) + String(parseInt(numResult[0], 10) + 1));
399
+ }
400
+ }
401
+ function camelCase(name, upper) {
402
+ if (upper === void 0) { upper = false; }
403
+ var validChars = /[^a-zA-Z0-9]/;
404
+ var ignoredChars = /[']/g;
405
+ var parts = name.replace(ignoredChars, "").split(validChars);
406
+ parts = parts.map(function (part) { return part.trim(); });
407
+ parts = parts.map(function (part) { return part.slice(0, 1).toUpperCase() + part.slice(1).toLowerCase(); });
408
+ if (!upper) {
409
+ parts[0] = parts[0].toLowerCase();
410
+ }
411
+ var result = parts.join("");
412
+ // A blank string is no good
413
+ if (result.length === 0) {
414
+ result = "_";
415
+ }
416
+ // Variable names cannot start with a number
417
+ if (!isNaN(parseInt(result[0], 10))) {
418
+ result = "_" + result;
419
+ }
420
+ return result;
421
+ }
422
+ function toLeopard(project, inOptions, prettierConfig) {
423
+ if (inOptions === void 0) { inOptions = {}; }
424
+ if (prettierConfig === void 0) { prettierConfig = {}; }
425
+ return __awaiter(this, void 0, void 0, function () {
426
+ function staticBlockInputToLiteral(value, desiredInputShape) {
427
+ // Short-circuit for string inputs. These must never return number syntax.
428
+ if (desiredInputShape === InputShape.String) {
429
+ return JSON.stringify(value);
430
+ }
431
+ // Other input shapes which static inputs may fulfill: number, index, any.
432
+ // These are all OK to return JavaScript number literals for.
433
+ var asNum = Number(value);
434
+ if (!isNaN(asNum) && value !== "") {
435
+ if (desiredInputShape === InputShape.Index) {
436
+ return JSON.stringify(asNum - 1);
437
+ }
438
+ else {
439
+ return JSON.stringify(asNum);
440
+ }
441
+ }
442
+ return JSON.stringify(value);
443
+ }
444
+ function triggerInitCode(script, target) {
445
+ var hat = script.hat;
446
+ if (hat === null) {
447
+ return null;
448
+ }
449
+ var triggerInitStr = function (name, options) {
450
+ var optionsStr = "";
451
+ if (options) {
452
+ var optionValues = [];
453
+ for (var _i = 0, _a = Object.entries(options); _i < _a.length; _i++) {
454
+ var _b = _a[_i], optionName = _b[0], optionValue = _b[1];
455
+ optionValues.push("".concat(optionName, ": ").concat(optionValue));
456
+ }
457
+ optionsStr = ", {".concat(optionValues.join(", "), "}");
458
+ }
459
+ return "new Trigger(Trigger.".concat(name).concat(optionsStr, ", this.").concat(script.name, ")");
460
+ };
461
+ switch (hat.opcode) {
462
+ case OpCode_1.OpCode.event_whenflagclicked:
463
+ return triggerInitStr("GREEN_FLAG");
464
+ case OpCode_1.OpCode.event_whenkeypressed:
465
+ return triggerInitStr("KEY_PRESSED", { key: JSON.stringify(hat.inputs.KEY_OPTION.value) });
466
+ case OpCode_1.OpCode.event_whenthisspriteclicked:
467
+ case OpCode_1.OpCode.event_whenstageclicked:
468
+ return triggerInitStr("CLICKED");
469
+ case OpCode_1.OpCode.event_whenbroadcastreceived:
470
+ return triggerInitStr("BROADCAST", { name: JSON.stringify(hat.inputs.BROADCAST_OPTION.value) });
471
+ case OpCode_1.OpCode.event_whengreaterthan: {
472
+ var valueInput = hat.inputs.VALUE;
473
+ // If the "greater than" value is a literal, we can include it directly.
474
+ // Otherwise, it's a block that may depend on sprite state and needs to
475
+ // be a function.
476
+ var value = valueInput.type === "block"
477
+ ? "() => ".concat(blockToJSWithContext(valueInput.value, target))
478
+ : staticBlockInputToLiteral(valueInput.value, InputShape.Number);
479
+ return triggerInitStr("".concat(hat.inputs.WHENGREATERTHANMENU.value, "_GREATER_THAN"), {
480
+ VALUE: value
481
+ });
482
+ }
483
+ case OpCode_1.OpCode.control_start_as_clone:
484
+ return triggerInitStr("CLONE_START");
485
+ default:
486
+ return null;
487
+ }
488
+ }
489
+ function scriptToJS(script, target) {
490
+ var body = script.body.map(function (block) { return blockToJSWithContext(block, target, script); }).join(";\n");
491
+ if (script.hat && script.hat.opcode === OpCode_1.OpCode.procedures_definition) {
492
+ return "\n * ".concat(script.name, "(").concat(script.hat.inputs.ARGUMENTS.value
493
+ .filter(function (arg) { return arg.type !== "label"; })
494
+ .map(function (arg) { return arg.name; })
495
+ .join(", "), ") {\n ").concat(body, "\n }\n ");
496
+ }
497
+ return "\n * ".concat(script.name, "() {\n ").concat(body, "\n }\n ");
498
+ }
499
+ function blockToJSWithContext(block, target, script) {
500
+ // This will be shared by all contained blockToJS calls, which should include
501
+ // all following/descendant relative to the provided one. Officially local names
502
+ // should be unique to the script, but if we don't have a script, they will still
503
+ // be unique to these "nearby" blocks (part of the same blockToJSWithContext call).
504
+ var uniqueLocalVarName;
505
+ if (script && uniqueLocalVarNameMap.has(script)) {
506
+ uniqueLocalVarName = uniqueLocalVarNameMap.get(script);
507
+ }
508
+ else {
509
+ uniqueLocalVarName = uniqueNameFactory();
510
+ }
511
+ return blockToJS(block);
512
+ function increase(leftSide, input, allowIncrementDecrement) {
513
+ var n = parseNumber(input);
514
+ if (typeof n !== "number") {
515
+ return "".concat(leftSide, " += ").concat(inputToJS(input, InputShape.Number));
516
+ }
517
+ if (allowIncrementDecrement && n === 1) {
518
+ return "".concat(leftSide, "++");
519
+ }
520
+ else if (allowIncrementDecrement && n === -1) {
521
+ return "".concat(leftSide, "--");
522
+ }
523
+ else if (n >= 0) {
524
+ return "".concat(leftSide, " += ").concat(JSON.stringify(n));
525
+ }
526
+ else {
527
+ return "".concat(leftSide, " -= ").concat(JSON.stringify(-n));
528
+ }
529
+ }
530
+ function decrease(leftSide, input, allowIncrementDecrement) {
531
+ var n = parseNumber(input);
532
+ if (typeof n !== "number") {
533
+ return "".concat(leftSide, " -= ").concat(inputToJS(input, InputShape.Number));
534
+ }
535
+ if (allowIncrementDecrement && n === 1) {
536
+ return "".concat(leftSide, "--");
537
+ }
538
+ else if (allowIncrementDecrement && n === -1) {
539
+ return "".concat(leftSide, "++");
540
+ }
541
+ else if (n > 0) {
542
+ return "".concat(leftSide, " -= ").concat(JSON.stringify(n));
543
+ }
544
+ else {
545
+ return "".concat(leftSide, " += ").concat(JSON.stringify(-n));
546
+ }
547
+ }
548
+ function parseNumber(input) {
549
+ // Returns a number if the input was a primitive (static) value and was
550
+ // able to be parsed as a number; otherwise, returns null.
551
+ if (input.type === "block") {
552
+ return null;
553
+ }
554
+ var n = Number(input.value);
555
+ if (isNaN(n)) {
556
+ return null;
557
+ }
558
+ return n;
559
+ }
560
+ function spriteInputToJS(input) {
561
+ return "this.sprites[".concat(JSON.stringify(targetNameMap[input.value]), "]");
562
+ }
563
+ function colorInputToJS(input) {
564
+ if (input.type === "color") {
565
+ var _a = input.value, r = _a.r, g = _a.g, b = _a.b;
566
+ return "Color.rgb(".concat(r, ", ").concat(g, ", ").concat(b, ")");
567
+ }
568
+ else {
569
+ var num = inputToJS(input, InputShape.Number);
570
+ return "Color.num(".concat(num, ")");
571
+ }
572
+ }
573
+ function inputToJS(input, desiredInputShape) {
574
+ var _a, _b;
575
+ // TODO: Right now, inputs can be completely undefined if imported from
576
+ // the .sb3 format (because sb3 is weird). This little check will replace
577
+ // undefined inputs with the value `null`. In theory, this should
578
+ // eventually be removed when the sb3 import script is improved.
579
+ if (input === undefined) {
580
+ return "null";
581
+ }
582
+ switch (input.type) {
583
+ case "block": {
584
+ var inputSource = blockToJS(input.value, desiredInputShape);
585
+ if (desiredInputShape === InputShape.Stack) {
586
+ return inputSource;
587
+ }
588
+ else {
589
+ return "(".concat(inputSource, ")");
590
+ }
591
+ }
592
+ case "blocks": {
593
+ return (_b = (_a = input.value) === null || _a === void 0 ? void 0 : _a.map(function (block) { return blockToJS(block); }).join(";\n")) !== null && _b !== void 0 ? _b : "";
594
+ }
595
+ default: {
596
+ return staticBlockInputToLiteral(input.value, desiredInputShape);
597
+ }
598
+ }
599
+ }
600
+ function blockToJS(block, desiredInputShape) {
601
+ var warp = script && script.hat && script.hat.opcode === OpCode_1.OpCode.procedures_definition && script.hat.inputs.WARP.value;
602
+ // If the block contains a variable or list dropdown,
603
+ // get the code to grab that variable now for convenience
604
+ // TODO: set these to null and restructure control flow to avoid null checks
605
+ var selectedVarSource = "";
606
+ var selectedWatcherSource = "";
607
+ var varInputId = null;
608
+ if ("VARIABLE" in block.inputs) {
609
+ varInputId = block.inputs.VARIABLE.value.id;
610
+ }
611
+ else if ("LIST" in block.inputs) {
612
+ varInputId = block.inputs.LIST.value.id;
613
+ }
614
+ if (varInputId) {
615
+ var newName = variableNameMap[varInputId];
616
+ if (target === project.stage || !stageVariables.has(varInputId)) {
617
+ selectedVarSource = "this.vars.".concat(newName);
618
+ selectedWatcherSource = "this.watchers.".concat(newName);
619
+ }
620
+ else {
621
+ selectedVarSource = "this.stage.vars.".concat(newName);
622
+ selectedWatcherSource = "this.stage.watchers.".concat(newName);
623
+ }
624
+ }
625
+ var stage = "this" + (target.isStage ? "" : ".stage");
626
+ var satisfiesInputShape;
627
+ var blockSource;
628
+ makeBlockSource: switch (block.opcode) {
629
+ case OpCode_1.OpCode.motion_movesteps: {
630
+ satisfiesInputShape = InputShape.Stack;
631
+ var steps = inputToJS(block.inputs.STEPS, InputShape.Number);
632
+ blockSource = "this.move(".concat(steps, ")");
633
+ break;
634
+ }
635
+ case OpCode_1.OpCode.motion_turnright: {
636
+ satisfiesInputShape = InputShape.Stack;
637
+ blockSource = increase("this.direction", block.inputs.DEGREES, false);
638
+ break;
639
+ }
640
+ case OpCode_1.OpCode.motion_turnleft: {
641
+ satisfiesInputShape = InputShape.Stack;
642
+ blockSource = decrease("this.direction", block.inputs.DEGREES, false);
643
+ break;
644
+ }
645
+ case OpCode_1.OpCode.motion_goto: {
646
+ satisfiesInputShape = InputShape.Stack;
647
+ var x = void 0;
648
+ var y = void 0;
649
+ switch (block.inputs.TO.value) {
650
+ case "_random_": {
651
+ x = "this.random(-240, 240)";
652
+ y = "this.random(-180, 180)";
653
+ break;
654
+ }
655
+ case "_mouse_": {
656
+ x = "this.mouse.x";
657
+ y = "this.mouse.y";
658
+ break;
659
+ }
660
+ default: {
661
+ var sprite = spriteInputToJS(block.inputs.TO);
662
+ x = "".concat(sprite, ".x");
663
+ y = "".concat(sprite, ".y");
664
+ break;
665
+ }
666
+ }
667
+ blockSource = "this.goto(".concat(x, ", ").concat(y, ")");
668
+ break;
669
+ }
670
+ case OpCode_1.OpCode.motion_gotoxy: {
671
+ satisfiesInputShape = InputShape.Stack;
672
+ var x = inputToJS(block.inputs.X, InputShape.Number);
673
+ var y = inputToJS(block.inputs.Y, InputShape.Number);
674
+ blockSource = "this.goto(".concat(x, ", ").concat(y, ")");
675
+ break;
676
+ }
677
+ case OpCode_1.OpCode.motion_glideto: {
678
+ satisfiesInputShape = InputShape.Stack;
679
+ var secs = inputToJS(block.inputs.SECS, InputShape.Number);
680
+ var x = void 0;
681
+ var y = void 0;
682
+ switch (block.inputs.TO.value) {
683
+ case "_random_": {
684
+ x = "this.random(-240, 240)";
685
+ y = "this.random(-180, 180)";
686
+ break;
687
+ }
688
+ case "_mouse_": {
689
+ x = "this.mouse.x";
690
+ y = "this.mouse.y";
691
+ break;
692
+ }
693
+ default: {
694
+ var sprite = spriteInputToJS(block.inputs.TO);
695
+ x = "".concat(sprite, ".x");
696
+ y = "".concat(sprite, ".y");
697
+ break;
698
+ }
699
+ }
700
+ blockSource = "yield* this.glide(".concat(secs, ", ").concat(x, ", ").concat(y, ")");
701
+ break;
702
+ }
703
+ case OpCode_1.OpCode.motion_glidesecstoxy: {
704
+ satisfiesInputShape = InputShape.Stack;
705
+ var secs = inputToJS(block.inputs.SECS, InputShape.Number);
706
+ var x = inputToJS(block.inputs.X, InputShape.Number);
707
+ var y = inputToJS(block.inputs.Y, InputShape.Number);
708
+ blockSource = "yield* this.glide(".concat(secs, ", ").concat(x, ", ").concat(y, ")");
709
+ break;
710
+ }
711
+ case OpCode_1.OpCode.motion_pointindirection: {
712
+ satisfiesInputShape = InputShape.Stack;
713
+ var direction = inputToJS(block.inputs.DIRECTION, InputShape.Number);
714
+ blockSource = "this.direction = ".concat(direction);
715
+ break;
716
+ }
717
+ case OpCode_1.OpCode.motion_pointtowards: {
718
+ satisfiesInputShape = InputShape.Stack;
719
+ var x = void 0;
720
+ var y = void 0;
721
+ switch (block.inputs.TOWARDS.value) {
722
+ case "_mouse_": {
723
+ x = "this.mouse.x";
724
+ y = "this.mouse.y";
725
+ break;
726
+ }
727
+ default: {
728
+ var sprite = spriteInputToJS(block.inputs.TOWARDS);
729
+ x = "".concat(sprite, ".x");
730
+ y = "".concat(sprite, ".y");
731
+ break;
732
+ }
733
+ }
734
+ blockSource = "this.direction = this.radToScratch(Math.atan2(".concat(y, " - this.y, ").concat(x, " - this.x))");
735
+ break;
736
+ }
737
+ case OpCode_1.OpCode.motion_changexby: {
738
+ satisfiesInputShape = InputShape.Stack;
739
+ blockSource = increase("this.x", block.inputs.DX, false);
740
+ break;
741
+ }
742
+ case OpCode_1.OpCode.motion_setx: {
743
+ satisfiesInputShape = InputShape.Stack;
744
+ var x = inputToJS(block.inputs.X, InputShape.Number);
745
+ blockSource = "this.x = ".concat(x);
746
+ break;
747
+ }
748
+ case OpCode_1.OpCode.motion_changeyby: {
749
+ satisfiesInputShape = InputShape.Stack;
750
+ blockSource = increase("this.y", block.inputs.DY, false);
751
+ break;
752
+ }
753
+ case OpCode_1.OpCode.motion_sety: {
754
+ satisfiesInputShape = InputShape.Stack;
755
+ var y = inputToJS(block.inputs.Y, InputShape.Number);
756
+ blockSource = "this.y = ".concat(y);
757
+ break;
758
+ }
759
+ case OpCode_1.OpCode.motion_ifonedgebounce: {
760
+ satisfiesInputShape = InputShape.Stack;
761
+ blockSource = "this.ifOnEdgeBounce()";
762
+ break;
763
+ }
764
+ case OpCode_1.OpCode.motion_setrotationstyle: {
765
+ satisfiesInputShape = InputShape.Stack;
766
+ var style = void 0;
767
+ switch (block.inputs.STYLE.value) {
768
+ case "left-right": {
769
+ style = "LEFT_RIGHT";
770
+ break;
771
+ }
772
+ case "don't rotate": {
773
+ style = "DONT_ROTATE";
774
+ break;
775
+ }
776
+ case "all around": {
777
+ style = "ALL_AROUND";
778
+ break;
779
+ }
780
+ }
781
+ blockSource = "this.rotationStyle = Sprite.RotationStyle.".concat(style);
782
+ break;
783
+ }
784
+ case OpCode_1.OpCode.motion_xposition: {
785
+ satisfiesInputShape = InputShape.Number;
786
+ blockSource = "this.x";
787
+ break;
788
+ }
789
+ case OpCode_1.OpCode.motion_yposition: {
790
+ satisfiesInputShape = InputShape.Number;
791
+ blockSource = "this.y";
792
+ break;
793
+ }
794
+ case OpCode_1.OpCode.motion_direction: {
795
+ satisfiesInputShape = InputShape.Number;
796
+ blockSource = "this.direction";
797
+ break;
798
+ }
799
+ // Obsolete no-op blocks:
800
+ case OpCode_1.OpCode.motion_scroll_right:
801
+ case OpCode_1.OpCode.motion_scroll_up:
802
+ case OpCode_1.OpCode.motion_align_scene: {
803
+ satisfiesInputShape = InputShape.Stack;
804
+ blockSource = "";
805
+ break;
806
+ }
807
+ case OpCode_1.OpCode.motion_xscroll:
808
+ case OpCode_1.OpCode.motion_yscroll: {
809
+ satisfiesInputShape = InputShape.Any;
810
+ blockSource = "undefined"; // Compatibility with Scratch 3.0 \:)/
811
+ break;
812
+ }
813
+ case OpCode_1.OpCode.looks_sayforsecs: {
814
+ satisfiesInputShape = InputShape.Stack;
815
+ var message = inputToJS(block.inputs.MESSAGE, InputShape.Any);
816
+ var secs = inputToJS(block.inputs.SECS, InputShape.Number);
817
+ blockSource = "yield* this.sayAndWait(".concat(message, ", ").concat(secs, ")");
818
+ break;
819
+ }
820
+ case OpCode_1.OpCode.looks_say: {
821
+ satisfiesInputShape = InputShape.Stack;
822
+ var message = inputToJS(block.inputs.MESSAGE, InputShape.Any);
823
+ blockSource = "this.say(".concat(message, ")");
824
+ break;
825
+ }
826
+ case OpCode_1.OpCode.looks_thinkforsecs: {
827
+ satisfiesInputShape = InputShape.Stack;
828
+ var message = inputToJS(block.inputs.MESSAGE, InputShape.Any);
829
+ var secs = inputToJS(block.inputs.SECS, InputShape.Number);
830
+ blockSource = "yield* this.thinkAndWait(".concat(message, ", ").concat(secs, ")");
831
+ break;
832
+ }
833
+ case OpCode_1.OpCode.looks_think: {
834
+ satisfiesInputShape = InputShape.Stack;
835
+ var message = inputToJS(block.inputs.MESSAGE, InputShape.Any);
836
+ blockSource = "this.think(".concat(message, ")");
837
+ break;
838
+ }
839
+ case OpCode_1.OpCode.looks_switchcostumeto: {
840
+ satisfiesInputShape = InputShape.Stack;
841
+ var costume = inputToJS(block.inputs.COSTUME, InputShape.Any);
842
+ blockSource = "this.costume = ".concat(costume);
843
+ break;
844
+ }
845
+ case OpCode_1.OpCode.looks_nextcostume: {
846
+ satisfiesInputShape = InputShape.Stack;
847
+ blockSource = "this.costumeNumber++";
848
+ break;
849
+ }
850
+ case OpCode_1.OpCode.looks_switchbackdropto: {
851
+ satisfiesInputShape = InputShape.Stack;
852
+ var backdrop = inputToJS(block.inputs.BACKDROP, InputShape.Any);
853
+ blockSource = "".concat(stage, ".costume = ").concat(backdrop);
854
+ break;
855
+ }
856
+ case OpCode_1.OpCode.looks_nextbackdrop: {
857
+ satisfiesInputShape = InputShape.Stack;
858
+ blockSource = "".concat(stage, ".costumeNumber++");
859
+ break;
860
+ }
861
+ case OpCode_1.OpCode.looks_changesizeby: {
862
+ satisfiesInputShape = InputShape.Stack;
863
+ blockSource = increase("this.size", block.inputs.CHANGE, false);
864
+ break;
865
+ }
866
+ case OpCode_1.OpCode.looks_setsizeto: {
867
+ satisfiesInputShape = InputShape.Stack;
868
+ var size = inputToJS(block.inputs.SIZE, InputShape.Number);
869
+ blockSource = "this.size = ".concat(size);
870
+ break;
871
+ }
872
+ case OpCode_1.OpCode.looks_changeeffectby: {
873
+ satisfiesInputShape = InputShape.Stack;
874
+ var effect = block.inputs.EFFECT.value.toLowerCase();
875
+ blockSource = increase("this.effects.".concat(effect), block.inputs.CHANGE, false);
876
+ break;
877
+ }
878
+ case OpCode_1.OpCode.looks_seteffectto: {
879
+ satisfiesInputShape = InputShape.Stack;
880
+ var effect = block.inputs.EFFECT.value.toLowerCase();
881
+ var value = inputToJS(block.inputs.VALUE, InputShape.Number);
882
+ blockSource = "this.effects.".concat(effect, " = ").concat(value);
883
+ break;
884
+ }
885
+ case OpCode_1.OpCode.looks_cleargraphiceffects: {
886
+ satisfiesInputShape = InputShape.Stack;
887
+ blockSource = "this.effects.clear()";
888
+ break;
889
+ }
890
+ case OpCode_1.OpCode.looks_show: {
891
+ satisfiesInputShape = InputShape.Stack;
892
+ blockSource = "this.visible = true";
893
+ break;
894
+ }
895
+ case OpCode_1.OpCode.looks_hide: {
896
+ satisfiesInputShape = InputShape.Stack;
897
+ blockSource = "this.visible = false";
898
+ break;
899
+ }
900
+ case OpCode_1.OpCode.looks_gotofrontback: {
901
+ satisfiesInputShape = InputShape.Stack;
902
+ switch (block.inputs.FRONT_BACK.value) {
903
+ case "front": {
904
+ blockSource = "this.moveAhead()";
905
+ break;
906
+ }
907
+ case "back":
908
+ default: {
909
+ blockSource = "this.moveBehind()";
910
+ break;
911
+ }
912
+ }
913
+ break;
914
+ }
915
+ case OpCode_1.OpCode.looks_goforwardbackwardlayers: {
916
+ satisfiesInputShape = InputShape.Stack;
917
+ var num = inputToJS(block.inputs.NUM, InputShape.Number);
918
+ switch (block.inputs.FORWARD_BACKWARD.value) {
919
+ case "forward": {
920
+ blockSource = "this.moveAhead(".concat(num, ")");
921
+ break;
922
+ }
923
+ case "backward":
924
+ default: {
925
+ blockSource = "this.moveBehind(".concat(num, ")");
926
+ break;
927
+ }
928
+ }
929
+ break;
930
+ }
931
+ // Obsolete no-op blocks:
932
+ case OpCode_1.OpCode.looks_hideallsprites:
933
+ case OpCode_1.OpCode.looks_changestretchby:
934
+ case OpCode_1.OpCode.looks_setstretchto: {
935
+ satisfiesInputShape = InputShape.Stack;
936
+ blockSource = "";
937
+ break;
938
+ }
939
+ case OpCode_1.OpCode.looks_costumenumbername: {
940
+ switch (block.inputs.NUMBER_NAME.value) {
941
+ case "name": {
942
+ satisfiesInputShape = InputShape.String;
943
+ blockSource = "this.costume.name";
944
+ break;
945
+ }
946
+ case "number":
947
+ default: {
948
+ satisfiesInputShape = InputShape.Number;
949
+ blockSource = "this.costumeNumber";
950
+ break;
951
+ }
952
+ }
953
+ break;
954
+ }
955
+ case OpCode_1.OpCode.looks_backdropnumbername: {
956
+ switch (block.inputs.NUMBER_NAME.value) {
957
+ case "name": {
958
+ satisfiesInputShape = InputShape.String;
959
+ blockSource = "".concat(stage, ".costume.name");
960
+ break;
961
+ }
962
+ case "number":
963
+ default: {
964
+ satisfiesInputShape = InputShape.Number;
965
+ blockSource = "".concat(stage, ".costumeNumber");
966
+ break;
967
+ }
968
+ }
969
+ break;
970
+ }
971
+ case OpCode_1.OpCode.looks_size: {
972
+ satisfiesInputShape = InputShape.Number;
973
+ blockSource = "this.size";
974
+ break;
975
+ }
976
+ case OpCode_1.OpCode.sound_playuntildone: {
977
+ satisfiesInputShape = InputShape.Stack;
978
+ var sound = inputToJS(block.inputs.SOUND_MENU, InputShape.Any);
979
+ blockSource = "yield* this.playSoundUntilDone(".concat(sound, ")");
980
+ break;
981
+ }
982
+ case OpCode_1.OpCode.sound_play: {
983
+ satisfiesInputShape = InputShape.Stack;
984
+ var sound = inputToJS(block.inputs.SOUND_MENU, InputShape.Any);
985
+ blockSource = "yield* this.startSound(".concat(sound, ")");
986
+ break;
987
+ }
988
+ case OpCode_1.OpCode.sound_setvolumeto: {
989
+ satisfiesInputShape = InputShape.Stack;
990
+ var volume = inputToJS(block.inputs.VOLUME, InputShape.Number);
991
+ blockSource = "this.audioEffects.volume = ".concat(volume);
992
+ break;
993
+ }
994
+ case OpCode_1.OpCode.sound_changevolumeby: {
995
+ satisfiesInputShape = InputShape.Stack;
996
+ blockSource = increase("this.audioEffects.volume", block.inputs.VOLUME, false);
997
+ break;
998
+ }
999
+ case OpCode_1.OpCode.sound_volume: {
1000
+ satisfiesInputShape = InputShape.Number;
1001
+ blockSource = "this.audioEffects.volume";
1002
+ break;
1003
+ }
1004
+ case OpCode_1.OpCode.sound_seteffectto: {
1005
+ satisfiesInputShape = InputShape.Stack;
1006
+ var value = inputToJS(block.inputs.VALUE, InputShape.Number);
1007
+ if (block.inputs.EFFECT.type === "soundEffect") {
1008
+ var effect = block.inputs.EFFECT.value.toLowerCase();
1009
+ blockSource = "this.audioEffects.".concat(effect, " = ").concat(value);
1010
+ }
1011
+ else {
1012
+ var effect = inputToJS(block.inputs.EFFECT, InputShape.Any);
1013
+ blockSource = "this.audioEffects[".concat(effect, "] = ").concat(value);
1014
+ }
1015
+ break;
1016
+ }
1017
+ case OpCode_1.OpCode.sound_changeeffectby: {
1018
+ satisfiesInputShape = InputShape.Stack;
1019
+ var value = block.inputs.VALUE;
1020
+ if (block.inputs.EFFECT.type === "soundEffect") {
1021
+ var effect = block.inputs.EFFECT.value.toLowerCase();
1022
+ blockSource = increase("this.audioEffects.".concat(effect), value, false);
1023
+ }
1024
+ else {
1025
+ var effect = inputToJS(block.inputs.EFFECT, InputShape.Any);
1026
+ blockSource = increase("this.audioEffects[".concat(effect, "]"), value, false);
1027
+ }
1028
+ break;
1029
+ }
1030
+ case OpCode_1.OpCode.sound_cleareffects: {
1031
+ satisfiesInputShape = InputShape.Stack;
1032
+ blockSource = "this.audioEffects.clear()";
1033
+ break;
1034
+ }
1035
+ case OpCode_1.OpCode.sound_stopallsounds: {
1036
+ satisfiesInputShape = InputShape.Stack;
1037
+ blockSource = "this.stopAllSounds()";
1038
+ break;
1039
+ }
1040
+ case OpCode_1.OpCode.event_broadcast: {
1041
+ satisfiesInputShape = InputShape.Stack;
1042
+ var message = inputToJS(block.inputs.BROADCAST_INPUT, InputShape.String);
1043
+ blockSource = "this.broadcast(".concat(message, ")");
1044
+ break;
1045
+ }
1046
+ case OpCode_1.OpCode.event_broadcastandwait: {
1047
+ satisfiesInputShape = InputShape.Stack;
1048
+ var message = inputToJS(block.inputs.BROADCAST_INPUT, InputShape.String);
1049
+ blockSource = "yield* this.broadcastAndWait(".concat(message, ")");
1050
+ break;
1051
+ }
1052
+ case OpCode_1.OpCode.control_wait: {
1053
+ satisfiesInputShape = InputShape.Stack;
1054
+ var duration = inputToJS(block.inputs.DURATION, InputShape.Number);
1055
+ blockSource = "yield* this.wait(".concat(duration, ")");
1056
+ break;
1057
+ }
1058
+ case OpCode_1.OpCode.control_repeat: {
1059
+ satisfiesInputShape = InputShape.Stack;
1060
+ var timesIsStatic = block.inputs.TIMES.type === "number";
1061
+ // Of course we convert blocks in a descending recursive hierarchy,
1062
+ // but we still need to make sure we get the relevant local var names
1063
+ // *before* processing the substack - which might include more "repeat"
1064
+ // blocks!
1065
+ var iVar = uniqueLocalVarName("i");
1066
+ var timesVar = timesIsStatic ? null : uniqueLocalVarName("times");
1067
+ var times = inputToJS(block.inputs.TIMES, InputShape.Number);
1068
+ var substack = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
1069
+ if (timesIsStatic) {
1070
+ blockSource = "for (let ".concat(iVar, " = 0; ").concat(iVar, " < ").concat(times, "; ").concat(iVar, "++) {\n ").concat(substack, ";\n ").concat(warp ? "" : "yield;", "\n }");
1071
+ }
1072
+ else {
1073
+ blockSource = "for (let ".concat(iVar, " = 0, ").concat(timesVar, " = ").concat(times, "; ").concat(iVar, " < ").concat(timesVar, "; ").concat(iVar, "++) {\n ").concat(substack, ";\n ").concat(warp ? "" : "yield;", "\n }");
1074
+ }
1075
+ break;
1076
+ }
1077
+ case OpCode_1.OpCode.control_forever: {
1078
+ satisfiesInputShape = InputShape.Stack;
1079
+ var substack = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
1080
+ blockSource = "while (true) {\n ".concat(substack, ";\n ").concat(warp ? "" : "yield;", "\n }");
1081
+ break;
1082
+ }
1083
+ case OpCode_1.OpCode.control_if: {
1084
+ satisfiesInputShape = InputShape.Stack;
1085
+ var condition = inputToJS(block.inputs.CONDITION, InputShape.Boolean);
1086
+ var substack = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
1087
+ blockSource = "if (".concat(condition, ") {\n ").concat(substack, "\n }");
1088
+ break;
1089
+ }
1090
+ case OpCode_1.OpCode.control_if_else: {
1091
+ satisfiesInputShape = InputShape.Stack;
1092
+ var condition = inputToJS(block.inputs.CONDITION, InputShape.Boolean);
1093
+ var substack1 = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
1094
+ var substack2 = inputToJS(block.inputs.SUBSTACK2, InputShape.Stack);
1095
+ blockSource = "if (".concat(condition, ") {\n ").concat(substack1, "\n } else {\n ").concat(substack2, "\n }");
1096
+ break;
1097
+ }
1098
+ case OpCode_1.OpCode.control_wait_until: {
1099
+ satisfiesInputShape = InputShape.Stack;
1100
+ var condition = inputToJS(block.inputs.CONDITION, InputShape.Boolean);
1101
+ blockSource = "while (!".concat(condition, ") { yield; }");
1102
+ break;
1103
+ }
1104
+ case OpCode_1.OpCode.control_repeat_until: {
1105
+ satisfiesInputShape = InputShape.Stack;
1106
+ var condition = inputToJS(block.inputs.CONDITION, InputShape.Boolean);
1107
+ var substack = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
1108
+ blockSource = "while (!".concat(condition, ") {\n ").concat(substack, "\n ").concat(warp ? "" : "yield;", "\n }");
1109
+ break;
1110
+ }
1111
+ case OpCode_1.OpCode.control_while: {
1112
+ satisfiesInputShape = InputShape.Stack;
1113
+ var condition = inputToJS(block.inputs.CONDITION, InputShape.Boolean);
1114
+ var substack = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
1115
+ blockSource = "while (".concat(condition, ") {\n ").concat(substack, "\n ").concat(warp ? "" : "yield;", "\n }");
1116
+ break;
1117
+ }
1118
+ case OpCode_1.OpCode.control_for_each: {
1119
+ satisfiesInputShape = InputShape.Stack;
1120
+ var value = inputToJS(block.inputs.VALUE, InputShape.Number);
1121
+ var substack = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
1122
+ // TODO: Verify compatibility if variable changes during evaluation
1123
+ blockSource = "for (".concat(selectedVarSource, " = 1; ").concat(selectedVarSource, " <= ").concat(value, "; ").concat(selectedVarSource, "++) {\n ").concat(substack, "\n ").concat(warp ? "" : "yield;", "\n }");
1124
+ break;
1125
+ }
1126
+ case OpCode_1.OpCode.control_all_at_once: {
1127
+ satisfiesInputShape = InputShape.Stack;
1128
+ blockSource = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
1129
+ break;
1130
+ }
1131
+ case OpCode_1.OpCode.control_stop: {
1132
+ satisfiesInputShape = InputShape.Stack;
1133
+ switch (block.inputs.STOP_OPTION.value) {
1134
+ case "this script": {
1135
+ blockSource = "\n this.stop(\"stop\");\n return;\n ";
1136
+ break;
1137
+ }
1138
+ case "other scripts in sprite": {
1139
+ blockSource = "this.stop(\"stopOther\")";
1140
+ break;
1141
+ }
1142
+ case "all": {
1143
+ blockSource = "\n this.stop(\"stopAll\");\n return;\n ";
1144
+ break;
1145
+ }
1146
+ default: {
1147
+ blockSource = "this.stop(\"stopAll\")";
1148
+ break;
1149
+ }
1150
+ }
1151
+ break;
1152
+ }
1153
+ case OpCode_1.OpCode.control_create_clone_of: {
1154
+ satisfiesInputShape = InputShape.Stack;
1155
+ var target_1;
1156
+ switch (block.inputs.CLONE_OPTION.value) {
1157
+ case "_myself_": {
1158
+ target_1 = "this";
1159
+ break;
1160
+ }
1161
+ default: {
1162
+ target_1 = spriteInputToJS(block.inputs.CLONE_OPTION);
1163
+ break;
1164
+ }
1165
+ }
1166
+ blockSource = "".concat(target_1, ".createClone()");
1167
+ break;
1168
+ }
1169
+ case OpCode_1.OpCode.control_delete_this_clone: {
1170
+ satisfiesInputShape = InputShape.Stack;
1171
+ blockSource = "this.deleteThisClone()";
1172
+ break;
1173
+ }
1174
+ case OpCode_1.OpCode.control_get_counter: {
1175
+ satisfiesInputShape = InputShape.Stack;
1176
+ blockSource = "".concat(stage, ".__counter");
1177
+ break;
1178
+ }
1179
+ case OpCode_1.OpCode.control_incr_counter: {
1180
+ satisfiesInputShape = InputShape.Stack;
1181
+ blockSource = "".concat(stage, ".__counter++");
1182
+ break;
1183
+ }
1184
+ case OpCode_1.OpCode.control_clear_counter: {
1185
+ satisfiesInputShape = InputShape.Stack;
1186
+ blockSource = "".concat(stage, ".__counter = 0");
1187
+ break;
1188
+ }
1189
+ case OpCode_1.OpCode.sensing_touchingobject: {
1190
+ satisfiesInputShape = InputShape.Boolean;
1191
+ var target_2;
1192
+ switch (block.inputs.TOUCHINGOBJECTMENU.value) {
1193
+ case "_mouse_": {
1194
+ target_2 = JSON.stringify("mouse");
1195
+ break;
1196
+ }
1197
+ case "_edge_": {
1198
+ target_2 = JSON.stringify("edge");
1199
+ break;
1200
+ }
1201
+ default: {
1202
+ var sprite = spriteInputToJS(block.inputs.TOUCHINGOBJECTMENU);
1203
+ target_2 = "".concat(sprite, ".andClones()");
1204
+ break;
1205
+ }
1206
+ }
1207
+ blockSource = "this.touching(".concat(target_2, ")");
1208
+ break;
1209
+ }
1210
+ case OpCode_1.OpCode.sensing_touchingcolor: {
1211
+ satisfiesInputShape = InputShape.Boolean;
1212
+ var color = colorInputToJS(block.inputs.COLOR);
1213
+ blockSource = "this.touching(".concat(color, ")");
1214
+ break;
1215
+ }
1216
+ case OpCode_1.OpCode.sensing_coloristouchingcolor: {
1217
+ satisfiesInputShape = InputShape.Boolean;
1218
+ var color1 = colorInputToJS(block.inputs.COLOR);
1219
+ var color2 = colorInputToJS(block.inputs.COLOR2);
1220
+ blockSource = "this.colorTouching(".concat(color1, ", ").concat(color2, ")");
1221
+ break;
1222
+ }
1223
+ case OpCode_1.OpCode.sensing_distanceto: {
1224
+ satisfiesInputShape = InputShape.Number;
1225
+ var x = void 0;
1226
+ var y = void 0;
1227
+ switch (block.inputs.DISTANCETOMENU.value) {
1228
+ case "_mouse_": {
1229
+ x = "this.mouse.x";
1230
+ y = "this.mouse.y";
1231
+ break;
1232
+ }
1233
+ default: {
1234
+ var sprite = spriteInputToJS(block.inputs.DISTANCETOMENU);
1235
+ x = "".concat(sprite, ".x");
1236
+ y = "".concat(sprite, ".y");
1237
+ break;
1238
+ }
1239
+ }
1240
+ blockSource = "Math.hypot(".concat(x, " - this.x, ").concat(y, " - this.y)");
1241
+ break;
1242
+ }
1243
+ case OpCode_1.OpCode.sensing_askandwait: {
1244
+ satisfiesInputShape = InputShape.Stack;
1245
+ var question = inputToJS(block.inputs.QUESTION, InputShape.Any);
1246
+ blockSource = "yield* this.askAndWait(".concat(question, ")");
1247
+ break;
1248
+ }
1249
+ case OpCode_1.OpCode.sensing_answer: {
1250
+ satisfiesInputShape = InputShape.String;
1251
+ blockSource = "this.answer";
1252
+ break;
1253
+ }
1254
+ case OpCode_1.OpCode.sensing_keypressed: {
1255
+ satisfiesInputShape = InputShape.Boolean;
1256
+ var key = inputToJS(block.inputs.KEY_OPTION, InputShape.String);
1257
+ blockSource = "this.keyPressed(".concat(key, ")");
1258
+ break;
1259
+ }
1260
+ case OpCode_1.OpCode.sensing_mousedown: {
1261
+ satisfiesInputShape = InputShape.Boolean;
1262
+ blockSource = "this.mouse.down";
1263
+ break;
1264
+ }
1265
+ case OpCode_1.OpCode.sensing_mousex: {
1266
+ satisfiesInputShape = InputShape.Number;
1267
+ blockSource = "this.mouse.x";
1268
+ break;
1269
+ }
1270
+ case OpCode_1.OpCode.sensing_mousey: {
1271
+ satisfiesInputShape = InputShape.Number;
1272
+ blockSource = "this.mouse.y";
1273
+ break;
1274
+ }
1275
+ case OpCode_1.OpCode.sensing_loudness: {
1276
+ satisfiesInputShape = InputShape.Number;
1277
+ blockSource = "this.loudness";
1278
+ break;
1279
+ }
1280
+ case OpCode_1.OpCode.sensing_timer: {
1281
+ satisfiesInputShape = InputShape.Number;
1282
+ blockSource = "this.timer";
1283
+ break;
1284
+ }
1285
+ case OpCode_1.OpCode.sensing_resettimer: {
1286
+ satisfiesInputShape = InputShape.Stack;
1287
+ blockSource = "this.restartTimer()";
1288
+ break;
1289
+ }
1290
+ case OpCode_1.OpCode.sensing_of: {
1291
+ var propName = void 0;
1292
+ switch (block.inputs.PROPERTY.value) {
1293
+ case "x position": {
1294
+ satisfiesInputShape = InputShape.Number;
1295
+ propName = "x";
1296
+ break;
1297
+ }
1298
+ case "y position": {
1299
+ satisfiesInputShape = InputShape.Number;
1300
+ propName = "y";
1301
+ break;
1302
+ }
1303
+ case "direction": {
1304
+ satisfiesInputShape = InputShape.Number;
1305
+ propName = "direction";
1306
+ break;
1307
+ }
1308
+ case "costume #":
1309
+ case "backdrop #": {
1310
+ satisfiesInputShape = InputShape.Number;
1311
+ propName = "costumeNumber";
1312
+ break;
1313
+ }
1314
+ case "costume name":
1315
+ case "backdrop name": {
1316
+ satisfiesInputShape = InputShape.String;
1317
+ propName = "costume.name";
1318
+ break;
1319
+ }
1320
+ case "size": {
1321
+ satisfiesInputShape = InputShape.Number;
1322
+ propName = "size";
1323
+ break;
1324
+ }
1325
+ case "volume": {
1326
+ satisfiesInputShape = InputShape.Number;
1327
+ propName = "audioEffects.volume";
1328
+ break;
1329
+ }
1330
+ default: {
1331
+ satisfiesInputShape = InputShape.Any;
1332
+ var varOwner = project.stage;
1333
+ if (block.inputs.OBJECT.value !== "_stage_") {
1334
+ var sprite = project.sprites.find(function (sprite) { return sprite.name === targetNameMap[block.inputs.OBJECT.value]; });
1335
+ if (sprite) {
1336
+ varOwner = sprite;
1337
+ }
1338
+ }
1339
+ // "of" block gets variables by name, not ID, using lookupVariableByNameAndType in scratch-vm.
1340
+ var variable = varOwner.variables.find(function (variable) { return variable.name === block.inputs.PROPERTY.value; });
1341
+ if (!variable) {
1342
+ satisfiesInputShape = InputShape.Number;
1343
+ blockSource = "(0 /* ".concat(varOwner.name, " doesn't have a \"").concat(block.inputs.PROPERTY.value, "\" variable */)");
1344
+ break makeBlockSource;
1345
+ }
1346
+ propName = "vars.".concat(variableNameMap[variable.id]);
1347
+ break;
1348
+ }
1349
+ }
1350
+ if (propName === null) {
1351
+ blockSource = "/* Cannot access property ".concat(block.inputs.PROPERTY.value, " of target */ null");
1352
+ break;
1353
+ }
1354
+ var targetObj = void 0;
1355
+ if (block.inputs.OBJECT.value === "_stage_") {
1356
+ targetObj = "this.stage";
1357
+ }
1358
+ else {
1359
+ targetObj = spriteInputToJS(block.inputs.OBJECT);
1360
+ }
1361
+ blockSource = "".concat(targetObj, ".").concat(propName);
1362
+ break;
1363
+ }
1364
+ case OpCode_1.OpCode.sensing_current: {
1365
+ satisfiesInputShape = InputShape.Number;
1366
+ switch (block.inputs.CURRENTMENU.value) {
1367
+ case "YEAR": {
1368
+ blockSource = "new Date().getFullYear()";
1369
+ break;
1370
+ }
1371
+ case "MONTH": {
1372
+ blockSource = "new Date().getMonth() + 1";
1373
+ break;
1374
+ }
1375
+ case "DATE": {
1376
+ blockSource = "new Date().getDate()";
1377
+ break;
1378
+ }
1379
+ case "DAYOFWEEK": {
1380
+ blockSource = "new Date().getDay() + 1";
1381
+ break;
1382
+ }
1383
+ case "HOUR": {
1384
+ blockSource = "new Date().getHours()";
1385
+ break;
1386
+ }
1387
+ case "MINUTE": {
1388
+ blockSource = "new Date().getMinutes()";
1389
+ break;
1390
+ }
1391
+ case "SECOND": {
1392
+ blockSource = "new Date().getSeconds()";
1393
+ break;
1394
+ }
1395
+ default: {
1396
+ satisfiesInputShape = InputShape.String;
1397
+ blockSource = "\"\"";
1398
+ break;
1399
+ }
1400
+ }
1401
+ break;
1402
+ }
1403
+ case OpCode_1.OpCode.sensing_dayssince2000: {
1404
+ satisfiesInputShape = InputShape.Number;
1405
+ blockSource = "((new Date().getTime() - new Date(2000, 0, 1)) / 1000 / 60 + new Date().getTimezoneOffset()) / 60 / 24";
1406
+ break;
1407
+ }
1408
+ case OpCode_1.OpCode.sensing_username: {
1409
+ satisfiesInputShape = InputShape.String;
1410
+ blockSource = "(/* no username */ \"\")";
1411
+ break;
1412
+ }
1413
+ case OpCode_1.OpCode.sensing_userid: {
1414
+ satisfiesInputShape = InputShape.Any;
1415
+ blockSource = "undefined"; // Obsolete no-op block.
1416
+ break;
1417
+ }
1418
+ case OpCode_1.OpCode.operator_add: {
1419
+ satisfiesInputShape = InputShape.Number;
1420
+ var num1 = inputToJS(block.inputs.NUM1, InputShape.Number);
1421
+ var num2 = inputToJS(block.inputs.NUM2, InputShape.Number);
1422
+ if (desiredInputShape === InputShape.Index) {
1423
+ // Attempt to fulfill a desired index input by subtracting 1 from either side
1424
+ // of the block. If neither side can be parsed as a number (i.e. both inputs
1425
+ // are filled with blocks), this clause just falls back to the normal number
1426
+ // shape.
1427
+ var val1 = parseNumber(block.inputs.NUM1);
1428
+ var val2 = parseNumber(block.inputs.NUM2);
1429
+ if (typeof val2 === "number") {
1430
+ satisfiesInputShape = InputShape.Index;
1431
+ blockSource = --val2 ? "".concat(num1, " + ").concat(val2) : num1;
1432
+ break;
1433
+ }
1434
+ else if (typeof val1 === "number") {
1435
+ satisfiesInputShape = InputShape.Index;
1436
+ blockSource = --val1 ? "".concat(val1, " + ").concat(num2) : num2;
1437
+ break;
1438
+ }
1439
+ }
1440
+ blockSource = "".concat(num1, " + ").concat(num2);
1441
+ break;
1442
+ }
1443
+ case OpCode_1.OpCode.operator_subtract: {
1444
+ satisfiesInputShape = InputShape.Number;
1445
+ var num1 = inputToJS(block.inputs.NUM1, InputShape.Number);
1446
+ var num2 = inputToJS(block.inputs.NUM2, InputShape.Number);
1447
+ if (desiredInputShape === InputShape.Index) {
1448
+ // Do basically the same thing as the addition operator does, but with
1449
+ // specifics for subtraction: increment the right-hand or decrement the
1450
+ // left-hand.
1451
+ var val1 = parseNumber(block.inputs.NUM1);
1452
+ var val2 = parseNumber(block.inputs.NUM2);
1453
+ if (typeof val2 === "number") {
1454
+ satisfiesInputShape = InputShape.Index;
1455
+ blockSource = ++val2 ? "".concat(num1, " - ").concat(val2) : num1;
1456
+ break;
1457
+ }
1458
+ else if (typeof val1 === "number") {
1459
+ satisfiesInputShape = InputShape.Index;
1460
+ blockSource = --val1 ? "".concat(val1, " - ").concat(num2) : "-".concat(num2);
1461
+ break;
1462
+ }
1463
+ }
1464
+ blockSource = "".concat(num1, " - ").concat(num2);
1465
+ break;
1466
+ }
1467
+ case OpCode_1.OpCode.operator_multiply: {
1468
+ satisfiesInputShape = InputShape.Number;
1469
+ var num1 = inputToJS(block.inputs.NUM1, InputShape.Number);
1470
+ var num2 = inputToJS(block.inputs.NUM2, InputShape.Number);
1471
+ blockSource = "".concat(num1, " * ").concat(num2);
1472
+ break;
1473
+ }
1474
+ case OpCode_1.OpCode.operator_divide: {
1475
+ satisfiesInputShape = InputShape.Number;
1476
+ var num1 = inputToJS(block.inputs.NUM1, InputShape.Number);
1477
+ var num2 = inputToJS(block.inputs.NUM2, InputShape.Number);
1478
+ blockSource = "".concat(num1, " / ").concat(num2);
1479
+ break;
1480
+ }
1481
+ case OpCode_1.OpCode.operator_random: {
1482
+ satisfiesInputShape = InputShape.Number;
1483
+ var from = inputToJS(block.inputs.FROM, InputShape.Number);
1484
+ var to = inputToJS(block.inputs.TO, InputShape.Number);
1485
+ blockSource = "this.random(".concat(from, ", ").concat(to, ")");
1486
+ break;
1487
+ }
1488
+ case OpCode_1.OpCode.operator_gt: {
1489
+ satisfiesInputShape = InputShape.Boolean;
1490
+ var operand1 = inputToJS(block.inputs.OPERAND1, InputShape.Any);
1491
+ var operand2 = inputToJS(block.inputs.OPERAND2, InputShape.Any);
1492
+ blockSource = "this.compare(".concat(operand1, ", ").concat(operand2, ") > 0");
1493
+ break;
1494
+ }
1495
+ case OpCode_1.OpCode.operator_lt: {
1496
+ satisfiesInputShape = InputShape.Boolean;
1497
+ var operand1 = inputToJS(block.inputs.OPERAND1, InputShape.Any);
1498
+ var operand2 = inputToJS(block.inputs.OPERAND2, InputShape.Any);
1499
+ blockSource = "this.compare(".concat(operand1, ", ").concat(operand2, ") < 0");
1500
+ break;
1501
+ }
1502
+ case OpCode_1.OpCode.operator_equals: {
1503
+ satisfiesInputShape = InputShape.Boolean;
1504
+ // If both sides are blocks, we can't make any assumptions about what kind of
1505
+ // values are being compared.(*) Use the custom .compare() function to ensure
1506
+ // compatibility with Scratch's equals block.
1507
+ //
1508
+ // (*) This is theoretically false, but we currently don't have a way to inspect
1509
+ // the returned InputShape of a block input to see if both sides match up.
1510
+ if (block.inputs.OPERAND1.type === "block" &&
1511
+ block.inputs.OPERAND2.type === "block") {
1512
+ var operand1_1 = inputToJS(block.inputs.OPERAND1, InputShape.Any);
1513
+ var operand2_1 = inputToJS(block.inputs.OPERAND2, InputShape.Any);
1514
+ blockSource = "this.compare(".concat(operand1_1, ", ").concat(operand2_1, ") === 0");
1515
+ break;
1516
+ }
1517
+ // From this point on, either the left- or right-hand side is definitely a
1518
+ // primitive (or both).
1519
+ var val1 = parseNumber(block.inputs.OPERAND1);
1520
+ if (typeof val1 === "number") {
1521
+ var operand2_2 = inputToJS(block.inputs.OPERAND2, InputShape.Number);
1522
+ blockSource = "".concat(val1, " === ").concat(operand2_2);
1523
+ break;
1524
+ }
1525
+ var val2 = parseNumber(block.inputs.OPERAND2);
1526
+ if (typeof val2 === "number") {
1527
+ var operand1_2 = inputToJS(block.inputs.OPERAND1, InputShape.Number);
1528
+ blockSource = "".concat(operand1_2, " === ").concat(val2);
1529
+ break;
1530
+ }
1531
+ // If neither side was parsed as a number, one side is definitely a string.
1532
+ // Compare both sides as strings.
1533
+ // TODO: Shouldn't this be case-insensitive?
1534
+ var operand1 = inputToJS(block.inputs.OPERAND1, InputShape.String);
1535
+ var operand2 = inputToJS(block.inputs.OPERAND2, InputShape.String);
1536
+ blockSource = "".concat(operand1, " === ").concat(operand2);
1537
+ break;
1538
+ }
1539
+ case OpCode_1.OpCode.operator_and: {
1540
+ satisfiesInputShape = InputShape.Boolean;
1541
+ var operand1 = inputToJS(block.inputs.OPERAND1, InputShape.Boolean);
1542
+ var operand2 = inputToJS(block.inputs.OPERAND2, InputShape.Boolean);
1543
+ blockSource = "".concat(operand1, " && ").concat(operand2);
1544
+ break;
1545
+ }
1546
+ case OpCode_1.OpCode.operator_or: {
1547
+ satisfiesInputShape = InputShape.Boolean;
1548
+ var operand1 = inputToJS(block.inputs.OPERAND1, InputShape.Boolean);
1549
+ var operand2 = inputToJS(block.inputs.OPERAND2, InputShape.Boolean);
1550
+ blockSource = "".concat(operand1, " || ").concat(operand2);
1551
+ break;
1552
+ }
1553
+ case OpCode_1.OpCode.operator_not: {
1554
+ satisfiesInputShape = InputShape.Boolean;
1555
+ var operand = inputToJS(block.inputs.OPERAND, InputShape.Boolean);
1556
+ blockSource = "!".concat(operand);
1557
+ break;
1558
+ }
1559
+ case OpCode_1.OpCode.operator_join: {
1560
+ satisfiesInputShape = InputShape.String;
1561
+ var string1 = inputToJS(block.inputs.STRING1, InputShape.String);
1562
+ var string2 = inputToJS(block.inputs.STRING2, InputShape.String);
1563
+ blockSource = "".concat(string1, " + ").concat(string2);
1564
+ break;
1565
+ }
1566
+ case OpCode_1.OpCode.operator_letter_of: {
1567
+ satisfiesInputShape = InputShape.String;
1568
+ var string = inputToJS(block.inputs.STRING, InputShape.Any);
1569
+ var letter = inputToJS(block.inputs.LETTER, InputShape.Index);
1570
+ blockSource = "this.letterOf(".concat(string, ", ").concat(letter, ")");
1571
+ break;
1572
+ }
1573
+ case OpCode_1.OpCode.operator_length: {
1574
+ satisfiesInputShape = InputShape.Number;
1575
+ var string = inputToJS(block.inputs.STRING, InputShape.Any);
1576
+ blockSource = "".concat(string, ".length");
1577
+ break;
1578
+ }
1579
+ case OpCode_1.OpCode.operator_contains: {
1580
+ satisfiesInputShape = InputShape.Boolean;
1581
+ var string1 = inputToJS(block.inputs.STRING1, InputShape.String);
1582
+ var string2 = inputToJS(block.inputs.STRING2, InputShape.String);
1583
+ blockSource = "this.stringIncludes(".concat(string1, ", ").concat(string2, ")");
1584
+ break;
1585
+ }
1586
+ case OpCode_1.OpCode.operator_mod: {
1587
+ satisfiesInputShape = InputShape.Number;
1588
+ var num1 = inputToJS(block.inputs.NUM1, InputShape.Number);
1589
+ var num2 = inputToJS(block.inputs.NUM2, InputShape.Number);
1590
+ blockSource = "".concat(num1, " % ").concat(num2);
1591
+ break;
1592
+ }
1593
+ case OpCode_1.OpCode.operator_round: {
1594
+ satisfiesInputShape = InputShape.Number;
1595
+ var num = inputToJS(block.inputs.NUM, InputShape.Number);
1596
+ blockSource = "Math.round(".concat(num, ")");
1597
+ break;
1598
+ }
1599
+ case OpCode_1.OpCode.operator_mathop: {
1600
+ // TODO: Verify this is true for all ops.
1601
+ satisfiesInputShape = InputShape.Number;
1602
+ var num = inputToJS(block.inputs.NUM, InputShape.Number);
1603
+ switch (block.inputs.OPERATOR.value) {
1604
+ case "abs": {
1605
+ blockSource = "Math.abs(".concat(num, ")");
1606
+ break;
1607
+ }
1608
+ case "floor": {
1609
+ blockSource = "Math.floor(".concat(num, ")");
1610
+ break;
1611
+ }
1612
+ case "ceiling": {
1613
+ blockSource = "Math.ceil(".concat(num, ")");
1614
+ break;
1615
+ }
1616
+ case "sqrt": {
1617
+ blockSource = "Math.sqrt(".concat(num, ")");
1618
+ break;
1619
+ }
1620
+ case "sin": {
1621
+ blockSource = "Math.sin(this.degToRad(".concat(num, "))");
1622
+ break;
1623
+ }
1624
+ case "cos": {
1625
+ blockSource = "Math.cos(this.degToRad(".concat(num, "))");
1626
+ break;
1627
+ }
1628
+ case "tan": {
1629
+ blockSource = "this.scratchTan(".concat(num, ")");
1630
+ break;
1631
+ }
1632
+ case "asin": {
1633
+ blockSource = "this.radToDeg(Math.asin(".concat(num, "))");
1634
+ break;
1635
+ }
1636
+ case "acos": {
1637
+ blockSource = "this.radToDeg(Math.acos(".concat(num, "))");
1638
+ break;
1639
+ }
1640
+ case "atan": {
1641
+ blockSource = "this.radToDeg(Math.atan(".concat(num, "))");
1642
+ break;
1643
+ }
1644
+ case "ln": {
1645
+ blockSource = "Math.log(".concat(num, ")");
1646
+ break;
1647
+ }
1648
+ case "log": {
1649
+ blockSource = "Math.log10(".concat(num, ")");
1650
+ break;
1651
+ }
1652
+ case "e ^": {
1653
+ blockSource = "Math.E ** ".concat(num);
1654
+ break;
1655
+ }
1656
+ case "10 ^": {
1657
+ blockSource = "10 ** ".concat(num);
1658
+ break;
1659
+ }
1660
+ }
1661
+ break;
1662
+ }
1663
+ case OpCode_1.OpCode.data_variable: {
1664
+ // TODO: Is this wrong?
1665
+ satisfiesInputShape = InputShape.Stack;
1666
+ blockSource = selectedVarSource;
1667
+ break;
1668
+ }
1669
+ case OpCode_1.OpCode.data_setvariableto: {
1670
+ satisfiesInputShape = InputShape.Stack;
1671
+ var value = inputToJS(block.inputs.VALUE, InputShape.Any);
1672
+ blockSource = "".concat(selectedVarSource, " = ").concat(value);
1673
+ break;
1674
+ }
1675
+ case OpCode_1.OpCode.data_changevariableby: {
1676
+ satisfiesInputShape = InputShape.Stack;
1677
+ blockSource = increase(selectedVarSource, block.inputs.VALUE, true);
1678
+ break;
1679
+ }
1680
+ case OpCode_1.OpCode.data_showvariable: {
1681
+ satisfiesInputShape = InputShape.Stack;
1682
+ blockSource = "".concat(selectedWatcherSource, ".visible = true");
1683
+ break;
1684
+ }
1685
+ case OpCode_1.OpCode.data_hidevariable: {
1686
+ satisfiesInputShape = InputShape.Stack;
1687
+ blockSource = "".concat(selectedWatcherSource, ".visible = false");
1688
+ break;
1689
+ }
1690
+ case OpCode_1.OpCode.data_listcontents: {
1691
+ satisfiesInputShape = InputShape.String;
1692
+ // TODO: This isn't nuanced how Scratch works.
1693
+ blockSource = "".concat(selectedVarSource, ".join(\" \")");
1694
+ break;
1695
+ }
1696
+ case OpCode_1.OpCode.data_addtolist: {
1697
+ satisfiesInputShape = InputShape.Stack;
1698
+ var item = inputToJS(block.inputs.ITEM, InputShape.Any);
1699
+ blockSource = "".concat(selectedVarSource, ".push(").concat(item, ")");
1700
+ break;
1701
+ }
1702
+ case OpCode_1.OpCode.data_deleteoflist: {
1703
+ satisfiesInputShape = InputShape.Stack;
1704
+ switch (block.inputs.INDEX.value) {
1705
+ case "all": {
1706
+ blockSource = "".concat(selectedVarSource, " = []");
1707
+ break;
1708
+ }
1709
+ case "last": {
1710
+ blockSource = "".concat(selectedVarSource, ".splice(").concat(selectedVarSource, ".length - 1, 1)");
1711
+ break;
1712
+ }
1713
+ default: {
1714
+ var index = inputToJS(block.inputs.INDEX, InputShape.Index);
1715
+ blockSource = "".concat(selectedVarSource, ".splice(").concat(index, ", 1)");
1716
+ break;
1717
+ }
1718
+ }
1719
+ break;
1720
+ }
1721
+ case OpCode_1.OpCode.data_deletealloflist: {
1722
+ satisfiesInputShape = InputShape.Stack;
1723
+ blockSource = "".concat(selectedVarSource, " = []");
1724
+ break;
1725
+ }
1726
+ case OpCode_1.OpCode.data_insertatlist: {
1727
+ satisfiesInputShape = InputShape.Stack;
1728
+ var index = inputToJS(block.inputs.INDEX, InputShape.Index);
1729
+ var item = inputToJS(block.inputs.ITEM, InputShape.Any);
1730
+ blockSource = "".concat(selectedVarSource, ".splice(").concat(index, ", 0, ").concat(item, ")");
1731
+ break;
1732
+ }
1733
+ case OpCode_1.OpCode.data_replaceitemoflist: {
1734
+ satisfiesInputShape = InputShape.Stack;
1735
+ var index = inputToJS(block.inputs.INDEX, InputShape.Index);
1736
+ var item = inputToJS(block.inputs.ITEM, InputShape.Any);
1737
+ blockSource = "".concat(selectedVarSource, ".splice(").concat(index, ", 1, ").concat(item, ")");
1738
+ break;
1739
+ }
1740
+ case OpCode_1.OpCode.data_itemoflist: {
1741
+ satisfiesInputShape = InputShape.Any;
1742
+ switch (block.inputs.INDEX.value) {
1743
+ case "last": {
1744
+ blockSource = "this.itemOf(".concat(selectedVarSource, ", ").concat(selectedVarSource, ".length - 1)");
1745
+ break;
1746
+ }
1747
+ default: {
1748
+ var index = inputToJS(block.inputs.INDEX, InputShape.Index);
1749
+ blockSource = "this.itemOf(".concat(selectedVarSource, ", ").concat(index, ")");
1750
+ break;
1751
+ }
1752
+ }
1753
+ break;
1754
+ }
1755
+ case OpCode_1.OpCode.data_itemnumoflist: {
1756
+ var item = inputToJS(block.inputs.ITEM, InputShape.Any);
1757
+ if (desiredInputShape === InputShape.Index) {
1758
+ satisfiesInputShape = InputShape.Index;
1759
+ blockSource = "this.indexInArray(".concat(selectedVarSource, ", ").concat(item, ")");
1760
+ }
1761
+ else {
1762
+ satisfiesInputShape = InputShape.Number;
1763
+ blockSource = "this.indexInArray(".concat(selectedVarSource, ", ").concat(item, ") + 1");
1764
+ }
1765
+ break;
1766
+ }
1767
+ case OpCode_1.OpCode.data_lengthoflist: {
1768
+ satisfiesInputShape = InputShape.Number;
1769
+ blockSource = "".concat(selectedVarSource, ".length");
1770
+ break;
1771
+ }
1772
+ case OpCode_1.OpCode.data_listcontainsitem: {
1773
+ satisfiesInputShape = InputShape.Boolean;
1774
+ var item = inputToJS(block.inputs.ITEM, InputShape.Any);
1775
+ blockSource = "this.arrayIncludes(".concat(selectedVarSource, ", ").concat(item, ")");
1776
+ break;
1777
+ }
1778
+ case OpCode_1.OpCode.data_showlist: {
1779
+ satisfiesInputShape = InputShape.Stack;
1780
+ blockSource = "".concat(selectedWatcherSource, ".visible = true");
1781
+ break;
1782
+ }
1783
+ case OpCode_1.OpCode.data_hidelist: {
1784
+ satisfiesInputShape = InputShape.Stack;
1785
+ blockSource = "".concat(selectedWatcherSource, ".visible = false");
1786
+ break;
1787
+ }
1788
+ case OpCode_1.OpCode.procedures_call: {
1789
+ satisfiesInputShape = InputShape.Stack;
1790
+ // Get name of custom block script with given PROCCODE:
1791
+ // TODO: what if it doesn't exist?
1792
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1793
+ var procName = target.scripts.find(function (script) {
1794
+ return script.hat !== null &&
1795
+ script.hat.opcode === OpCode_1.OpCode.procedures_definition &&
1796
+ script.hat.inputs.PROCCODE.value === block.inputs.PROCCODE.value;
1797
+ }).name;
1798
+ // TODO: Boolean inputs should provide appropriate desiredInputShape instead of "any"
1799
+ var procArgs = block.inputs.INPUTS.value.map(function (input) { return inputToJS(input, InputShape.Any); }).join(", ");
1800
+ // Warp-mode procedures execute all child procedures in warp mode as well
1801
+ if (warp) {
1802
+ blockSource = "this.warp(this.".concat(procName, ")(").concat(procArgs, ")");
1803
+ }
1804
+ else {
1805
+ blockSource = "yield* this.".concat(procName, "(").concat(procArgs, ")");
1806
+ }
1807
+ break;
1808
+ }
1809
+ case OpCode_1.OpCode.argument_reporter_string_number:
1810
+ case OpCode_1.OpCode.argument_reporter_boolean: {
1811
+ // Argument reporters dragged outside their script return 0
1812
+ if (!script) {
1813
+ satisfiesInputShape = InputShape.Number;
1814
+ blockSource = "0";
1815
+ break;
1816
+ }
1817
+ var argNames = customBlockArgNameMap.get(script);
1818
+ // The procedure definition that this argument reporter was dragged out of doesn't exist (it's in another
1819
+ // sprite, or deleted). Scratch returns 0 here.
1820
+ if (!argNames) {
1821
+ satisfiesInputShape = InputShape.Number;
1822
+ blockSource = "0";
1823
+ break;
1824
+ }
1825
+ if (block.opcode === OpCode_1.OpCode.argument_reporter_boolean) {
1826
+ satisfiesInputShape = InputShape.Boolean;
1827
+ }
1828
+ else {
1829
+ satisfiesInputShape = InputShape.Any;
1830
+ }
1831
+ blockSource = argNames[block.inputs.VALUE.value];
1832
+ break;
1833
+ }
1834
+ case OpCode_1.OpCode.pen_clear: {
1835
+ satisfiesInputShape = InputShape.Stack;
1836
+ blockSource = "this.clearPen()";
1837
+ break;
1838
+ }
1839
+ case OpCode_1.OpCode.pen_stamp: {
1840
+ satisfiesInputShape = InputShape.Stack;
1841
+ blockSource = "this.stamp()";
1842
+ break;
1843
+ }
1844
+ case OpCode_1.OpCode.pen_penDown: {
1845
+ satisfiesInputShape = InputShape.Stack;
1846
+ blockSource = "this.penDown = true";
1847
+ break;
1848
+ }
1849
+ case OpCode_1.OpCode.pen_penUp: {
1850
+ satisfiesInputShape = InputShape.Stack;
1851
+ blockSource = "this.penDown = false";
1852
+ break;
1853
+ }
1854
+ case OpCode_1.OpCode.pen_setPenColorToColor: {
1855
+ satisfiesInputShape = InputShape.Stack;
1856
+ var color = colorInputToJS(block.inputs.COLOR);
1857
+ blockSource = "this.penColor = ".concat(color);
1858
+ break;
1859
+ }
1860
+ case OpCode_1.OpCode.pen_changePenColorParamBy: {
1861
+ satisfiesInputShape = InputShape.Stack;
1862
+ switch (block.inputs.COLOR_PARAM.value) {
1863
+ case "color": {
1864
+ blockSource = increase("this.penColor.h", block.inputs.VALUE, false);
1865
+ break;
1866
+ }
1867
+ case "saturation": {
1868
+ blockSource = increase("this.penColor.s", block.inputs.VALUE, false);
1869
+ break;
1870
+ }
1871
+ case "brightness": {
1872
+ blockSource = increase("this.penColor.v", block.inputs.VALUE, false);
1873
+ break;
1874
+ }
1875
+ case "transparency": {
1876
+ var value = inputToJS(block.inputs.VALUE, InputShape.Number);
1877
+ blockSource = "this.penColor.a -= ".concat(value, " / 100");
1878
+ break;
1879
+ }
1880
+ }
1881
+ break;
1882
+ }
1883
+ case OpCode_1.OpCode.pen_setPenColorParamTo: {
1884
+ satisfiesInputShape = InputShape.Stack;
1885
+ var value = inputToJS(block.inputs.VALUE, InputShape.Number);
1886
+ switch (block.inputs.COLOR_PARAM.value) {
1887
+ case "color": {
1888
+ blockSource = "this.penColor.h = ".concat(value);
1889
+ break;
1890
+ }
1891
+ case "saturation": {
1892
+ blockSource = "this.penColor.s = ".concat(value);
1893
+ break;
1894
+ }
1895
+ case "brightness": {
1896
+ blockSource = "this.penColor.v = ".concat(value);
1897
+ break;
1898
+ }
1899
+ case "transparency": {
1900
+ blockSource = "this.penColor.a = 1 - (".concat(value, " / 100)");
1901
+ break;
1902
+ }
1903
+ }
1904
+ break;
1905
+ }
1906
+ case OpCode_1.OpCode.pen_setPenSizeTo: {
1907
+ satisfiesInputShape = InputShape.Stack;
1908
+ var size = inputToJS(block.inputs.SIZE, InputShape.Number);
1909
+ blockSource = "this.penSize = ".concat(size);
1910
+ break;
1911
+ }
1912
+ case OpCode_1.OpCode.pen_changePenSizeBy: {
1913
+ satisfiesInputShape = InputShape.Stack;
1914
+ blockSource = increase("this.penSize", block.inputs.SIZE, false);
1915
+ break;
1916
+ }
1917
+ default: {
1918
+ satisfiesInputShape = InputShape.Any;
1919
+ blockSource = "/* TODO: Implement ".concat(block.opcode, " */ null");
1920
+ break;
1921
+ }
1922
+ }
1923
+ switch (desiredInputShape) {
1924
+ case satisfiesInputShape: {
1925
+ return blockSource;
1926
+ }
1927
+ case InputShape.Number: {
1928
+ return "this.toNumber(".concat(blockSource, ")");
1929
+ }
1930
+ case InputShape.Index: {
1931
+ return "(".concat(blockSource, ") - 1");
1932
+ }
1933
+ case InputShape.Boolean: {
1934
+ return "this.toBoolean(".concat(blockSource, ")");
1935
+ }
1936
+ case InputShape.String: {
1937
+ return "this.toString(".concat(blockSource, ")");
1938
+ }
1939
+ default: {
1940
+ return blockSource;
1941
+ }
1942
+ }
1943
+ }
1944
+ }
1945
+ // Scratch doesn't care much about "types" (like numbers vs strings), but
1946
+ // sometimes Javascript does. This function attempts to parse a Scratch
1947
+ // value and turn it into the most appropriate Javascript representation
1948
+ function toOptimalJavascriptRepresentation(value) {
1949
+ if (Array.isArray(value)) {
1950
+ return "[".concat(value.map(toOptimalJavascriptRepresentation).join(", "), "]");
1951
+ }
1952
+ if (typeof value === "string") {
1953
+ // Does this string look like a number?
1954
+ var numValue = Number(value);
1955
+ if (isNaN(numValue)) {
1956
+ // Not a number! Treat it like a string!
1957
+ return JSON.stringify(value);
1958
+ }
1959
+ if (Number.isInteger(numValue) && !Number.isSafeInteger(numValue)) {
1960
+ // If this number is an integer that is so large it cannot be reliably
1961
+ // stored, leave it as a string instead. (Usually in these cases the
1962
+ // Scratch user is treating the number like a string anyway.)
1963
+ return JSON.stringify(value);
1964
+ }
1965
+ // This looks like a nice, safe number
1966
+ return JSON.stringify(numValue);
1967
+ }
1968
+ // Here's the catch-all for something else that might pass through
1969
+ return JSON.stringify(value);
1970
+ }
1971
+ var defaultOptions, options, targetNameMap, customBlockArgNameMap, uniqueLocalVarNameMap, variableNameMap, uniqueSpriteName, _i, _a, target, newTargetName, uniqueVariableName, _b, _c, _d, id, name_1, newName, uniqueScriptName, _e, _f, script, argNameMap, uniqueParamName, _g, _h, block, _j, _k, argument, newName, stageVariables, _l, _m, variable, _o, _p, list, getPathsToRelativeOrAbsolute, toLeopardJS, toLeopardCSS, files, _loop_1, _q, _r, target;
1972
+ var _this = this;
1973
+ return __generator(this, function (_s) {
1974
+ switch (_s.label) {
1975
+ case 0:
1976
+ defaultOptions = {
1977
+ leopardJSURL: "https://pub-3089f37cd1294d71b62f5431c86b90ef.r2.dev/dist/index.esm.js",
1978
+ leopardCSSURL: "https://unpkg.com/leopard@^1/dist/index.min.css",
1979
+ getTargetURL: function (_a) {
1980
+ var name = _a.name, from = _a.from;
1981
+ switch (from) {
1982
+ case "index":
1983
+ return "./".concat(name, "/").concat(name, ".js");
1984
+ case "target":
1985
+ return "../".concat(name, "/").concat(name, ".js");
1986
+ }
1987
+ },
1988
+ getAssetURL: function (_a) {
1989
+ var type = _a.type, target = _a.target, name = _a.name, ext = _a.ext;
1990
+ switch (type) {
1991
+ case "costume":
1992
+ return "./".concat(target, "/costumes/").concat(name, ".").concat(ext);
1993
+ case "sound":
1994
+ return "./".concat(target, "/sounds/").concat(name, ".").concat(ext);
1995
+ }
1996
+ },
1997
+ indexURL: "./index.js",
1998
+ autoplay: true
1999
+ };
2000
+ options = __assign(__assign({}, defaultOptions), inOptions);
2001
+ targetNameMap = {};
2002
+ customBlockArgNameMap = new Map();
2003
+ uniqueLocalVarNameMap = new Map();
2004
+ variableNameMap = {};
2005
+ uniqueSpriteName = uniqueNameFactory(LEOPARD_RESERVED_SPRITE_NAMES);
2006
+ for (_i = 0, _a = __spreadArray([project.stage], project.sprites, true); _i < _a.length; _i++) {
2007
+ target = _a[_i];
2008
+ newTargetName = uniqueSpriteName(camelCase(target.name, true));
2009
+ targetNameMap[target.name] = newTargetName;
2010
+ target.setName(newTargetName);
2011
+ uniqueVariableName = uniqueNameFactory(JS_RESERVED_PROPERTIES);
2012
+ for (_b = 0, _c = __spreadArray(__spreadArray([], target.lists, true), target.variables, true); _b < _c.length; _b++) {
2013
+ _d = _c[_b], id = _d.id, name_1 = _d.name;
2014
+ newName = uniqueVariableName(camelCase(name_1));
2015
+ variableNameMap[id] = newName;
2016
+ }
2017
+ uniqueScriptName = uniqueNameFactory(target === project.stage ? LEOPARD_RESERVED_STAGE_PROPERTIES : LEOPARD_RESERVED_SPRITE_PROPERTIES);
2018
+ for (_e = 0, _f = target.scripts; _e < _f.length; _e++) {
2019
+ script = _f[_e];
2020
+ script.setName(uniqueScriptName(camelCase(script.name)));
2021
+ argNameMap = {};
2022
+ customBlockArgNameMap.set(script, argNameMap);
2023
+ uniqueParamName = uniqueNameFactory(JS_RESERVED_WORDS);
2024
+ for (_g = 0, _h = script.blocks; _g < _h.length; _g++) {
2025
+ block = _h[_g];
2026
+ if (block.opcode === OpCode_1.OpCode.procedures_definition) {
2027
+ for (_j = 0, _k = block.inputs.ARGUMENTS.value; _j < _k.length; _j++) {
2028
+ argument = _k[_j];
2029
+ if (argument.type !== "label") {
2030
+ newName = uniqueParamName(camelCase(argument.name));
2031
+ argNameMap[argument.name] = newName;
2032
+ argument.name = newName;
2033
+ }
2034
+ }
2035
+ }
2036
+ }
2037
+ uniqueLocalVarNameMap.set(script, uniqueNameFactory(Object.values(argNameMap)));
2038
+ }
2039
+ }
2040
+ stageVariables = new Set();
2041
+ for (_l = 0, _m = project.stage.variables; _l < _m.length; _l++) {
2042
+ variable = _m[_l];
2043
+ stageVariables.add(variable.id);
2044
+ }
2045
+ for (_o = 0, _p = project.stage.lists; _o < _p.length; _o++) {
2046
+ list = _p[_o];
2047
+ stageVariables.add(list.id);
2048
+ }
2049
+ getPathsToRelativeOrAbsolute = function (destination) {
2050
+ var fakeOrigin = "http://".concat(Math.random(), ".com");
2051
+ var isExternal = new URL(destination, fakeOrigin).origin !== fakeOrigin;
2052
+ var isAbsolute = isExternal || destination.startsWith("/");
2053
+ if (isAbsolute) {
2054
+ return function () { return destination; };
2055
+ }
2056
+ else {
2057
+ // return "/" + destination;
2058
+ return function (_a) {
2059
+ var from = _a.from;
2060
+ switch (from) {
2061
+ case "index":
2062
+ return "./" + destination;
2063
+ case "target":
2064
+ return "../" + destination;
2065
+ }
2066
+ };
2067
+ }
2068
+ };
2069
+ toLeopardJS = getPathsToRelativeOrAbsolute(options.leopardJSURL);
2070
+ toLeopardCSS = getPathsToRelativeOrAbsolute(options.leopardCSSURL);
2071
+ files = {
2072
+ "index.html": "\n <!DOCTYPE html>\n <html>\n <head>\n <link rel=\"stylesheet\" href=\"".concat(toLeopardCSS({ from: "index" }), "\" />\n </head>\n <body>\n <button id=\"greenFlag\">Green Flag</button>\n <div id=\"project\"></div>\n\n <script type=\"importmap\">\n {\n \"imports\": {\n \"effect\": \"https://cdn.jsdelivr.net/npm/effect@latest/+esm\",\n \"js-sdsl\": \"https://cdn.jsdelivr.net/npm/js-sdsl@latest/+esm\"\n }\n }\n </script>\n\n <script type=\"module\" src=\"/index.js\"></script>\n </body>\n </html>\n "),
2073
+ "index.js": "\n import { Project, Sprite } from ".concat(JSON.stringify(toLeopardJS({ from: "index" })), ";\n\n ").concat(__spreadArray([project.stage], project.sprites, true).map(function (target) {
2074
+ return "import ".concat(target.name, " from ").concat(JSON.stringify(options.getTargetURL({ name: target.name, from: "index" })), ";");
2075
+ })
2076
+ .join("\n"), "\n\n const stage = new Stage(").concat(JSON.stringify({ costumeNumber: project.stage.costumeNumber + 1 }), ");\n\n const sprites = {\n ").concat(project.sprites
2077
+ .map(function (sprite) {
2078
+ return "".concat(sprite.name, ": new ").concat(sprite.name, "({").concat(Object.entries({
2079
+ x: sprite.x,
2080
+ y: sprite.y,
2081
+ direction: sprite.direction,
2082
+ rotationStyle: "Sprite.RotationStyle.".concat({
2083
+ normal: "ALL_AROUND",
2084
+ leftRight: "LEFT_RIGHT",
2085
+ none: "DONT_ROTATE"
2086
+ }[sprite.rotationStyle]),
2087
+ costumeNumber: sprite.costumeNumber + 1,
2088
+ size: sprite.size,
2089
+ visible: sprite.visible,
2090
+ layerOrder: sprite.layerOrder
2091
+ })
2092
+ .map(function (_a) {
2093
+ var key = _a[0], value = _a[1];
2094
+ return "".concat(key, ":").concat(value.toString());
2095
+ })
2096
+ .join(","), "})");
2097
+ })
2098
+ .join(",\n"), "\n };\n\n const project = new Project(stage, sprites, {\n frameRate: 30 // Set to 60 to make your project run faster\n });\n\n project.attach('#project');\n\n document.querySelector('#greenFlag').addEventListener('click', () => {\n project.greenFlag();\n });\n\n // Autoplay\n project.greenFlag();\n\n export default project;\n "),
2099
+ "server.mjs": "\n // server.mjs\n import http from 'node:http';\n import { createReadStream, promises as fsp } from 'node:fs';\n import { extname, normalize, resolve } from 'node:path';\n import { fileURLToPath } from 'node:url';\n\n const root = fileURLToPath(new URL('.', import.meta.url));\n const PORT = Number(process.env.PORT || 5173);\n\n const types = {\n '.mjs': 'application/javascript; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.html': 'text/html; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.wav': 'audio/wav',\n };\n\n const ASSET_RE = /\\.(png|jpe?g|gif|wav)$/i;\n\n function resolvePath(reqUrl = '/') {\n const u = new URL(reqUrl, 'http://local');\n let p = decodeURIComponent(u.pathname);\n p = normalize(p).replace(/^[/\\\\]+/, ''); // strip leading slash(es)\n if (p === '') p = 'index.html';\n const full = resolve(root, p);\n if (!full.startsWith(root)) return null; // prevent path escape\n return full;\n }\n\n function isPointerBuffer(buf) {\n const head = buf.toString('utf8', 0, Math.min(buf.length, 16)).trim();\n return /^https?:///i.test(head);\n }\n\n function isPNG(buf) {\n return (\n buf.length >= 8 &&\n buf[0] === 137 &&\n buf[1] === 80 &&\n buf[2] === 78 &&\n buf[3] === 71 &&\n buf[4] === 13 &&\n buf[5] === 10 &&\n buf[6] === 26 &&\n buf[7] === 10\n );\n }\n\n const server = http.createServer(async (req, res) => {\n try {\n const filePath = resolvePath(req.url);\n if (!filePath) {\n res.writeHead(403, { 'Content-Type': 'text/plain; charset=utf-8' });\n res.end('Forbidden');\n return;\n }\n\n const ext = extname(filePath).toLowerCase();\n const ctype = types[ext] || 'application/octet-stream';\n\n // Asset branch: detect pointer files and redirect\n if (ASSET_RE.test(ext)) {\n const buf = await fsp.readFile(filePath);\n\n if (!isPNG(buf) && isPointerBuffer(buf)) {\n const target = buf.toString('utf8').trim();\n res.writeHead(302, {\n Location: target,\n 'Access-Control-Allow-Origin': '*',\n 'Cache-Control': 'public, max-age=31536000, immutable',\n });\n res.end();\n return;\n }\n\n // Real bytes on disk\n res.writeHead(200, {\n 'Content-Type': ctype,\n 'Content-Length': String(buf.length),\n 'Access-Control-Allow-Origin': '*',\n 'Cache-Control': 'public, max-age=31536000, immutable',\n });\n res.end(buf);\n return;\n }\n\n // Everything else: stream normally\n res.writeHead(200, { 'Content-Type': ctype });\n createReadStream(filePath)\n .on('error', () => {\n res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });\n res.end('Not found');\n })\n .pipe(res);\n } catch {\n res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });\n res.end('Not found');\n }\n });\n\n server.listen(PORT, () => {\n console.log(`Serving on http://localhost:${PORT}`);\n });\n ",
2100
+ "package.json": "\n {\n \"name\": \"static-preview\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"start\": \"npm install; node server.mjs\"\n }\n }\n ",
2101
+ ".stackblitzrc": "\n {\n \"startCommand\": \"npm start\",\n \"installCommand\": \"npm install\",\n \"template\": \"node\"\n }\n "
2102
+ };
2103
+ _loop_1 = function (target) {
2104
+ // We don't want to include JavaScript for unused variable watchers.
2105
+ // Some watchers start invisible but appear later, so this code builds a list of
2106
+ // watchers that appear in "show variable" and "show list" blocks. The list is
2107
+ // actually *used* later, by some other code.
2108
+ var shownWatchers = new Set();
2109
+ var targetsToCheckForShowBlocks = void 0;
2110
+ if (target.isStage) {
2111
+ targetsToCheckForShowBlocks = __spreadArray([project.stage], project.sprites, true);
2112
+ }
2113
+ else {
2114
+ targetsToCheckForShowBlocks = [target];
2115
+ }
2116
+ for (var _t = 0, targetsToCheckForShowBlocks_1 = targetsToCheckForShowBlocks; _t < targetsToCheckForShowBlocks_1.length; _t++) {
2117
+ var checkTarget = targetsToCheckForShowBlocks_1[_t];
2118
+ for (var _u = 0, _v = checkTarget.blocks; _u < _v.length; _u++) {
2119
+ var block = _v[_u];
2120
+ if (block.opcode === OpCode_1.OpCode.data_showvariable || block.opcode === OpCode_1.OpCode.data_hidevariable) {
2121
+ shownWatchers.add(block.inputs.VARIABLE.value.id);
2122
+ }
2123
+ if (block.opcode === OpCode_1.OpCode.data_showlist || block.opcode === OpCode_1.OpCode.data_hidelist) {
2124
+ shownWatchers.add(block.inputs.LIST.value.id);
2125
+ }
2126
+ }
2127
+ }
2128
+ files["".concat(target.name, "/").concat(target.name, ".js")] = "\n import { ".concat(target.isStage ? "Stage as StageBase" : "Sprite", ", Trigger, Watcher, Costume, Color, Sound } from '").concat(toLeopardJS({ from: "target" }), "';\n\n export default class ").concat(target.name, " extends ").concat(target.isStage ? "StageBase" : "Sprite", " {\n constructor(...args) {\n super(...args);\n\n this.costumes = [\n ").concat(target.costumes
2129
+ .map(function (costume) {
2130
+ return "new Costume(".concat(JSON.stringify(costume.name), ", ").concat(JSON.stringify(options.getAssetURL({
2131
+ type: "costume",
2132
+ target: target.name,
2133
+ name: costume.name,
2134
+ md5: costume.md5,
2135
+ ext: costume.ext
2136
+ })), ", ").concat(JSON.stringify({
2137
+ // x: costume.centerX,
2138
+ // y: costume.centerY
2139
+ x: target.isStage ? 480 : costume.centerX,
2140
+ y: target.isStage ? 360 : costume.centerY, // costume.centerY
2141
+ }), ")");
2142
+ })
2143
+ .join(",\n"), "\n ];\n\n this.sounds = [\n ").concat(target.sounds
2144
+ .map(function (sound) {
2145
+ return "new Sound(".concat(JSON.stringify(sound.name), ", ").concat(JSON.stringify(options.getAssetURL({
2146
+ type: "sound",
2147
+ target: target.name,
2148
+ name: sound.name,
2149
+ md5: sound.md5,
2150
+ ext: sound.ext
2151
+ })), ")");
2152
+ })
2153
+ .join(",\n"), "\n ];\n\n this.triggers = [\n ").concat(target.scripts
2154
+ .map(function (script) { return triggerInitCode(script, target); })
2155
+ .filter(function (trigger) { return trigger !== null; })
2156
+ .join(",\n"), "\n ];\n\n ").concat(target.volume !== 100 ? "this.audioEffects.volume = ".concat(target.volume, ";") : "", "\n\n ").concat(__spreadArray(__spreadArray([], target.variables, true), target.lists, true).map(function (variable) {
2157
+ return "this.vars.".concat(variableNameMap[variable.id], " = ").concat(toOptimalJavascriptRepresentation(variable.value), ";");
2158
+ })
2159
+ .join("\n"), "\n\n ").concat(__spreadArray(__spreadArray([], target.variables, true), target.lists, true).filter(function (variable) { return variable.visible || shownWatchers.has(variable.id); })
2160
+ .map(function (variable) {
2161
+ var newName = variableNameMap[variable.id];
2162
+ return "this.watchers.".concat(newName, " = new Watcher({\n label: ").concat(JSON.stringify((target.isStage ? "" : "".concat(target.name, ": ")) + variable.name), ",\n style: ").concat(JSON.stringify(variable instanceof Data_1.List
2163
+ ? "normal"
2164
+ : { default: "normal", large: "large", slider: "slider" }[variable.mode]), ",\n visible: ").concat(JSON.stringify(variable.visible), ",\n value: () => this.vars.").concat(newName, ",\n ").concat(variable instanceof Data_1.Variable && variable.mode === "slider"
2165
+ ? "setValue: (value) => { this.vars.".concat(newName, " = value; },\n step: ").concat(JSON.stringify(variable.isDiscrete ? 1 : 0.01), ",\n min: ").concat(JSON.stringify(variable.sliderMin), ",\n max: ").concat(JSON.stringify(variable.sliderMax), ",")
2166
+ : "", "x: ").concat(JSON.stringify(variable.x + 240), ",\n y: ").concat(JSON.stringify(180 - variable.y), ",\n ").concat("width" in variable ? "width: ".concat(JSON.stringify(variable.width), ",") : "", "\n ").concat("height" in variable ? "height: ".concat(JSON.stringify(variable.height), ",") : "", "\n });");
2167
+ })
2168
+ .join("\n"), "\n }\n\n ").concat(target.scripts
2169
+ .filter(function (script) { return script.hat !== null; })
2170
+ .map(function (script) { return scriptToJS(script, target); })
2171
+ .join("\n\n"), "\n }\n ");
2172
+ };
2173
+ for (_q = 0, _r = __spreadArray([project.stage], project.sprites, true); _q < _r.length; _q++) {
2174
+ target = _r[_q];
2175
+ _loop_1(target);
2176
+ }
2177
+ return [4 /*yield*/, Object.keys(files).forEach(function (filepath) { return __awaiter(_this, void 0, void 0, function () {
2178
+ var _a, _b;
2179
+ return __generator(this, function (_c) {
2180
+ switch (_c.label) {
2181
+ case 0:
2182
+ _a = files;
2183
+ _b = filepath;
2184
+ return [4 /*yield*/, prettier.format(files[filepath], __assign(__assign({}, prettierConfig), { filepath: filepath }))];
2185
+ case 1:
2186
+ _a[_b] = _c.sent();
2187
+ return [2 /*return*/];
2188
+ }
2189
+ });
2190
+ }); })];
2191
+ case 1:
2192
+ _s.sent();
2193
+ return [2 /*return*/, files];
2194
+ }
2195
+ });
2196
+ });
2197
+ }
2198
+ exports.default = toLeopard;
2199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9MZW9wYXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lvL2xlb3BhcmQvdG9MZW9wYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlBLHVDQUFzQztBQUV0QyxpREFBcUM7QUFFckMsbUNBQTRDO0FBRTVDOzs7Ozs7Ozs7R0FTRztBQUNILElBQU0saUJBQWlCLEdBQUc7SUFDeEIsV0FBVztJQUNYLE9BQU87SUFDUCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixJQUFJO0lBQ0osTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULEtBQUs7SUFDTCxVQUFVO0lBQ1YsSUFBSTtJQUNKLFlBQVk7SUFDWixRQUFRO0lBQ1IsSUFBSTtJQUNKLFlBQVk7SUFDWixXQUFXO0lBQ1gsS0FBSztJQUNMLEtBQUs7SUFDTCxNQUFNO0lBQ04sU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixLQUFLO0lBQ0wsUUFBUTtJQUNSLE9BQU87SUFDUCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0NBQ1AsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxJQUFNLDZCQUE2QixHQUFHO0lBQ3BDLHlCQUF5QjtJQUN6QixVQUFVO0lBQ1YsS0FBSztJQUVMLCtCQUErQjtJQUMvQixNQUFNO0lBQ04sTUFBTTtJQUVOLCtCQUErQjtJ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