From 5fe4cb4d0d04ed198ad8c1de10aa2732baa0ca94 Mon Sep 17 00:00:00 2001 From: Lars Kappert Date: Wed, 8 Jan 2025 22:19:18 +0100 Subject: [PATCH] Plugin docs tweaks --- packages/docs/scripts/generate-plugin-docs.ts | 10 ++++++++-- packages/knip/src/plugins/expo/index.ts | 13 +++++++++---- packages/knip/src/plugins/metro/index.ts | 4 +++- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/packages/docs/scripts/generate-plugin-docs.ts b/packages/docs/scripts/generate-plugin-docs.ts index 52d76ac59..6ede728a2 100644 --- a/packages/docs/scripts/generate-plugin-docs.ts +++ b/packages/docs/scripts/generate-plugin-docs.ts @@ -46,7 +46,9 @@ for await (const dir of directories) { if (dir.isDirectory() && dir.name !== '_template') { const pluginName = dir.name; const pluginDir = path.join(pluginsDir, pluginName); - const plugin: Plugin = (await import(path.join(pluginDir, 'index.ts'))).default; + const mod = await import(path.join(pluginDir, 'index.ts')); + const plugin: Plugin = mod.default; + const docs: undefined | { entry?: string[]; production?: string[] } = mod.docs; const { title, enablers, note, args, config, entry, production, project } = plugin; @@ -57,7 +59,10 @@ for await (const dir of directories) { const defaults: Record = {}; if (config && config.length > 0) defaults.config = config; if (entry && entry.length > 0) defaults.entry = entry; + if (docs?.entry && docs.entry.length > 0) defaults.entry = [...(defaults.entry ?? []), ...docs.entry]; if (production && production.length > 0) defaults.entry = [...(defaults.entry ?? []), ...production]; + if (docs?.production && docs.production.length > 0) + defaults.entry = [...(defaults.entry ?? []), ...docs.production]; if (project && project.length > 0) defaults.project = project; const hasDefaultConfig = Object.values(defaults).some(v => v.length > 0); @@ -84,11 +89,12 @@ for await (const dir of directories) { const defaultConfig = hasDefaultConfig ? [ u('heading', { depth: 2 }, [u('text', 'Default configuration')]), - ...parseFragment('If enabled, this configuration is added automatically:'), + ...parseFragment('If this plugin is enabled, the following configuration is added automatically:'), u('code', { lang: 'json', // TODO How to set attributes/properties/props properly? value: JSON.stringify({ [pluginName]: defaults }, null, 2), }), + ...parseFragment('Depending on local configuration, plugins may modify the defaults as shown.'), ...parseFragment('Custom `config` or `entry` options override default values, they are not merged.'), ...parseFragment( 'See [Plugins](../../explanations/plugins) for more details about plugins and their `entry` and `config` options.' diff --git a/packages/knip/src/plugins/expo/index.ts b/packages/knip/src/plugins/expo/index.ts index 66f866af0..14b7a0cb8 100644 --- a/packages/knip/src/plugins/expo/index.ts +++ b/packages/knip/src/plugins/expo/index.ts @@ -15,14 +15,19 @@ const isEnabled: IsPluginEnabled = ({ dependencies }) => hasDependency(dependenc const config = ['app.json', 'app.config.{ts,js}']; +const production = ['app/**/*.{js,jsx,ts,tsx}', 'src/app/**/*.{js,jsx,ts,tsx}']; + +/** @public */ +export const docs = { production }; + const resolveEntryPaths: ResolveEntryPaths = async (expoConfig, { manifest }) => { const config = 'expo' in expoConfig ? expoConfig.expo : expoConfig; - let production: string[] = []; + let patterns: string[] = []; // https://docs.expo.dev/router/installation/#setup-entry-point if (manifest.main === 'expo-router/entry') { - production = ['app/**/*.{js,jsx,ts,tsx}', 'src/app/**/*.{js,jsx,ts,tsx}']; + patterns = [...production]; const normalizedPlugins = config.plugins?.map(plugin => (Array.isArray(plugin) ? plugin : ([plugin] as const))) ?? []; @@ -32,12 +37,12 @@ const resolveEntryPaths: ResolveEntryPaths = async (expoConfig, { ma const [, options] = expoRouterPlugin; if (typeof options?.root === 'string') { - production = [join(options.root, '**/*.{js,jsx,ts,tsx}')]; + patterns = [join(options.root, '**/*.{js,jsx,ts,tsx}')]; } } } - return production.map(entry => toProductionEntry(entry)); + return patterns.map(entry => toProductionEntry(entry)); }; const resolveConfig: ResolveConfig = async (expoConfig, options) => getDependencies(expoConfig, options); diff --git a/packages/knip/src/plugins/metro/index.ts b/packages/knip/src/plugins/metro/index.ts index 943be8ca1..d95e950f3 100644 --- a/packages/knip/src/plugins/metro/index.ts +++ b/packages/knip/src/plugins/metro/index.ts @@ -24,6 +24,9 @@ const DEFAULT_EXTENSIONS = ['js', 'jsx', 'json', 'ts', 'tsx']; const production = [`src/**/*.{${PLATFORMS.join(',')}}.{${DEFAULT_EXTENSIONS.join(',')}}`]; +/** @public */ +export const docs = { production }; + const resolveEntryPaths: ResolveEntryPaths = async config => { const platformEntryPatterns = compact(PLATFORMS.concat(config.resolver?.platforms ?? [])); const sourceExts = config.resolver?.sourceExts ?? DEFAULT_EXTENSIONS; @@ -56,7 +59,6 @@ export default { enablers, isEnabled, config, - production, resolveEntryPaths, resolveConfig, } satisfies Plugin;