3m5-coco
Version:
a simple MVC Framework
445 lines (286 loc) • 12.2 kB
JavaScript
;
require("core-js/modules/es6.array.copy-within");
require("core-js/modules/es6.array.fill");
require("core-js/modules/es6.array.find");
require("core-js/modules/es6.array.find-index");
require("core-js/modules/es7.array.flat-map");
require("core-js/modules/es6.array.from");
require("core-js/modules/es7.array.includes");
require("core-js/modules/es6.array.iterator");
require("core-js/modules/es6.array.of");
require("core-js/modules/es6.array.sort");
require("core-js/modules/es6.array.species");
require("core-js/modules/es6.date.to-primitive");
require("core-js/modules/es6.function.has-instance");
require("core-js/modules/es6.function.name");
require("core-js/modules/es6.map");
require("core-js/modules/es6.math.acosh");
require("core-js/modules/es6.math.asinh");
require("core-js/modules/es6.math.atanh");
require("core-js/modules/es6.math.cbrt");
require("core-js/modules/es6.math.clz32");
require("core-js/modules/es6.math.cosh");
require("core-js/modules/es6.math.expm1");
require("core-js/modules/es6.math.fround");
require("core-js/modules/es6.math.hypot");
require("core-js/modules/es6.math.imul");
require("core-js/modules/es6.math.log1p");
require("core-js/modules/es6.math.log10");
require("core-js/modules/es6.math.log2");
require("core-js/modules/es6.math.sign");
require("core-js/modules/es6.math.sinh");
require("core-js/modules/es6.math.tanh");
require("core-js/modules/es6.math.trunc");
require("core-js/modules/es6.number.constructor");
require("core-js/modules/es6.number.epsilon");
require("core-js/modules/es6.number.is-finite");
require("core-js/modules/es6.number.is-integer");
require("core-js/modules/es6.number.is-nan");
require("core-js/modules/es6.number.is-safe-integer");
require("core-js/modules/es6.number.max-safe-integer");
require("core-js/modules/es6.number.min-safe-integer");
require("core-js/modules/es6.number.parse-float");
require("core-js/modules/es6.number.parse-int");
require("core-js/modules/es6.object.assign");
require("core-js/modules/es7.object.define-getter");
require("core-js/modules/es7.object.define-setter");
require("core-js/modules/es7.object.entries");
require("core-js/modules/es6.object.freeze");
require("core-js/modules/es6.object.get-own-property-descriptor");
require("core-js/modules/es7.object.get-own-property-descriptors");
require("core-js/modules/es6.object.get-own-property-names");
require("core-js/modules/es6.object.get-prototype-of");
require("core-js/modules/es7.object.lookup-getter");
require("core-js/modules/es7.object.lookup-setter");
require("core-js/modules/es6.object.prevent-extensions");
require("core-js/modules/es6.object.to-string");
require("core-js/modules/es6.object.is");
require("core-js/modules/es6.object.is-frozen");
require("core-js/modules/es6.object.is-sealed");
require("core-js/modules/es6.object.is-extensible");
require("core-js/modules/es6.object.keys");
require("core-js/modules/es6.object.seal");
require("core-js/modules/es6.object.set-prototype-of");
require("core-js/modules/es7.object.values");
require("core-js/modules/es6.promise");
require("core-js/modules/es7.promise.finally");
require("core-js/modules/es6.reflect.apply");
require("core-js/modules/es6.reflect.construct");
require("core-js/modules/es6.reflect.define-property");
require("core-js/modules/es6.reflect.delete-property");
require("core-js/modules/es6.reflect.get");
require("core-js/modules/es6.reflect.get-own-property-descriptor");
require("core-js/modules/es6.reflect.get-prototype-of");
require("core-js/modules/es6.reflect.has");
require("core-js/modules/es6.reflect.is-extensible");
require("core-js/modules/es6.reflect.own-keys");
require("core-js/modules/es6.reflect.prevent-extensions");
require("core-js/modules/es6.reflect.set");
require("core-js/modules/es6.reflect.set-prototype-of");
require("core-js/modules/es6.regexp.constructor");
require("core-js/modules/es6.regexp.flags");
require("core-js/modules/es6.regexp.match");
require("core-js/modules/es6.regexp.replace");
require("core-js/modules/es6.regexp.split");
require("core-js/modules/es6.regexp.search");
require("core-js/modules/es6.regexp.to-string");
require("core-js/modules/es6.set");
require("core-js/modules/es6.symbol");
require("core-js/modules/es7.symbol.async-iterator");
require("core-js/modules/es6.string.anchor");
require("core-js/modules/es6.string.big");
require("core-js/modules/es6.string.blink");
require("core-js/modules/es6.string.bold");
require("core-js/modules/es6.string.code-point-at");
require("core-js/modules/es6.string.ends-with");
require("core-js/modules/es6.string.fixed");
require("core-js/modules/es6.string.fontcolor");
require("core-js/modules/es6.string.fontsize");
require("core-js/modules/es6.string.from-code-point");
require("core-js/modules/es6.string.includes");
require("core-js/modules/es6.string.italics");
require("core-js/modules/es6.string.iterator");
require("core-js/modules/es6.string.link");
require("core-js/modules/es7.string.pad-start");
require("core-js/modules/es7.string.pad-end");
require("core-js/modules/es6.string.raw");
require("core-js/modules/es6.string.repeat");
require("core-js/modules/es6.string.small");
require("core-js/modules/es6.string.starts-with");
require("core-js/modules/es6.string.strike");
require("core-js/modules/es6.string.sub");
require("core-js/modules/es6.string.sup");
require("core-js/modules/es7.string.trim-left");
require("core-js/modules/es7.string.trim-right");
require("core-js/modules/es6.typed.array-buffer");
require("core-js/modules/es6.typed.int8-array");
require("core-js/modules/es6.typed.uint8-array");
require("core-js/modules/es6.typed.uint8-clamped-array");
require("core-js/modules/es6.typed.int16-array");
require("core-js/modules/es6.typed.uint16-array");
require("core-js/modules/es6.typed.int32-array");
require("core-js/modules/es6.typed.uint32-array");
require("core-js/modules/es6.typed.float32-array");
require("core-js/modules/es6.typed.float64-array");
require("core-js/modules/es6.weak-map");
require("core-js/modules/es6.weak-set");
require("core-js/modules/web.timers");
require("core-js/modules/web.immediate");
require("core-js/modules/web.dom.iterable");
require("regenerator-runtime/runtime");
// Rewrite modern console methods for olders browsers (like IE 9/10)
if (!window.console) {
window.console = {};
}
if (!window.console.debug) {
window.console.debug = window.console.log || function () {};
}
if (!window.console.error) {
window.console.error = window.console.log || function () {};
}
if (!window.console.warn) {
window.console.warn = window.console.log || function () {};
} //IE support
var Event = Event || window.Event;
Event.prototype.stopPropagation = Event.prototype.stopPropagation || function () {
this.cancelBubble = true;
};
Event.prototype.preventDefault = Event.prototype.preventDefault || function () {
this.returnValue = false;
}; //add $compute function to all functions
/** $compute function to register change listeners to properties in Coco.Model */
if (!Function.prototype.$compute) {
Function.prototype.$compute = function () {
var fn = this;
var args = Array.prototype.slice.call(arguments);
/**
* We capsule the function and the $compute properties, because our this context is the function and not the
* model. When the model gets instantiated we call this returned function with the model context, set the observers
* and return the original function (with assigned model context) back to the initial model property.
*/
var retFn = function retFn(targetAttribute, observers) {
for (var i = 0; i < args.length; i++) {
observers.push({
attribute: args[i],
target: targetAttribute,
old: fn.call(this)
});
}
return fn.$bind(this);
}; // Assign a flag to the function, that we can distinct between normal functions as attributes and computed properties.
retFn.isComputed = true;
return retFn;
};
} // Dependencies
var Coco = Coco || {};
var Handlebars = require('handlebars/runtime'),
$ = require("jquery");
window.$ = $;
window.jQuery = $; //require non public Coco classes
require("./service/Coco.ServiceContainer.js");
require("./helpers/HandlebarsHelpers.js");
require("./router/Coco.RouterService.js");
var Translator = require("./lib/Coco.Translator.js");
/**
* Class: .Coco
*
* 3m5. Javascript SDK main class (Coco.SDK)
*
* exports Coco as module, so just type "var Coco = require('3m5-coco')" to us it!
*
* triggers <Coco.Event.INITIALIZED> Event on body when Coco is ready
*
* CONFIGURATION:
*
* config: {
baseUrl: "/", //server context path
locale: "de", //the Coco default locale
router: {
loaderDelay: 300 // When views are swapped by Router, this time adjusts when the loading class
},
restService: { //restService configuration
path: "rest/", //restService path
cacheGet: 0 //cache time in SECONDS for GET Requests of same url, value lower than 0 causes unlimited cache
}
}
*
* (c) 2016 3m5. Media GmbH
*/
Coco.SDK = dejavu.Class.declare({
$name: "Coco.Init",
////////////////////////////////////////////////////////////
//////// CONFIGURATION
config: {
baseUrl: "/",
//server context path
router: {
loaderDelay: 300 // When views are swapped by Router, this time adjusts when the loading class
},
restService: {
//restService configuration
path: "rest/",
//restService path
cacheGet: 0 //cache time in SECONDS for GET Requests of same url, value lower than 0 causes unlimited cache
}
},
//////// CLASS DEFINITIONS
Event: require("./event/Coco.Event.js"),
ModelEvent: require("./event/Coco.ModelEvent.js"),
RestServiceEvent: require("./event/Coco.RestServiceEvent.js"),
RouterEvent: require("./event/Coco.RouterEvent.js"),
TranslatorEvent: require("./event/Coco.TranslatorEvent.js"),
ViewEvent: require("./event/Coco.ViewEvent.js"),
EventDispatcher: require("./event/Coco.EventDispatcher.js"),
//PACKAGE MODEL
Model: require("./model/Coco.Model.js"),
Collection: require("./model/Coco.Collection.js"),
//PACKAGE SERVICE
Service: require("./service/Coco.Service.js"),
ServiceProvider: require("./service/Coco.ServiceProvider.js"),
//PACKAGE ROUTER
Router: require("./router/Coco.Router.js"),
//REST
BaseRestService: require("./service/Coco.BaseRestService.js"),
//PACKAGE LIB
Math: require("./lib/Coco.Math.js"),
Utils: require("./lib/Coco.Utils.js"),
Storage: require("./lib/Coco.Storage.js"),
StringUtils: require("./lib/Coco.StringUtils.js"),
URLHelper: require("./lib/Coco.URLHelper.js"),
//PACKAGE VIEW
View: require("./view/Coco.View.js"),
ChildView: require("./view/Coco.ChildView.js"),
//i18n Translator
Translator: new Translator(),
//////// CLASS DEFINITIONS END
////////////////////////////////////////////////////////////
$statics: {
version: "0.3.0",
initialized: false
},
initialize: function initialize() {
console.logWithDate = true;
try {
Handlebars;
} catch (error) {
console.error(error);
throw new Error("Missing Handlebars! include npm-module 'handlebars' into your project!");
}
try {
$;
} catch (error) {
console.error(error);
throw new Error("Missing jQuery! Install jQuery to use Coco.SDK ", error);
}
console.debug("-------------------------------------------");
console.debug("Coco.js v" + this.$static.version + " initialized. Coco.config on startup: ", $.extend({}, this.config));
console.debug("Bugreport@ GitHub: https://github.com/3m5/coco/issues");
console.debug("Handlebars v" + Handlebars.VERSION);
console.debug("registered Handlebars helpers: ", Handlebars.helpers);
console.debug("jQuery v" + $().jquery);
console.debug("-------------------------------------------");
$("body").trigger(this.Event.INITIALIZED);
this.initialized = true;
}
});
module.exports = new Coco.SDK();