|
| 1 | +// FIXME: Make these optional dependencies |
1 | 2 | import { Telemetry, getTelemetry } from './telemetry'; |
| 3 | +import { Resolver as _EmbroiderResolver } from '@embroider/core'; |
| 4 | +import { readFileSync } from 'node:fs'; |
| 5 | +import { resolve } from 'node:path'; |
2 | 6 |
|
3 | 7 | export default abstract class Resolver { |
4 | 8 | has(type: 'component' | 'helper' | 'ambiguous', name: string): boolean { |
@@ -57,3 +61,46 @@ function populateInvokeables(telemetry: Telemetry): [components: string[], helpe |
57 | 61 |
|
58 | 62 | return [components, helpers]; |
59 | 63 | } |
| 64 | + |
| 65 | +const EMBROIDER_COMPONENTS = '#embroider_compat/components'; |
| 66 | +const EMBROIDER_HELPERS = '#embroider_compat/helpers'; |
| 67 | +const EMBROIDER_AMBIGUOUS = '#embroider_compat/ambiguous'; |
| 68 | + |
| 69 | +export class EmbroiderResolver extends Resolver { |
| 70 | + static build(): EmbroiderResolver { |
| 71 | + // FIXME: Run build via execa ??? |
| 72 | + const stage2Output = readFileSync('dist/.stage2-output', 'utf8'); |
| 73 | + const resolver = new _EmbroiderResolver( |
| 74 | + JSON.parse(readFileSync(resolve(stage2Output, '.embroider/resolver.json'), 'utf8')) |
| 75 | + ); |
| 76 | + return new EmbroiderResolver(resolver, resolve(stage2Output, 'app.js')); |
| 77 | + } |
| 78 | + |
| 79 | + constructor(private _resolver: _EmbroiderResolver, private entryPoint: string) { |
| 80 | + super(); |
| 81 | + } |
| 82 | + |
| 83 | + override hasComponent(name: string): boolean { |
| 84 | + return this.resolve(`${EMBROIDER_COMPONENTS}/${name}`); |
| 85 | + } |
| 86 | + |
| 87 | + override hasHelper(name: string): boolean { |
| 88 | + return this.resolve(`${EMBROIDER_HELPERS}/${name}`); |
| 89 | + } |
| 90 | + |
| 91 | + override hasAmbiguous(name: string): boolean { |
| 92 | + return this.resolve(`${EMBROIDER_AMBIGUOUS}/${name}`); |
| 93 | + } |
| 94 | + |
| 95 | + private resolve(specifier: string): boolean { |
| 96 | + console.log(`Resolving ${specifier}`); |
| 97 | + const resolution = this._resolver.nodeResolve(specifier, this.entryPoint); |
| 98 | + switch (resolution.type) { |
| 99 | + case 'real': |
| 100 | + case 'virtual': |
| 101 | + return true; |
| 102 | + case 'not_found': |
| 103 | + return false; |
| 104 | + } |
| 105 | + } |
| 106 | +} |
0 commit comments