Work on the AMD scaffolding
This will make it far easier to ensure that components are in their own modules as well as make it possible to have custom builds of Select2.
This commit is contained in:
parent
c0d9316ce2
commit
06e195b025
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,3 +1 @@
|
||||
.idea
|
||||
src/scss/**/*.css
|
||||
|
||||
node_modules
|
||||
|
159
Gruntfile.js
Normal file
159
Gruntfile.js
Normal file
@ -0,0 +1,159 @@
|
||||
module.exports = function (grunt) {
|
||||
// Full list of files that must be included by RequireJS
|
||||
amd_includes = [
|
||||
"almond"
|
||||
]
|
||||
|
||||
full_includes = [
|
||||
"jquery"
|
||||
]
|
||||
|
||||
grunt.initConfig({
|
||||
uglify: {
|
||||
"dist": {
|
||||
src: 'dist/js/select2.js',
|
||||
dest: 'dist/js/select2.min.js'
|
||||
},
|
||||
"dist.full": {
|
||||
src: 'dist/js/select2.full.js',
|
||||
dest: 'dist/js/select2.full.min.js'
|
||||
}
|
||||
},
|
||||
|
||||
qunit: {
|
||||
all: [
|
||||
"tests/**/*.html"
|
||||
]
|
||||
},
|
||||
|
||||
sass: {
|
||||
dist: {
|
||||
options: {
|
||||
outputStyle: "compressed"
|
||||
},
|
||||
files: {
|
||||
"dist/css/select2.min.css": [
|
||||
"src/scss/core.scss",
|
||||
"src/scss/theme/default/layout.css"
|
||||
]
|
||||
}
|
||||
},
|
||||
dev: {
|
||||
options: {
|
||||
outputStyle: "nested"
|
||||
},
|
||||
files: {
|
||||
"dist/css/select2.css": [
|
||||
"src/scss/core.scss",
|
||||
"src/scss/theme/default/layout.css"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
requirejs: {
|
||||
"dist": {
|
||||
options: {
|
||||
baseUrl: "src/js",
|
||||
optimize: "none",
|
||||
name: "select2/core",
|
||||
out: "dist/js/select2.js",
|
||||
include: amd_includes,
|
||||
paths: {
|
||||
almond: "../../vendor/almond-0.2.9",
|
||||
jquery: "jquery.shim"
|
||||
}
|
||||
}
|
||||
},
|
||||
"dist.full": {
|
||||
options: {
|
||||
baseUrl: "src/js",
|
||||
optimize: "none",
|
||||
name: "select2/core",
|
||||
out: "dist/js/select2.full.js",
|
||||
include: amd_includes.concat(full_includes),
|
||||
paths: {
|
||||
almond: "../../vendor/almond-0.2.9",
|
||||
jquery: "../../vendor/jquery-2.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"amd": {
|
||||
options: {
|
||||
baseUrl: "src/js",
|
||||
optimize: "none",
|
||||
name: "select2/core",
|
||||
out: "dist/js/select2.amd.js",
|
||||
paths: {
|
||||
jquery: "empty:"
|
||||
}
|
||||
}
|
||||
},
|
||||
"amd.full": {
|
||||
options: {
|
||||
baseUrl: "src/js",
|
||||
optimize: "none",
|
||||
name: "select2/core",
|
||||
out: "dist/js/select2.amd.full.js",
|
||||
include: full_includes,
|
||||
paths: {
|
||||
jquery: "empty:"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
concat: {
|
||||
"dist": {
|
||||
src: [
|
||||
"src/coffee/start.js",
|
||||
"dist/js/select2.js",
|
||||
"src/coffee/end.js"
|
||||
],
|
||||
dest: "dist/js/select2.js"
|
||||
},
|
||||
"dist.full": {
|
||||
src: [
|
||||
"src/coffee/start.js",
|
||||
"dist/js/select2.full.js",
|
||||
"src/coffee/end.js"
|
||||
],
|
||||
dest: "dist/js/select2.full.js"
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
js: {
|
||||
files: [
|
||||
"src/js/**/*.js"
|
||||
],
|
||||
tasks: [
|
||||
"compile",
|
||||
"test"
|
||||
]
|
||||
},
|
||||
css: {
|
||||
files: [
|
||||
"src/scss/**/*.scss"
|
||||
],
|
||||
tasks: [
|
||||
"compile"
|
||||
]
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
grunt.loadNpmTasks("grunt-contrib-concat")
|
||||
grunt.loadNpmTasks("grunt-contrib-qunit")
|
||||
grunt.loadNpmTasks("grunt-contrib-requirejs")
|
||||
grunt.loadNpmTasks("grunt-contrib-uglify")
|
||||
grunt.loadNpmTasks("grunt-contrib-watch")
|
||||
|
||||
grunt.loadNpmTasks("grunt-sass")
|
||||
|
||||
grunt.registerTask("default", ["compile", "test", "minify"])
|
||||
|
||||
grunt.registerTask("compile", ["requirejs", "sass:dev", "concat"])
|
||||
grunt.registerTask("minify", ["uglify", "sass:dist"])
|
||||
grunt.registerTask("test", ["qunit"])
|
||||
}
|
68
dist/css/select2.css
vendored
Normal file
68
dist/css/select2.css
vendored
Normal file
@ -0,0 +1,68 @@
|
||||
.s2-container {
|
||||
margin: 0;
|
||||
position: relative;
|
||||
zoom: 1;
|
||||
vertical-align: middle; }
|
||||
.s2-container.s2-active {
|
||||
border: 1px solid #5897fb;
|
||||
border-top: bottom; }
|
||||
.s2-container .s2-single-select {
|
||||
display: block;
|
||||
height: 26px;
|
||||
padding: 0 0 0 8px;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
border: 1px solid #aaa;
|
||||
white-space: nowrap;
|
||||
line-height: 26px;
|
||||
color: #444;
|
||||
text-decoration: none;
|
||||
border-radius: 4px;
|
||||
background-clip: padding-box;
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
background-color: #fff;
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
|
||||
background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
|
||||
background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
|
||||
background-image: linear-gradient(to top, #eee 0%, #fff 50%); }
|
||||
.s2-container .s2-single-select .s2-selection {
|
||||
margin-right: 26px;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis; }
|
||||
.s2-container .s2-open .select2-container-active .select2-choice, .s2-container .s2-open .select2-container-active .select2-choices {
|
||||
border: 1px solid #5897fb;
|
||||
outline: none;
|
||||
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
|
||||
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); }
|
||||
|
||||
.s2-search input {
|
||||
-webkit-box-sizing: border-box;
|
||||
/* webkit */
|
||||
-moz-box-sizing: border-box;
|
||||
/* firefox */
|
||||
box-sizing: border-box;
|
||||
/* css3 */ }
|
||||
|
||||
.s2-dropdown {
|
||||
width: 100%;
|
||||
margin-top: -1px;
|
||||
position: absolute;
|
||||
z-index: 9999;
|
||||
overflow: scroll;
|
||||
background: #fff;
|
||||
color: #000;
|
||||
border: 1px solid #5897fb;
|
||||
border-top: none;
|
||||
border-radius: 0 0 4px 4px;
|
||||
-webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
|
||||
box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
.s2-hidden {
|
||||
display: none; }
|
1
dist/css/select2.min.css
vendored
Normal file
1
dist/css/select2.min.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
.s2-container{margin:0;position:relative;zoom:1;vertical-align:middle;}.s2-container.s2-active{border:1px solid #5897fb;border-top:bottom;}.s2-container .s2-single-select{display:block;height:26px;padding:0 0 0 8px;overflow:hidden;position:relative;border:1px solid #aaa;white-space:nowrap;line-height:26px;color:#444;text-decoration:none;border-radius:4px;background-clip:padding-box;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-image:-webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));background-image:-webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);background-image:-moz-linear-gradient(center bottom, #eee 0%, #fff 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);background-image:linear-gradient(to top, #eee 0%, #fff 50%);}.s2-container .s2-single-select .s2-selection{margin-right:26px;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}.s2-container .s2-open .select2-container-active .select2-choice,.s2-container .s2-open .select2-container-active .select2-choices{border:1px solid #5897fb;outline:none;-webkit-box-shadow:0 0 5px rgba(0, 0, 0, 0.3);box-shadow:0 0 5px rgba(0, 0, 0, 0.3);}.s2-search input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.s2-dropdown{width:100%;margin-top:-1px;position:absolute;z-index:9999;overflow:scroll;background:#fff;color:#000;border:1px solid #5897fb;border-top:none;border-radius:0 0 4px 4px;-webkit-box-shadow:0 4px 5px rgba(0, 0, 0, 0.15);box-shadow:0 4px 5px rgba(0, 0, 0, 0.15);}.s2-hidden{display:none;}
|
97
dist/js/select2.amd.full.js
vendored
Normal file
97
dist/js/select2.amd.full.js
vendored
Normal file
@ -0,0 +1,97 @@
|
||||
define('select2/utils',[], function () {
|
||||
var Utils = {};
|
||||
|
||||
Utils.Extend = function (ChildClass, SuperClass) {
|
||||
var __hasProp = {}.hasOwnProperty
|
||||
|
||||
function BaseConstructor () {
|
||||
this.constructor = ChildClass;
|
||||
}
|
||||
|
||||
for (var key in SuperClass) {
|
||||
if (__hasProp.call(SuperClass, key)) {
|
||||
ChildClass[key] = SuperClass[key];
|
||||
}
|
||||
}
|
||||
|
||||
BaseConstructor.prototype = SuperClass.prototype;
|
||||
ChildClass.prototype = new BaseConstructor();
|
||||
ChildClass.__super__ = SuperClass.prototype;
|
||||
|
||||
return ChildClass;
|
||||
};
|
||||
|
||||
var Observable = function () {
|
||||
this.listeners = {};
|
||||
};
|
||||
|
||||
Observable.prototype.on = function (event, callback) {
|
||||
if (event in this.listeners) {
|
||||
this.listeners[event].push(callback);
|
||||
} else {
|
||||
this.listeners[event] = [callback];
|
||||
}
|
||||
};
|
||||
|
||||
Observable.prototype.trigger = function (event) {
|
||||
if (event in this.listeners) {
|
||||
this.invoke(this.listeners[event], util.shift(arguments));
|
||||
}
|
||||
|
||||
if ("*" in this.listeners) {
|
||||
this.invoke(this.listeners["*"], arguments);
|
||||
}
|
||||
};
|
||||
|
||||
Observable.prototype.invoke = function (listeners, params) {
|
||||
for (var i = 0, len = listeners.length; i < len; i++) {
|
||||
listeners[i].apply(this, params);
|
||||
}
|
||||
};
|
||||
|
||||
Utils.Observable = Observable;
|
||||
|
||||
return Utils;
|
||||
});
|
||||
|
||||
define('select2/adapters/select',[
|
||||
"../utils"
|
||||
], function (Utils) {
|
||||
function SelectAdapter (element, options) {
|
||||
this.element = element;
|
||||
}
|
||||
|
||||
Utils.Extend(SelectAdapter, Utils.Observable);
|
||||
|
||||
return SelectAdapter;
|
||||
});
|
||||
|
||||
define('select2/options',[
|
||||
"./adapters/select"
|
||||
], function (SelectAdapter) {
|
||||
function Options (options) {
|
||||
this.options = options;
|
||||
|
||||
this.DataAdapter = SelectAdapter;
|
||||
}
|
||||
|
||||
return Options;
|
||||
})
|
||||
;
|
||||
define('select2/core',[
|
||||
"jquery",
|
||||
"./options",
|
||||
"./utils"
|
||||
], function ($, Options, Utils) {
|
||||
var Select2 = function (element, options) {
|
||||
this.element = element;
|
||||
this.options = new Options(options);
|
||||
|
||||
this.adapter = new this.options.DataAdapter(element, options);
|
||||
};
|
||||
|
||||
Utils.Extend(Select2, Utils.Observable);
|
||||
|
||||
return Select2;
|
||||
});
|
||||
|
97
dist/js/select2.amd.js
vendored
Normal file
97
dist/js/select2.amd.js
vendored
Normal file
@ -0,0 +1,97 @@
|
||||
define('select2/utils',[], function () {
|
||||
var Utils = {};
|
||||
|
||||
Utils.Extend = function (ChildClass, SuperClass) {
|
||||
var __hasProp = {}.hasOwnProperty
|
||||
|
||||
function BaseConstructor () {
|
||||
this.constructor = ChildClass;
|
||||
}
|
||||
|
||||
for (var key in SuperClass) {
|
||||
if (__hasProp.call(SuperClass, key)) {
|
||||
ChildClass[key] = SuperClass[key];
|
||||
}
|
||||
}
|
||||
|
||||
BaseConstructor.prototype = SuperClass.prototype;
|
||||
ChildClass.prototype = new BaseConstructor();
|
||||
ChildClass.__super__ = SuperClass.prototype;
|
||||
|
||||
return ChildClass;
|
||||
};
|
||||
|
||||
var Observable = function () {
|
||||
this.listeners = {};
|
||||
};
|
||||
|
||||
Observable.prototype.on = function (event, callback) {
|
||||
if (event in this.listeners) {
|
||||
this.listeners[event].push(callback);
|
||||
} else {
|
||||
this.listeners[event] = [callback];
|
||||
}
|
||||
};
|
||||
|
||||
Observable.prototype.trigger = function (event) {
|
||||
if (event in this.listeners) {
|
||||
this.invoke(this.listeners[event], util.shift(arguments));
|
||||
}
|
||||
|
||||
if ("*" in this.listeners) {
|
||||
this.invoke(this.listeners["*"], arguments);
|
||||
}
|
||||
};
|
||||
|
||||
Observable.prototype.invoke = function (listeners, params) {
|
||||
for (var i = 0, len = listeners.length; i < len; i++) {
|
||||
listeners[i].apply(this, params);
|
||||
}
|
||||
};
|
||||
|
||||
Utils.Observable = Observable;
|
||||
|
||||
return Utils;
|
||||
});
|
||||
|
||||
define('select2/adapters/select',[
|
||||
"../utils"
|
||||
], function (Utils) {
|
||||
function SelectAdapter (element, options) {
|
||||
this.element = element;
|
||||
}
|
||||
|
||||
Utils.Extend(SelectAdapter, Utils.Observable);
|
||||
|
||||
return SelectAdapter;
|
||||
});
|
||||
|
||||
define('select2/options',[
|
||||
"./adapters/select"
|
||||
], function (SelectAdapter) {
|
||||
function Options (options) {
|
||||
this.options = options;
|
||||
|
||||
this.DataAdapter = SelectAdapter;
|
||||
}
|
||||
|
||||
return Options;
|
||||
})
|
||||
;
|
||||
define('select2/core',[
|
||||
"jquery",
|
||||
"./options",
|
||||
"./utils"
|
||||
], function ($, Options, Utils) {
|
||||
var Select2 = function (element, options) {
|
||||
this.element = element;
|
||||
this.options = new Options(options);
|
||||
|
||||
this.adapter = new this.options.DataAdapter(element, options);
|
||||
};
|
||||
|
||||
Utils.Extend(Select2, Utils.Observable);
|
||||
|
||||
return Select2;
|
||||
});
|
||||
|
9634
dist/js/select2.full.js
vendored
Normal file
9634
dist/js/select2.full.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3
dist/js/select2.full.min.js
vendored
Normal file
3
dist/js/select2.full.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
525
dist/js/select2.js
vendored
Normal file
525
dist/js/select2.js
vendored
Normal file
@ -0,0 +1,525 @@
|
||||
/**
|
||||
* @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
|
||||
* Available via the MIT or new BSD license.
|
||||
* see: http://github.com/jrburke/almond for details
|
||||
*/
|
||||
//Going sloppy to avoid 'use strict' string cost, but strict practices should
|
||||
//be followed.
|
||||
/*jslint sloppy: true */
|
||||
/*global setTimeout: false */
|
||||
|
||||
var requirejs, require, define;
|
||||
(function (undef) {
|
||||
var main, req, makeMap, handlers,
|
||||
defined = {},
|
||||
waiting = {},
|
||||
config = {},
|
||||
defining = {},
|
||||
hasOwn = Object.prototype.hasOwnProperty,
|
||||
aps = [].slice,
|
||||
jsSuffixRegExp = /\.js$/;
|
||||
|
||||
function hasProp(obj, prop) {
|
||||
return hasOwn.call(obj, prop);
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a relative module name, like ./something, normalize it to
|
||||
* a real name that can be mapped to a path.
|
||||
* @param {String} name the relative name
|
||||
* @param {String} baseName a real name that the name arg is relative
|
||||
* to.
|
||||
* @returns {String} normalized name
|
||||
*/
|
||||
function normalize(name, baseName) {
|
||||
var nameParts, nameSegment, mapValue, foundMap, lastIndex,
|
||||
foundI, foundStarMap, starI, i, j, part,
|
||||
baseParts = baseName && baseName.split("/"),
|
||||
map = config.map,
|
||||
starMap = (map && map['*']) || {};
|
||||
|
||||
//Adjust any relative paths.
|
||||
if (name && name.charAt(0) === ".") {
|
||||
//If have a base name, try to normalize against it,
|
||||
//otherwise, assume it is a top-level require that will
|
||||
//be relative to baseUrl in the end.
|
||||
if (baseName) {
|
||||
//Convert baseName to array, and lop off the last part,
|
||||
//so that . matches that "directory" and not name of the baseName's
|
||||
//module. For instance, baseName of "one/two/three", maps to
|
||||
//"one/two/three.js", but we want the directory, "one/two" for
|
||||
//this normalization.
|
||||
baseParts = baseParts.slice(0, baseParts.length - 1);
|
||||
name = name.split('/');
|
||||
lastIndex = name.length - 1;
|
||||
|
||||
// Node .js allowance:
|
||||
if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
|
||||
name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
|
||||
}
|
||||
|
||||
name = baseParts.concat(name);
|
||||
|
||||
//start trimDots
|
||||
for (i = 0; i < name.length; i += 1) {
|
||||
part = name[i];
|
||||
if (part === ".") {
|
||||
name.splice(i, 1);
|
||||
i -= 1;
|
||||
} else if (part === "..") {
|
||||
if (i === 1 && (name[2] === '..' || name[0] === '..')) {
|
||||
//End of the line. Keep at least one non-dot
|
||||
//path segment at the front so it can be mapped
|
||||
//correctly to disk. Otherwise, there is likely
|
||||
//no path mapping for a path starting with '..'.
|
||||
//This can still fail, but catches the most reasonable
|
||||
//uses of ..
|
||||
break;
|
||||
} else if (i > 0) {
|
||||
name.splice(i - 1, 2);
|
||||
i -= 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
//end trimDots
|
||||
|
||||
name = name.join("/");
|
||||
} else if (name.indexOf('./') === 0) {
|
||||
// No baseName, so this is ID is resolved relative
|
||||
// to baseUrl, pull off the leading dot.
|
||||
name = name.substring(2);
|
||||
}
|
||||
}
|
||||
|
||||
//Apply map config if available.
|
||||
if ((baseParts || starMap) && map) {
|
||||
nameParts = name.split('/');
|
||||
|
||||
for (i = nameParts.length; i > 0; i -= 1) {
|
||||
nameSegment = nameParts.slice(0, i).join("/");
|
||||
|
||||
if (baseParts) {
|
||||
//Find the longest baseName segment match in the config.
|
||||
//So, do joins on the biggest to smallest lengths of baseParts.
|
||||
for (j = baseParts.length; j > 0; j -= 1) {
|
||||
mapValue = map[baseParts.slice(0, j).join('/')];
|
||||
|
||||
//baseName segment has config, find if it has one for
|
||||
//this name.
|
||||
if (mapValue) {
|
||||
mapValue = mapValue[nameSegment];
|
||||
if (mapValue) {
|
||||
//Match, update name to the new value.
|
||||
foundMap = mapValue;
|
||||
foundI = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (foundMap) {
|
||||
break;
|
||||
}
|
||||
|
||||
//Check for a star map match, but just hold on to it,
|
||||
//if there is a shorter segment match later in a matching
|
||||
//config, then favor over this star map.
|
||||
if (!foundStarMap && starMap && starMap[nameSegment]) {
|
||||
foundStarMap = starMap[nameSegment];
|
||||
starI = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (!foundMap && foundStarMap) {
|
||||
foundMap = foundStarMap;
|
||||
foundI = starI;
|
||||
}
|
||||
|
||||
if (foundMap) {
|
||||
nameParts.splice(0, foundI, foundMap);
|
||||
name = nameParts.join('/');
|
||||
}
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
function makeRequire(relName, forceSync) {
|
||||
return function () {
|
||||
//A version of a require function that passes a moduleName
|
||||
//value for items that may need to
|
||||
//look up paths relative to the moduleName
|
||||
return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));
|
||||
};
|
||||
}
|
||||
|
||||
function makeNormalize(relName) {
|
||||
return function (name) {
|
||||
return normalize(name, relName);
|
||||
};
|
||||
}
|
||||
|
||||
function makeLoad(depName) {
|
||||
return function (value) {
|
||||
defined[depName] = value;
|
||||
};
|
||||
}
|
||||
|
||||
function callDep(name) {
|
||||
if (hasProp(waiting, name)) {
|
||||
var args = waiting[name];
|
||||
delete waiting[name];
|
||||
defining[name] = true;
|
||||
main.apply(undef, args);
|
||||
}
|
||||
|
||||
if (!hasProp(defined, name) && !hasProp(defining, name)) {
|
||||
throw new Error('No ' + name);
|
||||
}
|
||||
return defined[name];
|
||||
}
|
||||
|
||||
//Turns a plugin!resource to [plugin, resource]
|
||||
//with the plugin being undefined if the name
|
||||
//did not have a plugin prefix.
|
||||
function splitPrefix(name) {
|
||||
var prefix,
|
||||
index = name ? name.indexOf('!') : -1;
|
||||
if (index > -1) {
|
||||
prefix = name.substring(0, index);
|
||||
name = name.substring(index + 1, name.length);
|
||||
}
|
||||
return [prefix, name];
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes a name map, normalizing the name, and using a plugin
|
||||
* for normalization if necessary. Grabs a ref to plugin
|
||||
* too, as an optimization.
|
||||
*/
|
||||
makeMap = function (name, relName) {
|
||||
var plugin,
|
||||
parts = splitPrefix(name),
|
||||
prefix = parts[0];
|
||||
|
||||
name = parts[1];
|
||||
|
||||
if (prefix) {
|
||||
prefix = normalize(prefix, relName);
|
||||
plugin = callDep(prefix);
|
||||
}
|
||||
|
||||
//Normalize according
|
||||
if (prefix) {
|
||||
if (plugin && plugin.normalize) {
|
||||
name = plugin.normalize(name, makeNormalize(relName));
|
||||
} else {
|
||||
name = normalize(name, relName);
|
||||
}
|
||||
} else {
|
||||
name = normalize(name, relName);
|
||||
parts = splitPrefix(name);
|
||||
prefix = parts[0];
|
||||
name = parts[1];
|
||||
if (prefix) {
|
||||
plugin = callDep(prefix);
|
||||
}
|
||||
}
|
||||
|
||||
//Using ridiculous property names for space reasons
|
||||
return {
|
||||
f: prefix ? prefix + '!' + name : name, //fullName
|
||||
n: name,
|
||||
pr: prefix,
|
||||
p: plugin
|
||||
};
|
||||
};
|
||||
|
||||
function makeConfig(name) {
|
||||
return function () {
|
||||
return (config && config.config && config.config[name]) || {};
|
||||
};
|
||||
}
|
||||
|
||||
handlers = {
|
||||
require: function (name) {
|
||||
return makeRequire(name);
|
||||
},
|
||||
exports: function (name) {
|
||||
var e = defined[name];
|
||||
if (typeof e !== 'undefined') {
|
||||
return e;
|
||||
} else {
|
||||
return (defined[name] = {});
|
||||
}
|
||||
},
|
||||
module: function (name) {
|
||||
return {
|
||||
id: name,
|
||||
uri: '',
|
||||
exports: defined[name],
|
||||
config: makeConfig(name)
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
main = function (name, deps, callback, relName) {
|
||||
var cjsModule, depName, ret, map, i,
|
||||
args = [],
|
||||
callbackType = typeof callback,
|
||||
usingExports;
|
||||
|
||||
//Use name if no relName
|
||||
relName = relName || name;
|
||||
|
||||
//Call the callback to define the module, if necessary.
|
||||
if (callbackType === 'undefined' || callbackType === 'function') {
|
||||
//Pull out the defined dependencies and pass the ordered
|
||||
//values to the callback.
|
||||
//Default to [require, exports, module] if no deps
|
||||
deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
|
||||
for (i = 0; i < deps.length; i += 1) {
|
||||
map = makeMap(deps[i], relName);
|
||||
depName = map.f;
|
||||
|
||||
//Fast path CommonJS standard dependencies.
|
||||
if (depName === "require") {
|
||||
args[i] = handlers.require(name);
|
||||
} else if (depName === "exports") {
|
||||
//CommonJS module spec 1.1
|
||||
args[i] = handlers.exports(name);
|
||||
usingExports = true;
|
||||
} else if (depName === "module") {
|
||||
//CommonJS module spec 1.1
|
||||
cjsModule = args[i] = handlers.module(name);
|
||||
} else if (hasProp(defined, depName) ||
|
||||
hasProp(waiting, depName) ||
|
||||
hasProp(defining, depName)) {
|
||||
args[i] = callDep(depName);
|
||||
} else if (map.p) {
|
||||
map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
|
||||
args[i] = defined[depName];
|
||||
} else {
|
||||
throw new Error(name + ' missing ' + depName);
|
||||
}
|
||||
}
|
||||
|
||||
ret = callback ? callback.apply(defined[name], args) : undefined;
|
||||
|
||||
if (name) {
|
||||
//If setting exports via "module" is in play,
|
||||
//favor that over return value and exports. After that,
|
||||
//favor a non-undefined return value over exports use.
|
||||
if (cjsModule && cjsModule.exports !== undef &&
|
||||
cjsModule.exports !== defined[name]) {
|
||||
defined[name] = cjsModule.exports;
|
||||
} else if (ret !== undef || !usingExports) {
|
||||
//Use the return value from the function.
|
||||
defined[name] = ret;
|
||||
}
|
||||
}
|
||||
} else if (name) {
|
||||
//May just be an object definition for the module. Only
|
||||
//worry about defining if have a module name.
|
||||
defined[name] = callback;
|
||||
}
|
||||
};
|
||||
|
||||
requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
|
||||
if (typeof deps === "string") {
|
||||
if (handlers[deps]) {
|
||||
//callback in this case is really relName
|
||||
return handlers[deps](callback);
|
||||
}
|
||||
//Just return the module wanted. In this scenario, the
|
||||
//deps arg is the module name, and second arg (if passed)
|
||||
//is just the relName.
|
||||
//Normalize module name, if it contains . or ..
|
||||
return callDep(makeMap(deps, callback).f);
|
||||
} else if (!deps.splice) {
|
||||
//deps is a config object, not an array.
|
||||
config = deps;
|
||||
if (config.deps) {
|
||||
req(config.deps, config.callback);
|
||||
}
|
||||
if (!callback) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (callback.splice) {
|
||||
//callback is an array, which means it is a dependency list.
|
||||
//Adjust args if there are dependencies
|
||||
deps = callback;
|
||||
callback = relName;
|
||||
relName = null;
|
||||
} else {
|
||||
deps = undef;
|
||||
}
|
||||
}
|
||||
|
||||
//Support require(['a'])
|
||||
callback = callback || function () {};
|
||||
|
||||
//If relName is a function, it is an errback handler,
|
||||
//so remove it.
|
||||
if (typeof relName === 'function') {
|
||||
relName = forceSync;
|
||||
forceSync = alt;
|
||||
}
|
||||
|
||||
//Simulate async callback;
|
||||
if (forceSync) {
|
||||
main(undef, deps, callback, relName);
|
||||
} else {
|
||||
//Using a non-zero value because of concern for what old browsers
|
||||
//do, and latest browsers "upgrade" to 4 if lower value is used:
|
||||
//http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
|
||||
//If want a value immediately, use require('id') instead -- something
|
||||
//that works in almond on the global level, but not guaranteed and
|
||||
//unlikely to work in other AMD implementations.
|
||||
setTimeout(function () {
|
||||
main(undef, deps, callback, relName);
|
||||
}, 4);
|
||||
}
|
||||
|
||||
return req;
|
||||
};
|
||||
|
||||
/**
|
||||
* Just drops the config on the floor, but returns req in case
|
||||
* the config return value is used.
|
||||
*/
|
||||
req.config = function (cfg) {
|
||||
return req(cfg);
|
||||
};
|
||||
|
||||
/**
|
||||
* Expose module registry for debugging and tooling
|
||||
*/
|
||||
requirejs._defined = defined;
|
||||
|
||||
define = function (name, deps, callback) {
|
||||
|
||||
//This module may not have dependencies
|
||||
if (!deps.splice) {
|
||||
//deps is not an array, so probably means
|
||||
//an object literal or factory function for
|
||||
//the value. Adjust args.
|
||||
callback = deps;
|
||||
deps = [];
|
||||
}
|
||||
|
||||
if (!hasProp(defined, name) && !hasProp(waiting, name)) {
|
||||
waiting[name] = [name, deps, callback];
|
||||
}
|
||||
};
|
||||
|
||||
define.amd = {
|
||||
jQuery: true
|
||||
};
|
||||
}());
|
||||
|
||||
define("almond", function(){});
|
||||
|
||||
define('jquery',[],function () {
|
||||
return jQuery;
|
||||
})
|
||||
;
|
||||
define('select2/utils',[], function () {
|
||||
var Utils = {};
|
||||
|
||||
Utils.Extend = function (ChildClass, SuperClass) {
|
||||
var __hasProp = {}.hasOwnProperty
|
||||
|
||||
function BaseConstructor () {
|
||||
this.constructor = ChildClass;
|
||||
}
|
||||
|
||||
for (var key in SuperClass) {
|
||||
if (__hasProp.call(SuperClass, key)) {
|
||||
ChildClass[key] = SuperClass[key];
|
||||
}
|
||||
}
|
||||
|
||||
BaseConstructor.prototype = SuperClass.prototype;
|
||||
ChildClass.prototype = new BaseConstructor();
|
||||
ChildClass.__super__ = SuperClass.prototype;
|
||||
|
||||
return ChildClass;
|
||||
};
|
||||
|
||||
var Observable = function () {
|
||||
this.listeners = {};
|
||||
};
|
||||
|
||||
Observable.prototype.on = function (event, callback) {
|
||||
if (event in this.listeners) {
|
||||
this.listeners[event].push(callback);
|
||||
} else {
|
||||
this.listeners[event] = [callback];
|
||||
}
|
||||
};
|
||||
|
||||
Observable.prototype.trigger = function (event) {
|
||||
if (event in this.listeners) {
|
||||
this.invoke(this.listeners[event], util.shift(arguments));
|
||||
}
|
||||
|
||||
if ("*" in this.listeners) {
|
||||
this.invoke(this.listeners["*"], arguments);
|
||||
}
|
||||
};
|
||||
|
||||
Observable.prototype.invoke = function (listeners, params) {
|
||||
for (var i = 0, len = listeners.length; i < len; i++) {
|
||||
listeners[i].apply(this, params);
|
||||
}
|
||||
};
|
||||
|
||||
Utils.Observable = Observable;
|
||||
|
||||
return Utils;
|
||||
});
|
||||
|
||||
define('select2/adapters/select',[
|
||||
"../utils"
|
||||
], function (Utils) {
|
||||
function SelectAdapter (element, options) {
|
||||
this.element = element;
|
||||
}
|
||||
|
||||
Utils.Extend(SelectAdapter, Utils.Observable);
|
||||
|
||||
return SelectAdapter;
|
||||
});
|
||||
|
||||
define('select2/options',[
|
||||
"./adapters/select"
|
||||
], function (SelectAdapter) {
|
||||
function Options (options) {
|
||||
this.options = options;
|
||||
|
||||
this.DataAdapter = SelectAdapter;
|
||||
}
|
||||
|
||||
return Options;
|
||||
})
|
||||
;
|
||||
define('select2/core',[
|
||||
"jquery",
|
||||
"./options",
|
||||
"./utils"
|
||||
], function ($, Options, Utils) {
|
||||
var Select2 = function (element, options) {
|
||||
this.element = element;
|
||||
this.options = new Options(options);
|
||||
|
||||
this.adapter = new this.options.DataAdapter(element, options);
|
||||
};
|
||||
|
||||
Utils.Extend(Select2, Utils.Observable);
|
||||
|
||||
return Select2;
|
||||
});
|
||||
|
1
dist/js/select2.min.js
vendored
Normal file
1
dist/js/select2.min.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
var requirejs,require,define;!function(a){function b(a,b){return r.call(a,b)}function c(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=p.map,q=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(n=n.slice(0,n.length-1),a=a.split("/"),g=a.length-1,p.nodeIdCompat&&t.test(a[g])&&(a[g]=a[g].replace(t,"")),a=n.concat(a),k=0;k<a.length;k+=1)if(m=a[k],"."===m)a.splice(k,1),k-=1;else if(".."===m){if(1===k&&(".."===a[2]||".."===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||q)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&q&&q[d]&&(i=q[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function d(b,c){return function(){return k.apply(a,s.call(arguments,0).concat([b,c]))}}function e(a){return function(b){return c(b,a)}}function f(a){return function(b){n[a]=b}}function g(c){if(b(o,c)){var d=o[c];delete o[c],q[c]=!0,j.apply(a,d)}if(!b(n,c)&&!b(q,c))throw new Error("No "+c);return n[c]}function h(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function i(a){return function(){return p&&p.config&&p.config[a]||{}}}var j,k,l,m,n={},o={},p={},q={},r=Object.prototype.hasOwnProperty,s=[].slice,t=/\.js$/;l=function(a,b){var d,f=h(a),i=f[0];return a=f[1],i&&(i=c(i,b),d=g(i)),i?a=d&&d.normalize?d.normalize(a,e(b)):c(a,b):(a=c(a,b),f=h(a),i=f[0],a=f[1],i&&(d=g(i))),{f:i?i+"!"+a:a,n:a,pr:i,p:d}},m={require:function(a){return d(a)},exports:function(a){var b=n[a];return"undefined"!=typeof b?b:n[a]={}},module:function(a){return{id:a,uri:"",exports:n[a],config:i(a)}}},j=function(c,e,h,i){var j,k,p,r,s,t,u=[],v=typeof h;if(i=i||c,"undefined"===v||"function"===v){for(e=!e.length&&h.length?["require","exports","module"]:e,s=0;s<e.length;s+=1)if(r=l(e[s],i),k=r.f,"require"===k)u[s]=m.require(c);else if("exports"===k)u[s]=m.exports(c),t=!0;else if("module"===k)j=u[s]=m.module(c);else if(b(n,k)||b(o,k)||b(q,k))u[s]=g(k);else{if(!r.p)throw new Error(c+" missing "+k);r.p.load(r.n,d(i,!0),f(k),{}),u[s]=n[k]}p=h?h.apply(n[c],u):void 0,c&&(j&&j.exports!==a&&j.exports!==n[c]?n[c]=j.exports:p===a&&t||(n[c]=p))}else c&&(n[c]=h)},requirejs=require=k=function(b,c,d,e,f){if("string"==typeof b)return m[b]?m[b](c):g(l(b,c).f);if(!b.splice){if(p=b,p.deps&&k(p.deps,p.callback),!c)return;c.splice?(b=c,c=d,d=null):b=a}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?j(a,b,c,d):setTimeout(function(){j(a,b,c,d)},4),k},k.config=function(a){return k(a)},requirejs._defined=n,define=function(a,c,d){c.splice||(d=c,c=[]),b(n,a)||b(o,a)||(o[a]=[a,c,d])},define.amd={jQuery:!0}}(),define("almond",function(){}),define("jquery",[],function(){return jQuery}),define("select2/utils",[],function(){var a={};a.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a};var b=function(){this.listeners={}};return b.prototype.on=function(a,b){a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},b.prototype.trigger=function(a){a in this.listeners&&this.invoke(this.listeners[a],util.shift(arguments)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},b.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},a.Observable=b,a}),define("select2/core",["jquery","./utils"],function(a,b){var c=b.Extend(c,b.Observable);return c.constructor=function(){this.__super__.constructor.call(this)},c});
|
45
package.json
Normal file
45
package.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"name": "Select2",
|
||||
"description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
|
||||
"homepage": "http://ivaynberg.github.io/select2",
|
||||
"author": "Igor Vaynberg",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/ivaynberg/select2.git"
|
||||
},
|
||||
"main": "dist/js/select2.js",
|
||||
"version": "3.4.8",
|
||||
"jspm": {
|
||||
"main": "select2",
|
||||
"files": [
|
||||
"select2.js",
|
||||
"select2.png",
|
||||
"select2.css",
|
||||
"select2-spinner.gif"
|
||||
],
|
||||
"shim": {
|
||||
"select2": {
|
||||
"imports": [
|
||||
"jquery",
|
||||
"./select2.css!"
|
||||
],
|
||||
"exports": "$"
|
||||
}
|
||||
},
|
||||
"buildConfig": {
|
||||
"uglify": true
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"grunt": "^0.4.5",
|
||||
"grunt-cli": "^0.1.13",
|
||||
"grunt-contrib-concat": "^0.4.0",
|
||||
"grunt-contrib-nodeunit": "~0.3.3",
|
||||
"grunt-contrib-qunit": "~0.4.0",
|
||||
"grunt-contrib-requirejs": "^0.4.4",
|
||||
"grunt-contrib-uglify": "~0.4.0",
|
||||
"grunt-contrib-watch": "~0.6.0",
|
||||
"grunt-sass": "~0.12.0",
|
||||
"node-sass": "~0.8.6"
|
||||
}
|
||||
}
|
@ -3,28 +3,12 @@
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>QUnit Example</title>
|
||||
<link href="../../src/scss/core.css" rel="stylesheet"/>
|
||||
<link href="../../src/scss/theme/default/layout.css" rel="stylesheet"/>
|
||||
<link href="../../dist/css/select2.css" rel="stylesheet"/>
|
||||
|
||||
<script src="../../vendor/almond-0.2.9.js" type="text/javascript"></script>
|
||||
<script src="../../vendor/jquery-2.1.0.js" type="text/javascript"></script>
|
||||
<script src="../../src/js/util.js"></script>
|
||||
<script src="../../src/js/data.js"></script>
|
||||
<script src="../../src/js/selection.js"></script>
|
||||
<script src="../../src/js/results.js"></script>
|
||||
<script src="../../src/js/core.js"></script>
|
||||
|
||||
<script>
|
||||
$(function () {
|
||||
$("#source").on("change", function () {
|
||||
console.log("onchange");
|
||||
});
|
||||
new s2.Select($("#source"), {
|
||||
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../../dist/js/select2.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@ -82,7 +66,7 @@
|
||||
<option value="VA">Virginia</option>
|
||||
<option value="WV">West Virginia</option>
|
||||
</select><br/>
|
||||
<input type="text" style="width:300px"/><br/>
|
||||
<input type="text" style="width:300px" /><br/>
|
||||
<select style="width:300px">
|
||||
<option value="AK">Alaska</option>
|
||||
<option value="HI">Hawaii</option>
|
||||
@ -137,7 +121,6 @@
|
||||
</select>
|
||||
|
||||
<div style="width: 300px; height: 300px; border: 1px solid black" tabindex="10" id="outer">
|
||||
|
||||
<div style="width:100px; height: 100px; border: 1px solid blue" id="inner"></div>
|
||||
</div>
|
||||
|
||||
@ -160,8 +143,11 @@
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
require(["select2/core"], function (Select2) {
|
||||
var s2 = new Select2($("#source"));
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
3
src/js/jquery.shim.js
Normal file
3
src/js/jquery.shim.js
Normal file
@ -0,0 +1,3 @@
|
||||
define(function () {
|
||||
return jQuery;
|
||||
})
|
11
src/js/select2/adapters/select.js
vendored
Normal file
11
src/js/select2/adapters/select.js
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
define([
|
||||
"../utils"
|
||||
], function (Utils) {
|
||||
function SelectAdapter (element, options) {
|
||||
this.element = element;
|
||||
}
|
||||
|
||||
Utils.Extend(SelectAdapter, Utils.Observable);
|
||||
|
||||
return SelectAdapter;
|
||||
});
|
16
src/js/select2/core.js
vendored
Normal file
16
src/js/select2/core.js
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
define([
|
||||
"jquery",
|
||||
"./options",
|
||||
"./utils"
|
||||
], function ($, Options, Utils) {
|
||||
var Select2 = function (element, options) {
|
||||
this.element = element;
|
||||
this.options = new Options(options);
|
||||
|
||||
this.adapter = new this.options.DataAdapter(element, options);
|
||||
};
|
||||
|
||||
Utils.Extend(Select2, Utils.Observable);
|
||||
|
||||
return Select2;
|
||||
});
|
11
src/js/select2/options.js
vendored
Normal file
11
src/js/select2/options.js
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
define([
|
||||
"./adapters/select"
|
||||
], function (SelectAdapter) {
|
||||
function Options (options) {
|
||||
this.options = options;
|
||||
|
||||
this.DataAdapter = SelectAdapter;
|
||||
}
|
||||
|
||||
return Options;
|
||||
})
|
55
src/js/select2/utils.js
vendored
Normal file
55
src/js/select2/utils.js
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
define([], function () {
|
||||
var Utils = {};
|
||||
|
||||
Utils.Extend = function (ChildClass, SuperClass) {
|
||||
var __hasProp = {}.hasOwnProperty
|
||||
|
||||
function BaseConstructor () {
|
||||
this.constructor = ChildClass;
|
||||
}
|
||||
|
||||
for (var key in SuperClass) {
|
||||
if (__hasProp.call(SuperClass, key)) {
|
||||
ChildClass[key] = SuperClass[key];
|
||||
}
|
||||
}
|
||||
|
||||
BaseConstructor.prototype = SuperClass.prototype;
|
||||
ChildClass.prototype = new BaseConstructor();
|
||||
ChildClass.__super__ = SuperClass.prototype;
|
||||
|
||||
return ChildClass;
|
||||
};
|
||||
|
||||
var Observable = function () {
|
||||
this.listeners = {};
|
||||
};
|
||||
|
||||
Observable.prototype.on = function (event, callback) {
|
||||
if (event in this.listeners) {
|
||||
this.listeners[event].push(callback);
|
||||
} else {
|
||||
this.listeners[event] = [callback];
|
||||
}
|
||||
};
|
||||
|
||||
Observable.prototype.trigger = function (event) {
|
||||
if (event in this.listeners) {
|
||||
this.invoke(this.listeners[event], util.shift(arguments));
|
||||
}
|
||||
|
||||
if ("*" in this.listeners) {
|
||||
this.invoke(this.listeners["*"], arguments);
|
||||
}
|
||||
};
|
||||
|
||||
Observable.prototype.invoke = function (listeners, params) {
|
||||
for (var i = 0, len = listeners.length; i < len; i++) {
|
||||
listeners[i].apply(this, params);
|
||||
}
|
||||
};
|
||||
|
||||
Utils.Observable = Observable;
|
||||
|
||||
return Utils;
|
||||
});
|
421
vendor/almond-0.2.9.js
vendored
Normal file
421
vendor/almond-0.2.9.js
vendored
Normal file
@ -0,0 +1,421 @@
|
||||
/**
|
||||
* @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
|
||||
* Available via the MIT or new BSD license.
|
||||
* see: http://github.com/jrburke/almond for details
|
||||
*/
|
||||
//Going sloppy to avoid 'use strict' string cost, but strict practices should
|
||||
//be followed.
|
||||
/*jslint sloppy: true */
|
||||
/*global setTimeout: false */
|
||||
|
||||
var requirejs, require, define;
|
||||
(function (undef) {
|
||||
var main, req, makeMap, handlers,
|
||||
defined = {},
|
||||
waiting = {},
|
||||
config = {},
|
||||
defining = {},
|
||||
hasOwn = Object.prototype.hasOwnProperty,
|
||||
aps = [].slice,
|
||||
jsSuffixRegExp = /\.js$/;
|
||||
|
||||
function hasProp(obj, prop) {
|
||||
return hasOwn.call(obj, prop);
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a relative module name, like ./something, normalize it to
|
||||
* a real name that can be mapped to a path.
|
||||
* @param {String} name the relative name
|
||||
* @param {String} baseName a real name that the name arg is relative
|
||||
* to.
|
||||
* @returns {String} normalized name
|
||||
*/
|
||||
function normalize(name, baseName) {
|
||||
var nameParts, nameSegment, mapValue, foundMap, lastIndex,
|
||||
foundI, foundStarMap, starI, i, j, part,
|
||||
baseParts = baseName && baseName.split("/"),
|
||||
map = config.map,
|
||||
starMap = (map && map['*']) || {};
|
||||
|
||||
//Adjust any relative paths.
|
||||
if (name && name.charAt(0) === ".") {
|
||||
//If have a base name, try to normalize against it,
|
||||
//otherwise, assume it is a top-level require that will
|
||||
//be relative to baseUrl in the end.
|
||||
if (baseName) {
|
||||
//Convert baseName to array, and lop off the last part,
|
||||
//so that . matches that "directory" and not name of the baseName's
|
||||
//module. For instance, baseName of "one/two/three", maps to
|
||||
//"one/two/three.js", but we want the directory, "one/two" for
|
||||
//this normalization.
|
||||
baseParts = baseParts.slice(0, baseParts.length - 1);
|
||||
name = name.split('/');
|
||||
lastIndex = name.length - 1;
|
||||
|
||||
// Node .js allowance:
|
||||
if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
|
||||
name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
|
||||
}
|
||||
|
||||
name = baseParts.concat(name);
|
||||
|
||||
//start trimDots
|
||||
for (i = 0; i < name.length; i += 1) {
|
||||
part = name[i];
|
||||
if (part === ".") {
|
||||
name.splice(i, 1);
|
||||
i -= 1;
|
||||
} else if (part === "..") {
|
||||
if (i === 1 && (name[2] === '..' || name[0] === '..')) {
|
||||
//End of the line. Keep at least one non-dot
|
||||
//path segment at the front so it can be mapped
|
||||
//correctly to disk. Otherwise, there is likely
|
||||
//no path mapping for a path starting with '..'.
|
||||
//This can still fail, but catches the most reasonable
|
||||
//uses of ..
|
||||
break;
|
||||
} else if (i > 0) {
|
||||
name.splice(i - 1, 2);
|
||||
i -= 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
//end trimDots
|
||||
|
||||
name = name.join("/");
|
||||
} else if (name.indexOf('./') === 0) {
|
||||
// No baseName, so this is ID is resolved relative
|
||||
// to baseUrl, pull off the leading dot.
|
||||
name = name.substring(2);
|
||||
}
|
||||
}
|
||||
|
||||
//Apply map config if available.
|
||||
if ((baseParts || starMap) && map) {
|
||||
nameParts = name.split('/');
|
||||
|
||||
for (i = nameParts.length; i > 0; i -= 1) {
|
||||
nameSegment = nameParts.slice(0, i).join("/");
|
||||
|
||||
if (baseParts) {
|
||||
//Find the longest baseName segment match in the config.
|
||||
//So, do joins on the biggest to smallest lengths of baseParts.
|
||||
for (j = baseParts.length; j > 0; j -= 1) {
|
||||
mapValue = map[baseParts.slice(0, j).join('/')];
|
||||
|
||||
//baseName segment has config, find if it has one for
|
||||
//this name.
|
||||
if (mapValue) {
|
||||
mapValue = mapValue[nameSegment];
|
||||
if (mapValue) {
|
||||
//Match, update name to the new value.
|
||||
foundMap = mapValue;
|
||||
foundI = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (foundMap) {
|
||||
break;
|
||||
}
|
||||
|
||||
//Check for a star map match, but just hold on to it,
|
||||
//if there is a shorter segment match later in a matching
|
||||
//config, then favor over this star map.
|
||||
if (!foundStarMap && starMap && starMap[nameSegment]) {
|
||||
foundStarMap = starMap[nameSegment];
|
||||
starI = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (!foundMap && foundStarMap) {
|
||||
foundMap = foundStarMap;
|
||||
foundI = starI;
|
||||
}
|
||||
|
||||
if (foundMap) {
|
||||
nameParts.splice(0, foundI, foundMap);
|
||||
name = nameParts.join('/');
|
||||
}
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
function makeRequire(relName, forceSync) {
|
||||
return function () {
|
||||
//A version of a require function that passes a moduleName
|
||||
//value for items that may need to
|
||||
//look up paths relative to the moduleName
|
||||
return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));
|
||||
};
|
||||
}
|
||||
|
||||
function makeNormalize(relName) {
|
||||
return function (name) {
|
||||
return normalize(name, relName);
|
||||
};
|
||||
}
|
||||
|
||||
function makeLoad(depName) {
|
||||
return function (value) {
|
||||
defined[depName] = value;
|
||||
};
|
||||
}
|
||||
|
||||
function callDep(name) {
|
||||
if (hasProp(waiting, name)) {
|
||||
var args = waiting[name];
|
||||
delete waiting[name];
|
||||
defining[name] = true;
|
||||
main.apply(undef, args);
|
||||
}
|
||||
|
||||
if (!hasProp(defined, name) && !hasProp(defining, name)) {
|
||||
throw new Error('No ' + name);
|
||||
}
|
||||
return defined[name];
|
||||
}
|
||||
|
||||
//Turns a plugin!resource to [plugin, resource]
|
||||
//with the plugin being undefined if the name
|
||||
//did not have a plugin prefix.
|
||||
function splitPrefix(name) {
|
||||
var prefix,
|
||||
index = name ? name.indexOf('!') : -1;
|
||||
if (index > -1) {
|
||||
prefix = name.substring(0, index);
|
||||
name = name.substring(index + 1, name.length);
|
||||
}
|
||||
return [prefix, name];
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes a name map, normalizing the name, and using a plugin
|
||||
* for normalization if necessary. Grabs a ref to plugin
|
||||
* too, as an optimization.
|
||||
*/
|
||||
makeMap = function (name, relName) {
|
||||
var plugin,
|
||||
parts = splitPrefix(name),
|
||||
prefix = parts[0];
|
||||
|
||||
name = parts[1];
|
||||
|
||||
if (prefix) {
|
||||
prefix = normalize(prefix, relName);
|
||||
plugin = callDep(prefix);
|
||||
}
|
||||
|
||||
//Normalize according
|
||||
if (prefix) {
|
||||
if (plugin && plugin.normalize) {
|
||||
name = plugin.normalize(name, makeNormalize(relName));
|
||||
} else {
|
||||
name = normalize(name, relName);
|
||||
}
|
||||
} else {
|
||||
name = normalize(name, relName);
|
||||
parts = splitPrefix(name);
|
||||
prefix = parts[0];
|
||||
name = parts[1];
|
||||
if (prefix) {
|
||||
plugin = callDep(prefix);
|
||||
}
|
||||
}
|
||||
|
||||
//Using ridiculous property names for space reasons
|
||||
return {
|
||||
f: prefix ? prefix + '!' + name : name, //fullName
|
||||
n: name,
|
||||
pr: prefix,
|
||||
p: plugin
|
||||
};
|
||||
};
|
||||
|
||||
function makeConfig(name) {
|
||||
return function () {
|
||||
return (config && config.config && config.config[name]) || {};
|
||||
};
|
||||
}
|
||||
|
||||
handlers = {
|
||||
require: function (name) {
|
||||
return makeRequire(name);
|
||||
},
|
||||
exports: function (name) {
|
||||
var e = defined[name];
|
||||
if (typeof e !== 'undefined') {
|
||||
return e;
|
||||
} else {
|
||||
return (defined[name] = {});
|
||||
}
|
||||
},
|
||||
module: function (name) {
|
||||
return {
|
||||
id: name,
|
||||
uri: '',
|
||||
exports: defined[name],
|
||||
config: makeConfig(name)
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
main = function (name, deps, callback, relName) {
|
||||
var cjsModule, depName, ret, map, i,
|
||||
args = [],
|
||||
callbackType = typeof callback,
|
||||
usingExports;
|
||||
|
||||
//Use name if no relName
|
||||
relName = relName || name;
|
||||
|
||||
//Call the callback to define the module, if necessary.
|
||||
if (callbackType === 'undefined' || callbackType === 'function') {
|
||||
//Pull out the defined dependencies and pass the ordered
|
||||
//values to the callback.
|
||||
//Default to [require, exports, module] if no deps
|
||||
deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
|
||||
for (i = 0; i < deps.length; i += 1) {
|
||||
map = makeMap(deps[i], relName);
|
||||
depName = map.f;
|
||||
|
||||
//Fast path CommonJS standard dependencies.
|
||||
if (depName === "require") {
|
||||
args[i] = handlers.require(name);
|
||||
} else if (depName === "exports") {
|
||||
//CommonJS module spec 1.1
|
||||
args[i] = handlers.exports(name);
|
||||
usingExports = true;
|
||||
} else if (depName === "module") {
|
||||
//CommonJS module spec 1.1
|
||||
cjsModule = args[i] = handlers.module(name);
|
||||
} else if (hasProp(defined, depName) ||
|
||||
hasProp(waiting, depName) ||
|
||||
hasProp(defining, depName)) {
|
||||
args[i] = callDep(depName);
|
||||
} else if (map.p) {
|
||||
map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
|
||||
args[i] = defined[depName];
|
||||
} else {
|
||||
throw new Error(name + ' missing ' + depName);
|
||||
}
|
||||
}
|
||||
|
||||
ret = callback ? callback.apply(defined[name], args) : undefined;
|
||||
|
||||
if (name) {
|
||||
//If setting exports via "module" is in play,
|
||||
//favor that over return value and exports. After that,
|
||||
//favor a non-undefined return value over exports use.
|
||||
if (cjsModule && cjsModule.exports !== undef &&
|
||||
cjsModule.exports !== defined[name]) {
|
||||
defined[name] = cjsModule.exports;
|
||||
} else if (ret !== undef || !usingExports) {
|
||||
//Use the return value from the function.
|
||||
defined[name] = ret;
|
||||
}
|
||||
}
|
||||
} else if (name) {
|
||||
//May just be an object definition for the module. Only
|
||||
//worry about defining if have a module name.
|
||||
defined[name] = callback;
|
||||
}
|
||||
};
|
||||
|
||||
requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
|
||||
if (typeof deps === "string") {
|
||||
if (handlers[deps]) {
|
||||
//callback in this case is really relName
|
||||
return handlers[deps](callback);
|
||||
}
|
||||
//Just return the module wanted. In this scenario, the
|
||||
//deps arg is the module name, and second arg (if passed)
|
||||
//is just the relName.
|
||||
//Normalize module name, if it contains . or ..
|
||||
return callDep(makeMap(deps, callback).f);
|
||||
} else if (!deps.splice) {
|
||||
//deps is a config object, not an array.
|
||||
config = deps;
|
||||
if (config.deps) {
|
||||
req(config.deps, config.callback);
|
||||
}
|
||||
if (!callback) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (callback.splice) {
|
||||
//callback is an array, which means it is a dependency list.
|
||||
//Adjust args if there are dependencies
|
||||
deps = callback;
|
||||
callback = relName;
|
||||
relName = null;
|
||||
} else {
|
||||
deps = undef;
|
||||
}
|
||||
}
|
||||
|
||||
//Support require(['a'])
|
||||
callback = callback || function () {};
|
||||
|
||||
//If relName is a function, it is an errback handler,
|
||||
//so remove it.
|
||||
if (typeof relName === 'function') {
|
||||
relName = forceSync;
|
||||
forceSync = alt;
|
||||
}
|
||||
|
||||
//Simulate async callback;
|
||||
if (forceSync) {
|
||||
main(undef, deps, callback, relName);
|
||||
} else {
|
||||
//Using a non-zero value because of concern for what old browsers
|
||||
//do, and latest browsers "upgrade" to 4 if lower value is used:
|
||||
//http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
|
||||
//If want a value immediately, use require('id') instead -- something
|
||||
//that works in almond on the global level, but not guaranteed and
|
||||
//unlikely to work in other AMD implementations.
|
||||
setTimeout(function () {
|
||||
main(undef, deps, callback, relName);
|
||||
}, 4);
|
||||
}
|
||||
|
||||
return req;
|
||||
};
|
||||
|
||||
/**
|
||||
* Just drops the config on the floor, but returns req in case
|
||||
* the config return value is used.
|
||||
*/
|
||||
req.config = function (cfg) {
|
||||
return req(cfg);
|
||||
};
|
||||
|
||||
/**
|
||||
* Expose module registry for debugging and tooling
|
||||
*/
|
||||
requirejs._defined = defined;
|
||||
|
||||
define = function (name, deps, callback) {
|
||||
|
||||
//This module may not have dependencies
|
||||
if (!deps.splice) {
|
||||
//deps is not an array, so probably means
|
||||
//an object literal or factory function for
|
||||
//the value. Adjust args.
|
||||
callback = deps;
|
||||
deps = [];
|
||||
}
|
||||
|
||||
if (!hasProp(defined, name) && !hasProp(waiting, name)) {
|
||||
waiting[name] = [name, deps, callback];
|
||||
}
|
||||
};
|
||||
|
||||
define.amd = {
|
||||
jQuery: true
|
||||
};
|
||||
}());
|
Loading…
Reference in New Issue
Block a user