Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feature] Add package to create cache key functions #10587

Merged
merged 1 commit into from Oct 5, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .watchmanconfig
@@ -0,0 +1 @@
[]
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that an empty .watchmanconfig on an FB-laptop will actually not work, and crashes everything. I'm making this update in this diff so that FB engineers can develop Jest in peace :)

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
22 changes: 22 additions & 0 deletions packages/jest-create-cache-key-function/package.json
@@ -0,0 +1,22 @@
{
"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"
},
"devDependencies": {
"@types/node": "*"
cpojer marked this conversation as resolved.
Show resolved Hide resolved
},
"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);
});
59 changes: 59 additions & 0 deletions packages/jest-create-cache-key-function/src/index.ts
@@ -0,0 +1,59 @@
/**
* 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';
/* eslint-disable-next-line no-restricted-imports */
import {readFileSync} from 'fs';
import type {Config} from '@jest/types';

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

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

function getGlobalCacheKey(files: Array<string>, values: Array<string>) {
return [
process.env.NODE_ENV,
process.env.BABEL_ENV,
...values,
...files.map((file: string) => readFileSync(file)),
cpojer marked this conversation as resolved.
Show resolved Hide resolved
]
.reduce(
(hash, chunk) => hash.update('\0', 'utf8').update(chunk || ''),
createHash('md5'),
)
.digest('hex');
}

function getCacheKeyFunction(globalCacheKey: string): GetCacheKeyFunction {
return (src, file, _configString, options) => {
const {config, instrument} = options;
return createHash('md5')
.update(globalCacheKey)
.update('\0', 'utf8')
.update(src)
.update('\0', 'utf8')
.update(config.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));
10 changes: 10 additions & 0 deletions packages/jest-create-cache-key-function/tsconfig.json
@@ -0,0 +1,10 @@
{
"extends": "../../tsconfig.json",
SimenB marked this conversation as resolved.
Show resolved Hide resolved
"compilerOptions": {
"rootDir": "src",
"outDir": "build"
},
"references": [
{"path": "../jest-types"}
]
}
8 changes: 8 additions & 0 deletions yarn.lock
Expand Up @@ -1808,6 +1808,14 @@ __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": "*"
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