diff --git a/lib/discourse_js_processor.rb b/lib/discourse_js_processor.rb index 274fda206d9..f5227cdcfb3 100644 --- a/lib/discourse_js_processor.rb +++ b/lib/discourse_js_processor.rb @@ -95,7 +95,7 @@ class DiscourseJsProcessor JS source = File.read("#{Rails.root}/lib/javascripts/widget-hbs-compiler.js") js_source = ::JSON.generate(source, quirks_mode: true) - js = ctx.eval("Babel.transform(#{js_source}, { ast: false, plugins: ['check-es2015-constants', 'transform-es2015-arrow-functions', 'transform-es2015-block-scoped-functions', 'transform-es2015-block-scoping', 'transform-es2015-classes', 'transform-es2015-computed-properties', 'transform-es2015-destructuring', 'transform-es2015-duplicate-keys', 'transform-es2015-for-of', 'transform-es2015-function-name', 'transform-es2015-literals', 'transform-es2015-object-super', 'transform-es2015-parameters', 'transform-es2015-shorthand-properties', 'transform-es2015-spread', 'transform-es2015-sticky-regex', 'transform-es2015-template-literals', 'transform-es2015-typeof-symbol', 'transform-es2015-unicode-regex'] }).code") + js = ctx.eval("Babel.transform(#{js_source}, { ast: false, plugins: ['transform-arrow-functions', 'transform-block-scoped-functions', 'transform-block-scoping', 'transform-computed-properties', 'transform-destructuring', 'transform-duplicate-keys', 'transform-for-of', 'transform-function-name', 'transform-literals', 'transform-object-super', 'transform-parameters', 'transform-shorthand-properties', 'transform-spread', 'transform-sticky-regex', 'transform-template-literals', 'transform-typeof-symbol', 'transform-unicode-regex'] }).code") ctx.eval(js) ctx @@ -142,9 +142,9 @@ JS if opts[:module_name] && !@skip_module filename = opts[:filename] || 'unknown' - "Babel.transform(#{js_source}, { moduleId: '#{opts[:module_name]}', filename: '#{filename}', ast: false, presets: ['es2015'], plugins: [['transform-es2015-modules-amd', {noInterop: true}], 'transform-decorators-legacy', exports.WidgetHbsCompiler] }).code" + "Babel.transform(#{js_source}, { moduleId: '#{opts[:module_name]}', filename: '#{filename}', ast: false, presets: ['es2015'], plugins: [['transform-modules-amd', {noInterop: true}], ['proposal-decorators', {legacy: true} ], exports.WidgetHbsCompiler] }).code" else - "Babel.transform(#{js_source}, { ast: false, plugins: ['check-es2015-constants', 'transform-es2015-arrow-functions', 'transform-es2015-block-scoped-functions', 'transform-es2015-block-scoping', 'transform-es2015-classes', 'transform-es2015-computed-properties', 'transform-es2015-destructuring', 'transform-es2015-duplicate-keys', 'transform-es2015-for-of', 'transform-es2015-function-name', 'transform-es2015-literals', 'transform-es2015-object-super', 'transform-es2015-parameters', 'transform-es2015-shorthand-properties', 'transform-es2015-spread', 'transform-es2015-sticky-regex', 'transform-es2015-template-literals', 'transform-es2015-typeof-symbol', 'transform-es2015-unicode-regex', 'transform-regenerator', 'transform-decorators-legacy', exports.WidgetHbsCompiler] }).code" + "Babel.transform(#{js_source}, { ast: false, plugins: ['proposal-json-strings', 'proposal-nullish-coalescing-operator', 'proposal-logical-assignment-operators', 'proposal-numeric-separator', 'proposal-optional-catch-binding', 'transform-dotall-regex', 'proposal-unicode-property-regex', 'transform-named-capturing-groups-regex', 'proposal-object-rest-spread', 'proposal-optional-chaining', 'transform-arrow-functions', 'transform-block-scoped-functions', 'transform-block-scoping', 'transform-computed-properties', 'transform-destructuring', 'transform-duplicate-keys', 'transform-for-of', 'transform-function-name', 'transform-literals', 'transform-object-super', 'transform-parameters', 'transform-shorthand-properties', 'transform-spread', 'transform-sticky-regex', 'transform-template-literals', 'transform-typeof-symbol', 'transform-unicode-regex', ['proposal-decorators', {legacy: true}], exports.WidgetHbsCompiler] }).code" end end diff --git a/spec/models/theme_field_spec.rb b/spec/models/theme_field_spec.rb index fcc91536f4b..7ba362a79eb 100644 --- a/spec/models/theme_field_spec.rb +++ b/spec/models/theme_field_spec.rb @@ -186,14 +186,17 @@ HTML theme.save! expected_js = <<~JS - define("discourse/controllers/discovery", ["discourse/lib/ajax"], function () { + define("discourse/controllers/discovery", ["discourse/lib/ajax"], function (_ajax) { "use strict"; var __theme_name__ = "#{theme.name}"; + var settings = Discourse.__container__.lookup("service:theme-settings").getObjectForTheme(#{theme.id}); + var themePrefix = function themePrefix(key) { - return "theme_translations.#{theme.id}." + key; + return "theme_translations.#{theme.id}.".concat(key); }; + console.log('hello from .js.es6'); }); JS diff --git a/spec/models/theme_spec.rb b/spec/models/theme_spec.rb index f32dc33760d..3e78b15f8ad 100644 --- a/spec/models/theme_spec.rb +++ b/spec/models/theme_spec.rb @@ -292,7 +292,7 @@ HTML expect(javascript_cache.content).to include("_registerPluginCode('0.1'") end - it "converts errors to a script type that is not evaluated" do + it "wraps constants calls in a readOnlyError function" do html = < const x = 1; @@ -302,8 +302,8 @@ HTML baked, javascript_cache = transpile(html) expect(baked).to include(javascript_cache.url) - expect(javascript_cache.content).to include('Theme Transpilation Error') - expect(javascript_cache.content).to include('read-only') + expect(javascript_cache.content).to include('var x = 1;') + expect(javascript_cache.content).to include('x = (_readOnlyError("x"), 2);') end end @@ -380,16 +380,21 @@ HTML (function () { if ('Discourse' in window && typeof Discourse._registerPluginCode === 'function') { var __theme_name__ = "awesome theme\\\""; + var settings = Discourse.__container__.lookup("service:theme-settings").getObjectForTheme(#{theme.id}); + var themePrefix = function themePrefix(key) { - return 'theme_translations.#{theme.id}.' + key; + return "theme_translations.#{theme.id}.".concat(key); }; Discourse._registerPluginCode('1.0', function (api) { try { - alert(settings.name);var a = function a() {}; + alert(settings.name); + + var a = function a() {}; } catch (err) { var rescue = require("discourse/lib/utilities").rescueThemeError; + rescue(__theme_name__, err, api); } }); @@ -416,16 +421,21 @@ HTML (function () { if ('Discourse' in window && typeof Discourse._registerPluginCode === 'function') { var __theme_name__ = "awesome theme\\\""; + var settings = Discourse.__container__.lookup("service:theme-settings").getObjectForTheme(#{theme.id}); + var themePrefix = function themePrefix(key) { - return 'theme_translations.#{theme.id}.' + key; + return "theme_translations.#{theme.id}.".concat(key); }; Discourse._registerPluginCode('1.0', function (api) { try { - alert(settings.name);var a = function a() {}; + alert(settings.name); + + var a = function a() {}; } catch (err) { var rescue = require("discourse/lib/utilities").rescueThemeError; + rescue(__theme_name__, err, api); } }); diff --git a/vendor/assets/javascripts/babel.js b/vendor/assets/javascripts/babel.js index 432a676c1fa..2ca5ba74f77 100644 --- a/vendor/assets/javascripts/babel.js +++ b/vendor/assets/javascripts/babel.js @@ -1,63025 +1,2 @@ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else if(typeof exports === 'object') - exports["Babel"] = factory(); - else - root["Babel"] = factory(); -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; - -/******/ // The require function -/******/ function __webpack_require__(moduleId) { - -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; - -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; - -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); - -/******/ // Flag the module as loaded -/******/ module.loaded = true; - -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } - - -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; - -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; - -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; - -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ((function(modules) { - // Check all modules for deduplicated modules - for(var i in modules) { - if(Object.prototype.hasOwnProperty.call(modules, i)) { - switch(typeof modules[i]) { - case "function": break; - case "object": - // Module can be created from a template - modules[i] = (function(_m) { - var args = _m.slice(1), fn = modules[_m[0]]; - return function (a,b,c) { - fn.apply(this, [a,b,c].concat(args)); - }; - }(modules[i])); - break; - default: - // Module is a copy of another module - modules[i] = modules[modules[i]]; - break; - } - } - } - return modules; -}([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.version = exports.buildExternalHelpers = exports.availablePresets = exports.availablePlugins = undefined; - - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - - var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - - exports.transform = transform; - exports.transformFromAst = transformFromAst; - exports.registerPlugin = registerPlugin; - exports.registerPlugins = registerPlugins; - exports.registerPreset = registerPreset; - exports.registerPresets = registerPresets; - exports.transformScriptTags = transformScriptTags; - exports.disableScriptTags = disableScriptTags; - - var _babelCore = __webpack_require__(295); - - var Babel = _interopRequireWildcard(_babelCore); - - var _transformScriptTags = __webpack_require__(640); - - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - - var isArray = Array.isArray || function (arg) { - return Object.prototype.toString.call(arg) === '[object Array]'; - }; - - /** - * Loads the given name (or [name, options] pair) from the given table object - * holding the available presets or plugins. - * - * Returns undefined if the preset or plugin is not available; passes through - * name unmodified if it (or the first element of the pair) is not a string. - */ - function loadBuiltin(builtinTable, name) { - if (isArray(name) && typeof name[0] === 'string') { - if (builtinTable.hasOwnProperty(name[0])) { - return [builtinTable[name[0]]].concat(name.slice(1)); - } - return; - } else if (typeof name === 'string') { - return builtinTable[name]; - } - // Could be an actual preset/plugin module - return name; - } - - /** - * Parses plugin names and presets from the specified options. - */ - function processOptions(options) { - // Parse preset names - var presets = (options.presets || []).map(function (presetName) { - var preset = loadBuiltin(availablePresets, presetName); - - if (preset) { - // workaround for babel issue - // at some point, babel copies the preset, losing the non-enumerable - // buildPreset key; convert it into an enumerable key. - if (isArray(preset) && _typeof(preset[0]) === 'object' && preset[0].hasOwnProperty('buildPreset')) { - preset[0] = _extends({}, preset[0], { buildPreset: preset[0].buildPreset }); - } - } else { - throw new Error('Invalid preset specified in Babel options: "' + presetName + '"'); - } - return preset; - }); - - // Parse plugin names - var plugins = (options.plugins || []).map(function (pluginName) { - var plugin = loadBuiltin(availablePlugins, pluginName); - - if (!plugin) { - throw new Error('Invalid plugin specified in Babel options: "' + pluginName + '"'); - } - return plugin; - }); - - return _extends({ - babelrc: false - }, options, { - presets: presets, - plugins: plugins - }); - } - - function transform(code, options) { - return Babel.transform(code, processOptions(options)); - } - - function transformFromAst(ast, code, options) { - return Babel.transformFromAst(ast, code, processOptions(options)); - } - var availablePlugins = exports.availablePlugins = {}; - var availablePresets = exports.availablePresets = {}; - var buildExternalHelpers = exports.buildExternalHelpers = Babel.buildExternalHelpers; - /** - * Registers a named plugin for use with Babel. - */ - function registerPlugin(name, plugin) { - if (availablePlugins.hasOwnProperty(name)) { - console.warn('A plugin named "' + name + '" is already registered, it will be overridden'); - } - availablePlugins[name] = plugin; - } - /** - * Registers multiple plugins for use with Babel. `newPlugins` should be an object where the key - * is the name of the plugin, and the value is the plugin itself. - */ - function registerPlugins(newPlugins) { - Object.keys(newPlugins).forEach(function (name) { - return registerPlugin(name, newPlugins[name]); - }); - } - - /** - * Registers a named preset for use with Babel. - */ - function registerPreset(name, preset) { - if (availablePresets.hasOwnProperty(name)) { - console.warn('A preset named "' + name + '" is already registered, it will be overridden'); - } - availablePresets[name] = preset; - } - /** - * Registers multiple presets for use with Babel. `newPresets` should be an object where the key - * is the name of the preset, and the value is the preset itself. - */ - function registerPresets(newPresets) { - Object.keys(newPresets).forEach(function (name) { - return registerPreset(name, newPresets[name]); - }); - } - - // All the plugins we should bundle - registerPlugins({ - 'check-es2015-constants': __webpack_require__(70), - 'external-helpers': __webpack_require__(327), - 'inline-replace-variables': __webpack_require__(328), - 'syntax-async-functions': __webpack_require__(71), - 'syntax-async-generators': __webpack_require__(199), - 'syntax-class-constructor-call': __webpack_require__(200), - 'syntax-class-properties': __webpack_require__(201), - 'syntax-decorators': __webpack_require__(130), - 'syntax-do-expressions': __webpack_require__(202), - 'syntax-exponentiation-operator': __webpack_require__(203), - 'syntax-export-extensions': __webpack_require__(204), - 'syntax-flow': __webpack_require__(131), - 'syntax-function-bind': __webpack_require__(205), - 'syntax-function-sent': __webpack_require__(330), - 'syntax-jsx': __webpack_require__(132), - 'syntax-object-rest-spread': __webpack_require__(206), - 'syntax-trailing-function-commas': __webpack_require__(133), - 'transform-async-functions': __webpack_require__(331), - 'transform-async-to-generator': __webpack_require__(134), - 'transform-async-to-module-method': __webpack_require__(333), - 'transform-class-constructor-call': __webpack_require__(207), - 'transform-class-properties': __webpack_require__(208), - 'transform-decorators': __webpack_require__(209), - 'transform-decorators-legacy': __webpack_require__(334).default, // <- No clue. Nope. - 'transform-do-expressions': __webpack_require__(210), - 'transform-es2015-arrow-functions': __webpack_require__(72), - 'transform-es2015-block-scoped-functions': __webpack_require__(73), - 'transform-es2015-block-scoping': __webpack_require__(74), - 'transform-es2015-classes': __webpack_require__(75), - 'transform-es2015-computed-properties': __webpack_require__(76), - 'transform-es2015-destructuring': __webpack_require__(77), - 'transform-es2015-duplicate-keys': __webpack_require__(135), - 'transform-es2015-for-of': __webpack_require__(78), - 'transform-es2015-function-name': __webpack_require__(79), - 'transform-es2015-instanceof': __webpack_require__(337), - 'transform-es2015-literals': __webpack_require__(80), - 'transform-es2015-modules-amd': __webpack_require__(136), - 'transform-es2015-modules-commonjs': __webpack_require__(212), - 'transform-es2015-modules-systemjs': __webpack_require__(213), - 'transform-es2015-modules-umd': __webpack_require__(214), - 'transform-es2015-object-super': __webpack_require__(81), - 'transform-es2015-parameters': __webpack_require__(82), - 'transform-es2015-shorthand-properties': __webpack_require__(83), - 'transform-es2015-spread': __webpack_require__(84), - 'transform-es2015-sticky-regex': __webpack_require__(85), - 'transform-es2015-template-literals': __webpack_require__(86), - 'transform-es2015-typeof-symbol': __webpack_require__(87), - 'transform-es2015-unicode-regex': __webpack_require__(88), - 'transform-es3-member-expression-literals': __webpack_require__(342), - 'transform-es3-property-literals': __webpack_require__(343), - 'transform-es5-property-mutators': __webpack_require__(344), - 'transform-eval': __webpack_require__(345), - 'transform-exponentiation-operator': __webpack_require__(137), - 'transform-export-extensions': __webpack_require__(215), - 'transform-flow-comments': __webpack_require__(346), - 'transform-flow-strip-types': __webpack_require__(216), - 'transform-function-bind': __webpack_require__(217), - 'transform-jscript': __webpack_require__(347), - 'transform-object-assign': __webpack_require__(348), - 'transform-object-rest-spread': __webpack_require__(218), - 'transform-object-set-prototype-of-to-assign': __webpack_require__(349), - 'transform-proto-to-assign': __webpack_require__(350), - 'transform-react-constant-elements': __webpack_require__(351), - 'transform-react-display-name': __webpack_require__(219), - 'transform-react-inline-elements': __webpack_require__(352), - 'transform-react-jsx': __webpack_require__(220), - 'transform-react-jsx-compat': __webpack_require__(353), - 'transform-react-jsx-self': __webpack_require__(355), - 'transform-react-jsx-source': __webpack_require__(356), - 'transform-regenerator': __webpack_require__(89), - 'transform-runtime': __webpack_require__(359), - 'transform-strict-mode': __webpack_require__(90), - 'undeclared-variables-check': __webpack_require__(360) - }); - - // All the presets we should bundle - registerPresets({ - es2015: __webpack_require__(221), - es2016: __webpack_require__(222), - es2017: __webpack_require__(223), - latest: __webpack_require__(363), - react: __webpack_require__(364), - 'stage-0': __webpack_require__(365), - 'stage-1': __webpack_require__(224), - 'stage-2': __webpack_require__(225), - 'stage-3': __webpack_require__(226), - - // ES2015 preset with es2015-modules-commonjs removed - // Plugin list copied from babel-preset-es2015/index.js - 'es2015-no-commonjs': { - plugins: [__webpack_require__(86), __webpack_require__(80), __webpack_require__(79), __webpack_require__(72), __webpack_require__(73), __webpack_require__(75), __webpack_require__(81), __webpack_require__(83), __webpack_require__(76), __webpack_require__(78), __webpack_require__(85), __webpack_require__(88), __webpack_require__(70), __webpack_require__(84), __webpack_require__(82), __webpack_require__(77), __webpack_require__(74), __webpack_require__(87), [__webpack_require__(89), { async: false, asyncGenerators: false }]] - }, - - // ES2015 preset with plugins set to loose mode. - // Based off https://github.com/bkonkle/babel-preset-es2015-loose/blob/master/index.js - 'es2015-loose': { - plugins: [[__webpack_require__(86), { loose: true }], __webpack_require__(80), __webpack_require__(79), __webpack_require__(72), __webpack_require__(73), [__webpack_require__(75), { loose: true }], __webpack_require__(81), __webpack_require__(83), __webpack_require__(135), [__webpack_require__(76), { loose: true }], [__webpack_require__(78), { loose: true }], __webpack_require__(85), __webpack_require__(88), __webpack_require__(70), [__webpack_require__(84), { loose: true }], __webpack_require__(82), [__webpack_require__(77), { loose: true }], __webpack_require__(74), __webpack_require__(87), [__webpack_require__(212), { loose: true }], [__webpack_require__(89), { async: false, asyncGenerators: false }]] - } - }); - - var version = exports.version = ("6.26.0"); - - // Listen for load event if we're in a browser and then kick off finding and - // running of scripts with "text/babel" type. - if (typeof window !== 'undefined' && window && window.addEventListener) { - window.addEventListener('DOMContentLoaded', function () { - return transformScriptTags(); - }, false); - } - - /** - * Transform