@analogjs/vitest-angular
Version:
Vitest Builder for Angular
79 lines • 11.8 kB
JavaScript
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
// import assert from 'node:assert';
import { dirname, join, relative, resolve } from 'node:path';
export async function createAngularMemoryPlugin(options) {
const { normalizePath } = await Function('return import("vite")')();
const { outputFiles, external } = options;
let config;
let projectRoot;
const workspaceRoot = options?.workspaceRoot || process.cwd();
return {
name: 'vite:angular-memory',
// Ensures plugin hooks run before built-in Vite hooks
enforce: 'pre',
config(userConfig) {
config = userConfig;
projectRoot = resolve(workspaceRoot, config.root || '.');
},
async resolveId(source, importer) {
// Prevent vite from resolving an explicit external dependency (`externalDependencies` option)
if (external?.includes(source)) {
// This is still not ideal since Vite will still transform the import specifier to
// `/@id/${source}` but is currently closer to a raw external than a resolved file path.
return source;
}
if (importer) {
if (source[0] === '.' &&
normalizePath(importer).startsWith(projectRoot)) {
// Remove query if present
const [importerFile] = importer.split('?', 1);
source =
'/' + join(dirname(relative(projectRoot, importerFile)), source);
}
}
const [file] = source.split('?', 1);
const fileSplits = file.split('/');
if (outputFiles.has(fileSplits[fileSplits.length - 1])) {
return fileSplits[fileSplits.length - 1];
}
if (outputFiles.has(file)) {
return join(projectRoot, source);
}
return;
},
load(id) {
const [file] = id.split('?', 1);
const relativeFile = options.angularVersion < 19
? normalizePath(relative(projectRoot, file))
.replace(/^.*\//, '')
.replace('.ts', '.js')
: 'spec-' +
normalizePath(relative(projectRoot, file))
.replace('.ts', '.js')
.replace(/^[./]+/, '_')
.replace(/\//g, '-');
const codeContents = outputFiles.get(relativeFile)?.contents ||
outputFiles.get(id)?.contents;
if (codeContents === undefined) {
return undefined;
}
const code = Buffer.from(codeContents).toString('utf-8');
const mapContents = outputFiles.get(relativeFile + '.map')?.contents;
return {
// Remove source map URL comments from the code if a sourcemap is present.
// Vite will inline and add an additional sourcemap URL for the sourcemap.
code: mapContents
? code.replace(/^\/\/# sourceMappingURL=[^\r\n]*/gm, '')
: code,
map: mapContents && Buffer.from(mapContents).toString('utf-8'),
};
},
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1tZW1vcnktcGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdml0ZXN0LWFuZ3VsYXIvc3JjL2xpYi9idWlsZGVycy9idWlsZC9wbHVnaW5zL2FuZ3VsYXItbWVtb3J5LXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxvQ0FBb0M7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVc3RCxNQUFNLENBQUMsS0FBSyxVQUFVLHlCQUF5QixDQUM3QyxPQUFtQztJQUVuQyxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsTUFBTyxRQUFRLENBQ3ZDLHVCQUF1QixDQUN4QixFQUFxQyxDQUFDO0lBQ3ZDLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQzFDLElBQUksTUFBTSxDQUFDO0lBQ1gsSUFBSSxXQUFtQixDQUFDO0lBQ3hCLE1BQU0sYUFBYSxHQUFHLE9BQU8sRUFBRSxhQUFhLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRTlELE9BQU87UUFDTCxJQUFJLEVBQUUscUJBQXFCO1FBQzNCLHNEQUFzRDtRQUN0RCxPQUFPLEVBQUUsS0FBSztRQUNkLE1BQU0sQ0FBQyxVQUFlO1lBQ3BCLE1BQU0sR0FBRyxVQUFVLENBQUM7WUFDcEIsV0FBVyxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFjLEVBQUUsUUFBZ0I7WUFDOUMsOEZBQThGO1lBQzlGLElBQUksUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUMvQixrRkFBa0Y7Z0JBQ2xGLHdG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QyxRQUFRLENBQUMsT0FBTyxDQUFDO2FBQy9ELENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZVxuICovXG5cbi8vIGltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBBbmd1bGFyTWVtb3J5T3V0cHV0RmlsZXMgfSBmcm9tICcuLi91dGlscyc7XG5cbmludGVyZmFjZSBBbmd1bGFyTWVtb3J5UGx1Z2luT3B0aW9ucyB7XG4gIHdvcmtzcGFjZVJvb3Q/OiBzdHJpbmc7XG4gIGFuZ3VsYXJWZXJzaW9uOiBudW1iZXI7XG4gIG91dHB1dEZpbGVzOiBBbmd1bGFyTWVtb3J5T3V0cHV0RmlsZXM7XG4gIGV4dGVybmFsPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBbmd1bGFyTWVtb3J5UGx1Z2luKFxuICBvcHRpb25zOiBBbmd1bGFyTWVtb3J5UGx1Z2luT3B0aW9ucyxcbikge1xuICBjb25zdCB7IG5vcm1hbGl6ZVBhdGggfSA9IGF3YWl0IChGdW5jdGlvbihcbiAgICAncmV0dXJuIGltcG9ydChcInZpdGVcIiknLFxuICApKCkgYXMgUHJvbWlzZTx0eXBlb2YgaW1wb3J0KCd2aXRlJyk+KTtcbiAgY29uc3QgeyBvdXRwdXRGaWxlcywgZXh0ZXJuYWwgfSA9IG9wdGlvbnM7XG4gIGxldCBjb25maWc7XG4gIGxldCBwcm9qZWN0Um9vdDogc3RyaW5nO1xuICBjb25zdCB3b3Jrc3BhY2VSb290ID0gb3B0aW9ucz8ud29ya3NwYWNlUm9vdCB8fCBwcm9jZXNzLmN3ZCgpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3ZpdGU6YW5ndWxhci1tZW1vcnknLFxuICAgIC8vIEVuc3VyZXMgcGx1Z2luIGhvb2tzIHJ1biBiZWZvcmUgYnVpbHQtaW4gVml0ZSBob29rc1xuICAgIGVuZm9yY2U6ICdwcmUnLFxuICAgIGNvbmZpZyh1c2VyQ29uZmlnOiBhbnkpIHtcbiAgICAgIGNvbmZpZyA9IHVzZXJDb25maWc7XG4gICAgICBwcm9qZWN0Um9vdCA9IHJlc29sdmUod29ya3NwYWNlUm9vdCwgY29uZmlnLnJvb3QgfHwgJy4nKTtcbiAgICB9LFxuICAgIGFzeW5jIHJlc29sdmVJZChzb3VyY2U6IHN0cmluZywgaW1wb3J0ZXI6IHN0cmluZykge1xuICAgICAgLy8gUHJldmVudCB2aXRlIGZyb20gcmVzb2x2aW5nIGFuIGV4cGxpY2l0IGV4dGVybmFsIGRlcGVuZGVuY3kgKGBleHRlcm5hbERlcGVuZGVuY2llc2Agb3B0aW9uKVxuICAgICAgaWYgKGV4dGVybmFsPy5pbmNsdWRlcyhzb3VyY2UpKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgc3RpbGwgbm90IGlkZWFsIHNpbmNlIFZpdGUgd2lsbCBzdGlsbCB0cmFuc2Zvcm0gdGhlIGltcG9ydCBzcGVjaWZpZXIgdG9cbiAgICAgICAgLy8gYC9AaWQvJHtzb3VyY2V9YCBidXQgaXMgY3VycmVudGx5IGNsb3NlciB0byBhIHJhdyBleHRlcm5hbCB0aGFuIGEgcmVzb2x2ZWQgZmlsZSBwYXRoLlxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW1wb3J0ZXIpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNvdXJjZVswXSA9PT0gJy4nICYmXG4gICAgICAgICAgbm9ybWFsaXplUGF0aChpbXBvcnRlcikuc3RhcnRzV2l0aChwcm9qZWN0Um9vdClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIHF1ZXJ5IGlmIHByZXNlbnRcbiAgICAgICAgICBjb25zdCBbaW1wb3J0ZXJGaWxlXSA9IGltcG9ydGVyLnNwbGl0KCc/JywgMSk7XG4gICAgICAgICAgc291cmNlID1cbiAgICAgICAgICAgICcvJyArIGpvaW4oZGlybmFtZShyZWxhdGl2ZShwcm9qZWN0Um9vdCwgaW1wb3J0ZXJGaWxlKSksIHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgW2ZpbGVdID0gc291cmNlLnNwbGl0KCc/JywgMSk7XG4gICAgICBjb25zdCBmaWxlU3BsaXRzID0gZmlsZS5zcGxpdCgnLycpO1xuXG4gICAgICBpZiAob3V0cHV0RmlsZXMuaGFzKGZpbGVTcGxpdHNbZmlsZVNwbGl0cy5sZW5ndGggLSAxXSkpIHtcbiAgICAgICAgcmV0dXJuIGZpbGVTcGxpdHNbZmlsZVNwbGl0cy5sZW5ndGggLSAxXTtcbiAgICAgIH1cblxuICAgICAgaWYgKG91dHB1dEZpbGVzLmhhcyhmaWxlKSkge1xuICAgICAgICByZXR1cm4gam9pbihwcm9qZWN0Um9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9LFxuICAgIGxvYWQoaWQ6IHN0cmluZykge1xuICAgICAgY29uc3QgW2ZpbGVdID0gaWQuc3BsaXQoJz8nLCAxKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlRmlsZSA9XG4gICAgICAgIG9wdGlvbnMuYW5ndWxhclZlcnNpb24gPCAxOVxuICAgICAgICAgID8gbm9ybWFsaXplUGF0aChyZWxhdGl2ZShwcm9qZWN0Um9vdCwgZmlsZSkpXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9eLipcXC8vLCAnJylcbiAgICAgICAgICAgICAgLnJlcGxhY2UoJy50cycsICcuanMnKVxuICAgICAgICAgIDogJ3NwZWMtJyArXG4gICAgICAgICAgICBub3JtYWxpemVQYXRoKHJlbGF0aXZlKHByb2plY3RSb290LCBmaWxlKSlcbiAgICAgICAgICAgICAgLnJlcGxhY2UoJy50cycsICcuanMnKVxuICAgICAgICAgICAgICAucmVwbGFjZSgvXlsuL10rLywgJ18nKVxuICAgICAgICAgICAgICAucmVwbGFjZSgvXFwvL2csICctJyk7XG5cbiAgICAgIGNvbnN0IGNvZGVDb250ZW50cyA9XG4gICAgICAgIG91dHB1dEZpbGVzLmdldChyZWxhdGl2ZUZpbGUpPy5jb250ZW50cyB8fFxuICAgICAgICBvdXRwdXRGaWxlcy5nZXQoaWQpPy5jb250ZW50cztcbiAgICAgIGlmIChjb2RlQ29udGVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb2RlID0gQnVmZmVyLmZyb20oY29kZUNvbnRlbnRzKS50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIGNvbnN0IG1hcENvbnRlbnRzID0gb3V0cHV0RmlsZXMuZ2V0KHJlbGF0aXZlRmlsZSArICcubWFwJyk/LmNvbnRlbnRzO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAvLyBSZW1vdmUgc291cmNlIG1hcCBVUkwgY29tbWVudHMgZnJvbSB0aGUgY29kZSBpZiBhIHNvdXJjZW1hcCBpcyBwcmVzZW50LlxuICAgICAgICAvLyBWaXRlIHdpbGwgaW5saW5lIGFuZCBhZGQgYW4gYWRkaXRpb25hbCBzb3VyY2VtYXAgVVJMIGZvciB0aGUgc291cmNlbWFwLlxuICAgICAgICBjb2RlOiBtYXBDb250ZW50c1xuICAgICAgICAgID8gY29kZS5yZXBsYWNlKC9eXFwvXFwvIyBzb3VyY2VNYXBwaW5nVVJMPVteXFxyXFxuXSovZ20sICcnKVxuICAgICAgICAgIDogY29kZSxcbiAgICAgICAgbWFwOiBtYXBDb250ZW50cyAmJiBCdWZmZXIuZnJvbShtYXBDb250ZW50cykudG9TdHJpbmcoJ3V0Zi04JyksXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG4iXX0=