From 0a75971f9e16ca35a8b526e4ce84b5eef3ca7080 Mon Sep 17 00:00:00 2001 From: Romuald Brillout Date: Tue, 23 Aug 2022 20:36:15 +0200 Subject: [PATCH] fix: support Vite 3 and latest vite-plugin-ssr version --- .gitignore | 1 + examples/vite-plugin-ssr/package.json | 6 +- .../renderer/_default.page.client.jsx | 8 +- examples/vite-plugin-ssr/server/index.js | 10 +- package.json | 3 + pnpm-lock.yaml | 409 +++++++++++++++++- telefunc/node/utils/getOutDirs.ts | 54 +++ telefunc/node/{vite => }/utils/isSSR.ts | 3 +- telefunc/node/vite/clear.ts | 5 - telefunc/node/vite/distLink.ts | 45 -- telefunc/node/vite/index.ts | 5 +- .../node/vite/loadTelefuncFilesWithVite.ts | 42 +- .../node/vite/plugins/importBuild/index.ts | 45 ++ .../vite/plugins/importBuild/loadBuild.ts | 23 + .../node/vite/telefuncFilesGlobFromDist.ts | 1 - telefunc/node/vite/utils/index.ts | 5 +- telefunc/package.json | 6 + telefunc/tsconfig.base.json | 1 + 18 files changed, 562 insertions(+), 110 deletions(-) create mode 100644 telefunc/node/utils/getOutDirs.ts rename telefunc/node/{vite => }/utils/isSSR.ts (87%) delete mode 100644 telefunc/node/vite/distLink.ts create mode 100644 telefunc/node/vite/plugins/importBuild/index.ts create mode 100644 telefunc/node/vite/plugins/importBuild/loadBuild.ts delete mode 100644 telefunc/node/vite/telefuncFilesGlobFromDist.ts diff --git a/.gitignore b/.gitignore index 5d091a4b..dfaa608d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /node_modules/ +/deps/ .pnpm-debug.log diff --git a/examples/vite-plugin-ssr/package.json b/examples/vite-plugin-ssr/package.json index 1ad9198b..d9923ec5 100644 --- a/examples/vite-plugin-ssr/package.json +++ b/examples/vite-plugin-ssr/package.json @@ -2,7 +2,7 @@ "scripts": { "dev": "npm run server", "prod": "npm run build && npm run server:prod", - "build": "vite build && vite build --ssr", + "build": "vite build", "server": "node ./server", "server:prod": "cross-env NODE_ENV=production node ./server" }, @@ -13,7 +13,7 @@ "react": "^17.0.2", "react-dom": "^17.0.2", "telefunc": "0.1.24", - "vite": "2.6.7", - "vite-plugin-ssr": "^0.3.26" + "vite": "^3.0.9", + "vite-plugin-ssr": "^0.4.26" } } diff --git a/examples/vite-plugin-ssr/renderer/_default.page.client.jsx b/examples/vite-plugin-ssr/renderer/_default.page.client.jsx index 696dad62..ffbfd6fc 100644 --- a/examples/vite-plugin-ssr/renderer/_default.page.client.jsx +++ b/examples/vite-plugin-ssr/renderer/_default.page.client.jsx @@ -1,11 +1,9 @@ +export { render } + import ReactDOM from 'react-dom' import React from 'react' -import { getPage } from 'vite-plugin-ssr/client' - -hydrate() -async function hydrate() { - const pageContext = await getPage() +function render(pageContext) { const { Page, pageProps } = pageContext ReactDOM.hydrate(, document.getElementById('page-view')) // For `../.testRun.ts` diff --git a/examples/vite-plugin-ssr/server/index.js b/examples/vite-plugin-ssr/server/index.js index 412e04dd..c2974e05 100644 --- a/examples/vite-plugin-ssr/server/index.js +++ b/examples/vite-plugin-ssr/server/index.js @@ -1,5 +1,5 @@ const express = require('express') -const { createPageRenderer } = require('vite-plugin-ssr') +const { renderPage } = require('vite-plugin-ssr') const { telefunc, provideTelefuncContext } = require('telefunc') const isProduction = process.env.NODE_ENV === 'production' @@ -17,7 +17,7 @@ async function startServer() { const vite = require('vite') viteDevServer = await vite.createServer({ root, - server: { middlewareMode: 'ssr' } + server: { middlewareMode: true } }) app.use(viteDevServer.middlewares) } @@ -39,12 +39,10 @@ async function startServer() { res.status(statusCode).type(contentType).send(body) }) - const renderPage = createPageRenderer({ viteDevServer, isProduction, root }) app.get('*', async (req, res, next) => { - const { user, originalUrl: url } = req const pageContextInit = { - user, - url + user: req.user, + urlOriginal: req.originalUrl } const pageContext = await renderPage(pageContextInit) const { httpResponse } = pageContext diff --git a/package.json b/package.json index 90f9f31a..534cd3d1 100644 --- a/package.json +++ b/package.json @@ -40,5 +40,8 @@ }, "dependencies": { "@brillout/submodule-init": "0.1.2" + }, + "devDependencies": { + "@brillout/dev-my-dep": "^0.0.9" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d3e63454..59deedfb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,9 +4,12 @@ importers: .: specifiers: + '@brillout/dev-my-dep': ^0.0.9 '@brillout/submodule-init': 0.1.2 dependencies: '@brillout/submodule-init': 0.1.2 + devDependencies: + '@brillout/dev-my-dep': 0.0.9 docs: specifiers: @@ -174,8 +177,8 @@ importers: react: ^17.0.2 react-dom: ^17.0.2 telefunc: 0.1.24 - vite: 2.6.7 - vite-plugin-ssr: ^0.3.26 + vite: ^3.0.9 + vite-plugin-ssr: ^0.4.26 dependencies: '@vitejs/plugin-react': 1.1.4 cross-env: 7.0.3 @@ -183,8 +186,8 @@ importers: react: 17.0.2 react-dom: 17.0.2_react@17.0.2 telefunc: link:../../telefunc - vite: 2.6.7 - vite-plugin-ssr: 0.3.51_vite@2.6.7 + vite: 3.0.9 + vite-plugin-ssr: 0.4.26_vite@3.0.9 libframe/docs: specifiers: @@ -290,11 +293,13 @@ importers: ts-morph: ^14.0.0 typescript: ^4.7.4 vite: ^2.4.3 + vite-plugin-import-build: ^0.2.3 dependencies: '@brillout/json-s': 0.4.6 '@brillout/libassert': 0.5.8 es-module-lexer: 0.7.1 ts-morph: 14.0.0 + vite-plugin-import-build: 0.2.3 devDependencies: '@nuxt/types': 2.15.8 '@types/express': 4.17.13 @@ -2506,6 +2511,15 @@ packages: '@brillout/json-s': 0.1.5 dev: false + /@brillout/debug/0.1.1: + resolution: {integrity: sha512-8eswfYbIoRp1Uz0i50Fztk6z207YRY+rxNL0nkvZ1qYPUx2wxsFQr3J1agmmXXgoahsy/HFqhyApsSuaq8DHgw==} + dev: false + + /@brillout/dev-my-dep/0.0.9: + resolution: {integrity: sha512-x1/qCMGwE0wCARtnqYIPBbDxwtYUmum0sDQyohR0LwCGvPR3V3GAWzBNUYVnu2rcsJ/mKidYBlQkFeyYB3n9Kw==} + hasBin: true + dev: true + /@brillout/format-text/0.1.3: resolution: {integrity: sha512-79/JKUOr+POW3XAfRDDxoxCjGBeD5KVwkzBWhK7KPA66HCTwEqb7unqxfVGSJZ9MnL/NiMb0shhzRkydMC/YFg==} dependencies: @@ -2583,6 +2597,15 @@ packages: engines: {node: '>=4.0.0'} dev: false + /@esbuild/linux-loong64/0.14.54: + resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@gar/promisify/1.1.2: resolution: {integrity: sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==} dev: false @@ -4731,6 +4754,13 @@ packages: resolution: {integrity: sha512-uUrgZ8AxS+Lio0fZKAipJjAh415JyrOZowliZAzmnJSsf7piVL5w+G0+gFJ0KSu3QRhvui/7zuvpLz03YjXAhg==} dev: false + /@zkochan/rimraf/2.1.2: + resolution: {integrity: sha512-Lc2oK51J6aQWcLWTloobJun5ZF41BbTDdLvE+aMcexoVWFoFqvZmnZoyXR2IZk6NJEVoZW8tjgtvQLfTsmRs2Q==} + engines: {node: '>=12.10'} + dependencies: + rimraf: 3.0.2 + dev: false + /JSONStream/1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -4797,6 +4827,12 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + /acorn/8.8.0: + resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + /add-stream/1.0.0: resolution: {integrity: sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=} dev: false @@ -5316,6 +5352,13 @@ packages: tweetnacl: 0.14.5 dev: false + /better-path-resolve/1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + dependencies: + is-windows: 1.0.2 + dev: false + /big.js/5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -7463,6 +7506,10 @@ packages: unbox-primitive: 1.0.1 dev: false + /es-module-lexer/0.10.5: + resolution: {integrity: sha512-+7IwY/kiGAacQfY+YBhKMvEmyAJnw5grTUgjG85Pe7vcUI/6b7pZjZG8nQ7+48YhzEAEqrEgD2dCz/JIK+AYvw==} + dev: false + /es-module-lexer/0.7.1: resolution: {integrity: sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==} dev: false @@ -7484,6 +7531,15 @@ packages: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} dev: false + /esbuild-android-64/0.14.54: + resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + /esbuild-android-arm64/0.13.15: resolution: {integrity: sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==} cpu: [arm64] @@ -7508,6 +7564,15 @@ packages: dev: false optional: true + /esbuild-android-arm64/0.14.54: + resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + /esbuild-darwin-64/0.13.15: resolution: {integrity: sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==} cpu: [x64] @@ -7532,6 +7597,15 @@ packages: dev: false optional: true + /esbuild-darwin-64/0.14.54: + resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /esbuild-darwin-arm64/0.13.15: resolution: {integrity: sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ==} cpu: [arm64] @@ -7556,6 +7630,15 @@ packages: dev: false optional: true + /esbuild-darwin-arm64/0.14.54: + resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /esbuild-freebsd-64/0.13.15: resolution: {integrity: sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==} cpu: [x64] @@ -7580,6 +7663,15 @@ packages: dev: false optional: true + /esbuild-freebsd-64/0.14.54: + resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /esbuild-freebsd-arm64/0.13.15: resolution: {integrity: sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==} cpu: [arm64] @@ -7604,6 +7696,15 @@ packages: dev: false optional: true + /esbuild-freebsd-arm64/0.14.54: + resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-32/0.13.15: resolution: {integrity: sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==} cpu: [ia32] @@ -7628,6 +7729,15 @@ packages: dev: false optional: true + /esbuild-linux-32/0.14.54: + resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-64/0.13.15: resolution: {integrity: sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==} cpu: [x64] @@ -7652,6 +7762,15 @@ packages: dev: false optional: true + /esbuild-linux-64/0.14.54: + resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-arm/0.13.15: resolution: {integrity: sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==} cpu: [arm] @@ -7676,6 +7795,15 @@ packages: dev: false optional: true + /esbuild-linux-arm/0.14.54: + resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-arm64/0.13.15: resolution: {integrity: sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==} cpu: [arm64] @@ -7700,6 +7828,15 @@ packages: dev: false optional: true + /esbuild-linux-arm64/0.14.54: + resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-mips64le/0.13.15: resolution: {integrity: sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==} cpu: [mips64el] @@ -7724,6 +7861,15 @@ packages: dev: false optional: true + /esbuild-linux-mips64le/0.14.54: + resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-ppc64le/0.13.15: resolution: {integrity: sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==} cpu: [ppc64] @@ -7748,6 +7894,15 @@ packages: dev: false optional: true + /esbuild-linux-ppc64le/0.14.54: + resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-riscv64/0.14.21: resolution: {integrity: sha512-fElngqOaOfTsF+u+oetDLHsPG74vB2ZaGZUqmGefAJn3a5z9Z2pNa4WpVbbKgHpaAAy5tWM1m1sbGohj6Ki6+Q==} engines: {node: '>=12'} @@ -7757,6 +7912,15 @@ packages: dev: false optional: true + /esbuild-linux-riscv64/0.14.54: + resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-s390x/0.14.21: resolution: {integrity: sha512-brleZ6R5fYv0qQ7ZBwenQmP6i9TdvJCB092c/3D3pTLQHBGHJb5zWgKxOeS7bdHzmLy6a6W7GbFk6QKpjyD6QA==} engines: {node: '>=12'} @@ -7766,6 +7930,15 @@ packages: dev: false optional: true + /esbuild-linux-s390x/0.14.54: + resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-netbsd-64/0.13.15: resolution: {integrity: sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==} cpu: [x64] @@ -7790,6 +7963,15 @@ packages: dev: false optional: true + /esbuild-netbsd-64/0.14.54: + resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + /esbuild-node-loader/0.6.5: resolution: {integrity: sha512-uPP+dllWm38cFvDysdocutN3lfe5pTIbddAHp1ENyLzpHYqE2r+3Wo+pfg9X3p8DFWwzIisft5YkeBIthIcixw==} dependencies: @@ -7820,6 +8002,15 @@ packages: dev: false optional: true + /esbuild-openbsd-64/0.14.54: + resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + /esbuild-register/3.3.2_esbuild@0.13.15: resolution: {integrity: sha512-jceAtTO6zxPmCfSD5cBb3rgIK1vmuqCKYwgylHiS1BF4pq0jJiJb4K2QMuqF4BEw7XDBRatYzip0upyTzfkgsQ==} peerDependencies: @@ -7852,6 +8043,15 @@ packages: dev: false optional: true + /esbuild-sunos-64/0.14.54: + resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + /esbuild-windows-32/0.13.15: resolution: {integrity: sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==} cpu: [ia32] @@ -7876,6 +8076,15 @@ packages: dev: false optional: true + /esbuild-windows-32/0.14.54: + resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /esbuild-windows-64/0.13.15: resolution: {integrity: sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==} cpu: [x64] @@ -7900,6 +8109,15 @@ packages: dev: false optional: true + /esbuild-windows-64/0.14.54: + resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /esbuild-windows-arm64/0.13.15: resolution: {integrity: sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==} cpu: [arm64] @@ -7924,6 +8142,15 @@ packages: dev: false optional: true + /esbuild-windows-arm64/0.14.54: + resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /esbuild/0.13.15: resolution: {integrity: sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==} hasBin: true @@ -7998,6 +8225,35 @@ packages: esbuild-windows-arm64: 0.14.21 dev: false + /esbuild/0.14.54: + resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/linux-loong64': 0.14.54 + esbuild-android-64: 0.14.54 + esbuild-android-arm64: 0.14.54 + esbuild-darwin-64: 0.14.54 + esbuild-darwin-arm64: 0.14.54 + esbuild-freebsd-64: 0.14.54 + esbuild-freebsd-arm64: 0.14.54 + esbuild-linux-32: 0.14.54 + esbuild-linux-64: 0.14.54 + esbuild-linux-arm: 0.14.54 + esbuild-linux-arm64: 0.14.54 + esbuild-linux-mips64le: 0.14.54 + esbuild-linux-ppc64le: 0.14.54 + esbuild-linux-riscv64: 0.14.54 + esbuild-linux-s390x: 0.14.54 + esbuild-netbsd-64: 0.14.54 + esbuild-openbsd-64: 0.14.54 + esbuild-sunos-64: 0.14.54 + esbuild-windows-32: 0.14.54 + esbuild-windows-64: 0.14.54 + esbuild-windows-arm64: 0.14.54 + dev: false + /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -8355,7 +8611,7 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.4 + micromatch: 4.0.5 dev: false /fast-json-stable-stringify/2.1.0: @@ -9597,10 +9853,16 @@ packages: rgba-regex: 1.0.0 dev: false + /is-core-module/2.10.0: + resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} + dependencies: + has: 1.0.3 + /is-core-module/2.8.1: resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} dependencies: has: 1.0.3 + dev: false /is-data-descriptor/0.1.4: resolution: {integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=} @@ -10967,6 +11229,13 @@ packages: dependencies: yallist: 4.0.0 + /magic-string/0.26.2: + resolution: {integrity: sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: false + /make-dir/1.3.0: resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} engines: {node: '>=4'} @@ -11680,6 +11949,14 @@ packages: picomatch: 2.3.1 dev: false + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + /miller-rabin/4.0.1: resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} hasBin: true @@ -11990,6 +12267,12 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + /nanomatch/1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} @@ -13799,6 +14082,15 @@ packages: source-map: 0.6.1 dev: false + /postcss/8.4.16: + resolution: {integrity: sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + /postcss/8.4.5: resolution: {integrity: sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==} engines: {node: ^10 || ^12 || >=14} @@ -14435,6 +14727,13 @@ packages: dev: false optional: true + /rename-overwrite/4.0.2: + resolution: {integrity: sha512-L1sgBgagVgOgb1Z6QZr1yJgSMHI4SXQqAH0l/UbeyHnLKxECvKIlyVEmBo4BqsCAZGg0SBSyjCh68lis5PgC7g==} + engines: {node: '>=12.10'} + dependencies: + '@zkochan/rimraf': 2.1.2 + dev: false + /renderkid/2.0.7: resolution: {integrity: sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==} dependencies: @@ -14535,10 +14834,19 @@ packages: resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} hasBin: true dependencies: - is-core-module: 2.8.1 + is-core-module: 2.10.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.10.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + /responselike/1.0.2: resolution: {integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=} dependencies: @@ -14604,6 +14912,14 @@ packages: optionalDependencies: fsevents: 2.3.2 + /rollup/2.77.3: + resolution: {integrity: sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: false + /run-async/2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -15084,6 +15400,10 @@ packages: resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} engines: {node: '>= 8'} + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + dev: false + /space-separated-tokens/2.0.1: resolution: {integrity: sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==} dev: false @@ -15553,6 +15873,15 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: false + /symlink-dir/5.0.1: + resolution: {integrity: sha512-MeXygPBopo8AmyObuCJIpXKT+mw54d2Kp6SBuxq0uXZGDkHwHDQExpSg5+TK8BA5kCGyktawu5DJG0QWYO6acw==} + engines: {node: '>=12.10'} + hasBin: true + dependencies: + better-path-resolve: 1.0.0 + rename-overwrite: 4.0.2 + dev: false + /tapable/1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} @@ -16052,6 +16381,10 @@ packages: resolution: {integrity: sha512-YTnDRlE1cIofRqOFN8ioAbz9qenDvkgVMSn0cnxvIDjM9sfEOMKB0ybMr+otSlCXMfQ/X35haYRoI7Nua82RrA==} dev: false + /ufo/0.8.5: + resolution: {integrity: sha512-e4+UtA5IRO+ha6hYklwj6r7BjiGMxS0O+UaSg9HbaTefg4kMkzj4tXzEBajRR+wkxf+golgAWKzLbytCUDMJAA==} + dev: false + /uglify-js/3.15.1: resolution: {integrity: sha512-FAGKF12fWdkpvNJZENacOH0e/83eG6JyVQyanIJaBXCN1J11TUQv1T1/z8S+Z0CG0ZPk1nPcreF/c7lrTd0TEQ==} engines: {node: '>=0.8.0'} @@ -16503,10 +16836,24 @@ packages: vfile-message: 3.1.0 dev: false + /vite-plugin-glob/0.2.8: + resolution: {integrity: sha512-Xs9rlEdDW33yfs72Iugu/y3H0AK48DkldM8t5i+LAlXF3GaKA9oFerWZih7qp5cibg4JI99wnMSYHcj/awP7Eg==} + dependencies: + acorn: 8.8.0 + fast-glob: 3.2.11 + magic-string: 0.26.2 + micromatch: 4.0.5 + ufo: 0.8.5 + dev: false + /vite-plugin-import-build/0.1.2: resolution: {integrity: sha512-Jh4wanyvJ5QLDrVtw6VsTqT+1yISp1Fa+5v7VSwf5xyRiYZ0VeffMrSQFrQlt50D7g3CpO/aX9/X/SVWCVCa0w==} dev: false + /vite-plugin-import-build/0.2.3: + resolution: {integrity: sha512-1rabB70KOfThrgT9SOjvKbHwVGaILbiywwEIZgjAI+l4B1VSeYZPyQeoOqd9/I2nzXcoMT3OSWfVi429YzoQbg==} + dev: false + /vite-plugin-mdx/3.5.10_p5zckwea5dbiw3d6gnyruevblq: resolution: {integrity: sha512-tfGNRwkO23pln9EYqhbsOLEx9Qot5+enl+727gop7+HGEoC87+88hLRWGL+FU/It1Y0a5P3OAyDbTKKHX6tEJw==} peerDependencies: @@ -16557,6 +16904,29 @@ packages: vite-plugin-import-build: 0.1.2 dev: false + /vite-plugin-ssr/0.4.26_vite@3.0.9: + resolution: {integrity: sha512-VCGy7XBko2hVe7HwMaifIPI2TcFP4TqcItLapgtY/SSfqekwruLyAm1h1tKATf75pyZlquCJcOij9f6EpIuzhQ==} + engines: {node: '>=12.19.0'} + hasBin: true + peerDependencies: + vite: '>=2.9.10' + dependencies: + '@brillout/debug': 0.1.1 + '@brillout/json-s': 0.4.6 + '@brillout/libassert': 0.5.8 + cac: 6.7.12 + es-module-lexer: 0.10.5 + fast-glob: 3.2.11 + kolorist: 1.5.1 + p-limit: 3.1.0 + picocolors: 1.0.0 + resolve: 1.22.1 + symlink-dir: 5.0.1 + vite: 3.0.9 + vite-plugin-glob: 0.2.8 + vite-plugin-import-build: 0.2.3 + dev: false + /vite/2.6.7: resolution: {integrity: sha512-ewk//jve9k6vlU8PfJmWUHN8k0YYdw4VaKOMvoQ3nT2Pb6k5OSMKQi4jPOzVH/TlUqMsCrq7IJ80xcuDDVyigg==} engines: {node: '>=12.2.0'} @@ -16652,6 +17022,33 @@ packages: fsevents: 2.3.2 dev: false + /vite/3.0.9: + resolution: {integrity: sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + less: '*' + sass: '*' + stylus: '*' + terser: ^5.4.0 + peerDependenciesMeta: + less: + optional: true + sass: + optional: true + stylus: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.14.54 + postcss: 8.4.16 + resolve: 1.22.1 + rollup: 2.77.3 + optionalDependencies: + fsevents: 2.3.2 + dev: false + /vm-browserify/1.1.2: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} dev: false diff --git a/telefunc/node/utils/getOutDirs.ts b/telefunc/node/utils/getOutDirs.ts new file mode 100644 index 00000000..c66992e8 --- /dev/null +++ b/telefunc/node/utils/getOutDirs.ts @@ -0,0 +1,54 @@ +import type { UserConfig } from 'vite' +import { isSSR_config } from './isSSR' +import { assert, assertUsage } from './assert' +import { assertPosixPath } from './assertPosixPath' + +export { getOutDirs } +export { getOutDir } + +function getOutDir(config: UserConfig): string { + const outDir = config.build?.outDir || 'dist' + assertIsNotAbsolute(outDir) + const { outDirClient, outDirServer } = getOutDirs(outDir, { isRoot: true }) + if (isSSR_config(config)) { + return outDirServer + } else { + return outDirClient + } +} + +function getOutDirs(outDir: string, options: { isRoot?: true } = {}) { + assertPosixPath(outDir) + let outDirRoot: string + if (isNotRoot(outDir)) { + assert(!options.isRoot, { outDir }) + assert('/client'.length === '/server'.length) + outDirRoot = outDir.slice(0, -1 * '/client'.length) + } else { + outDirRoot = outDir + } + assert(isRoot(outDirRoot), { outDir, options }) + const outDirClient = `${outDirRoot}/client` + const outDirServer = `${outDirRoot}/server` + return { outDirRoot, outDirClient, outDirServer } +} + +function isRoot(outDir: string) { + const p = outDir.split('/').filter(Boolean) + const dir = p[p.length - 1] + return dir !== 'client' && dir !== 'server' +} +function isNotRoot(outDir: string) { + return outDir.endsWith('/client') || outDir.endsWith('/server') +} + +function assertIsNotAbsolute(outDir: string) { + assertUsage( + firstSegment(outDir) !== firstSegment(process.cwd()), + "vite.config.js#build.outDir is not allowed to be an absolute path, e.g. set its value to 'build/' instead of `path.join(__dirname, 'build/')`" + ) +} + +function firstSegment(p: string) { + return p.split(/\/|\\/).filter(Boolean)[0] +} diff --git a/telefunc/node/vite/utils/isSSR.ts b/telefunc/node/utils/isSSR.ts similarity index 87% rename from telefunc/node/vite/utils/isSSR.ts rename to telefunc/node/utils/isSSR.ts index cbd189ac..bd1687f9 100644 --- a/telefunc/node/vite/utils/isSSR.ts +++ b/telefunc/node/utils/isSSR.ts @@ -1,4 +1,5 @@ -import { assert, isObject } from '../../utils' +import { assert } from './assert' +import { isObject } from './isObject' export { isSSR_config } export { isSSR_options } diff --git a/telefunc/node/vite/clear.ts b/telefunc/node/vite/clear.ts index fd580c3f..99995c87 100644 --- a/telefunc/node/vite/clear.ts +++ b/telefunc/node/vite/clear.ts @@ -1,8 +1,3 @@ -import { distLinkOff } from './distLink' import { importGlobOff } from './importGlob' - // Remove `import.meta.glob()` (otherwise bundlers like webpack will complain) importGlobOff() - -// Remove `dist/` link -distLinkOff() diff --git a/telefunc/node/vite/distLink.ts b/telefunc/node/vite/distLink.ts deleted file mode 100644 index d52d3dd2..00000000 --- a/telefunc/node/vite/distLink.ts +++ /dev/null @@ -1,45 +0,0 @@ -export { distLinkOff } -export { distLinkOn } - -import { writeFileSync } from 'fs' -import { posix } from 'path' -import type { Plugin } from 'vite' -import { assert, toPosixPath } from '../utils' -import { isSSR_config } from './utils' -const dir = __dirname + (() => '')() // trick to avoid `@vercel/ncc` to glob import -const telefuncFilesGlobFromDistPath = `${dir}/telefuncFilesGlobFromDist.js` - -function distLinkOff() { - writeFileSync(telefuncFilesGlobFromDistPath, ['exports.distLinkActivated = false;', ''].join('\n')) -} - -function distLinkOn(): Plugin { - let ssr: boolean - let root: undefined | string - return { - name: 'telefunc:distLinkOn', - apply: 'build', - configResolved(config) { - ssr = isSSR_config(config) - root = config.root ? toPosixPath(config.root) : toPosixPath(process.cwd()) - }, - generateBundle() { - assert(typeof ssr === 'boolean') - if (!ssr) { - return - } - assert(root) - // To `require()` an absolute path doesn't seem to work on Vercel - const rootRelative = posix.relative(toPosixPath(dir), root) - writeFileSync( - telefuncFilesGlobFromDistPath, - [ - 'exports.distLinkActivated = true;', - `const { telefuncFilesGlob } = require('${rootRelative}/dist/server/telefuncFilesGlob.js');`, - `exports.telefuncFilesGlob = telefuncFilesGlob;`, - '' - ].join('\n') - ) - } - } as Plugin -} diff --git a/telefunc/node/vite/index.ts b/telefunc/node/vite/index.ts index 5721cdd3..74cae30f 100644 --- a/telefunc/node/vite/index.ts +++ b/telefunc/node/vite/index.ts @@ -6,11 +6,10 @@ import { build } from './build' import { packageJsonFile } from './packageJsonFile' import { retrieveDevServer } from './retrieveDevServer' import type { Plugin } from 'vite' -import { distLinkOn, distLinkOff } from './distLink' +import { importBuild } from './plugins/importBuild' import { importGlobOn } from './importGlob' function plugin(): Plugin[] { - distLinkOff() importGlobOn() return [ { @@ -26,6 +25,6 @@ function plugin(): Plugin[] { transform(), build(), packageJsonFile(), - distLinkOn() + ...importBuild() ] } diff --git a/telefunc/node/vite/loadTelefuncFilesWithVite.ts b/telefunc/node/vite/loadTelefuncFilesWithVite.ts index 30405117..09495e10 100644 --- a/telefunc/node/vite/loadTelefuncFilesWithVite.ts +++ b/telefunc/node/vite/loadTelefuncFilesWithVite.ts @@ -1,12 +1,11 @@ export { loadTelefuncFilesWithVite } +import { loadImportBuildFile } from 'vite-plugin-import-build/loadImportBuildFile' import { assert, assertWarning, hasProp, isObject } from '../utils' -import { telefuncFilesGlobFileNameBase } from './telefuncFilesGlobFileNameBase' import { telefuncFilesGlobFilePath } from './telefuncFilesGlobPath' -import { moduleExists, nodeRequire } from '../utils' -import { resolve } from 'path' import type { ViteDevServer } from 'vite' import { GlobFiles, loadGlobFiles } from './loadGlobFiles' +import { loadTelefuncFilesWithImportBuild } from './plugins/importBuild/loadBuild' async function loadTelefuncFilesWithVite(runContext: { root: string | null @@ -42,41 +41,16 @@ async function loadGlobImporter(runContext: { runContext.viteDevServer.ssrFixStacktrace(err as Error) throw err } - return { moduleExports, provider: 'DEV_SERVER' as const } + return { moduleExports, provider: 'viteDevServer' as const } } - /* { - let moduleExports: unknown | null = null - try { - moduleExports = await import('./telefuncFilesGlob') - } catch (_) {} - if (moduleExports !== null) { - assert(!hasProp(moduleExports, 'importGlobUnset')) - return { moduleExports, provider: 'DIRECT' as const } - } - } - */ - - { - const moduleExports: unknown = await import('./telefuncFilesGlobFromDist') - if (!hasProp(moduleExports, 'distLinkUnset', 'true')) { - assert(hasProp(moduleExports, 'distLinkActivated', 'boolean')) - if (moduleExports.distLinkActivated === true) { - assertProd(runContext) - return { moduleExports, provider: 'DIST_LINK' as const } - } - } - } - - if (runContext.root) { - const userDist = `${runContext.root}/dist` - const prodPath = `${userDist}/server/${telefuncFilesGlobFileNameBase}.js` - const prodPathResolved = resolve(prodPath) - if (moduleExists(prodPathResolved)) { - const moduleExports: unknown = nodeRequire(prodPathResolved) + const { success, entryFile } = await loadImportBuildFile() + if (success) { + const moduleExports = await loadTelefuncFilesWithImportBuild() + assert(moduleExports, { entryFile }) assertProd(runContext) - return { moduleExports, provider: 'NODE_JS' as const } + return { moduleExports, provider: 'importBuild.cjs' as const } } } diff --git a/telefunc/node/vite/plugins/importBuild/index.ts b/telefunc/node/vite/plugins/importBuild/index.ts new file mode 100644 index 00000000..c2a011e5 --- /dev/null +++ b/telefunc/node/vite/plugins/importBuild/index.ts @@ -0,0 +1,45 @@ +export { importBuild } + +import { importBuildPlugin } from 'vite-plugin-import-build/plugin' +import type { Plugin, ResolvedConfig } from 'vite' +import { projectInfo, toPosixPath, getOutDirs } from '../../utils' +import path from 'path' +import { telefuncFilesGlobFileNameBase } from '../../telefuncFilesGlobFileNameBase' + +function importBuild(): Plugin[] { + let config: ResolvedConfig + return [ + { + name: 'telefunc:importBuild:config', + enforce: 'post', + configResolved(config_) { + config = config_ + } + }, + importBuildPlugin({ + getImporterCode: ({ findBuildEntry }) => { + const telefuncFilesEntry = findBuildEntry(telefuncFilesGlobFileNameBase) + return getImporterCode(config, telefuncFilesEntry) + }, + libraryName: projectInfo.projectName + }) + ] +} + +function getImporterCode(config: ResolvedConfig, telefuncFilesEntry: string) { + // Current file: node_modules/telefunc/dist/node/vite/plugins/importBuild/index.js + const importPathAbsolute = toPosixPath( + require.resolve(`../../../../../dist/node/vite/plugins/importBuild/loadBuild.js`) + ) + const { outDirServer } = getOutDirs(config.build.outDir) + const outDirServerAbsolute = path.posix.join(config.root, outDirServer) + const importPath = path.posix.relative(outDirServerAbsolute, importPathAbsolute) + const importerCode = [ + `const { setBuildLoader } = require('${importPath}');`, + 'setBuildLoader({', + ` loadTelefuncFiles: () => import('./${telefuncFilesEntry}')`, + '});', + '' + ].join('\n') + return importerCode +} diff --git a/telefunc/node/vite/plugins/importBuild/loadBuild.ts b/telefunc/node/vite/plugins/importBuild/loadBuild.ts new file mode 100644 index 00000000..1848a01d --- /dev/null +++ b/telefunc/node/vite/plugins/importBuild/loadBuild.ts @@ -0,0 +1,23 @@ +export { loadTelefuncFilesWithImportBuild } +export { setBuildLoader } + +const buildGetter = (globalThis.__telefunc_vite_buildGetter = globalThis.__telefunc_vite_buildGetter || { + loadTelefuncFiles: null +}) + +function setBuildLoader({ loadTelefuncFiles }: { loadTelefuncFiles: () => Promise }) { + buildGetter.loadTelefuncFiles = loadTelefuncFiles +} +async function loadTelefuncFilesWithImportBuild(): Promise { + if (buildGetter.loadTelefuncFiles === null) { + return null + } + const moduleExports = await buildGetter.loadTelefuncFiles() + return moduleExports +} + +declare global { + var __telefunc_vite_buildGetter: { + loadTelefuncFiles: (() => Promise) | null + } +} diff --git a/telefunc/node/vite/telefuncFilesGlobFromDist.ts b/telefunc/node/vite/telefuncFilesGlobFromDist.ts deleted file mode 100644 index 822f3790..00000000 --- a/telefunc/node/vite/telefuncFilesGlobFromDist.ts +++ /dev/null @@ -1 +0,0 @@ -export const distLinkUnset = true diff --git a/telefunc/node/vite/utils/index.ts b/telefunc/node/vite/utils/index.ts index 75793ea9..4a502343 100644 --- a/telefunc/node/vite/utils/index.ts +++ b/telefunc/node/vite/utils/index.ts @@ -1,3 +1,6 @@ -export * from './isSSR' +export * from '../../utils/isSSR' export * from '../../utils/assert' export * from '../../utils/assertPosixPath' +export * from '../../utils/projectInfo' +export * from '../../utils/filesystemPathHandling' +export * from '../../utils/getOutDirs' diff --git a/telefunc/package.json b/telefunc/package.json index 8c527e17..bf0da718 100644 --- a/telefunc/package.json +++ b/telefunc/package.json @@ -26,6 +26,11 @@ "node": "./dist/node/client.js", "worker": "./dist/node/client.js" }, + "./react": { + "worker": "./dist/node/react/index.js", + "node": "./dist/node/react/index.js", + "browser": "./dist/client/reac/index.js" + }, "./vite": { "node": "./dist/node/vite/index.js" }, @@ -46,6 +51,7 @@ "@brillout/json-s": "^0.4.6", "@brillout/libassert": "^0.5.8", "es-module-lexer": "^0.7.1", + "vite-plugin-import-build": "^0.2.3", "ts-morph": "^14.0.0" }, "devDependencies": { diff --git a/telefunc/tsconfig.base.json b/telefunc/tsconfig.base.json index b930d5fb..9052a3ce 100644 --- a/telefunc/tsconfig.base.json +++ b/telefunc/tsconfig.base.json @@ -5,6 +5,7 @@ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, + "esModuleInterop": true, "noUncheckedIndexedAccess": true } }