1import { getExtensions, getLanguageExtensionsInOrder, getManagedExtensions } from '../extensions';
2
3describe('getExtensions', () => {
4  it(`enforces \`string[]\``, async () => {
5    expect(() => getExtensions('web')).toThrow(`string[]`);
6    expect(() => getExtensions([], 'js')).toThrow(`string[]`);
7    expect(() => getExtensions([], [], 'expo')).toThrow(`string[]`);
8    expect(() => getExtensions([], null, [])).toThrow(`string[]`);
9  });
10});
11
12describe('getManagedExtensions', () => {
13  it(`creates extensions for web`, async () => {
14    expect(getManagedExtensions(['web'])).toMatchSnapshot();
15  });
16
17  it(`creates extensions for iOS`, async () => {
18    expect(getManagedExtensions(['ios', 'native'])).toMatchSnapshot();
19  });
20});
21
22// Enforce that all extensions are returned in the correct order, this is very important!
23describe('getLanguageExtensionsInOrder', () => {
24  // Return only support for the bare minimum
25  it(`JS only`, async () => {
26    expect(
27      getLanguageExtensionsInOrder({ isTS: false, isModern: false, isReact: false })
28    ).toStrictEqual(['js']);
29  });
30
31  // Modern should come before JS in a basic MJS project
32  it(`Modern JS`, async () => {
33    expect(
34      getLanguageExtensionsInOrder({ isTS: false, isModern: true, isReact: false })
35    ).toStrictEqual(['mjs', 'js']);
36  });
37
38  // TypeScript should precede JavaScript
39  it(`TypeScript`, async () => {
40    expect(
41      getLanguageExtensionsInOrder({ isTS: true, isModern: false, isReact: false })
42    ).toStrictEqual(['ts', 'js']);
43  });
44
45  // JS should precede JSX files
46  it(`React`, async () => {
47    expect(
48      getLanguageExtensionsInOrder({ isTS: false, isModern: false, isReact: true })
49    ).toStrictEqual(['js', 'jsx']);
50  });
51
52  // Modern should come before JS in a basic MJS project
53  it(`TypeScript React`, async () => {
54    expect(
55      getLanguageExtensionsInOrder({ isTS: true, isModern: false, isReact: true })
56    ).toStrictEqual(['ts', 'tsx', 'js', 'jsx']);
57  });
58
59  // Should include all extensions in the correct order
60  it(`Modern TypeScript React`, async () => {
61    expect(
62      getLanguageExtensionsInOrder({ isTS: true, isModern: true, isReact: true })
63    ).toStrictEqual(['ts', 'tsx', 'mjs', 'js', 'jsx']);
64  });
65});
66