Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix vite watch mode dep optimizer #1876

Open
wants to merge 18 commits into
base: main
Choose a base branch
from
28 changes: 24 additions & 4 deletions packages/compat/src/compat-addons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { locateEmbroiderWorkingDir, RewrittenPackageCache, WaitForTrees } from '
import TreeSync from 'tree-sync';
import type CompatApp from './compat-app';
import { convertLegacyAddons } from './standalone-addon-build';
import { ensureSymlinkSync, writeFileSync, existsSync } from 'fs-extra';

// This build stage expects to be run with broccoli memoization enabled in order
// to get good rebuild performance. We turn it on by default here, but you can
Expand Down Expand Up @@ -47,11 +48,9 @@ export default class CompatAddons implements Stage {
},
changedMap: Map<string, boolean>
) {
let rewrittenPackages = resolve(locateEmbroiderWorkingDir(this.compatApp.root), 'rewritten-packages');
if (!this.treeSync) {
this.treeSync = new TreeSync(
addons,
resolve(locateEmbroiderWorkingDir(this.compatApp.root), 'rewritten-packages')
);
this.treeSync = new TreeSync(addons, rewrittenPackages);
}

if (
Expand All @@ -61,6 +60,27 @@ export default class CompatAddons implements Stage {
this.treeSync.sync();
RewrittenPackageCache.shared('embroider', this.compatApp.root).invalidateIndex();
}
const resolvableRewrittenPackages = resolve(
locateEmbroiderWorkingDir(this.compatApp.root),
'..',
'@embroider',
'rewritten-packages'
);
const embroiderDir = resolve(locateEmbroiderWorkingDir(this.compatApp.root), 'rewritten-packages');
if (existsSync(embroiderDir)) {
ensureSymlinkSync(embroiderDir, resolvableRewrittenPackages, 'dir');
writeFileSync(
resolve(resolvableRewrittenPackages, 'package.json'),
JSON.stringify(
{
name: '@embroider/rewritten-packages',
main: 'moved-package-target.js',
},
null,
2
)
);
}
this.didBuild = true;
}
}
47 changes: 47 additions & 0 deletions packages/core/src/module-resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
emberVirtualPackages,
emberVirtualPeerDeps,
extensionsPattern,
locateEmbroiderWorkingDir,
packageName as getPackageName,
packageName,
} from '@embroider/shared-internals';
Expand Down Expand Up @@ -184,6 +185,52 @@ export class Resolver {
// rehome requests to their un-rewritten locations, and for the most part we
// want to be dealing with the rewritten packages.
request = this.handleRewrittenPackages(request);
request = this.makeResolvable(request);
return request;
}

makeResolvable<R extends ModuleRequest>(request: R): R {
if (isTerminal(request)) {
return request;
}
if (request.fromFile.startsWith('@embroider/rewritten-packages')) {
let workingDir = locateEmbroiderWorkingDir(this.options.appRoot);
const rewrittenRoot = resolve(workingDir, 'rewritten-packages');
request = request.rehome(request.fromFile.replace('@embroider/rewritten-packages', rewrittenRoot));
}
if (request.fromFile && !request.fromFile.startsWith('./')) {
let fromPkg: Package;
try {
fromPkg =
this.packageCache.ownerOfFile(request.fromFile) || this.packageCache.ownerOfFile(this.options.appRoot)!;
} catch (e) {
fromPkg = this.packageCache.ownerOfFile(this.options.appRoot)!;
}

if (!fromPkg.isV2App()) {
return request;
}

let pkgName = getPackageName(request.specifier);
try {
let pkg = pkgName ? this.packageCache.resolve(pkgName, fromPkg!) : fromPkg;
if (!pkg.isV2Addon() || !pkg.meta['auto-upgraded'] || !pkg.root.includes('rewritten-packages')) {
// some tests make addons be auto-upgraded, but are not actually in rewritten-packages
return request;
}
let levels = ['..'];
if (pkg.name.startsWith('@')) {
levels.push('..');
}
let resolvedRoot = resolve(pkg.root, ...levels, ...levels, '..');
let specifier = request.specifier;
if (specifier.startsWith(pkg.name)) {
specifier = resolve(pkg.root, ...levels, request.specifier);
}
specifier = specifier.replace(resolvedRoot, '@embroider/rewritten-packages').replace(/\\/g, '/');
return request.alias(specifier).rehome(resolve(this.options.appRoot, 'package.json'));
} catch (e) {}
}
return request;
}

Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/virtual-entrypoint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { compile } from './js-handlebars';
import type { Resolver } from './module-resolver';
import type { CompatResolverOptions } from '../../compat/src/resolver-transform';
import { flatten, partition } from 'lodash';
import { join } from 'path';
import { join, resolve } from 'path';
import { extensionsPattern } from '@embroider/shared-internals';
import walkSync from 'walk-sync';
import type { V2AddonPackage } from '@embroider/shared-internals/src/package';
Expand Down Expand Up @@ -148,7 +148,7 @@ export function renderEntrypoint(

return {
src: entryTemplate(params),
watches: [],
watches: [resolve('./app')],
};
}

Expand Down
5 changes: 3 additions & 2 deletions packages/vite/src/optimize-deps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@ export interface OptimizeDeps {
[key: string]: unknown;
}

export function optimizeDeps(): OptimizeDeps {
export function optimizeDeps(options?: OptimizeDeps): OptimizeDeps {
return {
exclude: ['@embroider/macros'],
...options,
exclude: ['@embroider/macros', ...(options?.exclude || [])],
extensions: ['.hbs', '.gjs', '.gts'],
esbuildOptions: {
plugins: [esBuildResolver()],
Expand Down
Loading