index.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /*-----------------------------------------------------------------------------
  2. | Copyright (c) Jupyter Development Team.
  3. | Distributed under the terms of the Modified BSD License.
  4. |----------------------------------------------------------------------------*/
  5. require('es6-promise/auto'); // polyfill Promise on IE
  6. var PageConfig = require('@jupyterlab/coreutils').PageConfig;
  7. require('font-awesome/css/font-awesome.min.css');
  8. /**
  9. * The main entry point for the application.
  10. */
  11. function main() {
  12. var app = require('@jupyterlab/application').JupyterLab;
  13. // Get the disabled extensions.
  14. var disabled = { patterns: [], matches: [] };
  15. var disabledExtensions = [];
  16. try {
  17. var tempDisabled = PageConfig.getOption('disabledExtensions');
  18. if (tempDisabled) {
  19. disabledExtensions = JSON.parse(tempDisabled).map(function(pattern) {
  20. disabled.patterns.push(pattern);
  21. return { raw: pattern, rule: new RegExp(pattern) };
  22. });
  23. }
  24. } catch (error) {
  25. console.warn('Unable to parse disabled extensions.', error);
  26. }
  27. // Get the deferred extensions.
  28. var deferred = { patterns: [], matches: [] };
  29. var deferredExtensions = [];
  30. var ignorePlugins = [];
  31. try {
  32. var tempDeferred = PageConfig.getOption('deferredExtensions');
  33. if (tempDeferred) {
  34. deferredExtensions = JSON.parse(tempDeferred).map(function(pattern) {
  35. deferred.patterns.push(pattern);
  36. return { raw: pattern, rule: new RegExp(pattern) };
  37. });
  38. }
  39. } catch (error) {
  40. console.warn('Unable to parse deferred extensions.', error);
  41. }
  42. function isDeferred(value) {
  43. return deferredExtensions.some(function(pattern) {
  44. return pattern.raw === value || pattern.rule.test(value);
  45. });
  46. }
  47. function isDisabled(value) {
  48. return disabledExtensions.some(function(pattern) {
  49. return pattern.raw === value || pattern.rule.test(value);
  50. });
  51. }
  52. var version = PageConfig.getOption('appVersion') || 'unknown';
  53. var name = PageConfig.getOption('appName') || 'JupyterLab';
  54. var namespace = PageConfig.getOption('appNamespace') || 'jupyterlab';
  55. var devMode = PageConfig.getOption('devMode') || 'false';
  56. // Get the lab config data.
  57. var urls = Object.create(null);
  58. [
  59. 'pageUrl', 'publicUrl', 'settingsUrl', 'userSettingsUrl', 'themesUrl'
  60. ].forEach(function (key) {
  61. urls[key.replace('Url', '')] = PageConfig.getOption(key);
  62. });
  63. var directories = Object.create(null);
  64. [
  65. 'appSettingsDir', 'templatesDir', 'staticDir', 'schemasDir', 'themesDir'
  66. ].forEach(function (key) {
  67. directories[key.replace('Dir', '')] = PageConfig.getOption(key);
  68. });
  69. directories['serverRoot'] = PageConfig.getOption('serverRoot');
  70. var register = [];
  71. if (version[0] === 'v') {
  72. version = version.slice(1);
  73. }
  74. // Handle the registered mime extensions.
  75. var mimeExtensions = [];
  76. // eslint-disable-next-line semi
  77. {{#each jupyterlab_mime_extensions}}
  78. try {
  79. if (isDeferred('{{key}}')) {
  80. deferred.matches.push('{{key}}');
  81. ignorePlugins.push('{{key}}');
  82. }
  83. if (isDisabled('{{@key}}')) {
  84. disabled.matches.push('{{@key}}');
  85. } else {
  86. var module = require('{{@key}}/{{this}}');
  87. var extension = module.default;
  88. // Handle CommonJS exports.
  89. if (!module.hasOwnProperty('__esModule')) {
  90. extension = module;
  91. }
  92. if (Array.isArray(extension)) {
  93. extension.forEach(function(plugin) {
  94. if (isDeferred(plugin.id)) {
  95. deferred.matches.push(plugin.id);
  96. ignorePlugins.push(plugin.id);
  97. }
  98. if (isDisabled(plugin.id)) {
  99. disabled.matches.push(plugin.id);
  100. return;
  101. }
  102. mimeExtensions.push(plugin);
  103. });
  104. } else {
  105. mimeExtensions.push(extension);
  106. }
  107. }
  108. } catch (e) {
  109. console.error(e);
  110. }
  111. // eslint-disable-next-line semi
  112. {{/each}}
  113. // Handled the registered standard extensions.
  114. // eslint-disable-next-line semi
  115. {{#each jupyterlab_extensions}}
  116. try {
  117. if (isDeferred('{{key}}')) {
  118. deferred.matches.push('{{key}}');
  119. ignorePlugins.push('{{key}}');
  120. }
  121. if (isDisabled('{{@key}}')) {
  122. disabled.matches.push('{{@key}}');
  123. } else {
  124. module = require('{{@key}}/{{this}}');
  125. extension = module.default;
  126. // Handle CommonJS exports.
  127. if (!module.hasOwnProperty('__esModule')) {
  128. extension = module;
  129. }
  130. if (Array.isArray(extension)) {
  131. extension.forEach(function(plugin) {
  132. if (isDeferred(plugin.id)) {
  133. deferred.matches.push(plugin.id);
  134. ignorePlugins.push(plugin.id);
  135. }
  136. if (isDisabled(plugin.id)) {
  137. disabled.matches.push(plugin.id);
  138. return;
  139. }
  140. register.push(plugin);
  141. });
  142. } else {
  143. register.push(extension);
  144. }
  145. }
  146. } catch (e) {
  147. console.error(e);
  148. }
  149. // eslint-disable-next-line semi
  150. {{/each}}
  151. var lab = new app({
  152. name: name,
  153. namespace: namespace,
  154. version: version,
  155. devMode: devMode.toLowerCase() === 'true',
  156. mimeExtensions: mimeExtensions,
  157. disabled: disabled,
  158. deferred: deferred,
  159. urls: urls,
  160. directories: directories,
  161. filesCached: PageConfig.getOption('cacheFiles').toLowerCase() == true
  162. });
  163. register.forEach(function(item) { lab.registerPluginModule(item); });
  164. lab.start({ ignorePlugins: ignorePlugins });
  165. // Handle a selenium test.
  166. var seleniumTest = PageConfig.getOption('seleniumTest');
  167. if (seleniumTest.toLowerCase() === 'true') {
  168. var caught_errors = [];
  169. window.onerror = function(msg, url, line, col, error) {
  170. caught_errors.push(String(error));
  171. };
  172. console.error = function(message) {
  173. caught_errors.push(String(message));
  174. };
  175. lab.restored.then(function() {
  176. var el = document.createElement('div');
  177. el.id = 'seleniumResult';
  178. el.textContent = JSON.stringify(caught_errors);
  179. document.body.appendChild(el);
  180. });
  181. }
  182. }
  183. window.addEventListener('load', main);