Browse Source

Merge pull request #7590 from weseek/support/dedupe-packages

support: Dedupe packages
Yuki Takei 2 years ago
parent
commit
0084130583

+ 16 - 7
apps/app/next.config.js

@@ -85,16 +85,25 @@ module.exports = async(phase, { defaultConfig }) => {
 
 
     /** @param config {import('next').NextConfig} */
     /** @param config {import('next').NextConfig} */
     webpack(config, options) {
     webpack(config, options) {
-      // Avoid "Module not found: Can't resolve 'fs'"
-      // See: https://stackoverflow.com/a/68511591
       if (!options.isServer) {
       if (!options.isServer) {
+        // Avoid "Module not found: Can't resolve 'fs'"
+        // See: https://stackoverflow.com/a/68511591
         config.resolve.fallback.fs = false;
         config.resolve.fallback.fs = false;
-      }
 
 
-      // See: https://webpack.js.org/configuration/externals/
-      // This provides a way of excluding dependencies from the output bundles
-      config.externals.push('dtrace-provider');
-      config.externals.push('mongoose');
+        // exclude packages from the output bundles
+        config.module.rules.push(
+          ...[
+            /dtrace-provider/,
+            /mongoose/,
+            /mathjax-full/, // required from marp
+          ].map((packageRegExp) => {
+            return {
+              test: packageRegExp,
+              use: 'null-loader',
+            };
+          }),
+        );
+      }
 
 
       // extract sourcemap
       // extract sourcemap
       if (options.dev) {
       if (options.dev) {

+ 3 - 2
apps/app/package.json

@@ -18,7 +18,6 @@
     "//// for development": "",
     "//// for development": "",
     "dev": "yarn cross-env NODE_ENV=development yarn ts-node-dev --inspect --transpile-only src/server/app.ts",
     "dev": "yarn cross-env NODE_ENV=development yarn ts-node-dev --inspect --transpile-only src/server/app.ts",
     "dev:styles-prebuilt": "yarn styles-prebuilt --mode dev",
     "dev:styles-prebuilt": "yarn styles-prebuilt --mode dev",
-    "dev:analyze": "yarn cross-env ANALYZE=true yarn dev",
     "dev:migrate-mongo": "yarn cross-env NODE_ENV=development yarn ts-node node_modules/.bin/migrate-mongo",
     "dev:migrate-mongo": "yarn cross-env NODE_ENV=development yarn ts-node node_modules/.bin/migrate-mongo",
     "dev:migrate": "yarn dev:migrate:status > tmp/cache/migration-status.out && yarn dev:migrate:up",
     "dev:migrate": "yarn dev:migrate:status > tmp/cache/migration-status.out && yarn dev:migrate:up",
     "dev:migrate:create": "yarn dev:migrate-mongo create -f config/migrate-mongo-config.js",
     "dev:migrate:create": "yarn dev:migrate-mongo create -f config/migrate-mongo-config.js",
@@ -144,6 +143,7 @@
     "passport-local": "^1.0.0",
     "passport-local": "^1.0.0",
     "passport-saml": "^3.2.0",
     "passport-saml": "^3.2.0",
     "prom-client": "^14.1.1",
     "prom-client": "^14.1.1",
+    "qs": "^6.11.1",
     "rate-limiter-flexible": "^2.3.7",
     "rate-limiter-flexible": "^2.3.7",
     "react": "^18.2.0",
     "react": "^18.2.0",
     "react-bootstrap-typeahead": "^5.2.2",
     "react-bootstrap-typeahead": "^5.2.2",
@@ -192,7 +192,7 @@
     "usehooks-ts": "^2.6.0",
     "usehooks-ts": "^2.6.0",
     "validator": "^13.7.0",
     "validator": "^13.7.0",
     "ws": "^8.3.0",
     "ws": "^8.3.0",
-    "xss": "^1.0.6"
+    "xss": "^1.0.14"
   },
   },
   "// comments for defDependencies": {
   "// comments for defDependencies": {
     "@handsontable/react": "v3 requires handsontable >= 7.0.0.",
     "@handsontable/react": "v3 requires handsontable >= 7.0.0.",
@@ -225,6 +225,7 @@
     "load-css-file": "^1.0.0",
     "load-css-file": "^1.0.0",
     "material-icons": "^1.11.3",
     "material-icons": "^1.11.3",
     "morgan": "^1.10.0",
     "morgan": "^1.10.0",
+    "null-loader": "^4.0.1",
     "penpal": "^4.0.0",
     "penpal": "^4.0.0",
     "plantuml-encoder": "^1.2.5",
     "plantuml-encoder": "^1.2.5",
     "prettier": "^1.19.1",
     "prettier": "^1.19.1",

+ 1 - 1
apps/app/src/components/Me/InAppNotificationSettings.tsx

@@ -2,7 +2,7 @@ import React, {
   FC, useState, useEffect, useCallback,
   FC, useState, useEffect, useCallback,
 } from 'react';
 } from 'react';
 
 
-import { pullAllBy } from 'lodash';
+import pullAllBy from 'lodash/pullAllBy';
 import { useTranslation } from 'next-i18next';
 import { useTranslation } from 'next-i18next';
 
 
 import { apiv3Get, apiv3Put } from '~/client/util/apiv3-client';
 import { apiv3Get, apiv3Put } from '~/client/util/apiv3-client';

+ 2 - 2
apps/app/src/server/service/search.ts

@@ -1,5 +1,5 @@
 import mongoose from 'mongoose';
 import mongoose from 'mongoose';
-import xss from 'xss';
+import { FilterXSS } from 'xss';
 
 
 import { SearchDelegatorName } from '~/interfaces/named-query';
 import { SearchDelegatorName } from '~/interfaces/named-query';
 import { IPageHasId } from '~/interfaces/page';
 import { IPageHasId } from '~/interfaces/page';
@@ -31,7 +31,7 @@ const filterXssOptions = {
   },
   },
 };
 };
 
 
-const filterXss = new xss.FilterXSS(filterXssOptions);
+const filterXss = new FilterXSS(filterXssOptions);
 
 
 const normalizeQueryString = (_queryString: string): string => {
 const normalizeQueryString = (_queryString: string): string => {
   let queryString = _queryString.trim();
   let queryString = _queryString.trim();

+ 1 - 1
package.json

@@ -90,8 +90,8 @@
     "shipjs": "^0.24.1",
     "shipjs": "^0.24.1",
     "stylelint": "^14.2.0",
     "stylelint": "^14.2.0",
     "stylelint-config-recess-order": "^3.0.0",
     "stylelint-config-recess-order": "^3.0.0",
-    "tsconfig-paths": "^3.9.0",
     "ts-node-dev": "^2.0.0",
     "ts-node-dev": "^2.0.0",
+    "tsconfig-paths": "^3.9.0",
     "typescript": "~4.9",
     "typescript": "~4.9",
     "unplugin-swc": "^1.3.2",
     "unplugin-swc": "^1.3.2",
     "vite": "^4.2.2",
     "vite": "^4.2.2",

+ 1 - 1
packages/presentation/package.json

@@ -21,7 +21,7 @@
     "@growi/core": "^6.1.0-RC.0"
     "@growi/core": "^6.1.0-RC.0"
   },
   },
   "devDependencies": {
   "devDependencies": {
-    "@marp-team/marp-core": "^3.4.2",
+    "@marp-team/marp-core": "^3.6.0",
     "@types/reveal.js": "^4.4.1",
     "@types/reveal.js": "^4.4.1",
     "eslint-plugin-regex": "^1.8.0",
     "eslint-plugin-regex": "^1.8.0",
     "reveal.js": "^4.4.0"
     "reveal.js": "^4.4.0"

+ 14 - 0
tools/replacer/.eslintrc.cjs

@@ -0,0 +1,14 @@
+module.exports = {
+  env: { browser: true, es2020: true },
+  extends: [
+    'eslint:recommended',
+    'plugin:@typescript-eslint/recommended',
+    'plugin:react-hooks/recommended',
+  ],
+  parser: '@typescript-eslint/parser',
+  parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
+  plugins: ['react-refresh'],
+  rules: {
+    'react-refresh/only-export-components': 'warn',
+  },
+}

+ 24 - 0
tools/replacer/.gitignore

@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 13 - 0
tools/replacer/index.html

@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Vite + React + TS</title>
+  </head>
+  <body>
+    <div id="root"></div>
+    <script type="module" src="/src/main.tsx"></script>
+  </body>
+</html>

+ 28 - 0
tools/replacer/package.json

@@ -0,0 +1,28 @@
+{
+  "name": "replacer",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "tsc && vite build",
+    "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
+    "preview": "vite preview"
+  },
+  "dependencies": {
+    "react": "^18.2.0",
+    "react-dom": "^18.2.0"
+  },
+  "devDependencies": {
+    "@types/react": "^18.0.28",
+    "@types/react-dom": "^18.0.11",
+    "@typescript-eslint/eslint-plugin": "^5.57.1",
+    "@typescript-eslint/parser": "^5.57.1",
+    "@vitejs/plugin-react-swc": "^3.0.0",
+    "eslint": "^8.38.0",
+    "eslint-plugin-react-hooks": "^4.6.0",
+    "eslint-plugin-react-refresh": "^0.3.4",
+    "typescript": "^5.0.2",
+    "vite": "^4.3.0"
+  }
+}

+ 49 - 0
tools/replacer/src/App.css

@@ -0,0 +1,49 @@
+#root {
+  max-width: 1280px;
+  padding: 2rem;
+  margin: 0 auto;
+  text-align: center;
+}
+
+.logo {
+  height: 6em;
+  padding: 1.5em;
+  will-change: filter;
+  transition: filter 300ms;
+}
+
+.logo:hover {
+  filter: drop-shadow(0 0 2em #646cffaa);
+}
+
+.logo.react:hover {
+  filter: drop-shadow(0 0 2em #61dafbaa);
+}
+
+@keyframes logo-spin {
+  from {
+    transform: rotate(0deg);
+  }
+  to {
+    transform: rotate(360deg);
+  }
+}
+
+@media (prefers-reduced-motion: no-preference) {
+  a:nth-of-type(2) .logo {
+    animation: logo-spin infinite 20s linear;
+  }
+}
+
+.card {
+  padding: 2em;
+}
+
+.card textarea {
+  width: 480px;
+}
+
+
+.read-the-docs {
+  color: #888;
+}

+ 47 - 0
tools/replacer/src/App.tsx

@@ -0,0 +1,47 @@
+import { ChangeEventHandler, useState } from 'react'
+import './App.css'
+
+
+
+function replaceImport(str: string): string {
+  const regex = /import {[\s\n]*([^}]+)[\s\n]*} from 'reactstrap';/;
+
+  return str.replace(regex, (_match, group: string) => {
+    const modules = group
+      .split(',')
+      .map(mod => mod.trim())
+      .filter(mod => mod.length > 0)
+
+    return modules.map((mod) => {
+      return `import ${mod} from 'reactstrap/es/${mod}';`
+    }).join('\n')
+  });
+}
+
+function App() {
+
+  const [output, setOutput] = useState('');
+
+  const changeHandler: ChangeEventHandler<HTMLTextAreaElement> = (e): void => {
+    const { value } = e.target;
+
+    const replacedValue = replaceImport(value);
+
+    setOutput(replacedValue);
+  }
+  return (
+    <>
+      <h1>Input</h1>
+      <div className="card">
+        <textarea rows={5} onChange={changeHandler} />
+      </div>
+
+      <h1>Output</h1>
+      <div className="card">
+        <textarea rows={5} value={output} />
+      </div>
+    </>
+  )
+}
+
+export default App

+ 69 - 0
tools/replacer/src/index.css

@@ -0,0 +1,69 @@
+:root {
+  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
+  line-height: 1.5;
+  font-weight: 400;
+
+  color-scheme: light dark;
+  color: rgba(255, 255, 255, 0.87);
+  background-color: #242424;
+
+  font-synthesis: none;
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-text-size-adjust: 100%;
+}
+
+a {
+  font-weight: 500;
+  color: #646cff;
+  text-decoration: inherit;
+}
+a:hover {
+  color: #535bf2;
+}
+
+body {
+  margin: 0;
+  display: flex;
+  place-items: center;
+  min-width: 320px;
+  min-height: 100vh;
+}
+
+h1 {
+  font-size: 3.2em;
+  line-height: 1.1;
+}
+
+button {
+  border-radius: 8px;
+  border: 1px solid transparent;
+  padding: 0.6em 1.2em;
+  font-size: 1em;
+  font-weight: 500;
+  font-family: inherit;
+  background-color: #1a1a1a;
+  cursor: pointer;
+  transition: border-color 0.25s;
+}
+button:hover {
+  border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+  outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+  :root {
+    color: #213547;
+    background-color: #ffffff;
+  }
+  a:hover {
+    color: #747bff;
+  }
+  button {
+    background-color: #f9f9f9;
+  }
+}

+ 10 - 0
tools/replacer/src/main.tsx

@@ -0,0 +1,10 @@
+import React from 'react'
+import ReactDOM from 'react-dom/client'
+import App from './App.tsx'
+import './index.css'
+
+ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
+  <React.StrictMode>
+    <App />
+  </React.StrictMode>,
+)

+ 1 - 0
tools/replacer/src/vite-env.d.ts

@@ -0,0 +1 @@
+/// <reference types="vite/client" />

+ 24 - 0
tools/replacer/tsconfig.json

@@ -0,0 +1,24 @@
+{
+  "compilerOptions": {
+    "target": "ESNext",
+    "lib": ["DOM", "DOM.Iterable", "ESNext"],
+    "module": "ESNext",
+    "skipLibCheck": true,
+
+    /* Bundler mode */
+    "moduleResolution": "bundler",
+    "allowImportingTsExtensions": true,
+    "resolveJsonModule": true,
+    "isolatedModules": true,
+    "noEmit": true,
+    "jsx": "react-jsx",
+
+    /* Linting */
+    "strict": true,
+    "noUnusedLocals": true,
+    "noUnusedParameters": true,
+    "noFallthroughCasesInSwitch": true
+  },
+  "include": ["src"],
+  "references": [{ "path": "./tsconfig.node.json" }]
+}

+ 10 - 0
tools/replacer/tsconfig.node.json

@@ -0,0 +1,10 @@
+{
+  "compilerOptions": {
+    "composite": true,
+    "skipLibCheck": true,
+    "module": "ESNext",
+    "moduleResolution": "bundler",
+    "allowSyntheticDefaultImports": true
+  },
+  "include": ["vite.config.ts"]
+}

+ 7 - 0
tools/replacer/vite.config.ts

@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react-swc'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+  plugins: [react()],
+})

File diff suppressed because it is too large
+ 35 - 670
yarn.lock


Some files were not shown because too many files changed in this diff