UNPKG

@analogjs/vitest-angular

Version:

Vitest Builder for Angular

79 lines 11.8 kB
/** * @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=