0c7c93f66f5b0af032703f26632682b685b26be5Dav GlassYUI.add('get', function(Y) {
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass /**
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass * NodeJS specific Get module used to load remote resources. It contains the same signature as the default Get module so there is no code change needed.
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass * @module get-nodejs
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @class GetNodeJS
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass */
f708d7565966b0cf46ee594efc3097461dfe9260Dav Glass
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass var path = require('path'),
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass vm = require('vm'),
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass fs = require('fs'),
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass request = require('request');
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass Y.Get = function() {
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass };
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass //Setup the default config base path
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass Y.config.base = path.join(__dirname, '../');
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass YUI.require = require;
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass YUI.process = process;
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass /**
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * Escape the path for Windows, they need to be double encoded when used as `__dirname` or `__filename`
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @method escapeWinPath
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @protected
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @param {String} p The path to modify
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @return {String} The encoded path
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass */
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass var escapeWinPath = function(p) {
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass return p.replace(/\\/g, '\\\\');
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass };
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass /**
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * Takes the raw JS files and wraps them to be executed in the YUI context so they can be loaded
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * into the YUI object
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @method _exec
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @private
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @param {String} data The JS to execute
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @param {String} url The path to the file that was parsed
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @param {Callback} cb The callback to execute when this is completed
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @param {Error} cb.err=null Error object
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @param {String} cb.url The URL that was just parsed
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass */
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass Y.Get._exec = function(data, url, cb) {
2c16f850943524e5599e00f11540dbd2b5db3b8cDav Glass var dirName = escapeWinPath(path.dirname(url));
2c16f850943524e5599e00f11540dbd2b5db3b8cDav Glass var fileName = escapeWinPath(url);
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass if (dirName.match(/^https?:\/\//)) {
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass dirName = '.';
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass fileName = 'remoteResource';
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass }
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass var mod = "(function(YUI) { var __dirname = '" + dirName + "'; "+
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass "var __filename = '" + fileName + "'; " +
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass "var process = YUI.process;" +
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass "var require = function(file) {" +
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass " if (file.indexOf('./') === 0) {" +
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass " file = __dirname + file.replace('./', '/'); }" +
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass " return YUI.require(file); }; " +
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass data + " ;return YUI; })";
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass //var mod = "(function(YUI) { " + data + ";return YUI; })";
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass var script = vm.createScript(mod, url);
f708d7565966b0cf46ee594efc3097461dfe9260Dav Glass var fn = script.runInThisContext(mod);
f708d7565966b0cf46ee594efc3097461dfe9260Dav Glass YUI = fn(YUI);
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass cb(null, url);
f708d7565966b0cf46ee594efc3097461dfe9260Dav Glass };
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass /**
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * Fetches the content from a remote URL or a file from disc and passes the content
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * off to `_exec` for parsing
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @method _include
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @private
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @param {String} url The URL/File path to fetch the content from
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @param {Callback} cb The callback to fire once the content has been executed via `_exec`
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass */
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass Y.Get._include = function(url, cb) {
7393d0cf318ebfc443f6337cfa6da43d4aff2fd7Dav Glass var self = this;
7393d0cf318ebfc443f6337cfa6da43d4aff2fd7Dav Glass
f708d7565966b0cf46ee594efc3097461dfe9260Dav Glass if (url.match(/^https?:\/\//)) {
7393d0cf318ebfc443f6337cfa6da43d4aff2fd7Dav Glass var cfg = {
7393d0cf318ebfc443f6337cfa6da43d4aff2fd7Dav Glass url: url,
7393d0cf318ebfc443f6337cfa6da43d4aff2fd7Dav Glass timeout: self.timeout
7393d0cf318ebfc443f6337cfa6da43d4aff2fd7Dav Glass };
7393d0cf318ebfc443f6337cfa6da43d4aff2fd7Dav Glass request(cfg, function (err, response, body) {
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass if (err) {
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass Y.log(err, 'error', 'get');
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass cb(err, url);
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass } else {
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass Y.Get._exec(body, url, cb);
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass }
f708d7565966b0cf46ee594efc3097461dfe9260Dav Glass });
f708d7565966b0cf46ee594efc3097461dfe9260Dav Glass } else {
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass if (Y.config.useSync) {
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass //Needs to be in useSync
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass if (path.existsSync(url)) {
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass var mod = fs.readFileSync(url,'utf8');
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass Y.Get._exec(mod, url, cb);
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass } else {
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass cb('Path does not exist: ' + url, url);
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass }
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass } else {
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass fs.readFile(url, 'utf8', function(err, mod) {
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass if (err) {
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass cb(err, url);
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass } else {
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass Y.Get._exec(mod, url, cb);
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass }
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass });
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass }
f708d7565966b0cf46ee594efc3097461dfe9260Dav Glass }
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass };
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass var end = function(cb, msg, result) {
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass //Y.log('Get end: ' + cb.onEnd);
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass if (Y.Lang.isFunction(cb.onEnd)) {
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass cb.onEnd.call(Y, msg, result);
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass }
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass }, pass = function(cb) {
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass //Y.log('Get pass: ' + cb.onSuccess);
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass if (Y.Lang.isFunction(cb.onSuccess)) {
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass cb.onSuccess.call(Y, cb);
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass }
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass end(cb, 'success', 'success');
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass }, fail = function(cb, er) {
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass //Y.log('Get fail: ' + er);
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass if (Y.Lang.isFunction(cb.onFailure)) {
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass cb.onFailure.call(Y, er, cb);
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass }
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass end(cb, er, 'fail');
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass };
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass /**
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass * Override for Get.script for loading local or remote YUI modules.
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass * @method js
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass * @param {Array|String} s The URL's to load into this context
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass * @param {Object} options Transaction options
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass */
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass Y.Get.js = function(s, options) {
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass var A = Y.Array,
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass self = this,
1f31cb648e4f86a24ec85d11aee069232bea4332Dav Glass urls = A(s), url, i, l = urls.length, c= 0,
1f31cb648e4f86a24ec85d11aee069232bea4332Dav Glass check = function() {
1f31cb648e4f86a24ec85d11aee069232bea4332Dav Glass if (c === l) {
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass pass(options);
1f31cb648e4f86a24ec85d11aee069232bea4332Dav Glass }
1f31cb648e4f86a24ec85d11aee069232bea4332Dav Glass };
1f31cb648e4f86a24ec85d11aee069232bea4332Dav Glass
1f31cb648e4f86a24ec85d11aee069232bea4332Dav Glass
1f31cb648e4f86a24ec85d11aee069232bea4332Dav Glass
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass for (i=0; i<l; i++) {
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass url = urls[i];
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass if (Y.Lang.isObject(url)) {
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass url = url.url;
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass }
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass url = url.replace(/'/g, '%27');
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass Y.log('URL: ' + url, 'info', 'get');
1702fd8ca80cc30781373ff0ddf0227bf7688363Dav Glass Y.Get._include(url, function(err, url) {
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass if (!Y.config) {
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass Y.config = {
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass debug: true
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass };
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass }
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass if (options.onProgress) {
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass options.onProgress.call(options.context || Y, url);
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass }
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass Y.log('After Load: ' + url, 'info', 'get');
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass if (err) {
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass fail(options, err);
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass Y.log('----------------------------------------------------------', 'error', 'get');
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass Y.log(err, 'error', 'get');
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass Y.log('----------------------------------------------------------', 'error', 'get');
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass } else {
1f31cb648e4f86a24ec85d11aee069232bea4332Dav Glass c++;
1f31cb648e4f86a24ec85d11aee069232bea4332Dav Glass check();
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass }
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass });
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass }
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass };
8610b4c45db9fb0a80a184b3f34fedb70d59296dDav Glass
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass /**
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass * Alias for `Y.Get.js`
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass * @method script
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass */
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass Y.Get.script = Y.Get.js;
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass
8610b4c45db9fb0a80a184b3f34fedb70d59296dDav Glass //Place holder for SS Dom access
8610b4c45db9fb0a80a184b3f34fedb70d59296dDav Glass Y.Get.css = function(s, cb) {
5e01848ef29b56e6a9c745c603bc0137505bb193Dav Glass Y.log('Y.Get.css is not supported, just reporting that it has loaded but not fetching.', 'warn', 'get');
8610b4c45db9fb0a80a184b3f34fedb70d59296dDav Glass pass(cb);
8610b4c45db9fb0a80a184b3f34fedb70d59296dDav Glass };
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass
74ead59e93c5200ec17d94b912efc72d0d5605a0Dav Glass
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass
0c7c93f66f5b0af032703f26632682b685b26be5Dav Glass}, '@VERSION@' ,{requires:['yui-base']});