UNPKG

create-expo-cljs-app

Version:

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

297 lines (249 loc) 8.35 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. * * * @format */ "use strict"; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function(sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function(key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function(key) { Object.defineProperty( target, key, Object.getOwnPropertyDescriptor(source, key) ); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function() { var self = this, args = arguments; return new Promise(function(resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } const WorkerFarm = require("./WorkerFarm"); const assert = require("assert"); const fs = require("fs"); const getTransformCacheKey = require("./getTransformCacheKey"); const path = require("path"); const _require = require("metro-cache"), Cache = _require.Cache, stableHash = _require.stableHash; class Transformer { constructor(config, getSha1Fn) { this._config = config; this._config.watchFolders.forEach(verifyRootExists); this._cache = new Cache(config.cacheStores); this._getSha1 = getSha1Fn; // Remove the transformer config params that we don't want to pass to the // transformer. We should change the config object and move them away so we // can treat the transformer config params as opaque. const _this$_config$transfo = this._config.transformer, _getTransformOptions = _this$_config$transfo.getTransformOptions, _postMinifyProcess = _this$_config$transfo.postMinifyProcess, _transformVariants = _this$_config$transfo.transformVariants, _workerPath = _this$_config$transfo.workerPath, transformerConfig = _objectWithoutProperties(_this$_config$transfo, [ "getTransformOptions", "postMinifyProcess", "transformVariants", "workerPath" ]); const transformerOptions = { transformerPath: this._config.transformerPath, transformerConfig }; this._workerFarm = new WorkerFarm(config, transformerOptions); const globalCacheKey = getTransformCacheKey({ cacheVersion: this._config.cacheVersion, projectRoot: this._config.projectRoot, transformerConfig: transformerOptions }); this._baseHash = stableHash([globalCacheKey]).toString("binary"); } transformFile(filePath, transformerOptions) { var _this = this; return _asyncToGenerator(function*() { const cache = _this._cache; const customTransformOptions = transformerOptions.customTransformOptions, dev = transformerOptions.dev, experimentalImportSupport = transformerOptions.experimentalImportSupport, hot = transformerOptions.hot, inlinePlatform = transformerOptions.inlinePlatform, inlineRequires = transformerOptions.inlineRequires, minify = transformerOptions.minify, nonInlinedRequires = transformerOptions.nonInlinedRequires, platform = transformerOptions.platform, runtimeBytecodeVersion = transformerOptions.runtimeBytecodeVersion, type = transformerOptions.type, unstable_disableES6Transforms = transformerOptions.unstable_disableES6Transforms, unstable_transformProfile = transformerOptions.unstable_transformProfile, extra = _objectWithoutProperties(transformerOptions, [ "customTransformOptions", "dev", "experimentalImportSupport", "hot", "inlinePlatform", "inlineRequires", "minify", "nonInlinedRequires", "platform", "runtimeBytecodeVersion", "type", "unstable_disableES6Transforms", "unstable_transformProfile" ]); for (const key in extra) { if (hasOwnProperty.call(extra, key)) { throw new Error( "Extra keys detected: " + Object.keys(extra).join(", ") ); } } const localPath = path.relative(_this._config.projectRoot, filePath); const partialKey = stableHash([ // This is the hash related to the global Bundler config. _this._baseHash, // Path. localPath, customTransformOptions, dev, experimentalImportSupport, hot, inlinePlatform, inlineRequires, minify, nonInlinedRequires, platform, runtimeBytecodeVersion, type, unstable_disableES6Transforms, unstable_transformProfile ]); const sha1 = _this._getSha1(filePath); let fullKey = Buffer.concat([partialKey, Buffer.from(sha1, "hex")]); const result = yield cache.get(fullKey); // A valid result from the cache is used directly; otherwise we call into // the transformer to computed the corresponding result. const data = result ? { result, sha1 } : yield _this._workerFarm.transform(localPath, transformerOptions); // Only re-compute the full key if the SHA-1 changed. This is because // references are used by the cache implementation in a weak map to keep // track of the cache that returned the result. if (sha1 !== data.sha1) { fullKey = Buffer.concat([partialKey, Buffer.from(data.sha1, "hex")]); } cache.set(fullKey, data.result); return _objectSpread( _objectSpread({}, data.result), {}, { getSource() { return fs.readFileSync(filePath); } } ); })(); } end() { this._workerFarm.kill(); } } function verifyRootExists(root) { // Verify that the root exists. assert(fs.statSync(root).isDirectory(), "Root has to be a valid directory"); } module.exports = Transformer;