├── .gitignore ├── coders-app1 ├── .eslintrc ├── .prettierignore ├── babel.config.json ├── jest.config.js ├── package.json ├── src │ ├── coders-app1.tsx │ ├── declarations.d.ts │ ├── root.component.test.tsx │ └── root.component.tsx ├── tsconfig.json ├── webpack.config.js └── yarn.lock ├── coders-app2 ├── .eslintrc ├── .prettierignore ├── babel.config.json ├── jest.config.js ├── package.json ├── src │ ├── coders-app2.tsx │ ├── declarations.d.ts │ ├── root.component.test.tsx │ └── root.component.tsx ├── tsconfig.json ├── webpack.config.js └── yarn.lock ├── coders-header ├── .eslintrc ├── .prettierignore ├── babel.config.json ├── jest.config.js ├── package.json ├── src │ ├── coders-header.tsx │ ├── declarations.d.ts │ ├── root.component.test.tsx │ └── root.component.tsx ├── tsconfig.json ├── webpack.config.js └── yarn.lock ├── coders-loading ├── .eslintrc ├── .prettierignore ├── babel.config.json ├── jest.config.js ├── package.json ├── src │ ├── coders-loading.tsx │ ├── declarations.d.ts │ ├── root.component.test.tsx │ └── root.component.tsx ├── tsconfig.json ├── webpack.config.js └── yarn.lock ├── coders-root-config ├── .eslintrc ├── .gitignore ├── .prettierignore ├── babel.config.json ├── package-lock.json ├── package.json ├── public │ └── template │ │ ├── base-layout.html │ │ └── other-layout.html ├── src │ ├── coders-root-config.ts │ ├── declarations.d.ts │ ├── index.ejs │ └── microfrontend-layout.html ├── tsconfig.json ├── webpack.config.js └── yarn.lock └── coders-utility ├── .eslintrc ├── .gitignore ├── .prettierignore ├── babel.config.json ├── jest.config.js ├── package.json ├── src ├── coders-utility.ts └── declarations.d.ts ├── tsconfig.json ├── webpack.config.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | **/node_modules 2 | **/.vscode 3 | **/.env 4 | -------------------------------------------------------------------------------- /coders-app1/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "ts-react-important-stuff", 4 | "plugin:prettier/recommended" 5 | ], 6 | "parser": "@babel/eslint-parser" 7 | } 8 | -------------------------------------------------------------------------------- /coders-app1/.prettierignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | .prettierignore 3 | yarn.lock 4 | yarn-error.log 5 | package-lock.json 6 | dist 7 | coverage 8 | pnpm-lock.yaml -------------------------------------------------------------------------------- /coders-app1/babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-env", 4 | [ 5 | "@babel/preset-react", 6 | { 7 | "runtime": "automatic" 8 | } 9 | ], 10 | "@babel/preset-typescript" 11 | ], 12 | "plugins": [ 13 | [ 14 | "@babel/plugin-transform-runtime", 15 | { 16 | "useESModules": true, 17 | "regenerator": false 18 | } 19 | ] 20 | ], 21 | "env": { 22 | "test": { 23 | "presets": [ 24 | ["@babel/preset-env", { 25 | "targets": "current node" 26 | }] 27 | ] 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /coders-app1/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | rootDir: "src", 3 | testEnvironment: "jsdom", 4 | transform: { 5 | "^.+\\.(j|t)sx?$": "babel-jest", 6 | }, 7 | moduleNameMapper: { 8 | "\\.(css)$": "identity-obj-proxy", 9 | "single-spa-react/parcel": "single-spa-react/lib/cjs/parcel.cjs", 10 | }, 11 | setupFilesAfterEnv: ["@testing-library/jest-dom"], 12 | }; 13 | -------------------------------------------------------------------------------- /coders-app1/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@coders/app1", 3 | "scripts": { 4 | "start": "webpack serve", 5 | "start:standalone": "webpack serve --env standalone", 6 | "build": "concurrently yarn:build:*", 7 | "build:webpack": "webpack --mode=production", 8 | "analyze": "webpack --mode=production --env analyze", 9 | "lint": "eslint src --ext js,ts,tsx", 10 | "format": "prettier --write .", 11 | "check-format": "prettier --check .", 12 | "test": "cross-env BABEL_ENV=test jest", 13 | "watch-tests": "cross-env BABEL_ENV=test jest --watch", 14 | "coverage": "cross-env BABEL_ENV=test jest --coverage", 15 | "build:types": "tsc" 16 | }, 17 | "devDependencies": { 18 | "@babel/core": "^7.15.0", 19 | "@babel/eslint-parser": "^7.15.0", 20 | "@babel/plugin-transform-runtime": "^7.15.0", 21 | "@babel/preset-env": "^7.15.0", 22 | "@babel/preset-react": "^7.14.5", 23 | "@babel/runtime": "^7.15.3", 24 | "@testing-library/jest-dom": "^5.14.1", 25 | "@testing-library/react": "^12.0.0", 26 | "babel-jest": "^27.0.6", 27 | "concurrently": "^6.2.1", 28 | "cross-env": "^7.0.3", 29 | "eslint": "^7.32.0", 30 | "eslint-config-prettier": "^8.3.0", 31 | "eslint-plugin-prettier": "^3.4.1", 32 | "identity-obj-proxy": "^3.0.0", 33 | "jest": "^27.0.6", 34 | "jest-cli": "^27.0.6", 35 | "prettier": "^2.3.2", 36 | "pretty-quick": "^3.1.1", 37 | "webpack": "^5.51.1", 38 | "webpack-cli": "^4.8.0", 39 | "webpack-config-single-spa-react": "^4.0.0", 40 | "webpack-dev-server": "^4.0.0", 41 | "webpack-merge": "^5.8.0", 42 | "@babel/preset-typescript": "^7.15.0", 43 | "typescript": "^4.3.5", 44 | "webpack-config-single-spa-ts": "^4.0.0", 45 | "ts-config-single-spa": "^3.0.0", 46 | "@types/testing-library__jest-dom": "^5.14.1", 47 | "eslint-config-ts-react-important-stuff": "^3.0.0", 48 | "webpack-config-single-spa-react-ts": "^4.0.0" 49 | }, 50 | "dependencies": { 51 | "react": "^17.0.2", 52 | "react-dom": "^17.0.2", 53 | "single-spa-react": "^4.3.1", 54 | "@types/jest": "^27.0.1", 55 | "@types/systemjs": "^6.1.1", 56 | "@types/webpack-env": "^1.16.2", 57 | "single-spa": "^5.9.3", 58 | "@types/react": "^17.0.19", 59 | "@types/react-dom": "^17.0.9" 60 | }, 61 | "types": "dist/coders-app1.d.ts" 62 | } 63 | -------------------------------------------------------------------------------- /coders-app1/src/coders-app1.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import singleSpaReact from "single-spa-react"; 4 | import Root from "./root.component"; 5 | 6 | const lifecycles = singleSpaReact({ 7 | React, 8 | ReactDOM, 9 | rootComponent: Root, 10 | errorBoundary(err, info, props) { 11 | // Customize the root error boundary for your microfrontend here. 12 | return null; 13 | }, 14 | }); 15 | 16 | export const { bootstrap, mount, unmount } = lifecycles; 17 | -------------------------------------------------------------------------------- /coders-app1/src/declarations.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.html" { 2 | const rawHtmlFile: string; 3 | export = rawHtmlFile; 4 | } 5 | 6 | declare module "*.bmp" { 7 | const src: string; 8 | export default src; 9 | } 10 | 11 | declare module "*.gif" { 12 | const src: string; 13 | export default src; 14 | } 15 | 16 | declare module "*.jpg" { 17 | const src: string; 18 | export default src; 19 | } 20 | 21 | declare module "*.jpeg" { 22 | const src: string; 23 | export default src; 24 | } 25 | 26 | declare module "*.png" { 27 | const src: string; 28 | export default src; 29 | } 30 | 31 | declare module "*.webp" { 32 | const src: string; 33 | export default src; 34 | } 35 | 36 | declare module "*.svg" { 37 | const src: string; 38 | export default src; 39 | } 40 | -------------------------------------------------------------------------------- /coders-app1/src/root.component.test.tsx: -------------------------------------------------------------------------------- 1 | import { render } from "@testing-library/react"; 2 | import Root from "./root.component"; 3 | 4 | describe("Root component", () => { 5 | it("should be in the document", () => { 6 | const { getByText } = render(); 7 | expect(getByText(/Testapp is mounted!/i)).toBeInTheDocument(); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /coders-app1/src/root.component.tsx: -------------------------------------------------------------------------------- 1 | import Parcel from "single-spa-react/parcel"; 2 | import { navigateToUrl } from "single-spa"; 3 | 4 | export default function Root(props) { 5 | return ( 6 |
7 |

App1

8 | 9 | 12 | System.import("@coders/loading")} parent="App1" /> 13 |
14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /coders-app1/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "ts-config-single-spa", 3 | "compilerOptions": { 4 | "jsx": "react-jsx", 5 | "declarationDir": "dist" 6 | }, 7 | "files": ["src/coders-app1.tsx"], 8 | "include": ["src/**/*"], 9 | "exclude": ["src/**/*.test*"] 10 | } 11 | -------------------------------------------------------------------------------- /coders-app1/webpack.config.js: -------------------------------------------------------------------------------- 1 | const { merge } = require("webpack-merge"); 2 | const singleSpaDefaults = require("webpack-config-single-spa-react-ts"); 3 | 4 | module.exports = (webpackConfigEnv, argv) => { 5 | const defaultConfig = singleSpaDefaults({ 6 | orgName: "coders", 7 | projectName: "app1", 8 | webpackConfigEnv, 9 | argv, 10 | }); 11 | 12 | return merge(defaultConfig, { 13 | devServer: { 14 | port: 8100, 15 | }, 16 | // modify the webpack config however you'd like to by adding to this object 17 | }); 18 | }; 19 | -------------------------------------------------------------------------------- /coders-app2/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "ts-react-important-stuff", 4 | "plugin:prettier/recommended" 5 | ], 6 | "parser": "@babel/eslint-parser" 7 | } 8 | -------------------------------------------------------------------------------- /coders-app2/.prettierignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | .prettierignore 3 | yarn.lock 4 | yarn-error.log 5 | package-lock.json 6 | dist 7 | coverage 8 | pnpm-lock.yaml -------------------------------------------------------------------------------- /coders-app2/babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-env", 4 | [ 5 | "@babel/preset-react", 6 | { 7 | "runtime": "automatic" 8 | } 9 | ], 10 | "@babel/preset-typescript" 11 | ], 12 | "plugins": [ 13 | [ 14 | "@babel/plugin-transform-runtime", 15 | { 16 | "useESModules": true, 17 | "regenerator": false 18 | } 19 | ] 20 | ], 21 | "env": { 22 | "test": { 23 | "presets": [ 24 | ["@babel/preset-env", { 25 | "targets": "current node" 26 | }] 27 | ] 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /coders-app2/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | rootDir: "src", 3 | testEnvironment: "jsdom", 4 | transform: { 5 | "^.+\\.(j|t)sx?$": "babel-jest", 6 | }, 7 | moduleNameMapper: { 8 | "\\.(css)$": "identity-obj-proxy", 9 | "single-spa-react/parcel": "single-spa-react/lib/cjs/parcel.cjs", 10 | }, 11 | setupFilesAfterEnv: ["@testing-library/jest-dom"], 12 | }; 13 | -------------------------------------------------------------------------------- /coders-app2/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@coders/app2", 3 | "scripts": { 4 | "start": "webpack serve", 5 | "start:standalone": "webpack serve --env standalone", 6 | "build": "concurrently yarn:build:*", 7 | "build:webpack": "webpack --mode=production", 8 | "analyze": "webpack --mode=production --env analyze", 9 | "lint": "eslint src --ext js,ts,tsx", 10 | "format": "prettier --write .", 11 | "check-format": "prettier --check .", 12 | "test": "cross-env BABEL_ENV=test jest", 13 | "watch-tests": "cross-env BABEL_ENV=test jest --watch", 14 | "coverage": "cross-env BABEL_ENV=test jest --coverage", 15 | "build:types": "tsc" 16 | }, 17 | "devDependencies": { 18 | "@babel/core": "^7.15.0", 19 | "@babel/eslint-parser": "^7.15.0", 20 | "@babel/plugin-transform-runtime": "^7.15.0", 21 | "@babel/preset-env": "^7.15.0", 22 | "@babel/preset-react": "^7.14.5", 23 | "@babel/runtime": "^7.15.3", 24 | "@testing-library/jest-dom": "^5.14.1", 25 | "@testing-library/react": "^12.0.0", 26 | "babel-jest": "^27.0.6", 27 | "concurrently": "^6.2.1", 28 | "cross-env": "^7.0.3", 29 | "eslint": "^7.32.0", 30 | "eslint-config-prettier": "^8.3.0", 31 | "eslint-plugin-prettier": "^3.4.1", 32 | "identity-obj-proxy": "^3.0.0", 33 | "jest": "^27.0.6", 34 | "jest-cli": "^27.0.6", 35 | "prettier": "^2.3.2", 36 | "pretty-quick": "^3.1.1", 37 | "webpack": "^5.51.1", 38 | "webpack-cli": "^4.8.0", 39 | "webpack-config-single-spa-react": "^4.0.0", 40 | "webpack-dev-server": "^4.0.0", 41 | "webpack-merge": "^5.8.0", 42 | "@babel/preset-typescript": "^7.15.0", 43 | "typescript": "^4.3.5", 44 | "webpack-config-single-spa-ts": "^4.0.0", 45 | "ts-config-single-spa": "^3.0.0", 46 | "@types/testing-library__jest-dom": "^5.14.1", 47 | "eslint-config-ts-react-important-stuff": "^3.0.0", 48 | "webpack-config-single-spa-react-ts": "^4.0.0" 49 | }, 50 | "dependencies": { 51 | "react": "^17.0.2", 52 | "react-dom": "^17.0.2", 53 | "single-spa-react": "^4.3.1", 54 | "@types/jest": "^27.0.1", 55 | "@types/systemjs": "^6.1.1", 56 | "@types/webpack-env": "^1.16.2", 57 | "single-spa": "^5.9.3", 58 | "@types/react": "^17.0.19", 59 | "@types/react-dom": "^17.0.9" 60 | }, 61 | "types": "dist/coders-app2.d.ts" 62 | } 63 | -------------------------------------------------------------------------------- /coders-app2/src/coders-app2.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import singleSpaReact from "single-spa-react"; 4 | import Root from "./root.component"; 5 | 6 | const lifecycles = singleSpaReact({ 7 | React, 8 | ReactDOM, 9 | rootComponent: Root, 10 | errorBoundary(err, info, props) { 11 | // Customize the root error boundary for your microfrontend here. 12 | return null; 13 | }, 14 | }); 15 | 16 | export const { bootstrap, mount, unmount } = lifecycles; 17 | -------------------------------------------------------------------------------- /coders-app2/src/declarations.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.html" { 2 | const rawHtmlFile: string; 3 | export = rawHtmlFile; 4 | } 5 | 6 | declare module "*.bmp" { 7 | const src: string; 8 | export default src; 9 | } 10 | 11 | declare module "*.gif" { 12 | const src: string; 13 | export default src; 14 | } 15 | 16 | declare module "*.jpg" { 17 | const src: string; 18 | export default src; 19 | } 20 | 21 | declare module "*.jpeg" { 22 | const src: string; 23 | export default src; 24 | } 25 | 26 | declare module "*.png" { 27 | const src: string; 28 | export default src; 29 | } 30 | 31 | declare module "*.webp" { 32 | const src: string; 33 | export default src; 34 | } 35 | 36 | declare module "*.svg" { 37 | const src: string; 38 | export default src; 39 | } 40 | 41 | declare module "@coders/utility"; 42 | -------------------------------------------------------------------------------- /coders-app2/src/root.component.test.tsx: -------------------------------------------------------------------------------- 1 | import { render } from "@testing-library/react"; 2 | import Root from "./root.component"; 3 | 4 | describe("Root component", () => { 5 | it("should be in the document", () => { 6 | const { getByText } = render(); 7 | expect(getByText(/Testapp is mounted!/i)).toBeInTheDocument(); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /coders-app2/src/root.component.tsx: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | import { useStore } from "@coders/utility"; 3 | 4 | import Parcel from "single-spa-react/parcel"; 5 | import { navigateToUrl } from "single-spa"; 6 | 7 | export default function Root(props) { 8 | const state = useStore(); 9 | return ( 10 |
11 |

APP2

12 |

Eu peguei o state sem o Parcel: {JSON.stringify(state.loading)}

13 | 14 | 17 | 18 | System.import("@coders/loading")} parent="App2" /> 19 |
20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /coders-app2/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "ts-config-single-spa", 3 | "compilerOptions": { 4 | "jsx": "react-jsx", 5 | "declarationDir": "dist" 6 | }, 7 | "files": ["src/coders-app2.tsx"], 8 | "include": ["src/**/*"], 9 | "exclude": ["src/**/*.test*"] 10 | } 11 | -------------------------------------------------------------------------------- /coders-app2/webpack.config.js: -------------------------------------------------------------------------------- 1 | const { merge } = require("webpack-merge"); 2 | const singleSpaDefaults = require("webpack-config-single-spa-react-ts"); 3 | 4 | module.exports = (webpackConfigEnv, argv) => { 5 | const defaultConfig = singleSpaDefaults({ 6 | orgName: "coders", 7 | projectName: "app2", 8 | webpackConfigEnv, 9 | argv, 10 | }); 11 | 12 | return merge(defaultConfig, { 13 | devServer: { 14 | port: 8200, 15 | }, 16 | externals: ["zustand", "zustand/middleware"], 17 | // modify the webpack config however you'd like to by adding to this object 18 | }); 19 | }; 20 | -------------------------------------------------------------------------------- /coders-header/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "ts-react-important-stuff", 4 | "plugin:prettier/recommended" 5 | ], 6 | "parser": "@babel/eslint-parser" 7 | } 8 | -------------------------------------------------------------------------------- /coders-header/.prettierignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | .prettierignore 3 | yarn.lock 4 | yarn-error.log 5 | package-lock.json 6 | dist 7 | coverage 8 | pnpm-lock.yaml -------------------------------------------------------------------------------- /coders-header/babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-env", 4 | [ 5 | "@babel/preset-react", 6 | { 7 | "runtime": "automatic" 8 | } 9 | ], 10 | "@babel/preset-typescript" 11 | ], 12 | "plugins": [ 13 | [ 14 | "@babel/plugin-transform-runtime", 15 | { 16 | "useESModules": true, 17 | "regenerator": false 18 | } 19 | ] 20 | ], 21 | "env": { 22 | "test": { 23 | "presets": [ 24 | ["@babel/preset-env", { 25 | "targets": "current node" 26 | }] 27 | ] 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /coders-header/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | rootDir: "src", 3 | testEnvironment: "jsdom", 4 | transform: { 5 | "^.+\\.(j|t)sx?$": "babel-jest", 6 | }, 7 | moduleNameMapper: { 8 | "\\.(css)$": "identity-obj-proxy", 9 | "single-spa-react/parcel": "single-spa-react/lib/cjs/parcel.cjs", 10 | }, 11 | setupFilesAfterEnv: ["@testing-library/jest-dom"], 12 | }; 13 | -------------------------------------------------------------------------------- /coders-header/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@coders/header", 3 | "scripts": { 4 | "start": "webpack serve", 5 | "start:standalone": "webpack serve --env standalone", 6 | "build": "concurrently yarn:build:*", 7 | "build:webpack": "webpack --mode=production", 8 | "analyze": "webpack --mode=production --env analyze", 9 | "lint": "eslint src --ext js,ts,tsx", 10 | "format": "prettier --write .", 11 | "check-format": "prettier --check .", 12 | "test": "cross-env BABEL_ENV=test jest", 13 | "watch-tests": "cross-env BABEL_ENV=test jest --watch", 14 | "coverage": "cross-env BABEL_ENV=test jest --coverage", 15 | "build:types": "tsc" 16 | }, 17 | "devDependencies": { 18 | "@babel/core": "^7.15.0", 19 | "@babel/eslint-parser": "^7.15.0", 20 | "@babel/plugin-transform-runtime": "^7.15.0", 21 | "@babel/preset-env": "^7.15.0", 22 | "@babel/preset-react": "^7.14.5", 23 | "@babel/runtime": "^7.15.3", 24 | "@testing-library/jest-dom": "^5.14.1", 25 | "@testing-library/react": "^12.0.0", 26 | "babel-jest": "^27.0.6", 27 | "concurrently": "^6.2.1", 28 | "cross-env": "^7.0.3", 29 | "eslint": "^7.32.0", 30 | "eslint-config-prettier": "^8.3.0", 31 | "eslint-plugin-prettier": "^3.4.1", 32 | "identity-obj-proxy": "^3.0.0", 33 | "jest": "^27.0.6", 34 | "jest-cli": "^27.0.6", 35 | "prettier": "^2.3.2", 36 | "pretty-quick": "^3.1.1", 37 | "webpack": "^5.51.1", 38 | "webpack-cli": "^4.8.0", 39 | "webpack-config-single-spa-react": "^4.0.0", 40 | "webpack-dev-server": "^4.0.0", 41 | "webpack-merge": "^5.8.0", 42 | "@babel/preset-typescript": "^7.15.0", 43 | "typescript": "^4.3.5", 44 | "webpack-config-single-spa-ts": "^4.0.0", 45 | "ts-config-single-spa": "^3.0.0", 46 | "@types/testing-library__jest-dom": "^5.14.1", 47 | "eslint-config-ts-react-important-stuff": "^3.0.0", 48 | "webpack-config-single-spa-react-ts": "^4.0.0" 49 | }, 50 | "dependencies": { 51 | "react": "^17.0.2", 52 | "react-dom": "^17.0.2", 53 | "single-spa-react": "^4.3.1", 54 | "@types/jest": "^27.0.1", 55 | "@types/systemjs": "^6.1.1", 56 | "@types/webpack-env": "^1.16.2", 57 | "single-spa": "^5.9.3", 58 | "@types/react": "^17.0.19", 59 | "@types/react-dom": "^17.0.9" 60 | }, 61 | "types": "dist/coders-header.d.ts" 62 | } 63 | -------------------------------------------------------------------------------- /coders-header/src/coders-header.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import singleSpaReact from "single-spa-react"; 4 | import Root from "./root.component"; 5 | 6 | const lifecycles = singleSpaReact({ 7 | React, 8 | ReactDOM, 9 | rootComponent: Root, 10 | errorBoundary(err, info, props) { 11 | // Customize the root error boundary for your microfrontend here. 12 | return null; 13 | }, 14 | }); 15 | 16 | export const { bootstrap, mount, unmount } = lifecycles; 17 | -------------------------------------------------------------------------------- /coders-header/src/declarations.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.html" { 2 | const rawHtmlFile: string; 3 | export = rawHtmlFile; 4 | } 5 | 6 | declare module "*.bmp" { 7 | const src: string; 8 | export default src; 9 | } 10 | 11 | declare module "*.gif" { 12 | const src: string; 13 | export default src; 14 | } 15 | 16 | declare module "*.jpg" { 17 | const src: string; 18 | export default src; 19 | } 20 | 21 | declare module "*.jpeg" { 22 | const src: string; 23 | export default src; 24 | } 25 | 26 | declare module "*.png" { 27 | const src: string; 28 | export default src; 29 | } 30 | 31 | declare module "*.webp" { 32 | const src: string; 33 | export default src; 34 | } 35 | 36 | declare module "*.svg" { 37 | const src: string; 38 | export default src; 39 | } 40 | -------------------------------------------------------------------------------- /coders-header/src/root.component.test.tsx: -------------------------------------------------------------------------------- 1 | import { render } from "@testing-library/react"; 2 | import Root from "./root.component"; 3 | 4 | describe("Root component", () => { 5 | it("should be in the document", () => { 6 | const { getByText } = render(); 7 | expect(getByText(/Testapp is mounted!/i)).toBeInTheDocument(); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /coders-header/src/root.component.tsx: -------------------------------------------------------------------------------- 1 | import { navigateToUrl } from "single-spa"; 2 | export default function Root(props) { 3 | return ( 4 |
5 |

HEADER

6 | 7 | 8 | 9 |
10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /coders-header/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "ts-config-single-spa", 3 | "compilerOptions": { 4 | "jsx": "react-jsx", 5 | "declarationDir": "dist" 6 | }, 7 | "files": ["src/coders-header.tsx"], 8 | "include": ["src/**/*"], 9 | "exclude": ["src/**/*.test*"] 10 | } 11 | -------------------------------------------------------------------------------- /coders-header/webpack.config.js: -------------------------------------------------------------------------------- 1 | const { merge } = require("webpack-merge"); 2 | const singleSpaDefaults = require("webpack-config-single-spa-react-ts"); 3 | 4 | module.exports = (webpackConfigEnv, argv) => { 5 | const defaultConfig = singleSpaDefaults({ 6 | orgName: "coders", 7 | projectName: "header", 8 | webpackConfigEnv, 9 | argv, 10 | }); 11 | 12 | return merge(defaultConfig, { 13 | devServer: { 14 | port: 8000, 15 | }, 16 | // modify the webpack config however you'd like to by adding to this object 17 | }); 18 | }; 19 | -------------------------------------------------------------------------------- /coders-loading/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "ts-react-important-stuff", 4 | "plugin:prettier/recommended" 5 | ], 6 | "parser": "@babel/eslint-parser" 7 | } 8 | -------------------------------------------------------------------------------- /coders-loading/.prettierignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | .prettierignore 3 | yarn.lock 4 | yarn-error.log 5 | package-lock.json 6 | dist 7 | coverage 8 | pnpm-lock.yaml -------------------------------------------------------------------------------- /coders-loading/babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-env", 4 | [ 5 | "@babel/preset-react", 6 | { 7 | "runtime": "automatic" 8 | } 9 | ], 10 | "@babel/preset-typescript" 11 | ], 12 | "plugins": [ 13 | [ 14 | "@babel/plugin-transform-runtime", 15 | { 16 | "useESModules": true, 17 | "regenerator": false 18 | } 19 | ] 20 | ], 21 | "env": { 22 | "test": { 23 | "presets": [ 24 | ["@babel/preset-env", { 25 | "targets": "current node" 26 | }] 27 | ] 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /coders-loading/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | rootDir: "src", 3 | testEnvironment: "jsdom", 4 | transform: { 5 | "^.+\\.(j|t)sx?$": "babel-jest", 6 | }, 7 | moduleNameMapper: { 8 | "\\.(css)$": "identity-obj-proxy", 9 | "single-spa-react/parcel": "single-spa-react/lib/cjs/parcel.cjs", 10 | }, 11 | setupFilesAfterEnv: ["@testing-library/jest-dom"], 12 | }; 13 | -------------------------------------------------------------------------------- /coders-loading/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@coders/loading", 3 | "scripts": { 4 | "start": "webpack serve", 5 | "start:standalone": "webpack serve --env standalone", 6 | "build": "concurrently yarn:build:*", 7 | "build:webpack": "webpack --mode=production", 8 | "analyze": "webpack --mode=production --env analyze", 9 | "lint": "eslint src --ext js,ts,tsx", 10 | "format": "prettier --write .", 11 | "check-format": "prettier --check .", 12 | "test": "cross-env BABEL_ENV=test jest", 13 | "watch-tests": "cross-env BABEL_ENV=test jest --watch", 14 | "coverage": "cross-env BABEL_ENV=test jest --coverage", 15 | "build:types": "tsc" 16 | }, 17 | "devDependencies": { 18 | "@babel/core": "^7.15.0", 19 | "@babel/eslint-parser": "^7.15.0", 20 | "@babel/plugin-transform-runtime": "^7.15.0", 21 | "@babel/preset-env": "^7.15.0", 22 | "@babel/preset-react": "^7.14.5", 23 | "@babel/preset-typescript": "^7.15.0", 24 | "@babel/runtime": "^7.15.3", 25 | "@testing-library/jest-dom": "^5.14.1", 26 | "@testing-library/react": "^12.0.0", 27 | "@types/testing-library__jest-dom": "^5.14.1", 28 | "babel-jest": "^27.0.6", 29 | "concurrently": "^6.2.1", 30 | "cross-env": "^7.0.3", 31 | "eslint": "^7.32.0", 32 | "eslint-config-prettier": "^8.3.0", 33 | "eslint-config-ts-react-important-stuff": "^3.0.0", 34 | "eslint-plugin-prettier": "^3.4.1", 35 | "identity-obj-proxy": "^3.0.0", 36 | "jest": "^27.0.6", 37 | "jest-cli": "^27.0.6", 38 | "prettier": "^2.3.2", 39 | "pretty-quick": "^3.1.1", 40 | "ts-config-single-spa": "^3.0.0", 41 | "typescript": "^4.3.5", 42 | "webpack": "^5.51.1", 43 | "webpack-cli": "^4.8.0", 44 | "webpack-config-single-spa-react": "^4.0.0", 45 | "webpack-config-single-spa-react-ts": "^4.0.0", 46 | "webpack-config-single-spa-ts": "^4.0.0", 47 | "webpack-dev-server": "^4.0.0", 48 | "webpack-merge": "^5.8.0", 49 | "zustand": "^3.7.0" 50 | }, 51 | "dependencies": { 52 | "@types/jest": "^27.0.1", 53 | "@types/react": "^17.0.19", 54 | "@types/react-dom": "^17.0.9", 55 | "@types/systemjs": "^6.1.1", 56 | "@types/webpack-env": "^1.16.2", 57 | "react": "^17.0.2", 58 | "react-dom": "^17.0.2", 59 | "single-spa": "^5.9.3", 60 | "single-spa-react": "^4.3.1" 61 | }, 62 | "types": "dist/coders-loading.d.ts" 63 | } 64 | -------------------------------------------------------------------------------- /coders-loading/src/coders-loading.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import singleSpaReact from "single-spa-react"; 4 | import Root from "./root.component"; 5 | 6 | const lifecycles = singleSpaReact({ 7 | React, 8 | ReactDOM, 9 | rootComponent: Root, 10 | errorBoundary(err, info, props) { 11 | // Customize the root error boundary for your microfrontend here. 12 | return null; 13 | }, 14 | }); 15 | 16 | export const { bootstrap, mount, unmount } = lifecycles; 17 | -------------------------------------------------------------------------------- /coders-loading/src/declarations.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.html" { 2 | const rawHtmlFile: string; 3 | export = rawHtmlFile; 4 | } 5 | 6 | declare module "*.bmp" { 7 | const src: string; 8 | export default src; 9 | } 10 | 11 | declare module "*.gif" { 12 | const src: string; 13 | export default src; 14 | } 15 | 16 | declare module "*.jpg" { 17 | const src: string; 18 | export default src; 19 | } 20 | 21 | declare module "*.jpeg" { 22 | const src: string; 23 | export default src; 24 | } 25 | 26 | declare module "*.png" { 27 | const src: string; 28 | export default src; 29 | } 30 | 31 | declare module "*.webp" { 32 | const src: string; 33 | export default src; 34 | } 35 | 36 | declare module "*.svg" { 37 | const src: string; 38 | export default src; 39 | } 40 | -------------------------------------------------------------------------------- /coders-loading/src/root.component.test.tsx: -------------------------------------------------------------------------------- 1 | import { render } from "@testing-library/react"; 2 | import Root from "./root.component"; 3 | 4 | describe("Root component", () => { 5 | it("should be in the document", () => { 6 | const { getByText } = render(); 7 | expect(getByText(/Testapp is mounted!/i)).toBeInTheDocument(); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /coders-loading/src/root.component.tsx: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | import { useStore } from "@coders/utility"; 3 | 4 | export default function Root(props) { 5 | const state = useStore(); 6 | return ( 7 |
8 |

PARCEL usado pelo mfe: {props.parent}

9 | {state?.loading ? "Parcel Loading..." : "Parcel Done"} 10 |
11 | 12 |
13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /coders-loading/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "ts-config-single-spa", 3 | "compilerOptions": { 4 | "jsx": "react-jsx", 5 | "declarationDir": "dist" 6 | }, 7 | "files": ["src/coders-loading.tsx"], 8 | "include": ["src/**/*"], 9 | "exclude": ["src/**/*.test*"] 10 | } 11 | -------------------------------------------------------------------------------- /coders-loading/webpack.config.js: -------------------------------------------------------------------------------- 1 | const { merge } = require("webpack-merge"); 2 | const singleSpaDefaults = require("webpack-config-single-spa-react-ts"); 3 | 4 | module.exports = (webpackConfigEnv, argv) => { 5 | const defaultConfig = singleSpaDefaults({ 6 | orgName: "coders", 7 | projectName: "loading", 8 | webpackConfigEnv, 9 | argv, 10 | }); 11 | 12 | return merge(defaultConfig, { 13 | devServer: { 14 | port: 5000, 15 | }, 16 | // modify the webpack config however you'd like to by adding to this object 17 | }); 18 | }; 19 | -------------------------------------------------------------------------------- /coders-root-config/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["ts-important-stuff", "plugin:prettier/recommended"], 3 | "parser": "@babel/eslint-parser" 4 | } 5 | -------------------------------------------------------------------------------- /coders-root-config/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | dist 63 | 64 | # Editor directories and files 65 | .idea 66 | .vscode 67 | *.suo 68 | *.ntvs* 69 | *.njsproj 70 | *.sln 71 | *.sw? 72 | .DS_Store 73 | -------------------------------------------------------------------------------- /coders-root-config/.prettierignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | .prettierignore 3 | yarn.lock 4 | yarn-error.log 5 | package-lock.json 6 | LICENSE 7 | *.ejs 8 | dist 9 | coverage 10 | pnpm-lock.yaml -------------------------------------------------------------------------------- /coders-root-config/babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-env", 4 | "@babel/preset-typescript" 5 | ], 6 | "plugins": [ 7 | [ 8 | "@babel/plugin-transform-runtime", 9 | { 10 | "useESModules": true, 11 | "regenerator": false 12 | } 13 | ] 14 | ], 15 | "env": { 16 | "test": { 17 | "presets": [ 18 | ["@babel/preset-env", { 19 | "targets": "current node" 20 | }] 21 | ] 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /coders-root-config/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@coders/root-config", 3 | "scripts": { 4 | "start": "webpack serve --port 9000 --env isLocal", 5 | "lint": "eslint src --ext js,ts,tsx", 6 | "test": "cross-env BABEL_ENV=test jest --passWithNoTests", 7 | "format": "prettier --write .", 8 | "check-format": "prettier --check .", 9 | "build": "concurrently yarn:build:*", 10 | "build:webpack": "webpack --mode=production", 11 | "build:types": "tsc" 12 | }, 13 | "devDependencies": { 14 | "@babel/core": "^7.15.0", 15 | "@babel/eslint-parser": "^7.15.0", 16 | "@babel/plugin-transform-runtime": "^7.15.0", 17 | "@babel/preset-env": "^7.15.0", 18 | "@babel/runtime": "^7.15.3", 19 | "concurrently": "^6.2.1", 20 | "cross-env": "^7.0.3", 21 | "eslint": "^7.32.0", 22 | "eslint-config-prettier": "^8.3.0", 23 | "eslint-plugin-prettier": "^3.4.1", 24 | "html-webpack-plugin": "^5.3.2", 25 | "jest": "^27.0.6", 26 | "jest-cli": "^27.0.6", 27 | "prettier": "^2.3.2", 28 | "pretty-quick": "^3.1.1", 29 | "serve": "^12.0.0", 30 | "webpack": "^5.51.1", 31 | "webpack-cli": "^4.8.0", 32 | "webpack-dev-server": "^4.0.0", 33 | "webpack-merge": "^5.8.0", 34 | "@babel/preset-typescript": "^7.15.0", 35 | "eslint-config-ts-important-stuff": "^1.1.0", 36 | "typescript": "^4.3.5", 37 | "webpack-config-single-spa-ts": "^4.0.0", 38 | "ts-config-single-spa": "^3.0.0" 39 | }, 40 | "dependencies": { 41 | "@types/jest": "^27.0.1", 42 | "@types/systemjs": "^6.1.1", 43 | "single-spa": "^5.9.3", 44 | "@types/webpack-env": "^1.16.2", 45 | "single-spa-layout": "^1.6.0" 46 | }, 47 | "types": "dist/coders-root-config.d.ts" 48 | } 49 | -------------------------------------------------------------------------------- /coders-root-config/public/template/base-layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

BASE LAYOUT

5 |
6 | -------------------------------------------------------------------------------- /coders-root-config/public/template/other-layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |

OTHER LAYOUT

6 | 7 | 8 |
9 |
10 |
11 | -------------------------------------------------------------------------------- /coders-root-config/src/coders-root-config.ts: -------------------------------------------------------------------------------- 1 | import { registerApplication, start } from "single-spa"; 2 | import { 3 | constructApplications, 4 | constructRoutes, 5 | constructLayoutEngine, 6 | } from "single-spa-layout"; 7 | 8 | import microfrontendLayout from "./microfrontend-layout.html"; 9 | 10 | function getTemplate(template){ 11 | console.log("template",template); 12 | if(!template){ 13 | customStart(microfrontendLayout) 14 | } 15 | else { 16 | fetch(`/template/${template}-layout.html`).then((res) => res.text()).then((res) => { 17 | console.log(res); 18 | customStart(res) 19 | return res; 20 | }).catch((err) => { 21 | // LOAD DEFAULT TEMPLATE 22 | customStart(microfrontendLayout) 23 | console.log(err); 24 | return null; 25 | }) 26 | } 27 | 28 | } 29 | 30 | function customStart(layoutHtml){ 31 | const routes = constructRoutes(layoutHtml); 32 | const applications = constructApplications({ 33 | routes, 34 | loadApp({ name }) { 35 | return System.import(name); 36 | }, 37 | }); 38 | const layoutEngine = constructLayoutEngine({ routes, applications }); 39 | 40 | applications.forEach(registerApplication); 41 | layoutEngine.activate(); 42 | start(); 43 | } 44 | 45 | const template = localStorage.getItem('template') 46 | 47 | getTemplate(template) 48 | 49 | 50 | -------------------------------------------------------------------------------- /coders-root-config/src/declarations.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.html" { 2 | const rawHtmlFile: string; 3 | export = rawHtmlFile; 4 | } 5 | 6 | declare module "*.bmp" { 7 | const src: string; 8 | export default src; 9 | } 10 | 11 | declare module "*.gif" { 12 | const src: string; 13 | export default src; 14 | } 15 | 16 | declare module "*.jpg" { 17 | const src: string; 18 | export default src; 19 | } 20 | 21 | declare module "*.jpeg" { 22 | const src: string; 23 | export default src; 24 | } 25 | 26 | declare module "*.png" { 27 | const src: string; 28 | export default src; 29 | } 30 | 31 | declare module "*.webp" { 32 | const src: string; 33 | export default src; 34 | } 35 | 36 | declare module "*.svg" { 37 | const src: string; 38 | export default src; 39 | } 40 | -------------------------------------------------------------------------------- /coders-root-config/src/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Workshop Coders Club 8 | 9 | 14 | 15 | 16 | 20 | 24 | 25 | 26 | 27 | 28 | 29 | 37 | 48 | 53 | 54 | 69 | 70 | 71 | 72 | 73 | <% if (isLocal) { %> 74 | 87 | <% } %> 88 | 89 | 93 | 94 | 95 | 96 | <% if (isLocal) { %> 97 | 98 | 99 | <% } else { %> 100 | 101 | 102 | <% } %> 103 | 104 | 105 | 106 | 110 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /coders-root-config/src/microfrontend-layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 | -------------------------------------------------------------------------------- /coders-root-config/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "ts-config-single-spa", 3 | "files": ["src/coders-root-config.ts"], 4 | "compilerOptions": { 5 | "declarationDir": "dist" 6 | }, 7 | "include": ["src/**/*"], 8 | "exclude": ["src/**/*.test*"] 9 | } 10 | -------------------------------------------------------------------------------- /coders-root-config/webpack.config.js: -------------------------------------------------------------------------------- 1 | const { merge } = require("webpack-merge"); 2 | const singleSpaDefaults = require("webpack-config-single-spa-ts"); 3 | const HtmlWebpackPlugin = require("html-webpack-plugin"); 4 | 5 | module.exports = (webpackConfigEnv, argv) => { 6 | const orgName = "coders"; 7 | const defaultConfig = singleSpaDefaults({ 8 | orgName, 9 | projectName: "root-config", 10 | webpackConfigEnv, 11 | argv, 12 | disableHtmlGeneration: true, 13 | }); 14 | 15 | return merge(defaultConfig, { 16 | // modify the webpack config however you'd like to by adding to this object 17 | plugins: [ 18 | new HtmlWebpackPlugin({ 19 | inject: false, 20 | template: "src/index.ejs", 21 | templateParameters: { 22 | isLocal: webpackConfigEnv && webpackConfigEnv.isLocal, 23 | orgName, 24 | }, 25 | }), 26 | ], 27 | }); 28 | }; 29 | -------------------------------------------------------------------------------- /coders-utility/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "ts-important-stuff", 4 | "plugin:prettier/recommended" 5 | ], 6 | "parser": "@babel/eslint-parser" 7 | } 8 | -------------------------------------------------------------------------------- /coders-utility/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | dist 63 | 64 | # Editor directories and files 65 | .idea 66 | .vscode 67 | *.suo 68 | *.ntvs* 69 | *.njsproj 70 | *.sln 71 | *.sw? 72 | .DS_Store 73 | -------------------------------------------------------------------------------- /coders-utility/.prettierignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | .prettierignore 3 | yarn.lock 4 | yarn-error.log 5 | package-lock.json 6 | dist 7 | coverage 8 | pnpm-lock.yaml -------------------------------------------------------------------------------- /coders-utility/babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-env", 4 | "@babel/preset-typescript" 5 | ], 6 | "plugins": [ 7 | [ 8 | "@babel/plugin-transform-runtime", 9 | { 10 | "useESModules": true, 11 | "regenerator": false 12 | } 13 | ] 14 | ], 15 | "env": { 16 | "test": { 17 | "presets": [ 18 | ["@babel/preset-env", { 19 | "targets": "current node" 20 | }] 21 | ] 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /coders-utility/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | testEnvironment: "jsdom", 3 | transform: { 4 | "^.+\\.(j|t)sx?$": "babel-jest", 5 | }, 6 | moduleNameMapper: { 7 | "\\.(css)$": "identity-obj-proxy", 8 | }, 9 | }; 10 | -------------------------------------------------------------------------------- /coders-utility/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@coders/utility", 3 | "scripts": { 4 | "start": "webpack serve", 5 | "start:standalone": "webpack serve --env standalone", 6 | "build": "concurrently yarn:build:*", 7 | "build:webpack": "webpack --mode=production", 8 | "analyze": "webpack --mode=production --env analyze", 9 | "lint": "eslint src --ext js,ts,tsx", 10 | "format": "prettier --write .", 11 | "check-format": "prettier --check .", 12 | "test": "cross-env BABEL_ENV=test jest --passWithNoTests", 13 | "watch-tests": "cross-env BABEL_ENV=test jest --watch", 14 | "coverage": "cross-env BABEL_ENV=test jest --coverage", 15 | "build:types": "tsc" 16 | }, 17 | "devDependencies": { 18 | "@babel/core": "^7.15.0", 19 | "@babel/eslint-parser": "^7.15.0", 20 | "@babel/plugin-transform-runtime": "^7.15.0", 21 | "@babel/preset-env": "^7.15.0", 22 | "@babel/preset-typescript": "^7.15.0", 23 | "@babel/runtime": "^7.15.3", 24 | "babel-jest": "^27.0.6", 25 | "concurrently": "^6.2.1", 26 | "cross-env": "^7.0.3", 27 | "eslint": "^7.32.0", 28 | "eslint-config-prettier": "^8.3.0", 29 | "eslint-config-ts-important-stuff": "^1.1.0", 30 | "eslint-plugin-prettier": "^3.4.1", 31 | "husky": "^7.0.2", 32 | "identity-obj-proxy": "^3.0.0", 33 | "jest": "^27.0.6", 34 | "jest-cli": "^27.0.6", 35 | "prettier": "^2.3.2", 36 | "pretty-quick": "^3.1.1", 37 | "react": "^17.0.2", 38 | "react-dom": "^17.0.2", 39 | "ts-config-single-spa": "^3.0.0", 40 | "typescript": "^4.3.5", 41 | "webpack": "^5.51.1", 42 | "webpack-cli": "^4.8.0", 43 | "webpack-config-single-spa-ts": "^4.0.0", 44 | "webpack-dev-server": "^4.0.0", 45 | "webpack-merge": "^5.8.0", 46 | "zustand": "^3.7.0" 47 | }, 48 | "dependencies": { 49 | "@types/jest": "^27.0.1", 50 | "@types/systemjs": "^6.1.1", 51 | "@types/webpack-env": "^1.16.2", 52 | "single-spa": "^5.9.3" 53 | }, 54 | "types": "dist/coders-utility.d.ts" 55 | } 56 | -------------------------------------------------------------------------------- /coders-utility/src/coders-utility.ts: -------------------------------------------------------------------------------- 1 | import create from "zustand"; 2 | import { combine } from "zustand/middleware"; 3 | 4 | type StoreProperties = { 5 | loading: boolean; 6 | }; 7 | 8 | type StoreMethods = { 9 | toggle: () => void; 10 | }; 11 | 12 | const store = combine( 13 | { 14 | loading: false, 15 | }, 16 | (set) => ({ 17 | toggle() { 18 | set((state) => { 19 | localStorage.setItem( 20 | "@coders/global", 21 | JSON.stringify({ loading: !state.loading }) 22 | ); 23 | return { 24 | loading: !state.loading, 25 | }; 26 | }); 27 | }, 28 | }) 29 | ); 30 | 31 | const useStore = create(store); 32 | 33 | export { useStore }; 34 | -------------------------------------------------------------------------------- /coders-utility/src/declarations.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.html" { 2 | const rawHtmlFile: string; 3 | export = rawHtmlFile; 4 | } 5 | 6 | declare module "*.bmp" { 7 | const src: string; 8 | export default src; 9 | } 10 | 11 | declare module "*.gif" { 12 | const src: string; 13 | export default src; 14 | } 15 | 16 | declare module "*.jpg" { 17 | const src: string; 18 | export default src; 19 | } 20 | 21 | declare module "*.jpeg" { 22 | const src: string; 23 | export default src; 24 | } 25 | 26 | declare module "*.png" { 27 | const src: string; 28 | export default src; 29 | } 30 | 31 | declare module "*.webp" { 32 | const src: string; 33 | export default src; 34 | } 35 | 36 | declare module "*.svg" { 37 | const src: string; 38 | export default src; 39 | } 40 | -------------------------------------------------------------------------------- /coders-utility/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "ts-config-single-spa", 3 | "files": ["src/coders-utility.ts"], 4 | "compilerOptions": { 5 | "declarationDir": "dist" 6 | }, 7 | "include": ["src/**/*"], 8 | "exclude": ["src/**/*.test*"] 9 | } 10 | -------------------------------------------------------------------------------- /coders-utility/webpack.config.js: -------------------------------------------------------------------------------- 1 | const { merge } = require("webpack-merge"); 2 | const singleSpaDefaults = require("webpack-config-single-spa-ts"); 3 | 4 | module.exports = (webpackConfigEnv, argv) => { 5 | const defaultConfig = singleSpaDefaults({ 6 | orgName: "coders", 7 | projectName: "utility", 8 | webpackConfigEnv, 9 | argv, 10 | }); 11 | 12 | return merge(defaultConfig, { 13 | devServer: { 14 | port: 5100, 15 | }, 16 | externals: ["zustand", "zustand/middleware"], 17 | // modify the webpack config however you'd like to by adding to this object 18 | }); 19 | }; 20 | --------------------------------------------------------------------------------