diff --git a/.eslintignore b/.eslintignore index 5d171a3075d7..462c8d4c0a34 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,5 @@ core/templates/dev/head/expressions/ExpressionParserService.js +core/templates/dev/head/google-analytics.initializer.ts backend_prod_files/* core/tests/protractor.conf.js extensions/interactions/LogicProof/static/js/generatedDefaultData.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a374b989dc86..22aa5095be5b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -333,7 +333,7 @@ /main.py @nithusha21 @DubeySandeep /feconf.py @seanlip @nithusha21 /constants*.py @seanlip @nithusha21 -/assets/constants.js @seanlip @nithusha21 +/assets/constants.ts @seanlip @nithusha21 /core/controllers/incoming_emails*.py @aks681 /core/controllers/tasks*.py @aks681 /core/domain/email*.py @aks681 @@ -393,7 +393,7 @@ /core/domain/rte_component_registry*.py @vojtechjelinek /extensions/ckeditor_plugins/ @vojtechjelinek /extensions/rich_text_components/ @vojtechjelinek -/assets/rich_text_components_definitions.js @vojtechjelinek +/assets/rich_text_components_definitions.ts @vojtechjelinek # Suggestion and feedback team. @@ -433,6 +433,7 @@ # Speed Improvement team. /app_dev.yaml @vojtechjelinek +/core/templates/dev/head/google-analytics.initializer.ts @vojtechjelinek /core/templates/dev/head/base_components/ @jamesjay4199 @vojtechjelinek /core/templates/dev/head/pages/Base.ts @vojtechjelinek /core/templates/dev/head/pages/base.html @vojtechjelinek @@ -444,7 +445,7 @@ /core/templates/dev/head/services/CsrfTokenService*.ts @jamesjay4199 @vojtechjelinek /gulpfile.js @vojtechjelinek /jinja_utils*.py @vojtechjelinek -/webpack.config.ts @vojtechjelinek +/webpack.common.config.ts @vojtechjelinek /webpack.dev.config.ts @vojtechjelinek /webpack.prod.config.ts @vojtechjelinek diff --git a/.gitignore b/.gitignore index 875fe6cf6ab9..d1d6a5a36f5d 100644 --- a/.gitignore +++ b/.gitignore @@ -7,12 +7,12 @@ gae_runtime/* # ignore the files and dirs inside the .git dir. .git/* third_party/* -assets/hashes.js +assets/hashes.json backend_prod_files/* local_compiled_js/* local_compiled_js_for_test/* core/templates/prod/* -core/templates/dev/head/dist/* +webpack_bundles/* core/tests/.browserstack.env node_modules/* .coverage* diff --git a/app_dev.yaml b/app_dev.yaml index 9f30ebe65be3..f60a1b05734c 100644 --- a/app_dev.yaml +++ b/app_dev.yaml @@ -43,8 +43,8 @@ handlers: expiration: "90d" # DEVELOPMENT STATIC -- url: /dist - static_dir: core/templates/dev/head/dist +- url: /webpack_bundles + static_dir: webpack_bundles secure: always application_readable: true expiration: "0" @@ -140,8 +140,8 @@ handlers: # STATIC PAGES. - url: /about - static_files: core/templates/dev/head/dist/about-page.mainpage.html - upload: core/templates/dev/head/dist/about-page.mainpage.html + static_files: webpack_bundles/about-page.mainpage.html + upload: webpack_bundles/about-page.mainpage.html http_headers: Pragma: no-cache Strict-Transport-Security: "max-age=31536000; includeSubDomains" @@ -151,8 +151,8 @@ handlers: secure: always expiration: "0" - url: /contact - static_files: core/templates/dev/head/dist/contact-page.mainpage.html - upload: core/templates/dev/head/dist/contact-page.mainpage.html + static_files: webpack_bundles/contact-page.mainpage.html + upload: webpack_bundles/contact-page.mainpage.html http_headers: Pragma: no-cache Strict-Transport-Security: "max-age=31536000; includeSubDomains" @@ -162,8 +162,8 @@ handlers: secure: always expiration: "0" - url: /donate - static_files: core/templates/dev/head/dist/donate-page.mainpage.html - upload: core/templates/dev/head/dist/donate-page.mainpage.html + static_files: webpack_bundles/donate-page.mainpage.html + upload: webpack_bundles/donate-page.mainpage.html http_headers: Pragma: no-cache Strict-Transport-Security: "max-age=31536000; includeSubDomains" @@ -173,8 +173,8 @@ handlers: secure: always expiration: "0" - url: /get_started - static_files: core/templates/dev/head/dist/get-started-page.mainpage.html - upload: core/templates/dev/head/dist/get-started-page.mainpage.html + static_files: webpack_bundles/get-started-page.mainpage.html + upload: webpack_bundles/get-started-page.mainpage.html http_headers: Pragma: no-cache Strict-Transport-Security: "max-age=31536000; includeSubDomains" @@ -184,8 +184,8 @@ handlers: secure: always expiration: "0" - url: /privacy - static_files: core/templates/dev/head/dist/privacy-page.mainpage.html - upload: core/templates/dev/head/dist/privacy-page.mainpage.html + static_files: webpack_bundles/privacy-page.mainpage.html + upload: webpack_bundles/privacy-page.mainpage.html http_headers: Pragma: no-cache Strict-Transport-Security: "max-age=31536000; includeSubDomains" @@ -195,8 +195,8 @@ handlers: secure: always expiration: "0" - url: /splash - static_files: core/templates/dev/head/dist/splash-page.mainpage.html - upload: core/templates/dev/head/dist/splash-page.mainpage.html + static_files: webpack_bundles/splash-page.mainpage.html + upload: webpack_bundles/splash-page.mainpage.html http_headers: Pragma: no-cache Strict-Transport-Security: "max-age=31536000; includeSubDomains" @@ -206,8 +206,8 @@ handlers: secure: always expiration: "0" - url: /teach - static_files: core/templates/dev/head/dist/teach-page.mainpage.html - upload: core/templates/dev/head/dist/teach-page.mainpage.html + static_files: webpack_bundles/teach-page.mainpage.html + upload: webpack_bundles/teach-page.mainpage.html http_headers: Pragma: no-cache Strict-Transport-Security: "max-age=31536000; includeSubDomains" @@ -217,8 +217,8 @@ handlers: secure: always expiration: "0" - url: /terms - static_files: core/templates/dev/head/dist/terms-page.mainpage.html - upload: core/templates/dev/head/dist/terms-page.mainpage.html + static_files: webpack_bundles/terms-page.mainpage.html + upload: webpack_bundles/terms-page.mainpage.html http_headers: Pragma: no-cache Strict-Transport-Security: "max-age=31536000; includeSubDomains" @@ -228,8 +228,8 @@ handlers: secure: always expiration: "0" - url: /thanks - static_files: core/templates/dev/head/dist/thanks-page.mainpage.html - upload: core/templates/dev/head/dist/thanks-page.mainpage.html + static_files: webpack_bundles/thanks-page.mainpage.html + upload: webpack_bundles/thanks-page.mainpage.html http_headers: Pragma: no-cache Strict-Transport-Security: "max-age=31536000; includeSubDomains" @@ -264,7 +264,7 @@ skip_files: # Karma test files - ^(.*/)Spec.js$ # Typescript files -- ^(.*/)?.*\.ts$ +- ^core/(.*/)?.*\.ts$ # Typescript output log file - ^(.*/)tsc_output_log.txt$ # Other folders to ignore diff --git a/assets/constants.js b/assets/constants.ts similarity index 99% rename from assets/constants.js rename to assets/constants.ts index b01b7a6c1748..11924da58d10 100644 --- a/assets/constants.js +++ b/assets/constants.ts @@ -13,7 +13,7 @@ * @fileoverview Initializes constants for the Oppia codebase. */ -var constants = { +export = { // Whether to allow custom event reporting to Google Analytics. "CAN_SEND_ANALYTICS_EVENTS": false, diff --git a/assets/rich_text_components_definitions.js b/assets/rich_text_components_definitions.ts similarity index 99% rename from assets/rich_text_components_definitions.js rename to assets/rich_text_components_definitions.ts index 4ba4498bdad8..ffaeb7086bda 100644 --- a/assets/rich_text_components_definitions.js +++ b/assets/rich_text_components_definitions.ts @@ -12,7 +12,7 @@ * @fileoverview Definitions for rich text components. */ -var richTextComponents = { +export = { "Collapsible": { "backend_id": "Collapsible", "category": "Basic Input", diff --git a/constants.py b/constants.py index 815bcb3cb86d..4e6ccd8dffef 100644 --- a/constants.py +++ b/constants.py @@ -48,5 +48,5 @@ class Constants(dict): __getattr__ = dict.__getitem__ -with python_utils.open_file(os.path.join('assets', 'constants.js'), 'r') as f: +with python_utils.open_file(os.path.join('assets', 'constants.ts'), 'r') as f: constants = Constants(parse_json_from_js(f)) diff --git a/constants_test.py b/constants_test.py index c634ab19e674..c68fa99cb585 100644 --- a/constants_test.py +++ b/constants_test.py @@ -28,12 +28,12 @@ class ConstantsTests(test_utils.GenericTestBase): def test_constants_file_is_existing(self): """Test if the constants file is existing.""" self.assertTrue(os.path.isfile(os.path.join( - 'assets', 'constants.js'))) + 'assets', 'constants.ts'))) def test_constants_file_contains_valid_json(self): """Test if the constants file is valid json file.""" with python_utils.open_file( - os.path.join('assets', 'constants.js'), 'r') as f: + os.path.join('assets', 'constants.ts'), 'r') as f: json = constants.parse_json_from_js(f) self.assertTrue(isinstance(json, dict)) self.assertEqual(json['TESTING_CONSTANT'], 'test') diff --git a/core/controllers/admin.py b/core/controllers/admin.py index 36eb0d18143b..c3f2954577c6 100644 --- a/core/controllers/admin.py +++ b/core/controllers/admin.py @@ -51,7 +51,7 @@ class AdminPage(base.BaseHandler): def get(self): """Handles GET requests.""" - self.render_template('dist/admin-page.mainpage.html') + self.render_template('admin-page.mainpage.html') class AdminHandler(base.BaseHandler): diff --git a/core/controllers/base.py b/core/controllers/base.py index 2d4696d00f6e..dea310222e83 100755 --- a/core/controllers/base.py +++ b/core/controllers/base.py @@ -362,10 +362,10 @@ def _render_exception_json_or_html(self, return_type, values): self.values.update(values) if 'iframed' in self.values and self.values['iframed']: self.render_template( - 'dist/error-iframed.mainpage.html', + 'error-iframed.mainpage.html', iframe_restriction=None) else: - self.render_template('dist/error-page.mainpage.html') + self.render_template('error-page.mainpage.html') else: if return_type != feconf.HANDLER_TYPE_JSON and ( return_type != feconf.HANDLER_TYPE_DOWNLOADABLE): diff --git a/core/controllers/base_test.py b/core/controllers/base_test.py index 9c95adf9c165..8cbade944931 100644 --- a/core/controllers/base_test.py +++ b/core/controllers/base_test.py @@ -527,10 +527,6 @@ class EscapingTests(test_utils.GenericTestBase): class FakePage(base.BaseHandler): """Fake page for testing autoescaping.""" - def get(self): - """Handles GET requests.""" - self.render_template('tests/jinja_escaping.html') - def post(self): """Handles POST requests.""" self.render_json({'big_value': u'\n + <% } else { %> - + <% } %> <% } %> diff --git a/core/templates/dev/head/pages/header_js_libs.html b/core/templates/dev/head/pages/header_js_libs.html index d6344d00190e..42f2a043a1a6 100644 --- a/core/templates/dev/head/pages/header_js_libs.html +++ b/core/templates/dev/head/pages/header_js_libs.html @@ -1,8 +1,3 @@ - - -<% if (webpackConfig.mode == 'production') { %> - -<% } %> @@ -13,21 +8,3 @@ - - diff --git a/core/templates/dev/head/pages/learner-dashboard-page/learner-dashboard-page.controller.ts b/core/templates/dev/head/pages/learner-dashboard-page/learner-dashboard-page.controller.ts index 0ca9208dd183..aa3b574f8d14 100644 --- a/core/templates/dev/head/pages/learner-dashboard-page/learner-dashboard-page.controller.ts +++ b/core/templates/dev/head/pages/learner-dashboard-page/learner-dashboard-page.controller.ts @@ -55,6 +55,7 @@ angular.module('oppia').directive('learnerDashboardPage', [ controller: [ '$scope', '$rootScope', '$q', '$window', '$http', '$uibModal', 'AlertsService', 'EXPLORATIONS_SORT_BY_KEYS_AND_I18N_IDS', + 'ACTIVITY_TYPE_COLLECTION', 'ACTIVITY_TYPE_EXPLORATION', 'SUBSCRIPTION_SORT_BY_KEYS_AND_I18N_IDS', 'FATAL_ERROR_CODES', 'LearnerDashboardBackendApiService', 'UrlInterpolationService', 'LEARNER_DASHBOARD_SECTION_I18N_IDS', @@ -66,6 +67,7 @@ angular.module('oppia').directive('learnerDashboardPage', [ function( $scope, $rootScope, $q, $window, $http, $uibModal, AlertsService, EXPLORATIONS_SORT_BY_KEYS_AND_I18N_IDS, + ACTIVITY_TYPE_COLLECTION, ACTIVITY_TYPE_EXPLORATION, SUBSCRIPTION_SORT_BY_KEYS_AND_I18N_IDS, FATAL_ERROR_CODES, LearnerDashboardBackendApiService, UrlInterpolationService, LEARNER_DASHBOARD_SECTION_I18N_IDS, @@ -409,9 +411,9 @@ angular.module('oppia').directive('learnerDashboardPage', [ }; ctrl.collectionPlaylistSortableOptions = getPlaylistSortableOptions( - constants.ACTIVITY_TYPE_COLLECTION); + ACTIVITY_TYPE_COLLECTION); ctrl.explorationPlaylistSortableOptions = getPlaylistSortableOptions( - constants.ACTIVITY_TYPE_EXPLORATION); + ACTIVITY_TYPE_EXPLORATION); ctrl.onClickThread = function( threadStatus, explorationId, threadId, explorationTitle) { @@ -511,10 +513,12 @@ angular.module('oppia').directive('learnerDashboardPage', [ }, controller: [ '$scope', '$uibModalInstance', '$http', 'sectionNameI18nId', - 'subsectionName', + 'subsectionName', 'ACTIVITY_TYPE_COLLECTION', + 'ACTIVITY_TYPE_EXPLORATION', function( $scope, $uibModalInstance, $http, sectionNameI18nId, - subsectionName) { + subsectionName, ACTIVITY_TYPE_COLLECTION, + ACTIVITY_TYPE_EXPLORATION) { $scope.sectionNameI18nId = sectionNameI18nId; $scope.subsectionName = subsectionName; $scope.activityTitle = activity.title; @@ -522,11 +526,11 @@ angular.module('oppia').directive('learnerDashboardPage', [ var activityType = ''; if (subsectionName === LEARNER_DASHBOARD_SUBSECTION_I18N_IDS.EXPLORATIONS) { - activityType = constants.ACTIVITY_TYPE_EXPLORATION; + activityType = ACTIVITY_TYPE_EXPLORATION; } else if (subsectionName === LEARNER_DASHBOARD_SUBSECTION_I18N_IDS .COLLECTIONS) { - activityType = constants.ACTIVITY_TYPE_COLLECTION; + activityType = ACTIVITY_TYPE_COLLECTION; } else { throw new Error('Subsection name is not valid.'); } diff --git a/core/templates/dev/head/pages/signup-page/signup-page.controller.ts b/core/templates/dev/head/pages/signup-page/signup-page.controller.ts index ba2f786cba6d..27ebf89f5e5a 100644 --- a/core/templates/dev/head/pages/signup-page/signup-page.controller.ts +++ b/core/templates/dev/head/pages/signup-page/signup-page.controller.ts @@ -27,8 +27,7 @@ require('services/contextual/UrlService.ts'); require('services/stateful/FocusManagerService.ts'); angular.module('oppia').directive('signupPage', [ - 'UrlInterpolationService', function( - UrlInterpolationService) { + 'UrlInterpolationService', function(UrlInterpolationService) { return { restrict: 'E', scope: {}, @@ -38,14 +37,14 @@ angular.module('oppia').directive('signupPage', [ controllerAs: '$ctrl', controller: [ '$http', '$rootScope', '$uibModal', 'AlertsService', - 'FocusManagerService', - 'SiteAnalyticsService', 'UrlInterpolationService', 'UrlService', - 'SITE_NAME', + 'FocusManagerService', 'SiteAnalyticsService', + 'UrlInterpolationService', 'UrlService', 'DASHBOARD_TYPE_CREATOR', + 'DASHBOARD_TYPE_LEARNER', 'SITE_NAME', function( $http, $rootScope, $uibModal, AlertsService, - FocusManagerService, - SiteAnalyticsService, UrlInterpolationService, UrlService, - SITE_NAME) { + FocusManagerService, SiteAnalyticsService, + UrlInterpolationService, UrlService, DASHBOARD_TYPE_CREATOR, + DASHBOARD_TYPE_LEARNER, SITE_NAME) { var ctrl = this; var _SIGNUP_DATA_URL = '/signuphandler/data'; $rootScope.loadingMessage = 'I18N_SIGNUP_LOADING'; @@ -150,14 +149,14 @@ angular.module('oppia').directive('signupPage', [ return; } - var defaultDashboard = constants.DASHBOARD_TYPE_LEARNER; + var defaultDashboard = DASHBOARD_TYPE_LEARNER; var returnUrl = window.decodeURIComponent( UrlService.getUrlParams().return_url); if (returnUrl.indexOf('creator_dashboard') !== -1) { - defaultDashboard = constants.DASHBOARD_TYPE_CREATOR; + defaultDashboard = DASHBOARD_TYPE_CREATOR; } else { - defaultDashboard = constants.DASHBOARD_TYPE_LEARNER; + defaultDashboard = DASHBOARD_TYPE_LEARNER; } var requestParams = { diff --git a/core/templates/dev/head/services/QuestionsListService.ts b/core/templates/dev/head/services/QuestionsListService.ts index 12ef547a1900..4b9111612888 100644 --- a/core/templates/dev/head/services/QuestionsListService.ts +++ b/core/templates/dev/head/services/QuestionsListService.ts @@ -23,9 +23,9 @@ require('services/services.constants.ajs.ts'); angular.module('oppia').factory('QuestionsListService', [ '$rootScope', 'QuestionBackendApiService', - 'EVENT_QUESTION_SUMMARIES_INITIALIZED', function( + 'EVENT_QUESTION_SUMMARIES_INITIALIZED', 'NUM_QUESTIONS_PER_PAGE', function( $rootScope, QuestionBackendApiService, - EVENT_QUESTION_SUMMARIES_INITIALIZED) { + EVENT_QUESTION_SUMMARIES_INITIALIZED, NUM_QUESTIONS_PER_PAGE) { var _questionSummaries = []; var _nextCursorForQuestions = ''; @@ -60,7 +60,7 @@ angular.module('oppia').factory('QuestionsListService', [ isLastQuestionBatch: function(index) { return ( _nextCursorForQuestions === null && - (index + 1) * constants.NUM_QUESTIONS_PER_PAGE >= + (index + 1) * NUM_QUESTIONS_PER_PAGE >= _questionSummaries.length); }, @@ -71,7 +71,7 @@ angular.module('oppia').factory('QuestionsListService', [ _nextCursorForQuestions = ''; } - var num = constants.NUM_QUESTIONS_PER_PAGE; + var num = NUM_QUESTIONS_PER_PAGE; if (skillIds === undefined || skillIds.length === 0) { return []; diff --git a/core/templates/dev/head/services/SiteAnalyticsService.ts b/core/templates/dev/head/services/SiteAnalyticsService.ts index 29506149bd12..6e0ef4a2f198 100644 --- a/core/templates/dev/head/services/SiteAnalyticsService.ts +++ b/core/templates/dev/head/services/SiteAnalyticsService.ts @@ -22,9 +22,10 @@ // Note that events are only sent if the CAN_SEND_ANALYTICS_EVENTS flag is // turned on. This flag must be turned on explicitly by the application // owner in feconf.py. + angular.module('oppia').factory('SiteAnalyticsService', [ - '$window', function($window) { - var CAN_SEND_ANALYTICS_EVENTS = constants.CAN_SEND_ANALYTICS_EVENTS; + '$window', 'CAN_SEND_ANALYTICS_EVENTS', function( + $window, CAN_SEND_ANALYTICS_EVENTS) { // For definitions of the various arguments, please see: // developers.google.com/analytics/devguides/collection/analyticsjs/events var _sendEventToGoogleAnalytics = function( @@ -209,6 +210,6 @@ angular.module('oppia').factory('SiteAnalyticsService', [ registerUploadAudioEvent: function(explorationId) { _sendEventToGoogleAnalytics( 'UploadRecordedAudio', 'click', explorationId); - }, + } }; }]); diff --git a/core/templates/dev/head/services/services.constants.ts b/core/templates/dev/head/services/services.constants.ts index db33e0b23c56..211437a5464f 100644 --- a/core/templates/dev/head/services/services.constants.ts +++ b/core/templates/dev/head/services/services.constants.ts @@ -65,5 +65,6 @@ export class ServicesConstants { public static STATE_ANSWER_STATS_URL = '/createhandler/state_answer_stats/'; - public static RTE_COMPONENT_SPECS = richTextComponents; + public static RTE_COMPONENT_SPECS = ( + require('rich_text_components_definitions.ts')); } diff --git a/core/templates/dev/head/tests/console_errors.html b/core/templates/dev/head/tests/console_errors.html index adee75a7322c..ecf8e437f1e0 100644 --- a/core/templates/dev/head/tests/console_errors.html +++ b/core/templates/dev/head/tests/console_errors.html @@ -1,4 +1,4 @@ -{% extends 'dist/base.html' %} +{% extends 'base.html' %} {% block content %}
@@ -12,9 +12,9 @@ https://github.com/jantimon/html-webpack-plugin#writing-your-own-templates --> <% for (var chunk in htmlWebpackPlugin.files.js) { %> <% if (webpackConfig.mode == 'production') { %> - + <% } else { %> - + <% } %> <% } %> {% endblock footer_js %} diff --git a/core/templates/dev/head/tests/jinja_escaping.html b/core/templates/dev/head/tests/jinja_escaping.html index 4d0c440729df..93edb4081ba4 100644 --- a/core/templates/dev/head/tests/jinja_escaping.html +++ b/core/templates/dev/head/tests/jinja_escaping.html @@ -1,4 +1,4 @@ -{% extends 'dist/base.html' %} +{% extends 'base.html' %} {% block content %}

{{DEV_MODE}}

diff --git a/core/tests/data/dummy_assets/assets/hashes.json b/core/tests/data/dummy_assets/assets/hashes.json new file mode 100644 index 000000000000..2809d7963525 --- /dev/null +++ b/core/tests/data/dummy_assets/assets/hashes.json @@ -0,0 +1,10 @@ +{ + "/hash_test.html": "ijklmopq", + "/path_test/hash_test.html": "123456789", + "/hash_test.min.js": "zyx12345", + "/assets_test/hash_test.json": "987654321", + "/pages_test/hash_test.html": "abcd12345", + "/images/hash_test.png": "98765fghij", + "/videos/hash_test.mp4": "12345cxz", + "/interactions/interTest/static/interTest.png": "123654789" +} diff --git a/core/tests/data/third_party/js/third_party.js b/core/tests/data/third_party/js/third_party.js index 5285dbedeeeb..2471f418cc70 100644 --- a/core/tests/data/third_party/js/third_party.js +++ b/core/tests/data/third_party/js/third_party.js @@ -23036,7 +23036,7 @@ function detectDisabledThemes($mdThemingProvider) { * stylesheet file into the `$mdThemingProvider`. * * If it's necessary to load an external stylesheet, we suggest using a bundler, which supports including raw content, - * like [raw-loader](https://github.com/webpack/raw-loader) for `webpack`. + * like [raw-loader](https://github.com/webpack_bundles/raw-loader) for `webpack`. * * * myAppModule.config(function($mdThemingProvider) { diff --git a/core/tests/karma-globals.ts b/core/tests/karma-globals.ts index e1b4afcf11e2..c08fd0ee0a87 100644 --- a/core/tests/karma-globals.ts +++ b/core/tests/karma-globals.ts @@ -138,18 +138,6 @@ var GLOBALS = { }; -/* hashes for UrlInterpolationService tests */ -var hashes = { - '/hash_test.html': 'ijklmopq', - '/path_test/hash_test.html': '123456789', - '/hash_test.min.js': 'zyx12345', - '/assets_test/hash_test.json': '987654321', - '/pages_test/hash_test.html': 'abcd12345', - '/images/hash_test.png': '98765fghij', - '/videos/hash_test.mp4': '12345cxz', - '/interactions/interTest/static/interTest.png': '123654789' -}; - /* This function overwrites the translationProvider for a dummy function * (customLoader). This is necessary to prevent the js test warnings about an * 'unexpected GET request' when the translationProvider tries to load the diff --git a/core/tests/karma.conf.ts b/core/tests/karma.conf.ts index caadccb0a0ca..af6dad573324 100644 --- a/core/tests/karma.conf.ts +++ b/core/tests/karma.conf.ts @@ -15,8 +15,6 @@ module.exports = function(config) { files: [ 'local_compiled_js/core/tests/karma-globals.js', // Constants must be loaded before everything else. - 'local_compiled_js/assets/constants.js', - 'local_compiled_js/assets/rich_text_components_definitions.js', // Since jquery,jquery-ui,angular,angular-mocks and math-expressions // are not bundled, they will be treated separately. 'third_party/static/jquery-3.4.1/jquery.min.js', @@ -147,6 +145,8 @@ module.exports = function(config) { mode: 'development', resolve: { modules: [ + 'core/tests/data/dummy_assets/assets', + 'assets', 'core/templates/dev/head', 'extensions', 'node_modules', diff --git a/core/tests/protractor_desktop/navigation.js b/core/tests/protractor_desktop/navigation.js index 982f6e5678ab..8e31fca13267 100644 --- a/core/tests/protractor_desktop/navigation.js +++ b/core/tests/protractor_desktop/navigation.js @@ -143,10 +143,9 @@ describe('DEV MODE Test', function() { it('should not show Dev Mode label in prod', function() { browser.get('/splash'); waitFor.pageToFullyLoad(); - general.isInDevMode().then(function(isInDevMode) { - expect(element( - by.css('.protractor-test-dev-mode')).isPresent()).toBe(isInDevMode); - }); + expect(element( + by.css('.protractor-test-dev-mode')).isPresent()) + .toBe(general.isInDevMode()); }); }); diff --git a/core/tests/protractor_utils/general.js b/core/tests/protractor_utils/general.js index ca81ba238e35..0a806ea6e306 100644 --- a/core/tests/protractor_utils/general.js +++ b/core/tests/protractor_utils/general.js @@ -70,9 +70,7 @@ var checkForConsoleErrors = function(errorsToIgnore) { }; var isInDevMode = function() { - browser.get('/splash'); - waitFor.pageToFullyLoad(); - return browser.executeScript('return constants.DEV_MODE'); + return browser.params.devMode === 'true'; }; var SERVER_URL_PREFIX = 'http://localhost:9001'; diff --git a/feconf.py b/feconf.py index a8f36d13edd7..ff39840787dd 100644 --- a/feconf.py +++ b/feconf.py @@ -62,15 +62,14 @@ RTE_EXTENSIONS_DIR = ( os.path.join(EXTENSIONS_DIR_PREFIX, 'extensions', 'rich_text_components')) RTE_EXTENSIONS_DEFINITIONS_PATH = ( - os.path.join('assets', 'rich_text_components_definitions.js')) + os.path.join('assets', 'rich_text_components_definitions.ts')) OBJECT_TEMPLATES_DIR = os.path.join('extensions', 'objects', 'templates') # Choose production templates folder when we are in production mode. FRONTEND_TEMPLATES_DIR = ( - os.path.join( - 'core', 'templates', 'dev', 'head') if constants.DEV_MODE else - os.path.join('backend_prod_files', 'templates', 'head')) + os.path.join('webpack_bundles') if constants.DEV_MODE else + os.path.join('backend_prod_files', 'webpack_bundles')) DEPENDENCIES_TEMPLATES_DIR = ( os.path.join(EXTENSIONS_DIR_PREFIX, 'extensions', 'dependencies')) diff --git a/package-lock.json b/package-lock.json index f9475160a244..2332b0f0ee8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -282,7 +282,7 @@ "@ckeditor/ckeditor5-adapter-ckfinder": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-adapter-ckfinder/-/ckeditor5-adapter-ckfinder-11.0.4.tgz", - "integrity": "sha512-/wpdYrCA3J6MlaqXUUrH/fF5b7g+8Xvlq3bUntTM/GcyeqCFeIJqxumaTIXOuXLobfmVqMKYL1lTrL3WetA2MQ==", + "integrity": "sha1-2ylREZQ1Ge+maQ+D1EDtQIOzTjE=", "dev": true, "requires": { "@ckeditor/ckeditor5-core": "^12.2.1", @@ -292,7 +292,7 @@ "@ckeditor/ckeditor5-autoformat": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-autoformat/-/ckeditor5-autoformat-11.0.4.tgz", - "integrity": "sha512-lGv3TTs5ny3FBfWJL/8h1F8KngXBF3zXeDsHHLx/4GEAtqPBZJRBY1OdU8EI3VtydqCCFdefeKG7cNWM4Akg0w==", + "integrity": "sha1-ha8XI72oFrWAgElfusRUZ9WIbaw=", "dev": true, "requires": { "@ckeditor/ckeditor5-core": "^12.2.1" @@ -301,7 +301,7 @@ "@ckeditor/ckeditor5-basic-styles": { "version": "11.1.3", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-basic-styles/-/ckeditor5-basic-styles-11.1.3.tgz", - "integrity": "sha512-6OO/gtEL6QlscX4GsMoSuugSBRLWDWNv3DzlBDH+sUAHwCPN1c7EXK1PONMbYY0OBaNebjAekxPSV7crzrsDLQ==", + "integrity": "sha1-0MFMGdSVOzzbY0y6spM6X7vEfY0=", "dev": true, "requires": { "@ckeditor/ckeditor5-core": "^12.2.1", @@ -311,7 +311,7 @@ "@ckeditor/ckeditor5-block-quote": { "version": "11.1.2", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-block-quote/-/ckeditor5-block-quote-11.1.2.tgz", - "integrity": "sha512-nJFhk2xMcnKjjnXNaNnoz02goOhfGVVevjUGpccRkrjh9jH3NM6yQ2UdOgREUb8I6ZKEkYSkm8qfWi/mRDH9BQ==", + "integrity": "sha1-dR/3waXZsshwoKRFLQGC7XCIQgQ=", "dev": true, "requires": { "@ckeditor/ckeditor5-core": "^12.2.1", @@ -322,13 +322,13 @@ "@ckeditor/ckeditor5-build-classic": { "version": "12.3.1", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-build-classic/-/ckeditor5-build-classic-12.3.1.tgz", - "integrity": "sha512-nlE8wRasM3AF2XkXHJuj91cq46ZvmTBfXePCtjogT8s/niYlFma+Lqu7cAUONxRXh11m1IpgC6i+QOGFZH0p8A==", + "integrity": "sha1-s3AR1e4vJZDPjSmkPcXGLxTPC1o=", "dev": true }, "@ckeditor/ckeditor5-ckfinder": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ckfinder/-/ckeditor5-ckfinder-11.0.4.tgz", - "integrity": "sha512-1ecCEpx75ryoWZo+OIVII4wQ9pT5Kl+dozwMMW9SOQibnLgRORhzx7Eq1xu/mRtxfQ/GjPekQAJMIca1yW9qYQ==", + "integrity": "sha1-mevkcoOQwVlBYXqajTcTWrZPb98=", "dev": true, "requires": { "@ckeditor/ckeditor5-adapter-ckfinder": "^11.0.4", @@ -339,7 +339,7 @@ "@ckeditor/ckeditor5-core": { "version": "12.2.1", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-12.2.1.tgz", - "integrity": "sha512-1z6t56Evo3u/c11t4xSvxGdN/UB+UJ2PxzbiDf7ul0zBo/CE3Q3dYFjVRSKLKePhQOI1wti4sXCeLQaflh76VQ==", + "integrity": "sha1-U/5lxXMJ+y7VgoyOZ6WYBTK35Qo=", "dev": true, "requires": { "@ckeditor/ckeditor5-engine": "^13.2.1", @@ -384,7 +384,7 @@ "@ckeditor/ckeditor5-engine": { "version": "13.2.1", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-13.2.1.tgz", - "integrity": "sha512-yGERQGIYZwJtShi+CYuAWV5P1bvLDlMTMjHf+qPKCwXAw9RiWmjuS5MVpeaZRtmAMEGXyol+mf8IvYvXczfo8A==", + "integrity": "sha1-lZQdakpTY24XUzcng31Dmo4+t8E=", "dev": true, "requires": { "@ckeditor/ckeditor5-utils": "^13.0.1", @@ -394,7 +394,7 @@ "@ckeditor/ckeditor5-table": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-table/-/ckeditor5-table-13.0.2.tgz", - "integrity": "sha512-T3DAY7E224E04qrxlwYKbhiwGYcTEa6Ev50Xh9fyf/ZsCAfjVt9cwhUvE9Be6hxB/vnkvw6f8/xPWCl/sdVSNA==", + "integrity": "sha1-lfmFv7iUQ6p65NDC+la6/4wxceU=", "dev": true, "requires": { "@ckeditor/ckeditor5-core": "^12.2.1", @@ -405,7 +405,7 @@ "@ckeditor/ckeditor5-theme-lark": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-theme-lark/-/ckeditor5-theme-lark-14.1.1.tgz", - "integrity": "sha512-gXvdg9WcFyktR7RqkyKf3EAana5V18qX5oBjrPCxU0sHrqbDsxa0Up2QU5rxbCT5s+bdtwewnsXslV4zdeGk8g==", + "integrity": "sha1-X68UfiWzWTK62edt5oVZGKreGXk=", "dev": true, "requires": { "@ckeditor/ckeditor5-ui": "^13.0.2" @@ -414,7 +414,7 @@ "@ckeditor/ckeditor5-ui": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-13.0.2.tgz", - "integrity": "sha512-A2Ut+W3rHWNUNR1TwjdBQShl7v270hRlcz3Z77ka/0xlhkQ7TIAVlVHu8q89170fFE4Po8cSqGDZVO9YT3W75A==", + "integrity": "sha1-mZeNif9aWtvSisZYZHdQGsLbJmo=", "dev": true, "requires": { "@ckeditor/ckeditor5-core": "^12.2.1", @@ -425,7 +425,7 @@ "@ckeditor/ckeditor5-upload": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-11.1.1.tgz", - "integrity": "sha512-uB8DYTw2BJrNPjSWh6u6udlprVeN2BeQbbZiSiIstJSS3q4vr90FPnhZ5lvtwxvo9lMXLMgGZUwz1Nkulj5oSg==", + "integrity": "sha1-1BRN4EvZV9Z3lAw+ngZa/lsCOrc=", "dev": true, "requires": { "@ckeditor/ckeditor5-core": "^12.2.1", @@ -436,7 +436,7 @@ "@ckeditor/ckeditor5-utils": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-13.0.1.tgz", - "integrity": "sha512-u/18fD/lPeoir3R6+chBlm2ZCdvbqXqbx4yelOc4J+wzQUj53n0ZuADZrxXH0lXY/jsU5Lat0wisgmjwOkmGBw==", + "integrity": "sha1-/FHI0uZh1szQV0jBxT8ZdYNeHL0=", "dev": true, "requires": { "ckeditor5": "^12.3.1", @@ -446,7 +446,7 @@ "@ckeditor/ckeditor5-widget": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-11.0.4.tgz", - "integrity": "sha512-mCT+a/X6SMyz9ZTBpSef8+8A9guP/gvsdGQlgJ5e9i1D5lv2ZnLPu4GfVVEyNbtIIXOkdheNMICQhWI3splz4Q==", + "integrity": "sha1-Ttv+A1Yh5d64JsJGlMkCIXcogJE=", "dev": true, "requires": { "@ckeditor/ckeditor5-core": "^12.2.1", @@ -478,7 +478,7 @@ "@nodelib/fs.scandir": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.1.tgz", - "integrity": "sha512-NT/skIZjgotDSiXs0WqYhgcuBKhUMgfekCmCGtkUAiLqZdOnrdjmZr9wRl3ll64J9NF79uZ4fk16Dx0yMc/Xbg==", + "integrity": "sha1-f6j+1lSTnho5dT0oa0i0g20A4Os=", "dev": true, "requires": { "@nodelib/fs.stat": "2.0.1", @@ -494,7 +494,7 @@ "@nodelib/fs.walk": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.2.tgz", - "integrity": "sha512-J/DR3+W12uCzAJkw7niXDcqcKBg6+5G5Q/ZpThpGNzAUz70eOR6RV4XnnSN01qHZiVl0eavoxJsBypQoKsV2QQ==", + "integrity": "sha1-amRQxeFwEqvYFFDrdJSaTZcNKAc=", "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.1", @@ -2559,7 +2559,7 @@ "camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "integrity": "sha1-7pePaUeRTMMMa0R0G27R338EP9U=", "dev": true }, "camelcase-keys": { @@ -2583,7 +2583,7 @@ "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "integrity": "sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA=", "dev": true, "requires": { "browserslist": "^4.0.0", @@ -2797,7 +2797,7 @@ "ckeditor5": { "version": "12.3.1", "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-12.3.1.tgz", - "integrity": "sha512-hXXAMvV8zdRIMsa66rUKlU50+/IC7obQxg/myBe8kkYrnrfthGwWFd3j6qHzlEb48B9g1noZX8oqBF9E6D+N2Q==", + "integrity": "sha1-cp7wnd3pqZ+9mIqq1hV8ybdD1Bw=", "dev": true }, "class-utils": { @@ -3042,7 +3042,7 @@ "coa": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "integrity": "sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM=", "dev": true, "requires": { "@types/q": "^1.5.1", @@ -3086,7 +3086,7 @@ "color": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "integrity": "sha1-aBSOf4XUGtdknF+oyBBvCY0inhA=", "dev": true, "requires": { "color-convert": "^1.9.1", @@ -3111,7 +3111,7 @@ "color-string": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "integrity": "sha1-ybvF8BtYtUkvPWhXRZy2WQziBMw=", "dev": true, "requires": { "color-name": "^1.0.0", @@ -3414,7 +3414,7 @@ "css-declaration-sorter": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "integrity": "sha1-wZiUD2OnbX42wecQGLABchBUyyI=", "dev": true, "requires": { "postcss": "^7.0.1", @@ -3486,13 +3486,13 @@ "css-select-base-adapter": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "integrity": "sha1-Oy/0lyzDYquIVhUHqVQIoUMhNdc=", "dev": true }, "css-tree": { "version": "1.0.0-alpha.33", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", - "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", + "integrity": "sha1-lw4g5akfejeN3Q/FjQtsjU876T4=", "dev": true, "requires": { "mdn-data": "2.0.4", @@ -3522,13 +3522,13 @@ "cssesc": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "integrity": "sha1-OxO9G7HLNuG8taTc0n9UxdyzVwM=", "dev": true }, "cssnano": { "version": "4.1.10", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "integrity": "sha1-CsQfCxPRPUZUh+ERt3jULaYxuLI=", "dev": true, "requires": { "cosmiconfig": "^5.0.0", @@ -3540,7 +3540,7 @@ "cssnano-preset-default": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "integrity": "sha1-UexmLM/KD4izltzZZ5zbkxvhf3Y=", "dev": true, "requires": { "css-declaration-sorter": "^4.0.1", @@ -3590,7 +3590,7 @@ "cssnano-util-raw-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "integrity": "sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI=", "dev": true, "requires": { "postcss": "^7.0.0" @@ -3599,13 +3599,13 @@ "cssnano-util-same-parent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "integrity": "sha1-V0CC+yhZ0ttDOFWDXZqEVuoYu/M=", "dev": true }, "csso": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", - "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "integrity": "sha1-e564vmFiiXPBsmHhadLwJACOdYs=", "dev": true, "requires": { "css-tree": "1.0.0-alpha.29" @@ -3614,7 +3614,7 @@ "css-tree": { "version": "1.0.0-alpha.29", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", - "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", + "integrity": "sha1-P6nU7zFCy9HDAedmTB81K9gvWjk=", "dev": true, "requires": { "mdn-data": "~1.1.0", @@ -3624,7 +3624,7 @@ "mdn-data": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", + "integrity": "sha1-ULXU/8RXUnZXPE7tuHgIEqhBnwE=", "dev": true }, "source-map": { @@ -3666,302 +3666,6 @@ "type": "^1.0.1" } }, - "d3": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.9.2.tgz", - "integrity": "sha512-ydrPot6Lm3nTWH+gJ/Cxf3FcwuvesYQ5uk+j/kXEH/xbuYWYWTMAHTJQkyeuG8Y5WM5RSEYB41EctUrXQQytRQ==", - "dev": true, - "requires": { - "d3-array": "1", - "d3-axis": "1", - "d3-brush": "1", - "d3-chord": "1", - "d3-collection": "1", - "d3-color": "1", - "d3-contour": "1", - "d3-dispatch": "1", - "d3-drag": "1", - "d3-dsv": "1", - "d3-ease": "1", - "d3-fetch": "1", - "d3-force": "1", - "d3-format": "1", - "d3-geo": "1", - "d3-hierarchy": "1", - "d3-interpolate": "1", - "d3-path": "1", - "d3-polygon": "1", - "d3-quadtree": "1", - "d3-random": "1", - "d3-scale": "2", - "d3-scale-chromatic": "1", - "d3-selection": "1", - "d3-shape": "1", - "d3-time": "1", - "d3-time-format": "2", - "d3-timer": "1", - "d3-transition": "1", - "d3-voronoi": "1", - "d3-zoom": "1" - } - }, - "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", - "dev": true - }, - "d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==", - "dev": true - }, - "d3-brush": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.3.tgz", - "integrity": "sha512-v8bbYyCFKjyCzFk/tdWqXwDykY8YWqhXYjcYxfILIit085VZOpj4XJKOMccTsvWxgzSLMJQg5SiqHjslsipEDg==", - "dev": true, - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", - "dev": true, - "requires": { - "d3-array": "1", - "d3-path": "1" - } - }, - "d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==", - "dev": true - }, - "d3-color": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.3.0.tgz", - "integrity": "sha512-NHODMBlj59xPAwl2BDiO2Mog6V+PrGRtBfWKqKRrs9MCqlSkIEb0Z/SfY7jW29ReHTDC/j+vwXhnZcXI3+3fbg==", - "dev": true - }, - "d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", - "dev": true, - "requires": { - "d3-array": "^1.1.1" - } - }, - "d3-dispatch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.5.tgz", - "integrity": "sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g==", - "dev": true - }, - "d3-drag": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.4.tgz", - "integrity": "sha512-ICPurDETFAelF1CTHdIyiUM4PsyZLaM+7oIBhmyP+cuVjze5vDZ8V//LdOFjg0jGnFIZD/Sfmk0r95PSiu78rw==", - "dev": true, - "requires": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "d3-dsv": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.1.1.tgz", - "integrity": "sha512-1EH1oRGSkeDUlDRbhsFytAXU6cAmXFzc52YUe6MRlPClmWb85MP1J5x+YJRzya4ynZWnbELdSAvATFW/MbxaXw==", - "dev": true, - "requires": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - } - }, - "d3-ease": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz", - "integrity": "sha512-Ct1O//ly5y5lFM9YTdu+ygq7LleSgSE4oj7vUt9tPLHUi8VCV7QoizGpdWRWAwCO9LdYzIrQDg97+hGVdsSGPQ==", - "dev": true - }, - "d3-fetch": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", - "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", - "dev": true, - "requires": { - "d3-dsv": "1" - } - }, - "d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", - "dev": true, - "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "d3-format": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", - "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==", - "dev": true - }, - "d3-geo": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.6.tgz", - "integrity": "sha512-z0J8InXR9e9wcgNtmVnPTj0TU8nhYT6lD/ak9may2PdKqXIeHUr8UbFLoCtrPYNsjv6YaLvSDQVl578k6nm7GA==", - "dev": true, - "requires": { - "d3-array": "1" - } - }, - "d3-hierarchy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", - "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==", - "dev": true - }, - "d3-interpolate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", - "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", - "dev": true, - "requires": { - "d3-color": "1" - } - }, - "d3-path": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.8.tgz", - "integrity": "sha512-J6EfUNwcMQ+aM5YPOB8ZbgAZu6wc82f/0WFxrxwV6Ll8wBwLaHLKCqQ5Imub02JriCVVdPjgI+6P3a4EWJCxAg==", - "dev": true - }, - "d3-polygon": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.5.tgz", - "integrity": "sha512-RHhh1ZUJZfhgoqzWWuRhzQJvO7LavchhitSTHGu9oj6uuLFzYZVeBzaWTQ2qSO6bz2w55RMoOCf0MsLCDB6e0w==", - "dev": true - }, - "d3-quadtree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.6.tgz", - "integrity": "sha512-NUgeo9G+ENQCQ1LsRr2qJg3MQ4DJvxcDNCiohdJGHt5gRhBW6orIB5m5FJ9kK3HNL8g9F4ERVoBzcEwQBfXWVA==", - "dev": true - }, - "d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==", - "dev": true - }, - "d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", - "dev": true, - "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" - } - }, - "d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", - "dev": true, - "requires": { - "d3-color": "1", - "d3-interpolate": "1" - } - }, - "d3-selection": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.0.tgz", - "integrity": "sha512-EYVwBxQGEjLCKF2pJ4+yrErskDnz5v403qvAid96cNdCMr8rmCYfY5RGzWz24mdIbxmDf6/4EAH+K9xperD5jg==", - "dev": true - }, - "d3-shape": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.5.tgz", - "integrity": "sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg==", - "dev": true, - "requires": { - "d3-path": "1" - } - }, - "d3-time": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.11.tgz", - "integrity": "sha512-Z3wpvhPLW4vEScGeIMUckDW7+3hWKOQfAWg/U7PlWBnQmeKQ00gCUsTtWSYulrKNA7ta8hJ+xXc6MHrMuITwEw==", - "dev": true - }, - "d3-time-format": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", - "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", - "dev": true, - "requires": { - "d3-time": "1" - } - }, - "d3-timer": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz", - "integrity": "sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg==", - "dev": true - }, - "d3-transition": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.2.0.tgz", - "integrity": "sha512-VJ7cmX/FPIPJYuaL2r1o1EMHLttvoIuZhhuAlRoOxDzogV8iQS6jYulDm3xEU3TqL80IZIhI551/ebmCMrkvhw==", - "dev": true, - "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" - } - }, - "d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==", - "dev": true - }, - "d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", - "dev": true, - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -5118,13 +4822,13 @@ "fastparse": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "integrity": "sha1-kXKMWllC7O2FMSg8eUQe5BIsNak=", "dev": true }, "fastq": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", - "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", + "integrity": "sha1-Tsijj0rCXyFJJnOtt+rpz+9H0cI=", "dev": true, "requires": { "reusify": "^1.0.0" @@ -5752,607 +5456,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz", - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "dev": true, - "requires": { - "null-check": "^1.0.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", - "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", - "dev": true, - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -6931,7 +6034,7 @@ "hex-color-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "integrity": "sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4=", "dev": true }, "hmac-drbg": { @@ -6975,7 +6078,7 @@ "html-comment-regex": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "integrity": "sha1-l9RoiutcgYhqNk+qDK0d2hTUM6c=", "dev": true }, "html-minifier": { @@ -7641,7 +6744,7 @@ "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=", "dev": true }, "is-running": { @@ -7665,7 +6768,7 @@ "is-svg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "integrity": "sha1-kyHb0pwhLlypnE+peUxxS8r6L3U=", "dev": true, "requires": { "html-comment-regex": "^1.1.0" @@ -8335,7 +7438,6 @@ "requires": { "anymatch": "^3.0.1", "braces": "^3.0.2", - "fsevents": "^2.0.6", "glob-parent": "^5.0.0", "is-binary-path": "^2.1.0", "is-glob": "^4.0.1", @@ -8629,7 +7731,7 @@ "lodash-es": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", - "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==", + "integrity": "sha1-Ib2Wg5NUQS8j16EDQOXqxu5FXXg=", "dev": true }, "lodash.memoize": { @@ -9000,7 +8102,7 @@ "mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "integrity": "sha1-aZs8OKxvHXKAkaZGULZdOIUC/Vs=", "dev": true }, "media-typer": { @@ -9509,7 +8611,7 @@ "normalize-url": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=", "dev": true }, "now-and-later": { @@ -9699,7 +8801,7 @@ "object.values": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "integrity": "sha1-v2gQ712j5TJXkOqqK+IT6oRiTak=", "dev": true, "requires": { "define-properties": "^1.1.3", @@ -10161,7 +9263,7 @@ "pofile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.0.tgz", - "integrity": "sha512-6XYcNkXWGiJ2CVXogTP7uJ6ZXQCldYLZc16wgRp8tqRaBTTyIfF+TUT3EQJPXTLAT7OTPpTAoaFdoXKfaTRU1w==", + "integrity": "sha1-nOhLvvUEPOtPGb3DUg2Fd4+tT5Q=", "dev": true }, "posix-character-classes": { @@ -10195,7 +9297,7 @@ "postcss-calc": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", - "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", + "integrity": "sha1-Ntd7qwI7Dsu5eJ2E3LI8SUEUVDY=", "dev": true, "requires": { "css-unit-converter": "^1.1.1", @@ -10207,7 +9309,7 @@ "postcss-colormin": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "integrity": "sha1-rgYLzpPteUrHEmTwgTLVUJVr04E=", "dev": true, "requires": { "browserslist": "^4.0.0", @@ -10220,7 +9322,7 @@ "postcss-convert-values": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "integrity": "sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8=", "dev": true, "requires": { "postcss": "^7.0.0", @@ -10230,7 +9332,7 @@ "postcss-discard-comments": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "integrity": "sha1-H7q9LCRr/2qq15l7KwkY9NevQDM=", "dev": true, "requires": { "postcss": "^7.0.0" @@ -10239,7 +9341,7 @@ "postcss-discard-duplicates": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "integrity": "sha1-P+EzzTyCKC5VD8myORdqkge3hOs=", "dev": true, "requires": { "postcss": "^7.0.0" @@ -10248,7 +9350,7 @@ "postcss-discard-empty": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "integrity": "sha1-yMlR6fc+2UKAGUWERKAq2Qu592U=", "dev": true, "requires": { "postcss": "^7.0.0" @@ -10257,7 +9359,7 @@ "postcss-discard-overridden": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "integrity": "sha1-ZSrvipZybwKfXj4AFG7npOdV/1c=", "dev": true, "requires": { "postcss": "^7.0.0" @@ -10275,7 +9377,7 @@ "postcss-import": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", - "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "integrity": "sha1-z4x6sLXMq1ZJAkU25WX4QZKLcVM=", "dev": true, "requires": { "postcss": "^7.0.1", @@ -10287,7 +9389,7 @@ "postcss-js": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-2.0.2.tgz", - "integrity": "sha512-HxXLw1lrczsbVXxyC+t/VIfje9ZeZhkkXE8KpFa3MEKfp2FyHDv29JShYY9eLhYrhLyWWHNIuwkktTfLXu2otw==", + "integrity": "sha1-peddP7nYWyjh0r1XlWwRVmXqhUI=", "dev": true, "requires": { "camelcase-css": "^2.0.1", @@ -10315,7 +9417,7 @@ "postcss-load-config": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "integrity": "sha1-yE1pK3u3tB3c7ZTuYuirMbQXsAM=", "dev": true, "requires": { "cosmiconfig": "^5.0.0", @@ -10325,7 +9427,7 @@ "postcss-loader": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "integrity": "sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0=", "dev": true, "requires": { "loader-utils": "^1.1.0", @@ -10353,7 +9455,7 @@ "postcss-merge-longhand": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "integrity": "sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ=", "dev": true, "requires": { "css-color-names": "0.0.4", @@ -10365,7 +9467,7 @@ "postcss-merge-rules": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "integrity": "sha1-NivqT/Wh+Y5AdacTxsslrv75plA=", "dev": true, "requires": { "browserslist": "^4.0.0", @@ -10392,7 +9494,7 @@ "postcss-minify-font-values": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "integrity": "sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY=", "dev": true, "requires": { "postcss": "^7.0.0", @@ -10402,7 +9504,7 @@ "postcss-minify-gradients": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "integrity": "sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE=", "dev": true, "requires": { "cssnano-util-get-arguments": "^4.0.0", @@ -10414,7 +9516,7 @@ "postcss-minify-params": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "integrity": "sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ=", "dev": true, "requires": { "alphanum-sort": "^1.0.0", @@ -10428,7 +9530,7 @@ "postcss-minify-selectors": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "integrity": "sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g=", "dev": true, "requires": { "alphanum-sort": "^1.0.0", @@ -10453,7 +9555,7 @@ "postcss-mixins": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-6.2.2.tgz", - "integrity": "sha512-QqEZamiAMguYR6d2h73XXEHZgkxs03PlbU0PqgqtdCnbRlMLFNQgsfL/Td0rjIe2SwpLXOQyB9uoiLWa4GR7tg==", + "integrity": "sha1-Os6mMnHix122L7gLwcKeGmCaR0I=", "dev": true, "requires": { "globby": "^8.0.1", @@ -10510,7 +9612,7 @@ "dir-glob": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "integrity": "sha1-CyBdK2rvmCOMooZZioIE0p0KADQ=", "dev": true, "requires": { "arrify": "^1.0.1", @@ -10578,7 +9680,7 @@ "globby": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "integrity": "sha1-VpdhnM2VxSdduy1vqkIIfBqUHY0=", "dev": true, "requires": { "array-union": "^1.0.1", @@ -10593,7 +9695,7 @@ "ignore": { "version": "3.3.10", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=", "dev": true }, "is-number": { @@ -10640,7 +9742,7 @@ "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", "dev": true, "requires": { "pify": "^3.0.0" @@ -10767,7 +9869,7 @@ "postcss-normalize-charset": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "integrity": "sha1-izWt067oOhNrBHHg1ZvlilAoXdQ=", "dev": true, "requires": { "postcss": "^7.0.0" @@ -10776,7 +9878,7 @@ "postcss-normalize-display-values": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "integrity": "sha1-Db4EpM6QY9RmftK+R2u4MMglk1o=", "dev": true, "requires": { "cssnano-util-get-match": "^4.0.0", @@ -10787,7 +9889,7 @@ "postcss-normalize-positions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "integrity": "sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8=", "dev": true, "requires": { "cssnano-util-get-arguments": "^4.0.0", @@ -10799,7 +9901,7 @@ "postcss-normalize-repeat-style": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "integrity": "sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw=", "dev": true, "requires": { "cssnano-util-get-arguments": "^4.0.0", @@ -10811,7 +9913,7 @@ "postcss-normalize-string": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "integrity": "sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw=", "dev": true, "requires": { "has": "^1.0.0", @@ -10822,7 +9924,7 @@ "postcss-normalize-timing-functions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "integrity": "sha1-jgCcoqOUnNr4rSPmtquZy159KNk=", "dev": true, "requires": { "cssnano-util-get-match": "^4.0.0", @@ -10833,7 +9935,7 @@ "postcss-normalize-unicode": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "integrity": "sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs=", "dev": true, "requires": { "browserslist": "^4.0.0", @@ -10844,7 +9946,7 @@ "postcss-normalize-url": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "integrity": "sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE=", "dev": true, "requires": { "is-absolute-url": "^2.0.0", @@ -10856,7 +9958,7 @@ "postcss-normalize-whitespace": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "integrity": "sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI=", "dev": true, "requires": { "postcss": "^7.0.0", @@ -10866,7 +9968,7 @@ "postcss-ordered-values": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "integrity": "sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4=", "dev": true, "requires": { "cssnano-util-get-arguments": "^4.0.0", @@ -10877,7 +9979,7 @@ "postcss-reduce-initial": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "integrity": "sha1-f9QuvqXpyBRgljniwuhK4nC6SN8=", "dev": true, "requires": { "browserslist": "^4.0.0", @@ -10889,7 +9991,7 @@ "postcss-reduce-transforms": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "integrity": "sha1-F++kBerMbge+NBSlyi0QdGgdTik=", "dev": true, "requires": { "cssnano-util-get-match": "^4.0.0", @@ -10969,7 +10071,7 @@ "postcss-simple-vars": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-5.0.2.tgz", - "integrity": "sha512-xWIufxBoINJv6JiLb7jl5oElgp+6puJwvT5zZHliUSydoLz4DADRB3NDDsYgfKVwojn4TDLiseoC65MuS8oGGg==", + "integrity": "sha1-4vgbPQhH3dQWmBa20UG5HVHm4i4=", "dev": true, "requires": { "postcss": "^7.0.14" @@ -10978,7 +10080,7 @@ "postcss-svgo": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "integrity": "sha1-F7mXvHEbMzurFDqu07jT1uPTglg=", "dev": true, "requires": { "is-svg": "^3.0.0", @@ -10996,7 +10098,7 @@ "postcss-unique-selectors": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "integrity": "sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w=", "dev": true, "requires": { "alphanum-sort": "^1.0.0", @@ -11314,7 +10416,7 @@ "raw-loader": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-3.1.0.tgz", - "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==", + "integrity": "sha1-Xp05mloiLMDeGPQsO8XklndTKz8=", "dev": true, "requires": { "loader-utils": "^1.1.0", @@ -11324,7 +10426,7 @@ "schema-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.0.1.tgz", - "integrity": "sha512-HJFKJ4JixDpRur06QHwi8uu2kZbng318ahWEKgBjc0ZklcE4FDvmm2wghb448q0IRaABxIESt8vqPFvwgMB80A==", + "integrity": "sha1-HuwuBZVWr4QbfzqDthrxPXo/kZY=", "dev": true, "requires": { "ajv": "^6.1.0", @@ -11570,7 +10672,7 @@ "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "integrity": "sha1-Z648pXyXKiqhZCsQ/jY/4y1J3Ag=", "dev": true }, "regenerator-runtime": { @@ -11932,7 +11034,7 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=", "dev": true }, "rfdc": { @@ -11984,7 +11086,7 @@ "run-parallel": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "integrity": "sha1-yd06fPn0ssS2JE4XOm7YZuYd1nk=", "dev": true }, "run-queue": { @@ -11996,12 +11098,6 @@ "aproba": "^1.1.1" } }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=", - "dev": true - }, "rxjs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", @@ -12198,7 +11294,7 @@ "shelljs": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", - "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "integrity": "sha1-p/MxlSDr8J7oEnWyNorbKGZZsJc=", "dev": true, "requires": { "glob": "^7.0.0", @@ -12224,7 +11320,7 @@ "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "integrity": "sha1-RXSirlb3qyBolvtDHq7tBm/fjwM=", "dev": true } } @@ -12626,7 +11722,7 @@ "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "integrity": "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=", "dev": true }, "stack-trace": { @@ -12913,7 +12009,7 @@ "style-loader": { "version": "0.23.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "integrity": "sha1-y5FUYG8+dxq2xKtjcCahBJF02SU=", "dev": true, "requires": { "loader-utils": "^1.1.0", @@ -12929,7 +12025,7 @@ "stylehacks": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "integrity": "sha1-Zxj8r00eB9ihMYaQiB6NlnJqcdU=", "dev": true, "requires": { "browserslist": "^4.0.0", @@ -13564,7 +12660,7 @@ "svgo": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", - "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", + "integrity": "sha1-uuUbqV3tmjOja3xGzpw1mukVQxM=", "dev": true, "requires": { "chalk": "^2.4.1", @@ -14207,7 +13303,7 @@ "underscore-template-loader": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/underscore-template-loader/-/underscore-template-loader-1.0.0.tgz", - "integrity": "sha512-4tzm3DY8nLD6mKCQmPk51vu5HW8T61fSGpfkUrlrwF0oOPTinL8Zk7W08xHOmCZ2Sh9bZHVMzVgr/DUM+10iUA==", + "integrity": "sha1-4IU+5IUNIuAIl8RjjzYDasCMDX4=", "dev": true, "requires": { "fastparse": "^1.1.1", @@ -14217,7 +13313,7 @@ "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", "dev": true }, "json5": { @@ -14589,7 +13685,7 @@ "vendors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", - "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==", + "integrity": "sha1-pkZ3gavTZiF8BQ+CAuflDMnu+MA=", "dev": true }, "verror": { @@ -15264,6 +14360,15 @@ } } }, + "webpack-merge": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha1-XpI8+ALqKs5P1a8dMkc2imM0ibQ=", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, "webpack-sources": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", diff --git a/package.json b/package.json index d1da10dd110b..c44300b7772e 100644 --- a/package.json +++ b/package.json @@ -114,6 +114,7 @@ "webdriver-manager": "^12.1.4", "webpack": "^4.30.0", "webpack-cli": "^3.3.1", + "webpack-merge": "^4.2.1", "yargs": "^13.2.2", "zone.js": "^0.9.1" }, diff --git a/scripts/build.py b/scripts/build.py index d33e07e0fd70..b33efb88a85d 100644 --- a/scripts/build.py +++ b/scripts/build.py @@ -70,9 +70,13 @@ 'staging_dir': os.path.join('backend_prod_files', 'templates', 'head', ''), 'out_dir': os.path.join('build', 'templates', 'head', '') } +WEBPACK_DIRNAMES_TO_DIRPATHS = { + 'staging_dir': os.path.join('backend_prod_files', 'webpack_bundles', ''), + 'out_dir': os.path.join('build', 'webpack_bundles', '') +} -HASHES_JS_FILENAME = 'hashes.js' -HASHES_JS_FILEPATH = os.path.join(ASSETS_DEV_DIR, HASHES_JS_FILENAME) +HASHES_TS_FILENAME = 'hashes.json' +HASHES_TS_FILEPATH = os.path.join('assets', HASHES_TS_FILENAME) MANIFEST_FILE_PATH = os.path.join('manifest.json') REMOVE_WS = re.compile(r'\s{2,}').sub @@ -117,18 +121,15 @@ 'third_party/generated/webfonts/*', '*.bundle.js', '*.bundle.js.map', - '*/dist/about-page.mainpage.html', - '*/dist/contact-page.mainpage.html', - '*/dist/donate-page.mainpage.html', - '*/dist/get-started-page.mainpage.html', - '*/dist/privacy-page.mainpage.html', - '*/dist/splash-page.mainpage.html', - '*/dist/splash_at0.html', - '*/dist/splash_at1.html', - '*/dist/teach-page.mainpage.html', - '*/dist/terms-page.mainpage.html', - '*/dist/terms-page.mainpage.html', - '*/dist/thanks-page.mainpage.html') + 'webpack_bundles/about-page.mainpage.html', + 'webpack_bundles/contact-page.mainpage.html', + 'webpack_bundles/donate-page.mainpage.html', + 'webpack_bundles/get-started-page.mainpage.html', + 'webpack_bundles/privacy-page.mainpage.html', + 'webpack_bundles/splash-page.mainpage.html', + 'webpack_bundles/teach-page.mainpage.html', + 'webpack_bundles/terms-page.mainpage.html', + 'webpack_bundles/thanks-page.mainpage.html') # Hashes for files with these paths should be provided to the frontend in # JS hashes object. @@ -144,16 +145,15 @@ def generate_app_yaml(): """Generate app.yaml from app_dev.yaml.""" - dev_file_prefix = 'core/templates/dev/head' - prod_file_prefix = 'build/templates/head' + prod_file_prefix = 'build/' content = '# THIS FILE IS AUTOGENERATED, DO NOT MODIFY\n' with python_utils.open_file(APP_DEV_YAML_FILEPATH, 'r') as yaml_file: content += yaml_file.read() for file_path in FILEPATHS_NOT_TO_RENAME: - if '/dist/' in file_path: + if 'webpack_bundles/' in file_path: content = content.replace( - dev_file_prefix + file_path[1:], - prod_file_prefix + file_path[1:]) + file_path, + prod_file_prefix + file_path) content = content.replace('version: default', '') if os.path.isfile(APP_YAML_FILEPATH): os.remove(APP_YAML_FILEPATH) @@ -603,7 +603,8 @@ def build_third_party_libs(third_party_directory_path): def build_using_webpack(): """Execute webpack build process. This takes all TypeScript files we have in /templates/dev/head and generates JS bundles according the require() imports - and also compiles HTML pages into the /templates/dev/head/dist folder. + and also compiles HTML pages into the /backend_prod_files/webpack_bundles + folder. The files are later copied into /build/webpack_bundles. The settings for this are specified in webpack.prod.config.ts. """ @@ -689,7 +690,8 @@ def generate_copy_tasks_to_copy_from_source_to_target( source_path.endswith(p) for p in FILE_EXTENSIONS_TO_IGNORE): target_path = source_path relative_path = os.path.relpath(source_path, source) - if hash_should_be_inserted(source + relative_path): + if (hash_should_be_inserted(source + relative_path) and + relative_path in file_hashes): relative_path = ( _insert_hash(relative_path, file_hashes[relative_path])) @@ -807,7 +809,7 @@ def filter_hashes(file_hashes): return filtered_hashes -def get_hashes_json_file_contents(file_hashes): +def save_hashes_to_file(file_hashes): """Return JS code that loads hashes needed for frontend into variable. Args: @@ -820,8 +822,11 @@ def get_hashes_json_file_contents(file_hashes): # Only some of the hashes are needed in the frontend. filtered_hashes = filter_hashes(file_hashes) - hashes_json = json.dumps(filtered_hashes) - return 'var hashes = JSON.parse(\'%s\');' % (hashes_json) + ensure_directory_exists(HASHES_TS_FILEPATH) + with python_utils.open_file(HASHES_TS_FILEPATH, 'w+') as hashes_json_file: + hashes_json_file.write( + unicode(json.dumps(filtered_hashes, ensure_ascii=False))) + hashes_json_file.write(u'\n') def minify_func(source_path, target_path, file_hashes, filename): @@ -1138,6 +1143,8 @@ def _verify_filepath_hash(relative_filepath, file_hashes): hash_string_from_filename = filename_partitions[-2] # Ensure hash string obtained from filename follows MD5 hash format. if not re.search(r'([a-fA-F\d]{32})', relative_filepath): + if relative_filepath not in file_hashes: + return raise ValueError( '%s is expected to contain MD5 hash' % relative_filepath) if hash_string_from_filename not in file_hashes.values(): @@ -1173,7 +1180,7 @@ def _verify_hashes(output_dirnames, file_hashes): _verify_filepath_hash(relative_filepath, file_hashes) hash_final_filename = _insert_hash( - HASHES_JS_FILENAME, file_hashes[HASHES_JS_FILENAME]) + HASHES_TS_FILENAME, file_hashes[HASHES_TS_FILENAME]) third_party_js_final_filename = _insert_hash( MINIFIED_THIRD_PARTY_JS_RELATIVE_FILEPATH, @@ -1191,19 +1198,13 @@ def _verify_hashes(output_dirnames, file_hashes): THIRD_PARTY_GENERATED_OUT_DIR, third_party_css_final_filename)]) -def generate_build_directory(): - """Generates hashes for files. Minifies files and interpolates paths - in HTMLs to include hashes. Renames the files to include hashes and copies - them into build directory. - """ - python_utils.PRINT('Building Oppia in production mode...') +def generate_hashes(): + """Generates hashes for files.""" # The keys for hashes are filepaths relative to the subfolders of the future # /build folder. This is so that the replacing inside the HTML files works # correctly. hashes = dict() - build_tasks = collections.deque() - copy_tasks = collections.deque() # Create hashes for all directories and files. HASH_DIRS = [ @@ -1214,16 +1215,27 @@ def generate_build_directory(): THIRD_PARTY_GENERATED_DEV_DIR] for HASH_DIR in HASH_DIRS: hashes.update(get_file_hashes(HASH_DIR)) + # Save hashes as JSON and write the JSON into JS file # to make the hashes available to the frontend. - ensure_directory_exists(HASHES_JS_FILEPATH) - with python_utils.open_file(HASHES_JS_FILEPATH, 'w+') as hashes_js_file: - write_to_file_stream( - hashes_js_file, get_hashes_json_file_contents(hashes)) - # Update hash dict with newly created hashes.js. - hashes.update({HASHES_JS_FILENAME: generate_md5_hash(HASHES_JS_FILEPATH)}) + save_hashes_to_file(hashes) + + # Update hash dict with newly created hashes.json. + hashes.update({HASHES_TS_FILENAME: generate_md5_hash(HASHES_TS_FILEPATH)}) # Make sure /assets/hashes.js is available to the frontend. - _ensure_files_exist([HASHES_JS_FILEPATH]) + _ensure_files_exist([HASHES_TS_FILEPATH]) + return hashes + + +def generate_build_directory(hashes): + """Generates hashes for files. Minifies files and interpolates paths + in HTMLs to include hashes. Renames the files to include hashes and copies + them into build directory. + """ + python_utils.PRINT('Building Oppia in production mode...') + + build_tasks = collections.deque() + copy_tasks = collections.deque() # Build files in /extensions and copy them into staging directory. build_tasks += generate_build_tasks_to_build_directory( @@ -1237,11 +1249,12 @@ def generate_build_directory(): COPY_INPUT_DIRS = [ ASSETS_DEV_DIR, EXTENSIONS_DIRNAMES_TO_DIRPATHS['staging_dir'], TEMPLATES_CORE_DIRNAMES_TO_DIRPATHS['staging_dir'], - THIRD_PARTY_GENERATED_DEV_DIR] + THIRD_PARTY_GENERATED_DEV_DIR, + WEBPACK_DIRNAMES_TO_DIRPATHS['staging_dir']] COPY_OUTPUT_DIRS = [ ASSETS_OUT_DIR, EXTENSIONS_DIRNAMES_TO_DIRPATHS['out_dir'], TEMPLATES_CORE_DIRNAMES_TO_DIRPATHS['out_dir'], - THIRD_PARTY_GENERATED_OUT_DIR] + THIRD_PARTY_GENERATED_OUT_DIR, WEBPACK_DIRNAMES_TO_DIRPATHS['out_dir']] assert len(COPY_INPUT_DIRS) == len(COPY_OUTPUT_DIRS) for i in python_utils.RANGE(len(COPY_INPUT_DIRS)): safe_delete_directory_tree(COPY_OUTPUT_DIRS[i]) @@ -1260,6 +1273,11 @@ def generate_build_directory(): _compare_file_count( SOURCE_DIRS_FOR_THIRD_PARTY, OUTPUT_DIRS_FOR_THIRD_PARTY) + SOURCE_DIRS_FOR_WEBPACK = [WEBPACK_DIRNAMES_TO_DIRPATHS['staging_dir']] + OUTPUT_DIRS_FOR_WEBPACK = [WEBPACK_DIRNAMES_TO_DIRPATHS['out_dir']] + _compare_file_count( + SOURCE_DIRS_FOR_WEBPACK, OUTPUT_DIRS_FOR_WEBPACK) + SOURCE_DIRS_FOR_EXTENSIONS = [ EXTENSIONS_DIRNAMES_TO_DIRPATHS['dev_dir'], EXTENSIONS_DIRNAMES_TO_DIRPATHS['compiled_js_dir']] @@ -1273,8 +1291,7 @@ def generate_build_directory(): TEMPLATES_CORE_DIRNAMES_TO_DIRPATHS['out_dir']] _compare_file_count(SOURCE_DIRS_FOR_TEMPLATES, OUTPUT_DIRS_FOR_TEMPLATES) - # Clean up un-hashed hashes.js. - safe_delete_file(HASHES_JS_FILEPATH) + save_hashes_to_file(dict()) python_utils.PRINT('Build completed.') @@ -1360,11 +1377,14 @@ def build(): raise Exception( 'minify_third_party_libs_only should not be set in non-prod mode.') if options.prod_mode: - build_using_webpack() minify_third_party_libs(THIRD_PARTY_GENERATED_DEV_DIR) + hashes = generate_hashes() + build_using_webpack() generate_app_yaml() if not options.minify_third_party_libs_only: - generate_build_directory() + generate_build_directory(hashes) + else: + save_hashes_to_file(dict()) # The 'no coverage' pragma is used as this line is un-testable. This is because diff --git a/scripts/build_test.py b/scripts/build_test.py index df9cdef6a0c8..4c77308ef845 100644 --- a/scripts/build_test.py +++ b/scripts/build_test.py @@ -221,6 +221,10 @@ def test_verify_filepath_hash(self): ValueError, '%s is expected to contain MD5 hash' % base_filename): build._verify_filepath_hash(base_filename, file_hashes) + base_without_hash_filename = 'base_without_hash.html' + self.assertIsNone(build._verify_filepath_hash( + base_without_hash_filename, file_hashes)) + bad_filepath = 'README' with self.assertRaisesRegexp( ValueError, 'Filepath has less than 2 partitions after splitting'): @@ -470,22 +474,28 @@ def test_filter_hashes(self): self.assertNotIn('/path/path/file.js', filtered_hashes) self.assertNotIn('/file.html', filtered_hashes) - def test_get_hashes_json_file_contents(self): - """Test get_hashes_json_file_contents parses provided hash dict - correctly to JSON format. + def test_save_hashes_to_file(self): + """Test save_hashes_to_file saves provided hash dict correctly to + JSON file. """ + hashes_path = os.path.join(MOCK_ASSETS_OUT_DIR, 'hashes.json') + # Set constant to provide everything to frontend. with self.swap(build, 'FILEPATHS_PROVIDED_TO_FRONTEND', ('*',)): - hashes = {'path/file.js': '123456'} - self.assertEqual( - build.get_hashes_json_file_contents(hashes), - 'var hashes = JSON.parse(\'{"/path/file.js": "123456"}\');') - - hashes = {'file.js': '123456', 'file.min.js': '654321'} - self.assertEqual( - build.get_hashes_json_file_contents(hashes), - ('var hashes = JSON.parse(\'{"/file.min.js": "654321", ' - '"/file.js": "123456"}\');')) + with self.swap(build, 'HASHES_TS_FILEPATH', hashes_path): + hashes = {'path/file.js': '123456'} + build.save_hashes_to_file(hashes) + with python_utils.open_file(hashes_path, 'r') as hashes_file: + self.assertEqual( + hashes_file.read(), '{"/path/file.js": "123456"}\n') + + hashes = {'file.js': '123456', 'file.min.js': '654321'} + build.save_hashes_to_file(hashes) + with python_utils.open_file(hashes_path, 'r') as hashes_file: + self.assertEqual( + hashes_file.read(), + '{"/file.min.js": "654321", "/file.js": "123456"}\n') + os.remove(hashes_path) def test_execute_tasks(self): """Test _execute_tasks joins all threads after executing all tasks.""" diff --git a/scripts/pre_commit_linter.py b/scripts/pre_commit_linter.py index 370f964cce39..7d0d9a57c901 100644 --- a/scripts/pre_commit_linter.py +++ b/scripts/pre_commit_linter.py @@ -108,8 +108,8 @@ 'core/tests/protractor.conf.js', 'core/tests/karma.conf.ts', 'core/templates/dev/head/mathjaxConfig.ts', - 'assets/constants.js', - 'assets/rich_text_components_definitions.js') + 'assets/constants.ts', + 'assets/rich_text_components_definitions.ts') BAD_PATTERNS = { '__author__': { @@ -489,7 +489,7 @@ REQUIRED_STRINGS_CONSTANTS = { 'DEV_MODE: true': { - 'message': 'Please set the DEV_MODE variable in constants.js' + 'message': 'Please set the DEV_MODE variable in constants.ts' 'to true before committing.', 'excluded_files': () } @@ -517,8 +517,8 @@ 'core/tests/protractor.conf.js', 'core/tests/karma.conf.ts', 'core/templates/dev/head/mathjaxConfig.ts', - 'assets/constants.js', - 'assets/rich_text_components_definitions.js', + 'assets/constants.ts', + 'assets/rich_text_components_definitions.ts', 'webpack.config.ts', 'webpack.dev.config.ts', 'webpack.prod.config.ts') @@ -1530,7 +1530,7 @@ def _check_bad_patterns(self): failed = failed or temp_failed total_error_count += temp_count - if filepath == 'constants.js': + if filepath == 'constants.ts': for pattern in REQUIRED_STRINGS_CONSTANTS: if pattern not in file_content: failed = True diff --git a/scripts/run_backend_tests.sh b/scripts/run_backend_tests.sh index 4eb90853a28d..a01202dca302 100755 --- a/scripts/run_backend_tests.sh +++ b/scripts/run_backend_tests.sh @@ -85,8 +85,14 @@ for arg in "$@"; do fi done +$PYTHON_CMD scripts/build.py + +# Compile typescript files +echo "Compiling typescript..." +$NODE_MODULE_DIR/typescript/bin/tsc --project . + echo "Compiling webpack..." -$NODE_MODULE_DIR/webpack/bin/webpack.js --config webpack.prod.config.ts +$NODE_MODULE_DIR/webpack/bin/webpack.js --config webpack.dev.config.ts $PYTHON_CMD scripts/backend_tests.py $@ diff --git a/scripts/run_e2e_tests.sh b/scripts/run_e2e_tests.sh index 49b483292b9d..88e600fe446d 100755 --- a/scripts/run_e2e_tests.sh +++ b/scripts/run_e2e_tests.sh @@ -103,12 +103,12 @@ fi trap cleanup EXIT # Argument passed to feconf.py to help choose production templates folder. -FORCE_PROD_MODE=False +DEV_MODE=true RUN_ON_BROWSERSTACK=False for arg in "$@"; do # Used to emulate running Oppia in a production environment. if [ "$arg" == "--prod_env" ]; then - FORCE_PROD_MODE=True + DEV_MODE=false echo " Generating files for production mode..." fi @@ -119,20 +119,20 @@ for arg in "$@"; do fi done -if [[ "$FORCE_PROD_MODE" == "True" ]]; then - constants_env_variable="\"DEV_MODE\": false" - sed -i.bak -e s/"\"DEV_MODE\": .*"/"$constants_env_variable"/ assets/constants.js - $PYTHON_CMD scripts/build.py --prod_env - APP_YAML_FILEPATH="app.yaml" -else +if [[ "DEV_MODE" == "true" ]]; then constants_env_variable="\"DEV_MODE\": true" - sed -i.bak -e s/"\"DEV_MODE\": .*"/"$constants_env_variable"/ assets/constants.js + sed -i.bak -e s/"\"DEV_MODE\": .*"/"$constants_env_variable"/ assets/constants.ts $PYTHON_CMD scripts/build.py APP_YAML_FILEPATH="app_dev.yaml" +else + constants_env_variable="\"DEV_MODE\": false" + sed -i.bak -e s/"\"DEV_MODE\": .*"/"$constants_env_variable"/ assets/constants.ts + $PYTHON_CMD scripts/build.py --prod_env + APP_YAML_FILEPATH="app.yaml" fi # Delete the modified feconf.py file(-i.bak) -rm assets/constants.js.bak +rm assets/constants.ts.bak # Start a selenium server using chromedriver 2.41. # The 'detach' option continues the flow once the server is up and runnning. @@ -209,14 +209,14 @@ done # TODO(bhenning): Figure out if this is a bug with protractor. if [ "$RUN_ON_BROWSERSTACK" == "False" ]; then if [ "$SHARDING" = "false" ] || [ "$SHARD_INSTANCES" = "1" ]; then - $NODE_MODULE_DIR/protractor/bin/protractor core/tests/protractor.conf.js --suite "$SUITE" + $NODE_MODULE_DIR/protractor/bin/protractor core/tests/protractor.conf.js --suite "$SUITE" --params.devMode="$DEV_MODE" else - $NODE_MODULE_DIR/protractor/bin/protractor core/tests/protractor.conf.js --capabilities.shardTestFiles="$SHARDING" --capabilities.maxInstances=$SHARD_INSTANCES --suite "$SUITE" + $NODE_MODULE_DIR/protractor/bin/protractor core/tests/protractor.conf.js --capabilities.shardTestFiles="$SHARDING" --capabilities.maxInstances=$SHARD_INSTANCES --suite "$SUITE" --params.devMode="$DEV_MODE" fi else if [ "$SHARDING" = "false" ] || [ "$SHARD_INSTANCES" = "1" ]; then - $NODE_MODULE_DIR/protractor/bin/protractor core/tests/protractor-browserstack.conf.js --suite "$SUITE" + $NODE_MODULE_DIR/protractor/bin/protractor core/tests/protractor-browserstack.conf.js --suite "$SUITE" --params.devMode="$DEV_MODE" else - $NODE_MODULE_DIR/protractor/bin/protractor core/tests/protractor-browserstack.conf.js --capabilities.shardTestFiles="$SHARDING" --capabilities.maxInstances=$SHARD_INSTANCES --suite "$SUITE" + $NODE_MODULE_DIR/protractor/bin/protractor core/tests/protractor-browserstack.conf.js --capabilities.shardTestFiles="$SHARDING" --capabilities.maxInstances=$SHARD_INSTANCES --suite "$SUITE" --params.devMode="$DEV_MODE" fi fi diff --git a/scripts/start.sh b/scripts/start.sh index 07028f85ed13..92a0ed88267c 100755 --- a/scripts/start.sh +++ b/scripts/start.sh @@ -89,18 +89,18 @@ done if [[ "$FORCE_PROD_MODE" == "True" ]]; then constants_env_variable="\"DEV_MODE\": false" - sed -i.bak -e s/"\"DEV_MODE\": .*"/"$constants_env_variable"/ assets/constants.js + sed -i.bak -e s/"\"DEV_MODE\": .*"/"$constants_env_variable"/ assets/constants.ts $PYTHON_CMD scripts/build.py --prod_env --enable_watcher APP_YAML_FILEPATH="app.yaml" else constants_env_variable="\"DEV_MODE\": true" - sed -i.bak -e s/"\"DEV_MODE\": .*"/"$constants_env_variable"/ assets/constants.js + sed -i.bak -e s/"\"DEV_MODE\": .*"/"$constants_env_variable"/ assets/constants.ts $PYTHON_CMD scripts/build.py --enable_watcher APP_YAML_FILEPATH="app_dev.yaml" fi # Delete the modified feconf.py file(-i.bak) -rm assets/constants.js.bak +rm assets/constants.ts.bak # Set up a local dev instance. # TODO(sll): do this in a new shell. @@ -112,8 +112,8 @@ if ! [[ "$FORCE_PROD_MODE" == "True" ]]; then ($NODE_PATH/bin/node $NODE_MODULE_DIR/gulp/bin/gulp.js watch)& # In prod mode webpack is launched through scripts/build.py echo Compiling webpack... - $NODE_MODULE_DIR/webpack/bin/webpack.js --config webpack.dev.config.ts ($NODE_MODULE_DIR/webpack/bin/webpack.js --config webpack.dev.config.ts --watch)& + sleep 10 # Give webpack few seconds to do the initíal compilation fi echo Starting GAE development server (python $GOOGLE_APP_ENGINE_HOME/dev_appserver.py $CLEAR_DATASTORE_ARG $ENABLE_CONSOLE_ARG --admin_host 0.0.0.0 --admin_port 8000 --host 0.0.0.0 --port 8181 --skip_sdk_update_check true $APP_YAML_FILEPATH)& diff --git a/scripts/update_configs.py b/scripts/update_configs.py index 2188c4e532ad..e483b6a24615 100644 --- a/scripts/update_configs.py +++ b/scripts/update_configs.py @@ -34,7 +34,7 @@ CONSTANTS_CONFIG_PATH = os.path.join( os.getcwd(), os.pardir, 'release-scripts', 'constants_updates.config') LOCAL_FECONF_PATH = os.path.join(os.getcwd(), 'feconf.py') -LOCAL_CONSTANTS_PATH = os.path.join(os.getcwd(), 'assets', 'constants.js') +LOCAL_CONSTANTS_PATH = os.path.join(os.getcwd(), 'assets', 'constants.ts') def _apply_changes_based_on_config( @@ -86,7 +86,7 @@ def _apply_changes_based_on_config( def _update_configs(): - """Updates the 'feconf.py' and 'constants.js' files after doing the + """Updates the 'feconf.py' and 'constants.ts' files after doing the prerequisite checks. """ # Do prerequisite checks. diff --git a/tsconfig-for-compile-check.json b/tsconfig-for-compile-check.json index 9a4df9d1391d..7e2a6a766c7d 100644 --- a/tsconfig-for-compile-check.json +++ b/tsconfig-for-compile-check.json @@ -22,7 +22,16 @@ "interactions/*": ["extensions/interactions/*"] } }, - "files": ["assets/constants.js", "assets/rich_text_components_definitions.js", "core/tests/karma-globals.ts", "core/tests/karma.conf.ts"], + "files": [ + "assets/constants.ts", + "assets/rich_text_components_definitions.ts", + "core/tests/karma-globals.ts", + "core/tests/karma.conf.ts" + ], "include": ["core", "extensions", "typings"], - "exclude": ["core/tests", "core/templates/dev/head/dist"] + "exclude": [ + "core/tests", + "core/templates/dev/head/dist", + "core/templates/dev/head/google-analytics.initializer.ts" + ] } diff --git a/tsconfig.json b/tsconfig.json index 62b4fd86758d..a3e6fae64118 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,7 @@ "typeRoots": ["./node_modules/@types"], "experimentalDecorators": true, "emitDecoratorMetadata": true, + "allowSyntheticDefaultImports": true, "esModuleInterop": true, "baseUrl": ".", "paths": { @@ -24,12 +25,9 @@ }, "files_explanation": "These files are included separately since we still do not have webpack in extensions folder and these files are still included through scripts tags, so they need to be compiled separately.", "files": [ - "assets/constants.js", - "assets/rich_text_components_definitions.js", - "core/tests/karma-globals.ts", - "core/tests/karma.conf.ts", "core/templates/dev/head/mathjaxConfig.ts", - "core/templates/dev/head/expressions/ExpressionParserService.js" + "core/templates/dev/head/expressions/ExpressionParserService.js", + "core/tests/karma-globals.ts" ], "include_explanation": "The files in extensions/ckeditor_plugins are yet to be integrated into webpack (#6732).", "include": [ diff --git a/webpack.config.ts b/webpack.common.config.ts similarity index 88% rename from webpack.config.ts rename to webpack.common.config.ts index 7672bbfc0778..4ba24cd43a47 100644 --- a/webpack.config.ts +++ b/webpack.common.config.ts @@ -16,12 +16,13 @@ * @fileoverview General config file for Webpack. */ -var CleanWebpackPlugin = require('clean-webpack-plugin'); -var ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); -var HtmlWebpackPlugin = require('html-webpack-plugin'); - const CKEditorWebpackPlugin = require( - '@ckeditor/ckeditor5-dev-webpack-plugin' ); + '@ckeditor/ckeditor5-dev-webpack-plugin'); +const CleanWebpackPlugin = require('clean-webpack-plugin'); +const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const path = require('path'); +const { styles } = require('@ckeditor/ckeditor5-dev-utils/lib/'); var htmlMinifyConfig = { ignoreCustomFragments: [ @@ -29,7 +30,6 @@ var htmlMinifyConfig = { /<\{%[\s\S]*?%\}/, /<\[[\s\S]*?\]>/] }; - var commonPrefix = './core/templates/dev/head'; var defaultMeta = { name: 'Personalized Online Learning from Oppia', @@ -38,7 +38,21 @@ var defaultMeta = { }; module.exports = { - entries: { + resolve: { + modules: [ + path.resolve(__dirname, 'assets'), + path.resolve(__dirname, 'core/templates/dev/head'), + path.resolve(__dirname, 'extensions'), + path.resolve(__dirname, 'node_modules'), + path.resolve(__dirname, 'third_party') + ], + extensions: ['.ts', '.js', '.json', '.html', '.svg', '.png'], + alias: { + '@angular/upgrade/static': ( + '@angular/upgrade/bundles/upgrade-static.umd.js') + } + }, + entry: { about: commonPrefix + '/pages/about-page/about-page.scripts.ts', admin: commonPrefix + '/pages/admin-page/admin-page.scripts.ts', collection_editor: @@ -104,9 +118,6 @@ module.exports = { commonPrefix + '/pages/story-editor-page/story-editor-page.scripts.ts', story_viewer: commonPrefix + '/pages/story-viewer-page/story-viewer-page.scripts.ts', - subtopic_viewer: - commonPrefix + '/pages/subtopic-viewer-page/' + - 'subtopic-viewer-page.scripts.ts', teach: commonPrefix + '/pages/teach-page/teach-page.scripts.ts', terms: commonPrefix + '/pages/terms-page/terms-page.scripts.ts', thanks: commonPrefix + '/pages/thanks-page/thanks-page.scripts.ts', @@ -253,6 +264,13 @@ module.exports = { minify: htmlMinifyConfig, inject: false }), + new HtmlWebpackPlugin({ + chunks: ['error'], + filename: 'error-iframed.mainpage.html', + template: commonPrefix + '/pages/error-pages/error-iframed.mainpage.html', + minify: htmlMinifyConfig, + inject: false + }), new HtmlWebpackPlugin({ chunks: ['error'], filename: 'error-page.mainpage.html', @@ -561,6 +579,74 @@ module.exports = { minify: htmlMinifyConfig, inject: false }), - new ForkTsCheckerWebpackPlugin({ checkSyntacticErrors: true }) - ] + new CleanWebpackPlugin({ + cleanAfterEveryBuildPatterns: ['**/*', '!*.html'], + }), + new ForkTsCheckerWebpackPlugin({ + checkSyntacticErrors: true + }) + ], + module: { + rules: [{ + test: /ckeditor5-[^\/]+\/theme\/icons\/[^\/]+\.svg$/, + use: ['raw-loader'] + }, + { + test: /ckeditor5-[^\/]+\/theme\/[-\w\/]+\.css$/, + use: [{ + loader: 'style-loader', + options: { + singleton: true + } + }, + { + loader: 'postcss-loader', + options: styles.getPostCssConfig( { + themeImporter: { + themePath: require.resolve( '@ckeditor/ckeditor5-theme-lark' ) + }, + minify: true + }) + }, + ] + }, + { + test: /\.ts$/, + include: [ + path.resolve(__dirname, 'assets'), + path.resolve(__dirname, 'core/templates/dev/head'), + path.resolve(__dirname, 'extensions'), + path.resolve(__dirname, 'typings') + ], + use: [ + 'cache-loader', + 'thread-loader', + { + loader: 'ts-loader', + options: { + // this is needed for thread-loader to work correctly + happyPackMode: true + } + } + ] + }, + { + test: /\.html$/, + loader: 'underscore-template-loader' + }, + { + test: /\.css$/, + include: [ + path.resolve(__dirname, 'extensions'), + ], + use: ['style-loader', 'css-loader'] + }] + }, + optimization: { + splitChunks: { + chunks: 'all', + minSize: 1024 * 10, + maxInitialRequests: 9, + } + } }; diff --git a/webpack.dev.config.ts b/webpack.dev.config.ts index beda26bb6e8b..a19c9e8e460b 100644 --- a/webpack.dev.config.ts +++ b/webpack.dev.config.ts @@ -16,97 +16,19 @@ * @fileoverview Development environment config file for Webpack. */ -var commonWebpackConfig = require('./webpack.config.ts'); -var path = require('path'); +const merge = require('webpack-merge'); +const common = require('./webpack.common.config.ts'); +const path = require('path'); -const { styles } = require('@ckeditor/ckeditor5-dev-utils/lib/'); - -module.exports = { +module.exports = merge(common, { mode: 'development', - resolve: { - modules: [ - path.resolve(__dirname, 'core/templates/dev/head'), - path.resolve(__dirname, 'extensions'), - path.resolve(__dirname, 'node_modules'), - path.resolve(__dirname, 'third_party') - ], - extensions: ['.ts', '.js', '.json', '.html', '.svg', '.png'], - alias: { - '@angular/upgrade/static': ( - '@angular/upgrade/bundles/upgrade-static.umd.js') - } - }, - entry: commonWebpackConfig.entries, - plugins: commonWebpackConfig.plugins, - module: { - rules: [{ - test: /ckeditor5-[^\/]+\/theme\/icons\/[^\/]+\.svg$/, - use: ['raw-loader'] - }, - { - test: /ckeditor5-[^\/]+\/theme\/[-\w\/]+\.css$/, - use: [{ - loader: 'style-loader', - options: { - singleton: true - } - }, - { - loader: 'postcss-loader', - options: styles.getPostCssConfig( { - themeImporter: { - themePath: require.resolve( '@ckeditor/ckeditor5-theme-lark' ) - }, - minify: true - }) - }, - ] - }, - { - test: /\.ts$/, - include: [ - path.resolve(__dirname, 'core/templates/dev/head'), - path.resolve(__dirname, 'extensions'), - path.resolve(__dirname, 'typings') - ], - use: [ - 'cache-loader', - 'thread-loader', - { - loader: 'ts-loader', - options: { - // this is needed for thread-loader to work correctly - happyPackMode: true - } - } - ] - }, - { - test: /\.html$/, - loader: 'underscore-template-loader' - }, - { - test: /\.css$/, - include: [ - path.resolve(__dirname, 'extensions'), - ], - use: ['style-loader', 'css-loader'] - }] - }, output: { filename: '[name].bundle.js', - path: path.resolve(__dirname, 'core/templates/dev/head/dist') + path: path.resolve(__dirname, 'webpack_bundles') }, devtool: 'inline-source-map', - optimization: { - splitChunks: { - chunks: 'all', - minSize: 1024 * 10, - maxInitialRequests: 9, - } - }, watchOptions: { aggregateTimeout: 500, poll: 1000 } -}; +}); diff --git a/webpack.prod.config.ts b/webpack.prod.config.ts index 515408fe4c82..f6ce4156c535 100644 --- a/webpack.prod.config.ts +++ b/webpack.prod.config.ts @@ -16,92 +16,15 @@ * @fileoverview Production environment config file for Webpack. */ -var commonWebpackConfig = require('./webpack.config.ts'); -var path = require('path'); +const merge = require('webpack-merge'); +const common = require('./webpack.common.config.ts'); +const path = require('path'); -const { styles } = require('@ckeditor/ckeditor5-dev-utils/lib/'); - -module.exports = { +module.exports = merge(common, { mode: 'production', - resolve: { - modules: [ - path.resolve(__dirname, 'core/templates/dev/head'), - path.resolve(__dirname, 'extensions'), - path.resolve(__dirname, 'node_modules') - ], - extensions: ['.ts', '.js', '.json', '.html', '.svg', '.png'], - alias: { - '@angular/upgrade/static': ( - '@angular/upgrade/bundles/upgrade-static.umd.js') - } - }, - entry: commonWebpackConfig.entries, - plugins: commonWebpackConfig.plugins, - module: { - rules: [{ - test: /ckeditor5-[^\/]+\/theme\/icons\/[^\/]+\.svg$/, - use: ['raw-loader'] - }, - { - test: /ckeditor5-[^\/]+\/theme\/[-\w\/]+\.css$/, - use: [{ - loader: 'style-loader', - options: { - singleton: true - } - }, - { - loader: 'postcss-loader', - options: styles.getPostCssConfig( { - themeImporter: { - themePath: require.resolve( '@ckeditor/ckeditor5-theme-lark' ) - }, - minify: true - }) - }, - ] - }, - { - test: /\.ts$/, - include: [ - path.resolve(__dirname, 'core/templates/dev/head'), - path.resolve(__dirname, 'extensions'), - path.resolve(__dirname, 'typings') - ], - use: [ - 'cache-loader', - 'thread-loader', - { - loader: 'ts-loader', - options: { - // this is needed for thread-loader to work correctly - happyPackMode: true - } - } - ] - }, - { - test: /\.html$/, - loader: 'underscore-template-loader' - }, - { - test: /\.css$/, - include: [ - path.resolve(__dirname, 'extensions'), - ], - use: ['style-loader', 'css-loader'] - }] - }, output: { filename: '[name].[contenthash].bundle.js', - path: path.resolve(__dirname, 'core/templates/dev/head/dist') + path: path.resolve(__dirname, 'backend_prod_files/webpack_bundles') }, - devtool: 'source-map', - optimization: { - splitChunks: { - chunks: 'all', - minSize: 1024 * 10, - maxInitialRequests: 9, - } - } -}; + devtool: 'source-map' +});