diff --git a/react-packager/src/JSTransformer/worker/worker.js b/react-packager/src/JSTransformer/worker/worker.js index 4260ee45..79453218 100644 --- a/react-packager/src/JSTransformer/worker/worker.js +++ b/react-packager/src/JSTransformer/worker/worker.js @@ -46,7 +46,9 @@ type Transform = ( ) => mixed, ) => void; -export type Options = {transform?: {}}; +export type Options = { + transform?: {projectRoots: Array}, +}; export type Data = { result: TransformedCode, diff --git a/react-packager/src/lib/GlobalTransformCache.js b/react-packager/src/lib/GlobalTransformCache.js index 39bf86e1..f5fe4d48 100644 --- a/react-packager/src/lib/GlobalTransformCache.js +++ b/react-packager/src/lib/GlobalTransformCache.js @@ -11,12 +11,12 @@ 'use strict'; +const crypto = require('crypto'); const imurmurhash = require('imurmurhash'); const invariant = require('invariant'); const jsonStableStringify = require('json-stable-stringify'); const path = require('path'); const request = require('request'); -const toFixedHex = require('./toFixedHex'); import type {Options as TransformOptions} from '../JSTransformer/worker/worker'; import type {CachedResult} from './TransformCache'; @@ -173,6 +173,30 @@ function validateCachedResult(cachedResult: mixed): ?CachedResult { return undefined; } +/** + * The transform options contain absolute paths. This can contain, for + * example, the username if someone works their home directory (very likely). + * We need to get rid of this user-and-machine-dependent data for the global + * cache, otherwise nobody would share the same cache keys. + */ +function globalizeTransformOptions( + options: TransformOptions, +): TransformOptions { + const {transform} = options; + if (transform == null) { + return options; + } + return { + ...options, + transform: { + ...transform, + projectRoots: transform.projectRoots.map(p => { + return path.relative(path.join(__dirname, '../../../../..'), p); + }), + }, + }; +} + /** * One can enable the global cache by calling configure() from a custom CLI * script. Eventually we may make it more flexible. @@ -190,16 +214,13 @@ class GlobalTransformCache { * Return a key for identifying uniquely a source file. */ static keyOf(props: FetchProps) { - const sourceDigest = toFixedHex(8, imurmurhash(props.sourceCode).result()); - const optionsHash = imurmurhash() - .hash(jsonStableStringify(props.transformOptions) || '') - .hash(props.transformCacheKey) - .result(); - const optionsDigest = toFixedHex(8, optionsHash); - return ( - `${optionsDigest}${sourceDigest}` + - `${path.basename(props.filePath)}` - ); + const stableOptions = globalizeTransformOptions(props.transformOptions); + const digest = crypto.createHash('sha1').update([ + jsonStableStringify(stableOptions), + props.transformCacheKey, + imurmurhash(props.sourceCode).result().toString(), + ].join('$')).digest('hex'); + return `${digest}-${path.basename(props.filePath)}`; } /**