Jean-Yves Didier

functional ES modules

...@@ -4,6 +4,14 @@ module.exports = function (grunt) { ...@@ -4,6 +4,14 @@ module.exports = function (grunt) {
4 // Project configuration. 4 // Project configuration.
5 grunt.initConfig({ 5 grunt.initConfig({
6 pkg: grunt.file.readJSON('package.json'), 6 pkg: grunt.file.readJSON('package.json'),
7 + copy: {
8 + dist: {
9 + files:[
10 + {src: 'src/arcs_browser.js', dest: 'build/arcs_browser.js'}
11 + ]
12 +
13 + }
14 + },
7 jsdoc: { 15 jsdoc: {
8 dist: { 16 dist: {
9 src: ['src/*.js', 'docs/Readme.md'], //, 'components/*.js'], 17 src: ['src/*.js', 'docs/Readme.md'], //, 'components/*.js'],
...@@ -43,29 +51,13 @@ module.exports = function (grunt) { ...@@ -43,29 +51,13 @@ module.exports = function (grunt) {
43 } 51 }
44 } 52 }
45 }, 53 },
46 - file_minify: {
47 - build: {
48 - files: {
49 - 'build/arcs.min.js': [
50 - 'build/arcs.js'
51 - ],
52 - 'build/arcs_browser.js': [
53 - 'src/arcs_browser.js'
54 - ],
55 - 'build/arcseditor.min.js': [
56 - 'build/arcseditor.js'
57 - ]
58 -
59 - }
60 - }
61 - },
62 terser: { 54 terser: {
63 build: { 55 build: {
64 files: { 56 files: {
65 'build/arcs.min.js': [ 57 'build/arcs.min.js': [
66 'build/arcs.js' 58 'build/arcs.js'
67 ], 59 ],
68 - 'build/arcs_browser.js': [ 60 + 'build/arcs_browser.min.js': [
69 'src/arcs_browser.js' 61 'src/arcs_browser.js'
70 ], 62 ],
71 'build/arcseditor.min.js': [ 63 'build/arcseditor.min.js': [
...@@ -101,7 +93,6 @@ module.exports = function (grunt) { ...@@ -101,7 +93,6 @@ module.exports = function (grunt) {
101 'src/transitionnetwork.js', 93 'src/transitionnetwork.js',
102 'src/statemachine.js', 94 'src/statemachine.js',
103 'src/application.js', 95 'src/application.js',
104 - 'src/arcs_module.js',
105 'src/exports.js' 96 'src/exports.js'
106 ], 97 ],
107 dest: 'build/arcs.js' 98 dest: 'build/arcs.js'
...@@ -124,16 +115,15 @@ module.exports = function (grunt) { ...@@ -124,16 +115,15 @@ module.exports = function (grunt) {
124 }); 115 });
125 116
126 // Load the plugin that provides the "uglify" task. 117 // Load the plugin that provides the "uglify" task.
127 - grunt.loadNpmTasks('grunt-contrib-obfuscator');
128 - grunt.loadNpmTasks('grunt-file-minify');
129 grunt.loadNpmTasks('grunt-contrib-concat'); 118 grunt.loadNpmTasks('grunt-contrib-concat');
119 + grunt.loadNpmTasks('grunt-contrib-copy');
130 grunt.loadNpmTasks('grunt-jsdoc'); 120 grunt.loadNpmTasks('grunt-jsdoc');
131 grunt.loadNpmTasks('grunt-jslint'); 121 grunt.loadNpmTasks('grunt-jslint');
132 grunt.loadNpmTasks('grunt-terser'); 122 grunt.loadNpmTasks('grunt-terser');
133 grunt.loadNpmTasks('grunt-bower-task'); 123 grunt.loadNpmTasks('grunt-bower-task');
134 124
135 // Default task(s). 125 // Default task(s).
136 - grunt.registerTask('default', ['concat','terser'/*'file_minify','obfuscator'*/]); 126 + grunt.registerTask('default', ['concat','copy','terser']);
137 grunt.registerTask('lint', ['jslint']); 127 grunt.registerTask('lint', ['jslint']);
138 grunt.registerTask('doc', ['jsdoc']); 128 grunt.registerTask('doc', ['jsdoc']);
139 }; 129 };
......
...@@ -247,6 +247,7 @@ ARCS.Context = function( ctx ) { ...@@ -247,6 +247,7 @@ ARCS.Context = function( ctx ) {
247 if (ctx !== undefined) { 247 if (ctx !== undefined) {
248 libraries = ctx.libraries; 248 libraries = ctx.libraries;
249 249
250 + var p;
250 for (p in ctx.components) { 251 for (p in ctx.components) {
251 if (ctx.components.hasOwnProperty(p)) { 252 if (ctx.components.hasOwnProperty(p)) {
252 components[p] = ctx.components[p]; 253 components[p] = ctx.components[p];
...@@ -263,8 +264,7 @@ ARCS.Context = function( ctx ) { ...@@ -263,8 +264,7 @@ ARCS.Context = function( ctx ) {
263 264
264 } 265 }
265 266
266 - //! TODO use fetch API? 267 + var loadDataFile =async function(fileName) {
267 - loadDataFile =async function(fileName) {
268 var dataPromise ; 268 var dataPromise ;
269 269
270 if (ARCS.isInNode()) { 270 if (ARCS.isInNode()) {
...@@ -281,19 +281,8 @@ ARCS.Context = function( ctx ) { ...@@ -281,19 +281,8 @@ ARCS.Context = function( ctx ) {
281 return client.json(); 281 return client.json();
282 } 282 }
283 }; 283 };
284 - 284 +
285 - //! TODO not needed anymore? 285 + var loadLibraries = function () {
286 - /*this.addLibraryPromise = function(p) {
287 - depLibPromises.push(p);
288 - };*/
289 -
290 - /*promiseLibrary = function(libName) {
291 - return import(libName);
292 - };*/
293 -
294 - //! TODO modify loadLibraries and loadLibrary to directly register
295 - // factories so that arcs_module is not needed anymore ?
296 - loadLibraries = function () {
297 var i; 286 var i;
298 // we will use different instances of require either the one of node 287 // we will use different instances of require either the one of node
299 // or the one from require.js 288 // or the one from require.js
...@@ -301,16 +290,13 @@ ARCS.Context = function( ctx ) { ...@@ -301,16 +290,13 @@ ARCS.Context = function( ctx ) {
301 290
302 var res=[]; 291 var res=[];
303 for(i=0; i < libraries.length; i++) { 292 for(i=0; i < libraries.length; i++) {
304 - //! TODO 293 + res.push(self.loadLibrary(libraries[i]));
305 - res.push(loadLibrary(libraries[i]));
306 - //import(libraries[i]));
307 } 294 }
308 return Promise.all(res); 295 return Promise.all(res);
309 }; 296 };
310 297
311 - instanciateComponents = function() { 298 + var instanciateComponents = function() {
312 var p, promises=[]; 299 var p, promises=[];
313 - console.log(components);
314 300
315 for (p in components) { 301 for (p in components) {
316 if (components.hasOwnProperty(p)) { 302 if (components.hasOwnProperty(p)) {
...@@ -319,7 +305,7 @@ ARCS.Context = function( ctx ) { ...@@ -319,7 +305,7 @@ ARCS.Context = function( ctx ) {
319 console.error("[ARCS] Context dump follows: ", libraries, components, constants); 305 console.error("[ARCS] Context dump follows: ", libraries, components, constants);
320 return ; 306 return ;
321 } 307 }
322 - factory = factories[components[p].type]; 308 + var factory = factories[components[p].type];
323 //console.log("instanciating ", p); 309 //console.log("instanciating ", p);
324 try { 310 try {
325 if (components[p].value !== undefined || components[p].url !== undefined || components[p].ref !== undefined) { 311 if (components[p].value !== undefined || components[p].url !== undefined || components[p].ref !== undefined) {
...@@ -368,21 +354,23 @@ ARCS.Context = function( ctx ) { ...@@ -368,21 +354,23 @@ ARCS.Context = function( ctx ) {
368 libActualName = libName.name; 354 libActualName = libName.name;
369 libUrl = libName.url; 355 libUrl = libName.url;
370 } 356 }
371 - 357 +
372 - libraries.push(libActualName); 358 + if (libraries.indexOf(libActualName) < 0) {
359 + libraries.push(libActualName);
360 + }
373 // TODO promisify call to cbFunction 361 // TODO promisify call to cbFunction
374 return import(libUrl).then( function(module) { 362 return import(libUrl).then( function(module) {
375 // TODO insert here component factories 363 // TODO insert here component factories
376 - for (p in module) { 364 + for (p in module.default) {
377 - if (module.hasOwnProperty(p)) { 365 + if (module.default.hasOwnProperty(p)) {
378 - ARCS.Context.currentContext.setFactory(p,module[p]); 366 + ARCS.Context.currentContext.setFactory(p,module.default[p]);
379 } 367 }
380 } 368 }
381 369
382 if (cbFunction !== undefined) { 370 if (cbFunction !== undefined) {
383 cbFunction(); 371 cbFunction();
384 } 372 }
385 - }); 373 + }).catch( function(msg) { console.error("[ARCS] Trouble loading '",libUrl,"' with reason -", msg) });
386 }; 374 };
387 375
388 /** 376 /**
...@@ -501,7 +489,7 @@ ARCS.Context = function( ctx ) { ...@@ -501,7 +489,7 @@ ARCS.Context = function( ctx ) {
501 this.instanciate = function () { 489 this.instanciate = function () {
502 //! TODO 490 //! TODO
503 return loadLibraries().then(instanciateComponents) 491 return loadLibraries().then(instanciateComponents)
504 - .catch(function(msg) { console.log("[ARCS] Trouble instanciating context", msg); }); 492 + .catch(function(msg) { console.error("[ARCS] Trouble instanciating context", msg); });
505 493
506 }; 494 };
507 495
...@@ -2049,7 +2037,7 @@ ARCS.Application = function () { ...@@ -2049,7 +2037,7 @@ ARCS.Application = function () {
2049 * Starts the application 2037 * Starts the application
2050 */ 2038 */
2051 this.start = function () { 2039 this.start = function () {
2052 - console.log("[ARCS] Starting application"); 2040 + console.log("[ARCS] Starting application...");
2053 context.instanciate().then(preProcess); 2041 context.instanciate().then(preProcess);
2054 }; 2042 };
2055 }; 2043 };
...@@ -2065,103 +2053,6 @@ ARCS.Application.slot("setSheet"); ...@@ -2065,103 +2053,6 @@ ARCS.Application.slot("setSheet");
2065 ARCS.Application.slot("finish"); 2053 ARCS.Application.slot("finish");
2066 2054
2067 2055
2068 -/**
2069 - * definition of the main module function:
2070 - * it takes an anonymous function as a parameter
2071 - * the anonymous function has one parameter: the object encompassing
2072 - * ARCS definitions (in order to able to use ARCS.Component.create, ...)
2073 - * @param moduleDefinition {function} main function of the module.
2074 - * It should return a list of components
2075 - * @param deps {mixed[]} dependencies
2076 - */
2077 -
2078 -// TODO arcs_module seems to be not needed anymore!!!!
2079 -// more cunning, this time, we export an arcs_module function
2080 -// that we call later!
2081 -// still we need to do something about it in order to register
2082 -// components.
2083 -// in fact factories should be registered in load library.
2084 -
2085 -// reimplementation using native promises
2086 -arcs_module = function(moduleDefinition, deps) {
2087 - var storeComponents, i;
2088 -
2089 - if (typeof module !== 'undefined') {
2090 - if (module.parent.exports) {
2091 - ARCS = module.exports;
2092 - }
2093 - }
2094 -
2095 - if (deps === undefined) { deps = []; }
2096 -
2097 - storeComponents = function (deps) {
2098 - var mdef, p;
2099 - // we should insert ARCS at the beginning of deps !
2100 - deps.unshift(ARCS);
2101 -
2102 - mdef = (typeof moduleDefinition === 'function') ?
2103 - moduleDefinition.apply(this, deps) : moduleDefinition;
2104 -
2105 - if (mdef === undefined) {
2106 - throw new Error("[ARCS] Your module is undefined. Did you forget to export components?\nCode of module follows:\n" +moduleDefinition);
2107 - }
2108 -
2109 - for (p in mdef) {
2110 - if (mdef.hasOwnProperty(p) && ARCS.Context.currentContext != null) {
2111 - ARCS.Context.currentContext.setFactory(p,mdef[p]); //.setFactory(ARCS.Application.currentApplication, p, mdef[p]);
2112 - }
2113 - }
2114 -
2115 - return Promise.resolve();
2116 - };
2117 - // until now, it is the very same code.
2118 -
2119 - // here we create a promise to solve dependency
2120 - // reject has the dependency name, while resolve has the object
2121 - var depResolve = function(dep) {
2122 - return new Promise(function(resolve, reject) {
2123 - var d,shimConfig;
2124 - if (ARCS.isInNode()) {
2125 - d = require(dep);
2126 - if (d === undefined) {
2127 - reject(dep);
2128 - } else {
2129 - resolve(d);
2130 - }
2131 - } else {
2132 - // this one a little bit trickier since we have to shim.
2133 - if (dep.name !== undefined) {
2134 - shimConfig = { shim: {} };
2135 - shimConfig.shim[dep.name] = { exports: dep.exports };
2136 - if (dep.deps !== undefined) {
2137 - shimConfig.shim[dep.name].deps = dep.deps;
2138 - }
2139 - require.config(shimConfig);
2140 - dep = dep.name;
2141 - }
2142 - // shim performed
2143 - require([dep],
2144 - function(d) { resolve(d); },
2145 - function(err) { console.log("[ARCS] Trouble with module ", dep); reject(dep, err); }
2146 - );
2147 - }
2148 - });
2149 - };
2150 -
2151 - var depResolves = [];
2152 - for (i=0; i<deps.length; i++) {
2153 - depResolves[i] = depResolve(deps[i]);
2154 - }
2155 -
2156 -
2157 -
2158 - ARCS.Context.currentContext.addLibraryPromise(
2159 - Promise.all(depResolves).then(storeComponents,
2160 - function(reason) { console.error("[ARCS] Failed to load dependency ", reason ); })
2161 -
2162 - );
2163 -
2164 -}
2165 // no longer needed with the use of imports 2056 // no longer needed with the use of imports
2166 2057
2167 -export default ARCS;
...\ No newline at end of file ...\ No newline at end of file
2058 +export { ARCS as default};
...\ No newline at end of file ...\ No newline at end of file
......
This diff is collapsed. Click to expand it.
1 /* ugly hack in order to display data in web page instead of console */ 1 /* ugly hack in order to display data in web page instead of console */
2 +import ARCS from '../build/arcs.js';
2 3
4 +var Console;
5 +/**
6 + * @class Console
7 + * @classdesc Redirects console messages to a given HTML element in the page.
8 + * @param id {string} id of the HTML element in which console messages will be added.
9 + */
10 +Console = ARCS.Component.create(
11 + function (id) {
12 + if (id === undefined) {
13 + return ;
14 + }
15 +
16 + var output = document.getElementById(id);
17 +
18 + if (output) {
19 + window.console = {
20 + timeRef: new Date().getTime(),
21 + output : output,
22 + display: function(color,args) {
23 + var s = document.createElement("span");
24 + s.style.color=color;
25 + var elapsed = (new Date().getTime() - this.timeRef);
3 26
4 -arcs_module( 27 + s.innerHTML = '<span class="marker">' + (elapsed/1000).toFixed(3) + '</span>' + Array.prototype.join.call(args, ' ');
5 - function(ARCS) { 28 + output.appendChild(s);
6 - var Console; 29 + output.appendChild(document.createElement("br"));
7 - /** 30 + },
8 - * @class Console 31 + log: function () {
9 - * @classdesc Redirects console messages to a given HTML element in the page. 32 + this.display('green',arguments);
10 - * @param id {string} id of the HTML element in which console messages will be added. 33 + },
11 - */ 34 + error: function () {
12 - Console = ARCS.Component.create( 35 + this.display('red',arguments);
13 - function (id) { 36 + },
14 - if (id === undefined) { 37 + warn: function () {
15 - return ; 38 + this.display('orange',arguments);
16 } 39 }
17 - 40 + };
18 - var output = document.getElementById(id); 41 + }
19 -
20 - if (output) {
21 - window.console = {
22 - timeRef: new Date().getTime(),
23 - output : output,
24 - display: function(color,args) {
25 - var s = document.createElement("span");
26 - s.style.color=color;
27 - var elapsed = (new Date().getTime() - this.timeRef);
28 -
29 - s.innerHTML = '<span class="marker">' + (elapsed/1000).toFixed(3) + '</span>' + Array.prototype.join.call(args, ' ');
30 - output.appendChild(s);
31 - output.appendChild(document.createElement("br"));
32 - },
33 - log: function () {
34 - this.display('green',arguments);
35 - },
36 - error: function () {
37 - this.display('red',arguments);
38 - },
39 - warn: function () {
40 - this.display('orange',arguments);
41 - }
42 - };
43 - }
44 - }
45 - );
46 - return { Console: Console};
47 } 42 }
43 +);
44 +
48 45
49 -);
...\ No newline at end of file ...\ No newline at end of file
46 +export default { Console: Console};
......
...@@ -5,111 +5,99 @@ ...@@ -5,111 +5,99 @@
5 * @file 5 * @file
6 */ 6 */
7 7
8 -// TODO first strategy: import ARCS and export components 8 +import ARCS from '../build/arcs.js';
9 -// TODO second strategy: make an anonymous function to export
10 -// in any case, arcs_module disappears
11 9
12 - 10 +/**
13 - 11 + * @class Loop
14 -//! TODO to comment or uncomment (maybe) 12 + * @classdesc loop component creation using a compact style.
15 -// imports ARCS from '../build/arcs.js'; 13 + * This component iterates for a given number of times
16 -function (ARCS) { 14 + */
17 - var Loop, DisplayInt, Sum; 15 +var Loop = ARCS.Component.create(
18 - /** @exports loop */ 16 + function () {
19 - //console.log("loop: ", ARCS);
20 /** 17 /**
21 - * @class Loop 18 + * Sets the number of times the component should iterate.
22 - * @classdesc loop component creation using a compact style. 19 + * It starts the iterations. At each iteration, a signal newIteration is
23 - * This component iterates for a given number of times 20 + * emitted, then, at the end of the iterations, a signal sendToken is
24 - */ 21 + * eventually triggered.
25 - Loop = ARCS.Component.create( 22 + * @param n {numeric} number of iterations
26 - function () { 23 + * @function Loop#setIterations
27 - /** 24 + * @slot
28 - * Sets the number of times the component should iterate. 25 + * @emits newIteration
29 - * It starts the iterations. At each iteration, a signal newIteration is 26 + * @emits sendToken
30 - * emitted, then, at the end of the iterations, a signal sendToken is 27 + */
31 - * eventually triggered. 28 + this.setIterations = function (n) {
32 - * @param n {numeric} number of iterations 29 + var i;
33 - * @function Loop#setIterations 30 + for (i = 0; i < n; i++) {
34 - * @slot 31 + console.log("Loop : emitting ", i);
35 - * @emits newIteration 32 + this.emit("newIteration", i);
36 - * @emits sendToken 33 + }
37 - */ 34 + this.emit("endLoop");
38 - this.setIterations = function (n) { 35 + };
39 - var i; 36 +
40 - for (i = 0; i < n; i++) { 37 + /** @function Loop#newIteration
41 - console.log("Loop : emitting ", i); 38 + * @signal
42 - this.emit("newIteration", i); 39 + * @param n {number} current iteration number.
43 - } 40 + */
44 - this.emit("endLoop"); 41 +
45 - }; 42 + /** @function Loop#sendToken
46 - 43 + * @signal
47 - /** @function Loop#newIteration 44 + * @param s {string} token to emit.
48 - * @signal 45 + */
49 - * @param n {number} current iteration number. 46 +
50 - */ 47 + },
51 - 48 + "setIterations", //slotList
52 - /** @function Loop#sendToken 49 + ["endLoop", "newIteration"] // signalList
53 - * @signal 50 +);
54 - * @param s {string} token to emit.
55 - */
56 -
57 - },
58 - "setIterations", //slotList
59 - ["endLoop", "newIteration"] // signalList
60 - );
61 51
62 52
63 - /** 53 +/**
64 - * @class DisplayInt 54 + * @class DisplayInt
65 - * @classdesc displayInt component creation using a variation with defined slots 55 + * @classdesc displayInt component creation using a variation with defined slots
66 - * in the constructor (a slot is a function). DisplayInt will display an integer 56 + * in the constructor (a slot is a function). DisplayInt will display an integer
67 - * received on its display slot. 57 + * received on its display slot.
68 - */ 58 + */
69 - DisplayInt = function () { 59 +var DisplayInt = function () {
70 - /** 60 +/**
71 - * @param n {numeric} number to display 61 + * @param n {numeric} number to display
72 - * @function DisplayInt#display 62 + * @function DisplayInt#display
73 - * @slot 63 + * @slot
74 - */ 64 + */
75 - this.display = function (n) { 65 + this.display = function (n) {
76 - console.log(" DisplayInt : " + n); 66 + console.log(" DisplayInt : " + n);
77 - };
78 }; 67 };
68 +};
79 69
80 - ARCS.Component.create(DisplayInt); 70 +ARCS.Component.create(DisplayInt);
81 - DisplayInt.slot("display"); 71 +DisplayInt.slot("display");
82 72
83 73
84 - /** 74 +/**
85 - * @class Sum 75 + * @class Sum
86 - * @classdec Sum is a component summing integers passed to its slot "add" 76 + * @classdec Sum is a component summing integers passed to its slot "add"
87 - * and the result is sent back by signal "sum". 77 + * and the result is sent back by signal "sum".
88 - * This component is declared in two different phases: declaration of the 78 + * This component is declared in two different phases: declaration of the
89 - * constructor and declaration of the slot "add". 79 + * constructor and declaration of the slot "add".
90 - */ 80 + */
91 - Sum = function () { 81 +var Sum = function () {
92 - this.total = 0; 82 + this.total = 0;
93 - }; 83 +};
94 84
95 - ARCS.Component.create(Sum); 85 +ARCS.Component.create(Sum);
96 - /** 86 +/**
97 - * This slot adds its parameter to its internal sum and send it back by using 87 + * This slot adds its parameter to its internal sum and send it back by using
98 - * the signal "sum". 88 + * the signal "sum".
99 - * @param n {integer} add n to the internal sum of the component. 89 + * @param n {integer} add n to the internal sum of the component.
100 - * @function Sum#add 90 + * @function Sum#add
101 - * @slot 91 + * @slot
102 - */ 92 + */
103 - Sum.slot("add", function (n) { 93 +Sum.slot("add", function (n) {
104 - this.total = this.total + n; 94 + this.total = this.total + n;
105 - this.emit("sum", this.total); //console.log(" Total : " + this.total); 95 + this.emit("sum", this.total); //console.log(" Total : " + this.total);
106 - }); 96 +});
107 - Sum.signal("sum"); 97 +Sum.signal("sum");
108 98
109 - // the anonymous function must return the components in one object: 99 +// the anonymous function must return the components in one object:
110 - // keys are factory names, value are actual constructors modified by 100 +// keys are factory names, value are actual constructors modified by
111 - // ARCS.Component.create 101 +// ARCS.Component.create
112 102
113 - return {Loop: Loop, DisplayInt: DisplayInt, Sum: Sum}; 103 +export default {Loop: Loop, DisplayInt: DisplayInt, Sum: Sum};
114 -//! TODO comment or uncomment (maybe)
115 -}
......
...@@ -16,11 +16,10 @@ ...@@ -16,11 +16,10 @@
16 "bower": ">=1.3.9", 16 "bower": ">=1.3.9",
17 "grunt": ">=0.4.5", 17 "grunt": ">=0.4.5",
18 "grunt-jslint": ">=1.1.12", 18 "grunt-jslint": ">=1.1.12",
19 - "grunt-contrib-obfuscator": "*",
20 "grunt-terser": "*", 19 "grunt-terser": "*",
21 - "grunt-file-minify": ">=1.0.0",
22 "grunt-jsdoc": ">=0.5.6", 20 "grunt-jsdoc": ">=0.5.6",
23 "grunt-bower-task": ">=0.4.0", 21 "grunt-bower-task": ">=0.4.0",
24 - "grunt-contrib-concat": ">=0.5.0" 22 + "grunt-contrib-concat": ">=0.5.0",
23 + "grunt-contrib-copy": ">=1.0.0"
25 } 24 }
26 } 25 }
......
...@@ -199,7 +199,7 @@ ARCS.Application = function () { ...@@ -199,7 +199,7 @@ ARCS.Application = function () {
199 * Starts the application 199 * Starts the application
200 */ 200 */
201 this.start = function () { 201 this.start = function () {
202 - console.log("[ARCS] Starting application"); 202 + console.log("[ARCS] Starting application...");
203 context.instanciate().then(preProcess); 203 context.instanciate().then(preProcess);
204 }; 204 };
205 }; 205 };
......
...@@ -3,31 +3,31 @@ ...@@ -3,31 +3,31 @@
3 * It relies on require.js to get the job done. 3 * It relies on require.js to get the job done.
4 * @file 4 * @file
5 */ 5 */
6 +"use strict";
6 7
7 // basically, here we start by importing the module ARCS 8 // basically, here we start by importing the module ARCS
8 import ARCS from './arcs.js'; 9 import ARCS from './arcs.js';
9 10
10 11
11 -console.log("Bootstrapping ARCS..."); 12 +console.log("[ARCS] Bootstrapping...");
12 13
13 var baseUrl, appDescription, requireMarkup, xhr; 14 var baseUrl, appDescription, requireMarkup, xhr;
14 15
15 -requireMarkup = document.querySelector('[data-main]'); 16 +requireMarkup = document.querySelector('[data-arcsapp]');
16 if (requireMarkup !== undefined) { 17 if (requireMarkup !== undefined) {
17 baseUrl = requireMarkup.dataset.baseUrl ; 18 baseUrl = requireMarkup.dataset.baseUrl ;
18 appDescription = requireMarkup.dataset.arcsapp || "arcsapp.json"; 19 appDescription = requireMarkup.dataset.arcsapp || "arcsapp.json";
19 } 20 }
20 21
22 +
23 +(async function toto() {
21 var description = await(fetch(appDescription)); 24 var description = await(fetch(appDescription));
22 var applicationObject = await(description.json()); 25 var applicationObject = await(description.json());
23 26
24 27
25 -console.log("ARCS application description loaded"); 28 +console.log("[ARCS] Application description loaded");
26 29
27 -if (baseUrl) {
28 - require.config( { baseUrl: baseUrl });
29 -}
30 var aap = new ARCS.Application(); 30 var aap = new ARCS.Application();
31 aap.import(applicationObject); 31 aap.import(applicationObject);
32 -console.log("Starting application...");
33 aap.start(); 32 aap.start();
33 +})();
...\ No newline at end of file ...\ No newline at end of file
......
1 -/**
2 - * definition of the main module function:
3 - * it takes an anonymous function as a parameter
4 - * the anonymous function has one parameter: the object encompassing
5 - * ARCS definitions (in order to able to use ARCS.Component.create, ...)
6 - * @param moduleDefinition {function} main function of the module.
7 - * It should return a list of components
8 - * @param deps {mixed[]} dependencies
9 - */
10 -
11 -// TODO arcs_module seems to be not needed anymore!!!!
12 -// more cunning, this time, we export an arcs_module function
13 -// that we call later!
14 -// still we need to do something about it in order to register
15 -// components.
16 -// in fact factories should be registered in load library.
17 -
18 -// reimplementation using native promises
19 -arcs_module = function(moduleDefinition, deps) {
20 - var storeComponents, i;
21 -
22 - if (typeof module !== 'undefined') {
23 - if (module.parent.exports) {
24 - ARCS = module.exports;
25 - }
26 - }
27 -
28 - if (deps === undefined) { deps = []; }
29 -
30 - storeComponents = function (deps) {
31 - var mdef, p;
32 - // we should insert ARCS at the beginning of deps !
33 - deps.unshift(ARCS);
34 -
35 - mdef = (typeof moduleDefinition === 'function') ?
36 - moduleDefinition.apply(this, deps) : moduleDefinition;
37 -
38 - if (mdef === undefined) {
39 - throw new Error("[ARCS] Your module is undefined. Did you forget to export components?\nCode of module follows:\n" +moduleDefinition);
40 - }
41 -
42 - for (p in mdef) {
43 - if (mdef.hasOwnProperty(p) && ARCS.Context.currentContext != null) {
44 - ARCS.Context.currentContext.setFactory(p,mdef[p]); //.setFactory(ARCS.Application.currentApplication, p, mdef[p]);
45 - }
46 - }
47 -
48 - return Promise.resolve();
49 - };
50 - // until now, it is the very same code.
51 -
52 - // here we create a promise to solve dependency
53 - // reject has the dependency name, while resolve has the object
54 - var depResolve = function(dep) {
55 - return new Promise(function(resolve, reject) {
56 - var d,shimConfig;
57 - if (ARCS.isInNode()) {
58 - d = require(dep);
59 - if (d === undefined) {
60 - reject(dep);
61 - } else {
62 - resolve(d);
63 - }
64 - } else {
65 - // this one a little bit trickier since we have to shim.
66 - if (dep.name !== undefined) {
67 - shimConfig = { shim: {} };
68 - shimConfig.shim[dep.name] = { exports: dep.exports };
69 - if (dep.deps !== undefined) {
70 - shimConfig.shim[dep.name].deps = dep.deps;
71 - }
72 - require.config(shimConfig);
73 - dep = dep.name;
74 - }
75 - // shim performed
76 - require([dep],
77 - function(d) { resolve(d); },
78 - function(err) { console.log("[ARCS] Trouble with module ", dep); reject(dep, err); }
79 - );
80 - }
81 - });
82 - };
83 -
84 - var depResolves = [];
85 - for (i=0; i<deps.length; i++) {
86 - depResolves[i] = depResolve(deps[i]);
87 - }
88 -
89 -
90 -
91 - ARCS.Context.currentContext.addLibraryPromise(
92 - Promise.all(depResolves).then(storeComponents,
93 - function(reason) { console.error("[ARCS] Failed to load dependency ", reason ); })
94 -
95 - );
96 -
97 -}
...\ No newline at end of file ...\ No newline at end of file
...@@ -23,6 +23,7 @@ ARCS.Context = function( ctx ) { ...@@ -23,6 +23,7 @@ ARCS.Context = function( ctx ) {
23 if (ctx !== undefined) { 23 if (ctx !== undefined) {
24 libraries = ctx.libraries; 24 libraries = ctx.libraries;
25 25
26 + var p;
26 for (p in ctx.components) { 27 for (p in ctx.components) {
27 if (ctx.components.hasOwnProperty(p)) { 28 if (ctx.components.hasOwnProperty(p)) {
28 components[p] = ctx.components[p]; 29 components[p] = ctx.components[p];
...@@ -39,8 +40,7 @@ ARCS.Context = function( ctx ) { ...@@ -39,8 +40,7 @@ ARCS.Context = function( ctx ) {
39 40
40 } 41 }
41 42
42 - //! TODO use fetch API? 43 + var loadDataFile =async function(fileName) {
43 - loadDataFile =async function(fileName) {
44 var dataPromise ; 44 var dataPromise ;
45 45
46 if (ARCS.isInNode()) { 46 if (ARCS.isInNode()) {
...@@ -57,19 +57,8 @@ ARCS.Context = function( ctx ) { ...@@ -57,19 +57,8 @@ ARCS.Context = function( ctx ) {
57 return client.json(); 57 return client.json();
58 } 58 }
59 }; 59 };
60 - 60 +
61 - //! TODO not needed anymore? 61 + var loadLibraries = function () {
62 - /*this.addLibraryPromise = function(p) {
63 - depLibPromises.push(p);
64 - };*/
65 -
66 - /*promiseLibrary = function(libName) {
67 - return import(libName);
68 - };*/
69 -
70 - //! TODO modify loadLibraries and loadLibrary to directly register
71 - // factories so that arcs_module is not needed anymore ?
72 - loadLibraries = function () {
73 var i; 62 var i;
74 // we will use different instances of require either the one of node 63 // we will use different instances of require either the one of node
75 // or the one from require.js 64 // or the one from require.js
...@@ -77,16 +66,13 @@ ARCS.Context = function( ctx ) { ...@@ -77,16 +66,13 @@ ARCS.Context = function( ctx ) {
77 66
78 var res=[]; 67 var res=[];
79 for(i=0; i < libraries.length; i++) { 68 for(i=0; i < libraries.length; i++) {
80 - //! TODO 69 + res.push(self.loadLibrary(libraries[i]));
81 - res.push(loadLibrary(libraries[i]));
82 - //import(libraries[i]));
83 } 70 }
84 return Promise.all(res); 71 return Promise.all(res);
85 }; 72 };
86 73
87 - instanciateComponents = function() { 74 + var instanciateComponents = function() {
88 var p, promises=[]; 75 var p, promises=[];
89 - console.log(components);
90 76
91 for (p in components) { 77 for (p in components) {
92 if (components.hasOwnProperty(p)) { 78 if (components.hasOwnProperty(p)) {
...@@ -95,7 +81,7 @@ ARCS.Context = function( ctx ) { ...@@ -95,7 +81,7 @@ ARCS.Context = function( ctx ) {
95 console.error("[ARCS] Context dump follows: ", libraries, components, constants); 81 console.error("[ARCS] Context dump follows: ", libraries, components, constants);
96 return ; 82 return ;
97 } 83 }
98 - factory = factories[components[p].type]; 84 + var factory = factories[components[p].type];
99 //console.log("instanciating ", p); 85 //console.log("instanciating ", p);
100 try { 86 try {
101 if (components[p].value !== undefined || components[p].url !== undefined || components[p].ref !== undefined) { 87 if (components[p].value !== undefined || components[p].url !== undefined || components[p].ref !== undefined) {
...@@ -144,21 +130,23 @@ ARCS.Context = function( ctx ) { ...@@ -144,21 +130,23 @@ ARCS.Context = function( ctx ) {
144 libActualName = libName.name; 130 libActualName = libName.name;
145 libUrl = libName.url; 131 libUrl = libName.url;
146 } 132 }
147 - 133 +
148 - libraries.push(libActualName); 134 + if (libraries.indexOf(libActualName) < 0) {
135 + libraries.push(libActualName);
136 + }
149 // TODO promisify call to cbFunction 137 // TODO promisify call to cbFunction
150 return import(libUrl).then( function(module) { 138 return import(libUrl).then( function(module) {
151 // TODO insert here component factories 139 // TODO insert here component factories
152 - for (p in module) { 140 + for (p in module.default) {
153 - if (module.hasOwnProperty(p)) { 141 + if (module.default.hasOwnProperty(p)) {
154 - ARCS.Context.currentContext.setFactory(p,module[p]); 142 + ARCS.Context.currentContext.setFactory(p,module.default[p]);
155 } 143 }
156 } 144 }
157 145
158 if (cbFunction !== undefined) { 146 if (cbFunction !== undefined) {
159 cbFunction(); 147 cbFunction();
160 } 148 }
161 - }); 149 + }).catch( function(msg) { console.error("[ARCS] Trouble loading '",libUrl,"' with reason -", msg) });
162 }; 150 };
163 151
164 /** 152 /**
...@@ -277,7 +265,7 @@ ARCS.Context = function( ctx ) { ...@@ -277,7 +265,7 @@ ARCS.Context = function( ctx ) {
277 this.instanciate = function () { 265 this.instanciate = function () {
278 //! TODO 266 //! TODO
279 return loadLibraries().then(instanciateComponents) 267 return loadLibraries().then(instanciateComponents)
280 - .catch(function(msg) { console.log("[ARCS] Trouble instanciating context", msg); }); 268 + .catch(function(msg) { console.error("[ARCS] Trouble instanciating context", msg); });
281 269
282 }; 270 };
283 271
......
1 // no longer needed with the use of imports 1 // no longer needed with the use of imports
2 2
3 -export default ARCS;
...\ No newline at end of file ...\ No newline at end of file
3 +export { ARCS as default};
...\ No newline at end of file ...\ No newline at end of file
......
1 { 1 {
2 "context" : { 2 "context" : {
3 - "libraries" : [ "components/loop","components/console"], 3 + "libraries" : [ "../components/loop.js","../components/console.js"],
4 "components" : { 4 "components" : {
5 "loop": { "type": "Loop" }, 5 "loop": { "type": "Loop" },
6 "dint": { "type": "DisplayInt" }, 6 "dint": { "type": "DisplayInt" },
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
4 <script data-base-url="../.." 4 <script data-base-url="../.."
5 data-arcsapp="arcsapp.json" 5 data-arcsapp="arcsapp.json"
6 type="module" 6 type="module"
7 - src="../../build/arcs_browser"> 7 + src="../../build/arcs_browser.js">
8 </script> 8 </script>
9 </head> 9 </head>
10 <body> 10 <body>
......