sea-debug.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918
  1. /**
  2. * Sea.js 2.1.1 | seajs.org/LICENSE.md
  3. */
  4. (function(global, undefined) {
  5. // Avoid conflicting when `sea.js` is loaded multiple times
  6. if (global.seajs) {
  7. return
  8. }
  9. var seajs = global.seajs = {
  10. // The current version of Sea.js being used
  11. version: "2.1.1"
  12. }
  13. var data = seajs.data = {}
  14. /**
  15. * util-lang.js - The minimal language enhancement
  16. */
  17. function isType(type) {
  18. return function(obj) {
  19. return Object.prototype.toString.call(obj) === "[object " + type + "]"
  20. }
  21. }
  22. var isObject = isType("Object")
  23. var isString = isType("String")
  24. var isArray = Array.isArray || isType("Array")
  25. var isFunction = isType("Function")
  26. var _cid = 0
  27. function cid() {
  28. return _cid++
  29. }
  30. /**
  31. * util-events.js - The minimal events support
  32. */
  33. var events = data.events = {}
  34. // Bind event
  35. seajs.on = function(name, callback) {
  36. var list = events[name] || (events[name] = [])
  37. list.push(callback)
  38. return seajs
  39. }
  40. // Remove event. If `callback` is undefined, remove all callbacks for the
  41. // event. If `event` and `callback` are both undefined, remove all callbacks
  42. // for all events
  43. seajs.off = function(name, callback) {
  44. // Remove *all* events
  45. if (!(name || callback)) {
  46. events = data.events = {}
  47. return seajs
  48. }
  49. var list = events[name]
  50. if (list) {
  51. if (callback) {
  52. for (var i = list.length - 1; i >= 0; i--) {
  53. if (list[i] === callback) {
  54. list.splice(i, 1)
  55. }
  56. }
  57. }
  58. else {
  59. delete events[name]
  60. }
  61. }
  62. return seajs
  63. }
  64. // Emit event, firing all bound callbacks. Callbacks receive the same
  65. // arguments as `emit` does, apart from the event name
  66. var emit = seajs.emit = function(name, data) {
  67. var list = events[name], fn
  68. if (list) {
  69. // Copy callback lists to prevent modification
  70. list = list.slice()
  71. // Execute event callbacks
  72. while ((fn = list.shift())) {
  73. fn(data)
  74. }
  75. }
  76. return seajs
  77. }
  78. /**
  79. * util-path.js - The utilities for operating path such as id, uri
  80. */
  81. var DIRNAME_RE = /[^?#]*\//
  82. var DOT_RE = /\/\.\//g
  83. var DOUBLE_DOT_RE = /\/[^/]+\/\.\.\//
  84. // Extract the directory portion of a path
  85. // dirname("a/b/c.js?t=123#xx/zz") ==> "a/b/"
  86. // ref: http://jsperf.com/regex-vs-split/2
  87. function dirname(path) {
  88. return path.match(DIRNAME_RE)[0]
  89. }
  90. // Canonicalize a path
  91. // realpath("http://test.com/a//./b/../c") ==> "http://test.com/a/c"
  92. function realpath(path) {
  93. // /a/b/./c/./d ==> /a/b/c/d
  94. path = path.replace(DOT_RE, "/")
  95. // a/b/c/../../d ==> a/b/../d ==> a/d
  96. while (path.match(DOUBLE_DOT_RE)) {
  97. path = path.replace(DOUBLE_DOT_RE, "/")
  98. }
  99. return path
  100. }
  101. // Normalize an id
  102. // normalize("path/to/a") ==> "path/to/a.js"
  103. // NOTICE: substring is faster than negative slice and RegExp
  104. function normalize(path) {
  105. var last = path.length - 1
  106. var lastC = path.charAt(last)
  107. // If the uri ends with `#`, just return it without '#'
  108. if (lastC === "#") {
  109. return path.substring(0, last)
  110. }
  111. return (path.substring(last - 2) === ".js" ||
  112. path.indexOf("?") > 0 ||
  113. path.substring(last - 3) === ".css" ||
  114. lastC === "/") ? path : path + ".js"
  115. }
  116. var PATHS_RE = /^([^/:]+)(\/.+)$/
  117. var VARS_RE = /{([^{]+)}/g
  118. function parseAlias(id) {
  119. var alias = data.alias
  120. return alias && isString(alias[id]) ? alias[id] : id
  121. }
  122. function parsePaths(id) {
  123. var paths = data.paths
  124. var m
  125. if (paths && (m = id.match(PATHS_RE)) && isString(paths[m[1]])) {
  126. id = paths[m[1]] + m[2]
  127. }
  128. return id
  129. }
  130. function parseVars(id) {
  131. var vars = data.vars
  132. if (vars && id.indexOf("{") > -1) {
  133. id = id.replace(VARS_RE, function(m, key) {
  134. return isString(vars[key]) ? vars[key] : m
  135. })
  136. }
  137. return id
  138. }
  139. function parseMap(uri) {
  140. var map = data.map
  141. var ret = uri
  142. if (map) {
  143. for (var i = 0, len = map.length; i < len; i++) {
  144. var rule = map[i]
  145. ret = isFunction(rule) ?
  146. (rule(uri) || uri) :
  147. uri.replace(rule[0], rule[1])
  148. // Only apply the first matched rule
  149. if (ret !== uri) break
  150. }
  151. }
  152. return ret
  153. }
  154. var ABSOLUTE_RE = /^\/\/.|:\//
  155. var ROOT_DIR_RE = /^.*?\/\/.*?\//
  156. function addBase(id, refUri) {
  157. var ret
  158. var first = id.charAt(0)
  159. // Absolute
  160. if (ABSOLUTE_RE.test(id)) {
  161. ret = id
  162. }
  163. // Relative
  164. else if (first === ".") {
  165. ret = realpath((refUri ? dirname(refUri) : data.cwd) + id)
  166. }
  167. // Root
  168. else if (first === "/") {
  169. var m = data.cwd.match(ROOT_DIR_RE)
  170. ret = m ? m[0] + id.substring(1) : id
  171. }
  172. // Top-level
  173. else {
  174. ret = data.base + id
  175. }
  176. return ret
  177. }
  178. function id2Uri(id, refUri) {
  179. if (!id) return ""
  180. id = parseAlias(id)
  181. id = parsePaths(id)
  182. id = parseVars(id)
  183. id = normalize(id)
  184. var uri = addBase(id, refUri)
  185. uri = parseMap(uri)
  186. return uri
  187. }
  188. var doc = document
  189. var loc = location
  190. var cwd = dirname(loc.href)
  191. var scripts = doc.getElementsByTagName("script")
  192. // Recommend to add `seajsnode` id for the `sea.js` script element
  193. var loaderScript = doc.getElementById("seajsnode") ||
  194. scripts[scripts.length - 1]
  195. // When `sea.js` is inline, set loaderDir to current working directory
  196. var loaderDir = dirname(getScriptAbsoluteSrc(loaderScript) || cwd)
  197. function getScriptAbsoluteSrc(node) {
  198. return node.hasAttribute ? // non-IE6/7
  199. node.src :
  200. // see http://msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx
  201. node.getAttribute("src", 4)
  202. }
  203. /**
  204. * util-request.js - The utilities for requesting script and style files
  205. * ref: tests/research/load-js-css/test.html
  206. */
  207. var head = doc.getElementsByTagName("head")[0] || doc.documentElement
  208. var baseElement = head.getElementsByTagName("base")[0]
  209. var IS_CSS_RE = /\.css(?:\?|$)/i
  210. var READY_STATE_RE = /^(?:loaded|complete|undefined)$/
  211. var currentlyAddingScript
  212. var interactiveScript
  213. // `onload` event is not supported in WebKit < 535.23 and Firefox < 9.0
  214. // ref:
  215. // - https://bugs.webkit.org/show_activity.cgi?id=38995
  216. // - https://bugzilla.mozilla.org/show_bug.cgi?id=185236
  217. // - https://developer.mozilla.org/en/HTML/Element/link#Stylesheet_load_events
  218. var isOldWebKit = (navigator.userAgent
  219. .replace(/.*AppleWebKit\/(\d+)\..*/, "$1")) * 1 < 536
  220. function request(url, callback, charset) {
  221. var isCSS = IS_CSS_RE.test(url)
  222. var node = doc.createElement(isCSS ? "link" : "script")
  223. if (charset) {
  224. var cs = isFunction(charset) ? charset(url) : charset
  225. if (cs) {
  226. node.charset = cs
  227. }
  228. }
  229. addOnload(node, callback, isCSS)
  230. if (isCSS) {
  231. node.rel = "stylesheet"
  232. node.href = url
  233. }
  234. else {
  235. node.async = true
  236. node.src = url
  237. }
  238. // For some cache cases in IE 6-8, the script executes IMMEDIATELY after
  239. // the end of the insert execution, so use `currentlyAddingScript` to
  240. // hold current node, for deriving url in `define` call
  241. currentlyAddingScript = node
  242. // ref: #185 & http://dev.jquery.com/ticket/2709
  243. baseElement ?
  244. head.insertBefore(node, baseElement) :
  245. head.appendChild(node)
  246. currentlyAddingScript = null
  247. }
  248. function addOnload(node, callback, isCSS) {
  249. var missingOnload = isCSS && (isOldWebKit || !("onload" in node))
  250. // for Old WebKit and Old Firefox
  251. if (missingOnload) {
  252. setTimeout(function() {
  253. pollCss(node, callback)
  254. }, 1) // Begin after node insertion
  255. return
  256. }
  257. node.onload = node.onerror = node.onreadystatechange = function() {
  258. if (READY_STATE_RE.test(node.readyState)) {
  259. // Ensure only run once and handle memory leak in IE
  260. node.onload = node.onerror = node.onreadystatechange = null
  261. // Remove the script to reduce memory leak
  262. if (!isCSS && !data.debug) {
  263. head.removeChild(node)
  264. }
  265. // Dereference the node
  266. node = null
  267. callback()
  268. }
  269. }
  270. }
  271. function pollCss(node, callback) {
  272. var sheet = node.sheet
  273. var isLoaded
  274. // for WebKit < 536
  275. if (isOldWebKit) {
  276. if (sheet) {
  277. isLoaded = true
  278. }
  279. }
  280. // for Firefox < 9.0
  281. else if (sheet) {
  282. try {
  283. if (sheet.cssRules) {
  284. isLoaded = true
  285. }
  286. } catch (ex) {
  287. // The value of `ex.name` is changed from "NS_ERROR_DOM_SECURITY_ERR"
  288. // to "SecurityError" since Firefox 13.0. But Firefox is less than 9.0
  289. // in here, So it is ok to just rely on "NS_ERROR_DOM_SECURITY_ERR"
  290. if (ex.name === "NS_ERROR_DOM_SECURITY_ERR") {
  291. isLoaded = true
  292. }
  293. }
  294. }
  295. setTimeout(function() {
  296. if (isLoaded) {
  297. // Place callback here to give time for style rendering
  298. callback()
  299. }
  300. else {
  301. pollCss(node, callback)
  302. }
  303. }, 20)
  304. }
  305. function getCurrentScript() {
  306. if (currentlyAddingScript) {
  307. return currentlyAddingScript
  308. }
  309. // For IE6-9 browsers, the script onload event may not fire right
  310. // after the script is evaluated. Kris Zyp found that it
  311. // could query the script nodes and the one that is in "interactive"
  312. // mode indicates the current script
  313. // ref: http://goo.gl/JHfFW
  314. if (interactiveScript && interactiveScript.readyState === "interactive") {
  315. return interactiveScript
  316. }
  317. var scripts = head.getElementsByTagName("script")
  318. for (var i = scripts.length - 1; i >= 0; i--) {
  319. var script = scripts[i]
  320. if (script.readyState === "interactive") {
  321. interactiveScript = script
  322. return interactiveScript
  323. }
  324. }
  325. }
  326. /**
  327. * util-deps.js - The parser for dependencies
  328. * ref: tests/research/parse-dependencies/test.html
  329. */
  330. var REQUIRE_RE = /"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|\/\*[\S\s]*?\*\/|\/(?:\\\/|[^\/\r\n])+\/(?=[^\/])|\/\/.*|\.\s*require|(?:^|[^$])\brequire\s*\(\s*(["'])(.+?)\1\s*\)/g
  331. var SLASH_RE = /\\\\/g
  332. function parseDependencies(code) {
  333. var ret = []
  334. code.replace(SLASH_RE, "")
  335. .replace(REQUIRE_RE, function(m, m1, m2) {
  336. if (m2) {
  337. ret.push(m2)
  338. }
  339. })
  340. return ret
  341. }
  342. /**
  343. * module.js - The core of module loader
  344. */
  345. var cachedMods = seajs.cache = {}
  346. var anonymousMeta
  347. var fetchingList = {}
  348. var fetchedList = {}
  349. var callbackList = {}
  350. var STATUS = Module.STATUS = {
  351. // 1 - The `module.uri` is being fetched
  352. FETCHING: 1,
  353. // 2 - The meta data has been saved to cachedMods
  354. SAVED: 2,
  355. // 3 - The `module.dependencies` are being loaded
  356. LOADING: 3,
  357. // 4 - The module are ready to execute
  358. LOADED: 4,
  359. // 5 - The module is being executed
  360. EXECUTING: 5,
  361. // 6 - The `module.exports` is available
  362. EXECUTED: 6
  363. }
  364. function Module(uri, deps) {
  365. this.uri = uri
  366. this.dependencies = deps || []
  367. this.exports = null
  368. this.status = 0
  369. // Who depends on me
  370. this._waitings = {}
  371. // The number of unloaded dependencies
  372. this._remain = 0
  373. }
  374. // Resolve module.dependencies
  375. Module.prototype.resolve = function() {
  376. var mod = this
  377. var ids = mod.dependencies
  378. var uris = []
  379. for (var i = 0, len = ids.length; i < len; i++) {
  380. uris[i] = Module.resolve(ids[i], mod.uri)
  381. }
  382. return uris
  383. }
  384. // Load module.dependencies and fire onload when all done
  385. Module.prototype.load = function() {
  386. var mod = this
  387. // If the module is being loaded, just wait it onload call
  388. if (mod.status >= STATUS.LOADING) {
  389. return
  390. }
  391. mod.status = STATUS.LOADING
  392. // Emit `load` event for plugins such as combo plugin
  393. var uris = mod.resolve()
  394. emit("load", uris)
  395. var len = mod._remain = uris.length
  396. var m
  397. // Initialize modules and register waitings
  398. for (var i = 0; i < len; i++) {
  399. m = Module.get(uris[i])
  400. if (m.status < STATUS.LOADED) {
  401. // Maybe duplicate
  402. m._waitings[mod.uri] = (m._waitings[mod.uri] || 0) + 1
  403. }
  404. else {
  405. mod._remain--
  406. }
  407. }
  408. if (mod._remain === 0) {
  409. mod.onload()
  410. return
  411. }
  412. // Begin parallel loading
  413. var requestCache = {}
  414. for (i = 0; i < len; i++) {
  415. m = cachedMods[uris[i]]
  416. if (m.status < STATUS.FETCHING) {
  417. m.fetch(requestCache)
  418. }
  419. else if (m.status === STATUS.SAVED) {
  420. m.load()
  421. }
  422. }
  423. // Send all requests at last to avoid cache bug in IE6-9. Issues#808
  424. for (var requestUri in requestCache) {
  425. if (requestCache.hasOwnProperty(requestUri)) {
  426. requestCache[requestUri]()
  427. }
  428. }
  429. }
  430. // Call this method when module is loaded
  431. Module.prototype.onload = function() {
  432. var mod = this
  433. mod.status = STATUS.LOADED
  434. if (mod.callback) {
  435. mod.callback()
  436. }
  437. // Notify waiting modules to fire onload
  438. var waitings = mod._waitings
  439. var uri, m
  440. for (uri in waitings) {
  441. if (waitings.hasOwnProperty(uri)) {
  442. m = cachedMods[uri]
  443. m._remain -= waitings[uri]
  444. if (m._remain === 0) {
  445. m.onload()
  446. }
  447. }
  448. }
  449. // Reduce memory taken
  450. delete mod._waitings
  451. delete mod._remain
  452. }
  453. // Fetch a module
  454. Module.prototype.fetch = function(requestCache) {
  455. var mod = this
  456. var uri = mod.uri
  457. mod.status = STATUS.FETCHING
  458. // Emit `fetch` event for plugins such as combo plugin
  459. var emitData = { uri: uri }
  460. emit("fetch", emitData)
  461. var requestUri = emitData.requestUri || uri
  462. // Empty uri or a non-CMD module
  463. if (!requestUri || fetchedList[requestUri]) {
  464. mod.load()
  465. return
  466. }
  467. if (fetchingList[requestUri]) {
  468. callbackList[requestUri].push(mod)
  469. return
  470. }
  471. fetchingList[requestUri] = true
  472. callbackList[requestUri] = [mod]
  473. // Emit `request` event for plugins such as text plugin
  474. emit("request", emitData = {
  475. uri: uri,
  476. requestUri: requestUri,
  477. onRequest: onRequest,
  478. charset: data.charset
  479. })
  480. if (!emitData.requested) {
  481. requestCache ?
  482. requestCache[emitData.requestUri] = sendRequest :
  483. sendRequest()
  484. }
  485. function sendRequest() {
  486. request(emitData.requestUri, emitData.onRequest, emitData.charset)
  487. }
  488. function onRequest() {
  489. delete fetchingList[requestUri]
  490. fetchedList[requestUri] = true
  491. // Save meta data of anonymous module
  492. if (anonymousMeta) {
  493. Module.save(uri, anonymousMeta)
  494. anonymousMeta = null
  495. }
  496. // Call callbacks
  497. var m, mods = callbackList[requestUri]
  498. delete callbackList[requestUri]
  499. while ((m = mods.shift())) m.load()
  500. }
  501. }
  502. // Execute a module
  503. Module.prototype.exec = function () {
  504. var mod = this
  505. // When module is executed, DO NOT execute it again. When module
  506. // is being executed, just return `module.exports` too, for avoiding
  507. // circularly calling
  508. if (mod.status >= STATUS.EXECUTING) {
  509. return mod.exports
  510. }
  511. mod.status = STATUS.EXECUTING
  512. // Create require
  513. var uri = mod.uri
  514. function require(id) {
  515. return Module.get(require.resolve(id)).exec()
  516. }
  517. require.resolve = function(id) {
  518. return Module.resolve(id, uri)
  519. }
  520. require.async = function(ids, callback) {
  521. Module.use(ids, callback, uri + "_async_" + cid())
  522. return require
  523. }
  524. // Exec factory
  525. var factory = mod.factory
  526. var exports = isFunction(factory) ?
  527. factory(require, mod.exports = {}, mod) :
  528. factory
  529. if (exports === undefined) {
  530. exports = mod.exports
  531. }
  532. // Emit `error` event
  533. if (exports === null && !IS_CSS_RE.test(uri)) {
  534. emit("error", mod)
  535. }
  536. // Reduce memory leak
  537. delete mod.factory
  538. mod.exports = exports
  539. mod.status = STATUS.EXECUTED
  540. // Emit `exec` event
  541. emit("exec", mod)
  542. return exports
  543. }
  544. // Resolve id to uri
  545. Module.resolve = function(id, refUri) {
  546. // Emit `resolve` event for plugins such as text plugin
  547. var emitData = { id: id, refUri: refUri }
  548. emit("resolve", emitData)
  549. return emitData.uri || id2Uri(emitData.id, refUri)
  550. }
  551. // Define a module
  552. Module.define = function (id, deps, factory) {
  553. var argsLen = arguments.length
  554. // define(factory)
  555. if (argsLen === 1) {
  556. factory = id
  557. id = undefined
  558. }
  559. else if (argsLen === 2) {
  560. factory = deps
  561. // define(deps, factory)
  562. if (isArray(id)) {
  563. deps = id
  564. id = undefined
  565. }
  566. // define(id, factory)
  567. else {
  568. deps = undefined
  569. }
  570. }
  571. // Parse dependencies according to the module factory code
  572. if (!isArray(deps) && isFunction(factory)) {
  573. deps = parseDependencies(factory.toString())
  574. }
  575. var meta = {
  576. id: id,
  577. uri: Module.resolve(id),
  578. deps: deps,
  579. factory: factory
  580. }
  581. // Try to derive uri in IE6-9 for anonymous modules
  582. if (!meta.uri && doc.attachEvent) {
  583. var script = getCurrentScript()
  584. if (script) {
  585. meta.uri = script.src
  586. }
  587. // NOTE: If the id-deriving methods above is failed, then falls back
  588. // to use onload event to get the uri
  589. }
  590. // Emit `define` event, used in nocache plugin, seajs node version etc
  591. emit("define", meta)
  592. meta.uri ? Module.save(meta.uri, meta) :
  593. // Save information for "saving" work in the script onload event
  594. anonymousMeta = meta
  595. }
  596. // Save meta data to cachedMods
  597. Module.save = function(uri, meta) {
  598. var mod = Module.get(uri)
  599. // Do NOT override already saved modules
  600. if (mod.status < STATUS.SAVED) {
  601. mod.id = meta.id || uri
  602. mod.dependencies = meta.deps || []
  603. mod.factory = meta.factory
  604. mod.status = STATUS.SAVED
  605. }
  606. }
  607. // Get an existed module or create a new one
  608. Module.get = function(uri, deps) {
  609. return cachedMods[uri] || (cachedMods[uri] = new Module(uri, deps))
  610. }
  611. // Use function is equal to load a anonymous module
  612. Module.use = function (ids, callback, uri) {
  613. var mod = Module.get(uri, isArray(ids) ? ids : [ids])
  614. mod.callback = function() {
  615. var exports = []
  616. var uris = mod.resolve()
  617. for (var i = 0, len = uris.length; i < len; i++) {
  618. exports[i] = cachedMods[uris[i]].exec()
  619. }
  620. if (callback) {
  621. callback.apply(global, exports)
  622. }
  623. delete mod.callback
  624. }
  625. mod.load()
  626. }
  627. // Load preload modules before all other modules
  628. Module.preload = function(callback) {
  629. var preloadMods = data.preload
  630. var len = preloadMods.length
  631. if (len) {
  632. Module.use(preloadMods, function() {
  633. // Remove the loaded preload modules
  634. preloadMods.splice(0, len)
  635. // Allow preload modules to add new preload modules
  636. Module.preload(callback)
  637. }, data.cwd + "_preload_" + cid())
  638. }
  639. else {
  640. callback()
  641. }
  642. }
  643. // Public API
  644. seajs.use = function(ids, callback) {
  645. Module.preload(function() {
  646. Module.use(ids, callback, data.cwd + "_use_" + cid())
  647. })
  648. return seajs
  649. }
  650. Module.define.cmd = {}
  651. global.define = Module.define
  652. // For Developers
  653. seajs.Module = Module
  654. data.fetchedList = fetchedList
  655. data.cid = cid
  656. seajs.resolve = id2Uri
  657. seajs.require = function(id) {
  658. return (cachedMods[Module.resolve(id)] || {}).exports
  659. }
  660. /**
  661. * config.js - The configuration for the loader
  662. */
  663. var BASE_RE = /^(.+?\/)(\?\?)?(seajs\/)+/
  664. // The root path to use for id2uri parsing
  665. // If loaderUri is `http://test.com/libs/seajs/[??][seajs/1.2.3/]sea.js`, the
  666. // baseUri should be `http://test.com/libs/`
  667. data.base = (loaderDir.match(BASE_RE) || ["", loaderDir])[1]
  668. // The loader directory
  669. data.dir = loaderDir
  670. // The current working directory
  671. data.cwd = cwd
  672. // The charset for requesting files
  673. data.charset = "utf-8"
  674. // Modules that are needed to load before all other modules
  675. data.preload = (function() {
  676. var plugins = []
  677. // Convert `seajs-xxx` to `seajs-xxx=1`
  678. // NOTE: use `seajs-xxx=1` flag in uri or cookie to preload `seajs-xxx`
  679. var str = loc.search.replace(/(seajs-\w+)(&|$)/g, "$1=1$2")
  680. // Add cookie string
  681. str += " " + doc.cookie
  682. // Exclude seajs-xxx=0
  683. str.replace(/(seajs-\w+)=1/g, function(m, name) {
  684. plugins.push(name)
  685. })
  686. return plugins
  687. })()
  688. // data.alias - An object containing shorthands of module id
  689. // data.paths - An object containing path shorthands in module id
  690. // data.vars - The {xxx} variables in module id
  691. // data.map - An array containing rules to map module uri
  692. // data.debug - Debug mode. The default value is false
  693. seajs.config = function(configData) {
  694. for (var key in configData) {
  695. var curr = configData[key]
  696. var prev = data[key]
  697. // Merge object config such as alias, vars
  698. if (prev && isObject(prev)) {
  699. for (var k in curr) {
  700. prev[k] = curr[k]
  701. }
  702. }
  703. else {
  704. // Concat array config such as map, preload
  705. if (isArray(prev)) {
  706. curr = prev.concat(curr)
  707. }
  708. // Make sure that `data.base` is an absolute path
  709. else if (key === "base") {
  710. (curr.slice(-1) === "/") || (curr += "/")
  711. curr = addBase(curr)
  712. }
  713. // Set config
  714. data[key] = curr
  715. }
  716. }
  717. emit("config", configData)
  718. return seajs
  719. }
  720. })(this);