diff --git a/react-packager/src/ModuleGraph/output/as-plain-bundle.js b/react-packager/src/ModuleGraph/output/as-plain-bundle.js new file mode 100644 index 00000000..e0bf8a2c --- /dev/null +++ b/react-packager/src/ModuleGraph/output/as-plain-bundle.js @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @flow + */ +'use strict'; + +const {createIndexMap} = require('./source-map'); +const {addModuleIdsToModuleWrapper} = require('./util'); + +import type {Module} from '../types.flow'; +import type {SourceMap} from './source-map'; + +module.exports = ( + modules: Iterable, + filename?: string, + idForPath: {path: string} => number, +): {code: string, map: SourceMap} => { + let code = ''; + let line = 0; + const sections = []; + + for (const module of modules) { + const {file} = module; + const moduleCode = file.type === 'module' + ? addModuleIdsToModuleWrapper(module, idForPath) + : file.code; + + code += moduleCode + '\n'; + if (file.map) { + sections.push({ + map: file.map, + offset: {column: 0, line} + }); + } + line += countLines(moduleCode); + } + + return {code, map: createIndexMap({file: filename, sections})}; +}; + +const reLine = /^/gm; +function countLines(string: string): number { + //$FlowFixMe This regular expression always matches + return string.match(reLine).length; +} diff --git a/react-packager/src/ModuleGraph/output/util.js b/react-packager/src/ModuleGraph/output/util.js index 23065d24..2f3d8fe0 100644 --- a/react-packager/src/ModuleGraph/output/util.js +++ b/react-packager/src/ModuleGraph/output/util.js @@ -58,3 +58,12 @@ exports.createIdForPathFn = (): ({path: string} => number) => { return id; }; }; + +exports.virtualModule = (code: string): Module => ({ + dependencies: [], + file: { + code, + path: '', + type: 'script', + } +}); diff --git a/react-packager/src/ModuleGraph/types.flow.js b/react-packager/src/ModuleGraph/types.flow.js index 8bb652a8..707bca57 100644 --- a/react-packager/src/ModuleGraph/types.flow.js +++ b/react-packager/src/ModuleGraph/types.flow.js @@ -13,8 +13,8 @@ import type {Console} from 'console'; export type Callback - = ((error: Error) => mixed) - & ((error: null | void, a: A, b: B) => mixed); + = (Error => mixed) + & ((null | void, A, B) => mixed); type ResolveOptions = { log?: Console, @@ -59,7 +59,7 @@ export type GraphFn = ( callback?: Callback, ) => void; -type GraphResult = { +export type GraphResult = { entryModules: Array, modules: Array, };