index.js 6.1 KB

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