1import assert from 'assert';
2
3export type LanguageOptions = {
4  isTS: boolean;
5  isModern: boolean;
6  isReact: boolean;
7};
8
9export function getExtensions(
10  platforms: string[],
11  extensions: string[],
12  workflows: string[]
13): string[] {
14  // In the past we used spread operators to collect the values so now we enforce type safety on them.
15  assert(Array.isArray(platforms), 'Expected: `platforms: string[]`');
16  assert(Array.isArray(extensions), 'Expected: `extensions: string[]`');
17  assert(Array.isArray(workflows), 'Expected: `workflows: string[]`');
18
19  const fileExtensions = [];
20  // support .expo files
21  for (const workflow of [...workflows, '']) {
22    // Ensure order is correct: [platformA.js, platformB.js, js]
23    for (const platform of [...platforms, '']) {
24      // Support both TypeScript and JavaScript
25      for (const extension of extensions) {
26        fileExtensions.push([platform, workflow, extension].filter(Boolean).join('.'));
27      }
28    }
29  }
30  return fileExtensions;
31}
32
33export function getLanguageExtensionsInOrder({
34  isTS,
35  isModern,
36  isReact,
37}: LanguageOptions): string[] {
38  // @ts-ignore: filter removes false type
39  const addLanguage = (lang: string): string[] => [lang, isReact && `${lang}x`].filter(Boolean);
40
41  // Support JavaScript
42  let extensions = addLanguage('js');
43
44  if (isModern) {
45    extensions.unshift('mjs');
46  }
47  if (isTS) {
48    extensions = [...addLanguage('ts'), ...extensions];
49  }
50
51  return extensions;
52}
53
54export function getBareExtensions(
55  platforms: string[],
56  languageOptions: LanguageOptions = { isTS: true, isModern: true, isReact: true }
57): string[] {
58  const fileExtensions = getExtensions(
59    platforms,
60    getLanguageExtensionsInOrder(languageOptions),
61    []
62  );
63  // Always add these last
64  _addMiscellaneousExtensions(platforms, fileExtensions);
65  return fileExtensions;
66}
67
68function _addMiscellaneousExtensions(platforms: string[], fileExtensions: string[]): string[] {
69  // Always add these with no platform extension
70  // In the future we may want to add platform and workspace extensions to json.
71  fileExtensions.push('json');
72  // Native doesn't currently support web assembly.
73  if (platforms.includes('web')) {
74    fileExtensions.push('wasm');
75  }
76  return fileExtensions;
77}
78