1*082815dcSEvan Baconimport { withPlugins } from '@expo/config-plugins';
2*082815dcSEvan Baconimport { ExpoConfig } from '@expo/config-types';
3*082815dcSEvan Baconimport { join } from 'path';
4*082815dcSEvan Bacon
5*082815dcSEvan Baconimport { withStaticPlugin } from '../withStaticPlugin';
6*082815dcSEvan Bacon
7*082815dcSEvan Baconfunction withInternal(config: ExpoConfig, projectRoot: string) {
8*082815dcSEvan Bacon  if (!config._internal) config._internal = {};
9*082815dcSEvan Bacon  config._internal.projectRoot = projectRoot;
10*082815dcSEvan Bacon  return config;
11*082815dcSEvan Bacon}
12*082815dcSEvan Bacon
13*082815dcSEvan Baconfunction withInternalRemoved(config: ExpoConfig) {
14*082815dcSEvan Bacon  delete config._internal;
15*082815dcSEvan Bacon  return config;
16*082815dcSEvan Bacon}
17*082815dcSEvan Bacon
18*082815dcSEvan Baconjest.unmock('resolve-from');
19*082815dcSEvan Bacon
20*082815dcSEvan Baconconst projectRoot = join(__dirname, 'fixtures/project-files');
21*082815dcSEvan Bacon
22*082815dcSEvan Bacon// Not using in-memory fs because the node resolution isn't mocked out.
23*082815dcSEvan Bacondescribe(withStaticPlugin, () => {
24*082815dcSEvan Bacon  it(`asserts wrong type`, () => {
25*082815dcSEvan Bacon    const config = withInternal(
26*082815dcSEvan Bacon      {
27*082815dcSEvan Bacon        name: 'foo',
28*082815dcSEvan Bacon        slug: 'foo',
29*082815dcSEvan Bacon      },
30*082815dcSEvan Bacon      '/'
31*082815dcSEvan Bacon    );
32*082815dcSEvan Bacon
33*082815dcSEvan Bacon    expect(() =>
34*082815dcSEvan Bacon      withStaticPlugin(config, {
35*082815dcSEvan Bacon        // @ts-ignore -- invalid type
36*082815dcSEvan Bacon        plugin: true,
37*082815dcSEvan Bacon      })
38*082815dcSEvan Bacon    ).toThrow('Plugin is an unexpected type: boolean');
39*082815dcSEvan Bacon    expect(() =>
40*082815dcSEvan Bacon      withStaticPlugin(config, {
41*082815dcSEvan Bacon        // @ts-ignore -- invalid type
42*082815dcSEvan Bacon        plugin: [true],
43*082815dcSEvan Bacon      })
44*082815dcSEvan Bacon    ).toThrow('Plugin is an unexpected type: boolean');
45*082815dcSEvan Bacon    expect(() =>
46*082815dcSEvan Bacon      withStaticPlugin(config, {
47*082815dcSEvan Bacon        // @ts-ignore -- invalid type
48*082815dcSEvan Bacon        plugin: {},
49*082815dcSEvan Bacon      })
50*082815dcSEvan Bacon    ).toThrow('Plugin is an unexpected type: object');
51*082815dcSEvan Bacon  });
52*082815dcSEvan Bacon  it(`asserts wrong number of arguments`, () => {
53*082815dcSEvan Bacon    const config = withInternal(
54*082815dcSEvan Bacon      {
55*082815dcSEvan Bacon        name: 'foo',
56*082815dcSEvan Bacon        slug: 'foo',
57*082815dcSEvan Bacon      },
58*082815dcSEvan Bacon      '/'
59*082815dcSEvan Bacon    );
60*082815dcSEvan Bacon
61*082815dcSEvan Bacon    expect(() =>
62*082815dcSEvan Bacon      withStaticPlugin(config, {
63*082815dcSEvan Bacon        // @ts-ignore -- invalid type
64*082815dcSEvan Bacon        plugin: ['', '', ''],
65*082815dcSEvan Bacon      })
66*082815dcSEvan Bacon    ).toThrow(
67*082815dcSEvan Bacon      'Wrong number of arguments provided for static config plugin, expected either 1 or 2, got 3'
68*082815dcSEvan Bacon    );
69*082815dcSEvan Bacon  });
70*082815dcSEvan Bacon  it(`uses internal projectRoot`, () => {
71*082815dcSEvan Bacon    let config: ExpoConfig = withInternal(
72*082815dcSEvan Bacon      {
73*082815dcSEvan Bacon        name: 'foo',
74*082815dcSEvan Bacon        slug: 'foo',
75*082815dcSEvan Bacon      },
76*082815dcSEvan Bacon      projectRoot
77*082815dcSEvan Bacon    );
78*082815dcSEvan Bacon
79*082815dcSEvan Bacon    config = withPlugins(config, [
80*082815dcSEvan Bacon      // @ts-ignore -- invalid type
81*082815dcSEvan Bacon      (c) =>
82*082815dcSEvan Bacon        withStaticPlugin(c, {
83*082815dcSEvan Bacon          plugin: './my-plugin.js',
84*082815dcSEvan Bacon        }),
85*082815dcSEvan Bacon      // @ts-ignore -- invalid type
86*082815dcSEvan Bacon      withInternalRemoved,
87*082815dcSEvan Bacon    ]);
88*082815dcSEvan Bacon
89*082815dcSEvan Bacon    expect(config).toStrictEqual({
90*082815dcSEvan Bacon      name: 'foo',
91*082815dcSEvan Bacon      slug: 'foo',
92*082815dcSEvan Bacon      extras: {
93*082815dcSEvan Bacon        modified: true,
94*082815dcSEvan Bacon      },
95*082815dcSEvan Bacon    });
96*082815dcSEvan Bacon  });
97*082815dcSEvan Bacon
98*082815dcSEvan Bacon  it(`passes props to plugin`, () => {
99*082815dcSEvan Bacon    let config: ExpoConfig = withInternal(
100*082815dcSEvan Bacon      {
101*082815dcSEvan Bacon        name: 'foo',
102*082815dcSEvan Bacon        slug: 'foo',
103*082815dcSEvan Bacon      },
104*082815dcSEvan Bacon      '.'
105*082815dcSEvan Bacon    );
106*082815dcSEvan Bacon
107*082815dcSEvan Bacon    config = withPlugins(config, [
108*082815dcSEvan Bacon      // @ts-ignore -- invalid type
109*082815dcSEvan Bacon      (c) =>
110*082815dcSEvan Bacon        withStaticPlugin(c, {
111*082815dcSEvan Bacon          plugin: ['./my-plugin.js', { foobar: true }],
112*082815dcSEvan Bacon          projectRoot,
113*082815dcSEvan Bacon        }),
114*082815dcSEvan Bacon      // Uses a folder with index.js
115*082815dcSEvan Bacon      // @ts-ignore -- invalid type
116*082815dcSEvan Bacon      (c) =>
117*082815dcSEvan Bacon        withStaticPlugin(c, {
118*082815dcSEvan Bacon          plugin: './beta',
119*082815dcSEvan Bacon          projectRoot,
120*082815dcSEvan Bacon        }),
121*082815dcSEvan Bacon    ]);
122*082815dcSEvan Bacon
123*082815dcSEvan Bacon    expect(config).toStrictEqual({
124*082815dcSEvan Bacon      name: 'foo',
125*082815dcSEvan Bacon      slug: 'foo',
126*082815dcSEvan Bacon      extras: {
127*082815dcSEvan Bacon        beta: true,
128*082815dcSEvan Bacon        modified: true,
129*082815dcSEvan Bacon        foobar: true,
130*082815dcSEvan Bacon      },
131*082815dcSEvan Bacon      _internal: {
132*082815dcSEvan Bacon        projectRoot: '.',
133*082815dcSEvan Bacon      },
134*082815dcSEvan Bacon    });
135*082815dcSEvan Bacon  });
136*082815dcSEvan Bacon
137*082815dcSEvan Bacon  it(`fails to resolve a non-existent file`, () => {
138*082815dcSEvan Bacon    const config = {
139*082815dcSEvan Bacon      name: 'foo',
140*082815dcSEvan Bacon      slug: 'foo',
141*082815dcSEvan Bacon    };
142*082815dcSEvan Bacon
143*082815dcSEvan Bacon    expect(() =>
144*082815dcSEvan Bacon      withStaticPlugin(config, {
145*082815dcSEvan Bacon        plugin: ['./not-existing.js', { foobar: true }],
146*082815dcSEvan Bacon        projectRoot,
147*082815dcSEvan Bacon      })
148*082815dcSEvan Bacon    ).toThrow(/Failed to resolve plugin for module ".\/not-existing.js"/);
149*082815dcSEvan Bacon  });
150*082815dcSEvan Bacon});
151