/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow
 * @format
 */
'use strict';

const blacklist = require('./defaults/blacklist');
const os = require('os');
const path = require('path');

const {
  defaultCreateModuleIdFactory,
  platforms,
  providesModuleNodeModules,
} = require('./defaults/defaults');
const {FileStore} = require('metro-cache');

import type {OldConfigT as ConfigT} from './configTypes.flow.js';

const DEFAULT = ({
  allowPnp: true,
  assetRegistryPath: 'missing-asset-registry-path',
  enhanceMiddleware: middleware => middleware,
  extraNodeModules: {},
  cacheStores: [
    new FileStore({
      root: path.join(os.tmpdir(), 'metro-cache'),
    }),
  ],
  cacheVersion: '1.0',
  createModuleIdFactory: defaultCreateModuleIdFactory,
  dynamicDepsInPackages: 'throwAtRuntime',
  getAsyncRequireModulePath: () => 'metro/src/lib/bundle-modules/asyncRequire',
  getAssetExts: () => [],
  getBlacklistRE: () => blacklist(),
  getEnableBabelRCLookup: () => true,
  getPlatforms: () => platforms,
  getPolyfillModuleNames: () => [],
  getProjectRoots: undefined,
  // We assume the default project path is two levels up from
  // node_modules/metro/
  getProjectRoot: () => path.resolve(__dirname, '../../..'),
  getWatchFolders: () => [],
  getProvidesModuleNodeModules: () => providesModuleNodeModules.slice(),
  getRunModuleStatement: (moduleId: number | string) =>
    `__r(${JSON.stringify(moduleId)});`,
  getSourceExts: () => [],
  getTransformModulePath: () => 'metro-babel-transformer',
  getTransformOptions: async () => ({
    transform: {experimentalImportSupport: false, inlineRequires: false},
    preloadedModules: false,
    ramGroups: [],
  }),
  getPolyfills: () => [],
  getUseGlobalHotkey: () => true,
  postMinifyProcess: x => x,
  postProcessBundleSourcemap: ({code, map, outFileName}) => ({code, map}),
  resolveRequest: null,
  getResolverMainFields: () => ['browser', 'main'],
  getModulesRunBeforeMainModule: () => [],
  getWorkerPath: () => 'metro/src/DeltaBundler/Worker',
  processModuleFilter: module => true,
  transformVariants: () => ({default: {}}),
  virtualMapper: file => [file],
}: ConfigT);

module.exports = {
  DEFAULT,
};