UNPKG

create-expo-cljs-app

Version:

Create a react native application with Expo and Shadow-CLJS!

83 lines (64 loc) 2.11 kB
/** * 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 invariant = require('invariant'); const path = require('path'); const {addParamsToDefineCall} = require('metro-transform-plugins'); import type {MixedOutput, Module} from '../../types.flow'; import type {JsOutput} from 'metro-transform-worker'; export type Options = { +createModuleId: string => number | string, +dev: boolean, +projectRoot: string, ... }; function wrapModule(module: Module<>, options: Options): string { const output = getJsOutput(module); if (output.type.startsWith('js/script')) { return output.data.code; } const moduleId = options.createModuleId(module.path); const params = [ moduleId, Array.from(module.dependencies.values()).map(dependency => options.createModuleId(dependency.absolutePath), ), ]; if (options.dev) { // Add the relative path of the module to make debugging easier. // This is mapped to `module.verboseName` in `require.js`. params.push(path.relative(options.projectRoot, module.path)); } return addParamsToDefineCall(output.data.code, ...params); } function getJsOutput(module: Module<>): JsOutput { const jsModules = module.output.filter(({type}) => type.startsWith('js/')); invariant( jsModules.length === 1, `Modules must have exactly one JS output, but ${module.path} has ${jsModules.length} JS outputs.`, ); const jsOutput = (jsModules[0]: any); invariant( Number.isFinite(jsOutput.data.lineCount), `JS output must populate lineCount, but ${module.path} has ${jsOutput.type} output with lineCount '${jsOutput.data.lineCount}'`, ); return jsOutput; } function isJsModule(module: Module<>): boolean { return module.output.filter(isJsOutput).length > 0; } function isJsOutput(output: MixedOutput): boolean %checks { return output.type.startsWith('js/'); } module.exports = { getJsOutput, isJsModule, wrapModule, };