From 003925895b0fc3f6ae8dfc1d5ec1169c0b895e8b Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Sun, 29 May 2022 00:11:43 +0800 Subject: [PATCH] feat: source-ref support rollup --- package.json | 3 +- .../plugin-declaration-generator/src/index.ts | 8 +-- packages/rollup-plugin-source-ref/README.md | 1 + .../rollup-plugin-source-ref/package.json | 37 +++++++++++ .../rollup-plugin-source-ref/src/index.ts | 56 ++++++++++++++++ .../rollup-plugin-source-ref/tsconfig.json | 14 ++++ pnpm-lock.yaml | 65 +++++++++++++------ web/.ministarrc.js | 13 ++++ web/package.json | 3 +- 9 files changed, 173 insertions(+), 27 deletions(-) create mode 100644 packages/rollup-plugin-source-ref/README.md create mode 100644 packages/rollup-plugin-source-ref/package.json create mode 100644 packages/rollup-plugin-source-ref/src/index.ts create mode 100644 packages/rollup-plugin-source-ref/tsconfig.json diff --git a/package.json b/package.json index 16bbf776..ed138b88 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "pnpm": { "peerDependencyRules": { "ignoreMissing": [ - "acorn" + "acorn", + "acorn-dynamic-import" ] } }, diff --git a/packages/plugin-declaration-generator/src/index.ts b/packages/plugin-declaration-generator/src/index.ts index a78041df..914a3348 100644 --- a/packages/plugin-declaration-generator/src/index.ts +++ b/packages/plugin-declaration-generator/src/index.ts @@ -3,12 +3,13 @@ import traverse from '@babel/traverse'; import generate from '@babel/generator'; import template from '@babel/template'; import type { Comment } from '@babel/types'; +import { program } from '@babel/types'; import fs from 'fs-extra'; import _ from 'lodash'; const babelPlugins: ParserPlugin[] = ['jsx', 'typescript']; const buildNamedExport = template('export function %%name%%(): any', { - plugins: babelPlugins as any, + plugins: babelPlugins, }); interface Options { @@ -26,10 +27,7 @@ export async function generateFunctionDeclare(options: Options) { }); }); - const code = generate({ - type: 'Program', - body: _.flatten(astList), - } as any).code; + const code = generate(program(_.flatten(astList))).code; return code; } diff --git a/packages/rollup-plugin-source-ref/README.md b/packages/rollup-plugin-source-ref/README.md new file mode 100644 index 00000000..3b887738 --- /dev/null +++ b/packages/rollup-plugin-source-ref/README.md @@ -0,0 +1 @@ +## source-ref for webpack loader diff --git a/packages/rollup-plugin-source-ref/package.json b/packages/rollup-plugin-source-ref/package.json new file mode 100644 index 00000000..d95e218f --- /dev/null +++ b/packages/rollup-plugin-source-ref/package.json @@ -0,0 +1,37 @@ +{ + "name": "rollup-plugin-source-ref", + "version": "1.0.0", + "description": "", + "main": "dist/index.js", + "files": [ + "dist" + ], + "scripts": { + "build": "tsc", + "prepare": "tsc" + }, + "keywords": [ + "sourcecode", + "pointer", + "webpack" + ], + "author": "moonrailgun", + "license": "MIT", + "devDependencies": { + "@types/babel__generator": "^7.6.4", + "@types/babel__traverse": "^7.17.1", + "@types/node": "^15.12.5", + "@types/webpack": "^5.28.0", + "rollup": "^2.75.0", + "ts-node": "^10.0.0", + "typescript": "^4.5.2", + "webpack": "^5.72.0", + "webpack-test-utils": "^1.1.0" + }, + "dependencies": { + "@babel/generator": "^7.17.7", + "@babel/parser": "^7.17.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.10" + } +} diff --git a/packages/rollup-plugin-source-ref/src/index.ts b/packages/rollup-plugin-source-ref/src/index.ts new file mode 100644 index 00000000..4e8d7682 --- /dev/null +++ b/packages/rollup-plugin-source-ref/src/index.ts @@ -0,0 +1,56 @@ +import type { Plugin } from 'rollup'; +import { parse } from '@babel/parser'; +import traverse from '@babel/traverse'; +import generate from '@babel/generator'; +import { jsxAttribute, jsxIdentifier, stringLiteral } from '@babel/types'; + +const TRACE_ID = 'data-source'; + +export default function sourceRef(): Plugin { + return { + name: 'source-ref', + transform(code, id) { + const filepath = id; + + const ast = parse(code, { + sourceType: 'module', + plugins: ['jsx', 'typescript'], + }); + + traverse(ast, { + JSXOpeningElement(path) { + const location = path.node.loc; + if (!location) { + return; + } + + if (Array.isArray(location)) { + return; + } + + const line = location.start.line; + const col = location.start.column; + + const attrs = path.node.attributes; + for (let i = 0; i < attrs.length; i++) { + const attr = attrs[i]; + if (attr.type === 'JSXAttribute' && attr.name.name === TRACE_ID) { + // existed + return; + } + } + + const traceId = `${filepath}:${line}:${col}`; + + attrs.push( + jsxAttribute(jsxIdentifier(TRACE_ID), stringLiteral(traceId)) + ); + }, + }); + + const res = generate(ast); + + return { code: res.code, map: res.map }; + }, + }; +} diff --git a/packages/rollup-plugin-source-ref/tsconfig.json b/packages/rollup-plugin-source-ref/tsconfig.json new file mode 100644 index 00000000..8fa929ff --- /dev/null +++ b/packages/rollup-plugin-source-ref/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "outDir": "dist", + "module": "commonjs", + "target": "ES5", + "lib": ["ESNext"], + "declaration": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "esModuleInterop": true, + "skipLibCheck": true + }, + "include": ["src"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e988209..b507fb9b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -156,6 +156,37 @@ importers: '@types/node': 15.14.9 ts-node: 10.7.0_ixcth6kbstn6no7hiktnzckliq + packages/rollup-plugin-source-ref: + specifiers: + '@babel/generator': ^7.17.7 + '@babel/parser': ^7.17.7 + '@babel/traverse': ^7.17.3 + '@babel/types': ^7.17.10 + '@types/babel__generator': ^7.6.4 + '@types/babel__traverse': ^7.17.1 + '@types/node': ^15.12.5 + '@types/webpack': ^5.28.0 + rollup: ^2.75.0 + ts-node: ^10.0.0 + typescript: ^4.5.2 + webpack: ^5.72.0 + webpack-test-utils: ^1.1.0 + dependencies: + '@babel/generator': 7.17.10 + '@babel/parser': 7.17.10 + '@babel/traverse': 7.17.10 + '@babel/types': 7.17.10 + devDependencies: + '@types/babel__generator': 7.6.4 + '@types/babel__traverse': 7.17.1 + '@types/node': 15.14.9 + '@types/webpack': 5.28.0 + rollup: 2.75.0 + ts-node: 10.7.0_ixcth6kbstn6no7hiktnzckliq + typescript: 4.6.4 + webpack: 5.72.1 + webpack-test-utils: 1.1.0_webpack@5.72.1 + packages/source-ref-loader: specifiers: '@babel/generator': ^7.17.7 @@ -316,6 +347,7 @@ importers: rimraf: ^3.0.2 rollup-plugin-copy: ^3.4.0 rollup-plugin-replace: ^2.2.0 + rollup-plugin-source-ref: workspace:^1.0.0 socket.io-client: ^4.1.2 source-ref-loader: workspace:^1.0.0 source-ref-open-vscode: workspace:^1.0.0 @@ -422,6 +454,7 @@ importers: rimraf: 3.0.2 rollup-plugin-copy: 3.4.0 rollup-plugin-replace: 2.2.0 + rollup-plugin-source-ref: link:../packages/rollup-plugin-source-ref source-ref-loader: link:../packages/source-ref-loader style-loader: 3.3.1_webpack@5.72.1 tailchat-plugin-declaration-generator: link:../packages/plugin-declaration-generator @@ -2221,14 +2254,12 @@ packages: /@cspotcode/source-map-consumer/0.8.0: resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} engines: {node: '>= 12'} - dev: true /@cspotcode/source-map-support/0.7.0: resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} engines: {node: '>=12'} dependencies: '@cspotcode/source-map-consumer': 0.8.0 - dev: true /@ctrl/tinycolor/3.4.1: resolution: {integrity: sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==} @@ -4414,19 +4445,15 @@ packages: /@tsconfig/node10/1.0.8: resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} - dev: true /@tsconfig/node12/1.0.9: resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==} - dev: true /@tsconfig/node14/1.0.1: resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==} - dev: true /@tsconfig/node16/1.0.2: resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} - dev: true /@types/aria-query/4.2.2: resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} @@ -4727,7 +4754,6 @@ packages: /@types/node/15.14.9: resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} - dev: true /@types/node/17.0.4: resolution: {integrity: sha512-6xwbrW4JJiJLgF+zNypN5wr2ykM9/jHcL7rQ8fZe2vuftggjzZeRSM4OwRc6Xk8qWjwJ99qVHo/JgOGmomWRog==} @@ -5570,7 +5596,6 @@ packages: /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} - dev: true /acorn/6.4.2: resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} @@ -5587,7 +5612,6 @@ packages: resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /address/1.2.0: resolution: {integrity: sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==} @@ -5864,7 +5888,6 @@ packages: /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true /arg/5.0.1: resolution: {integrity: sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==} @@ -6059,7 +6082,6 @@ packages: picocolors: 1.0.0 postcss: 8.4.13 postcss-value-parser: 4.2.0 - dev: true /autoprefixer/9.8.8: resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} @@ -6395,6 +6417,7 @@ packages: /bindings/1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + requiresBuild: true dependencies: file-uri-to-path: 1.0.0 dev: true @@ -7535,7 +7558,6 @@ packages: /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true /cross-env/7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} @@ -8057,7 +8079,6 @@ packages: /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - dev: true /diffie-hellman/5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} @@ -9279,6 +9300,7 @@ packages: /file-uri-to-path/1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + requiresBuild: true dev: true optional: true @@ -9507,7 +9529,6 @@ packages: /fraction.js/4.2.0: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - dev: true /fragment-cache/0.2.1: resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} @@ -12226,7 +12247,6 @@ packages: /make-error/1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true /makeerror/1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -12744,6 +12764,7 @@ packages: /nan/2.15.0: resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} + requiresBuild: true dev: true optional: true @@ -12927,7 +12948,6 @@ packages: /normalize-range/0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - dev: true /normalize-url/3.3.0: resolution: {integrity: sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==} @@ -15888,6 +15908,14 @@ packages: optionalDependencies: fsevents: 2.3.2 + /rollup/2.75.0: + resolution: {integrity: sha512-1/wxtweHJ7YwI2AIK3ZgCBU3nbW8sLnBIFwN46cwOTnVzt8f1o6J8zPKjwoiuADvzSjmnLqJce31p0q2vQ+dqw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /rsvp/4.8.5: resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} engines: {node: 6.* || >= 7.*} @@ -17058,7 +17086,7 @@ packages: serialize-javascript: 6.0.0 source-map: 0.6.1 terser: 5.13.1 - webpack: 5.72.1 + webpack: 5.72.1_webpack-cli@4.9.2 dev: true /terser/4.8.0: @@ -17358,7 +17386,6 @@ packages: typescript: 4.6.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true /ts-pnp/1.2.0_typescript@4.6.4: resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} @@ -17845,7 +17872,6 @@ packages: /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true /v8-compile-cache/2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} @@ -18796,7 +18822,6 @@ packages: /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} - dev: true /yocto-queue/0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} diff --git a/web/.ministarrc.js b/web/.ministarrc.js index 927cffaa..f6a40cfc 100644 --- a/web/.ministarrc.js +++ b/web/.ministarrc.js @@ -1,7 +1,10 @@ const copy = require('rollup-plugin-copy'); const replace = require('rollup-plugin-replace'); +const sourceRef = require('rollup-plugin-source-ref').default; const path = require('path'); +const isDev = process.env.NODE_ENV === 'development'; + module.exports = { externalDeps: [ 'react', @@ -40,4 +43,14 @@ module.exports = { 'process.env.NODE_ENV': JSON.stringify('production'), }), ], + buildRollupPlugins(plugins) { + if (isDev) { + return [ + sourceRef(), // make sure to change to source + ...plugins, + ]; + } + + return plugins; + }, }; diff --git a/web/package.json b/web/package.json index 1a04dd3e..027c5299 100644 --- a/web/package.json +++ b/web/package.json @@ -7,7 +7,7 @@ "license": "GPLv3", "private": true, "scripts": { - "build": "rimraf ./dist && pnpm plugins:all && pnpm build:webpack", + "build": "cross-env NODE_ENV=production rimraf ./dist && pnpm plugins:all && pnpm build:webpack", "build:webpack": "cross-env TS_NODE_PROJECT='tsconfig.node.json' webpack --config ./build/webpack.config.ts", "build:stats": "pnpm build:webpack --profile --json=compilation-stats.json", "dev": "cross-env TS_NODE_PROJECT='tsconfig.node.json' NODE_ENV=development webpack serve --config ./build/webpack.config.ts", @@ -108,6 +108,7 @@ "rimraf": "^3.0.2", "rollup-plugin-copy": "^3.4.0", "rollup-plugin-replace": "^2.2.0", + "rollup-plugin-source-ref": "workspace:^1.0.0", "source-ref-loader": "workspace:^1.0.0", "style-loader": "^3.0.0", "tailchat-plugin-declaration-generator": "workspace:^1.0.0",