summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Bjorn Lu <bjornlu.dev@gmail.com> 2022-10-28 23:30:54 +0800
committerGravatar GitHub <noreply@github.com> 2022-10-28 23:30:54 +0800
commitc98c5aa0aecb4625aeedc2ffdad69f8b2cd2c153 (patch)
tree2de8845bd5457489075f3edc8aed669d83f66025
parent7f8987085c9c5bdcd39b9a6700303e9b9f76b9f2 (diff)
downloadastro-c98c5aa0aecb4625aeedc2ffdad69f8b2cd2c153.tar.gz
astro-c98c5aa0aecb4625aeedc2ffdad69f8b2cd2c153.tar.zst
astro-c98c5aa0aecb4625aeedc2ffdad69f8b2cd2c153.zip
Improve Solid libraries config handling (#5208)
-rw-r--r--.changeset/dull-moles-sell.md5
-rw-r--r--packages/integrations/solid/package.json3
-rw-r--r--packages/integrations/solid/src/dependencies.ts61
-rw-r--r--packages/integrations/solid/src/index.ts17
-rw-r--r--pnpm-lock.yaml13
5 files changed, 45 insertions, 54 deletions
diff --git a/.changeset/dull-moles-sell.md b/.changeset/dull-moles-sell.md
new file mode 100644
index 000000000..ba551c12a
--- /dev/null
+++ b/.changeset/dull-moles-sell.md
@@ -0,0 +1,5 @@
+---
+'@astrojs/solid-js': patch
+---
+
+Improve third-party solid packages config handling
diff --git a/packages/integrations/solid/package.json b/packages/integrations/solid/package.json
index df1fc3199..b867fd069 100644
--- a/packages/integrations/solid/package.json
+++ b/packages/integrations/solid/package.json
@@ -32,7 +32,8 @@
"dev": "astro-scripts dev \"src/**/*.ts\""
},
"dependencies": {
- "babel-preset-solid": "^1.4.2"
+ "babel-preset-solid": "^1.4.2",
+ "vitefu": "^0.1.0"
},
"devDependencies": {
"astro": "workspace:*",
diff --git a/packages/integrations/solid/src/dependencies.ts b/packages/integrations/solid/src/dependencies.ts
index 6a073148f..93e870bc1 100644
--- a/packages/integrations/solid/src/dependencies.ts
+++ b/packages/integrations/solid/src/dependencies.ts
@@ -1,55 +1,26 @@
-// This file is a fork of vite-plugin-solid.
-// Original: https://github.com/solidjs/vite-plugin-solid/blob/03130c8a0a2ceaab9a07e16f1e1df832b996e1b8/src/index.ts#L251-L297
-// License: MIT (https://github.com/solidjs/vite-plugin-solid/blob/03130c8a0a2ceaab9a07e16f1e1df832b996e1b8/package.json#L38)
-
-import fs from 'fs';
-import { createRequire } from 'module';
-import path from 'path';
import { fileURLToPath } from 'url';
+import { crawlFrameworkPkgs } from 'vitefu';
+
+export async function getSolidPkgsConfig(root: URL, isBuild: boolean) {
+ return await crawlFrameworkPkgs({
+ root: fileURLToPath(root),
+ isBuild,
+ isFrameworkPkgByJson(pkgJson) {
+ return containsSolidField(pkgJson.exports || {});
+ },
+ });
+}
+// Reference vite-plugin-solid heuristic
+// https://github.com/solidjs/vite-plugin-solid/blob/5558486b0c63788e1275244256918f80294a8338/src/index.ts#L251-L259
+// License: MIT (https://github.com/solidjs/vite-plugin-solid/blob/5558486b0c63788e1275244256918f80294a8338/package.json#L38)
function containsSolidField(fields: Record<string, any>) {
const keys = Object.keys(fields);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
if (key === 'solid') return true;
- if (typeof fields[key] === 'object' && containsSolidField(fields[key])) return true;
+ if (typeof fields[key] === 'object' && fields[key] != null && containsSolidField(fields[key]))
+ return true;
}
return false;
}
-
-export function getSolidDeps(root: URL) {
- const pkgPath = path.join(fileURLToPath(root), 'package.json');
- if (!fs.existsSync(pkgPath)) {
- // eslint-disable-next-line no-console
- console.log('No package.json found at project root');
- return [];
- }
- const require = createRequire(pkgPath);
- const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
- const deps = [...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.devDependencies || {})];
- const pkgs = deps.map((dep) => {
- try {
- return require(`${dep}/package.json`);
- } catch {
- try {
- let dir = path.dirname(require.resolve(dep));
- while (dir) {
- const subPkgPath = path.join(dir, 'package.json');
- if (fs.existsSync(subPkgPath)) {
- const subPkg = JSON.parse(fs.readFileSync(subPkgPath, 'utf-8'));
- if (subPkg && subPkg.name === dep) return subPkg;
- }
- const parent = path.dirname(dir);
- if (parent === dir) {
- break;
- }
- dir = parent;
- }
- } catch {}
- }
- });
- return deps.reduce<string[]>((acc, dep, i) => {
- if (pkgs[i] && pkgs[i].exports && containsSolidField(pkgs[i].exports)) acc.push(dep);
- return acc;
- }, []);
-}
diff --git a/packages/integrations/solid/src/index.ts b/packages/integrations/solid/src/index.ts
index 5241141a9..1a7667d59 100644
--- a/packages/integrations/solid/src/index.ts
+++ b/packages/integrations/solid/src/index.ts
@@ -1,5 +1,5 @@
import type { AstroIntegration, AstroRenderer } from 'astro';
-import { getSolidDeps } from './dependencies.js';
+import { getSolidPkgsConfig } from './dependencies.js';
function getRenderer(): AstroRenderer {
return {
@@ -24,10 +24,11 @@ function getRenderer(): AstroRenderer {
};
}
-function getViteConfiguration(isDev: boolean, root: URL) {
+async function getViteConfiguration(isDev: boolean, root: URL) {
// https://github.com/solidjs/vite-plugin-solid
// We inject the dev mode only if the user explicitely wants it or if we are in dev (serve) mode
const nestedDeps = ['solid-js', 'solid-js/web', 'solid-js/store', 'solid-js/html', 'solid-js/h'];
+ const solidPkgsConfig = await getSolidPkgsConfig(root, !isDev);
return {
/**
* We only need esbuild on .ts or .js files.
@@ -40,13 +41,13 @@ function getViteConfiguration(isDev: boolean, root: URL) {
alias: [{ find: /^solid-refresh$/, replacement: '/@solid-refresh' }],
},
optimizeDeps: {
- include: nestedDeps,
- exclude: ['@astrojs/solid-js/server.js'],
+ include: [...nestedDeps, ...solidPkgsConfig.optimizeDeps.include],
+ exclude: ['@astrojs/solid-js/server.js', ...solidPkgsConfig.optimizeDeps.exclude],
},
ssr: {
- external: ['babel-preset-solid'],
target: 'node',
- noExternal: ['solid-js', ...getSolidDeps(root)],
+ external: ['babel-preset-solid', ...solidPkgsConfig.ssr.external],
+ noExternal: ['solid-js', ...solidPkgsConfig.ssr.noExternal],
},
};
}
@@ -55,9 +56,9 @@ export default function (): AstroIntegration {
return {
name: '@astrojs/solid-js',
hooks: {
- 'astro:config:setup': ({ command, addRenderer, updateConfig, config }) => {
+ 'astro:config:setup': async ({ command, addRenderer, updateConfig, config }) => {
addRenderer(getRenderer());
- updateConfig({ vite: getViteConfiguration(command === 'dev', config.root) });
+ updateConfig({ vite: await getViteConfiguration(command === 'dev', config.root) });
},
},
};
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 1f451f101..c1ec52aab 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -3083,8 +3083,10 @@ importers:
astro-scripts: workspace:*
babel-preset-solid: ^1.4.2
solid-js: ^1.5.1
+ vitefu: ^0.1.0
dependencies:
babel-preset-solid: 1.6.0
+ vitefu: 0.1.0
devDependencies:
astro: link:../../astro
astro-scripts: link:../../../scripts
@@ -18008,6 +18010,17 @@ packages:
fsevents: 2.3.2
dev: false
+ /vitefu/0.1.0:
+ resolution: {integrity: sha512-5MQSHP9yr0HIve8q4XNb7QXfO1P4tzZDZP99qH0FM5ClcwYddeGXRDQ4TQYRUeXLjZ+vLecirHtGNpwFFUF7sw==}
+ peerDependencies:
+ vite: ^3.0.0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+ dependencies:
+ import-meta-resolve: 2.1.0
+ dev: false
+
/vitefu/0.1.0_vite@3.2.1:
resolution: {integrity: sha512-5MQSHP9yr0HIve8q4XNb7QXfO1P4tzZDZP99qH0FM5ClcwYddeGXRDQ4TQYRUeXLjZ+vLecirHtGNpwFFUF7sw==}
peerDependencies: