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