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