mirror of
https://github.com/moodle/moodle.git
synced 2025-04-13 04:22:07 +02:00
MDL-49046 javascript: Add support for AMD modules and jquery.
Grunt is the build tool.
This commit is contained in:
parent
95751e81ac
commit
adeb96d28f
1
.gitignore
vendored
1
.gitignore
vendored
@ -36,3 +36,4 @@ composer.lock
|
||||
# lib/yuilib/version/module/module-coverage.js
|
||||
/lib/yuilib/*/*/*-coverage.js
|
||||
atlassian-ide-plugin.xml
|
||||
/node_modules/
|
||||
|
@ -34,7 +34,8 @@
|
||||
"passfail": false,
|
||||
"plusplus": false,
|
||||
"predef": [
|
||||
"M"
|
||||
"M",
|
||||
"define"
|
||||
],
|
||||
"proto": false,
|
||||
"regexdash": false,
|
||||
|
149
Gruntfile.js
Normal file
149
Gruntfile.js
Normal file
@ -0,0 +1,149 @@
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* @copyright 2014 Andrew Nicols
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
/**
|
||||
* Grunt configuration
|
||||
*/
|
||||
|
||||
module.exports = function(grunt) {
|
||||
var path = require('path'),
|
||||
tasks = {};
|
||||
|
||||
// Project configuration.
|
||||
grunt.initConfig({
|
||||
jshint: {
|
||||
options: {jshintrc: '.jshintrc'},
|
||||
files: ['**/amd/src/*.js']
|
||||
},
|
||||
uglify: {
|
||||
dynamic_mappings: {
|
||||
files: grunt.file.expandMapping(
|
||||
['**/src/*.js', '!**/node_modules/**'],
|
||||
'',
|
||||
{
|
||||
cwd: process.env.PWD,
|
||||
rename: function(destBase, destPath) {
|
||||
destPath = destPath.replace('src', 'build');
|
||||
destPath = destPath.replace('.js', '.min.js');
|
||||
destPath = path.resolve(process.env.PWD, destPath);
|
||||
return destPath;
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
tasks.shifter = function() {
|
||||
var exec = require('child_process').spawn,
|
||||
done = this.async(),
|
||||
args = [],
|
||||
options = {
|
||||
recursive: true,
|
||||
watch: false,
|
||||
walk: false,
|
||||
module: false
|
||||
},
|
||||
shifter;
|
||||
|
||||
// Determine the most appropriate options to run with based upon the current location.
|
||||
if (path.basename(process.env.PWD) === 'src') {
|
||||
// Detect whether we're in a src directory.
|
||||
grunt.log.debug('In a src directory');
|
||||
args.push('--walk');
|
||||
options.walk = true;
|
||||
} else if (path.basename(path.dirname(process.env.PWD)) === 'src') {
|
||||
// Detect whether we're in a module directory.
|
||||
grunt.log.debug('In a module directory');
|
||||
options.module = true;
|
||||
}
|
||||
|
||||
if (grunt.option('watch')) {
|
||||
if (!options.walk && !options.module) {
|
||||
grunt.fail.fatal('Unable to watch unless in a src or module directory');
|
||||
}
|
||||
|
||||
// It is not advisable to run with recursivity and watch - this
|
||||
// leads to building the build directory in a race-like fashion.
|
||||
grunt.log.debug('Detected a watch - disabling recursivity');
|
||||
options.recursive = false;
|
||||
args.push('--watch');
|
||||
}
|
||||
|
||||
if (options.recursive) {
|
||||
args.push('--recursive');
|
||||
}
|
||||
|
||||
// Always ignore the node_modules directory.
|
||||
args.push('--excludes', 'node_modules');
|
||||
|
||||
// Add the stderr option if appropriate
|
||||
if (grunt.option('verbose')) {
|
||||
args.push('--lint-stderr');
|
||||
}
|
||||
|
||||
// Actually run shifter.
|
||||
shifter = exec(process.cwd() + '/node_modules/shifter/bin/shifter', args, {
|
||||
cwd: process.env.PWD,
|
||||
stdio: 'inherit',
|
||||
env: process.env
|
||||
});
|
||||
|
||||
// Tidy up after exec.
|
||||
shifter.on('exit', function (code) {
|
||||
if (code) {
|
||||
grunt.fail.fatal('Shifter failed with code: ' + code);
|
||||
} else {
|
||||
grunt.log.ok('Shifter build complete.');
|
||||
done();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
tasks.startup = function() {
|
||||
// Are we in a YUI directory?
|
||||
if (path.basename(path.resolve(process.env.PWD, '../../')) == 'yui') {
|
||||
grunt.task.run('shifter');
|
||||
// Are we in an AMD directory?
|
||||
} else if (path.basename(process.env.PWD) == 'amd') {
|
||||
grunt.task.run('jshint');
|
||||
grunt.task.run('uglify');
|
||||
} else {
|
||||
// Run them all!.
|
||||
grunt.task.run('shifter');
|
||||
grunt.task.run('jshint');
|
||||
grunt.task.run('uglify');
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// Register NPM tasks.
|
||||
grunt.loadNpmTasks('grunt-contrib-uglify');
|
||||
grunt.loadNpmTasks('grunt-contrib-jshint');
|
||||
|
||||
// Register the shifter task.
|
||||
grunt.registerTask('shifter', 'Run Shifter against the current directory', tasks.shifter);
|
||||
|
||||
// Register the startup task.
|
||||
grunt.registerTask('startup', 'Run the correct tasks for the current directory', tasks.startup);
|
||||
|
||||
// Register the default task.
|
||||
grunt.registerTask('default', ['startup']);
|
||||
};
|
1
lib/amd/build/first.min.js
vendored
Normal file
1
lib/amd/build/first.min.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
define(function(){});
|
26
lib/amd/src/first.js
Normal file
26
lib/amd/src/first.js
Normal file
@ -0,0 +1,26 @@
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* This is an empty module, that is required before all other modules.
|
||||
* Because every module is returned from a request for any other module, this
|
||||
* forces the loading of all modules with a single request.
|
||||
*
|
||||
* @module core/first
|
||||
* @package core
|
||||
* @copyright 2015 Damyon Wiese <damyon@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
define(function() { });
|
130
lib/classes/requirejs.php
Normal file
130
lib/classes/requirejs.php
Normal file
@ -0,0 +1,130 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* RequireJS helper functions.
|
||||
*
|
||||
* @package core
|
||||
* @copyright 2015 Damyon Wiese <damyon@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Collection of requirejs related methods.
|
||||
*
|
||||
* @copyright 2015 Damyon Wiese <damyon@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class core_requirejs {
|
||||
|
||||
/**
|
||||
* Check a single module exists and return the full path to it.
|
||||
*
|
||||
* The expected location for amd modules is:
|
||||
* <componentdir>/amd/src/modulename.js
|
||||
*
|
||||
* @param string $component The component determines the folder the js file should be in.
|
||||
* @param string $jsfilename The filename for the module (with the js extension).
|
||||
* @param boolean $debug If true, returns the paths to the original (unminified) source files.
|
||||
* @return array $files An array of mappings from module names to file paths.
|
||||
* Empty array if the file does not exist.
|
||||
*/
|
||||
public static function find_one_amd_module($component, $jsfilename, $debug = false) {
|
||||
$jsfileroot = core_component::get_component_directory($component);
|
||||
if (!$jsfileroot) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$module = str_replace('.js', '', $jsfilename);
|
||||
|
||||
$srcdir = $jsfileroot . '/amd/build';
|
||||
$minpart = '.min';
|
||||
if ($debug) {
|
||||
$srcdir = $jsfileroot . '/amd/src';
|
||||
$minpart = '';
|
||||
}
|
||||
|
||||
$filename = $srcdir . '/' . $module . $minpart . '.js';
|
||||
if (!file_exists($filename)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$fullmodulename = $component . '/' . $module;
|
||||
return array($fullmodulename => $filename);
|
||||
}
|
||||
|
||||
/**
|
||||
* Scan the source for AMD modules and return them all.
|
||||
*
|
||||
* The expected location for amd modules is:
|
||||
* <componentdir>/amd/src/modulename.js
|
||||
*
|
||||
* @param boolean $debug If true, returns the paths to the original (unminified) source files.
|
||||
* @return array $files An array of mappings from module names to file paths.
|
||||
*/
|
||||
public static function find_all_amd_modules($debug = false) {
|
||||
global $CFG;
|
||||
|
||||
$jsdirs = array();
|
||||
$jsfiles = array();
|
||||
|
||||
$dir = $CFG->libdir . '/amd';
|
||||
if (!empty($dir) && is_dir($dir)) {
|
||||
$jsdirs['core'] = $dir;
|
||||
}
|
||||
$subsystems = core_component::get_core_subsystems();
|
||||
foreach ($subsystems as $subsystem => $dir) {
|
||||
if (!empty($dir) && is_dir($dir . '/amd')) {
|
||||
$jsdirs[$subsystem] = $dir . '/amd';
|
||||
}
|
||||
}
|
||||
$plugintypes = core_component::get_plugin_types();
|
||||
foreach ($plugintypes as $type => $dir) {
|
||||
$plugins = core_component::get_plugin_list_with_file($type, 'amd', false);
|
||||
foreach ($plugins as $plugin => $dir) {
|
||||
if (!empty($dir) && is_dir($dir)) {
|
||||
$jsdirs[$type . '_' . $plugin] = $dir;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($jsdirs as $component => $dir) {
|
||||
$srcdir = $dir . '/build';
|
||||
if ($debug) {
|
||||
$srcdir = $dir . '/src';
|
||||
}
|
||||
$items = new RecursiveDirectoryIterator($srcdir);
|
||||
foreach ($items as $item) {
|
||||
$extension = $item->getExtension();
|
||||
if ($extension === 'js') {
|
||||
$filename = str_replace('.min', '', $item->getBaseName('.js'));
|
||||
// We skip lazy loaded modules.
|
||||
if (strpos($filename, '-lazy') === false) {
|
||||
$modulename = $component . '/' . $filename;
|
||||
$jsfiles[$modulename] = $item->getRealPath();
|
||||
}
|
||||
}
|
||||
unset($item);
|
||||
}
|
||||
unset($items);
|
||||
}
|
||||
|
||||
return $jsfiles;
|
||||
}
|
||||
|
||||
}
|
@ -35,11 +35,12 @@ defined('MOODLE_INTERNAL') || die();
|
||||
*
|
||||
* Typical usage would be
|
||||
* <pre>
|
||||
* $PAGE->requires->js_init_call('M.mod_forum.init_view');
|
||||
* $PAGE->requires->js_call_amd('mod_forum/view', 'init');
|
||||
* </pre>
|
||||
*
|
||||
* It also supports obsoleted coding style withouth YUI3 modules.
|
||||
* It also supports obsoleted coding style with/without YUI3 modules.
|
||||
* <pre>
|
||||
* $PAGE->requires->js_init_call('M.mod_forum.init_view');
|
||||
* $PAGE->requires->css('/mod/mymod/userstyles.php?id='.$id); // not overridable via themes!
|
||||
* $PAGE->requires->js('/mod/mymod/script.js');
|
||||
* $PAGE->requires->js('/mod/mymod/small_but_urgent.js', true);
|
||||
@ -78,6 +79,11 @@ class page_requirements_manager {
|
||||
*/
|
||||
protected $jsincludes = array('head'=>array(), 'footer'=>array());
|
||||
|
||||
/**
|
||||
* @var array Inline scripts using RequireJS module loading.
|
||||
*/
|
||||
protected $amdjscode = array('');
|
||||
|
||||
/**
|
||||
* @var array List of needed function calls
|
||||
*/
|
||||
@ -943,6 +949,52 @@ class page_requirements_manager {
|
||||
$this->jscalls[$where][] = array($function, $arguments, $delay);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function appends a block of code to the AMD specific javascript block executed
|
||||
* in the page footer, just after loading the requirejs library.
|
||||
*
|
||||
* The code passed here can rely on AMD module loading, e.g. require('jquery', function($) {...});
|
||||
*
|
||||
* @param string $code The JS code to append.
|
||||
*/
|
||||
public function js_amd_inline($code) {
|
||||
$this->amdjscode[] = $code;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function creates a minimal JS script that requires and calls a single function from an AMD module with arguments.
|
||||
* If it is called multiple times, it will be executed multiple times.
|
||||
*
|
||||
* @param string $fullmodule The format for module names is <component name>/<module name>.
|
||||
* @param string $func The function from the module to call
|
||||
* @param array $params The params to pass to the function. They will be json encoded, so no nasty classes/types please.
|
||||
*/
|
||||
public function js_call_amd($fullmodule, $func, $params = array()) {
|
||||
global $CFG;
|
||||
|
||||
list($component, $module) = explode('/', $fullmodule, 2);
|
||||
|
||||
$component = clean_param($component, PARAM_COMPONENT);
|
||||
$module = clean_param($module, PARAM_ALPHANUMEXT);
|
||||
$func = clean_param($func, PARAM_ALPHANUMEXT);
|
||||
|
||||
$jsonparams = array();
|
||||
foreach ($params as $param) {
|
||||
$jsonparams[] = json_encode($param);
|
||||
}
|
||||
$strparams = implode(', ', $jsonparams);
|
||||
if ($CFG->debugdeveloper) {
|
||||
$toomanyparamslimit = 1024;
|
||||
if (strlen($strparams) > $toomanyparamslimit) {
|
||||
debugging('Too many params passed to js_call_amd("' . $fullmodule . '", "' . $func . '")', DEBUG_DEVELOPER);
|
||||
}
|
||||
}
|
||||
|
||||
$js = 'require(["' . $component . '/' . $module . '"], function(amd) { amd.' . $func . '(' . $strparams . '); });';
|
||||
|
||||
$this->js_amd_inline($js);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a JavaScript function call that requires one or more modules to be loaded.
|
||||
*
|
||||
@ -952,6 +1004,9 @@ class page_requirements_manager {
|
||||
* - Moodle modules [moodle-*]
|
||||
* - Gallery modules [gallery-*]
|
||||
*
|
||||
* Before writing new code that makes extensive use of YUI, you should consider it's replacement AMD/JQuery.
|
||||
* @see js_call_amd()
|
||||
*
|
||||
* @param array|string $modules One or more modules
|
||||
* @param string $function The function to call once modules have been loaded
|
||||
* @param array $arguments An array of arguments to pass to the function
|
||||
@ -1205,6 +1260,47 @@ class page_requirements_manager {
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns js code to load amd module loader, then insert inline script tags
|
||||
* that contain require() calls using RequireJS.
|
||||
* @return string
|
||||
*/
|
||||
protected function get_amd_footercode() {
|
||||
global $CFG;
|
||||
$output = '';
|
||||
$jsrev = $this->get_jsrev();
|
||||
|
||||
$jsloader = new moodle_url($CFG->httpswwwroot . '/lib/javascript.php');
|
||||
$jsloader->set_slashargument('/' . $jsrev . '/');
|
||||
$requirejsloader = new moodle_url($CFG->httpswwwroot . '/lib/requirejs.php');
|
||||
$requirejsloader->set_slashargument('/' . $jsrev . '/');
|
||||
|
||||
$requirejsconfig = file_get_contents($CFG->dirroot . '/lib/requirejs/moodle-config.js');
|
||||
|
||||
// No extension required unless slash args is disabled.
|
||||
$jsextension = '.js';
|
||||
if (!empty($CFG->slasharguments)) {
|
||||
$jsextension = '';
|
||||
}
|
||||
|
||||
$requirejsconfig = str_replace('[BASEURL]', $requirejsloader, $requirejsconfig);
|
||||
$requirejsconfig = str_replace('[JSURL]', $jsloader, $requirejsconfig);
|
||||
$requirejsconfig = str_replace('[JSEXT]', $jsextension, $requirejsconfig);
|
||||
|
||||
$output .= html_writer::script($requirejsconfig);
|
||||
if ($CFG->debugdeveloper) {
|
||||
$output .= html_writer::script('', $this->js_fix_url('/lib/requirejs/require.js'));
|
||||
} else {
|
||||
$output .= html_writer::script('', $this->js_fix_url('/lib/requirejs/require.min.js'));
|
||||
}
|
||||
|
||||
// First include must be to a module with no dependencies, this prevents multiple requests.
|
||||
$prefix = "require(['core/first'], function() {\n";
|
||||
$suffix = "\n});";
|
||||
$output .= html_writer::script($prefix . implode(";\n", $this->amdjscode) . $suffix);
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns basic YUI3 JS loading code.
|
||||
* YUI3 is using autoloading of both CSS and JS code.
|
||||
@ -1426,9 +1522,13 @@ class page_requirements_manager {
|
||||
*/
|
||||
public function get_end_code() {
|
||||
global $CFG;
|
||||
$output = '';
|
||||
|
||||
// Call amd init functions.
|
||||
$output .= $this->get_amd_footercode();
|
||||
|
||||
// Add other requested modules.
|
||||
$output = $this->get_extra_modules_code();
|
||||
$output .= $this->get_extra_modules_code();
|
||||
|
||||
$this->js_init_code('M.util.js_complete("init");', true);
|
||||
|
||||
|
144
lib/requirejs.php
Normal file
144
lib/requirejs.php
Normal file
@ -0,0 +1,144 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* This file is serving optimised JS for RequireJS.
|
||||
*
|
||||
* @package core
|
||||
* @copyright 2015 Damyon Wiese
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
// Disable moodle specific debug messages and any errors in output,
|
||||
// comment out when debugging or better look into error log!
|
||||
define('NO_DEBUG_DISPLAY', true);
|
||||
|
||||
// We need just the values from config.php and minlib.php.
|
||||
define('ABORT_AFTER_CONFIG', true);
|
||||
require('../config.php'); // This stops immediately at the beginning of lib/setup.php.
|
||||
require_once("$CFG->dirroot/lib/jslib.php");
|
||||
require_once("$CFG->dirroot/lib/classes/requirejs.php");
|
||||
|
||||
$slashargument = min_get_slash_argument();
|
||||
if (!$slashargument) {
|
||||
// The above call to min_get_slash_argument should always work.
|
||||
die('Invalid request');
|
||||
}
|
||||
|
||||
$slashargument = ltrim($slashargument, '/');
|
||||
if (substr_count($slashargument, '/') < 1) {
|
||||
header('HTTP/1.0 404 not found');
|
||||
die('Slash argument must contain both a revision and a file path');
|
||||
}
|
||||
// Split into revision and module name.
|
||||
list($rev, $file) = explode('/', $slashargument, 2);
|
||||
$rev = min_clean_param($rev, 'INT');
|
||||
$file = '/' . min_clean_param($file, 'SAFEPATH');
|
||||
|
||||
// Only load js files from the js modules folder from the components.
|
||||
$jsfiles = array();
|
||||
list($unused, $component, $module) = explode('/', $file, 3);
|
||||
|
||||
// No subdirs allowed - only flat module structure please.
|
||||
if (strpos('/', $module) !== false) {
|
||||
die('Invalid module');
|
||||
}
|
||||
|
||||
// Some (huge) modules are better loaded lazily (when they are used). If we are requesting
|
||||
// one of these modules, only return the one module, not the combo.
|
||||
$lazysuffix = "-lazy.js";
|
||||
$lazyload = (strpos($module, $lazysuffix) !== false);
|
||||
|
||||
if ($lazyload) {
|
||||
// We are lazy loading a single file - so include the component/filename pair in the etag.
|
||||
$etag = sha1($rev . '/' . $component . '/' . $module);
|
||||
} else {
|
||||
// We loading all (non-lazy) files - so only the rev makes this request unique.
|
||||
$etag = sha1($rev);
|
||||
}
|
||||
|
||||
|
||||
// Use the caching only for meaningful revision numbers which prevents future cache poisoning.
|
||||
if ($rev > 0 and $rev < (time() + 60 * 60)) {
|
||||
$candidate = $CFG->localcachedir . '/requirejs/' . $etag;
|
||||
|
||||
if (file_exists($candidate)) {
|
||||
if (!empty($_SERVER['HTTP_IF_NONE_MATCH']) || !empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
|
||||
// We do not actually need to verify the etag value because our files
|
||||
// never change in cache because we increment the rev parameter.
|
||||
js_send_unmodified(filemtime($candidate), $etag);
|
||||
}
|
||||
js_send_cached($candidate, $etag, 'requirejs.php');
|
||||
exit(0);
|
||||
|
||||
} else {
|
||||
$jsfiles = array();
|
||||
if ($lazyload) {
|
||||
$jsfiles = core_requirejs::find_one_amd_module($component, $module);
|
||||
} else {
|
||||
// Here we respond to the request by returning ALL amd modules. This saves
|
||||
// round trips in production.
|
||||
|
||||
$jsfiles = core_requirejs::find_all_amd_modules();
|
||||
}
|
||||
|
||||
$content = '';
|
||||
foreach ($jsfiles as $modulename => $jsfile) {
|
||||
$js = file_get_contents($jsfile) . "\n";
|
||||
// Inject the module name into the define.
|
||||
$replace = 'define(\'' . $modulename . '\', ';
|
||||
$search = 'define(';
|
||||
// Replace only the first occurrence.
|
||||
$js = implode($replace, explode($search, $js, 2));
|
||||
$content .= $js;
|
||||
}
|
||||
|
||||
js_write_cache_file_content($candidate, $content);
|
||||
// Verify nothing failed in cache file creation.
|
||||
clearstatcache();
|
||||
if (file_exists($candidate)) {
|
||||
js_send_cached($candidate, $etag, 'requirejs.php');
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($lazyload) {
|
||||
$jsfiles = core_requirejs::find_one_amd_module($component, $module, true);
|
||||
} else {
|
||||
$jsfiles = core_requirejs::find_all_amd_modules(true);
|
||||
}
|
||||
|
||||
$content = '';
|
||||
foreach ($jsfiles as $modulename => $jsfile) {
|
||||
$shortfilename = str_replace($CFG->dirroot, '', $jsfile);
|
||||
$js = "// ---- $shortfilename ----\n";
|
||||
$js .= file_get_contents($jsfile) . "\n";
|
||||
// Inject the module name into the define.
|
||||
$replace = 'define(\'' . $modulename . '\', ';
|
||||
$search = 'define(';
|
||||
|
||||
if (strpos($js, $search) === false) {
|
||||
// We can't call debugging because we only have minimal config loaded.
|
||||
header('HTTP/1.0 500 error');
|
||||
die('JS file: ' . $shortfilename . ' does not contain a javascript module in AMD format. "define()" not found.');
|
||||
}
|
||||
|
||||
// Replace only the first occurrence.
|
||||
$js = implode($replace, explode($search, $js, 2));
|
||||
$content .= $js;
|
||||
}
|
||||
js_send_uncached($content, $etag, 'requirejs.php');
|
58
lib/requirejs/LICENSE
Normal file
58
lib/requirejs/LICENSE
Normal file
@ -0,0 +1,58 @@
|
||||
RequireJS is released under two licenses: new BSD, and MIT. You may pick the
|
||||
license that best suits your development needs. The text of both licenses are
|
||||
provided below.
|
||||
|
||||
|
||||
The "New" BSD License:
|
||||
----------------------
|
||||
|
||||
Copyright (c) 2010-2014, The Dojo Foundation
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the name of the Dojo Foundation nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
|
||||
MIT License
|
||||
-----------
|
||||
|
||||
Copyright (c) 2010-2014, The Dojo Foundation
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
28
lib/requirejs/jquery-private.js
vendored
Normal file
28
lib/requirejs/jquery-private.js
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* This module depends on the real jquery - and returns the non-global version of it.
|
||||
*
|
||||
* @module jquery-private
|
||||
* @package core
|
||||
* @copyright 2015 Damyon Wiese <damyon@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
define(['jquery'], function ($) {
|
||||
// This noConflict call tells JQuery to remove the variable from the global scope - so
|
||||
// the only remaining instance will be the sandboxed one.
|
||||
return $.noConflict( true );
|
||||
});
|
24
lib/requirejs/moodle-config.js
Normal file
24
lib/requirejs/moodle-config.js
Normal file
@ -0,0 +1,24 @@
|
||||
var require = {
|
||||
baseUrl : '[BASEURL]',
|
||||
// We only support AMD modules with an explicit define() statement.
|
||||
enforceDefine: true,
|
||||
skipDataMain: true,
|
||||
|
||||
paths: {
|
||||
jquery: '[JSURL]lib/jquery/jquery-1.11.1.min[JSEXT]',
|
||||
jqueryui: '[JSURL]lib/jquery/ui-1.11.1/jquery-ui.min[JSEXT]',
|
||||
jqueryprivate: '[JSURL]lib/requirejs/jquery-private[JSEXT]'
|
||||
},
|
||||
|
||||
// Custom jquery config map.
|
||||
map: {
|
||||
// '*' means all modules will get 'jqueryprivate'
|
||||
// for their 'jquery' dependency.
|
||||
'*': { jquery: 'jqueryprivate' },
|
||||
|
||||
// 'jquery-private' wants the real jQuery module
|
||||
// though. If this line was not here, there would
|
||||
// be an unresolvable cyclic dependency.
|
||||
jqueryprivate: { jquery: 'jquery' }
|
||||
}
|
||||
};
|
2076
lib/requirejs/require.js
Normal file
2076
lib/requirejs/require.js
Normal file
File diff suppressed because it is too large
Load Diff
36
lib/requirejs/require.min.js
vendored
Normal file
36
lib/requirejs/require.min.js
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
RequireJS 2.1.15 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved.
|
||||
Available via the MIT or new BSD license.
|
||||
see: http://github.com/jrburke/requirejs for details
|
||||
*/
|
||||
var requirejs,require,define;
|
||||
(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;d<b.length&&(!b[d]||!c(b[d],d,b));d+=1);}}function T(b,c){if(b){var d;for(d=b.length-1;-1<d&&(!b[d]||!c(b[d],d,b));d-=1);}}function t(b,c){return fa.call(b,c)}function m(b,c){return t(b,c)&&b[c]}function B(b,c){for(var d in b)if(t(b,d)&&c(b[d],d))break}function U(b,c,d,e){c&&B(c,function(c,g){if(d||!t(b,g))e&&"object"===typeof c&&c&&!H(c)&&!G(c)&&!(c instanceof
|
||||
RegExp)?(b[g]||(b[g]={}),U(b[g],c,d,e)):b[g]=c});return b}function u(b,c){return function(){return c.apply(b,arguments)}}function ca(b){throw b;}function da(b){if(!b)return b;var c=ba;v(b.split("."),function(b){c=c[b]});return c}function C(b,c,d,e){c=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+b);c.requireType=b;c.requireModules=e;d&&(c.originalError=d);return c}function ga(b){function c(a,k,b){var f,l,c,d,e,g,i,p,k=k&&k.split("/"),h=j.map,n=h&&h["*"];if(a){a=a.split("/");l=a.length-1;j.nodeIdCompat&&
|
||||
Q.test(a[l])&&(a[l]=a[l].replace(Q,""));"."===a[0].charAt(0)&&k&&(l=k.slice(0,k.length-1),a=l.concat(a));l=a;for(c=0;c<l.length;c++)if(d=l[c],"."===d)l.splice(c,1),c-=1;else if(".."===d&&!(0===c||1==c&&".."===l[2]||".."===l[c-1])&&0<c)l.splice(c-1,2),c-=2;a=a.join("/")}if(b&&h&&(k||n)){l=a.split("/");c=l.length;a:for(;0<c;c-=1){e=l.slice(0,c).join("/");if(k)for(d=k.length;0<d;d-=1)if(b=m(h,k.slice(0,d).join("/")))if(b=m(b,e)){f=b;g=c;break a}!i&&(n&&m(n,e))&&(i=m(n,e),p=c)}!f&&i&&(f=i,g=p);f&&(l.splice(0,
|
||||
g,f),a=l.join("/"))}return(f=m(j.pkgs,a))?f:a}function d(a){z&&v(document.getElementsByTagName("script"),function(k){if(k.getAttribute("data-requiremodule")===a&&k.getAttribute("data-requirecontext")===i.contextName)return k.parentNode.removeChild(k),!0})}function e(a){var k=m(j.paths,a);if(k&&H(k)&&1<k.length)return k.shift(),i.require.undef(a),i.makeRequire(null,{skipMap:!0})([a]),!0}function n(a){var k,c=a?a.indexOf("!"):-1;-1<c&&(k=a.substring(0,c),a=a.substring(c+1,a.length));return[k,a]}function p(a,
|
||||
k,b,f){var l,d,e=null,g=k?k.name:null,j=a,p=!0,h="";a||(p=!1,a="_@r"+(K+=1));a=n(a);e=a[0];a=a[1];e&&(e=c(e,g,f),d=m(r,e));a&&(e?h=d&&d.normalize?d.normalize(a,function(a){return c(a,g,f)}):-1===a.indexOf("!")?c(a,g,f):a:(h=c(a,g,f),a=n(h),e=a[0],h=a[1],b=!0,l=i.nameToUrl(h)));b=e&&!d&&!b?"_unnormalized"+(O+=1):"";return{prefix:e,name:h,parentMap:k,unnormalized:!!b,url:l,originalName:j,isDefine:p,id:(e?e+"!"+h:h)+b}}function s(a){var k=a.id,b=m(h,k);b||(b=h[k]=new i.Module(a));return b}function q(a,
|
||||
k,b){var f=a.id,c=m(h,f);if(t(r,f)&&(!c||c.defineEmitComplete))"defined"===k&&b(r[f]);else if(c=s(a),c.error&&"error"===k)b(c.error);else c.on(k,b)}function w(a,b){var c=a.requireModules,f=!1;if(b)b(a);else if(v(c,function(b){if(b=m(h,b))b.error=a,b.events.error&&(f=!0,b.emit("error",a))}),!f)g.onError(a)}function x(){R.length&&(ha.apply(A,[A.length,0].concat(R)),R=[])}function y(a){delete h[a];delete V[a]}function F(a,b,c){var f=a.map.id;a.error?a.emit("error",a.error):(b[f]=!0,v(a.depMaps,function(f,
|
||||
d){var e=f.id,g=m(h,e);g&&(!a.depMatched[d]&&!c[e])&&(m(b,e)?(a.defineDep(d,r[e]),a.check()):F(g,b,c))}),c[f]=!0)}function D(){var a,b,c=(a=1E3*j.waitSeconds)&&i.startTime+a<(new Date).getTime(),f=[],l=[],g=!1,h=!0;if(!W){W=!0;B(V,function(a){var i=a.map,j=i.id;if(a.enabled&&(i.isDefine||l.push(a),!a.error))if(!a.inited&&c)e(j)?g=b=!0:(f.push(j),d(j));else if(!a.inited&&(a.fetched&&i.isDefine)&&(g=!0,!i.prefix))return h=!1});if(c&&f.length)return a=C("timeout","Load timeout for modules: "+f,null,
|
||||
f),a.contextName=i.contextName,w(a);h&&v(l,function(a){F(a,{},{})});if((!c||b)&&g)if((z||ea)&&!X)X=setTimeout(function(){X=0;D()},50);W=!1}}function E(a){t(r,a[0])||s(p(a[0],null,!0)).init(a[1],a[2])}function I(a){var a=a.currentTarget||a.srcElement,b=i.onScriptLoad;a.detachEvent&&!Y?a.detachEvent("onreadystatechange",b):a.removeEventListener("load",b,!1);b=i.onScriptError;(!a.detachEvent||Y)&&a.removeEventListener("error",b,!1);return{node:a,id:a&&a.getAttribute("data-requiremodule")}}function J(){var a;
|
||||
for(x();A.length;){a=A.shift();if(null===a[0])return w(C("mismatch","Mismatched anonymous define() module: "+a[a.length-1]));E(a)}}var W,Z,i,L,X,j={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},h={},V={},$={},A=[],r={},S={},aa={},K=1,O=1;L={require:function(a){return a.require?a.require:a.require=i.makeRequire(a.map)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports?r[a.map.id]=a.exports:a.exports=r[a.map.id]={}},module:function(a){return a.module?
|
||||
a.module:a.module={id:a.map.id,uri:a.map.url,config:function(){return m(j.config,a.map.id)||{}},exports:a.exports||(a.exports={})}}};Z=function(a){this.events=m($,a.id)||{};this.map=a;this.shim=m(j.shim,a.id);this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};Z.prototype={init:function(a,b,c,f){f=f||{};if(!this.inited){this.factory=b;if(c)this.on("error",c);else this.events.error&&(c=u(this,function(a){this.emit("error",a)}));this.depMaps=a&&a.slice(0);this.errback=
|
||||
c;this.inited=!0;this.ignore=f.ignore;f.enabled||this.enabled?this.enable():this.check()}},defineDep:function(a,b){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,this.depExports[a]=b)},fetch:function(){if(!this.fetched){this.fetched=!0;i.startTime=(new Date).getTime();var a=this.map;if(this.shim)i.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],u(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=
|
||||
this.map.url;S[a]||(S[a]=!0,i.load(this.map.id,a))},check:function(){if(this.enabled&&!this.enabling){var a,b,c=this.map.id;b=this.depExports;var f=this.exports,l=this.factory;if(this.inited)if(this.error)this.emit("error",this.error);else{if(!this.defining){this.defining=!0;if(1>this.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&&
|
||||
(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=
|
||||
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);
|
||||
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",
|
||||
"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,
|
||||
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,
|
||||
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,
|
||||
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=
|
||||
!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!==
|
||||
e&&(!("."===k||".."===k)||1<e))d=b.substring(e,b.length),b=b.substring(0,e);return i.nameToUrl(c(b,a&&a.id,!0),d,!0)},defined:function(b){return t(r,p(b,a,!1,!0).id)},specified:function(b){b=p(b,a,!1,!0).id;return t(r,b)||t(h,b)}});a||(j.undef=function(b){x();var c=p(b,a,!0),e=m(h,b);d(b);delete r[b];delete S[c.url];delete $[b];T(A,function(a,c){a[0]===b&&A.splice(c,1)});e&&(e.events.defined&&($[b]=e.events),y(b))});return j},enable:function(a){m(h,a.id)&&s(a).enable()},completeLoad:function(a){var b,
|
||||
c,d=m(j.shim,a)||{},g=d.exports;for(x();A.length;){c=A.shift();if(null===c[0]){c[0]=a;if(b)break;b=!0}else c[0]===a&&(b=!0);E(c)}c=m(h,a);if(!b&&!t(r,a)&&c&&!c.inited){if(j.enforceDefine&&(!g||!da(g)))return e(a)?void 0:w(C("nodefine","No define call for "+a,null,[a]));E([a,d.deps||[],d.exportsFn])}D()},nameToUrl:function(a,b,c){var d,e,h;(d=m(j.pkgs,a))&&(a=d);if(d=m(aa,a))return i.nameToUrl(d,b,c);if(g.jsExtRegExp.test(a))d=a+(b||"");else{d=j.paths;a=a.split("/");for(e=a.length;0<e;e-=1)if(h=a.slice(0,
|
||||
e).join("/"),h=m(d,h)){H(h)&&(h=h[0]);a.splice(0,e,h);break}d=a.join("/");d+=b||(/^data\:|\?/.test(d)||c?"":".js");d=("/"===d.charAt(0)||d.match(/^[\w\+\.\-]+:/)?"":j.baseUrl)+d}return j.urlArgs?d+((-1===d.indexOf("?")?"?":"&")+j.urlArgs):d},load:function(a,b){g.load(i,a,b)},execCb:function(a,b,c,d){return b.apply(d,c)},onScriptLoad:function(a){if("load"===a.type||ja.test((a.currentTarget||a.srcElement).readyState))N=null,a=I(a),i.completeLoad(a.id)},onScriptError:function(a){var b=I(a);if(!e(b.id))return w(C("scripterror",
|
||||
"Script error for: "+b.id,a,[b.id]))}};i.require=i.makeRequire();return i}var g,x,y,D,I,E,N,J,s,O,ka=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,la=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,Q=/\.js$/,ia=/^\.\//;x=Object.prototype;var K=x.toString,fa=x.hasOwnProperty,ha=Array.prototype.splice,z=!!("undefined"!==typeof window&&"undefined"!==typeof navigator&&window.document),ea=!z&&"undefined"!==typeof importScripts,ja=z&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,
|
||||
Y="undefined"!==typeof opera&&"[object Opera]"===opera.toString(),F={},q={},R=[],M=!1;if("undefined"===typeof define){if("undefined"!==typeof requirejs){if(G(requirejs))return;q=requirejs;requirejs=void 0}"undefined"!==typeof require&&!G(require)&&(q=require,require=void 0);g=requirejs=function(b,c,d,e){var n,p="_";!H(b)&&"string"!==typeof b&&(n=b,H(c)?(b=c,c=d,d=e):b=[]);n&&n.context&&(p=n.context);(e=m(F,p))||(e=F[p]=g.s.newContext(p));n&&e.configure(n);return e.require(b,c,d)};g.config=function(b){return g(b)};
|
||||
g.nextTick="undefined"!==typeof setTimeout?function(b){setTimeout(b,4)}:function(b){b()};require||(require=g);g.version="2.1.15";g.jsExtRegExp=/^\/|:|\?|\.js$/;g.isBrowser=z;x=g.s={contexts:F,newContext:ga};g({});v(["toUrl","undef","defined","specified"],function(b){g[b]=function(){var c=F._;return c.require[b].apply(c,arguments)}});if(z&&(y=x.head=document.getElementsByTagName("head")[0],D=document.getElementsByTagName("base")[0]))y=x.head=D.parentNode;g.onError=ca;g.createNode=function(b){var c=
|
||||
b.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");c.type=b.scriptType||"text/javascript";c.charset="utf-8";c.async=!0;return c};g.load=function(b,c,d){var e=b&&b.config||{};if(z)return e=g.createNode(e,c,d),e.setAttribute("data-requirecontext",b.contextName),e.setAttribute("data-requiremodule",c),e.attachEvent&&!(e.attachEvent.toString&&0>e.attachEvent.toString().indexOf("[native code"))&&!Y?(M=!0,e.attachEvent("onreadystatechange",b.onScriptLoad)):
|
||||
(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=
|
||||
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||
|
||||
(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);
|
@ -252,4 +252,11 @@
|
||||
<version>5.2.1</version>
|
||||
<licenseversion>2.1</licenseversion>
|
||||
</library>
|
||||
<library>
|
||||
<location>requirejs</location>
|
||||
<name>RequireJS</name>
|
||||
<license>MIT</license>
|
||||
<version>2.1.15</version>
|
||||
<licenseversion></licenseversion>
|
||||
</library>
|
||||
</libraries>
|
||||
|
@ -3,6 +3,7 @@ information provided here is intended especially for developers.
|
||||
|
||||
=== 2.9 ===
|
||||
|
||||
* Support for loading AMD javascript modules has been added. See MDL-49046.
|
||||
* Webservice core_course_delete_courses now return warning messages on any failures and does not try to rollback the entire deletion.
|
||||
* \core\event\course_viewed 'other' argument renamed from coursesectionid to coursesectionnumber as it contains the section number.
|
||||
* New API core_filetypes::add_type (etc.) allows custom filetypes to be added and modified.
|
||||
|
11
package.json
Normal file
11
package.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "Moodle",
|
||||
"private": true,
|
||||
"description": "Moodle",
|
||||
"devDependencies": {
|
||||
"grunt": "~0.4.5",
|
||||
"grunt-contrib-jshint": "~0.11.0",
|
||||
"grunt-contrib-uglify": "~0.7.0",
|
||||
"shifter": "~0.5.0"
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user