1*97e1898cSEvan Baconimport { getExtensions, getBareExtensions, getLanguageExtensionsInOrder } from '../extensions';
2082815dcSEvan Bacon
3*97e1898cSEvan Bacondescribe(getExtensions, () => {
4082815dcSEvan Bacon  it(`enforces \`string[]\``, async () => {
5*97e1898cSEvan Bacon    // @ts-expect-error: test invalid input
6082815dcSEvan Bacon    expect(() => getExtensions('web')).toThrow(`string[]`);
7*97e1898cSEvan Bacon    // @ts-expect-error: test invalid input
8082815dcSEvan Bacon    expect(() => getExtensions([], 'js')).toThrow(`string[]`);
9*97e1898cSEvan Bacon    // @ts-expect-error: test invalid input
10082815dcSEvan Bacon    expect(() => getExtensions([], [], 'expo')).toThrow(`string[]`);
11*97e1898cSEvan Bacon    // @ts-expect-error: test invalid input
12082815dcSEvan Bacon    expect(() => getExtensions([], null, [])).toThrow(`string[]`);
13082815dcSEvan Bacon  });
14082815dcSEvan Bacon});
15082815dcSEvan Bacon
16*97e1898cSEvan Bacondescribe(getBareExtensions, () => {
17082815dcSEvan Bacon  it(`creates extensions for web`, async () => {
18*97e1898cSEvan Bacon    expect(getBareExtensions(['web'])).toMatchSnapshot();
19082815dcSEvan Bacon  });
20082815dcSEvan Bacon
21082815dcSEvan Bacon  it(`creates extensions for iOS`, async () => {
22*97e1898cSEvan Bacon    expect(getBareExtensions(['ios', 'native'])).toMatchSnapshot();
23082815dcSEvan Bacon  });
24082815dcSEvan Bacon});
25082815dcSEvan Bacon
26082815dcSEvan Bacon// Enforce that all extensions are returned in the correct order, this is very important!
27*97e1898cSEvan Bacondescribe(getLanguageExtensionsInOrder, () => {
28082815dcSEvan Bacon  // Return only support for the bare minimum
29082815dcSEvan Bacon  it(`JS only`, async () => {
30082815dcSEvan Bacon    expect(
31082815dcSEvan Bacon      getLanguageExtensionsInOrder({ isTS: false, isModern: false, isReact: false })
32082815dcSEvan Bacon    ).toStrictEqual(['js']);
33082815dcSEvan Bacon  });
34082815dcSEvan Bacon
35082815dcSEvan Bacon  // Modern should come before JS in a basic MJS project
36082815dcSEvan Bacon  it(`Modern JS`, async () => {
37082815dcSEvan Bacon    expect(
38082815dcSEvan Bacon      getLanguageExtensionsInOrder({ isTS: false, isModern: true, isReact: false })
39082815dcSEvan Bacon    ).toStrictEqual(['mjs', 'js']);
40082815dcSEvan Bacon  });
41082815dcSEvan Bacon
42082815dcSEvan Bacon  // TypeScript should precede JavaScript
43082815dcSEvan Bacon  it(`TypeScript`, async () => {
44082815dcSEvan Bacon    expect(
45082815dcSEvan Bacon      getLanguageExtensionsInOrder({ isTS: true, isModern: false, isReact: false })
46082815dcSEvan Bacon    ).toStrictEqual(['ts', 'js']);
47082815dcSEvan Bacon  });
48082815dcSEvan Bacon
49082815dcSEvan Bacon  // JS should precede JSX files
50082815dcSEvan Bacon  it(`React`, async () => {
51082815dcSEvan Bacon    expect(
52082815dcSEvan Bacon      getLanguageExtensionsInOrder({ isTS: false, isModern: false, isReact: true })
53082815dcSEvan Bacon    ).toStrictEqual(['js', 'jsx']);
54082815dcSEvan Bacon  });
55082815dcSEvan Bacon
56082815dcSEvan Bacon  // Modern should come before JS in a basic MJS project
57082815dcSEvan Bacon  it(`TypeScript React`, async () => {
58082815dcSEvan Bacon    expect(
59082815dcSEvan Bacon      getLanguageExtensionsInOrder({ isTS: true, isModern: false, isReact: true })
60082815dcSEvan Bacon    ).toStrictEqual(['ts', 'tsx', 'js', 'jsx']);
61082815dcSEvan Bacon  });
62082815dcSEvan Bacon
63082815dcSEvan Bacon  // Should include all extensions in the correct order
64082815dcSEvan Bacon  it(`Modern TypeScript React`, async () => {
65082815dcSEvan Bacon    expect(
66082815dcSEvan Bacon      getLanguageExtensionsInOrder({ isTS: true, isModern: true, isReact: true })
67082815dcSEvan Bacon    ).toStrictEqual(['ts', 'tsx', 'mjs', 'js', 'jsx']);
68082815dcSEvan Bacon  });
69082815dcSEvan Bacon});
70