UNPKG

autocode-cli

Version:

code automation for every language, framework and platform

1,810 lines (1,624 loc) 101 kB
jQuery.fn.extend({ visibleWidth: function() { var o = $(this); if (o.is(':hidden')) { return 0; } else { return o.outerWidth(); } } }); var autocode = { action: {}, config: {}, data: { current: {} }, state: {}, user: {}, initState: function() { $('a').each(function() { if ($(this).data('state')) { return; } $(this).data('state', true); if (navigator.userAgent.match(/mobile/i)) { $(this).bind({ touchstart: function() { $(window).removeData('scrolled'); }, touchend: function(e) { if ($(window).data('scrolled')) { return false; } return autocode.initStateCallback(e, $(this)); } }); } else { $(this).click(autocode.initStateCallback); } }); }, initStateCallback: function(e, o) { var o = o || $(this); var href = o.attr('href'); if (!href) { return false; } else if (href.match(/^https?:/)) { return true; } var query = href.split('?'); href = query[0]; query = autocode.query.search(query[1]); e.preventDefault(); var action = autocode.state[href]; if (action) { $('input:focus').blur(); action(query); history.pushState(null, null, '#' + href); autocode.initState(); } if (autocode.listener.listeners[href]) { for (var listener_name in autocode.listener.listeners[href]) { autocode.listener.listeners[href][listener_name](query); } } autocode.resize.all(); return false; } }; $(window).load(autocode.init); $(window).resize(autocode.resize);;autocode.api = { url: null, ajax: function(opts) { opts.url = autocode.api.url + opts.uri; var ajax = { contentType: 'application/json', dataType: 'json', method: opts.method, url: opts.url, complete: opts.complete, error: opts.error, success: opts.success, xhrFields: { withCredentials: true } }; if (opts.data) { if (opts.method == 'get') { for (var name in opts.data) { if (ajax.url.match(/\?/)) { ajax.url += '&'; } else { ajax.url += '?'; } ajax.url += name + '=' + opts.data[name]; } } else { ajax.data = JSON.stringify(opts.data); } } $.ajax(ajax); }, get: function(opts) { opts.method = 'get'; return autocode.api.ajax(opts); }, post: function(opts) { opts.method = 'post'; return autocode.api.ajax(opts); } };;autocode.element = {};;autocode.fuzzy = { close: function() { $('#fuzzy').remove(); }, open: function(opts) { var fuzzy = $('#fuzzy'); if (!fuzzy.length) { fuzzy = $(document.createElement('div')); $('body').append(fuzzy); } fuzzy.attr('id', 'fuzzy'); fuzzy.data('target', opts.target); var icons_exist = false; for (var i = 0; i < opts.rows.length; i++) { if (opts.rows[i].icon) { icons_exist = true; break; } } var table = $(document.createElement('div')); table.addClass('table'); var row_icon, row_link, row_text; for (var i = 0; i < opts.rows.length; i++) { row = opts.rows[i]; row_link = $(document.createElement('a')); row_link.attr('href', row.state); table.append(row_link); if (icons_exist) { row_icon = $(document.createElement('span')); row_icon.addClass('icon'); if (row.icon) { if (row.icon.match(/^https?:/)) { row_icon.css('background-image', 'url(' + row.icon + ')'); } else { row_icon.addClass(row.icon); } } row_link.append(row_icon); } row_text = $(document.createElement('span')); row_text.addClass('text'); row_text.html(row.text.replace(new RegExp('(' + opts.value + ')', 'i'), '<b>$1</b>')); row_link.append(row_text); } fuzzy.html(table); autocode.initState(); autocode.resize.fuzzy(); } };;autocode.hint = { timer: null, close: function(opts) { opts = opts || {}; if (opts.animated === false) { $('#hint, #hint-arrow').remove(); } else { $('#hint, #hint-arrow').fadeOut(function() { $('#hint, #hint-arrow').remove(); }); } }, init: function() { $('*[data-hint]').each(function() { $(this).bind({ mouseenter: function() { autocode.hint.open({ target: $(this), text: $(this).data('hint') }); autocode.resize.hint(); }, mouseleave: function() { autocode.hint.close(); } }); }); }, open: function(opts) { clearTimeout(autocode.hint.timer); var hint = $('#hint'); if (!hint.length) { hint = $(document.createElement('div')); hint.attr('id', 'hint'); $('body').append(hint); } if (opts.minTop !== undefined) { hint.data('minTop', opts.minTop); } else { hint.removeData('minTop'); } if (opts.offsetTop !== undefined) { hint.data('offsetTop', opts.offsetTop); } else { hint.removeData('offsetTop'); } hint.data('originalText', opts.text); if (opts.scrollUp) { hint.data('scrollUp', opts.scrollUp); } else { hint.removeData('scrollUp'); } if (opts.top !== undefined) { hint.data('top', opts.top); } else { hint.removeData('top'); } var hint_arrow = $('#hint-arrow'); if (!hint_arrow.length) { hint_arrow = $(document.createElement('div')); hint_arrow.attr('id', 'hint-arrow'); $('body').append(hint_arrow); } hint.data('target', opts.target); hint.html(opts.text); if (opts.timer) { autocode.hint.timer = setTimeout(function() { autocode.hint.close(); }, opts.timer); } } };;autocode.init = function() { autocode.api.url = autocode.url.api(); autocode.resize.loader(); $('#loader').animate({ opacity: 1 }); autocode.hint.init() autocode.shortcut.init() autocode.initState(); $(window).bind({ keyup: function(e) { if (e.keyCode == 9 || e.keyCode == 27) { autocode.fuzzy.close(); } }, mousedown: function(e) { var target = $(e.target); if ( target.attr('id') != 'popover' && !target.parents('#popover').length && target.attr('id') != 'menu' && !target.parents('#menu').length && target.attr('id') != 'user' && !target.parents('#user').length ) { autocode.popover.close(); } if (target.attr('id') != 'fuzzy' && !target.parents('#fuzzy').length) { autocode.fuzzy.close(); } }, popstate: function() { var hash = location.hash.split('#')[1]; if (autocode.state[hash]) { autocode.state[hash](); } }, scroll: function() { $(this).data('scrolled', true); } }); $('#content .content-center').bind('scroll', function() { if ($('#fuzzy').length) { autocode.resize.fuzzy(); } if ($('#hint').length) { autocode.resize.hint(); } }); var code = autocode.query.get('code'); history.pushState(null, null, '/'); if (code) { autocode.api.login.post({ data: { code: code, provider: 1 }, error: function(data) { alert('Unable to login.'); autocode.load(); }, success: autocode.load }); } else { autocode.load(); } autocode.resize.all(); }; $(window).load(autocode.init);;autocode.listener = { listeners: {}, add: function(name, state, callback) { if (!autocode.listener.listeners[state]) { autocode.listener.listeners[state] = {}; } autocode.listener.listeners[state][name] = callback; }, remove: function(name, state) { if (state) { autocode.listener.listeners[state].splice( autocode.listener.listeners[state].indexOf(name), 1 ); if (!Object.keys(autocode.listener.listeners[state]).length) { delete(autocode.listener.listeners[state]); } } else { var listeners; for (var listener_state in autocode.listener.listeners) { delete(autocode.listener.listeners[listener_state][name]); if (!Object.keys(autocode.listener.listeners[listener_state]).length) { delete(autocode.listener.listeners[listener_state]); } } } } };;autocode.load = function() { autocode.api.auth.get({ error: function(data) { console.log(data); alert('Unable to load Autocode. Please contact support.'); }, success: function(data) { autocode.data.auth = data; autocode.api.config.get({ data: { repo: 'crystal/autocode' }, error: function(data) { console.log(data); alert('Unable to load Autocode. Please contact support.'); }, success: function(data) { autocode.config = jsyaml.safeLoad(data.config); autocode.api.user.get({ complete: function() { autocode.action.updateRecent(); var repo = autocode.storage.get('repo'); if (!repo) { $('#loader').fadeOut(function() { $('#loader').remove(); $('#container').show(); $('#welcome').hide(); autocode.resize.all(); $('#container').animate({ opacity: 1 },{ complete: function() { $('#welcome').css({ opacity: 0 }).show().animate({ opacity: 1 }); autocode.resize.all(); } }); }); return; } $('#loader').fadeOut(function() { $('#loader').remove(); $('#container').show(); $('#welcome').hide(); autocode.resize.all(); $('#container').animate({ opacity: 1 },{ complete: function() { $('.app').fadeIn(); } }); }); }, error: function() { $('#new-option, #load-option').hide(); $('#recent').hide(); }, success: function(data) { autocode.data.user = data; autocode.data.user.isLoggedIn = true; $('#login-option').hide(); $('#user .icon').css('background-image', 'url(' + data.avatar + ')'); $('#user .text').text(data.username); } }); } }); } }); };;autocode.loader = { close: function() { $('#loader').remove(); }, open: function(opts) { autocode.loader.close(); var loader = $(document.createElement('div')); loader.attr('id', 'loader'); loader.html('<img class="icon" src="images/loader.svg" />'); $('body').append(loader); autocode.resize.all(['loader']); loader.animate({ opacity: 1 }); } };;autocode.object = { clone: function(o) { return JSON.parse(JSON.stringify(o)); }, sort: function(o) { var sorted = {}, key, a = []; for (key in o) { if (o.hasOwnProperty(key)) { a.push(key); } } a.sort(); for (key = 0; key < a.length; key++) { sorted[a[key]] = o[a[key]]; } return sorted; } };;autocode.popover = { close: function() { $('#popover').remove(); }, open: function(opts) { var popover = $(document.createElement('div')); popover.attr('id', 'popover'); if (opts.bottom !== undefined) { popover.css('bottom', opts.bottom); } if (opts.left !== undefined) { popover.css('left', opts.left); } if (opts.right !== undefined) { popover.css('right', opts.right); } if (opts.top !== undefined) { popover.css('top', opts.top); } popover.data('target', opts.target); if (!opts.content) { switch (opts.style) { case 'table': opts.content = '<div class="table">'; for (var row_i = 0; row_i < opts.rows.length; row_i++) { opts.content += '<a href="' + opts.rows[row_i].state + '">' + '<span class="icon ' + opts.rows[row_i].icon + '"' + (opts.rows[row_i].style == 'divider' ? ' style="border-top: 1px #CCC solid"' : '') + '></span>' + '<span class="text"' + (opts.rows[row_i].style == 'divider' ? ' style="border-top: 1px #CCC solid"' : '') + '>' + opts.rows[row_i].text + '</span>' + '</a>'; } opts.content += '</div>'; break; } } popover.html(opts.content); popover.hide(); $('body').append(popover); popover.slideDown(); }, toggle: function(opts) { if ($('#popover').length) { var target = $('#popover').data('target') $('#popover').remove(); if (opts.target.attr('id') != target.attr('id')) { autocode.popover.open(opts); } } else { autocode.popover.open(opts); } } };;autocode.popup = { close: function() { $('#popup, #overlay').remove(); }, error: function(msg) { if (msg === false) { $('#popup .error').hide(); } else { $('#popup .error').text(msg).show(); } autocode.resize.all(); return false; }, open: function(opts) { autocode.popup.close(); var popup = $(document.createElement('div')); popup.attr('id', 'popup'); popup.hide(); var html = ''; if (opts.title) { html += '<div class="title"' + (opts.content ? '' : ' style="padding-bottom: 0px"') + '>' + opts.title + '</div>'; } html += '<div class="error"></div>'; if (!opts.content) { switch (opts.style) { case 'table': opts.content = '<div class="table">'; for (var row_i = 0; row_i < opts.rows.length; row_i++) { opts.content += '<a href="' + opts.rows[row_i].state + '">' + '<span class="icon' + (!opts.rows[row_i].icon.match(/^http/) ? ' ' + opts.rows[row_i].icon : '') + '" style="' + (!!opts.rows[row_i].icon.match(/^http/) ? 'background-image: url(' + opts.rows[row_i].icon + ');' : '') + (opts.rows[row_i].style == 'divider' ? 'border-top: 1px #CCC solid' : '') + '"></span>' + '<span class="text"' + (opts.rows[row_i].style == 'divider' ? ' style="border-top: 1px #CCC solid"' : '') + '>' + opts.rows[row_i].text + '</span>' + '</a>'; } opts.content += '</div>'; break; } } if (opts.content) { html += '<div class="content">' + opts.content + '</div>'; } popup.html(html); $('body').append(popup); if (opts.overlay !== false) { var overlay = $(document.createElement('div')); overlay.attr('id', 'overlay'); overlay.click(function() { autocode.popup.close(); }); overlay.hide(); $('body').append(overlay); $('#overlay').fadeIn(); } $('#popup').css('opacity', 0.01).show(); $('#popup input').first().focus().keyup(); $('#popup').animate({ opacity: 1 }); autocode.resize.all(['fuzzy', 'overlay', 'popup']); autocode.initState(); } };;autocode.query = { get: function(variable, search) { var query = search ? search : window.location.search.substring(1); var vars = query.split('&'); var data = {}; for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); if (variable && decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } }, search: function(search) { var query = search ? search : window.location.search.substring(1); var vars = query.split('&'); var data = {}; for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); data[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]); } return data; } };;autocode.resize = { all: function(resize) { if (typeof(resize) == 'string') { resize = [resize]; } var parts = [ 'body', 'content', 'config', 'exports', 'exportsInit', 'header', 'hint', 'init', 'loader', 'output', 'outputInit', 'outputsInit', 'overlay', 'popup', 'fuzzy', 'welcome' ]; var part; for (var i = 0; i < parts.length; i++) { part = parts[i]; if (resize && resize.indexOf(part) === -1) { continue; } autocode.resize[part](); } } }; $(window).resize(function() { autocode.resize.all(); });;autocode.shortcut = { init: function() { $(window).bind('keydown', function(e) { if (!e.ctrlKey || !e.shiftKey) { return; } switch (e.keyCode) { // 1 case 49: { autocode.state['overview'](); break; } // 2 case 50: { autocode.state['imports'](); break; } // 3 case 51: { autocode.state['config'](); break; } // 4 case 52: { autocode.state['output'](); break; } // n case 78: { autocode.state['project/new'](); break; } // o case 79: { autocode.state['project/load'](); break; } // s case 83: { autocode.state['project/save'](); break; } // w case 87: { autocode.state['project/close'](); break; } } autocode.resize.all(); return false; }); } };;autocode.storage = { get: function(name, default_item) { var item = localStorage.getItem(name); if (item && item.match(/^json:\/\//)) { item = JSON.parse(item.substr(7)); } return item || default_item; }, set: function(name, item) { if (typeof(item) == 'object') { item = 'json://' + JSON.stringify(item); } return localStorage.setItem(name, item); } };;autocode.string = { escape: function(str) { return str.replace(/"/g, '&quot;'); } };;autocode.unload = { callback: function() { return 'You will lose any unsaved changes'; }, disable: function() { if (location.hostname.match(/^alpha/)) { return; } $(window).unbind('beforeunload', autocode.unload.callback); }, enable: function() { if (location.hostname.match(/^alpha/)) { return; } $(window).bind('beforeunload', autocode.unload.callback); } };;autocode.url = { api: function(uri) { if (location.host.match(/^alpha/)) { return 'http://alpha.api.crystal.sh:3000/' + (uri ? uri : ''); } else { return 'https://api.crystal.sh/' + (uri ? uri : ''); } } };;;;autocode.action.editAuthorEmail = function() { autocode.popup.open({ title: 'Loading...' }); autocode.popover.close(); new formulator({ data: { email: autocode.project.author.email }, formula: 'formulas/forms/Email.json', xhr: true, ready: function(form) { autocode.popup.open({ title: 'Edit Author Email', content: form.toString() }); }, submit: function(data) { var data = {}; $('#popup input, #popup select, #popup textarea').each(function() { data[$(this).attr('name')] = $(this).val(); }); if (data.email && data.email.length) { if (!autocode.project.author) { autocode.project.author = {}; } autocode.project.author.email = data.email; } else { delete(autocode.project.author.email); } autocode.popup.close(); autocode.state['overview/author'](); return false; } }); };;autocode.action.editAuthorName = function() { autocode.popup.open({ title: 'Loading...' }); autocode.popover.close(); new formulator({ data: { name: autocode.project.author.name }, formula: 'formulas/forms/Name.json', xhr: true, ready: function(form) { autocode.popup.open({ title: 'Edit Author Name', content: form.toString() }); }, submit: function(data) { var data = {}; $('#popup input, #popup select, #popup textarea').each(function() { data[$(this).attr('name')] = $(this).val(); }); if (data.name && data.name.length) { if (!autocode.project.author) { autocode.project.author = {}; } autocode.project.author.name = data.name; } else { delete(autocode.project.author.name); } autocode.popup.close(); autocode.state['overview/author'](); return false; } }); };;autocode.action.editAuthorURL = function() { autocode.popup.open({ title: 'Loading...' }); autocode.popover.close(); new formulator({ data: { url: autocode.project.author.url }, formula: 'formulas/forms/URL.json', xhr: true, ready: function(form) { autocode.popup.open({ title: 'Edit Author URL', content: form.toString() }); }, submit: function(data) { var data = {}; $('#popup input, #popup select, #popup textarea').each(function() { data[$(this).attr('name')] = $(this).val(); }); if (data.url && data.url.length) { if (!autocode.project.author) { autocode.project.author = {}; } autocode.project.author.url = data.url; } else { delete(autocode.project.author.url); } autocode.popup.close(); autocode.state['overview/author'](); return false; } }); };;autocode.action.editDescription = function() { autocode.popup.open({ title: 'Loading...' }); autocode.popover.close(); new formulator({ data: autocode.project, formula: 'formulas/forms/Description.json', xhr: true, ready: function(form) { autocode.popup.open({ title: 'Edit Project Description', content: form.toString() }); }, submit: function(data) { var data = {}; $('#popup input, #popup select, #popup textarea').each(function() { data[$(this).attr('name')] = $(this).val(); }); if (data.description && data.description.length) { autocode.project.description = data.description; } else { delete(autocode.project.description); } autocode.popup.close(); autocode.state['overview/general'](); return false; } }); };;autocode.action.editImportName = function() { autocode.popup.open({ title: 'Loading...' }); autocode.popover.close(); new formulator({ data: { name: autocode.data.current.import }, formula: 'formulas/forms/Name.json', xhr: true, ready: function(form) { autocode.popup.open({ title: 'Edit Import Name', content: form.toString() }); }, submit: function(data) { var data = {}; $('#popup input, #popup select, #popup textarea').each(function() { data[$(this).attr('name')] = $(this).val(); }); if (data.name != autocode.data.current.import) { autocode.project.imports[data.name] = autocode.object.clone(autocode.project.imports[autocode.data.current.import]); delete(autocode.project.imports[autocode.data.current.import]); } autocode.popup.close(); autocode.state['imports']({ disableSelected: true }); autocode.state['imports/module']({ repo: data.name }); return false; } }); };;autocode.action.editImportVersion = function() { autocode.popup.open({ title: 'Loading...' }); autocode.popover.close(); new formulator({ data: { version: autocode.project.imports[autocode.data.current.import] }, formula: 'formulas/forms/Version.json', xhr: true, ready: function(form) { autocode.popup.open({ title: 'Edit Import Name', content: form.toString() }); }, submit: function(data) { var data = {}; $('#popup input, #popup select, #popup textarea').each(function() { data[$(this).attr('name')] = $(this).val(); }); if (!data.version || !data.version.length) { return autocode.popup.error('Version is required.'); } autocode.project.imports[autocode.data.current.import] = data.version; autocode.popup.close(); autocode.state['imports']({ disableSelected: true }); autocode.state['imports/module']({ repo: autocode.data.current.import }); return false; } }); };;autocode.action.editName = function() { autocode.popup.open({ title: 'Loading...' }); autocode.popover.close(); new formulator({ data: autocode.project, formula: 'formulas/forms/Name.json', xhr: true, ready: function(form) { autocode.popup.open({ title: 'Edit Project Name', content: form.toString() }); }, submit: function(data) { var data = {}; $('#popup input, #popup select, #popup textarea').each(function() { data[$(this).attr('name')] = $(this).val(); }); if (data.name && data.name.length) { autocode.project.name = data.name; } else { delete(autocode.project.name); } autocode.popup.close(); autocode.state['overview/general'](); return false; } }); };;autocode.action.editProjectCopyright = function() { autocode.popup.open({ title: 'Loading...' }); autocode.popover.close(); new formulator({ data: { copyright: autocode.project.copyright }, formula: 'formulas/forms/Copyright.json', xhr: true, ready: function(form) { autocode.popup.open({ title: 'Edit Project Copyright', content: form.toString() }); }, submit: function(data) { var data = {}; $('#popup input, #popup select, #popup textarea').each(function() { data[$(this).attr('name')] = $(this).val(); }); if (data.copyright && data.copyright.length) { autocode.project.copyright = data.copyright; } else { delete(autocode.project.copyright); } autocode.popup.close(); autocode.state['overview/general'](); return false; } }); };;autocode.action.editURL = function() { autocode.popup.open({ title: 'Loading...' }); autocode.popover.close(); new formulator({ data: autocode.project, formula: 'formulas/forms/URL.json', xhr: true, ready: function(form) { autocode.popup.open({ title: 'Edit Project URL', content: form.toString() }); }, submit: function(data) { var data = {}; $('#popup input, #popup select, #popup textarea').each(function() { data[$(this).attr('name')] = $(this).val(); }); if (data.url && data.url.length) { autocode.project.url = data.url; } else { delete(autocode.project.url); } autocode.popup.close(); autocode.state['overview/general'](); return false; } }); };;autocode.action.toggleColumn = function(id, column, opts) { opts = opts || {}; autocode.data.current.column = column; if ($(window).width() > 600) { $('#content').css({ marginLeft: '' }); } else if (opts.animated === false) { $('#content').css({ marginLeft: $(window).width() * -(column - 1) }); } else { $('#content').animate({ marginLeft: $(window).width() * -(column - 1) }); } };;autocode.action.toggleMenu = function() { var rows = []; if (autocode.data.user) { if (autocode.project) { rows.push({ text: 'Save Project (Ctrl+Shift+S)', icon: 'save-icon', state: 'project/save' }); rows.push({ text: 'Close Project', icon: 'close-icon', state: 'home' }); rows.push({ icon: 'login-icon', text: 'View on GitHub', state: 'github/repo' }); } rows.push({ text: 'New Project (Ctrl+Shift+N)', icon: 'add-icon', state: 'project/new', style: 'divider' }); rows.push({ text: 'Load Project (Ctrl+Shift+O)', icon: 'load-icon', state: 'project/load', }); } else { rows.push({ text: 'Login with GitHub', icon: 'login-icon', state: 'user/login' }); } rows.push({ text: 'Take a Tour', icon: 'tour-icon', state: 'tour', style: 'divider' }); autocode.popover.toggle({ rows: rows, left: 0, style: 'table', target: $('#menu'), top: $('#main').outerHeight() }); autocode.initState(); };;autocode.action.toggleSection = function(name, section) { if (autocode.data.current.tab == 'config') { var value = $('#config-content .CodeMirror')[0].CodeMirror.getValue(); autocode.project = jsyaml.safeLoad(value); } autocode.data.current.tab = name; autocode.data.current.subtab = section; $('.content, .tab').removeClass('selected'); $('#' + name + '-content, #' + name + '-tab').addClass('selected'); if (section) { $('.subcontent').removeClass('selected'); $('#' + name + '-' + section + '-content').addClass('selected'); $('#' + name + '-content .subtab').removeClass('selected'); $('#' + name + '-' + section + '-subtab').addClass('selected'); } };;autocode.action.toggleUser = function() { if (autocode.data.user) { autocode.popover.toggle({ rows: [ /* { icon: 'settings-icon', state: 'user/settings', text: 'Settings' }, */ { icon: 'login-icon', text: 'View on GitHub', state: 'github/user' }, { icon: 'logout-icon', state: 'user/logout', style: 'divider', text: 'Logout' } ], right: 0, style: 'table', target: $('#user'), top: $('#main').outerHeight() }); } else { autocode.state['user/login'](); } autocode.initState(); };;autocode.action.updateRecent = function() { if (!autocode.data.user) { return; } var recent_projects = autocode.storage.get('recent', []).reverse(); if (recent_projects.length) { var html = ''; for (var i = 0; i < recent_projects.length; i++) { html += '<a href="project/load/repo?name=' + recent_projects[i] + '">' + recent_projects[i] + '</a>'; } $('#welcome .recent .projects').html(html); $('#welcome .recent').show(); autocode.initState(); } else { $('#welcome .recent').hide(); } };;;autocode.api.auth = { uri: 'auth', init: function(opts) { opts.uri = autocode.api.auth.uri; return opts; }, get: function(opts) { opts = autocode.api.auth.init(opts); return autocode.api.get(opts); } };;autocode.api.config = { uri: 'config?provider=1', init: function(opts) { opts.uri = autocode.api.config.uri; return opts; }, get: function(opts) { opts = autocode.api.config.init(opts); return autocode.api.get(opts); }, post: function(opts) { opts = autocode.api.config.init(opts); return autocode.api.post(opts); } };;autocode.api.generate = { uri: 'generate', init: function(opts) { opts.uri = autocode.api.generate.uri; return opts; }, post: function(opts) { opts = autocode.api.generate.init(opts); return autocode.api.post(opts); } };;autocode.api.init = { uri: 'init', init: function(opts) { opts.uri = autocode.api.init.uri; return opts; }, post: function(opts) { opts = autocode.api.init.init(opts); return autocode.api.post(opts); } };;autocode.api.login = { uri: 'login', init: function(opts) { opts.uri = autocode.api.login.uri; return opts; }, post: function(opts) { opts = autocode.api.login.init(opts); return autocode.api.post(opts); } };;autocode.api.logout = { uri: 'logout', init: function(opts) { opts.uri = autocode.api.logout.uri; return opts; }, get: function(opts) { opts = autocode.api.logout.init(opts); return autocode.api.get(opts); } };;autocode.api.modules = { uri: 'modules', init: function(opts) { opts.uri = autocode.api.modules.uri; return opts; }, get: function(opts) { opts = autocode.api.modules.init(opts); return autocode.api.get(opts); } };;autocode.api.readme = { uri: 'readme?provider=1', init: function(opts) { opts.uri = autocode.api.readme.uri; return opts; }, get: function(opts) { opts = autocode.api.readme.init(opts); return autocode.api.get(opts); } };;autocode.api.releases = { uri: 'releases', init: function(opts) { opts.uri = autocode.api.releases.uri; return opts; }, get: function(opts) { opts = autocode.api.releases.init(opts); return autocode.api.get(opts); } };;autocode.api.repos = { uri: 'repos', init: function(opts) { opts.uri = autocode.api.repos.uri; return opts; }, get: function(opts) { opts = autocode.api.repos.init(opts); return autocode.api.get(opts); } };;autocode.api.user = { uri: 'user', init: function(opts) { opts.uri = autocode.api.user.uri; return opts; }, get: function(opts) { opts = autocode.api.user.init(opts); return autocode.api.get(opts); } };;;autocode.element.input = { html: function(opts) { var input = $(document.createElement('input')); if (opts.autocomplete === true) { input.attr('autocomplete', 'on'); } else if (opts.autocomplete === false) { input.attr('autocomplete', 'off'); } if (opts.class) { input.addClass(opts.class); } if (opts.css) { input.css(opts.css); } if (opts.event) { var e; for (var event_name in opts.event) { e = opts.event[event_name]; input.bind(event_name, e); } } if (opts.name) { input.attr('name', opts.name); } if (opts.placeholder) { input.attr('placeholder', opts.placeholder); } if (opts.value) { input.val(opts.value); } return input; } };;autocode.element.radio = { event: { click: function() { var field = $(this); var selected = $(this).hasClass('selected'); field.parent().find('button').removeClass('selected'); if (!selected) { field.addClass('selected'); field.parent().find('input[type="hidden"]').val(field.val()); } else { field.parent().find('input[type="hidden"]').val(''); } } }, html: function(opts) { var span = $(document.createElement('span')); span.addClass('radio'); var button, option_text; for (var option_value in opts.options) { option_text = opts.options[option_value]; button = $(document.createElement('button')); if ((opts.value || opts.value === false) && opts.value.toString() == option_value.toString()) { button.addClass('selected'); } if ((opts.defaultValue || opts.defaultValue === false) && opts.defaultValue.toString() == option_value.toString()) { button.addClass('default'); } button.attr('type', 'button'); button.click(autocode.element.radio.event.click); button.text(option_text); button.val(option_value); span.append(button); } var input = $(document.createElement('input')); input.attr('name', opts.name); input.attr('type', 'hidden'); input.val(opts.value || opts.value === false ? opts.value : ''); span.append(input); return span; } };;;autocode.resize.body = function() { var body = $('body'); body.css({ marginTop: $('header').outerHeight() }); };;autocode.resize.config = function() { var config = $('#config-content .CodeMirror'); config.css({ height: $(window).height() - $('header').outerHeight() }); };;autocode.resize.content = function() { if ($(window).width() > 600) { $('#content').css({ height: $(window).height() - $('header').outerHeight(), width: $(window).width() }); } else { $('#content').css({ height: $(window).height() - $('header').outerHeight(), width: $(window).width() * ($('.column:visible').length ? $('.column:visible').length : 1) }); } if ($(window).outerWidth() < 600) { $('#content .column').css({ width: $(window).width() }); $('.content-center').css({ width: $(window).width() }); $('#content .column').each(function() { $(this).css({ left: $(window).width() * $(this).index() }) }); } else { $('#content .column').css({ width: '' }); $('.content-center').each(function() { $(this).css({ width: $(window).width() - $(this).prev().visibleWidth() - $(this).next().visibleWidth() }); }); $('#content .column').each(function() { $(this).css({ left: '' }) }); } if ($(window).width() > 600) { $('.content-left, .content-center, .content-right').css({ height: $(window).height() - $('header').outerHeight() }); } else { $('.content-left, .content-center, .content-right').css({ height: '' }); } };;autocode.resize.exports = function() { var exports = $('#exports-content .CodeMirror'); exports.css({ height: $(window).height() - $('header').outerHeight() - 20 }); };;autocode.resize.exportsInit = function() { var exports_init = $('#exports-init'); exports_init.css({ left: ($(window).width() - exports_init.outerWidth()) / 2, top: ($(window).height() - exports_init.outerHeight()) / 2 }); };;autocode.resize.fuzzy = function() { var fuzzy = $('#fuzzy'); var fuzzy_target = fuzzy.data('target'); if (fuzzy.length && fuzzy_target.length) { var fuzzy_box_shadow = '0px 5px 10px #999'; var fuzzy_max_height = $(window).height() - (fuzzy_target.outerHeight() + fuzzy_target.offset().top) - 50; var fuzzy_max_top = fuzzy_target.outerHeight() + fuzzy_target.offset().top; if (fuzzy_max_height > 300) { fuzzy_max_height = 300; fuzzy.css('maxHeight', fuzzy_max_height); } else if (fuzzy_max_height < 100) { fuzzy_box_shadow = '0px -5px 10px #999'; fuzzy_max_height = 300; fuzzy.css('maxHeight', fuzzy_max_height); fuzzy_max_top = fuzzy_target.offset().top - fuzzy.outerHeight(); } fuzzy.css({ boxShadow: fuzzy_box_shadow, left: fuzzy_target.offset().left, top: fuzzy_max_top, width: fuzzy_target.outerWidth() }); } };;autocode.resize.header = function() { $('header').css('width', $(window).width()); };;autocode.resize.hint = function() { var hint = $('#hint'); var hint_arrow = $('#hint-arrow'); var hint_target = hint.data('target'); if (typeof(hint_target) == 'function') { hint_target = hint_target(); } if (!hint.length || !hint_target.length) { return; } var hint_minTop = hint.data('minTop') !== undefined ? hint.data('minTop') : ($('header').outerHeight() + 10); var hint_offsetTop = hint.data('offsetTop') || 0; var hint_text = hint.data('originalText'); var hint_width = hint.outerWidth(); var hint_left = hint_target.offset().left - ((hint.outerWidth() - hint_target.outerWidth()) / 2); if (hint_left < 10) { hint_left = 10; } else if (hint_left + hint_width > $(window).width()) { hint_left = $(window).width() - hint_width - 10; } var hint_top; if (hint.data('top')) { hint_top = hint.data('top'); } else { hint_top = hint_target.offset().top + hint_target.outerHeight() + hint_offsetTop + $(window).scrollTop() + 10; if (hint_top < hint_minTop) { hint_top = hint_minTop; if (hint.data('scrollUp')) { hint_text = hint.data('scrollUp'); } } } hint.css({ left: hint_left, top: hint_top }); hint.text(hint_text); hint_arrow.css({ left: hint_target.offset().left + (hint_target.outerWidth() - hint_arrow.outerWidth()) / 2, top: hint_top - 14 }); };;autocode.resize.init = function() { var init = $('#init'); init.css({ left: ($(window).width() - init.outerWidth()) / 2, top: ($(window).height() - init.outerHeight()) / 2 }); };;autocode.resize.loader = function() { var loader = $('#loader'); loader.css({ left: ($(window).width() - loader.outerWidth()) / 2, top: ($(window).height() - loader.outerHeight()) / 2 }); };;autocode.resize.output = function() { var output = $('#output-content .CodeMirror'); output.css({ height: $(window).height() - $('header').outerHeight() }); };;autocode.resize.outputInit = function() { var output_init = $('#output-init'); output_init.css({ left: ($(window).width() - output_init.outerWidth()) / 2, top: ($(window).height() - output_init.outerHeight()) / 2 }); };;autocode.resize.outputsInit = function() { var outputs_init = $('#outputs-init'); outputs_init.css({ left: ($(window).width() - outputs_init.outerWidth()) / 2, top: ($(window).height() - outputs_init.outerHeight()) / 2 }); };;autocode.resize.overlay = function() { var overlay = $('#overlay'); overlay.css({ height: $(window).height(), width: $(window).width() }); };;autocode.resize.popup = function() { var popup = $('#popup'); $('#popup .content').css('maxHeight', $(window).height() - 100); popup.css({ left: ($(window).width() - popup.outerWidth()) / 2, top: ($(window).height() - popup.outerHeight()) / 2 }); };;autocode.resize.welcome = function() { var welcome = $('#welcome'); if (welcome.outerHeight() > $(window).height() && welcome.outerWidth() > 600) { welcome.css({ left: ($(window).width() - welcome.outerWidth()) / 2, position: 'absolute', top: $('header').outerHeight() + 20 }); } else { welcome.css({ left: ($(window).width() - welcome.outerWidth()) / 2, position: '', top: ($(window).height() - welcome.outerHeight()) / 2 }); } };;;autocode.state['config'] = function() { autocode.popup.close(); autocode.action.toggleColumn('config-content', 1, { animated: false }); autocode.action.toggleSection('config'); var code_mirror = $('#config-content .CodeMirror'); var value = jsyaml.safeDump(autocode.project); if (!code_mirror.length) { var editor = CodeMirror.fromTextArea($('#config-content textarea')[0], { lineNumbers: true, mode: 'yaml' }); code_mirror = $('#config-content .CodeMirror') code_mirror[0].CodeMirror.setValue(value); $('.CodeMirror-scroll').scrollTop(2); } else { code_mirror[0].CodeMirror.setValue(value); } autocode.resize.all(); };;;autocode.state['exports'] = function() { if (autocode.project.exports) { $('#exports-content-container .table a').slice(1).remove(); var exported; for (var export_name in autocode.project.exports) { exported = autocode.project.exports[export_name]; $('#exports-content-container .table').append( '<a class="file" href="exports/export?export=' + export_name + '">' + '<span class="icon ' + exported.type + '-icon"></span>' + '<span class="info">' + '<span class="name">' + export_name + '</span>' + '<span class="generator">' + exported.type + '</span>' + '</span>' + '</a>' ); } autocode.initState() $('#exports-init').hide(); $('#exports-content-container').show(); $('#exports-content-container .table a').eq(1).click(); } else { $('#exports-init').show(); $('#exports-content-container').hide(); } autocode.action.toggleSection('exports'); };;;autocode.state['exports/export'] = function(opts) { var exported = autocode.project.exports[opts.export]; $('#exports-content input[name="name"]').val(opts.export); $('#exports-content input[name="description"]').val(exported.description); $('#exports-content input[name="type"]').val(exported.type); var mode = 'yaml'; var value; if (exported.type == 'generator') { mode = exported.format || 'text'; $('#exports-content input[name="engine"]').val(exported.engine); $('#exports-content input[name="filename"]').val(exported.filename); $('#exports-content input[name="schema"]').val(exported.schema); $('#exports-content input[name="format"]').val(mode); $('#exports-content .engine-field, #exports-content .filename-field, #exports-content .format-field, #exports-content .schema-field').show(); value = exported.template; } else { $('#exports-content input[name="engine"]').val(''); $('#exports-content input[name="filename"]').val(''); $('#exports-content input[name="schema"]').val(''); $('#exports-content .engine-field, #exports-content .filename-field, #exports-content .format-field, #exports-content .schema-field').hide(); value = jsyaml.safeDump(exported.schema); } var code_mirror = $('#exports-content .CodeMirror'); if (!code_mirror.length) { var editor = CodeMirror.fromTextArea($('#exports-content textarea')[0], { lineNumbers: true, mode: mode }); code_mirror = $('#exports-content .CodeMirror'); code_mirror[0].CodeMirror.setValue(value); $('.CodeMirror-scroll').scrollTop(2); } else { code_mirror[0].CodeMirror.setOption('mode', mode); code_mirror[0].CodeMirror.setValue(value); } $('#exports-content form .button').attr('href', 'exports/export/save?export=' + opts.export); };;autocode.state['exports/export/save'] = function(opts) { if ($('#exports-content input[name="name"]').val() != opts.export) { var export_name = $('#exports-content input[name="name"]').val(); autocode.project.exports[export_name] = JSON.parse(JSON.stringify(autocode.project.exports[opts.export])); delete(autocode.project.exports[opts.export]); } else { var export_name = opts.export; } //autocode.project.exports[opts.export].filename = $('#exports-content input[name="filename"]').val(); autocode.project.exports[export_name].description = $('#exports-content input[name="description"]').val(); autocode.project.exports[export_name].type = $('#exports-content input[name="type"]').val(); if (autocode.project.exports[export_name].type == 'generator' && $('#exports-content input[name="filename"]').val().length) { autocode.project.exports[export_name].filename = $('#exports-content input[name="filename"]').val(); } else { delete(autocode.project.exports[export_name].filename); } autocode.state['project/save'](); };;;autocode.state['github/repo'] = function() { autocode.popover.close(); window.open('https://github.com/' + autocode.repo); };;autocode.state['github/user'] = function() { autocode.popover.close(); window.open('https://github.com/' + autocode.data.user.username); };;;autocode.state['home'] = function() { autocode.popover.close(); if (autocode.data.originalConfig != jsyaml.safeDump(autocode.project)) { autocode.popup.open({ title: 'Close Project', content: '<div style="padding-bottom: 15px">Are you sure you want to close this project? <b>You will lose all unsaved changes.</b></div>' + '<a class="button" href="popup/close">No, Keep It Open</a> <a class="button secondary" href="home/submit">Yes, Close Project</a> <a class="button secondary" href="project/diff">View Unsaved Changes</a>' }); return; } autocode.state['home/submit'](); };;autocode.state['home/submit'] = function() { autocode.unload.disable(); autocode.data.current = {}; delete(autocode.project); autocode.popup.close(); $('.app, #init').fadeOut(function() { $('#menu .text').text('Menu'); $('#welcome').fadeIn(); }); };;;autocode.state['imports'] = function(opts) { opts = opts || {}; autocode.popup.close(); autocode.action.toggleColumn('imports-content', 1, { animated: autocode.data.current.tab == 'imports' ? true : false }); autocode.action.toggleSection('imports'); $('#imports-content-container .table a').remove(); var import_index = 0, import_version; for (var import_name in autocode.object.sort(autocode.project.imports)) { import_version = autocode.project.imports[import_name]; $('#imports-content-container .table').append( '<a class="file' + (autocode.data.current.import == import_name ? ' selected' : '') + '" href="imports/module?repo=' + import_name + '&index=' + import_index + '">' + '<span class="image"><span class="icon" style="background-image: url(https://cdn.rawgit.com/' + import_name + '/master/.autocode/icon.svg)"></span></span>' + '<span class="info">' + '<span class="name">' + import_name + '</span>' + '<span class="generator">' + import_version + '</span>' + '</span>' + '</a>' ); import_index++; } autocode.initState(); if (autocode.project.imports) { $('#imports-content-container .cont