Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
FogNetwork
GitHub Repository: FogNetwork/Tsunami
Path: blob/main/public/games/files/algaes-escapade/js/gamejs/yabble.js
1036 views
1
/*
2
* Copyright (c) 2010 James Brantly
3
*
4
* Permission is hereby granted, free of charge, to any person
5
* obtaining a copy of this software and associated documentation
6
* files (the "Software"), to deal in the Software without
7
* restriction, including without limitation the rights to use,
8
* copy, modify, merge, publish, distribute, sublicense, and/or sell
9
* copies of the Software, and to permit persons to whom the
10
* Software is furnished to do so, subject to the following
11
* conditions:
12
*
13
* The above copyright notice and this permission notice shall be
14
* included in all copies or substantial portions of the Software.
15
*
16
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
* OTHER DEALINGS IN THE SOFTWARE.
24
*/
25
26
(function(globalEval) {
27
28
var Yabble = function() {
29
throw "Synchronous require() is not supported.";
30
};
31
32
Yabble.unit = {};
33
34
var _moduleRoot = '',
35
_modules,
36
_callbacks,
37
_fetchFunc,
38
_timeoutLength = 20000,
39
_mainProgram;
40
41
42
var head = document.getElementsByTagName('head')[0];
43
44
// Shortcut to native hasOwnProperty
45
var hasOwnProperty = Object.prototype.hasOwnProperty;
46
47
// A for..in implementation which uses hasOwnProperty and fixes IE non-enumerable issues
48
if ((function() {for (var prop in {hasOwnProperty: true}) { return prop; }})() == 'hasOwnProperty') {
49
var forIn = function(obj, func, ctx) {
50
for (var prop in obj) {
51
if (hasOwnProperty.call(obj, prop)) {
52
func.call(ctx, prop);
53
}
54
}
55
};
56
}
57
else {
58
var ieBadProps = [
59
'isPrototypeOf',
60
'hasOwnProperty',
61
'toLocaleString',
62
'toString',
63
'valueOf'
64
];
65
66
var forIn = function(obj, func, ctx) {
67
for (var prop in obj) {
68
if (hasOwnProperty.call(obj, prop)) {
69
func.call(ctx, prop);
70
}
71
}
72
73
for (var i = ieBadProps.length; i--;) {
74
var prop = ieBadProps[i];
75
if (hasOwnProperty.call(obj, prop)) {
76
func.call(ctx, prop);
77
}
78
}
79
};
80
}
81
82
// Array convenience functions
83
var indexOf = function(arr, val) {
84
for (var i = arr.length; i--;) {
85
if (arr[i] == val) { return i; }
86
}
87
return -1;
88
};
89
90
var removeWhere = function(arr, func) {
91
var i = 0;
92
while (i < arr.length) {
93
if (func.call(null, arr[i], i) === true) {
94
arr.splice(i, 1);
95
}
96
else {
97
i++;
98
}
99
}
100
};
101
102
var combinePaths = function(relPath, refPath) {
103
var relPathParts = relPath.split('/');
104
refPath = refPath || '';
105
if (refPath.length && refPath.charAt(refPath.length-1) != '/') {
106
refPath += '/';
107
}
108
var refPathParts = refPath.split('/');
109
refPathParts.pop();
110
var part;
111
while (part = relPathParts.shift()) {
112
if (part == '.') { continue; }
113
else if (part == '..'
114
&& refPathParts.length
115
&& refPathParts[refPathParts.length-1] != '..') { refPathParts.pop(); }
116
else { refPathParts.push(part); }
117
}
118
return refPathParts.join('/');
119
};
120
121
// Takes a relative path to a module and resolves it according to the reference path
122
var resolveModuleId = Yabble.unit.resolveModuleId = function(relModuleId, refPath) {
123
if (relModuleId.charAt(0) != '.') {
124
return relModuleId;
125
}
126
else {
127
return combinePaths(relModuleId, refPath);
128
}
129
};
130
131
// Takes a module's ID and resolves a URI according to the module root path
132
var resolveModuleUri = function(moduleId) {
133
if (moduleId.charAt(0) != '.') {
134
return _moduleRoot+moduleId+'.js';
135
}
136
else {
137
return this._resolveModuleId(moduleId, _moduleRoot)+'.js';
138
}
139
};
140
141
// Returns a module object from the module ID
142
var getModule = function(moduleId) {
143
if (!hasOwnProperty.call(_modules, moduleId)) {
144
return null;
145
}
146
return _modules[moduleId];
147
};
148
149
// Adds a callback which is executed when all deep dependencies are loaded
150
var addCallback = function(deps, cb) {
151
_callbacks.push([deps.slice(0), cb]);
152
};
153
154
// Generic implementation of require.ensure() which takes a reference path to
155
// use when resolving relative module IDs
156
var ensureImpl = function(deps, cb, refPath) {
157
var unreadyModules = [];
158
159
for (var i = deps.length; i--;) {
160
var moduleId = resolveModuleId(deps[i], refPath),
161
module = getModule(moduleId);
162
163
if (!areDeepDepsDefined(moduleId)) {
164
unreadyModules.push(moduleId);
165
}
166
}
167
168
if (unreadyModules.length) {
169
addCallback(unreadyModules, function() {
170
cb(createRequireFunc(refPath));
171
});
172
queueModules(unreadyModules);
173
}
174
else {
175
setTimeout(function() {
176
cb(createRequireFunc(refPath));
177
}, 0);
178
}
179
};
180
181
// Creates a require function that is passed into module factory functions
182
// and require.ensure() callbacks. It is bound to a reference path for
183
// relative require()s
184
var createRequireFunc = function(refPath) {
185
var require = function(relModuleId) {
186
var moduleId = resolveModuleId(relModuleId, refPath),
187
module = getModule(moduleId);
188
189
if (!module) {
190
throw "Module not loaded";
191
}
192
else if (module.error) {
193
throw "Error loading module";
194
}
195
196
if (!module.exports) {
197
module.exports = {};
198
var moduleDir = moduleId.substring(0, moduleId.lastIndexOf('/')+1),
199
injects = module.injects,
200
args = [];
201
202
for (var i = 0, n = injects.length; i<n; i++) {
203
if (injects[i] == 'require') {
204
args.push(createRequireFunc(moduleDir));
205
}
206
else if (injects[i] == 'exports') {
207
args.push(module.exports);
208
}
209
else if (injects[i] == 'module') {
210
args.push(module.module);
211
}
212
}
213
214
module.factory.apply(null, args);
215
}
216
return module.exports;
217
};
218
219
require.ensure = function(deps, cb) {
220
ensureImpl(deps, cb, refPath);
221
};
222
223
if (_mainProgram != null) {
224
require.main = getModule(_mainProgram).module;
225
}
226
227
return require;
228
};
229
230
// Begins loading modules asynchronously
231
var queueModules = function(moduleIds) {
232
for (var i = moduleIds.length; i--;) {
233
var moduleId = moduleIds[i],
234
module = getModule(moduleId);
235
236
if (module == null) {
237
module = _modules[moduleId] = {};
238
_fetchFunc(moduleId);
239
}
240
}
241
};
242
243
// Returns true if all deep dependencies are satisfied (in other words,
244
// can more or less safely run the module factory function)
245
var areDeepDepsDefined = function(moduleId) {
246
var visitedModules = {};
247
var recurse = function(moduleId) {
248
if (visitedModules[moduleId] == true) { return true; }
249
visitedModules[moduleId] = true;
250
var module = getModule(moduleId);
251
if (!module || !module.defined) { return false; }
252
else {
253
var deps = module.deps || [];
254
for (var i = deps.length; i--;) {
255
if (!recurse(deps[i])) {
256
return false;
257
}
258
}
259
return true;
260
}
261
};
262
return recurse(moduleId);
263
};
264
265
// Checks dependency callbacks and fires as necessary
266
var fireCallbacks = function() {
267
var i = 0;
268
while (i<_callbacks.length) {
269
var deps = _callbacks[i][0],
270
func = _callbacks[i][1],
271
n = 0;
272
while (n<deps.length) {
273
if (areDeepDepsDefined(deps[n])) {
274
deps.splice(n, 1);
275
}
276
else {
277
n++;
278
}
279
}
280
if (!deps.length) {
281
_callbacks.splice(i, 1);
282
if (func != null) {
283
setTimeout(func, 0);
284
}
285
}
286
else {
287
i++;
288
}
289
}
290
};
291
292
// Load an unwrapped module using XHR and eval()
293
var loadModuleByEval = _fetchFunc = function(moduleId) {
294
var timeoutHandle;
295
296
var errorFunc = function() {
297
var module = getModule(moduleId);
298
if (!module.defined) {
299
module.defined = module.error = true;
300
fireCallbacks();
301
}
302
};
303
304
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
305
var moduleUri = resolveModuleUri(moduleId);
306
xhr.open('GET', moduleUri, true);
307
xhr.onreadystatechange = function() {
308
if (xhr.readyState === 4) {
309
clearTimeout(timeoutHandle);
310
if (xhr.status == 200 || xhr.status === 0) {
311
var moduleCode = xhr.responseText,
312
deps = determineShallowDependencies(moduleCode),
313
moduleDir = moduleId.substring(0, moduleId.lastIndexOf('/')+1),
314
moduleDefs = {};
315
for (var i = deps.length; i--;) {
316
deps[i] = resolveModuleId(deps[i], moduleDir);
317
}
318
try {
319
moduleDefs[moduleId] = globalEval('({fn: function(require, exports, module) {\r\n' + moduleCode + '\r\n}})').fn;
320
} catch (e) {
321
if (e instanceof SyntaxError) {
322
var msg = 'Syntax Error: ';
323
if (e.lineNumber) {
324
msg += 'line ' + (e.lineNumber - 581);
325
} else {
326
console.log('GameJs tip: use Firefox to see line numbers in Syntax Errors.');
327
}
328
msg += ' in file ' + moduleUri;
329
console.log(msg);
330
}
331
throw e;
332
}
333
334
Yabble.define(moduleDefs, deps);
335
}
336
else {
337
errorFunc();
338
}
339
}
340
};
341
342
timeoutHandle = setTimeout(errorFunc, _timeoutLength);
343
344
xhr.send(null);
345
};
346
347
// Used by loadModuleByEval and by the packager. Determines shallow dependencies of
348
// a module via static analysis. This can currently break with require.ensure().
349
var determineShallowDependencies = Yabble.unit.determineShallowDependencies = function(moduleCode) {
350
// TODO: account for comments
351
var deps = {}, match, unique = {};
352
353
var requireRegex = /(?:^|[^\w\$_.])require\s*\(\s*("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')\s*\)/g;
354
while (match = requireRegex.exec(moduleCode)) {
355
var module = eval(match[1]);
356
if (!hasOwnProperty.call(deps, module)) {
357
deps[module] = true;
358
}
359
}
360
361
var ensureRegex = /(?:^|[^\w\$_.])require.ensure\s*\(\s*(\[("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|\s*|,)*\])/g;
362
while (match = ensureRegex.exec(moduleCode)) {
363
var moduleArray = eval(match[1]);
364
for (var i = moduleArray.length; i--;) {
365
var module = moduleArray[i];
366
delete deps[module];
367
}
368
}
369
370
var depsArray = [];
371
forIn(deps, function(module) {
372
depsArray.push(module);
373
});
374
375
return depsArray;
376
};
377
378
// Load a wrapped module via script tags
379
var loadModuleByScript = function(moduleId) {
380
var scriptEl = document.createElement('script');
381
scriptEl.type = 'text/javascript';
382
scriptEl.src = resolveModuleUri(moduleId);
383
384
var useStandard = !!scriptEl.addEventListener,
385
timeoutHandle;
386
387
var errorFunc = function() {
388
postLoadFunc(false);
389
};
390
391
var loadFunc = function() {
392
if (useStandard || (scriptEl.readyState == 'complete' || scriptEl.readyState == 'loaded')) {
393
postLoadFunc(getModule(moduleId).defined);
394
}
395
};
396
397
var postLoadFunc = function(loaded) {
398
clearTimeout(timeoutHandle);
399
400
if (useStandard) {
401
scriptEl.removeEventListener('load', loadFunc, false);
402
scriptEl.removeEventListener('error', errorFunc, false);
403
}
404
else {
405
scriptEl.detachEvent('onreadystatechange', loadFunc);
406
}
407
408
if (!loaded) {
409
var module = getModule(moduleId);
410
if (!module.defined) {
411
module.defined = module.error = true;
412
fireCallbacks();
413
}
414
}
415
};
416
417
if (useStandard) {
418
scriptEl.addEventListener('load', loadFunc, false);
419
scriptEl.addEventListener('error', errorFunc, false);
420
}
421
else {
422
scriptEl.attachEvent('onreadystatechange', loadFunc);
423
}
424
425
timeoutHandle = setTimeout(errorFunc, _timeoutLength);
426
427
head.appendChild(scriptEl);
428
};
429
430
var normalizeTransport = function() {
431
var transport = {modules: []};
432
var standardInjects = ['require', 'exports', 'module'];
433
if (typeof arguments[0] == 'object') { // Transport/D
434
transport.deps = arguments[1] || [];
435
var moduleDefs = arguments[0];
436
forIn(moduleDefs, function(moduleId) {
437
var module = {
438
id: moduleId
439
};
440
441
if (typeof moduleDefs[moduleId] == 'function') {
442
module.factory = moduleDefs[moduleId];
443
module.injects = standardInjects;
444
}
445
else {
446
module.factory = moduleDefs[moduleId].factory;
447
module.injects = moduleDefs[moduleId].injects || standardInjects;
448
}
449
transport.modules.push(module);
450
});
451
}
452
else { // Transport/C
453
transport.deps = arguments[1].slice(0);
454
removeWhere(transport.deps, function(dep) {
455
return indexOf(standardInjects, dep) >= 0;
456
});
457
458
transport.modules.push({
459
id: arguments[0],
460
factory: arguments[2],
461
injects: arguments[1]
462
});
463
}
464
return transport;
465
};
466
467
// Set the uri which forms the conceptual module namespace root
468
Yabble.setModuleRoot = function(path) {
469
if (!(/^http(s?):\/\//.test(path))) {
470
var href = window.location.href;
471
href = href.substr(0, href.lastIndexOf('/')+1);
472
path = combinePaths(path, href);
473
}
474
475
if (path.length && path.charAt(path.length-1) != '/') {
476
path += '/';
477
}
478
479
_moduleRoot = path;
480
};
481
482
// Set a timeout period for async module loading
483
Yabble.setTimeoutLength = function(milliseconds) {
484
_timeoutLength = milliseconds;
485
};
486
487
// Use script tags with wrapped code instead of XHR+eval()
488
Yabble.useScriptTags = function() {
489
_fetchFunc = loadModuleByScript;
490
};
491
492
// Define a module per various transport specifications
493
Yabble.def = Yabble.define = function() {
494
var transport = normalizeTransport.apply(null, arguments);
495
496
var unreadyModules = [],
497
definedModules = [];
498
499
var deps = transport.deps;
500
501
for (var i = transport.modules.length; i--;) {
502
var moduleDef = transport.modules[i],
503
moduleId = moduleDef.id,
504
module = getModule(moduleId);
505
506
if (!module) {
507
module = _modules[moduleId] = {};
508
}
509
module.module = {
510
id: moduleId,
511
uri: resolveModuleUri(moduleId)
512
};
513
514
module.defined = true;
515
module.deps = deps.slice(0);
516
module.injects = moduleDef.injects;
517
module.factory = moduleDef.factory;
518
definedModules.push(module);
519
}
520
521
for (var i = deps.length; i--;) {
522
var moduleId = deps[i],
523
module = getModule(moduleId);
524
525
if (!module || !areDeepDepsDefined(moduleId)) {
526
unreadyModules.push(moduleId);
527
}
528
}
529
530
if (unreadyModules.length) {
531
setTimeout(function() {
532
queueModules(unreadyModules);
533
}, 0);
534
}
535
536
fireCallbacks();
537
};
538
539
Yabble.isKnown = function(moduleId) {
540
return getModule(moduleId) != null;
541
};
542
543
Yabble.isDefined = function(moduleId) {
544
var module = getModule(moduleId);
545
return !!(module && module.defined);
546
};
547
548
// Do an async lazy-load of modules
549
Yabble.ensure = function(deps, cb) {
550
ensureImpl(deps, cb, '');
551
};
552
553
// Start an application via a main program module
554
Yabble.run = function(program, cb) {
555
program = _mainProgram = resolveModuleId(program, '');
556
Yabble.ensure([program], function(require) {
557
require(program);
558
if (cb != null) { cb(); }
559
});
560
};
561
562
// Reset internal state. Used mostly for unit tests.
563
Yabble.reset = function() {
564
_mainProgram = null;
565
_modules = {};
566
_callbacks = [];
567
568
// Built-in system module
569
Yabble.define({
570
'system': function(require, exports, module) {}
571
});
572
};
573
574
Yabble.reset();
575
576
// Export to the require global
577
window.require = Yabble;
578
})(function(code) {
579
with (window) {
580
return eval(code);
581
};
582
});
583