social-selectors
Version:
A library of selectors for CSS elements on social media sites.
262 lines (227 loc) • 9.15 kB
JavaScript
(function (root, factory) {
// https://github.com/umdjs/umd/blob/master/templates/returnExports.js
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define([], factory);
} else if (typeof module === 'object' && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory();
} else {
// Browser globals (root is window)
root.returnExports = factory();
}
}(typeof self !== 'undefined' ? self : this, function () {
var PATH_SERVER = 'https://cdn.jsdelivr.net/npm/social-selectors/module/libraries/';
var PATH_LOCAL = './libraries/';
// var environment = (Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]') ? 'node' : 'browser';
var environment = 'node';
function SocialSelectors(options) {
this.loaded = false;
this.library = {};
this.error = false;
this.options = options || {};
this.options.debug = (typeof this.options.debug !== 'undefined') ? options.debug : false;
};
SocialSelectors.prototype.isLoaded = function(payload) {
return this.loaded;
};
SocialSelectors.prototype.load = function(payload) {
// console.log('$$$ LOAD');
// this.extra = '7';
payload = payload || {};
payload.debug = typeof payload.debug !== 'undefined' ? typeof payload.debug : false;
payload.environment = payload.environment || environment || 'node';
payload.location = payload.location || 'local';
payload.library = payload.library || '';
payload.device = payload.device || 'main';
payload.path = (payload.path || '') // Overwrite existing hardcoded paths
.replace(/{{library}}/g, payload.library);
if (payload.cacheBreaker === true) {
payload.cacheBreaker = '?cb=' + Date.now();
} else if (typeof payload.cacheBreaker !== 'undefined') {
payload.cacheBreaker = '?cb=' + payload.cacheBreaker;
} else {
payload.cacheBreaker = '';
}
// options
this.options.debug = payload.debug;
var This = this;
var workingPath = '';
This.library = {};
This.loaded = false;
This.error = false;
if (payload.environment == 'browser') {
} else if (payload.environment == 'node') {
// console.log('$$$ NODE');
workingPath = (payload.location == 'local') ? PATH_LOCAL : PATH_SERVER;
workingPath = workingPath + payload.library + '/' + payload.device + '.json';
workingPath = (payload.path) ? payload.path : workingPath;
workingPath += payload.cacheBreaker;
if (This.options.debug) {
console.log('Working path:', workingPath);
}
return new Promise(function(resolve, reject) {
if (payload.location == 'local') {
// console.log('$$$ LOCAL');
try {
This.library = require(workingPath);
This.library = (typeof This.library === 'string') ? JSON.parse(This.library) : This.library;
This.loaded = true;
This.error = false;
if (This.options.debug) {
console.log('Loaded library:', This.library);
}
resolve(This.library);
} catch (e) {
This.library = e;
This.loaded = false;
This.error = e;
reject(e);
}
} else if (payload.location == 'hosted') {
var request = (workingPath.substring(0,5).indexOf('https') > -1) ? require('https') : require('http');
var full = '';
// console.log('+++++1');
request.get(workingPath, function(res) {
// console.log('+++++2', res);
// console.log('statusCode:', res.statusCode);
// console.log('headers:', res.headers);
res.on('data', function(chunk) {
// console.log('+++++chunk', chunk);
full += chunk;
});
res.on('end', function() {
// console.log('+++++end');
try {
This.library = JSON.parse(full.toString());
This.loaded = true;
This.error = false;
if (This.options.debug) {
console.log('Loaded library:', This.library);
}
resolve(This.library);
} catch (e) {
This.library = e;
This.loaded = false;
This.error = e;
console.error(e);
reject(e);
}
});
// res.on('data', function(data) {
// // process.stdout.write(d);
// // console.log('data', data);
// var processed = data.toString();
// // console.log('data.toString()', processed);
// // console.log('JSON.parse', JSON.parse(processed));
//
// try {
// This.library = JSON.parse(processed);
// This.error = false;
// resolve(This.library);
// } catch (e) {
// This.library = e;
// This.error = e;
// console.error(e);
// reject(e);
// }
// });
}).on('error', function(e) {
// console.log('+++++ERROR', e);
This.library = e;
This.loaded = false;
This.error = e;
console.error(e);
reject(e);
});
}
});
}
}
function prepareObject(value, overwrite) {
return overwrite ? Object.assign(value, overwrite) : value;
}
SocialSelectors.prototype.get = function(path, def, options) {
var This = this;
var response = def || '';
var obj = This.library || {};
options = options || {};
if (This.error) {
return response;
}
var fullPath = (path || '')
.replace(/\[/g, '.')
.replace(/]/g, '')
.split('.')
.filter(Boolean);
// return revive(fullPath.every(everyFunc) ? obj : def);
var workingVal;
if (fullPath.every(function (step) {
return !(step && (obj = obj[step]) === undefined);
})) {
workingVal = obj;
} else {
workingVal = def;
if (This.options.debug) {
console.error("Could not access path, maybe it's incorrect?", path);
}
}
// if ((typeof workingVal === 'string') && (workingVal.indexOf('$') == 0)) {
// if ((workingVal.indexOf('$get(') == 0)) {
// workingVal = This.get(workingVal.slice(0, -1).substring(5));
// } else if (workingVal.indexOf('$new(') == 0) {
//
// }
// }
workingVal = typeof workingVal === 'object' ? prepareObject(workingVal, options.overwrite) : parseTriggers(This, workingVal);
return revive(workingVal);
}
function revive(value) {
// logic from: http://ovaraksin.blogspot.com/2013/10/pass-javascript-function-via-json.html
if (value && (typeof value === 'string') && value.indexOf("function") === 0) {
return new Function('return ' + value)();
} else if (value && (typeof value === 'string') && value.indexOf("/") === 0) {
// return new RegExp(value);
var flags = value.replace(/.*\/([gimy]*)$/, '$1');
var pattern = value.replace(new RegExp('^/(.*?)/'+flags+'$'), '$1');
return new RegExp(pattern, flags);
} else {
return value;
}
// return (value && (typeof value === 'string') && value.indexOf("function") === 0)
// ? new Function('return ' + value)()
// : value;
}
function parseTriggers(This, workingVal) {
// console.log('parseTriggers', );
var triggers = ['$get', '$new'];
if (((typeof workingVal === 'string') && (triggers.some(function(v) { return workingVal.indexOf(v) >= 0; })))) {
workingVal = ' ' + workingVal + ' ';
// var occurances = (workingVal.match(/\$get\(/g) || []).length
// for (var i = 0; i < occurances; i++) {
// // var workingValArray = workingVal.match(/(?<=\$get\().*?(?=\)\s)/)
// var workingValArray = workingVal.match(/(?=\$get\().*?(?=\)\s)/)
// console.log(workingValArray);
// workingVal = workingVal.replace('$get(' + workingValArray + ') ', This.get(workingValArray + '') + ' ');
// }
var valMatches = workingVal.match(/(?:\$get\().*?(?=\)\s)/g)
for (var i = 0; i < valMatches.length; i++) {
valMatches[i] = valMatches[i].replace('$get(', '');
let fetched = This.get(valMatches[i]);
if (typeof fetched !== 'string') {
workingVal = fetched;
break;
}
workingVal = workingVal.replace('$get(' + valMatches[i] + ') ', fetched + ' ');
}
workingVal = typeof workingVal === 'string' ? workingVal.trim() : workingVal;
}
return workingVal;
}
// Just return a value to define the module export.
// This example returns an object, but the module
// can return a function as the exported value.
return SocialSelectors; // Enable if using UMD
}));