Skip to content

Commit

Permalink
[feature] Add package to create cache key functions
Browse files Browse the repository at this point in the history
  • Loading branch information
cpojer committed Oct 5, 2020
1 parent abf9f8d commit 61aa54c
Show file tree
Hide file tree
Showing 8 changed files with 157 additions and 0 deletions.
1 change: 1 addition & 0 deletions .watchmanconfig
@@ -0,0 +1 @@
[]
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -5,6 +5,7 @@
- `[jest-circus, jest-config, jest-runtime]` Add new `injectGlobals` config and CLI option to disable injecting global variables into the runtime ([#10484](https://github.com/facebook/jest/pull/10484))
- `[jest-each]` Fixes `.each` type to always be callable ([#10447](https://github.com/facebook/jest/pull/10447))
- `[jest-runner]` Add support for `moduleLoader`s with `default` exports ([#10541](https://github.com/facebook/jest/pull/10541))
- `[@jest/create-cache-key-function]` Added a new package for creating cache keys ([#10587](https://github.com/facebook/jest/pull/10587))

### Fixes

Expand Down
5 changes: 5 additions & 0 deletions packages/jest-create-cache-key-function/.npmignore
@@ -0,0 +1,5 @@
**/__mocks__/**
**/__tests__/**
src
tsconfig.json
tsconfig.tsbuildinfo
25 changes: 25 additions & 0 deletions packages/jest-create-cache-key-function/package.json
@@ -0,0 +1,25 @@
{
"name": "@jest/create-cache-key-function",
"version": "26.4.2",
"repository": {
"type": "git",
"url": "https://github.com/facebook/jest.git",
"directory": "packages/jest-create-cache-key-function"
},
"dependencies": {
"graceful-fs": "^4.2.4"
},
"devDependencies": {
"@types/node": "*"
},
"engines": {
"node": ">= 10.14.2"
},
"license": "MIT",
"main": "build/index.js",
"types": "build/index.d.ts",
"publishConfig": {
"access": "public"
},
"gitHead": "170eee11d03b0ed5c60077982fdbc3bafd403638"
}
@@ -0,0 +1,42 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

let NODE_ENV: string;
let BABEL_ENV: string;

beforeEach(() => {
NODE_ENV = process.env.NODE_ENV;
process.env.NODE_ENV = 'test';
BABEL_ENV = process.env.BABEL_ENV;
process.env.BABEL_ENV = 'test';
});

afterEach(() => {
process.env.NODE_ENV = NODE_ENV;
process.env.BABEL_ENV = BABEL_ENV;
});

test('creation of a cache key', () => {
const createCacheKeyFunction = require('../index').default;
const createCacheKey = createCacheKeyFunction([], ['value']);
const hashA = createCacheKey('test', 'test.js', null, {
config: {},
instrument: false,
});
const hashB = createCacheKey('test code;', 'test.js', null, {
config: {},
instrument: false,
});
const hashC = createCacheKey('test', 'test.js', null, {
config: {},
instrument: true,
});

expect(hashA.length).toEqual(32);
expect(hashA).not.toEqual(hashB);
expect(hashA).not.toEqual(hashC);
});
67 changes: 67 additions & 0 deletions packages/jest-create-cache-key-function/src/index.ts
@@ -0,0 +1,67 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/

import {createHash} from 'crypto';
import {relative} from 'path';
import {readFileSync} from 'graceful-fs';
import type {Config, ProjectConfig} from '@jest/types';

type CacheKeyOptions = {
config: ProjectConfig;
instrument: boolean;
};

type GetCacheKeyFunction = (
fileData: string,
filePath: Config.Path,
configStr: string,
options: CacheKeyOptions,
) => string;

function getGlobalCacheKey(files: Array<string>, values: Array<string>) {
const dependencies = require('../package').dependencies;
return [
process.env.NODE_ENV,
process.env.BABEL_ENV,
dependencies && dependencies['babel-preset-fbjs'],
...values,
...files.map((file: string) => readFileSync(file)),
]
.reduce(
(hash, chunk) => hash.update('\0', 'utf-8').update(chunk || ''),
createHash('md5'),
)
.digest('hex');
}

function getCacheKeyFunction(globalCacheKey: string) {
return (
src: string,
file: Config.Path,
configString: string,
options: CacheKeyOptions,
) => {
const {config, instrument} = options;
const rootDir = config && config.rootDir;

return createHash('md5')
.update(globalCacheKey)
.update('\0', 'utf8')
.update(src)
.update('\0', 'utf8')
.update(rootDir ? relative(config.rootDir, file) : '')
.update('\0', 'utf8')
.update(instrument ? 'instrument' : '')
.digest('hex');
};
}

export default (
files: Array<string> = [],
values: Array<string> = [],
): GetCacheKeyFunction => getCacheKeyFunction(getGlobalCacheKey(files, values));
7 changes: 7 additions & 0 deletions packages/jest-create-cache-key-function/tsconfig.json
@@ -0,0 +1,7 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"rootDir": "src",
"outDir": "build"
}
}
9 changes: 9 additions & 0 deletions yarn.lock
Expand Up @@ -1808,6 +1808,15 @@ __metadata:
languageName: unknown
linkType: soft

"@jest/create-cache-key-function@workspace:packages/jest-create-cache-key-function":
version: 0.0.0-use.local
resolution: "@jest/create-cache-key-function@workspace:packages/jest-create-cache-key-function"
dependencies:
"@types/node": "*"
graceful-fs: ^4.2.4
languageName: unknown
linkType: soft

"@jest/environment@^26.3.0, @jest/environment@workspace:packages/jest-environment":
version: 0.0.0-use.local
resolution: "@jest/environment@workspace:packages/jest-environment"
Expand Down

0 comments on commit 61aa54c

Please sign in to comment.