├── .gitignore ├── README.md ├── gruntjs └── getting_start │ ├── .gitignore │ ├── dist │ ├── styles │ │ ├── page1.min.css │ │ ├── base.min.css │ │ └── page1_base.min.css │ ├── study_grunt.min.js │ ├── study_grunt.min.js.map │ └── study_grunt.js │ ├── src │ ├── styles │ │ ├── page1.css │ │ └── base.css │ ├── scripts │ │ ├── index.js │ │ └── modules │ │ │ ├── eat.js │ │ │ └── run.js │ └── html │ │ └── index.html │ ├── .jshintrc │ ├── package.json │ └── Gruntfile.js ├── gulpjs └── getting_start │ ├── src │ ├── styles │ │ ├── page1.css │ │ └── base.css │ ├── scripts │ │ ├── index.js │ │ └── modules │ │ │ ├── eat.js │ │ │ └── run.js │ └── html │ │ └── index.html │ ├── dist │ ├── styles │ │ ├── index.min.css │ │ └── index.css │ └── scripts │ │ ├── index.min.js │ │ ├── index.js │ │ └── index.min.js.map │ ├── package.json │ └── gulpfile.js ├── browserify ├── index.js ├── modules │ ├── eat.js │ └── run.js ├── index.html └── prd │ └── index.js ├── seajs ├── main.js ├── index.html ├── modules │ ├── a.js │ └── b.js └── libs │ ├── sea.js │ └── sea-debug.js ├── requirejs ├── main.js ├── index.html ├── modules │ ├── a.js │ └── b.js └── libs │ ├── require.js │ └── require.debug.js └── css └── flex ├── slider.html └── layout.html /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store 3 | Thumbs.db -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | demo 2 | ==== 3 | 4 | 收集各种技术的使用示例。 5 | -------------------------------------------------------------------------------- /gruntjs/getting_start/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | -------------------------------------------------------------------------------- /gruntjs/getting_start/dist/styles/page1.min.css: -------------------------------------------------------------------------------- 1 | .row{width:100%;padding:10px} -------------------------------------------------------------------------------- /gruntjs/getting_start/dist/styles/base.min.css: -------------------------------------------------------------------------------- 1 | body,html{width:100%;height:100%;margin:0} -------------------------------------------------------------------------------- /gruntjs/getting_start/src/styles/page1.css: -------------------------------------------------------------------------------- 1 | .row { 2 | width: 100%; 3 | padding: 10px; 4 | } -------------------------------------------------------------------------------- /gulpjs/getting_start/src/styles/page1.css: -------------------------------------------------------------------------------- 1 | .row { 2 | width: 100%; 3 | padding: 10px; 4 | } -------------------------------------------------------------------------------- /gulpjs/getting_start/dist/styles/index.min.css: -------------------------------------------------------------------------------- 1 | body,html{width:100%;height:100%;margin:0}.row{width:100%;padding:10px} -------------------------------------------------------------------------------- /gruntjs/getting_start/dist/styles/page1_base.min.css: -------------------------------------------------------------------------------- 1 | body,html{width:100%;height:100%;margin:0}.row{width:100%;padding:10px} -------------------------------------------------------------------------------- /gruntjs/getting_start/src/styles/base.css: -------------------------------------------------------------------------------- 1 | html, body{ 2 | width: 100%; 3 | height: 100%; 4 | margin: 0; 5 | } -------------------------------------------------------------------------------- /gulpjs/getting_start/src/styles/base.css: -------------------------------------------------------------------------------- 1 | html, body{ 2 | width: 100%; 3 | height: 100%; 4 | margin: 0; 5 | } -------------------------------------------------------------------------------- /browserify/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | var a = require('./modules/run.js'); 5 | a.run(); 6 | 7 | void function() { 8 | require('./modules/eat.js').eat(); 9 | }(); -------------------------------------------------------------------------------- /gulpjs/getting_start/dist/styles/index.css: -------------------------------------------------------------------------------- 1 | html, body{ 2 | width: 100%; 3 | height: 100%; 4 | margin: 0; 5 | } 6 | .row { 7 | width: 100%; 8 | padding: 10px; 9 | } -------------------------------------------------------------------------------- /browserify/modules/eat.js: -------------------------------------------------------------------------------- 1 | /** 2 | * eat.js 3 | */ 4 | module.exports = (function() { 5 | return { 6 | eat: function() { 7 | console.log('eating...') 8 | } 9 | } 10 | })() -------------------------------------------------------------------------------- /browserify/modules/run.js: -------------------------------------------------------------------------------- 1 | /** 2 | * run.js 3 | */ 4 | module.exports = (function() { 5 | return { 6 | run: function() { 7 | console.log('running...') 8 | } 9 | } 10 | })() -------------------------------------------------------------------------------- /gulpjs/getting_start/src/scripts/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | 'use strict'; 5 | var a = require('./modules/run.js'); 6 | a.run(); 7 | 8 | (function() { 9 | require('./modules/eat.js').eat(); 10 | })(); -------------------------------------------------------------------------------- /gruntjs/getting_start/src/scripts/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | 'use strict'; 5 | var a = require('./modules/run.js'); 6 | a.run(); 7 | 8 | (function() { 9 | require('./modules/eat.js').eat(); 10 | })(); -------------------------------------------------------------------------------- /seajs/main.js: -------------------------------------------------------------------------------- 1 | define(function(require, exports, module) { 2 | var a = require('./modules/a.js') 3 | , b = require('./modules/b.js'); 4 | 5 | a.sayName(); 6 | a.sayHello(); 7 | b.sayName(); 8 | b.sayHello(); 9 | }); -------------------------------------------------------------------------------- /requirejs/main.js: -------------------------------------------------------------------------------- 1 | define(function(require, exports, module) { 2 | var a = require('./modules/a.js') 3 | , b = require('./modules/b.js'); 4 | 5 | a.sayName(); 6 | a.sayHello(); 7 | b.sayName(); 8 | b.sayHello(); 9 | }); -------------------------------------------------------------------------------- /requirejs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | require.js 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /browserify/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Browserify 6 | 7 | 8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /gruntjs/getting_start/src/scripts/modules/eat.js: -------------------------------------------------------------------------------- 1 | /** 2 | * eat.js 3 | */ 4 | module.exports = (function() { 5 | 'use strict'; 6 | return { 7 | eat: function() { 8 | console.log('eating....'); 9 | } 10 | }; 11 | })(); -------------------------------------------------------------------------------- /gruntjs/getting_start/src/scripts/modules/run.js: -------------------------------------------------------------------------------- 1 | /** 2 | * run.js 3 | */ 4 | module.exports = (function() { 5 | 'use strict'; 6 | return { 7 | run: function() { 8 | console.log('running...'); 9 | } 10 | }; 11 | })(); -------------------------------------------------------------------------------- /gulpjs/getting_start/src/scripts/modules/eat.js: -------------------------------------------------------------------------------- 1 | /** 2 | * eat.js 3 | */ 4 | module.exports = (function() { 5 | 'use strict'; 6 | return { 7 | eat: function() { 8 | console.log('eating....'); 9 | } 10 | }; 11 | })(); -------------------------------------------------------------------------------- /gulpjs/getting_start/src/scripts/modules/run.js: -------------------------------------------------------------------------------- 1 | /** 2 | * run.js 3 | */ 4 | module.exports = (function() { 5 | 'use strict'; 6 | return { 7 | run: function() { 8 | console.log('running...'); 9 | } 10 | }; 11 | })(); -------------------------------------------------------------------------------- /seajs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | sea.js 6 | 7 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /gruntjs/getting_start/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "curly": true, 3 | "eqeqeq": true, 4 | "immed": true, 5 | "latedef": true, 6 | "newcap": true, 7 | "noarg": true, 8 | "sub": true, 9 | "undef": true, 10 | "unused": true, 11 | "boss": true, 12 | "eqnull": true, 13 | "node": true 14 | } -------------------------------------------------------------------------------- /seajs/modules/a.js: -------------------------------------------------------------------------------- 1 | define(function(require, exports, module) { 2 | var a = { 3 | sayName: function() { 4 | console.log('my name is a'); 5 | }, 6 | sayHello: function() { 7 | console.log('a: hello !'); 8 | } 9 | }; 10 | module.exports = a; 11 | }); -------------------------------------------------------------------------------- /seajs/modules/b.js: -------------------------------------------------------------------------------- 1 | define(function(require, exports, module) { 2 | var b = { 3 | sayName: function() { 4 | console.log('my name is b'); 5 | }, 6 | sayHello: function() { 7 | console.log('b: hello !'); 8 | } 9 | }; 10 | module.exports = b; 11 | }); -------------------------------------------------------------------------------- /requirejs/modules/a.js: -------------------------------------------------------------------------------- 1 | define(function(require, exports, module) { 2 | var a = { 3 | sayName: function() { 4 | console.log('my name is a'); 5 | }, 6 | sayHello: function() { 7 | console.log('a: hello !'); 8 | } 9 | }; 10 | module.exports = a; 11 | }); -------------------------------------------------------------------------------- /requirejs/modules/b.js: -------------------------------------------------------------------------------- 1 | define(function(require, exports, module) { 2 | var b = { 3 | sayName: function() { 4 | console.log('my name is b'); 5 | }, 6 | sayHello: function() { 7 | console.log('b: hello !'); 8 | } 9 | }; 10 | module.exports = b; 11 | }); -------------------------------------------------------------------------------- /gruntjs/getting_start/src/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Gulpjs 6 | 7 | 8 | 9 |
10 | 11 | 12 | -------------------------------------------------------------------------------- /gulpjs/getting_start/src/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Gulpjs 6 | 7 | 8 | 9 |
10 | 11 | 12 | -------------------------------------------------------------------------------- /css/flex/slider.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Flex Demo -- Layout 6 | 10 | 11 | 12 |
13 | 21 | 22 |
23 | 24 | -------------------------------------------------------------------------------- /gulpjs/getting_start/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gulp_demo", 3 | "version": "0.0.0", 4 | "description": "demo", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "functions.bin", 10 | "license": "mit", 11 | "devDependencies": { 12 | "gulp": "^3.8.6", 13 | "gulp-uglify": "^0.3.1", 14 | "gulp-browserify": "^0.5.0", 15 | "gulp-rename": "^1.2.0", 16 | "gulp-concat": "^2.3.3", 17 | "gulp-clean": "^0.3.1", 18 | "gulp-minify-css": "^0.3.6", 19 | "gulp-htmlmin": "^0.1.3", 20 | "gulp-jshint": "^1.7.1", 21 | "gulp-sourcemaps": "^1.0.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /gulpjs/getting_start/dist/scripts/index.min.js: -------------------------------------------------------------------------------- 1 | !function n(r,t,e){function u(i,s){if(!t[i]){if(!r[i]){var f="function"==typeof require&&require;if(!s&&f)return f(i,!0);if(o)return o(i,!0);throw new Error("Cannot find module '"+i+"'")}var c=t[i]={exports:{}};r[i][0].call(c.exports,function(n){var t=r[i][1][n];return u(t?t:n)},c,c.exports,n,r,t,e)}return t[i].exports}for(var o="function"==typeof require&&require,i=0;i 2 | 3 | 4 | 5 | Flex Demo -- Layout 6 | 35 | 36 | 37 |
38 |
39 | 40 |
41 |
42 | 43 | 44 | -------------------------------------------------------------------------------- /gruntjs/getting_start/dist/study_grunt.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"dist/study_grunt.min.js","sources":["dist/study_grunt.js"],"names":["e","t","n","r","s","o","u","a","require","i","Error","f","exports","call","length",1,"run","eat","./modules/eat.js","./modules/run.js",2,"module","console","log",3],"mappings":";;;;CAAA,QAAUA,GAAEC,EAAEC,EAAEC,GAAG,QAASC,GAAEC,EAAEC,GAAG,IAAIJ,EAAEG,GAAG,CAAC,IAAIJ,EAAEI,GAAG,CAAC,GAAIE,GAAkB,kBAATC,UAAqBA,OAAQ,KAAIF,GAAGC,EAAE,MAAOA,GAAEF,GAAE,EAAI,IAAGI,EAAE,MAAOA,GAAEJ,GAAE,EAAI,MAAM,IAAIK,OAAM,uBAAuBL,EAAE,KAAK,GAAIM,GAAET,EAAEG,IAAIO,WAAYX,GAAEI,GAAG,GAAGQ,KAAKF,EAAEC,QAAQ,SAASZ,GAAG,GAAIE,GAAED,EAAEI,GAAG,GAAGL,EAAG,OAAOI,GAAEF,EAAEA,EAAEF,IAAIW,EAAEA,EAAEC,QAAQZ,EAAEC,EAAEC,EAAEC,GAAG,MAAOD,GAAEG,GAAGO,QAAkD,IAAI,GAA1CH,GAAkB,kBAATD,UAAqBA,QAAgBH,EAAE,EAAEA,EAAEF,EAAEW,OAAOT,IAAID,EAAED,EAAEE,GAAI,OAAOD,KAAKW,GAAG,SAASP,GAIta,YACA,IAAID,GAAIC,EAAQ,mBAChBD,GAAES,MAEF,WACIR,EAAQ,oBAAoBS,WAE7BC,mBAAmB,EAAEC,mBAAmB,IAAIC,GAAG,SAASZ,EAAQa,GAInEA,EAAOT,QAAU,WACb,YACA,QACIK,IAAK,WACDK,QAAQC,IAAI,wBAIlBC,GAAG,SAAShB,EAAQa,GAI1BA,EAAOT,QAAU,WACb,YACA,QACII,IAAK,WACDM,QAAQC,IAAI,6BAIb,EAAE,EAAE","sourceRoot":"dist/"} -------------------------------------------------------------------------------- /browserify/prd/index.js: -------------------------------------------------------------------------------- 1 | (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0.10.0" 27 | }, 28 | "scripts": { 29 | "test": "grunt" 30 | }, 31 | "devDependencies": { 32 | "grunt-contrib-concat": "~0.3.0", 33 | "grunt-contrib-uglify": "~0.2.0", 34 | "grunt-contrib-qunit": "~0.4.0", 35 | "grunt-contrib-jshint": "~0.6.0", 36 | "grunt-contrib-watch": "~0.4.0", 37 | "grunt": "~0.4.5", 38 | "grunt-browserify": "^2.1.3", 39 | "grunt-contrib-cssmin": "^0.10.0" 40 | }, 41 | "keywords": [] 42 | } 43 | -------------------------------------------------------------------------------- /gruntjs/getting_start/dist/study_grunt.js: -------------------------------------------------------------------------------- 1 | (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o - v<%= pkg.version %> - ' + 10 | '<%= grunt.template.today("yyyy-mm-dd") %>\n' + 11 | '<%= pkg.homepage ? "* " + pkg.homepage + "\\n" : "" %>' + 12 | '* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' + 13 | ' Licensed <%= _.pluck(pkg.licenses, "type").join(", ") %> */\n', 14 | // Task configuration. 15 | browserify: { 16 | dist: { 17 | // 需要合并的文件 18 | src: ['src/**/*.js'], 19 | // 合并后的文件 20 | dest: 'dist/<%= pkg.name %>.js' 21 | } 22 | }, 23 | uglify: { 24 | options: { 25 | // 在混淆的文件头部添加注释 26 | banner: '<%= banner %>', 27 | // 生成 SourceMap 文件 28 | sourceMapRoot: 'dist/', 29 | sourceMap: '<%= pkg.name %>.min.js.map', 30 | sourceMapUrl: '<%= pkg.name %>.min.js.map' 31 | }, 32 | dist: { 33 | // 需要混淆的文件 34 | src: '<%= browserify.dist.dest %>', 35 | // 混淆后的文件输出的位置 36 | dest: 'dist/<%= pkg.name %>.min.js' 37 | } 38 | }, 39 | qunit: { 40 | files: ['test/**/*.html'] 41 | }, 42 | jshint: { 43 | // 重新配置 jshint 44 | options: { 45 | jshintrc: '.jshintrc' 46 | }, 47 | // 需要检测的文件 48 | files: [ 49 | 'Gruntfile.js', 'src/**/*.js', 'test/**/*.js' 50 | ] 51 | }, 52 | cssmin: { 53 | minify: { 54 | expand: true, 55 | cwd: 'src/styles/', 56 | src: ['*.css', '!*.min.css'], 57 | dest: 'dist/styles/', 58 | ext: '.min.css' 59 | }, 60 | combine: { 61 | files: { 62 | '<%= cssmin.minify.dest %>page1_base.min.css': [ 63 | '<%= cssmin.minify.dest %>base.min.css', 64 | '<%= cssmin.minify.dest %>page1.min.css' 65 | ] 66 | } 67 | } 68 | }, 69 | watch: { 70 | // gruntfile: { 71 | // files: '<%= jshint.gruntfile.src %>', 72 | // tasks: ['jshint:gruntfile'] 73 | // } 74 | css:{ 75 | files: ['<%= cssmin.minify.cwd %>'], 76 | tasks: ['cssmin'] 77 | }, 78 | js: { 79 | files: ['<%= jshint.files %>'], 80 | tasks: [ 81 | 'jshint', 82 | 'qunit', 83 | 'browserify' 84 | ] 85 | } 86 | } 87 | }); 88 | 89 | // These plugins provide necessary tasks. 90 | grunt.loadNpmTasks('grunt-browserify'); 91 | grunt.loadNpmTasks('grunt-contrib-cssmin'); 92 | grunt.loadNpmTasks('grunt-contrib-uglify'); 93 | grunt.loadNpmTasks('grunt-contrib-qunit'); 94 | grunt.loadNpmTasks('grunt-contrib-jshint'); 95 | grunt.loadNpmTasks('grunt-contrib-watch'); 96 | 97 | // Default task. 98 | grunt.registerTask('default', ['browserify', 'jshint', /*'qunit',*/ 'uglify', 'cssmin']); 99 | 100 | }; 101 | -------------------------------------------------------------------------------- /seajs/libs/sea.js: -------------------------------------------------------------------------------- 1 | /*! Sea.js 2.3.0 | seajs.org/LICENSE.md */ 2 | !function(a,b){function c(a){return function(b){return{}.toString.call(b)=="[object "+a+"]"}}function d(){return z++}function e(a){return a.match(C)[0]}function f(a){for(a=a.replace(D,"/"),a=a.replace(F,"$1/");a.match(E);)a=a.replace(E,"/");return a}function g(a){var b=a.length-1,c=a.charAt(b);return"#"===c?a.substring(0,b):".js"===a.substring(b-2)||a.indexOf("?")>0||"/"===c?a:a+".js"}function h(a){var b=u.alias;return b&&w(b[a])?b[a]:a}function i(a){var b=u.paths,c;return b&&(c=a.match(G))&&w(b[c[1]])&&(a=b[c[1]]+c[2]),a}function j(a){var b=u.vars;return b&&a.indexOf("{")>-1&&(a=a.replace(H,function(a,c){return w(b[c])?b[c]:a})),a}function k(a){var b=u.map,c=a;if(b)for(var d=0,e=b.length;e>d;d++){var f=b[d];if(c=y(f)?f(a)||a:a.replace(f[0],f[1]),c!==a)break}return c}function l(a,b){var c,d=a.charAt(0);if(I.test(a))c=a;else if("."===d)c=f((b?e(b):u.cwd)+a);else if("/"===d){var g=u.cwd.match(J);c=g?g[0]+a.substring(1):a}else c=u.base+a;return 0===c.indexOf("//")&&(c=location.protocol+c),c}function m(a,b){if(!a)return"";a=h(a),a=i(a),a=j(a),a=g(a);var c=l(a,b);return c=k(c)}function n(a){return a.hasAttribute?a.src:a.getAttribute("src",4)}function o(a,b,c){var d=K.createElement("script");if(c){var e=y(c)?c(a):c;e&&(d.charset=e)}p(d,b,a),d.async=!0,d.src=a,R=d,Q?P.insertBefore(d,Q):P.appendChild(d),R=null}function p(a,b,c){function d(){a.onload=a.onerror=a.onreadystatechange=null,u.debug||P.removeChild(a),a=null,b()}var e="onload"in a;e?(a.onload=d,a.onerror=function(){B("error",{uri:c,node:a}),d()}):a.onreadystatechange=function(){/loaded|complete/.test(a.readyState)&&d()}}function q(){if(R)return R;if(S&&"interactive"===S.readyState)return S;for(var a=P.getElementsByTagName("script"),b=a.length-1;b>=0;b--){var c=a[b];if("interactive"===c.readyState)return S=c}}function r(a){var b=[];return a.replace(U,"").replace(T,function(a,c,d){d&&b.push(d)}),b}function s(a,b){this.uri=a,this.dependencies=b||[],this.exports=null,this.status=0,this._waitings={},this._remain=0}if(!a.seajs){var t=a.seajs={version:"2.3.0"},u=t.data={},v=c("Object"),w=c("String"),x=Array.isArray||c("Array"),y=c("Function"),z=0,A=u.events={};t.on=function(a,b){var c=A[a]||(A[a]=[]);return c.push(b),t},t.off=function(a,b){if(!a&&!b)return A=u.events={},t;var c=A[a];if(c)if(b)for(var d=c.length-1;d>=0;d--)c[d]===b&&c.splice(d,1);else delete A[a];return t};var B=t.emit=function(a,b){var c=A[a],d;if(c){c=c.slice();for(var e=0,f=c.length;f>e;e++)c[e](b)}return t},C=/[^?#]*\//,D=/\/\.\//g,E=/\/[^/]+\/\.\.\//,F=/([^:/])\/+\//g,G=/^([^/:]+)(\/.+)$/,H=/{([^{]+)}/g,I=/^\/\/.|:\//,J=/^.*?\/\/.*?\//,K=document,L=location.href&&0!==location.href.indexOf("about:")?e(location.href):"",M=K.scripts,N=K.getElementById("seajsnode")||M[M.length-1],O=e(n(N)||L);t.resolve=m;var P=K.head||K.getElementsByTagName("head")[0]||K.documentElement,Q=P.getElementsByTagName("base")[0],R,S;t.request=o;var T=/"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|\/\*[\S\s]*?\*\/|\/(?:\\\/|[^\/\r\n])+\/(?=[^\/])|\/\/.*|\.\s*require|(?:^|[^$])\brequire\s*\(\s*(["'])(.+?)\1\s*\)/g,U=/\\\\/g,V=t.cache={},W,X={},Y={},Z={},$=s.STATUS={FETCHING:1,SAVED:2,LOADING:3,LOADED:4,EXECUTING:5,EXECUTED:6};s.prototype.resolve=function(){for(var a=this,b=a.dependencies,c=[],d=0,e=b.length;e>d;d++)c[d]=s.resolve(b[d],a.uri);return c},s.prototype.load=function(){var a=this;if(!(a.status>=$.LOADING)){a.status=$.LOADING;var c=a.resolve();B("load",c);for(var d=a._remain=c.length,e,f=0;d>f;f++)e=s.get(c[f]),e.status<$.LOADED?e._waitings[a.uri]=(e._waitings[a.uri]||0)+1:a._remain--;if(0===a._remain)return a.onload(),b;var g={};for(f=0;d>f;f++)e=V[c[f]],e.status<$.FETCHING?e.fetch(g):e.status===$.SAVED&&e.load();for(var h in g)g.hasOwnProperty(h)&&g[h]()}},s.prototype.onload=function(){var a=this;a.status=$.LOADED,a.callback&&a.callback();var b=a._waitings,c,d;for(c in b)b.hasOwnProperty(c)&&(d=V[c],d._remain-=b[c],0===d._remain&&d.onload());delete a._waitings,delete a._remain},s.prototype.fetch=function(a){function c(){t.request(g.requestUri,g.onRequest,g.charset)}function d(){delete X[h],Y[h]=!0,W&&(s.save(f,W),W=null);var a,b=Z[h];for(delete Z[h];a=b.shift();)a.load()}var e=this,f=e.uri;e.status=$.FETCHING;var g={uri:f};B("fetch",g);var h=g.requestUri||f;return!h||Y[h]?(e.load(),b):X[h]?(Z[h].push(e),b):(X[h]=!0,Z[h]=[e],B("request",g={uri:f,requestUri:h,onRequest:d,charset:u.charset}),g.requested||(a?a[g.requestUri]=c:c()),b)},s.prototype.exec=function(){function a(b){return s.get(a.resolve(b)).exec()}var c=this;if(c.status>=$.EXECUTING)return c.exports;c.status=$.EXECUTING;var e=c.uri;a.resolve=function(a){return s.resolve(a,e)},a.async=function(b,c){return s.use(b,c,e+"_async_"+d()),a};var f=c.factory,g=y(f)?f(a,c.exports={},c):f;return g===b&&(g=c.exports),delete c.factory,c.exports=g,c.status=$.EXECUTED,B("exec",c),g},s.resolve=function(a,b){var c={id:a,refUri:b};return B("resolve",c),c.uri||t.resolve(c.id,b)},s.define=function(a,c,d){var e=arguments.length;1===e?(d=a,a=b):2===e&&(d=c,x(a)?(c=a,a=b):c=b),!x(c)&&y(d)&&(c=r(""+d));var f={id:a,uri:s.resolve(a),deps:c,factory:d};if(!f.uri&&K.attachEvent){var g=q();g&&(f.uri=g.src)}B("define",f),f.uri?s.save(f.uri,f):W=f},s.save=function(a,b){var c=s.get(a);c.status<$.SAVED&&(c.id=b.id||a,c.dependencies=b.deps||[],c.factory=b.factory,c.status=$.SAVED,B("save",c))},s.get=function(a,b){return V[a]||(V[a]=new s(a,b))},s.use=function(b,c,d){var e=s.get(d,x(b)?b:[b]);e.callback=function(){for(var b=[],d=e.resolve(),f=0,g=d.length;g>f;f++)b[f]=V[d[f]].exec();c&&c.apply(a,b),delete e.callback},e.load()},t.use=function(a,b){return s.use(a,b,u.cwd+"_use_"+d()),t},s.define.cmd={},a.define=s.define,t.Module=s,u.fetchedList=Y,u.cid=d,t.require=function(a){var b=s.get(s.resolve(a));return b.status<$.EXECUTING&&(b.onload(),b.exec()),b.exports},u.base=O,u.dir=O,u.cwd=L,u.charset="utf-8",t.config=function(a){for(var b in a){var c=a[b],d=u[b];if(d&&v(d))for(var e in c)d[e]=c[e];else x(d)?c=d.concat(c):"base"===b&&("/"!==c.slice(-1)&&(c+="/"),c=l(c)),u[b]=c}return B("config",a),t}}}(this); 3 | -------------------------------------------------------------------------------- /requirejs/libs/require.js: -------------------------------------------------------------------------------- 1 | /* 2 | RequireJS 2.1.14 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved. 3 | Available via the MIT or new BSD license. 4 | see: http://github.com/jrburke/requirejs for details 5 | */ 6 | var requirejs,require,define; 7 | (function(ba){function G(b){return"[object Function]"===K.call(b)}function H(b){return"[object Array]"===K.call(b)}function v(b,c){if(b){var d;for(d=0;dthis.depCount&&!this.defined){if(G(l)){if(this.events.error&&this.map.isDefine||g.onError!==ca)try{f=i.execCb(c,l,b,f)}catch(d){a=d}else f=i.execCb(c,l,b,f);this.map.isDefine&&void 0===f&&((b=this.module)?f=b.exports:this.usingExports&& 19 | (f=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",w(this.error=a)}else f=l;this.exports=f;if(this.map.isDefine&&!this.ignore&&(r[c]=f,g.onResourceLoad))g.onResourceLoad(i,this.map,this.depMaps);y(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a= 20 | this.map,b=a.id,d=p(a.prefix);this.depMaps.push(d);q(d,"defined",u(this,function(f){var l,d;d=m(aa,this.map.id);var e=this.map.name,P=this.map.parentMap?this.map.parentMap.name:null,n=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(f.normalize&&(e=f.normalize(e,function(a){return c(a,P,!0)})||""),f=p(a.prefix+"!"+e,this.map.parentMap),q(f,"defined",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=m(h,f.id)){this.depMaps.push(f); 21 | if(this.events.error)d.on("error",u(this,function(a){this.emit("error",a)}));d.enable()}}else d?(this.map.url=i.nameToUrl(d),this.load()):(l=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),l.error=u(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];B(h,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&y(a.map.id)});w(a)}),l.fromText=u(this,function(f,c){var d=a.name,e=p(d),P=M;c&&(f=c);P&&(M=!1);s(e);t(j.config,b)&&(j.config[d]=j.config[b]);try{g.exec(f)}catch(h){return w(C("fromtexteval", 22 | "fromText eval for "+b+" failed: "+h,h,[b]))}P&&(M=!0);this.depMaps.push(e);i.completeLoad(d);n([d],l)}),f.load(a.name,n,l,j))}));i.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){V[this.map.id]=this;this.enabling=this.enabled=!0;v(this.depMaps,u(this,function(a,b){var c,f;if("string"===typeof a){a=p(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=m(L,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;q(a,"defined",u(this,function(a){this.defineDep(b, 23 | a);this.check()}));this.errback&&q(a,"error",u(this,this.errback))}c=a.id;f=h[c];!t(L,c)&&(f&&!f.enabled)&&i.enable(a,this)}));B(this.pluginMaps,u(this,function(a){var b=m(h,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){v(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};i={config:j,contextName:b,registry:h,defined:r,urlFetched:S,defQueue:A,Module:Z,makeModuleMap:p, 24 | nextTick:g.nextTick,onError:w,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=j.shim,c={paths:!0,bundles:!0,config:!0,map:!0};B(a,function(a,b){c[b]?(j[b]||(j[b]={}),U(j[b],a,!0,!0)):j[b]=a});a.bundles&&B(a.bundles,function(a,b){v(a,function(a){a!==b&&(aa[a]=b)})});a.shim&&(B(a.shim,function(a,c){H(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);b[c]=a}),j.shim=b);a.packages&&v(a.packages,function(a){var b, 25 | a="string"===typeof a?{name:a}:a;b=a.name;a.location&&(j.paths[b]=a.location);j.pkgs[b]=a.name+"/"+(a.main||"main").replace(ia,"").replace(Q,"")});B(h,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=p(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ba,arguments));return b||a.exports&&da(a.exports)}},makeRequire:function(a,e){function j(c,d,m){var n,q;e.enableBuildCallback&&(d&&G(d))&&(d.__requireJsBuild= 26 | !0);if("string"===typeof c){if(G(d))return w(C("requireargs","Invalid require call"),m);if(a&&t(L,c))return L[c](h[a.id]);if(g.get)return g.get(i,c,a,j);n=p(c,a,!1,!0);n=n.id;return!t(r,n)?w(C("notloaded",'Module name "'+n+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):r[n]}J();i.nextTick(function(){J();q=s(p(null,a));q.skipMap=e.skipMap;q.init(c,d,m,{enabled:!0});D()});return j}e=e||{};U(j,{isBrowser:z,toUrl:function(b){var d,e=b.lastIndexOf("."),k=b.split("/")[0];if(-1!== 27 | e&&(!("."===k||".."===k)||1e.attachEvent.toString().indexOf("[native code"))&&!Y?(M=!0,e.attachEvent("onreadystatechange",b.onScriptLoad)): 34 | (e.addEventListener("load",b.onScriptLoad,!1),e.addEventListener("error",b.onScriptError,!1)),e.src=d,J=e,D?y.insertBefore(e,D):y.appendChild(e),J=null,e;if(ea)try{importScripts(d),b.completeLoad(c)}catch(m){b.onError(C("importscripts","importScripts failed for "+c+" at "+d,m,[c]))}};z&&!q.skipDataMain&&T(document.getElementsByTagName("script"),function(b){y||(y=b.parentNode);if(I=b.getAttribute("data-main"))return s=I,q.baseUrl||(E=s.split("/"),s=E.pop(),O=E.length?E.join("/")+"/":"./",q.baseUrl= 35 | O),s=s.replace(Q,""),g.jsExtRegExp.test(s)&&(s=I),q.deps=q.deps?q.deps.concat(s):[s],!0});define=function(b,c,d){var e,g;"string"!==typeof b&&(d=c,c=b,b=null);H(c)||(d=c,c=null);!c&&G(d)&&(c=[],d.length&&(d.toString().replace(ka,"").replace(la,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));if(M){if(!(e=J))N&&"interactive"===N.readyState||T(document.getElementsByTagName("script"),function(b){if("interactive"===b.readyState)return N=b}),e=N;e&&(b|| 36 | (b=e.getAttribute("data-requiremodule")),g=F[e.getAttribute("data-requirecontext")])}(g?g.defQueue:R).push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(q)}})(this); 37 | -------------------------------------------------------------------------------- /seajs/libs/sea-debug.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Sea.js 2.3.0 | seajs.org/LICENSE.md 3 | */ 4 | (function(global, undefined) { 5 | 6 | // Avoid conflicting when `sea.js` is loaded multiple times 7 | if (global.seajs) { 8 | return 9 | } 10 | 11 | var seajs = global.seajs = { 12 | // The current version of Sea.js being used 13 | version: "2.3.0" 14 | } 15 | 16 | var data = seajs.data = {} 17 | 18 | 19 | /** 20 | * util-lang.js - The minimal language enhancement 21 | */ 22 | 23 | function isType(type) { 24 | return function(obj) { 25 | return {}.toString.call(obj) == "[object " + type + "]" 26 | } 27 | } 28 | 29 | var isObject = isType("Object") 30 | var isString = isType("String") 31 | var isArray = Array.isArray || isType("Array") 32 | var isFunction = isType("Function") 33 | 34 | var _cid = 0 35 | function cid() { 36 | return _cid++ 37 | } 38 | 39 | 40 | /** 41 | * util-events.js - The minimal events support 42 | */ 43 | 44 | var events = data.events = {} 45 | 46 | // Bind event 47 | seajs.on = function(name, callback) { 48 | var list = events[name] || (events[name] = []) 49 | list.push(callback) 50 | return seajs 51 | } 52 | 53 | // Remove event. If `callback` is undefined, remove all callbacks for the 54 | // event. If `event` and `callback` are both undefined, remove all callbacks 55 | // for all events 56 | seajs.off = function(name, callback) { 57 | // Remove *all* events 58 | if (!(name || callback)) { 59 | events = data.events = {} 60 | return seajs 61 | } 62 | 63 | var list = events[name] 64 | if (list) { 65 | if (callback) { 66 | for (var i = list.length - 1; i >= 0; i--) { 67 | if (list[i] === callback) { 68 | list.splice(i, 1) 69 | } 70 | } 71 | } 72 | else { 73 | delete events[name] 74 | } 75 | } 76 | 77 | return seajs 78 | } 79 | 80 | // Emit event, firing all bound callbacks. Callbacks receive the same 81 | // arguments as `emit` does, apart from the event name 82 | var emit = seajs.emit = function(name, data) { 83 | var list = events[name], fn 84 | 85 | if (list) { 86 | // Copy callback lists to prevent modification 87 | list = list.slice() 88 | 89 | // Execute event callbacks, use index because it's the faster. 90 | for(var i = 0, len = list.length; i < len; i++) { 91 | list[i](data) 92 | } 93 | } 94 | 95 | return seajs 96 | } 97 | 98 | 99 | /** 100 | * util-path.js - The utilities for operating path such as id, uri 101 | */ 102 | 103 | var DIRNAME_RE = /[^?#]*\// 104 | 105 | var DOT_RE = /\/\.\//g 106 | var DOUBLE_DOT_RE = /\/[^/]+\/\.\.\// 107 | var MULTI_SLASH_RE = /([^:/])\/+\//g 108 | 109 | // Extract the directory portion of a path 110 | // dirname("a/b/c.js?t=123#xx/zz") ==> "a/b/" 111 | // ref: http://jsperf.com/regex-vs-split/2 112 | function dirname(path) { 113 | return path.match(DIRNAME_RE)[0] 114 | } 115 | 116 | // Canonicalize a path 117 | // realpath("http://test.com/a//./b/../c") ==> "http://test.com/a/c" 118 | function realpath(path) { 119 | // /a/b/./c/./d ==> /a/b/c/d 120 | path = path.replace(DOT_RE, "/") 121 | 122 | /* 123 | @author wh1100717 124 | a//b/c ==> a/b/c 125 | a///b/////c ==> a/b/c 126 | DOUBLE_DOT_RE matches a/b/c//../d path correctly only if replace // with / first 127 | */ 128 | path = path.replace(MULTI_SLASH_RE, "$1/") 129 | 130 | // a/b/c/../../d ==> a/b/../d ==> a/d 131 | while (path.match(DOUBLE_DOT_RE)) { 132 | path = path.replace(DOUBLE_DOT_RE, "/") 133 | } 134 | 135 | return path 136 | } 137 | 138 | // Normalize an id 139 | // normalize("path/to/a") ==> "path/to/a.js" 140 | // NOTICE: substring is faster than negative slice and RegExp 141 | function normalize(path) { 142 | var last = path.length - 1 143 | var lastC = path.charAt(last) 144 | 145 | // If the uri ends with `#`, just return it without '#' 146 | if (lastC === "#") { 147 | return path.substring(0, last) 148 | } 149 | 150 | return (path.substring(last - 2) === ".js" || 151 | path.indexOf("?") > 0 || 152 | lastC === "/") ? path : path + ".js" 153 | } 154 | 155 | 156 | var PATHS_RE = /^([^/:]+)(\/.+)$/ 157 | var VARS_RE = /{([^{]+)}/g 158 | 159 | function parseAlias(id) { 160 | var alias = data.alias 161 | return alias && isString(alias[id]) ? alias[id] : id 162 | } 163 | 164 | function parsePaths(id) { 165 | var paths = data.paths 166 | var m 167 | 168 | if (paths && (m = id.match(PATHS_RE)) && isString(paths[m[1]])) { 169 | id = paths[m[1]] + m[2] 170 | } 171 | 172 | return id 173 | } 174 | 175 | function parseVars(id) { 176 | var vars = data.vars 177 | 178 | if (vars && id.indexOf("{") > -1) { 179 | id = id.replace(VARS_RE, function(m, key) { 180 | return isString(vars[key]) ? vars[key] : m 181 | }) 182 | } 183 | 184 | return id 185 | } 186 | 187 | function parseMap(uri) { 188 | var map = data.map 189 | var ret = uri 190 | 191 | if (map) { 192 | for (var i = 0, len = map.length; i < len; i++) { 193 | var rule = map[i] 194 | 195 | ret = isFunction(rule) ? 196 | (rule(uri) || uri) : 197 | uri.replace(rule[0], rule[1]) 198 | 199 | // Only apply the first matched rule 200 | if (ret !== uri) break 201 | } 202 | } 203 | 204 | return ret 205 | } 206 | 207 | 208 | var ABSOLUTE_RE = /^\/\/.|:\// 209 | var ROOT_DIR_RE = /^.*?\/\/.*?\// 210 | 211 | function addBase(id, refUri) { 212 | var ret 213 | var first = id.charAt(0) 214 | 215 | // Absolute 216 | if (ABSOLUTE_RE.test(id)) { 217 | ret = id 218 | } 219 | // Relative 220 | else if (first === ".") { 221 | ret = realpath((refUri ? dirname(refUri) : data.cwd) + id) 222 | } 223 | // Root 224 | else if (first === "/") { 225 | var m = data.cwd.match(ROOT_DIR_RE) 226 | ret = m ? m[0] + id.substring(1) : id 227 | } 228 | // Top-level 229 | else { 230 | ret = data.base + id 231 | } 232 | 233 | // Add default protocol when uri begins with "//" 234 | if (ret.indexOf("//") === 0) { 235 | ret = location.protocol + ret 236 | } 237 | 238 | return ret 239 | } 240 | 241 | function id2Uri(id, refUri) { 242 | if (!id) return "" 243 | 244 | id = parseAlias(id) 245 | id = parsePaths(id) 246 | id = parseVars(id) 247 | id = normalize(id) 248 | 249 | var uri = addBase(id, refUri) 250 | uri = parseMap(uri) 251 | 252 | return uri 253 | } 254 | 255 | 256 | var doc = document 257 | var cwd = (!location.href || location.href.indexOf('about:') === 0) ? '' : dirname(location.href) 258 | var scripts = doc.scripts 259 | 260 | // Recommend to add `seajsnode` id for the `sea.js` script element 261 | var loaderScript = doc.getElementById("seajsnode") || 262 | scripts[scripts.length - 1] 263 | 264 | // When `sea.js` is inline, set loaderDir to current working directory 265 | var loaderDir = dirname(getScriptAbsoluteSrc(loaderScript) || cwd) 266 | 267 | function getScriptAbsoluteSrc(node) { 268 | return node.hasAttribute ? // non-IE6/7 269 | node.src : 270 | // see http://msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx 271 | node.getAttribute("src", 4) 272 | } 273 | 274 | 275 | // For Developers 276 | seajs.resolve = id2Uri 277 | 278 | 279 | /** 280 | * util-request.js - The utilities for requesting script and style files 281 | * ref: tests/research/load-js-css/test.html 282 | */ 283 | 284 | var head = doc.head || doc.getElementsByTagName("head")[0] || doc.documentElement 285 | var baseElement = head.getElementsByTagName("base")[0] 286 | 287 | var currentlyAddingScript 288 | var interactiveScript 289 | 290 | function request(url, callback, charset) { 291 | var node = doc.createElement("script") 292 | 293 | if (charset) { 294 | var cs = isFunction(charset) ? charset(url) : charset 295 | if (cs) { 296 | node.charset = cs 297 | } 298 | } 299 | 300 | addOnload(node, callback, url) 301 | 302 | node.async = true 303 | node.src = url 304 | 305 | // For some cache cases in IE 6-8, the script executes IMMEDIATELY after 306 | // the end of the insert execution, so use `currentlyAddingScript` to 307 | // hold current node, for deriving url in `define` call 308 | currentlyAddingScript = node 309 | 310 | // ref: #185 & http://dev.jquery.com/ticket/2709 311 | baseElement ? 312 | head.insertBefore(node, baseElement) : 313 | head.appendChild(node) 314 | 315 | currentlyAddingScript = null 316 | } 317 | 318 | function addOnload(node, callback, url) { 319 | var supportOnload = "onload" in node 320 | 321 | if (supportOnload) { 322 | node.onload = onload 323 | node.onerror = function() { 324 | emit("error", { uri: url, node: node }) 325 | onload() 326 | } 327 | } 328 | else { 329 | node.onreadystatechange = function() { 330 | if (/loaded|complete/.test(node.readyState)) { 331 | onload() 332 | } 333 | } 334 | } 335 | 336 | function onload() { 337 | // Ensure only run once and handle memory leak in IE 338 | node.onload = node.onerror = node.onreadystatechange = null 339 | 340 | // Remove the script to reduce memory leak 341 | if (!data.debug) { 342 | head.removeChild(node) 343 | } 344 | 345 | // Dereference the node 346 | node = null 347 | 348 | callback() 349 | } 350 | } 351 | 352 | function getCurrentScript() { 353 | if (currentlyAddingScript) { 354 | return currentlyAddingScript 355 | } 356 | 357 | // For IE6-9 browsers, the script onload event may not fire right 358 | // after the script is evaluated. Kris Zyp found that it 359 | // could query the script nodes and the one that is in "interactive" 360 | // mode indicates the current script 361 | // ref: http://goo.gl/JHfFW 362 | if (interactiveScript && interactiveScript.readyState === "interactive") { 363 | return interactiveScript 364 | } 365 | 366 | var scripts = head.getElementsByTagName("script") 367 | 368 | for (var i = scripts.length - 1; i >= 0; i--) { 369 | var script = scripts[i] 370 | if (script.readyState === "interactive") { 371 | interactiveScript = script 372 | return interactiveScript 373 | } 374 | } 375 | } 376 | 377 | 378 | // For Developers 379 | seajs.request = request 380 | 381 | 382 | /** 383 | * util-deps.js - The parser for dependencies 384 | * ref: tests/research/parse-dependencies/test.html 385 | */ 386 | 387 | var REQUIRE_RE = /"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|\/\*[\S\s]*?\*\/|\/(?:\\\/|[^\/\r\n])+\/(?=[^\/])|\/\/.*|\.\s*require|(?:^|[^$])\brequire\s*\(\s*(["'])(.+?)\1\s*\)/g 388 | var SLASH_RE = /\\\\/g 389 | 390 | function parseDependencies(code) { 391 | var ret = [] 392 | 393 | code.replace(SLASH_RE, "") 394 | .replace(REQUIRE_RE, function(m, m1, m2) { 395 | if (m2) { 396 | ret.push(m2) 397 | } 398 | }) 399 | 400 | return ret 401 | } 402 | 403 | 404 | /** 405 | * module.js - The core of module loader 406 | */ 407 | 408 | var cachedMods = seajs.cache = {} 409 | var anonymousMeta 410 | 411 | var fetchingList = {} 412 | var fetchedList = {} 413 | var callbackList = {} 414 | 415 | var STATUS = Module.STATUS = { 416 | // 1 - The `module.uri` is being fetched 417 | FETCHING: 1, 418 | // 2 - The meta data has been saved to cachedMods 419 | SAVED: 2, 420 | // 3 - The `module.dependencies` are being loaded 421 | LOADING: 3, 422 | // 4 - The module are ready to execute 423 | LOADED: 4, 424 | // 5 - The module is being executed 425 | EXECUTING: 5, 426 | // 6 - The `module.exports` is available 427 | EXECUTED: 6 428 | } 429 | 430 | 431 | function Module(uri, deps) { 432 | this.uri = uri 433 | this.dependencies = deps || [] 434 | this.exports = null 435 | this.status = 0 436 | 437 | // Who depends on me 438 | this._waitings = {} 439 | 440 | // The number of unloaded dependencies 441 | this._remain = 0 442 | } 443 | 444 | // Resolve module.dependencies 445 | Module.prototype.resolve = function() { 446 | var mod = this 447 | var ids = mod.dependencies 448 | var uris = [] 449 | 450 | for (var i = 0, len = ids.length; i < len; i++) { 451 | uris[i] = Module.resolve(ids[i], mod.uri) 452 | } 453 | return uris 454 | } 455 | 456 | // Load module.dependencies and fire onload when all done 457 | Module.prototype.load = function() { 458 | var mod = this 459 | 460 | // If the module is being loaded, just wait it onload call 461 | if (mod.status >= STATUS.LOADING) { 462 | return 463 | } 464 | 465 | mod.status = STATUS.LOADING 466 | 467 | // Emit `load` event for plugins such as combo plugin 468 | var uris = mod.resolve() 469 | emit("load", uris) 470 | 471 | var len = mod._remain = uris.length 472 | var m 473 | 474 | // Initialize modules and register waitings 475 | for (var i = 0; i < len; i++) { 476 | m = Module.get(uris[i]) 477 | 478 | if (m.status < STATUS.LOADED) { 479 | // Maybe duplicate: When module has dupliate dependency, it should be it's count, not 1 480 | m._waitings[mod.uri] = (m._waitings[mod.uri] || 0) + 1 481 | } 482 | else { 483 | mod._remain-- 484 | } 485 | } 486 | 487 | if (mod._remain === 0) { 488 | mod.onload() 489 | return 490 | } 491 | 492 | // Begin parallel loading 493 | var requestCache = {} 494 | 495 | for (i = 0; i < len; i++) { 496 | m = cachedMods[uris[i]] 497 | 498 | if (m.status < STATUS.FETCHING) { 499 | m.fetch(requestCache) 500 | } 501 | else if (m.status === STATUS.SAVED) { 502 | m.load() 503 | } 504 | } 505 | 506 | // Send all requests at last to avoid cache bug in IE6-9. Issues#808 507 | for (var requestUri in requestCache) { 508 | if (requestCache.hasOwnProperty(requestUri)) { 509 | requestCache[requestUri]() 510 | } 511 | } 512 | } 513 | 514 | // Call this method when module is loaded 515 | Module.prototype.onload = function() { 516 | var mod = this 517 | mod.status = STATUS.LOADED 518 | 519 | if (mod.callback) { 520 | mod.callback() 521 | } 522 | 523 | // Notify waiting modules to fire onload 524 | var waitings = mod._waitings 525 | var uri, m 526 | 527 | for (uri in waitings) { 528 | if (waitings.hasOwnProperty(uri)) { 529 | m = cachedMods[uri] 530 | m._remain -= waitings[uri] 531 | if (m._remain === 0) { 532 | m.onload() 533 | } 534 | } 535 | } 536 | 537 | // Reduce memory taken 538 | delete mod._waitings 539 | delete mod._remain 540 | } 541 | 542 | // Fetch a module 543 | Module.prototype.fetch = function(requestCache) { 544 | var mod = this 545 | var uri = mod.uri 546 | 547 | mod.status = STATUS.FETCHING 548 | 549 | // Emit `fetch` event for plugins such as combo plugin 550 | var emitData = { uri: uri } 551 | emit("fetch", emitData) 552 | var requestUri = emitData.requestUri || uri 553 | 554 | // Empty uri or a non-CMD module 555 | if (!requestUri || fetchedList[requestUri]) { 556 | mod.load() 557 | return 558 | } 559 | 560 | if (fetchingList[requestUri]) { 561 | callbackList[requestUri].push(mod) 562 | return 563 | } 564 | 565 | fetchingList[requestUri] = true 566 | callbackList[requestUri] = [mod] 567 | 568 | // Emit `request` event for plugins such as text plugin 569 | emit("request", emitData = { 570 | uri: uri, 571 | requestUri: requestUri, 572 | onRequest: onRequest, 573 | charset: data.charset 574 | }) 575 | 576 | if (!emitData.requested) { 577 | requestCache ? 578 | requestCache[emitData.requestUri] = sendRequest : 579 | sendRequest() 580 | } 581 | 582 | function sendRequest() { 583 | seajs.request(emitData.requestUri, emitData.onRequest, emitData.charset) 584 | } 585 | 586 | function onRequest() { 587 | delete fetchingList[requestUri] 588 | fetchedList[requestUri] = true 589 | 590 | // Save meta data of anonymous module 591 | if (anonymousMeta) { 592 | Module.save(uri, anonymousMeta) 593 | anonymousMeta = null 594 | } 595 | 596 | // Call callbacks 597 | var m, mods = callbackList[requestUri] 598 | delete callbackList[requestUri] 599 | while ((m = mods.shift())) m.load() 600 | } 601 | } 602 | 603 | // Execute a module 604 | Module.prototype.exec = function () { 605 | var mod = this 606 | 607 | // When module is executed, DO NOT execute it again. When module 608 | // is being executed, just return `module.exports` too, for avoiding 609 | // circularly calling 610 | if (mod.status >= STATUS.EXECUTING) { 611 | return mod.exports 612 | } 613 | 614 | mod.status = STATUS.EXECUTING 615 | 616 | // Create require 617 | var uri = mod.uri 618 | 619 | function require(id) { 620 | return Module.get(require.resolve(id)).exec() 621 | } 622 | 623 | require.resolve = function(id) { 624 | return Module.resolve(id, uri) 625 | } 626 | 627 | require.async = function(ids, callback) { 628 | Module.use(ids, callback, uri + "_async_" + cid()) 629 | return require 630 | } 631 | 632 | // Exec factory 633 | var factory = mod.factory 634 | 635 | var exports = isFunction(factory) ? 636 | factory(require, mod.exports = {}, mod) : 637 | factory 638 | 639 | if (exports === undefined) { 640 | exports = mod.exports 641 | } 642 | 643 | // Reduce memory leak 644 | delete mod.factory 645 | 646 | mod.exports = exports 647 | mod.status = STATUS.EXECUTED 648 | 649 | // Emit `exec` event 650 | emit("exec", mod) 651 | 652 | return exports 653 | } 654 | 655 | // Resolve id to uri 656 | Module.resolve = function(id, refUri) { 657 | // Emit `resolve` event for plugins such as text plugin 658 | var emitData = { id: id, refUri: refUri } 659 | emit("resolve", emitData) 660 | 661 | return emitData.uri || seajs.resolve(emitData.id, refUri) 662 | } 663 | 664 | // Define a module 665 | Module.define = function (id, deps, factory) { 666 | var argsLen = arguments.length 667 | 668 | // define(factory) 669 | if (argsLen === 1) { 670 | factory = id 671 | id = undefined 672 | } 673 | else if (argsLen === 2) { 674 | factory = deps 675 | 676 | // define(deps, factory) 677 | if (isArray(id)) { 678 | deps = id 679 | id = undefined 680 | } 681 | // define(id, factory) 682 | else { 683 | deps = undefined 684 | } 685 | } 686 | 687 | // Parse dependencies according to the module factory code 688 | if (!isArray(deps) && isFunction(factory)) { 689 | deps = parseDependencies(factory.toString()) 690 | } 691 | 692 | var meta = { 693 | id: id, 694 | uri: Module.resolve(id), 695 | deps: deps, 696 | factory: factory 697 | } 698 | 699 | // Try to derive uri in IE6-9 for anonymous modules 700 | if (!meta.uri && doc.attachEvent) { 701 | var script = getCurrentScript() 702 | 703 | if (script) { 704 | meta.uri = script.src 705 | } 706 | 707 | // NOTE: If the id-deriving methods above is failed, then falls back 708 | // to use onload event to get the uri 709 | } 710 | 711 | // Emit `define` event, used in nocache plugin, seajs node version etc 712 | emit("define", meta) 713 | 714 | meta.uri ? Module.save(meta.uri, meta) : 715 | // Save information for "saving" work in the script onload event 716 | anonymousMeta = meta 717 | } 718 | 719 | // Save meta data to cachedMods 720 | Module.save = function(uri, meta) { 721 | var mod = Module.get(uri) 722 | 723 | // Do NOT override already saved modules 724 | if (mod.status < STATUS.SAVED) { 725 | mod.id = meta.id || uri 726 | mod.dependencies = meta.deps || [] 727 | mod.factory = meta.factory 728 | mod.status = STATUS.SAVED 729 | 730 | emit("save", mod) 731 | } 732 | } 733 | 734 | // Get an existed module or create a new one 735 | Module.get = function(uri, deps) { 736 | return cachedMods[uri] || (cachedMods[uri] = new Module(uri, deps)) 737 | } 738 | 739 | // Use function is equal to load a anonymous module 740 | Module.use = function (ids, callback, uri) { 741 | var mod = Module.get(uri, isArray(ids) ? ids : [ids]) 742 | 743 | mod.callback = function() { 744 | var exports = [] 745 | var uris = mod.resolve() 746 | 747 | for (var i = 0, len = uris.length; i < len; i++) { 748 | exports[i] = cachedMods[uris[i]].exec() 749 | } 750 | 751 | if (callback) { 752 | callback.apply(global, exports) 753 | } 754 | 755 | delete mod.callback 756 | } 757 | 758 | mod.load() 759 | } 760 | 761 | 762 | // Public API 763 | 764 | seajs.use = function(ids, callback) { 765 | Module.use(ids, callback, data.cwd + "_use_" + cid()) 766 | return seajs 767 | } 768 | 769 | Module.define.cmd = {} 770 | global.define = Module.define 771 | 772 | 773 | // For Developers 774 | 775 | seajs.Module = Module 776 | data.fetchedList = fetchedList 777 | data.cid = cid 778 | 779 | seajs.require = function(id) { 780 | var mod = Module.get(Module.resolve(id)) 781 | if (mod.status < STATUS.EXECUTING) { 782 | mod.onload() 783 | mod.exec() 784 | } 785 | return mod.exports 786 | } 787 | 788 | 789 | /** 790 | * config.js - The configuration for the loader 791 | */ 792 | 793 | // The root path to use for id2uri parsing 794 | data.base = loaderDir 795 | 796 | // The loader directory 797 | data.dir = loaderDir 798 | 799 | // The current working directory 800 | data.cwd = cwd 801 | 802 | // The charset for requesting files 803 | data.charset = "utf-8" 804 | 805 | // data.alias - An object containing shorthands of module id 806 | // data.paths - An object containing path shorthands in module id 807 | // data.vars - The {xxx} variables in module id 808 | // data.map - An array containing rules to map module uri 809 | // data.debug - Debug mode. The default value is false 810 | 811 | seajs.config = function(configData) { 812 | 813 | for (var key in configData) { 814 | var curr = configData[key] 815 | var prev = data[key] 816 | 817 | // Merge object config such as alias, vars 818 | if (prev && isObject(prev)) { 819 | for (var k in curr) { 820 | prev[k] = curr[k] 821 | } 822 | } 823 | else { 824 | // Concat array config such as map 825 | if (isArray(prev)) { 826 | curr = prev.concat(curr) 827 | } 828 | // Make sure that `data.base` is an absolute path 829 | else if (key === "base") { 830 | // Make sure end with "/" 831 | if (curr.slice(-1) !== "/") { 832 | curr += "/" 833 | } 834 | curr = addBase(curr) 835 | } 836 | 837 | // Set config 838 | data[key] = curr 839 | } 840 | } 841 | 842 | emit("config", configData) 843 | return seajs 844 | } 845 | 846 | })(this); 847 | -------------------------------------------------------------------------------- /requirejs/libs/require.debug.js: -------------------------------------------------------------------------------- 1 | /** vim: et:ts=4:sw=4:sts=4 2 | * @license RequireJS 2.1.14 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved. 3 | * Available via the MIT or new BSD license. 4 | * see: http://github.com/jrburke/requirejs for details 5 | */ 6 | //Not using strict: uneven strict support in browsers, #392, and causes 7 | //problems with requirejs.exec()/transpiler plugins that may not be strict. 8 | /*jslint regexp: true, nomen: true, sloppy: true */ 9 | /*global window, navigator, document, importScripts, setTimeout, opera */ 10 | 11 | var requirejs, require, define; 12 | (function (global) { 13 | var req, s, head, baseElement, dataMain, src, 14 | interactiveScript, currentlyAddingScript, mainScript, subPath, 15 | version = '2.1.14', 16 | commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg, 17 | cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g, 18 | jsSuffixRegExp = /\.js$/, 19 | currDirRegExp = /^\.\//, 20 | op = Object.prototype, 21 | ostring = op.toString, 22 | hasOwn = op.hasOwnProperty, 23 | ap = Array.prototype, 24 | apsp = ap.splice, 25 | isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document), 26 | isWebWorker = !isBrowser && typeof importScripts !== 'undefined', 27 | //PS3 indicates loaded and complete, but need to wait for complete 28 | //specifically. Sequence is 'loading', 'loaded', execution, 29 | // then 'complete'. The UA check is unfortunate, but not sure how 30 | //to feature test w/o causing perf issues. 31 | readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ? 32 | /^complete$/ : /^(complete|loaded)$/, 33 | defContextName = '_', 34 | //Oh the tragedy, detecting opera. See the usage of isOpera for reason. 35 | isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]', 36 | contexts = {}, 37 | cfg = {}, 38 | globalDefQueue = [], 39 | useInteractive = false; 40 | 41 | function isFunction(it) { 42 | return ostring.call(it) === '[object Function]'; 43 | } 44 | 45 | function isArray(it) { 46 | return ostring.call(it) === '[object Array]'; 47 | } 48 | 49 | /** 50 | * Helper function for iterating over an array. If the func returns 51 | * a true value, it will break out of the loop. 52 | */ 53 | function each(ary, func) { 54 | if (ary) { 55 | var i; 56 | for (i = 0; i < ary.length; i += 1) { 57 | if (ary[i] && func(ary[i], i, ary)) { 58 | break; 59 | } 60 | } 61 | } 62 | } 63 | 64 | /** 65 | * Helper function for iterating over an array backwards. If the func 66 | * returns a true value, it will break out of the loop. 67 | */ 68 | function eachReverse(ary, func) { 69 | if (ary) { 70 | var i; 71 | for (i = ary.length - 1; i > -1; i -= 1) { 72 | if (ary[i] && func(ary[i], i, ary)) { 73 | break; 74 | } 75 | } 76 | } 77 | } 78 | 79 | function hasProp(obj, prop) { 80 | return hasOwn.call(obj, prop); 81 | } 82 | 83 | function getOwn(obj, prop) { 84 | return hasProp(obj, prop) && obj[prop]; 85 | } 86 | 87 | /** 88 | * Cycles over properties in an object and calls a function for each 89 | * property value. If the function returns a truthy value, then the 90 | * iteration is stopped. 91 | */ 92 | function eachProp(obj, func) { 93 | var prop; 94 | for (prop in obj) { 95 | if (hasProp(obj, prop)) { 96 | if (func(obj[prop], prop)) { 97 | break; 98 | } 99 | } 100 | } 101 | } 102 | 103 | /** 104 | * Simple function to mix in properties from source into target, 105 | * but only if target does not already have a property of the same name. 106 | */ 107 | function mixin(target, source, force, deepStringMixin) { 108 | if (source) { 109 | eachProp(source, function (value, prop) { 110 | if (force || !hasProp(target, prop)) { 111 | if (deepStringMixin && typeof value === 'object' && value && 112 | !isArray(value) && !isFunction(value) && 113 | !(value instanceof RegExp)) { 114 | 115 | if (!target[prop]) { 116 | target[prop] = {}; 117 | } 118 | mixin(target[prop], value, force, deepStringMixin); 119 | } else { 120 | target[prop] = value; 121 | } 122 | } 123 | }); 124 | } 125 | return target; 126 | } 127 | 128 | //Similar to Function.prototype.bind, but the 'this' object is specified 129 | //first, since it is easier to read/figure out what 'this' will be. 130 | function bind(obj, fn) { 131 | return function () { 132 | return fn.apply(obj, arguments); 133 | }; 134 | } 135 | 136 | function scripts() { 137 | return document.getElementsByTagName('script'); 138 | } 139 | 140 | function defaultOnError(err) { 141 | throw err; 142 | } 143 | 144 | //Allow getting a global that is expressed in 145 | //dot notation, like 'a.b.c'. 146 | function getGlobal(value) { 147 | if (!value) { 148 | return value; 149 | } 150 | var g = global; 151 | each(value.split('.'), function (part) { 152 | g = g[part]; 153 | }); 154 | return g; 155 | } 156 | 157 | /** 158 | * Constructs an error with a pointer to an URL with more information. 159 | * @param {String} id the error ID that maps to an ID on a web page. 160 | * @param {String} message human readable error. 161 | * @param {Error} [err] the original error, if there is one. 162 | * 163 | * @returns {Error} 164 | */ 165 | function makeError(id, msg, err, requireModules) { 166 | var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html#' + id); 167 | e.requireType = id; 168 | e.requireModules = requireModules; 169 | if (err) { 170 | e.originalError = err; 171 | } 172 | return e; 173 | } 174 | 175 | if (typeof define !== 'undefined') { 176 | //If a define is already in play via another AMD loader, 177 | //do not overwrite. 178 | return; 179 | } 180 | 181 | if (typeof requirejs !== 'undefined') { 182 | if (isFunction(requirejs)) { 183 | //Do not overwrite an existing requirejs instance. 184 | return; 185 | } 186 | cfg = requirejs; 187 | requirejs = undefined; 188 | } 189 | 190 | //Allow for a require config object 191 | if (typeof require !== 'undefined' && !isFunction(require)) { 192 | //assume it is a config object. 193 | cfg = require; 194 | require = undefined; 195 | } 196 | 197 | function newContext(contextName) { 198 | var inCheckLoaded, Module, context, handlers, 199 | checkLoadedTimeoutId, 200 | config = { 201 | //Defaults. Do not set a default for map 202 | //config to speed up normalize(), which 203 | //will run faster if there is no default. 204 | waitSeconds: 7, 205 | baseUrl: './', 206 | paths: {}, 207 | bundles: {}, 208 | pkgs: {}, 209 | shim: {}, 210 | config: {} 211 | }, 212 | registry = {}, 213 | //registry of just enabled modules, to speed 214 | //cycle breaking code when lots of modules 215 | //are registered, but not activated. 216 | enabledRegistry = {}, 217 | undefEvents = {}, 218 | defQueue = [], 219 | defined = {}, 220 | urlFetched = {}, 221 | bundlesMap = {}, 222 | requireCounter = 1, 223 | unnormalizedCounter = 1; 224 | 225 | /** 226 | * Trims the . and .. from an array of path segments. 227 | * It will keep a leading path segment if a .. will become 228 | * the first path segment, to help with module name lookups, 229 | * which act like paths, but can be remapped. But the end result, 230 | * all paths that use this function should look normalized. 231 | * NOTE: this method MODIFIES the input array. 232 | * @param {Array} ary the array of path segments. 233 | */ 234 | function trimDots(ary) { 235 | var i, part; 236 | for (i = 0; i < ary.length; i++) { 237 | part = ary[i]; 238 | if (part === '.') { 239 | ary.splice(i, 1); 240 | i -= 1; 241 | } else if (part === '..') { 242 | // If at the start, or previous value is still .., 243 | // keep them so that when converted to a path it may 244 | // still work when converted to a path, even though 245 | // as an ID it is less than ideal. In larger point 246 | // releases, may be better to just kick out an error. 247 | if (i === 0 || (i == 1 && ary[2] === '..') || ary[i - 1] === '..') { 248 | continue; 249 | } else if (i > 0) { 250 | ary.splice(i - 1, 2); 251 | i -= 2; 252 | } 253 | } 254 | } 255 | } 256 | 257 | /** 258 | * Given a relative module name, like ./something, normalize it to 259 | * a real name that can be mapped to a path. 260 | * @param {String} name the relative name 261 | * @param {String} baseName a real name that the name arg is relative 262 | * to. 263 | * @param {Boolean} applyMap apply the map config to the value. Should 264 | * only be done if this normalization is for a dependency ID. 265 | * @returns {String} normalized name 266 | */ 267 | function normalize(name, baseName, applyMap) { 268 | var pkgMain, mapValue, nameParts, i, j, nameSegment, lastIndex, 269 | foundMap, foundI, foundStarMap, starI, normalizedBaseParts, 270 | baseParts = (baseName && baseName.split('/')), 271 | map = config.map, 272 | starMap = map && map['*']; 273 | 274 | //Adjust any relative paths. 275 | if (name) { 276 | name = name.split('/'); 277 | lastIndex = name.length - 1; 278 | 279 | // If wanting node ID compatibility, strip .js from end 280 | // of IDs. Have to do this here, and not in nameToUrl 281 | // because node allows either .js or non .js to map 282 | // to same file. 283 | if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { 284 | name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); 285 | } 286 | 287 | // Starts with a '.' so need the baseName 288 | if (name[0].charAt(0) === '.' && baseParts) { 289 | //Convert baseName to array, and lop off the last part, 290 | //so that . matches that 'directory' and not name of the baseName's 291 | //module. For instance, baseName of 'one/two/three', maps to 292 | //'one/two/three.js', but we want the directory, 'one/two' for 293 | //this normalization. 294 | normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); 295 | name = normalizedBaseParts.concat(name); 296 | } 297 | 298 | trimDots(name); 299 | name = name.join('/'); 300 | } 301 | 302 | //Apply map config if available. 303 | if (applyMap && map && (baseParts || starMap)) { 304 | nameParts = name.split('/'); 305 | 306 | outerLoop: for (i = nameParts.length; i > 0; i -= 1) { 307 | nameSegment = nameParts.slice(0, i).join('/'); 308 | 309 | if (baseParts) { 310 | //Find the longest baseName segment match in the config. 311 | //So, do joins on the biggest to smallest lengths of baseParts. 312 | for (j = baseParts.length; j > 0; j -= 1) { 313 | mapValue = getOwn(map, baseParts.slice(0, j).join('/')); 314 | 315 | //baseName segment has config, find if it has one for 316 | //this name. 317 | if (mapValue) { 318 | mapValue = getOwn(mapValue, nameSegment); 319 | if (mapValue) { 320 | //Match, update name to the new value. 321 | foundMap = mapValue; 322 | foundI = i; 323 | break outerLoop; 324 | } 325 | } 326 | } 327 | } 328 | 329 | //Check for a star map match, but just hold on to it, 330 | //if there is a shorter segment match later in a matching 331 | //config, then favor over this star map. 332 | if (!foundStarMap && starMap && getOwn(starMap, nameSegment)) { 333 | foundStarMap = getOwn(starMap, nameSegment); 334 | starI = i; 335 | } 336 | } 337 | 338 | if (!foundMap && foundStarMap) { 339 | foundMap = foundStarMap; 340 | foundI = starI; 341 | } 342 | 343 | if (foundMap) { 344 | nameParts.splice(0, foundI, foundMap); 345 | name = nameParts.join('/'); 346 | } 347 | } 348 | 349 | // If the name points to a package's name, use 350 | // the package main instead. 351 | pkgMain = getOwn(config.pkgs, name); 352 | 353 | return pkgMain ? pkgMain : name; 354 | } 355 | 356 | function removeScript(name) { 357 | if (isBrowser) { 358 | each(scripts(), function (scriptNode) { 359 | if (scriptNode.getAttribute('data-requiremodule') === name && 360 | scriptNode.getAttribute('data-requirecontext') === context.contextName) { 361 | scriptNode.parentNode.removeChild(scriptNode); 362 | return true; 363 | } 364 | }); 365 | } 366 | } 367 | 368 | function hasPathFallback(id) { 369 | var pathConfig = getOwn(config.paths, id); 370 | if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) { 371 | //Pop off the first array value, since it failed, and 372 | //retry 373 | pathConfig.shift(); 374 | context.require.undef(id); 375 | 376 | //Custom require that does not do map translation, since 377 | //ID is "absolute", already mapped/resolved. 378 | context.makeRequire(null, { 379 | skipMap: true 380 | })([id]); 381 | 382 | return true; 383 | } 384 | } 385 | 386 | //Turns a plugin!resource to [plugin, resource] 387 | //with the plugin being undefined if the name 388 | //did not have a plugin prefix. 389 | function splitPrefix(name) { 390 | var prefix, 391 | index = name ? name.indexOf('!') : -1; 392 | if (index > -1) { 393 | prefix = name.substring(0, index); 394 | name = name.substring(index + 1, name.length); 395 | } 396 | return [prefix, name]; 397 | } 398 | 399 | /** 400 | * Creates a module mapping that includes plugin prefix, module 401 | * name, and path. If parentModuleMap is provided it will 402 | * also normalize the name via require.normalize() 403 | * 404 | * @param {String} name the module name 405 | * @param {String} [parentModuleMap] parent module map 406 | * for the module name, used to resolve relative names. 407 | * @param {Boolean} isNormalized: is the ID already normalized. 408 | * This is true if this call is done for a define() module ID. 409 | * @param {Boolean} applyMap: apply the map config to the ID. 410 | * Should only be true if this map is for a dependency. 411 | * 412 | * @returns {Object} 413 | */ 414 | function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) { 415 | var url, pluginModule, suffix, nameParts, 416 | prefix = null, 417 | parentName = parentModuleMap ? parentModuleMap.name : null, 418 | originalName = name, 419 | isDefine = true, 420 | normalizedName = ''; 421 | 422 | //If no name, then it means it is a require call, generate an 423 | //internal name. 424 | if (!name) { 425 | isDefine = false; 426 | name = '_@r' + (requireCounter += 1); 427 | } 428 | 429 | nameParts = splitPrefix(name); 430 | prefix = nameParts[0]; 431 | name = nameParts[1]; 432 | 433 | if (prefix) { 434 | prefix = normalize(prefix, parentName, applyMap); 435 | pluginModule = getOwn(defined, prefix); 436 | } 437 | 438 | //Account for relative paths if there is a base name. 439 | if (name) { 440 | if (prefix) { 441 | if (pluginModule && pluginModule.normalize) { 442 | //Plugin is loaded, use its normalize method. 443 | normalizedName = pluginModule.normalize(name, function (name) { 444 | return normalize(name, parentName, applyMap); 445 | }); 446 | } else { 447 | // If nested plugin references, then do not try to 448 | // normalize, as it will not normalize correctly. This 449 | // places a restriction on resourceIds, and the longer 450 | // term solution is not to normalize until plugins are 451 | // loaded and all normalizations to allow for async 452 | // loading of a loader plugin. But for now, fixes the 453 | // common uses. Details in #1131 454 | normalizedName = name.indexOf('!') === -1 ? 455 | normalize(name, parentName, applyMap) : 456 | name; 457 | } 458 | } else { 459 | //A regular module. 460 | normalizedName = normalize(name, parentName, applyMap); 461 | 462 | //Normalized name may be a plugin ID due to map config 463 | //application in normalize. The map config values must 464 | //already be normalized, so do not need to redo that part. 465 | nameParts = splitPrefix(normalizedName); 466 | prefix = nameParts[0]; 467 | normalizedName = nameParts[1]; 468 | isNormalized = true; 469 | 470 | url = context.nameToUrl(normalizedName); 471 | } 472 | } 473 | 474 | //If the id is a plugin id that cannot be determined if it needs 475 | //normalization, stamp it with a unique ID so two matching relative 476 | //ids that may conflict can be separate. 477 | suffix = prefix && !pluginModule && !isNormalized ? 478 | '_unnormalized' + (unnormalizedCounter += 1) : 479 | ''; 480 | 481 | return { 482 | prefix: prefix, 483 | name: normalizedName, 484 | parentMap: parentModuleMap, 485 | unnormalized: !!suffix, 486 | url: url, 487 | originalName: originalName, 488 | isDefine: isDefine, 489 | id: (prefix ? 490 | prefix + '!' + normalizedName : 491 | normalizedName) + suffix 492 | }; 493 | } 494 | 495 | function getModule(depMap) { 496 | var id = depMap.id, 497 | mod = getOwn(registry, id); 498 | 499 | if (!mod) { 500 | mod = registry[id] = new context.Module(depMap); 501 | } 502 | 503 | return mod; 504 | } 505 | 506 | function on(depMap, name, fn) { 507 | var id = depMap.id, 508 | mod = getOwn(registry, id); 509 | 510 | if (hasProp(defined, id) && 511 | (!mod || mod.defineEmitComplete)) { 512 | if (name === 'defined') { 513 | fn(defined[id]); 514 | } 515 | } else { 516 | mod = getModule(depMap); 517 | if (mod.error && name === 'error') { 518 | fn(mod.error); 519 | } else { 520 | mod.on(name, fn); 521 | } 522 | } 523 | } 524 | 525 | function onError(err, errback) { 526 | var ids = err.requireModules, 527 | notified = false; 528 | 529 | if (errback) { 530 | errback(err); 531 | } else { 532 | each(ids, function (id) { 533 | var mod = getOwn(registry, id); 534 | if (mod) { 535 | //Set error on module, so it skips timeout checks. 536 | mod.error = err; 537 | if (mod.events.error) { 538 | notified = true; 539 | mod.emit('error', err); 540 | } 541 | } 542 | }); 543 | 544 | if (!notified) { 545 | req.onError(err); 546 | } 547 | } 548 | } 549 | 550 | /** 551 | * Internal method to transfer globalQueue items to this context's 552 | * defQueue. 553 | */ 554 | function takeGlobalQueue() { 555 | //Push all the globalDefQueue items into the context's defQueue 556 | if (globalDefQueue.length) { 557 | //Array splice in the values since the context code has a 558 | //local var ref to defQueue, so cannot just reassign the one 559 | //on context. 560 | apsp.apply(defQueue, 561 | [defQueue.length, 0].concat(globalDefQueue)); 562 | globalDefQueue = []; 563 | } 564 | } 565 | 566 | handlers = { 567 | 'require': function (mod) { 568 | if (mod.require) { 569 | return mod.require; 570 | } else { 571 | return (mod.require = context.makeRequire(mod.map)); 572 | } 573 | }, 574 | 'exports': function (mod) { 575 | mod.usingExports = true; 576 | if (mod.map.isDefine) { 577 | if (mod.exports) { 578 | return (defined[mod.map.id] = mod.exports); 579 | } else { 580 | return (mod.exports = defined[mod.map.id] = {}); 581 | } 582 | } 583 | }, 584 | 'module': function (mod) { 585 | if (mod.module) { 586 | return mod.module; 587 | } else { 588 | return (mod.module = { 589 | id: mod.map.id, 590 | uri: mod.map.url, 591 | config: function () { 592 | return getOwn(config.config, mod.map.id) || {}; 593 | }, 594 | exports: mod.exports || (mod.exports = {}) 595 | }); 596 | } 597 | } 598 | }; 599 | 600 | function cleanRegistry(id) { 601 | //Clean up machinery used for waiting modules. 602 | delete registry[id]; 603 | delete enabledRegistry[id]; 604 | } 605 | 606 | function breakCycle(mod, traced, processed) { 607 | var id = mod.map.id; 608 | 609 | if (mod.error) { 610 | mod.emit('error', mod.error); 611 | } else { 612 | traced[id] = true; 613 | each(mod.depMaps, function (depMap, i) { 614 | var depId = depMap.id, 615 | dep = getOwn(registry, depId); 616 | 617 | //Only force things that have not completed 618 | //being defined, so still in the registry, 619 | //and only if it has not been matched up 620 | //in the module already. 621 | if (dep && !mod.depMatched[i] && !processed[depId]) { 622 | if (getOwn(traced, depId)) { 623 | mod.defineDep(i, defined[depId]); 624 | mod.check(); //pass false? 625 | } else { 626 | breakCycle(dep, traced, processed); 627 | } 628 | } 629 | }); 630 | processed[id] = true; 631 | } 632 | } 633 | 634 | function checkLoaded() { 635 | var err, usingPathFallback, 636 | waitInterval = config.waitSeconds * 1000, 637 | //It is possible to disable the wait interval by using waitSeconds of 0. 638 | expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(), 639 | noLoads = [], 640 | reqCalls = [], 641 | stillLoading = false, 642 | needCycleCheck = true; 643 | 644 | //Do not bother if this call was a result of a cycle break. 645 | if (inCheckLoaded) { 646 | return; 647 | } 648 | 649 | inCheckLoaded = true; 650 | 651 | //Figure out the state of all the modules. 652 | eachProp(enabledRegistry, function (mod) { 653 | var map = mod.map, 654 | modId = map.id; 655 | 656 | //Skip things that are not enabled or in error state. 657 | if (!mod.enabled) { 658 | return; 659 | } 660 | 661 | if (!map.isDefine) { 662 | reqCalls.push(mod); 663 | } 664 | 665 | if (!mod.error) { 666 | //If the module should be executed, and it has not 667 | //been inited and time is up, remember it. 668 | if (!mod.inited && expired) { 669 | if (hasPathFallback(modId)) { 670 | usingPathFallback = true; 671 | stillLoading = true; 672 | } else { 673 | noLoads.push(modId); 674 | removeScript(modId); 675 | } 676 | } else if (!mod.inited && mod.fetched && map.isDefine) { 677 | stillLoading = true; 678 | if (!map.prefix) { 679 | //No reason to keep looking for unfinished 680 | //loading. If the only stillLoading is a 681 | //plugin resource though, keep going, 682 | //because it may be that a plugin resource 683 | //is waiting on a non-plugin cycle. 684 | return (needCycleCheck = false); 685 | } 686 | } 687 | } 688 | }); 689 | 690 | if (expired && noLoads.length) { 691 | //If wait time expired, throw error of unloaded modules. 692 | err = makeError('timeout', 'Load timeout for modules: ' + noLoads, null, noLoads); 693 | err.contextName = context.contextName; 694 | return onError(err); 695 | } 696 | 697 | //Not expired, check for a cycle. 698 | if (needCycleCheck) { 699 | each(reqCalls, function (mod) { 700 | breakCycle(mod, {}, {}); 701 | }); 702 | } 703 | 704 | //If still waiting on loads, and the waiting load is something 705 | //other than a plugin resource, or there are still outstanding 706 | //scripts, then just try back later. 707 | if ((!expired || usingPathFallback) && stillLoading) { 708 | //Something is still waiting to load. Wait for it, but only 709 | //if a timeout is not already in effect. 710 | if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) { 711 | checkLoadedTimeoutId = setTimeout(function () { 712 | checkLoadedTimeoutId = 0; 713 | checkLoaded(); 714 | }, 50); 715 | } 716 | } 717 | 718 | inCheckLoaded = false; 719 | } 720 | 721 | Module = function (map) { 722 | this.events = getOwn(undefEvents, map.id) || {}; 723 | this.map = map; 724 | this.shim = getOwn(config.shim, map.id); 725 | this.depExports = []; 726 | this.depMaps = []; 727 | this.depMatched = []; 728 | this.pluginMaps = {}; 729 | this.depCount = 0; 730 | 731 | /* this.exports this.factory 732 | this.depMaps = [], 733 | this.enabled, this.fetched 734 | */ 735 | }; 736 | 737 | Module.prototype = { 738 | init: function (depMaps, factory, errback, options) { 739 | options = options || {}; 740 | 741 | //Do not do more inits if already done. Can happen if there 742 | //are multiple define calls for the same module. That is not 743 | //a normal, common case, but it is also not unexpected. 744 | if (this.inited) { 745 | return; 746 | } 747 | 748 | this.factory = factory; 749 | 750 | if (errback) { 751 | //Register for errors on this module. 752 | this.on('error', errback); 753 | } else if (this.events.error) { 754 | //If no errback already, but there are error listeners 755 | //on this module, set up an errback to pass to the deps. 756 | errback = bind(this, function (err) { 757 | this.emit('error', err); 758 | }); 759 | } 760 | 761 | //Do a copy of the dependency array, so that 762 | //source inputs are not modified. For example 763 | //"shim" deps are passed in here directly, and 764 | //doing a direct modification of the depMaps array 765 | //would affect that config. 766 | this.depMaps = depMaps && depMaps.slice(0); 767 | 768 | this.errback = errback; 769 | 770 | //Indicate this module has be initialized 771 | this.inited = true; 772 | 773 | this.ignore = options.ignore; 774 | 775 | //Could have option to init this module in enabled mode, 776 | //or could have been previously marked as enabled. However, 777 | //the dependencies are not known until init is called. So 778 | //if enabled previously, now trigger dependencies as enabled. 779 | if (options.enabled || this.enabled) { 780 | //Enable this module and dependencies. 781 | //Will call this.check() 782 | this.enable(); 783 | } else { 784 | this.check(); 785 | } 786 | }, 787 | 788 | defineDep: function (i, depExports) { 789 | //Because of cycles, defined callback for a given 790 | //export can be called more than once. 791 | if (!this.depMatched[i]) { 792 | this.depMatched[i] = true; 793 | this.depCount -= 1; 794 | this.depExports[i] = depExports; 795 | } 796 | }, 797 | 798 | fetch: function () { 799 | if (this.fetched) { 800 | return; 801 | } 802 | this.fetched = true; 803 | 804 | context.startTime = (new Date()).getTime(); 805 | 806 | var map = this.map; 807 | 808 | //If the manager is for a plugin managed resource, 809 | //ask the plugin to load it now. 810 | if (this.shim) { 811 | context.makeRequire(this.map, { 812 | enableBuildCallback: true 813 | })(this.shim.deps || [], bind(this, function () { 814 | return map.prefix ? this.callPlugin() : this.load(); 815 | })); 816 | } else { 817 | //Regular dependency. 818 | return map.prefix ? this.callPlugin() : this.load(); 819 | } 820 | }, 821 | 822 | load: function () { 823 | var url = this.map.url; 824 | 825 | //Regular dependency. 826 | if (!urlFetched[url]) { 827 | urlFetched[url] = true; 828 | context.load(this.map.id, url); 829 | } 830 | }, 831 | 832 | /** 833 | * Checks if the module is ready to define itself, and if so, 834 | * define it. 835 | */ 836 | check: function () { 837 | if (!this.enabled || this.enabling) { 838 | return; 839 | } 840 | 841 | var err, cjsModule, 842 | id = this.map.id, 843 | depExports = this.depExports, 844 | exports = this.exports, 845 | factory = this.factory; 846 | 847 | if (!this.inited) { 848 | this.fetch(); 849 | } else if (this.error) { 850 | this.emit('error', this.error); 851 | } else if (!this.defining) { 852 | //The factory could trigger another require call 853 | //that would result in checking this module to 854 | //define itself again. If already in the process 855 | //of doing that, skip this work. 856 | this.defining = true; 857 | 858 | if (this.depCount < 1 && !this.defined) { 859 | if (isFunction(factory)) { 860 | //If there is an error listener, favor passing 861 | //to that instead of throwing an error. However, 862 | //only do it for define()'d modules. require 863 | //errbacks should not be called for failures in 864 | //their callbacks (#699). However if a global 865 | //onError is set, use that. 866 | if ((this.events.error && this.map.isDefine) || 867 | req.onError !== defaultOnError) { 868 | try { 869 | exports = context.execCb(id, factory, depExports, exports); 870 | } catch (e) { 871 | err = e; 872 | } 873 | } else { 874 | exports = context.execCb(id, factory, depExports, exports); 875 | } 876 | 877 | // Favor return value over exports. If node/cjs in play, 878 | // then will not have a return value anyway. Favor 879 | // module.exports assignment over exports object. 880 | if (this.map.isDefine && exports === undefined) { 881 | cjsModule = this.module; 882 | if (cjsModule) { 883 | exports = cjsModule.exports; 884 | } else if (this.usingExports) { 885 | //exports already set the defined value. 886 | exports = this.exports; 887 | } 888 | } 889 | 890 | if (err) { 891 | err.requireMap = this.map; 892 | err.requireModules = this.map.isDefine ? [this.map.id] : null; 893 | err.requireType = this.map.isDefine ? 'define' : 'require'; 894 | return onError((this.error = err)); 895 | } 896 | 897 | } else { 898 | //Just a literal value 899 | exports = factory; 900 | } 901 | 902 | this.exports = exports; 903 | 904 | if (this.map.isDefine && !this.ignore) { 905 | defined[id] = exports; 906 | 907 | if (req.onResourceLoad) { 908 | req.onResourceLoad(context, this.map, this.depMaps); 909 | } 910 | } 911 | 912 | //Clean up 913 | cleanRegistry(id); 914 | 915 | this.defined = true; 916 | } 917 | 918 | //Finished the define stage. Allow calling check again 919 | //to allow define notifications below in the case of a 920 | //cycle. 921 | this.defining = false; 922 | 923 | if (this.defined && !this.defineEmitted) { 924 | this.defineEmitted = true; 925 | this.emit('defined', this.exports); 926 | this.defineEmitComplete = true; 927 | } 928 | 929 | } 930 | }, 931 | 932 | callPlugin: function () { 933 | var map = this.map, 934 | id = map.id, 935 | //Map already normalized the prefix. 936 | pluginMap = makeModuleMap(map.prefix); 937 | 938 | //Mark this as a dependency for this plugin, so it 939 | //can be traced for cycles. 940 | this.depMaps.push(pluginMap); 941 | 942 | on(pluginMap, 'defined', bind(this, function (plugin) { 943 | var load, normalizedMap, normalizedMod, 944 | bundleId = getOwn(bundlesMap, this.map.id), 945 | name = this.map.name, 946 | parentName = this.map.parentMap ? this.map.parentMap.name : null, 947 | localRequire = context.makeRequire(map.parentMap, { 948 | enableBuildCallback: true 949 | }); 950 | 951 | //If current map is not normalized, wait for that 952 | //normalized name to load instead of continuing. 953 | if (this.map.unnormalized) { 954 | //Normalize the ID if the plugin allows it. 955 | if (plugin.normalize) { 956 | name = plugin.normalize(name, function (name) { 957 | return normalize(name, parentName, true); 958 | }) || ''; 959 | } 960 | 961 | //prefix and name should already be normalized, no need 962 | //for applying map config again either. 963 | normalizedMap = makeModuleMap(map.prefix + '!' + name, 964 | this.map.parentMap); 965 | on(normalizedMap, 966 | 'defined', bind(this, function (value) { 967 | this.init([], function () { return value; }, null, { 968 | enabled: true, 969 | ignore: true 970 | }); 971 | })); 972 | 973 | normalizedMod = getOwn(registry, normalizedMap.id); 974 | if (normalizedMod) { 975 | //Mark this as a dependency for this plugin, so it 976 | //can be traced for cycles. 977 | this.depMaps.push(normalizedMap); 978 | 979 | if (this.events.error) { 980 | normalizedMod.on('error', bind(this, function (err) { 981 | this.emit('error', err); 982 | })); 983 | } 984 | normalizedMod.enable(); 985 | } 986 | 987 | return; 988 | } 989 | 990 | //If a paths config, then just load that file instead to 991 | //resolve the plugin, as it is built into that paths layer. 992 | if (bundleId) { 993 | this.map.url = context.nameToUrl(bundleId); 994 | this.load(); 995 | return; 996 | } 997 | 998 | load = bind(this, function (value) { 999 | this.init([], function () { return value; }, null, { 1000 | enabled: true 1001 | }); 1002 | }); 1003 | 1004 | load.error = bind(this, function (err) { 1005 | this.inited = true; 1006 | this.error = err; 1007 | err.requireModules = [id]; 1008 | 1009 | //Remove temp unnormalized modules for this module, 1010 | //since they will never be resolved otherwise now. 1011 | eachProp(registry, function (mod) { 1012 | if (mod.map.id.indexOf(id + '_unnormalized') === 0) { 1013 | cleanRegistry(mod.map.id); 1014 | } 1015 | }); 1016 | 1017 | onError(err); 1018 | }); 1019 | 1020 | //Allow plugins to load other code without having to know the 1021 | //context or how to 'complete' the load. 1022 | load.fromText = bind(this, function (text, textAlt) { 1023 | /*jslint evil: true */ 1024 | var moduleName = map.name, 1025 | moduleMap = makeModuleMap(moduleName), 1026 | hasInteractive = useInteractive; 1027 | 1028 | //As of 2.1.0, support just passing the text, to reinforce 1029 | //fromText only being called once per resource. Still 1030 | //support old style of passing moduleName but discard 1031 | //that moduleName in favor of the internal ref. 1032 | if (textAlt) { 1033 | text = textAlt; 1034 | } 1035 | 1036 | //Turn off interactive script matching for IE for any define 1037 | //calls in the text, then turn it back on at the end. 1038 | if (hasInteractive) { 1039 | useInteractive = false; 1040 | } 1041 | 1042 | //Prime the system by creating a module instance for 1043 | //it. 1044 | getModule(moduleMap); 1045 | 1046 | //Transfer any config to this other module. 1047 | if (hasProp(config.config, id)) { 1048 | config.config[moduleName] = config.config[id]; 1049 | } 1050 | 1051 | try { 1052 | req.exec(text); 1053 | } catch (e) { 1054 | return onError(makeError('fromtexteval', 1055 | 'fromText eval for ' + id + 1056 | ' failed: ' + e, 1057 | e, 1058 | [id])); 1059 | } 1060 | 1061 | if (hasInteractive) { 1062 | useInteractive = true; 1063 | } 1064 | 1065 | //Mark this as a dependency for the plugin 1066 | //resource 1067 | this.depMaps.push(moduleMap); 1068 | 1069 | //Support anonymous modules. 1070 | context.completeLoad(moduleName); 1071 | 1072 | //Bind the value of that module to the value for this 1073 | //resource ID. 1074 | localRequire([moduleName], load); 1075 | }); 1076 | 1077 | //Use parentName here since the plugin's name is not reliable, 1078 | //could be some weird string with no path that actually wants to 1079 | //reference the parentName's path. 1080 | plugin.load(map.name, localRequire, load, config); 1081 | })); 1082 | 1083 | context.enable(pluginMap, this); 1084 | this.pluginMaps[pluginMap.id] = pluginMap; 1085 | }, 1086 | 1087 | enable: function () { 1088 | enabledRegistry[this.map.id] = this; 1089 | this.enabled = true; 1090 | 1091 | //Set flag mentioning that the module is enabling, 1092 | //so that immediate calls to the defined callbacks 1093 | //for dependencies do not trigger inadvertent load 1094 | //with the depCount still being zero. 1095 | this.enabling = true; 1096 | 1097 | //Enable each dependency 1098 | each(this.depMaps, bind(this, function (depMap, i) { 1099 | var id, mod, handler; 1100 | 1101 | if (typeof depMap === 'string') { 1102 | //Dependency needs to be converted to a depMap 1103 | //and wired up to this module. 1104 | depMap = makeModuleMap(depMap, 1105 | (this.map.isDefine ? this.map : this.map.parentMap), 1106 | false, 1107 | !this.skipMap); 1108 | this.depMaps[i] = depMap; 1109 | 1110 | handler = getOwn(handlers, depMap.id); 1111 | 1112 | if (handler) { 1113 | this.depExports[i] = handler(this); 1114 | return; 1115 | } 1116 | 1117 | this.depCount += 1; 1118 | 1119 | on(depMap, 'defined', bind(this, function (depExports) { 1120 | this.defineDep(i, depExports); 1121 | this.check(); 1122 | })); 1123 | 1124 | if (this.errback) { 1125 | on(depMap, 'error', bind(this, this.errback)); 1126 | } 1127 | } 1128 | 1129 | id = depMap.id; 1130 | mod = registry[id]; 1131 | 1132 | //Skip special modules like 'require', 'exports', 'module' 1133 | //Also, don't call enable if it is already enabled, 1134 | //important in circular dependency cases. 1135 | if (!hasProp(handlers, id) && mod && !mod.enabled) { 1136 | context.enable(depMap, this); 1137 | } 1138 | })); 1139 | 1140 | //Enable each plugin that is used in 1141 | //a dependency 1142 | eachProp(this.pluginMaps, bind(this, function (pluginMap) { 1143 | var mod = getOwn(registry, pluginMap.id); 1144 | if (mod && !mod.enabled) { 1145 | context.enable(pluginMap, this); 1146 | } 1147 | })); 1148 | 1149 | this.enabling = false; 1150 | 1151 | this.check(); 1152 | }, 1153 | 1154 | on: function (name, cb) { 1155 | var cbs = this.events[name]; 1156 | if (!cbs) { 1157 | cbs = this.events[name] = []; 1158 | } 1159 | cbs.push(cb); 1160 | }, 1161 | 1162 | emit: function (name, evt) { 1163 | each(this.events[name], function (cb) { 1164 | cb(evt); 1165 | }); 1166 | if (name === 'error') { 1167 | //Now that the error handler was triggered, remove 1168 | //the listeners, since this broken Module instance 1169 | //can stay around for a while in the registry. 1170 | delete this.events[name]; 1171 | } 1172 | } 1173 | }; 1174 | 1175 | function callGetModule(args) { 1176 | //Skip modules already defined. 1177 | if (!hasProp(defined, args[0])) { 1178 | getModule(makeModuleMap(args[0], null, true)).init(args[1], args[2]); 1179 | } 1180 | } 1181 | 1182 | function removeListener(node, func, name, ieName) { 1183 | //Favor detachEvent because of IE9 1184 | //issue, see attachEvent/addEventListener comment elsewhere 1185 | //in this file. 1186 | if (node.detachEvent && !isOpera) { 1187 | //Probably IE. If not it will throw an error, which will be 1188 | //useful to know. 1189 | if (ieName) { 1190 | node.detachEvent(ieName, func); 1191 | } 1192 | } else { 1193 | node.removeEventListener(name, func, false); 1194 | } 1195 | } 1196 | 1197 | /** 1198 | * Given an event from a script node, get the requirejs info from it, 1199 | * and then removes the event listeners on the node. 1200 | * @param {Event} evt 1201 | * @returns {Object} 1202 | */ 1203 | function getScriptData(evt) { 1204 | //Using currentTarget instead of target for Firefox 2.0's sake. Not 1205 | //all old browsers will be supported, but this one was easy enough 1206 | //to support and still makes sense. 1207 | var node = evt.currentTarget || evt.srcElement; 1208 | 1209 | //Remove the listeners once here. 1210 | removeListener(node, context.onScriptLoad, 'load', 'onreadystatechange'); 1211 | removeListener(node, context.onScriptError, 'error'); 1212 | 1213 | return { 1214 | node: node, 1215 | id: node && node.getAttribute('data-requiremodule') 1216 | }; 1217 | } 1218 | 1219 | function intakeDefines() { 1220 | var args; 1221 | 1222 | //Any defined modules in the global queue, intake them now. 1223 | takeGlobalQueue(); 1224 | 1225 | //Make sure any remaining defQueue items get properly processed. 1226 | while (defQueue.length) { 1227 | args = defQueue.shift(); 1228 | if (args[0] === null) { 1229 | return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1])); 1230 | } else { 1231 | //args are id, deps, factory. Should be normalized by the 1232 | //define() function. 1233 | callGetModule(args); 1234 | } 1235 | } 1236 | } 1237 | 1238 | context = { 1239 | config: config, 1240 | contextName: contextName, 1241 | registry: registry, 1242 | defined: defined, 1243 | urlFetched: urlFetched, 1244 | defQueue: defQueue, 1245 | Module: Module, 1246 | makeModuleMap: makeModuleMap, 1247 | nextTick: req.nextTick, 1248 | onError: onError, 1249 | 1250 | /** 1251 | * Set a configuration for the context. 1252 | * @param {Object} cfg config object to integrate. 1253 | */ 1254 | configure: function (cfg) { 1255 | //Make sure the baseUrl ends in a slash. 1256 | if (cfg.baseUrl) { 1257 | if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== '/') { 1258 | cfg.baseUrl += '/'; 1259 | } 1260 | } 1261 | 1262 | //Save off the paths since they require special processing, 1263 | //they are additive. 1264 | var shim = config.shim, 1265 | objs = { 1266 | paths: true, 1267 | bundles: true, 1268 | config: true, 1269 | map: true 1270 | }; 1271 | 1272 | eachProp(cfg, function (value, prop) { 1273 | if (objs[prop]) { 1274 | if (!config[prop]) { 1275 | config[prop] = {}; 1276 | } 1277 | mixin(config[prop], value, true, true); 1278 | } else { 1279 | config[prop] = value; 1280 | } 1281 | }); 1282 | 1283 | //Reverse map the bundles 1284 | if (cfg.bundles) { 1285 | eachProp(cfg.bundles, function (value, prop) { 1286 | each(value, function (v) { 1287 | if (v !== prop) { 1288 | bundlesMap[v] = prop; 1289 | } 1290 | }); 1291 | }); 1292 | } 1293 | 1294 | //Merge shim 1295 | if (cfg.shim) { 1296 | eachProp(cfg.shim, function (value, id) { 1297 | //Normalize the structure 1298 | if (isArray(value)) { 1299 | value = { 1300 | deps: value 1301 | }; 1302 | } 1303 | if ((value.exports || value.init) && !value.exportsFn) { 1304 | value.exportsFn = context.makeShimExports(value); 1305 | } 1306 | shim[id] = value; 1307 | }); 1308 | config.shim = shim; 1309 | } 1310 | 1311 | //Adjust packages if necessary. 1312 | if (cfg.packages) { 1313 | each(cfg.packages, function (pkgObj) { 1314 | var location, name; 1315 | 1316 | pkgObj = typeof pkgObj === 'string' ? { name: pkgObj } : pkgObj; 1317 | 1318 | name = pkgObj.name; 1319 | location = pkgObj.location; 1320 | if (location) { 1321 | config.paths[name] = pkgObj.location; 1322 | } 1323 | 1324 | //Save pointer to main module ID for pkg name. 1325 | //Remove leading dot in main, so main paths are normalized, 1326 | //and remove any trailing .js, since different package 1327 | //envs have different conventions: some use a module name, 1328 | //some use a file name. 1329 | config.pkgs[name] = pkgObj.name + '/' + (pkgObj.main || 'main') 1330 | .replace(currDirRegExp, '') 1331 | .replace(jsSuffixRegExp, ''); 1332 | }); 1333 | } 1334 | 1335 | //If there are any "waiting to execute" modules in the registry, 1336 | //update the maps for them, since their info, like URLs to load, 1337 | //may have changed. 1338 | eachProp(registry, function (mod, id) { 1339 | //If module already has init called, since it is too 1340 | //late to modify them, and ignore unnormalized ones 1341 | //since they are transient. 1342 | if (!mod.inited && !mod.map.unnormalized) { 1343 | mod.map = makeModuleMap(id); 1344 | } 1345 | }); 1346 | 1347 | //If a deps array or a config callback is specified, then call 1348 | //require with those args. This is useful when require is defined as a 1349 | //config object before require.js is loaded. 1350 | if (cfg.deps || cfg.callback) { 1351 | context.require(cfg.deps || [], cfg.callback); 1352 | } 1353 | }, 1354 | 1355 | makeShimExports: function (value) { 1356 | function fn() { 1357 | var ret; 1358 | if (value.init) { 1359 | ret = value.init.apply(global, arguments); 1360 | } 1361 | return ret || (value.exports && getGlobal(value.exports)); 1362 | } 1363 | return fn; 1364 | }, 1365 | 1366 | makeRequire: function (relMap, options) { 1367 | options = options || {}; 1368 | 1369 | function localRequire(deps, callback, errback) { 1370 | var id, map, requireMod; 1371 | 1372 | if (options.enableBuildCallback && callback && isFunction(callback)) { 1373 | callback.__requireJsBuild = true; 1374 | } 1375 | 1376 | if (typeof deps === 'string') { 1377 | if (isFunction(callback)) { 1378 | //Invalid call 1379 | return onError(makeError('requireargs', 'Invalid require call'), errback); 1380 | } 1381 | 1382 | //If require|exports|module are requested, get the 1383 | //value for them from the special handlers. Caveat: 1384 | //this only works while module is being defined. 1385 | if (relMap && hasProp(handlers, deps)) { 1386 | return handlers[deps](registry[relMap.id]); 1387 | } 1388 | 1389 | //Synchronous access to one module. If require.get is 1390 | //available (as in the Node adapter), prefer that. 1391 | if (req.get) { 1392 | return req.get(context, deps, relMap, localRequire); 1393 | } 1394 | 1395 | //Normalize module name, if it contains . or .. 1396 | map = makeModuleMap(deps, relMap, false, true); 1397 | id = map.id; 1398 | 1399 | if (!hasProp(defined, id)) { 1400 | return onError(makeError('notloaded', 'Module name "' + 1401 | id + 1402 | '" has not been loaded yet for context: ' + 1403 | contextName + 1404 | (relMap ? '' : '. Use require([])'))); 1405 | } 1406 | return defined[id]; 1407 | } 1408 | 1409 | //Grab defines waiting in the global queue. 1410 | intakeDefines(); 1411 | 1412 | //Mark all the dependencies as needing to be loaded. 1413 | context.nextTick(function () { 1414 | //Some defines could have been added since the 1415 | //require call, collect them. 1416 | intakeDefines(); 1417 | 1418 | requireMod = getModule(makeModuleMap(null, relMap)); 1419 | 1420 | //Store if map config should be applied to this require 1421 | //call for dependencies. 1422 | requireMod.skipMap = options.skipMap; 1423 | 1424 | requireMod.init(deps, callback, errback, { 1425 | enabled: true 1426 | }); 1427 | 1428 | checkLoaded(); 1429 | }); 1430 | 1431 | return localRequire; 1432 | } 1433 | 1434 | mixin(localRequire, { 1435 | isBrowser: isBrowser, 1436 | 1437 | /** 1438 | * Converts a module name + .extension into an URL path. 1439 | * *Requires* the use of a module name. It does not support using 1440 | * plain URLs like nameToUrl. 1441 | */ 1442 | toUrl: function (moduleNamePlusExt) { 1443 | var ext, 1444 | index = moduleNamePlusExt.lastIndexOf('.'), 1445 | segment = moduleNamePlusExt.split('/')[0], 1446 | isRelative = segment === '.' || segment === '..'; 1447 | 1448 | //Have a file extension alias, and it is not the 1449 | //dots from a relative path. 1450 | if (index !== -1 && (!isRelative || index > 1)) { 1451 | ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length); 1452 | moduleNamePlusExt = moduleNamePlusExt.substring(0, index); 1453 | } 1454 | 1455 | return context.nameToUrl(normalize(moduleNamePlusExt, 1456 | relMap && relMap.id, true), ext, true); 1457 | }, 1458 | 1459 | defined: function (id) { 1460 | return hasProp(defined, makeModuleMap(id, relMap, false, true).id); 1461 | }, 1462 | 1463 | specified: function (id) { 1464 | id = makeModuleMap(id, relMap, false, true).id; 1465 | return hasProp(defined, id) || hasProp(registry, id); 1466 | } 1467 | }); 1468 | 1469 | //Only allow undef on top level require calls 1470 | if (!relMap) { 1471 | localRequire.undef = function (id) { 1472 | //Bind any waiting define() calls to this context, 1473 | //fix for #408 1474 | takeGlobalQueue(); 1475 | 1476 | var map = makeModuleMap(id, relMap, true), 1477 | mod = getOwn(registry, id); 1478 | 1479 | removeScript(id); 1480 | 1481 | delete defined[id]; 1482 | delete urlFetched[map.url]; 1483 | delete undefEvents[id]; 1484 | 1485 | //Clean queued defines too. Go backwards 1486 | //in array so that the splices do not 1487 | //mess up the iteration. 1488 | eachReverse(defQueue, function(args, i) { 1489 | if(args[0] === id) { 1490 | defQueue.splice(i, 1); 1491 | } 1492 | }); 1493 | 1494 | if (mod) { 1495 | //Hold on to listeners in case the 1496 | //module will be attempted to be reloaded 1497 | //using a different config. 1498 | if (mod.events.defined) { 1499 | undefEvents[id] = mod.events; 1500 | } 1501 | 1502 | cleanRegistry(id); 1503 | } 1504 | }; 1505 | } 1506 | 1507 | return localRequire; 1508 | }, 1509 | 1510 | /** 1511 | * Called to enable a module if it is still in the registry 1512 | * awaiting enablement. A second arg, parent, the parent module, 1513 | * is passed in for context, when this method is overridden by 1514 | * the optimizer. Not shown here to keep code compact. 1515 | */ 1516 | enable: function (depMap) { 1517 | var mod = getOwn(registry, depMap.id); 1518 | if (mod) { 1519 | getModule(depMap).enable(); 1520 | } 1521 | }, 1522 | 1523 | /** 1524 | * Internal method used by environment adapters to complete a load event. 1525 | * A load event could be a script load or just a load pass from a synchronous 1526 | * load call. 1527 | * @param {String} moduleName the name of the module to potentially complete. 1528 | */ 1529 | completeLoad: function (moduleName) { 1530 | var found, args, mod, 1531 | shim = getOwn(config.shim, moduleName) || {}, 1532 | shExports = shim.exports; 1533 | 1534 | takeGlobalQueue(); 1535 | 1536 | while (defQueue.length) { 1537 | args = defQueue.shift(); 1538 | if (args[0] === null) { 1539 | args[0] = moduleName; 1540 | //If already found an anonymous module and bound it 1541 | //to this name, then this is some other anon module 1542 | //waiting for its completeLoad to fire. 1543 | if (found) { 1544 | break; 1545 | } 1546 | found = true; 1547 | } else if (args[0] === moduleName) { 1548 | //Found matching define call for this script! 1549 | found = true; 1550 | } 1551 | 1552 | callGetModule(args); 1553 | } 1554 | 1555 | //Do this after the cycle of callGetModule in case the result 1556 | //of those calls/init calls changes the registry. 1557 | mod = getOwn(registry, moduleName); 1558 | 1559 | if (!found && !hasProp(defined, moduleName) && mod && !mod.inited) { 1560 | if (config.enforceDefine && (!shExports || !getGlobal(shExports))) { 1561 | if (hasPathFallback(moduleName)) { 1562 | return; 1563 | } else { 1564 | return onError(makeError('nodefine', 1565 | 'No define call for ' + moduleName, 1566 | null, 1567 | [moduleName])); 1568 | } 1569 | } else { 1570 | //A script that does not call define(), so just simulate 1571 | //the call for it. 1572 | callGetModule([moduleName, (shim.deps || []), shim.exportsFn]); 1573 | } 1574 | } 1575 | 1576 | checkLoaded(); 1577 | }, 1578 | 1579 | /** 1580 | * Converts a module name to a file path. Supports cases where 1581 | * moduleName may actually be just an URL. 1582 | * Note that it **does not** call normalize on the moduleName, 1583 | * it is assumed to have already been normalized. This is an 1584 | * internal API, not a public one. Use toUrl for the public API. 1585 | */ 1586 | nameToUrl: function (moduleName, ext, skipExt) { 1587 | var paths, syms, i, parentModule, url, 1588 | parentPath, bundleId, 1589 | pkgMain = getOwn(config.pkgs, moduleName); 1590 | 1591 | if (pkgMain) { 1592 | moduleName = pkgMain; 1593 | } 1594 | 1595 | bundleId = getOwn(bundlesMap, moduleName); 1596 | 1597 | if (bundleId) { 1598 | return context.nameToUrl(bundleId, ext, skipExt); 1599 | } 1600 | 1601 | //If a colon is in the URL, it indicates a protocol is used and it is just 1602 | //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?) 1603 | //or ends with .js, then assume the user meant to use an url and not a module id. 1604 | //The slash is important for protocol-less URLs as well as full paths. 1605 | if (req.jsExtRegExp.test(moduleName)) { 1606 | //Just a plain path, not module name lookup, so just return it. 1607 | //Add extension if it is included. This is a bit wonky, only non-.js things pass 1608 | //an extension, this method probably needs to be reworked. 1609 | url = moduleName + (ext || ''); 1610 | } else { 1611 | //A module that needs to be converted to a path. 1612 | paths = config.paths; 1613 | 1614 | syms = moduleName.split('/'); 1615 | //For each module name segment, see if there is a path 1616 | //registered for it. Start with most specific name 1617 | //and work up from it. 1618 | for (i = syms.length; i > 0; i -= 1) { 1619 | parentModule = syms.slice(0, i).join('/'); 1620 | 1621 | parentPath = getOwn(paths, parentModule); 1622 | if (parentPath) { 1623 | //If an array, it means there are a few choices, 1624 | //Choose the one that is desired 1625 | if (isArray(parentPath)) { 1626 | parentPath = parentPath[0]; 1627 | } 1628 | syms.splice(0, i, parentPath); 1629 | break; 1630 | } 1631 | } 1632 | 1633 | //Join the path parts together, then figure out if baseUrl is needed. 1634 | url = syms.join('/'); 1635 | url += (ext || (/^data\:|\?/.test(url) || skipExt ? '' : '.js')); 1636 | url = (url.charAt(0) === '/' || url.match(/^[\w\+\.\-]+:/) ? '' : config.baseUrl) + url; 1637 | } 1638 | 1639 | return config.urlArgs ? url + 1640 | ((url.indexOf('?') === -1 ? '?' : '&') + 1641 | config.urlArgs) : url; 1642 | }, 1643 | 1644 | //Delegates to req.load. Broken out as a separate function to 1645 | //allow overriding in the optimizer. 1646 | load: function (id, url) { 1647 | req.load(context, id, url); 1648 | }, 1649 | 1650 | /** 1651 | * Executes a module callback function. Broken out as a separate function 1652 | * solely to allow the build system to sequence the files in the built 1653 | * layer in the right sequence. 1654 | * 1655 | * @private 1656 | */ 1657 | execCb: function (name, callback, args, exports) { 1658 | return callback.apply(exports, args); 1659 | }, 1660 | 1661 | /** 1662 | * callback for script loads, used to check status of loading. 1663 | * 1664 | * @param {Event} evt the event from the browser for the script 1665 | * that was loaded. 1666 | */ 1667 | onScriptLoad: function (evt) { 1668 | //Using currentTarget instead of target for Firefox 2.0's sake. Not 1669 | //all old browsers will be supported, but this one was easy enough 1670 | //to support and still makes sense. 1671 | if (evt.type === 'load' || 1672 | (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) { 1673 | //Reset interactive script so a script node is not held onto for 1674 | //to long. 1675 | interactiveScript = null; 1676 | 1677 | //Pull out the name of the module and the context. 1678 | var data = getScriptData(evt); 1679 | context.completeLoad(data.id); 1680 | } 1681 | }, 1682 | 1683 | /** 1684 | * Callback for script errors. 1685 | */ 1686 | onScriptError: function (evt) { 1687 | var data = getScriptData(evt); 1688 | if (!hasPathFallback(data.id)) { 1689 | return onError(makeError('scripterror', 'Script error for: ' + data.id, evt, [data.id])); 1690 | } 1691 | } 1692 | }; 1693 | 1694 | context.require = context.makeRequire(); 1695 | return context; 1696 | } 1697 | 1698 | /** 1699 | * Main entry point. 1700 | * 1701 | * If the only argument to require is a string, then the module that 1702 | * is represented by that string is fetched for the appropriate context. 1703 | * 1704 | * If the first argument is an array, then it will be treated as an array 1705 | * of dependency string names to fetch. An optional function callback can 1706 | * be specified to execute when all of those dependencies are available. 1707 | * 1708 | * Make a local req variable to help Caja compliance (it assumes things 1709 | * on a require that are not standardized), and to give a short 1710 | * name for minification/local scope use. 1711 | */ 1712 | req = requirejs = function (deps, callback, errback, optional) { 1713 | 1714 | //Find the right context, use default 1715 | var context, config, 1716 | contextName = defContextName; 1717 | 1718 | // Determine if have config object in the call. 1719 | if (!isArray(deps) && typeof deps !== 'string') { 1720 | // deps is a config object 1721 | config = deps; 1722 | if (isArray(callback)) { 1723 | // Adjust args if there are dependencies 1724 | deps = callback; 1725 | callback = errback; 1726 | errback = optional; 1727 | } else { 1728 | deps = []; 1729 | } 1730 | } 1731 | 1732 | if (config && config.context) { 1733 | contextName = config.context; 1734 | } 1735 | 1736 | context = getOwn(contexts, contextName); 1737 | if (!context) { 1738 | context = contexts[contextName] = req.s.newContext(contextName); 1739 | } 1740 | 1741 | if (config) { 1742 | context.configure(config); 1743 | } 1744 | 1745 | return context.require(deps, callback, errback); 1746 | }; 1747 | 1748 | /** 1749 | * Support require.config() to make it easier to cooperate with other 1750 | * AMD loaders on globally agreed names. 1751 | */ 1752 | req.config = function (config) { 1753 | return req(config); 1754 | }; 1755 | 1756 | /** 1757 | * Execute something after the current tick 1758 | * of the event loop. Override for other envs 1759 | * that have a better solution than setTimeout. 1760 | * @param {Function} fn function to execute later. 1761 | */ 1762 | req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) { 1763 | setTimeout(fn, 4); 1764 | } : function (fn) { fn(); }; 1765 | 1766 | /** 1767 | * Export require as a global, but only if it does not already exist. 1768 | */ 1769 | if (!require) { 1770 | require = req; 1771 | } 1772 | 1773 | req.version = version; 1774 | 1775 | //Used to filter out dependencies that are already paths. 1776 | req.jsExtRegExp = /^\/|:|\?|\.js$/; 1777 | req.isBrowser = isBrowser; 1778 | s = req.s = { 1779 | contexts: contexts, 1780 | newContext: newContext 1781 | }; 1782 | 1783 | //Create default context. 1784 | req({}); 1785 | 1786 | //Exports some context-sensitive methods on global require. 1787 | each([ 1788 | 'toUrl', 1789 | 'undef', 1790 | 'defined', 1791 | 'specified' 1792 | ], function (prop) { 1793 | //Reference from contexts instead of early binding to default context, 1794 | //so that during builds, the latest instance of the default context 1795 | //with its config gets used. 1796 | req[prop] = function () { 1797 | var ctx = contexts[defContextName]; 1798 | return ctx.require[prop].apply(ctx, arguments); 1799 | }; 1800 | }); 1801 | 1802 | if (isBrowser) { 1803 | head = s.head = document.getElementsByTagName('head')[0]; 1804 | //If BASE tag is in play, using appendChild is a problem for IE6. 1805 | //When that browser dies, this can be removed. Details in this jQuery bug: 1806 | //http://dev.jquery.com/ticket/2709 1807 | baseElement = document.getElementsByTagName('base')[0]; 1808 | if (baseElement) { 1809 | head = s.head = baseElement.parentNode; 1810 | } 1811 | } 1812 | 1813 | /** 1814 | * Any errors that require explicitly generates will be passed to this 1815 | * function. Intercept/override it if you want custom error handling. 1816 | * @param {Error} err the error object. 1817 | */ 1818 | req.onError = defaultOnError; 1819 | 1820 | /** 1821 | * Creates the node for the load command. Only used in browser envs. 1822 | */ 1823 | req.createNode = function (config, moduleName, url) { 1824 | var node = config.xhtml ? 1825 | document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') : 1826 | document.createElement('script'); 1827 | node.type = config.scriptType || 'text/javascript'; 1828 | node.charset = 'utf-8'; 1829 | node.async = true; 1830 | return node; 1831 | }; 1832 | 1833 | /** 1834 | * Does the request to load a module for the browser case. 1835 | * Make this a separate function to allow other environments 1836 | * to override it. 1837 | * 1838 | * @param {Object} context the require context to find state. 1839 | * @param {String} moduleName the name of the module. 1840 | * @param {Object} url the URL to the module. 1841 | */ 1842 | req.load = function (context, moduleName, url) { 1843 | var config = (context && context.config) || {}, 1844 | node; 1845 | if (isBrowser) { 1846 | //In the browser so use a script tag 1847 | node = req.createNode(config, moduleName, url); 1848 | 1849 | node.setAttribute('data-requirecontext', context.contextName); 1850 | node.setAttribute('data-requiremodule', moduleName); 1851 | 1852 | //Set up load listener. Test attachEvent first because IE9 has 1853 | //a subtle issue in its addEventListener and script onload firings 1854 | //that do not match the behavior of all other browsers with 1855 | //addEventListener support, which fire the onload event for a 1856 | //script right after the script execution. See: 1857 | //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution 1858 | //UNFORTUNATELY Opera implements attachEvent but does not follow the script 1859 | //script execution mode. 1860 | if (node.attachEvent && 1861 | //Check if node.attachEvent is artificially added by custom script or 1862 | //natively supported by browser 1863 | //read https://github.com/jrburke/requirejs/issues/187 1864 | //if we can NOT find [native code] then it must NOT natively supported. 1865 | //in IE8, node.attachEvent does not have toString() 1866 | //Note the test for "[native code" with no closing brace, see: 1867 | //https://github.com/jrburke/requirejs/issues/273 1868 | !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) && 1869 | !isOpera) { 1870 | //Probably IE. IE (at least 6-8) do not fire 1871 | //script onload right after executing the script, so 1872 | //we cannot tie the anonymous define call to a name. 1873 | //However, IE reports the script as being in 'interactive' 1874 | //readyState at the time of the define call. 1875 | useInteractive = true; 1876 | 1877 | node.attachEvent('onreadystatechange', context.onScriptLoad); 1878 | //It would be great to add an error handler here to catch 1879 | //404s in IE9+. However, onreadystatechange will fire before 1880 | //the error handler, so that does not help. If addEventListener 1881 | //is used, then IE will fire error before load, but we cannot 1882 | //use that pathway given the connect.microsoft.com issue 1883 | //mentioned above about not doing the 'script execute, 1884 | //then fire the script load event listener before execute 1885 | //next script' that other browsers do. 1886 | //Best hope: IE10 fixes the issues, 1887 | //and then destroys all installs of IE 6-9. 1888 | //node.attachEvent('onerror', context.onScriptError); 1889 | } else { 1890 | node.addEventListener('load', context.onScriptLoad, false); 1891 | node.addEventListener('error', context.onScriptError, false); 1892 | } 1893 | node.src = url; 1894 | 1895 | //For some cache cases in IE 6-8, the script executes before the end 1896 | //of the appendChild execution, so to tie an anonymous define 1897 | //call to the module name (which is stored on the node), hold on 1898 | //to a reference to this node, but clear after the DOM insertion. 1899 | currentlyAddingScript = node; 1900 | if (baseElement) { 1901 | head.insertBefore(node, baseElement); 1902 | } else { 1903 | head.appendChild(node); 1904 | } 1905 | currentlyAddingScript = null; 1906 | 1907 | return node; 1908 | } else if (isWebWorker) { 1909 | try { 1910 | //In a web worker, use importScripts. This is not a very 1911 | //efficient use of importScripts, importScripts will block until 1912 | //its script is downloaded and evaluated. However, if web workers 1913 | //are in play, the expectation that a build has been done so that 1914 | //only one script needs to be loaded anyway. This may need to be 1915 | //reevaluated if other use cases become common. 1916 | importScripts(url); 1917 | 1918 | //Account for anonymous modules 1919 | context.completeLoad(moduleName); 1920 | } catch (e) { 1921 | context.onError(makeError('importscripts', 1922 | 'importScripts failed for ' + 1923 | moduleName + ' at ' + url, 1924 | e, 1925 | [moduleName])); 1926 | } 1927 | } 1928 | }; 1929 | 1930 | function getInteractiveScript() { 1931 | if (interactiveScript && interactiveScript.readyState === 'interactive') { 1932 | return interactiveScript; 1933 | } 1934 | 1935 | eachReverse(scripts(), function (script) { 1936 | if (script.readyState === 'interactive') { 1937 | return (interactiveScript = script); 1938 | } 1939 | }); 1940 | return interactiveScript; 1941 | } 1942 | 1943 | //Look for a data-main script attribute, which could also adjust the baseUrl. 1944 | if (isBrowser && !cfg.skipDataMain) { 1945 | //Figure out baseUrl. Get it from the script tag with require.js in it. 1946 | eachReverse(scripts(), function (script) { 1947 | //Set the 'head' where we can append children by 1948 | //using the script's parent. 1949 | if (!head) { 1950 | head = script.parentNode; 1951 | } 1952 | 1953 | //Look for a data-main attribute to set main script for the page 1954 | //to load. If it is there, the path to data main becomes the 1955 | //baseUrl, if it is not already set. 1956 | dataMain = script.getAttribute('data-main'); 1957 | if (dataMain) { 1958 | //Preserve dataMain in case it is a path (i.e. contains '?') 1959 | mainScript = dataMain; 1960 | 1961 | //Set final baseUrl if there is not already an explicit one. 1962 | if (!cfg.baseUrl) { 1963 | //Pull off the directory of data-main for use as the 1964 | //baseUrl. 1965 | src = mainScript.split('/'); 1966 | mainScript = src.pop(); 1967 | subPath = src.length ? src.join('/') + '/' : './'; 1968 | 1969 | cfg.baseUrl = subPath; 1970 | } 1971 | 1972 | //Strip off any trailing .js since mainScript is now 1973 | //like a module name. 1974 | mainScript = mainScript.replace(jsSuffixRegExp, ''); 1975 | 1976 | //If mainScript is still a path, fall back to dataMain 1977 | if (req.jsExtRegExp.test(mainScript)) { 1978 | mainScript = dataMain; 1979 | } 1980 | 1981 | //Put the data-main script in the files to load. 1982 | cfg.deps = cfg.deps ? cfg.deps.concat(mainScript) : [mainScript]; 1983 | 1984 | return true; 1985 | } 1986 | }); 1987 | } 1988 | 1989 | /** 1990 | * The function that handles definitions of modules. Differs from 1991 | * require() in that a string for the module should be the first argument, 1992 | * and the function to execute after dependencies are loaded should 1993 | * return a value to define the module corresponding to the first argument's 1994 | * name. 1995 | */ 1996 | define = function (name, deps, callback) { 1997 | var node, context; 1998 | 1999 | //Allow for anonymous modules 2000 | if (typeof name !== 'string') { 2001 | //Adjust args appropriately 2002 | callback = deps; 2003 | deps = name; 2004 | name = null; 2005 | } 2006 | 2007 | //This module may not have dependencies 2008 | if (!isArray(deps)) { 2009 | callback = deps; 2010 | deps = null; 2011 | } 2012 | 2013 | //If no name, and callback is a function, then figure out if it a 2014 | //CommonJS thing with dependencies. 2015 | if (!deps && isFunction(callback)) { 2016 | deps = []; 2017 | //Remove comments from the callback string, 2018 | //look for require calls, and pull them into the dependencies, 2019 | //but only if there are function args. 2020 | if (callback.length) { 2021 | callback 2022 | .toString() 2023 | .replace(commentRegExp, '') 2024 | .replace(cjsRequireRegExp, function (match, dep) { 2025 | deps.push(dep); 2026 | }); 2027 | 2028 | //May be a CommonJS thing even without require calls, but still 2029 | //could use exports, and module. Avoid doing exports and module 2030 | //work though if it just needs require. 2031 | //REQUIRES the function to expect the CommonJS variables in the 2032 | //order listed below. 2033 | deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps); 2034 | } 2035 | } 2036 | 2037 | //If in IE 6-8 and hit an anonymous define() call, do the interactive 2038 | //work. 2039 | if (useInteractive) { 2040 | node = currentlyAddingScript || getInteractiveScript(); 2041 | if (node) { 2042 | if (!name) { 2043 | name = node.getAttribute('data-requiremodule'); 2044 | } 2045 | context = contexts[node.getAttribute('data-requirecontext')]; 2046 | } 2047 | } 2048 | 2049 | //Always save off evaluating the def call until the script onload handler. 2050 | //This allows multiple modules to be in a file without prematurely 2051 | //tracing dependencies, and allows for anonymous module support, 2052 | //where the module name is not known until the script onload event 2053 | //occurs. If no context, use the global queue, and get it processed 2054 | //in the onscript load callback. 2055 | (context ? context.defQueue : globalDefQueue).push([name, deps, callback]); 2056 | }; 2057 | 2058 | define.amd = { 2059 | jQuery: true 2060 | }; 2061 | 2062 | 2063 | /** 2064 | * Executes the text. Normally just uses eval, but can be modified 2065 | * to use a better, environment-specific call. Only used for transpiling 2066 | * loader plugins, not for plain JS modules. 2067 | * @param {String} text the text to execute/evaluate. 2068 | */ 2069 | req.exec = function (text) { 2070 | /*jslint evil: true */ 2071 | return eval(text); 2072 | }; 2073 | 2074 | //Set up with config info. 2075 | req(cfg); 2076 | }(this)); 2077 | --------------------------------------------------------------------------------