Improve Solid libraries config handling (#5208)
This commit is contained in:
parent
7f8987085c
commit
c98c5aa0ae
5 changed files with 45 additions and 54 deletions
5
.changeset/dull-moles-sell.md
Normal file
5
.changeset/dull-moles-sell.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'@astrojs/solid-js': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Improve third-party solid packages config handling
|
|
@ -32,7 +32,8 @@
|
||||||
"dev": "astro-scripts dev \"src/**/*.ts\""
|
"dev": "astro-scripts dev \"src/**/*.ts\""
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"babel-preset-solid": "^1.4.2"
|
"babel-preset-solid": "^1.4.2",
|
||||||
|
"vitefu": "^0.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"astro": "workspace:*",
|
"astro": "workspace:*",
|
||||||
|
|
|
@ -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 { 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>) {
|
function containsSolidField(fields: Record<string, any>) {
|
||||||
const keys = Object.keys(fields);
|
const keys = Object.keys(fields);
|
||||||
for (let i = 0; i < keys.length; i++) {
|
for (let i = 0; i < keys.length; i++) {
|
||||||
const key = keys[i];
|
const key = keys[i];
|
||||||
if (key === 'solid') return true;
|
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;
|
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;
|
|
||||||
}, []);
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import type { AstroIntegration, AstroRenderer } from 'astro';
|
import type { AstroIntegration, AstroRenderer } from 'astro';
|
||||||
import { getSolidDeps } from './dependencies.js';
|
import { getSolidPkgsConfig } from './dependencies.js';
|
||||||
|
|
||||||
function getRenderer(): AstroRenderer {
|
function getRenderer(): AstroRenderer {
|
||||||
return {
|
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
|
// 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
|
// 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 nestedDeps = ['solid-js', 'solid-js/web', 'solid-js/store', 'solid-js/html', 'solid-js/h'];
|
||||||
|
const solidPkgsConfig = await getSolidPkgsConfig(root, !isDev);
|
||||||
return {
|
return {
|
||||||
/**
|
/**
|
||||||
* We only need esbuild on .ts or .js files.
|
* 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' }],
|
alias: [{ find: /^solid-refresh$/, replacement: '/@solid-refresh' }],
|
||||||
},
|
},
|
||||||
optimizeDeps: {
|
optimizeDeps: {
|
||||||
include: nestedDeps,
|
include: [...nestedDeps, ...solidPkgsConfig.optimizeDeps.include],
|
||||||
exclude: ['@astrojs/solid-js/server.js'],
|
exclude: ['@astrojs/solid-js/server.js', ...solidPkgsConfig.optimizeDeps.exclude],
|
||||||
},
|
},
|
||||||
ssr: {
|
ssr: {
|
||||||
external: ['babel-preset-solid'],
|
|
||||||
target: 'node',
|
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 {
|
return {
|
||||||
name: '@astrojs/solid-js',
|
name: '@astrojs/solid-js',
|
||||||
hooks: {
|
hooks: {
|
||||||
'astro:config:setup': ({ command, addRenderer, updateConfig, config }) => {
|
'astro:config:setup': async ({ command, addRenderer, updateConfig, config }) => {
|
||||||
addRenderer(getRenderer());
|
addRenderer(getRenderer());
|
||||||
updateConfig({ vite: getViteConfiguration(command === 'dev', config.root) });
|
updateConfig({ vite: await getViteConfiguration(command === 'dev', config.root) });
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -3083,8 +3083,10 @@ importers:
|
||||||
astro-scripts: workspace:*
|
astro-scripts: workspace:*
|
||||||
babel-preset-solid: ^1.4.2
|
babel-preset-solid: ^1.4.2
|
||||||
solid-js: ^1.5.1
|
solid-js: ^1.5.1
|
||||||
|
vitefu: ^0.1.0
|
||||||
dependencies:
|
dependencies:
|
||||||
babel-preset-solid: 1.6.0
|
babel-preset-solid: 1.6.0
|
||||||
|
vitefu: 0.1.0
|
||||||
devDependencies:
|
devDependencies:
|
||||||
astro: link:../../astro
|
astro: link:../../astro
|
||||||
astro-scripts: link:../../../scripts
|
astro-scripts: link:../../../scripts
|
||||||
|
@ -18008,6 +18010,17 @@ packages:
|
||||||
fsevents: 2.3.2
|
fsevents: 2.3.2
|
||||||
dev: false
|
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:
|
/vitefu/0.1.0_vite@3.2.1:
|
||||||
resolution: {integrity: sha512-5MQSHP9yr0HIve8q4XNb7QXfO1P4tzZDZP99qH0FM5ClcwYddeGXRDQ4TQYRUeXLjZ+vLecirHtGNpwFFUF7sw==}
|
resolution: {integrity: sha512-5MQSHP9yr0HIve8q4XNb7QXfO1P4tzZDZP99qH0FM5ClcwYddeGXRDQ4TQYRUeXLjZ+vLecirHtGNpwFFUF7sw==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
|
|
Loading…
Reference in a new issue