(
id: string,
importer: string | undefined,
configuredAsExternal: boolean,
)
| 54 | } |
| 55 | |
| 56 | const isExternalizable = ( |
| 57 | id: string, |
| 58 | importer: string | undefined, |
| 59 | configuredAsExternal: boolean, |
| 60 | ): boolean => { |
| 61 | if (!bareImportRE.test(id) || id.includes('\0')) { |
| 62 | return false |
| 63 | } |
| 64 | try { |
| 65 | const resolved = tryNodeResolve( |
| 66 | id, |
| 67 | // Skip passing importer in build to avoid externalizing non-hoisted dependencies |
| 68 | // unresolvable from root (which would be unresolvable from output bundles also) |
| 69 | config.command === 'build' ? undefined : importer, |
| 70 | resolveOptions, |
| 71 | undefined, |
| 72 | false, |
| 73 | ) |
| 74 | if (!resolved) { |
| 75 | return false |
| 76 | } |
| 77 | // Only allow linked packages to be externalized |
| 78 | // if they are explicitly configured as external |
| 79 | if (!configuredAsExternal && !isInNodeModules(resolved.id)) { |
| 80 | return false |
| 81 | } |
| 82 | return canExternalizeFile(resolved.id) |
| 83 | } catch { |
| 84 | debug?.( |
| 85 | `Failed to node resolve "${id}". Skipping externalizing it by default.`, |
| 86 | ) |
| 87 | // may be an invalid import that's resolved by a plugin |
| 88 | return false |
| 89 | } |
| 90 | } |
| 91 | |
| 92 | // Returns true if it is configured as external, false if it is filtered |
| 93 | // by noExternal and undefined if it isn't affected by the explicit config |
no test coverage detected