123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- /** @babel */
- import path from 'path';
- import PackageTranspilationRegistry from '../src/package-transpilation-registry';
- const originalCompiler = {
- getCachePath: (sourceCode, filePath) => {
- return 'orig-cache-path';
- },
- compile: (sourceCode, filePath) => {
- return sourceCode + '-original-compiler';
- },
- shouldCompile: (sourceCode, filePath) => {
- return path.extname(filePath) === '.js';
- }
- };
- describe('PackageTranspilationRegistry', () => {
- let registry;
- let wrappedCompiler;
- beforeEach(() => {
- registry = new PackageTranspilationRegistry();
- wrappedCompiler = registry.wrapTranspiler(originalCompiler);
- });
- it('falls through to the original compiler by default', () => {
- spyOn(originalCompiler, 'getCachePath');
- spyOn(originalCompiler, 'compile');
- spyOn(originalCompiler, 'shouldCompile');
- wrappedCompiler.getCachePath('source', '/path/to/file.js');
- wrappedCompiler.compile('source', '/path/to/filejs');
- wrappedCompiler.shouldCompile('source', '/path/to/file.js');
- expect(originalCompiler.getCachePath).toHaveBeenCalled();
- expect(originalCompiler.compile).toHaveBeenCalled();
- expect(originalCompiler.shouldCompile).toHaveBeenCalled();
- });
- describe('when a file is contained in a path that has custom transpilation', () => {
- const hitPath = path.join('/path/to/lib/file.js');
- const hitPathCoffee = path.join('/path/to/file2.coffee');
- const missPath = path.join('/path/other/file3.js');
- const hitPathMissSubdir = path.join('/path/to/file4.js');
- const hitPathMissExt = path.join('/path/to/file5.ts');
- const nodeModulesFolder = path.join('/path/to/lib/node_modules/file6.js');
- const hitNonStandardExt = path.join('/path/to/file7.omgwhatisthis');
- const jsSpec = {
- glob: 'lib/**/*.js',
- transpiler: './transpiler-js',
- options: { type: 'js' }
- };
- const coffeeSpec = {
- glob: '*.coffee',
- transpiler: './transpiler-coffee',
- options: { type: 'coffee' }
- };
- const omgSpec = {
- glob: '*.omgwhatisthis',
- transpiler: './transpiler-omg',
- options: { type: 'omg' }
- };
- const expectedMeta = {
- name: 'my-package',
- path: path.join('/path/to'),
- meta: { some: 'metadata' }
- };
- const jsTranspiler = {
- transpile: (sourceCode, filePath, options) => {
- return { code: sourceCode + '-transpiler-js' };
- },
- getCacheKeyData: (sourceCode, filePath, options) => {
- return 'js-transpiler-cache-data';
- }
- };
- const coffeeTranspiler = {
- transpile: (sourceCode, filePath, options) => {
- return { code: sourceCode + '-transpiler-coffee' };
- },
- getCacheKeyData: (sourceCode, filePath, options) => {
- return 'coffee-transpiler-cache-data';
- }
- };
- const omgTranspiler = {
- transpile: (sourceCode, filePath, options) => {
- return { code: sourceCode + '-transpiler-omg' };
- },
- getCacheKeyData: (sourceCode, filePath, options) => {
- return 'omg-transpiler-cache-data';
- }
- };
- beforeEach(() => {
- jsSpec._transpilerSource = 'js-transpiler-source';
- coffeeSpec._transpilerSource = 'coffee-transpiler-source';
- omgTranspiler._transpilerSource = 'omg-transpiler-source';
- spyOn(registry, 'getTranspiler').andCallFake(spec => {
- if (spec.transpiler === './transpiler-js') return jsTranspiler;
- if (spec.transpiler === './transpiler-coffee') return coffeeTranspiler;
- if (spec.transpiler === './transpiler-omg') return omgTranspiler;
- throw new Error('bad transpiler path ' + spec.transpiler);
- });
- registry.addTranspilerConfigForPath(
- path.join('/path/to'),
- 'my-package',
- { some: 'metadata' },
- [jsSpec, coffeeSpec, omgSpec]
- );
- });
- it('always returns true from shouldCompile for a file in that dir that match a glob', () => {
- spyOn(originalCompiler, 'shouldCompile').andReturn(false);
- expect(wrappedCompiler.shouldCompile('source', hitPath)).toBe(true);
- expect(wrappedCompiler.shouldCompile('source', hitPathCoffee)).toBe(true);
- expect(wrappedCompiler.shouldCompile('source', hitNonStandardExt)).toBe(
- true
- );
- expect(wrappedCompiler.shouldCompile('source', hitPathMissExt)).toBe(
- false
- );
- expect(wrappedCompiler.shouldCompile('source', hitPathMissSubdir)).toBe(
- false
- );
- expect(wrappedCompiler.shouldCompile('source', missPath)).toBe(false);
- expect(wrappedCompiler.shouldCompile('source', nodeModulesFolder)).toBe(
- false
- );
- });
- it('calls getCacheKeyData on the transpiler to get additional cache key data', () => {
- spyOn(registry, 'getTranspilerPath').andReturn('./transpiler-js');
- spyOn(jsTranspiler, 'getCacheKeyData').andCallThrough();
- wrappedCompiler.getCachePath('source', missPath, jsSpec);
- expect(jsTranspiler.getCacheKeyData).not.toHaveBeenCalledWith(
- 'source',
- missPath,
- jsSpec.options,
- expectedMeta
- );
- wrappedCompiler.getCachePath('source', hitPath, jsSpec);
- expect(jsTranspiler.getCacheKeyData).toHaveBeenCalledWith(
- 'source',
- hitPath,
- jsSpec.options,
- expectedMeta
- );
- });
- it('compiles files matching a glob with the associated transpiler, and the old one otherwise', () => {
- spyOn(jsTranspiler, 'transpile').andCallThrough();
- spyOn(coffeeTranspiler, 'transpile').andCallThrough();
- spyOn(omgTranspiler, 'transpile').andCallThrough();
- expect(wrappedCompiler.compile('source', hitPath)).toEqual(
- 'source-transpiler-js'
- );
- expect(jsTranspiler.transpile).toHaveBeenCalledWith(
- 'source',
- hitPath,
- jsSpec.options,
- expectedMeta
- );
- expect(wrappedCompiler.compile('source', hitPathCoffee)).toEqual(
- 'source-transpiler-coffee'
- );
- expect(coffeeTranspiler.transpile).toHaveBeenCalledWith(
- 'source',
- hitPathCoffee,
- coffeeSpec.options,
- expectedMeta
- );
- expect(wrappedCompiler.compile('source', hitNonStandardExt)).toEqual(
- 'source-transpiler-omg'
- );
- expect(omgTranspiler.transpile).toHaveBeenCalledWith(
- 'source',
- hitNonStandardExt,
- omgSpec.options,
- expectedMeta
- );
- expect(wrappedCompiler.compile('source', missPath)).toEqual(
- 'source-original-compiler'
- );
- expect(wrappedCompiler.compile('source', hitPathMissExt)).toEqual(
- 'source-original-compiler'
- );
- expect(wrappedCompiler.compile('source', hitPathMissSubdir)).toEqual(
- 'source-original-compiler'
- );
- expect(wrappedCompiler.compile('source', nodeModulesFolder)).toEqual(
- 'source-original-compiler'
- );
- });
- describe('when the packages root path contains node_modules', () => {
- beforeEach(() => {
- registry.addTranspilerConfigForPath(
- path.join('/path/with/node_modules/in/root'),
- 'my-other-package',
- { some: 'metadata' },
- [jsSpec]
- );
- });
- it('returns appropriate values from shouldCompile', () => {
- spyOn(originalCompiler, 'shouldCompile').andReturn(false);
- expect(
- wrappedCompiler.shouldCompile(
- 'source',
- '/path/with/node_modules/in/root/lib/test.js'
- )
- ).toBe(true);
- expect(
- wrappedCompiler.shouldCompile(
- 'source',
- '/path/with/node_modules/in/root/lib/node_modules/test.js'
- )
- ).toBe(false);
- });
- });
- });
- });
|