From 6975f2b9733198bafcf1a73c30b348f4451bb533 Mon Sep 17 00:00:00 2001 From: Andrey Vlasov Date: Sat, 28 Mar 2020 23:03:10 +0300 Subject: [PATCH] add virtual module --- dist/index.js | 26 ++++++++++- nodemon.json | 3 -- package.json | 16 +------ src/apps.ts | 48 ++++++++++++++++++++ src/main.ts | 99 ++++++++++------------------------------- src/typings/import.d.ts | 4 +- src/virtual-module.ts | 12 +++++ webpack.config.js | 4 +- 8 files changed, 113 insertions(+), 99 deletions(-) delete mode 100644 nodemon.json create mode 100644 src/apps.ts create mode 100644 src/virtual-module.ts diff --git a/dist/index.js b/dist/index.js index edbae29..176ef57 100644 --- a/dist/index.js +++ b/dist/index.js @@ -225,6 +225,18 @@ eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn th /***/ }), +/***/ "./src/apps.ts": +/*!*********************!*\ + !*** ./src/apps.ts ***! + \*********************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass Apps extends Map {\n constructor(apps) {\n super();\n this.findApp = (path) => {\n const currentPath = [...this.keys()].reduce((memo, appRoute) => {\n const correctedAppRoute = appRoute.replace(/^\\/?/, '/');\n const correctedMemo = memo ? memo.replace(/^\\/?/, '/') : memo;\n return this.startWithPath(path, correctedAppRoute) && this.startWithPath(correctedAppRoute, correctedMemo)\n ? appRoute\n : memo;\n }, void 0);\n return (this.get(currentPath) || this.get('/') || {\n version: ''\n });\n };\n this.merge(apps);\n }\n merge(apps) {\n (Object.entries(apps).forEach(([path, options]) => this.set(path, options)));\n }\n startWithPath(path, subPath) {\n if (!subPath) {\n return true;\n }\n const pathItem = String(path).split('/');\n const subPathItems = String(subPath).split('/');\n return subPathItems.reduce((memo, appItem, index) => memo && pathItem[index] === appItem, true);\n }\n}\nexports.Apps = Apps;\n\n\n//# sourceURL=webpack://bootstrap/./src/apps.ts?"); + +/***/ }), + /***/ "./src/main.ts": /*!*********************!*\ !*** ./src/main.ts ***! @@ -233,7 +245,19 @@ eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn th /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__webpack_require__(/*! systemjs/dist/s */ \"./node_modules/systemjs/dist/s.js\");\n__webpack_require__(/*! systemjs/dist/extras/amd */ \"./node_modules/systemjs/dist/extras/amd.js\");\n__webpack_require__(/*! systemjs/dist/extras/named-register */ \"./node_modules/systemjs/dist/extras/named-register.js\");\n__webpack_require__(/*! systemjs/dist/extras/named-exports */ \"./node_modules/systemjs/dist/extras/named-exports.js\");\n__webpack_require__(/*! systemjs/dist/extras/transform */ \"./node_modules/systemjs/dist/extras/transform.js\");\nconst history_1 = __webpack_require__(/*! history */ \"./node_modules/history/esm/history.js\");\nconst systemJSImport = (requestUrl) => __awaiter(void 0, void 0, void 0, function* () {\n const { default: component, mount, unmount } = yield System.import(requestUrl);\n return { component, mount, unmount };\n});\nclass Apps extends Map {\n constructor(apps) {\n super();\n this.findApp = (path) => {\n const currentPath = [...this.keys()].reduce((memo, appRoute) => {\n const correctedAppRoute = appRoute.replace(/^\\/?/, '/');\n const correctedMemo = memo ? memo.replace(/^\\/?/, '/') : memo;\n return this.startWithPath(path, correctedAppRoute) && this.startWithPath(correctedAppRoute, correctedMemo)\n ? appRoute\n : memo;\n }, void 0);\n return (this.get(currentPath) || this.get('/') || {\n version: ''\n });\n };\n this.merge(apps);\n }\n merge(apps) {\n (Object.entries(apps).forEach(([path, options]) => this.set(path, options)));\n }\n startWithPath(path, subPath) {\n if (!subPath) {\n return true;\n }\n const pathItem = String(path).split('/');\n const subPathItems = String(subPath).split('/');\n return subPathItems.reduce((memo, appItem, index) => memo && pathItem[index] === appItem, true);\n }\n}\nconst defaultNavigations = {\n login: '/login',\n main: '/main',\n news: '/news',\n org: '/org',\n sections: '/sections',\n 'news.details': '/news/{{id}}',\n 'org.details': '/org/{{name}}',\n 'sections.details': '/sections/{{name}}'\n};\nconst defaultApps = {\n login: { version: '1.0.0' },\n main: { version: '1.0.1', name: 'main' },\n news: { version: '1.0.0' },\n org: { version: '1.0.0' },\n sections: { version: '1.0.0' }\n};\nexports.default = ({ apps: rowApps, navigations, config }) => __awaiter(void 0, void 0, void 0, function* () {\n const apps = new Apps(rowApps);\n const history = history_1.createBrowserHistory();\n let prevPathname = window.location.pathname;\n const app = apps.findApp(history.location.pathname);\n const publicPath = `/${app.name}/${app.version}`;\n __webpack_require__.p = `${config.baseUrl}${publicPath}${__webpack_require__.p}`;\n const appPath = `${config.baseUrl}${publicPath}/index.js`;\n const { component, mount, unmount } = yield systemJSImport(appPath);\n mount(component.default);\n history.listen((location) => {\n if (location.pathname !== prevPathname) {\n prevPathname = location.pathname;\n unmount();\n }\n });\n});\n\n\n//# sourceURL=webpack://bootstrap/./src/main.ts?"); +eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__webpack_require__(/*! systemjs/dist/s */ \"./node_modules/systemjs/dist/s.js\");\n__webpack_require__(/*! systemjs/dist/extras/amd */ \"./node_modules/systemjs/dist/extras/amd.js\");\n__webpack_require__(/*! systemjs/dist/extras/named-register */ \"./node_modules/systemjs/dist/extras/named-register.js\");\n__webpack_require__(/*! systemjs/dist/extras/named-exports */ \"./node_modules/systemjs/dist/extras/named-exports.js\");\n__webpack_require__(/*! systemjs/dist/extras/transform */ \"./node_modules/systemjs/dist/extras/transform.js\");\nconst history_1 = __webpack_require__(/*! history */ \"./node_modules/history/esm/history.js\");\nconst apps_1 = __webpack_require__(/*! ./apps */ \"./src/apps.ts\");\nconst virtual_module_1 = __webpack_require__(/*! ./virtual-module */ \"./src/virtual-module.ts\");\nconst systemJSImport = (requestUrl) => __awaiter(void 0, void 0, void 0, function* () {\n const { default: component, mount, unmount } = yield System.import(requestUrl);\n return { component, mount, unmount };\n});\n// const defaultNavigations = {\n// login: '/login',\n// main: '/main',\n// news: '/news',\n// org: '/org',\n// sections: '/sections',\n// 'news.details': '/news/{{id}}',\n// 'org.details': '/org/{{name}}',\n// 'sections.details': '/sections/{{name}}'\n// }\n// const defaultApps = {\n// login: { version: '1.0.0', name: 'login' },\n// main: { version: '1.0.1', name: 'main' },\n// news: { version: '1.0.0', name: 'news' },\n// org: { version: '1.0.0', name: 'org' },\n// sections: { version: '1.0.0', name: 'sections' }\n// }\nexports.default = ({ apps: rawApps, navigations, config }) => __awaiter(void 0, void 0, void 0, function* () {\n virtual_module_1.defineVirtualModule({ navigations, config });\n const apps = new apps_1.Apps(rawApps);\n const history = history_1.createBrowserHistory();\n let prevPathname = window.location.pathname;\n const app = apps.findApp(history.location.pathname);\n const publicPath = `/${app.name}/${app.version}`;\n __webpack_require__.p = `${config.baseUrl}${publicPath}${__webpack_require__.p}`;\n const appPath = `${config.baseUrl}${publicPath}/index.js`;\n const { component, mount, unmount } = yield systemJSImport(appPath);\n mount(component.default);\n history.listen((location) => {\n if (location.pathname !== prevPathname) {\n prevPathname = location.pathname;\n unmount();\n }\n });\n});\n\n\n//# sourceURL=webpack://bootstrap/./src/main.ts?"); + +/***/ }), + +/***/ "./src/virtual-module.ts": +/*!*******************************!*\ + !*** ./src/virtual-module.ts ***! + \*******************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("/* WEBPACK VAR INJECTION */(function(global) {\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defineVirtualModule = (params) => {\n const virtualModule = createVirtualModule(params);\n // @ts-ignore\n global.define('root.scope.env', [], virtualModule);\n};\nconst createVirtualModule = ({ config, navigations }) => ({\n getConfig: () => config,\n getConfigValue: (key) => config[key],\n getNavigations: () => navigations,\n getNavigationsValue: (key) => navigations[key],\n});\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack://bootstrap/./src/virtual-module.ts?"); /***/ }) diff --git a/nodemon.json b/nodemon.json deleted file mode 100644 index ece24dc..0000000 --- a/nodemon.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "watch": ["stubs/"] - } \ No newline at end of file diff --git a/package.json b/package.json index d1055ec..9654d02 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "inno-bootstrap", + "name": "fire.app", "version": "1.0.0", "description": "", "main": "index.js", @@ -12,34 +12,20 @@ "license": "MIT", "devDependencies": { "@types/node": "13.7.0", - "@types/react": "16.9.19", - "@types/react-dom": "16.9.5", - "@types/react-redux": "7.1.7", "@types/systemjs": "6.1.0", "awesome-typescript-loader": "5.2.1", "clean-webpack-plugin": "3.0.0", - "copy-webpack-plugin": "5.1.1", "es6-promise": "4.2.8", "exports-loader": "0.7.0", - "express": "4.17.1", "fbjs": "1.0.0", "file-loader": "5.0.2", "history": "4.10.1", "imports-loader": "0.8.0", - "redux-devtools-extension": "2.13.8", "rimraf": "3.0.1", "systemjs": "6.2.2", "typescript": "3.7.5", - "uds-news-original": "0.1.1", - "uds-sections-origin": "1.0.1", "webpack": "4.41.5", "webpack-cli": "3.3.10", - "webpack-dev-middleware": "3.7.2", - "webpack-hot-client": "4.1.2", "whatwg-fetch": "3.0.0" - }, - "dependencies": { - "react": "16.12.0", - "react-dom": "16.12.0" } } diff --git a/src/apps.ts b/src/apps.ts new file mode 100644 index 0000000..09b3a61 --- /dev/null +++ b/src/apps.ts @@ -0,0 +1,48 @@ +export class Apps extends Map { + + constructor(apps) { + super() + this.merge(apps) + } + + merge(apps) { + (Object.entries( + apps + ).forEach(([path, options]) => + this.set(path, options) + )) + } + + startWithPath(path, subPath) { + if (!subPath) { + return true; + } + + const pathItem = String(path).split('/'); + const subPathItems = String(subPath).split('/') + + return subPathItems.reduce( + (memo, appItem, index) => memo && pathItem[index] === appItem, + true + ) + } + + findApp = (path) => { + const currentPath = [...this.keys()].reduce( + (memo, appRoute) => { + const correctedAppRoute = appRoute.replace(/^\/?/, '/') + const correctedMemo = memo ? memo.replace(/^\/?/, '/') : memo + return this.startWithPath(path, correctedAppRoute) && this.startWithPath(correctedAppRoute, correctedMemo) + ? appRoute + : memo + }, void 0 + ) + + return ( + this.get(currentPath) || this.get('/') || { + version: '' + } + ) + } + + } \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 178cd49..73dfbc4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,12 +4,8 @@ import "systemjs/dist/extras/named-register"; import "systemjs/dist/extras/named-exports"; import "systemjs/dist/extras/transform"; import { createBrowserHistory } from 'history' - -declare var System: { - import(string): Promise -} - -declare var __webpack_public_path__: string; +import { Apps } from './apps' +import { defineVirtualModule } from './virtual-module' const systemJSImport = async (requestUrl: string) => { const { default: component, mount, unmount } = await System.import( @@ -18,85 +14,37 @@ const systemJSImport = async (requestUrl: string) => { return { component, mount, unmount } } -class Apps extends Map { +// const defaultNavigations = { +// login: '/login', +// main: '/main', +// news: '/news', +// org: '/org', +// sections: '/sections', +// 'news.details': '/news/{{id}}', +// 'org.details': '/org/{{name}}', +// 'sections.details': '/sections/{{name}}' +// } - constructor(apps) { - super() - this.merge(apps) - } +// const defaultApps = { +// login: { version: '1.0.0', name: 'login' }, +// main: { version: '1.0.1', name: 'main' }, +// news: { version: '1.0.0', name: 'news' }, +// org: { version: '1.0.0', name: 'org' }, +// sections: { version: '1.0.0', name: 'sections' } +// } - merge(apps) { - (Object.entries( - apps - ).forEach(([path, options]) => - this.set(path, options) - )) - } +export default async ({ apps: rawApps, navigations, config }) => { + defineVirtualModule({navigations, config}) - startWithPath(path, subPath) { - if (!subPath) { - return true; - } + const apps = new Apps(rawApps) - const pathItem = String(path).split('/'); - const subPathItems = String(subPath).split('/') - - return subPathItems.reduce( - (memo, appItem, index) => memo && pathItem[index] === appItem, - true - ) - } - - findApp = (path) => { - const currentPath = [...this.keys()].reduce( - (memo, appRoute) => { - const correctedAppRoute = appRoute.replace(/^\/?/, '/') - const correctedMemo = memo ? memo.replace(/^\/?/, '/') : memo - return this.startWithPath(path, correctedAppRoute) && this.startWithPath(correctedAppRoute, correctedMemo) - ? appRoute - : memo - }, void 0 - ) - - return ( - this.get(currentPath) || this.get('/') || { - version: '' - } - ) - } - -} - - - -const defaultNavigations = { - login: '/login', - main: '/main', - news: '/news', - org: '/org', - sections: '/sections', - 'news.details': '/news/{{id}}', - 'org.details': '/org/{{name}}', - 'sections.details': '/sections/{{name}}' -} - -const defaultApps = { - login: { version: '1.0.0', name: 'login' }, - main: { version: '1.0.1', name: 'main' }, - news: { version: '1.0.0', name: 'news' }, - org: { version: '1.0.0', name: 'org' }, - sections: { version: '1.0.0', name: 'sections' } -} - -export default async ({ apps: rowApps, navigations, config }) => { - const apps = new Apps(rowApps) const history = createBrowserHistory() let prevPathname = window.location.pathname const app = apps.findApp(history.location.pathname) - const publicPath = `/${app.name}/${app.version}` + const publicPath = `/${app.name}/${app.version}` __webpack_public_path__ = `${config.baseUrl}${publicPath}${__webpack_public_path__}` @@ -106,7 +54,6 @@ export default async ({ apps: rowApps, navigations, config }) => { mount(component.default); - history.listen((location) => { if (location.pathname !== prevPathname) { prevPathname = location.pathname diff --git a/src/typings/import.d.ts b/src/typings/import.d.ts index 18834a2..6a98335 100644 --- a/src/typings/import.d.ts +++ b/src/typings/import.d.ts @@ -16,4 +16,6 @@ declare module '*.png' { declare module '*.mp4' { const value: any; export = value; -} \ No newline at end of file +} + +declare var __webpack_public_path__: string; \ No newline at end of file diff --git a/src/virtual-module.ts b/src/virtual-module.ts new file mode 100644 index 0000000..d1cf947 --- /dev/null +++ b/src/virtual-module.ts @@ -0,0 +1,12 @@ +export const defineVirtualModule = (params) => { + const virtualModule = createVirtualModule(params) + // @ts-ignore + global.define('root.scope.env', [], virtualModule) +} + +const createVirtualModule = ({config, navigations}) => ({ + getConfig: () => config, + getConfigValue: (key) => config[key], + getNavigations: () => navigations, + getNavigationsValue: (key) => navigations[key], +}) \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index fe1e727..ff8fac3 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,5 +1,3 @@ -const webpackCopy = require('copy-webpack-plugin'); -const webpack = require('webpack'); const path = require('path'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); @@ -22,7 +20,7 @@ module.exports = { plugins: [new CleanWebpackPlugin()], resolve: { - extensions: [".jsx", ".js"] + extensions: [".ts", ".js"] }, module: {